diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml index 28616c4afed4..927ec0bec326 100644 --- a/.github/actions/build/action.yaml +++ b/.github/actions/build/action.yaml @@ -17,14 +17,14 @@ runs: run: | set -x env - if [ -z ${COBALT_BOOTLOADER+x} ]; then + if [ -z ${COBALT_EVERGREEN_LOADER+x} ]; then BUILD_PLATFORM=${{ matrix.target_platform }} BUILD_TARGET=all if [[ "${{matrix.config}}" =~ ^(qa|gold)$ ]]; then BUILD_TARGET=default fi else - BUILD_PLATFORM=${COBALT_BOOTLOADER} + BUILD_PLATFORM=${COBALT_EVERGREEN_LOADER} BUILD_TARGET='loader_app_install elf_loader_sandbox_install native_target/crashpad_handler' fi # GitHub Runners have home set to /github/home. diff --git a/.github/actions/gn/action.yaml b/.github/actions/gn/action.yaml index d5b5b58798be..47b10aa66a23 100644 --- a/.github/actions/gn/action.yaml +++ b/.github/actions/gn/action.yaml @@ -22,13 +22,13 @@ runs: run: | set -x extra_arguments="${{matrix.extra_gn_arguments}}" - if [ -z ${COBALT_BOOTLOADER+x} ]; then + if [ -z ${COBALT_EVERGREEN_LOADER+x} ]; then BUILD_PLATFORM=${{ matrix.target_platform }} else - BUILD_PLATFORM=${COBALT_BOOTLOADER} - if [ ! -z "${{matrix.bootloader_extra_gn_arguments}}" ] + BUILD_PLATFORM=${COBALT_EVERGREEN_LOADER} + if [ ! -z "${{matrix.evergreen_loader_extra_gn_arguments}}" ] then - extra_arguments="${{matrix.bootloader_extra_gn_arguments}}" + extra_arguments="${{matrix.evergreen_loader_extra_gn_arguments}}" fi fi if [ -z "${{matrix.sb_api_version}}"]; then diff --git a/.github/actions/on_device_tests/action.yaml b/.github/actions/on_device_tests/action.yaml index 73e46d0d3aea..f7a9df22db8c 100644 --- a/.github/actions/on_device_tests/action.yaml +++ b/.github/actions/on_device_tests/action.yaml @@ -23,9 +23,9 @@ runs: echo "WORKFLOW=${WORKFLOW}" >> $GITHUB_ENV # Boot loader env - if [ "${COBALT_BOOTLOADER}" != "null" ]; then + if [ "${COBALT_EVERGREEN_LOADER}" != "null" ]; then echo "LOADER_CONFIG=${{ matrix.config }}" >> $GITHUB_ENV - echo "LOADER_PLATFORM=${COBALT_BOOTLOADER}" >> $GITHUB_ENV + echo "LOADER_PLATFORM=${COBALT_EVERGREEN_LOADER}" >> $GITHUB_ENV fi # Dimension env diff --git a/.github/actions/on_host_test/action.yaml b/.github/actions/on_host_test/action.yaml index 20469f76ee07..f4fac30f3365 100644 --- a/.github/actions/on_host_test/action.yaml +++ b/.github/actions/on_host_test/action.yaml @@ -39,21 +39,21 @@ runs: fi python3 ${GITHUB_WORKSPACE}/tools/create_archive.py -x -s ${GITHUB_WORKSPACE}/out/tmp/${{matrix.platform}}_${{matrix.config}}.${ARCHIVE_EXTENSION} -d ${GITHUB_WORKSPACE}/out ${parallel} rm -rf ${GITHUB_WORKSPACE}/out/tmp - - name: Download Bootloader Archive - if: ${{ env.COBALT_BOOTLOADER != null && env.COBALT_BOOTLOADER != 'null' }} + - name: Download Evergreen loader Archive + if: ${{ env.COBALT_EVERGREEN_LOADER != null && env.COBALT_EVERGREEN_LOADER != 'null' }} shell: bash env: WORKFLOW: ${{ github.workflow }} run: | set -x PROJECT_NAME=$(gcloud config get-value project) - gsutil cp gs://${PROJECT_NAME}-test-artifacts/${WORKFLOW}/${GITHUB_RUN_NUMBER}/${{matrix.platform}}_${{matrix.config}}/${COBALT_BOOTLOADER}_${{matrix.config}}.${ARCHIVE_EXTENSION} ${GITHUB_WORKSPACE}/out/tmp/${COBALT_BOOTLOADER}_${{matrix.config}}.${ARCHIVE_EXTENSION} - - name: Extract Bootloader Archive - if: ${{ env.COBALT_BOOTLOADER != null && env.COBALT_BOOTLOADER != 'null' }} + gsutil cp gs://${PROJECT_NAME}-test-artifacts/${WORKFLOW}/${GITHUB_RUN_NUMBER}/${{matrix.platform}}_${{matrix.config}}/${COBALT_EVERGREEN_LOADER}_${{matrix.config}}.${ARCHIVE_EXTENSION} ${GITHUB_WORKSPACE}/out/tmp/${COBALT_EVERGREEN_LOADER}_${{matrix.config}}.${ARCHIVE_EXTENSION} + - name: Extract Evergreen loader Archive + if: ${{ env.COBALT_EVERGREEN_LOADER != null && env.COBALT_EVERGREEN_LOADER != 'null' }} shell: bash run: | set -x - python3 ${GITHUB_WORKSPACE}/tools/create_archive.py -x -s ${GITHUB_WORKSPACE}/out/tmp/${COBALT_BOOTLOADER}_${{matrix.config}}.${ARCHIVE_EXTENSION} -d ${GITHUB_WORKSPACE}/out --parallel + python3 ${GITHUB_WORKSPACE}/tools/create_archive.py -x -s ${GITHUB_WORKSPACE}/out/tmp/${COBALT_EVERGREEN_LOADER}_${{matrix.config}}.${ARCHIVE_EXTENSION} -d ${GITHUB_WORKSPACE}/out --parallel rm -rf ${GITHUB_WORKSPACE}/out/tmp - name: Set Env Variables shell: bash @@ -73,8 +73,8 @@ runs: ln -s /root/starboard-toolchains /github/home/starboard-toolchains fi loader_args='' - if [ "${COBALT_BOOTLOADER}" != "null" ]; then - loader_args="--loader_platform ${COBALT_BOOTLOADER} --loader_config ${{matrix.config}}" + if [ "${COBALT_EVERGREEN_LOADER}" != "null" ]; then + loader_args="--loader_platform ${COBALT_EVERGREEN_LOADER} --loader_config ${{matrix.config}}" fi if [[ "${{matrix.shard}}" == 'integration' ]]; then xvfb-run -a --server-args="-screen 0 1920x1080x24i +render +extension GLX -noreset" python3 $GITHUB_WORKSPACE/cobalt/black_box_tests/black_box_tests.py --platform ${{matrix.target_platform}} --config ${{matrix.config}} ${loader_args} diff --git a/.github/actions/upload_test_artifacts/action.yaml b/.github/actions/upload_test_artifacts/action.yaml index d2923eb553a7..33eaa063fc0f 100644 --- a/.github/actions/upload_test_artifacts/action.yaml +++ b/.github/actions/upload_test_artifacts/action.yaml @@ -18,13 +18,13 @@ runs: run: | set -x project_name=$(gcloud config get-value project) - if [ -z ${COBALT_BOOTLOADER+x} ] + if [ -z ${COBALT_EVERGREEN_LOADER+x} ] then PLATFORM=${{matrix.platform}} echo "TARGET_PLATFORM=${{matrix.target_platform}}" >> $GITHUB_ENV else - PLATFORM=${COBALT_BOOTLOADER} - echo "TARGET_PLATFORM=${COBALT_BOOTLOADER}" >> $GITHUB_ENV + PLATFORM=${COBALT_EVERGREEN_LOADER} + echo "TARGET_PLATFORM=${COBALT_EVERGREEN_LOADER}" >> $GITHUB_ENV fi if [ "${{ inputs.type }}" == 'ondevice' ] @@ -56,9 +56,9 @@ runs: if [ "${{ inputs.type }}" == 'ondevice' ] then outdir="$GITHUB_WORKSPACE/out/${{matrix.target_platform}}_${{matrix.config}}" - if [ -n "${COBALT_BOOTLOADER}" ] + if [ -n "${COBALT_EVERGREEN_LOADER}" ] then - outdir="${outdir} $GITHUB_WORKSPACE/out/${COBALT_BOOTLOADER}_${{matrix.config}}" + outdir="${outdir} $GITHUB_WORKSPACE/out/${COBALT_EVERGREEN_LOADER}_${{matrix.config}}" fi python3 $GITHUB_WORKSPACE/tools/create_archive.py --test_infra -d ${{env.ARCHIVE_FILE}} -s ${outdir} elif [ "${{ inputs.type }}" == 'onhost' ] diff --git a/.github/config/evergreen-arm-hardfp.json b/.github/config/evergreen-arm-hardfp.json index 1744d28941b3..508b8518b5a0 100644 --- a/.github/config/evergreen-arm-hardfp.json +++ b/.github/config/evergreen-arm-hardfp.json @@ -1,6 +1,6 @@ { "docker_service": "build-raspi", - "bootloader": "raspi-2", + "evergreen_loader": "raspi-2", "on_device_test": { "enabled": true, "tests": [ @@ -24,7 +24,7 @@ "target_platform":"evergreen-arm-hardfp", "target_cpu":"target_cpu=\\\"arm\\\"", "extra_gn_arguments":"use_asan=false", - "bootloader_extra_gn_arguments": "use_asan=false is_clang=false", + "evergreen_loader_extra_gn_arguments": "use_asan=false is_clang=false", "dimension": "release_version=regex:10.*" }, { @@ -33,7 +33,7 @@ "target_platform":"evergreen-arm-hardfp", "target_cpu":"target_cpu=\\\"arm\\\"", "extra_gn_arguments":"use_asan=false", - "bootloader_extra_gn_arguments":"use_asan=false is_clang=false", + "evergreen_loader_extra_gn_arguments":"use_asan=false is_clang=false", "sb_api_version": "15", "dimension": "release_version=regex:10.*" }, @@ -43,7 +43,7 @@ "target_platform":"evergreen-arm-hardfp", "target_cpu":"target_cpu=\\\"arm\\\"", "extra_gn_arguments":"use_asan=false", - "bootloader_extra_gn_arguments":"use_asan=false is_clang=false", + "evergreen_loader_extra_gn_arguments":"use_asan=false is_clang=false", "sb_api_version": "14", "dimension": "release_version=regex:10.*" }, @@ -53,7 +53,7 @@ "target_platform":"evergreen-arm-hardfp", "target_cpu":"target_cpu=\\\"arm\\\"", "extra_gn_arguments":"use_asan=false", - "bootloader_extra_gn_arguments":"use_asan=false is_clang=false", + "evergreen_loader_extra_gn_arguments":"use_asan=false is_clang=false", "sb_api_version": "13", "dimension": "release_version=regex:10.*" } diff --git a/.github/config/evergreen-arm-softfp.json b/.github/config/evergreen-arm-softfp.json index 6f72d5364b8e..288fe861e246 100644 --- a/.github/config/evergreen-arm-softfp.json +++ b/.github/config/evergreen-arm-softfp.json @@ -1,6 +1,6 @@ { "docker_service": "build-android-evergreen", - "bootloader": "android-arm", + "evergreen_loader": "android-arm", "on_device_test": { "enabled": false, "tests": [ @@ -23,7 +23,7 @@ "target_platform":"evergreen-arm-softfp", "target_cpu":"target_cpu=\\\"arm\\\"", "extra_gn_arguments":"use_asan=false", - "bootloader_extra_gn_arguments": "target_os=\\\"android\\\" sb_is_evergreen_compatible=true" + "evergreen_loader_extra_gn_arguments": "target_os=\\\"android\\\" sb_is_evergreen_compatible=true" }, { "name":"sbversion-15", @@ -32,7 +32,7 @@ "target_cpu":"target_cpu=\\\"arm\\\"", "extra_gn_arguments":"use_asan=false", "sb_api_version":"15", - "bootloader_extra_gn_arguments": "target_os=\\\"android\\\" sb_is_evergreen_compatible=true" + "evergreen_loader_extra_gn_arguments": "target_os=\\\"android\\\" sb_is_evergreen_compatible=true" }, { "name":"sbversion-14", @@ -41,7 +41,7 @@ "target_cpu":"target_cpu=\\\"arm\\\"", "extra_gn_arguments":"use_asan=false", "sb_api_version":"14", - "bootloader_extra_gn_arguments": "target_os=\\\"android\\\" sb_is_evergreen_compatible=true" + "evergreen_loader_extra_gn_arguments": "target_os=\\\"android\\\" sb_is_evergreen_compatible=true" } ] } diff --git a/.github/config/evergreen-x64.json b/.github/config/evergreen-x64.json index 25ae4535edb9..30112d5a799e 100644 --- a/.github/config/evergreen-x64.json +++ b/.github/config/evergreen-x64.json @@ -1,7 +1,7 @@ { "docker_service": "build-linux-evergreen", "on_host_test": true, - "bootloader": "linux-x64x11", + "evergreen_loader": "linux-x64x11", "on_host_test_shards": ["0", "1", "2", "3", "blackbox", "wpt", "evergreen"], "platforms": [ "evergreen-x64", diff --git a/.github/config/linux.json b/.github/config/linux.json index 6db4064f54e5..28a02b3b7baa 100644 --- a/.github/config/linux.json +++ b/.github/config/linux.json @@ -1,5 +1,6 @@ { "docker_service": "build-linux", + "evergreen_loader": "linux-x64x11", "on_host_test": true, "on_host_test_shards": ["0", "1", "2", "3", "blackbox", "wpt"], "platforms": [ diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml index 3623fdf91846..bfcfcf2e4006 100644 --- a/.github/workflows/android.yaml +++ b/.github/workflows/android.yaml @@ -1,6 +1,8 @@ name: android on: + release: + types: [prereleased, released, published] pull_request: types: [opened, reopened, synchronize, labeled] branches: @@ -30,6 +32,7 @@ jobs: with: platform: android-arm64 nightly: ${{ github.event.inputs.nightly }} + keep_artifacts: cobalt.apk android-x86: uses: ./.github/workflows/main.yaml permissions: @@ -38,6 +41,7 @@ jobs: with: platform: android-x86 nightly: ${{ github.event.inputs.nightly }} + keep_artifacts: cobalt.apk android-arm: uses: ./.github/workflows/main.yaml permissions: @@ -46,3 +50,49 @@ jobs: with: platform: android-arm nightly: ${{ github.event.inputs.nightly }} + keep_artifacts: cobalt.apk + + upload-release-artifacts: + runs-on: ubuntu-latest + needs: [ android-arm, android-arm64, android-x86 ] + permissions: + actions: write + steps: + - name: Download arm-gold apk + uses: actions/download-artifact@v4 + with: + name: android-arm-gold + path: arm-gold + - name: Download arm-qa apk + uses: actions/download-artifact@v4 + with: + name: android-arm-qa + path: arm-qa + - name: Download arm64-gold apk + uses: actions/download-artifact@v4 + with: + name: android-arm64-gold + path: arm64-gold + - name: Download arm64-qa apk + uses: actions/download-artifact@v4 + with: + name: android-arm64-gold + path: arm64-qa + - name: Download x86-gold apk + uses: actions/download-artifact@v4 + with: + name: android-x86-gold + path: x86-gold + - name: Download x86-qa apk + uses: actions/download-artifact@v4 + with: + name: android-x86-qa + path: x86-qa + - name: 'Upload Android APKs' + uses: actions/upload-artifact@v4 + with: + name: Android APKs + path: ./* + retention-days: 90 + compression-level: 0 # We expect kept artifacts to be already compressed + if-no-files-found: error diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index e7f6f0981993..77915c6699d7 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -29,6 +29,11 @@ on: required: false type: boolean default: false + keep_artifacts: + description: 'Which artifacts to keep for releases' + required: false + type: string + default: '' # Global env vars. env: @@ -117,11 +122,11 @@ jobs: run: | on_host_test_shards=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -c '.on_host_test_shards') echo "on_host_test_shards=${on_host_test_shards}" >> $GITHUB_ENV - - id: set-on-host-test-bootloader + - id: set-on-host-test-evergreen-loader shell: bash run: | - bootloader=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -rc '.bootloader') - echo "bootloader=${bootloader}" >> $GITHUB_ENV + evergreen_loader=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -rc '.evergreen_loader') + echo "evergreen_loader=${evergreen_loader}" >> $GITHUB_ENV - id: set-docker-service shell: bash run: | @@ -134,7 +139,7 @@ jobs: on_device_test_attempts: ${{ env.on_device_test_attempts }} on_host_test: ${{ env.on_host_test }} on_host_test_shards: ${{ env.on_host_test_shards }} - bootloader: ${{ env.bootloader }} + evergreen_loader: ${{ env.evergreen_loader }} docker_service: ${{ env.docker_service }} # Builds, tags, and pushes Cobalt docker build images to ghr. @@ -238,38 +243,47 @@ jobs: uses: ./.github/actions/gn - name: Build Cobalt uses: ./.github/actions/build + - name: 'Upload Artifact' + uses: actions/upload-artifact@v4 + if: inputs.keep_artifacts + with: + name: ${{ matrix.platform }}-${{ matrix.config }} + path: out/${{ matrix.platform }}_${{ matrix.config }}/${{ inputs.keep_artifacts }} + retention-days: 7 + compression-level: 0 # We expect kept artifacts to be already compressed + if-no-files-found: error - name: Run API Leak Detector uses: ./.github/actions/api_leak_detector if: inputs.run_api_leak_detector with: relative_manifest_path: ${{ inputs.leak_manifest_filename }} - - name: Upload Nightly Artifacts - if: ${{ ( inputs.nightly == 'true' || github.event_name == 'schedule' ) && matrix.config != 'debug' }} - uses: ./.github/actions/upload_nightly_artifacts - name: Upload On Host Test Artifacts if: ${{ matrix.config == 'devel' && needs.initialize.outputs.on_host_test == 'true' }} uses: ./.github/actions/upload_test_artifacts with: type: onhost os: linux - # For some reason passing needs.initialize.outputs.bootloader as parameter to build + # For some reason passing needs.initialize.outputs.evergreen_loader as parameter to build # action didn't work, so instead we set an env var. - - name: Set bootloader config - if: ${{ needs.initialize.outputs.bootloader != 'null' }} + - name: Set Evergreen loader config + if: ${{ needs.initialize.outputs.evergreen_loader != 'null' }} shell: bash run: | set -u - COBALT_BOOTLOADER="${{needs.initialize.outputs.bootloader}}" - echo "COBALT_BOOTLOADER=${COBALT_BOOTLOADER}" >> $GITHUB_ENV - # Build bootloader for on-host tests if necessary. - - name: Bootloader GN - if: ${{ needs.initialize.outputs.bootloader != 'null' && matrix.config == 'devel' }} + COBALT_EVERGREEN_LOADER="${{needs.initialize.outputs.evergreen_loader}}" + echo "COBALT_EVERGREEN_LOADER=${COBALT_EVERGREEN_LOADER}" >> $GITHUB_ENV + # Build Evergreen loader for on-host tests if necessary. + - name: Evergreen loader GN + if: ${{ needs.initialize.outputs.evergreen_loader != 'null' && ( matrix.config == 'devel' || matrix.config == 'qa' ) }} uses: ./.github/actions/gn - - name: Build Bootloader - if: ${{ needs.initialize.outputs.bootloader != 'null' && matrix.config == 'devel' }} + - name: Build Evergreen loader + if: ${{ needs.initialize.outputs.evergreen_loader != 'null' && ( matrix.config == 'devel' || matrix.config == 'qa' ) }} uses: ./.github/actions/build - - name: Upload Bootloader On Host Test Artifacts - if: ${{ needs.initialize.outputs.bootloader != 'null' && matrix.config == 'devel' && needs.initialize.outputs.on_host_test == 'true'}} + - name: Upload Nightly Artifacts + if: ${{ ( inputs.nightly == 'true' || github.event_name == 'schedule' ) && matrix.config != 'debug' }} + uses: ./.github/actions/upload_nightly_artifacts + - name: Upload Evergreen loader On Host Test Artifacts + if: ${{ needs.initialize.outputs.evergreen_loader != 'null' && matrix.config == 'devel' && needs.initialize.outputs.on_host_test == 'true'}} uses: ./.github/actions/upload_test_artifacts with: type: onhost @@ -310,7 +324,7 @@ jobs: shard: ${{ fromJson(needs.initialize.outputs.on_device_test).tests }} include: ${{ fromJson(needs.initialize.outputs.includes) }} env: - COBALT_BOOTLOADER: ${{ needs.initialize.outputs.bootloader }} + COBALT_EVERGREEN_LOADER: ${{ needs.initialize.outputs.evergreen_loader }} ON_DEVICE_TEST_ATTEMPTS: ${{ needs.initialize.outputs.on_device_test_attempts }} MODULAR_BUILD: ${{ inputs.modular && 1 || 0 }} steps: @@ -343,7 +357,7 @@ jobs: # For some reason tests complaining about HOME set to /github/home # with permission denied error. HOME: /root - COBALT_BOOTLOADER: ${{needs.initialize.outputs.bootloader}} + COBALT_EVERGREEN_LOADER: ${{needs.initialize.outputs.evergreen_loader}} MODULAR_BUILD: ${{ inputs.modular && 1 || 0 }} steps: - name: Checkout diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5ca64c01ab24..79b871fc3b58 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,39 +5,31 @@ default_stages: [commit] default_language_version: python: python3 +files: | + (?x)^( + ( + .github| + cobalt| + docker| + glimp| + internal| + precommit_hooks| + starboard| + tools/metrics/actions/cobalt| + tools/metrics/histograms/metadata/cobalt| + tools/testing| + )/ + | ^[^/]+$ # files in the root + ) exclude: | (?x)^( ( - base| - build| - buildtools| cobalt/updater| - components/crash/core/common| - components/metrics_services_manager| - components/metrics| - components/prefs| - components/ukm| - components/variations| - components/version_info| - crypto| - extensions/buildflags| glimp/include| - net| internal/kokoro/third-party| internal/starboard/shared/playstation/glimp/shaders| - testing| - third_party| - tools/gyp| - tools/python| - ui| - url )/ | - components/update_client/((?!cobalt).)*$ - | - # Ignore everything under tools/metrics _except_ Cobalt files. We - # need those validated to keep the telemetry/metrics pipeline working. - tools/metrics/((?!cobalt\/).)*$| .*_pb2\.py$ | .*\.pb\.cc$ | .*\.pb\.h$ | diff --git a/cobalt/base/on_screen_keyboard_suggestions_updated_event.h b/cobalt/base/on_screen_keyboard_suggestions_updated_event.h deleted file mode 100644 index 15743ac5373f..000000000000 --- a/cobalt/base/on_screen_keyboard_suggestions_updated_event.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2019 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef COBALT_BASE_ON_SCREEN_KEYBOARD_SUGGESTIONS_UPDATED_EVENT_H_ -#define COBALT_BASE_ON_SCREEN_KEYBOARD_SUGGESTIONS_UPDATED_EVENT_H_ - -#include "cobalt/base/event.h" -#include "starboard/event.h" - -namespace base { - -class OnScreenKeyboardSuggestionsUpdatedEvent : public Event { - public: - explicit OnScreenKeyboardSuggestionsUpdatedEvent(int ticket) - : ticket_(ticket) {} - - int ticket() const { return ticket_; } - - BASE_EVENT_SUBCLASS(OnScreenKeyboardSuggestionsUpdatedEvent); - - private: - int ticket_; -}; - -} // namespace base - -#endif // COBALT_BASE_ON_SCREEN_KEYBOARD_SUGGESTIONS_UPDATED_EVENT_H_ diff --git a/cobalt/base/wrap_main_starboard.h b/cobalt/base/wrap_main_starboard.h index e60b7fc3b494..741502adfedc 100644 --- a/cobalt/base/wrap_main_starboard.h +++ b/cobalt/base/wrap_main_starboard.h @@ -113,12 +113,16 @@ void BaseEventHandler(const SbEvent* event) { case kSbEventTypeOnScreenKeyboardHidden: case kSbEventTypeOnScreenKeyboardFocused: case kSbEventTypeOnScreenKeyboardBlurred: - case kSbEventTypeOnScreenKeyboardSuggestionsUpdated: case kSbEventTypeAccessibilityCaptionSettingsChanged: case kSbEventTypeAccessibilityTextToSpeechSettingsChanged: case kSbEventTypeOsNetworkDisconnected: case kSbEventTypeOsNetworkConnected: case kSbEventDateTimeConfigurationChanged: +#if SB_API_VERSION >= 16 + case kSbEventTypeReserved1: +#else + case kSbEventTypeOnScreenKeyboardSuggestionsUpdated: +#endif // SB_API_VERSION >= 16 event_function(event); break; } diff --git a/cobalt/bindings/shared/idl_conditional_macros.h b/cobalt/bindings/shared/idl_conditional_macros.h index a34191f5b5de..b54baf001ac4 100644 --- a/cobalt/bindings/shared/idl_conditional_macros.h +++ b/cobalt/bindings/shared/idl_conditional_macros.h @@ -17,14 +17,11 @@ #include "starboard/configuration.h" -// Define preprocessor macros that cannot be determined at GYP time for use in +// Define preprocessor macros that cannot be determined at GN time for use in // IDL files with Conditionals (e.g. conditional interface definitions, or // conditional attributes). This is necessary to make macros for IDL // Conditionals that are dependent on Starboard feature macros that get defined // in header files. -// This is used to conditionally define the On Screen Keyboard interface and -// attribute. -#define COBALT_ENABLE_ON_SCREEN_KEYBOARD #endif // COBALT_BINDINGS_SHARED_IDL_CONDITIONAL_MACROS_H_ diff --git a/cobalt/browser/BUILD.gn b/cobalt/browser/BUILD.gn index 0428431abb21..30ca9afdce42 100644 --- a/cobalt/browser/BUILD.gn +++ b/cobalt/browser/BUILD.gn @@ -120,8 +120,6 @@ static_library("browser") { "device_authentication.h", "on_screen_keyboard_extension_bridge.cc", "on_screen_keyboard_extension_bridge.h", - "on_screen_keyboard_starboard_bridge.cc", - "on_screen_keyboard_starboard_bridge.h", "render_tree_combiner.cc", "render_tree_combiner.h", "screen_shot_writer.cc", diff --git a/cobalt/browser/application.cc b/cobalt/browser/application.cc index 1dc3fc9a5175..00cbd8890003 100644 --- a/cobalt/browser/application.cc +++ b/cobalt/browser/application.cc @@ -49,7 +49,6 @@ #include "cobalt/base/on_screen_keyboard_focused_event.h" #include "cobalt/base/on_screen_keyboard_hidden_event.h" #include "cobalt/base/on_screen_keyboard_shown_event.h" -#include "cobalt/base/on_screen_keyboard_suggestions_updated_event.h" #include "cobalt/base/starboard_stats_tracker.h" #include "cobalt/base/startup_timer.h" #include "cobalt/base/version_compatibility.h" @@ -961,12 +960,6 @@ Application::Application(const base::Closure& quit_closure, bool should_preload, event_dispatcher_.AddEventCallback( base::OnScreenKeyboardBlurredEvent::TypeId(), on_screen_keyboard_blurred_event_callback_); - on_screen_keyboard_suggestions_updated_event_callback_ = - base::Bind(&Application::OnOnScreenKeyboardSuggestionsUpdatedEvent, - base::Unretained(this)); - event_dispatcher_.AddEventCallback( - base::OnScreenKeyboardSuggestionsUpdatedEvent::TypeId(), - on_screen_keyboard_suggestions_updated_event_callback_); on_caption_settings_changed_event_callback_ = base::Bind( &Application::OnCaptionSettingsChangedEvent, base::Unretained(this)); event_dispatcher_.AddEventCallback( @@ -1070,9 +1063,6 @@ Application::~Application() { event_dispatcher_.RemoveEventCallback( base::OnScreenKeyboardBlurredEvent::TypeId(), on_screen_keyboard_blurred_event_callback_); - event_dispatcher_.RemoveEventCallback( - base::OnScreenKeyboardSuggestionsUpdatedEvent::TypeId(), - on_screen_keyboard_suggestions_updated_event_callback_); event_dispatcher_.RemoveEventCallback( base::AccessibilityCaptionSettingsChangedEvent::TypeId(), on_caption_settings_changed_event_callback_); @@ -1155,10 +1145,6 @@ void Application::HandleStarboardEvent(const SbEvent* starboard_event) { DispatchEventInternal(new base::OnScreenKeyboardBlurredEvent( *static_cast(starboard_event->data))); break; - case kSbEventTypeOnScreenKeyboardSuggestionsUpdated: - DispatchEventInternal(new base::OnScreenKeyboardSuggestionsUpdatedEvent( - *static_cast(starboard_event->data))); - break; case kSbEventTypeLink: { DispatchDeepLink(static_cast(starboard_event->data), starboard_event->timestamp); @@ -1193,6 +1179,11 @@ void Application::HandleStarboardEvent(const SbEvent* starboard_event) { case kSbEventTypeStop: case kSbEventTypeUser: case kSbEventTypeVerticalSync: +#if SB_API_VERSION >= 16 + case kSbEventTypeReserved1: +#else + case kSbEventTypeOnScreenKeyboardSuggestionsUpdated: +#endif // SB_API_VERSION >= 16 DLOG(WARNING) << "Unhandled Starboard event of type: " << starboard_event->type; } @@ -1270,7 +1261,6 @@ void Application::OnApplicationEvent(SbEventType event_type, case kSbEventTypeOnScreenKeyboardFocused: case kSbEventTypeOnScreenKeyboardHidden: case kSbEventTypeOnScreenKeyboardShown: - case kSbEventTypeOnScreenKeyboardSuggestionsUpdated: case kSbEventTypeAccessibilitySettingsChanged: case kSbEventTypeInput: case kSbEventTypeLink: @@ -1280,6 +1270,11 @@ void Application::OnApplicationEvent(SbEventType event_type, case kSbEventTypeOsNetworkDisconnected: case kSbEventTypeOsNetworkConnected: case kSbEventDateTimeConfigurationChanged: +#if SB_API_VERSION >= 16 + case kSbEventTypeReserved1: +#else + case kSbEventTypeOnScreenKeyboardSuggestionsUpdated: +#endif // SB_API_VERSION >= 16 NOTREACHED() << "Unexpected event type: " << event_type; return; } @@ -1337,15 +1332,6 @@ void Application::OnOnScreenKeyboardBlurredEvent(const base::Event* event) { event)); } -void Application::OnOnScreenKeyboardSuggestionsUpdatedEvent( - const base::Event* event) { - TRACE_EVENT0("cobalt::browser", - "Application::OnOnScreenKeyboardSuggestionsUpdatedEvent()"); - browser_module_->OnOnScreenKeyboardSuggestionsUpdated( - base::polymorphic_downcast< - const base::OnScreenKeyboardSuggestionsUpdatedEvent*>(event)); -} - void Application::OnCaptionSettingsChangedEvent(const base::Event* event) { TRACE_EVENT0("cobalt::browser", "Application::OnCaptionSettingsChangedEvent()"); diff --git a/cobalt/browser/application.h b/cobalt/browser/application.h index 572e2b358693..6f2cda34d8ec 100644 --- a/cobalt/browser/application.h +++ b/cobalt/browser/application.h @@ -78,7 +78,6 @@ class Application { void OnOnScreenKeyboardHiddenEvent(const base::Event* event); void OnOnScreenKeyboardFocusedEvent(const base::Event* event); void OnOnScreenKeyboardBlurredEvent(const base::Event* event); - void OnOnScreenKeyboardSuggestionsUpdatedEvent(const base::Event* event); void OnCaptionSettingsChangedEvent(const base::Event* event); void OnWindowOnOnlineEvent(const base::Event* event); void OnWindowOnOfflineEvent(const base::Event* event); @@ -111,7 +110,6 @@ class Application { base::EventCallback on_screen_keyboard_hidden_event_callback_; base::EventCallback on_screen_keyboard_focused_event_callback_; base::EventCallback on_screen_keyboard_blurred_event_callback_; - base::EventCallback on_screen_keyboard_suggestions_updated_event_callback_; base::EventCallback on_caption_settings_changed_event_callback_; base::EventCallback on_window_on_online_event_callback_; base::EventCallback on_window_on_offline_event_callback_; diff --git a/cobalt/browser/browser_module.cc b/cobalt/browser/browser_module.cc index 885518d16cb0..4787823f5dec 100644 --- a/cobalt/browser/browser_module.cc +++ b/cobalt/browser/browser_module.cc @@ -37,7 +37,6 @@ #include "cobalt/base/source_location.h" #include "cobalt/base/tokens.h" #include "cobalt/browser/on_screen_keyboard_extension_bridge.h" -#include "cobalt/browser/on_screen_keyboard_starboard_bridge.h" #include "cobalt/browser/screen_shot_writer.h" #include "cobalt/browser/switches.h" #include "cobalt/browser/user_agent_platform_info.h" @@ -315,14 +314,6 @@ BrowserModule::BrowserModule(const GURL& url, std::make_unique( base::Bind(&BrowserModule::GetSbWindow, base::Unretained(this)), on_screen_keyboard_extension); - } else { - if (OnScreenKeyboardStarboardBridge::IsSupported()) { - on_screen_keyboard_bridge_ = - std::make_unique(base::Bind( - &BrowserModule::GetSbWindow, base::Unretained(this))); - } else { - on_screen_keyboard_bridge_ = NULL; - } } } else { on_screen_keyboard_bridge_ = NULL; @@ -1114,15 +1105,6 @@ void BrowserModule::OnOnScreenKeyboardBlurred( } } -void BrowserModule::OnOnScreenKeyboardSuggestionsUpdated( - const base::OnScreenKeyboardSuggestionsUpdatedEvent* event) { - DCHECK_EQ(base::MessageLoop::current(), self_message_loop_); - // Only inject updated suggestions events to the main WebModule. - if (web_module_) { - web_module_->InjectOnScreenKeyboardSuggestionsUpdatedEvent(event->ticket()); - } -} - void BrowserModule::OnCaptionSettingsChanged( const base::AccessibilityCaptionSettingsChangedEvent* event) { DCHECK_EQ(base::MessageLoop::current(), self_message_loop_); diff --git a/cobalt/browser/browser_module.h b/cobalt/browser/browser_module.h index 0c18ac9d1591..aa827a0f4bdd 100644 --- a/cobalt/browser/browser_module.h +++ b/cobalt/browser/browser_module.h @@ -35,7 +35,6 @@ #include "cobalt/base/on_screen_keyboard_focused_event.h" #include "cobalt/base/on_screen_keyboard_hidden_event.h" #include "cobalt/base/on_screen_keyboard_shown_event.h" -#include "cobalt/base/on_screen_keyboard_suggestions_updated_event.h" #include "cobalt/browser/lifecycle_observer.h" #include "cobalt/browser/memory_settings/auto_mem.h" #include "cobalt/browser/memory_settings/checker.h" @@ -222,8 +221,6 @@ class BrowserModule { const base::OnScreenKeyboardFocusedEvent* event); void OnOnScreenKeyboardBlurred( const base::OnScreenKeyboardBlurredEvent* event); - void OnOnScreenKeyboardSuggestionsUpdated( - const base::OnScreenKeyboardSuggestionsUpdatedEvent* event); void OnCaptionSettingsChanged( const base::AccessibilityCaptionSettingsChangedEvent* event); diff --git a/cobalt/browser/on_screen_keyboard_starboard_bridge.cc b/cobalt/browser/on_screen_keyboard_starboard_bridge.cc deleted file mode 100644 index f534caa467a4..000000000000 --- a/cobalt/browser/on_screen_keyboard_starboard_bridge.cc +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "cobalt/browser/on_screen_keyboard_starboard_bridge.h" - -#include - -#include "base/bind.h" -#include "base/callback.h" -#include "starboard/event.h" - -namespace cobalt { -namespace browser { -// static -bool OnScreenKeyboardStarboardBridge::IsSupported() { - return SbWindowOnScreenKeyboardIsSupported(); -} - -void OnScreenKeyboardStarboardBridge::Show(const char* input_text, int ticket) { - // Delay providing the SbWindow until as late as possible. - SbWindowShowOnScreenKeyboard(sb_window_provider_.Run(), input_text, ticket); -} - -void OnScreenKeyboardStarboardBridge::Hide(int ticket) { - // Delay providing the SbWindow until as late as possible. - SbWindowHideOnScreenKeyboard(sb_window_provider_.Run(), ticket); -} - -void OnScreenKeyboardStarboardBridge::Focus(int ticket) { - // Delay providing the SbWindow until as late as possible. - SbWindowFocusOnScreenKeyboard(sb_window_provider_.Run(), ticket); -} - -void OnScreenKeyboardStarboardBridge::Blur(int ticket) { - // Delay providing the SbWindow until as late as possible. - SbWindowBlurOnScreenKeyboard(sb_window_provider_.Run(), ticket); -} - -void OnScreenKeyboardStarboardBridge::UpdateSuggestions( - const script::Sequence& suggestions, int ticket) { - std::unique_ptr suggestions_data( - new const char*[suggestions.size()]); - for (script::Sequence::size_type i = 0; i < suggestions.size(); - ++i) { - suggestions_data[i] = suggestions.at(i).c_str(); - } - // Delay providing the SbWindow until as late as possible. - SbWindowUpdateOnScreenKeyboardSuggestions( - sb_window_provider_.Run(), suggestions_data.get(), - static_cast(suggestions.size()), ticket); -} - -bool OnScreenKeyboardStarboardBridge::IsShown() const { - // Delay providing the SbWindow until as late as possible. - return SbWindowIsOnScreenKeyboardShown(sb_window_provider_.Run()); -} - -bool OnScreenKeyboardStarboardBridge::SuggestionsSupported() const { - // Delay providing the SbWindow until as late as possible. - return SbWindowOnScreenKeyboardSuggestionsSupported( - sb_window_provider_.Run()); -} - -scoped_refptr OnScreenKeyboardStarboardBridge::BoundingRect() - const { - // Delay providing the SbWindow until as late as possible. - SbWindowRect sb_window_rect = SbWindowRect(); - if (!SbWindowGetOnScreenKeyboardBoundingRect(sb_window_provider_.Run(), - &sb_window_rect)) { - return nullptr; - } - scoped_refptr bounding_rect = - new dom::DOMRect(sb_window_rect.x, sb_window_rect.y, sb_window_rect.width, - sb_window_rect.height); - return bounding_rect; -} - -bool OnScreenKeyboardStarboardBridge::IsValidTicket(int ticket) const { - return ticket != kSbEventOnScreenKeyboardInvalidTicket; -} - -void OnScreenKeyboardStarboardBridge::SetKeepFocus(bool keep_focus) { - // Delay providing the SbWindow until as late as possible. - return SbWindowSetOnScreenKeyboardKeepFocus(sb_window_provider_.Run(), - keep_focus); -} - -void OnScreenKeyboardStarboardBridge::SetBackgroundColor(uint8 r, uint8 g, - uint8 b) { - const CobaltExtensionOnScreenKeyboardApi* on_screen_keyboard_extension = - static_cast( - SbSystemGetExtension(kCobaltExtensionOnScreenKeyboardName)); - - if (on_screen_keyboard_extension && - strcmp(on_screen_keyboard_extension->name, - kCobaltExtensionOnScreenKeyboardName) == 0 && - on_screen_keyboard_extension->version >= 1) { - on_screen_keyboard_extension->SetBackgroundColor(sb_window_provider_.Run(), - r, g, b); - } -} - -void OnScreenKeyboardStarboardBridge::SetLightTheme(bool light_theme) { - const CobaltExtensionOnScreenKeyboardApi* on_screen_keyboard_extension = - static_cast( - SbSystemGetExtension(kCobaltExtensionOnScreenKeyboardName)); - - if (on_screen_keyboard_extension && - strcmp(on_screen_keyboard_extension->name, - kCobaltExtensionOnScreenKeyboardName) == 0 && - on_screen_keyboard_extension->version >= 1) { - on_screen_keyboard_extension->SetLightTheme(sb_window_provider_.Run(), - light_theme); - } -} -} // namespace browser -} // namespace cobalt diff --git a/cobalt/browser/on_screen_keyboard_starboard_bridge.h b/cobalt/browser/on_screen_keyboard_starboard_bridge.h deleted file mode 100644 index 0a68c304b2fd..000000000000 --- a/cobalt/browser/on_screen_keyboard_starboard_bridge.h +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef COBALT_BROWSER_ON_SCREEN_KEYBOARD_STARBOARD_BRIDGE_H_ -#define COBALT_BROWSER_ON_SCREEN_KEYBOARD_STARBOARD_BRIDGE_H_ - -#include - -#include "base/callback.h" -#include "cobalt/dom/on_screen_keyboard_bridge.h" -#include "starboard/extension/on_screen_keyboard.h" -#include "starboard/window.h" - -namespace cobalt { -namespace browser { - -// OnScreenKeyboardStarboardBridge implements the OnScreenKeyboardBridge, -// calling Starboard methods to control the OnScreenKeyboard. The constructor -// takes in a callback provider for the SbWindow. -class OnScreenKeyboardStarboardBridge : public dom::OnScreenKeyboardBridge { - public: - explicit OnScreenKeyboardStarboardBridge( - const base::Callback& sb_window_provider) - : sb_window_provider_(sb_window_provider) { - DCHECK(!sb_window_provider_.is_null()); - } - - static bool IsSupported(); - - void Show(const char* input_text, int ticket) override; - - void Hide(int ticket) override; - - void Focus(int ticket) override; - - void Blur(int ticket) override; - - void UpdateSuggestions(const script::Sequence& suggestions, - int ticket) override; - - bool IsShown() const override; - - bool SuggestionsSupported() const override; - - scoped_refptr BoundingRect() const override; - - bool IsValidTicket(int ticket) const override; - - void SetKeepFocus(bool keep_focus) override; - - void SetBackgroundColor(uint8 r, uint8 g, uint8 b) override; - - void SetLightTheme(bool light_theme) override; - - private: - base::Callback sb_window_provider_; -}; - -} // namespace browser -} // namespace cobalt -#endif // COBALT_BROWSER_ON_SCREEN_KEYBOARD_STARBOARD_BRIDGE_H_ diff --git a/cobalt/browser/web_module.cc b/cobalt/browser/web_module.cc index cdd0f48b84ce..7413bb2c4ef7 100644 --- a/cobalt/browser/web_module.cc +++ b/cobalt/browser/web_module.cc @@ -167,9 +167,6 @@ class WebModule::Impl { // Injects an on screen keyboard blurred event into the web module. Event is // directed at the on screen keyboard element. void InjectOnScreenKeyboardBlurredEvent(int ticket); - // Injects an on screen keyboard suggestions updated event into the web - // module. Event is directed at the on screen keyboard element. - void InjectOnScreenKeyboardSuggestionsUpdatedEvent(int ticket); // Injects a keyboard event into the web module. Event is directed at a // specific element if the element is non-null. Otherwise, the currently @@ -867,17 +864,6 @@ void WebModule::Impl::InjectOnScreenKeyboardBlurredEvent(int ticket) { window_->on_screen_keyboard()->DispatchBlurEvent(ticket); } -void WebModule::Impl::InjectOnScreenKeyboardSuggestionsUpdatedEvent( - int ticket) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(is_running_); - DCHECK(window_); - DCHECK(window_->on_screen_keyboard()); - - window_->on_screen_keyboard()->DispatchSuggestionsUpdatedEvent(ticket); -} - - void WebModule::Impl::InjectKeyboardEvent(base::Token type, const dom::KeyboardEventInit& event, scoped_refptr element) { @@ -1447,16 +1433,6 @@ void WebModule::InjectOnScreenKeyboardBlurredEvent(int ticket) { impl_->InjectOnScreenKeyboardBlurredEvent(ticket); } -void WebModule::InjectOnScreenKeyboardSuggestionsUpdatedEvent(int ticket) { - TRACE_EVENT1("cobalt::browser", - "WebModule::InjectOnScreenKeyboardSuggestionsUpdatedEvent()", - "ticket", ticket); - POST_TO_ENSURE_IMPL_ON_THREAD(InjectOnScreenKeyboardSuggestionsUpdatedEvent, - ticket); - impl_->InjectOnScreenKeyboardSuggestionsUpdatedEvent(ticket); -} - - void WebModule::InjectKeyboardEvent(base::Token type, const dom::KeyboardEventInit& event) { TRACE_EVENT1("cobalt::browser", "WebModule::InjectKeyboardEvent()", "type", diff --git a/cobalt/browser/web_module.h b/cobalt/browser/web_module.h index c38f25b3b53b..bc8781626332 100644 --- a/cobalt/browser/web_module.h +++ b/cobalt/browser/web_module.h @@ -289,9 +289,6 @@ class WebModule : public base::MessageLoop::DestructionObserver, void InjectOnScreenKeyboardFocusedEvent(int ticket); // Injects an on screen keyboard blurred event into the web module. void InjectOnScreenKeyboardBlurredEvent(int ticket); - // Injects an on screen keyboard suggestions updated event into the web - // module. - void InjectOnScreenKeyboardSuggestionsUpdatedEvent(int ticket); void InjectWindowOnOnlineEvent(const base::Event* event); void InjectWindowOnOfflineEvent(const base::Event* event); diff --git a/cobalt/dom/media_source.cc b/cobalt/dom/media_source.cc index 526f262d0dbf..41f7952ffd24 100644 --- a/cobalt/dom/media_source.cc +++ b/cobalt/dom/media_source.cc @@ -62,8 +62,8 @@ #include "cobalt/web/context.h" #include "cobalt/web/dom_exception.h" #include "cobalt/web/event.h" +#include "media/base/pipeline_status.h" #include "starboard/media.h" -#include "third_party/chromium/media/base/pipeline_status.h" namespace cobalt { namespace dom { diff --git a/cobalt/dom/media_source.h b/cobalt/dom/media_source.h index 9af3f55b5ed3..6752851839de 100644 --- a/cobalt/dom/media_source.h +++ b/cobalt/dom/media_source.h @@ -68,7 +68,7 @@ #include "cobalt/script/exception_state.h" #include "cobalt/web/event_target.h" #include "cobalt/web/url_registry.h" -#include "third_party/chromium/media/filters/chunk_demuxer.h" +#include "media/filters/chunk_demuxer.h" namespace cobalt { namespace dom { diff --git a/cobalt/dom/on_screen_keyboard.idl b/cobalt/dom/on_screen_keyboard.idl index 9487eec201d3..76f9aa43011d 100644 --- a/cobalt/dom/on_screen_keyboard.idl +++ b/cobalt/dom/on_screen_keyboard.idl @@ -15,9 +15,7 @@ // Custom API for hiding, showing, focusing, blurring, and receiving input // from an on screen keyboard. -[ - Conditional=COBALT_ENABLE_ON_SCREEN_KEYBOARD -] interface OnScreenKeyboard : EventTarget { +interface OnScreenKeyboard : EventTarget { Promise show(); Promise hide(); Promise focus(); diff --git a/cobalt/dom/on_screen_keyboard_test.cc b/cobalt/dom/on_screen_keyboard_test.cc index b567585c7d1a..d2ce2a380661 100644 --- a/cobalt/dom/on_screen_keyboard_test.cc +++ b/cobalt/dom/on_screen_keyboard_test.cc @@ -17,6 +17,7 @@ #include "cobalt/base/tokens.h" #include "cobalt/bindings/testing/utils.h" +#include "cobalt/browser/on_screen_keyboard_extension_bridge.h" #include "cobalt/dom/testing/test_with_javascript.h" #include "cobalt/dom/window.h" #include "cobalt/web/testing/gtest_workarounds.h" @@ -200,7 +201,7 @@ class OnScreenKeyboardTest : public testing::TestWithJavaScript { } // namespace bool SkipLocale() { - bool skipTests = !SbWindowOnScreenKeyboardIsSupported(); + bool skipTests = !browser::OnScreenKeyboardExtensionBridge::IsSupported(); if (skipTests) { SB_LOG(INFO) << "On screen keyboard not supported. Test skipped."; } diff --git a/cobalt/dom/source_buffer.cc b/cobalt/dom/source_buffer.cc index 087ae14836f4..5e5b7c12c802 100644 --- a/cobalt/dom/source_buffer.cc +++ b/cobalt/dom/source_buffer.cc @@ -62,8 +62,8 @@ #include "cobalt/web/context.h" #include "cobalt/web/dom_exception.h" #include "cobalt/web/web_settings.h" -#include "third_party/chromium/media/base/ranges.h" -#include "third_party/chromium/media/base/timestamp_constants.h" +#include "media/base/ranges.h" +#include "media/base/timestamp_constants.h" namespace cobalt { namespace dom { diff --git a/cobalt/dom/source_buffer.h b/cobalt/dom/source_buffer.h index 0da8e81ae90f..f5f61d424855 100644 --- a/cobalt/dom/source_buffer.h +++ b/cobalt/dom/source_buffer.h @@ -72,9 +72,9 @@ #include "cobalt/script/environment_settings.h" #include "cobalt/script/exception_state.h" #include "cobalt/web/event_target.h" +#include "media/base/media_tracks.h" +#include "media/filters/chunk_demuxer.h" #include "starboard/common/mutex.h" -#include "third_party/chromium/media/base/media_tracks.h" -#include "third_party/chromium/media/filters/chunk_demuxer.h" namespace cobalt { namespace dom { diff --git a/cobalt/dom/source_buffer_algorithm.h b/cobalt/dom/source_buffer_algorithm.h index 350579450d89..cfa7340644d5 100644 --- a/cobalt/dom/source_buffer_algorithm.h +++ b/cobalt/dom/source_buffer_algorithm.h @@ -21,7 +21,7 @@ #include "base/time/time.h" #include "cobalt/base/tokens.h" #include "cobalt/dom/source_buffer_metrics.h" -#include "third_party/chromium/media/filters/chunk_demuxer.h" +#include "media/filters/chunk_demuxer.h" namespace cobalt { namespace dom { diff --git a/cobalt/dom/window_on_screen_keyboard.idl b/cobalt/dom/window_on_screen_keyboard.idl index 037506ee561f..5ddcbe6c7245 100644 --- a/cobalt/dom/window_on_screen_keyboard.idl +++ b/cobalt/dom/window_on_screen_keyboard.idl @@ -16,5 +16,5 @@ // screen keyboard. partial interface Window { -[ Conditional=COBALT_ENABLE_ON_SCREEN_KEYBOARD ] readonly attribute OnScreenKeyboard onScreenKeyboard; +readonly attribute OnScreenKeyboard onScreenKeyboard; }; diff --git a/cobalt/js_profiler/BUILD.gn b/cobalt/js_profiler/BUILD.gn index 3c16fc0eddaa..b3e63dd306d3 100644 --- a/cobalt/js_profiler/BUILD.gn +++ b/cobalt/js_profiler/BUILD.gn @@ -31,8 +31,8 @@ static_library("js_profiler") { "//cobalt/script", "//cobalt/script/v8c:engine", "//cobalt/web", + "//media", "//third_party/abseil-cpp/absl/types:optional", - "//third_party/chromium/media:media", "//third_party/v8:cppgc", ] } diff --git a/cobalt/layout/replaced_box.cc b/cobalt/layout/replaced_box.cc index 9760b9b3bf2e..fd4b22e84da8 100644 --- a/cobalt/layout/replaced_box.cc +++ b/cobalt/layout/replaced_box.cc @@ -739,21 +739,12 @@ void ReplacedBox::RenderAndAnimateContentWithMapToMesh( filter_node = new FilterNode(MapToMeshFilter(stereo_mode, builder), animate_node); -#if !SB_HAS(VIRTUAL_REALITY) // Attach a 3D camera to the map-to-mesh node, so the rendering of its // content can be transformed. border_node_builder->AddChild( used_style_provider()->attach_camera_node_function().Run( filter_node, mtm_function->horizontal_fov_in_radians(), mtm_function->vertical_fov_in_radians())); -#else - // Camera node unnecessary in VR, since the 3D scene is completely - // immersive, and the whole render tree is placed within it and subject to - // camera transforms, not just the map-to-mesh node. - // TODO: Reconcile both paths with respect to this if Cobalt adopts a global - // camera or a document-wide notion of 3D space layout. - border_node_builder->AddChild(filter_node); -#endif } void ReplacedBox::RenderAndAnimateContentWithLetterboxing( diff --git a/cobalt/media/BUILD.gn b/cobalt/media/BUILD.gn index ace874122dc2..aaf87647018f 100644 --- a/cobalt/media/BUILD.gn +++ b/cobalt/media/BUILD.gn @@ -108,9 +108,9 @@ component("media") { "//cobalt/network", "//cobalt/render_tree:render_tree", "//cobalt/system_window:system_window", + "//media", "//net", "//starboard:starboard_group", - "//third_party/chromium/media", "//third_party/protobuf:protobuf_lite", "//url", ] @@ -140,9 +140,9 @@ target(gtest_target_type, "media_test") { "//cobalt//browser:test_dependencies_on_browser", "//cobalt/base", "//cobalt/test:run_all_unittests", + "//media", "//testing/gmock", "//testing/gtest", - "//third_party/chromium/media:media", ] data_deps = [ "//cobalt/media/testing:cobalt_media_download_test_data" ] diff --git a/cobalt/media/base/decoder_buffer_cache.h b/cobalt/media/base/decoder_buffer_cache.h index 64a56f6b3e1c..1e79d3074a42 100644 --- a/cobalt/media/base/decoder_buffer_cache.h +++ b/cobalt/media/base/decoder_buffer_cache.h @@ -23,9 +23,9 @@ #include "base/memory/ref_counted.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" +#include "media/base/decoder_buffer.h" +#include "media/base/demuxer_stream.h" #include "starboard/media.h" -#include "third_party/chromium//media/base/decoder_buffer.h" -#include "third_party/chromium//media/base/demuxer_stream.h" namespace cobalt { namespace media { diff --git a/cobalt/media/base/decoder_buffer_cache_test.cc b/cobalt/media/base/decoder_buffer_cache_test.cc index 737dc206bb32..352b3cc2e6eb 100644 --- a/cobalt/media/base/decoder_buffer_cache_test.cc +++ b/cobalt/media/base/decoder_buffer_cache_test.cc @@ -18,9 +18,9 @@ #include "base/time/time.h" #include "cobalt/media/decoder_buffer_allocator.h" +#include "media/base/decoder_buffer.h" #include "starboard/media.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/chromium//media/base/decoder_buffer.h" namespace cobalt { namespace media { diff --git a/cobalt/media/base/pipeline.h b/cobalt/media/base/pipeline.h index 8c8fe3d6cd66..8b7c1732a28a 100644 --- a/cobalt/media/base/pipeline.h +++ b/cobalt/media/base/pipeline.h @@ -24,12 +24,12 @@ #include "cobalt/media/base/decode_target_provider.h" #include "cobalt/media/base/media_export.h" #include "cobalt/media/base/sbplayer_interface.h" +#include "media/base/demuxer.h" +#include "media/base/media_log.h" +#include "media/base/pipeline_status.h" +#include "media/base/ranges.h" #include "starboard/drm.h" #include "starboard/window.h" -#include "third_party/chromium/media/base/demuxer.h" -#include "third_party/chromium/media/base/media_log.h" -#include "third_party/chromium/media/base/pipeline_status.h" -#include "third_party/chromium/media/base/ranges.h" #include "ui/gfx/geometry/size.h" namespace cobalt { diff --git a/cobalt/media/base/playback_statistics.h b/cobalt/media/base/playback_statistics.h index 44330ed9dc77..3210f70eb941 100644 --- a/cobalt/media/base/playback_statistics.h +++ b/cobalt/media/base/playback_statistics.h @@ -20,9 +20,9 @@ #include "base/optional.h" #include "base/time/time.h" #include "cobalt/base/c_val.h" -#include "third_party/chromium/media/base/decoder_buffer.h" -#include "third_party/chromium/media/base/pipeline_status.h" -#include "third_party/chromium/media/base/video_decoder_config.h" +#include "media/base/decoder_buffer.h" +#include "media/base/pipeline_status.h" +#include "media/base/video_decoder_config.h" namespace cobalt { namespace media { diff --git a/cobalt/media/base/sbplayer_bridge.cc b/cobalt/media/base/sbplayer_bridge.cc index 87ea8b0580b7..425d3cd6ae72 100644 --- a/cobalt/media/base/sbplayer_bridge.cc +++ b/cobalt/media/base/sbplayer_bridge.cc @@ -26,6 +26,7 @@ #include "base/trace_event/trace_event.h" #include "cobalt/base/statistics.h" #include "cobalt/media/base/format_support_query_metrics.h" +#include "media/base/starboard_utils.h" #include "starboard/common/media.h" #include "starboard/common/player.h" #include "starboard/common/string.h" @@ -33,7 +34,6 @@ #include "starboard/extension/player_set_max_video_input_size.h" #include "starboard/memory.h" #include "starboard/once.h" -#include "third_party/chromium/media/base/starboard_utils.h" namespace cobalt { namespace media { diff --git a/cobalt/media/base/sbplayer_bridge.h b/cobalt/media/base/sbplayer_bridge.h index f4d911f30130..8c85811ff863 100644 --- a/cobalt/media/base/sbplayer_bridge.h +++ b/cobalt/media/base/sbplayer_bridge.h @@ -29,12 +29,12 @@ #include "cobalt/media/base/decoder_buffer_cache.h" #include "cobalt/media/base/sbplayer_interface.h" #include "cobalt/media/base/sbplayer_set_bounds_helper.h" +#include "media/base/audio_decoder_config.h" +#include "media/base/decoder_buffer.h" +#include "media/base/demuxer_stream.h" +#include "media/base/video_decoder_config.h" #include "starboard/media.h" #include "starboard/player.h" -#include "third_party/chromium/media/base/audio_decoder_config.h" -#include "third_party/chromium/media/base/decoder_buffer.h" -#include "third_party/chromium/media/base/demuxer_stream.h" -#include "third_party/chromium/media/base/video_decoder_config.h" #include "ui/gfx/geometry/rect.h" namespace cobalt { diff --git a/cobalt/media/base/sbplayer_pipeline.cc b/cobalt/media/base/sbplayer_pipeline.cc index b215c7addf66..4cefce4ddd80 100644 --- a/cobalt/media/base/sbplayer_pipeline.cc +++ b/cobalt/media/base/sbplayer_pipeline.cc @@ -24,11 +24,11 @@ #include "base/trace_event/trace_event.h" #include "cobalt/base/c_val.h" #include "cobalt/base/startup_timer.h" +#include "media/base/bind_to_current_loop.h" +#include "media/base/channel_layout.h" #include "starboard/common/media.h" #include "starboard/common/string.h" #include "starboard/configuration_constants.h" -#include "third_party/chromium/media/base/bind_to_current_loop.h" -#include "third_party/chromium/media/base/channel_layout.h" namespace cobalt { namespace media { diff --git a/cobalt/media/base/sbplayer_pipeline.h b/cobalt/media/base/sbplayer_pipeline.h index 6e4931d146d5..e1ff9c59cfa6 100644 --- a/cobalt/media/base/sbplayer_pipeline.h +++ b/cobalt/media/base/sbplayer_pipeline.h @@ -33,15 +33,15 @@ #include "cobalt/media/base/playback_statistics.h" #include "cobalt/media/base/sbplayer_bridge.h" #include "cobalt/media/base/sbplayer_set_bounds_helper.h" +#include "media/base/audio_decoder_config.h" +#include "media/base/decoder_buffer.h" +#include "media/base/demuxer.h" +#include "media/base/demuxer_stream.h" +#include "media/base/media_log.h" +#include "media/base/pipeline_status.h" +#include "media/base/ranges.h" +#include "media/base/video_decoder_config.h" #include "starboard/configuration_constants.h" -#include "third_party/chromium/media/base/audio_decoder_config.h" -#include "third_party/chromium/media/base/decoder_buffer.h" -#include "third_party/chromium/media/base/demuxer.h" -#include "third_party/chromium/media/base/demuxer_stream.h" -#include "third_party/chromium/media/base/media_log.h" -#include "third_party/chromium/media/base/pipeline_status.h" -#include "third_party/chromium/media/base/ranges.h" -#include "third_party/chromium/media/base/video_decoder_config.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" diff --git a/cobalt/media/decoder_buffer_allocator.cc b/cobalt/media/decoder_buffer_allocator.cc index d92c8b60e248..0e671abe5678 100644 --- a/cobalt/media/decoder_buffer_allocator.cc +++ b/cobalt/media/decoder_buffer_allocator.cc @@ -18,11 +18,11 @@ #include #include "cobalt/math/size.h" +#include "media/base/starboard_utils.h" #include "starboard/common/allocator.h" #include "starboard/configuration.h" #include "starboard/media.h" #include "starboard/memory.h" -#include "third_party/chromium/media/base/starboard_utils.h" namespace cobalt { namespace media { diff --git a/cobalt/media/decoder_buffer_allocator.h b/cobalt/media/decoder_buffer_allocator.h index d969a2693cfb..16afc8d3560e 100644 --- a/cobalt/media/decoder_buffer_allocator.h +++ b/cobalt/media/decoder_buffer_allocator.h @@ -22,11 +22,11 @@ #include "cobalt/media/bidirectional_fit_reuse_allocator.h" #include "cobalt/media/decoder_buffer_memory_info.h" #include "cobalt/media/starboard_memory_allocator.h" +#include "media/base/decoder_buffer.h" +#include "media/base/video_decoder_config.h" #include "starboard/common/atomic.h" #include "starboard/common/mutex.h" #include "starboard/media.h" -#include "third_party/chromium/media/base/decoder_buffer.h" -#include "third_party/chromium/media/base/video_decoder_config.h" namespace cobalt { namespace media { diff --git a/cobalt/media/media_module.cc b/cobalt/media/media_module.cc index 13c228da5a96..b8ea94ba95af 100644 --- a/cobalt/media/media_module.cc +++ b/cobalt/media/media_module.cc @@ -25,10 +25,10 @@ #include "base/strings/string_split.h" #include "base/synchronization/waitable_event.h" #include "cobalt/media/base/format_support_query_metrics.h" +#include "media/base/mime_util.h" #include "starboard/common/string.h" #include "starboard/media.h" #include "starboard/window.h" -#include "third_party/chromium/media/base/mime_util.h" #if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES) #include "cobalt/browser/switches.h" diff --git a/cobalt/media/media_module.h b/cobalt/media/media_module.h index 4dcd8a521eaa..766f2955892f 100644 --- a/cobalt/media/media_module.h +++ b/cobalt/media/media_module.h @@ -35,9 +35,9 @@ #include "cobalt/render_tree/image.h" #include "cobalt/render_tree/resource_provider.h" #include "cobalt/system_window/system_window.h" +#include "media/base/media_log.h" #include "starboard/common/mutex.h" #include "starboard/player.h" -#include "third_party/chromium/media/base/media_log.h" namespace cobalt { namespace media { diff --git a/cobalt/media/player/web_media_player_impl.cc b/cobalt/media/player/web_media_player_impl.cc index 200f15cbd29a..3a1ac3521c84 100644 --- a/cobalt/media/player/web_media_player_impl.cc +++ b/cobalt/media/player/web_media_player_impl.cc @@ -28,12 +28,12 @@ #include "cobalt/media/progressive/data_source_reader.h" #include "cobalt/media/progressive/demuxer_extension_wrapper.h" #include "cobalt/media/progressive/progressive_demuxer.h" +#include "media/base/bind_to_current_loop.h" +#include "media/base/limits.h" +#include "media/base/timestamp_constants.h" +#include "media/filters/chunk_demuxer.h" #include "starboard/system.h" #include "starboard/types.h" -#include "third_party/chromium/media/base/bind_to_current_loop.h" -#include "third_party/chromium/media/base/limits.h" -#include "third_party/chromium/media/base/timestamp_constants.h" -#include "third_party/chromium/media/filters/chunk_demuxer.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" diff --git a/cobalt/media/player/web_media_player_impl.h b/cobalt/media/player/web_media_player_impl.h index de0ecb0554ec..2aa7d708030e 100644 --- a/cobalt/media/player/web_media_player_impl.h +++ b/cobalt/media/player/web_media_player_impl.h @@ -65,9 +65,9 @@ #include "cobalt/media/base/sbplayer_interface.h" #include "cobalt/media/player/web_media_player.h" #include "cobalt/media/player/web_media_player_delegate.h" -#include "third_party/chromium/media/base/demuxer.h" -#include "third_party/chromium/media/base/eme_constants.h" -#include "third_party/chromium/media/base/media_log.h" +#include "media/base/demuxer.h" +#include "media/base/eme_constants.h" +#include "media/base/media_log.h" #include "url/gurl.h" #if defined(STARBOARD) diff --git a/cobalt/media/progressive/avc_access_unit.cc b/cobalt/media/progressive/avc_access_unit.cc index 6e6468bb894c..4411f08c1e98 100644 --- a/cobalt/media/progressive/avc_access_unit.cc +++ b/cobalt/media/progressive/avc_access_unit.cc @@ -18,8 +18,8 @@ #include "cobalt/media/base/endian_util.h" #include "cobalt/media/progressive/progressive_parser.h" -#include "third_party/chromium/media/base/decoder_buffer.h" -#include "third_party/chromium/media/base/timestamp_constants.h" +#include "media/base/decoder_buffer.h" +#include "media/base/timestamp_constants.h" namespace cobalt { namespace media { diff --git a/cobalt/media/progressive/avc_parser.cc b/cobalt/media/progressive/avc_parser.cc index 4c447db7badf..af68d945b237 100644 --- a/cobalt/media/progressive/avc_parser.cc +++ b/cobalt/media/progressive/avc_parser.cc @@ -22,16 +22,16 @@ #include "cobalt/media/base/endian_util.h" #include "cobalt/media/progressive/avc_access_unit.h" #include "cobalt/media/progressive/rbsp_stream.h" +#include "media/base/audio_codecs.h" +#include "media/base/decoder_buffer.h" +#include "media/base/encryption_scheme.h" +#include "media/base/media_util.h" +#include "media/base/video_codecs.h" +#include "media/base/video_color_space.h" +#include "media/base/video_transformation.h" +#include "media/base/video_types.h" +#include "media/formats/mp4/aac.h" #include "starboard/memory.h" -#include "third_party/chromium/media/base/audio_codecs.h" -#include "third_party/chromium/media/base/decoder_buffer.h" -#include "third_party/chromium/media/base/encryption_scheme.h" -#include "third_party/chromium/media/base/media_util.h" -#include "third_party/chromium/media/base/video_codecs.h" -#include "third_party/chromium/media/base/video_color_space.h" -#include "third_party/chromium/media/base/video_transformation.h" -#include "third_party/chromium/media/base/video_types.h" -#include "third_party/chromium/media/formats/mp4/aac.h" namespace cobalt { namespace media { diff --git a/cobalt/media/progressive/avc_parser.h b/cobalt/media/progressive/avc_parser.h index e4569b340426..9bc702cf6541 100644 --- a/cobalt/media/progressive/avc_parser.h +++ b/cobalt/media/progressive/avc_parser.h @@ -18,7 +18,7 @@ #include #include "cobalt/media/progressive/progressive_parser.h" -#include "third_party/chromium/media/base/media_log.h" +#include "media/base/media_log.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" diff --git a/cobalt/media/progressive/demuxer_extension_wrapper.cc b/cobalt/media/progressive/demuxer_extension_wrapper.cc index 66c640552dc3..eb6021dc0d4d 100644 --- a/cobalt/media/progressive/demuxer_extension_wrapper.cc +++ b/cobalt/media/progressive/demuxer_extension_wrapper.cc @@ -22,16 +22,16 @@ #include "base/task/post_task.h" #include "base/task_runner_util.h" #include "base/time/time.h" +#include "media/base/audio_codecs.h" +#include "media/base/bind_to_current_loop.h" +#include "media/base/encryption_scheme.h" +#include "media/base/sample_format.h" +#include "media/base/starboard_utils.h" +#include "media/base/video_types.h" +#include "media/filters/h264_to_annex_b_bitstream_converter.h" +#include "media/formats/mp4/box_definitions.h" #include "starboard/extension/demuxer.h" #include "starboard/system.h" -#include "third_party/chromium/media/base/audio_codecs.h" -#include "third_party/chromium/media/base/bind_to_current_loop.h" -#include "third_party/chromium/media/base/encryption_scheme.h" -#include "third_party/chromium/media/base/sample_format.h" -#include "third_party/chromium/media/base/starboard_utils.h" -#include "third_party/chromium/media/base/video_types.h" -#include "third_party/chromium/media/filters/h264_to_annex_b_bitstream_converter.h" -#include "third_party/chromium/media/formats/mp4/box_definitions.h" #include "ui/gfx/color_space.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" diff --git a/cobalt/media/progressive/demuxer_extension_wrapper.h b/cobalt/media/progressive/demuxer_extension_wrapper.h index c3f869a34080..8adaff0ca3ed 100644 --- a/cobalt/media/progressive/demuxer_extension_wrapper.h +++ b/cobalt/media/progressive/demuxer_extension_wrapper.h @@ -28,13 +28,13 @@ #include "base/sequence_checker.h" #include "base/threading/thread.h" #include "cobalt/media/progressive/data_source_reader.h" +#include "media/base/audio_decoder_config.h" +#include "media/base/decoder_buffer.h" +#include "media/base/demuxer.h" +#include "media/base/pipeline_status.h" +#include "media/base/ranges.h" +#include "media/base/video_decoder_config.h" #include "starboard/extension/demuxer.h" -#include "third_party/chromium/media/base/audio_decoder_config.h" -#include "third_party/chromium/media/base/decoder_buffer.h" -#include "third_party/chromium/media/base/demuxer.h" -#include "third_party/chromium/media/base/pipeline_status.h" -#include "third_party/chromium/media/base/ranges.h" -#include "third_party/chromium/media/base/video_decoder_config.h" namespace cobalt { namespace media { diff --git a/cobalt/media/progressive/demuxer_extension_wrapper_test.cc b/cobalt/media/progressive/demuxer_extension_wrapper_test.cc index 8888f05141ad..0899390cb333 100644 --- a/cobalt/media/progressive/demuxer_extension_wrapper_test.cc +++ b/cobalt/media/progressive/demuxer_extension_wrapper_test.cc @@ -26,10 +26,10 @@ #include "base/threading/sequenced_task_runner_handle.h" #include "base/time/time.h" #include "cobalt/media/decoder_buffer_allocator.h" +#include "media/base/demuxer.h" #include "starboard/extension/demuxer.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/chromium/media/base/demuxer.h" namespace cobalt { namespace media { diff --git a/cobalt/media/progressive/mp4_parser.cc b/cobalt/media/progressive/mp4_parser.cc index 70ceafdd13a3..d0c026c3110e 100644 --- a/cobalt/media/progressive/mp4_parser.cc +++ b/cobalt/media/progressive/mp4_parser.cc @@ -21,8 +21,8 @@ #include "base/strings/stringprintf.h" #include "cobalt/media/base/endian_util.h" +#include "media/formats/mp4/es_descriptor.h" #include "starboard/types.h" -#include "third_party/chromium/media/formats/mp4/es_descriptor.h" namespace cobalt { namespace media { diff --git a/cobalt/media/progressive/progressive_demuxer.cc b/cobalt/media/progressive/progressive_demuxer.cc index 7ecd0393dbf6..4be6d8175578 100644 --- a/cobalt/media/progressive/progressive_demuxer.cc +++ b/cobalt/media/progressive/progressive_demuxer.cc @@ -28,10 +28,10 @@ #include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "cobalt/media/base/data_source.h" +#include "media/base/bind_to_current_loop.h" +#include "media/base/starboard_utils.h" +#include "media/base/timestamp_constants.h" #include "starboard/types.h" -#include "third_party/chromium/media/base/bind_to_current_loop.h" -#include "third_party/chromium/media/base/starboard_utils.h" -#include "third_party/chromium/media/base/timestamp_constants.h" namespace cobalt { namespace media { diff --git a/cobalt/media/progressive/progressive_demuxer.h b/cobalt/media/progressive/progressive_demuxer.h index c79cf018e681..5f14b738858a 100644 --- a/cobalt/media/progressive/progressive_demuxer.h +++ b/cobalt/media/progressive/progressive_demuxer.h @@ -24,11 +24,11 @@ #include "base/message_loop/message_loop.h" #include "base/threading/thread.h" #include "cobalt/media/progressive/progressive_parser.h" -#include "third_party/chromium/media/base/decoder_buffer.h" -#include "third_party/chromium/media/base/demuxer.h" -#include "third_party/chromium/media/base/demuxer_stream.h" -#include "third_party/chromium/media/base/media_log.h" -#include "third_party/chromium/media/base/ranges.h" +#include "media/base/decoder_buffer.h" +#include "media/base/demuxer.h" +#include "media/base/demuxer_stream.h" +#include "media/base/media_log.h" +#include "media/base/ranges.h" namespace media { class DecoderBuffer; diff --git a/cobalt/media/progressive/progressive_parser.cc b/cobalt/media/progressive/progressive_parser.cc index a7b5b5248573..44707708c3ce 100644 --- a/cobalt/media/progressive/progressive_parser.cc +++ b/cobalt/media/progressive/progressive_parser.cc @@ -16,7 +16,7 @@ #include "base/logging.h" #include "cobalt/media/progressive/mp4_parser.h" -#include "third_party/chromium/media/base/timestamp_constants.h" +#include "media/base/timestamp_constants.h" namespace cobalt { namespace media { diff --git a/cobalt/media/progressive/progressive_parser.h b/cobalt/media/progressive/progressive_parser.h index cd3fce7d24c9..caf94a9c05fe 100644 --- a/cobalt/media/progressive/progressive_parser.h +++ b/cobalt/media/progressive/progressive_parser.h @@ -19,10 +19,10 @@ #include "cobalt/media/base/pipeline.h" #include "cobalt/media/progressive/avc_access_unit.h" #include "cobalt/media/progressive/data_source_reader.h" -#include "third_party/chromium/media/base/audio_decoder_config.h" -#include "third_party/chromium/media/base/demuxer_stream.h" -#include "third_party/chromium/media/base/media_log.h" -#include "third_party/chromium/media/base/video_decoder_config.h" +#include "media/base/audio_decoder_config.h" +#include "media/base/demuxer_stream.h" +#include "media/base/media_log.h" +#include "media/base/video_decoder_config.h" namespace cobalt { namespace media { diff --git a/cobalt/media/sandbox/BUILD.gn b/cobalt/media/sandbox/BUILD.gn index 5edbfc48e78c..dad1c4afeee0 100644 --- a/cobalt/media/sandbox/BUILD.gn +++ b/cobalt/media/sandbox/BUILD.gn @@ -24,8 +24,8 @@ target(final_executable_type, "media_sandbox") { "//cobalt/base", "//cobalt/math", "//cobalt/media", + "//media", "//starboard:starboard_group", - "//third_party/chromium/media", ] } @@ -57,8 +57,8 @@ target(final_executable_type, "web_media_player_sandbox") { "//cobalt/storage", "//cobalt/system_window", "//cobalt/trace_event", + "//media", "//starboard:starboard_group", - "//third_party/chromium/media", "//url", ] diff --git a/cobalt/media/sandbox/format_guesstimator.cc b/cobalt/media/sandbox/format_guesstimator.cc index d3652ce258d9..1fb8a6a490e8 100644 --- a/cobalt/media/sandbox/format_guesstimator.cc +++ b/cobalt/media/sandbox/format_guesstimator.cc @@ -29,6 +29,7 @@ #include "media/base/audio_decoder_config.h" #include "media/base/demuxer_stream.h" #include "media/base/media_tracks.h" +#include "media/base/timestamp_constants.h" #include "media/base/video_codecs.h" #include "media/base/video_decoder_config.h" #include "media/filters/chunk_demuxer.h" @@ -38,7 +39,6 @@ #include "starboard/common/string.h" #include "starboard/memory.h" #include "starboard/types.h" -#include "third_party/chromium/media/base/timestamp_constants.h" #include "ui/gfx/geometry/size.h" namespace cobalt { diff --git a/cobalt/media/sandbox/media2_sandbox.cc b/cobalt/media/sandbox/media2_sandbox.cc index 2f4d8a155493..a6cea8058b5b 100644 --- a/cobalt/media/sandbox/media2_sandbox.cc +++ b/cobalt/media/sandbox/media2_sandbox.cc @@ -26,10 +26,10 @@ #include "base/task/task_scheduler/task_scheduler.h" #include "cobalt/base/wrap_main.h" #include "cobalt/media/decoder_buffer_allocator.h" +#include "media/base/media_log.h" +#include "media/filters/chunk_demuxer.h" #include "starboard/common/string.h" #include "starboard/event.h" -#include "third_party/chromium/media/base/media_log.h" -#include "third_party/chromium/media/filters/chunk_demuxer.h" namespace cobalt { namespace media { diff --git a/cobalt/media/sandbox/web_media_player_sandbox.cc b/cobalt/media/sandbox/web_media_player_sandbox.cc index e8421b64f2f3..4303409024c2 100644 --- a/cobalt/media/sandbox/web_media_player_sandbox.cc +++ b/cobalt/media/sandbox/web_media_player_sandbox.cc @@ -31,12 +31,12 @@ #include "cobalt/media/sandbox/media_sandbox.h" #include "cobalt/media/sandbox/web_media_player_helper.h" #include "cobalt/render_tree/image.h" +#include "media/base/timestamp_constants.h" +#include "media/filters/chunk_demuxer.h" #include "starboard/common/file.h" #include "starboard/event.h" #include "starboard/log.h" #include "starboard/system.h" -#include "third_party/chromium/media/base/timestamp_constants.h" -#include "third_party/chromium/media/filters/chunk_demuxer.h" namespace cobalt { namespace media { diff --git a/cobalt/media_capture/media_devices.cc b/cobalt/media_capture/media_devices.cc index 3c671f3609f2..c2cdef79293c 100644 --- a/cobalt/media_capture/media_devices.cc +++ b/cobalt/media_capture/media_devices.cc @@ -36,10 +36,6 @@ namespace cobalt { namespace media_capture { -#if SB_USE_SB_MICROPHONE && !defined(DISABLE_MICROPHONE_IDL) -#define ENABLE_MICROPHONE_IDL -#endif - namespace { using speech::Microphone; @@ -56,13 +52,11 @@ std::unique_ptr CreateMicrophone( std::unique_ptr mic; -#if defined(ENABLE_MICROPHONE_IDL) mic.reset(new speech::MicrophoneStarboard( speech::MicrophoneStarboard::kDefaultSampleRate, /* Buffer for one second. */ speech::MicrophoneStarboard::kDefaultSampleRate * speech::MicrophoneStarboard::kSbMicrophoneSampleSizeInBytes)); -#endif // defined(ENABLE_MICROPHONE_IDL) return mic; } diff --git a/cobalt/media_stream/microphone_audio_source.cc b/cobalt/media_stream/microphone_audio_source.cc index 3ed0be94ba91..06e69c0f5b6a 100644 --- a/cobalt/media_stream/microphone_audio_source.cc +++ b/cobalt/media_stream/microphone_audio_source.cc @@ -23,10 +23,6 @@ #include "cobalt/speech/microphone_fake.h" #include "cobalt/speech/microphone_starboard.h" -#if SB_USE_SB_MICROPHONE && !defined(DISABLE_MICROPHONE_IDL) -#define ENABLE_MICROPHONE_IDL -#endif - namespace cobalt { namespace media_stream { @@ -43,16 +39,12 @@ void MicrophoneAudioSource::EnsureSourceIsStopped() { std::unique_ptr MicrophoneAudioSource::CreateMicrophone( const cobalt::speech::Microphone::Options& options, int buffer_size_bytes) { -#if !defined(ENABLE_MICROPHONE_IDL) - return std::unique_ptr(); -#else std::unique_ptr mic; #if defined(ENABLE_FAKE_MICROPHONE) if (options.enable_fake_microphone) { mic.reset(new speech::MicrophoneFake(options)); } -#else #endif // defined(ENABLE_FAKE_MICROPHONE) if (!mic) { @@ -68,7 +60,6 @@ MicrophoneAudioSource::CreateMicrophone( } return mic; -#endif // defined(ENABLE_MICROPHONE_IDL) } MicrophoneAudioSource::MicrophoneAudioSource( diff --git a/cobalt/renderer/backend/graphics_system_test.cc b/cobalt/renderer/backend/graphics_system_test.cc index 041315d7686f..0100fc9fb4e4 100644 --- a/cobalt/renderer/backend/graphics_system_test.cc +++ b/cobalt/renderer/backend/graphics_system_test.cc @@ -57,10 +57,10 @@ TEST(GraphicsSystemTest, FLAKY_GraphicsSystemCanBeInitializedOften) { << "ms per initialization."; // Graphics system initializations should not take more than the maximum of - // 200ms or three times as long as the time we just measured. + // 250ms or three times as long as the time we just measured. int64_t maximum_time_usec_per_initialization = std::max(3 * time_per_initialization_usec, - 200 * base::Time::kMicrosecondsPerMillisecond); + 250 * base::Time::kMicrosecondsPerMillisecond); int64_t last = starboard::CurrentMonotonicTime(); for (int i = 0; i < 20; ++i) { @@ -106,10 +106,10 @@ TEST(GraphicsSystemTest, FLAKY_GraphicsContextCanBeInitializedOften) { << "ms per initialization."; // Graphics system and context initializations should not take more than the - // maximum of 200ms or three times as long as the time we just measured. + // maximum of 250ms or three times as long as the time we just measured. int64_t maximum_time_usec_per_initialization = std::max(3 * time_per_initialization_usec, - 200 * base::Time::kMicrosecondsPerMillisecond); + 250 * base::Time::kMicrosecondsPerMillisecond); int64_t last = starboard::CurrentMonotonicTime(); for (int i = 0; i < 20; ++i) { diff --git a/cobalt/site/docs/development/setup-raspi.md b/cobalt/site/docs/development/setup-raspi.md index 8a3acdc03a45..7cbdad23c734 100644 --- a/cobalt/site/docs/development/setup-raspi.md +++ b/cobalt/site/docs/development/setup-raspi.md @@ -12,7 +12,7 @@ Raspberry Pi device. They have been tested with Ubuntu:20.04 and a Raspberry Pi Download the latest Cobalt customized Raspbian image from GCS bucket (this is built via this +href="https://github.com/youtube/cobalt/tree/main/cobalt/tools/raspi_image">this customization tool) On MacOS, use an image flashing tool like balenaEtcher to write the image to a 32GB SD-card. diff --git a/cobalt/site/docs/reference/starboard/configuration-public.md b/cobalt/site/docs/reference/starboard/configuration-public.md index 259b3e77c02d..6c02fcecd6a0 100644 --- a/cobalt/site/docs/reference/starboard/configuration-public.md +++ b/cobalt/site/docs/reference/starboard/configuration-public.md @@ -3,14 +3,6 @@ Book: /youtube/cobalt/_book.yaml # Starboard Configuration Reference Guide -## Architecture Configuration - -| Properties | -| :--- | -| **`SB_HAS_QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES`**

Some platforms will not align variables on the stack with an alignment greater than 16 bytes. Platforms where this is the case should define the following quirk.

By default, this property is undefined. | -| **`SB_HAS_QUIRK_THREAD_AFFINITY_UNSUPPORTED`**

Some platforms do not have thread affinity support. Platforms where this is the case should define the following quirk.

By default, this property is undefined. | - - ## Compiler Configuration | Properties | @@ -21,29 +13,6 @@ Book: /youtube/cobalt/_book.yaml | **`SB_EXPORT_PLATFORM`**

The platform's annotation for marking a symbol as exported outside of the current shared library.

The default value in the Stub implementation is
`__attribute__((visibility("default")))` | | **`SB_IMPORT_PLATFORM`**

The platform's annotation for marking a symbol as imported from outside of the current linking unit. | -## Filesystem Configuration - -| Properties | -| :--- | -| **`SB_HAS_QUIRK_FILESYSTEM_ZERO_FILEINFO_TIME`**

Some operating systems constantly return zero values for creation, access and modification time for files and directories. When this quirk is defined, we need to ignore corresponded time values in applications as well as take this fact into account in unit tests.

By default, this property is undefined. | -| **`SB_HAS_QUIRK_FILESYSTEM_COARSE_ACCESS_TIME`**

On some platforms the file system stores access times at a coarser granularity than other times. When this quirk is defined, we assume the access time is of 1 day precision.

By default, this property is undefined. | -| **`SB_HAS_QUIRK_HASH_FILE_NAME`**

On some platforms the file system cannot access extremely long file names. We do not need this feature on stub.

By default, this property is undefined. | - - -## Graphics Configuration - -| Properties | -| :--- | -| **`SB_HAS_VIRTUAL_REALITY`**

The default value in the Stub implementation is `1` | - - -## I/O Configuration - -| Properties | -| :--- | -| **`SB_HAS_ON_SCREEN_KEYBOARD`**

Whether the current platform implements the on screen keyboard interface.

The default value in the Stub implementation is `0` | -| **`SB_HAS_SPEECH_SYNTHESIS`**

Whether the current platform has speech synthesis.

The default value in the Stub implementation is `1` | - ## Media Configuration @@ -78,4 +47,3 @@ Book: /youtube/cobalt/_book.yaml | **`SB_IS_WCHAR_T_UTF32`**

Type detection for wchar_t.

The default value in the Stub implementation is `1` | | **`SB_IS_WCHAR_T_UTF16`**

The default value in the Stub implementation is `1` | | **`SB_IS_WCHAR_T_UNSIGNED`**

Chrome only defines this for ARMEL. Chrome has an exclusion for iOS here, we should too when we support iOS.

The default value in the Stub implementation is `1` | -| **`SB_HAS_QUIRK_SOCKET_BSD_HEADERS`**

This quirk is used to switch the headers included in starboard/shared/linux/socket_get_interface_address.cc for darwin system headers. It may be removed at some point in favor of a different solution.

By default, this property is undefined. | diff --git a/cobalt/site/docs/reference/starboard/modules/event.md b/cobalt/site/docs/reference/starboard/modules/event.md index fdfa85670d1e..b8005a5d6c36 100644 --- a/cobalt/site/docs/reference/starboard/modules/event.md +++ b/cobalt/site/docs/reference/starboard/modules/event.md @@ -236,16 +236,6 @@ the type of the value pointed to by that data argument, if any. triggered by the application have tickets passed in via SbWindowBlurOnScreenKeyboard. System-triggered events have ticket value kSbEventOnScreenKeyboardInvalidTicket. -* `kSbEventTypeOnScreenKeyboardSuggestionsUpdated` - - The platform has updated the on screen keyboard suggestions. This event is - triggered by the system or by the application's OnScreenKeyboard update - suggestions method. The event has int data representing a ticket. The ticket - is used by the application to mark individual calls to the update - suggestions method as successfully completed. Events triggered by the - application have tickets passed in via - SbWindowUpdateOnScreenKeyboardSuggestions. System-triggered events have - ticket value kSbEventOnScreenKeyboardInvalidTicket. * `kSbEventTypeAccessibilityCaptionSettingsChanged` One or more of the fields returned by SbAccessibilityGetCaptionSettings has diff --git a/cobalt/site/docs/reference/starboard/modules/window.md b/cobalt/site/docs/reference/starboard/modules/window.md index acea84d4c7d0..25845315aed4 100644 --- a/cobalt/site/docs/reference/starboard/modules/window.md +++ b/cobalt/site/docs/reference/starboard/modules/window.md @@ -95,20 +95,6 @@ that would be created to back that window. ## Functions -### SbWindowBlurOnScreenKeyboard - -Blur the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardBlurred. -kSbEventTypeOnScreenKeyboardBlurred has data `ticket`. Calling -SbWindowBlurOnScreenKeyboard() when the keyboard is already blurred is -permitted. Calling SbWindowBlurOnScreenKeyboard while the on screen keyboard is -not showing does nothing and does not fire any event. - -#### Declaration - -``` -void SbWindowBlurOnScreenKeyboard(SbWindow window, int ticket) -``` - ### SbWindowCreate Creates and returns a new system window with the given `options`, which may be @@ -149,20 +135,6 @@ Destroys `window`, reclaiming associated resources. bool SbWindowDestroy(SbWindow window) ``` -### SbWindowFocusOnScreenKeyboard - -Focus the on screen keyboard. Fire kSbEventTypeOnScreenKeyboardFocused. -kSbEventTypeOnScreenKeyboardFocused has data `ticket`. Calling -SbWindowFocusOnScreenKeyboard() when the keyboard is already focused is -permitted. Calling SbWindowFocusOnScreenKeyboard while the on screen keyboard is -not showing does nothing and does not fire any event. - -#### Declaration - -``` -void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket) -``` - ### SbWindowGetDiagonalSizeInInches Gets the size of the diagonal between two opposing screen corners. @@ -176,18 +148,6 @@ is. float SbWindowGetDiagonalSizeInInches(SbWindow window) ``` -### SbWindowGetOnScreenKeyboardBoundingRect - -Get the rectangle of the on screen keyboard in screen pixel coordinates. Return -`true` if successful. Return `false` if the on screen keyboard is not showing. -If the function returns `false`, then `rect` will not have been modified. - -#### Declaration - -``` -bool SbWindowGetOnScreenKeyboardBoundingRect(SbWindow window, SbWindowRect *bounding_rect) -``` - ### SbWindowGetPlatformHandle Gets the platform-specific handle for `window`, which can be passed as an @@ -216,29 +176,6 @@ then `size` will not have been modified. bool SbWindowGetSize(SbWindow window, SbWindowSize *size) ``` -### SbWindowHideOnScreenKeyboard - -Hide the on screen keyboard. Fire kSbEventTypeWindowSizeChange and -kSbEventTypeOnScreenKeyboardHidden if necessary. -kSbEventTypeOnScreenKeyboardHidden has data `ticket`. Calling -SbWindowHideOnScreenKeyboard() when the keyboard is already hidden is permitted. - -#### Declaration - -``` -void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket) -``` - -### SbWindowIsOnScreenKeyboardShown - -Determine if the on screen keyboard is shown. - -#### Declaration - -``` -bool SbWindowIsOnScreenKeyboardShown(SbWindow window) -``` - ### SbWindowIsValid Returns whether the given window handle is valid. @@ -249,28 +186,6 @@ Returns whether the given window handle is valid. static bool SbWindowIsValid(SbWindow window) ``` -### SbWindowOnScreenKeyboardIsSupported - -Return whether the current platform supports an on screen keyboard - -#### Declaration - -``` -bool SbWindowOnScreenKeyboardIsSupported() -``` - -### SbWindowOnScreenKeyboardSuggestionsSupported - -Determine if the on screen keyboard has suggestions implemented. If this returns -false, then calling SbWindowUpdateOnScreenKeyboardSuggestions() will be -undefined. - -#### Declaration - -``` -bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window) -``` - ### SbWindowSetDefaultOptions Sets the default options for system windows. @@ -283,48 +198,3 @@ Sets the default options for system windows. ``` void SbWindowSetDefaultOptions(SbWindowOptions *options) ``` - -### SbWindowSetOnScreenKeyboardKeepFocus - -Notify the system that `keepFocus` has been set for the OnScreenKeyboard. -`keepFocus` true indicates that the user may not navigate focus off of the -OnScreenKeyboard via input; focus may only be moved via events sent by the app. -`keepFocus` false indicates that the user may navigate focus off of the -OnScreenKeyboard via input. `keepFocus` is initialized to false in the -OnScreenKeyboard constructor. - -#### Declaration - -``` -void SbWindowSetOnScreenKeyboardKeepFocus(SbWindow window, bool keep_focus) -``` - -### SbWindowShowOnScreenKeyboard - -Show the on screen keyboard and populate the input with text `input_text`. Fire -kSbEventTypeWindowSizeChange and kSbEventTypeOnScreenKeyboardShown if necessary. -kSbEventTypeOnScreenKeyboardShown has data `ticket`. The passed in `input_text` -will never be NULL, but may be an empty string. Calling -SbWindowShowOnScreenKeyboard() when the keyboard is already shown is permitted, -and the input will be replaced with `input_text`. Showing the on screen keyboard -does not give it focus. - -#### Declaration - -``` -void SbWindowShowOnScreenKeyboard(SbWindow window, const char *input_text, int ticket) -``` - -### SbWindowUpdateOnScreenKeyboardSuggestions - -Update the on screen keyboard custom suggestions. Fire -kSbEventTypeOnScreenKeyboardSuggestionsUpdated. -kSbEventTypeOnScreenKeyboardSuggestionsUpdated has data `ticket`. The -suggestions should remain up-to-date when the keyboard is shown after being -hidden. - -#### Declaration - -``` -void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, const char *suggestions[], int num_suggestions, int ticket) -``` diff --git a/cobalt/speech/cobalt_speech_recognizer.cc b/cobalt/speech/cobalt_speech_recognizer.cc index d7527af19d62..20111f7a1d20 100644 --- a/cobalt/speech/cobalt_speech_recognizer.cc +++ b/cobalt/speech/cobalt_speech_recognizer.cc @@ -24,10 +24,8 @@ #include "cobalt/speech/url_fetcher_fake.h" #endif // defined(ENABLE_FAKE_MICROPHONE) #include "cobalt/speech/microphone_manager.h" -#include "cobalt/speech/speech_recognition_error.h" -#if defined(SB_USE_SB_MICROPHONE) #include "cobalt/speech/microphone_starboard.h" -#endif // defined(SB_USE_SB_MICROPHONE) +#include "cobalt/speech/speech_recognition_error.h" #include "net/url_request/url_fetcher.h" namespace cobalt { @@ -45,15 +43,10 @@ std::unique_ptr CreateURLFetcher( } std::unique_ptr CreateMicrophone(int buffer_size_bytes) { -#if defined(SB_USE_SB_MICROPHONE) return std::unique_ptr( new MicrophoneStarboard(kSampleRate, buffer_size_bytes)); -#else - return std::unique_ptr(); -#endif // defined(SB_USE_SB_MICROPHONE) } -#if defined(SB_USE_SB_MICROPHONE) #if defined(ENABLE_FAKE_MICROPHONE) std::unique_ptr CreateFakeURLFetcher( const GURL& url, net::URLFetcher::RequestType request_type, @@ -67,7 +60,6 @@ std::unique_ptr CreateFakeMicrophone( return std::unique_ptr(new MicrophoneFake(options)); } #endif // defined(ENABLE_FAKE_MICROPHONE) -#endif // defined(SB_USE_SB_MICROPHONE) } // namespace CobaltSpeechRecognizer::CobaltSpeechRecognizer( @@ -80,7 +72,6 @@ CobaltSpeechRecognizer::CobaltSpeechRecognizer( MicrophoneManager::MicrophoneCreator microphone_creator = base::Bind(&CreateMicrophone); -#if defined(SB_USE_SB_MICROPHONE) #if defined(ENABLE_FAKE_MICROPHONE) if (microphone_options.enable_fake_microphone) { // If fake microphone is enabled, fake URL fetchers should be enabled as @@ -89,7 +80,6 @@ CobaltSpeechRecognizer::CobaltSpeechRecognizer( microphone_creator = base::Bind(&CreateFakeMicrophone, microphone_options); } #endif // defined(ENABLE_FAKE_MICROPHONE) -#endif // defined(SB_USE_SB_MICROPHONE) service_.reset(new GoogleSpeechService( network_module, diff --git a/cobalt/speech/google_speech_service.cc b/cobalt/speech/google_speech_service.cc index 1ee9e4b4c871..71fdd6d1591f 100644 --- a/cobalt/speech/google_speech_service.cc +++ b/cobalt/speech/google_speech_service.cc @@ -41,10 +41,7 @@ #include "cobalt/speech/speech_recognition_error.h" #include "net/base/escape.h" #include "net/url_request/url_fetcher.h" - -#if defined(SB_USE_SB_MICROPHONE) #include "starboard/system.h" -#endif // defined(SB_USE_SB_MICROPHONE) namespace cobalt { namespace speech { diff --git a/cobalt/speech/microphone_starboard.cc b/cobalt/speech/microphone_starboard.cc index cf74ab4b8ed6..0f7350637f26 100644 --- a/cobalt/speech/microphone_starboard.cc +++ b/cobalt/speech/microphone_starboard.cc @@ -14,8 +14,6 @@ #include "cobalt/speech/microphone_starboard.h" -#if defined(SB_USE_SB_MICROPHONE) - #include "starboard/common/log.h" namespace cobalt { @@ -89,5 +87,3 @@ bool MicrophoneStarboard::Close() { } // namespace speech } // namespace cobalt - -#endif // defined(SB_USE_SB_MICROPHONE) diff --git a/cobalt/speech/microphone_starboard.h b/cobalt/speech/microphone_starboard.h index a9c7e01605e3..04f371997f2b 100644 --- a/cobalt/speech/microphone_starboard.h +++ b/cobalt/speech/microphone_starboard.h @@ -15,13 +15,10 @@ #ifndef COBALT_SPEECH_MICROPHONE_STARBOARD_H_ #define COBALT_SPEECH_MICROPHONE_STARBOARD_H_ -#include "cobalt/speech/speech_configuration.h" - -#if defined(SB_USE_SB_MICROPHONE) - #include #include "cobalt/speech/microphone.h" +#include "cobalt/speech/speech_configuration.h" #include "starboard/microphone.h" namespace cobalt { @@ -55,5 +52,4 @@ class MicrophoneStarboard : public Microphone { } // namespace speech } // namespace cobalt -#endif // defined(SB_USE_SB_MICROPHONE) #endif // COBALT_SPEECH_MICROPHONE_STARBOARD_H_ diff --git a/cobalt/speech/speech_configuration.h b/cobalt/speech/speech_configuration.h index a7a1b49eec17..f083844b3ae0 100644 --- a/cobalt/speech/speech_configuration.h +++ b/cobalt/speech/speech_configuration.h @@ -18,6 +18,4 @@ #include "build/build_config.h" #include "starboard/configuration.h" -#define SB_USE_SB_MICROPHONE 1 - #endif // COBALT_SPEECH_SPEECH_CONFIGURATION_H_ diff --git a/tools/lz4_compress/BUILD.gn b/cobalt/tools/lz4_compress/BUILD.gn similarity index 100% rename from tools/lz4_compress/BUILD.gn rename to cobalt/tools/lz4_compress/BUILD.gn diff --git a/tools/lz4_compress/lz4_compress.cc b/cobalt/tools/lz4_compress/lz4_compress.cc similarity index 93% rename from tools/lz4_compress/lz4_compress.cc rename to cobalt/tools/lz4_compress/lz4_compress.cc index 08a79f532e23..bd780b41685a 100644 --- a/tools/lz4_compress/lz4_compress.cc +++ b/cobalt/tools/lz4_compress/lz4_compress.cc @@ -111,28 +111,24 @@ bool WriteFile(const char* file_path, std::vector& buffer) { int main(int argc, char* argv[]) { if (argc != 3) { - std::cerr << "Usage: lz4_compress " - << "\n"; + std::cerr << "Usage: lz4_compress " << "\n"; return 1; } std::vector src_buffer; if (!ReadFile(argv[1], src_buffer)) { - std::cerr << "Failed to read the src file" - << "\n"; + std::cerr << "Failed to read the src file" << "\n"; return 1; } std::vector dst_buffer; if (!Compress(src_buffer, dst_buffer)) { - std::cerr << "Failed to compress" - << "\n"; + std::cerr << "Failed to compress" << "\n"; return 1; } if (!WriteFile(argv[2], dst_buffer)) { - std::cerr << "Failed to write the dst file" - << "\n"; + std::cerr << "Failed to write the dst file" << "\n"; return 1; } diff --git a/tools/raspi_image/README.md b/cobalt/tools/raspi_image/README.md similarity index 100% rename from tools/raspi_image/README.md rename to cobalt/tools/raspi_image/README.md diff --git a/tools/raspi_image/auto-resize-partition.sh b/cobalt/tools/raspi_image/auto-resize-partition.sh similarity index 100% rename from tools/raspi_image/auto-resize-partition.sh rename to cobalt/tools/raspi_image/auto-resize-partition.sh diff --git a/tools/raspi_image/crontab.txt b/cobalt/tools/raspi_image/crontab.txt similarity index 100% rename from tools/raspi_image/crontab.txt rename to cobalt/tools/raspi_image/crontab.txt diff --git a/tools/raspi_image/make_image.sh b/cobalt/tools/raspi_image/make_image.sh similarity index 100% rename from tools/raspi_image/make_image.sh rename to cobalt/tools/raspi_image/make_image.sh diff --git a/tools/windows/win_compile_time_check.ps1 b/cobalt/tools/windows/win_compile_time_check.ps1 similarity index 100% rename from tools/windows/win_compile_time_check.ps1 rename to cobalt/tools/windows/win_compile_time_check.ps1 diff --git a/components/crx_file/crx3.pb.cc b/components/crx_file/crx3.pb.cc index d7e7940c7a80..34226e069382 100644 --- a/components/crx_file/crx3.pb.cc +++ b/components/crx_file/crx3.pb.cc @@ -11,7 +11,6 @@ #include #include #include -#include #include // @@protoc_insertion_point(includes) diff --git a/crypto/rsa_private_key.cc b/crypto/rsa_private_key.cc index ab8027ca3ce9..5a56e5094f7a 100644 --- a/crypto/rsa_private_key.cc +++ b/crypto/rsa_private_key.cc @@ -58,7 +58,7 @@ std::unique_ptr RSAPrivateKey::CreateFromPrivateKeyInfo( // static std::unique_ptr RSAPrivateKey::CreateFromKey(EVP_PKEY* key) { DCHECK(key); - if (EVP_PKEY_type(key->type) != EVP_PKEY_RSA) + if (EVP_PKEY_id(key) != EVP_PKEY_RSA) return nullptr; std::unique_ptr copy(new RSAPrivateKey); copy->key_ = bssl::UpRef(key); diff --git a/docker-compose.yml b/docker-compose.yml index cd70ef55a825..ea3a5fab2bbf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,7 +49,7 @@ x-shared-unittest-definitions: &shared-unittest-definitions dockerfile: unittest/Dockerfile args: - CLANG_VER=${CLANG_VER:-365097-f7e52fbd-8} - - CLANG_16_VER=${CLANG_16_VER:-16-init-17653-g39da55e8-2} + - COBALT_CLANG_VER=${COBALT_CLANG_VER:-17-init-8029-g27f27d15-3} image: cobalt-linux-x64x11-unittest environment: - PLATFORM=${PLATFORM:-linux-x64x11} @@ -112,7 +112,7 @@ services: args: # Should match version pinned by Starboard - CLANG_VER=${CLANG_VER:-365097-f7e52fbd-8} - - CLANG_16_VER=${CLANG_16_VER:-16-init-17653-g39da55e8-2} + - COBALT_CLANG_VER=${COBALT_CLANG_VER:-17-init-8029-g27f27d15-3} image: cobalt-build-base depends_on: - base @@ -125,7 +125,7 @@ services: args: - FROM_IMAGE=base-bionic - CLANG_VER=${CLANG_VER:-365097-f7e52fbd-8} - - CLANG_16_VER=${CLANG_16_VER:-16-init-17653-g39da55e8-2} + - COBALT_CLANG_VER=${COBALT_CLANG_VER:-17-init-8029-g27f27d15-3} image: build-base-bionic depends_on: - base-bionic diff --git a/docker/linux/base/build/Dockerfile b/docker/linux/base/build/Dockerfile index 0b9ce0117310..8f08f7bc5a87 100644 --- a/docker/linux/base/build/Dockerfile +++ b/docker/linux/base/build/Dockerfile @@ -97,19 +97,19 @@ RUN cd /tmp \ && echo ${CLANG_VER} >> ${TC_HOME}/cr_build_revision \ && rm clang-${CLANG_VER}.tgz -# === Install Clang 16 toolchain for all Linux-hosted builds -ARG CLANG_16_VER +# === Install Clang toolchain for all Linux-hosted builds +ARG COBALT_CLANG_VER -ARG CLANG_16_TC_HOME=${TC_ROOT}/x86_64-linux-gnu-clang-chromium-${CLANG_16_VER} -ARG CLANG_16_BASE_URL=https://commondatastorage.googleapis.com/chromium-browser-clang +ARG COBALT_CLANG_TC_HOME=${TC_ROOT}/x86_64-linux-gnu-clang-chromium-${COBALT_CLANG_VER} +ARG COBALT_CLANG_BASE_URL=https://commondatastorage.googleapis.com/chromium-browser-clang RUN cd /tmp \ - && mkdir -p ${CLANG_16_TC_HOME} \ + && mkdir -p ${COBALT_CLANG_TC_HOME} \ && curl --silent -O -J \ - ${CLANG_16_BASE_URL}/Linux_x64/clang-llvmorg-${CLANG_16_VER}.tgz \ - && tar xf clang-llvmorg-${CLANG_16_VER}.tgz -C ${CLANG_16_TC_HOME} \ - && echo ${CLANG_16_VER} >> ${CLANG_16_TC_HOME}/cr_build_revision \ - && rm clang-llvmorg-${CLANG_16_VER}.tgz + ${COBALT_CLANG_BASE_URL}/Linux_x64/clang-llvmorg-${COBALT_CLANG_VER}.tgz \ + && tar xf clang-llvmorg-${COBALT_CLANG_VER}.tgz -C ${COBALT_CLANG_TC_HOME} \ + && echo ${COBALT_CLANG_VER} >> ${COBALT_CLANG_TC_HOME}/cr_build_revision \ + && rm clang-llvmorg-${COBALT_CLANG_VER}.tgz RUN git config --global --add safe.directory /code diff --git a/docker/linux/unittest/Dockerfile b/docker/linux/unittest/Dockerfile index 4e6f527b8bd7..eaa110cc82cc 100644 --- a/docker/linux/unittest/Dockerfile +++ b/docker/linux/unittest/Dockerfile @@ -64,28 +64,28 @@ RUN cd /tmp \ && echo ${CLANG_VER} >> ${TC_HOME}/cr_build_revision \ && rm clang-${CLANG_VER}.tgz -# === Install Clang 16 toolchain for llvm-symbolization. -ARG CLANG_16_VER +# === Install Clang toolchain for llvm-symbolization. +ARG COBALT_CLANG_VER -ARG CLANG_16_TC_HOME=${TC_ROOT}/x86_64-linux-gnu-clang-chromium-${CLANG_16_VER} -ARG CLANG_16_BASE_URL=https://commondatastorage.googleapis.com/chromium-browser-clang +ARG COBALT_CLANG_TC_HOME=${TC_ROOT}/x86_64-linux-gnu-clang-chromium-${COBALT_CLANG_VER} +ARG COBALT_CLANG_BASE_URL=https://commondatastorage.googleapis.com/chromium-browser-clang RUN cd /tmp \ - && mkdir -p ${CLANG_16_TC_HOME} \ + && mkdir -p ${COBALT_CLANG_TC_HOME} \ && curl --silent -O -J \ - ${CLANG_16_BASE_URL}/Linux_x64/clang-llvmorg-${CLANG_16_VER}.tgz \ - && tar xf clang-llvmorg-${CLANG_16_VER}.tgz -C ${CLANG_16_TC_HOME} \ - && echo ${CLANG_16_VER} >> ${CLANG_16_TC_HOME}/cr_build_revision \ - && rm clang-llvmorg-${CLANG_16_VER}.tgz + ${COBALT_CLANG_BASE_URL}/Linux_x64/clang-llvmorg-${COBALT_CLANG_VER}.tgz \ + && tar xf clang-llvmorg-${COBALT_CLANG_VER}.tgz -C ${COBALT_CLANG_TC_HOME} \ + && echo ${COBALT_CLANG_VER} >> ${COBALT_CLANG_TC_HOME}/cr_build_revision \ + && rm clang-llvmorg-${COBALT_CLANG_VER}.tgz -# === Install Clang 16 toolchain coverage tools. +# === Install Clang toolchain coverage tools. RUN cd /tmp \ - && mkdir -p ${CLANG_16_TC_HOME} \ + && mkdir -p ${COBALT_CLANG_TC_HOME} \ && curl --silent -O -J \ - ${CLANG_16_BASE_URL}/Linux_x64/llvm-code-coverage-llvmorg-${CLANG_16_VER}.tgz \ - && tar xf llvm-code-coverage-llvmorg-${CLANG_16_VER}.tgz -C ${CLANG_16_TC_HOME} \ - && echo ${CLANG_16_VER} >> ${CLANG_16_TC_HOME}/cr_build_revision \ - && rm llvm-code-coverage-llvmorg-${CLANG_16_VER}.tgz + ${COBALT_CLANG_BASE_URL}/Linux_x64/llvm-code-coverage-llvmorg-${COBALT_CLANG_VER}.tgz \ + && tar xf llvm-code-coverage-llvmorg-${COBALT_CLANG_VER}.tgz -C ${COBALT_CLANG_TC_HOME} \ + && echo ${COBALT_CLANG_VER} >> ${COBALT_CLANG_TC_HOME}/cr_build_revision \ + && rm llvm-code-coverage-llvmorg-${COBALT_CLANG_VER}.tgz WORKDIR /out # Sets the locale in the environment. This is needed for NPLB unit tests. diff --git a/third_party/chromium/media/BUILD.gn b/media/BUILD.gn similarity index 99% rename from third_party/chromium/media/BUILD.gn rename to media/BUILD.gn index b90b9ca62204..de8086a38a4f 100644 --- a/third_party/chromium/media/BUILD.gn +++ b/media/BUILD.gn @@ -39,7 +39,7 @@ config("media_config_public") { "//third_party/abseil-cpp", "..", "cobalt", - "../../skia", + "//third_party/skia", ] } diff --git a/third_party/chromium/media/COMMON_METADATA b/media/COMMON_METADATA similarity index 100% rename from third_party/chromium/media/COMMON_METADATA rename to media/COMMON_METADATA diff --git a/third_party/chromium/media/DEPS b/media/DEPS similarity index 100% rename from third_party/chromium/media/DEPS rename to media/DEPS diff --git a/third_party/chromium/media/DIR_METADATA b/media/DIR_METADATA similarity index 100% rename from third_party/chromium/media/DIR_METADATA rename to media/DIR_METADATA diff --git a/third_party/chromium/media/METADATA b/media/METADATA similarity index 75% rename from third_party/chromium/media/METADATA rename to media/METADATA index 76ae0ae73168..5629e409c5b5 100644 --- a/third_party/chromium/media/METADATA +++ b/media/METADATA @@ -1,7 +1,3 @@ -name: "media" -description: - "Subtree at third_party/chromium/media" - third_party { identifier { type: "ChromiumVersion" @@ -16,9 +12,4 @@ third_party { type: "UpstreamSubdir" value: "media" } - last_upgrade_date { - year: 2022 - month: 1 - day: 11 - } } diff --git a/third_party/chromium/media/OWNERS b/media/OWNERS similarity index 100% rename from third_party/chromium/media/OWNERS rename to media/OWNERS diff --git a/third_party/chromium/media/PRESUBMIT.py b/media/PRESUBMIT.py similarity index 100% rename from third_party/chromium/media/PRESUBMIT.py rename to media/PRESUBMIT.py diff --git a/third_party/chromium/media/PRESUBMIT_test.py b/media/PRESUBMIT_test.py similarity index 100% rename from third_party/chromium/media/PRESUBMIT_test.py rename to media/PRESUBMIT_test.py diff --git a/third_party/chromium/media/README.md b/media/README.md similarity index 100% rename from third_party/chromium/media/README.md rename to media/README.md diff --git a/third_party/chromium/media/audio/BUILD.gn b/media/audio/BUILD.gn similarity index 100% rename from third_party/chromium/media/audio/BUILD.gn rename to media/audio/BUILD.gn diff --git a/third_party/chromium/media/audio/DEPS b/media/audio/DEPS similarity index 100% rename from third_party/chromium/media/audio/DEPS rename to media/audio/DEPS diff --git a/third_party/chromium/media/audio/DIR_METADATA b/media/audio/DIR_METADATA similarity index 100% rename from third_party/chromium/media/audio/DIR_METADATA rename to media/audio/DIR_METADATA diff --git a/third_party/chromium/media/audio/OWNERS b/media/audio/OWNERS similarity index 100% rename from third_party/chromium/media/audio/OWNERS rename to media/audio/OWNERS diff --git a/third_party/chromium/media/audio/agc_audio_stream.h b/media/audio/agc_audio_stream.h similarity index 100% rename from third_party/chromium/media/audio/agc_audio_stream.h rename to media/audio/agc_audio_stream.h diff --git a/third_party/chromium/media/audio/alive_checker.cc b/media/audio/alive_checker.cc similarity index 100% rename from third_party/chromium/media/audio/alive_checker.cc rename to media/audio/alive_checker.cc diff --git a/third_party/chromium/media/audio/alive_checker.h b/media/audio/alive_checker.h similarity index 100% rename from third_party/chromium/media/audio/alive_checker.h rename to media/audio/alive_checker.h diff --git a/third_party/chromium/media/audio/alive_checker_unittest.cc b/media/audio/alive_checker_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/alive_checker_unittest.cc rename to media/audio/alive_checker_unittest.cc diff --git a/third_party/chromium/media/audio/alsa/alsa_input.cc b/media/audio/alsa/alsa_input.cc similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_input.cc rename to media/audio/alsa/alsa_input.cc diff --git a/third_party/chromium/media/audio/alsa/alsa_input.h b/media/audio/alsa/alsa_input.h similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_input.h rename to media/audio/alsa/alsa_input.h diff --git a/third_party/chromium/media/audio/alsa/alsa_output.cc b/media/audio/alsa/alsa_output.cc similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_output.cc rename to media/audio/alsa/alsa_output.cc diff --git a/third_party/chromium/media/audio/alsa/alsa_output.h b/media/audio/alsa/alsa_output.h similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_output.h rename to media/audio/alsa/alsa_output.h diff --git a/third_party/chromium/media/audio/alsa/alsa_output_unittest.cc b/media/audio/alsa/alsa_output_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_output_unittest.cc rename to media/audio/alsa/alsa_output_unittest.cc diff --git a/third_party/chromium/media/audio/alsa/alsa_util.cc b/media/audio/alsa/alsa_util.cc similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_util.cc rename to media/audio/alsa/alsa_util.cc diff --git a/third_party/chromium/media/audio/alsa/alsa_util.h b/media/audio/alsa/alsa_util.h similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_util.h rename to media/audio/alsa/alsa_util.h diff --git a/third_party/chromium/media/audio/alsa/alsa_util_unittest.cc b/media/audio/alsa/alsa_util_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_util_unittest.cc rename to media/audio/alsa/alsa_util_unittest.cc diff --git a/third_party/chromium/media/audio/alsa/alsa_wrapper.cc b/media/audio/alsa/alsa_wrapper.cc similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_wrapper.cc rename to media/audio/alsa/alsa_wrapper.cc diff --git a/third_party/chromium/media/audio/alsa/alsa_wrapper.h b/media/audio/alsa/alsa_wrapper.h similarity index 100% rename from third_party/chromium/media/audio/alsa/alsa_wrapper.h rename to media/audio/alsa/alsa_wrapper.h diff --git a/third_party/chromium/media/audio/alsa/audio_manager_alsa.cc b/media/audio/alsa/audio_manager_alsa.cc similarity index 100% rename from third_party/chromium/media/audio/alsa/audio_manager_alsa.cc rename to media/audio/alsa/audio_manager_alsa.cc diff --git a/third_party/chromium/media/audio/alsa/audio_manager_alsa.h b/media/audio/alsa/audio_manager_alsa.h similarity index 100% rename from third_party/chromium/media/audio/alsa/audio_manager_alsa.h rename to media/audio/alsa/audio_manager_alsa.h diff --git a/third_party/chromium/media/audio/alsa/mock_alsa_wrapper.cc b/media/audio/alsa/mock_alsa_wrapper.cc similarity index 100% rename from third_party/chromium/media/audio/alsa/mock_alsa_wrapper.cc rename to media/audio/alsa/mock_alsa_wrapper.cc diff --git a/third_party/chromium/media/audio/alsa/mock_alsa_wrapper.h b/media/audio/alsa/mock_alsa_wrapper.h similarity index 100% rename from third_party/chromium/media/audio/alsa/mock_alsa_wrapper.h rename to media/audio/alsa/mock_alsa_wrapper.h diff --git a/third_party/chromium/media/audio/android/aaudio.sigs b/media/audio/android/aaudio.sigs similarity index 100% rename from third_party/chromium/media/audio/android/aaudio.sigs rename to media/audio/android/aaudio.sigs diff --git a/third_party/chromium/media/audio/android/aaudio_output.cc b/media/audio/android/aaudio_output.cc similarity index 100% rename from third_party/chromium/media/audio/android/aaudio_output.cc rename to media/audio/android/aaudio_output.cc diff --git a/third_party/chromium/media/audio/android/aaudio_output.h b/media/audio/android/aaudio_output.h similarity index 100% rename from third_party/chromium/media/audio/android/aaudio_output.h rename to media/audio/android/aaudio_output.h diff --git a/third_party/chromium/media/audio/android/aaudio_stub_header.fragment b/media/audio/android/aaudio_stub_header.fragment similarity index 100% rename from third_party/chromium/media/audio/android/aaudio_stub_header.fragment rename to media/audio/android/aaudio_stub_header.fragment diff --git a/third_party/chromium/media/audio/android/audio_android_unittest.cc b/media/audio/android/audio_android_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/android/audio_android_unittest.cc rename to media/audio/android/audio_android_unittest.cc diff --git a/third_party/chromium/media/audio/android/audio_manager_android.cc b/media/audio/android/audio_manager_android.cc similarity index 100% rename from third_party/chromium/media/audio/android/audio_manager_android.cc rename to media/audio/android/audio_manager_android.cc diff --git a/third_party/chromium/media/audio/android/audio_manager_android.h b/media/audio/android/audio_manager_android.h similarity index 100% rename from third_party/chromium/media/audio/android/audio_manager_android.h rename to media/audio/android/audio_manager_android.h diff --git a/third_party/chromium/media/audio/android/audio_track_output_stream.cc b/media/audio/android/audio_track_output_stream.cc similarity index 100% rename from third_party/chromium/media/audio/android/audio_track_output_stream.cc rename to media/audio/android/audio_track_output_stream.cc diff --git a/third_party/chromium/media/audio/android/audio_track_output_stream.h b/media/audio/android/audio_track_output_stream.h similarity index 100% rename from third_party/chromium/media/audio/android/audio_track_output_stream.h rename to media/audio/android/audio_track_output_stream.h diff --git a/third_party/chromium/media/audio/android/muteable_audio_output_stream.h b/media/audio/android/muteable_audio_output_stream.h similarity index 100% rename from third_party/chromium/media/audio/android/muteable_audio_output_stream.h rename to media/audio/android/muteable_audio_output_stream.h diff --git a/third_party/chromium/media/audio/android/opensles_input.cc b/media/audio/android/opensles_input.cc similarity index 100% rename from third_party/chromium/media/audio/android/opensles_input.cc rename to media/audio/android/opensles_input.cc diff --git a/third_party/chromium/media/audio/android/opensles_input.h b/media/audio/android/opensles_input.h similarity index 100% rename from third_party/chromium/media/audio/android/opensles_input.h rename to media/audio/android/opensles_input.h diff --git a/third_party/chromium/media/audio/android/opensles_output.cc b/media/audio/android/opensles_output.cc similarity index 100% rename from third_party/chromium/media/audio/android/opensles_output.cc rename to media/audio/android/opensles_output.cc diff --git a/third_party/chromium/media/audio/android/opensles_output.h b/media/audio/android/opensles_output.h similarity index 100% rename from third_party/chromium/media/audio/android/opensles_output.h rename to media/audio/android/opensles_output.h diff --git a/third_party/chromium/media/audio/android/opensles_util.cc b/media/audio/android/opensles_util.cc similarity index 100% rename from third_party/chromium/media/audio/android/opensles_util.cc rename to media/audio/android/opensles_util.cc diff --git a/third_party/chromium/media/audio/android/opensles_util.h b/media/audio/android/opensles_util.h similarity index 100% rename from third_party/chromium/media/audio/android/opensles_util.h rename to media/audio/android/opensles_util.h diff --git a/third_party/chromium/media/audio/android/opensles_wrapper.cc b/media/audio/android/opensles_wrapper.cc similarity index 100% rename from third_party/chromium/media/audio/android/opensles_wrapper.cc rename to media/audio/android/opensles_wrapper.cc diff --git a/third_party/chromium/media/audio/audio_debug_file_writer.cc b/media/audio/audio_debug_file_writer.cc similarity index 100% rename from third_party/chromium/media/audio/audio_debug_file_writer.cc rename to media/audio/audio_debug_file_writer.cc diff --git a/third_party/chromium/media/audio/audio_debug_file_writer.h b/media/audio/audio_debug_file_writer.h similarity index 100% rename from third_party/chromium/media/audio/audio_debug_file_writer.h rename to media/audio/audio_debug_file_writer.h diff --git a/third_party/chromium/media/audio/audio_debug_file_writer_unittest.cc b/media/audio/audio_debug_file_writer_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_debug_file_writer_unittest.cc rename to media/audio/audio_debug_file_writer_unittest.cc diff --git a/third_party/chromium/media/audio/audio_debug_recording_helper.cc b/media/audio/audio_debug_recording_helper.cc similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_helper.cc rename to media/audio/audio_debug_recording_helper.cc diff --git a/third_party/chromium/media/audio/audio_debug_recording_helper.h b/media/audio/audio_debug_recording_helper.h similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_helper.h rename to media/audio/audio_debug_recording_helper.h diff --git a/third_party/chromium/media/audio/audio_debug_recording_helper_unittest.cc b/media/audio/audio_debug_recording_helper_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_helper_unittest.cc rename to media/audio/audio_debug_recording_helper_unittest.cc diff --git a/third_party/chromium/media/audio/audio_debug_recording_manager.cc b/media/audio/audio_debug_recording_manager.cc similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_manager.cc rename to media/audio/audio_debug_recording_manager.cc diff --git a/third_party/chromium/media/audio/audio_debug_recording_manager.h b/media/audio/audio_debug_recording_manager.h similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_manager.h rename to media/audio/audio_debug_recording_manager.h diff --git a/third_party/chromium/media/audio/audio_debug_recording_manager_unittest.cc b/media/audio/audio_debug_recording_manager_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_manager_unittest.cc rename to media/audio/audio_debug_recording_manager_unittest.cc diff --git a/third_party/chromium/media/audio/audio_debug_recording_session.h b/media/audio/audio_debug_recording_session.h similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_session.h rename to media/audio/audio_debug_recording_session.h diff --git a/third_party/chromium/media/audio/audio_debug_recording_session_impl.cc b/media/audio/audio_debug_recording_session_impl.cc similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_session_impl.cc rename to media/audio/audio_debug_recording_session_impl.cc diff --git a/third_party/chromium/media/audio/audio_debug_recording_session_impl.h b/media/audio/audio_debug_recording_session_impl.h similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_session_impl.h rename to media/audio/audio_debug_recording_session_impl.h diff --git a/third_party/chromium/media/audio/audio_debug_recording_session_impl_unittest.cc b/media/audio/audio_debug_recording_session_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_session_impl_unittest.cc rename to media/audio/audio_debug_recording_session_impl_unittest.cc diff --git a/third_party/chromium/media/audio/audio_debug_recording_test.cc b/media/audio/audio_debug_recording_test.cc similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_test.cc rename to media/audio/audio_debug_recording_test.cc diff --git a/third_party/chromium/media/audio/audio_debug_recording_test.h b/media/audio/audio_debug_recording_test.h similarity index 100% rename from third_party/chromium/media/audio/audio_debug_recording_test.h rename to media/audio/audio_debug_recording_test.h diff --git a/third_party/chromium/media/audio/audio_device_description.cc b/media/audio/audio_device_description.cc similarity index 100% rename from third_party/chromium/media/audio/audio_device_description.cc rename to media/audio/audio_device_description.cc diff --git a/third_party/chromium/media/audio/audio_device_description.h b/media/audio/audio_device_description.h similarity index 100% rename from third_party/chromium/media/audio/audio_device_description.h rename to media/audio/audio_device_description.h diff --git a/third_party/chromium/media/audio/audio_device_info_accessor_for_tests.cc b/media/audio/audio_device_info_accessor_for_tests.cc similarity index 100% rename from third_party/chromium/media/audio/audio_device_info_accessor_for_tests.cc rename to media/audio/audio_device_info_accessor_for_tests.cc diff --git a/third_party/chromium/media/audio/audio_device_info_accessor_for_tests.h b/media/audio/audio_device_info_accessor_for_tests.h similarity index 100% rename from third_party/chromium/media/audio/audio_device_info_accessor_for_tests.h rename to media/audio/audio_device_info_accessor_for_tests.h diff --git a/third_party/chromium/media/audio/audio_device_name.cc b/media/audio/audio_device_name.cc similarity index 100% rename from third_party/chromium/media/audio/audio_device_name.cc rename to media/audio/audio_device_name.cc diff --git a/third_party/chromium/media/audio/audio_device_name.h b/media/audio/audio_device_name.h similarity index 100% rename from third_party/chromium/media/audio/audio_device_name.h rename to media/audio/audio_device_name.h diff --git a/third_party/chromium/media/audio/audio_device_thread.cc b/media/audio/audio_device_thread.cc similarity index 100% rename from third_party/chromium/media/audio/audio_device_thread.cc rename to media/audio/audio_device_thread.cc diff --git a/third_party/chromium/media/audio/audio_device_thread.h b/media/audio/audio_device_thread.h similarity index 100% rename from third_party/chromium/media/audio/audio_device_thread.h rename to media/audio/audio_device_thread.h diff --git a/third_party/chromium/media/audio/audio_encoders_unittest.cc b/media/audio/audio_encoders_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_encoders_unittest.cc rename to media/audio/audio_encoders_unittest.cc diff --git a/third_party/chromium/media/audio/audio_features.cc b/media/audio/audio_features.cc similarity index 100% rename from third_party/chromium/media/audio/audio_features.cc rename to media/audio/audio_features.cc diff --git a/third_party/chromium/media/audio/audio_features.h b/media/audio/audio_features.h similarity index 100% rename from third_party/chromium/media/audio/audio_features.h rename to media/audio/audio_features.h diff --git a/third_party/chromium/media/audio/audio_input_delegate.cc b/media/audio/audio_input_delegate.cc similarity index 100% rename from third_party/chromium/media/audio/audio_input_delegate.cc rename to media/audio/audio_input_delegate.cc diff --git a/third_party/chromium/media/audio/audio_input_delegate.h b/media/audio/audio_input_delegate.h similarity index 100% rename from third_party/chromium/media/audio/audio_input_delegate.h rename to media/audio/audio_input_delegate.h diff --git a/third_party/chromium/media/audio/audio_input_device.cc b/media/audio/audio_input_device.cc similarity index 100% rename from third_party/chromium/media/audio/audio_input_device.cc rename to media/audio/audio_input_device.cc diff --git a/third_party/chromium/media/audio/audio_input_device.h b/media/audio/audio_input_device.h similarity index 100% rename from third_party/chromium/media/audio/audio_input_device.h rename to media/audio/audio_input_device.h diff --git a/third_party/chromium/media/audio/audio_input_device_unittest.cc b/media/audio/audio_input_device_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_input_device_unittest.cc rename to media/audio/audio_input_device_unittest.cc diff --git a/third_party/chromium/media/audio/audio_input_ipc.cc b/media/audio/audio_input_ipc.cc similarity index 100% rename from third_party/chromium/media/audio/audio_input_ipc.cc rename to media/audio/audio_input_ipc.cc diff --git a/third_party/chromium/media/audio/audio_input_ipc.h b/media/audio/audio_input_ipc.h similarity index 100% rename from third_party/chromium/media/audio/audio_input_ipc.h rename to media/audio/audio_input_ipc.h diff --git a/third_party/chromium/media/audio/audio_input_stream_data_interceptor.cc b/media/audio/audio_input_stream_data_interceptor.cc similarity index 100% rename from third_party/chromium/media/audio/audio_input_stream_data_interceptor.cc rename to media/audio/audio_input_stream_data_interceptor.cc diff --git a/third_party/chromium/media/audio/audio_input_stream_data_interceptor.h b/media/audio/audio_input_stream_data_interceptor.h similarity index 100% rename from third_party/chromium/media/audio/audio_input_stream_data_interceptor.h rename to media/audio/audio_input_stream_data_interceptor.h diff --git a/third_party/chromium/media/audio/audio_input_stream_data_interceptor_unittest.cc b/media/audio/audio_input_stream_data_interceptor_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_input_stream_data_interceptor_unittest.cc rename to media/audio/audio_input_stream_data_interceptor_unittest.cc diff --git a/third_party/chromium/media/audio/audio_input_unittest.cc b/media/audio/audio_input_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_input_unittest.cc rename to media/audio/audio_input_unittest.cc diff --git a/third_party/chromium/media/audio/audio_io.h b/media/audio/audio_io.h similarity index 100% rename from third_party/chromium/media/audio/audio_io.h rename to media/audio/audio_io.h diff --git a/third_party/chromium/media/audio/audio_logging.h b/media/audio/audio_logging.h similarity index 100% rename from third_party/chromium/media/audio/audio_logging.h rename to media/audio/audio_logging.h diff --git a/third_party/chromium/media/audio/audio_low_latency_input_output_unittest.cc b/media/audio/audio_low_latency_input_output_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_low_latency_input_output_unittest.cc rename to media/audio/audio_low_latency_input_output_unittest.cc diff --git a/third_party/chromium/media/audio/audio_manager.cc b/media/audio/audio_manager.cc similarity index 100% rename from third_party/chromium/media/audio/audio_manager.cc rename to media/audio/audio_manager.cc diff --git a/third_party/chromium/media/audio/audio_manager.h b/media/audio/audio_manager.h similarity index 100% rename from third_party/chromium/media/audio/audio_manager.h rename to media/audio/audio_manager.h diff --git a/third_party/chromium/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc similarity index 100% rename from third_party/chromium/media/audio/audio_manager_base.cc rename to media/audio/audio_manager_base.cc diff --git a/third_party/chromium/media/audio/audio_manager_base.h b/media/audio/audio_manager_base.h similarity index 100% rename from third_party/chromium/media/audio/audio_manager_base.h rename to media/audio/audio_manager_base.h diff --git a/third_party/chromium/media/audio/audio_manager_unittest.cc b/media/audio/audio_manager_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_manager_unittest.cc rename to media/audio/audio_manager_unittest.cc diff --git a/third_party/chromium/media/audio/audio_opus_encoder.cc b/media/audio/audio_opus_encoder.cc similarity index 100% rename from third_party/chromium/media/audio/audio_opus_encoder.cc rename to media/audio/audio_opus_encoder.cc diff --git a/third_party/chromium/media/audio/audio_opus_encoder.h b/media/audio/audio_opus_encoder.h similarity index 100% rename from third_party/chromium/media/audio/audio_opus_encoder.h rename to media/audio/audio_opus_encoder.h diff --git a/third_party/chromium/media/audio/audio_output_delegate.cc b/media/audio/audio_output_delegate.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_delegate.cc rename to media/audio/audio_output_delegate.cc diff --git a/third_party/chromium/media/audio/audio_output_delegate.h b/media/audio/audio_output_delegate.h similarity index 100% rename from third_party/chromium/media/audio/audio_output_delegate.h rename to media/audio/audio_output_delegate.h diff --git a/third_party/chromium/media/audio/audio_output_device.cc b/media/audio/audio_output_device.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_device.cc rename to media/audio/audio_output_device.cc diff --git a/third_party/chromium/media/audio/audio_output_device.h b/media/audio/audio_output_device.h similarity index 100% rename from third_party/chromium/media/audio/audio_output_device.h rename to media/audio/audio_output_device.h diff --git a/third_party/chromium/media/audio/audio_output_device_thread_callback.cc b/media/audio/audio_output_device_thread_callback.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_device_thread_callback.cc rename to media/audio/audio_output_device_thread_callback.cc diff --git a/third_party/chromium/media/audio/audio_output_device_thread_callback.h b/media/audio/audio_output_device_thread_callback.h similarity index 100% rename from third_party/chromium/media/audio/audio_output_device_thread_callback.h rename to media/audio/audio_output_device_thread_callback.h diff --git a/third_party/chromium/media/audio/audio_output_device_unittest.cc b/media/audio/audio_output_device_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_device_unittest.cc rename to media/audio/audio_output_device_unittest.cc diff --git a/third_party/chromium/media/audio/audio_output_dispatcher.cc b/media/audio/audio_output_dispatcher.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_dispatcher.cc rename to media/audio/audio_output_dispatcher.cc diff --git a/third_party/chromium/media/audio/audio_output_dispatcher.h b/media/audio/audio_output_dispatcher.h similarity index 100% rename from third_party/chromium/media/audio/audio_output_dispatcher.h rename to media/audio/audio_output_dispatcher.h diff --git a/third_party/chromium/media/audio/audio_output_dispatcher_impl.cc b/media/audio/audio_output_dispatcher_impl.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_dispatcher_impl.cc rename to media/audio/audio_output_dispatcher_impl.cc diff --git a/third_party/chromium/media/audio/audio_output_dispatcher_impl.h b/media/audio/audio_output_dispatcher_impl.h similarity index 100% rename from third_party/chromium/media/audio/audio_output_dispatcher_impl.h rename to media/audio/audio_output_dispatcher_impl.h diff --git a/third_party/chromium/media/audio/audio_output_ipc.cc b/media/audio/audio_output_ipc.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_ipc.cc rename to media/audio/audio_output_ipc.cc diff --git a/third_party/chromium/media/audio/audio_output_ipc.h b/media/audio/audio_output_ipc.h similarity index 100% rename from third_party/chromium/media/audio/audio_output_ipc.h rename to media/audio/audio_output_ipc.h diff --git a/third_party/chromium/media/audio/audio_output_proxy.cc b/media/audio/audio_output_proxy.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_proxy.cc rename to media/audio/audio_output_proxy.cc diff --git a/third_party/chromium/media/audio/audio_output_proxy.h b/media/audio/audio_output_proxy.h similarity index 100% rename from third_party/chromium/media/audio/audio_output_proxy.h rename to media/audio/audio_output_proxy.h diff --git a/third_party/chromium/media/audio/audio_output_proxy_unittest.cc b/media/audio/audio_output_proxy_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_proxy_unittest.cc rename to media/audio/audio_output_proxy_unittest.cc diff --git a/third_party/chromium/media/audio/audio_output_resampler.cc b/media/audio/audio_output_resampler.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_resampler.cc rename to media/audio/audio_output_resampler.cc diff --git a/third_party/chromium/media/audio/audio_output_resampler.h b/media/audio/audio_output_resampler.h similarity index 100% rename from third_party/chromium/media/audio/audio_output_resampler.h rename to media/audio/audio_output_resampler.h diff --git a/third_party/chromium/media/audio/audio_output_stream_sink.cc b/media/audio/audio_output_stream_sink.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_stream_sink.cc rename to media/audio/audio_output_stream_sink.cc diff --git a/third_party/chromium/media/audio/audio_output_stream_sink.h b/media/audio/audio_output_stream_sink.h similarity index 100% rename from third_party/chromium/media/audio/audio_output_stream_sink.h rename to media/audio/audio_output_stream_sink.h diff --git a/third_party/chromium/media/audio/audio_output_unittest.cc b/media/audio/audio_output_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_output_unittest.cc rename to media/audio/audio_output_unittest.cc diff --git a/third_party/chromium/media/audio/audio_sink_parameters.cc b/media/audio/audio_sink_parameters.cc similarity index 100% rename from third_party/chromium/media/audio/audio_sink_parameters.cc rename to media/audio/audio_sink_parameters.cc diff --git a/third_party/chromium/media/audio/audio_sink_parameters.h b/media/audio/audio_sink_parameters.h similarity index 100% rename from third_party/chromium/media/audio/audio_sink_parameters.h rename to media/audio/audio_sink_parameters.h diff --git a/third_party/chromium/media/audio/audio_source_diverter.h b/media/audio/audio_source_diverter.h similarity index 100% rename from third_party/chromium/media/audio/audio_source_diverter.h rename to media/audio/audio_source_diverter.h diff --git a/third_party/chromium/media/audio/audio_source_parameters.cc b/media/audio/audio_source_parameters.cc similarity index 100% rename from third_party/chromium/media/audio/audio_source_parameters.cc rename to media/audio/audio_source_parameters.cc diff --git a/third_party/chromium/media/audio/audio_source_parameters.h b/media/audio/audio_source_parameters.h similarity index 100% rename from third_party/chromium/media/audio/audio_source_parameters.h rename to media/audio/audio_source_parameters.h diff --git a/third_party/chromium/media/audio/audio_system.cc b/media/audio/audio_system.cc similarity index 100% rename from third_party/chromium/media/audio/audio_system.cc rename to media/audio/audio_system.cc diff --git a/third_party/chromium/media/audio/audio_system.h b/media/audio/audio_system.h similarity index 100% rename from third_party/chromium/media/audio/audio_system.h rename to media/audio/audio_system.h diff --git a/third_party/chromium/media/audio/audio_system_helper.cc b/media/audio/audio_system_helper.cc similarity index 100% rename from third_party/chromium/media/audio/audio_system_helper.cc rename to media/audio/audio_system_helper.cc diff --git a/third_party/chromium/media/audio/audio_system_helper.h b/media/audio/audio_system_helper.h similarity index 100% rename from third_party/chromium/media/audio/audio_system_helper.h rename to media/audio/audio_system_helper.h diff --git a/third_party/chromium/media/audio/audio_system_impl.cc b/media/audio/audio_system_impl.cc similarity index 100% rename from third_party/chromium/media/audio/audio_system_impl.cc rename to media/audio/audio_system_impl.cc diff --git a/third_party/chromium/media/audio/audio_system_impl.h b/media/audio/audio_system_impl.h similarity index 100% rename from third_party/chromium/media/audio/audio_system_impl.h rename to media/audio/audio_system_impl.h diff --git a/third_party/chromium/media/audio/audio_system_impl_unittest.cc b/media/audio/audio_system_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_system_impl_unittest.cc rename to media/audio/audio_system_impl_unittest.cc diff --git a/third_party/chromium/media/audio/audio_system_test_util.cc b/media/audio/audio_system_test_util.cc similarity index 100% rename from third_party/chromium/media/audio/audio_system_test_util.cc rename to media/audio/audio_system_test_util.cc diff --git a/third_party/chromium/media/audio/audio_system_test_util.h b/media/audio/audio_system_test_util.h similarity index 100% rename from third_party/chromium/media/audio/audio_system_test_util.h rename to media/audio/audio_system_test_util.h diff --git a/third_party/chromium/media/audio/audio_thread.h b/media/audio/audio_thread.h similarity index 100% rename from third_party/chromium/media/audio/audio_thread.h rename to media/audio/audio_thread.h diff --git a/third_party/chromium/media/audio/audio_thread_hang_monitor.cc b/media/audio/audio_thread_hang_monitor.cc similarity index 100% rename from third_party/chromium/media/audio/audio_thread_hang_monitor.cc rename to media/audio/audio_thread_hang_monitor.cc diff --git a/third_party/chromium/media/audio/audio_thread_hang_monitor.h b/media/audio/audio_thread_hang_monitor.h similarity index 100% rename from third_party/chromium/media/audio/audio_thread_hang_monitor.h rename to media/audio/audio_thread_hang_monitor.h diff --git a/third_party/chromium/media/audio/audio_thread_hang_monitor_unittest.cc b/media/audio/audio_thread_hang_monitor_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/audio_thread_hang_monitor_unittest.cc rename to media/audio/audio_thread_hang_monitor_unittest.cc diff --git a/third_party/chromium/media/audio/audio_thread_impl.cc b/media/audio/audio_thread_impl.cc similarity index 100% rename from third_party/chromium/media/audio/audio_thread_impl.cc rename to media/audio/audio_thread_impl.cc diff --git a/third_party/chromium/media/audio/audio_thread_impl.h b/media/audio/audio_thread_impl.h similarity index 100% rename from third_party/chromium/media/audio/audio_thread_impl.h rename to media/audio/audio_thread_impl.h diff --git a/third_party/chromium/media/audio/audio_unittest_util.cc b/media/audio/audio_unittest_util.cc similarity index 100% rename from third_party/chromium/media/audio/audio_unittest_util.cc rename to media/audio/audio_unittest_util.cc diff --git a/third_party/chromium/media/audio/audio_unittest_util.h b/media/audio/audio_unittest_util.h similarity index 100% rename from third_party/chromium/media/audio/audio_unittest_util.h rename to media/audio/audio_unittest_util.h diff --git a/third_party/chromium/media/audio/clockless_audio_sink.cc b/media/audio/clockless_audio_sink.cc similarity index 100% rename from third_party/chromium/media/audio/clockless_audio_sink.cc rename to media/audio/clockless_audio_sink.cc diff --git a/third_party/chromium/media/audio/clockless_audio_sink.h b/media/audio/clockless_audio_sink.h similarity index 100% rename from third_party/chromium/media/audio/clockless_audio_sink.h rename to media/audio/clockless_audio_sink.h diff --git a/third_party/chromium/media/audio/cras/audio_manager_chromeos.cc b/media/audio/cras/audio_manager_chromeos.cc similarity index 100% rename from third_party/chromium/media/audio/cras/audio_manager_chromeos.cc rename to media/audio/cras/audio_manager_chromeos.cc diff --git a/third_party/chromium/media/audio/cras/audio_manager_chromeos.h b/media/audio/cras/audio_manager_chromeos.h similarity index 100% rename from third_party/chromium/media/audio/cras/audio_manager_chromeos.h rename to media/audio/cras/audio_manager_chromeos.h diff --git a/third_party/chromium/media/audio/cras/audio_manager_chromeos_unittest.cc b/media/audio/cras/audio_manager_chromeos_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/cras/audio_manager_chromeos_unittest.cc rename to media/audio/cras/audio_manager_chromeos_unittest.cc diff --git a/third_party/chromium/media/audio/cras/audio_manager_cras.cc b/media/audio/cras/audio_manager_cras.cc similarity index 100% rename from third_party/chromium/media/audio/cras/audio_manager_cras.cc rename to media/audio/cras/audio_manager_cras.cc diff --git a/third_party/chromium/media/audio/cras/audio_manager_cras.h b/media/audio/cras/audio_manager_cras.h similarity index 100% rename from third_party/chromium/media/audio/cras/audio_manager_cras.h rename to media/audio/cras/audio_manager_cras.h diff --git a/third_party/chromium/media/audio/cras/audio_manager_cras_base.cc b/media/audio/cras/audio_manager_cras_base.cc similarity index 100% rename from third_party/chromium/media/audio/cras/audio_manager_cras_base.cc rename to media/audio/cras/audio_manager_cras_base.cc diff --git a/third_party/chromium/media/audio/cras/audio_manager_cras_base.h b/media/audio/cras/audio_manager_cras_base.h similarity index 100% rename from third_party/chromium/media/audio/cras/audio_manager_cras_base.h rename to media/audio/cras/audio_manager_cras_base.h diff --git a/third_party/chromium/media/audio/cras/cras_input.cc b/media/audio/cras/cras_input.cc similarity index 100% rename from third_party/chromium/media/audio/cras/cras_input.cc rename to media/audio/cras/cras_input.cc diff --git a/third_party/chromium/media/audio/cras/cras_input.h b/media/audio/cras/cras_input.h similarity index 100% rename from third_party/chromium/media/audio/cras/cras_input.h rename to media/audio/cras/cras_input.h diff --git a/third_party/chromium/media/audio/cras/cras_input_unittest.cc b/media/audio/cras/cras_input_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/cras/cras_input_unittest.cc rename to media/audio/cras/cras_input_unittest.cc diff --git a/third_party/chromium/media/audio/cras/cras_unified.cc b/media/audio/cras/cras_unified.cc similarity index 100% rename from third_party/chromium/media/audio/cras/cras_unified.cc rename to media/audio/cras/cras_unified.cc diff --git a/third_party/chromium/media/audio/cras/cras_unified.h b/media/audio/cras/cras_unified.h similarity index 100% rename from third_party/chromium/media/audio/cras/cras_unified.h rename to media/audio/cras/cras_unified.h diff --git a/third_party/chromium/media/audio/cras/cras_unified_unittest.cc b/media/audio/cras/cras_unified_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/cras/cras_unified_unittest.cc rename to media/audio/cras/cras_unified_unittest.cc diff --git a/third_party/chromium/media/audio/cras/cras_util.cc b/media/audio/cras/cras_util.cc similarity index 100% rename from third_party/chromium/media/audio/cras/cras_util.cc rename to media/audio/cras/cras_util.cc diff --git a/third_party/chromium/media/audio/cras/cras_util.h b/media/audio/cras/cras_util.h similarity index 100% rename from third_party/chromium/media/audio/cras/cras_util.h rename to media/audio/cras/cras_util.h diff --git a/third_party/chromium/media/audio/fake_audio_input_stream.cc b/media/audio/fake_audio_input_stream.cc similarity index 100% rename from third_party/chromium/media/audio/fake_audio_input_stream.cc rename to media/audio/fake_audio_input_stream.cc diff --git a/third_party/chromium/media/audio/fake_audio_input_stream.h b/media/audio/fake_audio_input_stream.h similarity index 100% rename from third_party/chromium/media/audio/fake_audio_input_stream.h rename to media/audio/fake_audio_input_stream.h diff --git a/third_party/chromium/media/audio/fake_audio_log_factory.cc b/media/audio/fake_audio_log_factory.cc similarity index 100% rename from third_party/chromium/media/audio/fake_audio_log_factory.cc rename to media/audio/fake_audio_log_factory.cc diff --git a/third_party/chromium/media/audio/fake_audio_log_factory.h b/media/audio/fake_audio_log_factory.h similarity index 100% rename from third_party/chromium/media/audio/fake_audio_log_factory.h rename to media/audio/fake_audio_log_factory.h diff --git a/third_party/chromium/media/audio/fake_audio_manager.cc b/media/audio/fake_audio_manager.cc similarity index 100% rename from third_party/chromium/media/audio/fake_audio_manager.cc rename to media/audio/fake_audio_manager.cc diff --git a/third_party/chromium/media/audio/fake_audio_manager.h b/media/audio/fake_audio_manager.h similarity index 100% rename from third_party/chromium/media/audio/fake_audio_manager.h rename to media/audio/fake_audio_manager.h diff --git a/third_party/chromium/media/audio/fake_audio_output_stream.cc b/media/audio/fake_audio_output_stream.cc similarity index 100% rename from third_party/chromium/media/audio/fake_audio_output_stream.cc rename to media/audio/fake_audio_output_stream.cc diff --git a/third_party/chromium/media/audio/fake_audio_output_stream.h b/media/audio/fake_audio_output_stream.h similarity index 100% rename from third_party/chromium/media/audio/fake_audio_output_stream.h rename to media/audio/fake_audio_output_stream.h diff --git a/third_party/chromium/media/audio/fuchsia/DIR_METADATA b/media/audio/fuchsia/DIR_METADATA similarity index 100% rename from third_party/chromium/media/audio/fuchsia/DIR_METADATA rename to media/audio/fuchsia/DIR_METADATA diff --git a/third_party/chromium/media/audio/fuchsia/OWNERS b/media/audio/fuchsia/OWNERS similarity index 100% rename from third_party/chromium/media/audio/fuchsia/OWNERS rename to media/audio/fuchsia/OWNERS diff --git a/third_party/chromium/media/audio/fuchsia/audio_manager_fuchsia.cc b/media/audio/fuchsia/audio_manager_fuchsia.cc similarity index 100% rename from third_party/chromium/media/audio/fuchsia/audio_manager_fuchsia.cc rename to media/audio/fuchsia/audio_manager_fuchsia.cc diff --git a/third_party/chromium/media/audio/fuchsia/audio_manager_fuchsia.h b/media/audio/fuchsia/audio_manager_fuchsia.h similarity index 100% rename from third_party/chromium/media/audio/fuchsia/audio_manager_fuchsia.h rename to media/audio/fuchsia/audio_manager_fuchsia.h diff --git a/third_party/chromium/media/audio/fuchsia/audio_output_stream_fuchsia.cc b/media/audio/fuchsia/audio_output_stream_fuchsia.cc similarity index 100% rename from third_party/chromium/media/audio/fuchsia/audio_output_stream_fuchsia.cc rename to media/audio/fuchsia/audio_output_stream_fuchsia.cc diff --git a/third_party/chromium/media/audio/fuchsia/audio_output_stream_fuchsia.h b/media/audio/fuchsia/audio_output_stream_fuchsia.h similarity index 100% rename from third_party/chromium/media/audio/fuchsia/audio_output_stream_fuchsia.h rename to media/audio/fuchsia/audio_output_stream_fuchsia.h diff --git a/third_party/chromium/media/audio/linux/audio_manager_linux.cc b/media/audio/linux/audio_manager_linux.cc similarity index 100% rename from third_party/chromium/media/audio/linux/audio_manager_linux.cc rename to media/audio/linux/audio_manager_linux.cc diff --git a/third_party/chromium/media/audio/mac/audio_auhal_mac.cc b/media/audio/mac/audio_auhal_mac.cc similarity index 100% rename from third_party/chromium/media/audio/mac/audio_auhal_mac.cc rename to media/audio/mac/audio_auhal_mac.cc diff --git a/third_party/chromium/media/audio/mac/audio_auhal_mac.h b/media/audio/mac/audio_auhal_mac.h similarity index 100% rename from third_party/chromium/media/audio/mac/audio_auhal_mac.h rename to media/audio/mac/audio_auhal_mac.h diff --git a/third_party/chromium/media/audio/mac/audio_auhal_mac_unittest.cc b/media/audio/mac/audio_auhal_mac_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/mac/audio_auhal_mac_unittest.cc rename to media/audio/mac/audio_auhal_mac_unittest.cc diff --git a/third_party/chromium/media/audio/mac/audio_device_listener_mac.cc b/media/audio/mac/audio_device_listener_mac.cc similarity index 100% rename from third_party/chromium/media/audio/mac/audio_device_listener_mac.cc rename to media/audio/mac/audio_device_listener_mac.cc diff --git a/third_party/chromium/media/audio/mac/audio_device_listener_mac.h b/media/audio/mac/audio_device_listener_mac.h similarity index 100% rename from third_party/chromium/media/audio/mac/audio_device_listener_mac.h rename to media/audio/mac/audio_device_listener_mac.h diff --git a/third_party/chromium/media/audio/mac/audio_device_listener_mac_unittest.cc b/media/audio/mac/audio_device_listener_mac_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/mac/audio_device_listener_mac_unittest.cc rename to media/audio/mac/audio_device_listener_mac_unittest.cc diff --git a/third_party/chromium/media/audio/mac/audio_input_mac.cc b/media/audio/mac/audio_input_mac.cc similarity index 100% rename from third_party/chromium/media/audio/mac/audio_input_mac.cc rename to media/audio/mac/audio_input_mac.cc diff --git a/third_party/chromium/media/audio/mac/audio_input_mac.h b/media/audio/mac/audio_input_mac.h similarity index 100% rename from third_party/chromium/media/audio/mac/audio_input_mac.h rename to media/audio/mac/audio_input_mac.h diff --git a/third_party/chromium/media/audio/mac/audio_low_latency_input_mac.cc b/media/audio/mac/audio_low_latency_input_mac.cc similarity index 100% rename from third_party/chromium/media/audio/mac/audio_low_latency_input_mac.cc rename to media/audio/mac/audio_low_latency_input_mac.cc diff --git a/third_party/chromium/media/audio/mac/audio_low_latency_input_mac.h b/media/audio/mac/audio_low_latency_input_mac.h similarity index 100% rename from third_party/chromium/media/audio/mac/audio_low_latency_input_mac.h rename to media/audio/mac/audio_low_latency_input_mac.h diff --git a/third_party/chromium/media/audio/mac/audio_low_latency_input_mac_unittest.cc b/media/audio/mac/audio_low_latency_input_mac_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/mac/audio_low_latency_input_mac_unittest.cc rename to media/audio/mac/audio_low_latency_input_mac_unittest.cc diff --git a/third_party/chromium/media/audio/mac/audio_manager_mac.cc b/media/audio/mac/audio_manager_mac.cc similarity index 100% rename from third_party/chromium/media/audio/mac/audio_manager_mac.cc rename to media/audio/mac/audio_manager_mac.cc diff --git a/third_party/chromium/media/audio/mac/audio_manager_mac.h b/media/audio/mac/audio_manager_mac.h similarity index 100% rename from third_party/chromium/media/audio/mac/audio_manager_mac.h rename to media/audio/mac/audio_manager_mac.h diff --git a/third_party/chromium/media/audio/mac/core_audio_util_mac.cc b/media/audio/mac/core_audio_util_mac.cc similarity index 100% rename from third_party/chromium/media/audio/mac/core_audio_util_mac.cc rename to media/audio/mac/core_audio_util_mac.cc diff --git a/third_party/chromium/media/audio/mac/core_audio_util_mac.h b/media/audio/mac/core_audio_util_mac.h similarity index 100% rename from third_party/chromium/media/audio/mac/core_audio_util_mac.h rename to media/audio/mac/core_audio_util_mac.h diff --git a/third_party/chromium/media/audio/mac/coreaudio_dispatch_override.cc b/media/audio/mac/coreaudio_dispatch_override.cc similarity index 100% rename from third_party/chromium/media/audio/mac/coreaudio_dispatch_override.cc rename to media/audio/mac/coreaudio_dispatch_override.cc diff --git a/third_party/chromium/media/audio/mac/coreaudio_dispatch_override.h b/media/audio/mac/coreaudio_dispatch_override.h similarity index 100% rename from third_party/chromium/media/audio/mac/coreaudio_dispatch_override.h rename to media/audio/mac/coreaudio_dispatch_override.h diff --git a/third_party/chromium/media/audio/mac/scoped_audio_unit.cc b/media/audio/mac/scoped_audio_unit.cc similarity index 100% rename from third_party/chromium/media/audio/mac/scoped_audio_unit.cc rename to media/audio/mac/scoped_audio_unit.cc diff --git a/third_party/chromium/media/audio/mac/scoped_audio_unit.h b/media/audio/mac/scoped_audio_unit.h similarity index 100% rename from third_party/chromium/media/audio/mac/scoped_audio_unit.h rename to media/audio/mac/scoped_audio_unit.h diff --git a/third_party/chromium/media/audio/mock_audio_debug_recording_manager.cc b/media/audio/mock_audio_debug_recording_manager.cc similarity index 100% rename from third_party/chromium/media/audio/mock_audio_debug_recording_manager.cc rename to media/audio/mock_audio_debug_recording_manager.cc diff --git a/third_party/chromium/media/audio/mock_audio_debug_recording_manager.h b/media/audio/mock_audio_debug_recording_manager.h similarity index 100% rename from third_party/chromium/media/audio/mock_audio_debug_recording_manager.h rename to media/audio/mock_audio_debug_recording_manager.h diff --git a/third_party/chromium/media/audio/mock_audio_manager.cc b/media/audio/mock_audio_manager.cc similarity index 100% rename from third_party/chromium/media/audio/mock_audio_manager.cc rename to media/audio/mock_audio_manager.cc diff --git a/third_party/chromium/media/audio/mock_audio_manager.h b/media/audio/mock_audio_manager.h similarity index 100% rename from third_party/chromium/media/audio/mock_audio_manager.h rename to media/audio/mock_audio_manager.h diff --git a/third_party/chromium/media/audio/mock_audio_source_callback.cc b/media/audio/mock_audio_source_callback.cc similarity index 100% rename from third_party/chromium/media/audio/mock_audio_source_callback.cc rename to media/audio/mock_audio_source_callback.cc diff --git a/third_party/chromium/media/audio/mock_audio_source_callback.h b/media/audio/mock_audio_source_callback.h similarity index 100% rename from third_party/chromium/media/audio/mock_audio_source_callback.h rename to media/audio/mock_audio_source_callback.h diff --git a/third_party/chromium/media/audio/null_audio_sink.cc b/media/audio/null_audio_sink.cc similarity index 100% rename from third_party/chromium/media/audio/null_audio_sink.cc rename to media/audio/null_audio_sink.cc diff --git a/third_party/chromium/media/audio/null_audio_sink.h b/media/audio/null_audio_sink.h similarity index 100% rename from third_party/chromium/media/audio/null_audio_sink.h rename to media/audio/null_audio_sink.h diff --git a/third_party/chromium/media/audio/power_observer_helper.cc b/media/audio/power_observer_helper.cc similarity index 100% rename from third_party/chromium/media/audio/power_observer_helper.cc rename to media/audio/power_observer_helper.cc diff --git a/third_party/chromium/media/audio/power_observer_helper.h b/media/audio/power_observer_helper.h similarity index 100% rename from third_party/chromium/media/audio/power_observer_helper.h rename to media/audio/power_observer_helper.h diff --git a/third_party/chromium/media/audio/power_observer_helper_unittest.cc b/media/audio/power_observer_helper_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/power_observer_helper_unittest.cc rename to media/audio/power_observer_helper_unittest.cc diff --git a/third_party/chromium/media/audio/pulse/audio_manager_pulse.cc b/media/audio/pulse/audio_manager_pulse.cc similarity index 100% rename from third_party/chromium/media/audio/pulse/audio_manager_pulse.cc rename to media/audio/pulse/audio_manager_pulse.cc diff --git a/third_party/chromium/media/audio/pulse/audio_manager_pulse.h b/media/audio/pulse/audio_manager_pulse.h similarity index 100% rename from third_party/chromium/media/audio/pulse/audio_manager_pulse.h rename to media/audio/pulse/audio_manager_pulse.h diff --git a/third_party/chromium/media/audio/pulse/pulse.sigs b/media/audio/pulse/pulse.sigs similarity index 100% rename from third_party/chromium/media/audio/pulse/pulse.sigs rename to media/audio/pulse/pulse.sigs diff --git a/third_party/chromium/media/audio/pulse/pulse_input.cc b/media/audio/pulse/pulse_input.cc similarity index 100% rename from third_party/chromium/media/audio/pulse/pulse_input.cc rename to media/audio/pulse/pulse_input.cc diff --git a/third_party/chromium/media/audio/pulse/pulse_input.h b/media/audio/pulse/pulse_input.h similarity index 100% rename from third_party/chromium/media/audio/pulse/pulse_input.h rename to media/audio/pulse/pulse_input.h diff --git a/third_party/chromium/media/audio/pulse/pulse_output.cc b/media/audio/pulse/pulse_output.cc similarity index 100% rename from third_party/chromium/media/audio/pulse/pulse_output.cc rename to media/audio/pulse/pulse_output.cc diff --git a/third_party/chromium/media/audio/pulse/pulse_output.h b/media/audio/pulse/pulse_output.h similarity index 100% rename from third_party/chromium/media/audio/pulse/pulse_output.h rename to media/audio/pulse/pulse_output.h diff --git a/third_party/chromium/media/audio/pulse/pulse_stub_header.fragment b/media/audio/pulse/pulse_stub_header.fragment similarity index 100% rename from third_party/chromium/media/audio/pulse/pulse_stub_header.fragment rename to media/audio/pulse/pulse_stub_header.fragment diff --git a/third_party/chromium/media/audio/pulse/pulse_util.cc b/media/audio/pulse/pulse_util.cc similarity index 100% rename from third_party/chromium/media/audio/pulse/pulse_util.cc rename to media/audio/pulse/pulse_util.cc diff --git a/third_party/chromium/media/audio/pulse/pulse_util.h b/media/audio/pulse/pulse_util.h similarity index 100% rename from third_party/chromium/media/audio/pulse/pulse_util.h rename to media/audio/pulse/pulse_util.h diff --git a/third_party/chromium/media/audio/scoped_task_runner_observer.cc b/media/audio/scoped_task_runner_observer.cc similarity index 100% rename from third_party/chromium/media/audio/scoped_task_runner_observer.cc rename to media/audio/scoped_task_runner_observer.cc diff --git a/third_party/chromium/media/audio/scoped_task_runner_observer.h b/media/audio/scoped_task_runner_observer.h similarity index 100% rename from third_party/chromium/media/audio/scoped_task_runner_observer.h rename to media/audio/scoped_task_runner_observer.h diff --git a/third_party/chromium/media/audio/simple_sources.cc b/media/audio/simple_sources.cc similarity index 100% rename from third_party/chromium/media/audio/simple_sources.cc rename to media/audio/simple_sources.cc diff --git a/third_party/chromium/media/audio/simple_sources.h b/media/audio/simple_sources.h similarity index 100% rename from third_party/chromium/media/audio/simple_sources.h rename to media/audio/simple_sources.h diff --git a/third_party/chromium/media/audio/simple_sources_unittest.cc b/media/audio/simple_sources_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/simple_sources_unittest.cc rename to media/audio/simple_sources_unittest.cc diff --git a/third_party/chromium/media/audio/test_audio_thread.cc b/media/audio/test_audio_thread.cc similarity index 100% rename from third_party/chromium/media/audio/test_audio_thread.cc rename to media/audio/test_audio_thread.cc diff --git a/third_party/chromium/media/audio/test_audio_thread.h b/media/audio/test_audio_thread.h similarity index 100% rename from third_party/chromium/media/audio/test_audio_thread.h rename to media/audio/test_audio_thread.h diff --git a/third_party/chromium/media/audio/test_data.h b/media/audio/test_data.h similarity index 100% rename from third_party/chromium/media/audio/test_data.h rename to media/audio/test_data.h diff --git a/third_party/chromium/media/audio/wav_audio_handler.cc b/media/audio/wav_audio_handler.cc similarity index 100% rename from third_party/chromium/media/audio/wav_audio_handler.cc rename to media/audio/wav_audio_handler.cc diff --git a/third_party/chromium/media/audio/wav_audio_handler.h b/media/audio/wav_audio_handler.h similarity index 100% rename from third_party/chromium/media/audio/wav_audio_handler.h rename to media/audio/wav_audio_handler.h diff --git a/third_party/chromium/media/audio/wav_audio_handler_fuzzer.cc b/media/audio/wav_audio_handler_fuzzer.cc similarity index 100% rename from third_party/chromium/media/audio/wav_audio_handler_fuzzer.cc rename to media/audio/wav_audio_handler_fuzzer.cc diff --git a/third_party/chromium/media/audio/wav_audio_handler_unittest.cc b/media/audio/wav_audio_handler_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/wav_audio_handler_unittest.cc rename to media/audio/wav_audio_handler_unittest.cc diff --git a/third_party/chromium/media/audio/win/audio_device_listener_win.cc b/media/audio/win/audio_device_listener_win.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_device_listener_win.cc rename to media/audio/win/audio_device_listener_win.cc diff --git a/third_party/chromium/media/audio/win/audio_device_listener_win.h b/media/audio/win/audio_device_listener_win.h similarity index 100% rename from third_party/chromium/media/audio/win/audio_device_listener_win.h rename to media/audio/win/audio_device_listener_win.h diff --git a/third_party/chromium/media/audio/win/audio_device_listener_win_unittest.cc b/media/audio/win/audio_device_listener_win_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_device_listener_win_unittest.cc rename to media/audio/win/audio_device_listener_win_unittest.cc diff --git a/third_party/chromium/media/audio/win/audio_low_latency_input_win.cc b/media/audio/win/audio_low_latency_input_win.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_low_latency_input_win.cc rename to media/audio/win/audio_low_latency_input_win.cc diff --git a/third_party/chromium/media/audio/win/audio_low_latency_input_win.h b/media/audio/win/audio_low_latency_input_win.h similarity index 100% rename from third_party/chromium/media/audio/win/audio_low_latency_input_win.h rename to media/audio/win/audio_low_latency_input_win.h diff --git a/third_party/chromium/media/audio/win/audio_low_latency_input_win_unittest.cc b/media/audio/win/audio_low_latency_input_win_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_low_latency_input_win_unittest.cc rename to media/audio/win/audio_low_latency_input_win_unittest.cc diff --git a/third_party/chromium/media/audio/win/audio_low_latency_output_win.cc b/media/audio/win/audio_low_latency_output_win.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_low_latency_output_win.cc rename to media/audio/win/audio_low_latency_output_win.cc diff --git a/third_party/chromium/media/audio/win/audio_low_latency_output_win.h b/media/audio/win/audio_low_latency_output_win.h similarity index 100% rename from third_party/chromium/media/audio/win/audio_low_latency_output_win.h rename to media/audio/win/audio_low_latency_output_win.h diff --git a/third_party/chromium/media/audio/win/audio_low_latency_output_win_unittest.cc b/media/audio/win/audio_low_latency_output_win_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_low_latency_output_win_unittest.cc rename to media/audio/win/audio_low_latency_output_win_unittest.cc diff --git a/third_party/chromium/media/audio/win/audio_manager_win.cc b/media/audio/win/audio_manager_win.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_manager_win.cc rename to media/audio/win/audio_manager_win.cc diff --git a/third_party/chromium/media/audio/win/audio_manager_win.h b/media/audio/win/audio_manager_win.h similarity index 100% rename from third_party/chromium/media/audio/win/audio_manager_win.h rename to media/audio/win/audio_manager_win.h diff --git a/third_party/chromium/media/audio/win/audio_output_win_unittest.cc b/media/audio/win/audio_output_win_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_output_win_unittest.cc rename to media/audio/win/audio_output_win_unittest.cc diff --git a/third_party/chromium/media/audio/win/audio_session_event_listener_win.cc b/media/audio/win/audio_session_event_listener_win.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_session_event_listener_win.cc rename to media/audio/win/audio_session_event_listener_win.cc diff --git a/third_party/chromium/media/audio/win/audio_session_event_listener_win.h b/media/audio/win/audio_session_event_listener_win.h similarity index 100% rename from third_party/chromium/media/audio/win/audio_session_event_listener_win.h rename to media/audio/win/audio_session_event_listener_win.h diff --git a/third_party/chromium/media/audio/win/audio_session_event_listener_win_unittest.cc b/media/audio/win/audio_session_event_listener_win_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/win/audio_session_event_listener_win_unittest.cc rename to media/audio/win/audio_session_event_listener_win_unittest.cc diff --git a/third_party/chromium/media/audio/win/avrt_wrapper_win.cc b/media/audio/win/avrt_wrapper_win.cc similarity index 100% rename from third_party/chromium/media/audio/win/avrt_wrapper_win.cc rename to media/audio/win/avrt_wrapper_win.cc diff --git a/third_party/chromium/media/audio/win/avrt_wrapper_win.h b/media/audio/win/avrt_wrapper_win.h similarity index 100% rename from third_party/chromium/media/audio/win/avrt_wrapper_win.h rename to media/audio/win/avrt_wrapper_win.h diff --git a/third_party/chromium/media/audio/win/core_audio_util_win.cc b/media/audio/win/core_audio_util_win.cc similarity index 100% rename from third_party/chromium/media/audio/win/core_audio_util_win.cc rename to media/audio/win/core_audio_util_win.cc diff --git a/third_party/chromium/media/audio/win/core_audio_util_win.h b/media/audio/win/core_audio_util_win.h similarity index 100% rename from third_party/chromium/media/audio/win/core_audio_util_win.h rename to media/audio/win/core_audio_util_win.h diff --git a/third_party/chromium/media/audio/win/core_audio_util_win_unittest.cc b/media/audio/win/core_audio_util_win_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/win/core_audio_util_win_unittest.cc rename to media/audio/win/core_audio_util_win_unittest.cc diff --git a/third_party/chromium/media/audio/win/device_enumeration_win.cc b/media/audio/win/device_enumeration_win.cc similarity index 100% rename from third_party/chromium/media/audio/win/device_enumeration_win.cc rename to media/audio/win/device_enumeration_win.cc diff --git a/third_party/chromium/media/audio/win/device_enumeration_win.h b/media/audio/win/device_enumeration_win.h similarity index 100% rename from third_party/chromium/media/audio/win/device_enumeration_win.h rename to media/audio/win/device_enumeration_win.h diff --git a/third_party/chromium/media/audio/win/device_enumeration_win_unittest.cc b/media/audio/win/device_enumeration_win_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/win/device_enumeration_win_unittest.cc rename to media/audio/win/device_enumeration_win_unittest.cc diff --git a/third_party/chromium/media/audio/win/volume_range_util.cc b/media/audio/win/volume_range_util.cc similarity index 100% rename from third_party/chromium/media/audio/win/volume_range_util.cc rename to media/audio/win/volume_range_util.cc diff --git a/third_party/chromium/media/audio/win/volume_range_util.h b/media/audio/win/volume_range_util.h similarity index 100% rename from third_party/chromium/media/audio/win/volume_range_util.h rename to media/audio/win/volume_range_util.h diff --git a/third_party/chromium/media/audio/win/volume_range_util_unittest.cc b/media/audio/win/volume_range_util_unittest.cc similarity index 100% rename from third_party/chromium/media/audio/win/volume_range_util_unittest.cc rename to media/audio/win/volume_range_util_unittest.cc diff --git a/third_party/chromium/media/audio/win/waveout_output_win.cc b/media/audio/win/waveout_output_win.cc similarity index 100% rename from third_party/chromium/media/audio/win/waveout_output_win.cc rename to media/audio/win/waveout_output_win.cc diff --git a/third_party/chromium/media/audio/win/waveout_output_win.h b/media/audio/win/waveout_output_win.h similarity index 100% rename from third_party/chromium/media/audio/win/waveout_output_win.h rename to media/audio/win/waveout_output_win.h diff --git a/third_party/chromium/media/base/BUILD.gn b/media/base/BUILD.gn similarity index 100% rename from third_party/chromium/media/base/BUILD.gn rename to media/base/BUILD.gn diff --git a/third_party/chromium/media/base/DEPS b/media/base/DEPS similarity index 100% rename from third_party/chromium/media/base/DEPS rename to media/base/DEPS diff --git a/third_party/chromium/media/base/OWNERS b/media/base/OWNERS similarity index 100% rename from third_party/chromium/media/base/OWNERS rename to media/base/OWNERS diff --git a/third_party/chromium/media/base/android/BUILD.gn b/media/base/android/BUILD.gn similarity index 100% rename from third_party/chromium/media/base/android/BUILD.gn rename to media/base/android/BUILD.gn diff --git a/third_party/chromium/media/base/android/android_cdm_factory.cc b/media/base/android/android_cdm_factory.cc similarity index 100% rename from third_party/chromium/media/base/android/android_cdm_factory.cc rename to media/base/android/android_cdm_factory.cc diff --git a/third_party/chromium/media/base/android/android_cdm_factory.h b/media/base/android/android_cdm_factory.h similarity index 100% rename from third_party/chromium/media/base/android/android_cdm_factory.h rename to media/base/android/android_cdm_factory.h diff --git a/third_party/chromium/media/base/android/android_overlay.cc b/media/base/android/android_overlay.cc similarity index 100% rename from third_party/chromium/media/base/android/android_overlay.cc rename to media/base/android/android_overlay.cc diff --git a/third_party/chromium/media/base/android/android_overlay.h b/media/base/android/android_overlay.h similarity index 100% rename from third_party/chromium/media/base/android/android_overlay.h rename to media/base/android/android_overlay.h diff --git a/third_party/chromium/media/base/android/android_util.cc b/media/base/android/android_util.cc similarity index 100% rename from third_party/chromium/media/base/android/android_util.cc rename to media/base/android/android_util.cc diff --git a/third_party/chromium/media/base/android/android_util.h b/media/base/android/android_util.h similarity index 100% rename from third_party/chromium/media/base/android/android_util.h rename to media/base/android/android_util.h diff --git a/third_party/chromium/media/base/android/extract_sps_and_pps.cc b/media/base/android/extract_sps_and_pps.cc similarity index 100% rename from third_party/chromium/media/base/android/extract_sps_and_pps.cc rename to media/base/android/extract_sps_and_pps.cc diff --git a/third_party/chromium/media/base/android/extract_sps_and_pps.h b/media/base/android/extract_sps_and_pps.h similarity index 100% rename from third_party/chromium/media/base/android/extract_sps_and_pps.h rename to media/base/android/extract_sps_and_pps.h diff --git a/third_party/chromium/media/base/android/java/res/raw/empty.wav b/media/base/android/java/res/raw/empty.wav similarity index 100% rename from third_party/chromium/media/base/android/java/res/raw/empty.wav rename to media/base/android/java/res/raw/empty.wav diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java rename to media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java b/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java rename to media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/BitrateAdjuster.java b/media/base/android/java/src/org/chromium/media/BitrateAdjuster.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/BitrateAdjuster.java rename to media/base/android/java/src/org/chromium/media/BitrateAdjuster.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java b/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java rename to media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/DisplayCompat.java b/media/base/android/java/src/org/chromium/media/DisplayCompat.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/DisplayCompat.java rename to media/base/android/java/src/org/chromium/media/DisplayCompat.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/HdrMetadata.java b/media/base/android/java/src/org/chromium/media/HdrMetadata.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/HdrMetadata.java rename to media/base/android/java/src/org/chromium/media/HdrMetadata.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MaxAnticipatedResolutionEstimator.java b/media/base/android/java/src/org/chromium/media/MaxAnticipatedResolutionEstimator.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MaxAnticipatedResolutionEstimator.java rename to media/base/android/java/src/org/chromium/media/MaxAnticipatedResolutionEstimator.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java rename to media/base/android/java/src/org/chromium/media/MediaCodecBridge.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaCodecBridgeBuilder.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridgeBuilder.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaCodecBridgeBuilder.java rename to media/base/android/java/src/org/chromium/media/MediaCodecBridgeBuilder.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java b/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java rename to media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java rename to media/base/android/java/src/org/chromium/media/MediaCodecUtil.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java rename to media/base/android/java/src/org/chromium/media/MediaDrmBridge.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java b/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java rename to media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java rename to media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaFormatBuilder.java b/media/base/android/java/src/org/chromium/media/MediaFormatBuilder.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaFormatBuilder.java rename to media/base/android/java/src/org/chromium/media/MediaFormatBuilder.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java b/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java rename to media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java b/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java rename to media/base/android/java/src/org/chromium/media/MediaPlayerListener.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/MediaServerCrashListener.java b/media/base/android/java/src/org/chromium/media/MediaServerCrashListener.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/MediaServerCrashListener.java rename to media/base/android/java/src/org/chromium/media/MediaServerCrashListener.java diff --git a/third_party/chromium/media/base/android/java/src/org/chromium/media/ScreenResolutionUtil.java b/media/base/android/java/src/org/chromium/media/ScreenResolutionUtil.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/org/chromium/media/ScreenResolutionUtil.java rename to media/base/android/java/src/org/chromium/media/ScreenResolutionUtil.java diff --git a/third_party/chromium/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java b/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java rename to media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java diff --git a/third_party/chromium/media/base/android/java/src/test/org/chromium/media/BitrateAdjusterTest.java b/media/base/android/java/src/test/org/chromium/media/BitrateAdjusterTest.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/test/org/chromium/media/BitrateAdjusterTest.java rename to media/base/android/java/src/test/org/chromium/media/BitrateAdjusterTest.java diff --git a/third_party/chromium/media/base/android/java/src/test/org/chromium/media/MediaFormatBuilderTest.java b/media/base/android/java/src/test/org/chromium/media/MediaFormatBuilderTest.java similarity index 100% rename from third_party/chromium/media/base/android/java/src/test/org/chromium/media/MediaFormatBuilderTest.java rename to media/base/android/java/src/test/org/chromium/media/MediaFormatBuilderTest.java diff --git a/third_party/chromium/media/base/android/java_templates/MediaSwitches.java.tmpl b/media/base/android/java_templates/MediaSwitches.java.tmpl similarity index 100% rename from third_party/chromium/media/base/android/java_templates/MediaSwitches.java.tmpl rename to media/base/android/java_templates/MediaSwitches.java.tmpl diff --git a/third_party/chromium/media/base/android/jni_hdr_metadata.cc b/media/base/android/jni_hdr_metadata.cc similarity index 100% rename from third_party/chromium/media/base/android/jni_hdr_metadata.cc rename to media/base/android/jni_hdr_metadata.cc diff --git a/third_party/chromium/media/base/android/jni_hdr_metadata.h b/media/base/android/jni_hdr_metadata.h similarity index 100% rename from third_party/chromium/media/base/android/jni_hdr_metadata.h rename to media/base/android/jni_hdr_metadata.h diff --git a/third_party/chromium/media/base/android/media_codec_bridge.h b/media/base/android/media_codec_bridge.h similarity index 100% rename from third_party/chromium/media/base/android/media_codec_bridge.h rename to media/base/android/media_codec_bridge.h diff --git a/third_party/chromium/media/base/android/media_codec_bridge_impl.cc b/media/base/android/media_codec_bridge_impl.cc similarity index 100% rename from third_party/chromium/media/base/android/media_codec_bridge_impl.cc rename to media/base/android/media_codec_bridge_impl.cc diff --git a/third_party/chromium/media/base/android/media_codec_bridge_impl.h b/media/base/android/media_codec_bridge_impl.h similarity index 100% rename from third_party/chromium/media/base/android/media_codec_bridge_impl.h rename to media/base/android/media_codec_bridge_impl.h diff --git a/third_party/chromium/media/base/android/media_codec_bridge_impl_unittest.cc b/media/base/android/media_codec_bridge_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/base/android/media_codec_bridge_impl_unittest.cc rename to media/base/android/media_codec_bridge_impl_unittest.cc diff --git a/third_party/chromium/media/base/android/media_codec_direction.h b/media/base/android/media_codec_direction.h similarity index 100% rename from third_party/chromium/media/base/android/media_codec_direction.h rename to media/base/android/media_codec_direction.h diff --git a/third_party/chromium/media/base/android/media_codec_loop.cc b/media/base/android/media_codec_loop.cc similarity index 100% rename from third_party/chromium/media/base/android/media_codec_loop.cc rename to media/base/android/media_codec_loop.cc diff --git a/third_party/chromium/media/base/android/media_codec_loop.h b/media/base/android/media_codec_loop.h similarity index 100% rename from third_party/chromium/media/base/android/media_codec_loop.h rename to media/base/android/media_codec_loop.h diff --git a/third_party/chromium/media/base/android/media_codec_loop_unittest.cc b/media/base/android/media_codec_loop_unittest.cc similarity index 100% rename from third_party/chromium/media/base/android/media_codec_loop_unittest.cc rename to media/base/android/media_codec_loop_unittest.cc diff --git a/third_party/chromium/media/base/android/media_codec_util.cc b/media/base/android/media_codec_util.cc similarity index 100% rename from third_party/chromium/media/base/android/media_codec_util.cc rename to media/base/android/media_codec_util.cc diff --git a/third_party/chromium/media/base/android/media_codec_util.h b/media/base/android/media_codec_util.h similarity index 100% rename from third_party/chromium/media/base/android/media_codec_util.h rename to media/base/android/media_codec_util.h diff --git a/third_party/chromium/media/base/android/media_codec_util_unittest.cc b/media/base/android/media_codec_util_unittest.cc similarity index 100% rename from third_party/chromium/media/base/android/media_codec_util_unittest.cc rename to media/base/android/media_codec_util_unittest.cc diff --git a/third_party/chromium/media/base/android/media_common_android.h b/media/base/android/media_common_android.h similarity index 100% rename from third_party/chromium/media/base/android/media_common_android.h rename to media/base/android/media_common_android.h diff --git a/third_party/chromium/media/base/android/media_crypto_context.h b/media/base/android/media_crypto_context.h similarity index 100% rename from third_party/chromium/media/base/android/media_crypto_context.h rename to media/base/android/media_crypto_context.h diff --git a/third_party/chromium/media/base/android/media_crypto_context_impl.cc b/media/base/android/media_crypto_context_impl.cc similarity index 100% rename from third_party/chromium/media/base/android/media_crypto_context_impl.cc rename to media/base/android/media_crypto_context_impl.cc diff --git a/third_party/chromium/media/base/android/media_crypto_context_impl.h b/media/base/android/media_crypto_context_impl.h similarity index 100% rename from third_party/chromium/media/base/android/media_crypto_context_impl.h rename to media/base/android/media_crypto_context_impl.h diff --git a/third_party/chromium/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc similarity index 100% rename from third_party/chromium/media/base/android/media_drm_bridge.cc rename to media/base/android/media_drm_bridge.cc diff --git a/third_party/chromium/media/base/android/media_drm_bridge.h b/media/base/android/media_drm_bridge.h similarity index 100% rename from third_party/chromium/media/base/android/media_drm_bridge.h rename to media/base/android/media_drm_bridge.h diff --git a/third_party/chromium/media/base/android/media_drm_bridge_client.cc b/media/base/android/media_drm_bridge_client.cc similarity index 100% rename from third_party/chromium/media/base/android/media_drm_bridge_client.cc rename to media/base/android/media_drm_bridge_client.cc diff --git a/third_party/chromium/media/base/android/media_drm_bridge_client.h b/media/base/android/media_drm_bridge_client.h similarity index 100% rename from third_party/chromium/media/base/android/media_drm_bridge_client.h rename to media/base/android/media_drm_bridge_client.h diff --git a/third_party/chromium/media/base/android/media_drm_bridge_delegate.cc b/media/base/android/media_drm_bridge_delegate.cc similarity index 100% rename from third_party/chromium/media/base/android/media_drm_bridge_delegate.cc rename to media/base/android/media_drm_bridge_delegate.cc diff --git a/third_party/chromium/media/base/android/media_drm_bridge_delegate.h b/media/base/android/media_drm_bridge_delegate.h similarity index 100% rename from third_party/chromium/media/base/android/media_drm_bridge_delegate.h rename to media/base/android/media_drm_bridge_delegate.h diff --git a/third_party/chromium/media/base/android/media_drm_bridge_factory.cc b/media/base/android/media_drm_bridge_factory.cc similarity index 100% rename from third_party/chromium/media/base/android/media_drm_bridge_factory.cc rename to media/base/android/media_drm_bridge_factory.cc diff --git a/third_party/chromium/media/base/android/media_drm_bridge_factory.h b/media/base/android/media_drm_bridge_factory.h similarity index 100% rename from third_party/chromium/media/base/android/media_drm_bridge_factory.h rename to media/base/android/media_drm_bridge_factory.h diff --git a/third_party/chromium/media/base/android/media_drm_bridge_unittest.cc b/media/base/android/media_drm_bridge_unittest.cc similarity index 100% rename from third_party/chromium/media/base/android/media_drm_bridge_unittest.cc rename to media/base/android/media_drm_bridge_unittest.cc diff --git a/third_party/chromium/media/base/android/media_drm_storage_bridge.cc b/media/base/android/media_drm_storage_bridge.cc similarity index 100% rename from third_party/chromium/media/base/android/media_drm_storage_bridge.cc rename to media/base/android/media_drm_storage_bridge.cc diff --git a/third_party/chromium/media/base/android/media_drm_storage_bridge.h b/media/base/android/media_drm_storage_bridge.h similarity index 100% rename from third_party/chromium/media/base/android/media_drm_storage_bridge.h rename to media/base/android/media_drm_storage_bridge.h diff --git a/third_party/chromium/media/base/android/media_player_bridge.cc b/media/base/android/media_player_bridge.cc similarity index 100% rename from third_party/chromium/media/base/android/media_player_bridge.cc rename to media/base/android/media_player_bridge.cc diff --git a/third_party/chromium/media/base/android/media_player_bridge.h b/media/base/android/media_player_bridge.h similarity index 100% rename from third_party/chromium/media/base/android/media_player_bridge.h rename to media/base/android/media_player_bridge.h diff --git a/third_party/chromium/media/base/android/media_player_bridge_unittest.cc b/media/base/android/media_player_bridge_unittest.cc similarity index 100% rename from third_party/chromium/media/base/android/media_player_bridge_unittest.cc rename to media/base/android/media_player_bridge_unittest.cc diff --git a/third_party/chromium/media/base/android/media_player_listener.cc b/media/base/android/media_player_listener.cc similarity index 100% rename from third_party/chromium/media/base/android/media_player_listener.cc rename to media/base/android/media_player_listener.cc diff --git a/third_party/chromium/media/base/android/media_player_listener.h b/media/base/android/media_player_listener.h similarity index 100% rename from third_party/chromium/media/base/android/media_player_listener.h rename to media/base/android/media_player_listener.h diff --git a/third_party/chromium/media/base/android/media_resource_getter.cc b/media/base/android/media_resource_getter.cc similarity index 100% rename from third_party/chromium/media/base/android/media_resource_getter.cc rename to media/base/android/media_resource_getter.cc diff --git a/third_party/chromium/media/base/android/media_resource_getter.h b/media/base/android/media_resource_getter.h similarity index 100% rename from third_party/chromium/media/base/android/media_resource_getter.h rename to media/base/android/media_resource_getter.h diff --git a/third_party/chromium/media/base/android/media_server_crash_listener.cc b/media/base/android/media_server_crash_listener.cc similarity index 100% rename from third_party/chromium/media/base/android/media_server_crash_listener.cc rename to media/base/android/media_server_crash_listener.cc diff --git a/third_party/chromium/media/base/android/media_server_crash_listener.h b/media/base/android/media_server_crash_listener.h similarity index 100% rename from third_party/chromium/media/base/android/media_server_crash_listener.h rename to media/base/android/media_server_crash_listener.h diff --git a/third_party/chromium/media/base/android/media_service_throttler.cc b/media/base/android/media_service_throttler.cc similarity index 100% rename from third_party/chromium/media/base/android/media_service_throttler.cc rename to media/base/android/media_service_throttler.cc diff --git a/third_party/chromium/media/base/android/media_service_throttler.h b/media/base/android/media_service_throttler.h similarity index 100% rename from third_party/chromium/media/base/android/media_service_throttler.h rename to media/base/android/media_service_throttler.h diff --git a/third_party/chromium/media/base/android/media_service_throttler_unittest.cc b/media/base/android/media_service_throttler_unittest.cc similarity index 100% rename from third_party/chromium/media/base/android/media_service_throttler_unittest.cc rename to media/base/android/media_service_throttler_unittest.cc diff --git a/third_party/chromium/media/base/android/media_url_interceptor.h b/media/base/android/media_url_interceptor.h similarity index 100% rename from third_party/chromium/media/base/android/media_url_interceptor.h rename to media/base/android/media_url_interceptor.h diff --git a/third_party/chromium/media/base/android/mock_android_overlay.cc b/media/base/android/mock_android_overlay.cc similarity index 100% rename from third_party/chromium/media/base/android/mock_android_overlay.cc rename to media/base/android/mock_android_overlay.cc diff --git a/third_party/chromium/media/base/android/mock_android_overlay.h b/media/base/android/mock_android_overlay.h similarity index 100% rename from third_party/chromium/media/base/android/mock_android_overlay.h rename to media/base/android/mock_android_overlay.h diff --git a/third_party/chromium/media/base/android/mock_media_codec_bridge.cc b/media/base/android/mock_media_codec_bridge.cc similarity index 100% rename from third_party/chromium/media/base/android/mock_media_codec_bridge.cc rename to media/base/android/mock_media_codec_bridge.cc diff --git a/third_party/chromium/media/base/android/mock_media_codec_bridge.h b/media/base/android/mock_media_codec_bridge.h similarity index 100% rename from third_party/chromium/media/base/android/mock_media_codec_bridge.h rename to media/base/android/mock_media_codec_bridge.h diff --git a/third_party/chromium/media/base/android/mock_media_crypto_context.cc b/media/base/android/mock_media_crypto_context.cc similarity index 100% rename from third_party/chromium/media/base/android/mock_media_crypto_context.cc rename to media/base/android/mock_media_crypto_context.cc diff --git a/third_party/chromium/media/base/android/mock_media_crypto_context.h b/media/base/android/mock_media_crypto_context.h similarity index 100% rename from third_party/chromium/media/base/android/mock_media_crypto_context.h rename to media/base/android/mock_media_crypto_context.h diff --git a/third_party/chromium/media/base/android/stream_texture_wrapper.h b/media/base/android/stream_texture_wrapper.h similarity index 100% rename from third_party/chromium/media/base/android/stream_texture_wrapper.h rename to media/base/android/stream_texture_wrapper.h diff --git a/third_party/chromium/media/base/android/test_destruction_observable.cc b/media/base/android/test_destruction_observable.cc similarity index 100% rename from third_party/chromium/media/base/android/test_destruction_observable.cc rename to media/base/android/test_destruction_observable.cc diff --git a/third_party/chromium/media/base/android/test_destruction_observable.h b/media/base/android/test_destruction_observable.h similarity index 100% rename from third_party/chromium/media/base/android/test_destruction_observable.h rename to media/base/android/test_destruction_observable.h diff --git a/third_party/chromium/media/base/android_overlay_config.cc b/media/base/android_overlay_config.cc similarity index 100% rename from third_party/chromium/media/base/android_overlay_config.cc rename to media/base/android_overlay_config.cc diff --git a/third_party/chromium/media/base/android_overlay_config.h b/media/base/android_overlay_config.h similarity index 100% rename from third_party/chromium/media/base/android_overlay_config.h rename to media/base/android_overlay_config.h diff --git a/third_party/chromium/media/base/android_overlay_mojo_factory.h b/media/base/android_overlay_mojo_factory.h similarity index 100% rename from third_party/chromium/media/base/android_overlay_mojo_factory.h rename to media/base/android_overlay_mojo_factory.h diff --git a/third_party/chromium/media/base/async_destroy_video_decoder.h b/media/base/async_destroy_video_decoder.h similarity index 100% rename from third_party/chromium/media/base/async_destroy_video_decoder.h rename to media/base/async_destroy_video_decoder.h diff --git a/third_party/chromium/media/base/async_destroy_video_encoder.h b/media/base/async_destroy_video_encoder.h similarity index 100% rename from third_party/chromium/media/base/async_destroy_video_encoder.h rename to media/base/async_destroy_video_encoder.h diff --git a/third_party/chromium/media/base/audio_block_fifo.cc b/media/base/audio_block_fifo.cc similarity index 100% rename from third_party/chromium/media/base/audio_block_fifo.cc rename to media/base/audio_block_fifo.cc diff --git a/third_party/chromium/media/base/audio_block_fifo.h b/media/base/audio_block_fifo.h similarity index 100% rename from third_party/chromium/media/base/audio_block_fifo.h rename to media/base/audio_block_fifo.h diff --git a/third_party/chromium/media/base/audio_block_fifo_unittest.cc b/media/base/audio_block_fifo_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_block_fifo_unittest.cc rename to media/base/audio_block_fifo_unittest.cc diff --git a/third_party/chromium/media/base/audio_buffer.cc b/media/base/audio_buffer.cc similarity index 100% rename from third_party/chromium/media/base/audio_buffer.cc rename to media/base/audio_buffer.cc diff --git a/third_party/chromium/media/base/audio_buffer.h b/media/base/audio_buffer.h similarity index 100% rename from third_party/chromium/media/base/audio_buffer.h rename to media/base/audio_buffer.h diff --git a/third_party/chromium/media/base/audio_buffer_converter.cc b/media/base/audio_buffer_converter.cc similarity index 100% rename from third_party/chromium/media/base/audio_buffer_converter.cc rename to media/base/audio_buffer_converter.cc diff --git a/third_party/chromium/media/base/audio_buffer_converter.h b/media/base/audio_buffer_converter.h similarity index 100% rename from third_party/chromium/media/base/audio_buffer_converter.h rename to media/base/audio_buffer_converter.h diff --git a/third_party/chromium/media/base/audio_buffer_converter_unittest.cc b/media/base/audio_buffer_converter_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_buffer_converter_unittest.cc rename to media/base/audio_buffer_converter_unittest.cc diff --git a/third_party/chromium/media/base/audio_buffer_queue.cc b/media/base/audio_buffer_queue.cc similarity index 100% rename from third_party/chromium/media/base/audio_buffer_queue.cc rename to media/base/audio_buffer_queue.cc diff --git a/third_party/chromium/media/base/audio_buffer_queue.h b/media/base/audio_buffer_queue.h similarity index 100% rename from third_party/chromium/media/base/audio_buffer_queue.h rename to media/base/audio_buffer_queue.h diff --git a/third_party/chromium/media/base/audio_buffer_queue_unittest.cc b/media/base/audio_buffer_queue_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_buffer_queue_unittest.cc rename to media/base/audio_buffer_queue_unittest.cc diff --git a/third_party/chromium/media/base/audio_buffer_unittest.cc b/media/base/audio_buffer_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_buffer_unittest.cc rename to media/base/audio_buffer_unittest.cc diff --git a/third_party/chromium/media/base/audio_bus.cc b/media/base/audio_bus.cc similarity index 100% rename from third_party/chromium/media/base/audio_bus.cc rename to media/base/audio_bus.cc diff --git a/third_party/chromium/media/base/audio_bus.h b/media/base/audio_bus.h similarity index 100% rename from third_party/chromium/media/base/audio_bus.h rename to media/base/audio_bus.h diff --git a/third_party/chromium/media/base/audio_bus_perftest.cc b/media/base/audio_bus_perftest.cc similarity index 100% rename from third_party/chromium/media/base/audio_bus_perftest.cc rename to media/base/audio_bus_perftest.cc diff --git a/third_party/chromium/media/base/audio_bus_unittest.cc b/media/base/audio_bus_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_bus_unittest.cc rename to media/base/audio_bus_unittest.cc diff --git a/third_party/chromium/media/base/audio_capturer_source.h b/media/base/audio_capturer_source.h similarity index 100% rename from third_party/chromium/media/base/audio_capturer_source.h rename to media/base/audio_capturer_source.h diff --git a/third_party/chromium/media/base/audio_codecs.cc b/media/base/audio_codecs.cc similarity index 100% rename from third_party/chromium/media/base/audio_codecs.cc rename to media/base/audio_codecs.cc diff --git a/third_party/chromium/media/base/audio_codecs.h b/media/base/audio_codecs.h similarity index 100% rename from third_party/chromium/media/base/audio_codecs.h rename to media/base/audio_codecs.h diff --git a/third_party/chromium/media/base/audio_converter.cc b/media/base/audio_converter.cc similarity index 100% rename from third_party/chromium/media/base/audio_converter.cc rename to media/base/audio_converter.cc diff --git a/third_party/chromium/media/base/audio_converter.h b/media/base/audio_converter.h similarity index 100% rename from third_party/chromium/media/base/audio_converter.h rename to media/base/audio_converter.h diff --git a/third_party/chromium/media/base/audio_converter_perftest.cc b/media/base/audio_converter_perftest.cc similarity index 100% rename from third_party/chromium/media/base/audio_converter_perftest.cc rename to media/base/audio_converter_perftest.cc diff --git a/third_party/chromium/media/base/audio_converter_unittest.cc b/media/base/audio_converter_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_converter_unittest.cc rename to media/base/audio_converter_unittest.cc diff --git a/third_party/chromium/media/base/audio_decoder.cc b/media/base/audio_decoder.cc similarity index 100% rename from third_party/chromium/media/base/audio_decoder.cc rename to media/base/audio_decoder.cc diff --git a/third_party/chromium/media/base/audio_decoder.h b/media/base/audio_decoder.h similarity index 100% rename from third_party/chromium/media/base/audio_decoder.h rename to media/base/audio_decoder.h diff --git a/third_party/chromium/media/base/audio_decoder_config.cc b/media/base/audio_decoder_config.cc similarity index 100% rename from third_party/chromium/media/base/audio_decoder_config.cc rename to media/base/audio_decoder_config.cc diff --git a/third_party/chromium/media/base/audio_decoder_config.h b/media/base/audio_decoder_config.h similarity index 100% rename from third_party/chromium/media/base/audio_decoder_config.h rename to media/base/audio_decoder_config.h diff --git a/third_party/chromium/media/base/audio_discard_helper.cc b/media/base/audio_discard_helper.cc similarity index 100% rename from third_party/chromium/media/base/audio_discard_helper.cc rename to media/base/audio_discard_helper.cc diff --git a/third_party/chromium/media/base/audio_discard_helper.h b/media/base/audio_discard_helper.h similarity index 100% rename from third_party/chromium/media/base/audio_discard_helper.h rename to media/base/audio_discard_helper.h diff --git a/third_party/chromium/media/base/audio_discard_helper_unittest.cc b/media/base/audio_discard_helper_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_discard_helper_unittest.cc rename to media/base/audio_discard_helper_unittest.cc diff --git a/third_party/chromium/media/base/audio_encoder.cc b/media/base/audio_encoder.cc similarity index 100% rename from third_party/chromium/media/base/audio_encoder.cc rename to media/base/audio_encoder.cc diff --git a/third_party/chromium/media/base/audio_encoder.h b/media/base/audio_encoder.h similarity index 100% rename from third_party/chromium/media/base/audio_encoder.h rename to media/base/audio_encoder.h diff --git a/third_party/chromium/media/base/audio_fifo.cc b/media/base/audio_fifo.cc similarity index 100% rename from third_party/chromium/media/base/audio_fifo.cc rename to media/base/audio_fifo.cc diff --git a/third_party/chromium/media/base/audio_fifo.h b/media/base/audio_fifo.h similarity index 100% rename from third_party/chromium/media/base/audio_fifo.h rename to media/base/audio_fifo.h diff --git a/third_party/chromium/media/base/audio_fifo_unittest.cc b/media/base/audio_fifo_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_fifo_unittest.cc rename to media/base/audio_fifo_unittest.cc diff --git a/third_party/chromium/media/base/audio_hash.cc b/media/base/audio_hash.cc similarity index 100% rename from third_party/chromium/media/base/audio_hash.cc rename to media/base/audio_hash.cc diff --git a/third_party/chromium/media/base/audio_hash.h b/media/base/audio_hash.h similarity index 100% rename from third_party/chromium/media/base/audio_hash.h rename to media/base/audio_hash.h diff --git a/third_party/chromium/media/base/audio_hash_unittest.cc b/media/base/audio_hash_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_hash_unittest.cc rename to media/base/audio_hash_unittest.cc diff --git a/third_party/chromium/media/base/audio_latency.cc b/media/base/audio_latency.cc similarity index 100% rename from third_party/chromium/media/base/audio_latency.cc rename to media/base/audio_latency.cc diff --git a/third_party/chromium/media/base/audio_latency.h b/media/base/audio_latency.h similarity index 100% rename from third_party/chromium/media/base/audio_latency.h rename to media/base/audio_latency.h diff --git a/third_party/chromium/media/base/audio_latency_unittest.cc b/media/base/audio_latency_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_latency_unittest.cc rename to media/base/audio_latency_unittest.cc diff --git a/third_party/chromium/media/base/audio_parameters.cc b/media/base/audio_parameters.cc similarity index 100% rename from third_party/chromium/media/base/audio_parameters.cc rename to media/base/audio_parameters.cc diff --git a/third_party/chromium/media/base/audio_parameters.h b/media/base/audio_parameters.h similarity index 100% rename from third_party/chromium/media/base/audio_parameters.h rename to media/base/audio_parameters.h diff --git a/third_party/chromium/media/base/audio_parameters_unittest.cc b/media/base/audio_parameters_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_parameters_unittest.cc rename to media/base/audio_parameters_unittest.cc diff --git a/third_party/chromium/media/base/audio_point.cc b/media/base/audio_point.cc similarity index 100% rename from third_party/chromium/media/base/audio_point.cc rename to media/base/audio_point.cc diff --git a/third_party/chromium/media/base/audio_point.h b/media/base/audio_point.h similarity index 100% rename from third_party/chromium/media/base/audio_point.h rename to media/base/audio_point.h diff --git a/third_party/chromium/media/base/audio_point_unittest.cc b/media/base/audio_point_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_point_unittest.cc rename to media/base/audio_point_unittest.cc diff --git a/third_party/chromium/media/base/audio_power_monitor.cc b/media/base/audio_power_monitor.cc similarity index 100% rename from third_party/chromium/media/base/audio_power_monitor.cc rename to media/base/audio_power_monitor.cc diff --git a/third_party/chromium/media/base/audio_power_monitor.h b/media/base/audio_power_monitor.h similarity index 100% rename from third_party/chromium/media/base/audio_power_monitor.h rename to media/base/audio_power_monitor.h diff --git a/third_party/chromium/media/base/audio_power_monitor_unittest.cc b/media/base/audio_power_monitor_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_power_monitor_unittest.cc rename to media/base/audio_power_monitor_unittest.cc diff --git a/third_party/chromium/media/base/audio_processing.cc b/media/base/audio_processing.cc similarity index 100% rename from third_party/chromium/media/base/audio_processing.cc rename to media/base/audio_processing.cc diff --git a/third_party/chromium/media/base/audio_processing.h b/media/base/audio_processing.h similarity index 100% rename from third_party/chromium/media/base/audio_processing.h rename to media/base/audio_processing.h diff --git a/third_party/chromium/media/base/audio_pull_fifo.cc b/media/base/audio_pull_fifo.cc similarity index 100% rename from third_party/chromium/media/base/audio_pull_fifo.cc rename to media/base/audio_pull_fifo.cc diff --git a/third_party/chromium/media/base/audio_pull_fifo.h b/media/base/audio_pull_fifo.h similarity index 100% rename from third_party/chromium/media/base/audio_pull_fifo.h rename to media/base/audio_pull_fifo.h diff --git a/third_party/chromium/media/base/audio_pull_fifo_unittest.cc b/media/base/audio_pull_fifo_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_pull_fifo_unittest.cc rename to media/base/audio_pull_fifo_unittest.cc diff --git a/third_party/chromium/media/base/audio_push_fifo.cc b/media/base/audio_push_fifo.cc similarity index 100% rename from third_party/chromium/media/base/audio_push_fifo.cc rename to media/base/audio_push_fifo.cc diff --git a/third_party/chromium/media/base/audio_push_fifo.h b/media/base/audio_push_fifo.h similarity index 100% rename from third_party/chromium/media/base/audio_push_fifo.h rename to media/base/audio_push_fifo.h diff --git a/third_party/chromium/media/base/audio_push_fifo_unittest.cc b/media/base/audio_push_fifo_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_push_fifo_unittest.cc rename to media/base/audio_push_fifo_unittest.cc diff --git a/third_party/chromium/media/base/audio_renderer.cc b/media/base/audio_renderer.cc similarity index 100% rename from third_party/chromium/media/base/audio_renderer.cc rename to media/base/audio_renderer.cc diff --git a/third_party/chromium/media/base/audio_renderer.h b/media/base/audio_renderer.h similarity index 100% rename from third_party/chromium/media/base/audio_renderer.h rename to media/base/audio_renderer.h diff --git a/third_party/chromium/media/base/audio_renderer_mixer.cc b/media/base/audio_renderer_mixer.cc similarity index 100% rename from third_party/chromium/media/base/audio_renderer_mixer.cc rename to media/base/audio_renderer_mixer.cc diff --git a/third_party/chromium/media/base/audio_renderer_mixer.h b/media/base/audio_renderer_mixer.h similarity index 100% rename from third_party/chromium/media/base/audio_renderer_mixer.h rename to media/base/audio_renderer_mixer.h diff --git a/third_party/chromium/media/base/audio_renderer_mixer_input.cc b/media/base/audio_renderer_mixer_input.cc similarity index 100% rename from third_party/chromium/media/base/audio_renderer_mixer_input.cc rename to media/base/audio_renderer_mixer_input.cc diff --git a/third_party/chromium/media/base/audio_renderer_mixer_input.h b/media/base/audio_renderer_mixer_input.h similarity index 100% rename from third_party/chromium/media/base/audio_renderer_mixer_input.h rename to media/base/audio_renderer_mixer_input.h diff --git a/third_party/chromium/media/base/audio_renderer_mixer_input_unittest.cc b/media/base/audio_renderer_mixer_input_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_renderer_mixer_input_unittest.cc rename to media/base/audio_renderer_mixer_input_unittest.cc diff --git a/third_party/chromium/media/base/audio_renderer_mixer_pool.h b/media/base/audio_renderer_mixer_pool.h similarity index 100% rename from third_party/chromium/media/base/audio_renderer_mixer_pool.h rename to media/base/audio_renderer_mixer_pool.h diff --git a/third_party/chromium/media/base/audio_renderer_mixer_unittest.cc b/media/base/audio_renderer_mixer_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_renderer_mixer_unittest.cc rename to media/base/audio_renderer_mixer_unittest.cc diff --git a/third_party/chromium/media/base/audio_renderer_sink.h b/media/base/audio_renderer_sink.h similarity index 100% rename from third_party/chromium/media/base/audio_renderer_sink.h rename to media/base/audio_renderer_sink.h diff --git a/third_party/chromium/media/base/audio_sample_types.h b/media/base/audio_sample_types.h similarity index 100% rename from third_party/chromium/media/base/audio_sample_types.h rename to media/base/audio_sample_types.h diff --git a/third_party/chromium/media/base/audio_sample_types_unittest.cc b/media/base/audio_sample_types_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_sample_types_unittest.cc rename to media/base/audio_sample_types_unittest.cc diff --git a/third_party/chromium/media/base/audio_shifter.cc b/media/base/audio_shifter.cc similarity index 100% rename from third_party/chromium/media/base/audio_shifter.cc rename to media/base/audio_shifter.cc diff --git a/third_party/chromium/media/base/audio_shifter.h b/media/base/audio_shifter.h similarity index 100% rename from third_party/chromium/media/base/audio_shifter.h rename to media/base/audio_shifter.h diff --git a/third_party/chromium/media/base/audio_shifter_unittest.cc b/media/base/audio_shifter_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_shifter_unittest.cc rename to media/base/audio_shifter_unittest.cc diff --git a/third_party/chromium/media/base/audio_timestamp_helper.cc b/media/base/audio_timestamp_helper.cc similarity index 100% rename from third_party/chromium/media/base/audio_timestamp_helper.cc rename to media/base/audio_timestamp_helper.cc diff --git a/third_party/chromium/media/base/audio_timestamp_helper.h b/media/base/audio_timestamp_helper.h similarity index 100% rename from third_party/chromium/media/base/audio_timestamp_helper.h rename to media/base/audio_timestamp_helper.h diff --git a/third_party/chromium/media/base/audio_timestamp_helper_unittest.cc b/media/base/audio_timestamp_helper_unittest.cc similarity index 100% rename from third_party/chromium/media/base/audio_timestamp_helper_unittest.cc rename to media/base/audio_timestamp_helper_unittest.cc diff --git a/third_party/chromium/media/base/bind_to_current_loop.h b/media/base/bind_to_current_loop.h similarity index 100% rename from third_party/chromium/media/base/bind_to_current_loop.h rename to media/base/bind_to_current_loop.h diff --git a/third_party/chromium/media/base/bit_reader.cc b/media/base/bit_reader.cc similarity index 100% rename from third_party/chromium/media/base/bit_reader.cc rename to media/base/bit_reader.cc diff --git a/third_party/chromium/media/base/bit_reader.h b/media/base/bit_reader.h similarity index 100% rename from third_party/chromium/media/base/bit_reader.h rename to media/base/bit_reader.h diff --git a/third_party/chromium/media/base/bit_reader_core.cc b/media/base/bit_reader_core.cc similarity index 100% rename from third_party/chromium/media/base/bit_reader_core.cc rename to media/base/bit_reader_core.cc diff --git a/third_party/chromium/media/base/bit_reader_core.h b/media/base/bit_reader_core.h similarity index 100% rename from third_party/chromium/media/base/bit_reader_core.h rename to media/base/bit_reader_core.h diff --git a/third_party/chromium/media/base/bit_reader_fuzzertest.cc b/media/base/bit_reader_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/base/bit_reader_fuzzertest.cc rename to media/base/bit_reader_fuzzertest.cc diff --git a/third_party/chromium/media/base/bit_reader_unittest.cc b/media/base/bit_reader_unittest.cc similarity index 100% rename from third_party/chromium/media/base/bit_reader_unittest.cc rename to media/base/bit_reader_unittest.cc diff --git a/third_party/chromium/media/base/bitrate.cc b/media/base/bitrate.cc similarity index 100% rename from third_party/chromium/media/base/bitrate.cc rename to media/base/bitrate.cc diff --git a/third_party/chromium/media/base/bitrate.h b/media/base/bitrate.h similarity index 100% rename from third_party/chromium/media/base/bitrate.h rename to media/base/bitrate.h diff --git a/third_party/chromium/media/base/bitstream_buffer.cc b/media/base/bitstream_buffer.cc similarity index 100% rename from third_party/chromium/media/base/bitstream_buffer.cc rename to media/base/bitstream_buffer.cc diff --git a/third_party/chromium/media/base/bitstream_buffer.h b/media/base/bitstream_buffer.h similarity index 100% rename from third_party/chromium/media/base/bitstream_buffer.h rename to media/base/bitstream_buffer.h diff --git a/third_party/chromium/media/base/buffering_state.cc b/media/base/buffering_state.cc similarity index 100% rename from third_party/chromium/media/base/buffering_state.cc rename to media/base/buffering_state.cc diff --git a/third_party/chromium/media/base/buffering_state.h b/media/base/buffering_state.h similarity index 100% rename from third_party/chromium/media/base/buffering_state.h rename to media/base/buffering_state.h diff --git a/third_party/chromium/media/base/byte_queue.cc b/media/base/byte_queue.cc similarity index 100% rename from third_party/chromium/media/base/byte_queue.cc rename to media/base/byte_queue.cc diff --git a/third_party/chromium/media/base/byte_queue.h b/media/base/byte_queue.h similarity index 100% rename from third_party/chromium/media/base/byte_queue.h rename to media/base/byte_queue.h diff --git a/third_party/chromium/media/base/callback_holder.h b/media/base/callback_holder.h similarity index 100% rename from third_party/chromium/media/base/callback_holder.h rename to media/base/callback_holder.h diff --git a/third_party/chromium/media/base/callback_holder_unittest.cc b/media/base/callback_holder_unittest.cc similarity index 100% rename from third_party/chromium/media/base/callback_holder_unittest.cc rename to media/base/callback_holder_unittest.cc diff --git a/third_party/chromium/media/base/callback_registry.h b/media/base/callback_registry.h similarity index 100% rename from third_party/chromium/media/base/callback_registry.h rename to media/base/callback_registry.h diff --git a/third_party/chromium/media/base/callback_registry_unittest.cc b/media/base/callback_registry_unittest.cc similarity index 100% rename from third_party/chromium/media/base/callback_registry_unittest.cc rename to media/base/callback_registry_unittest.cc diff --git a/third_party/chromium/media/base/cdm_callback_promise.cc b/media/base/cdm_callback_promise.cc similarity index 100% rename from third_party/chromium/media/base/cdm_callback_promise.cc rename to media/base/cdm_callback_promise.cc diff --git a/third_party/chromium/media/base/cdm_callback_promise.h b/media/base/cdm_callback_promise.h similarity index 100% rename from third_party/chromium/media/base/cdm_callback_promise.h rename to media/base/cdm_callback_promise.h diff --git a/third_party/chromium/media/base/cdm_config.h b/media/base/cdm_config.h similarity index 100% rename from third_party/chromium/media/base/cdm_config.h rename to media/base/cdm_config.h diff --git a/third_party/chromium/media/base/cdm_context.cc b/media/base/cdm_context.cc similarity index 100% rename from third_party/chromium/media/base/cdm_context.cc rename to media/base/cdm_context.cc diff --git a/third_party/chromium/media/base/cdm_context.h b/media/base/cdm_context.h similarity index 100% rename from third_party/chromium/media/base/cdm_context.h rename to media/base/cdm_context.h diff --git a/third_party/chromium/media/base/cdm_factory.cc b/media/base/cdm_factory.cc similarity index 100% rename from third_party/chromium/media/base/cdm_factory.cc rename to media/base/cdm_factory.cc diff --git a/third_party/chromium/media/base/cdm_factory.h b/media/base/cdm_factory.h similarity index 100% rename from third_party/chromium/media/base/cdm_factory.h rename to media/base/cdm_factory.h diff --git a/third_party/chromium/media/base/cdm_initialized_promise.cc b/media/base/cdm_initialized_promise.cc similarity index 100% rename from third_party/chromium/media/base/cdm_initialized_promise.cc rename to media/base/cdm_initialized_promise.cc diff --git a/third_party/chromium/media/base/cdm_initialized_promise.h b/media/base/cdm_initialized_promise.h similarity index 100% rename from third_party/chromium/media/base/cdm_initialized_promise.h rename to media/base/cdm_initialized_promise.h diff --git a/third_party/chromium/media/base/cdm_key_information.cc b/media/base/cdm_key_information.cc similarity index 100% rename from third_party/chromium/media/base/cdm_key_information.cc rename to media/base/cdm_key_information.cc diff --git a/third_party/chromium/media/base/cdm_key_information.h b/media/base/cdm_key_information.h similarity index 100% rename from third_party/chromium/media/base/cdm_key_information.h rename to media/base/cdm_key_information.h diff --git a/third_party/chromium/media/base/cdm_promise.cc b/media/base/cdm_promise.cc similarity index 100% rename from third_party/chromium/media/base/cdm_promise.cc rename to media/base/cdm_promise.cc diff --git a/third_party/chromium/media/base/cdm_promise.h b/media/base/cdm_promise.h similarity index 100% rename from third_party/chromium/media/base/cdm_promise.h rename to media/base/cdm_promise.h diff --git a/third_party/chromium/media/base/cdm_promise_adapter.cc b/media/base/cdm_promise_adapter.cc similarity index 100% rename from third_party/chromium/media/base/cdm_promise_adapter.cc rename to media/base/cdm_promise_adapter.cc diff --git a/third_party/chromium/media/base/cdm_promise_adapter.h b/media/base/cdm_promise_adapter.h similarity index 100% rename from third_party/chromium/media/base/cdm_promise_adapter.h rename to media/base/cdm_promise_adapter.h diff --git a/third_party/chromium/media/base/cdm_session_tracker.cc b/media/base/cdm_session_tracker.cc similarity index 100% rename from third_party/chromium/media/base/cdm_session_tracker.cc rename to media/base/cdm_session_tracker.cc diff --git a/third_party/chromium/media/base/cdm_session_tracker.h b/media/base/cdm_session_tracker.h similarity index 100% rename from third_party/chromium/media/base/cdm_session_tracker.h rename to media/base/cdm_session_tracker.h diff --git a/third_party/chromium/media/base/channel_layout.cc b/media/base/channel_layout.cc similarity index 100% rename from third_party/chromium/media/base/channel_layout.cc rename to media/base/channel_layout.cc diff --git a/third_party/chromium/media/base/channel_layout.h b/media/base/channel_layout.h similarity index 100% rename from third_party/chromium/media/base/channel_layout.h rename to media/base/channel_layout.h diff --git a/third_party/chromium/media/base/channel_mixer.cc b/media/base/channel_mixer.cc similarity index 100% rename from third_party/chromium/media/base/channel_mixer.cc rename to media/base/channel_mixer.cc diff --git a/third_party/chromium/media/base/channel_mixer.h b/media/base/channel_mixer.h similarity index 100% rename from third_party/chromium/media/base/channel_mixer.h rename to media/base/channel_mixer.h diff --git a/third_party/chromium/media/base/channel_mixer_unittest.cc b/media/base/channel_mixer_unittest.cc similarity index 100% rename from third_party/chromium/media/base/channel_mixer_unittest.cc rename to media/base/channel_mixer_unittest.cc diff --git a/third_party/chromium/media/base/channel_mixing_matrix.cc b/media/base/channel_mixing_matrix.cc similarity index 100% rename from third_party/chromium/media/base/channel_mixing_matrix.cc rename to media/base/channel_mixing_matrix.cc diff --git a/third_party/chromium/media/base/channel_mixing_matrix.h b/media/base/channel_mixing_matrix.h similarity index 100% rename from third_party/chromium/media/base/channel_mixing_matrix.h rename to media/base/channel_mixing_matrix.h diff --git a/third_party/chromium/media/base/channel_mixing_matrix_unittest.cc b/media/base/channel_mixing_matrix_unittest.cc similarity index 100% rename from third_party/chromium/media/base/channel_mixing_matrix_unittest.cc rename to media/base/channel_mixing_matrix_unittest.cc diff --git a/third_party/chromium/media/base/color_plane_layout.cc b/media/base/color_plane_layout.cc similarity index 100% rename from third_party/chromium/media/base/color_plane_layout.cc rename to media/base/color_plane_layout.cc diff --git a/third_party/chromium/media/base/color_plane_layout.h b/media/base/color_plane_layout.h similarity index 100% rename from third_party/chromium/media/base/color_plane_layout.h rename to media/base/color_plane_layout.h diff --git a/third_party/chromium/media/base/container_names.cc b/media/base/container_names.cc similarity index 100% rename from third_party/chromium/media/base/container_names.cc rename to media/base/container_names.cc diff --git a/third_party/chromium/media/base/container_names.h b/media/base/container_names.h similarity index 100% rename from third_party/chromium/media/base/container_names.h rename to media/base/container_names.h diff --git a/third_party/chromium/media/base/container_names_fuzzertest.cc b/media/base/container_names_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/base/container_names_fuzzertest.cc rename to media/base/container_names_fuzzertest.cc diff --git a/third_party/chromium/media/base/container_names_unittest.cc b/media/base/container_names_unittest.cc similarity index 100% rename from third_party/chromium/media/base/container_names_unittest.cc rename to media/base/container_names_unittest.cc diff --git a/third_party/chromium/media/base/content_decryption_module.cc b/media/base/content_decryption_module.cc similarity index 100% rename from third_party/chromium/media/base/content_decryption_module.cc rename to media/base/content_decryption_module.cc diff --git a/third_party/chromium/media/base/content_decryption_module.h b/media/base/content_decryption_module.h similarity index 100% rename from third_party/chromium/media/base/content_decryption_module.h rename to media/base/content_decryption_module.h diff --git a/third_party/chromium/media/base/data_buffer.cc b/media/base/data_buffer.cc similarity index 100% rename from third_party/chromium/media/base/data_buffer.cc rename to media/base/data_buffer.cc diff --git a/third_party/chromium/media/base/data_buffer.h b/media/base/data_buffer.h similarity index 100% rename from third_party/chromium/media/base/data_buffer.h rename to media/base/data_buffer.h diff --git a/third_party/chromium/media/base/data_buffer_unittest.cc b/media/base/data_buffer_unittest.cc similarity index 100% rename from third_party/chromium/media/base/data_buffer_unittest.cc rename to media/base/data_buffer_unittest.cc diff --git a/third_party/chromium/media/base/data_source.cc b/media/base/data_source.cc similarity index 100% rename from third_party/chromium/media/base/data_source.cc rename to media/base/data_source.cc diff --git a/third_party/chromium/media/base/data_source.h b/media/base/data_source.h similarity index 100% rename from third_party/chromium/media/base/data_source.h rename to media/base/data_source.h diff --git a/third_party/chromium/media/base/decode_status.cc b/media/base/decode_status.cc similarity index 100% rename from third_party/chromium/media/base/decode_status.cc rename to media/base/decode_status.cc diff --git a/third_party/chromium/media/base/decode_status.h b/media/base/decode_status.h similarity index 100% rename from third_party/chromium/media/base/decode_status.h rename to media/base/decode_status.h diff --git a/third_party/chromium/media/base/decoder.cc b/media/base/decoder.cc similarity index 100% rename from third_party/chromium/media/base/decoder.cc rename to media/base/decoder.cc diff --git a/third_party/chromium/media/base/decoder.h b/media/base/decoder.h similarity index 100% rename from third_party/chromium/media/base/decoder.h rename to media/base/decoder.h diff --git a/third_party/chromium/media/base/decoder_buffer.cc b/media/base/decoder_buffer.cc similarity index 100% rename from third_party/chromium/media/base/decoder_buffer.cc rename to media/base/decoder_buffer.cc diff --git a/third_party/chromium/media/base/decoder_buffer.h b/media/base/decoder_buffer.h similarity index 100% rename from third_party/chromium/media/base/decoder_buffer.h rename to media/base/decoder_buffer.h diff --git a/third_party/chromium/media/base/decoder_buffer_queue.cc b/media/base/decoder_buffer_queue.cc similarity index 100% rename from third_party/chromium/media/base/decoder_buffer_queue.cc rename to media/base/decoder_buffer_queue.cc diff --git a/third_party/chromium/media/base/decoder_buffer_queue.h b/media/base/decoder_buffer_queue.h similarity index 100% rename from third_party/chromium/media/base/decoder_buffer_queue.h rename to media/base/decoder_buffer_queue.h diff --git a/third_party/chromium/media/base/decoder_buffer_queue_unittest.cc b/media/base/decoder_buffer_queue_unittest.cc similarity index 100% rename from third_party/chromium/media/base/decoder_buffer_queue_unittest.cc rename to media/base/decoder_buffer_queue_unittest.cc diff --git a/third_party/chromium/media/base/decoder_buffer_unittest.cc b/media/base/decoder_buffer_unittest.cc similarity index 100% rename from third_party/chromium/media/base/decoder_buffer_unittest.cc rename to media/base/decoder_buffer_unittest.cc diff --git a/third_party/chromium/media/base/decoder_factory.cc b/media/base/decoder_factory.cc similarity index 100% rename from third_party/chromium/media/base/decoder_factory.cc rename to media/base/decoder_factory.cc diff --git a/third_party/chromium/media/base/decoder_factory.h b/media/base/decoder_factory.h similarity index 100% rename from third_party/chromium/media/base/decoder_factory.h rename to media/base/decoder_factory.h diff --git a/third_party/chromium/media/base/decrypt_config.cc b/media/base/decrypt_config.cc similarity index 100% rename from third_party/chromium/media/base/decrypt_config.cc rename to media/base/decrypt_config.cc diff --git a/third_party/chromium/media/base/decrypt_config.h b/media/base/decrypt_config.h similarity index 100% rename from third_party/chromium/media/base/decrypt_config.h rename to media/base/decrypt_config.h diff --git a/third_party/chromium/media/base/decrypt_config_unittest.cc b/media/base/decrypt_config_unittest.cc similarity index 100% rename from third_party/chromium/media/base/decrypt_config_unittest.cc rename to media/base/decrypt_config_unittest.cc diff --git a/third_party/chromium/media/base/decryptor.cc b/media/base/decryptor.cc similarity index 100% rename from third_party/chromium/media/base/decryptor.cc rename to media/base/decryptor.cc diff --git a/third_party/chromium/media/base/decryptor.h b/media/base/decryptor.h similarity index 100% rename from third_party/chromium/media/base/decryptor.h rename to media/base/decryptor.h diff --git a/third_party/chromium/media/base/demuxer.cc b/media/base/demuxer.cc similarity index 100% rename from third_party/chromium/media/base/demuxer.cc rename to media/base/demuxer.cc diff --git a/third_party/chromium/media/base/demuxer.h b/media/base/demuxer.h similarity index 100% rename from third_party/chromium/media/base/demuxer.h rename to media/base/demuxer.h diff --git a/third_party/chromium/media/base/demuxer_memory_limit.h b/media/base/demuxer_memory_limit.h similarity index 100% rename from third_party/chromium/media/base/demuxer_memory_limit.h rename to media/base/demuxer_memory_limit.h diff --git a/third_party/chromium/media/base/demuxer_memory_limit_android.cc b/media/base/demuxer_memory_limit_android.cc similarity index 100% rename from third_party/chromium/media/base/demuxer_memory_limit_android.cc rename to media/base/demuxer_memory_limit_android.cc diff --git a/third_party/chromium/media/base/demuxer_memory_limit_cast.cc b/media/base/demuxer_memory_limit_cast.cc similarity index 100% rename from third_party/chromium/media/base/demuxer_memory_limit_cast.cc rename to media/base/demuxer_memory_limit_cast.cc diff --git a/third_party/chromium/media/base/demuxer_memory_limit_cast_unittest.cc b/media/base/demuxer_memory_limit_cast_unittest.cc similarity index 100% rename from third_party/chromium/media/base/demuxer_memory_limit_cast_unittest.cc rename to media/base/demuxer_memory_limit_cast_unittest.cc diff --git a/third_party/chromium/media/base/demuxer_memory_limit_default.cc b/media/base/demuxer_memory_limit_default.cc similarity index 100% rename from third_party/chromium/media/base/demuxer_memory_limit_default.cc rename to media/base/demuxer_memory_limit_default.cc diff --git a/third_party/chromium/media/base/demuxer_memory_limit_low.cc b/media/base/demuxer_memory_limit_low.cc similarity index 100% rename from third_party/chromium/media/base/demuxer_memory_limit_low.cc rename to media/base/demuxer_memory_limit_low.cc diff --git a/third_party/chromium/media/base/demuxer_memory_limit_starboard.cc b/media/base/demuxer_memory_limit_starboard.cc similarity index 100% rename from third_party/chromium/media/base/demuxer_memory_limit_starboard.cc rename to media/base/demuxer_memory_limit_starboard.cc diff --git a/third_party/chromium/media/base/demuxer_stream.cc b/media/base/demuxer_stream.cc similarity index 100% rename from third_party/chromium/media/base/demuxer_stream.cc rename to media/base/demuxer_stream.cc diff --git a/third_party/chromium/media/base/demuxer_stream.h b/media/base/demuxer_stream.h similarity index 100% rename from third_party/chromium/media/base/demuxer_stream.h rename to media/base/demuxer_stream.h diff --git a/third_party/chromium/media/base/djb2.cc b/media/base/djb2.cc similarity index 100% rename from third_party/chromium/media/base/djb2.cc rename to media/base/djb2.cc diff --git a/third_party/chromium/media/base/djb2.h b/media/base/djb2.h similarity index 100% rename from third_party/chromium/media/base/djb2.h rename to media/base/djb2.h diff --git a/third_party/chromium/media/base/djb2_unittest.cc b/media/base/djb2_unittest.cc similarity index 100% rename from third_party/chromium/media/base/djb2_unittest.cc rename to media/base/djb2_unittest.cc diff --git a/third_party/chromium/media/base/eme_constants.h b/media/base/eme_constants.h similarity index 100% rename from third_party/chromium/media/base/eme_constants.h rename to media/base/eme_constants.h diff --git a/third_party/chromium/media/base/encryption_pattern.cc b/media/base/encryption_pattern.cc similarity index 100% rename from third_party/chromium/media/base/encryption_pattern.cc rename to media/base/encryption_pattern.cc diff --git a/third_party/chromium/media/base/encryption_pattern.h b/media/base/encryption_pattern.h similarity index 100% rename from third_party/chromium/media/base/encryption_pattern.h rename to media/base/encryption_pattern.h diff --git a/third_party/chromium/media/base/encryption_scheme.cc b/media/base/encryption_scheme.cc similarity index 100% rename from third_party/chromium/media/base/encryption_scheme.cc rename to media/base/encryption_scheme.cc diff --git a/third_party/chromium/media/base/encryption_scheme.h b/media/base/encryption_scheme.h similarity index 100% rename from third_party/chromium/media/base/encryption_scheme.h rename to media/base/encryption_scheme.h diff --git a/third_party/chromium/media/base/fake_audio_render_callback.cc b/media/base/fake_audio_render_callback.cc similarity index 100% rename from third_party/chromium/media/base/fake_audio_render_callback.cc rename to media/base/fake_audio_render_callback.cc diff --git a/third_party/chromium/media/base/fake_audio_render_callback.h b/media/base/fake_audio_render_callback.h similarity index 100% rename from third_party/chromium/media/base/fake_audio_render_callback.h rename to media/base/fake_audio_render_callback.h diff --git a/third_party/chromium/media/base/fake_audio_renderer_sink.cc b/media/base/fake_audio_renderer_sink.cc similarity index 100% rename from third_party/chromium/media/base/fake_audio_renderer_sink.cc rename to media/base/fake_audio_renderer_sink.cc diff --git a/third_party/chromium/media/base/fake_audio_renderer_sink.h b/media/base/fake_audio_renderer_sink.h similarity index 100% rename from third_party/chromium/media/base/fake_audio_renderer_sink.h rename to media/base/fake_audio_renderer_sink.h diff --git a/third_party/chromium/media/base/fake_audio_worker.cc b/media/base/fake_audio_worker.cc similarity index 100% rename from third_party/chromium/media/base/fake_audio_worker.cc rename to media/base/fake_audio_worker.cc diff --git a/third_party/chromium/media/base/fake_audio_worker.h b/media/base/fake_audio_worker.h similarity index 100% rename from third_party/chromium/media/base/fake_audio_worker.h rename to media/base/fake_audio_worker.h diff --git a/third_party/chromium/media/base/fake_audio_worker_unittest.cc b/media/base/fake_audio_worker_unittest.cc similarity index 100% rename from third_party/chromium/media/base/fake_audio_worker_unittest.cc rename to media/base/fake_audio_worker_unittest.cc diff --git a/third_party/chromium/media/base/fake_demuxer_stream.cc b/media/base/fake_demuxer_stream.cc similarity index 100% rename from third_party/chromium/media/base/fake_demuxer_stream.cc rename to media/base/fake_demuxer_stream.cc diff --git a/third_party/chromium/media/base/fake_demuxer_stream.h b/media/base/fake_demuxer_stream.h similarity index 100% rename from third_party/chromium/media/base/fake_demuxer_stream.h rename to media/base/fake_demuxer_stream.h diff --git a/third_party/chromium/media/base/fake_demuxer_stream_unittest.cc b/media/base/fake_demuxer_stream_unittest.cc similarity index 100% rename from third_party/chromium/media/base/fake_demuxer_stream_unittest.cc rename to media/base/fake_demuxer_stream_unittest.cc diff --git a/third_party/chromium/media/base/fake_localized_strings.cc b/media/base/fake_localized_strings.cc similarity index 100% rename from third_party/chromium/media/base/fake_localized_strings.cc rename to media/base/fake_localized_strings.cc diff --git a/third_party/chromium/media/base/fake_localized_strings.h b/media/base/fake_localized_strings.h similarity index 100% rename from third_party/chromium/media/base/fake_localized_strings.h rename to media/base/fake_localized_strings.h diff --git a/third_party/chromium/media/base/fake_single_thread_task_runner.cc b/media/base/fake_single_thread_task_runner.cc similarity index 100% rename from third_party/chromium/media/base/fake_single_thread_task_runner.cc rename to media/base/fake_single_thread_task_runner.cc diff --git a/third_party/chromium/media/base/fake_single_thread_task_runner.h b/media/base/fake_single_thread_task_runner.h similarity index 100% rename from third_party/chromium/media/base/fake_single_thread_task_runner.h rename to media/base/fake_single_thread_task_runner.h diff --git a/third_party/chromium/media/base/fake_text_track_stream.cc b/media/base/fake_text_track_stream.cc similarity index 100% rename from third_party/chromium/media/base/fake_text_track_stream.cc rename to media/base/fake_text_track_stream.cc diff --git a/third_party/chromium/media/base/fake_text_track_stream.h b/media/base/fake_text_track_stream.h similarity index 100% rename from third_party/chromium/media/base/fake_text_track_stream.h rename to media/base/fake_text_track_stream.h diff --git a/third_party/chromium/media/base/feedback_signal_accumulator.h b/media/base/feedback_signal_accumulator.h similarity index 100% rename from third_party/chromium/media/base/feedback_signal_accumulator.h rename to media/base/feedback_signal_accumulator.h diff --git a/third_party/chromium/media/base/feedback_signal_accumulator_unittest.cc b/media/base/feedback_signal_accumulator_unittest.cc similarity index 100% rename from third_party/chromium/media/base/feedback_signal_accumulator_unittest.cc rename to media/base/feedback_signal_accumulator_unittest.cc diff --git a/third_party/chromium/media/base/flinging_controller.h b/media/base/flinging_controller.h similarity index 100% rename from third_party/chromium/media/base/flinging_controller.h rename to media/base/flinging_controller.h diff --git a/third_party/chromium/media/base/format_utils.cc b/media/base/format_utils.cc similarity index 100% rename from third_party/chromium/media/base/format_utils.cc rename to media/base/format_utils.cc diff --git a/third_party/chromium/media/base/format_utils.h b/media/base/format_utils.h similarity index 100% rename from third_party/chromium/media/base/format_utils.h rename to media/base/format_utils.h diff --git a/third_party/chromium/media/base/frame_rate_estimator.cc b/media/base/frame_rate_estimator.cc similarity index 100% rename from third_party/chromium/media/base/frame_rate_estimator.cc rename to media/base/frame_rate_estimator.cc diff --git a/third_party/chromium/media/base/frame_rate_estimator.h b/media/base/frame_rate_estimator.h similarity index 100% rename from third_party/chromium/media/base/frame_rate_estimator.h rename to media/base/frame_rate_estimator.h diff --git a/third_party/chromium/media/base/frame_rate_estimator_unittest.cc b/media/base/frame_rate_estimator_unittest.cc similarity index 100% rename from third_party/chromium/media/base/frame_rate_estimator_unittest.cc rename to media/base/frame_rate_estimator_unittest.cc diff --git a/third_party/chromium/media/base/ipc/BUILD.gn b/media/base/ipc/BUILD.gn similarity index 100% rename from third_party/chromium/media/base/ipc/BUILD.gn rename to media/base/ipc/BUILD.gn diff --git a/third_party/chromium/media/base/ipc/DEPS b/media/base/ipc/DEPS similarity index 100% rename from third_party/chromium/media/base/ipc/DEPS rename to media/base/ipc/DEPS diff --git a/third_party/chromium/media/base/ipc/OWNERS b/media/base/ipc/OWNERS similarity index 100% rename from third_party/chromium/media/base/ipc/OWNERS rename to media/base/ipc/OWNERS diff --git a/third_party/chromium/media/base/ipc/media_param_traits.cc b/media/base/ipc/media_param_traits.cc similarity index 100% rename from third_party/chromium/media/base/ipc/media_param_traits.cc rename to media/base/ipc/media_param_traits.cc diff --git a/third_party/chromium/media/base/ipc/media_param_traits.h b/media/base/ipc/media_param_traits.h similarity index 100% rename from third_party/chromium/media/base/ipc/media_param_traits.h rename to media/base/ipc/media_param_traits.h diff --git a/third_party/chromium/media/base/ipc/media_param_traits_macros.h b/media/base/ipc/media_param_traits_macros.h similarity index 100% rename from third_party/chromium/media/base/ipc/media_param_traits_macros.h rename to media/base/ipc/media_param_traits_macros.h diff --git a/third_party/chromium/media/base/key_system_names.cc b/media/base/key_system_names.cc similarity index 100% rename from third_party/chromium/media/base/key_system_names.cc rename to media/base/key_system_names.cc diff --git a/third_party/chromium/media/base/key_system_names.h b/media/base/key_system_names.h similarity index 100% rename from third_party/chromium/media/base/key_system_names.h rename to media/base/key_system_names.h diff --git a/third_party/chromium/media/base/key_system_properties.cc b/media/base/key_system_properties.cc similarity index 100% rename from third_party/chromium/media/base/key_system_properties.cc rename to media/base/key_system_properties.cc diff --git a/third_party/chromium/media/base/key_system_properties.h b/media/base/key_system_properties.h similarity index 100% rename from third_party/chromium/media/base/key_system_properties.h rename to media/base/key_system_properties.h diff --git a/third_party/chromium/media/base/key_systems.cc b/media/base/key_systems.cc similarity index 100% rename from third_party/chromium/media/base/key_systems.cc rename to media/base/key_systems.cc diff --git a/third_party/chromium/media/base/key_systems.h b/media/base/key_systems.h similarity index 100% rename from third_party/chromium/media/base/key_systems.h rename to media/base/key_systems.h diff --git a/third_party/chromium/media/base/key_systems_unittest.cc b/media/base/key_systems_unittest.cc similarity index 100% rename from third_party/chromium/media/base/key_systems_unittest.cc rename to media/base/key_systems_unittest.cc diff --git a/third_party/chromium/media/base/limits.h b/media/base/limits.h similarity index 100% rename from third_party/chromium/media/base/limits.h rename to media/base/limits.h diff --git a/third_party/chromium/media/base/localized_strings.cc b/media/base/localized_strings.cc similarity index 100% rename from third_party/chromium/media/base/localized_strings.cc rename to media/base/localized_strings.cc diff --git a/third_party/chromium/media/base/localized_strings.h b/media/base/localized_strings.h similarity index 100% rename from third_party/chromium/media/base/localized_strings.h rename to media/base/localized_strings.h diff --git a/third_party/chromium/media/base/logging_override_if_enabled.h b/media/base/logging_override_if_enabled.h similarity index 100% rename from third_party/chromium/media/base/logging_override_if_enabled.h rename to media/base/logging_override_if_enabled.h diff --git a/third_party/chromium/media/base/loopback_audio_converter.cc b/media/base/loopback_audio_converter.cc similarity index 100% rename from third_party/chromium/media/base/loopback_audio_converter.cc rename to media/base/loopback_audio_converter.cc diff --git a/third_party/chromium/media/base/loopback_audio_converter.h b/media/base/loopback_audio_converter.h similarity index 100% rename from third_party/chromium/media/base/loopback_audio_converter.h rename to media/base/loopback_audio_converter.h diff --git a/third_party/chromium/media/base/mac/BUILD.gn b/media/base/mac/BUILD.gn similarity index 100% rename from third_party/chromium/media/base/mac/BUILD.gn rename to media/base/mac/BUILD.gn diff --git a/third_party/chromium/media/base/mac/audio_latency_mac.cc b/media/base/mac/audio_latency_mac.cc similarity index 100% rename from third_party/chromium/media/base/mac/audio_latency_mac.cc rename to media/base/mac/audio_latency_mac.cc diff --git a/third_party/chromium/media/base/mac/audio_latency_mac.h b/media/base/mac/audio_latency_mac.h similarity index 100% rename from third_party/chromium/media/base/mac/audio_latency_mac.h rename to media/base/mac/audio_latency_mac.h diff --git a/third_party/chromium/media/base/mac/color_space_util_mac.h b/media/base/mac/color_space_util_mac.h similarity index 100% rename from third_party/chromium/media/base/mac/color_space_util_mac.h rename to media/base/mac/color_space_util_mac.h diff --git a/third_party/chromium/media/base/mac/color_space_util_mac.mm b/media/base/mac/color_space_util_mac.mm similarity index 100% rename from third_party/chromium/media/base/mac/color_space_util_mac.mm rename to media/base/mac/color_space_util_mac.mm diff --git a/third_party/chromium/media/base/mac/video_frame_mac.cc b/media/base/mac/video_frame_mac.cc similarity index 100% rename from third_party/chromium/media/base/mac/video_frame_mac.cc rename to media/base/mac/video_frame_mac.cc diff --git a/third_party/chromium/media/base/mac/video_frame_mac.h b/media/base/mac/video_frame_mac.h similarity index 100% rename from third_party/chromium/media/base/mac/video_frame_mac.h rename to media/base/mac/video_frame_mac.h diff --git a/third_party/chromium/media/base/mac/video_frame_mac_unittests.cc b/media/base/mac/video_frame_mac_unittests.cc similarity index 100% rename from third_party/chromium/media/base/mac/video_frame_mac_unittests.cc rename to media/base/mac/video_frame_mac_unittests.cc diff --git a/third_party/chromium/media/base/mac/videotoolbox_helpers.cc b/media/base/mac/videotoolbox_helpers.cc similarity index 100% rename from third_party/chromium/media/base/mac/videotoolbox_helpers.cc rename to media/base/mac/videotoolbox_helpers.cc diff --git a/third_party/chromium/media/base/mac/videotoolbox_helpers.h b/media/base/mac/videotoolbox_helpers.h similarity index 100% rename from third_party/chromium/media/base/mac/videotoolbox_helpers.h rename to media/base/mac/videotoolbox_helpers.h diff --git a/third_party/chromium/media/base/media.cc b/media/base/media.cc similarity index 100% rename from third_party/chromium/media/base/media.cc rename to media/base/media.cc diff --git a/third_party/chromium/media/base/media.h b/media/base/media.h similarity index 100% rename from third_party/chromium/media/base/media.h rename to media/base/media.h diff --git a/third_party/chromium/media/base/media_client.cc b/media/base/media_client.cc similarity index 100% rename from third_party/chromium/media/base/media_client.cc rename to media/base/media_client.cc diff --git a/third_party/chromium/media/base/media_client.h b/media/base/media_client.h similarity index 100% rename from third_party/chromium/media/base/media_client.h rename to media/base/media_client.h diff --git a/third_party/chromium/media/base/media_content_type.cc b/media/base/media_content_type.cc similarity index 100% rename from third_party/chromium/media/base/media_content_type.cc rename to media/base/media_content_type.cc diff --git a/third_party/chromium/media/base/media_content_type.h b/media/base/media_content_type.h similarity index 100% rename from third_party/chromium/media/base/media_content_type.h rename to media/base/media_content_type.h diff --git a/third_party/chromium/media/base/media_controller.h b/media/base/media_controller.h similarity index 100% rename from third_party/chromium/media/base/media_controller.h rename to media/base/media_controller.h diff --git a/third_party/chromium/media/base/media_drm_key_type.h b/media/base/media_drm_key_type.h similarity index 100% rename from third_party/chromium/media/base/media_drm_key_type.h rename to media/base/media_drm_key_type.h diff --git a/third_party/chromium/media/base/media_drm_storage.cc b/media/base/media_drm_storage.cc similarity index 100% rename from third_party/chromium/media/base/media_drm_storage.cc rename to media/base/media_drm_storage.cc diff --git a/third_party/chromium/media/base/media_drm_storage.h b/media/base/media_drm_storage.h similarity index 100% rename from third_party/chromium/media/base/media_drm_storage.h rename to media/base/media_drm_storage.h diff --git a/third_party/chromium/media/base/media_export.h b/media/base/media_export.h similarity index 100% rename from third_party/chromium/media/base/media_export.h rename to media/base/media_export.h diff --git a/third_party/chromium/media/base/media_log.cc b/media/base/media_log.cc similarity index 100% rename from third_party/chromium/media/base/media_log.cc rename to media/base/media_log.cc diff --git a/third_party/chromium/media/base/media_log.h b/media/base/media_log.h similarity index 100% rename from third_party/chromium/media/base/media_log.h rename to media/base/media_log.h diff --git a/third_party/chromium/media/base/media_log_events.cc b/media/base/media_log_events.cc similarity index 100% rename from third_party/chromium/media/base/media_log_events.cc rename to media/base/media_log_events.cc diff --git a/third_party/chromium/media/base/media_log_events.h b/media/base/media_log_events.h similarity index 100% rename from third_party/chromium/media/base/media_log_events.h rename to media/base/media_log_events.h diff --git a/third_party/chromium/media/base/media_log_message_levels.cc b/media/base/media_log_message_levels.cc similarity index 100% rename from third_party/chromium/media/base/media_log_message_levels.cc rename to media/base/media_log_message_levels.cc diff --git a/third_party/chromium/media/base/media_log_message_levels.h b/media/base/media_log_message_levels.h similarity index 100% rename from third_party/chromium/media/base/media_log_message_levels.h rename to media/base/media_log_message_levels.h diff --git a/third_party/chromium/media/base/media_log_properties.cc b/media/base/media_log_properties.cc similarity index 100% rename from third_party/chromium/media/base/media_log_properties.cc rename to media/base/media_log_properties.cc diff --git a/third_party/chromium/media/base/media_log_properties.h b/media/base/media_log_properties.h similarity index 100% rename from third_party/chromium/media/base/media_log_properties.h rename to media/base/media_log_properties.h diff --git a/third_party/chromium/media/base/media_log_record.h b/media/base/media_log_record.h similarity index 100% rename from third_party/chromium/media/base/media_log_record.h rename to media/base/media_log_record.h diff --git a/third_party/chromium/media/base/media_log_type_enforcement.h b/media/base/media_log_type_enforcement.h similarity index 100% rename from third_party/chromium/media/base/media_log_type_enforcement.h rename to media/base/media_log_type_enforcement.h diff --git a/third_party/chromium/media/base/media_log_unittest.cc b/media/base/media_log_unittest.cc similarity index 100% rename from third_party/chromium/media/base/media_log_unittest.cc rename to media/base/media_log_unittest.cc diff --git a/third_party/chromium/media/base/media_observer.cc b/media/base/media_observer.cc similarity index 100% rename from third_party/chromium/media/base/media_observer.cc rename to media/base/media_observer.cc diff --git a/third_party/chromium/media/base/media_observer.h b/media/base/media_observer.h similarity index 100% rename from third_party/chromium/media/base/media_observer.h rename to media/base/media_observer.h diff --git a/third_party/chromium/media/base/media_permission.cc b/media/base/media_permission.cc similarity index 100% rename from third_party/chromium/media/base/media_permission.cc rename to media/base/media_permission.cc diff --git a/third_party/chromium/media/base/media_permission.h b/media/base/media_permission.h similarity index 100% rename from third_party/chromium/media/base/media_permission.h rename to media/base/media_permission.h diff --git a/third_party/chromium/media/base/media_resource.cc b/media/base/media_resource.cc similarity index 100% rename from third_party/chromium/media/base/media_resource.cc rename to media/base/media_resource.cc diff --git a/third_party/chromium/media/base/media_resource.h b/media/base/media_resource.h similarity index 100% rename from third_party/chromium/media/base/media_resource.h rename to media/base/media_resource.h diff --git a/third_party/chromium/media/base/media_serializers.h b/media/base/media_serializers.h similarity index 100% rename from third_party/chromium/media/base/media_serializers.h rename to media/base/media_serializers.h diff --git a/third_party/chromium/media/base/media_serializers_base.h b/media/base/media_serializers_base.h similarity index 100% rename from third_party/chromium/media/base/media_serializers_base.h rename to media/base/media_serializers_base.h diff --git a/third_party/chromium/media/base/media_serializers_unittest.cc b/media/base/media_serializers_unittest.cc similarity index 100% rename from third_party/chromium/media/base/media_serializers_unittest.cc rename to media/base/media_serializers_unittest.cc diff --git a/third_party/chromium/media/base/media_shmem_export.h b/media/base/media_shmem_export.h similarity index 100% rename from third_party/chromium/media/base/media_shmem_export.h rename to media/base/media_shmem_export.h diff --git a/third_party/chromium/media/base/media_status.cc b/media/base/media_status.cc similarity index 100% rename from third_party/chromium/media/base/media_status.cc rename to media/base/media_status.cc diff --git a/third_party/chromium/media/base/media_status.h b/media/base/media_status.h similarity index 100% rename from third_party/chromium/media/base/media_status.h rename to media/base/media_status.h diff --git a/third_party/chromium/media/base/media_status_observer.h b/media/base/media_status_observer.h similarity index 100% rename from third_party/chromium/media/base/media_status_observer.h rename to media/base/media_status_observer.h diff --git a/third_party/chromium/media/base/media_switches.cc b/media/base/media_switches.cc similarity index 100% rename from third_party/chromium/media/base/media_switches.cc rename to media/base/media_switches.cc diff --git a/third_party/chromium/media/base/media_switches.h b/media/base/media_switches.h similarity index 100% rename from third_party/chromium/media/base/media_switches.h rename to media/base/media_switches.h diff --git a/third_party/chromium/media/base/media_track.cc b/media/base/media_track.cc similarity index 100% rename from third_party/chromium/media/base/media_track.cc rename to media/base/media_track.cc diff --git a/third_party/chromium/media/base/media_track.h b/media/base/media_track.h similarity index 100% rename from third_party/chromium/media/base/media_track.h rename to media/base/media_track.h diff --git a/third_party/chromium/media/base/media_tracks.cc b/media/base/media_tracks.cc similarity index 100% rename from third_party/chromium/media/base/media_tracks.cc rename to media/base/media_tracks.cc diff --git a/third_party/chromium/media/base/media_tracks.h b/media/base/media_tracks.h similarity index 100% rename from third_party/chromium/media/base/media_tracks.h rename to media/base/media_tracks.h diff --git a/third_party/chromium/media/base/media_types.cc b/media/base/media_types.cc similarity index 100% rename from third_party/chromium/media/base/media_types.cc rename to media/base/media_types.cc diff --git a/third_party/chromium/media/base/media_types.h b/media/base/media_types.h similarity index 100% rename from third_party/chromium/media/base/media_types.h rename to media/base/media_types.h diff --git a/third_party/chromium/media/base/media_url_demuxer.cc b/media/base/media_url_demuxer.cc similarity index 100% rename from third_party/chromium/media/base/media_url_demuxer.cc rename to media/base/media_url_demuxer.cc diff --git a/third_party/chromium/media/base/media_url_demuxer.h b/media/base/media_url_demuxer.h similarity index 100% rename from third_party/chromium/media/base/media_url_demuxer.h rename to media/base/media_url_demuxer.h diff --git a/third_party/chromium/media/base/media_url_demuxer_unittest.cc b/media/base/media_url_demuxer_unittest.cc similarity index 100% rename from third_party/chromium/media/base/media_url_demuxer_unittest.cc rename to media/base/media_url_demuxer_unittest.cc diff --git a/third_party/chromium/media/base/media_url_params.cc b/media/base/media_url_params.cc similarity index 100% rename from third_party/chromium/media/base/media_url_params.cc rename to media/base/media_url_params.cc diff --git a/third_party/chromium/media/base/media_url_params.h b/media/base/media_url_params.h similarity index 100% rename from third_party/chromium/media/base/media_url_params.h rename to media/base/media_url_params.h diff --git a/third_party/chromium/media/base/media_util.cc b/media/base/media_util.cc similarity index 100% rename from third_party/chromium/media/base/media_util.cc rename to media/base/media_util.cc diff --git a/third_party/chromium/media/base/media_util.h b/media/base/media_util.h similarity index 100% rename from third_party/chromium/media/base/media_util.h rename to media/base/media_util.h diff --git a/third_party/chromium/media/base/memory_dump_provider_proxy.cc b/media/base/memory_dump_provider_proxy.cc similarity index 100% rename from third_party/chromium/media/base/memory_dump_provider_proxy.cc rename to media/base/memory_dump_provider_proxy.cc diff --git a/third_party/chromium/media/base/memory_dump_provider_proxy.h b/media/base/memory_dump_provider_proxy.h similarity index 100% rename from third_party/chromium/media/base/memory_dump_provider_proxy.h rename to media/base/memory_dump_provider_proxy.h diff --git a/third_party/chromium/media/base/mime_util.cc b/media/base/mime_util.cc similarity index 100% rename from third_party/chromium/media/base/mime_util.cc rename to media/base/mime_util.cc diff --git a/third_party/chromium/media/base/mime_util.h b/media/base/mime_util.h similarity index 100% rename from third_party/chromium/media/base/mime_util.h rename to media/base/mime_util.h diff --git a/third_party/chromium/media/base/mime_util_internal.cc b/media/base/mime_util_internal.cc similarity index 100% rename from third_party/chromium/media/base/mime_util_internal.cc rename to media/base/mime_util_internal.cc diff --git a/third_party/chromium/media/base/mime_util_internal.h b/media/base/mime_util_internal.h similarity index 100% rename from third_party/chromium/media/base/mime_util_internal.h rename to media/base/mime_util_internal.h diff --git a/third_party/chromium/media/base/mime_util_unittest.cc b/media/base/mime_util_unittest.cc similarity index 100% rename from third_party/chromium/media/base/mime_util_unittest.cc rename to media/base/mime_util_unittest.cc diff --git a/third_party/chromium/media/base/mock_audio_renderer_sink.cc b/media/base/mock_audio_renderer_sink.cc similarity index 100% rename from third_party/chromium/media/base/mock_audio_renderer_sink.cc rename to media/base/mock_audio_renderer_sink.cc diff --git a/third_party/chromium/media/base/mock_audio_renderer_sink.h b/media/base/mock_audio_renderer_sink.h similarity index 100% rename from third_party/chromium/media/base/mock_audio_renderer_sink.h rename to media/base/mock_audio_renderer_sink.h diff --git a/third_party/chromium/media/base/mock_demuxer_host.cc b/media/base/mock_demuxer_host.cc similarity index 100% rename from third_party/chromium/media/base/mock_demuxer_host.cc rename to media/base/mock_demuxer_host.cc diff --git a/third_party/chromium/media/base/mock_demuxer_host.h b/media/base/mock_demuxer_host.h similarity index 100% rename from third_party/chromium/media/base/mock_demuxer_host.h rename to media/base/mock_demuxer_host.h diff --git a/third_party/chromium/media/base/mock_filters.cc b/media/base/mock_filters.cc similarity index 100% rename from third_party/chromium/media/base/mock_filters.cc rename to media/base/mock_filters.cc diff --git a/third_party/chromium/media/base/mock_filters.h b/media/base/mock_filters.h similarity index 100% rename from third_party/chromium/media/base/mock_filters.h rename to media/base/mock_filters.h diff --git a/third_party/chromium/media/base/mock_media_log.cc b/media/base/mock_media_log.cc similarity index 100% rename from third_party/chromium/media/base/mock_media_log.cc rename to media/base/mock_media_log.cc diff --git a/third_party/chromium/media/base/mock_media_log.h b/media/base/mock_media_log.h similarity index 100% rename from third_party/chromium/media/base/mock_media_log.h rename to media/base/mock_media_log.h diff --git a/third_party/chromium/media/base/mock_video_renderer_sink.cc b/media/base/mock_video_renderer_sink.cc similarity index 100% rename from third_party/chromium/media/base/mock_video_renderer_sink.cc rename to media/base/mock_video_renderer_sink.cc diff --git a/third_party/chromium/media/base/mock_video_renderer_sink.h b/media/base/mock_video_renderer_sink.h similarity index 100% rename from third_party/chromium/media/base/mock_video_renderer_sink.h rename to media/base/mock_video_renderer_sink.h diff --git a/third_party/chromium/media/base/moving_average.cc b/media/base/moving_average.cc similarity index 100% rename from third_party/chromium/media/base/moving_average.cc rename to media/base/moving_average.cc diff --git a/third_party/chromium/media/base/moving_average.h b/media/base/moving_average.h similarity index 100% rename from third_party/chromium/media/base/moving_average.h rename to media/base/moving_average.h diff --git a/third_party/chromium/media/base/moving_average_unittest.cc b/media/base/moving_average_unittest.cc similarity index 100% rename from third_party/chromium/media/base/moving_average_unittest.cc rename to media/base/moving_average_unittest.cc diff --git a/third_party/chromium/media/base/multi_channel_resampler.cc b/media/base/multi_channel_resampler.cc similarity index 100% rename from third_party/chromium/media/base/multi_channel_resampler.cc rename to media/base/multi_channel_resampler.cc diff --git a/third_party/chromium/media/base/multi_channel_resampler.h b/media/base/multi_channel_resampler.h similarity index 100% rename from third_party/chromium/media/base/multi_channel_resampler.h rename to media/base/multi_channel_resampler.h diff --git a/third_party/chromium/media/base/multi_channel_resampler_unittest.cc b/media/base/multi_channel_resampler_unittest.cc similarity index 100% rename from third_party/chromium/media/base/multi_channel_resampler_unittest.cc rename to media/base/multi_channel_resampler_unittest.cc diff --git a/third_party/chromium/media/base/null_video_sink.cc b/media/base/null_video_sink.cc similarity index 100% rename from third_party/chromium/media/base/null_video_sink.cc rename to media/base/null_video_sink.cc diff --git a/third_party/chromium/media/base/null_video_sink.h b/media/base/null_video_sink.h similarity index 100% rename from third_party/chromium/media/base/null_video_sink.h rename to media/base/null_video_sink.h diff --git a/third_party/chromium/media/base/null_video_sink_unittest.cc b/media/base/null_video_sink_unittest.cc similarity index 100% rename from third_party/chromium/media/base/null_video_sink_unittest.cc rename to media/base/null_video_sink_unittest.cc diff --git a/third_party/chromium/media/base/offloading_audio_encoder.cc b/media/base/offloading_audio_encoder.cc similarity index 100% rename from third_party/chromium/media/base/offloading_audio_encoder.cc rename to media/base/offloading_audio_encoder.cc diff --git a/third_party/chromium/media/base/offloading_audio_encoder.h b/media/base/offloading_audio_encoder.h similarity index 100% rename from third_party/chromium/media/base/offloading_audio_encoder.h rename to media/base/offloading_audio_encoder.h diff --git a/third_party/chromium/media/base/offloading_audio_encoder_unittest.cc b/media/base/offloading_audio_encoder_unittest.cc similarity index 100% rename from third_party/chromium/media/base/offloading_audio_encoder_unittest.cc rename to media/base/offloading_audio_encoder_unittest.cc diff --git a/third_party/chromium/media/base/offloading_video_encoder.cc b/media/base/offloading_video_encoder.cc similarity index 100% rename from third_party/chromium/media/base/offloading_video_encoder.cc rename to media/base/offloading_video_encoder.cc diff --git a/third_party/chromium/media/base/offloading_video_encoder.h b/media/base/offloading_video_encoder.h similarity index 100% rename from third_party/chromium/media/base/offloading_video_encoder.h rename to media/base/offloading_video_encoder.h diff --git a/third_party/chromium/media/base/offloading_video_encoder_unittest.cc b/media/base/offloading_video_encoder_unittest.cc similarity index 100% rename from third_party/chromium/media/base/offloading_video_encoder_unittest.cc rename to media/base/offloading_video_encoder_unittest.cc diff --git a/third_party/chromium/media/base/output_device_info.cc b/media/base/output_device_info.cc similarity index 100% rename from third_party/chromium/media/base/output_device_info.cc rename to media/base/output_device_info.cc diff --git a/third_party/chromium/media/base/output_device_info.h b/media/base/output_device_info.h similarity index 100% rename from third_party/chromium/media/base/output_device_info.h rename to media/base/output_device_info.h diff --git a/third_party/chromium/media/base/overlay_info.cc b/media/base/overlay_info.cc similarity index 100% rename from third_party/chromium/media/base/overlay_info.cc rename to media/base/overlay_info.cc diff --git a/third_party/chromium/media/base/overlay_info.h b/media/base/overlay_info.h similarity index 100% rename from third_party/chromium/media/base/overlay_info.h rename to media/base/overlay_info.h diff --git a/third_party/chromium/media/base/pipeline.h b/media/base/pipeline.h similarity index 100% rename from third_party/chromium/media/base/pipeline.h rename to media/base/pipeline.h diff --git a/third_party/chromium/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc similarity index 100% rename from third_party/chromium/media/base/pipeline_impl.cc rename to media/base/pipeline_impl.cc diff --git a/third_party/chromium/media/base/pipeline_impl.h b/media/base/pipeline_impl.h similarity index 100% rename from third_party/chromium/media/base/pipeline_impl.h rename to media/base/pipeline_impl.h diff --git a/third_party/chromium/media/base/pipeline_impl_unittest.cc b/media/base/pipeline_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/base/pipeline_impl_unittest.cc rename to media/base/pipeline_impl_unittest.cc diff --git a/third_party/chromium/media/base/pipeline_metadata.cc b/media/base/pipeline_metadata.cc similarity index 100% rename from third_party/chromium/media/base/pipeline_metadata.cc rename to media/base/pipeline_metadata.cc diff --git a/third_party/chromium/media/base/pipeline_metadata.h b/media/base/pipeline_metadata.h similarity index 100% rename from third_party/chromium/media/base/pipeline_metadata.h rename to media/base/pipeline_metadata.h diff --git a/third_party/chromium/media/base/pipeline_status.cc b/media/base/pipeline_status.cc similarity index 100% rename from third_party/chromium/media/base/pipeline_status.cc rename to media/base/pipeline_status.cc diff --git a/third_party/chromium/media/base/pipeline_status.h b/media/base/pipeline_status.h similarity index 100% rename from third_party/chromium/media/base/pipeline_status.h rename to media/base/pipeline_status.h diff --git a/third_party/chromium/media/base/provision_fetcher.h b/media/base/provision_fetcher.h similarity index 100% rename from third_party/chromium/media/base/provision_fetcher.h rename to media/base/provision_fetcher.h diff --git a/third_party/chromium/media/base/ranges.cc b/media/base/ranges.cc similarity index 100% rename from third_party/chromium/media/base/ranges.cc rename to media/base/ranges.cc diff --git a/third_party/chromium/media/base/ranges.h b/media/base/ranges.h similarity index 100% rename from third_party/chromium/media/base/ranges.h rename to media/base/ranges.h diff --git a/third_party/chromium/media/base/ranges_unittest.cc b/media/base/ranges_unittest.cc similarity index 100% rename from third_party/chromium/media/base/ranges_unittest.cc rename to media/base/ranges_unittest.cc diff --git a/third_party/chromium/media/base/reentrancy_checker.cc b/media/base/reentrancy_checker.cc similarity index 100% rename from third_party/chromium/media/base/reentrancy_checker.cc rename to media/base/reentrancy_checker.cc diff --git a/third_party/chromium/media/base/reentrancy_checker.h b/media/base/reentrancy_checker.h similarity index 100% rename from third_party/chromium/media/base/reentrancy_checker.h rename to media/base/reentrancy_checker.h diff --git a/third_party/chromium/media/base/reentrancy_checker_unittest.cc b/media/base/reentrancy_checker_unittest.cc similarity index 100% rename from third_party/chromium/media/base/reentrancy_checker_unittest.cc rename to media/base/reentrancy_checker_unittest.cc diff --git a/third_party/chromium/media/base/renderer.cc b/media/base/renderer.cc similarity index 100% rename from third_party/chromium/media/base/renderer.cc rename to media/base/renderer.cc diff --git a/third_party/chromium/media/base/renderer.h b/media/base/renderer.h similarity index 100% rename from third_party/chromium/media/base/renderer.h rename to media/base/renderer.h diff --git a/third_party/chromium/media/base/renderer_client.cc b/media/base/renderer_client.cc similarity index 100% rename from third_party/chromium/media/base/renderer_client.cc rename to media/base/renderer_client.cc diff --git a/third_party/chromium/media/base/renderer_client.h b/media/base/renderer_client.h similarity index 100% rename from third_party/chromium/media/base/renderer_client.h rename to media/base/renderer_client.h diff --git a/third_party/chromium/media/base/renderer_factory.cc b/media/base/renderer_factory.cc similarity index 100% rename from third_party/chromium/media/base/renderer_factory.cc rename to media/base/renderer_factory.cc diff --git a/third_party/chromium/media/base/renderer_factory.h b/media/base/renderer_factory.h similarity index 100% rename from third_party/chromium/media/base/renderer_factory.h rename to media/base/renderer_factory.h diff --git a/third_party/chromium/media/base/renderer_factory_selector.cc b/media/base/renderer_factory_selector.cc similarity index 100% rename from third_party/chromium/media/base/renderer_factory_selector.cc rename to media/base/renderer_factory_selector.cc diff --git a/third_party/chromium/media/base/renderer_factory_selector.h b/media/base/renderer_factory_selector.h similarity index 100% rename from third_party/chromium/media/base/renderer_factory_selector.h rename to media/base/renderer_factory_selector.h diff --git a/third_party/chromium/media/base/renderer_factory_selector_unittest.cc b/media/base/renderer_factory_selector_unittest.cc similarity index 100% rename from third_party/chromium/media/base/renderer_factory_selector_unittest.cc rename to media/base/renderer_factory_selector_unittest.cc diff --git a/third_party/chromium/media/base/routing_token_callback.h b/media/base/routing_token_callback.h similarity index 100% rename from third_party/chromium/media/base/routing_token_callback.h rename to media/base/routing_token_callback.h diff --git a/third_party/chromium/media/base/run_all_perftests.cc b/media/base/run_all_perftests.cc similarity index 100% rename from third_party/chromium/media/base/run_all_perftests.cc rename to media/base/run_all_perftests.cc diff --git a/third_party/chromium/media/base/sample_format.cc b/media/base/sample_format.cc similarity index 100% rename from third_party/chromium/media/base/sample_format.cc rename to media/base/sample_format.cc diff --git a/third_party/chromium/media/base/sample_format.h b/media/base/sample_format.h similarity index 100% rename from third_party/chromium/media/base/sample_format.h rename to media/base/sample_format.h diff --git a/third_party/chromium/media/base/sample_rates.cc b/media/base/sample_rates.cc similarity index 100% rename from third_party/chromium/media/base/sample_rates.cc rename to media/base/sample_rates.cc diff --git a/third_party/chromium/media/base/sample_rates.h b/media/base/sample_rates.h similarity index 100% rename from third_party/chromium/media/base/sample_rates.h rename to media/base/sample_rates.h diff --git a/third_party/chromium/media/base/scoped_async_trace.cc b/media/base/scoped_async_trace.cc similarity index 100% rename from third_party/chromium/media/base/scoped_async_trace.cc rename to media/base/scoped_async_trace.cc diff --git a/third_party/chromium/media/base/scoped_async_trace.h b/media/base/scoped_async_trace.h similarity index 100% rename from third_party/chromium/media/base/scoped_async_trace.h rename to media/base/scoped_async_trace.h diff --git a/third_party/chromium/media/base/scopedfd_helper.cc b/media/base/scopedfd_helper.cc similarity index 100% rename from third_party/chromium/media/base/scopedfd_helper.cc rename to media/base/scopedfd_helper.cc diff --git a/third_party/chromium/media/base/scopedfd_helper.h b/media/base/scopedfd_helper.h similarity index 100% rename from third_party/chromium/media/base/scopedfd_helper.h rename to media/base/scopedfd_helper.h diff --git a/third_party/chromium/media/base/seekable_buffer.cc b/media/base/seekable_buffer.cc similarity index 100% rename from third_party/chromium/media/base/seekable_buffer.cc rename to media/base/seekable_buffer.cc diff --git a/third_party/chromium/media/base/seekable_buffer.h b/media/base/seekable_buffer.h similarity index 100% rename from third_party/chromium/media/base/seekable_buffer.h rename to media/base/seekable_buffer.h diff --git a/third_party/chromium/media/base/seekable_buffer_unittest.cc b/media/base/seekable_buffer_unittest.cc similarity index 100% rename from third_party/chromium/media/base/seekable_buffer_unittest.cc rename to media/base/seekable_buffer_unittest.cc diff --git a/third_party/chromium/media/base/serial_runner.cc b/media/base/serial_runner.cc similarity index 100% rename from third_party/chromium/media/base/serial_runner.cc rename to media/base/serial_runner.cc diff --git a/third_party/chromium/media/base/serial_runner.h b/media/base/serial_runner.h similarity index 100% rename from third_party/chromium/media/base/serial_runner.h rename to media/base/serial_runner.h diff --git a/third_party/chromium/media/base/serial_runner_unittest.cc b/media/base/serial_runner_unittest.cc similarity index 100% rename from third_party/chromium/media/base/serial_runner_unittest.cc rename to media/base/serial_runner_unittest.cc diff --git a/third_party/chromium/media/base/silent_sink_suspender.cc b/media/base/silent_sink_suspender.cc similarity index 100% rename from third_party/chromium/media/base/silent_sink_suspender.cc rename to media/base/silent_sink_suspender.cc diff --git a/third_party/chromium/media/base/silent_sink_suspender.h b/media/base/silent_sink_suspender.h similarity index 100% rename from third_party/chromium/media/base/silent_sink_suspender.h rename to media/base/silent_sink_suspender.h diff --git a/third_party/chromium/media/base/silent_sink_suspender_unittest.cc b/media/base/silent_sink_suspender_unittest.cc similarity index 100% rename from third_party/chromium/media/base/silent_sink_suspender_unittest.cc rename to media/base/silent_sink_suspender_unittest.cc diff --git a/third_party/chromium/media/base/simple_sync_token_client.cc b/media/base/simple_sync_token_client.cc similarity index 100% rename from third_party/chromium/media/base/simple_sync_token_client.cc rename to media/base/simple_sync_token_client.cc diff --git a/third_party/chromium/media/base/simple_sync_token_client.h b/media/base/simple_sync_token_client.h similarity index 100% rename from third_party/chromium/media/base/simple_sync_token_client.h rename to media/base/simple_sync_token_client.h diff --git a/third_party/chromium/media/base/simple_watch_timer.cc b/media/base/simple_watch_timer.cc similarity index 100% rename from third_party/chromium/media/base/simple_watch_timer.cc rename to media/base/simple_watch_timer.cc diff --git a/third_party/chromium/media/base/simple_watch_timer.h b/media/base/simple_watch_timer.h similarity index 100% rename from third_party/chromium/media/base/simple_watch_timer.h rename to media/base/simple_watch_timer.h diff --git a/third_party/chromium/media/base/sinc_resampler.cc b/media/base/sinc_resampler.cc similarity index 100% rename from third_party/chromium/media/base/sinc_resampler.cc rename to media/base/sinc_resampler.cc diff --git a/third_party/chromium/media/base/sinc_resampler.h b/media/base/sinc_resampler.h similarity index 100% rename from third_party/chromium/media/base/sinc_resampler.h rename to media/base/sinc_resampler.h diff --git a/third_party/chromium/media/base/sinc_resampler_perftest.cc b/media/base/sinc_resampler_perftest.cc similarity index 100% rename from third_party/chromium/media/base/sinc_resampler_perftest.cc rename to media/base/sinc_resampler_perftest.cc diff --git a/third_party/chromium/media/base/sinc_resampler_unittest.cc b/media/base/sinc_resampler_unittest.cc similarity index 100% rename from third_party/chromium/media/base/sinc_resampler_unittest.cc rename to media/base/sinc_resampler_unittest.cc diff --git a/third_party/chromium/media/base/speech_recognition_client.h b/media/base/speech_recognition_client.h similarity index 100% rename from third_party/chromium/media/base/speech_recognition_client.h rename to media/base/speech_recognition_client.h diff --git a/third_party/chromium/media/base/starboard_utils.cc b/media/base/starboard_utils.cc similarity index 100% rename from third_party/chromium/media/base/starboard_utils.cc rename to media/base/starboard_utils.cc diff --git a/third_party/chromium/media/base/starboard_utils.h b/media/base/starboard_utils.h similarity index 100% rename from third_party/chromium/media/base/starboard_utils.h rename to media/base/starboard_utils.h diff --git a/third_party/chromium/media/base/starboard_utils_test.cc b/media/base/starboard_utils_test.cc similarity index 100% rename from third_party/chromium/media/base/starboard_utils_test.cc rename to media/base/starboard_utils_test.cc diff --git a/third_party/chromium/media/base/status.cc b/media/base/status.cc similarity index 100% rename from third_party/chromium/media/base/status.cc rename to media/base/status.cc diff --git a/third_party/chromium/media/base/status.h b/media/base/status.h similarity index 100% rename from third_party/chromium/media/base/status.h rename to media/base/status.h diff --git a/third_party/chromium/media/base/status.md b/media/base/status.md similarity index 100% rename from third_party/chromium/media/base/status.md rename to media/base/status.md diff --git a/third_party/chromium/media/base/status_codes.cc b/media/base/status_codes.cc similarity index 100% rename from third_party/chromium/media/base/status_codes.cc rename to media/base/status_codes.cc diff --git a/third_party/chromium/media/base/status_codes.h b/media/base/status_codes.h similarity index 100% rename from third_party/chromium/media/base/status_codes.h rename to media/base/status_codes.h diff --git a/third_party/chromium/media/base/status_unittest.cc b/media/base/status_unittest.cc similarity index 100% rename from third_party/chromium/media/base/status_unittest.cc rename to media/base/status_unittest.cc diff --git a/third_party/chromium/media/base/stream_parser.cc b/media/base/stream_parser.cc similarity index 100% rename from third_party/chromium/media/base/stream_parser.cc rename to media/base/stream_parser.cc diff --git a/third_party/chromium/media/base/stream_parser.h b/media/base/stream_parser.h similarity index 100% rename from third_party/chromium/media/base/stream_parser.h rename to media/base/stream_parser.h diff --git a/third_party/chromium/media/base/stream_parser_buffer.cc b/media/base/stream_parser_buffer.cc similarity index 100% rename from third_party/chromium/media/base/stream_parser_buffer.cc rename to media/base/stream_parser_buffer.cc diff --git a/third_party/chromium/media/base/stream_parser_buffer.h b/media/base/stream_parser_buffer.h similarity index 100% rename from third_party/chromium/media/base/stream_parser_buffer.h rename to media/base/stream_parser_buffer.h diff --git a/third_party/chromium/media/base/stream_parser_unittest.cc b/media/base/stream_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/base/stream_parser_unittest.cc rename to media/base/stream_parser_unittest.cc diff --git a/third_party/chromium/media/base/subsample_entry.cc b/media/base/subsample_entry.cc similarity index 100% rename from third_party/chromium/media/base/subsample_entry.cc rename to media/base/subsample_entry.cc diff --git a/third_party/chromium/media/base/subsample_entry.h b/media/base/subsample_entry.h similarity index 100% rename from third_party/chromium/media/base/subsample_entry.h rename to media/base/subsample_entry.h diff --git a/third_party/chromium/media/base/subsample_entry_unittest.cc b/media/base/subsample_entry_unittest.cc similarity index 100% rename from third_party/chromium/media/base/subsample_entry_unittest.cc rename to media/base/subsample_entry_unittest.cc diff --git a/third_party/chromium/media/base/supported_types.cc b/media/base/supported_types.cc similarity index 100% rename from third_party/chromium/media/base/supported_types.cc rename to media/base/supported_types.cc diff --git a/third_party/chromium/media/base/supported_types.h b/media/base/supported_types.h similarity index 100% rename from third_party/chromium/media/base/supported_types.h rename to media/base/supported_types.h diff --git a/third_party/chromium/media/base/supported_types_unittest.cc b/media/base/supported_types_unittest.cc similarity index 100% rename from third_party/chromium/media/base/supported_types_unittest.cc rename to media/base/supported_types_unittest.cc diff --git a/third_party/chromium/media/base/supported_video_decoder_config.cc b/media/base/supported_video_decoder_config.cc similarity index 100% rename from third_party/chromium/media/base/supported_video_decoder_config.cc rename to media/base/supported_video_decoder_config.cc diff --git a/third_party/chromium/media/base/supported_video_decoder_config.h b/media/base/supported_video_decoder_config.h similarity index 100% rename from third_party/chromium/media/base/supported_video_decoder_config.h rename to media/base/supported_video_decoder_config.h diff --git a/third_party/chromium/media/base/supported_video_decoder_config_unittest.cc b/media/base/supported_video_decoder_config_unittest.cc similarity index 100% rename from third_party/chromium/media/base/supported_video_decoder_config_unittest.cc rename to media/base/supported_video_decoder_config_unittest.cc diff --git a/third_party/chromium/media/base/svc_scalability_mode.cc b/media/base/svc_scalability_mode.cc similarity index 100% rename from third_party/chromium/media/base/svc_scalability_mode.cc rename to media/base/svc_scalability_mode.cc diff --git a/third_party/chromium/media/base/svc_scalability_mode.h b/media/base/svc_scalability_mode.h similarity index 100% rename from third_party/chromium/media/base/svc_scalability_mode.h rename to media/base/svc_scalability_mode.h diff --git a/third_party/chromium/media/base/test_data_util.cc b/media/base/test_data_util.cc similarity index 100% rename from third_party/chromium/media/base/test_data_util.cc rename to media/base/test_data_util.cc diff --git a/third_party/chromium/media/base/test_data_util.h b/media/base/test_data_util.h similarity index 100% rename from third_party/chromium/media/base/test_data_util.h rename to media/base/test_data_util.h diff --git a/third_party/chromium/media/base/test_helpers.cc b/media/base/test_helpers.cc similarity index 100% rename from third_party/chromium/media/base/test_helpers.cc rename to media/base/test_helpers.cc diff --git a/third_party/chromium/media/base/test_helpers.h b/media/base/test_helpers.h similarity index 100% rename from third_party/chromium/media/base/test_helpers.h rename to media/base/test_helpers.h diff --git a/third_party/chromium/media/base/test_random.h b/media/base/test_random.h similarity index 100% rename from third_party/chromium/media/base/test_random.h rename to media/base/test_random.h diff --git a/third_party/chromium/media/base/text_cue.cc b/media/base/text_cue.cc similarity index 100% rename from third_party/chromium/media/base/text_cue.cc rename to media/base/text_cue.cc diff --git a/third_party/chromium/media/base/text_cue.h b/media/base/text_cue.h similarity index 100% rename from third_party/chromium/media/base/text_cue.h rename to media/base/text_cue.h diff --git a/third_party/chromium/media/base/text_ranges.cc b/media/base/text_ranges.cc similarity index 100% rename from third_party/chromium/media/base/text_ranges.cc rename to media/base/text_ranges.cc diff --git a/third_party/chromium/media/base/text_ranges.h b/media/base/text_ranges.h similarity index 100% rename from third_party/chromium/media/base/text_ranges.h rename to media/base/text_ranges.h diff --git a/third_party/chromium/media/base/text_ranges_unittest.cc b/media/base/text_ranges_unittest.cc similarity index 100% rename from third_party/chromium/media/base/text_ranges_unittest.cc rename to media/base/text_ranges_unittest.cc diff --git a/third_party/chromium/media/base/text_renderer.cc b/media/base/text_renderer.cc similarity index 100% rename from third_party/chromium/media/base/text_renderer.cc rename to media/base/text_renderer.cc diff --git a/third_party/chromium/media/base/text_renderer.h b/media/base/text_renderer.h similarity index 100% rename from third_party/chromium/media/base/text_renderer.h rename to media/base/text_renderer.h diff --git a/third_party/chromium/media/base/text_renderer_unittest.cc b/media/base/text_renderer_unittest.cc similarity index 100% rename from third_party/chromium/media/base/text_renderer_unittest.cc rename to media/base/text_renderer_unittest.cc diff --git a/third_party/chromium/media/base/text_track.h b/media/base/text_track.h similarity index 100% rename from third_party/chromium/media/base/text_track.h rename to media/base/text_track.h diff --git a/third_party/chromium/media/base/text_track_config.cc b/media/base/text_track_config.cc similarity index 100% rename from third_party/chromium/media/base/text_track_config.cc rename to media/base/text_track_config.cc diff --git a/third_party/chromium/media/base/text_track_config.h b/media/base/text_track_config.h similarity index 100% rename from third_party/chromium/media/base/text_track_config.h rename to media/base/text_track_config.h diff --git a/third_party/chromium/media/base/time_delta_interpolator.cc b/media/base/time_delta_interpolator.cc similarity index 100% rename from third_party/chromium/media/base/time_delta_interpolator.cc rename to media/base/time_delta_interpolator.cc diff --git a/third_party/chromium/media/base/time_delta_interpolator.h b/media/base/time_delta_interpolator.h similarity index 100% rename from third_party/chromium/media/base/time_delta_interpolator.h rename to media/base/time_delta_interpolator.h diff --git a/third_party/chromium/media/base/time_delta_interpolator_unittest.cc b/media/base/time_delta_interpolator_unittest.cc similarity index 100% rename from third_party/chromium/media/base/time_delta_interpolator_unittest.cc rename to media/base/time_delta_interpolator_unittest.cc diff --git a/third_party/chromium/media/base/time_source.h b/media/base/time_source.h similarity index 100% rename from third_party/chromium/media/base/time_source.h rename to media/base/time_source.h diff --git a/third_party/chromium/media/base/timestamp_constants.h b/media/base/timestamp_constants.h similarity index 100% rename from third_party/chromium/media/base/timestamp_constants.h rename to media/base/timestamp_constants.h diff --git a/third_party/chromium/media/base/tuneable.cc b/media/base/tuneable.cc similarity index 100% rename from third_party/chromium/media/base/tuneable.cc rename to media/base/tuneable.cc diff --git a/third_party/chromium/media/base/tuneable.h b/media/base/tuneable.h similarity index 100% rename from third_party/chromium/media/base/tuneable.h rename to media/base/tuneable.h diff --git a/third_party/chromium/media/base/tuneable_unittest.cc b/media/base/tuneable_unittest.cc similarity index 100% rename from third_party/chromium/media/base/tuneable_unittest.cc rename to media/base/tuneable_unittest.cc diff --git a/third_party/chromium/media/base/unaligned_shared_memory.cc b/media/base/unaligned_shared_memory.cc similarity index 100% rename from third_party/chromium/media/base/unaligned_shared_memory.cc rename to media/base/unaligned_shared_memory.cc diff --git a/third_party/chromium/media/base/unaligned_shared_memory.h b/media/base/unaligned_shared_memory.h similarity index 100% rename from third_party/chromium/media/base/unaligned_shared_memory.h rename to media/base/unaligned_shared_memory.h diff --git a/third_party/chromium/media/base/unaligned_shared_memory_unittest.cc b/media/base/unaligned_shared_memory_unittest.cc similarity index 100% rename from third_party/chromium/media/base/unaligned_shared_memory_unittest.cc rename to media/base/unaligned_shared_memory_unittest.cc diff --git a/third_party/chromium/media/base/use_after_free_checker.h b/media/base/use_after_free_checker.h similarity index 100% rename from third_party/chromium/media/base/use_after_free_checker.h rename to media/base/use_after_free_checker.h diff --git a/third_party/chromium/media/base/user_input_monitor.cc b/media/base/user_input_monitor.cc similarity index 100% rename from third_party/chromium/media/base/user_input_monitor.cc rename to media/base/user_input_monitor.cc diff --git a/third_party/chromium/media/base/user_input_monitor.h b/media/base/user_input_monitor.h similarity index 100% rename from third_party/chromium/media/base/user_input_monitor.h rename to media/base/user_input_monitor.h diff --git a/third_party/chromium/media/base/user_input_monitor_linux.cc b/media/base/user_input_monitor_linux.cc similarity index 100% rename from third_party/chromium/media/base/user_input_monitor_linux.cc rename to media/base/user_input_monitor_linux.cc diff --git a/third_party/chromium/media/base/user_input_monitor_mac.cc b/media/base/user_input_monitor_mac.cc similarity index 100% rename from third_party/chromium/media/base/user_input_monitor_mac.cc rename to media/base/user_input_monitor_mac.cc diff --git a/third_party/chromium/media/base/user_input_monitor_unittest.cc b/media/base/user_input_monitor_unittest.cc similarity index 100% rename from third_party/chromium/media/base/user_input_monitor_unittest.cc rename to media/base/user_input_monitor_unittest.cc diff --git a/third_party/chromium/media/base/user_input_monitor_win.cc b/media/base/user_input_monitor_win.cc similarity index 100% rename from third_party/chromium/media/base/user_input_monitor_win.cc rename to media/base/user_input_monitor_win.cc diff --git a/third_party/chromium/media/base/vector_math.cc b/media/base/vector_math.cc similarity index 100% rename from third_party/chromium/media/base/vector_math.cc rename to media/base/vector_math.cc diff --git a/third_party/chromium/media/base/vector_math.h b/media/base/vector_math.h similarity index 100% rename from third_party/chromium/media/base/vector_math.h rename to media/base/vector_math.h diff --git a/third_party/chromium/media/base/vector_math_perftest.cc b/media/base/vector_math_perftest.cc similarity index 100% rename from third_party/chromium/media/base/vector_math_perftest.cc rename to media/base/vector_math_perftest.cc diff --git a/third_party/chromium/media/base/vector_math_testing.h b/media/base/vector_math_testing.h similarity index 100% rename from third_party/chromium/media/base/vector_math_testing.h rename to media/base/vector_math_testing.h diff --git a/third_party/chromium/media/base/vector_math_unittest.cc b/media/base/vector_math_unittest.cc similarity index 100% rename from third_party/chromium/media/base/vector_math_unittest.cc rename to media/base/vector_math_unittest.cc diff --git a/third_party/chromium/media/base/video_aspect_ratio.cc b/media/base/video_aspect_ratio.cc similarity index 100% rename from third_party/chromium/media/base/video_aspect_ratio.cc rename to media/base/video_aspect_ratio.cc diff --git a/third_party/chromium/media/base/video_aspect_ratio.h b/media/base/video_aspect_ratio.h similarity index 100% rename from third_party/chromium/media/base/video_aspect_ratio.h rename to media/base/video_aspect_ratio.h diff --git a/third_party/chromium/media/base/video_aspect_ratio_unittest.cc b/media/base/video_aspect_ratio_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_aspect_ratio_unittest.cc rename to media/base/video_aspect_ratio_unittest.cc diff --git a/third_party/chromium/media/base/video_bitrate_allocation.cc b/media/base/video_bitrate_allocation.cc similarity index 100% rename from third_party/chromium/media/base/video_bitrate_allocation.cc rename to media/base/video_bitrate_allocation.cc diff --git a/third_party/chromium/media/base/video_bitrate_allocation.h b/media/base/video_bitrate_allocation.h similarity index 100% rename from third_party/chromium/media/base/video_bitrate_allocation.h rename to media/base/video_bitrate_allocation.h diff --git a/third_party/chromium/media/base/video_bitrate_allocation_unittest.cc b/media/base/video_bitrate_allocation_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_bitrate_allocation_unittest.cc rename to media/base/video_bitrate_allocation_unittest.cc diff --git a/third_party/chromium/media/base/video_codecs.cc b/media/base/video_codecs.cc similarity index 100% rename from third_party/chromium/media/base/video_codecs.cc rename to media/base/video_codecs.cc diff --git a/third_party/chromium/media/base/video_codecs.h b/media/base/video_codecs.h similarity index 100% rename from third_party/chromium/media/base/video_codecs.h rename to media/base/video_codecs.h diff --git a/third_party/chromium/media/base/video_codecs_unittest.cc b/media/base/video_codecs_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_codecs_unittest.cc rename to media/base/video_codecs_unittest.cc diff --git a/third_party/chromium/media/base/video_color_space.cc b/media/base/video_color_space.cc similarity index 100% rename from third_party/chromium/media/base/video_color_space.cc rename to media/base/video_color_space.cc diff --git a/third_party/chromium/media/base/video_color_space.h b/media/base/video_color_space.h similarity index 100% rename from third_party/chromium/media/base/video_color_space.h rename to media/base/video_color_space.h diff --git a/third_party/chromium/media/base/video_color_space_unittest.cc b/media/base/video_color_space_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_color_space_unittest.cc rename to media/base/video_color_space_unittest.cc diff --git a/third_party/chromium/media/base/video_decoder.cc b/media/base/video_decoder.cc similarity index 100% rename from third_party/chromium/media/base/video_decoder.cc rename to media/base/video_decoder.cc diff --git a/third_party/chromium/media/base/video_decoder.h b/media/base/video_decoder.h similarity index 100% rename from third_party/chromium/media/base/video_decoder.h rename to media/base/video_decoder.h diff --git a/third_party/chromium/media/base/video_decoder_config.cc b/media/base/video_decoder_config.cc similarity index 100% rename from third_party/chromium/media/base/video_decoder_config.cc rename to media/base/video_decoder_config.cc diff --git a/third_party/chromium/media/base/video_decoder_config.h b/media/base/video_decoder_config.h similarity index 100% rename from third_party/chromium/media/base/video_decoder_config.h rename to media/base/video_decoder_config.h diff --git a/third_party/chromium/media/base/video_decoder_config_unittest.cc b/media/base/video_decoder_config_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_decoder_config_unittest.cc rename to media/base/video_decoder_config_unittest.cc diff --git a/third_party/chromium/media/base/video_encoder.cc b/media/base/video_encoder.cc similarity index 100% rename from third_party/chromium/media/base/video_encoder.cc rename to media/base/video_encoder.cc diff --git a/third_party/chromium/media/base/video_encoder.h b/media/base/video_encoder.h similarity index 100% rename from third_party/chromium/media/base/video_encoder.h rename to media/base/video_encoder.h diff --git a/third_party/chromium/media/base/video_facing.h b/media/base/video_facing.h similarity index 100% rename from third_party/chromium/media/base/video_facing.h rename to media/base/video_facing.h diff --git a/third_party/chromium/media/base/video_frame.cc b/media/base/video_frame.cc similarity index 100% rename from third_party/chromium/media/base/video_frame.cc rename to media/base/video_frame.cc diff --git a/third_party/chromium/media/base/video_frame.h b/media/base/video_frame.h similarity index 100% rename from third_party/chromium/media/base/video_frame.h rename to media/base/video_frame.h diff --git a/third_party/chromium/media/base/video_frame_layout.cc b/media/base/video_frame_layout.cc similarity index 100% rename from third_party/chromium/media/base/video_frame_layout.cc rename to media/base/video_frame_layout.cc diff --git a/third_party/chromium/media/base/video_frame_layout.h b/media/base/video_frame_layout.h similarity index 100% rename from third_party/chromium/media/base/video_frame_layout.h rename to media/base/video_frame_layout.h diff --git a/third_party/chromium/media/base/video_frame_layout_unittest.cc b/media/base/video_frame_layout_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_frame_layout_unittest.cc rename to media/base/video_frame_layout_unittest.cc diff --git a/third_party/chromium/media/base/video_frame_metadata.cc b/media/base/video_frame_metadata.cc similarity index 100% rename from third_party/chromium/media/base/video_frame_metadata.cc rename to media/base/video_frame_metadata.cc diff --git a/third_party/chromium/media/base/video_frame_metadata.h b/media/base/video_frame_metadata.h similarity index 100% rename from third_party/chromium/media/base/video_frame_metadata.h rename to media/base/video_frame_metadata.h diff --git a/third_party/chromium/media/base/video_frame_pool.cc b/media/base/video_frame_pool.cc similarity index 100% rename from third_party/chromium/media/base/video_frame_pool.cc rename to media/base/video_frame_pool.cc diff --git a/third_party/chromium/media/base/video_frame_pool.h b/media/base/video_frame_pool.h similarity index 100% rename from third_party/chromium/media/base/video_frame_pool.h rename to media/base/video_frame_pool.h diff --git a/third_party/chromium/media/base/video_frame_pool_unittest.cc b/media/base/video_frame_pool_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_frame_pool_unittest.cc rename to media/base/video_frame_pool_unittest.cc diff --git a/third_party/chromium/media/base/video_frame_unittest.cc b/media/base/video_frame_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_frame_unittest.cc rename to media/base/video_frame_unittest.cc diff --git a/third_party/chromium/media/base/video_renderer.cc b/media/base/video_renderer.cc similarity index 100% rename from third_party/chromium/media/base/video_renderer.cc rename to media/base/video_renderer.cc diff --git a/third_party/chromium/media/base/video_renderer.h b/media/base/video_renderer.h similarity index 100% rename from third_party/chromium/media/base/video_renderer.h rename to media/base/video_renderer.h diff --git a/third_party/chromium/media/base/video_renderer_sink.h b/media/base/video_renderer_sink.h similarity index 100% rename from third_party/chromium/media/base/video_renderer_sink.h rename to media/base/video_renderer_sink.h diff --git a/third_party/chromium/media/base/video_thumbnail_decoder.cc b/media/base/video_thumbnail_decoder.cc similarity index 100% rename from third_party/chromium/media/base/video_thumbnail_decoder.cc rename to media/base/video_thumbnail_decoder.cc diff --git a/third_party/chromium/media/base/video_thumbnail_decoder.h b/media/base/video_thumbnail_decoder.h similarity index 100% rename from third_party/chromium/media/base/video_thumbnail_decoder.h rename to media/base/video_thumbnail_decoder.h diff --git a/third_party/chromium/media/base/video_thumbnail_decoder_unittest.cc b/media/base/video_thumbnail_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_thumbnail_decoder_unittest.cc rename to media/base/video_thumbnail_decoder_unittest.cc diff --git a/third_party/chromium/media/base/video_transformation.cc b/media/base/video_transformation.cc similarity index 100% rename from third_party/chromium/media/base/video_transformation.cc rename to media/base/video_transformation.cc diff --git a/third_party/chromium/media/base/video_transformation.h b/media/base/video_transformation.h similarity index 100% rename from third_party/chromium/media/base/video_transformation.h rename to media/base/video_transformation.h diff --git a/third_party/chromium/media/base/video_types.cc b/media/base/video_types.cc similarity index 100% rename from third_party/chromium/media/base/video_types.cc rename to media/base/video_types.cc diff --git a/third_party/chromium/media/base/video_types.h b/media/base/video_types.h similarity index 100% rename from third_party/chromium/media/base/video_types.h rename to media/base/video_types.h diff --git a/third_party/chromium/media/base/video_types_unittest.cc b/media/base/video_types_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_types_unittest.cc rename to media/base/video_types_unittest.cc diff --git a/third_party/chromium/media/base/video_util.cc b/media/base/video_util.cc similarity index 100% rename from third_party/chromium/media/base/video_util.cc rename to media/base/video_util.cc diff --git a/third_party/chromium/media/base/video_util.h b/media/base/video_util.h similarity index 100% rename from third_party/chromium/media/base/video_util.h rename to media/base/video_util.h diff --git a/third_party/chromium/media/base/video_util_unittest.cc b/media/base/video_util_unittest.cc similarity index 100% rename from third_party/chromium/media/base/video_util_unittest.cc rename to media/base/video_util_unittest.cc diff --git a/third_party/chromium/media/base/wait_and_replace_sync_token_client.cc b/media/base/wait_and_replace_sync_token_client.cc similarity index 100% rename from third_party/chromium/media/base/wait_and_replace_sync_token_client.cc rename to media/base/wait_and_replace_sync_token_client.cc diff --git a/third_party/chromium/media/base/wait_and_replace_sync_token_client.h b/media/base/wait_and_replace_sync_token_client.h similarity index 100% rename from third_party/chromium/media/base/wait_and_replace_sync_token_client.h rename to media/base/wait_and_replace_sync_token_client.h diff --git a/third_party/chromium/media/base/waiting.h b/media/base/waiting.h similarity index 100% rename from third_party/chromium/media/base/waiting.h rename to media/base/waiting.h diff --git a/third_party/chromium/media/base/wall_clock_time_source.cc b/media/base/wall_clock_time_source.cc similarity index 100% rename from third_party/chromium/media/base/wall_clock_time_source.cc rename to media/base/wall_clock_time_source.cc diff --git a/third_party/chromium/media/base/wall_clock_time_source.h b/media/base/wall_clock_time_source.h similarity index 100% rename from third_party/chromium/media/base/wall_clock_time_source.h rename to media/base/wall_clock_time_source.h diff --git a/third_party/chromium/media/base/wall_clock_time_source_unittest.cc b/media/base/wall_clock_time_source_unittest.cc similarity index 100% rename from third_party/chromium/media/base/wall_clock_time_source_unittest.cc rename to media/base/wall_clock_time_source_unittest.cc diff --git a/third_party/chromium/media/base/watch_time_keys.cc b/media/base/watch_time_keys.cc similarity index 100% rename from third_party/chromium/media/base/watch_time_keys.cc rename to media/base/watch_time_keys.cc diff --git a/third_party/chromium/media/base/watch_time_keys.h b/media/base/watch_time_keys.h similarity index 100% rename from third_party/chromium/media/base/watch_time_keys.h rename to media/base/watch_time_keys.h diff --git a/third_party/chromium/media/base/webvtt_util.h b/media/base/webvtt_util.h similarity index 100% rename from third_party/chromium/media/base/webvtt_util.h rename to media/base/webvtt_util.h diff --git a/third_party/chromium/media/base/win/BUILD.gn b/media/base/win/BUILD.gn similarity index 100% rename from third_party/chromium/media/base/win/BUILD.gn rename to media/base/win/BUILD.gn diff --git a/third_party/chromium/media/base/win/d3d11_mocks.cc b/media/base/win/d3d11_mocks.cc similarity index 100% rename from third_party/chromium/media/base/win/d3d11_mocks.cc rename to media/base/win/d3d11_mocks.cc diff --git a/third_party/chromium/media/base/win/d3d11_mocks.h b/media/base/win/d3d11_mocks.h similarity index 100% rename from third_party/chromium/media/base/win/d3d11_mocks.h rename to media/base/win/d3d11_mocks.h diff --git a/third_party/chromium/media/base/win/dcomp_texture_wrapper.h b/media/base/win/dcomp_texture_wrapper.h similarity index 100% rename from third_party/chromium/media/base/win/dcomp_texture_wrapper.h rename to media/base/win/dcomp_texture_wrapper.h diff --git a/third_party/chromium/media/base/win/dxgi_device_manager.cc b/media/base/win/dxgi_device_manager.cc similarity index 100% rename from third_party/chromium/media/base/win/dxgi_device_manager.cc rename to media/base/win/dxgi_device_manager.cc diff --git a/third_party/chromium/media/base/win/dxgi_device_manager.h b/media/base/win/dxgi_device_manager.h similarity index 100% rename from third_party/chromium/media/base/win/dxgi_device_manager.h rename to media/base/win/dxgi_device_manager.h diff --git a/third_party/chromium/media/base/win/dxgi_device_scope_handle_unittest.cc b/media/base/win/dxgi_device_scope_handle_unittest.cc similarity index 100% rename from third_party/chromium/media/base/win/dxgi_device_scope_handle_unittest.cc rename to media/base/win/dxgi_device_scope_handle_unittest.cc diff --git a/third_party/chromium/media/base/win/hresult_status_helper.cc b/media/base/win/hresult_status_helper.cc similarity index 100% rename from third_party/chromium/media/base/win/hresult_status_helper.cc rename to media/base/win/hresult_status_helper.cc diff --git a/third_party/chromium/media/base/win/hresult_status_helper.h b/media/base/win/hresult_status_helper.h similarity index 100% rename from third_party/chromium/media/base/win/hresult_status_helper.h rename to media/base/win/hresult_status_helper.h diff --git a/third_party/chromium/media/base/win/media_foundation_cdm_proxy.h b/media/base/win/media_foundation_cdm_proxy.h similarity index 100% rename from third_party/chromium/media/base/win/media_foundation_cdm_proxy.h rename to media/base/win/media_foundation_cdm_proxy.h diff --git a/third_party/chromium/media/base/win/mf_helpers.cc b/media/base/win/mf_helpers.cc similarity index 100% rename from third_party/chromium/media/base/win/mf_helpers.cc rename to media/base/win/mf_helpers.cc diff --git a/third_party/chromium/media/base/win/mf_helpers.h b/media/base/win/mf_helpers.h similarity index 100% rename from third_party/chromium/media/base/win/mf_helpers.h rename to media/base/win/mf_helpers.h diff --git a/third_party/chromium/media/base/win/mf_initializer.cc b/media/base/win/mf_initializer.cc similarity index 100% rename from third_party/chromium/media/base/win/mf_initializer.cc rename to media/base/win/mf_initializer.cc diff --git a/third_party/chromium/media/base/win/mf_initializer.h b/media/base/win/mf_initializer.h similarity index 100% rename from third_party/chromium/media/base/win/mf_initializer.h rename to media/base/win/mf_initializer.h diff --git a/third_party/chromium/media/base/win/mf_initializer_export.h b/media/base/win/mf_initializer_export.h similarity index 100% rename from third_party/chromium/media/base/win/mf_initializer_export.h rename to media/base/win/mf_initializer_export.h diff --git a/third_party/chromium/media/base/win/mf_mocks.cc b/media/base/win/mf_mocks.cc similarity index 100% rename from third_party/chromium/media/base/win/mf_mocks.cc rename to media/base/win/mf_mocks.cc diff --git a/third_party/chromium/media/base/win/mf_mocks.h b/media/base/win/mf_mocks.h similarity index 100% rename from third_party/chromium/media/base/win/mf_mocks.h rename to media/base/win/mf_mocks.h diff --git a/third_party/chromium/media/base/win/test_utils.h b/media/base/win/test_utils.h similarity index 100% rename from third_party/chromium/media/base/win/test_utils.h rename to media/base/win/test_utils.h diff --git a/third_party/chromium/media/capabilities/BUILD.gn b/media/capabilities/BUILD.gn similarity index 100% rename from third_party/chromium/media/capabilities/BUILD.gn rename to media/capabilities/BUILD.gn diff --git a/third_party/chromium/media/capabilities/DEPS b/media/capabilities/DEPS similarity index 100% rename from third_party/chromium/media/capabilities/DEPS rename to media/capabilities/DEPS diff --git a/third_party/chromium/media/capabilities/bucket_utility.cc b/media/capabilities/bucket_utility.cc similarity index 100% rename from third_party/chromium/media/capabilities/bucket_utility.cc rename to media/capabilities/bucket_utility.cc diff --git a/third_party/chromium/media/capabilities/bucket_utility.h b/media/capabilities/bucket_utility.h similarity index 100% rename from third_party/chromium/media/capabilities/bucket_utility.h rename to media/capabilities/bucket_utility.h diff --git a/third_party/chromium/media/capabilities/in_memory_video_decode_stats_db_impl.cc b/media/capabilities/in_memory_video_decode_stats_db_impl.cc similarity index 100% rename from third_party/chromium/media/capabilities/in_memory_video_decode_stats_db_impl.cc rename to media/capabilities/in_memory_video_decode_stats_db_impl.cc diff --git a/third_party/chromium/media/capabilities/in_memory_video_decode_stats_db_impl.h b/media/capabilities/in_memory_video_decode_stats_db_impl.h similarity index 100% rename from third_party/chromium/media/capabilities/in_memory_video_decode_stats_db_impl.h rename to media/capabilities/in_memory_video_decode_stats_db_impl.h diff --git a/third_party/chromium/media/capabilities/in_memory_video_decode_stats_db_unittest.cc b/media/capabilities/in_memory_video_decode_stats_db_unittest.cc similarity index 100% rename from third_party/chromium/media/capabilities/in_memory_video_decode_stats_db_unittest.cc rename to media/capabilities/in_memory_video_decode_stats_db_unittest.cc diff --git a/third_party/chromium/media/capabilities/learning_helper.cc b/media/capabilities/learning_helper.cc similarity index 100% rename from third_party/chromium/media/capabilities/learning_helper.cc rename to media/capabilities/learning_helper.cc diff --git a/third_party/chromium/media/capabilities/learning_helper.h b/media/capabilities/learning_helper.h similarity index 100% rename from third_party/chromium/media/capabilities/learning_helper.h rename to media/capabilities/learning_helper.h diff --git a/third_party/chromium/media/capabilities/video_decode_stats.proto b/media/capabilities/video_decode_stats.proto similarity index 100% rename from third_party/chromium/media/capabilities/video_decode_stats.proto rename to media/capabilities/video_decode_stats.proto diff --git a/third_party/chromium/media/capabilities/video_decode_stats_db.cc b/media/capabilities/video_decode_stats_db.cc similarity index 100% rename from third_party/chromium/media/capabilities/video_decode_stats_db.cc rename to media/capabilities/video_decode_stats_db.cc diff --git a/third_party/chromium/media/capabilities/video_decode_stats_db.h b/media/capabilities/video_decode_stats_db.h similarity index 100% rename from third_party/chromium/media/capabilities/video_decode_stats_db.h rename to media/capabilities/video_decode_stats_db.h diff --git a/third_party/chromium/media/capabilities/video_decode_stats_db_impl.cc b/media/capabilities/video_decode_stats_db_impl.cc similarity index 100% rename from third_party/chromium/media/capabilities/video_decode_stats_db_impl.cc rename to media/capabilities/video_decode_stats_db_impl.cc diff --git a/third_party/chromium/media/capabilities/video_decode_stats_db_impl.h b/media/capabilities/video_decode_stats_db_impl.h similarity index 100% rename from third_party/chromium/media/capabilities/video_decode_stats_db_impl.h rename to media/capabilities/video_decode_stats_db_impl.h diff --git a/third_party/chromium/media/capabilities/video_decode_stats_db_impl_unittest.cc b/media/capabilities/video_decode_stats_db_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/capabilities/video_decode_stats_db_impl_unittest.cc rename to media/capabilities/video_decode_stats_db_impl_unittest.cc diff --git a/third_party/chromium/media/capabilities/video_decode_stats_db_provider.cc b/media/capabilities/video_decode_stats_db_provider.cc similarity index 100% rename from third_party/chromium/media/capabilities/video_decode_stats_db_provider.cc rename to media/capabilities/video_decode_stats_db_provider.cc diff --git a/third_party/chromium/media/capabilities/video_decode_stats_db_provider.h b/media/capabilities/video_decode_stats_db_provider.h similarity index 100% rename from third_party/chromium/media/capabilities/video_decode_stats_db_provider.h rename to media/capabilities/video_decode_stats_db_provider.h diff --git a/third_party/chromium/media/capabilities/video_decode_stats_db_unittest.cc b/media/capabilities/video_decode_stats_db_unittest.cc similarity index 100% rename from third_party/chromium/media/capabilities/video_decode_stats_db_unittest.cc rename to media/capabilities/video_decode_stats_db_unittest.cc diff --git a/third_party/chromium/media/capture/BUILD.gn b/media/capture/BUILD.gn similarity index 100% rename from third_party/chromium/media/capture/BUILD.gn rename to media/capture/BUILD.gn diff --git a/third_party/chromium/media/capture/DEPS b/media/capture/DEPS similarity index 100% rename from third_party/chromium/media/capture/DEPS rename to media/capture/DEPS diff --git a/third_party/chromium/media/capture/OWNERS b/media/capture/OWNERS similarity index 100% rename from third_party/chromium/media/capture/OWNERS rename to media/capture/OWNERS diff --git a/third_party/chromium/media/capture/capture_export.h b/media/capture/capture_export.h similarity index 100% rename from third_party/chromium/media/capture/capture_export.h rename to media/capture/capture_export.h diff --git a/third_party/chromium/media/capture/capture_switches.cc b/media/capture/capture_switches.cc similarity index 100% rename from third_party/chromium/media/capture/capture_switches.cc rename to media/capture/capture_switches.cc diff --git a/third_party/chromium/media/capture/capture_switches.h b/media/capture/capture_switches.h similarity index 100% rename from third_party/chromium/media/capture/capture_switches.h rename to media/capture/capture_switches.h diff --git a/third_party/chromium/media/capture/content/DIR_METADATA b/media/capture/content/DIR_METADATA similarity index 100% rename from third_party/chromium/media/capture/content/DIR_METADATA rename to media/capture/content/DIR_METADATA diff --git a/third_party/chromium/media/capture/content/OWNERS b/media/capture/content/OWNERS similarity index 100% rename from third_party/chromium/media/capture/content/OWNERS rename to media/capture/content/OWNERS diff --git a/third_party/chromium/media/capture/content/README b/media/capture/content/README similarity index 100% rename from third_party/chromium/media/capture/content/README rename to media/capture/content/README diff --git a/third_party/chromium/media/capture/content/android/BUILD.gn b/media/capture/content/android/BUILD.gn similarity index 100% rename from third_party/chromium/media/capture/content/android/BUILD.gn rename to media/capture/content/android/BUILD.gn diff --git a/third_party/chromium/media/capture/content/android/java/src/org/chromium/media/ScreenCapture.java b/media/capture/content/android/java/src/org/chromium/media/ScreenCapture.java similarity index 100% rename from third_party/chromium/media/capture/content/android/java/src/org/chromium/media/ScreenCapture.java rename to media/capture/content/android/java/src/org/chromium/media/ScreenCapture.java diff --git a/third_party/chromium/media/capture/content/android/screen_capture_machine_android.cc b/media/capture/content/android/screen_capture_machine_android.cc similarity index 100% rename from third_party/chromium/media/capture/content/android/screen_capture_machine_android.cc rename to media/capture/content/android/screen_capture_machine_android.cc diff --git a/third_party/chromium/media/capture/content/android/screen_capture_machine_android.h b/media/capture/content/android/screen_capture_machine_android.h similarity index 100% rename from third_party/chromium/media/capture/content/android/screen_capture_machine_android.h rename to media/capture/content/android/screen_capture_machine_android.h diff --git a/third_party/chromium/media/capture/content/android/thread_safe_capture_oracle.cc b/media/capture/content/android/thread_safe_capture_oracle.cc similarity index 100% rename from third_party/chromium/media/capture/content/android/thread_safe_capture_oracle.cc rename to media/capture/content/android/thread_safe_capture_oracle.cc diff --git a/third_party/chromium/media/capture/content/android/thread_safe_capture_oracle.h b/media/capture/content/android/thread_safe_capture_oracle.h similarity index 100% rename from third_party/chromium/media/capture/content/android/thread_safe_capture_oracle.h rename to media/capture/content/android/thread_safe_capture_oracle.h diff --git a/third_party/chromium/media/capture/content/animated_content_sampler.cc b/media/capture/content/animated_content_sampler.cc similarity index 100% rename from third_party/chromium/media/capture/content/animated_content_sampler.cc rename to media/capture/content/animated_content_sampler.cc diff --git a/third_party/chromium/media/capture/content/animated_content_sampler.h b/media/capture/content/animated_content_sampler.h similarity index 100% rename from third_party/chromium/media/capture/content/animated_content_sampler.h rename to media/capture/content/animated_content_sampler.h diff --git a/third_party/chromium/media/capture/content/animated_content_sampler_unittest.cc b/media/capture/content/animated_content_sampler_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/content/animated_content_sampler_unittest.cc rename to media/capture/content/animated_content_sampler_unittest.cc diff --git a/third_party/chromium/media/capture/content/capture_resolution_chooser.cc b/media/capture/content/capture_resolution_chooser.cc similarity index 100% rename from third_party/chromium/media/capture/content/capture_resolution_chooser.cc rename to media/capture/content/capture_resolution_chooser.cc diff --git a/third_party/chromium/media/capture/content/capture_resolution_chooser.h b/media/capture/content/capture_resolution_chooser.h similarity index 100% rename from third_party/chromium/media/capture/content/capture_resolution_chooser.h rename to media/capture/content/capture_resolution_chooser.h diff --git a/third_party/chromium/media/capture/content/capture_resolution_chooser_unittest.cc b/media/capture/content/capture_resolution_chooser_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/content/capture_resolution_chooser_unittest.cc rename to media/capture/content/capture_resolution_chooser_unittest.cc diff --git a/third_party/chromium/media/capture/content/smooth_event_sampler.cc b/media/capture/content/smooth_event_sampler.cc similarity index 100% rename from third_party/chromium/media/capture/content/smooth_event_sampler.cc rename to media/capture/content/smooth_event_sampler.cc diff --git a/third_party/chromium/media/capture/content/smooth_event_sampler.h b/media/capture/content/smooth_event_sampler.h similarity index 100% rename from third_party/chromium/media/capture/content/smooth_event_sampler.h rename to media/capture/content/smooth_event_sampler.h diff --git a/third_party/chromium/media/capture/content/smooth_event_sampler_unittest.cc b/media/capture/content/smooth_event_sampler_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/content/smooth_event_sampler_unittest.cc rename to media/capture/content/smooth_event_sampler_unittest.cc diff --git a/third_party/chromium/media/capture/content/video_capture_oracle.cc b/media/capture/content/video_capture_oracle.cc similarity index 100% rename from third_party/chromium/media/capture/content/video_capture_oracle.cc rename to media/capture/content/video_capture_oracle.cc diff --git a/third_party/chromium/media/capture/content/video_capture_oracle.h b/media/capture/content/video_capture_oracle.h similarity index 100% rename from third_party/chromium/media/capture/content/video_capture_oracle.h rename to media/capture/content/video_capture_oracle.h diff --git a/third_party/chromium/media/capture/content/video_capture_oracle_unittest.cc b/media/capture/content/video_capture_oracle_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/content/video_capture_oracle_unittest.cc rename to media/capture/content/video_capture_oracle_unittest.cc diff --git a/third_party/chromium/media/capture/mojom/BUILD.gn b/media/capture/mojom/BUILD.gn similarity index 100% rename from third_party/chromium/media/capture/mojom/BUILD.gn rename to media/capture/mojom/BUILD.gn diff --git a/third_party/chromium/media/capture/mojom/OWNERS b/media/capture/mojom/OWNERS similarity index 100% rename from third_party/chromium/media/capture/mojom/OWNERS rename to media/capture/mojom/OWNERS diff --git a/third_party/chromium/media/capture/mojom/image_capture.mojom b/media/capture/mojom/image_capture.mojom similarity index 100% rename from third_party/chromium/media/capture/mojom/image_capture.mojom rename to media/capture/mojom/image_capture.mojom diff --git a/third_party/chromium/media/capture/mojom/image_capture_types.cc b/media/capture/mojom/image_capture_types.cc similarity index 100% rename from third_party/chromium/media/capture/mojom/image_capture_types.cc rename to media/capture/mojom/image_capture_types.cc diff --git a/third_party/chromium/media/capture/mojom/image_capture_types.h b/media/capture/mojom/image_capture_types.h similarity index 100% rename from third_party/chromium/media/capture/mojom/image_capture_types.h rename to media/capture/mojom/image_capture_types.h diff --git a/third_party/chromium/media/capture/mojom/video_capture.mojom b/media/capture/mojom/video_capture.mojom similarity index 100% rename from third_party/chromium/media/capture/mojom/video_capture.mojom rename to media/capture/mojom/video_capture.mojom diff --git a/third_party/chromium/media/capture/mojom/video_capture_buffer.mojom b/media/capture/mojom/video_capture_buffer.mojom similarity index 100% rename from third_party/chromium/media/capture/mojom/video_capture_buffer.mojom rename to media/capture/mojom/video_capture_buffer.mojom diff --git a/third_party/chromium/media/capture/mojom/video_capture_types.mojom b/media/capture/mojom/video_capture_types.mojom similarity index 100% rename from third_party/chromium/media/capture/mojom/video_capture_types.mojom rename to media/capture/mojom/video_capture_types.mojom diff --git a/third_party/chromium/media/capture/mojom/video_capture_types_mojom_traits.cc b/media/capture/mojom/video_capture_types_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/capture/mojom/video_capture_types_mojom_traits.cc rename to media/capture/mojom/video_capture_types_mojom_traits.cc diff --git a/third_party/chromium/media/capture/mojom/video_capture_types_mojom_traits.h b/media/capture/mojom/video_capture_types_mojom_traits.h similarity index 100% rename from third_party/chromium/media/capture/mojom/video_capture_types_mojom_traits.h rename to media/capture/mojom/video_capture_types_mojom_traits.h diff --git a/third_party/chromium/media/capture/run_all_unittests.cc b/media/capture/run_all_unittests.cc similarity index 100% rename from third_party/chromium/media/capture/run_all_unittests.cc rename to media/capture/run_all_unittests.cc diff --git a/third_party/chromium/media/capture/video/DEPS b/media/capture/video/DEPS similarity index 100% rename from third_party/chromium/media/capture/video/DEPS rename to media/capture/video/DEPS diff --git a/third_party/chromium/media/capture/video/DIR_METADATA b/media/capture/video/DIR_METADATA similarity index 100% rename from third_party/chromium/media/capture/video/DIR_METADATA rename to media/capture/video/DIR_METADATA diff --git a/third_party/chromium/media/capture/video/OWNERS b/media/capture/video/OWNERS similarity index 100% rename from third_party/chromium/media/capture/video/OWNERS rename to media/capture/video/OWNERS diff --git a/third_party/chromium/media/capture/video/android/BUILD.gn b/media/capture/video/android/BUILD.gn similarity index 100% rename from third_party/chromium/media/capture/video/android/BUILD.gn rename to media/capture/video/android/BUILD.gn diff --git a/third_party/chromium/media/capture/video/android/java/src/org/chromium/media/OWNERS b/media/capture/video/android/java/src/org/chromium/media/OWNERS similarity index 100% rename from third_party/chromium/media/capture/video/android/java/src/org/chromium/media/OWNERS rename to media/capture/video/android/java/src/org/chromium/media/OWNERS diff --git a/third_party/chromium/media/capture/video/android/java/src/org/chromium/media/PhotoCapabilities.java b/media/capture/video/android/java/src/org/chromium/media/PhotoCapabilities.java similarity index 100% rename from third_party/chromium/media/capture/video/android/java/src/org/chromium/media/PhotoCapabilities.java rename to media/capture/video/android/java/src/org/chromium/media/PhotoCapabilities.java diff --git a/third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCapture.java b/media/capture/video/android/java/src/org/chromium/media/VideoCapture.java similarity index 100% rename from third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCapture.java rename to media/capture/video/android/java/src/org/chromium/media/VideoCapture.java diff --git a/third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java similarity index 100% rename from third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java rename to media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java diff --git a/third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java similarity index 100% rename from third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java rename to media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java diff --git a/third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFactory.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFactory.java similarity index 100% rename from third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFactory.java rename to media/capture/video/android/java/src/org/chromium/media/VideoCaptureFactory.java diff --git a/third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFormat.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFormat.java similarity index 100% rename from third_party/chromium/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFormat.java rename to media/capture/video/android/java/src/org/chromium/media/VideoCaptureFormat.java diff --git a/third_party/chromium/media/capture/video/android/photo_capabilities.cc b/media/capture/video/android/photo_capabilities.cc similarity index 100% rename from third_party/chromium/media/capture/video/android/photo_capabilities.cc rename to media/capture/video/android/photo_capabilities.cc diff --git a/third_party/chromium/media/capture/video/android/photo_capabilities.h b/media/capture/video/android/photo_capabilities.h similarity index 100% rename from third_party/chromium/media/capture/video/android/photo_capabilities.h rename to media/capture/video/android/photo_capabilities.h diff --git a/third_party/chromium/media/capture/video/android/video_capture_device_android.cc b/media/capture/video/android/video_capture_device_android.cc similarity index 100% rename from third_party/chromium/media/capture/video/android/video_capture_device_android.cc rename to media/capture/video/android/video_capture_device_android.cc diff --git a/third_party/chromium/media/capture/video/android/video_capture_device_android.h b/media/capture/video/android/video_capture_device_android.h similarity index 100% rename from third_party/chromium/media/capture/video/android/video_capture_device_android.h rename to media/capture/video/android/video_capture_device_android.h diff --git a/third_party/chromium/media/capture/video/android/video_capture_device_factory_android.cc b/media/capture/video/android/video_capture_device_factory_android.cc similarity index 100% rename from third_party/chromium/media/capture/video/android/video_capture_device_factory_android.cc rename to media/capture/video/android/video_capture_device_factory_android.cc diff --git a/third_party/chromium/media/capture/video/android/video_capture_device_factory_android.h b/media/capture/video/android/video_capture_device_factory_android.h similarity index 100% rename from third_party/chromium/media/capture/video/android/video_capture_device_factory_android.h rename to media/capture/video/android/video_capture_device_factory_android.h diff --git a/third_party/chromium/media/capture/video/blob_utils.cc b/media/capture/video/blob_utils.cc similarity index 100% rename from third_party/chromium/media/capture/video/blob_utils.cc rename to media/capture/video/blob_utils.cc diff --git a/third_party/chromium/media/capture/video/blob_utils.h b/media/capture/video/blob_utils.h similarity index 100% rename from third_party/chromium/media/capture/video/blob_utils.h rename to media/capture/video/blob_utils.h diff --git a/third_party/chromium/media/capture/video/chromeos/DEPS b/media/capture/video/chromeos/DEPS similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/DEPS rename to media/capture/video/chromeos/DEPS diff --git a/third_party/chromium/media/capture/video/chromeos/OWNERS b/media/capture/video/chromeos/OWNERS similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/OWNERS rename to media/capture/video/chromeos/OWNERS diff --git a/third_party/chromium/media/capture/video/chromeos/camera_3a_controller.cc b/media/capture/video/chromeos/camera_3a_controller.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_3a_controller.cc rename to media/capture/video/chromeos/camera_3a_controller.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_3a_controller.h b/media/capture/video/chromeos/camera_3a_controller.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_3a_controller.h rename to media/capture/video/chromeos/camera_3a_controller.h diff --git a/third_party/chromium/media/capture/video/chromeos/camera_3a_controller_unittest.cc b/media/capture/video/chromeos/camera_3a_controller_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_3a_controller_unittest.cc rename to media/capture/video/chromeos/camera_3a_controller_unittest.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_app_device_bridge_impl.cc b/media/capture/video/chromeos/camera_app_device_bridge_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_app_device_bridge_impl.cc rename to media/capture/video/chromeos/camera_app_device_bridge_impl.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_app_device_bridge_impl.h b/media/capture/video/chromeos/camera_app_device_bridge_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_app_device_bridge_impl.h rename to media/capture/video/chromeos/camera_app_device_bridge_impl.h diff --git a/third_party/chromium/media/capture/video/chromeos/camera_app_device_impl.cc b/media/capture/video/chromeos/camera_app_device_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_app_device_impl.cc rename to media/capture/video/chromeos/camera_app_device_impl.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_app_device_impl.h b/media/capture/video/chromeos/camera_app_device_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_app_device_impl.h rename to media/capture/video/chromeos/camera_app_device_impl.h diff --git a/third_party/chromium/media/capture/video/chromeos/camera_app_device_provider_impl.cc b/media/capture/video/chromeos/camera_app_device_provider_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_app_device_provider_impl.cc rename to media/capture/video/chromeos/camera_app_device_provider_impl.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_app_device_provider_impl.h b/media/capture/video/chromeos/camera_app_device_provider_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_app_device_provider_impl.h rename to media/capture/video/chromeos/camera_app_device_provider_impl.h diff --git a/third_party/chromium/media/capture/video/chromeos/camera_buffer_factory.cc b/media/capture/video/chromeos/camera_buffer_factory.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_buffer_factory.cc rename to media/capture/video/chromeos/camera_buffer_factory.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_buffer_factory.h b/media/capture/video/chromeos/camera_buffer_factory.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_buffer_factory.h rename to media/capture/video/chromeos/camera_buffer_factory.h diff --git a/third_party/chromium/media/capture/video/chromeos/camera_device_context.cc b/media/capture/video/chromeos/camera_device_context.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_device_context.cc rename to media/capture/video/chromeos/camera_device_context.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_device_context.h b/media/capture/video/chromeos/camera_device_context.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_device_context.h rename to media/capture/video/chromeos/camera_device_context.h diff --git a/third_party/chromium/media/capture/video/chromeos/camera_device_delegate.cc b/media/capture/video/chromeos/camera_device_delegate.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_device_delegate.cc rename to media/capture/video/chromeos/camera_device_delegate.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_device_delegate.h b/media/capture/video/chromeos/camera_device_delegate.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_device_delegate.h rename to media/capture/video/chromeos/camera_device_delegate.h diff --git a/third_party/chromium/media/capture/video/chromeos/camera_device_delegate_unittest.cc b/media/capture/video/chromeos/camera_device_delegate_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_device_delegate_unittest.cc rename to media/capture/video/chromeos/camera_device_delegate_unittest.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_hal_delegate.cc b/media/capture/video/chromeos/camera_hal_delegate.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_hal_delegate.cc rename to media/capture/video/chromeos/camera_hal_delegate.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_hal_delegate.h b/media/capture/video/chromeos/camera_hal_delegate.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_hal_delegate.h rename to media/capture/video/chromeos/camera_hal_delegate.h diff --git a/third_party/chromium/media/capture/video/chromeos/camera_hal_delegate_unittest.cc b/media/capture/video/chromeos/camera_hal_delegate_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_hal_delegate_unittest.cc rename to media/capture/video/chromeos/camera_hal_delegate_unittest.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_hal_dispatcher_impl.cc b/media/capture/video/chromeos/camera_hal_dispatcher_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_hal_dispatcher_impl.cc rename to media/capture/video/chromeos/camera_hal_dispatcher_impl.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_hal_dispatcher_impl.h b/media/capture/video/chromeos/camera_hal_dispatcher_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_hal_dispatcher_impl.h rename to media/capture/video/chromeos/camera_hal_dispatcher_impl.h diff --git a/third_party/chromium/media/capture/video/chromeos/camera_hal_dispatcher_impl_unittest.cc b/media/capture/video/chromeos/camera_hal_dispatcher_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_hal_dispatcher_impl_unittest.cc rename to media/capture/video/chromeos/camera_hal_dispatcher_impl_unittest.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_metadata_utils.cc b/media/capture/video/chromeos/camera_metadata_utils.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_metadata_utils.cc rename to media/capture/video/chromeos/camera_metadata_utils.cc diff --git a/third_party/chromium/media/capture/video/chromeos/camera_metadata_utils.h b/media/capture/video/chromeos/camera_metadata_utils.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/camera_metadata_utils.h rename to media/capture/video/chromeos/camera_metadata_utils.h diff --git a/third_party/chromium/media/capture/video/chromeos/capture_metadata_dispatcher.h b/media/capture/video/chromeos/capture_metadata_dispatcher.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/capture_metadata_dispatcher.h rename to media/capture/video/chromeos/capture_metadata_dispatcher.h diff --git a/third_party/chromium/media/capture/video/chromeos/display_rotation_observer.cc b/media/capture/video/chromeos/display_rotation_observer.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/display_rotation_observer.cc rename to media/capture/video/chromeos/display_rotation_observer.cc diff --git a/third_party/chromium/media/capture/video/chromeos/display_rotation_observer.h b/media/capture/video/chromeos/display_rotation_observer.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/display_rotation_observer.h rename to media/capture/video/chromeos/display_rotation_observer.h diff --git a/third_party/chromium/media/capture/video/chromeos/gpu_memory_buffer_tracker.cc b/media/capture/video/chromeos/gpu_memory_buffer_tracker.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/gpu_memory_buffer_tracker.cc rename to media/capture/video/chromeos/gpu_memory_buffer_tracker.cc diff --git a/third_party/chromium/media/capture/video/chromeos/gpu_memory_buffer_tracker.h b/media/capture/video/chromeos/gpu_memory_buffer_tracker.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/gpu_memory_buffer_tracker.h rename to media/capture/video/chromeos/gpu_memory_buffer_tracker.h diff --git a/third_party/chromium/media/capture/video/chromeos/mock_camera_module.cc b/media/capture/video/chromeos/mock_camera_module.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mock_camera_module.cc rename to media/capture/video/chromeos/mock_camera_module.cc diff --git a/third_party/chromium/media/capture/video/chromeos/mock_camera_module.h b/media/capture/video/chromeos/mock_camera_module.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mock_camera_module.h rename to media/capture/video/chromeos/mock_camera_module.h diff --git a/third_party/chromium/media/capture/video/chromeos/mock_vendor_tag_ops.cc b/media/capture/video/chromeos/mock_vendor_tag_ops.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mock_vendor_tag_ops.cc rename to media/capture/video/chromeos/mock_vendor_tag_ops.cc diff --git a/third_party/chromium/media/capture/video/chromeos/mock_vendor_tag_ops.h b/media/capture/video/chromeos/mock_vendor_tag_ops.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mock_vendor_tag_ops.h rename to media/capture/video/chromeos/mock_vendor_tag_ops.h diff --git a/third_party/chromium/media/capture/video/chromeos/mock_video_capture_client.cc b/media/capture/video/chromeos/mock_video_capture_client.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mock_video_capture_client.cc rename to media/capture/video/chromeos/mock_video_capture_client.cc diff --git a/third_party/chromium/media/capture/video/chromeos/mock_video_capture_client.h b/media/capture/video/chromeos/mock_video_capture_client.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mock_video_capture_client.h rename to media/capture/video/chromeos/mock_video_capture_client.h diff --git a/third_party/chromium/media/capture/video/chromeos/mojom/BUILD.gn b/media/capture/video/chromeos/mojom/BUILD.gn similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mojom/BUILD.gn rename to media/capture/video/chromeos/mojom/BUILD.gn diff --git a/third_party/chromium/media/capture/video/chromeos/mojom/OWNERS b/media/capture/video/chromeos/mojom/OWNERS similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mojom/OWNERS rename to media/capture/video/chromeos/mojom/OWNERS diff --git a/third_party/chromium/media/capture/video/chromeos/mojom/camera3.mojom b/media/capture/video/chromeos/mojom/camera3.mojom similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mojom/camera3.mojom rename to media/capture/video/chromeos/mojom/camera3.mojom diff --git a/third_party/chromium/media/capture/video/chromeos/mojom/camera_app.mojom b/media/capture/video/chromeos/mojom/camera_app.mojom similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mojom/camera_app.mojom rename to media/capture/video/chromeos/mojom/camera_app.mojom diff --git a/third_party/chromium/media/capture/video/chromeos/mojom/camera_common.mojom b/media/capture/video/chromeos/mojom/camera_common.mojom similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mojom/camera_common.mojom rename to media/capture/video/chromeos/mojom/camera_common.mojom diff --git a/third_party/chromium/media/capture/video/chromeos/mojom/camera_metadata.mojom b/media/capture/video/chromeos/mojom/camera_metadata.mojom similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mojom/camera_metadata.mojom rename to media/capture/video/chromeos/mojom/camera_metadata.mojom diff --git a/third_party/chromium/media/capture/video/chromeos/mojom/camera_metadata_tags.mojom b/media/capture/video/chromeos/mojom/camera_metadata_tags.mojom similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mojom/camera_metadata_tags.mojom rename to media/capture/video/chromeos/mojom/camera_metadata_tags.mojom diff --git a/third_party/chromium/media/capture/video/chromeos/mojom/cros_camera_client.mojom b/media/capture/video/chromeos/mojom/cros_camera_client.mojom similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mojom/cros_camera_client.mojom rename to media/capture/video/chromeos/mojom/cros_camera_client.mojom diff --git a/third_party/chromium/media/capture/video/chromeos/mojom/cros_camera_service.mojom b/media/capture/video/chromeos/mojom/cros_camera_service.mojom similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/mojom/cros_camera_service.mojom rename to media/capture/video/chromeos/mojom/cros_camera_service.mojom diff --git a/third_party/chromium/media/capture/video/chromeos/pixel_format_utils.cc b/media/capture/video/chromeos/pixel_format_utils.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/pixel_format_utils.cc rename to media/capture/video/chromeos/pixel_format_utils.cc diff --git a/third_party/chromium/media/capture/video/chromeos/pixel_format_utils.h b/media/capture/video/chromeos/pixel_format_utils.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/pixel_format_utils.h rename to media/capture/video/chromeos/pixel_format_utils.h diff --git a/third_party/chromium/media/capture/video/chromeos/public/BUILD.gn b/media/capture/video/chromeos/public/BUILD.gn similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/public/BUILD.gn rename to media/capture/video/chromeos/public/BUILD.gn diff --git a/third_party/chromium/media/capture/video/chromeos/public/cros_features.cc b/media/capture/video/chromeos/public/cros_features.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/public/cros_features.cc rename to media/capture/video/chromeos/public/cros_features.cc diff --git a/third_party/chromium/media/capture/video/chromeos/public/cros_features.h b/media/capture/video/chromeos/public/cros_features.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/public/cros_features.h rename to media/capture/video/chromeos/public/cros_features.h diff --git a/third_party/chromium/media/capture/video/chromeos/request_builder.cc b/media/capture/video/chromeos/request_builder.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/request_builder.cc rename to media/capture/video/chromeos/request_builder.cc diff --git a/third_party/chromium/media/capture/video/chromeos/request_builder.h b/media/capture/video/chromeos/request_builder.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/request_builder.h rename to media/capture/video/chromeos/request_builder.h diff --git a/third_party/chromium/media/capture/video/chromeos/request_manager.cc b/media/capture/video/chromeos/request_manager.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/request_manager.cc rename to media/capture/video/chromeos/request_manager.cc diff --git a/third_party/chromium/media/capture/video/chromeos/request_manager.h b/media/capture/video/chromeos/request_manager.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/request_manager.h rename to media/capture/video/chromeos/request_manager.h diff --git a/third_party/chromium/media/capture/video/chromeos/request_manager_unittest.cc b/media/capture/video/chromeos/request_manager_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/request_manager_unittest.cc rename to media/capture/video/chromeos/request_manager_unittest.cc diff --git a/third_party/chromium/media/capture/video/chromeos/scoped_video_capture_jpeg_decoder.cc b/media/capture/video/chromeos/scoped_video_capture_jpeg_decoder.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/scoped_video_capture_jpeg_decoder.cc rename to media/capture/video/chromeos/scoped_video_capture_jpeg_decoder.cc diff --git a/third_party/chromium/media/capture/video/chromeos/scoped_video_capture_jpeg_decoder.h b/media/capture/video/chromeos/scoped_video_capture_jpeg_decoder.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/scoped_video_capture_jpeg_decoder.h rename to media/capture/video/chromeos/scoped_video_capture_jpeg_decoder.h diff --git a/third_party/chromium/media/capture/video/chromeos/stream_buffer_manager.cc b/media/capture/video/chromeos/stream_buffer_manager.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/stream_buffer_manager.cc rename to media/capture/video/chromeos/stream_buffer_manager.cc diff --git a/third_party/chromium/media/capture/video/chromeos/stream_buffer_manager.h b/media/capture/video/chromeos/stream_buffer_manager.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/stream_buffer_manager.h rename to media/capture/video/chromeos/stream_buffer_manager.h diff --git a/third_party/chromium/media/capture/video/chromeos/token_manager.cc b/media/capture/video/chromeos/token_manager.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/token_manager.cc rename to media/capture/video/chromeos/token_manager.cc diff --git a/third_party/chromium/media/capture/video/chromeos/token_manager.h b/media/capture/video/chromeos/token_manager.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/token_manager.h rename to media/capture/video/chromeos/token_manager.h diff --git a/third_party/chromium/media/capture/video/chromeos/token_manager_unittest.cc b/media/capture/video/chromeos/token_manager_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/token_manager_unittest.cc rename to media/capture/video/chromeos/token_manager_unittest.cc diff --git a/third_party/chromium/media/capture/video/chromeos/vendor_tag_ops_delegate.cc b/media/capture/video/chromeos/vendor_tag_ops_delegate.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/vendor_tag_ops_delegate.cc rename to media/capture/video/chromeos/vendor_tag_ops_delegate.cc diff --git a/third_party/chromium/media/capture/video/chromeos/vendor_tag_ops_delegate.h b/media/capture/video/chromeos/vendor_tag_ops_delegate.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/vendor_tag_ops_delegate.h rename to media/capture/video/chromeos/vendor_tag_ops_delegate.h diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc rename to media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h rename to media/capture/video/chromeos/video_capture_device_chromeos_delegate.h diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc rename to media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h rename to media/capture/video/chromeos/video_capture_device_chromeos_halv3.h diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_device_factory_chromeos.cc b/media/capture/video/chromeos/video_capture_device_factory_chromeos.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_device_factory_chromeos.cc rename to media/capture/video/chromeos/video_capture_device_factory_chromeos.cc diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_device_factory_chromeos.h b/media/capture/video/chromeos/video_capture_device_factory_chromeos.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_device_factory_chromeos.h rename to media/capture/video/chromeos/video_capture_device_factory_chromeos.h diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_features_chromeos.cc b/media/capture/video/chromeos/video_capture_features_chromeos.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_features_chromeos.cc rename to media/capture/video/chromeos/video_capture_features_chromeos.cc diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_features_chromeos.h b/media/capture/video/chromeos/video_capture_features_chromeos.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_features_chromeos.h rename to media/capture/video/chromeos/video_capture_features_chromeos.h diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_jpeg_decoder.h b/media/capture/video/chromeos/video_capture_jpeg_decoder.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_jpeg_decoder.h rename to media/capture/video/chromeos/video_capture_jpeg_decoder.h diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_jpeg_decoder_impl.cc b/media/capture/video/chromeos/video_capture_jpeg_decoder_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_jpeg_decoder_impl.cc rename to media/capture/video/chromeos/video_capture_jpeg_decoder_impl.cc diff --git a/third_party/chromium/media/capture/video/chromeos/video_capture_jpeg_decoder_impl.h b/media/capture/video/chromeos/video_capture_jpeg_decoder_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/chromeos/video_capture_jpeg_decoder_impl.h rename to media/capture/video/chromeos/video_capture_jpeg_decoder_impl.h diff --git a/third_party/chromium/media/capture/video/create_video_capture_device_factory.cc b/media/capture/video/create_video_capture_device_factory.cc similarity index 100% rename from third_party/chromium/media/capture/video/create_video_capture_device_factory.cc rename to media/capture/video/create_video_capture_device_factory.cc diff --git a/third_party/chromium/media/capture/video/create_video_capture_device_factory.h b/media/capture/video/create_video_capture_device_factory.h similarity index 100% rename from third_party/chromium/media/capture/video/create_video_capture_device_factory.h rename to media/capture/video/create_video_capture_device_factory.h diff --git a/third_party/chromium/media/capture/video/fake_video_capture_device.cc b/media/capture/video/fake_video_capture_device.cc similarity index 100% rename from third_party/chromium/media/capture/video/fake_video_capture_device.cc rename to media/capture/video/fake_video_capture_device.cc diff --git a/third_party/chromium/media/capture/video/fake_video_capture_device.h b/media/capture/video/fake_video_capture_device.h similarity index 100% rename from third_party/chromium/media/capture/video/fake_video_capture_device.h rename to media/capture/video/fake_video_capture_device.h diff --git a/third_party/chromium/media/capture/video/fake_video_capture_device_factory.cc b/media/capture/video/fake_video_capture_device_factory.cc similarity index 100% rename from third_party/chromium/media/capture/video/fake_video_capture_device_factory.cc rename to media/capture/video/fake_video_capture_device_factory.cc diff --git a/third_party/chromium/media/capture/video/fake_video_capture_device_factory.h b/media/capture/video/fake_video_capture_device_factory.h similarity index 100% rename from third_party/chromium/media/capture/video/fake_video_capture_device_factory.h rename to media/capture/video/fake_video_capture_device_factory.h diff --git a/third_party/chromium/media/capture/video/fake_video_capture_device_unittest.cc b/media/capture/video/fake_video_capture_device_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/fake_video_capture_device_unittest.cc rename to media/capture/video/fake_video_capture_device_unittest.cc diff --git a/third_party/chromium/media/capture/video/file_video_capture_device.cc b/media/capture/video/file_video_capture_device.cc similarity index 100% rename from third_party/chromium/media/capture/video/file_video_capture_device.cc rename to media/capture/video/file_video_capture_device.cc diff --git a/third_party/chromium/media/capture/video/file_video_capture_device.h b/media/capture/video/file_video_capture_device.h similarity index 100% rename from third_party/chromium/media/capture/video/file_video_capture_device.h rename to media/capture/video/file_video_capture_device.h diff --git a/third_party/chromium/media/capture/video/file_video_capture_device_factory.cc b/media/capture/video/file_video_capture_device_factory.cc similarity index 100% rename from third_party/chromium/media/capture/video/file_video_capture_device_factory.cc rename to media/capture/video/file_video_capture_device_factory.cc diff --git a/third_party/chromium/media/capture/video/file_video_capture_device_factory.h b/media/capture/video/file_video_capture_device_factory.h similarity index 100% rename from third_party/chromium/media/capture/video/file_video_capture_device_factory.h rename to media/capture/video/file_video_capture_device_factory.h diff --git a/third_party/chromium/media/capture/video/file_video_capture_device_unittest.cc b/media/capture/video/file_video_capture_device_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/file_video_capture_device_unittest.cc rename to media/capture/video/file_video_capture_device_unittest.cc diff --git a/third_party/chromium/media/capture/video/fuchsia/DIR_METADATA b/media/capture/video/fuchsia/DIR_METADATA similarity index 100% rename from third_party/chromium/media/capture/video/fuchsia/DIR_METADATA rename to media/capture/video/fuchsia/DIR_METADATA diff --git a/third_party/chromium/media/capture/video/fuchsia/OWNERS b/media/capture/video/fuchsia/OWNERS similarity index 100% rename from third_party/chromium/media/capture/video/fuchsia/OWNERS rename to media/capture/video/fuchsia/OWNERS diff --git a/third_party/chromium/media/capture/video/fuchsia/video_capture_device_factory_fuchsia.cc b/media/capture/video/fuchsia/video_capture_device_factory_fuchsia.cc similarity index 100% rename from third_party/chromium/media/capture/video/fuchsia/video_capture_device_factory_fuchsia.cc rename to media/capture/video/fuchsia/video_capture_device_factory_fuchsia.cc diff --git a/third_party/chromium/media/capture/video/fuchsia/video_capture_device_factory_fuchsia.h b/media/capture/video/fuchsia/video_capture_device_factory_fuchsia.h similarity index 100% rename from third_party/chromium/media/capture/video/fuchsia/video_capture_device_factory_fuchsia.h rename to media/capture/video/fuchsia/video_capture_device_factory_fuchsia.h diff --git a/third_party/chromium/media/capture/video/fuchsia/video_capture_device_factory_fuchsia_test.cc b/media/capture/video/fuchsia/video_capture_device_factory_fuchsia_test.cc similarity index 100% rename from third_party/chromium/media/capture/video/fuchsia/video_capture_device_factory_fuchsia_test.cc rename to media/capture/video/fuchsia/video_capture_device_factory_fuchsia_test.cc diff --git a/third_party/chromium/media/capture/video/fuchsia/video_capture_device_fuchsia.cc b/media/capture/video/fuchsia/video_capture_device_fuchsia.cc similarity index 100% rename from third_party/chromium/media/capture/video/fuchsia/video_capture_device_fuchsia.cc rename to media/capture/video/fuchsia/video_capture_device_fuchsia.cc diff --git a/third_party/chromium/media/capture/video/fuchsia/video_capture_device_fuchsia.h b/media/capture/video/fuchsia/video_capture_device_fuchsia.h similarity index 100% rename from third_party/chromium/media/capture/video/fuchsia/video_capture_device_fuchsia.h rename to media/capture/video/fuchsia/video_capture_device_fuchsia.h diff --git a/third_party/chromium/media/capture/video/fuchsia/video_capture_device_fuchsia_test.cc b/media/capture/video/fuchsia/video_capture_device_fuchsia_test.cc similarity index 100% rename from third_party/chromium/media/capture/video/fuchsia/video_capture_device_fuchsia_test.cc rename to media/capture/video/fuchsia/video_capture_device_fuchsia_test.cc diff --git a/third_party/chromium/media/capture/video/gpu_memory_buffer_utils.cc b/media/capture/video/gpu_memory_buffer_utils.cc similarity index 100% rename from third_party/chromium/media/capture/video/gpu_memory_buffer_utils.cc rename to media/capture/video/gpu_memory_buffer_utils.cc diff --git a/third_party/chromium/media/capture/video/gpu_memory_buffer_utils.h b/media/capture/video/gpu_memory_buffer_utils.h similarity index 100% rename from third_party/chromium/media/capture/video/gpu_memory_buffer_utils.h rename to media/capture/video/gpu_memory_buffer_utils.h diff --git a/third_party/chromium/media/capture/video/linux/fake_device_provider.cc b/media/capture/video/linux/fake_device_provider.cc similarity index 100% rename from third_party/chromium/media/capture/video/linux/fake_device_provider.cc rename to media/capture/video/linux/fake_device_provider.cc diff --git a/third_party/chromium/media/capture/video/linux/fake_device_provider.h b/media/capture/video/linux/fake_device_provider.h similarity index 100% rename from third_party/chromium/media/capture/video/linux/fake_device_provider.h rename to media/capture/video/linux/fake_device_provider.h diff --git a/third_party/chromium/media/capture/video/linux/fake_v4l2_impl.cc b/media/capture/video/linux/fake_v4l2_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/linux/fake_v4l2_impl.cc rename to media/capture/video/linux/fake_v4l2_impl.cc diff --git a/third_party/chromium/media/capture/video/linux/fake_v4l2_impl.h b/media/capture/video/linux/fake_v4l2_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/linux/fake_v4l2_impl.h rename to media/capture/video/linux/fake_v4l2_impl.h diff --git a/third_party/chromium/media/capture/video/linux/scoped_v4l2_device_fd.cc b/media/capture/video/linux/scoped_v4l2_device_fd.cc similarity index 100% rename from third_party/chromium/media/capture/video/linux/scoped_v4l2_device_fd.cc rename to media/capture/video/linux/scoped_v4l2_device_fd.cc diff --git a/third_party/chromium/media/capture/video/linux/scoped_v4l2_device_fd.h b/media/capture/video/linux/scoped_v4l2_device_fd.h similarity index 100% rename from third_party/chromium/media/capture/video/linux/scoped_v4l2_device_fd.h rename to media/capture/video/linux/scoped_v4l2_device_fd.h diff --git a/third_party/chromium/media/capture/video/linux/v4l2_capture_delegate.cc b/media/capture/video/linux/v4l2_capture_delegate.cc similarity index 100% rename from third_party/chromium/media/capture/video/linux/v4l2_capture_delegate.cc rename to media/capture/video/linux/v4l2_capture_delegate.cc diff --git a/third_party/chromium/media/capture/video/linux/v4l2_capture_delegate.h b/media/capture/video/linux/v4l2_capture_delegate.h similarity index 100% rename from third_party/chromium/media/capture/video/linux/v4l2_capture_delegate.h rename to media/capture/video/linux/v4l2_capture_delegate.h diff --git a/third_party/chromium/media/capture/video/linux/v4l2_capture_delegate_unittest.cc b/media/capture/video/linux/v4l2_capture_delegate_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/linux/v4l2_capture_delegate_unittest.cc rename to media/capture/video/linux/v4l2_capture_delegate_unittest.cc diff --git a/third_party/chromium/media/capture/video/linux/v4l2_capture_device.h b/media/capture/video/linux/v4l2_capture_device.h similarity index 100% rename from third_party/chromium/media/capture/video/linux/v4l2_capture_device.h rename to media/capture/video/linux/v4l2_capture_device.h diff --git a/third_party/chromium/media/capture/video/linux/v4l2_capture_device_impl.cc b/media/capture/video/linux/v4l2_capture_device_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/linux/v4l2_capture_device_impl.cc rename to media/capture/video/linux/v4l2_capture_device_impl.cc diff --git a/third_party/chromium/media/capture/video/linux/v4l2_capture_device_impl.h b/media/capture/video/linux/v4l2_capture_device_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/linux/v4l2_capture_device_impl.h rename to media/capture/video/linux/v4l2_capture_device_impl.h diff --git a/third_party/chromium/media/capture/video/linux/video_capture_device_factory_linux.cc b/media/capture/video/linux/video_capture_device_factory_linux.cc similarity index 100% rename from third_party/chromium/media/capture/video/linux/video_capture_device_factory_linux.cc rename to media/capture/video/linux/video_capture_device_factory_linux.cc diff --git a/third_party/chromium/media/capture/video/linux/video_capture_device_factory_linux.h b/media/capture/video/linux/video_capture_device_factory_linux.h similarity index 100% rename from third_party/chromium/media/capture/video/linux/video_capture_device_factory_linux.h rename to media/capture/video/linux/video_capture_device_factory_linux.h diff --git a/third_party/chromium/media/capture/video/linux/video_capture_device_factory_linux_unittest.cc b/media/capture/video/linux/video_capture_device_factory_linux_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/linux/video_capture_device_factory_linux_unittest.cc rename to media/capture/video/linux/video_capture_device_factory_linux_unittest.cc diff --git a/third_party/chromium/media/capture/video/linux/video_capture_device_linux.cc b/media/capture/video/linux/video_capture_device_linux.cc similarity index 100% rename from third_party/chromium/media/capture/video/linux/video_capture_device_linux.cc rename to media/capture/video/linux/video_capture_device_linux.cc diff --git a/third_party/chromium/media/capture/video/linux/video_capture_device_linux.h b/media/capture/video/linux/video_capture_device_linux.h similarity index 100% rename from third_party/chromium/media/capture/video/linux/video_capture_device_linux.h rename to media/capture/video/linux/video_capture_device_linux.h diff --git a/third_party/chromium/media/capture/video/mac/DEPS b/media/capture/video/mac/DEPS similarity index 100% rename from third_party/chromium/media/capture/video/mac/DEPS rename to media/capture/video/mac/DEPS diff --git a/third_party/chromium/media/capture/video/mac/OWNERS b/media/capture/video/mac/OWNERS similarity index 100% rename from third_party/chromium/media/capture/video/mac/OWNERS rename to media/capture/video/mac/OWNERS diff --git a/third_party/chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc b/media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc similarity index 100% rename from third_party/chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc rename to media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc diff --git a/third_party/chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.h b/media/capture/video/mac/gpu_memory_buffer_tracker_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.h rename to media/capture/video/mac/gpu_memory_buffer_tracker_mac.h diff --git a/third_party/chromium/media/capture/video/mac/pixel_buffer_pool_mac.cc b/media/capture/video/mac/pixel_buffer_pool_mac.cc similarity index 100% rename from third_party/chromium/media/capture/video/mac/pixel_buffer_pool_mac.cc rename to media/capture/video/mac/pixel_buffer_pool_mac.cc diff --git a/third_party/chromium/media/capture/video/mac/pixel_buffer_pool_mac.h b/media/capture/video/mac/pixel_buffer_pool_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/pixel_buffer_pool_mac.h rename to media/capture/video/mac/pixel_buffer_pool_mac.h diff --git a/third_party/chromium/media/capture/video/mac/pixel_buffer_pool_mac_unittest.mm b/media/capture/video/mac/pixel_buffer_pool_mac_unittest.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/pixel_buffer_pool_mac_unittest.mm rename to media/capture/video/mac/pixel_buffer_pool_mac_unittest.mm diff --git a/third_party/chromium/media/capture/video/mac/pixel_buffer_transferer_mac.cc b/media/capture/video/mac/pixel_buffer_transferer_mac.cc similarity index 100% rename from third_party/chromium/media/capture/video/mac/pixel_buffer_transferer_mac.cc rename to media/capture/video/mac/pixel_buffer_transferer_mac.cc diff --git a/third_party/chromium/media/capture/video/mac/pixel_buffer_transferer_mac.h b/media/capture/video/mac/pixel_buffer_transferer_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/pixel_buffer_transferer_mac.h rename to media/capture/video/mac/pixel_buffer_transferer_mac.h diff --git a/third_party/chromium/media/capture/video/mac/pixel_buffer_transferer_mac_unittest.mm b/media/capture/video/mac/pixel_buffer_transferer_mac_unittest.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/pixel_buffer_transferer_mac_unittest.mm rename to media/capture/video/mac/pixel_buffer_transferer_mac_unittest.mm diff --git a/third_party/chromium/media/capture/video/mac/sample_buffer_transformer_mac.cc b/media/capture/video/mac/sample_buffer_transformer_mac.cc similarity index 100% rename from third_party/chromium/media/capture/video/mac/sample_buffer_transformer_mac.cc rename to media/capture/video/mac/sample_buffer_transformer_mac.cc diff --git a/third_party/chromium/media/capture/video/mac/sample_buffer_transformer_mac.h b/media/capture/video/mac/sample_buffer_transformer_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/sample_buffer_transformer_mac.h rename to media/capture/video/mac/sample_buffer_transformer_mac.h diff --git a/third_party/chromium/media/capture/video/mac/sample_buffer_transformer_mac_unittest.mm b/media/capture/video/mac/sample_buffer_transformer_mac_unittest.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/sample_buffer_transformer_mac_unittest.mm rename to media/capture/video/mac/sample_buffer_transformer_mac_unittest.mm diff --git a/third_party/chromium/media/capture/video/mac/test/mock_video_capture_device_avfoundation_frame_receiver_mac.h b/media/capture/video/mac/test/mock_video_capture_device_avfoundation_frame_receiver_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/test/mock_video_capture_device_avfoundation_frame_receiver_mac.h rename to media/capture/video/mac/test/mock_video_capture_device_avfoundation_frame_receiver_mac.h diff --git a/third_party/chromium/media/capture/video/mac/test/mock_video_capture_device_avfoundation_frame_receiver_mac.mm b/media/capture/video/mac/test/mock_video_capture_device_avfoundation_frame_receiver_mac.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/test/mock_video_capture_device_avfoundation_frame_receiver_mac.mm rename to media/capture/video/mac/test/mock_video_capture_device_avfoundation_frame_receiver_mac.mm diff --git a/third_party/chromium/media/capture/video/mac/test/pixel_buffer_test_utils_mac.cc b/media/capture/video/mac/test/pixel_buffer_test_utils_mac.cc similarity index 100% rename from third_party/chromium/media/capture/video/mac/test/pixel_buffer_test_utils_mac.cc rename to media/capture/video/mac/test/pixel_buffer_test_utils_mac.cc diff --git a/third_party/chromium/media/capture/video/mac/test/pixel_buffer_test_utils_mac.h b/media/capture/video/mac/test/pixel_buffer_test_utils_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/test/pixel_buffer_test_utils_mac.h rename to media/capture/video/mac/test/pixel_buffer_test_utils_mac.h diff --git a/third_party/chromium/media/capture/video/mac/test/video_capture_test_utils_mac.h b/media/capture/video/mac/test/video_capture_test_utils_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/test/video_capture_test_utils_mac.h rename to media/capture/video/mac/test/video_capture_test_utils_mac.h diff --git a/third_party/chromium/media/capture/video/mac/test/video_capture_test_utils_mac.mm b/media/capture/video/mac/test/video_capture_test_utils_mac.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/test/video_capture_test_utils_mac.mm rename to media/capture/video/mac/test/video_capture_test_utils_mac.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_mac.h b/media/capture/video/mac/video_capture_device_avfoundation_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_mac.h rename to media/capture/video/mac/video_capture_device_avfoundation_mac.h diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_mac.mm b/media/capture/video/mac/video_capture_device_avfoundation_mac.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_mac.mm rename to media/capture/video/mac/video_capture_device_avfoundation_mac.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_mac_unittest.mm b/media/capture/video/mac/video_capture_device_avfoundation_mac_unittest.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_mac_unittest.mm rename to media/capture/video/mac/video_capture_device_avfoundation_mac_unittest.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_utils_mac.h b/media/capture/video/mac/video_capture_device_avfoundation_utils_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_utils_mac.h rename to media/capture/video/mac/video_capture_device_avfoundation_utils_mac.h diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_utils_mac.mm b/media/capture/video/mac/video_capture_device_avfoundation_utils_mac.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_avfoundation_utils_mac.mm rename to media/capture/video/mac/video_capture_device_avfoundation_utils_mac.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_decklink_mac.h b/media/capture/video/mac/video_capture_device_decklink_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_decklink_mac.h rename to media/capture/video/mac/video_capture_device_decklink_mac.h diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_decklink_mac.mm b/media/capture/video/mac/video_capture_device_decklink_mac.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_decklink_mac.mm rename to media/capture/video/mac/video_capture_device_decklink_mac.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_factory_mac.h b/media/capture/video/mac/video_capture_device_factory_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_factory_mac.h rename to media/capture/video/mac/video_capture_device_factory_mac.h diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_factory_mac.mm b/media/capture/video/mac/video_capture_device_factory_mac.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_factory_mac.mm rename to media/capture/video/mac/video_capture_device_factory_mac.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_factory_mac_unittest.mm b/media/capture/video/mac/video_capture_device_factory_mac_unittest.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_factory_mac_unittest.mm rename to media/capture/video/mac/video_capture_device_factory_mac_unittest.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_mac.h b/media/capture/video/mac/video_capture_device_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_mac.h rename to media/capture/video/mac/video_capture_device_mac.h diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_mac.mm b/media/capture/video/mac/video_capture_device_mac.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_mac.mm rename to media/capture/video/mac/video_capture_device_mac.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_device_mac_unittest.mm b/media/capture/video/mac/video_capture_device_mac_unittest.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_device_mac_unittest.mm rename to media/capture/video/mac/video_capture_device_mac_unittest.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_metrics_mac.h b/media/capture/video/mac/video_capture_metrics_mac.h similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_metrics_mac.h rename to media/capture/video/mac/video_capture_metrics_mac.h diff --git a/third_party/chromium/media/capture/video/mac/video_capture_metrics_mac.mm b/media/capture/video/mac/video_capture_metrics_mac.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_metrics_mac.mm rename to media/capture/video/mac/video_capture_metrics_mac.mm diff --git a/third_party/chromium/media/capture/video/mac/video_capture_metrics_mac_unittest.mm b/media/capture/video/mac/video_capture_metrics_mac_unittest.mm similarity index 100% rename from third_party/chromium/media/capture/video/mac/video_capture_metrics_mac_unittest.mm rename to media/capture/video/mac/video_capture_metrics_mac_unittest.mm diff --git a/third_party/chromium/media/capture/video/mock_device.cc b/media/capture/video/mock_device.cc similarity index 100% rename from third_party/chromium/media/capture/video/mock_device.cc rename to media/capture/video/mock_device.cc diff --git a/third_party/chromium/media/capture/video/mock_device.h b/media/capture/video/mock_device.h similarity index 100% rename from third_party/chromium/media/capture/video/mock_device.h rename to media/capture/video/mock_device.h diff --git a/third_party/chromium/media/capture/video/mock_device_factory.cc b/media/capture/video/mock_device_factory.cc similarity index 100% rename from third_party/chromium/media/capture/video/mock_device_factory.cc rename to media/capture/video/mock_device_factory.cc diff --git a/third_party/chromium/media/capture/video/mock_device_factory.h b/media/capture/video/mock_device_factory.h similarity index 100% rename from third_party/chromium/media/capture/video/mock_device_factory.h rename to media/capture/video/mock_device_factory.h diff --git a/third_party/chromium/media/capture/video/mock_gpu_memory_buffer_manager.cc b/media/capture/video/mock_gpu_memory_buffer_manager.cc similarity index 100% rename from third_party/chromium/media/capture/video/mock_gpu_memory_buffer_manager.cc rename to media/capture/video/mock_gpu_memory_buffer_manager.cc diff --git a/third_party/chromium/media/capture/video/mock_gpu_memory_buffer_manager.h b/media/capture/video/mock_gpu_memory_buffer_manager.h similarity index 100% rename from third_party/chromium/media/capture/video/mock_gpu_memory_buffer_manager.h rename to media/capture/video/mock_gpu_memory_buffer_manager.h diff --git a/third_party/chromium/media/capture/video/mock_video_capture_device_client.cc b/media/capture/video/mock_video_capture_device_client.cc similarity index 100% rename from third_party/chromium/media/capture/video/mock_video_capture_device_client.cc rename to media/capture/video/mock_video_capture_device_client.cc diff --git a/third_party/chromium/media/capture/video/mock_video_capture_device_client.h b/media/capture/video/mock_video_capture_device_client.h similarity index 100% rename from third_party/chromium/media/capture/video/mock_video_capture_device_client.h rename to media/capture/video/mock_video_capture_device_client.h diff --git a/third_party/chromium/media/capture/video/mock_video_frame_receiver.cc b/media/capture/video/mock_video_frame_receiver.cc similarity index 100% rename from third_party/chromium/media/capture/video/mock_video_frame_receiver.cc rename to media/capture/video/mock_video_frame_receiver.cc diff --git a/third_party/chromium/media/capture/video/mock_video_frame_receiver.h b/media/capture/video/mock_video_frame_receiver.h similarity index 100% rename from third_party/chromium/media/capture/video/mock_video_frame_receiver.h rename to media/capture/video/mock_video_frame_receiver.h diff --git a/third_party/chromium/media/capture/video/scoped_buffer_pool_reservation.h b/media/capture/video/scoped_buffer_pool_reservation.h similarity index 100% rename from third_party/chromium/media/capture/video/scoped_buffer_pool_reservation.h rename to media/capture/video/scoped_buffer_pool_reservation.h diff --git a/third_party/chromium/media/capture/video/shared_memory_buffer_tracker.cc b/media/capture/video/shared_memory_buffer_tracker.cc similarity index 100% rename from third_party/chromium/media/capture/video/shared_memory_buffer_tracker.cc rename to media/capture/video/shared_memory_buffer_tracker.cc diff --git a/third_party/chromium/media/capture/video/shared_memory_buffer_tracker.h b/media/capture/video/shared_memory_buffer_tracker.h similarity index 100% rename from third_party/chromium/media/capture/video/shared_memory_buffer_tracker.h rename to media/capture/video/shared_memory_buffer_tracker.h diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_handle.cc b/media/capture/video/video_capture_buffer_handle.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_handle.cc rename to media/capture/video/video_capture_buffer_handle.cc diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_handle.h b/media/capture/video/video_capture_buffer_handle.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_handle.h rename to media/capture/video/video_capture_buffer_handle.h diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_pool.h b/media/capture/video/video_capture_buffer_pool.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_pool.h rename to media/capture/video/video_capture_buffer_pool.h diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_pool_impl.cc b/media/capture/video/video_capture_buffer_pool_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_pool_impl.cc rename to media/capture/video/video_capture_buffer_pool_impl.cc diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_pool_impl.h b/media/capture/video/video_capture_buffer_pool_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_pool_impl.h rename to media/capture/video/video_capture_buffer_pool_impl.h diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_pool_util.cc b/media/capture/video/video_capture_buffer_pool_util.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_pool_util.cc rename to media/capture/video/video_capture_buffer_pool_util.cc diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_pool_util.h b/media/capture/video/video_capture_buffer_pool_util.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_pool_util.h rename to media/capture/video/video_capture_buffer_pool_util.h diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_tracker.cc b/media/capture/video/video_capture_buffer_tracker.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_tracker.cc rename to media/capture/video/video_capture_buffer_tracker.cc diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_tracker.h b/media/capture/video/video_capture_buffer_tracker.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_tracker.h rename to media/capture/video/video_capture_buffer_tracker.h diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_tracker_factory.h b/media/capture/video/video_capture_buffer_tracker_factory.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_tracker_factory.h rename to media/capture/video/video_capture_buffer_tracker_factory.h diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_tracker_factory_impl.cc b/media/capture/video/video_capture_buffer_tracker_factory_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_tracker_factory_impl.cc rename to media/capture/video/video_capture_buffer_tracker_factory_impl.cc diff --git a/third_party/chromium/media/capture/video/video_capture_buffer_tracker_factory_impl.h b/media/capture/video/video_capture_buffer_tracker_factory_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_buffer_tracker_factory_impl.h rename to media/capture/video/video_capture_buffer_tracker_factory_impl.h diff --git a/third_party/chromium/media/capture/video/video_capture_device.cc b/media/capture/video/video_capture_device.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device.cc rename to media/capture/video/video_capture_device.cc diff --git a/third_party/chromium/media/capture/video/video_capture_device.h b/media/capture/video/video_capture_device.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device.h rename to media/capture/video/video_capture_device.h diff --git a/third_party/chromium/media/capture/video/video_capture_device_client.cc b/media/capture/video/video_capture_device_client.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_client.cc rename to media/capture/video/video_capture_device_client.cc diff --git a/third_party/chromium/media/capture/video/video_capture_device_client.h b/media/capture/video/video_capture_device_client.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_client.h rename to media/capture/video/video_capture_device_client.h diff --git a/third_party/chromium/media/capture/video/video_capture_device_client_unittest.cc b/media/capture/video/video_capture_device_client_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_client_unittest.cc rename to media/capture/video/video_capture_device_client_unittest.cc diff --git a/third_party/chromium/media/capture/video/video_capture_device_descriptor.cc b/media/capture/video/video_capture_device_descriptor.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_descriptor.cc rename to media/capture/video/video_capture_device_descriptor.cc diff --git a/third_party/chromium/media/capture/video/video_capture_device_descriptor.h b/media/capture/video/video_capture_device_descriptor.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_descriptor.h rename to media/capture/video/video_capture_device_descriptor.h diff --git a/third_party/chromium/media/capture/video/video_capture_device_factory.cc b/media/capture/video/video_capture_device_factory.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_factory.cc rename to media/capture/video/video_capture_device_factory.cc diff --git a/third_party/chromium/media/capture/video/video_capture_device_factory.h b/media/capture/video/video_capture_device_factory.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_factory.h rename to media/capture/video/video_capture_device_factory.h diff --git a/third_party/chromium/media/capture/video/video_capture_device_info.cc b/media/capture/video/video_capture_device_info.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_info.cc rename to media/capture/video/video_capture_device_info.cc diff --git a/third_party/chromium/media/capture/video/video_capture_device_info.h b/media/capture/video/video_capture_device_info.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_info.h rename to media/capture/video/video_capture_device_info.h diff --git a/third_party/chromium/media/capture/video/video_capture_device_unittest.cc b/media/capture/video/video_capture_device_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_device_unittest.cc rename to media/capture/video/video_capture_device_unittest.cc diff --git a/third_party/chromium/media/capture/video/video_capture_feedback.cc b/media/capture/video/video_capture_feedback.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_feedback.cc rename to media/capture/video/video_capture_feedback.cc diff --git a/third_party/chromium/media/capture/video/video_capture_feedback.h b/media/capture/video/video_capture_feedback.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_feedback.h rename to media/capture/video/video_capture_feedback.h diff --git a/third_party/chromium/media/capture/video/video_capture_metrics.cc b/media/capture/video/video_capture_metrics.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_metrics.cc rename to media/capture/video/video_capture_metrics.cc diff --git a/third_party/chromium/media/capture/video/video_capture_metrics.h b/media/capture/video/video_capture_metrics.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_metrics.h rename to media/capture/video/video_capture_metrics.h diff --git a/third_party/chromium/media/capture/video/video_capture_metrics_unittest.cc b/media/capture/video/video_capture_metrics_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_metrics_unittest.cc rename to media/capture/video/video_capture_metrics_unittest.cc diff --git a/third_party/chromium/media/capture/video/video_capture_system.h b/media/capture/video/video_capture_system.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_system.h rename to media/capture/video/video_capture_system.h diff --git a/third_party/chromium/media/capture/video/video_capture_system_impl.cc b/media/capture/video/video_capture_system_impl.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_system_impl.cc rename to media/capture/video/video_capture_system_impl.cc diff --git a/third_party/chromium/media/capture/video/video_capture_system_impl.h b/media/capture/video/video_capture_system_impl.h similarity index 100% rename from third_party/chromium/media/capture/video/video_capture_system_impl.h rename to media/capture/video/video_capture_system_impl.h diff --git a/third_party/chromium/media/capture/video/video_frame_receiver.cc b/media/capture/video/video_frame_receiver.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_frame_receiver.cc rename to media/capture/video/video_frame_receiver.cc diff --git a/third_party/chromium/media/capture/video/video_frame_receiver.h b/media/capture/video/video_frame_receiver.h similarity index 100% rename from third_party/chromium/media/capture/video/video_frame_receiver.h rename to media/capture/video/video_frame_receiver.h diff --git a/third_party/chromium/media/capture/video/video_frame_receiver_on_task_runner.cc b/media/capture/video/video_frame_receiver_on_task_runner.cc similarity index 100% rename from third_party/chromium/media/capture/video/video_frame_receiver_on_task_runner.cc rename to media/capture/video/video_frame_receiver_on_task_runner.cc diff --git a/third_party/chromium/media/capture/video/video_frame_receiver_on_task_runner.h b/media/capture/video/video_frame_receiver_on_task_runner.h similarity index 100% rename from third_party/chromium/media/capture/video/video_frame_receiver_on_task_runner.h rename to media/capture/video/video_frame_receiver_on_task_runner.h diff --git a/third_party/chromium/media/capture/video/win/OWNERS b/media/capture/video/win/OWNERS similarity index 100% rename from third_party/chromium/media/capture/video/win/OWNERS rename to media/capture/video/win/OWNERS diff --git a/third_party/chromium/media/capture/video/win/capability_list_win.cc b/media/capture/video/win/capability_list_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/capability_list_win.cc rename to media/capture/video/win/capability_list_win.cc diff --git a/third_party/chromium/media/capture/video/win/capability_list_win.h b/media/capture/video/win/capability_list_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/capability_list_win.h rename to media/capture/video/win/capability_list_win.h diff --git a/third_party/chromium/media/capture/video/win/d3d_capture_test_utils.cc b/media/capture/video/win/d3d_capture_test_utils.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/d3d_capture_test_utils.cc rename to media/capture/video/win/d3d_capture_test_utils.cc diff --git a/third_party/chromium/media/capture/video/win/d3d_capture_test_utils.h b/media/capture/video/win/d3d_capture_test_utils.h similarity index 100% rename from third_party/chromium/media/capture/video/win/d3d_capture_test_utils.h rename to media/capture/video/win/d3d_capture_test_utils.h diff --git a/third_party/chromium/media/capture/video/win/filter_base_win.cc b/media/capture/video/win/filter_base_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/filter_base_win.cc rename to media/capture/video/win/filter_base_win.cc diff --git a/third_party/chromium/media/capture/video/win/filter_base_win.h b/media/capture/video/win/filter_base_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/filter_base_win.h rename to media/capture/video/win/filter_base_win.h diff --git a/third_party/chromium/media/capture/video/win/gpu_memory_buffer_tracker.cc b/media/capture/video/win/gpu_memory_buffer_tracker.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/gpu_memory_buffer_tracker.cc rename to media/capture/video/win/gpu_memory_buffer_tracker.cc diff --git a/third_party/chromium/media/capture/video/win/gpu_memory_buffer_tracker.h b/media/capture/video/win/gpu_memory_buffer_tracker.h similarity index 100% rename from third_party/chromium/media/capture/video/win/gpu_memory_buffer_tracker.h rename to media/capture/video/win/gpu_memory_buffer_tracker.h diff --git a/third_party/chromium/media/capture/video/win/gpu_memory_buffer_tracker_unittest.cc b/media/capture/video/win/gpu_memory_buffer_tracker_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/gpu_memory_buffer_tracker_unittest.cc rename to media/capture/video/win/gpu_memory_buffer_tracker_unittest.cc diff --git a/third_party/chromium/media/capture/video/win/metrics.cc b/media/capture/video/win/metrics.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/metrics.cc rename to media/capture/video/win/metrics.cc diff --git a/third_party/chromium/media/capture/video/win/metrics.h b/media/capture/video/win/metrics.h similarity index 100% rename from third_party/chromium/media/capture/video/win/metrics.h rename to media/capture/video/win/metrics.h diff --git a/third_party/chromium/media/capture/video/win/pin_base_win.cc b/media/capture/video/win/pin_base_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/pin_base_win.cc rename to media/capture/video/win/pin_base_win.cc diff --git a/third_party/chromium/media/capture/video/win/pin_base_win.h b/media/capture/video/win/pin_base_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/pin_base_win.h rename to media/capture/video/win/pin_base_win.h diff --git a/third_party/chromium/media/capture/video/win/sink_filter_observer_win.h b/media/capture/video/win/sink_filter_observer_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/sink_filter_observer_win.h rename to media/capture/video/win/sink_filter_observer_win.h diff --git a/third_party/chromium/media/capture/video/win/sink_filter_win.cc b/media/capture/video/win/sink_filter_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/sink_filter_win.cc rename to media/capture/video/win/sink_filter_win.cc diff --git a/third_party/chromium/media/capture/video/win/sink_filter_win.h b/media/capture/video/win/sink_filter_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/sink_filter_win.h rename to media/capture/video/win/sink_filter_win.h diff --git a/third_party/chromium/media/capture/video/win/sink_input_pin_win.cc b/media/capture/video/win/sink_input_pin_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/sink_input_pin_win.cc rename to media/capture/video/win/sink_input_pin_win.cc diff --git a/third_party/chromium/media/capture/video/win/sink_input_pin_win.h b/media/capture/video/win/sink_input_pin_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/sink_input_pin_win.h rename to media/capture/video/win/sink_input_pin_win.h diff --git a/third_party/chromium/media/capture/video/win/video_capture_buffer_tracker_factory_win.cc b/media/capture/video/win/video_capture_buffer_tracker_factory_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_buffer_tracker_factory_win.cc rename to media/capture/video/win/video_capture_buffer_tracker_factory_win.cc diff --git a/third_party/chromium/media/capture/video/win/video_capture_buffer_tracker_factory_win.h b/media/capture/video/win/video_capture_buffer_tracker_factory_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_buffer_tracker_factory_win.h rename to media/capture/video/win/video_capture_buffer_tracker_factory_win.h diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_factory_win.cc b/media/capture/video/win/video_capture_device_factory_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_factory_win.cc rename to media/capture/video/win/video_capture_device_factory_win.cc diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_factory_win.h b/media/capture/video/win/video_capture_device_factory_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_factory_win.h rename to media/capture/video/win/video_capture_device_factory_win.h diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_factory_win_unittest.cc b/media/capture/video/win/video_capture_device_factory_win_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_factory_win_unittest.cc rename to media/capture/video/win/video_capture_device_factory_win_unittest.cc diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_mf_win.cc b/media/capture/video/win/video_capture_device_mf_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_mf_win.cc rename to media/capture/video/win/video_capture_device_mf_win.cc diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_mf_win.h b/media/capture/video/win/video_capture_device_mf_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_mf_win.h rename to media/capture/video/win/video_capture_device_mf_win.h diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_mf_win_unittest.cc b/media/capture/video/win/video_capture_device_mf_win_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_mf_win_unittest.cc rename to media/capture/video/win/video_capture_device_mf_win_unittest.cc diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_utils_win.cc b/media/capture/video/win/video_capture_device_utils_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_utils_win.cc rename to media/capture/video/win/video_capture_device_utils_win.cc diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_utils_win.h b/media/capture/video/win/video_capture_device_utils_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_utils_win.h rename to media/capture/video/win/video_capture_device_utils_win.h diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_win.cc b/media/capture/video/win/video_capture_device_win.cc similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_win.cc rename to media/capture/video/win/video_capture_device_win.cc diff --git a/third_party/chromium/media/capture/video/win/video_capture_device_win.h b/media/capture/video/win/video_capture_device_win.h similarity index 100% rename from third_party/chromium/media/capture/video/win/video_capture_device_win.h rename to media/capture/video/win/video_capture_device_win.h diff --git a/third_party/chromium/media/capture/video_capture_types.cc b/media/capture/video_capture_types.cc similarity index 100% rename from third_party/chromium/media/capture/video_capture_types.cc rename to media/capture/video_capture_types.cc diff --git a/third_party/chromium/media/capture/video_capture_types.h b/media/capture/video_capture_types.h similarity index 100% rename from third_party/chromium/media/capture/video_capture_types.h rename to media/capture/video_capture_types.h diff --git a/third_party/chromium/media/capture/video_capture_types_unittest.cc b/media/capture/video_capture_types_unittest.cc similarity index 100% rename from third_party/chromium/media/capture/video_capture_types_unittest.cc rename to media/capture/video_capture_types_unittest.cc diff --git a/third_party/chromium/media/capture/video_capturer_source.cc b/media/capture/video_capturer_source.cc similarity index 100% rename from third_party/chromium/media/capture/video_capturer_source.cc rename to media/capture/video_capturer_source.cc diff --git a/third_party/chromium/media/capture/video_capturer_source.h b/media/capture/video_capturer_source.h similarity index 100% rename from third_party/chromium/media/capture/video_capturer_source.h rename to media/capture/video_capturer_source.h diff --git a/third_party/chromium/media/cast/BUILD.gn b/media/cast/BUILD.gn similarity index 100% rename from third_party/chromium/media/cast/BUILD.gn rename to media/cast/BUILD.gn diff --git a/third_party/chromium/media/cast/DEPS b/media/cast/DEPS similarity index 100% rename from third_party/chromium/media/cast/DEPS rename to media/cast/DEPS diff --git a/third_party/chromium/media/cast/DIR_METADATA b/media/cast/DIR_METADATA similarity index 100% rename from third_party/chromium/media/cast/DIR_METADATA rename to media/cast/DIR_METADATA diff --git a/third_party/chromium/media/cast/OWNERS b/media/cast/OWNERS similarity index 100% rename from third_party/chromium/media/cast/OWNERS rename to media/cast/OWNERS diff --git a/third_party/chromium/media/cast/README.md b/media/cast/README.md similarity index 100% rename from third_party/chromium/media/cast/README.md rename to media/cast/README.md diff --git a/third_party/chromium/media/cast/cast_config.cc b/media/cast/cast_config.cc similarity index 100% rename from third_party/chromium/media/cast/cast_config.cc rename to media/cast/cast_config.cc diff --git a/third_party/chromium/media/cast/cast_config.h b/media/cast/cast_config.h similarity index 100% rename from third_party/chromium/media/cast/cast_config.h rename to media/cast/cast_config.h diff --git a/third_party/chromium/media/cast/cast_environment.cc b/media/cast/cast_environment.cc similarity index 100% rename from third_party/chromium/media/cast/cast_environment.cc rename to media/cast/cast_environment.cc diff --git a/third_party/chromium/media/cast/cast_environment.h b/media/cast/cast_environment.h similarity index 100% rename from third_party/chromium/media/cast/cast_environment.h rename to media/cast/cast_environment.h diff --git a/third_party/chromium/media/cast/cast_sender.h b/media/cast/cast_sender.h similarity index 100% rename from third_party/chromium/media/cast/cast_sender.h rename to media/cast/cast_sender.h diff --git a/third_party/chromium/media/cast/cast_sender_impl.cc b/media/cast/cast_sender_impl.cc similarity index 100% rename from third_party/chromium/media/cast/cast_sender_impl.cc rename to media/cast/cast_sender_impl.cc diff --git a/third_party/chromium/media/cast/cast_sender_impl.h b/media/cast/cast_sender_impl.h similarity index 100% rename from third_party/chromium/media/cast/cast_sender_impl.h rename to media/cast/cast_sender_impl.h diff --git a/third_party/chromium/media/cast/common/clock_drift_smoother.cc b/media/cast/common/clock_drift_smoother.cc similarity index 100% rename from third_party/chromium/media/cast/common/clock_drift_smoother.cc rename to media/cast/common/clock_drift_smoother.cc diff --git a/third_party/chromium/media/cast/common/clock_drift_smoother.h b/media/cast/common/clock_drift_smoother.h similarity index 100% rename from third_party/chromium/media/cast/common/clock_drift_smoother.h rename to media/cast/common/clock_drift_smoother.h diff --git a/third_party/chromium/media/cast/common/expanded_value_base.h b/media/cast/common/expanded_value_base.h similarity index 100% rename from third_party/chromium/media/cast/common/expanded_value_base.h rename to media/cast/common/expanded_value_base.h diff --git a/third_party/chromium/media/cast/common/expanded_value_base_unittest.cc b/media/cast/common/expanded_value_base_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/common/expanded_value_base_unittest.cc rename to media/cast/common/expanded_value_base_unittest.cc diff --git a/third_party/chromium/media/cast/common/frame_id.cc b/media/cast/common/frame_id.cc similarity index 100% rename from third_party/chromium/media/cast/common/frame_id.cc rename to media/cast/common/frame_id.cc diff --git a/third_party/chromium/media/cast/common/frame_id.h b/media/cast/common/frame_id.h similarity index 100% rename from third_party/chromium/media/cast/common/frame_id.h rename to media/cast/common/frame_id.h diff --git a/third_party/chromium/media/cast/common/mod_util.h b/media/cast/common/mod_util.h similarity index 100% rename from third_party/chromium/media/cast/common/mod_util.h rename to media/cast/common/mod_util.h diff --git a/third_party/chromium/media/cast/common/rtp_time.cc b/media/cast/common/rtp_time.cc similarity index 100% rename from third_party/chromium/media/cast/common/rtp_time.cc rename to media/cast/common/rtp_time.cc diff --git a/third_party/chromium/media/cast/common/rtp_time.h b/media/cast/common/rtp_time.h similarity index 100% rename from third_party/chromium/media/cast/common/rtp_time.h rename to media/cast/common/rtp_time.h diff --git a/third_party/chromium/media/cast/common/rtp_time_unittest.cc b/media/cast/common/rtp_time_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/common/rtp_time_unittest.cc rename to media/cast/common/rtp_time_unittest.cc diff --git a/third_party/chromium/media/cast/common/transport_encryption_handler.cc b/media/cast/common/transport_encryption_handler.cc similarity index 100% rename from third_party/chromium/media/cast/common/transport_encryption_handler.cc rename to media/cast/common/transport_encryption_handler.cc diff --git a/third_party/chromium/media/cast/common/transport_encryption_handler.h b/media/cast/common/transport_encryption_handler.h similarity index 100% rename from third_party/chromium/media/cast/common/transport_encryption_handler.h rename to media/cast/common/transport_encryption_handler.h diff --git a/third_party/chromium/media/cast/constants.h b/media/cast/constants.h similarity index 100% rename from third_party/chromium/media/cast/constants.h rename to media/cast/constants.h diff --git a/third_party/chromium/media/cast/logging/encoding_event_subscriber.cc b/media/cast/logging/encoding_event_subscriber.cc similarity index 100% rename from third_party/chromium/media/cast/logging/encoding_event_subscriber.cc rename to media/cast/logging/encoding_event_subscriber.cc diff --git a/third_party/chromium/media/cast/logging/encoding_event_subscriber.h b/media/cast/logging/encoding_event_subscriber.h similarity index 100% rename from third_party/chromium/media/cast/logging/encoding_event_subscriber.h rename to media/cast/logging/encoding_event_subscriber.h diff --git a/third_party/chromium/media/cast/logging/encoding_event_subscriber_unittest.cc b/media/cast/logging/encoding_event_subscriber_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/logging/encoding_event_subscriber_unittest.cc rename to media/cast/logging/encoding_event_subscriber_unittest.cc diff --git a/third_party/chromium/media/cast/logging/log_event_dispatcher.cc b/media/cast/logging/log_event_dispatcher.cc similarity index 100% rename from third_party/chromium/media/cast/logging/log_event_dispatcher.cc rename to media/cast/logging/log_event_dispatcher.cc diff --git a/third_party/chromium/media/cast/logging/log_event_dispatcher.h b/media/cast/logging/log_event_dispatcher.h similarity index 100% rename from third_party/chromium/media/cast/logging/log_event_dispatcher.h rename to media/cast/logging/log_event_dispatcher.h diff --git a/third_party/chromium/media/cast/logging/logging_defines.cc b/media/cast/logging/logging_defines.cc similarity index 100% rename from third_party/chromium/media/cast/logging/logging_defines.cc rename to media/cast/logging/logging_defines.cc diff --git a/third_party/chromium/media/cast/logging/logging_defines.h b/media/cast/logging/logging_defines.h similarity index 100% rename from third_party/chromium/media/cast/logging/logging_defines.h rename to media/cast/logging/logging_defines.h diff --git a/third_party/chromium/media/cast/logging/proto/proto_utils.cc b/media/cast/logging/proto/proto_utils.cc similarity index 100% rename from third_party/chromium/media/cast/logging/proto/proto_utils.cc rename to media/cast/logging/proto/proto_utils.cc diff --git a/third_party/chromium/media/cast/logging/proto/proto_utils.h b/media/cast/logging/proto/proto_utils.h similarity index 100% rename from third_party/chromium/media/cast/logging/proto/proto_utils.h rename to media/cast/logging/proto/proto_utils.h diff --git a/third_party/chromium/media/cast/logging/proto/raw_events.proto b/media/cast/logging/proto/raw_events.proto similarity index 100% rename from third_party/chromium/media/cast/logging/proto/raw_events.proto rename to media/cast/logging/proto/raw_events.proto diff --git a/third_party/chromium/media/cast/logging/raw_event_subscriber.h b/media/cast/logging/raw_event_subscriber.h similarity index 100% rename from third_party/chromium/media/cast/logging/raw_event_subscriber.h rename to media/cast/logging/raw_event_subscriber.h diff --git a/third_party/chromium/media/cast/logging/raw_event_subscriber_bundle.cc b/media/cast/logging/raw_event_subscriber_bundle.cc similarity index 100% rename from third_party/chromium/media/cast/logging/raw_event_subscriber_bundle.cc rename to media/cast/logging/raw_event_subscriber_bundle.cc diff --git a/third_party/chromium/media/cast/logging/raw_event_subscriber_bundle.h b/media/cast/logging/raw_event_subscriber_bundle.h similarity index 100% rename from third_party/chromium/media/cast/logging/raw_event_subscriber_bundle.h rename to media/cast/logging/raw_event_subscriber_bundle.h diff --git a/third_party/chromium/media/cast/logging/receiver_time_offset_estimator.h b/media/cast/logging/receiver_time_offset_estimator.h similarity index 100% rename from third_party/chromium/media/cast/logging/receiver_time_offset_estimator.h rename to media/cast/logging/receiver_time_offset_estimator.h diff --git a/third_party/chromium/media/cast/logging/receiver_time_offset_estimator_impl.cc b/media/cast/logging/receiver_time_offset_estimator_impl.cc similarity index 100% rename from third_party/chromium/media/cast/logging/receiver_time_offset_estimator_impl.cc rename to media/cast/logging/receiver_time_offset_estimator_impl.cc diff --git a/third_party/chromium/media/cast/logging/receiver_time_offset_estimator_impl.h b/media/cast/logging/receiver_time_offset_estimator_impl.h similarity index 100% rename from third_party/chromium/media/cast/logging/receiver_time_offset_estimator_impl.h rename to media/cast/logging/receiver_time_offset_estimator_impl.h diff --git a/third_party/chromium/media/cast/logging/receiver_time_offset_estimator_impl_unittest.cc b/media/cast/logging/receiver_time_offset_estimator_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/logging/receiver_time_offset_estimator_impl_unittest.cc rename to media/cast/logging/receiver_time_offset_estimator_impl_unittest.cc diff --git a/third_party/chromium/media/cast/logging/simple_event_subscriber.cc b/media/cast/logging/simple_event_subscriber.cc similarity index 100% rename from third_party/chromium/media/cast/logging/simple_event_subscriber.cc rename to media/cast/logging/simple_event_subscriber.cc diff --git a/third_party/chromium/media/cast/logging/simple_event_subscriber.h b/media/cast/logging/simple_event_subscriber.h similarity index 100% rename from third_party/chromium/media/cast/logging/simple_event_subscriber.h rename to media/cast/logging/simple_event_subscriber.h diff --git a/third_party/chromium/media/cast/logging/simple_event_subscriber_unittest.cc b/media/cast/logging/simple_event_subscriber_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/logging/simple_event_subscriber_unittest.cc rename to media/cast/logging/simple_event_subscriber_unittest.cc diff --git a/third_party/chromium/media/cast/logging/stats_event_subscriber.cc b/media/cast/logging/stats_event_subscriber.cc similarity index 100% rename from third_party/chromium/media/cast/logging/stats_event_subscriber.cc rename to media/cast/logging/stats_event_subscriber.cc diff --git a/third_party/chromium/media/cast/logging/stats_event_subscriber.h b/media/cast/logging/stats_event_subscriber.h similarity index 100% rename from third_party/chromium/media/cast/logging/stats_event_subscriber.h rename to media/cast/logging/stats_event_subscriber.h diff --git a/third_party/chromium/media/cast/logging/stats_event_subscriber_unittest.cc b/media/cast/logging/stats_event_subscriber_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/logging/stats_event_subscriber_unittest.cc rename to media/cast/logging/stats_event_subscriber_unittest.cc diff --git a/third_party/chromium/media/cast/net/DEPS b/media/cast/net/DEPS similarity index 100% rename from third_party/chromium/media/cast/net/DEPS rename to media/cast/net/DEPS diff --git a/third_party/chromium/media/cast/net/cast_transport.h b/media/cast/net/cast_transport.h similarity index 100% rename from third_party/chromium/media/cast/net/cast_transport.h rename to media/cast/net/cast_transport.h diff --git a/third_party/chromium/media/cast/net/cast_transport_config.cc b/media/cast/net/cast_transport_config.cc similarity index 100% rename from third_party/chromium/media/cast/net/cast_transport_config.cc rename to media/cast/net/cast_transport_config.cc diff --git a/third_party/chromium/media/cast/net/cast_transport_config.h b/media/cast/net/cast_transport_config.h similarity index 100% rename from third_party/chromium/media/cast/net/cast_transport_config.h rename to media/cast/net/cast_transport_config.h diff --git a/third_party/chromium/media/cast/net/cast_transport_defines.h b/media/cast/net/cast_transport_defines.h similarity index 100% rename from third_party/chromium/media/cast/net/cast_transport_defines.h rename to media/cast/net/cast_transport_defines.h diff --git a/third_party/chromium/media/cast/net/cast_transport_impl.cc b/media/cast/net/cast_transport_impl.cc similarity index 100% rename from third_party/chromium/media/cast/net/cast_transport_impl.cc rename to media/cast/net/cast_transport_impl.cc diff --git a/third_party/chromium/media/cast/net/cast_transport_impl.h b/media/cast/net/cast_transport_impl.h similarity index 100% rename from third_party/chromium/media/cast/net/cast_transport_impl.h rename to media/cast/net/cast_transport_impl.h diff --git a/third_party/chromium/media/cast/net/cast_transport_impl_unittest.cc b/media/cast/net/cast_transport_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/cast_transport_impl_unittest.cc rename to media/cast/net/cast_transport_impl_unittest.cc diff --git a/third_party/chromium/media/cast/net/pacing/mock_paced_packet_sender.cc b/media/cast/net/pacing/mock_paced_packet_sender.cc similarity index 100% rename from third_party/chromium/media/cast/net/pacing/mock_paced_packet_sender.cc rename to media/cast/net/pacing/mock_paced_packet_sender.cc diff --git a/third_party/chromium/media/cast/net/pacing/mock_paced_packet_sender.h b/media/cast/net/pacing/mock_paced_packet_sender.h similarity index 100% rename from third_party/chromium/media/cast/net/pacing/mock_paced_packet_sender.h rename to media/cast/net/pacing/mock_paced_packet_sender.h diff --git a/third_party/chromium/media/cast/net/pacing/paced_sender.cc b/media/cast/net/pacing/paced_sender.cc similarity index 100% rename from third_party/chromium/media/cast/net/pacing/paced_sender.cc rename to media/cast/net/pacing/paced_sender.cc diff --git a/third_party/chromium/media/cast/net/pacing/paced_sender.h b/media/cast/net/pacing/paced_sender.h similarity index 100% rename from third_party/chromium/media/cast/net/pacing/paced_sender.h rename to media/cast/net/pacing/paced_sender.h diff --git a/third_party/chromium/media/cast/net/pacing/paced_sender_unittest.cc b/media/cast/net/pacing/paced_sender_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/pacing/paced_sender_unittest.cc rename to media/cast/net/pacing/paced_sender_unittest.cc diff --git a/third_party/chromium/media/cast/net/rtcp/receiver_rtcp_event_subscriber.cc b/media/cast/net/rtcp/receiver_rtcp_event_subscriber.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/receiver_rtcp_event_subscriber.cc rename to media/cast/net/rtcp/receiver_rtcp_event_subscriber.cc diff --git a/third_party/chromium/media/cast/net/rtcp/receiver_rtcp_event_subscriber.h b/media/cast/net/rtcp/receiver_rtcp_event_subscriber.h similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/receiver_rtcp_event_subscriber.h rename to media/cast/net/rtcp/receiver_rtcp_event_subscriber.h diff --git a/third_party/chromium/media/cast/net/rtcp/receiver_rtcp_event_subscriber_unittest.cc b/media/cast/net/rtcp/receiver_rtcp_event_subscriber_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/receiver_rtcp_event_subscriber_unittest.cc rename to media/cast/net/rtcp/receiver_rtcp_event_subscriber_unittest.cc diff --git a/third_party/chromium/media/cast/net/rtcp/receiver_rtcp_session.cc b/media/cast/net/rtcp/receiver_rtcp_session.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/receiver_rtcp_session.cc rename to media/cast/net/rtcp/receiver_rtcp_session.cc diff --git a/third_party/chromium/media/cast/net/rtcp/receiver_rtcp_session.h b/media/cast/net/rtcp/receiver_rtcp_session.h similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/receiver_rtcp_session.h rename to media/cast/net/rtcp/receiver_rtcp_session.h diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_builder.cc b/media/cast/net/rtcp/rtcp_builder.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_builder.cc rename to media/cast/net/rtcp/rtcp_builder.cc diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_builder.h b/media/cast/net/rtcp/rtcp_builder.h similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_builder.h rename to media/cast/net/rtcp/rtcp_builder.h diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_builder_unittest.cc b/media/cast/net/rtcp/rtcp_builder_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_builder_unittest.cc rename to media/cast/net/rtcp/rtcp_builder_unittest.cc diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_defines.cc b/media/cast/net/rtcp/rtcp_defines.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_defines.cc rename to media/cast/net/rtcp/rtcp_defines.cc diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_defines.h b/media/cast/net/rtcp/rtcp_defines.h similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_defines.h rename to media/cast/net/rtcp/rtcp_defines.h diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_session.h b/media/cast/net/rtcp/rtcp_session.h similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_session.h rename to media/cast/net/rtcp/rtcp_session.h diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_unittest.cc b/media/cast/net/rtcp/rtcp_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_unittest.cc rename to media/cast/net/rtcp/rtcp_unittest.cc diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_utility.cc b/media/cast/net/rtcp/rtcp_utility.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_utility.cc rename to media/cast/net/rtcp/rtcp_utility.cc diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_utility.h b/media/cast/net/rtcp/rtcp_utility.h similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_utility.h rename to media/cast/net/rtcp/rtcp_utility.h diff --git a/third_party/chromium/media/cast/net/rtcp/rtcp_utility_unittest.cc b/media/cast/net/rtcp/rtcp_utility_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/rtcp_utility_unittest.cc rename to media/cast/net/rtcp/rtcp_utility_unittest.cc diff --git a/third_party/chromium/media/cast/net/rtcp/sender_rtcp_session.cc b/media/cast/net/rtcp/sender_rtcp_session.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/sender_rtcp_session.cc rename to media/cast/net/rtcp/sender_rtcp_session.cc diff --git a/third_party/chromium/media/cast/net/rtcp/sender_rtcp_session.h b/media/cast/net/rtcp/sender_rtcp_session.h similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/sender_rtcp_session.h rename to media/cast/net/rtcp/sender_rtcp_session.h diff --git a/third_party/chromium/media/cast/net/rtcp/test_rtcp_packet_builder.cc b/media/cast/net/rtcp/test_rtcp_packet_builder.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/test_rtcp_packet_builder.cc rename to media/cast/net/rtcp/test_rtcp_packet_builder.cc diff --git a/third_party/chromium/media/cast/net/rtcp/test_rtcp_packet_builder.h b/media/cast/net/rtcp/test_rtcp_packet_builder.h similarity index 100% rename from third_party/chromium/media/cast/net/rtcp/test_rtcp_packet_builder.h rename to media/cast/net/rtcp/test_rtcp_packet_builder.h diff --git a/third_party/chromium/media/cast/net/rtp/mock_rtp_feedback.h b/media/cast/net/rtp/mock_rtp_feedback.h similarity index 100% rename from third_party/chromium/media/cast/net/rtp/mock_rtp_feedback.h rename to media/cast/net/rtp/mock_rtp_feedback.h diff --git a/third_party/chromium/media/cast/net/rtp/mock_rtp_payload_feedback.cc b/media/cast/net/rtp/mock_rtp_payload_feedback.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/mock_rtp_payload_feedback.cc rename to media/cast/net/rtp/mock_rtp_payload_feedback.cc diff --git a/third_party/chromium/media/cast/net/rtp/mock_rtp_payload_feedback.h b/media/cast/net/rtp/mock_rtp_payload_feedback.h similarity index 100% rename from third_party/chromium/media/cast/net/rtp/mock_rtp_payload_feedback.h rename to media/cast/net/rtp/mock_rtp_payload_feedback.h diff --git a/third_party/chromium/media/cast/net/rtp/packet_storage.cc b/media/cast/net/rtp/packet_storage.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/packet_storage.cc rename to media/cast/net/rtp/packet_storage.cc diff --git a/third_party/chromium/media/cast/net/rtp/packet_storage.h b/media/cast/net/rtp/packet_storage.h similarity index 100% rename from third_party/chromium/media/cast/net/rtp/packet_storage.h rename to media/cast/net/rtp/packet_storage.h diff --git a/third_party/chromium/media/cast/net/rtp/packet_storage_unittest.cc b/media/cast/net/rtp/packet_storage_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/packet_storage_unittest.cc rename to media/cast/net/rtp/packet_storage_unittest.cc diff --git a/third_party/chromium/media/cast/net/rtp/rtp_defines.cc b/media/cast/net/rtp/rtp_defines.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_defines.cc rename to media/cast/net/rtp/rtp_defines.cc diff --git a/third_party/chromium/media/cast/net/rtp/rtp_defines.h b/media/cast/net/rtp/rtp_defines.h similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_defines.h rename to media/cast/net/rtp/rtp_defines.h diff --git a/third_party/chromium/media/cast/net/rtp/rtp_packet_builder.cc b/media/cast/net/rtp/rtp_packet_builder.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_packet_builder.cc rename to media/cast/net/rtp/rtp_packet_builder.cc diff --git a/third_party/chromium/media/cast/net/rtp/rtp_packet_builder.h b/media/cast/net/rtp/rtp_packet_builder.h similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_packet_builder.h rename to media/cast/net/rtp/rtp_packet_builder.h diff --git a/third_party/chromium/media/cast/net/rtp/rtp_packetizer.cc b/media/cast/net/rtp/rtp_packetizer.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_packetizer.cc rename to media/cast/net/rtp/rtp_packetizer.cc diff --git a/third_party/chromium/media/cast/net/rtp/rtp_packetizer.h b/media/cast/net/rtp/rtp_packetizer.h similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_packetizer.h rename to media/cast/net/rtp/rtp_packetizer.h diff --git a/third_party/chromium/media/cast/net/rtp/rtp_packetizer_unittest.cc b/media/cast/net/rtp/rtp_packetizer_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_packetizer_unittest.cc rename to media/cast/net/rtp/rtp_packetizer_unittest.cc diff --git a/third_party/chromium/media/cast/net/rtp/rtp_parser.cc b/media/cast/net/rtp/rtp_parser.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_parser.cc rename to media/cast/net/rtp/rtp_parser.cc diff --git a/third_party/chromium/media/cast/net/rtp/rtp_parser.h b/media/cast/net/rtp/rtp_parser.h similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_parser.h rename to media/cast/net/rtp/rtp_parser.h diff --git a/third_party/chromium/media/cast/net/rtp/rtp_parser_unittest.cc b/media/cast/net/rtp/rtp_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_parser_unittest.cc rename to media/cast/net/rtp/rtp_parser_unittest.cc diff --git a/third_party/chromium/media/cast/net/rtp/rtp_sender.cc b/media/cast/net/rtp/rtp_sender.cc similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_sender.cc rename to media/cast/net/rtp/rtp_sender.cc diff --git a/third_party/chromium/media/cast/net/rtp/rtp_sender.h b/media/cast/net/rtp/rtp_sender.h similarity index 100% rename from third_party/chromium/media/cast/net/rtp/rtp_sender.h rename to media/cast/net/rtp/rtp_sender.h diff --git a/third_party/chromium/media/cast/net/transport_util.cc b/media/cast/net/transport_util.cc similarity index 100% rename from third_party/chromium/media/cast/net/transport_util.cc rename to media/cast/net/transport_util.cc diff --git a/third_party/chromium/media/cast/net/transport_util.h b/media/cast/net/transport_util.h similarity index 100% rename from third_party/chromium/media/cast/net/transport_util.h rename to media/cast/net/transport_util.h diff --git a/third_party/chromium/media/cast/net/udp_packet_pipe.cc b/media/cast/net/udp_packet_pipe.cc similarity index 100% rename from third_party/chromium/media/cast/net/udp_packet_pipe.cc rename to media/cast/net/udp_packet_pipe.cc diff --git a/third_party/chromium/media/cast/net/udp_packet_pipe.h b/media/cast/net/udp_packet_pipe.h similarity index 100% rename from third_party/chromium/media/cast/net/udp_packet_pipe.h rename to media/cast/net/udp_packet_pipe.h diff --git a/third_party/chromium/media/cast/net/udp_packet_pipe_unittest.cc b/media/cast/net/udp_packet_pipe_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/udp_packet_pipe_unittest.cc rename to media/cast/net/udp_packet_pipe_unittest.cc diff --git a/third_party/chromium/media/cast/net/udp_transport_impl.cc b/media/cast/net/udp_transport_impl.cc similarity index 100% rename from third_party/chromium/media/cast/net/udp_transport_impl.cc rename to media/cast/net/udp_transport_impl.cc diff --git a/third_party/chromium/media/cast/net/udp_transport_impl.h b/media/cast/net/udp_transport_impl.h similarity index 100% rename from third_party/chromium/media/cast/net/udp_transport_impl.h rename to media/cast/net/udp_transport_impl.h diff --git a/third_party/chromium/media/cast/net/udp_transport_interface.h b/media/cast/net/udp_transport_interface.h similarity index 100% rename from third_party/chromium/media/cast/net/udp_transport_interface.h rename to media/cast/net/udp_transport_interface.h diff --git a/third_party/chromium/media/cast/net/udp_transport_unittest.cc b/media/cast/net/udp_transport_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/net/udp_transport_unittest.cc rename to media/cast/net/udp_transport_unittest.cc diff --git a/third_party/chromium/media/cast/receiver/BUILD.gn b/media/cast/receiver/BUILD.gn similarity index 100% rename from third_party/chromium/media/cast/receiver/BUILD.gn rename to media/cast/receiver/BUILD.gn diff --git a/third_party/chromium/media/cast/receiver/cast_streaming_renderer.cc b/media/cast/receiver/cast_streaming_renderer.cc similarity index 100% rename from third_party/chromium/media/cast/receiver/cast_streaming_renderer.cc rename to media/cast/receiver/cast_streaming_renderer.cc diff --git a/third_party/chromium/media/cast/receiver/cast_streaming_renderer.h b/media/cast/receiver/cast_streaming_renderer.h similarity index 100% rename from third_party/chromium/media/cast/receiver/cast_streaming_renderer.h rename to media/cast/receiver/cast_streaming_renderer.h diff --git a/third_party/chromium/media/cast/receiver/cast_streaming_renderer_factory.cc b/media/cast/receiver/cast_streaming_renderer_factory.cc similarity index 100% rename from third_party/chromium/media/cast/receiver/cast_streaming_renderer_factory.cc rename to media/cast/receiver/cast_streaming_renderer_factory.cc diff --git a/third_party/chromium/media/cast/receiver/cast_streaming_renderer_factory.h b/media/cast/receiver/cast_streaming_renderer_factory.h similarity index 100% rename from third_party/chromium/media/cast/receiver/cast_streaming_renderer_factory.h rename to media/cast/receiver/cast_streaming_renderer_factory.h diff --git a/third_party/chromium/media/cast/receiver/cast_streaming_renderer_factory_unittest.cc b/media/cast/receiver/cast_streaming_renderer_factory_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/receiver/cast_streaming_renderer_factory_unittest.cc rename to media/cast/receiver/cast_streaming_renderer_factory_unittest.cc diff --git a/third_party/chromium/media/cast/receiver/cast_streaming_renderer_unittest.cc b/media/cast/receiver/cast_streaming_renderer_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/receiver/cast_streaming_renderer_unittest.cc rename to media/cast/receiver/cast_streaming_renderer_unittest.cc diff --git a/third_party/chromium/media/cast/sender/audio_encoder.cc b/media/cast/sender/audio_encoder.cc similarity index 100% rename from third_party/chromium/media/cast/sender/audio_encoder.cc rename to media/cast/sender/audio_encoder.cc diff --git a/third_party/chromium/media/cast/sender/audio_encoder.h b/media/cast/sender/audio_encoder.h similarity index 100% rename from third_party/chromium/media/cast/sender/audio_encoder.h rename to media/cast/sender/audio_encoder.h diff --git a/third_party/chromium/media/cast/sender/audio_encoder_unittest.cc b/media/cast/sender/audio_encoder_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/sender/audio_encoder_unittest.cc rename to media/cast/sender/audio_encoder_unittest.cc diff --git a/third_party/chromium/media/cast/sender/audio_sender.cc b/media/cast/sender/audio_sender.cc similarity index 100% rename from third_party/chromium/media/cast/sender/audio_sender.cc rename to media/cast/sender/audio_sender.cc diff --git a/third_party/chromium/media/cast/sender/audio_sender.h b/media/cast/sender/audio_sender.h similarity index 100% rename from third_party/chromium/media/cast/sender/audio_sender.h rename to media/cast/sender/audio_sender.h diff --git a/third_party/chromium/media/cast/sender/audio_sender_unittest.cc b/media/cast/sender/audio_sender_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/sender/audio_sender_unittest.cc rename to media/cast/sender/audio_sender_unittest.cc diff --git a/third_party/chromium/media/cast/sender/av1_encoder.cc b/media/cast/sender/av1_encoder.cc similarity index 100% rename from third_party/chromium/media/cast/sender/av1_encoder.cc rename to media/cast/sender/av1_encoder.cc diff --git a/third_party/chromium/media/cast/sender/av1_encoder.h b/media/cast/sender/av1_encoder.h similarity index 100% rename from third_party/chromium/media/cast/sender/av1_encoder.h rename to media/cast/sender/av1_encoder.h diff --git a/third_party/chromium/media/cast/sender/congestion_control.cc b/media/cast/sender/congestion_control.cc similarity index 100% rename from third_party/chromium/media/cast/sender/congestion_control.cc rename to media/cast/sender/congestion_control.cc diff --git a/third_party/chromium/media/cast/sender/congestion_control.h b/media/cast/sender/congestion_control.h similarity index 100% rename from third_party/chromium/media/cast/sender/congestion_control.h rename to media/cast/sender/congestion_control.h diff --git a/third_party/chromium/media/cast/sender/congestion_control_unittest.cc b/media/cast/sender/congestion_control_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/sender/congestion_control_unittest.cc rename to media/cast/sender/congestion_control_unittest.cc diff --git a/third_party/chromium/media/cast/sender/external_video_encoder.cc b/media/cast/sender/external_video_encoder.cc similarity index 100% rename from third_party/chromium/media/cast/sender/external_video_encoder.cc rename to media/cast/sender/external_video_encoder.cc diff --git a/third_party/chromium/media/cast/sender/external_video_encoder.h b/media/cast/sender/external_video_encoder.h similarity index 100% rename from third_party/chromium/media/cast/sender/external_video_encoder.h rename to media/cast/sender/external_video_encoder.h diff --git a/third_party/chromium/media/cast/sender/external_video_encoder_unittest.cc b/media/cast/sender/external_video_encoder_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/sender/external_video_encoder_unittest.cc rename to media/cast/sender/external_video_encoder_unittest.cc diff --git a/third_party/chromium/media/cast/sender/fake_software_video_encoder.cc b/media/cast/sender/fake_software_video_encoder.cc similarity index 100% rename from third_party/chromium/media/cast/sender/fake_software_video_encoder.cc rename to media/cast/sender/fake_software_video_encoder.cc diff --git a/third_party/chromium/media/cast/sender/fake_software_video_encoder.h b/media/cast/sender/fake_software_video_encoder.h similarity index 100% rename from third_party/chromium/media/cast/sender/fake_software_video_encoder.h rename to media/cast/sender/fake_software_video_encoder.h diff --git a/third_party/chromium/media/cast/sender/fake_video_encode_accelerator_factory.cc b/media/cast/sender/fake_video_encode_accelerator_factory.cc similarity index 100% rename from third_party/chromium/media/cast/sender/fake_video_encode_accelerator_factory.cc rename to media/cast/sender/fake_video_encode_accelerator_factory.cc diff --git a/third_party/chromium/media/cast/sender/fake_video_encode_accelerator_factory.h b/media/cast/sender/fake_video_encode_accelerator_factory.h similarity index 100% rename from third_party/chromium/media/cast/sender/fake_video_encode_accelerator_factory.h rename to media/cast/sender/fake_video_encode_accelerator_factory.h diff --git a/third_party/chromium/media/cast/sender/frame_sender.cc b/media/cast/sender/frame_sender.cc similarity index 100% rename from third_party/chromium/media/cast/sender/frame_sender.cc rename to media/cast/sender/frame_sender.cc diff --git a/third_party/chromium/media/cast/sender/frame_sender.h b/media/cast/sender/frame_sender.h similarity index 100% rename from third_party/chromium/media/cast/sender/frame_sender.h rename to media/cast/sender/frame_sender.h diff --git a/third_party/chromium/media/cast/sender/h264_vt_encoder.cc b/media/cast/sender/h264_vt_encoder.cc similarity index 100% rename from third_party/chromium/media/cast/sender/h264_vt_encoder.cc rename to media/cast/sender/h264_vt_encoder.cc diff --git a/third_party/chromium/media/cast/sender/h264_vt_encoder.h b/media/cast/sender/h264_vt_encoder.h similarity index 100% rename from third_party/chromium/media/cast/sender/h264_vt_encoder.h rename to media/cast/sender/h264_vt_encoder.h diff --git a/third_party/chromium/media/cast/sender/h264_vt_encoder_unittest.cc b/media/cast/sender/h264_vt_encoder_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/sender/h264_vt_encoder_unittest.cc rename to media/cast/sender/h264_vt_encoder_unittest.cc diff --git a/third_party/chromium/media/cast/sender/performance_metrics_overlay.cc b/media/cast/sender/performance_metrics_overlay.cc similarity index 100% rename from third_party/chromium/media/cast/sender/performance_metrics_overlay.cc rename to media/cast/sender/performance_metrics_overlay.cc diff --git a/third_party/chromium/media/cast/sender/performance_metrics_overlay.h b/media/cast/sender/performance_metrics_overlay.h similarity index 100% rename from third_party/chromium/media/cast/sender/performance_metrics_overlay.h rename to media/cast/sender/performance_metrics_overlay.h diff --git a/third_party/chromium/media/cast/sender/sender_encoded_frame.cc b/media/cast/sender/sender_encoded_frame.cc similarity index 100% rename from third_party/chromium/media/cast/sender/sender_encoded_frame.cc rename to media/cast/sender/sender_encoded_frame.cc diff --git a/third_party/chromium/media/cast/sender/sender_encoded_frame.h b/media/cast/sender/sender_encoded_frame.h similarity index 100% rename from third_party/chromium/media/cast/sender/sender_encoded_frame.h rename to media/cast/sender/sender_encoded_frame.h diff --git a/third_party/chromium/media/cast/sender/size_adaptable_video_encoder_base.cc b/media/cast/sender/size_adaptable_video_encoder_base.cc similarity index 100% rename from third_party/chromium/media/cast/sender/size_adaptable_video_encoder_base.cc rename to media/cast/sender/size_adaptable_video_encoder_base.cc diff --git a/third_party/chromium/media/cast/sender/size_adaptable_video_encoder_base.h b/media/cast/sender/size_adaptable_video_encoder_base.h similarity index 100% rename from third_party/chromium/media/cast/sender/size_adaptable_video_encoder_base.h rename to media/cast/sender/size_adaptable_video_encoder_base.h diff --git a/third_party/chromium/media/cast/sender/software_video_encoder.h b/media/cast/sender/software_video_encoder.h similarity index 100% rename from third_party/chromium/media/cast/sender/software_video_encoder.h rename to media/cast/sender/software_video_encoder.h diff --git a/third_party/chromium/media/cast/sender/video_encoder.cc b/media/cast/sender/video_encoder.cc similarity index 100% rename from third_party/chromium/media/cast/sender/video_encoder.cc rename to media/cast/sender/video_encoder.cc diff --git a/third_party/chromium/media/cast/sender/video_encoder.h b/media/cast/sender/video_encoder.h similarity index 100% rename from third_party/chromium/media/cast/sender/video_encoder.h rename to media/cast/sender/video_encoder.h diff --git a/third_party/chromium/media/cast/sender/video_encoder_impl.cc b/media/cast/sender/video_encoder_impl.cc similarity index 100% rename from third_party/chromium/media/cast/sender/video_encoder_impl.cc rename to media/cast/sender/video_encoder_impl.cc diff --git a/third_party/chromium/media/cast/sender/video_encoder_impl.h b/media/cast/sender/video_encoder_impl.h similarity index 100% rename from third_party/chromium/media/cast/sender/video_encoder_impl.h rename to media/cast/sender/video_encoder_impl.h diff --git a/third_party/chromium/media/cast/sender/video_encoder_unittest.cc b/media/cast/sender/video_encoder_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/sender/video_encoder_unittest.cc rename to media/cast/sender/video_encoder_unittest.cc diff --git a/third_party/chromium/media/cast/sender/video_frame_factory.h b/media/cast/sender/video_frame_factory.h similarity index 100% rename from third_party/chromium/media/cast/sender/video_frame_factory.h rename to media/cast/sender/video_frame_factory.h diff --git a/third_party/chromium/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc similarity index 100% rename from third_party/chromium/media/cast/sender/video_sender.cc rename to media/cast/sender/video_sender.cc diff --git a/third_party/chromium/media/cast/sender/video_sender.h b/media/cast/sender/video_sender.h similarity index 100% rename from third_party/chromium/media/cast/sender/video_sender.h rename to media/cast/sender/video_sender.h diff --git a/third_party/chromium/media/cast/sender/video_sender_unittest.cc b/media/cast/sender/video_sender_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/sender/video_sender_unittest.cc rename to media/cast/sender/video_sender_unittest.cc diff --git a/third_party/chromium/media/cast/sender/vpx_encoder.cc b/media/cast/sender/vpx_encoder.cc similarity index 100% rename from third_party/chromium/media/cast/sender/vpx_encoder.cc rename to media/cast/sender/vpx_encoder.cc diff --git a/third_party/chromium/media/cast/sender/vpx_encoder.h b/media/cast/sender/vpx_encoder.h similarity index 100% rename from third_party/chromium/media/cast/sender/vpx_encoder.h rename to media/cast/sender/vpx_encoder.h diff --git a/third_party/chromium/media/cast/sender/vpx_quantizer_parser.cc b/media/cast/sender/vpx_quantizer_parser.cc similarity index 100% rename from third_party/chromium/media/cast/sender/vpx_quantizer_parser.cc rename to media/cast/sender/vpx_quantizer_parser.cc diff --git a/third_party/chromium/media/cast/sender/vpx_quantizer_parser.h b/media/cast/sender/vpx_quantizer_parser.h similarity index 100% rename from third_party/chromium/media/cast/sender/vpx_quantizer_parser.h rename to media/cast/sender/vpx_quantizer_parser.h diff --git a/third_party/chromium/media/cast/sender/vpx_quantizer_parser_unittest.cc b/media/cast/sender/vpx_quantizer_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/sender/vpx_quantizer_parser_unittest.cc rename to media/cast/sender/vpx_quantizer_parser_unittest.cc diff --git a/third_party/chromium/media/cast/test/cast_benchmarks.cc b/media/cast/test/cast_benchmarks.cc similarity index 100% rename from third_party/chromium/media/cast/test/cast_benchmarks.cc rename to media/cast/test/cast_benchmarks.cc diff --git a/third_party/chromium/media/cast/test/end2end_unittest.cc b/media/cast/test/end2end_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/end2end_unittest.cc rename to media/cast/test/end2end_unittest.cc diff --git a/third_party/chromium/media/cast/test/fake_media_source.cc b/media/cast/test/fake_media_source.cc similarity index 100% rename from third_party/chromium/media/cast/test/fake_media_source.cc rename to media/cast/test/fake_media_source.cc diff --git a/third_party/chromium/media/cast/test/fake_media_source.h b/media/cast/test/fake_media_source.h similarity index 100% rename from third_party/chromium/media/cast/test/fake_media_source.h rename to media/cast/test/fake_media_source.h diff --git a/third_party/chromium/media/cast/test/fake_receiver_time_offset_estimator.cc b/media/cast/test/fake_receiver_time_offset_estimator.cc similarity index 100% rename from third_party/chromium/media/cast/test/fake_receiver_time_offset_estimator.cc rename to media/cast/test/fake_receiver_time_offset_estimator.cc diff --git a/third_party/chromium/media/cast/test/fake_receiver_time_offset_estimator.h b/media/cast/test/fake_receiver_time_offset_estimator.h similarity index 100% rename from third_party/chromium/media/cast/test/fake_receiver_time_offset_estimator.h rename to media/cast/test/fake_receiver_time_offset_estimator.h diff --git a/third_party/chromium/media/cast/test/loopback_transport.cc b/media/cast/test/loopback_transport.cc similarity index 100% rename from third_party/chromium/media/cast/test/loopback_transport.cc rename to media/cast/test/loopback_transport.cc diff --git a/third_party/chromium/media/cast/test/loopback_transport.h b/media/cast/test/loopback_transport.h similarity index 100% rename from third_party/chromium/media/cast/test/loopback_transport.h rename to media/cast/test/loopback_transport.h diff --git a/third_party/chromium/media/cast/test/mock_cast_transport.cc b/media/cast/test/mock_cast_transport.cc similarity index 100% rename from third_party/chromium/media/cast/test/mock_cast_transport.cc rename to media/cast/test/mock_cast_transport.cc diff --git a/third_party/chromium/media/cast/test/mock_cast_transport.h b/media/cast/test/mock_cast_transport.h similarity index 100% rename from third_party/chromium/media/cast/test/mock_cast_transport.h rename to media/cast/test/mock_cast_transport.h diff --git a/third_party/chromium/media/cast/test/proto/BUILD.gn b/media/cast/test/proto/BUILD.gn similarity index 100% rename from third_party/chromium/media/cast/test/proto/BUILD.gn rename to media/cast/test/proto/BUILD.gn diff --git a/third_party/chromium/media/cast/test/proto/network_simulation_model.proto b/media/cast/test/proto/network_simulation_model.proto similarity index 100% rename from third_party/chromium/media/cast/test/proto/network_simulation_model.proto rename to media/cast/test/proto/network_simulation_model.proto diff --git a/third_party/chromium/media/cast/test/receiver/audio_decoder.cc b/media/cast/test/receiver/audio_decoder.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/audio_decoder.cc rename to media/cast/test/receiver/audio_decoder.cc diff --git a/third_party/chromium/media/cast/test/receiver/audio_decoder.h b/media/cast/test/receiver/audio_decoder.h similarity index 100% rename from third_party/chromium/media/cast/test/receiver/audio_decoder.h rename to media/cast/test/receiver/audio_decoder.h diff --git a/third_party/chromium/media/cast/test/receiver/audio_decoder_unittest.cc b/media/cast/test/receiver/audio_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/audio_decoder_unittest.cc rename to media/cast/test/receiver/audio_decoder_unittest.cc diff --git a/third_party/chromium/media/cast/test/receiver/cast_message_builder.cc b/media/cast/test/receiver/cast_message_builder.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/cast_message_builder.cc rename to media/cast/test/receiver/cast_message_builder.cc diff --git a/third_party/chromium/media/cast/test/receiver/cast_message_builder.h b/media/cast/test/receiver/cast_message_builder.h similarity index 100% rename from third_party/chromium/media/cast/test/receiver/cast_message_builder.h rename to media/cast/test/receiver/cast_message_builder.h diff --git a/third_party/chromium/media/cast/test/receiver/cast_message_builder_unittest.cc b/media/cast/test/receiver/cast_message_builder_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/cast_message_builder_unittest.cc rename to media/cast/test/receiver/cast_message_builder_unittest.cc diff --git a/third_party/chromium/media/cast/test/receiver/cast_receiver.h b/media/cast/test/receiver/cast_receiver.h similarity index 100% rename from third_party/chromium/media/cast/test/receiver/cast_receiver.h rename to media/cast/test/receiver/cast_receiver.h diff --git a/third_party/chromium/media/cast/test/receiver/cast_receiver_impl.cc b/media/cast/test/receiver/cast_receiver_impl.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/cast_receiver_impl.cc rename to media/cast/test/receiver/cast_receiver_impl.cc diff --git a/third_party/chromium/media/cast/test/receiver/cast_receiver_impl.h b/media/cast/test/receiver/cast_receiver_impl.h similarity index 100% rename from third_party/chromium/media/cast/test/receiver/cast_receiver_impl.h rename to media/cast/test/receiver/cast_receiver_impl.h diff --git a/third_party/chromium/media/cast/test/receiver/frame_buffer.cc b/media/cast/test/receiver/frame_buffer.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/frame_buffer.cc rename to media/cast/test/receiver/frame_buffer.cc diff --git a/third_party/chromium/media/cast/test/receiver/frame_buffer.h b/media/cast/test/receiver/frame_buffer.h similarity index 100% rename from third_party/chromium/media/cast/test/receiver/frame_buffer.h rename to media/cast/test/receiver/frame_buffer.h diff --git a/third_party/chromium/media/cast/test/receiver/frame_buffer_unittest.cc b/media/cast/test/receiver/frame_buffer_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/frame_buffer_unittest.cc rename to media/cast/test/receiver/frame_buffer_unittest.cc diff --git a/third_party/chromium/media/cast/test/receiver/frame_receiver.cc b/media/cast/test/receiver/frame_receiver.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/frame_receiver.cc rename to media/cast/test/receiver/frame_receiver.cc diff --git a/third_party/chromium/media/cast/test/receiver/frame_receiver.h b/media/cast/test/receiver/frame_receiver.h similarity index 100% rename from third_party/chromium/media/cast/test/receiver/frame_receiver.h rename to media/cast/test/receiver/frame_receiver.h diff --git a/third_party/chromium/media/cast/test/receiver/frame_receiver_unittest.cc b/media/cast/test/receiver/frame_receiver_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/frame_receiver_unittest.cc rename to media/cast/test/receiver/frame_receiver_unittest.cc diff --git a/third_party/chromium/media/cast/test/receiver/framer.cc b/media/cast/test/receiver/framer.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/framer.cc rename to media/cast/test/receiver/framer.cc diff --git a/third_party/chromium/media/cast/test/receiver/framer.h b/media/cast/test/receiver/framer.h similarity index 100% rename from third_party/chromium/media/cast/test/receiver/framer.h rename to media/cast/test/receiver/framer.h diff --git a/third_party/chromium/media/cast/test/receiver/framer_unittest.cc b/media/cast/test/receiver/framer_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/framer_unittest.cc rename to media/cast/test/receiver/framer_unittest.cc diff --git a/third_party/chromium/media/cast/test/receiver/receiver_stats.cc b/media/cast/test/receiver/receiver_stats.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/receiver_stats.cc rename to media/cast/test/receiver/receiver_stats.cc diff --git a/third_party/chromium/media/cast/test/receiver/receiver_stats.h b/media/cast/test/receiver/receiver_stats.h similarity index 100% rename from third_party/chromium/media/cast/test/receiver/receiver_stats.h rename to media/cast/test/receiver/receiver_stats.h diff --git a/third_party/chromium/media/cast/test/receiver/receiver_stats_unittest.cc b/media/cast/test/receiver/receiver_stats_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/receiver_stats_unittest.cc rename to media/cast/test/receiver/receiver_stats_unittest.cc diff --git a/third_party/chromium/media/cast/test/receiver/video_decoder.cc b/media/cast/test/receiver/video_decoder.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/video_decoder.cc rename to media/cast/test/receiver/video_decoder.cc diff --git a/third_party/chromium/media/cast/test/receiver/video_decoder.h b/media/cast/test/receiver/video_decoder.h similarity index 100% rename from third_party/chromium/media/cast/test/receiver/video_decoder.h rename to media/cast/test/receiver/video_decoder.h diff --git a/third_party/chromium/media/cast/test/receiver/video_decoder_unittest.cc b/media/cast/test/receiver/video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/receiver/video_decoder_unittest.cc rename to media/cast/test/receiver/video_decoder_unittest.cc diff --git a/third_party/chromium/media/cast/test/sender.cc b/media/cast/test/sender.cc similarity index 100% rename from third_party/chromium/media/cast/test/sender.cc rename to media/cast/test/sender.cc diff --git a/third_party/chromium/media/cast/test/simulator.cc b/media/cast/test/simulator.cc similarity index 100% rename from third_party/chromium/media/cast/test/simulator.cc rename to media/cast/test/simulator.cc diff --git a/third_party/chromium/media/cast/test/skewed_single_thread_task_runner.cc b/media/cast/test/skewed_single_thread_task_runner.cc similarity index 100% rename from third_party/chromium/media/cast/test/skewed_single_thread_task_runner.cc rename to media/cast/test/skewed_single_thread_task_runner.cc diff --git a/third_party/chromium/media/cast/test/skewed_single_thread_task_runner.h b/media/cast/test/skewed_single_thread_task_runner.h similarity index 100% rename from third_party/chromium/media/cast/test/skewed_single_thread_task_runner.h rename to media/cast/test/skewed_single_thread_task_runner.h diff --git a/third_party/chromium/media/cast/test/skewed_tick_clock.cc b/media/cast/test/skewed_tick_clock.cc similarity index 100% rename from third_party/chromium/media/cast/test/skewed_tick_clock.cc rename to media/cast/test/skewed_tick_clock.cc diff --git a/third_party/chromium/media/cast/test/skewed_tick_clock.h b/media/cast/test/skewed_tick_clock.h similarity index 100% rename from third_party/chromium/media/cast/test/skewed_tick_clock.h rename to media/cast/test/skewed_tick_clock.h diff --git a/third_party/chromium/media/cast/test/utility/audio_utility.cc b/media/cast/test/utility/audio_utility.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/audio_utility.cc rename to media/cast/test/utility/audio_utility.cc diff --git a/third_party/chromium/media/cast/test/utility/audio_utility.h b/media/cast/test/utility/audio_utility.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/audio_utility.h rename to media/cast/test/utility/audio_utility.h diff --git a/third_party/chromium/media/cast/test/utility/audio_utility_unittest.cc b/media/cast/test/utility/audio_utility_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/audio_utility_unittest.cc rename to media/cast/test/utility/audio_utility_unittest.cc diff --git a/third_party/chromium/media/cast/test/utility/barcode.cc b/media/cast/test/utility/barcode.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/barcode.cc rename to media/cast/test/utility/barcode.cc diff --git a/third_party/chromium/media/cast/test/utility/barcode.h b/media/cast/test/utility/barcode.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/barcode.h rename to media/cast/test/utility/barcode.h diff --git a/third_party/chromium/media/cast/test/utility/barcode_unittest.cc b/media/cast/test/utility/barcode_unittest.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/barcode_unittest.cc rename to media/cast/test/utility/barcode_unittest.cc diff --git a/third_party/chromium/media/cast/test/utility/default_config.cc b/media/cast/test/utility/default_config.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/default_config.cc rename to media/cast/test/utility/default_config.cc diff --git a/third_party/chromium/media/cast/test/utility/default_config.h b/media/cast/test/utility/default_config.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/default_config.h rename to media/cast/test/utility/default_config.h diff --git a/third_party/chromium/media/cast/test/utility/generate_barcode_video.cc b/media/cast/test/utility/generate_barcode_video.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/generate_barcode_video.cc rename to media/cast/test/utility/generate_barcode_video.cc diff --git a/third_party/chromium/media/cast/test/utility/generate_timecode_audio.cc b/media/cast/test/utility/generate_timecode_audio.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/generate_timecode_audio.cc rename to media/cast/test/utility/generate_timecode_audio.cc diff --git a/third_party/chromium/media/cast/test/utility/in_process_receiver.cc b/media/cast/test/utility/in_process_receiver.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/in_process_receiver.cc rename to media/cast/test/utility/in_process_receiver.cc diff --git a/third_party/chromium/media/cast/test/utility/in_process_receiver.h b/media/cast/test/utility/in_process_receiver.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/in_process_receiver.h rename to media/cast/test/utility/in_process_receiver.h diff --git a/third_party/chromium/media/cast/test/utility/input_builder.cc b/media/cast/test/utility/input_builder.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/input_builder.cc rename to media/cast/test/utility/input_builder.cc diff --git a/third_party/chromium/media/cast/test/utility/input_builder.h b/media/cast/test/utility/input_builder.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/input_builder.h rename to media/cast/test/utility/input_builder.h diff --git a/third_party/chromium/media/cast/test/utility/net_utility.cc b/media/cast/test/utility/net_utility.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/net_utility.cc rename to media/cast/test/utility/net_utility.cc diff --git a/third_party/chromium/media/cast/test/utility/net_utility.h b/media/cast/test/utility/net_utility.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/net_utility.h rename to media/cast/test/utility/net_utility.h diff --git a/third_party/chromium/media/cast/test/utility/netload.py b/media/cast/test/utility/netload.py similarity index 100% rename from third_party/chromium/media/cast/test/utility/netload.py rename to media/cast/test/utility/netload.py diff --git a/third_party/chromium/media/cast/test/utility/shadow.sh b/media/cast/test/utility/shadow.sh similarity index 100% rename from third_party/chromium/media/cast/test/utility/shadow.sh rename to media/cast/test/utility/shadow.sh diff --git a/third_party/chromium/media/cast/test/utility/standalone_cast_environment.cc b/media/cast/test/utility/standalone_cast_environment.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/standalone_cast_environment.cc rename to media/cast/test/utility/standalone_cast_environment.cc diff --git a/third_party/chromium/media/cast/test/utility/standalone_cast_environment.h b/media/cast/test/utility/standalone_cast_environment.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/standalone_cast_environment.h rename to media/cast/test/utility/standalone_cast_environment.h diff --git a/third_party/chromium/media/cast/test/utility/tap_proxy.cc b/media/cast/test/utility/tap_proxy.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/tap_proxy.cc rename to media/cast/test/utility/tap_proxy.cc diff --git a/third_party/chromium/media/cast/test/utility/test_util.cc b/media/cast/test/utility/test_util.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/test_util.cc rename to media/cast/test/utility/test_util.cc diff --git a/third_party/chromium/media/cast/test/utility/test_util.h b/media/cast/test/utility/test_util.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/test_util.h rename to media/cast/test/utility/test_util.h diff --git a/third_party/chromium/media/cast/test/utility/udp_proxy.cc b/media/cast/test/utility/udp_proxy.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/udp_proxy.cc rename to media/cast/test/utility/udp_proxy.cc diff --git a/third_party/chromium/media/cast/test/utility/udp_proxy.h b/media/cast/test/utility/udp_proxy.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/udp_proxy.h rename to media/cast/test/utility/udp_proxy.h diff --git a/third_party/chromium/media/cast/test/utility/udp_proxy_main.cc b/media/cast/test/utility/udp_proxy_main.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/udp_proxy_main.cc rename to media/cast/test/utility/udp_proxy_main.cc diff --git a/third_party/chromium/media/cast/test/utility/video_utility.cc b/media/cast/test/utility/video_utility.cc similarity index 100% rename from third_party/chromium/media/cast/test/utility/video_utility.cc rename to media/cast/test/utility/video_utility.cc diff --git a/third_party/chromium/media/cast/test/utility/video_utility.h b/media/cast/test/utility/video_utility.h similarity index 100% rename from third_party/chromium/media/cast/test/utility/video_utility.h rename to media/cast/test/utility/video_utility.h diff --git a/third_party/chromium/media/cdm/BUILD.gn b/media/cdm/BUILD.gn similarity index 100% rename from third_party/chromium/media/cdm/BUILD.gn rename to media/cdm/BUILD.gn diff --git a/third_party/chromium/media/cdm/DEPS b/media/cdm/DEPS similarity index 100% rename from third_party/chromium/media/cdm/DEPS rename to media/cdm/DEPS diff --git a/third_party/chromium/media/cdm/aes_cbc_crypto.cc b/media/cdm/aes_cbc_crypto.cc similarity index 100% rename from third_party/chromium/media/cdm/aes_cbc_crypto.cc rename to media/cdm/aes_cbc_crypto.cc diff --git a/third_party/chromium/media/cdm/aes_cbc_crypto.h b/media/cdm/aes_cbc_crypto.h similarity index 100% rename from third_party/chromium/media/cdm/aes_cbc_crypto.h rename to media/cdm/aes_cbc_crypto.h diff --git a/third_party/chromium/media/cdm/aes_cbc_crypto_unittest.cc b/media/cdm/aes_cbc_crypto_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/aes_cbc_crypto_unittest.cc rename to media/cdm/aes_cbc_crypto_unittest.cc diff --git a/third_party/chromium/media/cdm/aes_decryptor.cc b/media/cdm/aes_decryptor.cc similarity index 100% rename from third_party/chromium/media/cdm/aes_decryptor.cc rename to media/cdm/aes_decryptor.cc diff --git a/third_party/chromium/media/cdm/aes_decryptor.h b/media/cdm/aes_decryptor.h similarity index 100% rename from third_party/chromium/media/cdm/aes_decryptor.h rename to media/cdm/aes_decryptor.h diff --git a/third_party/chromium/media/cdm/aes_decryptor_unittest.cc b/media/cdm/aes_decryptor_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/aes_decryptor_unittest.cc rename to media/cdm/aes_decryptor_unittest.cc diff --git a/third_party/chromium/media/cdm/cbcs_decryptor.cc b/media/cdm/cbcs_decryptor.cc similarity index 100% rename from third_party/chromium/media/cdm/cbcs_decryptor.cc rename to media/cdm/cbcs_decryptor.cc diff --git a/third_party/chromium/media/cdm/cbcs_decryptor.h b/media/cdm/cbcs_decryptor.h similarity index 100% rename from third_party/chromium/media/cdm/cbcs_decryptor.h rename to media/cdm/cbcs_decryptor.h diff --git a/third_party/chromium/media/cdm/cbcs_decryptor_fuzzer.cc b/media/cdm/cbcs_decryptor_fuzzer.cc similarity index 100% rename from third_party/chromium/media/cdm/cbcs_decryptor_fuzzer.cc rename to media/cdm/cbcs_decryptor_fuzzer.cc diff --git a/third_party/chromium/media/cdm/cbcs_decryptor_unittest.cc b/media/cdm/cbcs_decryptor_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/cbcs_decryptor_unittest.cc rename to media/cdm/cbcs_decryptor_unittest.cc diff --git a/third_party/chromium/media/cdm/cdm_adapter.cc b/media/cdm/cdm_adapter.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_adapter.cc rename to media/cdm/cdm_adapter.cc diff --git a/third_party/chromium/media/cdm/cdm_adapter.h b/media/cdm/cdm_adapter.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_adapter.h rename to media/cdm/cdm_adapter.h diff --git a/third_party/chromium/media/cdm/cdm_adapter_factory.cc b/media/cdm/cdm_adapter_factory.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_adapter_factory.cc rename to media/cdm/cdm_adapter_factory.cc diff --git a/third_party/chromium/media/cdm/cdm_adapter_factory.h b/media/cdm/cdm_adapter_factory.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_adapter_factory.h rename to media/cdm/cdm_adapter_factory.h diff --git a/third_party/chromium/media/cdm/cdm_adapter_unittest.cc b/media/cdm/cdm_adapter_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_adapter_unittest.cc rename to media/cdm/cdm_adapter_unittest.cc diff --git a/third_party/chromium/media/cdm/cdm_allocator.cc b/media/cdm/cdm_allocator.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_allocator.cc rename to media/cdm/cdm_allocator.cc diff --git a/third_party/chromium/media/cdm/cdm_allocator.h b/media/cdm/cdm_allocator.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_allocator.h rename to media/cdm/cdm_allocator.h diff --git a/third_party/chromium/media/cdm/cdm_auxiliary_helper.cc b/media/cdm/cdm_auxiliary_helper.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_auxiliary_helper.cc rename to media/cdm/cdm_auxiliary_helper.cc diff --git a/third_party/chromium/media/cdm/cdm_auxiliary_helper.h b/media/cdm/cdm_auxiliary_helper.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_auxiliary_helper.h rename to media/cdm/cdm_auxiliary_helper.h diff --git a/third_party/chromium/media/cdm/cdm_capability.cc b/media/cdm/cdm_capability.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_capability.cc rename to media/cdm/cdm_capability.cc diff --git a/third_party/chromium/media/cdm/cdm_capability.h b/media/cdm/cdm_capability.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_capability.h rename to media/cdm/cdm_capability.h diff --git a/third_party/chromium/media/cdm/cdm_context_ref_impl.cc b/media/cdm/cdm_context_ref_impl.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_context_ref_impl.cc rename to media/cdm/cdm_context_ref_impl.cc diff --git a/third_party/chromium/media/cdm/cdm_context_ref_impl.h b/media/cdm/cdm_context_ref_impl.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_context_ref_impl.h rename to media/cdm/cdm_context_ref_impl.h diff --git a/third_party/chromium/media/cdm/cdm_document_service.h b/media/cdm/cdm_document_service.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_document_service.h rename to media/cdm/cdm_document_service.h diff --git a/third_party/chromium/media/cdm/cdm_helpers.cc b/media/cdm/cdm_helpers.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_helpers.cc rename to media/cdm/cdm_helpers.cc diff --git a/third_party/chromium/media/cdm/cdm_helpers.h b/media/cdm/cdm_helpers.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_helpers.h rename to media/cdm/cdm_helpers.h diff --git a/third_party/chromium/media/cdm/cdm_host_file.cc b/media/cdm/cdm_host_file.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_host_file.cc rename to media/cdm/cdm_host_file.cc diff --git a/third_party/chromium/media/cdm/cdm_host_file.h b/media/cdm/cdm_host_file.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_host_file.h rename to media/cdm/cdm_host_file.h diff --git a/third_party/chromium/media/cdm/cdm_host_files.cc b/media/cdm/cdm_host_files.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_host_files.cc rename to media/cdm/cdm_host_files.cc diff --git a/third_party/chromium/media/cdm/cdm_host_files.h b/media/cdm/cdm_host_files.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_host_files.h rename to media/cdm/cdm_host_files.h diff --git a/third_party/chromium/media/cdm/cdm_module.cc b/media/cdm/cdm_module.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_module.cc rename to media/cdm/cdm_module.cc diff --git a/third_party/chromium/media/cdm/cdm_module.h b/media/cdm/cdm_module.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_module.h rename to media/cdm/cdm_module.h diff --git a/third_party/chromium/media/cdm/cdm_paths.cc b/media/cdm/cdm_paths.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_paths.cc rename to media/cdm/cdm_paths.cc diff --git a/third_party/chromium/media/cdm/cdm_paths.h b/media/cdm/cdm_paths.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_paths.h rename to media/cdm/cdm_paths.h diff --git a/third_party/chromium/media/cdm/cdm_paths_unittest.cc b/media/cdm/cdm_paths_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_paths_unittest.cc rename to media/cdm/cdm_paths_unittest.cc diff --git a/third_party/chromium/media/cdm/cdm_type_conversion.cc b/media/cdm/cdm_type_conversion.cc similarity index 100% rename from third_party/chromium/media/cdm/cdm_type_conversion.cc rename to media/cdm/cdm_type_conversion.cc diff --git a/third_party/chromium/media/cdm/cdm_type_conversion.h b/media/cdm/cdm_type_conversion.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_type_conversion.h rename to media/cdm/cdm_type_conversion.h diff --git a/third_party/chromium/media/cdm/cdm_wrapper.h b/media/cdm/cdm_wrapper.h similarity index 100% rename from third_party/chromium/media/cdm/cdm_wrapper.h rename to media/cdm/cdm_wrapper.h diff --git a/third_party/chromium/media/cdm/cenc_decryptor.cc b/media/cdm/cenc_decryptor.cc similarity index 100% rename from third_party/chromium/media/cdm/cenc_decryptor.cc rename to media/cdm/cenc_decryptor.cc diff --git a/third_party/chromium/media/cdm/cenc_decryptor.h b/media/cdm/cenc_decryptor.h similarity index 100% rename from third_party/chromium/media/cdm/cenc_decryptor.h rename to media/cdm/cenc_decryptor.h diff --git a/third_party/chromium/media/cdm/cenc_decryptor_fuzzer.cc b/media/cdm/cenc_decryptor_fuzzer.cc similarity index 100% rename from third_party/chromium/media/cdm/cenc_decryptor_fuzzer.cc rename to media/cdm/cenc_decryptor_fuzzer.cc diff --git a/third_party/chromium/media/cdm/cenc_decryptor_unittest.cc b/media/cdm/cenc_decryptor_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/cenc_decryptor_unittest.cc rename to media/cdm/cenc_decryptor_unittest.cc diff --git a/third_party/chromium/media/cdm/cenc_utils.cc b/media/cdm/cenc_utils.cc similarity index 100% rename from third_party/chromium/media/cdm/cenc_utils.cc rename to media/cdm/cenc_utils.cc diff --git a/third_party/chromium/media/cdm/cenc_utils.h b/media/cdm/cenc_utils.h similarity index 100% rename from third_party/chromium/media/cdm/cenc_utils.h rename to media/cdm/cenc_utils.h diff --git a/third_party/chromium/media/cdm/cenc_utils_fuzzertest.cc b/media/cdm/cenc_utils_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/cdm/cenc_utils_fuzzertest.cc rename to media/cdm/cenc_utils_fuzzertest.cc diff --git a/third_party/chromium/media/cdm/cenc_utils_unittest.cc b/media/cdm/cenc_utils_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/cenc_utils_unittest.cc rename to media/cdm/cenc_utils_unittest.cc diff --git a/third_party/chromium/media/cdm/default_cdm_factory.cc b/media/cdm/default_cdm_factory.cc similarity index 100% rename from third_party/chromium/media/cdm/default_cdm_factory.cc rename to media/cdm/default_cdm_factory.cc diff --git a/third_party/chromium/media/cdm/default_cdm_factory.h b/media/cdm/default_cdm_factory.h similarity index 100% rename from third_party/chromium/media/cdm/default_cdm_factory.h rename to media/cdm/default_cdm_factory.h diff --git a/third_party/chromium/media/cdm/external_clear_key_test_helper.cc b/media/cdm/external_clear_key_test_helper.cc similarity index 100% rename from third_party/chromium/media/cdm/external_clear_key_test_helper.cc rename to media/cdm/external_clear_key_test_helper.cc diff --git a/third_party/chromium/media/cdm/external_clear_key_test_helper.h b/media/cdm/external_clear_key_test_helper.h similarity index 100% rename from third_party/chromium/media/cdm/external_clear_key_test_helper.h rename to media/cdm/external_clear_key_test_helper.h diff --git a/third_party/chromium/media/cdm/json_web_key.cc b/media/cdm/json_web_key.cc similarity index 100% rename from third_party/chromium/media/cdm/json_web_key.cc rename to media/cdm/json_web_key.cc diff --git a/third_party/chromium/media/cdm/json_web_key.h b/media/cdm/json_web_key.h similarity index 100% rename from third_party/chromium/media/cdm/json_web_key.h rename to media/cdm/json_web_key.h diff --git a/third_party/chromium/media/cdm/json_web_key_fuzzer.cc b/media/cdm/json_web_key_fuzzer.cc similarity index 100% rename from third_party/chromium/media/cdm/json_web_key_fuzzer.cc rename to media/cdm/json_web_key_fuzzer.cc diff --git a/third_party/chromium/media/cdm/json_web_key_unittest.cc b/media/cdm/json_web_key_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/json_web_key_unittest.cc rename to media/cdm/json_web_key_unittest.cc diff --git a/third_party/chromium/media/cdm/library_cdm/BUILD.gn b/media/cdm/library_cdm/BUILD.gn similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/BUILD.gn rename to media/cdm/library_cdm/BUILD.gn diff --git a/third_party/chromium/media/cdm/library_cdm/cdm_host_proxy.h b/media/cdm/library_cdm/cdm_host_proxy.h similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/cdm_host_proxy.h rename to media/cdm/library_cdm/cdm_host_proxy.h diff --git a/third_party/chromium/media/cdm/library_cdm/cdm_host_proxy_impl.h b/media/cdm/library_cdm/cdm_host_proxy_impl.h similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/cdm_host_proxy_impl.h rename to media/cdm/library_cdm/cdm_host_proxy_impl.h diff --git a/third_party/chromium/media/cdm/library_cdm/cdm_paths.gni b/media/cdm/library_cdm/cdm_paths.gni similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/cdm_paths.gni rename to media/cdm/library_cdm/cdm_paths.gni diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/BUILD.gn b/media/cdm/library_cdm/clear_key_cdm/BUILD.gn similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/BUILD.gn rename to media/cdm/library_cdm/clear_key_cdm/BUILD.gn diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/README.md b/media/cdm/library_cdm/clear_key_cdm/README.md similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/README.md rename to media/cdm/library_cdm/clear_key_cdm/README.md diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.cc b/media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.cc similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.cc rename to media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.cc diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.h b/media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.h similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.h rename to media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.h diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_file_io_test.cc b/media/cdm/library_cdm/clear_key_cdm/cdm_file_io_test.cc similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_file_io_test.cc rename to media/cdm/library_cdm/clear_key_cdm/cdm_file_io_test.cc diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_file_io_test.h b/media/cdm/library_cdm/clear_key_cdm/cdm_file_io_test.h similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_file_io_test.h rename to media/cdm/library_cdm/clear_key_cdm/cdm_file_io_test.h diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc rename to media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.h b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.h similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.h rename to media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.h diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc b/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc rename to media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.h b/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.h similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.h rename to media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.h diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.cc b/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.cc similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.cc rename to media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.cc diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.h b/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.h similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.h rename to media/cdm/library_cdm/clear_key_cdm/clear_key_persistent_session_cdm.h diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc b/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc rename to media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc diff --git a/third_party/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.h b/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.h similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.h rename to media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.h diff --git a/third_party/chromium/media/cdm/library_cdm/mock_library_cdm.cc b/media/cdm/library_cdm/mock_library_cdm.cc similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/mock_library_cdm.cc rename to media/cdm/library_cdm/mock_library_cdm.cc diff --git a/third_party/chromium/media/cdm/library_cdm/mock_library_cdm.h b/media/cdm/library_cdm/mock_library_cdm.h similarity index 100% rename from third_party/chromium/media/cdm/library_cdm/mock_library_cdm.h rename to media/cdm/library_cdm/mock_library_cdm.h diff --git a/third_party/chromium/media/cdm/media_foundation_cdm_data.cc b/media/cdm/media_foundation_cdm_data.cc similarity index 100% rename from third_party/chromium/media/cdm/media_foundation_cdm_data.cc rename to media/cdm/media_foundation_cdm_data.cc diff --git a/third_party/chromium/media/cdm/media_foundation_cdm_data.h b/media/cdm/media_foundation_cdm_data.h similarity index 100% rename from third_party/chromium/media/cdm/media_foundation_cdm_data.h rename to media/cdm/media_foundation_cdm_data.h diff --git a/third_party/chromium/media/cdm/mock_helpers.cc b/media/cdm/mock_helpers.cc similarity index 100% rename from third_party/chromium/media/cdm/mock_helpers.cc rename to media/cdm/mock_helpers.cc diff --git a/third_party/chromium/media/cdm/mock_helpers.h b/media/cdm/mock_helpers.h similarity index 100% rename from third_party/chromium/media/cdm/mock_helpers.h rename to media/cdm/mock_helpers.h diff --git a/third_party/chromium/media/cdm/output_protection.h b/media/cdm/output_protection.h similarity index 100% rename from third_party/chromium/media/cdm/output_protection.h rename to media/cdm/output_protection.h diff --git a/third_party/chromium/media/cdm/simple_cdm_allocator.cc b/media/cdm/simple_cdm_allocator.cc similarity index 100% rename from third_party/chromium/media/cdm/simple_cdm_allocator.cc rename to media/cdm/simple_cdm_allocator.cc diff --git a/third_party/chromium/media/cdm/simple_cdm_allocator.h b/media/cdm/simple_cdm_allocator.h similarity index 100% rename from third_party/chromium/media/cdm/simple_cdm_allocator.h rename to media/cdm/simple_cdm_allocator.h diff --git a/third_party/chromium/media/cdm/simple_cdm_allocator_unittest.cc b/media/cdm/simple_cdm_allocator_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/simple_cdm_allocator_unittest.cc rename to media/cdm/simple_cdm_allocator_unittest.cc diff --git a/third_party/chromium/media/cdm/simple_cdm_buffer.cc b/media/cdm/simple_cdm_buffer.cc similarity index 100% rename from third_party/chromium/media/cdm/simple_cdm_buffer.cc rename to media/cdm/simple_cdm_buffer.cc diff --git a/third_party/chromium/media/cdm/simple_cdm_buffer.h b/media/cdm/simple_cdm_buffer.h similarity index 100% rename from third_party/chromium/media/cdm/simple_cdm_buffer.h rename to media/cdm/simple_cdm_buffer.h diff --git a/third_party/chromium/media/cdm/supported_audio_codecs.cc b/media/cdm/supported_audio_codecs.cc similarity index 100% rename from third_party/chromium/media/cdm/supported_audio_codecs.cc rename to media/cdm/supported_audio_codecs.cc diff --git a/third_party/chromium/media/cdm/supported_audio_codecs.h b/media/cdm/supported_audio_codecs.h similarity index 100% rename from third_party/chromium/media/cdm/supported_audio_codecs.h rename to media/cdm/supported_audio_codecs.h diff --git a/third_party/chromium/media/cdm/supported_cdm_versions.cc b/media/cdm/supported_cdm_versions.cc similarity index 100% rename from third_party/chromium/media/cdm/supported_cdm_versions.cc rename to media/cdm/supported_cdm_versions.cc diff --git a/third_party/chromium/media/cdm/supported_cdm_versions.h b/media/cdm/supported_cdm_versions.h similarity index 100% rename from third_party/chromium/media/cdm/supported_cdm_versions.h rename to media/cdm/supported_cdm_versions.h diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm.cc b/media/cdm/win/media_foundation_cdm.cc similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm.cc rename to media/cdm/win/media_foundation_cdm.cc diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm.h b/media/cdm/win/media_foundation_cdm.h similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm.h rename to media/cdm/win/media_foundation_cdm.h diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm_factory.cc b/media/cdm/win/media_foundation_cdm_factory.cc similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm_factory.cc rename to media/cdm/win/media_foundation_cdm_factory.cc diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm_factory.h b/media/cdm/win/media_foundation_cdm_factory.h similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm_factory.h rename to media/cdm/win/media_foundation_cdm_factory.h diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm_factory_unittest.cc b/media/cdm/win/media_foundation_cdm_factory_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm_factory_unittest.cc rename to media/cdm/win/media_foundation_cdm_factory_unittest.cc diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm_module.cc b/media/cdm/win/media_foundation_cdm_module.cc similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm_module.cc rename to media/cdm/win/media_foundation_cdm_module.cc diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm_module.h b/media/cdm/win/media_foundation_cdm_module.h similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm_module.h rename to media/cdm/win/media_foundation_cdm_module.h diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm_session.cc b/media/cdm/win/media_foundation_cdm_session.cc similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm_session.cc rename to media/cdm/win/media_foundation_cdm_session.cc diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm_session.h b/media/cdm/win/media_foundation_cdm_session.h similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm_session.h rename to media/cdm/win/media_foundation_cdm_session.h diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm_session_unittest.cc b/media/cdm/win/media_foundation_cdm_session_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm_session_unittest.cc rename to media/cdm/win/media_foundation_cdm_session_unittest.cc diff --git a/third_party/chromium/media/cdm/win/media_foundation_cdm_unittest.cc b/media/cdm/win/media_foundation_cdm_unittest.cc similarity index 100% rename from third_party/chromium/media/cdm/win/media_foundation_cdm_unittest.cc rename to media/cdm/win/media_foundation_cdm_unittest.cc diff --git a/third_party/chromium/media/cobalt/base/bind_post_task.h b/media/cobalt/base/bind_post_task.h similarity index 100% rename from third_party/chromium/media/cobalt/base/bind_post_task.h rename to media/cobalt/base/bind_post_task.h diff --git a/third_party/chromium/media/cobalt/base/check.h b/media/cobalt/base/check.h similarity index 100% rename from third_party/chromium/media/cobalt/base/check.h rename to media/cobalt/base/check.h diff --git a/third_party/chromium/media/cobalt/base/check_op.h b/media/cobalt/base/check_op.h similarity index 100% rename from third_party/chromium/media/cobalt/base/check_op.h rename to media/cobalt/base/check_op.h diff --git a/third_party/chromium/media/cobalt/base/cxx17_backports.h b/media/cobalt/base/cxx17_backports.h similarity index 100% rename from third_party/chromium/media/cobalt/base/cxx17_backports.h rename to media/cobalt/base/cxx17_backports.h diff --git a/third_party/chromium/media/cobalt/base/hash/md5.h b/media/cobalt/base/hash/md5.h similarity index 100% rename from third_party/chromium/media/cobalt/base/hash/md5.h rename to media/cobalt/base/hash/md5.h diff --git a/third_party/chromium/media/cobalt/base/notreached.h b/media/cobalt/base/notreached.h similarity index 100% rename from third_party/chromium/media/cobalt/base/notreached.h rename to media/cobalt/base/notreached.h diff --git a/third_party/chromium/media/cobalt/base/types/strong_alias.h b/media/cobalt/base/types/strong_alias.h similarity index 100% rename from third_party/chromium/media/cobalt/base/types/strong_alias.h rename to media/cobalt/base/types/strong_alias.h diff --git a/third_party/chromium/media/cobalt/net/cookies/site_for_cookies.h b/media/cobalt/net/cookies/site_for_cookies.h similarity index 100% rename from third_party/chromium/media/cobalt/net/cookies/site_for_cookies.h rename to media/cobalt/net/cookies/site_for_cookies.h diff --git a/third_party/chromium/media/device_monitors/BUILD.gn b/media/device_monitors/BUILD.gn similarity index 100% rename from third_party/chromium/media/device_monitors/BUILD.gn rename to media/device_monitors/BUILD.gn diff --git a/third_party/chromium/media/device_monitors/device_monitor_mac.h b/media/device_monitors/device_monitor_mac.h similarity index 100% rename from third_party/chromium/media/device_monitors/device_monitor_mac.h rename to media/device_monitors/device_monitor_mac.h diff --git a/third_party/chromium/media/device_monitors/device_monitor_mac.mm b/media/device_monitors/device_monitor_mac.mm similarity index 100% rename from third_party/chromium/media/device_monitors/device_monitor_mac.mm rename to media/device_monitors/device_monitor_mac.mm diff --git a/third_party/chromium/media/device_monitors/device_monitor_udev.cc b/media/device_monitors/device_monitor_udev.cc similarity index 100% rename from third_party/chromium/media/device_monitors/device_monitor_udev.cc rename to media/device_monitors/device_monitor_udev.cc diff --git a/third_party/chromium/media/device_monitors/device_monitor_udev.h b/media/device_monitors/device_monitor_udev.h similarity index 100% rename from third_party/chromium/media/device_monitors/device_monitor_udev.h rename to media/device_monitors/device_monitor_udev.h diff --git a/third_party/chromium/media/device_monitors/system_message_window_win.cc b/media/device_monitors/system_message_window_win.cc similarity index 100% rename from third_party/chromium/media/device_monitors/system_message_window_win.cc rename to media/device_monitors/system_message_window_win.cc diff --git a/third_party/chromium/media/device_monitors/system_message_window_win.h b/media/device_monitors/system_message_window_win.h similarity index 100% rename from third_party/chromium/media/device_monitors/system_message_window_win.h rename to media/device_monitors/system_message_window_win.h diff --git a/third_party/chromium/media/device_monitors/system_message_window_win_unittest.cc b/media/device_monitors/system_message_window_win_unittest.cc similarity index 100% rename from third_party/chromium/media/device_monitors/system_message_window_win_unittest.cc rename to media/device_monitors/system_message_window_win_unittest.cc diff --git a/third_party/chromium/media/ffmpeg/BUILD.gn b/media/ffmpeg/BUILD.gn similarity index 100% rename from third_party/chromium/media/ffmpeg/BUILD.gn rename to media/ffmpeg/BUILD.gn diff --git a/third_party/chromium/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc similarity index 100% rename from third_party/chromium/media/ffmpeg/ffmpeg_common.cc rename to media/ffmpeg/ffmpeg_common.cc diff --git a/third_party/chromium/media/ffmpeg/ffmpeg_common.h b/media/ffmpeg/ffmpeg_common.h similarity index 100% rename from third_party/chromium/media/ffmpeg/ffmpeg_common.h rename to media/ffmpeg/ffmpeg_common.h diff --git a/third_party/chromium/media/ffmpeg/ffmpeg_common_unittest.cc b/media/ffmpeg/ffmpeg_common_unittest.cc similarity index 100% rename from third_party/chromium/media/ffmpeg/ffmpeg_common_unittest.cc rename to media/ffmpeg/ffmpeg_common_unittest.cc diff --git a/third_party/chromium/media/ffmpeg/ffmpeg_decoding_loop.cc b/media/ffmpeg/ffmpeg_decoding_loop.cc similarity index 100% rename from third_party/chromium/media/ffmpeg/ffmpeg_decoding_loop.cc rename to media/ffmpeg/ffmpeg_decoding_loop.cc diff --git a/third_party/chromium/media/ffmpeg/ffmpeg_decoding_loop.h b/media/ffmpeg/ffmpeg_decoding_loop.h similarity index 100% rename from third_party/chromium/media/ffmpeg/ffmpeg_decoding_loop.h rename to media/ffmpeg/ffmpeg_decoding_loop.h diff --git a/third_party/chromium/media/ffmpeg/ffmpeg_deleters.h b/media/ffmpeg/ffmpeg_deleters.h similarity index 100% rename from third_party/chromium/media/ffmpeg/ffmpeg_deleters.h rename to media/ffmpeg/ffmpeg_deleters.h diff --git a/third_party/chromium/media/ffmpeg/ffmpeg_regression_tests.cc b/media/ffmpeg/ffmpeg_regression_tests.cc similarity index 100% rename from third_party/chromium/media/ffmpeg/ffmpeg_regression_tests.cc rename to media/ffmpeg/ffmpeg_regression_tests.cc diff --git a/third_party/chromium/media/filters/BUILD.gn b/media/filters/BUILD.gn similarity index 100% rename from third_party/chromium/media/filters/BUILD.gn rename to media/filters/BUILD.gn diff --git a/third_party/chromium/media/filters/android/media_codec_audio_decoder.cc b/media/filters/android/media_codec_audio_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/android/media_codec_audio_decoder.cc rename to media/filters/android/media_codec_audio_decoder.cc diff --git a/third_party/chromium/media/filters/android/media_codec_audio_decoder.h b/media/filters/android/media_codec_audio_decoder.h similarity index 100% rename from third_party/chromium/media/filters/android/media_codec_audio_decoder.h rename to media/filters/android/media_codec_audio_decoder.h diff --git a/third_party/chromium/media/filters/android/video_frame_extractor.cc b/media/filters/android/video_frame_extractor.cc similarity index 100% rename from third_party/chromium/media/filters/android/video_frame_extractor.cc rename to media/filters/android/video_frame_extractor.cc diff --git a/third_party/chromium/media/filters/android/video_frame_extractor.h b/media/filters/android/video_frame_extractor.h similarity index 100% rename from third_party/chromium/media/filters/android/video_frame_extractor.h rename to media/filters/android/video_frame_extractor.h diff --git a/third_party/chromium/media/filters/android/video_frame_extractor_unittest.cc b/media/filters/android/video_frame_extractor_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/android/video_frame_extractor_unittest.cc rename to media/filters/android/video_frame_extractor_unittest.cc diff --git a/third_party/chromium/media/filters/audio_clock.cc b/media/filters/audio_clock.cc similarity index 100% rename from third_party/chromium/media/filters/audio_clock.cc rename to media/filters/audio_clock.cc diff --git a/third_party/chromium/media/filters/audio_clock.h b/media/filters/audio_clock.h similarity index 100% rename from third_party/chromium/media/filters/audio_clock.h rename to media/filters/audio_clock.h diff --git a/third_party/chromium/media/filters/audio_clock_unittest.cc b/media/filters/audio_clock_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/audio_clock_unittest.cc rename to media/filters/audio_clock_unittest.cc diff --git a/third_party/chromium/media/filters/audio_decoder_stream_unittest.cc b/media/filters/audio_decoder_stream_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/audio_decoder_stream_unittest.cc rename to media/filters/audio_decoder_stream_unittest.cc diff --git a/third_party/chromium/media/filters/audio_decoder_unittest.cc b/media/filters/audio_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/audio_decoder_unittest.cc rename to media/filters/audio_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/audio_file_reader.cc b/media/filters/audio_file_reader.cc similarity index 100% rename from third_party/chromium/media/filters/audio_file_reader.cc rename to media/filters/audio_file_reader.cc diff --git a/third_party/chromium/media/filters/audio_file_reader.h b/media/filters/audio_file_reader.h similarity index 100% rename from third_party/chromium/media/filters/audio_file_reader.h rename to media/filters/audio_file_reader.h diff --git a/third_party/chromium/media/filters/audio_file_reader_unittest.cc b/media/filters/audio_file_reader_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/audio_file_reader_unittest.cc rename to media/filters/audio_file_reader_unittest.cc diff --git a/third_party/chromium/media/filters/audio_renderer_algorithm.cc b/media/filters/audio_renderer_algorithm.cc similarity index 100% rename from third_party/chromium/media/filters/audio_renderer_algorithm.cc rename to media/filters/audio_renderer_algorithm.cc diff --git a/third_party/chromium/media/filters/audio_renderer_algorithm.h b/media/filters/audio_renderer_algorithm.h similarity index 100% rename from third_party/chromium/media/filters/audio_renderer_algorithm.h rename to media/filters/audio_renderer_algorithm.h diff --git a/third_party/chromium/media/filters/audio_renderer_algorithm_unittest.cc b/media/filters/audio_renderer_algorithm_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/audio_renderer_algorithm_unittest.cc rename to media/filters/audio_renderer_algorithm_unittest.cc diff --git a/third_party/chromium/media/filters/audio_timestamp_validator.cc b/media/filters/audio_timestamp_validator.cc similarity index 100% rename from third_party/chromium/media/filters/audio_timestamp_validator.cc rename to media/filters/audio_timestamp_validator.cc diff --git a/third_party/chromium/media/filters/audio_timestamp_validator.h b/media/filters/audio_timestamp_validator.h similarity index 100% rename from third_party/chromium/media/filters/audio_timestamp_validator.h rename to media/filters/audio_timestamp_validator.h diff --git a/third_party/chromium/media/filters/audio_timestamp_validator_unittest.cc b/media/filters/audio_timestamp_validator_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/audio_timestamp_validator_unittest.cc rename to media/filters/audio_timestamp_validator_unittest.cc diff --git a/third_party/chromium/media/filters/audio_video_metadata_extractor.cc b/media/filters/audio_video_metadata_extractor.cc similarity index 100% rename from third_party/chromium/media/filters/audio_video_metadata_extractor.cc rename to media/filters/audio_video_metadata_extractor.cc diff --git a/third_party/chromium/media/filters/audio_video_metadata_extractor.h b/media/filters/audio_video_metadata_extractor.h similarity index 100% rename from third_party/chromium/media/filters/audio_video_metadata_extractor.h rename to media/filters/audio_video_metadata_extractor.h diff --git a/third_party/chromium/media/filters/audio_video_metadata_extractor_unittest.cc b/media/filters/audio_video_metadata_extractor_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/audio_video_metadata_extractor_unittest.cc rename to media/filters/audio_video_metadata_extractor_unittest.cc diff --git a/third_party/chromium/media/filters/blocking_url_protocol.cc b/media/filters/blocking_url_protocol.cc similarity index 100% rename from third_party/chromium/media/filters/blocking_url_protocol.cc rename to media/filters/blocking_url_protocol.cc diff --git a/third_party/chromium/media/filters/blocking_url_protocol.h b/media/filters/blocking_url_protocol.h similarity index 100% rename from third_party/chromium/media/filters/blocking_url_protocol.h rename to media/filters/blocking_url_protocol.h diff --git a/third_party/chromium/media/filters/blocking_url_protocol_unittest.cc b/media/filters/blocking_url_protocol_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/blocking_url_protocol_unittest.cc rename to media/filters/blocking_url_protocol_unittest.cc diff --git a/third_party/chromium/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc similarity index 100% rename from third_party/chromium/media/filters/chunk_demuxer.cc rename to media/filters/chunk_demuxer.cc diff --git a/third_party/chromium/media/filters/chunk_demuxer.h b/media/filters/chunk_demuxer.h similarity index 100% rename from third_party/chromium/media/filters/chunk_demuxer.h rename to media/filters/chunk_demuxer.h diff --git a/third_party/chromium/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/chunk_demuxer_unittest.cc rename to media/filters/chunk_demuxer_unittest.cc diff --git a/third_party/chromium/media/filters/dav1d_video_decoder.cc b/media/filters/dav1d_video_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/dav1d_video_decoder.cc rename to media/filters/dav1d_video_decoder.cc diff --git a/third_party/chromium/media/filters/dav1d_video_decoder.h b/media/filters/dav1d_video_decoder.h similarity index 100% rename from third_party/chromium/media/filters/dav1d_video_decoder.h rename to media/filters/dav1d_video_decoder.h diff --git a/third_party/chromium/media/filters/dav1d_video_decoder_unittest.cc b/media/filters/dav1d_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/dav1d_video_decoder_unittest.cc rename to media/filters/dav1d_video_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/decoder_selector.cc b/media/filters/decoder_selector.cc similarity index 100% rename from third_party/chromium/media/filters/decoder_selector.cc rename to media/filters/decoder_selector.cc diff --git a/third_party/chromium/media/filters/decoder_selector.h b/media/filters/decoder_selector.h similarity index 100% rename from third_party/chromium/media/filters/decoder_selector.h rename to media/filters/decoder_selector.h diff --git a/third_party/chromium/media/filters/decoder_selector_unittest.cc b/media/filters/decoder_selector_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/decoder_selector_unittest.cc rename to media/filters/decoder_selector_unittest.cc diff --git a/third_party/chromium/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc similarity index 100% rename from third_party/chromium/media/filters/decoder_stream.cc rename to media/filters/decoder_stream.cc diff --git a/third_party/chromium/media/filters/decoder_stream.h b/media/filters/decoder_stream.h similarity index 100% rename from third_party/chromium/media/filters/decoder_stream.h rename to media/filters/decoder_stream.h diff --git a/third_party/chromium/media/filters/decoder_stream_traits.cc b/media/filters/decoder_stream_traits.cc similarity index 100% rename from third_party/chromium/media/filters/decoder_stream_traits.cc rename to media/filters/decoder_stream_traits.cc diff --git a/third_party/chromium/media/filters/decoder_stream_traits.h b/media/filters/decoder_stream_traits.h similarity index 100% rename from third_party/chromium/media/filters/decoder_stream_traits.h rename to media/filters/decoder_stream_traits.h diff --git a/third_party/chromium/media/filters/decrypting_audio_decoder.cc b/media/filters/decrypting_audio_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/decrypting_audio_decoder.cc rename to media/filters/decrypting_audio_decoder.cc diff --git a/third_party/chromium/media/filters/decrypting_audio_decoder.h b/media/filters/decrypting_audio_decoder.h similarity index 100% rename from third_party/chromium/media/filters/decrypting_audio_decoder.h rename to media/filters/decrypting_audio_decoder.h diff --git a/third_party/chromium/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/decrypting_audio_decoder_unittest.cc rename to media/filters/decrypting_audio_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/decrypting_demuxer_stream.cc b/media/filters/decrypting_demuxer_stream.cc similarity index 100% rename from third_party/chromium/media/filters/decrypting_demuxer_stream.cc rename to media/filters/decrypting_demuxer_stream.cc diff --git a/third_party/chromium/media/filters/decrypting_demuxer_stream.h b/media/filters/decrypting_demuxer_stream.h similarity index 100% rename from third_party/chromium/media/filters/decrypting_demuxer_stream.h rename to media/filters/decrypting_demuxer_stream.h diff --git a/third_party/chromium/media/filters/decrypting_demuxer_stream_unittest.cc b/media/filters/decrypting_demuxer_stream_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/decrypting_demuxer_stream_unittest.cc rename to media/filters/decrypting_demuxer_stream_unittest.cc diff --git a/third_party/chromium/media/filters/decrypting_media_resource.cc b/media/filters/decrypting_media_resource.cc similarity index 100% rename from third_party/chromium/media/filters/decrypting_media_resource.cc rename to media/filters/decrypting_media_resource.cc diff --git a/third_party/chromium/media/filters/decrypting_media_resource.h b/media/filters/decrypting_media_resource.h similarity index 100% rename from third_party/chromium/media/filters/decrypting_media_resource.h rename to media/filters/decrypting_media_resource.h diff --git a/third_party/chromium/media/filters/decrypting_media_resource_unittest.cc b/media/filters/decrypting_media_resource_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/decrypting_media_resource_unittest.cc rename to media/filters/decrypting_media_resource_unittest.cc diff --git a/third_party/chromium/media/filters/decrypting_video_decoder.cc b/media/filters/decrypting_video_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/decrypting_video_decoder.cc rename to media/filters/decrypting_video_decoder.cc diff --git a/third_party/chromium/media/filters/decrypting_video_decoder.h b/media/filters/decrypting_video_decoder.h similarity index 100% rename from third_party/chromium/media/filters/decrypting_video_decoder.h rename to media/filters/decrypting_video_decoder.h diff --git a/third_party/chromium/media/filters/decrypting_video_decoder_unittest.cc b/media/filters/decrypting_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/decrypting_video_decoder_unittest.cc rename to media/filters/decrypting_video_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/demuxer_perftest.cc b/media/filters/demuxer_perftest.cc similarity index 100% rename from third_party/chromium/media/filters/demuxer_perftest.cc rename to media/filters/demuxer_perftest.cc diff --git a/third_party/chromium/media/filters/fake_video_decoder.cc b/media/filters/fake_video_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/fake_video_decoder.cc rename to media/filters/fake_video_decoder.cc diff --git a/third_party/chromium/media/filters/fake_video_decoder.h b/media/filters/fake_video_decoder.h similarity index 100% rename from third_party/chromium/media/filters/fake_video_decoder.h rename to media/filters/fake_video_decoder.h diff --git a/third_party/chromium/media/filters/fake_video_decoder_unittest.cc b/media/filters/fake_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/fake_video_decoder_unittest.cc rename to media/filters/fake_video_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc b/media/filters/ffmpeg_aac_bitstream_converter.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc rename to media/filters/ffmpeg_aac_bitstream_converter.cc diff --git a/third_party/chromium/media/filters/ffmpeg_aac_bitstream_converter.h b/media/filters/ffmpeg_aac_bitstream_converter.h similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_aac_bitstream_converter.h rename to media/filters/ffmpeg_aac_bitstream_converter.h diff --git a/third_party/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc b/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc rename to media/filters/ffmpeg_aac_bitstream_converter_unittest.cc diff --git a/third_party/chromium/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_audio_decoder.cc rename to media/filters/ffmpeg_audio_decoder.cc diff --git a/third_party/chromium/media/filters/ffmpeg_audio_decoder.h b/media/filters/ffmpeg_audio_decoder.h similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_audio_decoder.h rename to media/filters/ffmpeg_audio_decoder.h diff --git a/third_party/chromium/media/filters/ffmpeg_bitstream_converter.h b/media/filters/ffmpeg_bitstream_converter.h similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_bitstream_converter.h rename to media/filters/ffmpeg_bitstream_converter.h diff --git a/third_party/chromium/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_demuxer.cc rename to media/filters/ffmpeg_demuxer.cc diff --git a/third_party/chromium/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_demuxer.h rename to media/filters/ffmpeg_demuxer.h diff --git a/third_party/chromium/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_demuxer_unittest.cc rename to media/filters/ffmpeg_demuxer_unittest.cc diff --git a/third_party/chromium/media/filters/ffmpeg_glue.cc b/media/filters/ffmpeg_glue.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_glue.cc rename to media/filters/ffmpeg_glue.cc diff --git a/third_party/chromium/media/filters/ffmpeg_glue.h b/media/filters/ffmpeg_glue.h similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_glue.h rename to media/filters/ffmpeg_glue.h diff --git a/third_party/chromium/media/filters/ffmpeg_glue_unittest.cc b/media/filters/ffmpeg_glue_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_glue_unittest.cc rename to media/filters/ffmpeg_glue_unittest.cc diff --git a/third_party/chromium/media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.cc b/media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.cc rename to media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.cc diff --git a/third_party/chromium/media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.h b/media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.h similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.h rename to media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.h diff --git a/third_party/chromium/media/filters/ffmpeg_h264_to_annex_b_bitstream_converter_unittest.cc b/media/filters/ffmpeg_h264_to_annex_b_bitstream_converter_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_h264_to_annex_b_bitstream_converter_unittest.cc rename to media/filters/ffmpeg_h264_to_annex_b_bitstream_converter_unittest.cc diff --git a/third_party/chromium/media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.cc b/media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.cc rename to media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.cc diff --git a/third_party/chromium/media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.h b/media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.h similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.h rename to media/filters/ffmpeg_h265_to_annex_b_bitstream_converter.h diff --git a/third_party/chromium/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_video_decoder.cc rename to media/filters/ffmpeg_video_decoder.cc diff --git a/third_party/chromium/media/filters/ffmpeg_video_decoder.h b/media/filters/ffmpeg_video_decoder.h similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_video_decoder.h rename to media/filters/ffmpeg_video_decoder.h diff --git a/third_party/chromium/media/filters/ffmpeg_video_decoder_unittest.cc b/media/filters/ffmpeg_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/ffmpeg_video_decoder_unittest.cc rename to media/filters/ffmpeg_video_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/file_data_source.cc b/media/filters/file_data_source.cc similarity index 100% rename from third_party/chromium/media/filters/file_data_source.cc rename to media/filters/file_data_source.cc diff --git a/third_party/chromium/media/filters/file_data_source.h b/media/filters/file_data_source.h similarity index 100% rename from third_party/chromium/media/filters/file_data_source.h rename to media/filters/file_data_source.h diff --git a/third_party/chromium/media/filters/file_data_source_unittest.cc b/media/filters/file_data_source_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/file_data_source_unittest.cc rename to media/filters/file_data_source_unittest.cc diff --git a/third_party/chromium/media/filters/frame_buffer_pool.cc b/media/filters/frame_buffer_pool.cc similarity index 100% rename from third_party/chromium/media/filters/frame_buffer_pool.cc rename to media/filters/frame_buffer_pool.cc diff --git a/third_party/chromium/media/filters/frame_buffer_pool.h b/media/filters/frame_buffer_pool.h similarity index 100% rename from third_party/chromium/media/filters/frame_buffer_pool.h rename to media/filters/frame_buffer_pool.h diff --git a/third_party/chromium/media/filters/frame_buffer_pool_unittest.cc b/media/filters/frame_buffer_pool_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/frame_buffer_pool_unittest.cc rename to media/filters/frame_buffer_pool_unittest.cc diff --git a/third_party/chromium/media/filters/frame_processor.cc b/media/filters/frame_processor.cc similarity index 100% rename from third_party/chromium/media/filters/frame_processor.cc rename to media/filters/frame_processor.cc diff --git a/third_party/chromium/media/filters/frame_processor.h b/media/filters/frame_processor.h similarity index 100% rename from third_party/chromium/media/filters/frame_processor.h rename to media/filters/frame_processor.h diff --git a/third_party/chromium/media/filters/frame_processor_unittest.cc b/media/filters/frame_processor_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/frame_processor_unittest.cc rename to media/filters/frame_processor_unittest.cc diff --git a/third_party/chromium/media/filters/fuchsia/DEPS b/media/filters/fuchsia/DEPS similarity index 100% rename from third_party/chromium/media/filters/fuchsia/DEPS rename to media/filters/fuchsia/DEPS diff --git a/third_party/chromium/media/filters/fuchsia/DIR_METADATA b/media/filters/fuchsia/DIR_METADATA similarity index 100% rename from third_party/chromium/media/filters/fuchsia/DIR_METADATA rename to media/filters/fuchsia/DIR_METADATA diff --git a/third_party/chromium/media/filters/fuchsia/OWNERS b/media/filters/fuchsia/OWNERS similarity index 100% rename from third_party/chromium/media/filters/fuchsia/OWNERS rename to media/filters/fuchsia/OWNERS diff --git a/third_party/chromium/media/filters/fuchsia/fuchsia_video_decoder.cc b/media/filters/fuchsia/fuchsia_video_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/fuchsia/fuchsia_video_decoder.cc rename to media/filters/fuchsia/fuchsia_video_decoder.cc diff --git a/third_party/chromium/media/filters/fuchsia/fuchsia_video_decoder.h b/media/filters/fuchsia/fuchsia_video_decoder.h similarity index 100% rename from third_party/chromium/media/filters/fuchsia/fuchsia_video_decoder.h rename to media/filters/fuchsia/fuchsia_video_decoder.h diff --git a/third_party/chromium/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc b/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc rename to media/filters/fuchsia/fuchsia_video_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/gav1_video_decoder.cc b/media/filters/gav1_video_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/gav1_video_decoder.cc rename to media/filters/gav1_video_decoder.cc diff --git a/third_party/chromium/media/filters/gav1_video_decoder.h b/media/filters/gav1_video_decoder.h similarity index 100% rename from third_party/chromium/media/filters/gav1_video_decoder.h rename to media/filters/gav1_video_decoder.h diff --git a/third_party/chromium/media/filters/gav1_video_decoder_unittest.cc b/media/filters/gav1_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/gav1_video_decoder_unittest.cc rename to media/filters/gav1_video_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/h264_bitstream_buffer.cc b/media/filters/h264_bitstream_buffer.cc similarity index 100% rename from third_party/chromium/media/filters/h264_bitstream_buffer.cc rename to media/filters/h264_bitstream_buffer.cc diff --git a/third_party/chromium/media/filters/h264_bitstream_buffer.h b/media/filters/h264_bitstream_buffer.h similarity index 100% rename from third_party/chromium/media/filters/h264_bitstream_buffer.h rename to media/filters/h264_bitstream_buffer.h diff --git a/third_party/chromium/media/filters/h264_bitstream_buffer_unittest.cc b/media/filters/h264_bitstream_buffer_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/h264_bitstream_buffer_unittest.cc rename to media/filters/h264_bitstream_buffer_unittest.cc diff --git a/third_party/chromium/media/filters/h264_to_annex_b_bitstream_converter.cc b/media/filters/h264_to_annex_b_bitstream_converter.cc similarity index 100% rename from third_party/chromium/media/filters/h264_to_annex_b_bitstream_converter.cc rename to media/filters/h264_to_annex_b_bitstream_converter.cc diff --git a/third_party/chromium/media/filters/h264_to_annex_b_bitstream_converter.h b/media/filters/h264_to_annex_b_bitstream_converter.h similarity index 100% rename from third_party/chromium/media/filters/h264_to_annex_b_bitstream_converter.h rename to media/filters/h264_to_annex_b_bitstream_converter.h diff --git a/third_party/chromium/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc b/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/h264_to_annex_b_bitstream_converter_unittest.cc rename to media/filters/h264_to_annex_b_bitstream_converter_unittest.cc diff --git a/third_party/chromium/media/filters/in_memory_url_protocol.cc b/media/filters/in_memory_url_protocol.cc similarity index 100% rename from third_party/chromium/media/filters/in_memory_url_protocol.cc rename to media/filters/in_memory_url_protocol.cc diff --git a/third_party/chromium/media/filters/in_memory_url_protocol.h b/media/filters/in_memory_url_protocol.h similarity index 100% rename from third_party/chromium/media/filters/in_memory_url_protocol.h rename to media/filters/in_memory_url_protocol.h diff --git a/third_party/chromium/media/filters/in_memory_url_protocol_unittest.cc b/media/filters/in_memory_url_protocol_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/in_memory_url_protocol_unittest.cc rename to media/filters/in_memory_url_protocol_unittest.cc diff --git a/third_party/chromium/media/filters/ivf_parser.cc b/media/filters/ivf_parser.cc similarity index 100% rename from third_party/chromium/media/filters/ivf_parser.cc rename to media/filters/ivf_parser.cc diff --git a/third_party/chromium/media/filters/ivf_parser.h b/media/filters/ivf_parser.h similarity index 100% rename from third_party/chromium/media/filters/ivf_parser.h rename to media/filters/ivf_parser.h diff --git a/third_party/chromium/media/filters/ivf_parser_unittest.cc b/media/filters/ivf_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/ivf_parser_unittest.cc rename to media/filters/ivf_parser_unittest.cc diff --git a/third_party/chromium/media/filters/media_file_checker.cc b/media/filters/media_file_checker.cc similarity index 100% rename from third_party/chromium/media/filters/media_file_checker.cc rename to media/filters/media_file_checker.cc diff --git a/third_party/chromium/media/filters/media_file_checker.h b/media/filters/media_file_checker.h similarity index 100% rename from third_party/chromium/media/filters/media_file_checker.h rename to media/filters/media_file_checker.h diff --git a/third_party/chromium/media/filters/media_file_checker_unittest.cc b/media/filters/media_file_checker_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/media_file_checker_unittest.cc rename to media/filters/media_file_checker_unittest.cc diff --git a/third_party/chromium/media/filters/memory_data_source.cc b/media/filters/memory_data_source.cc similarity index 100% rename from third_party/chromium/media/filters/memory_data_source.cc rename to media/filters/memory_data_source.cc diff --git a/third_party/chromium/media/filters/memory_data_source.h b/media/filters/memory_data_source.h similarity index 100% rename from third_party/chromium/media/filters/memory_data_source.h rename to media/filters/memory_data_source.h diff --git a/third_party/chromium/media/filters/memory_data_source_unittest.cc b/media/filters/memory_data_source_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/memory_data_source_unittest.cc rename to media/filters/memory_data_source_unittest.cc diff --git a/third_party/chromium/media/filters/offloading_video_decoder.cc b/media/filters/offloading_video_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/offloading_video_decoder.cc rename to media/filters/offloading_video_decoder.cc diff --git a/third_party/chromium/media/filters/offloading_video_decoder.h b/media/filters/offloading_video_decoder.h similarity index 100% rename from third_party/chromium/media/filters/offloading_video_decoder.h rename to media/filters/offloading_video_decoder.h diff --git a/third_party/chromium/media/filters/offloading_video_decoder_unittest.cc b/media/filters/offloading_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/offloading_video_decoder_unittest.cc rename to media/filters/offloading_video_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/pipeline_controller.cc b/media/filters/pipeline_controller.cc similarity index 100% rename from third_party/chromium/media/filters/pipeline_controller.cc rename to media/filters/pipeline_controller.cc diff --git a/third_party/chromium/media/filters/pipeline_controller.h b/media/filters/pipeline_controller.h similarity index 100% rename from third_party/chromium/media/filters/pipeline_controller.h rename to media/filters/pipeline_controller.h diff --git a/third_party/chromium/media/filters/pipeline_controller_unittest.cc b/media/filters/pipeline_controller_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/pipeline_controller_unittest.cc rename to media/filters/pipeline_controller_unittest.cc diff --git a/third_party/chromium/media/filters/source_buffer_parse_warnings.h b/media/filters/source_buffer_parse_warnings.h similarity index 100% rename from third_party/chromium/media/filters/source_buffer_parse_warnings.h rename to media/filters/source_buffer_parse_warnings.h diff --git a/third_party/chromium/media/filters/source_buffer_range.cc b/media/filters/source_buffer_range.cc similarity index 100% rename from third_party/chromium/media/filters/source_buffer_range.cc rename to media/filters/source_buffer_range.cc diff --git a/third_party/chromium/media/filters/source_buffer_range.h b/media/filters/source_buffer_range.h similarity index 100% rename from third_party/chromium/media/filters/source_buffer_range.h rename to media/filters/source_buffer_range.h diff --git a/third_party/chromium/media/filters/source_buffer_state.cc b/media/filters/source_buffer_state.cc similarity index 100% rename from third_party/chromium/media/filters/source_buffer_state.cc rename to media/filters/source_buffer_state.cc diff --git a/third_party/chromium/media/filters/source_buffer_state.h b/media/filters/source_buffer_state.h similarity index 100% rename from third_party/chromium/media/filters/source_buffer_state.h rename to media/filters/source_buffer_state.h diff --git a/third_party/chromium/media/filters/source_buffer_state_unittest.cc b/media/filters/source_buffer_state_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/source_buffer_state_unittest.cc rename to media/filters/source_buffer_state_unittest.cc diff --git a/third_party/chromium/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc similarity index 100% rename from third_party/chromium/media/filters/source_buffer_stream.cc rename to media/filters/source_buffer_stream.cc diff --git a/third_party/chromium/media/filters/source_buffer_stream.h b/media/filters/source_buffer_stream.h similarity index 100% rename from third_party/chromium/media/filters/source_buffer_stream.h rename to media/filters/source_buffer_stream.h diff --git a/third_party/chromium/media/filters/source_buffer_stream_unittest.cc b/media/filters/source_buffer_stream_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/source_buffer_stream_unittest.cc rename to media/filters/source_buffer_stream_unittest.cc diff --git a/third_party/chromium/media/filters/stream_parser_factory.cc b/media/filters/stream_parser_factory.cc similarity index 100% rename from third_party/chromium/media/filters/stream_parser_factory.cc rename to media/filters/stream_parser_factory.cc diff --git a/third_party/chromium/media/filters/stream_parser_factory.h b/media/filters/stream_parser_factory.h similarity index 100% rename from third_party/chromium/media/filters/stream_parser_factory.h rename to media/filters/stream_parser_factory.h diff --git a/third_party/chromium/media/filters/video_cadence_estimator.cc b/media/filters/video_cadence_estimator.cc similarity index 100% rename from third_party/chromium/media/filters/video_cadence_estimator.cc rename to media/filters/video_cadence_estimator.cc diff --git a/third_party/chromium/media/filters/video_cadence_estimator.h b/media/filters/video_cadence_estimator.h similarity index 100% rename from third_party/chromium/media/filters/video_cadence_estimator.h rename to media/filters/video_cadence_estimator.h diff --git a/third_party/chromium/media/filters/video_cadence_estimator_unittest.cc b/media/filters/video_cadence_estimator_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/video_cadence_estimator_unittest.cc rename to media/filters/video_cadence_estimator_unittest.cc diff --git a/third_party/chromium/media/filters/video_decoder_stream_unittest.cc b/media/filters/video_decoder_stream_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/video_decoder_stream_unittest.cc rename to media/filters/video_decoder_stream_unittest.cc diff --git a/third_party/chromium/media/filters/video_renderer_algorithm.cc b/media/filters/video_renderer_algorithm.cc similarity index 100% rename from third_party/chromium/media/filters/video_renderer_algorithm.cc rename to media/filters/video_renderer_algorithm.cc diff --git a/third_party/chromium/media/filters/video_renderer_algorithm.h b/media/filters/video_renderer_algorithm.h similarity index 100% rename from third_party/chromium/media/filters/video_renderer_algorithm.h rename to media/filters/video_renderer_algorithm.h diff --git a/third_party/chromium/media/filters/video_renderer_algorithm_unittest.cc b/media/filters/video_renderer_algorithm_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/video_renderer_algorithm_unittest.cc rename to media/filters/video_renderer_algorithm_unittest.cc diff --git a/third_party/chromium/media/filters/vp9_bool_decoder.cc b/media/filters/vp9_bool_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_bool_decoder.cc rename to media/filters/vp9_bool_decoder.cc diff --git a/third_party/chromium/media/filters/vp9_bool_decoder.h b/media/filters/vp9_bool_decoder.h similarity index 100% rename from third_party/chromium/media/filters/vp9_bool_decoder.h rename to media/filters/vp9_bool_decoder.h diff --git a/third_party/chromium/media/filters/vp9_compressed_header_parser.cc b/media/filters/vp9_compressed_header_parser.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_compressed_header_parser.cc rename to media/filters/vp9_compressed_header_parser.cc diff --git a/third_party/chromium/media/filters/vp9_compressed_header_parser.h b/media/filters/vp9_compressed_header_parser.h similarity index 100% rename from third_party/chromium/media/filters/vp9_compressed_header_parser.h rename to media/filters/vp9_compressed_header_parser.h diff --git a/third_party/chromium/media/filters/vp9_parser.cc b/media/filters/vp9_parser.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_parser.cc rename to media/filters/vp9_parser.cc diff --git a/third_party/chromium/media/filters/vp9_parser.h b/media/filters/vp9_parser.h similarity index 100% rename from third_party/chromium/media/filters/vp9_parser.h rename to media/filters/vp9_parser.h diff --git a/third_party/chromium/media/filters/vp9_parser_encrypted_fuzzertest.cc b/media/filters/vp9_parser_encrypted_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_parser_encrypted_fuzzertest.cc rename to media/filters/vp9_parser_encrypted_fuzzertest.cc diff --git a/third_party/chromium/media/filters/vp9_parser_fuzzertest.cc b/media/filters/vp9_parser_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_parser_fuzzertest.cc rename to media/filters/vp9_parser_fuzzertest.cc diff --git a/third_party/chromium/media/filters/vp9_parser_unittest.cc b/media/filters/vp9_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_parser_unittest.cc rename to media/filters/vp9_parser_unittest.cc diff --git a/third_party/chromium/media/filters/vp9_raw_bits_reader.cc b/media/filters/vp9_raw_bits_reader.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_raw_bits_reader.cc rename to media/filters/vp9_raw_bits_reader.cc diff --git a/third_party/chromium/media/filters/vp9_raw_bits_reader.h b/media/filters/vp9_raw_bits_reader.h similarity index 100% rename from third_party/chromium/media/filters/vp9_raw_bits_reader.h rename to media/filters/vp9_raw_bits_reader.h diff --git a/third_party/chromium/media/filters/vp9_raw_bits_reader_unittest.cc b/media/filters/vp9_raw_bits_reader_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_raw_bits_reader_unittest.cc rename to media/filters/vp9_raw_bits_reader_unittest.cc diff --git a/third_party/chromium/media/filters/vp9_uncompressed_header_parser.cc b/media/filters/vp9_uncompressed_header_parser.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_uncompressed_header_parser.cc rename to media/filters/vp9_uncompressed_header_parser.cc diff --git a/third_party/chromium/media/filters/vp9_uncompressed_header_parser.h b/media/filters/vp9_uncompressed_header_parser.h similarity index 100% rename from third_party/chromium/media/filters/vp9_uncompressed_header_parser.h rename to media/filters/vp9_uncompressed_header_parser.h diff --git a/third_party/chromium/media/filters/vp9_uncompressed_header_parser_unittest.cc b/media/filters/vp9_uncompressed_header_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/vp9_uncompressed_header_parser_unittest.cc rename to media/filters/vp9_uncompressed_header_parser_unittest.cc diff --git a/third_party/chromium/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc similarity index 100% rename from third_party/chromium/media/filters/vpx_video_decoder.cc rename to media/filters/vpx_video_decoder.cc diff --git a/third_party/chromium/media/filters/vpx_video_decoder.h b/media/filters/vpx_video_decoder.h similarity index 100% rename from third_party/chromium/media/filters/vpx_video_decoder.h rename to media/filters/vpx_video_decoder.h diff --git a/third_party/chromium/media/filters/vpx_video_decoder_fuzzertest.cc b/media/filters/vpx_video_decoder_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/filters/vpx_video_decoder_fuzzertest.cc rename to media/filters/vpx_video_decoder_fuzzertest.cc diff --git a/third_party/chromium/media/filters/vpx_video_decoder_unittest.cc b/media/filters/vpx_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/filters/vpx_video_decoder_unittest.cc rename to media/filters/vpx_video_decoder_unittest.cc diff --git a/third_party/chromium/media/filters/wsola_internals.cc b/media/filters/wsola_internals.cc similarity index 100% rename from third_party/chromium/media/filters/wsola_internals.cc rename to media/filters/wsola_internals.cc diff --git a/third_party/chromium/media/filters/wsola_internals.h b/media/filters/wsola_internals.h similarity index 100% rename from third_party/chromium/media/filters/wsola_internals.h rename to media/filters/wsola_internals.h diff --git a/third_party/chromium/media/formats/BUILD.gn b/media/formats/BUILD.gn similarity index 100% rename from third_party/chromium/media/formats/BUILD.gn rename to media/formats/BUILD.gn diff --git a/third_party/chromium/media/formats/ac3/ac3_util.cc b/media/formats/ac3/ac3_util.cc similarity index 100% rename from third_party/chromium/media/formats/ac3/ac3_util.cc rename to media/formats/ac3/ac3_util.cc diff --git a/third_party/chromium/media/formats/ac3/ac3_util.h b/media/formats/ac3/ac3_util.h similarity index 100% rename from third_party/chromium/media/formats/ac3/ac3_util.h rename to media/formats/ac3/ac3_util.h diff --git a/third_party/chromium/media/formats/ac3/ac3_util_unittest.cc b/media/formats/ac3/ac3_util_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/ac3/ac3_util_unittest.cc rename to media/formats/ac3/ac3_util_unittest.cc diff --git a/third_party/chromium/media/formats/common/offset_byte_queue.cc b/media/formats/common/offset_byte_queue.cc similarity index 100% rename from third_party/chromium/media/formats/common/offset_byte_queue.cc rename to media/formats/common/offset_byte_queue.cc diff --git a/third_party/chromium/media/formats/common/offset_byte_queue.h b/media/formats/common/offset_byte_queue.h similarity index 100% rename from third_party/chromium/media/formats/common/offset_byte_queue.h rename to media/formats/common/offset_byte_queue.h diff --git a/third_party/chromium/media/formats/common/offset_byte_queue_unittest.cc b/media/formats/common/offset_byte_queue_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/common/offset_byte_queue_unittest.cc rename to media/formats/common/offset_byte_queue_unittest.cc diff --git a/third_party/chromium/media/formats/common/opus_constants.cc b/media/formats/common/opus_constants.cc similarity index 100% rename from third_party/chromium/media/formats/common/opus_constants.cc rename to media/formats/common/opus_constants.cc diff --git a/third_party/chromium/media/formats/common/opus_constants.h b/media/formats/common/opus_constants.h similarity index 100% rename from third_party/chromium/media/formats/common/opus_constants.h rename to media/formats/common/opus_constants.h diff --git a/third_party/chromium/media/formats/common/stream_parser_test_base.cc b/media/formats/common/stream_parser_test_base.cc similarity index 100% rename from third_party/chromium/media/formats/common/stream_parser_test_base.cc rename to media/formats/common/stream_parser_test_base.cc diff --git a/third_party/chromium/media/formats/common/stream_parser_test_base.h b/media/formats/common/stream_parser_test_base.h similarity index 100% rename from third_party/chromium/media/formats/common/stream_parser_test_base.h rename to media/formats/common/stream_parser_test_base.h diff --git a/third_party/chromium/media/formats/mp2t/descriptors.cc b/media/formats/mp2t/descriptors.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/descriptors.cc rename to media/formats/mp2t/descriptors.cc diff --git a/third_party/chromium/media/formats/mp2t/descriptors.h b/media/formats/mp2t/descriptors.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/descriptors.h rename to media/formats/mp2t/descriptors.h diff --git a/third_party/chromium/media/formats/mp2t/es_adapter_video.cc b/media/formats/mp2t/es_adapter_video.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_adapter_video.cc rename to media/formats/mp2t/es_adapter_video.cc diff --git a/third_party/chromium/media/formats/mp2t/es_adapter_video.h b/media/formats/mp2t/es_adapter_video.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_adapter_video.h rename to media/formats/mp2t/es_adapter_video.h diff --git a/third_party/chromium/media/formats/mp2t/es_adapter_video_unittest.cc b/media/formats/mp2t/es_adapter_video_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_adapter_video_unittest.cc rename to media/formats/mp2t/es_adapter_video_unittest.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser.cc b/media/formats/mp2t/es_parser.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser.cc rename to media/formats/mp2t/es_parser.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser.h b/media/formats/mp2t/es_parser.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser.h rename to media/formats/mp2t/es_parser.h diff --git a/third_party/chromium/media/formats/mp2t/es_parser_adts.cc b/media/formats/mp2t/es_parser_adts.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_adts.cc rename to media/formats/mp2t/es_parser_adts.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_adts.h b/media/formats/mp2t/es_parser_adts.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_adts.h rename to media/formats/mp2t/es_parser_adts.h diff --git a/third_party/chromium/media/formats/mp2t/es_parser_adts_fuzzer.cc b/media/formats/mp2t/es_parser_adts_fuzzer.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_adts_fuzzer.cc rename to media/formats/mp2t/es_parser_adts_fuzzer.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_adts_unittest.cc b/media/formats/mp2t/es_parser_adts_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_adts_unittest.cc rename to media/formats/mp2t/es_parser_adts_unittest.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_h264.cc b/media/formats/mp2t/es_parser_h264.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_h264.cc rename to media/formats/mp2t/es_parser_h264.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_h264.h b/media/formats/mp2t/es_parser_h264.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_h264.h rename to media/formats/mp2t/es_parser_h264.h diff --git a/third_party/chromium/media/formats/mp2t/es_parser_h264_fuzzer.cc b/media/formats/mp2t/es_parser_h264_fuzzer.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_h264_fuzzer.cc rename to media/formats/mp2t/es_parser_h264_fuzzer.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_h264_unittest.cc b/media/formats/mp2t/es_parser_h264_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_h264_unittest.cc rename to media/formats/mp2t/es_parser_h264_unittest.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_mpeg1audio.cc b/media/formats/mp2t/es_parser_mpeg1audio.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_mpeg1audio.cc rename to media/formats/mp2t/es_parser_mpeg1audio.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_mpeg1audio.h b/media/formats/mp2t/es_parser_mpeg1audio.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_mpeg1audio.h rename to media/formats/mp2t/es_parser_mpeg1audio.h diff --git a/third_party/chromium/media/formats/mp2t/es_parser_mpeg1audio_fuzzer.cc b/media/formats/mp2t/es_parser_mpeg1audio_fuzzer.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_mpeg1audio_fuzzer.cc rename to media/formats/mp2t/es_parser_mpeg1audio_fuzzer.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_mpeg1audio_unittest.cc b/media/formats/mp2t/es_parser_mpeg1audio_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_mpeg1audio_unittest.cc rename to media/formats/mp2t/es_parser_mpeg1audio_unittest.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_test_base.cc b/media/formats/mp2t/es_parser_test_base.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_test_base.cc rename to media/formats/mp2t/es_parser_test_base.cc diff --git a/third_party/chromium/media/formats/mp2t/es_parser_test_base.h b/media/formats/mp2t/es_parser_test_base.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/es_parser_test_base.h rename to media/formats/mp2t/es_parser_test_base.h diff --git a/third_party/chromium/media/formats/mp2t/mp2t_common.h b/media/formats/mp2t/mp2t_common.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/mp2t_common.h rename to media/formats/mp2t/mp2t_common.h diff --git a/third_party/chromium/media/formats/mp2t/mp2t_stream_parser.cc b/media/formats/mp2t/mp2t_stream_parser.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/mp2t_stream_parser.cc rename to media/formats/mp2t/mp2t_stream_parser.cc diff --git a/third_party/chromium/media/formats/mp2t/mp2t_stream_parser.h b/media/formats/mp2t/mp2t_stream_parser.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/mp2t_stream_parser.h rename to media/formats/mp2t/mp2t_stream_parser.h diff --git a/third_party/chromium/media/formats/mp2t/mp2t_stream_parser_unittest.cc b/media/formats/mp2t/mp2t_stream_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/mp2t_stream_parser_unittest.cc rename to media/formats/mp2t/mp2t_stream_parser_unittest.cc diff --git a/third_party/chromium/media/formats/mp2t/timestamp_unroller.cc b/media/formats/mp2t/timestamp_unroller.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/timestamp_unroller.cc rename to media/formats/mp2t/timestamp_unroller.cc diff --git a/third_party/chromium/media/formats/mp2t/timestamp_unroller.h b/media/formats/mp2t/timestamp_unroller.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/timestamp_unroller.h rename to media/formats/mp2t/timestamp_unroller.h diff --git a/third_party/chromium/media/formats/mp2t/timestamp_unroller_unittest.cc b/media/formats/mp2t/timestamp_unroller_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/timestamp_unroller_unittest.cc rename to media/formats/mp2t/timestamp_unroller_unittest.cc diff --git a/third_party/chromium/media/formats/mp2t/ts_packet.cc b/media/formats/mp2t/ts_packet.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_packet.cc rename to media/formats/mp2t/ts_packet.cc diff --git a/third_party/chromium/media/formats/mp2t/ts_packet.h b/media/formats/mp2t/ts_packet.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_packet.h rename to media/formats/mp2t/ts_packet.h diff --git a/third_party/chromium/media/formats/mp2t/ts_section.h b/media/formats/mp2t/ts_section.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section.h rename to media/formats/mp2t/ts_section.h diff --git a/third_party/chromium/media/formats/mp2t/ts_section_cat.cc b/media/formats/mp2t/ts_section_cat.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_cat.cc rename to media/formats/mp2t/ts_section_cat.cc diff --git a/third_party/chromium/media/formats/mp2t/ts_section_cat.h b/media/formats/mp2t/ts_section_cat.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_cat.h rename to media/formats/mp2t/ts_section_cat.h diff --git a/third_party/chromium/media/formats/mp2t/ts_section_cets_ecm.cc b/media/formats/mp2t/ts_section_cets_ecm.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_cets_ecm.cc rename to media/formats/mp2t/ts_section_cets_ecm.cc diff --git a/third_party/chromium/media/formats/mp2t/ts_section_cets_ecm.h b/media/formats/mp2t/ts_section_cets_ecm.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_cets_ecm.h rename to media/formats/mp2t/ts_section_cets_ecm.h diff --git a/third_party/chromium/media/formats/mp2t/ts_section_cets_pssh.cc b/media/formats/mp2t/ts_section_cets_pssh.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_cets_pssh.cc rename to media/formats/mp2t/ts_section_cets_pssh.cc diff --git a/third_party/chromium/media/formats/mp2t/ts_section_cets_pssh.h b/media/formats/mp2t/ts_section_cets_pssh.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_cets_pssh.h rename to media/formats/mp2t/ts_section_cets_pssh.h diff --git a/third_party/chromium/media/formats/mp2t/ts_section_pat.cc b/media/formats/mp2t/ts_section_pat.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_pat.cc rename to media/formats/mp2t/ts_section_pat.cc diff --git a/third_party/chromium/media/formats/mp2t/ts_section_pat.h b/media/formats/mp2t/ts_section_pat.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_pat.h rename to media/formats/mp2t/ts_section_pat.h diff --git a/third_party/chromium/media/formats/mp2t/ts_section_pes.cc b/media/formats/mp2t/ts_section_pes.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_pes.cc rename to media/formats/mp2t/ts_section_pes.cc diff --git a/third_party/chromium/media/formats/mp2t/ts_section_pes.h b/media/formats/mp2t/ts_section_pes.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_pes.h rename to media/formats/mp2t/ts_section_pes.h diff --git a/third_party/chromium/media/formats/mp2t/ts_section_pmt.cc b/media/formats/mp2t/ts_section_pmt.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_pmt.cc rename to media/formats/mp2t/ts_section_pmt.cc diff --git a/third_party/chromium/media/formats/mp2t/ts_section_pmt.h b/media/formats/mp2t/ts_section_pmt.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_pmt.h rename to media/formats/mp2t/ts_section_pmt.h diff --git a/third_party/chromium/media/formats/mp2t/ts_section_psi.cc b/media/formats/mp2t/ts_section_psi.cc similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_psi.cc rename to media/formats/mp2t/ts_section_psi.cc diff --git a/third_party/chromium/media/formats/mp2t/ts_section_psi.h b/media/formats/mp2t/ts_section_psi.h similarity index 100% rename from third_party/chromium/media/formats/mp2t/ts_section_psi.h rename to media/formats/mp2t/ts_section_psi.h diff --git a/third_party/chromium/media/formats/mp4/aac.cc b/media/formats/mp4/aac.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/aac.cc rename to media/formats/mp4/aac.cc diff --git a/third_party/chromium/media/formats/mp4/aac.h b/media/formats/mp4/aac.h similarity index 100% rename from third_party/chromium/media/formats/mp4/aac.h rename to media/formats/mp4/aac.h diff --git a/third_party/chromium/media/formats/mp4/aac_unittest.cc b/media/formats/mp4/aac_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/aac_unittest.cc rename to media/formats/mp4/aac_unittest.cc diff --git a/third_party/chromium/media/formats/mp4/avc.cc b/media/formats/mp4/avc.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/avc.cc rename to media/formats/mp4/avc.cc diff --git a/third_party/chromium/media/formats/mp4/avc.h b/media/formats/mp4/avc.h similarity index 100% rename from third_party/chromium/media/formats/mp4/avc.h rename to media/formats/mp4/avc.h diff --git a/third_party/chromium/media/formats/mp4/avc_unittest.cc b/media/formats/mp4/avc_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/avc_unittest.cc rename to media/formats/mp4/avc_unittest.cc diff --git a/third_party/chromium/media/formats/mp4/bitstream_converter.cc b/media/formats/mp4/bitstream_converter.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/bitstream_converter.cc rename to media/formats/mp4/bitstream_converter.cc diff --git a/third_party/chromium/media/formats/mp4/bitstream_converter.h b/media/formats/mp4/bitstream_converter.h similarity index 100% rename from third_party/chromium/media/formats/mp4/bitstream_converter.h rename to media/formats/mp4/bitstream_converter.h diff --git a/third_party/chromium/media/formats/mp4/box_definitions.cc b/media/formats/mp4/box_definitions.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/box_definitions.cc rename to media/formats/mp4/box_definitions.cc diff --git a/third_party/chromium/media/formats/mp4/box_definitions.h b/media/formats/mp4/box_definitions.h similarity index 100% rename from third_party/chromium/media/formats/mp4/box_definitions.h rename to media/formats/mp4/box_definitions.h diff --git a/third_party/chromium/media/formats/mp4/box_reader.cc b/media/formats/mp4/box_reader.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/box_reader.cc rename to media/formats/mp4/box_reader.cc diff --git a/third_party/chromium/media/formats/mp4/box_reader.h b/media/formats/mp4/box_reader.h similarity index 100% rename from third_party/chromium/media/formats/mp4/box_reader.h rename to media/formats/mp4/box_reader.h diff --git a/third_party/chromium/media/formats/mp4/box_reader_unittest.cc b/media/formats/mp4/box_reader_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/box_reader_unittest.cc rename to media/formats/mp4/box_reader_unittest.cc diff --git a/third_party/chromium/media/formats/mp4/dolby_vision.cc b/media/formats/mp4/dolby_vision.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/dolby_vision.cc rename to media/formats/mp4/dolby_vision.cc diff --git a/third_party/chromium/media/formats/mp4/dolby_vision.h b/media/formats/mp4/dolby_vision.h similarity index 100% rename from third_party/chromium/media/formats/mp4/dolby_vision.h rename to media/formats/mp4/dolby_vision.h diff --git a/third_party/chromium/media/formats/mp4/dolby_vision_unittest.cc b/media/formats/mp4/dolby_vision_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/dolby_vision_unittest.cc rename to media/formats/mp4/dolby_vision_unittest.cc diff --git a/third_party/chromium/media/formats/mp4/es_descriptor.cc b/media/formats/mp4/es_descriptor.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/es_descriptor.cc rename to media/formats/mp4/es_descriptor.cc diff --git a/third_party/chromium/media/formats/mp4/es_descriptor.h b/media/formats/mp4/es_descriptor.h similarity index 100% rename from third_party/chromium/media/formats/mp4/es_descriptor.h rename to media/formats/mp4/es_descriptor.h diff --git a/third_party/chromium/media/formats/mp4/es_descriptor_unittest.cc b/media/formats/mp4/es_descriptor_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/es_descriptor_unittest.cc rename to media/formats/mp4/es_descriptor_unittest.cc diff --git a/third_party/chromium/media/formats/mp4/fourccs.h b/media/formats/mp4/fourccs.h similarity index 100% rename from third_party/chromium/media/formats/mp4/fourccs.h rename to media/formats/mp4/fourccs.h diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk1-config-idr.bin b/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk1-config-idr.bin similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk1-config-idr.bin rename to media/formats/mp4/h264_annex_b_fuzz_corpus/chunk1-config-idr.bin diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk2-non-idr.bin b/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk2-non-idr.bin similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk2-non-idr.bin rename to media/formats/mp4/h264_annex_b_fuzz_corpus/chunk2-non-idr.bin diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk3-non-idr.bin b/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk3-non-idr.bin similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk3-non-idr.bin rename to media/formats/mp4/h264_annex_b_fuzz_corpus/chunk3-non-idr.bin diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk4-non-idr.bin b/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk4-non-idr.bin similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk4-non-idr.bin rename to media/formats/mp4/h264_annex_b_fuzz_corpus/chunk4-non-idr.bin diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk5-non-idr.bin b/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk5-non-idr.bin similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk5-non-idr.bin rename to media/formats/mp4/h264_annex_b_fuzz_corpus/chunk5-non-idr.bin diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk6-config-idr.bin b/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk6-config-idr.bin similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk6-config-idr.bin rename to media/formats/mp4/h264_annex_b_fuzz_corpus/chunk6-config-idr.bin diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk7-non-idr.bin b/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk7-non-idr.bin similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/chunk7-non-idr.bin rename to media/formats/mp4/h264_annex_b_fuzz_corpus/chunk7-non-idr.bin diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/pps_neq_sps_config_idr.bin b/media/formats/mp4/h264_annex_b_fuzz_corpus/pps_neq_sps_config_idr.bin similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_fuzz_corpus/pps_neq_sps_config_idr.bin rename to media/formats/mp4/h264_annex_b_fuzz_corpus/pps_neq_sps_config_idr.bin diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.cc b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.cc rename to media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.cc diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h rename to media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_fuzztest.cc b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_fuzztest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_fuzztest.cc rename to media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_fuzztest.cc diff --git a/third_party/chromium/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_unittest.cc b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_unittest.cc rename to media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_unittest.cc diff --git a/third_party/chromium/media/formats/mp4/hevc.cc b/media/formats/mp4/hevc.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/hevc.cc rename to media/formats/mp4/hevc.cc diff --git a/third_party/chromium/media/formats/mp4/hevc.h b/media/formats/mp4/hevc.h similarity index 100% rename from third_party/chromium/media/formats/mp4/hevc.h rename to media/formats/mp4/hevc.h diff --git a/third_party/chromium/media/formats/mp4/hevc_unittest.cc b/media/formats/mp4/hevc_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/hevc_unittest.cc rename to media/formats/mp4/hevc_unittest.cc diff --git a/third_party/chromium/media/formats/mp4/mp4_avcc_parser_fuzzer.cc b/media/formats/mp4/mp4_avcc_parser_fuzzer.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/mp4_avcc_parser_fuzzer.cc rename to media/formats/mp4/mp4_avcc_parser_fuzzer.cc diff --git a/third_party/chromium/media/formats/mp4/mp4_box_reader_fuzzer.cc b/media/formats/mp4/mp4_box_reader_fuzzer.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/mp4_box_reader_fuzzer.cc rename to media/formats/mp4/mp4_box_reader_fuzzer.cc diff --git a/third_party/chromium/media/formats/mp4/mp4_stream_parser.cc b/media/formats/mp4/mp4_stream_parser.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/mp4_stream_parser.cc rename to media/formats/mp4/mp4_stream_parser.cc diff --git a/third_party/chromium/media/formats/mp4/mp4_stream_parser.h b/media/formats/mp4/mp4_stream_parser.h similarity index 100% rename from third_party/chromium/media/formats/mp4/mp4_stream_parser.h rename to media/formats/mp4/mp4_stream_parser.h diff --git a/third_party/chromium/media/formats/mp4/mp4_stream_parser_unittest.cc b/media/formats/mp4/mp4_stream_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/mp4_stream_parser_unittest.cc rename to media/formats/mp4/mp4_stream_parser_unittest.cc diff --git a/third_party/chromium/media/formats/mp4/nalu_test_helper.cc b/media/formats/mp4/nalu_test_helper.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/nalu_test_helper.cc rename to media/formats/mp4/nalu_test_helper.cc diff --git a/third_party/chromium/media/formats/mp4/nalu_test_helper.h b/media/formats/mp4/nalu_test_helper.h similarity index 100% rename from third_party/chromium/media/formats/mp4/nalu_test_helper.h rename to media/formats/mp4/nalu_test_helper.h diff --git a/third_party/chromium/media/formats/mp4/parse_result.h b/media/formats/mp4/parse_result.h similarity index 100% rename from third_party/chromium/media/formats/mp4/parse_result.h rename to media/formats/mp4/parse_result.h diff --git a/third_party/chromium/media/formats/mp4/rcheck.h b/media/formats/mp4/rcheck.h similarity index 100% rename from third_party/chromium/media/formats/mp4/rcheck.h rename to media/formats/mp4/rcheck.h diff --git a/third_party/chromium/media/formats/mp4/sample_to_group_iterator.cc b/media/formats/mp4/sample_to_group_iterator.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/sample_to_group_iterator.cc rename to media/formats/mp4/sample_to_group_iterator.cc diff --git a/third_party/chromium/media/formats/mp4/sample_to_group_iterator.h b/media/formats/mp4/sample_to_group_iterator.h similarity index 100% rename from third_party/chromium/media/formats/mp4/sample_to_group_iterator.h rename to media/formats/mp4/sample_to_group_iterator.h diff --git a/third_party/chromium/media/formats/mp4/sample_to_group_iterator_unittest.cc b/media/formats/mp4/sample_to_group_iterator_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/sample_to_group_iterator_unittest.cc rename to media/formats/mp4/sample_to_group_iterator_unittest.cc diff --git a/third_party/chromium/media/formats/mp4/track_run_iterator.cc b/media/formats/mp4/track_run_iterator.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/track_run_iterator.cc rename to media/formats/mp4/track_run_iterator.cc diff --git a/third_party/chromium/media/formats/mp4/track_run_iterator.h b/media/formats/mp4/track_run_iterator.h similarity index 100% rename from third_party/chromium/media/formats/mp4/track_run_iterator.h rename to media/formats/mp4/track_run_iterator.h diff --git a/third_party/chromium/media/formats/mp4/track_run_iterator_unittest.cc b/media/formats/mp4/track_run_iterator_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mp4/track_run_iterator_unittest.cc rename to media/formats/mp4/track_run_iterator_unittest.cc diff --git a/third_party/chromium/media/formats/mpeg/adts_constants.cc b/media/formats/mpeg/adts_constants.cc similarity index 100% rename from third_party/chromium/media/formats/mpeg/adts_constants.cc rename to media/formats/mpeg/adts_constants.cc diff --git a/third_party/chromium/media/formats/mpeg/adts_constants.h b/media/formats/mpeg/adts_constants.h similarity index 100% rename from third_party/chromium/media/formats/mpeg/adts_constants.h rename to media/formats/mpeg/adts_constants.h diff --git a/third_party/chromium/media/formats/mpeg/adts_stream_parser.cc b/media/formats/mpeg/adts_stream_parser.cc similarity index 100% rename from third_party/chromium/media/formats/mpeg/adts_stream_parser.cc rename to media/formats/mpeg/adts_stream_parser.cc diff --git a/third_party/chromium/media/formats/mpeg/adts_stream_parser.h b/media/formats/mpeg/adts_stream_parser.h similarity index 100% rename from third_party/chromium/media/formats/mpeg/adts_stream_parser.h rename to media/formats/mpeg/adts_stream_parser.h diff --git a/third_party/chromium/media/formats/mpeg/adts_stream_parser_unittest.cc b/media/formats/mpeg/adts_stream_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mpeg/adts_stream_parser_unittest.cc rename to media/formats/mpeg/adts_stream_parser_unittest.cc diff --git a/third_party/chromium/media/formats/mpeg/mpeg1_audio_stream_parser.cc b/media/formats/mpeg/mpeg1_audio_stream_parser.cc similarity index 100% rename from third_party/chromium/media/formats/mpeg/mpeg1_audio_stream_parser.cc rename to media/formats/mpeg/mpeg1_audio_stream_parser.cc diff --git a/third_party/chromium/media/formats/mpeg/mpeg1_audio_stream_parser.h b/media/formats/mpeg/mpeg1_audio_stream_parser.h similarity index 100% rename from third_party/chromium/media/formats/mpeg/mpeg1_audio_stream_parser.h rename to media/formats/mpeg/mpeg1_audio_stream_parser.h diff --git a/third_party/chromium/media/formats/mpeg/mpeg1_audio_stream_parser_unittest.cc b/media/formats/mpeg/mpeg1_audio_stream_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/mpeg/mpeg1_audio_stream_parser_unittest.cc rename to media/formats/mpeg/mpeg1_audio_stream_parser_unittest.cc diff --git a/third_party/chromium/media/formats/mpeg/mpeg_audio_stream_parser_base.cc b/media/formats/mpeg/mpeg_audio_stream_parser_base.cc similarity index 100% rename from third_party/chromium/media/formats/mpeg/mpeg_audio_stream_parser_base.cc rename to media/formats/mpeg/mpeg_audio_stream_parser_base.cc diff --git a/third_party/chromium/media/formats/mpeg/mpeg_audio_stream_parser_base.h b/media/formats/mpeg/mpeg_audio_stream_parser_base.h similarity index 100% rename from third_party/chromium/media/formats/mpeg/mpeg_audio_stream_parser_base.h rename to media/formats/mpeg/mpeg_audio_stream_parser_base.h diff --git a/third_party/chromium/media/formats/webcodecs/webcodecs_encoded_chunk_stream_parser.cc b/media/formats/webcodecs/webcodecs_encoded_chunk_stream_parser.cc similarity index 100% rename from third_party/chromium/media/formats/webcodecs/webcodecs_encoded_chunk_stream_parser.cc rename to media/formats/webcodecs/webcodecs_encoded_chunk_stream_parser.cc diff --git a/third_party/chromium/media/formats/webcodecs/webcodecs_encoded_chunk_stream_parser.h b/media/formats/webcodecs/webcodecs_encoded_chunk_stream_parser.h similarity index 100% rename from third_party/chromium/media/formats/webcodecs/webcodecs_encoded_chunk_stream_parser.h rename to media/formats/webcodecs/webcodecs_encoded_chunk_stream_parser.h diff --git a/third_party/chromium/media/formats/webm/DEPS b/media/formats/webm/DEPS similarity index 100% rename from third_party/chromium/media/formats/webm/DEPS rename to media/formats/webm/DEPS diff --git a/third_party/chromium/media/formats/webm/cluster_builder.cc b/media/formats/webm/cluster_builder.cc similarity index 100% rename from third_party/chromium/media/formats/webm/cluster_builder.cc rename to media/formats/webm/cluster_builder.cc diff --git a/third_party/chromium/media/formats/webm/cluster_builder.h b/media/formats/webm/cluster_builder.h similarity index 100% rename from third_party/chromium/media/formats/webm/cluster_builder.h rename to media/formats/webm/cluster_builder.h diff --git a/third_party/chromium/media/formats/webm/opus_packet_builder.cc b/media/formats/webm/opus_packet_builder.cc similarity index 100% rename from third_party/chromium/media/formats/webm/opus_packet_builder.cc rename to media/formats/webm/opus_packet_builder.cc diff --git a/third_party/chromium/media/formats/webm/opus_packet_builder.h b/media/formats/webm/opus_packet_builder.h similarity index 100% rename from third_party/chromium/media/formats/webm/opus_packet_builder.h rename to media/formats/webm/opus_packet_builder.h diff --git a/third_party/chromium/media/formats/webm/tracks_builder.cc b/media/formats/webm/tracks_builder.cc similarity index 100% rename from third_party/chromium/media/formats/webm/tracks_builder.cc rename to media/formats/webm/tracks_builder.cc diff --git a/third_party/chromium/media/formats/webm/tracks_builder.h b/media/formats/webm/tracks_builder.h similarity index 100% rename from third_party/chromium/media/formats/webm/tracks_builder.h rename to media/formats/webm/tracks_builder.h diff --git a/third_party/chromium/media/formats/webm/webm_audio_client.cc b/media/formats/webm/webm_audio_client.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_audio_client.cc rename to media/formats/webm/webm_audio_client.cc diff --git a/third_party/chromium/media/formats/webm/webm_audio_client.h b/media/formats/webm/webm_audio_client.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_audio_client.h rename to media/formats/webm/webm_audio_client.h diff --git a/third_party/chromium/media/formats/webm/webm_cluster_parser.cc b/media/formats/webm/webm_cluster_parser.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_cluster_parser.cc rename to media/formats/webm/webm_cluster_parser.cc diff --git a/third_party/chromium/media/formats/webm/webm_cluster_parser.h b/media/formats/webm/webm_cluster_parser.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_cluster_parser.h rename to media/formats/webm/webm_cluster_parser.h diff --git a/third_party/chromium/media/formats/webm/webm_cluster_parser_unittest.cc b/media/formats/webm/webm_cluster_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_cluster_parser_unittest.cc rename to media/formats/webm/webm_cluster_parser_unittest.cc diff --git a/third_party/chromium/media/formats/webm/webm_colour_parser.cc b/media/formats/webm/webm_colour_parser.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_colour_parser.cc rename to media/formats/webm/webm_colour_parser.cc diff --git a/third_party/chromium/media/formats/webm/webm_colour_parser.h b/media/formats/webm/webm_colour_parser.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_colour_parser.h rename to media/formats/webm/webm_colour_parser.h diff --git a/third_party/chromium/media/formats/webm/webm_constants.cc b/media/formats/webm/webm_constants.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_constants.cc rename to media/formats/webm/webm_constants.cc diff --git a/third_party/chromium/media/formats/webm/webm_constants.h b/media/formats/webm/webm_constants.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_constants.h rename to media/formats/webm/webm_constants.h diff --git a/third_party/chromium/media/formats/webm/webm_content_encodings.cc b/media/formats/webm/webm_content_encodings.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_content_encodings.cc rename to media/formats/webm/webm_content_encodings.cc diff --git a/third_party/chromium/media/formats/webm/webm_content_encodings.h b/media/formats/webm/webm_content_encodings.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_content_encodings.h rename to media/formats/webm/webm_content_encodings.h diff --git a/third_party/chromium/media/formats/webm/webm_content_encodings_client.cc b/media/formats/webm/webm_content_encodings_client.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_content_encodings_client.cc rename to media/formats/webm/webm_content_encodings_client.cc diff --git a/third_party/chromium/media/formats/webm/webm_content_encodings_client.h b/media/formats/webm/webm_content_encodings_client.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_content_encodings_client.h rename to media/formats/webm/webm_content_encodings_client.h diff --git a/third_party/chromium/media/formats/webm/webm_content_encodings_client_unittest.cc b/media/formats/webm/webm_content_encodings_client_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_content_encodings_client_unittest.cc rename to media/formats/webm/webm_content_encodings_client_unittest.cc diff --git a/third_party/chromium/media/formats/webm/webm_crypto_helpers.cc b/media/formats/webm/webm_crypto_helpers.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_crypto_helpers.cc rename to media/formats/webm/webm_crypto_helpers.cc diff --git a/third_party/chromium/media/formats/webm/webm_crypto_helpers.h b/media/formats/webm/webm_crypto_helpers.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_crypto_helpers.h rename to media/formats/webm/webm_crypto_helpers.h diff --git a/third_party/chromium/media/formats/webm/webm_crypto_helpers_unittest.cc b/media/formats/webm/webm_crypto_helpers_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_crypto_helpers_unittest.cc rename to media/formats/webm/webm_crypto_helpers_unittest.cc diff --git a/third_party/chromium/media/formats/webm/webm_info_parser.cc b/media/formats/webm/webm_info_parser.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_info_parser.cc rename to media/formats/webm/webm_info_parser.cc diff --git a/third_party/chromium/media/formats/webm/webm_info_parser.h b/media/formats/webm/webm_info_parser.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_info_parser.h rename to media/formats/webm/webm_info_parser.h diff --git a/third_party/chromium/media/formats/webm/webm_parser.cc b/media/formats/webm/webm_parser.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_parser.cc rename to media/formats/webm/webm_parser.cc diff --git a/third_party/chromium/media/formats/webm/webm_parser.h b/media/formats/webm/webm_parser.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_parser.h rename to media/formats/webm/webm_parser.h diff --git a/third_party/chromium/media/formats/webm/webm_parser_unittest.cc b/media/formats/webm/webm_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_parser_unittest.cc rename to media/formats/webm/webm_parser_unittest.cc diff --git a/third_party/chromium/media/formats/webm/webm_projection_parser.cc b/media/formats/webm/webm_projection_parser.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_projection_parser.cc rename to media/formats/webm/webm_projection_parser.cc diff --git a/third_party/chromium/media/formats/webm/webm_projection_parser.h b/media/formats/webm/webm_projection_parser.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_projection_parser.h rename to media/formats/webm/webm_projection_parser.h diff --git a/third_party/chromium/media/formats/webm/webm_projection_parser_unittest.cc b/media/formats/webm/webm_projection_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_projection_parser_unittest.cc rename to media/formats/webm/webm_projection_parser_unittest.cc diff --git a/third_party/chromium/media/formats/webm/webm_stream_parser.cc b/media/formats/webm/webm_stream_parser.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_stream_parser.cc rename to media/formats/webm/webm_stream_parser.cc diff --git a/third_party/chromium/media/formats/webm/webm_stream_parser.h b/media/formats/webm/webm_stream_parser.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_stream_parser.h rename to media/formats/webm/webm_stream_parser.h diff --git a/third_party/chromium/media/formats/webm/webm_stream_parser_unittest.cc b/media/formats/webm/webm_stream_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_stream_parser_unittest.cc rename to media/formats/webm/webm_stream_parser_unittest.cc diff --git a/third_party/chromium/media/formats/webm/webm_tracks_parser.cc b/media/formats/webm/webm_tracks_parser.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_tracks_parser.cc rename to media/formats/webm/webm_tracks_parser.cc diff --git a/third_party/chromium/media/formats/webm/webm_tracks_parser.h b/media/formats/webm/webm_tracks_parser.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_tracks_parser.h rename to media/formats/webm/webm_tracks_parser.h diff --git a/third_party/chromium/media/formats/webm/webm_tracks_parser_unittest.cc b/media/formats/webm/webm_tracks_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_tracks_parser_unittest.cc rename to media/formats/webm/webm_tracks_parser_unittest.cc diff --git a/third_party/chromium/media/formats/webm/webm_video_client.cc b/media/formats/webm/webm_video_client.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_video_client.cc rename to media/formats/webm/webm_video_client.cc diff --git a/third_party/chromium/media/formats/webm/webm_video_client.h b/media/formats/webm/webm_video_client.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_video_client.h rename to media/formats/webm/webm_video_client.h diff --git a/third_party/chromium/media/formats/webm/webm_video_client_unittest.cc b/media/formats/webm/webm_video_client_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_video_client_unittest.cc rename to media/formats/webm/webm_video_client_unittest.cc diff --git a/third_party/chromium/media/formats/webm/webm_webvtt_parser.cc b/media/formats/webm/webm_webvtt_parser.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_webvtt_parser.cc rename to media/formats/webm/webm_webvtt_parser.cc diff --git a/third_party/chromium/media/formats/webm/webm_webvtt_parser.h b/media/formats/webm/webm_webvtt_parser.h similarity index 100% rename from third_party/chromium/media/formats/webm/webm_webvtt_parser.h rename to media/formats/webm/webm_webvtt_parser.h diff --git a/third_party/chromium/media/formats/webm/webm_webvtt_parser_unittest.cc b/media/formats/webm/webm_webvtt_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/formats/webm/webm_webvtt_parser_unittest.cc rename to media/formats/webm/webm_webvtt_parser_unittest.cc diff --git a/third_party/chromium/media/fuchsia/OWNERS b/media/fuchsia/OWNERS similarity index 100% rename from third_party/chromium/media/fuchsia/OWNERS rename to media/fuchsia/OWNERS diff --git a/third_party/chromium/media/fuchsia/audio/BUILD.gn b/media/fuchsia/audio/BUILD.gn similarity index 100% rename from third_party/chromium/media/fuchsia/audio/BUILD.gn rename to media/fuchsia/audio/BUILD.gn diff --git a/third_party/chromium/media/fuchsia/audio/DEPS b/media/fuchsia/audio/DEPS similarity index 100% rename from third_party/chromium/media/fuchsia/audio/DEPS rename to media/fuchsia/audio/DEPS diff --git a/third_party/chromium/media/fuchsia/audio/fake_audio_consumer.cc b/media/fuchsia/audio/fake_audio_consumer.cc similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fake_audio_consumer.cc rename to media/fuchsia/audio/fake_audio_consumer.cc diff --git a/third_party/chromium/media/fuchsia/audio/fake_audio_consumer.h b/media/fuchsia/audio/fake_audio_consumer.h similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fake_audio_consumer.h rename to media/fuchsia/audio/fake_audio_consumer.h diff --git a/third_party/chromium/media/fuchsia/audio/fuchsia_audio_capturer_source.cc b/media/fuchsia/audio/fuchsia_audio_capturer_source.cc similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fuchsia_audio_capturer_source.cc rename to media/fuchsia/audio/fuchsia_audio_capturer_source.cc diff --git a/third_party/chromium/media/fuchsia/audio/fuchsia_audio_capturer_source.h b/media/fuchsia/audio/fuchsia_audio_capturer_source.h similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fuchsia_audio_capturer_source.h rename to media/fuchsia/audio/fuchsia_audio_capturer_source.h diff --git a/third_party/chromium/media/fuchsia/audio/fuchsia_audio_capturer_source_test.cc b/media/fuchsia/audio/fuchsia_audio_capturer_source_test.cc similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fuchsia_audio_capturer_source_test.cc rename to media/fuchsia/audio/fuchsia_audio_capturer_source_test.cc diff --git a/third_party/chromium/media/fuchsia/audio/fuchsia_audio_output_device.cc b/media/fuchsia/audio/fuchsia_audio_output_device.cc similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fuchsia_audio_output_device.cc rename to media/fuchsia/audio/fuchsia_audio_output_device.cc diff --git a/third_party/chromium/media/fuchsia/audio/fuchsia_audio_output_device.h b/media/fuchsia/audio/fuchsia_audio_output_device.h similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fuchsia_audio_output_device.h rename to media/fuchsia/audio/fuchsia_audio_output_device.h diff --git a/third_party/chromium/media/fuchsia/audio/fuchsia_audio_output_device_test.cc b/media/fuchsia/audio/fuchsia_audio_output_device_test.cc similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fuchsia_audio_output_device_test.cc rename to media/fuchsia/audio/fuchsia_audio_output_device_test.cc diff --git a/third_party/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc b/media/fuchsia/audio/fuchsia_audio_renderer.cc similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc rename to media/fuchsia/audio/fuchsia_audio_renderer.cc diff --git a/third_party/chromium/media/fuchsia/audio/fuchsia_audio_renderer.h b/media/fuchsia/audio/fuchsia_audio_renderer.h similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fuchsia_audio_renderer.h rename to media/fuchsia/audio/fuchsia_audio_renderer.h diff --git a/third_party/chromium/media/fuchsia/audio/fuchsia_audio_renderer_test.cc b/media/fuchsia/audio/fuchsia_audio_renderer_test.cc similarity index 100% rename from third_party/chromium/media/fuchsia/audio/fuchsia_audio_renderer_test.cc rename to media/fuchsia/audio/fuchsia_audio_renderer_test.cc diff --git a/third_party/chromium/media/fuchsia/camera/BUILD.gn b/media/fuchsia/camera/BUILD.gn similarity index 100% rename from third_party/chromium/media/fuchsia/camera/BUILD.gn rename to media/fuchsia/camera/BUILD.gn diff --git a/third_party/chromium/media/fuchsia/camera/fake_fuchsia_camera.cc b/media/fuchsia/camera/fake_fuchsia_camera.cc similarity index 100% rename from third_party/chromium/media/fuchsia/camera/fake_fuchsia_camera.cc rename to media/fuchsia/camera/fake_fuchsia_camera.cc diff --git a/third_party/chromium/media/fuchsia/camera/fake_fuchsia_camera.h b/media/fuchsia/camera/fake_fuchsia_camera.h similarity index 100% rename from third_party/chromium/media/fuchsia/camera/fake_fuchsia_camera.h rename to media/fuchsia/camera/fake_fuchsia_camera.h diff --git a/third_party/chromium/media/fuchsia/cdm/BUILD.gn b/media/fuchsia/cdm/BUILD.gn similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/BUILD.gn rename to media/fuchsia/cdm/BUILD.gn diff --git a/third_party/chromium/media/fuchsia/cdm/DEPS b/media/fuchsia/cdm/DEPS similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/DEPS rename to media/fuchsia/cdm/DEPS diff --git a/third_party/chromium/media/fuchsia/cdm/client/BUILD.gn b/media/fuchsia/cdm/client/BUILD.gn similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/client/BUILD.gn rename to media/fuchsia/cdm/client/BUILD.gn diff --git a/third_party/chromium/media/fuchsia/cdm/client/fuchsia_cdm_util.cc b/media/fuchsia/cdm/client/fuchsia_cdm_util.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/client/fuchsia_cdm_util.cc rename to media/fuchsia/cdm/client/fuchsia_cdm_util.cc diff --git a/third_party/chromium/media/fuchsia/cdm/client/fuchsia_cdm_util.h b/media/fuchsia/cdm/client/fuchsia_cdm_util.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/client/fuchsia_cdm_util.h rename to media/fuchsia/cdm/client/fuchsia_cdm_util.h diff --git a/third_party/chromium/media/fuchsia/cdm/client/mojo_fuchsia_cdm_provider.cc b/media/fuchsia/cdm/client/mojo_fuchsia_cdm_provider.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/client/mojo_fuchsia_cdm_provider.cc rename to media/fuchsia/cdm/client/mojo_fuchsia_cdm_provider.cc diff --git a/third_party/chromium/media/fuchsia/cdm/client/mojo_fuchsia_cdm_provider.h b/media/fuchsia/cdm/client/mojo_fuchsia_cdm_provider.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/client/mojo_fuchsia_cdm_provider.h rename to media/fuchsia/cdm/client/mojo_fuchsia_cdm_provider.h diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_cdm.cc b/media/fuchsia/cdm/fuchsia_cdm.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_cdm.cc rename to media/fuchsia/cdm/fuchsia_cdm.cc diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_cdm.h b/media/fuchsia/cdm/fuchsia_cdm.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_cdm.h rename to media/fuchsia/cdm/fuchsia_cdm.h diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_cdm_context.h b/media/fuchsia/cdm/fuchsia_cdm_context.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_cdm_context.h rename to media/fuchsia/cdm/fuchsia_cdm_context.h diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.cc b/media/fuchsia/cdm/fuchsia_cdm_factory.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.cc rename to media/fuchsia/cdm/fuchsia_cdm_factory.cc diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.h b/media/fuchsia/cdm/fuchsia_cdm_factory.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.h rename to media/fuchsia/cdm/fuchsia_cdm_factory.h diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_cdm_provider.h b/media/fuchsia/cdm/fuchsia_cdm_provider.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_cdm_provider.h rename to media/fuchsia/cdm/fuchsia_cdm_provider.h diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_decryptor.cc b/media/fuchsia/cdm/fuchsia_decryptor.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_decryptor.cc rename to media/fuchsia/cdm/fuchsia_decryptor.cc diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_decryptor.h b/media/fuchsia/cdm/fuchsia_decryptor.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_decryptor.h rename to media/fuchsia/cdm/fuchsia_decryptor.h diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_stream_decryptor.cc b/media/fuchsia/cdm/fuchsia_stream_decryptor.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_stream_decryptor.cc rename to media/fuchsia/cdm/fuchsia_stream_decryptor.cc diff --git a/third_party/chromium/media/fuchsia/cdm/fuchsia_stream_decryptor.h b/media/fuchsia/cdm/fuchsia_stream_decryptor.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/fuchsia_stream_decryptor.h rename to media/fuchsia/cdm/fuchsia_stream_decryptor.h diff --git a/third_party/chromium/media/fuchsia/cdm/service/BUILD.gn b/media/fuchsia/cdm/service/BUILD.gn similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/service/BUILD.gn rename to media/fuchsia/cdm/service/BUILD.gn diff --git a/third_party/chromium/media/fuchsia/cdm/service/fuchsia_cdm_manager.cc b/media/fuchsia/cdm/service/fuchsia_cdm_manager.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/service/fuchsia_cdm_manager.cc rename to media/fuchsia/cdm/service/fuchsia_cdm_manager.cc diff --git a/third_party/chromium/media/fuchsia/cdm/service/fuchsia_cdm_manager.h b/media/fuchsia/cdm/service/fuchsia_cdm_manager.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/service/fuchsia_cdm_manager.h rename to media/fuchsia/cdm/service/fuchsia_cdm_manager.h diff --git a/third_party/chromium/media/fuchsia/cdm/service/fuchsia_cdm_manager_unittest.cc b/media/fuchsia/cdm/service/fuchsia_cdm_manager_unittest.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/service/fuchsia_cdm_manager_unittest.cc rename to media/fuchsia/cdm/service/fuchsia_cdm_manager_unittest.cc diff --git a/third_party/chromium/media/fuchsia/cdm/service/mock_provision_fetcher.cc b/media/fuchsia/cdm/service/mock_provision_fetcher.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/service/mock_provision_fetcher.cc rename to media/fuchsia/cdm/service/mock_provision_fetcher.cc diff --git a/third_party/chromium/media/fuchsia/cdm/service/mock_provision_fetcher.h b/media/fuchsia/cdm/service/mock_provision_fetcher.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/service/mock_provision_fetcher.h rename to media/fuchsia/cdm/service/mock_provision_fetcher.h diff --git a/third_party/chromium/media/fuchsia/cdm/service/provisioning_fetcher_impl.cc b/media/fuchsia/cdm/service/provisioning_fetcher_impl.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/service/provisioning_fetcher_impl.cc rename to media/fuchsia/cdm/service/provisioning_fetcher_impl.cc diff --git a/third_party/chromium/media/fuchsia/cdm/service/provisioning_fetcher_impl.h b/media/fuchsia/cdm/service/provisioning_fetcher_impl.h similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/service/provisioning_fetcher_impl.h rename to media/fuchsia/cdm/service/provisioning_fetcher_impl.h diff --git a/third_party/chromium/media/fuchsia/cdm/service/provisioning_fetcher_impl_unittest.cc b/media/fuchsia/cdm/service/provisioning_fetcher_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/fuchsia/cdm/service/provisioning_fetcher_impl_unittest.cc rename to media/fuchsia/cdm/service/provisioning_fetcher_impl_unittest.cc diff --git a/third_party/chromium/media/fuchsia/common/BUILD.gn b/media/fuchsia/common/BUILD.gn similarity index 100% rename from third_party/chromium/media/fuchsia/common/BUILD.gn rename to media/fuchsia/common/BUILD.gn diff --git a/third_party/chromium/media/fuchsia/common/decrypting_sysmem_buffer_stream.cc b/media/fuchsia/common/decrypting_sysmem_buffer_stream.cc similarity index 100% rename from third_party/chromium/media/fuchsia/common/decrypting_sysmem_buffer_stream.cc rename to media/fuchsia/common/decrypting_sysmem_buffer_stream.cc diff --git a/third_party/chromium/media/fuchsia/common/decrypting_sysmem_buffer_stream.h b/media/fuchsia/common/decrypting_sysmem_buffer_stream.h similarity index 100% rename from third_party/chromium/media/fuchsia/common/decrypting_sysmem_buffer_stream.h rename to media/fuchsia/common/decrypting_sysmem_buffer_stream.h diff --git a/third_party/chromium/media/fuchsia/common/passthrough_sysmem_buffer_stream.cc b/media/fuchsia/common/passthrough_sysmem_buffer_stream.cc similarity index 100% rename from third_party/chromium/media/fuchsia/common/passthrough_sysmem_buffer_stream.cc rename to media/fuchsia/common/passthrough_sysmem_buffer_stream.cc diff --git a/third_party/chromium/media/fuchsia/common/passthrough_sysmem_buffer_stream.h b/media/fuchsia/common/passthrough_sysmem_buffer_stream.h similarity index 100% rename from third_party/chromium/media/fuchsia/common/passthrough_sysmem_buffer_stream.h rename to media/fuchsia/common/passthrough_sysmem_buffer_stream.h diff --git a/third_party/chromium/media/fuchsia/common/stream_processor_helper.cc b/media/fuchsia/common/stream_processor_helper.cc similarity index 100% rename from third_party/chromium/media/fuchsia/common/stream_processor_helper.cc rename to media/fuchsia/common/stream_processor_helper.cc diff --git a/third_party/chromium/media/fuchsia/common/stream_processor_helper.h b/media/fuchsia/common/stream_processor_helper.h similarity index 100% rename from third_party/chromium/media/fuchsia/common/stream_processor_helper.h rename to media/fuchsia/common/stream_processor_helper.h diff --git a/third_party/chromium/media/fuchsia/common/sysmem_buffer_stream.h b/media/fuchsia/common/sysmem_buffer_stream.h similarity index 100% rename from third_party/chromium/media/fuchsia/common/sysmem_buffer_stream.h rename to media/fuchsia/common/sysmem_buffer_stream.h diff --git a/third_party/chromium/media/fuchsia/common/sysmem_client.cc b/media/fuchsia/common/sysmem_client.cc similarity index 100% rename from third_party/chromium/media/fuchsia/common/sysmem_client.cc rename to media/fuchsia/common/sysmem_client.cc diff --git a/third_party/chromium/media/fuchsia/common/sysmem_client.h b/media/fuchsia/common/sysmem_client.h similarity index 100% rename from third_party/chromium/media/fuchsia/common/sysmem_client.h rename to media/fuchsia/common/sysmem_client.h diff --git a/third_party/chromium/media/fuchsia/common/vmo_buffer.cc b/media/fuchsia/common/vmo_buffer.cc similarity index 100% rename from third_party/chromium/media/fuchsia/common/vmo_buffer.cc rename to media/fuchsia/common/vmo_buffer.cc diff --git a/third_party/chromium/media/fuchsia/common/vmo_buffer.h b/media/fuchsia/common/vmo_buffer.h similarity index 100% rename from third_party/chromium/media/fuchsia/common/vmo_buffer.h rename to media/fuchsia/common/vmo_buffer.h diff --git a/third_party/chromium/media/fuchsia/common/vmo_buffer_writer_queue.cc b/media/fuchsia/common/vmo_buffer_writer_queue.cc similarity index 100% rename from third_party/chromium/media/fuchsia/common/vmo_buffer_writer_queue.cc rename to media/fuchsia/common/vmo_buffer_writer_queue.cc diff --git a/third_party/chromium/media/fuchsia/common/vmo_buffer_writer_queue.h b/media/fuchsia/common/vmo_buffer_writer_queue.h similarity index 100% rename from third_party/chromium/media/fuchsia/common/vmo_buffer_writer_queue.h rename to media/fuchsia/common/vmo_buffer_writer_queue.h diff --git a/third_party/chromium/media/fuchsia/mojom/BUILD.gn b/media/fuchsia/mojom/BUILD.gn similarity index 100% rename from third_party/chromium/media/fuchsia/mojom/BUILD.gn rename to media/fuchsia/mojom/BUILD.gn diff --git a/third_party/chromium/media/fuchsia/mojom/DEPS b/media/fuchsia/mojom/DEPS similarity index 100% rename from third_party/chromium/media/fuchsia/mojom/DEPS rename to media/fuchsia/mojom/DEPS diff --git a/third_party/chromium/media/fuchsia/mojom/OWNERS b/media/fuchsia/mojom/OWNERS similarity index 100% rename from third_party/chromium/media/fuchsia/mojom/OWNERS rename to media/fuchsia/mojom/OWNERS diff --git a/third_party/chromium/media/fuchsia/mojom/fuchsia_cdm_provider.mojom b/media/fuchsia/mojom/fuchsia_cdm_provider.mojom similarity index 100% rename from third_party/chromium/media/fuchsia/mojom/fuchsia_cdm_provider.mojom rename to media/fuchsia/mojom/fuchsia_cdm_provider.mojom diff --git a/third_party/chromium/media/fuchsia/mojom/fuchsia_cdm_provider_mojom_traits.h b/media/fuchsia/mojom/fuchsia_cdm_provider_mojom_traits.h similarity index 100% rename from third_party/chromium/media/fuchsia/mojom/fuchsia_cdm_provider_mojom_traits.h rename to media/fuchsia/mojom/fuchsia_cdm_provider_mojom_traits.h diff --git a/third_party/chromium/media/fuchsia/mojom/fuchsia_media_resource_provider.mojom b/media/fuchsia/mojom/fuchsia_media_resource_provider.mojom similarity index 100% rename from third_party/chromium/media/fuchsia/mojom/fuchsia_media_resource_provider.mojom rename to media/fuchsia/mojom/fuchsia_media_resource_provider.mojom diff --git a/third_party/chromium/media/fuchsia/mojom/fuchsia_media_resource_provider_mojom_traits.h b/media/fuchsia/mojom/fuchsia_media_resource_provider_mojom_traits.h similarity index 100% rename from third_party/chromium/media/fuchsia/mojom/fuchsia_media_resource_provider_mojom_traits.h rename to media/fuchsia/mojom/fuchsia_media_resource_provider_mojom_traits.h diff --git a/third_party/chromium/media/gpu/BUILD.gn b/media/gpu/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/BUILD.gn rename to media/gpu/BUILD.gn diff --git a/third_party/chromium/media/gpu/DEPS b/media/gpu/DEPS similarity index 100% rename from third_party/chromium/media/gpu/DEPS rename to media/gpu/DEPS diff --git a/third_party/chromium/media/gpu/OWNERS b/media/gpu/OWNERS similarity index 100% rename from third_party/chromium/media/gpu/OWNERS rename to media/gpu/OWNERS diff --git a/third_party/chromium/media/gpu/accelerated_video_decoder.h b/media/gpu/accelerated_video_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/accelerated_video_decoder.h rename to media/gpu/accelerated_video_decoder.h diff --git a/third_party/chromium/media/gpu/android/OWNERS b/media/gpu/android/OWNERS similarity index 100% rename from third_party/chromium/media/gpu/android/OWNERS rename to media/gpu/android/OWNERS diff --git a/third_party/chromium/media/gpu/android/android_video_encode_accelerator.cc b/media/gpu/android/android_video_encode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/android/android_video_encode_accelerator.cc rename to media/gpu/android/android_video_encode_accelerator.cc diff --git a/third_party/chromium/media/gpu/android/android_video_encode_accelerator.h b/media/gpu/android/android_video_encode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/android/android_video_encode_accelerator.h rename to media/gpu/android/android_video_encode_accelerator.h diff --git a/third_party/chromium/media/gpu/android/android_video_surface_chooser.cc b/media/gpu/android/android_video_surface_chooser.cc similarity index 100% rename from third_party/chromium/media/gpu/android/android_video_surface_chooser.cc rename to media/gpu/android/android_video_surface_chooser.cc diff --git a/third_party/chromium/media/gpu/android/android_video_surface_chooser.h b/media/gpu/android/android_video_surface_chooser.h similarity index 100% rename from third_party/chromium/media/gpu/android/android_video_surface_chooser.h rename to media/gpu/android/android_video_surface_chooser.h diff --git a/third_party/chromium/media/gpu/android/android_video_surface_chooser_impl.cc b/media/gpu/android/android_video_surface_chooser_impl.cc similarity index 100% rename from third_party/chromium/media/gpu/android/android_video_surface_chooser_impl.cc rename to media/gpu/android/android_video_surface_chooser_impl.cc diff --git a/third_party/chromium/media/gpu/android/android_video_surface_chooser_impl.h b/media/gpu/android/android_video_surface_chooser_impl.h similarity index 100% rename from third_party/chromium/media/gpu/android/android_video_surface_chooser_impl.h rename to media/gpu/android/android_video_surface_chooser_impl.h diff --git a/third_party/chromium/media/gpu/android/android_video_surface_chooser_impl_unittest.cc b/media/gpu/android/android_video_surface_chooser_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/android_video_surface_chooser_impl_unittest.cc rename to media/gpu/android/android_video_surface_chooser_impl_unittest.cc diff --git a/third_party/chromium/media/gpu/android/codec_allocator.cc b/media/gpu/android/codec_allocator.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_allocator.cc rename to media/gpu/android/codec_allocator.cc diff --git a/third_party/chromium/media/gpu/android/codec_allocator.h b/media/gpu/android/codec_allocator.h similarity index 100% rename from third_party/chromium/media/gpu/android/codec_allocator.h rename to media/gpu/android/codec_allocator.h diff --git a/third_party/chromium/media/gpu/android/codec_allocator_unittest.cc b/media/gpu/android/codec_allocator_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_allocator_unittest.cc rename to media/gpu/android/codec_allocator_unittest.cc diff --git a/third_party/chromium/media/gpu/android/codec_buffer_wait_coordinator.cc b/media/gpu/android/codec_buffer_wait_coordinator.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_buffer_wait_coordinator.cc rename to media/gpu/android/codec_buffer_wait_coordinator.cc diff --git a/third_party/chromium/media/gpu/android/codec_buffer_wait_coordinator.h b/media/gpu/android/codec_buffer_wait_coordinator.h similarity index 100% rename from third_party/chromium/media/gpu/android/codec_buffer_wait_coordinator.h rename to media/gpu/android/codec_buffer_wait_coordinator.h diff --git a/third_party/chromium/media/gpu/android/codec_image.cc b/media/gpu/android/codec_image.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_image.cc rename to media/gpu/android/codec_image.cc diff --git a/third_party/chromium/media/gpu/android/codec_image.h b/media/gpu/android/codec_image.h similarity index 100% rename from third_party/chromium/media/gpu/android/codec_image.h rename to media/gpu/android/codec_image.h diff --git a/third_party/chromium/media/gpu/android/codec_image_group.cc b/media/gpu/android/codec_image_group.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_image_group.cc rename to media/gpu/android/codec_image_group.cc diff --git a/third_party/chromium/media/gpu/android/codec_image_group.h b/media/gpu/android/codec_image_group.h similarity index 100% rename from third_party/chromium/media/gpu/android/codec_image_group.h rename to media/gpu/android/codec_image_group.h diff --git a/third_party/chromium/media/gpu/android/codec_image_group_unittest.cc b/media/gpu/android/codec_image_group_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_image_group_unittest.cc rename to media/gpu/android/codec_image_group_unittest.cc diff --git a/third_party/chromium/media/gpu/android/codec_image_unittest.cc b/media/gpu/android/codec_image_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_image_unittest.cc rename to media/gpu/android/codec_image_unittest.cc diff --git a/third_party/chromium/media/gpu/android/codec_output_buffer_renderer.cc b/media/gpu/android/codec_output_buffer_renderer.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_output_buffer_renderer.cc rename to media/gpu/android/codec_output_buffer_renderer.cc diff --git a/third_party/chromium/media/gpu/android/codec_output_buffer_renderer.h b/media/gpu/android/codec_output_buffer_renderer.h similarity index 100% rename from third_party/chromium/media/gpu/android/codec_output_buffer_renderer.h rename to media/gpu/android/codec_output_buffer_renderer.h diff --git a/third_party/chromium/media/gpu/android/codec_surface_bundle.cc b/media/gpu/android/codec_surface_bundle.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_surface_bundle.cc rename to media/gpu/android/codec_surface_bundle.cc diff --git a/third_party/chromium/media/gpu/android/codec_surface_bundle.h b/media/gpu/android/codec_surface_bundle.h similarity index 100% rename from third_party/chromium/media/gpu/android/codec_surface_bundle.h rename to media/gpu/android/codec_surface_bundle.h diff --git a/third_party/chromium/media/gpu/android/codec_wrapper.cc b/media/gpu/android/codec_wrapper.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_wrapper.cc rename to media/gpu/android/codec_wrapper.cc diff --git a/third_party/chromium/media/gpu/android/codec_wrapper.h b/media/gpu/android/codec_wrapper.h similarity index 100% rename from third_party/chromium/media/gpu/android/codec_wrapper.h rename to media/gpu/android/codec_wrapper.h diff --git a/third_party/chromium/media/gpu/android/codec_wrapper_unittest.cc b/media/gpu/android/codec_wrapper_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/codec_wrapper_unittest.cc rename to media/gpu/android/codec_wrapper_unittest.cc diff --git a/third_party/chromium/media/gpu/android/device_info.cc b/media/gpu/android/device_info.cc similarity index 100% rename from third_party/chromium/media/gpu/android/device_info.cc rename to media/gpu/android/device_info.cc diff --git a/third_party/chromium/media/gpu/android/device_info.h b/media/gpu/android/device_info.h similarity index 100% rename from third_party/chromium/media/gpu/android/device_info.h rename to media/gpu/android/device_info.h diff --git a/third_party/chromium/media/gpu/android/direct_shared_image_video_provider.cc b/media/gpu/android/direct_shared_image_video_provider.cc similarity index 100% rename from third_party/chromium/media/gpu/android/direct_shared_image_video_provider.cc rename to media/gpu/android/direct_shared_image_video_provider.cc diff --git a/third_party/chromium/media/gpu/android/direct_shared_image_video_provider.h b/media/gpu/android/direct_shared_image_video_provider.h similarity index 100% rename from third_party/chromium/media/gpu/android/direct_shared_image_video_provider.h rename to media/gpu/android/direct_shared_image_video_provider.h diff --git a/third_party/chromium/media/gpu/android/fake_codec_allocator.cc b/media/gpu/android/fake_codec_allocator.cc similarity index 100% rename from third_party/chromium/media/gpu/android/fake_codec_allocator.cc rename to media/gpu/android/fake_codec_allocator.cc diff --git a/third_party/chromium/media/gpu/android/fake_codec_allocator.h b/media/gpu/android/fake_codec_allocator.h similarity index 100% rename from third_party/chromium/media/gpu/android/fake_codec_allocator.h rename to media/gpu/android/fake_codec_allocator.h diff --git a/third_party/chromium/media/gpu/android/frame_info_helper.cc b/media/gpu/android/frame_info_helper.cc similarity index 100% rename from third_party/chromium/media/gpu/android/frame_info_helper.cc rename to media/gpu/android/frame_info_helper.cc diff --git a/third_party/chromium/media/gpu/android/frame_info_helper.h b/media/gpu/android/frame_info_helper.h similarity index 100% rename from third_party/chromium/media/gpu/android/frame_info_helper.h rename to media/gpu/android/frame_info_helper.h diff --git a/third_party/chromium/media/gpu/android/frame_info_helper_unittest.cc b/media/gpu/android/frame_info_helper_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/frame_info_helper_unittest.cc rename to media/gpu/android/frame_info_helper_unittest.cc diff --git a/third_party/chromium/media/gpu/android/maybe_render_early_manager.cc b/media/gpu/android/maybe_render_early_manager.cc similarity index 100% rename from third_party/chromium/media/gpu/android/maybe_render_early_manager.cc rename to media/gpu/android/maybe_render_early_manager.cc diff --git a/third_party/chromium/media/gpu/android/maybe_render_early_manager.h b/media/gpu/android/maybe_render_early_manager.h similarity index 100% rename from third_party/chromium/media/gpu/android/maybe_render_early_manager.h rename to media/gpu/android/maybe_render_early_manager.h diff --git a/third_party/chromium/media/gpu/android/maybe_render_early_manager_unittest.cc b/media/gpu/android/maybe_render_early_manager_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/maybe_render_early_manager_unittest.cc rename to media/gpu/android/maybe_render_early_manager_unittest.cc diff --git a/third_party/chromium/media/gpu/android/media_codec_video_decoder.cc b/media/gpu/android/media_codec_video_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/android/media_codec_video_decoder.cc rename to media/gpu/android/media_codec_video_decoder.cc diff --git a/third_party/chromium/media/gpu/android/media_codec_video_decoder.h b/media/gpu/android/media_codec_video_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/android/media_codec_video_decoder.h rename to media/gpu/android/media_codec_video_decoder.h diff --git a/third_party/chromium/media/gpu/android/media_codec_video_decoder_unittest.cc b/media/gpu/android/media_codec_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/media_codec_video_decoder_unittest.cc rename to media/gpu/android/media_codec_video_decoder_unittest.cc diff --git a/third_party/chromium/media/gpu/android/mock_android_video_surface_chooser.cc b/media/gpu/android/mock_android_video_surface_chooser.cc similarity index 100% rename from third_party/chromium/media/gpu/android/mock_android_video_surface_chooser.cc rename to media/gpu/android/mock_android_video_surface_chooser.cc diff --git a/third_party/chromium/media/gpu/android/mock_android_video_surface_chooser.h b/media/gpu/android/mock_android_video_surface_chooser.h similarity index 100% rename from third_party/chromium/media/gpu/android/mock_android_video_surface_chooser.h rename to media/gpu/android/mock_android_video_surface_chooser.h diff --git a/third_party/chromium/media/gpu/android/mock_codec_buffer_wait_coordinator.cc b/media/gpu/android/mock_codec_buffer_wait_coordinator.cc similarity index 100% rename from third_party/chromium/media/gpu/android/mock_codec_buffer_wait_coordinator.cc rename to media/gpu/android/mock_codec_buffer_wait_coordinator.cc diff --git a/third_party/chromium/media/gpu/android/mock_codec_buffer_wait_coordinator.h b/media/gpu/android/mock_codec_buffer_wait_coordinator.h similarity index 100% rename from third_party/chromium/media/gpu/android/mock_codec_buffer_wait_coordinator.h rename to media/gpu/android/mock_codec_buffer_wait_coordinator.h diff --git a/third_party/chromium/media/gpu/android/mock_codec_image.cc b/media/gpu/android/mock_codec_image.cc similarity index 100% rename from third_party/chromium/media/gpu/android/mock_codec_image.cc rename to media/gpu/android/mock_codec_image.cc diff --git a/third_party/chromium/media/gpu/android/mock_codec_image.h b/media/gpu/android/mock_codec_image.h similarity index 100% rename from third_party/chromium/media/gpu/android/mock_codec_image.h rename to media/gpu/android/mock_codec_image.h diff --git a/third_party/chromium/media/gpu/android/mock_device_info.cc b/media/gpu/android/mock_device_info.cc similarity index 100% rename from third_party/chromium/media/gpu/android/mock_device_info.cc rename to media/gpu/android/mock_device_info.cc diff --git a/third_party/chromium/media/gpu/android/mock_device_info.h b/media/gpu/android/mock_device_info.h similarity index 100% rename from third_party/chromium/media/gpu/android/mock_device_info.h rename to media/gpu/android/mock_device_info.h diff --git a/third_party/chromium/media/gpu/android/mock_promotion_hint_aggregator.cc b/media/gpu/android/mock_promotion_hint_aggregator.cc similarity index 100% rename from third_party/chromium/media/gpu/android/mock_promotion_hint_aggregator.cc rename to media/gpu/android/mock_promotion_hint_aggregator.cc diff --git a/third_party/chromium/media/gpu/android/mock_promotion_hint_aggregator.h b/media/gpu/android/mock_promotion_hint_aggregator.h similarity index 100% rename from third_party/chromium/media/gpu/android/mock_promotion_hint_aggregator.h rename to media/gpu/android/mock_promotion_hint_aggregator.h diff --git a/third_party/chromium/media/gpu/android/mock_shared_image_video_provider.cc b/media/gpu/android/mock_shared_image_video_provider.cc similarity index 100% rename from third_party/chromium/media/gpu/android/mock_shared_image_video_provider.cc rename to media/gpu/android/mock_shared_image_video_provider.cc diff --git a/third_party/chromium/media/gpu/android/mock_shared_image_video_provider.h b/media/gpu/android/mock_shared_image_video_provider.h similarity index 100% rename from third_party/chromium/media/gpu/android/mock_shared_image_video_provider.h rename to media/gpu/android/mock_shared_image_video_provider.h diff --git a/third_party/chromium/media/gpu/android/pooled_shared_image_video_provider.cc b/media/gpu/android/pooled_shared_image_video_provider.cc similarity index 100% rename from third_party/chromium/media/gpu/android/pooled_shared_image_video_provider.cc rename to media/gpu/android/pooled_shared_image_video_provider.cc diff --git a/third_party/chromium/media/gpu/android/pooled_shared_image_video_provider.h b/media/gpu/android/pooled_shared_image_video_provider.h similarity index 100% rename from third_party/chromium/media/gpu/android/pooled_shared_image_video_provider.h rename to media/gpu/android/pooled_shared_image_video_provider.h diff --git a/third_party/chromium/media/gpu/android/pooled_shared_image_video_provider_unittest.cc b/media/gpu/android/pooled_shared_image_video_provider_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/pooled_shared_image_video_provider_unittest.cc rename to media/gpu/android/pooled_shared_image_video_provider_unittest.cc diff --git a/third_party/chromium/media/gpu/android/promotion_hint_aggregator.h b/media/gpu/android/promotion_hint_aggregator.h similarity index 100% rename from third_party/chromium/media/gpu/android/promotion_hint_aggregator.h rename to media/gpu/android/promotion_hint_aggregator.h diff --git a/third_party/chromium/media/gpu/android/promotion_hint_aggregator_impl.cc b/media/gpu/android/promotion_hint_aggregator_impl.cc similarity index 100% rename from third_party/chromium/media/gpu/android/promotion_hint_aggregator_impl.cc rename to media/gpu/android/promotion_hint_aggregator_impl.cc diff --git a/third_party/chromium/media/gpu/android/promotion_hint_aggregator_impl.h b/media/gpu/android/promotion_hint_aggregator_impl.h similarity index 100% rename from third_party/chromium/media/gpu/android/promotion_hint_aggregator_impl.h rename to media/gpu/android/promotion_hint_aggregator_impl.h diff --git a/third_party/chromium/media/gpu/android/promotion_hint_aggregator_impl_unittest.cc b/media/gpu/android/promotion_hint_aggregator_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/promotion_hint_aggregator_impl_unittest.cc rename to media/gpu/android/promotion_hint_aggregator_impl_unittest.cc diff --git a/third_party/chromium/media/gpu/android/shared_image_video_provider.cc b/media/gpu/android/shared_image_video_provider.cc similarity index 100% rename from third_party/chromium/media/gpu/android/shared_image_video_provider.cc rename to media/gpu/android/shared_image_video_provider.cc diff --git a/third_party/chromium/media/gpu/android/shared_image_video_provider.h b/media/gpu/android/shared_image_video_provider.h similarity index 100% rename from third_party/chromium/media/gpu/android/shared_image_video_provider.h rename to media/gpu/android/shared_image_video_provider.h diff --git a/third_party/chromium/media/gpu/android/surface_chooser_helper.cc b/media/gpu/android/surface_chooser_helper.cc similarity index 100% rename from third_party/chromium/media/gpu/android/surface_chooser_helper.cc rename to media/gpu/android/surface_chooser_helper.cc diff --git a/third_party/chromium/media/gpu/android/surface_chooser_helper.h b/media/gpu/android/surface_chooser_helper.h similarity index 100% rename from third_party/chromium/media/gpu/android/surface_chooser_helper.h rename to media/gpu/android/surface_chooser_helper.h diff --git a/third_party/chromium/media/gpu/android/surface_chooser_helper_unittest.cc b/media/gpu/android/surface_chooser_helper_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/surface_chooser_helper_unittest.cc rename to media/gpu/android/surface_chooser_helper_unittest.cc diff --git a/third_party/chromium/media/gpu/android/texture_pool_unittest.cc b/media/gpu/android/texture_pool_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/texture_pool_unittest.cc rename to media/gpu/android/texture_pool_unittest.cc diff --git a/third_party/chromium/media/gpu/android/video_frame_factory.h b/media/gpu/android/video_frame_factory.h similarity index 100% rename from third_party/chromium/media/gpu/android/video_frame_factory.h rename to media/gpu/android/video_frame_factory.h diff --git a/third_party/chromium/media/gpu/android/video_frame_factory_impl.cc b/media/gpu/android/video_frame_factory_impl.cc similarity index 100% rename from third_party/chromium/media/gpu/android/video_frame_factory_impl.cc rename to media/gpu/android/video_frame_factory_impl.cc diff --git a/third_party/chromium/media/gpu/android/video_frame_factory_impl.h b/media/gpu/android/video_frame_factory_impl.h similarity index 100% rename from third_party/chromium/media/gpu/android/video_frame_factory_impl.h rename to media/gpu/android/video_frame_factory_impl.h diff --git a/third_party/chromium/media/gpu/android/video_frame_factory_impl_unittest.cc b/media/gpu/android/video_frame_factory_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/android/video_frame_factory_impl_unittest.cc rename to media/gpu/android/video_frame_factory_impl_unittest.cc diff --git a/third_party/chromium/media/gpu/args.gni b/media/gpu/args.gni similarity index 100% rename from third_party/chromium/media/gpu/args.gni rename to media/gpu/args.gni diff --git a/third_party/chromium/media/gpu/av1_decoder.cc b/media/gpu/av1_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/av1_decoder.cc rename to media/gpu/av1_decoder.cc diff --git a/third_party/chromium/media/gpu/av1_decoder.h b/media/gpu/av1_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/av1_decoder.h rename to media/gpu/av1_decoder.h diff --git a/third_party/chromium/media/gpu/av1_decoder_fuzzertest.cc b/media/gpu/av1_decoder_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/gpu/av1_decoder_fuzzertest.cc rename to media/gpu/av1_decoder_fuzzertest.cc diff --git a/third_party/chromium/media/gpu/av1_decoder_unittest.cc b/media/gpu/av1_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/av1_decoder_unittest.cc rename to media/gpu/av1_decoder_unittest.cc diff --git a/third_party/chromium/media/gpu/av1_picture.cc b/media/gpu/av1_picture.cc similarity index 100% rename from third_party/chromium/media/gpu/av1_picture.cc rename to media/gpu/av1_picture.cc diff --git a/third_party/chromium/media/gpu/av1_picture.h b/media/gpu/av1_picture.h similarity index 100% rename from third_party/chromium/media/gpu/av1_picture.h rename to media/gpu/av1_picture.h diff --git a/third_party/chromium/media/gpu/buffer_validation.cc b/media/gpu/buffer_validation.cc similarity index 100% rename from third_party/chromium/media/gpu/buffer_validation.cc rename to media/gpu/buffer_validation.cc diff --git a/third_party/chromium/media/gpu/buffer_validation.h b/media/gpu/buffer_validation.h similarity index 100% rename from third_party/chromium/media/gpu/buffer_validation.h rename to media/gpu/buffer_validation.h diff --git a/third_party/chromium/media/gpu/buffer_validation_unittest.cc b/media/gpu/buffer_validation_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/buffer_validation_unittest.cc rename to media/gpu/buffer_validation_unittest.cc diff --git a/third_party/chromium/media/gpu/buildflags.h b/media/gpu/buildflags.h similarity index 100% rename from third_party/chromium/media/gpu/buildflags.h rename to media/gpu/buildflags.h diff --git a/third_party/chromium/media/gpu/chromeos/BUILD.gn b/media/gpu/chromeos/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/chromeos/BUILD.gn rename to media/gpu/chromeos/BUILD.gn diff --git a/third_party/chromium/media/gpu/chromeos/DEPS b/media/gpu/chromeos/DEPS similarity index 100% rename from third_party/chromium/media/gpu/chromeos/DEPS rename to media/gpu/chromeos/DEPS diff --git a/third_party/chromium/media/gpu/chromeos/OWNERS b/media/gpu/chromeos/OWNERS similarity index 100% rename from third_party/chromium/media/gpu/chromeos/OWNERS rename to media/gpu/chromeos/OWNERS diff --git a/third_party/chromium/media/gpu/chromeos/decoder_buffer_transcryptor.cc b/media/gpu/chromeos/decoder_buffer_transcryptor.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/decoder_buffer_transcryptor.cc rename to media/gpu/chromeos/decoder_buffer_transcryptor.cc diff --git a/third_party/chromium/media/gpu/chromeos/decoder_buffer_transcryptor.h b/media/gpu/chromeos/decoder_buffer_transcryptor.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/decoder_buffer_transcryptor.h rename to media/gpu/chromeos/decoder_buffer_transcryptor.h diff --git a/third_party/chromium/media/gpu/chromeos/dmabuf_video_frame_pool.cc b/media/gpu/chromeos/dmabuf_video_frame_pool.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/dmabuf_video_frame_pool.cc rename to media/gpu/chromeos/dmabuf_video_frame_pool.cc diff --git a/third_party/chromium/media/gpu/chromeos/dmabuf_video_frame_pool.h b/media/gpu/chromeos/dmabuf_video_frame_pool.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/dmabuf_video_frame_pool.h rename to media/gpu/chromeos/dmabuf_video_frame_pool.h diff --git a/third_party/chromium/media/gpu/chromeos/fourcc.cc b/media/gpu/chromeos/fourcc.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/fourcc.cc rename to media/gpu/chromeos/fourcc.cc diff --git a/third_party/chromium/media/gpu/chromeos/fourcc.h b/media/gpu/chromeos/fourcc.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/fourcc.h rename to media/gpu/chromeos/fourcc.h diff --git a/third_party/chromium/media/gpu/chromeos/fourcc_unittests.cc b/media/gpu/chromeos/fourcc_unittests.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/fourcc_unittests.cc rename to media/gpu/chromeos/fourcc_unittests.cc diff --git a/third_party/chromium/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc b/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc rename to media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc diff --git a/third_party/chromium/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.h b/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.h rename to media/gpu/chromeos/generic_dmabuf_video_frame_mapper.h diff --git a/third_party/chromium/media/gpu/chromeos/gpu_buffer_layout.cc b/media/gpu/chromeos/gpu_buffer_layout.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/gpu_buffer_layout.cc rename to media/gpu/chromeos/gpu_buffer_layout.cc diff --git a/third_party/chromium/media/gpu/chromeos/gpu_buffer_layout.h b/media/gpu/chromeos/gpu_buffer_layout.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/gpu_buffer_layout.h rename to media/gpu/chromeos/gpu_buffer_layout.h diff --git a/third_party/chromium/media/gpu/chromeos/gpu_memory_buffer_video_frame_mapper.cc b/media/gpu/chromeos/gpu_memory_buffer_video_frame_mapper.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/gpu_memory_buffer_video_frame_mapper.cc rename to media/gpu/chromeos/gpu_memory_buffer_video_frame_mapper.cc diff --git a/third_party/chromium/media/gpu/chromeos/gpu_memory_buffer_video_frame_mapper.h b/media/gpu/chromeos/gpu_memory_buffer_video_frame_mapper.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/gpu_memory_buffer_video_frame_mapper.h rename to media/gpu/chromeos/gpu_memory_buffer_video_frame_mapper.h diff --git a/third_party/chromium/media/gpu/chromeos/image_processor.cc b/media/gpu/chromeos/image_processor.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/image_processor.cc rename to media/gpu/chromeos/image_processor.cc diff --git a/third_party/chromium/media/gpu/chromeos/image_processor.h b/media/gpu/chromeos/image_processor.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/image_processor.h rename to media/gpu/chromeos/image_processor.h diff --git a/third_party/chromium/media/gpu/chromeos/image_processor_backend.cc b/media/gpu/chromeos/image_processor_backend.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/image_processor_backend.cc rename to media/gpu/chromeos/image_processor_backend.cc diff --git a/third_party/chromium/media/gpu/chromeos/image_processor_backend.h b/media/gpu/chromeos/image_processor_backend.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/image_processor_backend.h rename to media/gpu/chromeos/image_processor_backend.h diff --git a/third_party/chromium/media/gpu/chromeos/image_processor_factory.cc b/media/gpu/chromeos/image_processor_factory.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/image_processor_factory.cc rename to media/gpu/chromeos/image_processor_factory.cc diff --git a/third_party/chromium/media/gpu/chromeos/image_processor_factory.h b/media/gpu/chromeos/image_processor_factory.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/image_processor_factory.h rename to media/gpu/chromeos/image_processor_factory.h diff --git a/third_party/chromium/media/gpu/chromeos/image_processor_test.cc b/media/gpu/chromeos/image_processor_test.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/image_processor_test.cc rename to media/gpu/chromeos/image_processor_test.cc diff --git a/third_party/chromium/media/gpu/chromeos/image_processor_with_pool.cc b/media/gpu/chromeos/image_processor_with_pool.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/image_processor_with_pool.cc rename to media/gpu/chromeos/image_processor_with_pool.cc diff --git a/third_party/chromium/media/gpu/chromeos/image_processor_with_pool.h b/media/gpu/chromeos/image_processor_with_pool.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/image_processor_with_pool.h rename to media/gpu/chromeos/image_processor_with_pool.h diff --git a/third_party/chromium/media/gpu/chromeos/libyuv_image_processor_backend.cc b/media/gpu/chromeos/libyuv_image_processor_backend.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/libyuv_image_processor_backend.cc rename to media/gpu/chromeos/libyuv_image_processor_backend.cc diff --git a/third_party/chromium/media/gpu/chromeos/libyuv_image_processor_backend.h b/media/gpu/chromeos/libyuv_image_processor_backend.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/libyuv_image_processor_backend.h rename to media/gpu/chromeos/libyuv_image_processor_backend.h diff --git a/third_party/chromium/media/gpu/chromeos/mailbox_video_frame_converter.cc b/media/gpu/chromeos/mailbox_video_frame_converter.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/mailbox_video_frame_converter.cc rename to media/gpu/chromeos/mailbox_video_frame_converter.cc diff --git a/third_party/chromium/media/gpu/chromeos/mailbox_video_frame_converter.h b/media/gpu/chromeos/mailbox_video_frame_converter.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/mailbox_video_frame_converter.h rename to media/gpu/chromeos/mailbox_video_frame_converter.h diff --git a/third_party/chromium/media/gpu/chromeos/mailbox_video_frame_converter_unittest.cc b/media/gpu/chromeos/mailbox_video_frame_converter_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/mailbox_video_frame_converter_unittest.cc rename to media/gpu/chromeos/mailbox_video_frame_converter_unittest.cc diff --git a/third_party/chromium/media/gpu/chromeos/platform_video_frame_pool.cc b/media/gpu/chromeos/platform_video_frame_pool.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/platform_video_frame_pool.cc rename to media/gpu/chromeos/platform_video_frame_pool.cc diff --git a/third_party/chromium/media/gpu/chromeos/platform_video_frame_pool.h b/media/gpu/chromeos/platform_video_frame_pool.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/platform_video_frame_pool.h rename to media/gpu/chromeos/platform_video_frame_pool.h diff --git a/third_party/chromium/media/gpu/chromeos/platform_video_frame_pool_unittest.cc b/media/gpu/chromeos/platform_video_frame_pool_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/platform_video_frame_pool_unittest.cc rename to media/gpu/chromeos/platform_video_frame_pool_unittest.cc diff --git a/third_party/chromium/media/gpu/chromeos/platform_video_frame_utils.cc b/media/gpu/chromeos/platform_video_frame_utils.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/platform_video_frame_utils.cc rename to media/gpu/chromeos/platform_video_frame_utils.cc diff --git a/third_party/chromium/media/gpu/chromeos/platform_video_frame_utils.h b/media/gpu/chromeos/platform_video_frame_utils.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/platform_video_frame_utils.h rename to media/gpu/chromeos/platform_video_frame_utils.h diff --git a/third_party/chromium/media/gpu/chromeos/platform_video_frame_utils_unittest.cc b/media/gpu/chromeos/platform_video_frame_utils_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/platform_video_frame_utils_unittest.cc rename to media/gpu/chromeos/platform_video_frame_utils_unittest.cc diff --git a/third_party/chromium/media/gpu/chromeos/vd_video_decode_accelerator.cc b/media/gpu/chromeos/vd_video_decode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/vd_video_decode_accelerator.cc rename to media/gpu/chromeos/vd_video_decode_accelerator.cc diff --git a/third_party/chromium/media/gpu/chromeos/vd_video_decode_accelerator.h b/media/gpu/chromeos/vd_video_decode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/vd_video_decode_accelerator.h rename to media/gpu/chromeos/vd_video_decode_accelerator.h diff --git a/third_party/chromium/media/gpu/chromeos/vda_video_frame_pool.cc b/media/gpu/chromeos/vda_video_frame_pool.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/vda_video_frame_pool.cc rename to media/gpu/chromeos/vda_video_frame_pool.cc diff --git a/third_party/chromium/media/gpu/chromeos/vda_video_frame_pool.h b/media/gpu/chromeos/vda_video_frame_pool.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/vda_video_frame_pool.h rename to media/gpu/chromeos/vda_video_frame_pool.h diff --git a/third_party/chromium/media/gpu/chromeos/video_decoder_pipeline.cc b/media/gpu/chromeos/video_decoder_pipeline.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/video_decoder_pipeline.cc rename to media/gpu/chromeos/video_decoder_pipeline.cc diff --git a/third_party/chromium/media/gpu/chromeos/video_decoder_pipeline.h b/media/gpu/chromeos/video_decoder_pipeline.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/video_decoder_pipeline.h rename to media/gpu/chromeos/video_decoder_pipeline.h diff --git a/third_party/chromium/media/gpu/chromeos/video_decoder_pipeline_unittest.cc b/media/gpu/chromeos/video_decoder_pipeline_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/video_decoder_pipeline_unittest.cc rename to media/gpu/chromeos/video_decoder_pipeline_unittest.cc diff --git a/third_party/chromium/media/gpu/chromeos/video_frame_converter.cc b/media/gpu/chromeos/video_frame_converter.cc similarity index 100% rename from third_party/chromium/media/gpu/chromeos/video_frame_converter.cc rename to media/gpu/chromeos/video_frame_converter.cc diff --git a/third_party/chromium/media/gpu/chromeos/video_frame_converter.h b/media/gpu/chromeos/video_frame_converter.h similarity index 100% rename from third_party/chromium/media/gpu/chromeos/video_frame_converter.h rename to media/gpu/chromeos/video_frame_converter.h diff --git a/third_party/chromium/media/gpu/codec_picture.cc b/media/gpu/codec_picture.cc similarity index 100% rename from third_party/chromium/media/gpu/codec_picture.cc rename to media/gpu/codec_picture.cc diff --git a/third_party/chromium/media/gpu/codec_picture.h b/media/gpu/codec_picture.h similarity index 100% rename from third_party/chromium/media/gpu/codec_picture.h rename to media/gpu/codec_picture.h diff --git a/third_party/chromium/media/gpu/command_buffer_helper.cc b/media/gpu/command_buffer_helper.cc similarity index 100% rename from third_party/chromium/media/gpu/command_buffer_helper.cc rename to media/gpu/command_buffer_helper.cc diff --git a/third_party/chromium/media/gpu/command_buffer_helper.h b/media/gpu/command_buffer_helper.h similarity index 100% rename from third_party/chromium/media/gpu/command_buffer_helper.h rename to media/gpu/command_buffer_helper.h diff --git a/third_party/chromium/media/gpu/decode_surface_handler.h b/media/gpu/decode_surface_handler.h similarity index 100% rename from third_party/chromium/media/gpu/decode_surface_handler.h rename to media/gpu/decode_surface_handler.h diff --git a/third_party/chromium/media/gpu/gles2_decoder_helper.cc b/media/gpu/gles2_decoder_helper.cc similarity index 100% rename from third_party/chromium/media/gpu/gles2_decoder_helper.cc rename to media/gpu/gles2_decoder_helper.cc diff --git a/third_party/chromium/media/gpu/gles2_decoder_helper.h b/media/gpu/gles2_decoder_helper.h similarity index 100% rename from third_party/chromium/media/gpu/gles2_decoder_helper.h rename to media/gpu/gles2_decoder_helper.h diff --git a/third_party/chromium/media/gpu/gpu_video_accelerator_util.cc b/media/gpu/gpu_video_accelerator_util.cc similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_accelerator_util.cc rename to media/gpu/gpu_video_accelerator_util.cc diff --git a/third_party/chromium/media/gpu/gpu_video_accelerator_util.h b/media/gpu/gpu_video_accelerator_util.h similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_accelerator_util.h rename to media/gpu/gpu_video_accelerator_util.h diff --git a/third_party/chromium/media/gpu/gpu_video_decode_accelerator_factory.cc b/media/gpu/gpu_video_decode_accelerator_factory.cc similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_decode_accelerator_factory.cc rename to media/gpu/gpu_video_decode_accelerator_factory.cc diff --git a/third_party/chromium/media/gpu/gpu_video_decode_accelerator_factory.h b/media/gpu/gpu_video_decode_accelerator_factory.h similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_decode_accelerator_factory.h rename to media/gpu/gpu_video_decode_accelerator_factory.h diff --git a/third_party/chromium/media/gpu/gpu_video_decode_accelerator_helpers.cc b/media/gpu/gpu_video_decode_accelerator_helpers.cc similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_decode_accelerator_helpers.cc rename to media/gpu/gpu_video_decode_accelerator_helpers.cc diff --git a/third_party/chromium/media/gpu/gpu_video_decode_accelerator_helpers.h b/media/gpu/gpu_video_decode_accelerator_helpers.h similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_decode_accelerator_helpers.h rename to media/gpu/gpu_video_decode_accelerator_helpers.h diff --git a/third_party/chromium/media/gpu/gpu_video_encode_accelerator_factory.cc b/media/gpu/gpu_video_encode_accelerator_factory.cc similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_encode_accelerator_factory.cc rename to media/gpu/gpu_video_encode_accelerator_factory.cc diff --git a/third_party/chromium/media/gpu/gpu_video_encode_accelerator_factory.h b/media/gpu/gpu_video_encode_accelerator_factory.h similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_encode_accelerator_factory.h rename to media/gpu/gpu_video_encode_accelerator_factory.h diff --git a/third_party/chromium/media/gpu/gpu_video_encode_accelerator_helpers.cc b/media/gpu/gpu_video_encode_accelerator_helpers.cc similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_encode_accelerator_helpers.cc rename to media/gpu/gpu_video_encode_accelerator_helpers.cc diff --git a/third_party/chromium/media/gpu/gpu_video_encode_accelerator_helpers.h b/media/gpu/gpu_video_encode_accelerator_helpers.h similarity index 100% rename from third_party/chromium/media/gpu/gpu_video_encode_accelerator_helpers.h rename to media/gpu/gpu_video_encode_accelerator_helpers.h diff --git a/third_party/chromium/media/gpu/h264_decoder.cc b/media/gpu/h264_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/h264_decoder.cc rename to media/gpu/h264_decoder.cc diff --git a/third_party/chromium/media/gpu/h264_decoder.h b/media/gpu/h264_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/h264_decoder.h rename to media/gpu/h264_decoder.h diff --git a/third_party/chromium/media/gpu/h264_decoder_unittest.cc b/media/gpu/h264_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/h264_decoder_unittest.cc rename to media/gpu/h264_decoder_unittest.cc diff --git a/third_party/chromium/media/gpu/h264_dpb.cc b/media/gpu/h264_dpb.cc similarity index 100% rename from third_party/chromium/media/gpu/h264_dpb.cc rename to media/gpu/h264_dpb.cc diff --git a/third_party/chromium/media/gpu/h264_dpb.h b/media/gpu/h264_dpb.h similarity index 100% rename from third_party/chromium/media/gpu/h264_dpb.h rename to media/gpu/h264_dpb.h diff --git a/third_party/chromium/media/gpu/h265_decoder.cc b/media/gpu/h265_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/h265_decoder.cc rename to media/gpu/h265_decoder.cc diff --git a/third_party/chromium/media/gpu/h265_decoder.h b/media/gpu/h265_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/h265_decoder.h rename to media/gpu/h265_decoder.h diff --git a/third_party/chromium/media/gpu/h265_decoder_fuzzertest.cc b/media/gpu/h265_decoder_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/gpu/h265_decoder_fuzzertest.cc rename to media/gpu/h265_decoder_fuzzertest.cc diff --git a/third_party/chromium/media/gpu/h265_decoder_unittest.cc b/media/gpu/h265_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/h265_decoder_unittest.cc rename to media/gpu/h265_decoder_unittest.cc diff --git a/third_party/chromium/media/gpu/h265_dpb.cc b/media/gpu/h265_dpb.cc similarity index 100% rename from third_party/chromium/media/gpu/h265_dpb.cc rename to media/gpu/h265_dpb.cc diff --git a/third_party/chromium/media/gpu/h265_dpb.h b/media/gpu/h265_dpb.h similarity index 100% rename from third_party/chromium/media/gpu/h265_dpb.h rename to media/gpu/h265_dpb.h diff --git a/third_party/chromium/media/gpu/ipc/DEPS b/media/gpu/ipc/DEPS similarity index 100% rename from third_party/chromium/media/gpu/ipc/DEPS rename to media/gpu/ipc/DEPS diff --git a/third_party/chromium/media/gpu/ipc/client/BUILD.gn b/media/gpu/ipc/client/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/ipc/client/BUILD.gn rename to media/gpu/ipc/client/BUILD.gn diff --git a/third_party/chromium/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc b/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc similarity index 100% rename from third_party/chromium/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc rename to media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc diff --git a/third_party/chromium/media/gpu/ipc/client/gpu_video_decode_accelerator_host.h b/media/gpu/ipc/client/gpu_video_decode_accelerator_host.h similarity index 100% rename from third_party/chromium/media/gpu/ipc/client/gpu_video_decode_accelerator_host.h rename to media/gpu/ipc/client/gpu_video_decode_accelerator_host.h diff --git a/third_party/chromium/media/gpu/ipc/common/BUILD.gn b/media/gpu/ipc/common/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/ipc/common/BUILD.gn rename to media/gpu/ipc/common/BUILD.gn diff --git a/third_party/chromium/media/gpu/ipc/common/OWNERS b/media/gpu/ipc/common/OWNERS similarity index 100% rename from third_party/chromium/media/gpu/ipc/common/OWNERS rename to media/gpu/ipc/common/OWNERS diff --git a/third_party/chromium/media/gpu/ipc/common/media_param_traits.cc b/media/gpu/ipc/common/media_param_traits.cc similarity index 100% rename from third_party/chromium/media/gpu/ipc/common/media_param_traits.cc rename to media/gpu/ipc/common/media_param_traits.cc diff --git a/third_party/chromium/media/gpu/ipc/common/media_param_traits.h b/media/gpu/ipc/common/media_param_traits.h similarity index 100% rename from third_party/chromium/media/gpu/ipc/common/media_param_traits.h rename to media/gpu/ipc/common/media_param_traits.h diff --git a/third_party/chromium/media/gpu/ipc/common/media_param_traits_macros.h b/media/gpu/ipc/common/media_param_traits_macros.h similarity index 100% rename from third_party/chromium/media/gpu/ipc/common/media_param_traits_macros.h rename to media/gpu/ipc/common/media_param_traits_macros.h diff --git a/third_party/chromium/media/gpu/ipc/service/BUILD.gn b/media/gpu/ipc/service/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/BUILD.gn rename to media/gpu/ipc/service/BUILD.gn diff --git a/third_party/chromium/media/gpu/ipc/service/OWNERS b/media/gpu/ipc/service/OWNERS similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/OWNERS rename to media/gpu/ipc/service/OWNERS diff --git a/third_party/chromium/media/gpu/ipc/service/gpu_video_decode_accelerator.cc b/media/gpu/ipc/service/gpu_video_decode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/gpu_video_decode_accelerator.cc rename to media/gpu/ipc/service/gpu_video_decode_accelerator.cc diff --git a/third_party/chromium/media/gpu/ipc/service/gpu_video_decode_accelerator.h b/media/gpu/ipc/service/gpu_video_decode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/gpu_video_decode_accelerator.h rename to media/gpu/ipc/service/gpu_video_decode_accelerator.h diff --git a/third_party/chromium/media/gpu/ipc/service/media_gpu_channel.cc b/media/gpu/ipc/service/media_gpu_channel.cc similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/media_gpu_channel.cc rename to media/gpu/ipc/service/media_gpu_channel.cc diff --git a/third_party/chromium/media/gpu/ipc/service/media_gpu_channel.h b/media/gpu/ipc/service/media_gpu_channel.h similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/media_gpu_channel.h rename to media/gpu/ipc/service/media_gpu_channel.h diff --git a/third_party/chromium/media/gpu/ipc/service/media_gpu_channel_manager.cc b/media/gpu/ipc/service/media_gpu_channel_manager.cc similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/media_gpu_channel_manager.cc rename to media/gpu/ipc/service/media_gpu_channel_manager.cc diff --git a/third_party/chromium/media/gpu/ipc/service/media_gpu_channel_manager.h b/media/gpu/ipc/service/media_gpu_channel_manager.h similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/media_gpu_channel_manager.h rename to media/gpu/ipc/service/media_gpu_channel_manager.h diff --git a/third_party/chromium/media/gpu/ipc/service/picture_buffer_manager.cc b/media/gpu/ipc/service/picture_buffer_manager.cc similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/picture_buffer_manager.cc rename to media/gpu/ipc/service/picture_buffer_manager.cc diff --git a/third_party/chromium/media/gpu/ipc/service/picture_buffer_manager.h b/media/gpu/ipc/service/picture_buffer_manager.h similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/picture_buffer_manager.h rename to media/gpu/ipc/service/picture_buffer_manager.h diff --git a/third_party/chromium/media/gpu/ipc/service/picture_buffer_manager_unittest.cc b/media/gpu/ipc/service/picture_buffer_manager_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/picture_buffer_manager_unittest.cc rename to media/gpu/ipc/service/picture_buffer_manager_unittest.cc diff --git a/third_party/chromium/media/gpu/ipc/service/vda_video_decoder.cc b/media/gpu/ipc/service/vda_video_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/vda_video_decoder.cc rename to media/gpu/ipc/service/vda_video_decoder.cc diff --git a/third_party/chromium/media/gpu/ipc/service/vda_video_decoder.h b/media/gpu/ipc/service/vda_video_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/vda_video_decoder.h rename to media/gpu/ipc/service/vda_video_decoder.h diff --git a/third_party/chromium/media/gpu/ipc/service/vda_video_decoder_unittest.cc b/media/gpu/ipc/service/vda_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/ipc/service/vda_video_decoder_unittest.cc rename to media/gpu/ipc/service/vda_video_decoder_unittest.cc diff --git a/third_party/chromium/media/gpu/mac/BUILD.gn b/media/gpu/mac/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/mac/BUILD.gn rename to media/gpu/mac/BUILD.gn diff --git a/third_party/chromium/media/gpu/mac/vp9_super_frame_bitstream_filter.cc b/media/gpu/mac/vp9_super_frame_bitstream_filter.cc similarity index 100% rename from third_party/chromium/media/gpu/mac/vp9_super_frame_bitstream_filter.cc rename to media/gpu/mac/vp9_super_frame_bitstream_filter.cc diff --git a/third_party/chromium/media/gpu/mac/vp9_super_frame_bitstream_filter.h b/media/gpu/mac/vp9_super_frame_bitstream_filter.h similarity index 100% rename from third_party/chromium/media/gpu/mac/vp9_super_frame_bitstream_filter.h rename to media/gpu/mac/vp9_super_frame_bitstream_filter.h diff --git a/third_party/chromium/media/gpu/mac/vp9_super_frame_bitstream_filter_unittest.cc b/media/gpu/mac/vp9_super_frame_bitstream_filter_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/mac/vp9_super_frame_bitstream_filter_unittest.cc rename to media/gpu/mac/vp9_super_frame_bitstream_filter_unittest.cc diff --git a/third_party/chromium/media/gpu/mac/vt_config_util.h b/media/gpu/mac/vt_config_util.h similarity index 100% rename from third_party/chromium/media/gpu/mac/vt_config_util.h rename to media/gpu/mac/vt_config_util.h diff --git a/third_party/chromium/media/gpu/mac/vt_config_util.mm b/media/gpu/mac/vt_config_util.mm similarity index 100% rename from third_party/chromium/media/gpu/mac/vt_config_util.mm rename to media/gpu/mac/vt_config_util.mm diff --git a/third_party/chromium/media/gpu/mac/vt_config_util_unittest.cc b/media/gpu/mac/vt_config_util_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/mac/vt_config_util_unittest.cc rename to media/gpu/mac/vt_config_util_unittest.cc diff --git a/third_party/chromium/media/gpu/mac/vt_video_decode_accelerator_mac.cc b/media/gpu/mac/vt_video_decode_accelerator_mac.cc similarity index 100% rename from third_party/chromium/media/gpu/mac/vt_video_decode_accelerator_mac.cc rename to media/gpu/mac/vt_video_decode_accelerator_mac.cc diff --git a/third_party/chromium/media/gpu/mac/vt_video_decode_accelerator_mac.h b/media/gpu/mac/vt_video_decode_accelerator_mac.h similarity index 100% rename from third_party/chromium/media/gpu/mac/vt_video_decode_accelerator_mac.h rename to media/gpu/mac/vt_video_decode_accelerator_mac.h diff --git a/third_party/chromium/media/gpu/mac/vt_video_encode_accelerator_mac.cc b/media/gpu/mac/vt_video_encode_accelerator_mac.cc similarity index 100% rename from third_party/chromium/media/gpu/mac/vt_video_encode_accelerator_mac.cc rename to media/gpu/mac/vt_video_encode_accelerator_mac.cc diff --git a/third_party/chromium/media/gpu/mac/vt_video_encode_accelerator_mac.h b/media/gpu/mac/vt_video_encode_accelerator_mac.h similarity index 100% rename from third_party/chromium/media/gpu/mac/vt_video_encode_accelerator_mac.h rename to media/gpu/mac/vt_video_encode_accelerator_mac.h diff --git a/third_party/chromium/media/gpu/macros.h b/media/gpu/macros.h similarity index 100% rename from third_party/chromium/media/gpu/macros.h rename to media/gpu/macros.h diff --git a/third_party/chromium/media/gpu/media_gpu_export.h b/media/gpu/media_gpu_export.h similarity index 100% rename from third_party/chromium/media/gpu/media_gpu_export.h rename to media/gpu/media_gpu_export.h diff --git a/third_party/chromium/media/gpu/test/BUILD.gn b/media/gpu/test/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/test/BUILD.gn rename to media/gpu/test/BUILD.gn diff --git a/third_party/chromium/media/gpu/test/DEPS b/media/gpu/test/DEPS similarity index 100% rename from third_party/chromium/media/gpu/test/DEPS rename to media/gpu/test/DEPS diff --git a/third_party/chromium/media/gpu/test/OWNERS b/media/gpu/test/OWNERS similarity index 100% rename from third_party/chromium/media/gpu/test/OWNERS rename to media/gpu/test/OWNERS diff --git a/third_party/chromium/media/gpu/test/bitstream_helpers.cc b/media/gpu/test/bitstream_helpers.cc similarity index 100% rename from third_party/chromium/media/gpu/test/bitstream_helpers.cc rename to media/gpu/test/bitstream_helpers.cc diff --git a/third_party/chromium/media/gpu/test/bitstream_helpers.h b/media/gpu/test/bitstream_helpers.h similarity index 100% rename from third_party/chromium/media/gpu/test/bitstream_helpers.h rename to media/gpu/test/bitstream_helpers.h diff --git a/third_party/chromium/media/gpu/test/fake_command_buffer_helper.cc b/media/gpu/test/fake_command_buffer_helper.cc similarity index 100% rename from third_party/chromium/media/gpu/test/fake_command_buffer_helper.cc rename to media/gpu/test/fake_command_buffer_helper.cc diff --git a/third_party/chromium/media/gpu/test/fake_command_buffer_helper.h b/media/gpu/test/fake_command_buffer_helper.h similarity index 100% rename from third_party/chromium/media/gpu/test/fake_command_buffer_helper.h rename to media/gpu/test/fake_command_buffer_helper.h diff --git a/third_party/chromium/media/gpu/test/image.cc b/media/gpu/test/image.cc similarity index 100% rename from third_party/chromium/media/gpu/test/image.cc rename to media/gpu/test/image.cc diff --git a/third_party/chromium/media/gpu/test/image.h b/media/gpu/test/image.h similarity index 100% rename from third_party/chromium/media/gpu/test/image.h rename to media/gpu/test/image.h diff --git a/third_party/chromium/media/gpu/test/image_processor/image_processor_client.cc b/media/gpu/test/image_processor/image_processor_client.cc similarity index 100% rename from third_party/chromium/media/gpu/test/image_processor/image_processor_client.cc rename to media/gpu/test/image_processor/image_processor_client.cc diff --git a/third_party/chromium/media/gpu/test/image_processor/image_processor_client.h b/media/gpu/test/image_processor/image_processor_client.h similarity index 100% rename from third_party/chromium/media/gpu/test/image_processor/image_processor_client.h rename to media/gpu/test/image_processor/image_processor_client.h diff --git a/third_party/chromium/media/gpu/test/image_quality_metrics.cc b/media/gpu/test/image_quality_metrics.cc similarity index 100% rename from third_party/chromium/media/gpu/test/image_quality_metrics.cc rename to media/gpu/test/image_quality_metrics.cc diff --git a/third_party/chromium/media/gpu/test/image_quality_metrics.h b/media/gpu/test/image_quality_metrics.h similarity index 100% rename from third_party/chromium/media/gpu/test/image_quality_metrics.h rename to media/gpu/test/image_quality_metrics.h diff --git a/third_party/chromium/media/gpu/test/local_gpu_memory_buffer_manager.cc b/media/gpu/test/local_gpu_memory_buffer_manager.cc similarity index 100% rename from third_party/chromium/media/gpu/test/local_gpu_memory_buffer_manager.cc rename to media/gpu/test/local_gpu_memory_buffer_manager.cc diff --git a/third_party/chromium/media/gpu/test/local_gpu_memory_buffer_manager.h b/media/gpu/test/local_gpu_memory_buffer_manager.h similarity index 100% rename from third_party/chromium/media/gpu/test/local_gpu_memory_buffer_manager.h rename to media/gpu/test/local_gpu_memory_buffer_manager.h diff --git a/third_party/chromium/media/gpu/test/video.cc b/media/gpu/test/video.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video.cc rename to media/gpu/test/video.cc diff --git a/third_party/chromium/media/gpu/test/video.h b/media/gpu/test/video.h similarity index 100% rename from third_party/chromium/media/gpu/test/video.h rename to media/gpu/test/video.h diff --git a/third_party/chromium/media/gpu/test/video_encoder/bitstream_file_writer.cc b/media/gpu/test/video_encoder/bitstream_file_writer.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/bitstream_file_writer.cc rename to media/gpu/test/video_encoder/bitstream_file_writer.cc diff --git a/third_party/chromium/media/gpu/test/video_encoder/bitstream_file_writer.h b/media/gpu/test/video_encoder/bitstream_file_writer.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/bitstream_file_writer.h rename to media/gpu/test/video_encoder/bitstream_file_writer.h diff --git a/third_party/chromium/media/gpu/test/video_encoder/bitstream_validator.cc b/media/gpu/test/video_encoder/bitstream_validator.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/bitstream_validator.cc rename to media/gpu/test/video_encoder/bitstream_validator.cc diff --git a/third_party/chromium/media/gpu/test/video_encoder/bitstream_validator.h b/media/gpu/test/video_encoder/bitstream_validator.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/bitstream_validator.h rename to media/gpu/test/video_encoder/bitstream_validator.h diff --git a/third_party/chromium/media/gpu/test/video_encoder/decoder_buffer_validator.cc b/media/gpu/test/video_encoder/decoder_buffer_validator.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/decoder_buffer_validator.cc rename to media/gpu/test/video_encoder/decoder_buffer_validator.cc diff --git a/third_party/chromium/media/gpu/test/video_encoder/decoder_buffer_validator.h b/media/gpu/test/video_encoder/decoder_buffer_validator.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/decoder_buffer_validator.h rename to media/gpu/test/video_encoder/decoder_buffer_validator.h diff --git a/third_party/chromium/media/gpu/test/video_encoder/video_encoder.cc b/media/gpu/test/video_encoder/video_encoder.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/video_encoder.cc rename to media/gpu/test/video_encoder/video_encoder.cc diff --git a/third_party/chromium/media/gpu/test/video_encoder/video_encoder.h b/media/gpu/test/video_encoder/video_encoder.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/video_encoder.h rename to media/gpu/test/video_encoder/video_encoder.h diff --git a/third_party/chromium/media/gpu/test/video_encoder/video_encoder_client.cc b/media/gpu/test/video_encoder/video_encoder_client.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/video_encoder_client.cc rename to media/gpu/test/video_encoder/video_encoder_client.cc diff --git a/third_party/chromium/media/gpu/test/video_encoder/video_encoder_client.h b/media/gpu/test/video_encoder/video_encoder_client.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/video_encoder_client.h rename to media/gpu/test/video_encoder/video_encoder_client.h diff --git a/third_party/chromium/media/gpu/test/video_encoder/video_encoder_test_environment.cc b/media/gpu/test/video_encoder/video_encoder_test_environment.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/video_encoder_test_environment.cc rename to media/gpu/test/video_encoder/video_encoder_test_environment.cc diff --git a/third_party/chromium/media/gpu/test/video_encoder/video_encoder_test_environment.h b/media/gpu/test/video_encoder/video_encoder_test_environment.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_encoder/video_encoder_test_environment.h rename to media/gpu/test/video_encoder/video_encoder_test_environment.h diff --git a/third_party/chromium/media/gpu/test/video_frame_file_writer.cc b/media/gpu/test/video_frame_file_writer.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_frame_file_writer.cc rename to media/gpu/test/video_frame_file_writer.cc diff --git a/third_party/chromium/media/gpu/test/video_frame_file_writer.h b/media/gpu/test/video_frame_file_writer.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_frame_file_writer.h rename to media/gpu/test/video_frame_file_writer.h diff --git a/third_party/chromium/media/gpu/test/video_frame_helpers.cc b/media/gpu/test/video_frame_helpers.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_frame_helpers.cc rename to media/gpu/test/video_frame_helpers.cc diff --git a/third_party/chromium/media/gpu/test/video_frame_helpers.h b/media/gpu/test/video_frame_helpers.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_frame_helpers.h rename to media/gpu/test/video_frame_helpers.h diff --git a/third_party/chromium/media/gpu/test/video_frame_validator.cc b/media/gpu/test/video_frame_validator.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_frame_validator.cc rename to media/gpu/test/video_frame_validator.cc diff --git a/third_party/chromium/media/gpu/test/video_frame_validator.h b/media/gpu/test/video_frame_validator.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_frame_validator.h rename to media/gpu/test/video_frame_validator.h diff --git a/third_party/chromium/media/gpu/test/video_player/frame_renderer.h b/media/gpu/test/video_player/frame_renderer.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/frame_renderer.h rename to media/gpu/test/video_player/frame_renderer.h diff --git a/third_party/chromium/media/gpu/test/video_player/frame_renderer_dummy.cc b/media/gpu/test/video_player/frame_renderer_dummy.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/frame_renderer_dummy.cc rename to media/gpu/test/video_player/frame_renderer_dummy.cc diff --git a/third_party/chromium/media/gpu/test/video_player/frame_renderer_dummy.h b/media/gpu/test/video_player/frame_renderer_dummy.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/frame_renderer_dummy.h rename to media/gpu/test/video_player/frame_renderer_dummy.h diff --git a/third_party/chromium/media/gpu/test/video_player/frame_renderer_thumbnail.cc b/media/gpu/test/video_player/frame_renderer_thumbnail.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/frame_renderer_thumbnail.cc rename to media/gpu/test/video_player/frame_renderer_thumbnail.cc diff --git a/third_party/chromium/media/gpu/test/video_player/frame_renderer_thumbnail.h b/media/gpu/test/video_player/frame_renderer_thumbnail.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/frame_renderer_thumbnail.h rename to media/gpu/test/video_player/frame_renderer_thumbnail.h diff --git a/third_party/chromium/media/gpu/test/video_player/test_vda_video_decoder.cc b/media/gpu/test/video_player/test_vda_video_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/test_vda_video_decoder.cc rename to media/gpu/test/video_player/test_vda_video_decoder.cc diff --git a/third_party/chromium/media/gpu/test/video_player/test_vda_video_decoder.h b/media/gpu/test/video_player/test_vda_video_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/test_vda_video_decoder.h rename to media/gpu/test/video_player/test_vda_video_decoder.h diff --git a/third_party/chromium/media/gpu/test/video_player/video_decoder_client.cc b/media/gpu/test/video_player/video_decoder_client.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/video_decoder_client.cc rename to media/gpu/test/video_player/video_decoder_client.cc diff --git a/third_party/chromium/media/gpu/test/video_player/video_decoder_client.h b/media/gpu/test/video_player/video_decoder_client.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/video_decoder_client.h rename to media/gpu/test/video_player/video_decoder_client.h diff --git a/third_party/chromium/media/gpu/test/video_player/video_player.cc b/media/gpu/test/video_player/video_player.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/video_player.cc rename to media/gpu/test/video_player/video_player.cc diff --git a/third_party/chromium/media/gpu/test/video_player/video_player.h b/media/gpu/test/video_player/video_player.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/video_player.h rename to media/gpu/test/video_player/video_player.h diff --git a/third_party/chromium/media/gpu/test/video_player/video_player_test_environment.cc b/media/gpu/test/video_player/video_player_test_environment.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/video_player_test_environment.cc rename to media/gpu/test/video_player/video_player_test_environment.cc diff --git a/third_party/chromium/media/gpu/test/video_player/video_player_test_environment.h b/media/gpu/test/video_player/video_player_test_environment.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_player/video_player_test_environment.h rename to media/gpu/test/video_player/video_player_test_environment.h diff --git a/third_party/chromium/media/gpu/test/video_test_environment.cc b/media/gpu/test/video_test_environment.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_test_environment.cc rename to media/gpu/test/video_test_environment.cc diff --git a/third_party/chromium/media/gpu/test/video_test_environment.h b/media/gpu/test/video_test_environment.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_test_environment.h rename to media/gpu/test/video_test_environment.h diff --git a/third_party/chromium/media/gpu/test/video_test_helpers.cc b/media/gpu/test/video_test_helpers.cc similarity index 100% rename from third_party/chromium/media/gpu/test/video_test_helpers.cc rename to media/gpu/test/video_test_helpers.cc diff --git a/third_party/chromium/media/gpu/test/video_test_helpers.h b/media/gpu/test/video_test_helpers.h similarity index 100% rename from third_party/chromium/media/gpu/test/video_test_helpers.h rename to media/gpu/test/video_test_helpers.h diff --git a/third_party/chromium/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/v4l2/BUILD.gn rename to media/gpu/v4l2/BUILD.gn diff --git a/third_party/chromium/media/gpu/v4l2/aml_v4l2_device.cc b/media/gpu/v4l2/aml_v4l2_device.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/aml_v4l2_device.cc rename to media/gpu/v4l2/aml_v4l2_device.cc diff --git a/third_party/chromium/media/gpu/v4l2/aml_v4l2_device.h b/media/gpu/v4l2/aml_v4l2_device.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/aml_v4l2_device.h rename to media/gpu/v4l2/aml_v4l2_device.h diff --git a/third_party/chromium/media/gpu/v4l2/buffer_affinity_tracker.cc b/media/gpu/v4l2/buffer_affinity_tracker.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/buffer_affinity_tracker.cc rename to media/gpu/v4l2/buffer_affinity_tracker.cc diff --git a/third_party/chromium/media/gpu/v4l2/buffer_affinity_tracker.h b/media/gpu/v4l2/buffer_affinity_tracker.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/buffer_affinity_tracker.h rename to media/gpu/v4l2/buffer_affinity_tracker.h diff --git a/third_party/chromium/media/gpu/v4l2/generic_v4l2_device.cc b/media/gpu/v4l2/generic_v4l2_device.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/generic_v4l2_device.cc rename to media/gpu/v4l2/generic_v4l2_device.cc diff --git a/third_party/chromium/media/gpu/v4l2/generic_v4l2_device.h b/media/gpu/v4l2/generic_v4l2_device.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/generic_v4l2_device.h rename to media/gpu/v4l2/generic_v4l2_device.h diff --git a/third_party/chromium/media/gpu/v4l2/test/v4l2_ioctl_shim.cc b/media/gpu/v4l2/test/v4l2_ioctl_shim.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/test/v4l2_ioctl_shim.cc rename to media/gpu/v4l2/test/v4l2_ioctl_shim.cc diff --git a/third_party/chromium/media/gpu/v4l2/test/v4l2_ioctl_shim.h b/media/gpu/v4l2/test/v4l2_ioctl_shim.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/test/v4l2_ioctl_shim.h rename to media/gpu/v4l2/test/v4l2_ioctl_shim.h diff --git a/third_party/chromium/media/gpu/v4l2/test/v4l2_stateless_decoder.cc b/media/gpu/v4l2/test/v4l2_stateless_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/test/v4l2_stateless_decoder.cc rename to media/gpu/v4l2/test/v4l2_stateless_decoder.cc diff --git a/third_party/chromium/media/gpu/v4l2/test/vp9_decoder.cc b/media/gpu/v4l2/test/vp9_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/test/vp9_decoder.cc rename to media/gpu/v4l2/test/vp9_decoder.cc diff --git a/third_party/chromium/media/gpu/v4l2/test/vp9_decoder.h b/media/gpu/v4l2/test/vp9_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/test/vp9_decoder.h rename to media/gpu/v4l2/test/vp9_decoder.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2.sig b/media/gpu/v4l2/v4l2.sig similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2.sig rename to media/gpu/v4l2/v4l2.sig diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_decode_surface.cc b/media/gpu/v4l2/v4l2_decode_surface.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_decode_surface.cc rename to media/gpu/v4l2/v4l2_decode_surface.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_decode_surface.h b/media/gpu/v4l2/v4l2_decode_surface.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_decode_surface.h rename to media/gpu/v4l2/v4l2_decode_surface.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_decode_surface_handler.h b/media/gpu/v4l2/v4l2_decode_surface_handler.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_decode_surface_handler.h rename to media/gpu/v4l2/v4l2_decode_surface_handler.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_device.cc rename to media/gpu/v4l2/v4l2_device.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_device.h b/media/gpu/v4l2/v4l2_device.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_device.h rename to media/gpu/v4l2/v4l2_device.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_device_poller.cc b/media/gpu/v4l2/v4l2_device_poller.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_device_poller.cc rename to media/gpu/v4l2/v4l2_device_poller.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_device_poller.h b/media/gpu/v4l2/v4l2_device_poller.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_device_poller.h rename to media/gpu/v4l2/v4l2_device_poller.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_device_unittest.cc b/media/gpu/v4l2/v4l2_device_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_device_unittest.cc rename to media/gpu/v4l2/v4l2_device_unittest.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_framerate_control.cc b/media/gpu/v4l2/v4l2_framerate_control.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_framerate_control.cc rename to media/gpu/v4l2/v4l2_framerate_control.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_framerate_control.h b/media/gpu/v4l2/v4l2_framerate_control.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_framerate_control.h rename to media/gpu/v4l2/v4l2_framerate_control.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_image_processor_backend.cc b/media/gpu/v4l2/v4l2_image_processor_backend.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_image_processor_backend.cc rename to media/gpu/v4l2/v4l2_image_processor_backend.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_image_processor_backend.h b/media/gpu/v4l2/v4l2_image_processor_backend.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_image_processor_backend.h rename to media/gpu/v4l2/v4l2_image_processor_backend.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc b/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc rename to media/gpu/v4l2/v4l2_jpeg_encode_accelerator.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.h b/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.h rename to media/gpu/v4l2/v4l2_jpeg_encode_accelerator.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.cc b/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.cc rename to media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.h b/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.h rename to media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc rename to media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h rename to media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_stateful_workaround.cc b/media/gpu/v4l2/v4l2_stateful_workaround.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_stateful_workaround.cc rename to media/gpu/v4l2/v4l2_stateful_workaround.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_stateful_workaround.h b/media/gpu/v4l2/v4l2_stateful_workaround.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_stateful_workaround.h rename to media/gpu/v4l2/v4l2_stateful_workaround.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_stateful_workaround_unittest.cc b/media/gpu/v4l2/v4l2_stateful_workaround_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_stateful_workaround_unittest.cc rename to media/gpu/v4l2/v4l2_stateful_workaround_unittest.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_stub_header.fragment b/media/gpu/v4l2/v4l2_stub_header.fragment similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_stub_header.fragment rename to media/gpu/v4l2/v4l2_stub_header.fragment diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_utils.cc b/media/gpu/v4l2/v4l2_utils.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_utils.cc rename to media/gpu/v4l2/v4l2_utils.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_utils.h b/media/gpu/v4l2/v4l2_utils.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_utils.h rename to media/gpu/v4l2/v4l2_utils.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_vda_helpers.cc b/media/gpu/v4l2/v4l2_vda_helpers.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_vda_helpers.cc rename to media/gpu/v4l2/v4l2_vda_helpers.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_vda_helpers.h b/media/gpu/v4l2/v4l2_vda_helpers.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_vda_helpers.h rename to media/gpu/v4l2/v4l2_vda_helpers.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decode_accelerator.cc rename to media/gpu/v4l2/v4l2_video_decode_accelerator.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decode_accelerator.h b/media/gpu/v4l2/v4l2_video_decode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decode_accelerator.h rename to media/gpu/v4l2/v4l2_video_decode_accelerator.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder.cc b/media/gpu/v4l2/v4l2_video_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder.cc rename to media/gpu/v4l2/v4l2_video_decoder.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder.h b/media/gpu/v4l2/v4l2_video_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder.h rename to media/gpu/v4l2/v4l2_video_decoder.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend.cc b/media/gpu/v4l2/v4l2_video_decoder_backend.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend.cc rename to media/gpu/v4l2/v4l2_video_decoder_backend.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend.h b/media/gpu/v4l2/v4l2_video_decoder_backend.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend.h rename to media/gpu/v4l2/v4l2_video_decoder_backend.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend_stateful.cc b/media/gpu/v4l2/v4l2_video_decoder_backend_stateful.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend_stateful.cc rename to media/gpu/v4l2/v4l2_video_decoder_backend_stateful.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend_stateful.h b/media/gpu/v4l2/v4l2_video_decoder_backend_stateful.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend_stateful.h rename to media/gpu/v4l2/v4l2_video_decoder_backend_stateful.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.cc b/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.cc rename to media/gpu/v4l2/v4l2_video_decoder_backend_stateless.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.h b/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_backend_stateless.h rename to media/gpu/v4l2/v4l2_video_decoder_backend_stateless.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_h264.cc b/media/gpu/v4l2/v4l2_video_decoder_delegate_h264.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_h264.cc rename to media/gpu/v4l2/v4l2_video_decoder_delegate_h264.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_h264.h b/media/gpu/v4l2/v4l2_video_decoder_delegate_h264.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_h264.h rename to media/gpu/v4l2/v4l2_video_decoder_delegate_h264.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_h264_legacy.cc b/media/gpu/v4l2/v4l2_video_decoder_delegate_h264_legacy.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_h264_legacy.cc rename to media/gpu/v4l2/v4l2_video_decoder_delegate_h264_legacy.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_h264_legacy.h b/media/gpu/v4l2/v4l2_video_decoder_delegate_h264_legacy.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_h264_legacy.h rename to media/gpu/v4l2/v4l2_video_decoder_delegate_h264_legacy.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8.cc b/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8.cc rename to media/gpu/v4l2/v4l2_video_decoder_delegate_vp8.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8.h b/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8.h rename to media/gpu/v4l2/v4l2_video_decoder_delegate_vp8.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8_legacy.cc b/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8_legacy.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8_legacy.cc rename to media/gpu/v4l2/v4l2_video_decoder_delegate_vp8_legacy.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8_legacy.h b/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8_legacy.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp8_legacy.h rename to media/gpu/v4l2/v4l2_video_decoder_delegate_vp8_legacy.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_chromium.cc b/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_chromium.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_chromium.cc rename to media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_chromium.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_chromium.h b/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_chromium.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_chromium.h rename to media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_chromium.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_legacy.cc b/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_legacy.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_legacy.cc rename to media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_legacy.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_legacy.h b/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_legacy.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_legacy.h rename to media/gpu/v4l2/v4l2_video_decoder_delegate_vp9_legacy.h diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_encode_accelerator.cc rename to media/gpu/v4l2/v4l2_video_encode_accelerator.cc diff --git a/third_party/chromium/media/gpu/v4l2/v4l2_video_encode_accelerator.h b/media/gpu/v4l2/v4l2_video_encode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/v4l2/v4l2_video_encode_accelerator.h rename to media/gpu/v4l2/v4l2_video_encode_accelerator.h diff --git a/third_party/chromium/media/gpu/vaapi/BUILD.gn b/media/gpu/vaapi/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/vaapi/BUILD.gn rename to media/gpu/vaapi/BUILD.gn diff --git a/third_party/chromium/media/gpu/vaapi/DEPS b/media/gpu/vaapi/DEPS similarity index 100% rename from third_party/chromium/media/gpu/vaapi/DEPS rename to media/gpu/vaapi/DEPS diff --git a/third_party/chromium/media/gpu/vaapi/OWNERS b/media/gpu/vaapi/OWNERS similarity index 100% rename from third_party/chromium/media/gpu/vaapi/OWNERS rename to media/gpu/vaapi/OWNERS diff --git a/third_party/chromium/media/gpu/vaapi/av1_vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/av1_vaapi_video_decoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/av1_vaapi_video_decoder_delegate.cc rename to media/gpu/vaapi/av1_vaapi_video_decoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/av1_vaapi_video_decoder_delegate.h b/media/gpu/vaapi/av1_vaapi_video_decoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/av1_vaapi_video_decoder_delegate.h rename to media/gpu/vaapi/av1_vaapi_video_decoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/BUILD.gn b/media/gpu/vaapi/fuzzers/jpeg_decoder/BUILD.gn similarity index 100% rename from third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/BUILD.gn rename to media/gpu/vaapi/fuzzers/jpeg_decoder/BUILD.gn diff --git a/third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/jpeg_decoder_fuzzer_input.proto b/media/gpu/vaapi/fuzzers/jpeg_decoder/jpeg_decoder_fuzzer_input.proto similarity index 100% rename from third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/jpeg_decoder_fuzzer_input.proto rename to media/gpu/vaapi/fuzzers/jpeg_decoder/jpeg_decoder_fuzzer_input.proto diff --git a/third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/jpeg_decoder_fuzzertest.cc b/media/gpu/vaapi/fuzzers/jpeg_decoder/jpeg_decoder_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/jpeg_decoder_fuzzertest.cc rename to media/gpu/vaapi/fuzzers/jpeg_decoder/jpeg_decoder_fuzzertest.cc diff --git a/third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/seed/README.md b/media/gpu/vaapi/fuzzers/jpeg_decoder/seed/README.md similarity index 100% rename from third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/seed/README.md rename to media/gpu/vaapi/fuzzers/jpeg_decoder/seed/README.md diff --git a/third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/seed/pixel-1280x720.textproto b/media/gpu/vaapi/fuzzers/jpeg_decoder/seed/pixel-1280x720.textproto similarity index 100% rename from third_party/chromium/media/gpu/vaapi/fuzzers/jpeg_decoder/seed/pixel-1280x720.textproto rename to media/gpu/vaapi/fuzzers/jpeg_decoder/seed/pixel-1280x720.textproto diff --git a/third_party/chromium/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.cc rename to media/gpu/vaapi/h264_vaapi_video_decoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.h b/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.h rename to media/gpu/vaapi/h264_vaapi_video_decoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc rename to media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.h b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.h rename to media/gpu/vaapi/h264_vaapi_video_encoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc rename to media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/h265_vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/h265_vaapi_video_decoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/h265_vaapi_video_decoder_delegate.cc rename to media/gpu/vaapi/h265_vaapi_video_decoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/h265_vaapi_video_decoder_delegate.h b/media/gpu/vaapi/h265_vaapi_video_decoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/h265_vaapi_video_decoder_delegate.h rename to media/gpu/vaapi/h265_vaapi_video_decoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/test/av1_decoder.cc b/media/gpu/vaapi/test/av1_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/av1_decoder.cc rename to media/gpu/vaapi/test/av1_decoder.cc diff --git a/third_party/chromium/media/gpu/vaapi/test/av1_decoder.h b/media/gpu/vaapi/test/av1_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/av1_decoder.h rename to media/gpu/vaapi/test/av1_decoder.h diff --git a/third_party/chromium/media/gpu/vaapi/test/decode.cc b/media/gpu/vaapi/test/decode.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/decode.cc rename to media/gpu/vaapi/test/decode.cc diff --git a/third_party/chromium/media/gpu/vaapi/test/macros.h b/media/gpu/vaapi/test/macros.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/macros.h rename to media/gpu/vaapi/test/macros.h diff --git a/third_party/chromium/media/gpu/vaapi/test/scoped_va_config.cc b/media/gpu/vaapi/test/scoped_va_config.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/scoped_va_config.cc rename to media/gpu/vaapi/test/scoped_va_config.cc diff --git a/third_party/chromium/media/gpu/vaapi/test/scoped_va_config.h b/media/gpu/vaapi/test/scoped_va_config.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/scoped_va_config.h rename to media/gpu/vaapi/test/scoped_va_config.h diff --git a/third_party/chromium/media/gpu/vaapi/test/scoped_va_context.cc b/media/gpu/vaapi/test/scoped_va_context.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/scoped_va_context.cc rename to media/gpu/vaapi/test/scoped_va_context.cc diff --git a/third_party/chromium/media/gpu/vaapi/test/scoped_va_context.h b/media/gpu/vaapi/test/scoped_va_context.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/scoped_va_context.h rename to media/gpu/vaapi/test/scoped_va_context.h diff --git a/third_party/chromium/media/gpu/vaapi/test/shared_va_surface.cc b/media/gpu/vaapi/test/shared_va_surface.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/shared_va_surface.cc rename to media/gpu/vaapi/test/shared_va_surface.cc diff --git a/third_party/chromium/media/gpu/vaapi/test/shared_va_surface.h b/media/gpu/vaapi/test/shared_va_surface.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/shared_va_surface.h rename to media/gpu/vaapi/test/shared_va_surface.h diff --git a/third_party/chromium/media/gpu/vaapi/test/vaapi_device.cc b/media/gpu/vaapi/test/vaapi_device.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/vaapi_device.cc rename to media/gpu/vaapi/test/vaapi_device.cc diff --git a/third_party/chromium/media/gpu/vaapi/test/vaapi_device.h b/media/gpu/vaapi/test/vaapi_device.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/vaapi_device.h rename to media/gpu/vaapi/test/vaapi_device.h diff --git a/third_party/chromium/media/gpu/vaapi/test/video_decoder.cc b/media/gpu/vaapi/test/video_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/video_decoder.cc rename to media/gpu/vaapi/test/video_decoder.cc diff --git a/third_party/chromium/media/gpu/vaapi/test/video_decoder.h b/media/gpu/vaapi/test/video_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/video_decoder.h rename to media/gpu/vaapi/test/video_decoder.h diff --git a/third_party/chromium/media/gpu/vaapi/test/vp9_decoder.cc b/media/gpu/vaapi/test/vp9_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/vp9_decoder.cc rename to media/gpu/vaapi/test/vp9_decoder.cc diff --git a/third_party/chromium/media/gpu/vaapi/test/vp9_decoder.h b/media/gpu/vaapi/test/vp9_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test/vp9_decoder.h rename to media/gpu/vaapi/test/vp9_decoder.h diff --git a/third_party/chromium/media/gpu/vaapi/test_utils.cc b/media/gpu/vaapi/test_utils.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test_utils.cc rename to media/gpu/vaapi/test_utils.cc diff --git a/third_party/chromium/media/gpu/vaapi/test_utils.h b/media/gpu/vaapi/test_utils.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/test_utils.h rename to media/gpu/vaapi/test_utils.h diff --git a/third_party/chromium/media/gpu/vaapi/va.sigs b/media/gpu/vaapi/va.sigs similarity index 100% rename from third_party/chromium/media/gpu/vaapi/va.sigs rename to media/gpu/vaapi/va.sigs diff --git a/third_party/chromium/media/gpu/vaapi/va_drm.sigs b/media/gpu/vaapi/va_drm.sigs similarity index 100% rename from third_party/chromium/media/gpu/vaapi/va_drm.sigs rename to media/gpu/vaapi/va_drm.sigs diff --git a/third_party/chromium/media/gpu/vaapi/va_prot.sigs b/media/gpu/vaapi/va_prot.sigs similarity index 100% rename from third_party/chromium/media/gpu/vaapi/va_prot.sigs rename to media/gpu/vaapi/va_prot.sigs diff --git a/third_party/chromium/media/gpu/vaapi/va_stub_header.fragment b/media/gpu/vaapi/va_stub_header.fragment similarity index 100% rename from third_party/chromium/media/gpu/vaapi/va_stub_header.fragment rename to media/gpu/vaapi/va_stub_header.fragment diff --git a/third_party/chromium/media/gpu/vaapi/va_surface.cc b/media/gpu/vaapi/va_surface.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/va_surface.cc rename to media/gpu/vaapi/va_surface.cc diff --git a/third_party/chromium/media/gpu/vaapi/va_surface.h b/media/gpu/vaapi/va_surface.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/va_surface.h rename to media/gpu/vaapi/va_surface.h diff --git a/third_party/chromium/media/gpu/vaapi/va_x11.sigs b/media/gpu/vaapi/va_x11.sigs similarity index 100% rename from third_party/chromium/media/gpu/vaapi/va_x11.sigs rename to media/gpu/vaapi/va_x11.sigs diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_common.cc b/media/gpu/vaapi/vaapi_common.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_common.cc rename to media/gpu/vaapi/vaapi_common.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_common.h b/media/gpu/vaapi/vaapi_common.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_common.h rename to media/gpu/vaapi/vaapi_common.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc rename to media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.h b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.h rename to media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_image_decode_accelerator_worker.cc b/media/gpu/vaapi/vaapi_image_decode_accelerator_worker.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_image_decode_accelerator_worker.cc rename to media/gpu/vaapi/vaapi_image_decode_accelerator_worker.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_image_decode_accelerator_worker.h b/media/gpu/vaapi/vaapi_image_decode_accelerator_worker.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_image_decode_accelerator_worker.h rename to media/gpu/vaapi/vaapi_image_decode_accelerator_worker.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_image_decode_accelerator_worker_unittest.cc b/media/gpu/vaapi/vaapi_image_decode_accelerator_worker_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_image_decode_accelerator_worker_unittest.cc rename to media/gpu/vaapi/vaapi_image_decode_accelerator_worker_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_image_decoder.cc b/media/gpu/vaapi/vaapi_image_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_image_decoder.cc rename to media/gpu/vaapi/vaapi_image_decoder.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_image_decoder.h b/media/gpu/vaapi/vaapi_image_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_image_decoder.h rename to media/gpu/vaapi/vaapi_image_decoder.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_image_decoder_test_common.cc b/media/gpu/vaapi/vaapi_image_decoder_test_common.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_image_decoder_test_common.cc rename to media/gpu/vaapi/vaapi_image_decoder_test_common.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_image_decoder_test_common.h b/media/gpu/vaapi/vaapi_image_decoder_test_common.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_image_decoder_test_common.h rename to media/gpu/vaapi/vaapi_image_decoder_test_common.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_image_processor_backend.cc b/media/gpu/vaapi/vaapi_image_processor_backend.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_image_processor_backend.cc rename to media/gpu/vaapi/vaapi_image_processor_backend.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_image_processor_backend.h b/media/gpu/vaapi/vaapi_image_processor_backend.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_image_processor_backend.h rename to media/gpu/vaapi/vaapi_image_processor_backend.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_jpeg_decoder.cc b/media/gpu/vaapi/vaapi_jpeg_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_jpeg_decoder.cc rename to media/gpu/vaapi/vaapi_jpeg_decoder.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_jpeg_decoder.h b/media/gpu/vaapi/vaapi_jpeg_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_jpeg_decoder.h rename to media/gpu/vaapi/vaapi_jpeg_decoder.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc b/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc rename to media/gpu/vaapi/vaapi_jpeg_decoder_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc rename to media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.h b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.h rename to media/gpu/vaapi/vaapi_jpeg_encode_accelerator.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_jpeg_encoder.cc b/media/gpu/vaapi/vaapi_jpeg_encoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_jpeg_encoder.cc rename to media/gpu/vaapi/vaapi_jpeg_encoder.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_jpeg_encoder.h b/media/gpu/vaapi/vaapi_jpeg_encoder.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_jpeg_encoder.h rename to media/gpu/vaapi/vaapi_jpeg_encoder.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc rename to media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.h b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.h rename to media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture.cc b/media/gpu/vaapi/vaapi_picture.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture.cc rename to media/gpu/vaapi/vaapi_picture.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture.h b/media/gpu/vaapi/vaapi_picture.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture.h rename to media/gpu/vaapi/vaapi_picture.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_factory.cc b/media/gpu/vaapi/vaapi_picture_factory.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_factory.cc rename to media/gpu/vaapi/vaapi_picture_factory.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_factory.h b/media/gpu/vaapi/vaapi_picture_factory.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_factory.h rename to media/gpu/vaapi/vaapi_picture_factory.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap.cc rename to media/gpu/vaapi/vaapi_picture_native_pixmap.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap.h b/media/gpu/vaapi/vaapi_picture_native_pixmap.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap.h rename to media/gpu/vaapi/vaapi_picture_native_pixmap.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_angle.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap_angle.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_angle.cc rename to media/gpu/vaapi/vaapi_picture_native_pixmap_angle.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_angle.h b/media/gpu/vaapi/vaapi_picture_native_pixmap_angle.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_angle.h rename to media/gpu/vaapi/vaapi_picture_native_pixmap_angle.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.cc rename to media/gpu/vaapi/vaapi_picture_native_pixmap_egl.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h b/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h rename to media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc rename to media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h b/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h rename to media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_tfp.cc b/media/gpu/vaapi/vaapi_picture_tfp.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_tfp.cc rename to media/gpu/vaapi/vaapi_picture_tfp.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_picture_tfp.h b/media/gpu/vaapi/vaapi_picture_tfp.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_picture_tfp.h rename to media/gpu/vaapi/vaapi_picture_tfp.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_unittest.cc b/media/gpu/vaapi/vaapi_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_unittest.cc rename to media/gpu/vaapi/vaapi_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_utils.cc b/media/gpu/vaapi/vaapi_utils.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_utils.cc rename to media/gpu/vaapi/vaapi_utils.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_utils.h b/media/gpu/vaapi/vaapi_utils.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_utils.h rename to media/gpu/vaapi/vaapi_utils.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_utils_unittest.cc b/media/gpu/vaapi/vaapi_utils_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_utils_unittest.cc rename to media/gpu/vaapi/vaapi_utils_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_decode_accelerator.cc rename to media/gpu/vaapi/vaapi_video_decode_accelerator.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_decode_accelerator.h b/media/gpu/vaapi/vaapi_video_decode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_decode_accelerator.h rename to media/gpu/vaapi/vaapi_video_decode_accelerator.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc rename to media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_decoder.cc rename to media/gpu/vaapi/vaapi_video_decoder.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_decoder.h b/media/gpu/vaapi/vaapi_video_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_decoder.h rename to media/gpu/vaapi/vaapi_video_decoder.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/vaapi_video_decoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_decoder_delegate.cc rename to media/gpu/vaapi/vaapi_video_decoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_decoder_delegate.h b/media/gpu/vaapi/vaapi_video_decoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_decoder_delegate.h rename to media/gpu/vaapi/vaapi_video_decoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_encode_accelerator.cc rename to media/gpu/vaapi/vaapi_video_encode_accelerator.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_encode_accelerator.h b/media/gpu/vaapi/vaapi_video_encode_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_encode_accelerator.h rename to media/gpu/vaapi/vaapi_video_encode_accelerator.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc rename to media/gpu/vaapi/vaapi_video_encode_accelerator_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/vaapi_video_encoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_encoder_delegate.cc rename to media/gpu/vaapi/vaapi_video_encoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_video_encoder_delegate.h b/media/gpu/vaapi/vaapi_video_encoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_video_encoder_delegate.h rename to media/gpu/vaapi/vaapi_video_encoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_webp_decoder.cc b/media/gpu/vaapi/vaapi_webp_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_webp_decoder.cc rename to media/gpu/vaapi/vaapi_webp_decoder.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_webp_decoder.h b/media/gpu/vaapi/vaapi_webp_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_webp_decoder.h rename to media/gpu/vaapi/vaapi_webp_decoder.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_webp_decoder_unittest.cc b/media/gpu/vaapi/vaapi_webp_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_webp_decoder_unittest.cc rename to media/gpu/vaapi/vaapi_webp_decoder_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_wrapper.cc rename to media/gpu/vaapi/vaapi_wrapper.cc diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_wrapper.h rename to media/gpu/vaapi/vaapi_wrapper.h diff --git a/third_party/chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc b/media/gpu/vaapi/vaapi_wrapper_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vaapi_wrapper_unittest.cc rename to media/gpu/vaapi/vaapi_wrapper_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.cc rename to media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.h b/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.h rename to media/gpu/vaapi/vp8_vaapi_video_decoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc rename to media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.h b/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.h rename to media/gpu/vaapi/vp8_vaapi_video_encoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/vp9_rate_control.cc b/media/gpu/vaapi/vp9_rate_control.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_rate_control.cc rename to media/gpu/vaapi/vp9_rate_control.cc diff --git a/third_party/chromium/media/gpu/vaapi/vp9_rate_control.h b/media/gpu/vaapi/vp9_rate_control.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_rate_control.h rename to media/gpu/vaapi/vp9_rate_control.h diff --git a/third_party/chromium/media/gpu/vaapi/vp9_svc_layers.cc b/media/gpu/vaapi/vp9_svc_layers.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_svc_layers.cc rename to media/gpu/vaapi/vp9_svc_layers.cc diff --git a/third_party/chromium/media/gpu/vaapi/vp9_svc_layers.h b/media/gpu/vaapi/vp9_svc_layers.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_svc_layers.h rename to media/gpu/vaapi/vp9_svc_layers.h diff --git a/third_party/chromium/media/gpu/vaapi/vp9_svc_layers_unittest.cc b/media/gpu/vaapi/vp9_svc_layers_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_svc_layers_unittest.cc rename to media/gpu/vaapi/vp9_svc_layers_unittest.cc diff --git a/third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/vp9_vaapi_video_decoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_decoder_delegate.cc rename to media/gpu/vaapi/vp9_vaapi_video_decoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_decoder_delegate.h b/media/gpu/vaapi/vp9_vaapi_video_decoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_decoder_delegate.h rename to media/gpu/vaapi/vp9_vaapi_video_decoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc rename to media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.cc diff --git a/third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.h b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.h similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.h rename to media/gpu/vaapi/vp9_vaapi_video_encoder_delegate.h diff --git a/third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc rename to media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc diff --git a/third_party/chromium/media/gpu/video_decode_accelerator_perf_tests.cc b/media/gpu/video_decode_accelerator_perf_tests.cc similarity index 100% rename from third_party/chromium/media/gpu/video_decode_accelerator_perf_tests.cc rename to media/gpu/video_decode_accelerator_perf_tests.cc diff --git a/third_party/chromium/media/gpu/video_decode_accelerator_tests.cc b/media/gpu/video_decode_accelerator_tests.cc similarity index 100% rename from third_party/chromium/media/gpu/video_decode_accelerator_tests.cc rename to media/gpu/video_decode_accelerator_tests.cc diff --git a/third_party/chromium/media/gpu/video_encode_accelerator_perf_tests.cc b/media/gpu/video_encode_accelerator_perf_tests.cc similarity index 100% rename from third_party/chromium/media/gpu/video_encode_accelerator_perf_tests.cc rename to media/gpu/video_encode_accelerator_perf_tests.cc diff --git a/third_party/chromium/media/gpu/video_encode_accelerator_tests.cc b/media/gpu/video_encode_accelerator_tests.cc similarity index 100% rename from third_party/chromium/media/gpu/video_encode_accelerator_tests.cc rename to media/gpu/video_encode_accelerator_tests.cc diff --git a/third_party/chromium/media/gpu/video_frame_mapper.h b/media/gpu/video_frame_mapper.h similarity index 100% rename from third_party/chromium/media/gpu/video_frame_mapper.h rename to media/gpu/video_frame_mapper.h diff --git a/third_party/chromium/media/gpu/video_frame_mapper_factory.cc b/media/gpu/video_frame_mapper_factory.cc similarity index 100% rename from third_party/chromium/media/gpu/video_frame_mapper_factory.cc rename to media/gpu/video_frame_mapper_factory.cc diff --git a/third_party/chromium/media/gpu/video_frame_mapper_factory.h b/media/gpu/video_frame_mapper_factory.h similarity index 100% rename from third_party/chromium/media/gpu/video_frame_mapper_factory.h rename to media/gpu/video_frame_mapper_factory.h diff --git a/third_party/chromium/media/gpu/vp8_decoder.cc b/media/gpu/vp8_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vp8_decoder.cc rename to media/gpu/vp8_decoder.cc diff --git a/third_party/chromium/media/gpu/vp8_decoder.h b/media/gpu/vp8_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/vp8_decoder.h rename to media/gpu/vp8_decoder.h diff --git a/third_party/chromium/media/gpu/vp8_decoder_unittest.cc b/media/gpu/vp8_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/vp8_decoder_unittest.cc rename to media/gpu/vp8_decoder_unittest.cc diff --git a/third_party/chromium/media/gpu/vp8_picture.cc b/media/gpu/vp8_picture.cc similarity index 100% rename from third_party/chromium/media/gpu/vp8_picture.cc rename to media/gpu/vp8_picture.cc diff --git a/third_party/chromium/media/gpu/vp8_picture.h b/media/gpu/vp8_picture.h similarity index 100% rename from third_party/chromium/media/gpu/vp8_picture.h rename to media/gpu/vp8_picture.h diff --git a/third_party/chromium/media/gpu/vp8_reference_frame_vector.cc b/media/gpu/vp8_reference_frame_vector.cc similarity index 100% rename from third_party/chromium/media/gpu/vp8_reference_frame_vector.cc rename to media/gpu/vp8_reference_frame_vector.cc diff --git a/third_party/chromium/media/gpu/vp8_reference_frame_vector.h b/media/gpu/vp8_reference_frame_vector.h similarity index 100% rename from third_party/chromium/media/gpu/vp8_reference_frame_vector.h rename to media/gpu/vp8_reference_frame_vector.h diff --git a/third_party/chromium/media/gpu/vp9_decoder.cc b/media/gpu/vp9_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/vp9_decoder.cc rename to media/gpu/vp9_decoder.cc diff --git a/third_party/chromium/media/gpu/vp9_decoder.h b/media/gpu/vp9_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/vp9_decoder.h rename to media/gpu/vp9_decoder.h diff --git a/third_party/chromium/media/gpu/vp9_picture.cc b/media/gpu/vp9_picture.cc similarity index 100% rename from third_party/chromium/media/gpu/vp9_picture.cc rename to media/gpu/vp9_picture.cc diff --git a/third_party/chromium/media/gpu/vp9_picture.h b/media/gpu/vp9_picture.h similarity index 100% rename from third_party/chromium/media/gpu/vp9_picture.h rename to media/gpu/vp9_picture.h diff --git a/third_party/chromium/media/gpu/vp9_reference_frame_vector.cc b/media/gpu/vp9_reference_frame_vector.cc similarity index 100% rename from third_party/chromium/media/gpu/vp9_reference_frame_vector.cc rename to media/gpu/vp9_reference_frame_vector.cc diff --git a/third_party/chromium/media/gpu/vp9_reference_frame_vector.h b/media/gpu/vp9_reference_frame_vector.h similarity index 100% rename from third_party/chromium/media/gpu/vp9_reference_frame_vector.h rename to media/gpu/vp9_reference_frame_vector.h diff --git a/third_party/chromium/media/gpu/windows/av1_guids.h b/media/gpu/windows/av1_guids.h similarity index 100% rename from third_party/chromium/media/gpu/windows/av1_guids.h rename to media/gpu/windows/av1_guids.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_av1_accelerator.cc b/media/gpu/windows/d3d11_av1_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_av1_accelerator.cc rename to media/gpu/windows/d3d11_av1_accelerator.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_av1_accelerator.h b/media/gpu/windows/d3d11_av1_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_av1_accelerator.h rename to media/gpu/windows/d3d11_av1_accelerator.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_com_defs.h b/media/gpu/windows/d3d11_com_defs.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_com_defs.h rename to media/gpu/windows/d3d11_com_defs.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_copying_texture_wrapper.cc b/media/gpu/windows/d3d11_copying_texture_wrapper.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_copying_texture_wrapper.cc rename to media/gpu/windows/d3d11_copying_texture_wrapper.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_copying_texture_wrapper.h b/media/gpu/windows/d3d11_copying_texture_wrapper.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_copying_texture_wrapper.h rename to media/gpu/windows/d3d11_copying_texture_wrapper.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_copying_texture_wrapper_unittest.cc b/media/gpu/windows/d3d11_copying_texture_wrapper_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_copying_texture_wrapper_unittest.cc rename to media/gpu/windows/d3d11_copying_texture_wrapper_unittest.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_decoder_configurator.cc b/media/gpu/windows/d3d11_decoder_configurator.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_decoder_configurator.cc rename to media/gpu/windows/d3d11_decoder_configurator.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_decoder_configurator.h b/media/gpu/windows/d3d11_decoder_configurator.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_decoder_configurator.h rename to media/gpu/windows/d3d11_decoder_configurator.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_decoder_configurator_unittest.cc b/media/gpu/windows/d3d11_decoder_configurator_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_decoder_configurator_unittest.cc rename to media/gpu/windows/d3d11_decoder_configurator_unittest.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_h264_accelerator.cc b/media/gpu/windows/d3d11_h264_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_h264_accelerator.cc rename to media/gpu/windows/d3d11_h264_accelerator.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_h264_accelerator.h b/media/gpu/windows/d3d11_h264_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_h264_accelerator.h rename to media/gpu/windows/d3d11_h264_accelerator.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_picture_buffer.cc b/media/gpu/windows/d3d11_picture_buffer.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_picture_buffer.cc rename to media/gpu/windows/d3d11_picture_buffer.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_picture_buffer.h b/media/gpu/windows/d3d11_picture_buffer.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_picture_buffer.h rename to media/gpu/windows/d3d11_picture_buffer.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_picture_buffer_unittest.cc b/media/gpu/windows/d3d11_picture_buffer_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_picture_buffer_unittest.cc rename to media/gpu/windows/d3d11_picture_buffer_unittest.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_texture_selector.cc b/media/gpu/windows/d3d11_texture_selector.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_texture_selector.cc rename to media/gpu/windows/d3d11_texture_selector.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_texture_selector.h b/media/gpu/windows/d3d11_texture_selector.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_texture_selector.h rename to media/gpu/windows/d3d11_texture_selector.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_texture_selector_unittest.cc b/media/gpu/windows/d3d11_texture_selector_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_texture_selector_unittest.cc rename to media/gpu/windows/d3d11_texture_selector_unittest.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_texture_wrapper.cc b/media/gpu/windows/d3d11_texture_wrapper.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_texture_wrapper.cc rename to media/gpu/windows/d3d11_texture_wrapper.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_texture_wrapper.h b/media/gpu/windows/d3d11_texture_wrapper.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_texture_wrapper.h rename to media/gpu/windows/d3d11_texture_wrapper.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_texture_wrapper_unittest.cc b/media/gpu/windows/d3d11_texture_wrapper_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_texture_wrapper_unittest.cc rename to media/gpu/windows/d3d11_texture_wrapper_unittest.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_context_wrapper.cc b/media/gpu/windows/d3d11_video_context_wrapper.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_context_wrapper.cc rename to media/gpu/windows/d3d11_video_context_wrapper.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_context_wrapper.h b/media/gpu/windows/d3d11_video_context_wrapper.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_context_wrapper.h rename to media/gpu/windows/d3d11_video_context_wrapper.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_decoder.cc rename to media/gpu/windows/d3d11_video_decoder.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_decoder.h b/media/gpu/windows/d3d11_video_decoder.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_decoder.h rename to media/gpu/windows/d3d11_video_decoder.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_decoder_client.h b/media/gpu/windows/d3d11_video_decoder_client.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_decoder_client.h rename to media/gpu/windows/d3d11_video_decoder_client.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_decoder_impl.cc b/media/gpu/windows/d3d11_video_decoder_impl.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_decoder_impl.cc rename to media/gpu/windows/d3d11_video_decoder_impl.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_decoder_impl.h b/media/gpu/windows/d3d11_video_decoder_impl.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_decoder_impl.h rename to media/gpu/windows/d3d11_video_decoder_impl.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_decoder_unittest.cc b/media/gpu/windows/d3d11_video_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_decoder_unittest.cc rename to media/gpu/windows/d3d11_video_decoder_unittest.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_device_format_support.cc b/media/gpu/windows/d3d11_video_device_format_support.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_device_format_support.cc rename to media/gpu/windows/d3d11_video_device_format_support.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_device_format_support.h b/media/gpu/windows/d3d11_video_device_format_support.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_device_format_support.h rename to media/gpu/windows/d3d11_video_device_format_support.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_device_format_support_unittest.cc b/media/gpu/windows/d3d11_video_device_format_support_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_device_format_support_unittest.cc rename to media/gpu/windows/d3d11_video_device_format_support_unittest.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_processor_proxy.cc b/media/gpu/windows/d3d11_video_processor_proxy.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_processor_proxy.cc rename to media/gpu/windows/d3d11_video_processor_proxy.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_processor_proxy.h b/media/gpu/windows/d3d11_video_processor_proxy.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_processor_proxy.h rename to media/gpu/windows/d3d11_video_processor_proxy.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_video_processor_proxy_unittest.cc b/media/gpu/windows/d3d11_video_processor_proxy_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_video_processor_proxy_unittest.cc rename to media/gpu/windows/d3d11_video_processor_proxy_unittest.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_vp9_accelerator.cc b/media/gpu/windows/d3d11_vp9_accelerator.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_vp9_accelerator.cc rename to media/gpu/windows/d3d11_vp9_accelerator.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_vp9_accelerator.h b/media/gpu/windows/d3d11_vp9_accelerator.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_vp9_accelerator.h rename to media/gpu/windows/d3d11_vp9_accelerator.h diff --git a/third_party/chromium/media/gpu/windows/d3d11_vp9_picture.cc b/media/gpu/windows/d3d11_vp9_picture.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_vp9_picture.cc rename to media/gpu/windows/d3d11_vp9_picture.cc diff --git a/third_party/chromium/media/gpu/windows/d3d11_vp9_picture.h b/media/gpu/windows/d3d11_vp9_picture.h similarity index 100% rename from third_party/chromium/media/gpu/windows/d3d11_vp9_picture.h rename to media/gpu/windows/d3d11_vp9_picture.h diff --git a/third_party/chromium/media/gpu/windows/dxva_picture_buffer_win.cc b/media/gpu/windows/dxva_picture_buffer_win.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/dxva_picture_buffer_win.cc rename to media/gpu/windows/dxva_picture_buffer_win.cc diff --git a/third_party/chromium/media/gpu/windows/dxva_picture_buffer_win.h b/media/gpu/windows/dxva_picture_buffer_win.h similarity index 100% rename from third_party/chromium/media/gpu/windows/dxva_picture_buffer_win.h rename to media/gpu/windows/dxva_picture_buffer_win.h diff --git a/third_party/chromium/media/gpu/windows/dxva_video_decode_accelerator_win.cc b/media/gpu/windows/dxva_video_decode_accelerator_win.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/dxva_video_decode_accelerator_win.cc rename to media/gpu/windows/dxva_video_decode_accelerator_win.cc diff --git a/third_party/chromium/media/gpu/windows/dxva_video_decode_accelerator_win.h b/media/gpu/windows/dxva_video_decode_accelerator_win.h similarity index 100% rename from third_party/chromium/media/gpu/windows/dxva_video_decode_accelerator_win.h rename to media/gpu/windows/dxva_video_decode_accelerator_win.h diff --git a/third_party/chromium/media/gpu/windows/hresult_status_debug_device.cc b/media/gpu/windows/hresult_status_debug_device.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/hresult_status_debug_device.cc rename to media/gpu/windows/hresult_status_debug_device.cc diff --git a/third_party/chromium/media/gpu/windows/hresult_status_debug_device.h b/media/gpu/windows/hresult_status_debug_device.h similarity index 100% rename from third_party/chromium/media/gpu/windows/hresult_status_debug_device.h rename to media/gpu/windows/hresult_status_debug_device.h diff --git a/third_party/chromium/media/gpu/windows/init_guid.cc b/media/gpu/windows/init_guid.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/init_guid.cc rename to media/gpu/windows/init_guid.cc diff --git a/third_party/chromium/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc rename to media/gpu/windows/media_foundation_video_encode_accelerator_win.cc diff --git a/third_party/chromium/media/gpu/windows/media_foundation_video_encode_accelerator_win.h b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h similarity index 100% rename from third_party/chromium/media/gpu/windows/media_foundation_video_encode_accelerator_win.h rename to media/gpu/windows/media_foundation_video_encode_accelerator_win.h diff --git a/third_party/chromium/media/gpu/windows/output_with_release_mailbox_cb.h b/media/gpu/windows/output_with_release_mailbox_cb.h similarity index 100% rename from third_party/chromium/media/gpu/windows/output_with_release_mailbox_cb.h rename to media/gpu/windows/output_with_release_mailbox_cb.h diff --git a/third_party/chromium/media/gpu/windows/supported_profile_helpers.cc b/media/gpu/windows/supported_profile_helpers.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/supported_profile_helpers.cc rename to media/gpu/windows/supported_profile_helpers.cc diff --git a/third_party/chromium/media/gpu/windows/supported_profile_helpers.h b/media/gpu/windows/supported_profile_helpers.h similarity index 100% rename from third_party/chromium/media/gpu/windows/supported_profile_helpers.h rename to media/gpu/windows/supported_profile_helpers.h diff --git a/third_party/chromium/media/gpu/windows/supported_profile_helpers_unittest.cc b/media/gpu/windows/supported_profile_helpers_unittest.cc similarity index 100% rename from third_party/chromium/media/gpu/windows/supported_profile_helpers_unittest.cc rename to media/gpu/windows/supported_profile_helpers_unittest.cc diff --git a/third_party/chromium/media/learning/BUILD.gn b/media/learning/BUILD.gn similarity index 100% rename from third_party/chromium/media/learning/BUILD.gn rename to media/learning/BUILD.gn diff --git a/third_party/chromium/media/learning/README.md b/media/learning/README.md similarity index 100% rename from third_party/chromium/media/learning/README.md rename to media/learning/README.md diff --git a/third_party/chromium/media/learning/common/BUILD.gn b/media/learning/common/BUILD.gn similarity index 100% rename from third_party/chromium/media/learning/common/BUILD.gn rename to media/learning/common/BUILD.gn diff --git a/third_party/chromium/media/learning/common/DEPS b/media/learning/common/DEPS similarity index 100% rename from third_party/chromium/media/learning/common/DEPS rename to media/learning/common/DEPS diff --git a/third_party/chromium/media/learning/common/feature_dictionary.cc b/media/learning/common/feature_dictionary.cc similarity index 100% rename from third_party/chromium/media/learning/common/feature_dictionary.cc rename to media/learning/common/feature_dictionary.cc diff --git a/third_party/chromium/media/learning/common/feature_dictionary.h b/media/learning/common/feature_dictionary.h similarity index 100% rename from third_party/chromium/media/learning/common/feature_dictionary.h rename to media/learning/common/feature_dictionary.h diff --git a/third_party/chromium/media/learning/common/feature_dictionary_unittest.cc b/media/learning/common/feature_dictionary_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/common/feature_dictionary_unittest.cc rename to media/learning/common/feature_dictionary_unittest.cc diff --git a/third_party/chromium/media/learning/common/feature_library.cc b/media/learning/common/feature_library.cc similarity index 100% rename from third_party/chromium/media/learning/common/feature_library.cc rename to media/learning/common/feature_library.cc diff --git a/third_party/chromium/media/learning/common/feature_library.h b/media/learning/common/feature_library.h similarity index 100% rename from third_party/chromium/media/learning/common/feature_library.h rename to media/learning/common/feature_library.h diff --git a/third_party/chromium/media/learning/common/labelled_example.cc b/media/learning/common/labelled_example.cc similarity index 100% rename from third_party/chromium/media/learning/common/labelled_example.cc rename to media/learning/common/labelled_example.cc diff --git a/third_party/chromium/media/learning/common/labelled_example.h b/media/learning/common/labelled_example.h similarity index 100% rename from third_party/chromium/media/learning/common/labelled_example.h rename to media/learning/common/labelled_example.h diff --git a/third_party/chromium/media/learning/common/labelled_example_unittest.cc b/media/learning/common/labelled_example_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/common/labelled_example_unittest.cc rename to media/learning/common/labelled_example_unittest.cc diff --git a/third_party/chromium/media/learning/common/learning_session.cc b/media/learning/common/learning_session.cc similarity index 100% rename from third_party/chromium/media/learning/common/learning_session.cc rename to media/learning/common/learning_session.cc diff --git a/third_party/chromium/media/learning/common/learning_session.h b/media/learning/common/learning_session.h similarity index 100% rename from third_party/chromium/media/learning/common/learning_session.h rename to media/learning/common/learning_session.h diff --git a/third_party/chromium/media/learning/common/learning_task.cc b/media/learning/common/learning_task.cc similarity index 100% rename from third_party/chromium/media/learning/common/learning_task.cc rename to media/learning/common/learning_task.cc diff --git a/third_party/chromium/media/learning/common/learning_task.h b/media/learning/common/learning_task.h similarity index 100% rename from third_party/chromium/media/learning/common/learning_task.h rename to media/learning/common/learning_task.h diff --git a/third_party/chromium/media/learning/common/learning_task_controller.h b/media/learning/common/learning_task_controller.h similarity index 100% rename from third_party/chromium/media/learning/common/learning_task_controller.h rename to media/learning/common/learning_task_controller.h diff --git a/third_party/chromium/media/learning/common/media_learning_tasks.cc b/media/learning/common/media_learning_tasks.cc similarity index 100% rename from third_party/chromium/media/learning/common/media_learning_tasks.cc rename to media/learning/common/media_learning_tasks.cc diff --git a/third_party/chromium/media/learning/common/media_learning_tasks.h b/media/learning/common/media_learning_tasks.h similarity index 100% rename from third_party/chromium/media/learning/common/media_learning_tasks.h rename to media/learning/common/media_learning_tasks.h diff --git a/third_party/chromium/media/learning/common/media_learning_tasks_unittest.cc b/media/learning/common/media_learning_tasks_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/common/media_learning_tasks_unittest.cc rename to media/learning/common/media_learning_tasks_unittest.cc diff --git a/third_party/chromium/media/learning/common/target_histogram.cc b/media/learning/common/target_histogram.cc similarity index 100% rename from third_party/chromium/media/learning/common/target_histogram.cc rename to media/learning/common/target_histogram.cc diff --git a/third_party/chromium/media/learning/common/target_histogram.h b/media/learning/common/target_histogram.h similarity index 100% rename from third_party/chromium/media/learning/common/target_histogram.h rename to media/learning/common/target_histogram.h diff --git a/third_party/chromium/media/learning/common/target_histogram_unittest.cc b/media/learning/common/target_histogram_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/common/target_histogram_unittest.cc rename to media/learning/common/target_histogram_unittest.cc diff --git a/third_party/chromium/media/learning/common/value.cc b/media/learning/common/value.cc similarity index 100% rename from third_party/chromium/media/learning/common/value.cc rename to media/learning/common/value.cc diff --git a/third_party/chromium/media/learning/common/value.h b/media/learning/common/value.h similarity index 100% rename from third_party/chromium/media/learning/common/value.h rename to media/learning/common/value.h diff --git a/third_party/chromium/media/learning/common/value_unittest.cc b/media/learning/common/value_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/common/value_unittest.cc rename to media/learning/common/value_unittest.cc diff --git a/third_party/chromium/media/learning/impl/BUILD.gn b/media/learning/impl/BUILD.gn similarity index 100% rename from third_party/chromium/media/learning/impl/BUILD.gn rename to media/learning/impl/BUILD.gn diff --git a/third_party/chromium/media/learning/impl/DEPS b/media/learning/impl/DEPS similarity index 100% rename from third_party/chromium/media/learning/impl/DEPS rename to media/learning/impl/DEPS diff --git a/third_party/chromium/media/learning/impl/distribution_reporter.cc b/media/learning/impl/distribution_reporter.cc similarity index 100% rename from third_party/chromium/media/learning/impl/distribution_reporter.cc rename to media/learning/impl/distribution_reporter.cc diff --git a/third_party/chromium/media/learning/impl/distribution_reporter.h b/media/learning/impl/distribution_reporter.h similarity index 100% rename from third_party/chromium/media/learning/impl/distribution_reporter.h rename to media/learning/impl/distribution_reporter.h diff --git a/third_party/chromium/media/learning/impl/distribution_reporter_unittest.cc b/media/learning/impl/distribution_reporter_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/distribution_reporter_unittest.cc rename to media/learning/impl/distribution_reporter_unittest.cc diff --git a/third_party/chromium/media/learning/impl/extra_trees_trainer.cc b/media/learning/impl/extra_trees_trainer.cc similarity index 100% rename from third_party/chromium/media/learning/impl/extra_trees_trainer.cc rename to media/learning/impl/extra_trees_trainer.cc diff --git a/third_party/chromium/media/learning/impl/extra_trees_trainer.h b/media/learning/impl/extra_trees_trainer.h similarity index 100% rename from third_party/chromium/media/learning/impl/extra_trees_trainer.h rename to media/learning/impl/extra_trees_trainer.h diff --git a/third_party/chromium/media/learning/impl/extra_trees_trainer_unittest.cc b/media/learning/impl/extra_trees_trainer_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/extra_trees_trainer_unittest.cc rename to media/learning/impl/extra_trees_trainer_unittest.cc diff --git a/third_party/chromium/media/learning/impl/feature_provider.cc b/media/learning/impl/feature_provider.cc similarity index 100% rename from third_party/chromium/media/learning/impl/feature_provider.cc rename to media/learning/impl/feature_provider.cc diff --git a/third_party/chromium/media/learning/impl/feature_provider.h b/media/learning/impl/feature_provider.h similarity index 100% rename from third_party/chromium/media/learning/impl/feature_provider.h rename to media/learning/impl/feature_provider.h diff --git a/third_party/chromium/media/learning/impl/fisher_iris_dataset.cc b/media/learning/impl/fisher_iris_dataset.cc similarity index 100% rename from third_party/chromium/media/learning/impl/fisher_iris_dataset.cc rename to media/learning/impl/fisher_iris_dataset.cc diff --git a/third_party/chromium/media/learning/impl/fisher_iris_dataset.h b/media/learning/impl/fisher_iris_dataset.h similarity index 100% rename from third_party/chromium/media/learning/impl/fisher_iris_dataset.h rename to media/learning/impl/fisher_iris_dataset.h diff --git a/third_party/chromium/media/learning/impl/learning_fuzzertest.cc b/media/learning/impl/learning_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/learning_fuzzertest.cc rename to media/learning/impl/learning_fuzzertest.cc diff --git a/third_party/chromium/media/learning/impl/learning_session_impl.cc b/media/learning/impl/learning_session_impl.cc similarity index 100% rename from third_party/chromium/media/learning/impl/learning_session_impl.cc rename to media/learning/impl/learning_session_impl.cc diff --git a/third_party/chromium/media/learning/impl/learning_session_impl.h b/media/learning/impl/learning_session_impl.h similarity index 100% rename from third_party/chromium/media/learning/impl/learning_session_impl.h rename to media/learning/impl/learning_session_impl.h diff --git a/third_party/chromium/media/learning/impl/learning_session_impl_unittest.cc b/media/learning/impl/learning_session_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/learning_session_impl_unittest.cc rename to media/learning/impl/learning_session_impl_unittest.cc diff --git a/third_party/chromium/media/learning/impl/learning_task_controller_helper.cc b/media/learning/impl/learning_task_controller_helper.cc similarity index 100% rename from third_party/chromium/media/learning/impl/learning_task_controller_helper.cc rename to media/learning/impl/learning_task_controller_helper.cc diff --git a/third_party/chromium/media/learning/impl/learning_task_controller_helper.h b/media/learning/impl/learning_task_controller_helper.h similarity index 100% rename from third_party/chromium/media/learning/impl/learning_task_controller_helper.h rename to media/learning/impl/learning_task_controller_helper.h diff --git a/third_party/chromium/media/learning/impl/learning_task_controller_helper_unittest.cc b/media/learning/impl/learning_task_controller_helper_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/learning_task_controller_helper_unittest.cc rename to media/learning/impl/learning_task_controller_helper_unittest.cc diff --git a/third_party/chromium/media/learning/impl/learning_task_controller_impl.cc b/media/learning/impl/learning_task_controller_impl.cc similarity index 100% rename from third_party/chromium/media/learning/impl/learning_task_controller_impl.cc rename to media/learning/impl/learning_task_controller_impl.cc diff --git a/third_party/chromium/media/learning/impl/learning_task_controller_impl.h b/media/learning/impl/learning_task_controller_impl.h similarity index 100% rename from third_party/chromium/media/learning/impl/learning_task_controller_impl.h rename to media/learning/impl/learning_task_controller_impl.h diff --git a/third_party/chromium/media/learning/impl/learning_task_controller_impl_unittest.cc b/media/learning/impl/learning_task_controller_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/learning_task_controller_impl_unittest.cc rename to media/learning/impl/learning_task_controller_impl_unittest.cc diff --git a/third_party/chromium/media/learning/impl/lookup_table_trainer.cc b/media/learning/impl/lookup_table_trainer.cc similarity index 100% rename from third_party/chromium/media/learning/impl/lookup_table_trainer.cc rename to media/learning/impl/lookup_table_trainer.cc diff --git a/third_party/chromium/media/learning/impl/lookup_table_trainer.h b/media/learning/impl/lookup_table_trainer.h similarity index 100% rename from third_party/chromium/media/learning/impl/lookup_table_trainer.h rename to media/learning/impl/lookup_table_trainer.h diff --git a/third_party/chromium/media/learning/impl/lookup_table_trainer_unittest.cc b/media/learning/impl/lookup_table_trainer_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/lookup_table_trainer_unittest.cc rename to media/learning/impl/lookup_table_trainer_unittest.cc diff --git a/third_party/chromium/media/learning/impl/model.h b/media/learning/impl/model.h similarity index 100% rename from third_party/chromium/media/learning/impl/model.h rename to media/learning/impl/model.h diff --git a/third_party/chromium/media/learning/impl/one_hot.cc b/media/learning/impl/one_hot.cc similarity index 100% rename from third_party/chromium/media/learning/impl/one_hot.cc rename to media/learning/impl/one_hot.cc diff --git a/third_party/chromium/media/learning/impl/one_hot.h b/media/learning/impl/one_hot.h similarity index 100% rename from third_party/chromium/media/learning/impl/one_hot.h rename to media/learning/impl/one_hot.h diff --git a/third_party/chromium/media/learning/impl/one_hot_unittest.cc b/media/learning/impl/one_hot_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/one_hot_unittest.cc rename to media/learning/impl/one_hot_unittest.cc diff --git a/third_party/chromium/media/learning/impl/random_number_generator.cc b/media/learning/impl/random_number_generator.cc similarity index 100% rename from third_party/chromium/media/learning/impl/random_number_generator.cc rename to media/learning/impl/random_number_generator.cc diff --git a/third_party/chromium/media/learning/impl/random_number_generator.h b/media/learning/impl/random_number_generator.h similarity index 100% rename from third_party/chromium/media/learning/impl/random_number_generator.h rename to media/learning/impl/random_number_generator.h diff --git a/third_party/chromium/media/learning/impl/random_number_generator_unittest.cc b/media/learning/impl/random_number_generator_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/random_number_generator_unittest.cc rename to media/learning/impl/random_number_generator_unittest.cc diff --git a/third_party/chromium/media/learning/impl/random_tree_trainer.cc b/media/learning/impl/random_tree_trainer.cc similarity index 100% rename from third_party/chromium/media/learning/impl/random_tree_trainer.cc rename to media/learning/impl/random_tree_trainer.cc diff --git a/third_party/chromium/media/learning/impl/random_tree_trainer.h b/media/learning/impl/random_tree_trainer.h similarity index 100% rename from third_party/chromium/media/learning/impl/random_tree_trainer.h rename to media/learning/impl/random_tree_trainer.h diff --git a/third_party/chromium/media/learning/impl/random_tree_trainer_unittest.cc b/media/learning/impl/random_tree_trainer_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/impl/random_tree_trainer_unittest.cc rename to media/learning/impl/random_tree_trainer_unittest.cc diff --git a/third_party/chromium/media/learning/impl/test_random_number_generator.cc b/media/learning/impl/test_random_number_generator.cc similarity index 100% rename from third_party/chromium/media/learning/impl/test_random_number_generator.cc rename to media/learning/impl/test_random_number_generator.cc diff --git a/third_party/chromium/media/learning/impl/test_random_number_generator.h b/media/learning/impl/test_random_number_generator.h similarity index 100% rename from third_party/chromium/media/learning/impl/test_random_number_generator.h rename to media/learning/impl/test_random_number_generator.h diff --git a/third_party/chromium/media/learning/impl/training_algorithm.h b/media/learning/impl/training_algorithm.h similarity index 100% rename from third_party/chromium/media/learning/impl/training_algorithm.h rename to media/learning/impl/training_algorithm.h diff --git a/third_party/chromium/media/learning/impl/voting_ensemble.cc b/media/learning/impl/voting_ensemble.cc similarity index 100% rename from third_party/chromium/media/learning/impl/voting_ensemble.cc rename to media/learning/impl/voting_ensemble.cc diff --git a/third_party/chromium/media/learning/impl/voting_ensemble.h b/media/learning/impl/voting_ensemble.h similarity index 100% rename from third_party/chromium/media/learning/impl/voting_ensemble.h rename to media/learning/impl/voting_ensemble.h diff --git a/third_party/chromium/media/learning/mojo/BUILD.gn b/media/learning/mojo/BUILD.gn similarity index 100% rename from third_party/chromium/media/learning/mojo/BUILD.gn rename to media/learning/mojo/BUILD.gn diff --git a/third_party/chromium/media/learning/mojo/DEPS b/media/learning/mojo/DEPS similarity index 100% rename from third_party/chromium/media/learning/mojo/DEPS rename to media/learning/mojo/DEPS diff --git a/third_party/chromium/media/learning/mojo/mojo_learning_task_controller_service.cc b/media/learning/mojo/mojo_learning_task_controller_service.cc similarity index 100% rename from third_party/chromium/media/learning/mojo/mojo_learning_task_controller_service.cc rename to media/learning/mojo/mojo_learning_task_controller_service.cc diff --git a/third_party/chromium/media/learning/mojo/mojo_learning_task_controller_service.h b/media/learning/mojo/mojo_learning_task_controller_service.h similarity index 100% rename from third_party/chromium/media/learning/mojo/mojo_learning_task_controller_service.h rename to media/learning/mojo/mojo_learning_task_controller_service.h diff --git a/third_party/chromium/media/learning/mojo/mojo_learning_task_controller_service_unittest.cc b/media/learning/mojo/mojo_learning_task_controller_service_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/mojo/mojo_learning_task_controller_service_unittest.cc rename to media/learning/mojo/mojo_learning_task_controller_service_unittest.cc diff --git a/third_party/chromium/media/learning/mojo/public/cpp/BUILD.gn b/media/learning/mojo/public/cpp/BUILD.gn similarity index 100% rename from third_party/chromium/media/learning/mojo/public/cpp/BUILD.gn rename to media/learning/mojo/public/cpp/BUILD.gn diff --git a/third_party/chromium/media/learning/mojo/public/cpp/OWNERS b/media/learning/mojo/public/cpp/OWNERS similarity index 100% rename from third_party/chromium/media/learning/mojo/public/cpp/OWNERS rename to media/learning/mojo/public/cpp/OWNERS diff --git a/third_party/chromium/media/learning/mojo/public/cpp/learning_mojom_traits.cc b/media/learning/mojo/public/cpp/learning_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/learning/mojo/public/cpp/learning_mojom_traits.cc rename to media/learning/mojo/public/cpp/learning_mojom_traits.cc diff --git a/third_party/chromium/media/learning/mojo/public/cpp/learning_mojom_traits.h b/media/learning/mojo/public/cpp/learning_mojom_traits.h similarity index 100% rename from third_party/chromium/media/learning/mojo/public/cpp/learning_mojom_traits.h rename to media/learning/mojo/public/cpp/learning_mojom_traits.h diff --git a/third_party/chromium/media/learning/mojo/public/cpp/mojo_learning_task_controller.cc b/media/learning/mojo/public/cpp/mojo_learning_task_controller.cc similarity index 100% rename from third_party/chromium/media/learning/mojo/public/cpp/mojo_learning_task_controller.cc rename to media/learning/mojo/public/cpp/mojo_learning_task_controller.cc diff --git a/third_party/chromium/media/learning/mojo/public/cpp/mojo_learning_task_controller.h b/media/learning/mojo/public/cpp/mojo_learning_task_controller.h similarity index 100% rename from third_party/chromium/media/learning/mojo/public/cpp/mojo_learning_task_controller.h rename to media/learning/mojo/public/cpp/mojo_learning_task_controller.h diff --git a/third_party/chromium/media/learning/mojo/public/cpp/mojo_learning_task_controller_unittest.cc b/media/learning/mojo/public/cpp/mojo_learning_task_controller_unittest.cc similarity index 100% rename from third_party/chromium/media/learning/mojo/public/cpp/mojo_learning_task_controller_unittest.cc rename to media/learning/mojo/public/cpp/mojo_learning_task_controller_unittest.cc diff --git a/third_party/chromium/media/learning/mojo/public/mojom/BUILD.gn b/media/learning/mojo/public/mojom/BUILD.gn similarity index 100% rename from third_party/chromium/media/learning/mojo/public/mojom/BUILD.gn rename to media/learning/mojo/public/mojom/BUILD.gn diff --git a/third_party/chromium/media/learning/mojo/public/mojom/OWNERS b/media/learning/mojo/public/mojom/OWNERS similarity index 100% rename from third_party/chromium/media/learning/mojo/public/mojom/OWNERS rename to media/learning/mojo/public/mojom/OWNERS diff --git a/third_party/chromium/media/learning/mojo/public/mojom/learning_task_controller.mojom b/media/learning/mojo/public/mojom/learning_task_controller.mojom similarity index 100% rename from third_party/chromium/media/learning/mojo/public/mojom/learning_task_controller.mojom rename to media/learning/mojo/public/mojom/learning_task_controller.mojom diff --git a/third_party/chromium/media/learning/mojo/public/mojom/learning_types.mojom b/media/learning/mojo/public/mojom/learning_types.mojom similarity index 100% rename from third_party/chromium/media/learning/mojo/public/mojom/learning_types.mojom rename to media/learning/mojo/public/mojom/learning_types.mojom diff --git a/third_party/chromium/media/media_buildflags.h b/media/media_buildflags.h similarity index 100% rename from third_party/chromium/media/media_buildflags.h rename to media/media_buildflags.h diff --git a/third_party/chromium/media/media_options.gni b/media/media_options.gni similarity index 100% rename from third_party/chromium/media/media_options.gni rename to media/media_options.gni diff --git a/third_party/chromium/media/midi/BUILD.gn b/media/midi/BUILD.gn similarity index 100% rename from third_party/chromium/media/midi/BUILD.gn rename to media/midi/BUILD.gn diff --git a/third_party/chromium/media/midi/DIR_METADATA b/media/midi/DIR_METADATA similarity index 100% rename from third_party/chromium/media/midi/DIR_METADATA rename to media/midi/DIR_METADATA diff --git a/third_party/chromium/media/midi/OWNERS b/media/midi/OWNERS similarity index 100% rename from third_party/chromium/media/midi/OWNERS rename to media/midi/OWNERS diff --git a/third_party/chromium/media/midi/fuzz/corpus/broken_data_1 b/media/midi/fuzz/corpus/broken_data_1 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/broken_data_1 rename to media/midi/fuzz/corpus/broken_data_1 diff --git a/third_party/chromium/media/midi/fuzz/corpus/broken_data_2 b/media/midi/fuzz/corpus/broken_data_2 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/broken_data_2 rename to media/midi/fuzz/corpus/broken_data_2 diff --git a/third_party/chromium/media/midi/fuzz/corpus/broken_data_3 b/media/midi/fuzz/corpus/broken_data_3 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/broken_data_3 rename to media/midi/fuzz/corpus/broken_data_3 diff --git a/third_party/chromium/media/midi/fuzz/corpus/channel_pressure b/media/midi/fuzz/corpus/channel_pressure similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/channel_pressure rename to media/midi/fuzz/corpus/channel_pressure diff --git a/third_party/chromium/media/midi/fuzz/corpus/channel_pressure_with_running_status b/media/midi/fuzz/corpus/channel_pressure_with_running_status similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/channel_pressure_with_running_status rename to media/midi/fuzz/corpus/channel_pressure_with_running_status diff --git a/third_party/chromium/media/midi/fuzz/corpus/data_byte_0 b/media/midi/fuzz/corpus/data_byte_0 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/data_byte_0 rename to media/midi/fuzz/corpus/data_byte_0 diff --git a/third_party/chromium/media/midi/fuzz/corpus/gm_on b/media/midi/fuzz/corpus/gm_on similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/gm_on rename to media/midi/fuzz/corpus/gm_on diff --git a/third_party/chromium/media/midi/fuzz/corpus/gm_on_with_real_time_clock b/media/midi/fuzz/corpus/gm_on_with_real_time_clock similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/gm_on_with_real_time_clock rename to media/midi/fuzz/corpus/gm_on_with_real_time_clock diff --git a/third_party/chromium/media/midi/fuzz/corpus/gs_on b/media/midi/fuzz/corpus/gs_on similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/gs_on rename to media/midi/fuzz/corpus/gs_on diff --git a/third_party/chromium/media/midi/fuzz/corpus/mtc_frame b/media/midi/fuzz/corpus/mtc_frame similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/mtc_frame rename to media/midi/fuzz/corpus/mtc_frame diff --git a/third_party/chromium/media/midi/fuzz/corpus/note_on b/media/midi/fuzz/corpus/note_on similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/note_on rename to media/midi/fuzz/corpus/note_on diff --git a/third_party/chromium/media/midi/fuzz/corpus/note_on_with_real_time_clock b/media/midi/fuzz/corpus/note_on_with_real_time_clock similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/note_on_with_real_time_clock rename to media/midi/fuzz/corpus/note_on_with_real_time_clock diff --git a/third_party/chromium/media/midi/fuzz/corpus/note_on_with_running_status b/media/midi/fuzz/corpus/note_on_with_running_status similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/note_on_with_running_status rename to media/midi/fuzz/corpus/note_on_with_running_status diff --git a/third_party/chromium/media/midi/fuzz/corpus/partial_gm_on_1 b/media/midi/fuzz/corpus/partial_gm_on_1 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/partial_gm_on_1 rename to media/midi/fuzz/corpus/partial_gm_on_1 diff --git a/third_party/chromium/media/midi/fuzz/corpus/partial_gm_on_2 b/media/midi/fuzz/corpus/partial_gm_on_2 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/partial_gm_on_2 rename to media/midi/fuzz/corpus/partial_gm_on_2 diff --git a/third_party/chromium/media/midi/fuzz/corpus/partial_gm_on_3 b/media/midi/fuzz/corpus/partial_gm_on_3 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/partial_gm_on_3 rename to media/midi/fuzz/corpus/partial_gm_on_3 diff --git a/third_party/chromium/media/midi/fuzz/corpus/partial_note_on_1 b/media/midi/fuzz/corpus/partial_note_on_1 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/partial_note_on_1 rename to media/midi/fuzz/corpus/partial_note_on_1 diff --git a/third_party/chromium/media/midi/fuzz/corpus/partial_note_on_2 b/media/midi/fuzz/corpus/partial_note_on_2 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/partial_note_on_2 rename to media/midi/fuzz/corpus/partial_note_on_2 diff --git a/third_party/chromium/media/midi/fuzz/corpus/partial_note_on_3 b/media/midi/fuzz/corpus/partial_note_on_3 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/partial_note_on_3 rename to media/midi/fuzz/corpus/partial_note_on_3 diff --git a/third_party/chromium/media/midi/fuzz/corpus/reserved_message_1 b/media/midi/fuzz/corpus/reserved_message_1 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/reserved_message_1 rename to media/midi/fuzz/corpus/reserved_message_1 diff --git a/third_party/chromium/media/midi/fuzz/corpus/reserved_message_1_with_data_bytes b/media/midi/fuzz/corpus/reserved_message_1_with_data_bytes similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/reserved_message_1_with_data_bytes rename to media/midi/fuzz/corpus/reserved_message_1_with_data_bytes diff --git a/third_party/chromium/media/midi/fuzz/corpus/reserved_message_2 b/media/midi/fuzz/corpus/reserved_message_2 similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/reserved_message_2 rename to media/midi/fuzz/corpus/reserved_message_2 diff --git a/third_party/chromium/media/midi/fuzz/corpus/system_common_message_tune_request b/media/midi/fuzz/corpus/system_common_message_tune_request similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/system_common_message_tune_request rename to media/midi/fuzz/corpus/system_common_message_tune_request diff --git a/third_party/chromium/media/midi/fuzz/corpus/timing_clock b/media/midi/fuzz/corpus/timing_clock similarity index 100% rename from third_party/chromium/media/midi/fuzz/corpus/timing_clock rename to media/midi/fuzz/corpus/timing_clock diff --git a/third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/a b/media/midi/fuzz/usb_midi_descriptor_corpus/a similarity index 100% rename from third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/a rename to media/midi/fuzz/usb_midi_descriptor_corpus/a diff --git a/third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/b b/media/midi/fuzz/usb_midi_descriptor_corpus/b similarity index 100% rename from third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/b rename to media/midi/fuzz/usb_midi_descriptor_corpus/b diff --git a/third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/c b/media/midi/fuzz/usb_midi_descriptor_corpus/c similarity index 100% rename from third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/c rename to media/midi/fuzz/usb_midi_descriptor_corpus/c diff --git a/third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/d b/media/midi/fuzz/usb_midi_descriptor_corpus/d similarity index 100% rename from third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/d rename to media/midi/fuzz/usb_midi_descriptor_corpus/d diff --git a/third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/e b/media/midi/fuzz/usb_midi_descriptor_corpus/e similarity index 100% rename from third_party/chromium/media/midi/fuzz/usb_midi_descriptor_corpus/e rename to media/midi/fuzz/usb_midi_descriptor_corpus/e diff --git a/third_party/chromium/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java b/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java similarity index 100% rename from third_party/chromium/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java rename to media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java diff --git a/third_party/chromium/media/midi/java/src/org/chromium/midi/MidiInputPortAndroid.java b/media/midi/java/src/org/chromium/midi/MidiInputPortAndroid.java similarity index 100% rename from third_party/chromium/media/midi/java/src/org/chromium/midi/MidiInputPortAndroid.java rename to media/midi/java/src/org/chromium/midi/MidiInputPortAndroid.java diff --git a/third_party/chromium/media/midi/java/src/org/chromium/midi/MidiManagerAndroid.java b/media/midi/java/src/org/chromium/midi/MidiManagerAndroid.java similarity index 100% rename from third_party/chromium/media/midi/java/src/org/chromium/midi/MidiManagerAndroid.java rename to media/midi/java/src/org/chromium/midi/MidiManagerAndroid.java diff --git a/third_party/chromium/media/midi/java/src/org/chromium/midi/MidiOutputPortAndroid.java b/media/midi/java/src/org/chromium/midi/MidiOutputPortAndroid.java similarity index 100% rename from third_party/chromium/media/midi/java/src/org/chromium/midi/MidiOutputPortAndroid.java rename to media/midi/java/src/org/chromium/midi/MidiOutputPortAndroid.java diff --git a/third_party/chromium/media/midi/java/src/org/chromium/midi/UsbMidiDeviceAndroid.java b/media/midi/java/src/org/chromium/midi/UsbMidiDeviceAndroid.java similarity index 100% rename from third_party/chromium/media/midi/java/src/org/chromium/midi/UsbMidiDeviceAndroid.java rename to media/midi/java/src/org/chromium/midi/UsbMidiDeviceAndroid.java diff --git a/third_party/chromium/media/midi/java/src/org/chromium/midi/UsbMidiDeviceFactoryAndroid.java b/media/midi/java/src/org/chromium/midi/UsbMidiDeviceFactoryAndroid.java similarity index 100% rename from third_party/chromium/media/midi/java/src/org/chromium/midi/UsbMidiDeviceFactoryAndroid.java rename to media/midi/java/src/org/chromium/midi/UsbMidiDeviceFactoryAndroid.java diff --git a/third_party/chromium/media/midi/message_util.cc b/media/midi/message_util.cc similarity index 100% rename from third_party/chromium/media/midi/message_util.cc rename to media/midi/message_util.cc diff --git a/third_party/chromium/media/midi/message_util.h b/media/midi/message_util.h similarity index 100% rename from third_party/chromium/media/midi/message_util.h rename to media/midi/message_util.h diff --git a/third_party/chromium/media/midi/message_util_unittest.cc b/media/midi/message_util_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/message_util_unittest.cc rename to media/midi/message_util_unittest.cc diff --git a/third_party/chromium/media/midi/midi_device_android.cc b/media/midi/midi_device_android.cc similarity index 100% rename from third_party/chromium/media/midi/midi_device_android.cc rename to media/midi/midi_device_android.cc diff --git a/third_party/chromium/media/midi/midi_device_android.h b/media/midi/midi_device_android.h similarity index 100% rename from third_party/chromium/media/midi/midi_device_android.h rename to media/midi/midi_device_android.h diff --git a/third_party/chromium/media/midi/midi_export.h b/media/midi/midi_export.h similarity index 100% rename from third_party/chromium/media/midi/midi_export.h rename to media/midi/midi_export.h diff --git a/third_party/chromium/media/midi/midi_input_port_android.cc b/media/midi/midi_input_port_android.cc similarity index 100% rename from third_party/chromium/media/midi/midi_input_port_android.cc rename to media/midi/midi_input_port_android.cc diff --git a/third_party/chromium/media/midi/midi_input_port_android.h b/media/midi/midi_input_port_android.h similarity index 100% rename from third_party/chromium/media/midi/midi_input_port_android.h rename to media/midi/midi_input_port_android.h diff --git a/third_party/chromium/media/midi/midi_manager.cc b/media/midi/midi_manager.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager.cc rename to media/midi/midi_manager.cc diff --git a/third_party/chromium/media/midi/midi_manager.h b/media/midi/midi_manager.h similarity index 100% rename from third_party/chromium/media/midi/midi_manager.h rename to media/midi/midi_manager.h diff --git a/third_party/chromium/media/midi/midi_manager_alsa.cc b/media/midi/midi_manager_alsa.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_alsa.cc rename to media/midi/midi_manager_alsa.cc diff --git a/third_party/chromium/media/midi/midi_manager_alsa.h b/media/midi/midi_manager_alsa.h similarity index 100% rename from third_party/chromium/media/midi/midi_manager_alsa.h rename to media/midi/midi_manager_alsa.h diff --git a/third_party/chromium/media/midi/midi_manager_alsa_unittest.cc b/media/midi/midi_manager_alsa_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_alsa_unittest.cc rename to media/midi/midi_manager_alsa_unittest.cc diff --git a/third_party/chromium/media/midi/midi_manager_android.cc b/media/midi/midi_manager_android.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_android.cc rename to media/midi/midi_manager_android.cc diff --git a/third_party/chromium/media/midi/midi_manager_android.h b/media/midi/midi_manager_android.h similarity index 100% rename from third_party/chromium/media/midi/midi_manager_android.h rename to media/midi/midi_manager_android.h diff --git a/third_party/chromium/media/midi/midi_manager_mac.cc b/media/midi/midi_manager_mac.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_mac.cc rename to media/midi/midi_manager_mac.cc diff --git a/third_party/chromium/media/midi/midi_manager_mac.h b/media/midi/midi_manager_mac.h similarity index 100% rename from third_party/chromium/media/midi/midi_manager_mac.h rename to media/midi/midi_manager_mac.h diff --git a/third_party/chromium/media/midi/midi_manager_mac_unittest.cc b/media/midi/midi_manager_mac_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_mac_unittest.cc rename to media/midi/midi_manager_mac_unittest.cc diff --git a/third_party/chromium/media/midi/midi_manager_unittest.cc b/media/midi/midi_manager_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_unittest.cc rename to media/midi/midi_manager_unittest.cc diff --git a/third_party/chromium/media/midi/midi_manager_usb.cc b/media/midi/midi_manager_usb.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_usb.cc rename to media/midi/midi_manager_usb.cc diff --git a/third_party/chromium/media/midi/midi_manager_usb.h b/media/midi/midi_manager_usb.h similarity index 100% rename from third_party/chromium/media/midi/midi_manager_usb.h rename to media/midi/midi_manager_usb.h diff --git a/third_party/chromium/media/midi/midi_manager_usb_unittest.cc b/media/midi/midi_manager_usb_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_usb_unittest.cc rename to media/midi/midi_manager_usb_unittest.cc diff --git a/third_party/chromium/media/midi/midi_manager_win.cc b/media/midi/midi_manager_win.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_win.cc rename to media/midi/midi_manager_win.cc diff --git a/third_party/chromium/media/midi/midi_manager_win.h b/media/midi/midi_manager_win.h similarity index 100% rename from third_party/chromium/media/midi/midi_manager_win.h rename to media/midi/midi_manager_win.h diff --git a/third_party/chromium/media/midi/midi_manager_winrt.cc b/media/midi/midi_manager_winrt.cc similarity index 100% rename from third_party/chromium/media/midi/midi_manager_winrt.cc rename to media/midi/midi_manager_winrt.cc diff --git a/third_party/chromium/media/midi/midi_manager_winrt.h b/media/midi/midi_manager_winrt.h similarity index 100% rename from third_party/chromium/media/midi/midi_manager_winrt.h rename to media/midi/midi_manager_winrt.h diff --git a/third_party/chromium/media/midi/midi_message_queue.cc b/media/midi/midi_message_queue.cc similarity index 100% rename from third_party/chromium/media/midi/midi_message_queue.cc rename to media/midi/midi_message_queue.cc diff --git a/third_party/chromium/media/midi/midi_message_queue.h b/media/midi/midi_message_queue.h similarity index 100% rename from third_party/chromium/media/midi/midi_message_queue.h rename to media/midi/midi_message_queue.h diff --git a/third_party/chromium/media/midi/midi_message_queue_fuzzer.cc b/media/midi/midi_message_queue_fuzzer.cc similarity index 100% rename from third_party/chromium/media/midi/midi_message_queue_fuzzer.cc rename to media/midi/midi_message_queue_fuzzer.cc diff --git a/third_party/chromium/media/midi/midi_message_queue_unittest.cc b/media/midi/midi_message_queue_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/midi_message_queue_unittest.cc rename to media/midi/midi_message_queue_unittest.cc diff --git a/third_party/chromium/media/midi/midi_output_port_android.cc b/media/midi/midi_output_port_android.cc similarity index 100% rename from third_party/chromium/media/midi/midi_output_port_android.cc rename to media/midi/midi_output_port_android.cc diff --git a/third_party/chromium/media/midi/midi_output_port_android.h b/media/midi/midi_output_port_android.h similarity index 100% rename from third_party/chromium/media/midi/midi_output_port_android.h rename to media/midi/midi_output_port_android.h diff --git a/third_party/chromium/media/midi/midi_service.cc b/media/midi/midi_service.cc similarity index 100% rename from third_party/chromium/media/midi/midi_service.cc rename to media/midi/midi_service.cc diff --git a/third_party/chromium/media/midi/midi_service.h b/media/midi/midi_service.h similarity index 100% rename from third_party/chromium/media/midi/midi_service.h rename to media/midi/midi_service.h diff --git a/third_party/chromium/media/midi/midi_service.mojom b/media/midi/midi_service.mojom similarity index 100% rename from third_party/chromium/media/midi/midi_service.mojom rename to media/midi/midi_service.mojom diff --git a/third_party/chromium/media/midi/midi_switches.cc b/media/midi/midi_switches.cc similarity index 100% rename from third_party/chromium/media/midi/midi_switches.cc rename to media/midi/midi_switches.cc diff --git a/third_party/chromium/media/midi/midi_switches.h b/media/midi/midi_switches.h similarity index 100% rename from third_party/chromium/media/midi/midi_switches.h rename to media/midi/midi_switches.h diff --git a/third_party/chromium/media/midi/midi_webmidi_data_validator_fuzzer.cc b/media/midi/midi_webmidi_data_validator_fuzzer.cc similarity index 100% rename from third_party/chromium/media/midi/midi_webmidi_data_validator_fuzzer.cc rename to media/midi/midi_webmidi_data_validator_fuzzer.cc diff --git a/third_party/chromium/media/midi/task_service.cc b/media/midi/task_service.cc similarity index 100% rename from third_party/chromium/media/midi/task_service.cc rename to media/midi/task_service.cc diff --git a/third_party/chromium/media/midi/task_service.h b/media/midi/task_service.h similarity index 100% rename from third_party/chromium/media/midi/task_service.h rename to media/midi/task_service.h diff --git a/third_party/chromium/media/midi/task_service_unittest.cc b/media/midi/task_service_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/task_service_unittest.cc rename to media/midi/task_service_unittest.cc diff --git a/third_party/chromium/media/midi/usb_midi_descriptor_parser.cc b/media/midi/usb_midi_descriptor_parser.cc similarity index 100% rename from third_party/chromium/media/midi/usb_midi_descriptor_parser.cc rename to media/midi/usb_midi_descriptor_parser.cc diff --git a/third_party/chromium/media/midi/usb_midi_descriptor_parser.h b/media/midi/usb_midi_descriptor_parser.h similarity index 100% rename from third_party/chromium/media/midi/usb_midi_descriptor_parser.h rename to media/midi/usb_midi_descriptor_parser.h diff --git a/third_party/chromium/media/midi/usb_midi_descriptor_parser_fuzzer.cc b/media/midi/usb_midi_descriptor_parser_fuzzer.cc similarity index 100% rename from third_party/chromium/media/midi/usb_midi_descriptor_parser_fuzzer.cc rename to media/midi/usb_midi_descriptor_parser_fuzzer.cc diff --git a/third_party/chromium/media/midi/usb_midi_descriptor_parser_unittest.cc b/media/midi/usb_midi_descriptor_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/usb_midi_descriptor_parser_unittest.cc rename to media/midi/usb_midi_descriptor_parser_unittest.cc diff --git a/third_party/chromium/media/midi/usb_midi_device.h b/media/midi/usb_midi_device.h similarity index 100% rename from third_party/chromium/media/midi/usb_midi_device.h rename to media/midi/usb_midi_device.h diff --git a/third_party/chromium/media/midi/usb_midi_device_android.cc b/media/midi/usb_midi_device_android.cc similarity index 100% rename from third_party/chromium/media/midi/usb_midi_device_android.cc rename to media/midi/usb_midi_device_android.cc diff --git a/third_party/chromium/media/midi/usb_midi_device_android.h b/media/midi/usb_midi_device_android.h similarity index 100% rename from third_party/chromium/media/midi/usb_midi_device_android.h rename to media/midi/usb_midi_device_android.h diff --git a/third_party/chromium/media/midi/usb_midi_device_factory_android.cc b/media/midi/usb_midi_device_factory_android.cc similarity index 100% rename from third_party/chromium/media/midi/usb_midi_device_factory_android.cc rename to media/midi/usb_midi_device_factory_android.cc diff --git a/third_party/chromium/media/midi/usb_midi_device_factory_android.h b/media/midi/usb_midi_device_factory_android.h similarity index 100% rename from third_party/chromium/media/midi/usb_midi_device_factory_android.h rename to media/midi/usb_midi_device_factory_android.h diff --git a/third_party/chromium/media/midi/usb_midi_export.h b/media/midi/usb_midi_export.h similarity index 100% rename from third_party/chromium/media/midi/usb_midi_export.h rename to media/midi/usb_midi_export.h diff --git a/third_party/chromium/media/midi/usb_midi_input_stream.cc b/media/midi/usb_midi_input_stream.cc similarity index 100% rename from third_party/chromium/media/midi/usb_midi_input_stream.cc rename to media/midi/usb_midi_input_stream.cc diff --git a/third_party/chromium/media/midi/usb_midi_input_stream.h b/media/midi/usb_midi_input_stream.h similarity index 100% rename from third_party/chromium/media/midi/usb_midi_input_stream.h rename to media/midi/usb_midi_input_stream.h diff --git a/third_party/chromium/media/midi/usb_midi_input_stream_unittest.cc b/media/midi/usb_midi_input_stream_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/usb_midi_input_stream_unittest.cc rename to media/midi/usb_midi_input_stream_unittest.cc diff --git a/third_party/chromium/media/midi/usb_midi_jack.h b/media/midi/usb_midi_jack.h similarity index 100% rename from third_party/chromium/media/midi/usb_midi_jack.h rename to media/midi/usb_midi_jack.h diff --git a/third_party/chromium/media/midi/usb_midi_output_stream.cc b/media/midi/usb_midi_output_stream.cc similarity index 100% rename from third_party/chromium/media/midi/usb_midi_output_stream.cc rename to media/midi/usb_midi_output_stream.cc diff --git a/third_party/chromium/media/midi/usb_midi_output_stream.h b/media/midi/usb_midi_output_stream.h similarity index 100% rename from third_party/chromium/media/midi/usb_midi_output_stream.h rename to media/midi/usb_midi_output_stream.h diff --git a/third_party/chromium/media/midi/usb_midi_output_stream_unittest.cc b/media/midi/usb_midi_output_stream_unittest.cc similarity index 100% rename from third_party/chromium/media/midi/usb_midi_output_stream_unittest.cc rename to media/midi/usb_midi_output_stream_unittest.cc diff --git a/third_party/chromium/media/mojo/BUILD.gn b/media/mojo/BUILD.gn similarity index 100% rename from third_party/chromium/media/mojo/BUILD.gn rename to media/mojo/BUILD.gn diff --git a/third_party/chromium/media/mojo/DEPS b/media/mojo/DEPS similarity index 100% rename from third_party/chromium/media/mojo/DEPS rename to media/mojo/DEPS diff --git a/third_party/chromium/media/mojo/README.md b/media/mojo/README.md similarity index 100% rename from third_party/chromium/media/mojo/README.md rename to media/mojo/README.md diff --git a/third_party/chromium/media/mojo/clients/BUILD.gn b/media/mojo/clients/BUILD.gn similarity index 100% rename from third_party/chromium/media/mojo/clients/BUILD.gn rename to media/mojo/clients/BUILD.gn diff --git a/third_party/chromium/media/mojo/clients/mojo_android_overlay.cc b/media/mojo/clients/mojo_android_overlay.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_android_overlay.cc rename to media/mojo/clients/mojo_android_overlay.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_android_overlay.h b/media/mojo/clients/mojo_android_overlay.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_android_overlay.h rename to media/mojo/clients/mojo_android_overlay.h diff --git a/third_party/chromium/media/mojo/clients/mojo_android_overlay_unittest.cc b/media/mojo/clients/mojo_android_overlay_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_android_overlay_unittest.cc rename to media/mojo/clients/mojo_android_overlay_unittest.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_audio_decoder.cc b/media/mojo/clients/mojo_audio_decoder.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_audio_decoder.cc rename to media/mojo/clients/mojo_audio_decoder.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_audio_decoder.h b/media/mojo/clients/mojo_audio_decoder.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_audio_decoder.h rename to media/mojo/clients/mojo_audio_decoder.h diff --git a/third_party/chromium/media/mojo/clients/mojo_audio_decoder_unittest.cc b/media/mojo/clients/mojo_audio_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_audio_decoder_unittest.cc rename to media/mojo/clients/mojo_audio_decoder_unittest.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_cdm.cc b/media/mojo/clients/mojo_cdm.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_cdm.cc rename to media/mojo/clients/mojo_cdm.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_cdm.h b/media/mojo/clients/mojo_cdm.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_cdm.h rename to media/mojo/clients/mojo_cdm.h diff --git a/third_party/chromium/media/mojo/clients/mojo_cdm_factory.cc b/media/mojo/clients/mojo_cdm_factory.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_cdm_factory.cc rename to media/mojo/clients/mojo_cdm_factory.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_cdm_factory.h b/media/mojo/clients/mojo_cdm_factory.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_cdm_factory.h rename to media/mojo/clients/mojo_cdm_factory.h diff --git a/third_party/chromium/media/mojo/clients/mojo_cdm_unittest.cc b/media/mojo/clients/mojo_cdm_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_cdm_unittest.cc rename to media/mojo/clients/mojo_cdm_unittest.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_decoder_factory.cc b/media/mojo/clients/mojo_decoder_factory.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_decoder_factory.cc rename to media/mojo/clients/mojo_decoder_factory.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_decoder_factory.h b/media/mojo/clients/mojo_decoder_factory.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_decoder_factory.h rename to media/mojo/clients/mojo_decoder_factory.h diff --git a/third_party/chromium/media/mojo/clients/mojo_decryptor.cc b/media/mojo/clients/mojo_decryptor.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_decryptor.cc rename to media/mojo/clients/mojo_decryptor.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_decryptor.h b/media/mojo/clients/mojo_decryptor.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_decryptor.h rename to media/mojo/clients/mojo_decryptor.h diff --git a/third_party/chromium/media/mojo/clients/mojo_decryptor_unittest.cc b/media/mojo/clients/mojo_decryptor_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_decryptor_unittest.cc rename to media/mojo/clients/mojo_decryptor_unittest.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_demuxer_stream_impl.cc b/media/mojo/clients/mojo_demuxer_stream_impl.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_demuxer_stream_impl.cc rename to media/mojo/clients/mojo_demuxer_stream_impl.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_demuxer_stream_impl.h b/media/mojo/clients/mojo_demuxer_stream_impl.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_demuxer_stream_impl.h rename to media/mojo/clients/mojo_demuxer_stream_impl.h diff --git a/third_party/chromium/media/mojo/clients/mojo_media_log_service.cc b/media/mojo/clients/mojo_media_log_service.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_media_log_service.cc rename to media/mojo/clients/mojo_media_log_service.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_media_log_service.h b/media/mojo/clients/mojo_media_log_service.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_media_log_service.h rename to media/mojo/clients/mojo_media_log_service.h diff --git a/third_party/chromium/media/mojo/clients/mojo_renderer.cc b/media/mojo/clients/mojo_renderer.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_renderer.cc rename to media/mojo/clients/mojo_renderer.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_renderer.h b/media/mojo/clients/mojo_renderer.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_renderer.h rename to media/mojo/clients/mojo_renderer.h diff --git a/third_party/chromium/media/mojo/clients/mojo_renderer_factory.cc b/media/mojo/clients/mojo_renderer_factory.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_renderer_factory.cc rename to media/mojo/clients/mojo_renderer_factory.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_renderer_factory.h b/media/mojo/clients/mojo_renderer_factory.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_renderer_factory.h rename to media/mojo/clients/mojo_renderer_factory.h diff --git a/third_party/chromium/media/mojo/clients/mojo_renderer_unittest.cc b/media/mojo/clients/mojo_renderer_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_renderer_unittest.cc rename to media/mojo/clients/mojo_renderer_unittest.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_renderer_wrapper.cc b/media/mojo/clients/mojo_renderer_wrapper.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_renderer_wrapper.cc rename to media/mojo/clients/mojo_renderer_wrapper.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_renderer_wrapper.h b/media/mojo/clients/mojo_renderer_wrapper.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_renderer_wrapper.h rename to media/mojo/clients/mojo_renderer_wrapper.h diff --git a/third_party/chromium/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_video_decoder.cc rename to media/mojo/clients/mojo_video_decoder.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_video_decoder.h b/media/mojo/clients/mojo_video_decoder.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_video_decoder.h rename to media/mojo/clients/mojo_video_decoder.h diff --git a/third_party/chromium/media/mojo/clients/mojo_video_encode_accelerator.cc b/media/mojo/clients/mojo_video_encode_accelerator.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_video_encode_accelerator.cc rename to media/mojo/clients/mojo_video_encode_accelerator.cc diff --git a/third_party/chromium/media/mojo/clients/mojo_video_encode_accelerator.h b/media/mojo/clients/mojo_video_encode_accelerator.h similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_video_encode_accelerator.h rename to media/mojo/clients/mojo_video_encode_accelerator.h diff --git a/third_party/chromium/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc rename to media/mojo/clients/mojo_video_encode_accelerator_unittest.cc diff --git a/third_party/chromium/media/mojo/clients/win/media_foundation_renderer_client.cc b/media/mojo/clients/win/media_foundation_renderer_client.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/win/media_foundation_renderer_client.cc rename to media/mojo/clients/win/media_foundation_renderer_client.cc diff --git a/third_party/chromium/media/mojo/clients/win/media_foundation_renderer_client.h b/media/mojo/clients/win/media_foundation_renderer_client.h similarity index 100% rename from third_party/chromium/media/mojo/clients/win/media_foundation_renderer_client.h rename to media/mojo/clients/win/media_foundation_renderer_client.h diff --git a/third_party/chromium/media/mojo/clients/win/media_foundation_renderer_client_factory.cc b/media/mojo/clients/win/media_foundation_renderer_client_factory.cc similarity index 100% rename from third_party/chromium/media/mojo/clients/win/media_foundation_renderer_client_factory.cc rename to media/mojo/clients/win/media_foundation_renderer_client_factory.cc diff --git a/third_party/chromium/media/mojo/clients/win/media_foundation_renderer_client_factory.h b/media/mojo/clients/win/media_foundation_renderer_client_factory.h similarity index 100% rename from third_party/chromium/media/mojo/clients/win/media_foundation_renderer_client_factory.h rename to media/mojo/clients/win/media_foundation_renderer_client_factory.h diff --git a/third_party/chromium/media/mojo/common/BUILD.gn b/media/mojo/common/BUILD.gn similarity index 100% rename from third_party/chromium/media/mojo/common/BUILD.gn rename to media/mojo/common/BUILD.gn diff --git a/third_party/chromium/media/mojo/common/OWNERS b/media/mojo/common/OWNERS similarity index 100% rename from third_party/chromium/media/mojo/common/OWNERS rename to media/mojo/common/OWNERS diff --git a/third_party/chromium/media/mojo/common/audio_data_s16_converter.cc b/media/mojo/common/audio_data_s16_converter.cc similarity index 100% rename from third_party/chromium/media/mojo/common/audio_data_s16_converter.cc rename to media/mojo/common/audio_data_s16_converter.cc diff --git a/third_party/chromium/media/mojo/common/audio_data_s16_converter.h b/media/mojo/common/audio_data_s16_converter.h similarity index 100% rename from third_party/chromium/media/mojo/common/audio_data_s16_converter.h rename to media/mojo/common/audio_data_s16_converter.h diff --git a/third_party/chromium/media/mojo/common/input_error_code_converter.cc b/media/mojo/common/input_error_code_converter.cc similarity index 100% rename from third_party/chromium/media/mojo/common/input_error_code_converter.cc rename to media/mojo/common/input_error_code_converter.cc diff --git a/third_party/chromium/media/mojo/common/input_error_code_converter.h b/media/mojo/common/input_error_code_converter.h similarity index 100% rename from third_party/chromium/media/mojo/common/input_error_code_converter.h rename to media/mojo/common/input_error_code_converter.h diff --git a/third_party/chromium/media/mojo/common/media_type_converters.cc b/media/mojo/common/media_type_converters.cc similarity index 100% rename from third_party/chromium/media/mojo/common/media_type_converters.cc rename to media/mojo/common/media_type_converters.cc diff --git a/third_party/chromium/media/mojo/common/media_type_converters.h b/media/mojo/common/media_type_converters.h similarity index 100% rename from third_party/chromium/media/mojo/common/media_type_converters.h rename to media/mojo/common/media_type_converters.h diff --git a/third_party/chromium/media/mojo/common/media_type_converters_unittest.cc b/media/mojo/common/media_type_converters_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/common/media_type_converters_unittest.cc rename to media/mojo/common/media_type_converters_unittest.cc diff --git a/third_party/chromium/media/mojo/common/mojo_data_pipe_read_write.cc b/media/mojo/common/mojo_data_pipe_read_write.cc similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_data_pipe_read_write.cc rename to media/mojo/common/mojo_data_pipe_read_write.cc diff --git a/third_party/chromium/media/mojo/common/mojo_data_pipe_read_write.h b/media/mojo/common/mojo_data_pipe_read_write.h similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_data_pipe_read_write.h rename to media/mojo/common/mojo_data_pipe_read_write.h diff --git a/third_party/chromium/media/mojo/common/mojo_data_pipe_read_write_unittest.cc b/media/mojo/common/mojo_data_pipe_read_write_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_data_pipe_read_write_unittest.cc rename to media/mojo/common/mojo_data_pipe_read_write_unittest.cc diff --git a/third_party/chromium/media/mojo/common/mojo_decoder_buffer_converter.cc b/media/mojo/common/mojo_decoder_buffer_converter.cc similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_decoder_buffer_converter.cc rename to media/mojo/common/mojo_decoder_buffer_converter.cc diff --git a/third_party/chromium/media/mojo/common/mojo_decoder_buffer_converter.h b/media/mojo/common/mojo_decoder_buffer_converter.h similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_decoder_buffer_converter.h rename to media/mojo/common/mojo_decoder_buffer_converter.h diff --git a/third_party/chromium/media/mojo/common/mojo_decoder_buffer_converter_unittest.cc b/media/mojo/common/mojo_decoder_buffer_converter_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_decoder_buffer_converter_unittest.cc rename to media/mojo/common/mojo_decoder_buffer_converter_unittest.cc diff --git a/third_party/chromium/media/mojo/common/mojo_pipe_read_write_util.cc b/media/mojo/common/mojo_pipe_read_write_util.cc similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_pipe_read_write_util.cc rename to media/mojo/common/mojo_pipe_read_write_util.cc diff --git a/third_party/chromium/media/mojo/common/mojo_pipe_read_write_util.h b/media/mojo/common/mojo_pipe_read_write_util.h similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_pipe_read_write_util.h rename to media/mojo/common/mojo_pipe_read_write_util.h diff --git a/third_party/chromium/media/mojo/common/mojo_shared_buffer_video_frame.cc b/media/mojo/common/mojo_shared_buffer_video_frame.cc similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_shared_buffer_video_frame.cc rename to media/mojo/common/mojo_shared_buffer_video_frame.cc diff --git a/third_party/chromium/media/mojo/common/mojo_shared_buffer_video_frame.h b/media/mojo/common/mojo_shared_buffer_video_frame.h similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_shared_buffer_video_frame.h rename to media/mojo/common/mojo_shared_buffer_video_frame.h diff --git a/third_party/chromium/media/mojo/common/mojo_shared_buffer_video_frame_unittest.cc b/media/mojo/common/mojo_shared_buffer_video_frame_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/common/mojo_shared_buffer_video_frame_unittest.cc rename to media/mojo/common/mojo_shared_buffer_video_frame_unittest.cc diff --git a/third_party/chromium/media/mojo/mojom/BUILD.gn b/media/mojo/mojom/BUILD.gn similarity index 100% rename from third_party/chromium/media/mojo/mojom/BUILD.gn rename to media/mojo/mojom/BUILD.gn diff --git a/third_party/chromium/media/mojo/mojom/OWNERS b/media/mojo/mojom/OWNERS similarity index 100% rename from third_party/chromium/media/mojo/mojom/OWNERS rename to media/mojo/mojom/OWNERS diff --git a/third_party/chromium/media/mojo/mojom/android_overlay.mojom b/media/mojo/mojom/android_overlay.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/android_overlay.mojom rename to media/mojo/mojom/android_overlay.mojom diff --git a/third_party/chromium/media/mojo/mojom/audio_data_pipe.mojom b/media/mojo/mojom/audio_data_pipe.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_data_pipe.mojom rename to media/mojo/mojom/audio_data_pipe.mojom diff --git a/third_party/chromium/media/mojo/mojom/audio_decoder.mojom b/media/mojo/mojom/audio_decoder.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_decoder.mojom rename to media/mojo/mojom/audio_decoder.mojom diff --git a/third_party/chromium/media/mojo/mojom/audio_decoder_config_mojom_traits.cc b/media/mojo/mojom/audio_decoder_config_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_decoder_config_mojom_traits.cc rename to media/mojo/mojom/audio_decoder_config_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/audio_decoder_config_mojom_traits.h b/media/mojo/mojom/audio_decoder_config_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_decoder_config_mojom_traits.h rename to media/mojo/mojom/audio_decoder_config_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/audio_decoder_config_mojom_traits_unittest.cc b/media/mojo/mojom/audio_decoder_config_mojom_traits_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_decoder_config_mojom_traits_unittest.cc rename to media/mojo/mojom/audio_decoder_config_mojom_traits_unittest.cc diff --git a/third_party/chromium/media/mojo/mojom/audio_input_stream.mojom b/media/mojo/mojom/audio_input_stream.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_input_stream.mojom rename to media/mojo/mojom/audio_input_stream.mojom diff --git a/third_party/chromium/media/mojo/mojom/audio_logging.mojom b/media/mojo/mojom/audio_logging.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_logging.mojom rename to media/mojo/mojom/audio_logging.mojom diff --git a/third_party/chromium/media/mojo/mojom/audio_output_stream.mojom b/media/mojo/mojom/audio_output_stream.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_output_stream.mojom rename to media/mojo/mojom/audio_output_stream.mojom diff --git a/third_party/chromium/media/mojo/mojom/audio_parameters.mojom b/media/mojo/mojom/audio_parameters.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_parameters.mojom rename to media/mojo/mojom/audio_parameters.mojom diff --git a/third_party/chromium/media/mojo/mojom/audio_stream_factory.mojom b/media/mojo/mojom/audio_stream_factory.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/audio_stream_factory.mojom rename to media/mojo/mojom/audio_stream_factory.mojom diff --git a/third_party/chromium/media/mojo/mojom/capture_handle.mojom b/media/mojo/mojom/capture_handle.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/capture_handle.mojom rename to media/mojo/mojom/capture_handle.mojom diff --git a/third_party/chromium/media/mojo/mojom/cast_application_media_info_manager.mojom b/media/mojo/mojom/cast_application_media_info_manager.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/cast_application_media_info_manager.mojom rename to media/mojo/mojom/cast_application_media_info_manager.mojom diff --git a/third_party/chromium/media/mojo/mojom/cdm_capability_mojom_traits.cc b/media/mojo/mojom/cdm_capability_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/cdm_capability_mojom_traits.cc rename to media/mojo/mojom/cdm_capability_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/cdm_capability_mojom_traits.h b/media/mojo/mojom/cdm_capability_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/cdm_capability_mojom_traits.h rename to media/mojo/mojom/cdm_capability_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/cdm_document_service.mojom b/media/mojo/mojom/cdm_document_service.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/cdm_document_service.mojom rename to media/mojo/mojom/cdm_document_service.mojom diff --git a/third_party/chromium/media/mojo/mojom/cdm_key_information_mojom_traits.cc b/media/mojo/mojom/cdm_key_information_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/cdm_key_information_mojom_traits.cc rename to media/mojo/mojom/cdm_key_information_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/cdm_key_information_mojom_traits.h b/media/mojo/mojom/cdm_key_information_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/cdm_key_information_mojom_traits.h rename to media/mojo/mojom/cdm_key_information_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/cdm_key_information_mojom_traits_unittest.cc b/media/mojo/mojom/cdm_key_information_mojom_traits_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/cdm_key_information_mojom_traits_unittest.cc rename to media/mojo/mojom/cdm_key_information_mojom_traits_unittest.cc diff --git a/third_party/chromium/media/mojo/mojom/cdm_service.mojom b/media/mojo/mojom/cdm_service.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/cdm_service.mojom rename to media/mojo/mojom/cdm_service.mojom diff --git a/third_party/chromium/media/mojo/mojom/cdm_storage.mojom b/media/mojo/mojom/cdm_storage.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/cdm_storage.mojom rename to media/mojo/mojom/cdm_storage.mojom diff --git a/third_party/chromium/media/mojo/mojom/content_decryption_module.mojom b/media/mojo/mojom/content_decryption_module.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/content_decryption_module.mojom rename to media/mojo/mojom/content_decryption_module.mojom diff --git a/third_party/chromium/media/mojo/mojom/dcomp_surface_registry.mojom b/media/mojo/mojom/dcomp_surface_registry.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/dcomp_surface_registry.mojom rename to media/mojo/mojom/dcomp_surface_registry.mojom diff --git a/third_party/chromium/media/mojo/mojom/decryptor.mojom b/media/mojo/mojom/decryptor.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/decryptor.mojom rename to media/mojo/mojom/decryptor.mojom diff --git a/third_party/chromium/media/mojo/mojom/demuxer_stream.mojom b/media/mojo/mojom/demuxer_stream.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/demuxer_stream.mojom rename to media/mojo/mojom/demuxer_stream.mojom diff --git a/third_party/chromium/media/mojo/mojom/display_media_information.mojom b/media/mojo/mojom/display_media_information.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/display_media_information.mojom rename to media/mojo/mojom/display_media_information.mojom diff --git a/third_party/chromium/media/mojo/mojom/encryption_pattern_mojom_traits.cc b/media/mojo/mojom/encryption_pattern_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/encryption_pattern_mojom_traits.cc rename to media/mojo/mojom/encryption_pattern_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/encryption_pattern_mojom_traits.h b/media/mojo/mojom/encryption_pattern_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/encryption_pattern_mojom_traits.h rename to media/mojo/mojom/encryption_pattern_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/frame_interface_factory.mojom b/media/mojo/mojom/frame_interface_factory.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/frame_interface_factory.mojom rename to media/mojo/mojom/frame_interface_factory.mojom diff --git a/third_party/chromium/media/mojo/mojom/gpu_accelerated_video_decoder.mojom b/media/mojo/mojom/gpu_accelerated_video_decoder.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/gpu_accelerated_video_decoder.mojom rename to media/mojo/mojom/gpu_accelerated_video_decoder.mojom diff --git a/third_party/chromium/media/mojo/mojom/interface_factory.mojom b/media/mojo/mojom/interface_factory.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/interface_factory.mojom rename to media/mojo/mojom/interface_factory.mojom diff --git a/third_party/chromium/media/mojo/mojom/key_system_support.mojom b/media/mojo/mojom/key_system_support.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/key_system_support.mojom rename to media/mojo/mojom/key_system_support.mojom diff --git a/third_party/chromium/media/mojo/mojom/media_drm_storage.mojom b/media/mojo/mojom/media_drm_storage.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_drm_storage.mojom rename to media/mojo/mojom/media_drm_storage.mojom diff --git a/third_party/chromium/media/mojo/mojom/media_foundation_cdm_data_mojom_traits.cc b/media/mojo/mojom/media_foundation_cdm_data_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_foundation_cdm_data_mojom_traits.cc rename to media/mojo/mojom/media_foundation_cdm_data_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/media_foundation_cdm_data_mojom_traits.h b/media/mojo/mojom/media_foundation_cdm_data_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_foundation_cdm_data_mojom_traits.h rename to media/mojo/mojom/media_foundation_cdm_data_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/media_foundation_service.mojom b/media/mojo/mojom/media_foundation_service.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_foundation_service.mojom rename to media/mojo/mojom/media_foundation_service.mojom diff --git a/third_party/chromium/media/mojo/mojom/media_log.mojom b/media/mojo/mojom/media_log.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_log.mojom rename to media/mojo/mojom/media_log.mojom diff --git a/third_party/chromium/media/mojo/mojom/media_metrics_provider.mojom b/media/mojo/mojom/media_metrics_provider.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_metrics_provider.mojom rename to media/mojo/mojom/media_metrics_provider.mojom diff --git a/third_party/chromium/media/mojo/mojom/media_player.mojom b/media/mojo/mojom/media_player.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_player.mojom rename to media/mojo/mojom/media_player.mojom diff --git a/third_party/chromium/media/mojo/mojom/media_service.mojom b/media/mojo/mojom/media_service.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_service.mojom rename to media/mojo/mojom/media_service.mojom diff --git a/third_party/chromium/media/mojo/mojom/media_types.mojom b/media/mojo/mojom/media_types.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_types.mojom rename to media/mojo/mojom/media_types.mojom diff --git a/third_party/chromium/media/mojo/mojom/media_types_enum_mojom_traits.h b/media/mojo/mojom/media_types_enum_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/media_types_enum_mojom_traits.h rename to media/mojo/mojom/media_types_enum_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/output_protection.mojom b/media/mojo/mojom/output_protection.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/output_protection.mojom rename to media/mojo/mojom/output_protection.mojom diff --git a/third_party/chromium/media/mojo/mojom/pipeline_status_mojom_traits.h b/media/mojo/mojom/pipeline_status_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/pipeline_status_mojom_traits.h rename to media/mojo/mojom/pipeline_status_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/playback_events_recorder.mojom b/media/mojo/mojom/playback_events_recorder.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/playback_events_recorder.mojom rename to media/mojo/mojom/playback_events_recorder.mojom diff --git a/third_party/chromium/media/mojo/mojom/provision_fetcher.mojom b/media/mojo/mojom/provision_fetcher.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/provision_fetcher.mojom rename to media/mojo/mojom/provision_fetcher.mojom diff --git a/third_party/chromium/media/mojo/mojom/remoting.mojom b/media/mojo/mojom/remoting.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/remoting.mojom rename to media/mojo/mojom/remoting.mojom diff --git a/third_party/chromium/media/mojo/mojom/remoting_common.mojom b/media/mojo/mojom/remoting_common.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/remoting_common.mojom rename to media/mojo/mojom/remoting_common.mojom diff --git a/third_party/chromium/media/mojo/mojom/renderer.mojom b/media/mojo/mojom/renderer.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/renderer.mojom rename to media/mojo/mojom/renderer.mojom diff --git a/third_party/chromium/media/mojo/mojom/renderer_extensions.mojom b/media/mojo/mojom/renderer_extensions.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/renderer_extensions.mojom rename to media/mojo/mojom/renderer_extensions.mojom diff --git a/third_party/chromium/media/mojo/mojom/speech_recognition_result.cc b/media/mojo/mojom/speech_recognition_result.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/speech_recognition_result.cc rename to media/mojo/mojom/speech_recognition_result.cc diff --git a/third_party/chromium/media/mojo/mojom/speech_recognition_result.h b/media/mojo/mojom/speech_recognition_result.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/speech_recognition_result.h rename to media/mojo/mojom/speech_recognition_result.h diff --git a/third_party/chromium/media/mojo/mojom/speech_recognition_result_mojom_traits.cc b/media/mojo/mojom/speech_recognition_result_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/speech_recognition_result_mojom_traits.cc rename to media/mojo/mojom/speech_recognition_result_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/speech_recognition_result_mojom_traits.h b/media/mojo/mojom/speech_recognition_result_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/speech_recognition_result_mojom_traits.h rename to media/mojo/mojom/speech_recognition_result_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/speech_recognition_result_mojom_traits_unittest.cc b/media/mojo/mojom/speech_recognition_result_mojom_traits_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/speech_recognition_result_mojom_traits_unittest.cc rename to media/mojo/mojom/speech_recognition_result_mojom_traits_unittest.cc diff --git a/third_party/chromium/media/mojo/mojom/speech_recognition_service.mojom b/media/mojo/mojom/speech_recognition_service.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/speech_recognition_service.mojom rename to media/mojo/mojom/speech_recognition_service.mojom diff --git a/third_party/chromium/media/mojo/mojom/stable/BUILD.gn b/media/mojo/mojom/stable/BUILD.gn similarity index 100% rename from third_party/chromium/media/mojo/mojom/stable/BUILD.gn rename to media/mojo/mojom/stable/BUILD.gn diff --git a/third_party/chromium/media/mojo/mojom/stable/OWNERS b/media/mojo/mojom/stable/OWNERS similarity index 100% rename from third_party/chromium/media/mojo/mojom/stable/OWNERS rename to media/mojo/mojom/stable/OWNERS diff --git a/third_party/chromium/media/mojo/mojom/stable/README b/media/mojo/mojom/stable/README similarity index 100% rename from third_party/chromium/media/mojo/mojom/stable/README rename to media/mojo/mojom/stable/README diff --git a/third_party/chromium/media/mojo/mojom/stable/stable_video_decoder.mojom b/media/mojo/mojom/stable/stable_video_decoder.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/stable/stable_video_decoder.mojom rename to media/mojo/mojom/stable/stable_video_decoder.mojom diff --git a/third_party/chromium/media/mojo/mojom/stable/stable_video_decoder_types.mojom b/media/mojo/mojom/stable/stable_video_decoder_types.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/stable/stable_video_decoder_types.mojom rename to media/mojo/mojom/stable/stable_video_decoder_types.mojom diff --git a/third_party/chromium/media/mojo/mojom/status_mojom_traits.cc b/media/mojo/mojom/status_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/status_mojom_traits.cc rename to media/mojo/mojom/status_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/status_mojom_traits.h b/media/mojo/mojom/status_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/status_mojom_traits.h rename to media/mojo/mojom/status_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/supported_video_decoder_config_mojom_traits.cc b/media/mojo/mojom/supported_video_decoder_config_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/supported_video_decoder_config_mojom_traits.cc rename to media/mojo/mojom/supported_video_decoder_config_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/supported_video_decoder_config_mojom_traits.h b/media/mojo/mojom/supported_video_decoder_config_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/supported_video_decoder_config_mojom_traits.h rename to media/mojo/mojom/supported_video_decoder_config_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/traits_test_service.mojom b/media/mojo/mojom/traits_test_service.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/traits_test_service.mojom rename to media/mojo/mojom/traits_test_service.mojom diff --git a/third_party/chromium/media/mojo/mojom/video_color_space_mojom_traits.h b/media/mojo/mojom/video_color_space_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_color_space_mojom_traits.h rename to media/mojo/mojom/video_color_space_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/video_decode_perf_history.mojom b/media/mojo/mojom/video_decode_perf_history.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_decode_perf_history.mojom rename to media/mojo/mojom/video_decode_perf_history.mojom diff --git a/third_party/chromium/media/mojo/mojom/video_decode_stats_recorder.mojom b/media/mojo/mojom/video_decode_stats_recorder.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_decode_stats_recorder.mojom rename to media/mojo/mojom/video_decode_stats_recorder.mojom diff --git a/third_party/chromium/media/mojo/mojom/video_decoder.mojom b/media/mojo/mojom/video_decoder.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_decoder.mojom rename to media/mojo/mojom/video_decoder.mojom diff --git a/third_party/chromium/media/mojo/mojom/video_decoder_config_mojom_traits.cc b/media/mojo/mojom/video_decoder_config_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_decoder_config_mojom_traits.cc rename to media/mojo/mojom/video_decoder_config_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/video_decoder_config_mojom_traits.h b/media/mojo/mojom/video_decoder_config_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_decoder_config_mojom_traits.h rename to media/mojo/mojom/video_decoder_config_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/video_decoder_config_mojom_traits_unittest.cc b/media/mojo/mojom/video_decoder_config_mojom_traits_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_decoder_config_mojom_traits_unittest.cc rename to media/mojo/mojom/video_decoder_config_mojom_traits_unittest.cc diff --git a/third_party/chromium/media/mojo/mojom/video_encode_accelerator.mojom b/media/mojo/mojom/video_encode_accelerator.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_encode_accelerator.mojom rename to media/mojo/mojom/video_encode_accelerator.mojom diff --git a/third_party/chromium/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc b/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc rename to media/mojo/mojom/video_encode_accelerator_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/video_encode_accelerator_mojom_traits.h b/media/mojo/mojom/video_encode_accelerator_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_encode_accelerator_mojom_traits.h rename to media/mojo/mojom/video_encode_accelerator_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc b/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc rename to media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc diff --git a/third_party/chromium/media/mojo/mojom/video_encoder_info.mojom b/media/mojo/mojom/video_encoder_info.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_encoder_info.mojom rename to media/mojo/mojom/video_encoder_info.mojom diff --git a/third_party/chromium/media/mojo/mojom/video_encoder_info_mojom_traits.cc b/media/mojo/mojom/video_encoder_info_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_encoder_info_mojom_traits.cc rename to media/mojo/mojom/video_encoder_info_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/video_encoder_info_mojom_traits.h b/media/mojo/mojom/video_encoder_info_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_encoder_info_mojom_traits.h rename to media/mojo/mojom/video_encoder_info_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/video_frame_metadata_mojom_traits.cc b/media/mojo/mojom/video_frame_metadata_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_frame_metadata_mojom_traits.cc rename to media/mojo/mojom/video_frame_metadata_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/video_frame_metadata_mojom_traits.h b/media/mojo/mojom/video_frame_metadata_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_frame_metadata_mojom_traits.h rename to media/mojo/mojom/video_frame_metadata_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/video_frame_metadata_mojom_traits_unittest.cc b/media/mojo/mojom/video_frame_metadata_mojom_traits_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_frame_metadata_mojom_traits_unittest.cc rename to media/mojo/mojom/video_frame_metadata_mojom_traits_unittest.cc diff --git a/third_party/chromium/media/mojo/mojom/video_frame_mojom_traits.cc b/media/mojo/mojom/video_frame_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_frame_mojom_traits.cc rename to media/mojo/mojom/video_frame_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/video_frame_mojom_traits.h b/media/mojo/mojom/video_frame_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_frame_mojom_traits.h rename to media/mojo/mojom/video_frame_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/video_frame_mojom_traits_unittest.cc b/media/mojo/mojom/video_frame_mojom_traits_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_frame_mojom_traits_unittest.cc rename to media/mojo/mojom/video_frame_mojom_traits_unittest.cc diff --git a/third_party/chromium/media/mojo/mojom/video_transformation_mojom_traits.cc b/media/mojo/mojom/video_transformation_mojom_traits.cc similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_transformation_mojom_traits.cc rename to media/mojo/mojom/video_transformation_mojom_traits.cc diff --git a/third_party/chromium/media/mojo/mojom/video_transformation_mojom_traits.h b/media/mojo/mojom/video_transformation_mojom_traits.h similarity index 100% rename from third_party/chromium/media/mojo/mojom/video_transformation_mojom_traits.h rename to media/mojo/mojom/video_transformation_mojom_traits.h diff --git a/third_party/chromium/media/mojo/mojom/watch_time_recorder.mojom b/media/mojo/mojom/watch_time_recorder.mojom similarity index 100% rename from third_party/chromium/media/mojo/mojom/watch_time_recorder.mojom rename to media/mojo/mojom/watch_time_recorder.mojom diff --git a/third_party/chromium/media/mojo/renderer_extension_diagram.png b/media/mojo/renderer_extension_diagram.png similarity index 100% rename from third_party/chromium/media/mojo/renderer_extension_diagram.png rename to media/mojo/renderer_extension_diagram.png diff --git a/third_party/chromium/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn similarity index 100% rename from third_party/chromium/media/mojo/services/BUILD.gn rename to media/mojo/services/BUILD.gn diff --git a/third_party/chromium/media/mojo/services/DEPS b/media/mojo/services/DEPS similarity index 100% rename from third_party/chromium/media/mojo/services/DEPS rename to media/mojo/services/DEPS diff --git a/third_party/chromium/media/mojo/services/OWNERS b/media/mojo/services/OWNERS similarity index 100% rename from third_party/chromium/media/mojo/services/OWNERS rename to media/mojo/services/OWNERS diff --git a/third_party/chromium/media/mojo/services/android_mojo_media_client.cc b/media/mojo/services/android_mojo_media_client.cc similarity index 100% rename from third_party/chromium/media/mojo/services/android_mojo_media_client.cc rename to media/mojo/services/android_mojo_media_client.cc diff --git a/third_party/chromium/media/mojo/services/android_mojo_media_client.h b/media/mojo/services/android_mojo_media_client.h similarity index 100% rename from third_party/chromium/media/mojo/services/android_mojo_media_client.h rename to media/mojo/services/android_mojo_media_client.h diff --git a/third_party/chromium/media/mojo/services/android_mojo_util.cc b/media/mojo/services/android_mojo_util.cc similarity index 100% rename from third_party/chromium/media/mojo/services/android_mojo_util.cc rename to media/mojo/services/android_mojo_util.cc diff --git a/third_party/chromium/media/mojo/services/android_mojo_util.h b/media/mojo/services/android_mojo_util.h similarity index 100% rename from third_party/chromium/media/mojo/services/android_mojo_util.h rename to media/mojo/services/android_mojo_util.h diff --git a/third_party/chromium/media/mojo/services/cdm_service.cc b/media/mojo/services/cdm_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/cdm_service.cc rename to media/mojo/services/cdm_service.cc diff --git a/third_party/chromium/media/mojo/services/cdm_service.h b/media/mojo/services/cdm_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/cdm_service.h rename to media/mojo/services/cdm_service.h diff --git a/third_party/chromium/media/mojo/services/cdm_service_broker.cc b/media/mojo/services/cdm_service_broker.cc similarity index 100% rename from third_party/chromium/media/mojo/services/cdm_service_broker.cc rename to media/mojo/services/cdm_service_broker.cc diff --git a/third_party/chromium/media/mojo/services/cdm_service_broker.h b/media/mojo/services/cdm_service_broker.h similarity index 100% rename from third_party/chromium/media/mojo/services/cdm_service_broker.h rename to media/mojo/services/cdm_service_broker.h diff --git a/third_party/chromium/media/mojo/services/cdm_service_broker_unittest.cc b/media/mojo/services/cdm_service_broker_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/cdm_service_broker_unittest.cc rename to media/mojo/services/cdm_service_broker_unittest.cc diff --git a/third_party/chromium/media/mojo/services/cdm_service_unittest.cc b/media/mojo/services/cdm_service_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/cdm_service_unittest.cc rename to media/mojo/services/cdm_service_unittest.cc diff --git a/third_party/chromium/media/mojo/services/deferred_destroy_unique_receiver_set.h b/media/mojo/services/deferred_destroy_unique_receiver_set.h similarity index 100% rename from third_party/chromium/media/mojo/services/deferred_destroy_unique_receiver_set.h rename to media/mojo/services/deferred_destroy_unique_receiver_set.h diff --git a/third_party/chromium/media/mojo/services/deferred_destroy_unique_receiver_set_unittest.cc b/media/mojo/services/deferred_destroy_unique_receiver_set_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/deferred_destroy_unique_receiver_set_unittest.cc rename to media/mojo/services/deferred_destroy_unique_receiver_set_unittest.cc diff --git a/third_party/chromium/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc similarity index 100% rename from third_party/chromium/media/mojo/services/gpu_mojo_media_client.cc rename to media/mojo/services/gpu_mojo_media_client.cc diff --git a/third_party/chromium/media/mojo/services/gpu_mojo_media_client.h b/media/mojo/services/gpu_mojo_media_client.h similarity index 100% rename from third_party/chromium/media/mojo/services/gpu_mojo_media_client.h rename to media/mojo/services/gpu_mojo_media_client.h diff --git a/third_party/chromium/media/mojo/services/gpu_mojo_media_client_android.cc b/media/mojo/services/gpu_mojo_media_client_android.cc similarity index 100% rename from third_party/chromium/media/mojo/services/gpu_mojo_media_client_android.cc rename to media/mojo/services/gpu_mojo_media_client_android.cc diff --git a/third_party/chromium/media/mojo/services/gpu_mojo_media_client_cros.cc b/media/mojo/services/gpu_mojo_media_client_cros.cc similarity index 100% rename from third_party/chromium/media/mojo/services/gpu_mojo_media_client_cros.cc rename to media/mojo/services/gpu_mojo_media_client_cros.cc diff --git a/third_party/chromium/media/mojo/services/gpu_mojo_media_client_default.cc b/media/mojo/services/gpu_mojo_media_client_default.cc similarity index 100% rename from third_party/chromium/media/mojo/services/gpu_mojo_media_client_default.cc rename to media/mojo/services/gpu_mojo_media_client_default.cc diff --git a/third_party/chromium/media/mojo/services/gpu_mojo_media_client_mac.cc b/media/mojo/services/gpu_mojo_media_client_mac.cc similarity index 100% rename from third_party/chromium/media/mojo/services/gpu_mojo_media_client_mac.cc rename to media/mojo/services/gpu_mojo_media_client_mac.cc diff --git a/third_party/chromium/media/mojo/services/gpu_mojo_media_client_win.cc b/media/mojo/services/gpu_mojo_media_client_win.cc similarity index 100% rename from third_party/chromium/media/mojo/services/gpu_mojo_media_client_win.cc rename to media/mojo/services/gpu_mojo_media_client_win.cc diff --git a/third_party/chromium/media/mojo/services/interface_factory_impl.cc b/media/mojo/services/interface_factory_impl.cc similarity index 100% rename from third_party/chromium/media/mojo/services/interface_factory_impl.cc rename to media/mojo/services/interface_factory_impl.cc diff --git a/third_party/chromium/media/mojo/services/interface_factory_impl.h b/media/mojo/services/interface_factory_impl.h similarity index 100% rename from third_party/chromium/media/mojo/services/interface_factory_impl.h rename to media/mojo/services/interface_factory_impl.h diff --git a/third_party/chromium/media/mojo/services/media_foundation_mojo_media_client.cc b/media/mojo/services/media_foundation_mojo_media_client.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_foundation_mojo_media_client.cc rename to media/mojo/services/media_foundation_mojo_media_client.cc diff --git a/third_party/chromium/media/mojo/services/media_foundation_mojo_media_client.h b/media/mojo/services/media_foundation_mojo_media_client.h similarity index 100% rename from third_party/chromium/media/mojo/services/media_foundation_mojo_media_client.h rename to media/mojo/services/media_foundation_mojo_media_client.h diff --git a/third_party/chromium/media/mojo/services/media_foundation_renderer_wrapper.cc b/media/mojo/services/media_foundation_renderer_wrapper.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_foundation_renderer_wrapper.cc rename to media/mojo/services/media_foundation_renderer_wrapper.cc diff --git a/third_party/chromium/media/mojo/services/media_foundation_renderer_wrapper.h b/media/mojo/services/media_foundation_renderer_wrapper.h similarity index 100% rename from third_party/chromium/media/mojo/services/media_foundation_renderer_wrapper.h rename to media/mojo/services/media_foundation_renderer_wrapper.h diff --git a/third_party/chromium/media/mojo/services/media_foundation_service.cc b/media/mojo/services/media_foundation_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_foundation_service.cc rename to media/mojo/services/media_foundation_service.cc diff --git a/third_party/chromium/media/mojo/services/media_foundation_service.h b/media/mojo/services/media_foundation_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/media_foundation_service.h rename to media/mojo/services/media_foundation_service.h diff --git a/third_party/chromium/media/mojo/services/media_foundation_service_broker.cc b/media/mojo/services/media_foundation_service_broker.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_foundation_service_broker.cc rename to media/mojo/services/media_foundation_service_broker.cc diff --git a/third_party/chromium/media/mojo/services/media_foundation_service_broker.h b/media/mojo/services/media_foundation_service_broker.h similarity index 100% rename from third_party/chromium/media/mojo/services/media_foundation_service_broker.h rename to media/mojo/services/media_foundation_service_broker.h diff --git a/third_party/chromium/media/mojo/services/media_metrics_provider.cc b/media/mojo/services/media_metrics_provider.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_metrics_provider.cc rename to media/mojo/services/media_metrics_provider.cc diff --git a/third_party/chromium/media/mojo/services/media_metrics_provider.h b/media/mojo/services/media_metrics_provider.h similarity index 100% rename from third_party/chromium/media/mojo/services/media_metrics_provider.h rename to media/mojo/services/media_metrics_provider.h diff --git a/third_party/chromium/media/mojo/services/media_metrics_provider_unittest.cc b/media/mojo/services/media_metrics_provider_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_metrics_provider_unittest.cc rename to media/mojo/services/media_metrics_provider_unittest.cc diff --git a/third_party/chromium/media/mojo/services/media_mojo_export.h b/media/mojo/services/media_mojo_export.h similarity index 100% rename from third_party/chromium/media/mojo/services/media_mojo_export.h rename to media/mojo/services/media_mojo_export.h diff --git a/third_party/chromium/media/mojo/services/media_resource_shim.cc b/media/mojo/services/media_resource_shim.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_resource_shim.cc rename to media/mojo/services/media_resource_shim.cc diff --git a/third_party/chromium/media/mojo/services/media_resource_shim.h b/media/mojo/services/media_resource_shim.h similarity index 100% rename from third_party/chromium/media/mojo/services/media_resource_shim.h rename to media/mojo/services/media_resource_shim.h diff --git a/third_party/chromium/media/mojo/services/media_service.cc b/media/mojo/services/media_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_service.cc rename to media/mojo/services/media_service.cc diff --git a/third_party/chromium/media/mojo/services/media_service.h b/media/mojo/services/media_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/media_service.h rename to media/mojo/services/media_service.h diff --git a/third_party/chromium/media/mojo/services/media_service_factory.cc b/media/mojo/services/media_service_factory.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_service_factory.cc rename to media/mojo/services/media_service_factory.cc diff --git a/third_party/chromium/media/mojo/services/media_service_factory.h b/media/mojo/services/media_service_factory.h similarity index 100% rename from third_party/chromium/media/mojo/services/media_service_factory.h rename to media/mojo/services/media_service_factory.h diff --git a/third_party/chromium/media/mojo/services/media_service_unittest.cc b/media/mojo/services/media_service_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/media_service_unittest.cc rename to media/mojo/services/media_service_unittest.cc diff --git a/third_party/chromium/media/mojo/services/mojo_audio_decoder_service.cc b/media/mojo/services/mojo_audio_decoder_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_decoder_service.cc rename to media/mojo/services/mojo_audio_decoder_service.cc diff --git a/third_party/chromium/media/mojo/services/mojo_audio_decoder_service.h b/media/mojo/services/mojo_audio_decoder_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_decoder_service.h rename to media/mojo/services/mojo_audio_decoder_service.h diff --git a/third_party/chromium/media/mojo/services/mojo_audio_input_stream.cc b/media/mojo/services/mojo_audio_input_stream.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_input_stream.cc rename to media/mojo/services/mojo_audio_input_stream.cc diff --git a/third_party/chromium/media/mojo/services/mojo_audio_input_stream.h b/media/mojo/services/mojo_audio_input_stream.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_input_stream.h rename to media/mojo/services/mojo_audio_input_stream.h diff --git a/third_party/chromium/media/mojo/services/mojo_audio_input_stream_unittest.cc b/media/mojo/services/mojo_audio_input_stream_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_input_stream_unittest.cc rename to media/mojo/services/mojo_audio_input_stream_unittest.cc diff --git a/third_party/chromium/media/mojo/services/mojo_audio_output_stream.cc b/media/mojo/services/mojo_audio_output_stream.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_output_stream.cc rename to media/mojo/services/mojo_audio_output_stream.cc diff --git a/third_party/chromium/media/mojo/services/mojo_audio_output_stream.h b/media/mojo/services/mojo_audio_output_stream.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_output_stream.h rename to media/mojo/services/mojo_audio_output_stream.h diff --git a/third_party/chromium/media/mojo/services/mojo_audio_output_stream_provider.cc b/media/mojo/services/mojo_audio_output_stream_provider.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_output_stream_provider.cc rename to media/mojo/services/mojo_audio_output_stream_provider.cc diff --git a/third_party/chromium/media/mojo/services/mojo_audio_output_stream_provider.h b/media/mojo/services/mojo_audio_output_stream_provider.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_output_stream_provider.h rename to media/mojo/services/mojo_audio_output_stream_provider.h diff --git a/third_party/chromium/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc b/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc rename to media/mojo/services/mojo_audio_output_stream_provider_unittest.cc diff --git a/third_party/chromium/media/mojo/services/mojo_audio_output_stream_unittest.cc b/media/mojo/services/mojo_audio_output_stream_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_audio_output_stream_unittest.cc rename to media/mojo/services/mojo_audio_output_stream_unittest.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_allocator.cc b/media/mojo/services/mojo_cdm_allocator.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_allocator.cc rename to media/mojo/services/mojo_cdm_allocator.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_allocator.h b/media/mojo/services/mojo_cdm_allocator.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_allocator.h rename to media/mojo/services/mojo_cdm_allocator.h diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_allocator_unittest.cc b/media/mojo/services/mojo_cdm_allocator_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_allocator_unittest.cc rename to media/mojo/services/mojo_cdm_allocator_unittest.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_file_io.cc b/media/mojo/services/mojo_cdm_file_io.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_file_io.cc rename to media/mojo/services/mojo_cdm_file_io.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_file_io.h b/media/mojo/services/mojo_cdm_file_io.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_file_io.h rename to media/mojo/services/mojo_cdm_file_io.h diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_file_io_unittest.cc b/media/mojo/services/mojo_cdm_file_io_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_file_io_unittest.cc rename to media/mojo/services/mojo_cdm_file_io_unittest.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_helper.cc b/media/mojo/services/mojo_cdm_helper.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_helper.cc rename to media/mojo/services/mojo_cdm_helper.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_helper.h b/media/mojo/services/mojo_cdm_helper.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_helper.h rename to media/mojo/services/mojo_cdm_helper.h diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_helper_unittest.cc b/media/mojo/services/mojo_cdm_helper_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_helper_unittest.cc rename to media/mojo/services/mojo_cdm_helper_unittest.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_promise.cc b/media/mojo/services/mojo_cdm_promise.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_promise.cc rename to media/mojo/services/mojo_cdm_promise.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_promise.h b/media/mojo/services/mojo_cdm_promise.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_promise.h rename to media/mojo/services/mojo_cdm_promise.h diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_service.cc b/media/mojo/services/mojo_cdm_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_service.cc rename to media/mojo/services/mojo_cdm_service.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_service.h b/media/mojo/services/mojo_cdm_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_service.h rename to media/mojo/services/mojo_cdm_service.h diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_service_context.cc b/media/mojo/services/mojo_cdm_service_context.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_service_context.cc rename to media/mojo/services/mojo_cdm_service_context.cc diff --git a/third_party/chromium/media/mojo/services/mojo_cdm_service_context.h b/media/mojo/services/mojo_cdm_service_context.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_cdm_service_context.h rename to media/mojo/services/mojo_cdm_service_context.h diff --git a/third_party/chromium/media/mojo/services/mojo_decryptor_service.cc b/media/mojo/services/mojo_decryptor_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_decryptor_service.cc rename to media/mojo/services/mojo_decryptor_service.cc diff --git a/third_party/chromium/media/mojo/services/mojo_decryptor_service.h b/media/mojo/services/mojo_decryptor_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_decryptor_service.h rename to media/mojo/services/mojo_decryptor_service.h diff --git a/third_party/chromium/media/mojo/services/mojo_demuxer_stream_adapter.cc b/media/mojo/services/mojo_demuxer_stream_adapter.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_demuxer_stream_adapter.cc rename to media/mojo/services/mojo_demuxer_stream_adapter.cc diff --git a/third_party/chromium/media/mojo/services/mojo_demuxer_stream_adapter.h b/media/mojo/services/mojo_demuxer_stream_adapter.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_demuxer_stream_adapter.h rename to media/mojo/services/mojo_demuxer_stream_adapter.h diff --git a/third_party/chromium/media/mojo/services/mojo_media_client.cc b/media/mojo/services/mojo_media_client.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_media_client.cc rename to media/mojo/services/mojo_media_client.cc diff --git a/third_party/chromium/media/mojo/services/mojo_media_client.h b/media/mojo/services/mojo_media_client.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_media_client.h rename to media/mojo/services/mojo_media_client.h diff --git a/third_party/chromium/media/mojo/services/mojo_media_drm_storage.cc b/media/mojo/services/mojo_media_drm_storage.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_media_drm_storage.cc rename to media/mojo/services/mojo_media_drm_storage.cc diff --git a/third_party/chromium/media/mojo/services/mojo_media_drm_storage.h b/media/mojo/services/mojo_media_drm_storage.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_media_drm_storage.h rename to media/mojo/services/mojo_media_drm_storage.h diff --git a/third_party/chromium/media/mojo/services/mojo_media_log.cc b/media/mojo/services/mojo_media_log.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_media_log.cc rename to media/mojo/services/mojo_media_log.cc diff --git a/third_party/chromium/media/mojo/services/mojo_media_log.h b/media/mojo/services/mojo_media_log.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_media_log.h rename to media/mojo/services/mojo_media_log.h diff --git a/third_party/chromium/media/mojo/services/mojo_provision_fetcher.cc b/media/mojo/services/mojo_provision_fetcher.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_provision_fetcher.cc rename to media/mojo/services/mojo_provision_fetcher.cc diff --git a/third_party/chromium/media/mojo/services/mojo_provision_fetcher.h b/media/mojo/services/mojo_provision_fetcher.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_provision_fetcher.h rename to media/mojo/services/mojo_provision_fetcher.h diff --git a/third_party/chromium/media/mojo/services/mojo_renderer_service.cc b/media/mojo/services/mojo_renderer_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_renderer_service.cc rename to media/mojo/services/mojo_renderer_service.cc diff --git a/third_party/chromium/media/mojo/services/mojo_renderer_service.h b/media/mojo/services/mojo_renderer_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_renderer_service.h rename to media/mojo/services/mojo_renderer_service.h diff --git a/third_party/chromium/media/mojo/services/mojo_video_decoder_service.cc b/media/mojo/services/mojo_video_decoder_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_video_decoder_service.cc rename to media/mojo/services/mojo_video_decoder_service.cc diff --git a/third_party/chromium/media/mojo/services/mojo_video_decoder_service.h b/media/mojo/services/mojo_video_decoder_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_video_decoder_service.h rename to media/mojo/services/mojo_video_decoder_service.h diff --git a/third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_provider.cc b/media/mojo/services/mojo_video_encode_accelerator_provider.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_provider.cc rename to media/mojo/services/mojo_video_encode_accelerator_provider.cc diff --git a/third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_provider.h b/media/mojo/services/mojo_video_encode_accelerator_provider.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_provider.h rename to media/mojo/services/mojo_video_encode_accelerator_provider.h diff --git a/third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_service.cc b/media/mojo/services/mojo_video_encode_accelerator_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_service.cc rename to media/mojo/services/mojo_video_encode_accelerator_service.cc diff --git a/third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_service.h b/media/mojo/services/mojo_video_encode_accelerator_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_service.h rename to media/mojo/services/mojo_video_encode_accelerator_service.h diff --git a/third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc b/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc rename to media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc diff --git a/third_party/chromium/media/mojo/services/playback_events_recorder.cc b/media/mojo/services/playback_events_recorder.cc similarity index 100% rename from third_party/chromium/media/mojo/services/playback_events_recorder.cc rename to media/mojo/services/playback_events_recorder.cc diff --git a/third_party/chromium/media/mojo/services/playback_events_recorder.h b/media/mojo/services/playback_events_recorder.h similarity index 100% rename from third_party/chromium/media/mojo/services/playback_events_recorder.h rename to media/mojo/services/playback_events_recorder.h diff --git a/third_party/chromium/media/mojo/services/playback_events_recorder_test.cc b/media/mojo/services/playback_events_recorder_test.cc similarity index 100% rename from third_party/chromium/media/mojo/services/playback_events_recorder_test.cc rename to media/mojo/services/playback_events_recorder_test.cc diff --git a/third_party/chromium/media/mojo/services/stable_video_decoder_factory_service.cc b/media/mojo/services/stable_video_decoder_factory_service.cc similarity index 100% rename from third_party/chromium/media/mojo/services/stable_video_decoder_factory_service.cc rename to media/mojo/services/stable_video_decoder_factory_service.cc diff --git a/third_party/chromium/media/mojo/services/stable_video_decoder_factory_service.h b/media/mojo/services/stable_video_decoder_factory_service.h similarity index 100% rename from third_party/chromium/media/mojo/services/stable_video_decoder_factory_service.h rename to media/mojo/services/stable_video_decoder_factory_service.h diff --git a/third_party/chromium/media/mojo/services/test_helpers.cc b/media/mojo/services/test_helpers.cc similarity index 100% rename from third_party/chromium/media/mojo/services/test_helpers.cc rename to media/mojo/services/test_helpers.cc diff --git a/third_party/chromium/media/mojo/services/test_helpers.h b/media/mojo/services/test_helpers.h similarity index 100% rename from third_party/chromium/media/mojo/services/test_helpers.h rename to media/mojo/services/test_helpers.h diff --git a/third_party/chromium/media/mojo/services/test_mojo_media_client.cc b/media/mojo/services/test_mojo_media_client.cc similarity index 100% rename from third_party/chromium/media/mojo/services/test_mojo_media_client.cc rename to media/mojo/services/test_mojo_media_client.cc diff --git a/third_party/chromium/media/mojo/services/test_mojo_media_client.h b/media/mojo/services/test_mojo_media_client.h similarity index 100% rename from third_party/chromium/media/mojo/services/test_mojo_media_client.h rename to media/mojo/services/test_mojo_media_client.h diff --git a/third_party/chromium/media/mojo/services/video_decode_perf_history.cc b/media/mojo/services/video_decode_perf_history.cc similarity index 100% rename from third_party/chromium/media/mojo/services/video_decode_perf_history.cc rename to media/mojo/services/video_decode_perf_history.cc diff --git a/third_party/chromium/media/mojo/services/video_decode_perf_history.h b/media/mojo/services/video_decode_perf_history.h similarity index 100% rename from third_party/chromium/media/mojo/services/video_decode_perf_history.h rename to media/mojo/services/video_decode_perf_history.h diff --git a/third_party/chromium/media/mojo/services/video_decode_perf_history_unittest.cc b/media/mojo/services/video_decode_perf_history_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/video_decode_perf_history_unittest.cc rename to media/mojo/services/video_decode_perf_history_unittest.cc diff --git a/third_party/chromium/media/mojo/services/video_decode_stats_recorder.cc b/media/mojo/services/video_decode_stats_recorder.cc similarity index 100% rename from third_party/chromium/media/mojo/services/video_decode_stats_recorder.cc rename to media/mojo/services/video_decode_stats_recorder.cc diff --git a/third_party/chromium/media/mojo/services/video_decode_stats_recorder.h b/media/mojo/services/video_decode_stats_recorder.h similarity index 100% rename from third_party/chromium/media/mojo/services/video_decode_stats_recorder.h rename to media/mojo/services/video_decode_stats_recorder.h diff --git a/third_party/chromium/media/mojo/services/video_decode_stats_recorder_unittest.cc b/media/mojo/services/video_decode_stats_recorder_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/video_decode_stats_recorder_unittest.cc rename to media/mojo/services/video_decode_stats_recorder_unittest.cc diff --git a/third_party/chromium/media/mojo/services/watch_time_recorder.cc b/media/mojo/services/watch_time_recorder.cc similarity index 100% rename from third_party/chromium/media/mojo/services/watch_time_recorder.cc rename to media/mojo/services/watch_time_recorder.cc diff --git a/third_party/chromium/media/mojo/services/watch_time_recorder.h b/media/mojo/services/watch_time_recorder.h similarity index 100% rename from third_party/chromium/media/mojo/services/watch_time_recorder.h rename to media/mojo/services/watch_time_recorder.h diff --git a/third_party/chromium/media/mojo/services/watch_time_recorder_unittest.cc b/media/mojo/services/watch_time_recorder_unittest.cc similarity index 100% rename from third_party/chromium/media/mojo/services/watch_time_recorder_unittest.cc rename to media/mojo/services/watch_time_recorder_unittest.cc diff --git a/third_party/chromium/media/mojo/test/BUILD.gn b/media/mojo/test/BUILD.gn similarity index 100% rename from third_party/chromium/media/mojo/test/BUILD.gn rename to media/mojo/test/BUILD.gn diff --git a/third_party/chromium/media/mojo/test/mojo_video_decoder_integration_test.cc b/media/mojo/test/mojo_video_decoder_integration_test.cc similarity index 100% rename from third_party/chromium/media/mojo/test/mojo_video_decoder_integration_test.cc rename to media/mojo/test/mojo_video_decoder_integration_test.cc diff --git a/third_party/chromium/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc similarity index 100% rename from third_party/chromium/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc rename to media/mojo/test/mojo_video_encode_accelerator_integration_test.cc diff --git a/third_party/chromium/media/muxers/BUILD.gn b/media/muxers/BUILD.gn similarity index 100% rename from third_party/chromium/media/muxers/BUILD.gn rename to media/muxers/BUILD.gn diff --git a/third_party/chromium/media/muxers/DEPS b/media/muxers/DEPS similarity index 100% rename from third_party/chromium/media/muxers/DEPS rename to media/muxers/DEPS diff --git a/third_party/chromium/media/muxers/DIR_METADATA b/media/muxers/DIR_METADATA similarity index 100% rename from third_party/chromium/media/muxers/DIR_METADATA rename to media/muxers/DIR_METADATA diff --git a/third_party/chromium/media/muxers/OWNERS b/media/muxers/OWNERS similarity index 100% rename from third_party/chromium/media/muxers/OWNERS rename to media/muxers/OWNERS diff --git a/third_party/chromium/media/muxers/file_webm_muxer_delegate.cc b/media/muxers/file_webm_muxer_delegate.cc similarity index 100% rename from third_party/chromium/media/muxers/file_webm_muxer_delegate.cc rename to media/muxers/file_webm_muxer_delegate.cc diff --git a/third_party/chromium/media/muxers/file_webm_muxer_delegate.h b/media/muxers/file_webm_muxer_delegate.h similarity index 100% rename from third_party/chromium/media/muxers/file_webm_muxer_delegate.h rename to media/muxers/file_webm_muxer_delegate.h diff --git a/third_party/chromium/media/muxers/live_webm_muxer_delegate.cc b/media/muxers/live_webm_muxer_delegate.cc similarity index 100% rename from third_party/chromium/media/muxers/live_webm_muxer_delegate.cc rename to media/muxers/live_webm_muxer_delegate.cc diff --git a/third_party/chromium/media/muxers/live_webm_muxer_delegate.h b/media/muxers/live_webm_muxer_delegate.h similarity index 100% rename from third_party/chromium/media/muxers/live_webm_muxer_delegate.h rename to media/muxers/live_webm_muxer_delegate.h diff --git a/third_party/chromium/media/muxers/webm_muxer.cc b/media/muxers/webm_muxer.cc similarity index 100% rename from third_party/chromium/media/muxers/webm_muxer.cc rename to media/muxers/webm_muxer.cc diff --git a/third_party/chromium/media/muxers/webm_muxer.h b/media/muxers/webm_muxer.h similarity index 100% rename from third_party/chromium/media/muxers/webm_muxer.h rename to media/muxers/webm_muxer.h diff --git a/third_party/chromium/media/muxers/webm_muxer_fuzzertest.cc b/media/muxers/webm_muxer_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/muxers/webm_muxer_fuzzertest.cc rename to media/muxers/webm_muxer_fuzzertest.cc diff --git a/third_party/chromium/media/muxers/webm_muxer_unittest.cc b/media/muxers/webm_muxer_unittest.cc similarity index 100% rename from third_party/chromium/media/muxers/webm_muxer_unittest.cc rename to media/muxers/webm_muxer_unittest.cc diff --git a/third_party/chromium/media/parsers/BUILD.gn b/media/parsers/BUILD.gn similarity index 100% rename from third_party/chromium/media/parsers/BUILD.gn rename to media/parsers/BUILD.gn diff --git a/third_party/chromium/media/parsers/jpeg_parser.cc b/media/parsers/jpeg_parser.cc similarity index 100% rename from third_party/chromium/media/parsers/jpeg_parser.cc rename to media/parsers/jpeg_parser.cc diff --git a/third_party/chromium/media/parsers/jpeg_parser.h b/media/parsers/jpeg_parser.h similarity index 100% rename from third_party/chromium/media/parsers/jpeg_parser.h rename to media/parsers/jpeg_parser.h diff --git a/third_party/chromium/media/parsers/jpeg_parser_picture_fuzzertest.cc b/media/parsers/jpeg_parser_picture_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/parsers/jpeg_parser_picture_fuzzertest.cc rename to media/parsers/jpeg_parser_picture_fuzzertest.cc diff --git a/third_party/chromium/media/parsers/jpeg_parser_unittest.cc b/media/parsers/jpeg_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/parsers/jpeg_parser_unittest.cc rename to media/parsers/jpeg_parser_unittest.cc diff --git a/third_party/chromium/media/parsers/media_parsers_export.h b/media/parsers/media_parsers_export.h similarity index 100% rename from third_party/chromium/media/parsers/media_parsers_export.h rename to media/parsers/media_parsers_export.h diff --git a/third_party/chromium/media/parsers/vp8_bool_decoder.cc b/media/parsers/vp8_bool_decoder.cc similarity index 100% rename from third_party/chromium/media/parsers/vp8_bool_decoder.cc rename to media/parsers/vp8_bool_decoder.cc diff --git a/third_party/chromium/media/parsers/vp8_bool_decoder.h b/media/parsers/vp8_bool_decoder.h similarity index 100% rename from third_party/chromium/media/parsers/vp8_bool_decoder.h rename to media/parsers/vp8_bool_decoder.h diff --git a/third_party/chromium/media/parsers/vp8_bool_decoder_unittest.cc b/media/parsers/vp8_bool_decoder_unittest.cc similarity index 100% rename from third_party/chromium/media/parsers/vp8_bool_decoder_unittest.cc rename to media/parsers/vp8_bool_decoder_unittest.cc diff --git a/third_party/chromium/media/parsers/vp8_parser.cc b/media/parsers/vp8_parser.cc similarity index 100% rename from third_party/chromium/media/parsers/vp8_parser.cc rename to media/parsers/vp8_parser.cc diff --git a/third_party/chromium/media/parsers/vp8_parser.h b/media/parsers/vp8_parser.h similarity index 100% rename from third_party/chromium/media/parsers/vp8_parser.h rename to media/parsers/vp8_parser.h diff --git a/third_party/chromium/media/parsers/vp8_parser_fuzzertest.cc b/media/parsers/vp8_parser_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/parsers/vp8_parser_fuzzertest.cc rename to media/parsers/vp8_parser_fuzzertest.cc diff --git a/third_party/chromium/media/parsers/vp8_parser_unittest.cc b/media/parsers/vp8_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/parsers/vp8_parser_unittest.cc rename to media/parsers/vp8_parser_unittest.cc diff --git a/third_party/chromium/media/parsers/webp_parser.cc b/media/parsers/webp_parser.cc similarity index 100% rename from third_party/chromium/media/parsers/webp_parser.cc rename to media/parsers/webp_parser.cc diff --git a/third_party/chromium/media/parsers/webp_parser.h b/media/parsers/webp_parser.h similarity index 100% rename from third_party/chromium/media/parsers/webp_parser.h rename to media/parsers/webp_parser.h diff --git a/third_party/chromium/media/parsers/webp_parser_fuzzertest.cc b/media/parsers/webp_parser_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/parsers/webp_parser_fuzzertest.cc rename to media/parsers/webp_parser_fuzzertest.cc diff --git a/third_party/chromium/media/parsers/webp_parser_unittest.cc b/media/parsers/webp_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/parsers/webp_parser_unittest.cc rename to media/parsers/webp_parser_unittest.cc diff --git a/third_party/chromium/media/remoting/BUILD.gn b/media/remoting/BUILD.gn similarity index 100% rename from third_party/chromium/media/remoting/BUILD.gn rename to media/remoting/BUILD.gn diff --git a/third_party/chromium/media/remoting/DEPS b/media/remoting/DEPS similarity index 100% rename from third_party/chromium/media/remoting/DEPS rename to media/remoting/DEPS diff --git a/third_party/chromium/media/remoting/DIR_METADATA b/media/remoting/DIR_METADATA similarity index 100% rename from third_party/chromium/media/remoting/DIR_METADATA rename to media/remoting/DIR_METADATA diff --git a/third_party/chromium/media/remoting/OWNERS b/media/remoting/OWNERS similarity index 100% rename from third_party/chromium/media/remoting/OWNERS rename to media/remoting/OWNERS diff --git a/third_party/chromium/media/remoting/README b/media/remoting/README similarity index 100% rename from third_party/chromium/media/remoting/README rename to media/remoting/README diff --git a/third_party/chromium/media/remoting/courier_renderer.cc b/media/remoting/courier_renderer.cc similarity index 100% rename from third_party/chromium/media/remoting/courier_renderer.cc rename to media/remoting/courier_renderer.cc diff --git a/third_party/chromium/media/remoting/courier_renderer.h b/media/remoting/courier_renderer.h similarity index 100% rename from third_party/chromium/media/remoting/courier_renderer.h rename to media/remoting/courier_renderer.h diff --git a/third_party/chromium/media/remoting/courier_renderer_factory.cc b/media/remoting/courier_renderer_factory.cc similarity index 100% rename from third_party/chromium/media/remoting/courier_renderer_factory.cc rename to media/remoting/courier_renderer_factory.cc diff --git a/third_party/chromium/media/remoting/courier_renderer_factory.h b/media/remoting/courier_renderer_factory.h similarity index 100% rename from third_party/chromium/media/remoting/courier_renderer_factory.h rename to media/remoting/courier_renderer_factory.h diff --git a/third_party/chromium/media/remoting/courier_renderer_unittest.cc b/media/remoting/courier_renderer_unittest.cc similarity index 100% rename from third_party/chromium/media/remoting/courier_renderer_unittest.cc rename to media/remoting/courier_renderer_unittest.cc diff --git a/third_party/chromium/media/remoting/demuxer_stream_adapter.cc b/media/remoting/demuxer_stream_adapter.cc similarity index 100% rename from third_party/chromium/media/remoting/demuxer_stream_adapter.cc rename to media/remoting/demuxer_stream_adapter.cc diff --git a/third_party/chromium/media/remoting/demuxer_stream_adapter.h b/media/remoting/demuxer_stream_adapter.h similarity index 100% rename from third_party/chromium/media/remoting/demuxer_stream_adapter.h rename to media/remoting/demuxer_stream_adapter.h diff --git a/third_party/chromium/media/remoting/demuxer_stream_adapter_unittest.cc b/media/remoting/demuxer_stream_adapter_unittest.cc similarity index 100% rename from third_party/chromium/media/remoting/demuxer_stream_adapter_unittest.cc rename to media/remoting/demuxer_stream_adapter_unittest.cc diff --git a/third_party/chromium/media/remoting/end2end_test_renderer.cc b/media/remoting/end2end_test_renderer.cc similarity index 100% rename from third_party/chromium/media/remoting/end2end_test_renderer.cc rename to media/remoting/end2end_test_renderer.cc diff --git a/third_party/chromium/media/remoting/end2end_test_renderer.h b/media/remoting/end2end_test_renderer.h similarity index 100% rename from third_party/chromium/media/remoting/end2end_test_renderer.h rename to media/remoting/end2end_test_renderer.h diff --git a/third_party/chromium/media/remoting/fake_media_resource.cc b/media/remoting/fake_media_resource.cc similarity index 100% rename from third_party/chromium/media/remoting/fake_media_resource.cc rename to media/remoting/fake_media_resource.cc diff --git a/third_party/chromium/media/remoting/fake_media_resource.h b/media/remoting/fake_media_resource.h similarity index 100% rename from third_party/chromium/media/remoting/fake_media_resource.h rename to media/remoting/fake_media_resource.h diff --git a/third_party/chromium/media/remoting/fake_remoter.cc b/media/remoting/fake_remoter.cc similarity index 100% rename from third_party/chromium/media/remoting/fake_remoter.cc rename to media/remoting/fake_remoter.cc diff --git a/third_party/chromium/media/remoting/fake_remoter.h b/media/remoting/fake_remoter.h similarity index 100% rename from third_party/chromium/media/remoting/fake_remoter.h rename to media/remoting/fake_remoter.h diff --git a/third_party/chromium/media/remoting/integration_test.cc b/media/remoting/integration_test.cc similarity index 100% rename from third_party/chromium/media/remoting/integration_test.cc rename to media/remoting/integration_test.cc diff --git a/third_party/chromium/media/remoting/metrics.cc b/media/remoting/metrics.cc similarity index 100% rename from third_party/chromium/media/remoting/metrics.cc rename to media/remoting/metrics.cc diff --git a/third_party/chromium/media/remoting/metrics.h b/media/remoting/metrics.h similarity index 100% rename from third_party/chromium/media/remoting/metrics.h rename to media/remoting/metrics.h diff --git a/third_party/chromium/media/remoting/metrics_unittest.cc b/media/remoting/metrics_unittest.cc similarity index 100% rename from third_party/chromium/media/remoting/metrics_unittest.cc rename to media/remoting/metrics_unittest.cc diff --git a/third_party/chromium/media/remoting/mock_receiver_controller.cc b/media/remoting/mock_receiver_controller.cc similarity index 100% rename from third_party/chromium/media/remoting/mock_receiver_controller.cc rename to media/remoting/mock_receiver_controller.cc diff --git a/third_party/chromium/media/remoting/mock_receiver_controller.h b/media/remoting/mock_receiver_controller.h similarity index 100% rename from third_party/chromium/media/remoting/mock_receiver_controller.h rename to media/remoting/mock_receiver_controller.h diff --git a/third_party/chromium/media/remoting/proto_enum_utils.cc b/media/remoting/proto_enum_utils.cc similarity index 100% rename from third_party/chromium/media/remoting/proto_enum_utils.cc rename to media/remoting/proto_enum_utils.cc diff --git a/third_party/chromium/media/remoting/proto_enum_utils.h b/media/remoting/proto_enum_utils.h similarity index 100% rename from third_party/chromium/media/remoting/proto_enum_utils.h rename to media/remoting/proto_enum_utils.h diff --git a/third_party/chromium/media/remoting/proto_utils.cc b/media/remoting/proto_utils.cc similarity index 100% rename from third_party/chromium/media/remoting/proto_utils.cc rename to media/remoting/proto_utils.cc diff --git a/third_party/chromium/media/remoting/proto_utils.h b/media/remoting/proto_utils.h similarity index 100% rename from third_party/chromium/media/remoting/proto_utils.h rename to media/remoting/proto_utils.h diff --git a/third_party/chromium/media/remoting/proto_utils_unittest.cc b/media/remoting/proto_utils_unittest.cc similarity index 100% rename from third_party/chromium/media/remoting/proto_utils_unittest.cc rename to media/remoting/proto_utils_unittest.cc diff --git a/third_party/chromium/media/remoting/receiver.cc b/media/remoting/receiver.cc similarity index 100% rename from third_party/chromium/media/remoting/receiver.cc rename to media/remoting/receiver.cc diff --git a/third_party/chromium/media/remoting/receiver.h b/media/remoting/receiver.h similarity index 100% rename from third_party/chromium/media/remoting/receiver.h rename to media/remoting/receiver.h diff --git a/third_party/chromium/media/remoting/receiver_controller.cc b/media/remoting/receiver_controller.cc similarity index 100% rename from third_party/chromium/media/remoting/receiver_controller.cc rename to media/remoting/receiver_controller.cc diff --git a/third_party/chromium/media/remoting/receiver_controller.h b/media/remoting/receiver_controller.h similarity index 100% rename from third_party/chromium/media/remoting/receiver_controller.h rename to media/remoting/receiver_controller.h diff --git a/third_party/chromium/media/remoting/receiver_unittest.cc b/media/remoting/receiver_unittest.cc similarity index 100% rename from third_party/chromium/media/remoting/receiver_unittest.cc rename to media/remoting/receiver_unittest.cc diff --git a/third_party/chromium/media/remoting/remoting_constants.h b/media/remoting/remoting_constants.h similarity index 100% rename from third_party/chromium/media/remoting/remoting_constants.h rename to media/remoting/remoting_constants.h diff --git a/third_party/chromium/media/remoting/remoting_renderer_factory.cc b/media/remoting/remoting_renderer_factory.cc similarity index 100% rename from third_party/chromium/media/remoting/remoting_renderer_factory.cc rename to media/remoting/remoting_renderer_factory.cc diff --git a/third_party/chromium/media/remoting/remoting_renderer_factory.h b/media/remoting/remoting_renderer_factory.h similarity index 100% rename from third_party/chromium/media/remoting/remoting_renderer_factory.h rename to media/remoting/remoting_renderer_factory.h diff --git a/third_party/chromium/media/remoting/renderer_controller.cc b/media/remoting/renderer_controller.cc similarity index 100% rename from third_party/chromium/media/remoting/renderer_controller.cc rename to media/remoting/renderer_controller.cc diff --git a/third_party/chromium/media/remoting/renderer_controller.h b/media/remoting/renderer_controller.h similarity index 100% rename from third_party/chromium/media/remoting/renderer_controller.h rename to media/remoting/renderer_controller.h diff --git a/third_party/chromium/media/remoting/renderer_controller_unittest.cc b/media/remoting/renderer_controller_unittest.cc similarity index 100% rename from third_party/chromium/media/remoting/renderer_controller_unittest.cc rename to media/remoting/renderer_controller_unittest.cc diff --git a/third_party/chromium/media/remoting/stream_provider.cc b/media/remoting/stream_provider.cc similarity index 100% rename from third_party/chromium/media/remoting/stream_provider.cc rename to media/remoting/stream_provider.cc diff --git a/third_party/chromium/media/remoting/stream_provider.h b/media/remoting/stream_provider.h similarity index 100% rename from third_party/chromium/media/remoting/stream_provider.h rename to media/remoting/stream_provider.h diff --git a/third_party/chromium/media/remoting/stream_provider_unittest.cc b/media/remoting/stream_provider_unittest.cc similarity index 100% rename from third_party/chromium/media/remoting/stream_provider_unittest.cc rename to media/remoting/stream_provider_unittest.cc diff --git a/third_party/chromium/media/remoting/test_utils.cc b/media/remoting/test_utils.cc similarity index 100% rename from third_party/chromium/media/remoting/test_utils.cc rename to media/remoting/test_utils.cc diff --git a/third_party/chromium/media/remoting/test_utils.h b/media/remoting/test_utils.h similarity index 100% rename from third_party/chromium/media/remoting/test_utils.h rename to media/remoting/test_utils.h diff --git a/third_party/chromium/media/remoting/triggers.h b/media/remoting/triggers.h similarity index 100% rename from third_party/chromium/media/remoting/triggers.h rename to media/remoting/triggers.h diff --git a/third_party/chromium/media/renderers/BUILD.gn b/media/renderers/BUILD.gn similarity index 100% rename from third_party/chromium/media/renderers/BUILD.gn rename to media/renderers/BUILD.gn diff --git a/third_party/chromium/media/renderers/DEPS b/media/renderers/DEPS similarity index 100% rename from third_party/chromium/media/renderers/DEPS rename to media/renderers/DEPS diff --git a/third_party/chromium/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc similarity index 100% rename from third_party/chromium/media/renderers/audio_renderer_impl.cc rename to media/renderers/audio_renderer_impl.cc diff --git a/third_party/chromium/media/renderers/audio_renderer_impl.h b/media/renderers/audio_renderer_impl.h similarity index 100% rename from third_party/chromium/media/renderers/audio_renderer_impl.h rename to media/renderers/audio_renderer_impl.h diff --git a/third_party/chromium/media/renderers/audio_renderer_impl_unittest.cc b/media/renderers/audio_renderer_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/renderers/audio_renderer_impl_unittest.cc rename to media/renderers/audio_renderer_impl_unittest.cc diff --git a/third_party/chromium/media/renderers/decrypting_renderer.cc b/media/renderers/decrypting_renderer.cc similarity index 100% rename from third_party/chromium/media/renderers/decrypting_renderer.cc rename to media/renderers/decrypting_renderer.cc diff --git a/third_party/chromium/media/renderers/decrypting_renderer.h b/media/renderers/decrypting_renderer.h similarity index 100% rename from third_party/chromium/media/renderers/decrypting_renderer.h rename to media/renderers/decrypting_renderer.h diff --git a/third_party/chromium/media/renderers/decrypting_renderer_factory.cc b/media/renderers/decrypting_renderer_factory.cc similarity index 100% rename from third_party/chromium/media/renderers/decrypting_renderer_factory.cc rename to media/renderers/decrypting_renderer_factory.cc diff --git a/third_party/chromium/media/renderers/decrypting_renderer_factory.h b/media/renderers/decrypting_renderer_factory.h similarity index 100% rename from third_party/chromium/media/renderers/decrypting_renderer_factory.h rename to media/renderers/decrypting_renderer_factory.h diff --git a/third_party/chromium/media/renderers/decrypting_renderer_unittest.cc b/media/renderers/decrypting_renderer_unittest.cc similarity index 100% rename from third_party/chromium/media/renderers/decrypting_renderer_unittest.cc rename to media/renderers/decrypting_renderer_unittest.cc diff --git a/third_party/chromium/media/renderers/default_decoder_factory.cc b/media/renderers/default_decoder_factory.cc similarity index 100% rename from third_party/chromium/media/renderers/default_decoder_factory.cc rename to media/renderers/default_decoder_factory.cc diff --git a/third_party/chromium/media/renderers/default_decoder_factory.h b/media/renderers/default_decoder_factory.h similarity index 100% rename from third_party/chromium/media/renderers/default_decoder_factory.h rename to media/renderers/default_decoder_factory.h diff --git a/third_party/chromium/media/renderers/default_renderer_factory.cc b/media/renderers/default_renderer_factory.cc similarity index 100% rename from third_party/chromium/media/renderers/default_renderer_factory.cc rename to media/renderers/default_renderer_factory.cc diff --git a/third_party/chromium/media/renderers/default_renderer_factory.h b/media/renderers/default_renderer_factory.h similarity index 100% rename from third_party/chromium/media/renderers/default_renderer_factory.h rename to media/renderers/default_renderer_factory.h diff --git a/third_party/chromium/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc similarity index 100% rename from third_party/chromium/media/renderers/paint_canvas_video_renderer.cc rename to media/renderers/paint_canvas_video_renderer.cc diff --git a/third_party/chromium/media/renderers/paint_canvas_video_renderer.h b/media/renderers/paint_canvas_video_renderer.h similarity index 100% rename from third_party/chromium/media/renderers/paint_canvas_video_renderer.h rename to media/renderers/paint_canvas_video_renderer.h diff --git a/third_party/chromium/media/renderers/paint_canvas_video_renderer_unittest.cc b/media/renderers/paint_canvas_video_renderer_unittest.cc similarity index 100% rename from third_party/chromium/media/renderers/paint_canvas_video_renderer_unittest.cc rename to media/renderers/paint_canvas_video_renderer_unittest.cc diff --git a/third_party/chromium/media/renderers/remote_playback_client_wrapper.h b/media/renderers/remote_playback_client_wrapper.h similarity index 100% rename from third_party/chromium/media/renderers/remote_playback_client_wrapper.h rename to media/renderers/remote_playback_client_wrapper.h diff --git a/third_party/chromium/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc similarity index 100% rename from third_party/chromium/media/renderers/renderer_impl.cc rename to media/renderers/renderer_impl.cc diff --git a/third_party/chromium/media/renderers/renderer_impl.h b/media/renderers/renderer_impl.h similarity index 100% rename from third_party/chromium/media/renderers/renderer_impl.h rename to media/renderers/renderer_impl.h diff --git a/third_party/chromium/media/renderers/renderer_impl_unittest.cc b/media/renderers/renderer_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/renderers/renderer_impl_unittest.cc rename to media/renderers/renderer_impl_unittest.cc diff --git a/third_party/chromium/media/renderers/shared_image_video_frame_test_utils.cc b/media/renderers/shared_image_video_frame_test_utils.cc similarity index 100% rename from third_party/chromium/media/renderers/shared_image_video_frame_test_utils.cc rename to media/renderers/shared_image_video_frame_test_utils.cc diff --git a/third_party/chromium/media/renderers/shared_image_video_frame_test_utils.h b/media/renderers/shared_image_video_frame_test_utils.h similarity index 100% rename from third_party/chromium/media/renderers/shared_image_video_frame_test_utils.h rename to media/renderers/shared_image_video_frame_test_utils.h diff --git a/third_party/chromium/media/renderers/video_frame_rgba_to_yuva_converter.cc b/media/renderers/video_frame_rgba_to_yuva_converter.cc similarity index 100% rename from third_party/chromium/media/renderers/video_frame_rgba_to_yuva_converter.cc rename to media/renderers/video_frame_rgba_to_yuva_converter.cc diff --git a/third_party/chromium/media/renderers/video_frame_rgba_to_yuva_converter.h b/media/renderers/video_frame_rgba_to_yuva_converter.h similarity index 100% rename from third_party/chromium/media/renderers/video_frame_rgba_to_yuva_converter.h rename to media/renderers/video_frame_rgba_to_yuva_converter.h diff --git a/third_party/chromium/media/renderers/video_frame_yuv_converter.cc b/media/renderers/video_frame_yuv_converter.cc similarity index 100% rename from third_party/chromium/media/renderers/video_frame_yuv_converter.cc rename to media/renderers/video_frame_yuv_converter.cc diff --git a/third_party/chromium/media/renderers/video_frame_yuv_converter.h b/media/renderers/video_frame_yuv_converter.h similarity index 100% rename from third_party/chromium/media/renderers/video_frame_yuv_converter.h rename to media/renderers/video_frame_yuv_converter.h diff --git a/third_party/chromium/media/renderers/video_frame_yuv_mailboxes_holder.cc b/media/renderers/video_frame_yuv_mailboxes_holder.cc similarity index 100% rename from third_party/chromium/media/renderers/video_frame_yuv_mailboxes_holder.cc rename to media/renderers/video_frame_yuv_mailboxes_holder.cc diff --git a/third_party/chromium/media/renderers/video_frame_yuv_mailboxes_holder.h b/media/renderers/video_frame_yuv_mailboxes_holder.h similarity index 100% rename from third_party/chromium/media/renderers/video_frame_yuv_mailboxes_holder.h rename to media/renderers/video_frame_yuv_mailboxes_holder.h diff --git a/third_party/chromium/media/renderers/video_overlay_factory.cc b/media/renderers/video_overlay_factory.cc similarity index 100% rename from third_party/chromium/media/renderers/video_overlay_factory.cc rename to media/renderers/video_overlay_factory.cc diff --git a/third_party/chromium/media/renderers/video_overlay_factory.h b/media/renderers/video_overlay_factory.h similarity index 100% rename from third_party/chromium/media/renderers/video_overlay_factory.h rename to media/renderers/video_overlay_factory.h diff --git a/third_party/chromium/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc similarity index 100% rename from third_party/chromium/media/renderers/video_renderer_impl.cc rename to media/renderers/video_renderer_impl.cc diff --git a/third_party/chromium/media/renderers/video_renderer_impl.h b/media/renderers/video_renderer_impl.h similarity index 100% rename from third_party/chromium/media/renderers/video_renderer_impl.h rename to media/renderers/video_renderer_impl.h diff --git a/third_party/chromium/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc similarity index 100% rename from third_party/chromium/media/renderers/video_renderer_impl_unittest.cc rename to media/renderers/video_renderer_impl_unittest.cc diff --git a/third_party/chromium/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc similarity index 100% rename from third_party/chromium/media/renderers/video_resource_updater.cc rename to media/renderers/video_resource_updater.cc diff --git a/third_party/chromium/media/renderers/video_resource_updater.h b/media/renderers/video_resource_updater.h similarity index 100% rename from third_party/chromium/media/renderers/video_resource_updater.h rename to media/renderers/video_resource_updater.h diff --git a/third_party/chromium/media/renderers/video_resource_updater_unittest.cc b/media/renderers/video_resource_updater_unittest.cc similarity index 100% rename from third_party/chromium/media/renderers/video_resource_updater_unittest.cc rename to media/renderers/video_resource_updater_unittest.cc diff --git a/third_party/chromium/media/renderers/win/media_engine_extension.cc b/media/renderers/win/media_engine_extension.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_engine_extension.cc rename to media/renderers/win/media_engine_extension.cc diff --git a/third_party/chromium/media/renderers/win/media_engine_extension.h b/media/renderers/win/media_engine_extension.h similarity index 100% rename from third_party/chromium/media/renderers/win/media_engine_extension.h rename to media/renderers/win/media_engine_extension.h diff --git a/third_party/chromium/media/renderers/win/media_engine_notify_impl.cc b/media/renderers/win/media_engine_notify_impl.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_engine_notify_impl.cc rename to media/renderers/win/media_engine_notify_impl.cc diff --git a/third_party/chromium/media/renderers/win/media_engine_notify_impl.h b/media/renderers/win/media_engine_notify_impl.h similarity index 100% rename from third_party/chromium/media/renderers/win/media_engine_notify_impl.h rename to media/renderers/win/media_engine_notify_impl.h diff --git a/third_party/chromium/media/renderers/win/media_foundation_audio_stream.cc b/media/renderers/win/media_foundation_audio_stream.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_audio_stream.cc rename to media/renderers/win/media_foundation_audio_stream.cc diff --git a/third_party/chromium/media/renderers/win/media_foundation_audio_stream.h b/media/renderers/win/media_foundation_audio_stream.h similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_audio_stream.h rename to media/renderers/win/media_foundation_audio_stream.h diff --git a/third_party/chromium/media/renderers/win/media_foundation_protection_manager.cc b/media/renderers/win/media_foundation_protection_manager.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_protection_manager.cc rename to media/renderers/win/media_foundation_protection_manager.cc diff --git a/third_party/chromium/media/renderers/win/media_foundation_protection_manager.h b/media/renderers/win/media_foundation_protection_manager.h similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_protection_manager.h rename to media/renderers/win/media_foundation_protection_manager.h diff --git a/third_party/chromium/media/renderers/win/media_foundation_renderer.cc b/media/renderers/win/media_foundation_renderer.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_renderer.cc rename to media/renderers/win/media_foundation_renderer.cc diff --git a/third_party/chromium/media/renderers/win/media_foundation_renderer.h b/media/renderers/win/media_foundation_renderer.h similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_renderer.h rename to media/renderers/win/media_foundation_renderer.h diff --git a/third_party/chromium/media/renderers/win/media_foundation_renderer_extension.h b/media/renderers/win/media_foundation_renderer_extension.h similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_renderer_extension.h rename to media/renderers/win/media_foundation_renderer_extension.h diff --git a/third_party/chromium/media/renderers/win/media_foundation_renderer_integration_test.cc b/media/renderers/win/media_foundation_renderer_integration_test.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_renderer_integration_test.cc rename to media/renderers/win/media_foundation_renderer_integration_test.cc diff --git a/third_party/chromium/media/renderers/win/media_foundation_renderer_unittest.cc b/media/renderers/win/media_foundation_renderer_unittest.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_renderer_unittest.cc rename to media/renderers/win/media_foundation_renderer_unittest.cc diff --git a/third_party/chromium/media/renderers/win/media_foundation_source_wrapper.cc b/media/renderers/win/media_foundation_source_wrapper.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_source_wrapper.cc rename to media/renderers/win/media_foundation_source_wrapper.cc diff --git a/third_party/chromium/media/renderers/win/media_foundation_source_wrapper.h b/media/renderers/win/media_foundation_source_wrapper.h similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_source_wrapper.h rename to media/renderers/win/media_foundation_source_wrapper.h diff --git a/third_party/chromium/media/renderers/win/media_foundation_stream_wrapper.cc b/media/renderers/win/media_foundation_stream_wrapper.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_stream_wrapper.cc rename to media/renderers/win/media_foundation_stream_wrapper.cc diff --git a/third_party/chromium/media/renderers/win/media_foundation_stream_wrapper.h b/media/renderers/win/media_foundation_stream_wrapper.h similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_stream_wrapper.h rename to media/renderers/win/media_foundation_stream_wrapper.h diff --git a/third_party/chromium/media/renderers/win/media_foundation_video_stream.cc b/media/renderers/win/media_foundation_video_stream.cc similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_video_stream.cc rename to media/renderers/win/media_foundation_video_stream.cc diff --git a/third_party/chromium/media/renderers/win/media_foundation_video_stream.h b/media/renderers/win/media_foundation_video_stream.h similarity index 100% rename from third_party/chromium/media/renderers/win/media_foundation_video_stream.h rename to media/renderers/win/media_foundation_video_stream.h diff --git a/third_party/chromium/media/test/BUILD.gn b/media/test/BUILD.gn similarity index 100% rename from third_party/chromium/media/test/BUILD.gn rename to media/test/BUILD.gn diff --git a/third_party/chromium/media/test/DEPS b/media/test/DEPS similarity index 100% rename from third_party/chromium/media/test/DEPS rename to media/test/DEPS diff --git a/third_party/chromium/media/test/PRESUBMIT.py b/media/test/PRESUBMIT.py similarity index 100% rename from third_party/chromium/media/test/PRESUBMIT.py rename to media/test/PRESUBMIT.py diff --git a/third_party/chromium/media/test/data/440hz-10ms.m4a b/media/test/data/440hz-10ms.m4a similarity index 100% rename from third_party/chromium/media/test/data/440hz-10ms.m4a rename to media/test/data/440hz-10ms.m4a diff --git a/third_party/chromium/media/test/data/48_aac_infinite_loop.m4a b/media/test/data/48_aac_infinite_loop.m4a similarity index 100% rename from third_party/chromium/media/test/data/48_aac_infinite_loop.m4a rename to media/test/data/48_aac_infinite_loop.m4a diff --git a/third_party/chromium/media/test/data/4ch.wav b/media/test/data/4ch.wav similarity index 100% rename from third_party/chromium/media/test/data/4ch.wav rename to media/test/data/4ch.wav diff --git a/third_party/chromium/media/test/data/90rotation.mp4 b/media/test/data/90rotation.mp4 similarity index 100% rename from third_party/chromium/media/test/data/90rotation.mp4 rename to media/test/data/90rotation.mp4 diff --git a/third_party/chromium/media/test/data/9ch.ogg b/media/test/data/9ch.ogg similarity index 100% rename from third_party/chromium/media/test/data/9ch.ogg rename to media/test/data/9ch.ogg diff --git a/third_party/chromium/media/test/data/9ch.wav b/media/test/data/9ch.wav similarity index 100% rename from third_party/chromium/media/test/data/9ch.wav rename to media/test/data/9ch.wav diff --git a/third_party/chromium/media/test/data/BUILD.gn b/media/test/data/BUILD.gn similarity index 94% rename from third_party/chromium/media/test/data/BUILD.gn rename to media/test/data/BUILD.gn index 582f118d9179..c1d95133039d 100644 --- a/third_party/chromium/media/test/data/BUILD.gn +++ b/media/test/data/BUILD.gn @@ -18,7 +18,7 @@ copy("media_testdata") { testonly = true install_content = true sources = [ "bear-320x240.webm" ] - subdir = "third_party/chromium/media/test/data" + subdir = "media/test/data" outputs = [ "$sb_static_contents_output_data_dir/$subdir/{{source_target_relative}}", ] diff --git a/third_party/chromium/media/test/data/BlackAndWhite_criss-cross_pattern_2015x2015.webp b/media/test/data/BlackAndWhite_criss-cross_pattern_2015x2015.webp similarity index 100% rename from third_party/chromium/media/test/data/BlackAndWhite_criss-cross_pattern_2015x2015.webp rename to media/test/data/BlackAndWhite_criss-cross_pattern_2015x2015.webp diff --git a/third_party/chromium/media/test/data/COPYING b/media/test/data/COPYING similarity index 100% rename from third_party/chromium/media/test/data/COPYING rename to media/test/data/COPYING diff --git a/third_party/chromium/media/test/data/OWNERS b/media/test/data/OWNERS similarity index 100% rename from third_party/chromium/media/test/data/OWNERS rename to media/test/data/OWNERS diff --git a/third_party/chromium/media/test/data/README.md b/media/test/data/README.md similarity index 100% rename from third_party/chromium/media/test/data/README.md rename to media/test/data/README.md diff --git a/third_party/chromium/media/test/data/RGB_noise_2015x2015.webp b/media/test/data/RGB_noise_2015x2015.webp similarity index 100% rename from third_party/chromium/media/test/data/RGB_noise_2015x2015.webp rename to media/test/data/RGB_noise_2015x2015.webp diff --git a/third_party/chromium/media/test/data/RGB_noise_large_pixels_115x115.webp b/media/test/data/RGB_noise_large_pixels_115x115.webp similarity index 100% rename from third_party/chromium/media/test/data/RGB_noise_large_pixels_115x115.webp rename to media/test/data/RGB_noise_large_pixels_115x115.webp diff --git a/third_party/chromium/media/test/data/RGB_noise_large_pixels_2015x2015.webp b/media/test/data/RGB_noise_large_pixels_2015x2015.webp similarity index 100% rename from third_party/chromium/media/test/data/RGB_noise_large_pixels_2015x2015.webp rename to media/test/data/RGB_noise_large_pixels_2015x2015.webp diff --git a/third_party/chromium/media/test/data/RGB_noise_large_pixels_4000x4000.webp b/media/test/data/RGB_noise_large_pixels_4000x4000.webp similarity index 100% rename from third_party/chromium/media/test/data/RGB_noise_large_pixels_4000x4000.webp rename to media/test/data/RGB_noise_large_pixels_4000x4000.webp diff --git a/third_party/chromium/media/test/data/aac-44100-packet-0 b/media/test/data/aac-44100-packet-0 similarity index 100% rename from third_party/chromium/media/test/data/aac-44100-packet-0 rename to media/test/data/aac-44100-packet-0 diff --git a/third_party/chromium/media/test/data/aac-44100-packet-1 b/media/test/data/aac-44100-packet-1 similarity index 100% rename from third_party/chromium/media/test/data/aac-44100-packet-1 rename to media/test/data/aac-44100-packet-1 diff --git a/third_party/chromium/media/test/data/aac-44100-packet-2 b/media/test/data/aac-44100-packet-2 similarity index 100% rename from third_party/chromium/media/test/data/aac-44100-packet-2 rename to media/test/data/aac-44100-packet-2 diff --git a/third_party/chromium/media/test/data/aac-44100-packet-3 b/media/test/data/aac-44100-packet-3 similarity index 100% rename from third_party/chromium/media/test/data/aac-44100-packet-3 rename to media/test/data/aac-44100-packet-3 diff --git a/third_party/chromium/media/test/data/audio-start-time-only.webm b/media/test/data/audio-start-time-only.webm similarity index 100% rename from third_party/chromium/media/test/data/audio-start-time-only.webm rename to media/test/data/audio-start-time-only.webm diff --git a/third_party/chromium/media/test/data/av1-I-frame-1280x720 b/media/test/data/av1-I-frame-1280x720 similarity index 100% rename from third_party/chromium/media/test/data/av1-I-frame-1280x720 rename to media/test/data/av1-I-frame-1280x720 diff --git a/third_party/chromium/media/test/data/av1-I-frame-320x240 b/media/test/data/av1-I-frame-320x240 similarity index 100% rename from third_party/chromium/media/test/data/av1-I-frame-320x240 rename to media/test/data/av1-I-frame-320x240 diff --git a/third_party/chromium/media/test/data/av1-film_grain.ivf b/media/test/data/av1-film_grain.ivf similarity index 100% rename from third_party/chromium/media/test/data/av1-film_grain.ivf rename to media/test/data/av1-film_grain.ivf diff --git a/third_party/chromium/media/test/data/av1-monochrome-I-frame-320x240-10bpp b/media/test/data/av1-monochrome-I-frame-320x240-10bpp similarity index 100% rename from third_party/chromium/media/test/data/av1-monochrome-I-frame-320x240-10bpp rename to media/test/data/av1-monochrome-I-frame-320x240-10bpp diff --git a/third_party/chromium/media/test/data/av1-monochrome-I-frame-320x240-12bpp b/media/test/data/av1-monochrome-I-frame-320x240-12bpp similarity index 100% rename from third_party/chromium/media/test/data/av1-monochrome-I-frame-320x240-12bpp rename to media/test/data/av1-monochrome-I-frame-320x240-12bpp diff --git a/third_party/chromium/media/test/data/av1-monochrome-I-frame-320x240-8bpp b/media/test/data/av1-monochrome-I-frame-320x240-8bpp similarity index 100% rename from third_party/chromium/media/test/data/av1-monochrome-I-frame-320x240-8bpp rename to media/test/data/av1-monochrome-I-frame-320x240-8bpp diff --git a/third_party/chromium/media/test/data/av1-show_existing_frame.ivf b/media/test/data/av1-show_existing_frame.ivf similarity index 100% rename from third_party/chromium/media/test/data/av1-show_existing_frame.ivf rename to media/test/data/av1-show_existing_frame.ivf diff --git a/third_party/chromium/media/test/data/av1-svc-L2T2.ivf b/media/test/data/av1-svc-L2T2.ivf similarity index 100% rename from third_party/chromium/media/test/data/av1-svc-L2T2.ivf rename to media/test/data/av1-svc-L2T2.ivf diff --git a/third_party/chromium/media/test/data/bali_640x360_P420.yuv b/media/test/data/bali_640x360_P420.yuv similarity index 100% rename from third_party/chromium/media/test/data/bali_640x360_P420.yuv rename to media/test/data/bali_640x360_P420.yuv diff --git a/third_party/chromium/media/test/data/bbb-320x240-2video-2audio.mp4 b/media/test/data/bbb-320x240-2video-2audio.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bbb-320x240-2video-2audio.mp4 rename to media/test/data/bbb-320x240-2video-2audio.mp4 diff --git a/third_party/chromium/media/test/data/bbb.hevc b/media/test/data/bbb.hevc similarity index 100% rename from third_party/chromium/media/test/data/bbb.hevc rename to media/test/data/bbb.hevc diff --git a/third_party/chromium/media/test/data/bear-1280x720-a_frag-cenc-key_rotation.mp4 b/media/test/data/bear-1280x720-a_frag-cenc-key_rotation.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-a_frag-cenc-key_rotation.mp4 rename to media/test/data/bear-1280x720-a_frag-cenc-key_rotation.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-a_frag-cenc.mp4 b/media/test/data/bear-1280x720-a_frag-cenc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-a_frag-cenc.mp4 rename to media/test/data/bear-1280x720-a_frag-cenc.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-a_frag-cenc_clear-all.mp4 b/media/test/data/bear-1280x720-a_frag-cenc_clear-all.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-a_frag-cenc_clear-all.mp4 rename to media/test/data/bear-1280x720-a_frag-cenc_clear-all.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4 b/media/test/data/bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4 rename to media/test/data/bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-aac_he.ts b/media/test/data/bear-1280x720-aac_he.ts similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-aac_he.ts rename to media/test/data/bear-1280x720-aac_he.ts diff --git a/third_party/chromium/media/test/data/bear-1280x720-av_frag-initsegment-mvhd_version_0-mvhd_duration_bits_all_set.mp4 b/media/test/data/bear-1280x720-av_frag-initsegment-mvhd_version_0-mvhd_duration_bits_all_set.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-av_frag-initsegment-mvhd_version_0-mvhd_duration_bits_all_set.mp4 rename to media/test/data/bear-1280x720-av_frag-initsegment-mvhd_version_0-mvhd_duration_bits_all_set.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-av_frag.mp4 b/media/test/data/bear-1280x720-av_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-av_frag.mp4 rename to media/test/data/bear-1280x720-av_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-av_with-aud-nalus_frag.mp4 b/media/test/data/bear-1280x720-av_with-aud-nalus_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-av_with-aud-nalus_frag.mp4 rename to media/test/data/bear-1280x720-av_with-aud-nalus_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-avt_subt_frag.mp4 b/media/test/data/bear-1280x720-avt_subt_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-avt_subt_frag.mp4 rename to media/test/data/bear-1280x720-avt_subt_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-hls-sample-aes.ts b/media/test/data/bear-1280x720-hls-sample-aes.ts similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-hls-sample-aes.ts rename to media/test/data/bear-1280x720-hls-sample-aes.ts diff --git a/third_party/chromium/media/test/data/bear-1280x720-hls-with-CAT.bin b/media/test/data/bear-1280x720-hls-with-CAT.bin similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-hls-with-CAT.bin rename to media/test/data/bear-1280x720-hls-with-CAT.bin diff --git a/third_party/chromium/media/test/data/bear-1280x720-hls.ts b/media/test/data/bear-1280x720-hls.ts similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-hls.ts rename to media/test/data/bear-1280x720-hls.ts diff --git a/third_party/chromium/media/test/data/bear-1280x720-v_frag-avc3.mp4 b/media/test/data/bear-1280x720-v_frag-avc3.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-v_frag-avc3.mp4 rename to media/test/data/bear-1280x720-v_frag-avc3.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-v_frag-cenc-key_rotation.mp4 b/media/test/data/bear-1280x720-v_frag-cenc-key_rotation.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-v_frag-cenc-key_rotation.mp4 rename to media/test/data/bear-1280x720-v_frag-cenc-key_rotation.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-v_frag-cenc.mp4 b/media/test/data/bear-1280x720-v_frag-cenc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-v_frag-cenc.mp4 rename to media/test/data/bear-1280x720-v_frag-cenc.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-v_frag-cenc_clear-all.mp4 b/media/test/data/bear-1280x720-v_frag-cenc_clear-all.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-v_frag-cenc_clear-all.mp4 rename to media/test/data/bear-1280x720-v_frag-cenc_clear-all.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720-zero-stsz-entry.mp4 b/media/test/data/bear-1280x720-zero-stsz-entry.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720-zero-stsz-entry.mp4 rename to media/test/data/bear-1280x720-zero-stsz-entry.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720.mp4 b/media/test/data/bear-1280x720.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720.mp4 rename to media/test/data/bear-1280x720.mp4 diff --git a/third_party/chromium/media/test/data/bear-1280x720.ts b/media/test/data/bear-1280x720.ts similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720.ts rename to media/test/data/bear-1280x720.ts diff --git a/third_party/chromium/media/test/data/bear-1280x720.webm b/media/test/data/bear-1280x720.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720.webm rename to media/test/data/bear-1280x720.webm diff --git a/third_party/chromium/media/test/data/bear-1280x720_ptswraparound.ts b/media/test/data/bear-1280x720_ptswraparound.ts similarity index 100% rename from third_party/chromium/media/test/data/bear-1280x720_ptswraparound.ts rename to media/test/data/bear-1280x720_ptswraparound.ts diff --git a/third_party/chromium/media/test/data/bear-320x180-10bit-frame-0.h264 b/media/test/data/bear-320x180-10bit-frame-0.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-10bit-frame-0.h264 rename to media/test/data/bear-320x180-10bit-frame-0.h264 diff --git a/third_party/chromium/media/test/data/bear-320x180-10bit-frame-0.hevc b/media/test/data/bear-320x180-10bit-frame-0.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-10bit-frame-0.hevc rename to media/test/data/bear-320x180-10bit-frame-0.hevc diff --git a/third_party/chromium/media/test/data/bear-320x180-10bit-frame-1.h264 b/media/test/data/bear-320x180-10bit-frame-1.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-10bit-frame-1.h264 rename to media/test/data/bear-320x180-10bit-frame-1.h264 diff --git a/third_party/chromium/media/test/data/bear-320x180-10bit-frame-1.hevc b/media/test/data/bear-320x180-10bit-frame-1.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-10bit-frame-1.hevc rename to media/test/data/bear-320x180-10bit-frame-1.hevc diff --git a/third_party/chromium/media/test/data/bear-320x180-10bit-frame-2.h264 b/media/test/data/bear-320x180-10bit-frame-2.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-10bit-frame-2.h264 rename to media/test/data/bear-320x180-10bit-frame-2.h264 diff --git a/third_party/chromium/media/test/data/bear-320x180-10bit-frame-2.hevc b/media/test/data/bear-320x180-10bit-frame-2.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-10bit-frame-2.hevc rename to media/test/data/bear-320x180-10bit-frame-2.hevc diff --git a/third_party/chromium/media/test/data/bear-320x180-10bit-frame-3.h264 b/media/test/data/bear-320x180-10bit-frame-3.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-10bit-frame-3.h264 rename to media/test/data/bear-320x180-10bit-frame-3.h264 diff --git a/third_party/chromium/media/test/data/bear-320x180-10bit-frame-3.hevc b/media/test/data/bear-320x180-10bit-frame-3.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-10bit-frame-3.hevc rename to media/test/data/bear-320x180-10bit-frame-3.hevc diff --git a/third_party/chromium/media/test/data/bear-320x180-hi10p-vp9.webm b/media/test/data/bear-320x180-hi10p-vp9.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-hi10p-vp9.webm rename to media/test/data/bear-320x180-hi10p-vp9.webm diff --git a/third_party/chromium/media/test/data/bear-320x180-hi10p.mp4 b/media/test/data/bear-320x180-hi10p.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-hi10p.mp4 rename to media/test/data/bear-320x180-hi10p.mp4 diff --git a/third_party/chromium/media/test/data/bear-320x180-hi12p-vp9.webm b/media/test/data/bear-320x180-hi12p-vp9.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x180-hi12p-vp9.webm rename to media/test/data/bear-320x180-hi12p-vp9.webm diff --git a/third_party/chromium/media/test/data/bear-320x192-baseline-frame-0.h264 b/media/test/data/bear-320x192-baseline-frame-0.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x192-baseline-frame-0.h264 rename to media/test/data/bear-320x192-baseline-frame-0.h264 diff --git a/third_party/chromium/media/test/data/bear-320x192-baseline-frame-1.h264 b/media/test/data/bear-320x192-baseline-frame-1.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x192-baseline-frame-1.h264 rename to media/test/data/bear-320x192-baseline-frame-1.h264 diff --git a/third_party/chromium/media/test/data/bear-320x192-baseline-frame-2.h264 b/media/test/data/bear-320x192-baseline-frame-2.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x192-baseline-frame-2.h264 rename to media/test/data/bear-320x192-baseline-frame-2.h264 diff --git a/third_party/chromium/media/test/data/bear-320x192-baseline-frame-3.h264 b/media/test/data/bear-320x192-baseline-frame-3.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x192-baseline-frame-3.h264 rename to media/test/data/bear-320x192-baseline-frame-3.h264 diff --git a/third_party/chromium/media/test/data/bear-320x192-high-frame-0.h264 b/media/test/data/bear-320x192-high-frame-0.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x192-high-frame-0.h264 rename to media/test/data/bear-320x192-high-frame-0.h264 diff --git a/third_party/chromium/media/test/data/bear-320x192-high-frame-1.h264 b/media/test/data/bear-320x192-high-frame-1.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x192-high-frame-1.h264 rename to media/test/data/bear-320x192-high-frame-1.h264 diff --git a/third_party/chromium/media/test/data/bear-320x192-high-frame-2.h264 b/media/test/data/bear-320x192-high-frame-2.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x192-high-frame-2.h264 rename to media/test/data/bear-320x192-high-frame-2.h264 diff --git a/third_party/chromium/media/test/data/bear-320x192-high-frame-3.h264 b/media/test/data/bear-320x192-high-frame-3.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x192-high-frame-3.h264 rename to media/test/data/bear-320x192-high-frame-3.h264 diff --git a/third_party/chromium/media/test/data/bear-320x240-16x9-aspect-av_enc-av.webm b/media/test/data/bear-320x240-16x9-aspect-av_enc-av.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-16x9-aspect-av_enc-av.webm rename to media/test/data/bear-320x240-16x9-aspect-av_enc-av.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-16x9-aspect.webm b/media/test/data/bear-320x240-16x9-aspect.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-16x9-aspect.webm rename to media/test/data/bear-320x240-16x9-aspect.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-P444.webm b/media/test/data/bear-320x240-P444.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-P444.webm rename to media/test/data/bear-320x240-P444.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-altref.webm b/media/test/data/bear-320x240-altref.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-altref.webm rename to media/test/data/bear-320x240-altref.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-audio-only-48khz.webm b/media/test/data/bear-320x240-audio-only-48khz.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-audio-only-48khz.webm rename to media/test/data/bear-320x240-audio-only-48khz.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-audio-only.webm b/media/test/data/bear-320x240-audio-only.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-audio-only.webm rename to media/test/data/bear-320x240-audio-only.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-av_enc-a.webm b/media/test/data/bear-320x240-av_enc-a.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-av_enc-a.webm rename to media/test/data/bear-320x240-av_enc-a.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-av_enc-av.webm b/media/test/data/bear-320x240-av_enc-av.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-av_enc-av.webm rename to media/test/data/bear-320x240-av_enc-av.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-av_enc-av_clear-1s.webm b/media/test/data/bear-320x240-av_enc-av_clear-1s.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-av_enc-av_clear-1s.webm rename to media/test/data/bear-320x240-av_enc-av_clear-1s.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-av_enc-av_clear-all.webm b/media/test/data/bear-320x240-av_enc-av_clear-all.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-av_enc-av_clear-all.webm rename to media/test/data/bear-320x240-av_enc-av_clear-all.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-av_enc-v.webm b/media/test/data/bear-320x240-av_enc-v.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-av_enc-v.webm rename to media/test/data/bear-320x240-av_enc-v.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-cues-in-front.webm b/media/test/data/bear-320x240-cues-in-front.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-cues-in-front.webm rename to media/test/data/bear-320x240-cues-in-front.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-live.webm b/media/test/data/bear-320x240-live.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-live.webm rename to media/test/data/bear-320x240-live.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-manifest.js b/media/test/data/bear-320x240-manifest.js similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-manifest.js rename to media/test/data/bear-320x240-manifest.js diff --git a/third_party/chromium/media/test/data/bear-320x240-multitrack.webm b/media/test/data/bear-320x240-multitrack.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-multitrack.webm rename to media/test/data/bear-320x240-multitrack.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-opus-a_enc-a.webm b/media/test/data/bear-320x240-opus-a_enc-a.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-opus-a_enc-a.webm rename to media/test/data/bear-320x240-opus-a_enc-a.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-opus-av_enc-av.webm b/media/test/data/bear-320x240-opus-av_enc-av.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-opus-av_enc-av.webm rename to media/test/data/bear-320x240-opus-av_enc-av.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-opus-av_enc-v.webm b/media/test/data/bear-320x240-opus-av_enc-v.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-opus-av_enc-v.webm rename to media/test/data/bear-320x240-opus-av_enc-v.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-v-2frames-keyframe-is-non-sync-sample_frag-hevc.mp4 b/media/test/data/bear-320x240-v-2frames-keyframe-is-non-sync-sample_frag-hevc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v-2frames-keyframe-is-non-sync-sample_frag-hevc.mp4 rename to media/test/data/bear-320x240-v-2frames-keyframe-is-non-sync-sample_frag-hevc.mp4 diff --git a/third_party/chromium/media/test/data/bear-320x240-v-2frames-nonkeyframe-is-sync-sample_frag-hevc.mp4 b/media/test/data/bear-320x240-v-2frames-nonkeyframe-is-sync-sample_frag-hevc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v-2frames-nonkeyframe-is-sync-sample_frag-hevc.mp4 rename to media/test/data/bear-320x240-v-2frames-nonkeyframe-is-sync-sample_frag-hevc.mp4 diff --git a/third_party/chromium/media/test/data/bear-320x240-v-2frames_frag-hevc.mp4 b/media/test/data/bear-320x240-v-2frames_frag-hevc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v-2frames_frag-hevc.mp4 rename to media/test/data/bear-320x240-v-2frames_frag-hevc.mp4 diff --git a/third_party/chromium/media/test/data/bear-320x240-v-vp9_fullsample_enc-v.webm b/media/test/data/bear-320x240-v-vp9_fullsample_enc-v.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v-vp9_fullsample_enc-v.webm rename to media/test/data/bear-320x240-v-vp9_fullsample_enc-v.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-v-vp9_profile2_subsample_cenc-v.mp4 b/media/test/data/bear-320x240-v-vp9_profile2_subsample_cenc-v.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v-vp9_profile2_subsample_cenc-v.mp4 rename to media/test/data/bear-320x240-v-vp9_profile2_subsample_cenc-v.mp4 diff --git a/third_party/chromium/media/test/data/bear-320x240-v-vp9_profile2_subsample_cenc-v.webm b/media/test/data/bear-320x240-v-vp9_profile2_subsample_cenc-v.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v-vp9_profile2_subsample_cenc-v.webm rename to media/test/data/bear-320x240-v-vp9_profile2_subsample_cenc-v.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-v-vp9_subsample_enc-v.webm b/media/test/data/bear-320x240-v-vp9_subsample_enc-v.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v-vp9_subsample_enc-v.webm rename to media/test/data/bear-320x240-v-vp9_subsample_enc-v.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-v_enc-v.webm b/media/test/data/bear-320x240-v_enc-v.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v_enc-v.webm rename to media/test/data/bear-320x240-v_enc-v.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-v_frag-hevc.mp4 b/media/test/data/bear-320x240-v_frag-hevc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v_frag-hevc.mp4 rename to media/test/data/bear-320x240-v_frag-hevc.mp4 diff --git a/third_party/chromium/media/test/data/bear-320x240-v_frag-vp9-cenc.mp4 b/media/test/data/bear-320x240-v_frag-vp9-cenc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v_frag-vp9-cenc.mp4 rename to media/test/data/bear-320x240-v_frag-vp9-cenc.mp4 diff --git a/third_party/chromium/media/test/data/bear-320x240-v_frag-vp9.mp4 b/media/test/data/bear-320x240-v_frag-vp9.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-v_frag-vp9.mp4 rename to media/test/data/bear-320x240-v_frag-vp9.mp4 diff --git a/third_party/chromium/media/test/data/bear-320x240-video-only.webm b/media/test/data/bear-320x240-video-only.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-video-only.webm rename to media/test/data/bear-320x240-video-only.webm diff --git a/third_party/chromium/media/test/data/bear-320x240-vp9_profile2.webm b/media/test/data/bear-320x240-vp9_profile2.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240-vp9_profile2.webm rename to media/test/data/bear-320x240-vp9_profile2.webm diff --git a/third_party/chromium/media/test/data/bear-320x240.webm b/media/test/data/bear-320x240.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240.webm rename to media/test/data/bear-320x240.webm diff --git a/third_party/chromium/media/test/data/bear-320x240_corrupted_after_init_segment.webm b/media/test/data/bear-320x240_corrupted_after_init_segment.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-320x240_corrupted_after_init_segment.webm rename to media/test/data/bear-320x240_corrupted_after_init_segment.webm diff --git a/third_party/chromium/media/test/data/bear-640x360-a_frag-cbcs.mp4 b/media/test/data/bear-640x360-a_frag-cbcs.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-a_frag-cbcs.mp4 rename to media/test/data/bear-640x360-a_frag-cbcs.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-a_frag-cenc-key_rotation.mp4 b/media/test/data/bear-640x360-a_frag-cenc-key_rotation.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-a_frag-cenc-key_rotation.mp4 rename to media/test/data/bear-640x360-a_frag-cenc-key_rotation.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-a_frag-cenc.mp4 b/media/test/data/bear-640x360-a_frag-cenc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-a_frag-cenc.mp4 rename to media/test/data/bear-640x360-a_frag-cenc.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-a_frag.mp4 b/media/test/data/bear-640x360-a_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-a_frag.mp4 rename to media/test/data/bear-640x360-a_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-av_enc-av.webm b/media/test/data/bear-640x360-av_enc-av.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-av_enc-av.webm rename to media/test/data/bear-640x360-av_enc-av.webm diff --git a/third_party/chromium/media/test/data/bear-640x360-av_frag.mp4 b/media/test/data/bear-640x360-av_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-av_frag.mp4 rename to media/test/data/bear-640x360-av_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-manifest.js b/media/test/data/bear-640x360-manifest.js similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-manifest.js rename to media/test/data/bear-640x360-manifest.js diff --git a/third_party/chromium/media/test/data/bear-640x360-non_square_pixel-with_pasp.mp4 b/media/test/data/bear-640x360-non_square_pixel-with_pasp.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-non_square_pixel-with_pasp.mp4 rename to media/test/data/bear-640x360-non_square_pixel-with_pasp.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-non_square_pixel-without_pasp.mp4 b/media/test/data/bear-640x360-non_square_pixel-without_pasp.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-non_square_pixel-without_pasp.mp4 rename to media/test/data/bear-640x360-non_square_pixel-without_pasp.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v-2frames-keyframe-is-non-sync-sample_frag.mp4 b/media/test/data/bear-640x360-v-2frames-keyframe-is-non-sync-sample_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v-2frames-keyframe-is-non-sync-sample_frag.mp4 rename to media/test/data/bear-640x360-v-2frames-keyframe-is-non-sync-sample_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v-2frames-nonkeyframe-is-sync-sample_frag.mp4 b/media/test/data/bear-640x360-v-2frames-nonkeyframe-is-sync-sample_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v-2frames-nonkeyframe-is-sync-sample_frag.mp4 rename to media/test/data/bear-640x360-v-2frames-nonkeyframe-is-sync-sample_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v-2frames_frag.mp4 b/media/test/data/bear-640x360-v-2frames_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v-2frames_frag.mp4 rename to media/test/data/bear-640x360-v-2frames_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v_frag-cbc1.mp4 b/media/test/data/bear-640x360-v_frag-cbc1.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v_frag-cbc1.mp4 rename to media/test/data/bear-640x360-v_frag-cbc1.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v_frag-cbcs.mp4 b/media/test/data/bear-640x360-v_frag-cbcs.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v_frag-cbcs.mp4 rename to media/test/data/bear-640x360-v_frag-cbcs.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v_frag-cenc-key_rotation.mp4 b/media/test/data/bear-640x360-v_frag-cenc-key_rotation.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v_frag-cenc-key_rotation.mp4 rename to media/test/data/bear-640x360-v_frag-cenc-key_rotation.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v_frag-cenc-mdat.mp4 b/media/test/data/bear-640x360-v_frag-cenc-mdat.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v_frag-cenc-mdat.mp4 rename to media/test/data/bear-640x360-v_frag-cenc-mdat.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v_frag-cenc-senc-no-saiz-saio.mp4 b/media/test/data/bear-640x360-v_frag-cenc-senc-no-saiz-saio.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v_frag-cenc-senc-no-saiz-saio.mp4 rename to media/test/data/bear-640x360-v_frag-cenc-senc-no-saiz-saio.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v_frag-cenc-senc.mp4 b/media/test/data/bear-640x360-v_frag-cenc-senc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v_frag-cenc-senc.mp4 rename to media/test/data/bear-640x360-v_frag-cenc-senc.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v_frag-cenc.mp4 b/media/test/data/bear-640x360-v_frag-cenc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v_frag-cenc.mp4 rename to media/test/data/bear-640x360-v_frag-cenc.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v_frag-cens.mp4 b/media/test/data/bear-640x360-v_frag-cens.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v_frag-cens.mp4 rename to media/test/data/bear-640x360-v_frag-cens.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360-v_frag.mp4 b/media/test/data/bear-640x360-v_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360-v_frag.mp4 rename to media/test/data/bear-640x360-v_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-640x360.webm b/media/test/data/bear-640x360.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-640x360.webm rename to media/test/data/bear-640x360.webm diff --git a/third_party/chromium/media/test/data/bear-a_enc-a.webm b/media/test/data/bear-a_enc-a.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-a_enc-a.webm rename to media/test/data/bear-a_enc-a.webm diff --git a/third_party/chromium/media/test/data/bear-ac3-only-frag.mp4 b/media/test/data/bear-ac3-only-frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-ac3-only-frag.mp4 rename to media/test/data/bear-ac3-only-frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-audio-10s-CBR-has-TOC.mp3 b/media/test/data/bear-audio-10s-CBR-has-TOC.mp3 similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-10s-CBR-has-TOC.mp3 rename to media/test/data/bear-audio-10s-CBR-has-TOC.mp3 diff --git a/third_party/chromium/media/test/data/bear-audio-10s-CBR-no-TOC.mp3 b/media/test/data/bear-audio-10s-CBR-no-TOC.mp3 similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-10s-CBR-no-TOC.mp3 rename to media/test/data/bear-audio-10s-CBR-no-TOC.mp3 diff --git a/third_party/chromium/media/test/data/bear-audio-10s-VBR-has-TOC.mp3 b/media/test/data/bear-audio-10s-VBR-has-TOC.mp3 similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-10s-VBR-has-TOC.mp3 rename to media/test/data/bear-audio-10s-VBR-has-TOC.mp3 diff --git a/third_party/chromium/media/test/data/bear-audio-10s-VBR-no-TOC.mp3 b/media/test/data/bear-audio-10s-VBR-no-TOC.mp3 similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-10s-VBR-no-TOC.mp3 rename to media/test/data/bear-audio-10s-VBR-no-TOC.mp3 diff --git a/third_party/chromium/media/test/data/bear-audio-implicit-he-aac-v1.aac b/media/test/data/bear-audio-implicit-he-aac-v1.aac similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-implicit-he-aac-v1.aac rename to media/test/data/bear-audio-implicit-he-aac-v1.aac diff --git a/third_party/chromium/media/test/data/bear-audio-implicit-he-aac-v2.aac b/media/test/data/bear-audio-implicit-he-aac-v2.aac similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-implicit-he-aac-v2.aac rename to media/test/data/bear-audio-implicit-he-aac-v2.aac diff --git a/third_party/chromium/media/test/data/bear-audio-lc-aac.aac b/media/test/data/bear-audio-lc-aac.aac similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-lc-aac.aac rename to media/test/data/bear-audio-lc-aac.aac diff --git a/third_party/chromium/media/test/data/bear-audio-main-aac.aac b/media/test/data/bear-audio-main-aac.aac similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-main-aac.aac rename to media/test/data/bear-audio-main-aac.aac diff --git a/third_party/chromium/media/test/data/bear-audio-mp4a.69.ts b/media/test/data/bear-audio-mp4a.69.ts similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-mp4a.69.ts rename to media/test/data/bear-audio-mp4a.69.ts diff --git a/third_party/chromium/media/test/data/bear-audio-mp4a.6B.ts b/media/test/data/bear-audio-mp4a.6B.ts similarity index 100% rename from third_party/chromium/media/test/data/bear-audio-mp4a.6B.ts rename to media/test/data/bear-audio-mp4a.6B.ts diff --git a/third_party/chromium/media/test/data/bear-av1-320x180-10bit-cenc.mp4 b/media/test/data/bear-av1-320x180-10bit-cenc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-av1-320x180-10bit-cenc.mp4 rename to media/test/data/bear-av1-320x180-10bit-cenc.mp4 diff --git a/third_party/chromium/media/test/data/bear-av1-320x180-10bit-cenc.webm b/media/test/data/bear-av1-320x180-10bit-cenc.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-av1-320x180-10bit-cenc.webm rename to media/test/data/bear-av1-320x180-10bit-cenc.webm diff --git a/third_party/chromium/media/test/data/bear-av1-320x180-10bit.mp4 b/media/test/data/bear-av1-320x180-10bit.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-av1-320x180-10bit.mp4 rename to media/test/data/bear-av1-320x180-10bit.mp4 diff --git a/third_party/chromium/media/test/data/bear-av1-320x180-10bit.webm b/media/test/data/bear-av1-320x180-10bit.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-av1-320x180-10bit.webm rename to media/test/data/bear-av1-320x180-10bit.webm diff --git a/third_party/chromium/media/test/data/bear-av1-480x360.webm b/media/test/data/bear-av1-480x360.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-av1-480x360.webm rename to media/test/data/bear-av1-480x360.webm diff --git a/third_party/chromium/media/test/data/bear-av1-640x480.webm b/media/test/data/bear-av1-640x480.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-av1-640x480.webm rename to media/test/data/bear-av1-640x480.webm diff --git a/third_party/chromium/media/test/data/bear-av1-cenc.mp4 b/media/test/data/bear-av1-cenc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-av1-cenc.mp4 rename to media/test/data/bear-av1-cenc.mp4 diff --git a/third_party/chromium/media/test/data/bear-av1-cenc.webm b/media/test/data/bear-av1-cenc.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-av1-cenc.webm rename to media/test/data/bear-av1-cenc.webm diff --git a/third_party/chromium/media/test/data/bear-av1-opus.mp4 b/media/test/data/bear-av1-opus.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-av1-opus.mp4 rename to media/test/data/bear-av1-opus.mp4 diff --git a/third_party/chromium/media/test/data/bear-av1.mp4 b/media/test/data/bear-av1.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-av1.mp4 rename to media/test/data/bear-av1.mp4 diff --git a/third_party/chromium/media/test/data/bear-av1.webm b/media/test/data/bear-av1.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-av1.webm rename to media/test/data/bear-av1.webm diff --git a/third_party/chromium/media/test/data/bear-eac3-only-frag.mp4 b/media/test/data/bear-eac3-only-frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-eac3-only-frag.mp4 rename to media/test/data/bear-eac3-only-frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-flac-192kHz.mp4 b/media/test/data/bear-flac-192kHz.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-flac-192kHz.mp4 rename to media/test/data/bear-flac-192kHz.mp4 diff --git a/third_party/chromium/media/test/data/bear-flac-192kHz_frag.mp4 b/media/test/data/bear-flac-192kHz_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-flac-192kHz_frag.mp4 rename to media/test/data/bear-flac-192kHz_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-flac-cenc.mp4 b/media/test/data/bear-flac-cenc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-flac-cenc.mp4 rename to media/test/data/bear-flac-cenc.mp4 diff --git a/third_party/chromium/media/test/data/bear-flac.mp4 b/media/test/data/bear-flac.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-flac.mp4 rename to media/test/data/bear-flac.mp4 diff --git a/third_party/chromium/media/test/data/bear-flac.ogg b/media/test/data/bear-flac.ogg similarity index 100% rename from third_party/chromium/media/test/data/bear-flac.ogg rename to media/test/data/bear-flac.ogg diff --git a/third_party/chromium/media/test/data/bear-flac_frag.mp4 b/media/test/data/bear-flac_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-flac_frag.mp4 rename to media/test/data/bear-flac_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-frame0.hevc b/media/test/data/bear-frame0.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-frame0.hevc rename to media/test/data/bear-frame0.hevc diff --git a/third_party/chromium/media/test/data/bear-frame1.hevc b/media/test/data/bear-frame1.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-frame1.hevc rename to media/test/data/bear-frame1.hevc diff --git a/third_party/chromium/media/test/data/bear-frame2.hevc b/media/test/data/bear-frame2.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-frame2.hevc rename to media/test/data/bear-frame2.hevc diff --git a/third_party/chromium/media/test/data/bear-frame3.hevc b/media/test/data/bear-frame3.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-frame3.hevc rename to media/test/data/bear-frame3.hevc diff --git a/third_party/chromium/media/test/data/bear-frame4.hevc b/media/test/data/bear-frame4.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-frame4.hevc rename to media/test/data/bear-frame4.hevc diff --git a/third_party/chromium/media/test/data/bear-frame5.hevc b/media/test/data/bear-frame5.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-frame5.hevc rename to media/test/data/bear-frame5.hevc diff --git a/third_party/chromium/media/test/data/bear-hevc-frag.mp4 b/media/test/data/bear-hevc-frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-hevc-frag.mp4 rename to media/test/data/bear-hevc-frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-mono-av1.mp4 b/media/test/data/bear-mono-av1.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-mono-av1.mp4 rename to media/test/data/bear-mono-av1.mp4 diff --git a/third_party/chromium/media/test/data/bear-mpeg2-aac-only_frag.mp4 b/media/test/data/bear-mpeg2-aac-only_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-mpeg2-aac-only_frag.mp4 rename to media/test/data/bear-mpeg2-aac-only_frag.mp4 diff --git a/third_party/chromium/media/test/data/bear-opus-11ch-channelmapping2.ogg b/media/test/data/bear-opus-11ch-channelmapping2.ogg similarity index 100% rename from third_party/chromium/media/test/data/bear-opus-11ch-channelmapping2.ogg rename to media/test/data/bear-opus-11ch-channelmapping2.ogg diff --git a/third_party/chromium/media/test/data/bear-opus-4ch-channelmapping2.ogg b/media/test/data/bear-opus-4ch-channelmapping2.ogg similarity index 100% rename from third_party/chromium/media/test/data/bear-opus-4ch-channelmapping2.ogg rename to media/test/data/bear-opus-4ch-channelmapping2.ogg diff --git a/third_party/chromium/media/test/data/bear-opus-cenc.mp4 b/media/test/data/bear-opus-cenc.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-opus-cenc.mp4 rename to media/test/data/bear-opus-cenc.mp4 diff --git a/third_party/chromium/media/test/data/bear-opus-end-trimming-11ch-channelmapping2.webm b/media/test/data/bear-opus-end-trimming-11ch-channelmapping2.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-opus-end-trimming-11ch-channelmapping2.webm rename to media/test/data/bear-opus-end-trimming-11ch-channelmapping2.webm diff --git a/third_party/chromium/media/test/data/bear-opus-end-trimming-4ch-channelmapping2.webm b/media/test/data/bear-opus-end-trimming-4ch-channelmapping2.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-opus-end-trimming-4ch-channelmapping2.webm rename to media/test/data/bear-opus-end-trimming-4ch-channelmapping2.webm diff --git a/third_party/chromium/media/test/data/bear-opus.mp4 b/media/test/data/bear-opus.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear-opus.mp4 rename to media/test/data/bear-opus.mp4 diff --git a/third_party/chromium/media/test/data/bear-opus.ogg b/media/test/data/bear-opus.ogg similarity index 100% rename from third_party/chromium/media/test/data/bear-opus.ogg rename to media/test/data/bear-opus.ogg diff --git a/third_party/chromium/media/test/data/bear-opus.webm b/media/test/data/bear-opus.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-opus.webm rename to media/test/data/bear-opus.webm diff --git a/third_party/chromium/media/test/data/bear-spherical-metadata.webm b/media/test/data/bear-spherical-metadata.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-spherical-metadata.webm rename to media/test/data/bear-spherical-metadata.webm diff --git a/third_party/chromium/media/test/data/bear-sps-pps.hevc b/media/test/data/bear-sps-pps.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear-sps-pps.hevc rename to media/test/data/bear-sps-pps.hevc diff --git a/third_party/chromium/media/test/data/bear-vp8-webvtt.webm b/media/test/data/bear-vp8-webvtt.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp8-webvtt.webm rename to media/test/data/bear-vp8-webvtt.webm diff --git a/third_party/chromium/media/test/data/bear-vp8a-odd-dimensions.webm b/media/test/data/bear-vp8a-odd-dimensions.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp8a-odd-dimensions.webm rename to media/test/data/bear-vp8a-odd-dimensions.webm diff --git a/third_party/chromium/media/test/data/bear-vp8a.webm b/media/test/data/bear-vp8a.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp8a.webm rename to media/test/data/bear-vp8a.webm diff --git a/third_party/chromium/media/test/data/bear-vp9-blockgroup.webm b/media/test/data/bear-vp9-blockgroup.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9-blockgroup.webm rename to media/test/data/bear-vp9-blockgroup.webm diff --git a/third_party/chromium/media/test/data/bear-vp9-bt709.webm b/media/test/data/bear-vp9-bt709.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9-bt709.webm rename to media/test/data/bear-vp9-bt709.webm diff --git a/third_party/chromium/media/test/data/bear-vp9-i422.webm b/media/test/data/bear-vp9-i422.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9-i422.webm rename to media/test/data/bear-vp9-i422.webm diff --git a/third_party/chromium/media/test/data/bear-vp9-odd-dimensions.webm b/media/test/data/bear-vp9-odd-dimensions.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9-odd-dimensions.webm rename to media/test/data/bear-vp9-odd-dimensions.webm diff --git a/third_party/chromium/media/test/data/bear-vp9-opus.webm b/media/test/data/bear-vp9-opus.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9-opus.webm rename to media/test/data/bear-vp9-opus.webm diff --git a/third_party/chromium/media/test/data/bear-vp9.ivf b/media/test/data/bear-vp9.ivf similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9.ivf rename to media/test/data/bear-vp9.ivf diff --git a/third_party/chromium/media/test/data/bear-vp9.ivf.context b/media/test/data/bear-vp9.ivf.context similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9.ivf.context rename to media/test/data/bear-vp9.ivf.context diff --git a/third_party/chromium/media/test/data/bear-vp9.webm b/media/test/data/bear-vp9.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9.webm rename to media/test/data/bear-vp9.webm diff --git a/third_party/chromium/media/test/data/bear-vp9a-odd-dimensions.webm b/media/test/data/bear-vp9a-odd-dimensions.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9a-odd-dimensions.webm rename to media/test/data/bear-vp9a-odd-dimensions.webm diff --git a/third_party/chromium/media/test/data/bear-vp9a.webm b/media/test/data/bear-vp9a.webm similarity index 100% rename from third_party/chromium/media/test/data/bear-vp9a.webm rename to media/test/data/bear-vp9a.webm diff --git a/third_party/chromium/media/test/data/bear.ac3 b/media/test/data/bear.ac3 similarity index 100% rename from third_party/chromium/media/test/data/bear.ac3 rename to media/test/data/bear.ac3 diff --git a/third_party/chromium/media/test/data/bear.adts b/media/test/data/bear.adts similarity index 100% rename from third_party/chromium/media/test/data/bear.adts rename to media/test/data/bear.adts diff --git a/third_party/chromium/media/test/data/bear.aiff b/media/test/data/bear.aiff similarity index 100% rename from third_party/chromium/media/test/data/bear.aiff rename to media/test/data/bear.aiff diff --git a/third_party/chromium/media/test/data/bear.amr b/media/test/data/bear.amr similarity index 100% rename from third_party/chromium/media/test/data/bear.amr rename to media/test/data/bear.amr diff --git a/third_party/chromium/media/test/data/bear.asf b/media/test/data/bear.asf similarity index 100% rename from third_party/chromium/media/test/data/bear.asf rename to media/test/data/bear.asf diff --git a/third_party/chromium/media/test/data/bear.avi b/media/test/data/bear.avi similarity index 100% rename from third_party/chromium/media/test/data/bear.avi rename to media/test/data/bear.avi diff --git a/third_party/chromium/media/test/data/bear.eac3 b/media/test/data/bear.eac3 similarity index 100% rename from third_party/chromium/media/test/data/bear.eac3 rename to media/test/data/bear.eac3 diff --git a/third_party/chromium/media/test/data/bear.flac b/media/test/data/bear.flac similarity index 100% rename from third_party/chromium/media/test/data/bear.flac rename to media/test/data/bear.flac diff --git a/third_party/chromium/media/test/data/bear.flv b/media/test/data/bear.flv similarity index 100% rename from third_party/chromium/media/test/data/bear.flv rename to media/test/data/bear.flv diff --git a/third_party/chromium/media/test/data/bear.h261 b/media/test/data/bear.h261 similarity index 100% rename from third_party/chromium/media/test/data/bear.h261 rename to media/test/data/bear.h261 diff --git a/third_party/chromium/media/test/data/bear.h263 b/media/test/data/bear.h263 similarity index 100% rename from third_party/chromium/media/test/data/bear.h263 rename to media/test/data/bear.h263 diff --git a/third_party/chromium/media/test/data/bear.h264 b/media/test/data/bear.h264 similarity index 100% rename from third_party/chromium/media/test/data/bear.h264 rename to media/test/data/bear.h264 diff --git a/third_party/chromium/media/test/data/bear.hevc b/media/test/data/bear.hevc similarity index 100% rename from third_party/chromium/media/test/data/bear.hevc rename to media/test/data/bear.hevc diff --git a/third_party/chromium/media/test/data/bear.m2ts b/media/test/data/bear.m2ts similarity index 100% rename from third_party/chromium/media/test/data/bear.m2ts rename to media/test/data/bear.m2ts diff --git a/third_party/chromium/media/test/data/bear.m3u8 b/media/test/data/bear.m3u8 similarity index 100% rename from third_party/chromium/media/test/data/bear.m3u8 rename to media/test/data/bear.m3u8 diff --git a/third_party/chromium/media/test/data/bear.mjpeg b/media/test/data/bear.mjpeg similarity index 100% rename from third_party/chromium/media/test/data/bear.mjpeg rename to media/test/data/bear.mjpeg diff --git a/third_party/chromium/media/test/data/bear.mp4 b/media/test/data/bear.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear.mp4 rename to media/test/data/bear.mp4 diff --git a/third_party/chromium/media/test/data/bear.mpeg b/media/test/data/bear.mpeg similarity index 100% rename from third_party/chromium/media/test/data/bear.mpeg rename to media/test/data/bear.mpeg diff --git a/third_party/chromium/media/test/data/bear.ogv b/media/test/data/bear.ogv similarity index 100% rename from third_party/chromium/media/test/data/bear.ogv rename to media/test/data/bear.ogv diff --git a/third_party/chromium/media/test/data/bear.rm b/media/test/data/bear.rm similarity index 100% rename from third_party/chromium/media/test/data/bear.rm rename to media/test/data/bear.rm diff --git a/third_party/chromium/media/test/data/bear.swf b/media/test/data/bear.swf similarity index 100% rename from third_party/chromium/media/test/data/bear.swf rename to media/test/data/bear.swf diff --git a/third_party/chromium/media/test/data/bear.webm b/media/test/data/bear.webm similarity index 100% rename from third_party/chromium/media/test/data/bear.webm rename to media/test/data/bear.webm diff --git a/third_party/chromium/media/test/data/bear0.ts b/media/test/data/bear0.ts similarity index 100% rename from third_party/chromium/media/test/data/bear0.ts rename to media/test/data/bear0.ts diff --git a/third_party/chromium/media/test/data/bear_192kHz.wav b/media/test/data/bear_192kHz.wav similarity index 100% rename from third_party/chromium/media/test/data/bear_192kHz.wav rename to media/test/data/bear_192kHz.wav diff --git a/third_party/chromium/media/test/data/bear_192x320_270.nv12.yuv b/media/test/data/bear_192x320_270.nv12.yuv similarity index 100% rename from third_party/chromium/media/test/data/bear_192x320_270.nv12.yuv rename to media/test/data/bear_192x320_270.nv12.yuv diff --git a/third_party/chromium/media/test/data/bear_192x320_270.nv12.yuv.json b/media/test/data/bear_192x320_270.nv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/bear_192x320_270.nv12.yuv.json rename to media/test/data/bear_192x320_270.nv12.yuv.json diff --git a/third_party/chromium/media/test/data/bear_192x320_90.nv12.yuv b/media/test/data/bear_192x320_90.nv12.yuv similarity index 100% rename from third_party/chromium/media/test/data/bear_192x320_90.nv12.yuv rename to media/test/data/bear_192x320_90.nv12.yuv diff --git a/third_party/chromium/media/test/data/bear_192x320_90.nv12.yuv.json b/media/test/data/bear_192x320_90.nv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/bear_192x320_90.nv12.yuv.json rename to media/test/data/bear_192x320_90.nv12.yuv.json diff --git a/third_party/chromium/media/test/data/bear_320x192.bgra.json b/media/test/data/bear_320x192.bgra.json similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192.bgra.json rename to media/test/data/bear_320x192.bgra.json diff --git a/third_party/chromium/media/test/data/bear_320x192.i420.yuv b/media/test/data/bear_320x192.i420.yuv similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192.i420.yuv rename to media/test/data/bear_320x192.i420.yuv diff --git a/third_party/chromium/media/test/data/bear_320x192.i420.yuv.json b/media/test/data/bear_320x192.i420.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192.i420.yuv.json rename to media/test/data/bear_320x192.i420.yuv.json diff --git a/third_party/chromium/media/test/data/bear_320x192.i420.yuv.webm b/media/test/data/bear_320x192.i420.yuv.webm similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192.i420.yuv.webm rename to media/test/data/bear_320x192.i420.yuv.webm diff --git a/third_party/chromium/media/test/data/bear_320x192.nv12.yuv.json b/media/test/data/bear_320x192.nv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192.nv12.yuv.json rename to media/test/data/bear_320x192.nv12.yuv.json diff --git a/third_party/chromium/media/test/data/bear_320x192.rgba.json b/media/test/data/bear_320x192.rgba.json similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192.rgba.json rename to media/test/data/bear_320x192.rgba.json diff --git a/third_party/chromium/media/test/data/bear_320x192.yv12.yuv.json b/media/test/data/bear_320x192.yv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192.yv12.yuv.json rename to media/test/data/bear_320x192.yv12.yuv.json diff --git a/third_party/chromium/media/test/data/bear_320x192_180.nv12.yuv b/media/test/data/bear_320x192_180.nv12.yuv similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192_180.nv12.yuv rename to media/test/data/bear_320x192_180.nv12.yuv diff --git a/third_party/chromium/media/test/data/bear_320x192_180.nv12.yuv.json b/media/test/data/bear_320x192_180.nv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192_180.nv12.yuv.json rename to media/test/data/bear_320x192_180.nv12.yuv.json diff --git a/third_party/chromium/media/test/data/bear_320x192_40frames.yuv.webm b/media/test/data/bear_320x192_40frames.yuv.webm similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192_40frames.yuv.webm rename to media/test/data/bear_320x192_40frames.yuv.webm diff --git a/third_party/chromium/media/test/data/bear_320x192_40frames.yuv.webm.json b/media/test/data/bear_320x192_40frames.yuv.webm.json similarity index 100% rename from third_party/chromium/media/test/data/bear_320x192_40frames.yuv.webm.json rename to media/test/data/bear_320x192_40frames.yuv.webm.json diff --git a/third_party/chromium/media/test/data/bear_3kHz.wav b/media/test/data/bear_3kHz.wav similarity index 100% rename from third_party/chromium/media/test/data/bear_3kHz.wav rename to media/test/data/bear_3kHz.wav diff --git a/third_party/chromium/media/test/data/bear_640x384_40frames.yuv.webm b/media/test/data/bear_640x384_40frames.yuv.webm similarity index 100% rename from third_party/chromium/media/test/data/bear_640x384_40frames.yuv.webm rename to media/test/data/bear_640x384_40frames.yuv.webm diff --git a/third_party/chromium/media/test/data/bear_adts_in_private_stream_1.ts b/media/test/data/bear_adts_in_private_stream_1.ts similarity index 100% rename from third_party/chromium/media/test/data/bear_adts_in_private_stream_1.ts rename to media/test/data/bear_adts_in_private_stream_1.ts diff --git a/third_party/chromium/media/test/data/bear_alaw.wav b/media/test/data/bear_alaw.wav similarity index 100% rename from third_party/chromium/media/test/data/bear_alaw.wav rename to media/test/data/bear_alaw.wav diff --git a/third_party/chromium/media/test/data/bear_audio_longer_than_video.ogv b/media/test/data/bear_audio_longer_than_video.ogv similarity index 100% rename from third_party/chromium/media/test/data/bear_audio_longer_than_video.ogv rename to media/test/data/bear_audio_longer_than_video.ogv diff --git a/third_party/chromium/media/test/data/bear_audio_shorter_than_video.ogv b/media/test/data/bear_audio_shorter_than_video.ogv similarity index 100% rename from third_party/chromium/media/test/data/bear_audio_shorter_than_video.ogv rename to media/test/data/bear_audio_shorter_than_video.ogv diff --git a/third_party/chromium/media/test/data/bear_divx_mp3.avi b/media/test/data/bear_divx_mp3.avi similarity index 100% rename from third_party/chromium/media/test/data/bear_divx_mp3.avi rename to media/test/data/bear_divx_mp3.avi diff --git a/third_party/chromium/media/test/data/bear_gsm_ms.wav b/media/test/data/bear_gsm_ms.wav similarity index 100% rename from third_party/chromium/media/test/data/bear_gsm_ms.wav rename to media/test/data/bear_gsm_ms.wav diff --git a/third_party/chromium/media/test/data/bear_h264_aac.3gp b/media/test/data/bear_h264_aac.3gp similarity index 100% rename from third_party/chromium/media/test/data/bear_h264_aac.3gp rename to media/test/data/bear_h264_aac.3gp diff --git a/third_party/chromium/media/test/data/bear_mpeg4_amrnb.3gp b/media/test/data/bear_mpeg4_amrnb.3gp similarity index 100% rename from third_party/chromium/media/test/data/bear_mpeg4_amrnb.3gp rename to media/test/data/bear_mpeg4_amrnb.3gp diff --git a/third_party/chromium/media/test/data/bear_mpeg4_mp3.avi b/media/test/data/bear_mpeg4_mp3.avi similarity index 100% rename from third_party/chromium/media/test/data/bear_mpeg4_mp3.avi rename to media/test/data/bear_mpeg4_mp3.avi diff --git a/third_party/chromium/media/test/data/bear_mpeg4asp_mp3.avi b/media/test/data/bear_mpeg4asp_mp3.avi similarity index 100% rename from third_party/chromium/media/test/data/bear_mpeg4asp_mp3.avi rename to media/test/data/bear_mpeg4asp_mp3.avi diff --git a/third_party/chromium/media/test/data/bear_mulaw.wav b/media/test/data/bear_mulaw.wav similarity index 100% rename from third_party/chromium/media/test/data/bear_mulaw.wav rename to media/test/data/bear_mulaw.wav diff --git a/third_party/chromium/media/test/data/bear_pcm.wav b/media/test/data/bear_pcm.wav similarity index 100% rename from third_party/chromium/media/test/data/bear_pcm.wav rename to media/test/data/bear_pcm.wav diff --git a/third_party/chromium/media/test/data/bear_pcm_s16be.mov b/media/test/data/bear_pcm_s16be.mov similarity index 100% rename from third_party/chromium/media/test/data/bear_pcm_s16be.mov rename to media/test/data/bear_pcm_s16be.mov diff --git a/third_party/chromium/media/test/data/bear_pcm_s24be.mov b/media/test/data/bear_pcm_s24be.mov similarity index 100% rename from third_party/chromium/media/test/data/bear_pcm_s24be.mov rename to media/test/data/bear_pcm_s24be.mov diff --git a/third_party/chromium/media/test/data/bear_rotate_0.mp4 b/media/test/data/bear_rotate_0.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear_rotate_0.mp4 rename to media/test/data/bear_rotate_0.mp4 diff --git a/third_party/chromium/media/test/data/bear_rotate_180.mp4 b/media/test/data/bear_rotate_180.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear_rotate_180.mp4 rename to media/test/data/bear_rotate_180.mp4 diff --git a/third_party/chromium/media/test/data/bear_rotate_270.mp4 b/media/test/data/bear_rotate_270.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear_rotate_270.mp4 rename to media/test/data/bear_rotate_270.mp4 diff --git a/third_party/chromium/media/test/data/bear_rotate_90.mp4 b/media/test/data/bear_rotate_90.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear_rotate_90.mp4 rename to media/test/data/bear_rotate_90.mp4 diff --git a/third_party/chromium/media/test/data/bear_silent.mp4 b/media/test/data/bear_silent.mp4 similarity index 100% rename from third_party/chromium/media/test/data/bear_silent.mp4 rename to media/test/data/bear_silent.mp4 diff --git a/third_party/chromium/media/test/data/bear_silent.ogv b/media/test/data/bear_silent.ogv similarity index 100% rename from third_party/chromium/media/test/data/bear_silent.ogv rename to media/test/data/bear_silent.ogv diff --git a/third_party/chromium/media/test/data/bear_silent.webm b/media/test/data/bear_silent.webm similarity index 100% rename from third_party/chromium/media/test/data/bear_silent.webm rename to media/test/data/bear_silent.webm diff --git a/third_party/chromium/media/test/data/blackwhite.html b/media/test/data/blackwhite.html similarity index 100% rename from third_party/chromium/media/test/data/blackwhite.html rename to media/test/data/blackwhite.html diff --git a/third_party/chromium/media/test/data/blackwhite.png b/media/test/data/blackwhite.png similarity index 100% rename from third_party/chromium/media/test/data/blackwhite.png rename to media/test/data/blackwhite.png diff --git a/third_party/chromium/media/test/data/blackwhite_yuv420p.avi b/media/test/data/blackwhite_yuv420p.avi similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv420p.avi rename to media/test/data/blackwhite_yuv420p.avi diff --git a/third_party/chromium/media/test/data/blackwhite_yuv420p.mp4 b/media/test/data/blackwhite_yuv420p.mp4 similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv420p.mp4 rename to media/test/data/blackwhite_yuv420p.mp4 diff --git a/third_party/chromium/media/test/data/blackwhite_yuv420p.ogv b/media/test/data/blackwhite_yuv420p.ogv similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv420p.ogv rename to media/test/data/blackwhite_yuv420p.ogv diff --git a/third_party/chromium/media/test/data/blackwhite_yuv420p.webm b/media/test/data/blackwhite_yuv420p.webm similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv420p.webm rename to media/test/data/blackwhite_yuv420p.webm diff --git a/third_party/chromium/media/test/data/blackwhite_yuv420p_hi10p.mp4 b/media/test/data/blackwhite_yuv420p_hi10p.mp4 similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv420p_hi10p.mp4 rename to media/test/data/blackwhite_yuv420p_hi10p.mp4 diff --git a/third_party/chromium/media/test/data/blackwhite_yuv420p_rec709.mp4 b/media/test/data/blackwhite_yuv420p_rec709.mp4 similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv420p_rec709.mp4 rename to media/test/data/blackwhite_yuv420p_rec709.mp4 diff --git a/third_party/chromium/media/test/data/blackwhite_yuv422p.mp4 b/media/test/data/blackwhite_yuv422p.mp4 similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv422p.mp4 rename to media/test/data/blackwhite_yuv422p.mp4 diff --git a/third_party/chromium/media/test/data/blackwhite_yuv422p.ogv b/media/test/data/blackwhite_yuv422p.ogv similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv422p.ogv rename to media/test/data/blackwhite_yuv422p.ogv diff --git a/third_party/chromium/media/test/data/blackwhite_yuv444p-frame.av1.ivf b/media/test/data/blackwhite_yuv444p-frame.av1.ivf similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv444p-frame.av1.ivf rename to media/test/data/blackwhite_yuv444p-frame.av1.ivf diff --git a/third_party/chromium/media/test/data/blackwhite_yuv444p-frame.h264 b/media/test/data/blackwhite_yuv444p-frame.h264 similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv444p-frame.h264 rename to media/test/data/blackwhite_yuv444p-frame.h264 diff --git a/third_party/chromium/media/test/data/blackwhite_yuv444p-frame.hevc b/media/test/data/blackwhite_yuv444p-frame.hevc similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv444p-frame.hevc rename to media/test/data/blackwhite_yuv444p-frame.hevc diff --git a/third_party/chromium/media/test/data/blackwhite_yuv444p.mp4 b/media/test/data/blackwhite_yuv444p.mp4 similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv444p.mp4 rename to media/test/data/blackwhite_yuv444p.mp4 diff --git a/third_party/chromium/media/test/data/blackwhite_yuv444p.ogv b/media/test/data/blackwhite_yuv444p.ogv similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv444p.ogv rename to media/test/data/blackwhite_yuv444p.ogv diff --git a/third_party/chromium/media/test/data/blackwhite_yuv444p.webm b/media/test/data/blackwhite_yuv444p.webm similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuv444p.webm rename to media/test/data/blackwhite_yuv444p.webm diff --git a/third_party/chromium/media/test/data/blackwhite_yuvj420p.mp4 b/media/test/data/blackwhite_yuvj420p.mp4 similarity index 100% rename from third_party/chromium/media/test/data/blackwhite_yuvj420p.mp4 rename to media/test/data/blackwhite_yuvj420p.mp4 diff --git a/third_party/chromium/media/test/data/blank-1x1.jpg b/media/test/data/blank-1x1.jpg similarity index 100% rename from third_party/chromium/media/test/data/blank-1x1.jpg rename to media/test/data/blank-1x1.jpg diff --git a/third_party/chromium/media/test/data/bouncy_ball.webp b/media/test/data/bouncy_ball.webp similarity index 100% rename from third_party/chromium/media/test/data/bouncy_ball.webp rename to media/test/data/bouncy_ball.webp diff --git a/third_party/chromium/media/test/data/buck-1280x720-vp9.webm b/media/test/data/buck-1280x720-vp9.webm similarity index 100% rename from third_party/chromium/media/test/data/buck-1280x720-vp9.webm rename to media/test/data/buck-1280x720-vp9.webm diff --git a/third_party/chromium/media/test/data/bunny-opus-intensity-stereo.webm b/media/test/data/bunny-opus-intensity-stereo.webm similarity index 100% rename from third_party/chromium/media/test/data/bunny-opus-intensity-stereo.webm rename to media/test/data/bunny-opus-intensity-stereo.webm diff --git a/third_party/chromium/media/test/data/butterfly-853x480.webm b/media/test/data/butterfly-853x480.webm similarity index 100% rename from third_party/chromium/media/test/data/butterfly-853x480.webm rename to media/test/data/butterfly-853x480.webm diff --git a/third_party/chromium/media/test/data/cleaner.html b/media/test/data/cleaner.html similarity index 100% rename from third_party/chromium/media/test/data/cleaner.html rename to media/test/data/cleaner.html diff --git a/third_party/chromium/media/test/data/colour.webm b/media/test/data/colour.webm similarity index 100% rename from third_party/chromium/media/test/data/colour.webm rename to media/test/data/colour.webm diff --git a/third_party/chromium/media/test/data/colour_unspecified_range.webm b/media/test/data/colour_unspecified_range.webm similarity index 100% rename from third_party/chromium/media/test/data/colour_unspecified_range.webm rename to media/test/data/colour_unspecified_range.webm diff --git a/third_party/chromium/media/test/data/corrupt.mp3 b/media/test/data/corrupt.mp3 similarity index 100% rename from third_party/chromium/media/test/data/corrupt.mp3 rename to media/test/data/corrupt.mp3 diff --git a/third_party/chromium/media/test/data/crbug657437.mp4 b/media/test/data/crbug657437.mp4 similarity index 100% rename from third_party/chromium/media/test/data/crbug657437.mp4 rename to media/test/data/crbug657437.mp4 diff --git a/third_party/chromium/media/test/data/decode_capabilities_test.html b/media/test/data/decode_capabilities_test.html similarity index 100% rename from third_party/chromium/media/test/data/decode_capabilities_test.html rename to media/test/data/decode_capabilities_test.html diff --git a/third_party/chromium/media/test/data/double-bear.ogv b/media/test/data/double-bear.ogv similarity index 100% rename from third_party/chromium/media/test/data/double-bear.ogv rename to media/test/data/double-bear.ogv diff --git a/third_party/chromium/media/test/data/double-sfx.ogg b/media/test/data/double-sfx.ogg similarity index 100% rename from third_party/chromium/media/test/data/double-sfx.ogg rename to media/test/data/double-sfx.ogg diff --git a/third_party/chromium/media/test/data/eme_and_get_display_media.html b/media/test/data/eme_and_get_display_media.html similarity index 100% rename from third_party/chromium/media/test/data/eme_and_get_display_media.html rename to media/test/data/eme_and_get_display_media.html diff --git a/third_party/chromium/media/test/data/eme_load_session_after_close_test.html b/media/test/data/eme_load_session_after_close_test.html similarity index 100% rename from third_party/chromium/media/test/data/eme_load_session_after_close_test.html rename to media/test/data/eme_load_session_after_close_test.html diff --git a/third_party/chromium/media/test/data/eme_player.html b/media/test/data/eme_player.html similarity index 100% rename from third_party/chromium/media/test/data/eme_player.html rename to media/test/data/eme_player.html diff --git a/third_party/chromium/media/test/data/eme_player_js/app_loader.js b/media/test/data/eme_player_js/app_loader.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/app_loader.js rename to media/test/data/eme_player_js/app_loader.js diff --git a/third_party/chromium/media/test/data/eme_player_js/clearkey_player.js b/media/test/data/eme_player_js/clearkey_player.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/clearkey_player.js rename to media/test/data/eme_player_js/clearkey_player.js diff --git a/third_party/chromium/media/test/data/eme_player_js/eme_app.js b/media/test/data/eme_player_js/eme_app.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/eme_app.js rename to media/test/data/eme_player_js/eme_app.js diff --git a/third_party/chromium/media/test/data/eme_player_js/fps_observer.js b/media/test/data/eme_player_js/fps_observer.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/fps_observer.js rename to media/test/data/eme_player_js/fps_observer.js diff --git a/third_party/chromium/media/test/data/eme_player_js/globals.js b/media/test/data/eme_player_js/globals.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/globals.js rename to media/test/data/eme_player_js/globals.js diff --git a/third_party/chromium/media/test/data/eme_player_js/media_source_utils.js b/media/test/data/eme_player_js/media_source_utils.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/media_source_utils.js rename to media/test/data/eme_player_js/media_source_utils.js diff --git a/third_party/chromium/media/test/data/eme_player_js/mse_player_utils.js b/media/test/data/eme_player_js/mse_player_utils.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/mse_player_utils.js rename to media/test/data/eme_player_js/mse_player_utils.js diff --git a/third_party/chromium/media/test/data/eme_player_js/player_utils.js b/media/test/data/eme_player_js/player_utils.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/player_utils.js rename to media/test/data/eme_player_js/player_utils.js diff --git a/third_party/chromium/media/test/data/eme_player_js/test_config.js b/media/test/data/eme_player_js/test_config.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/test_config.js rename to media/test/data/eme_player_js/test_config.js diff --git a/third_party/chromium/media/test/data/eme_player_js/unit_test_player.js b/media/test/data/eme_player_js/unit_test_player.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/unit_test_player.js rename to media/test/data/eme_player_js/unit_test_player.js diff --git a/third_party/chromium/media/test/data/eme_player_js/utils.js b/media/test/data/eme_player_js/utils.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/utils.js rename to media/test/data/eme_player_js/utils.js diff --git a/third_party/chromium/media/test/data/eme_player_js/widevine_player.js b/media/test/data/eme_player_js/widevine_player.js similarity index 100% rename from third_party/chromium/media/test/data/eme_player_js/widevine_player.js rename to media/test/data/eme_player_js/widevine_player.js diff --git a/third_party/chromium/media/test/data/eme_remove_session_test.html b/media/test/data/eme_remove_session_test.html similarity index 100% rename from third_party/chromium/media/test/data/eme_remove_session_test.html rename to media/test/data/eme_remove_session_test.html diff --git a/third_party/chromium/media/test/data/encrypted_frame_size_change.html b/media/test/data/encrypted_frame_size_change.html similarity index 100% rename from third_party/chromium/media/test/data/encrypted_frame_size_change.html rename to media/test/data/encrypted_frame_size_change.html diff --git a/third_party/chromium/media/test/data/four-colors-aspect-4x3.mp4 b/media/test/data/four-colors-aspect-4x3.mp4 similarity index 100% rename from third_party/chromium/media/test/data/four-colors-aspect-4x3.mp4 rename to media/test/data/four-colors-aspect-4x3.mp4 diff --git a/third_party/chromium/media/test/data/four-colors-incompatible-stride.y4m b/media/test/data/four-colors-incompatible-stride.y4m similarity index 100% rename from third_party/chromium/media/test/data/four-colors-incompatible-stride.y4m rename to media/test/data/four-colors-incompatible-stride.y4m diff --git a/third_party/chromium/media/test/data/four-colors-rot-180.mp4 b/media/test/data/four-colors-rot-180.mp4 similarity index 100% rename from third_party/chromium/media/test/data/four-colors-rot-180.mp4 rename to media/test/data/four-colors-rot-180.mp4 diff --git a/third_party/chromium/media/test/data/four-colors-rot-270.mp4 b/media/test/data/four-colors-rot-270.mp4 similarity index 100% rename from third_party/chromium/media/test/data/four-colors-rot-270.mp4 rename to media/test/data/four-colors-rot-270.mp4 diff --git a/third_party/chromium/media/test/data/four-colors-rot-90.mp4 b/media/test/data/four-colors-rot-90.mp4 similarity index 100% rename from third_party/chromium/media/test/data/four-colors-rot-90.mp4 rename to media/test/data/four-colors-rot-90.mp4 diff --git a/third_party/chromium/media/test/data/four-colors-vp9-i420a.webm b/media/test/data/four-colors-vp9-i420a.webm similarity index 100% rename from third_party/chromium/media/test/data/four-colors-vp9-i420a.webm rename to media/test/data/four-colors-vp9-i420a.webm diff --git a/third_party/chromium/media/test/data/four-colors-vp9.webm b/media/test/data/four-colors-vp9.webm similarity index 100% rename from third_party/chromium/media/test/data/four-colors-vp9.webm rename to media/test/data/four-colors-vp9.webm diff --git a/third_party/chromium/media/test/data/four-colors.mp4 b/media/test/data/four-colors.mp4 similarity index 100% rename from third_party/chromium/media/test/data/four-colors.mp4 rename to media/test/data/four-colors.mp4 diff --git a/third_party/chromium/media/test/data/four-colors.png b/media/test/data/four-colors.png similarity index 100% rename from third_party/chromium/media/test/data/four-colors.png rename to media/test/data/four-colors.png diff --git a/third_party/chromium/media/test/data/four-colors.y4m b/media/test/data/four-colors.y4m similarity index 100% rename from third_party/chromium/media/test/data/four-colors.y4m rename to media/test/data/four-colors.y4m diff --git a/third_party/chromium/media/test/data/frame_size_change-av_enc-v.webm b/media/test/data/frame_size_change-av_enc-v.webm similarity index 100% rename from third_party/chromium/media/test/data/frame_size_change-av_enc-v.webm rename to media/test/data/frame_size_change-av_enc-v.webm diff --git a/third_party/chromium/media/test/data/green-a300hz.webm b/media/test/data/green-a300hz.webm similarity index 100% rename from third_party/chromium/media/test/data/green-a300hz.webm rename to media/test/data/green-a300hz.webm diff --git a/third_party/chromium/media/test/data/h264-320x180-frame-0 b/media/test/data/h264-320x180-frame-0 similarity index 100% rename from third_party/chromium/media/test/data/h264-320x180-frame-0 rename to media/test/data/h264-320x180-frame-0 diff --git a/third_party/chromium/media/test/data/h264-320x180-frame-1 b/media/test/data/h264-320x180-frame-1 similarity index 100% rename from third_party/chromium/media/test/data/h264-320x180-frame-1 rename to media/test/data/h264-320x180-frame-1 diff --git a/third_party/chromium/media/test/data/h264-320x180-frame-2 b/media/test/data/h264-320x180-frame-2 similarity index 100% rename from third_party/chromium/media/test/data/h264-320x180-frame-2 rename to media/test/data/h264-320x180-frame-2 diff --git a/third_party/chromium/media/test/data/h264-320x180-frame-3 b/media/test/data/h264-320x180-frame-3 similarity index 100% rename from third_party/chromium/media/test/data/h264-320x180-frame-3 rename to media/test/data/h264-320x180-frame-3 diff --git a/third_party/chromium/media/test/data/icy_sfx.mp3 b/media/test/data/icy_sfx.mp3 similarity index 100% rename from third_party/chromium/media/test/data/icy_sfx.mp3 rename to media/test/data/icy_sfx.mp3 diff --git a/third_party/chromium/media/test/data/id3_png_test.mp3 b/media/test/data/id3_png_test.mp3 similarity index 100% rename from third_party/chromium/media/test/data/id3_png_test.mp3 rename to media/test/data/id3_png_test.mp3 diff --git a/third_party/chromium/media/test/data/id3_test.mp3 b/media/test/data/id3_test.mp3 similarity index 100% rename from third_party/chromium/media/test/data/id3_test.mp3 rename to media/test/data/id3_test.mp3 diff --git a/third_party/chromium/media/test/data/layout_change.wav b/media/test/data/layout_change.wav similarity index 100% rename from third_party/chromium/media/test/data/layout_change.wav rename to media/test/data/layout_change.wav diff --git a/third_party/chromium/media/test/data/licenses/AOM-LICENSE b/media/test/data/licenses/AOM-LICENSE similarity index 100% rename from third_party/chromium/media/test/data/licenses/AOM-LICENSE rename to media/test/data/licenses/AOM-LICENSE diff --git a/third_party/chromium/media/test/data/load_many_videos.html b/media/test/data/load_many_videos.html similarity index 100% rename from third_party/chromium/media/test/data/load_many_videos.html rename to media/test/data/load_many_videos.html diff --git a/third_party/chromium/media/test/data/media_source_player.html b/media/test/data/media_source_player.html similarity index 100% rename from third_party/chromium/media/test/data/media_source_player.html rename to media/test/data/media_source_player.html diff --git a/third_party/chromium/media/test/data/media_suspend_test.html b/media/test/data/media_suspend_test.html similarity index 100% rename from third_party/chromium/media/test/data/media_suspend_test.html rename to media/test/data/media_suspend_test.html diff --git a/third_party/chromium/media/test/data/midstream_config_change.mp3 b/media/test/data/midstream_config_change.mp3 similarity index 100% rename from third_party/chromium/media/test/data/midstream_config_change.mp3 rename to media/test/data/midstream_config_change.mp3 diff --git a/third_party/chromium/media/test/data/mse_config_change.html b/media/test/data/mse_config_change.html similarity index 100% rename from third_party/chromium/media/test/data/mse_config_change.html rename to media/test/data/mse_config_change.html diff --git a/third_party/chromium/media/test/data/mse_different_containers.html b/media/test/data/mse_different_containers.html similarity index 100% rename from third_party/chromium/media/test/data/mse_different_containers.html rename to media/test/data/mse_different_containers.html diff --git a/third_party/chromium/media/test/data/mse_player.html b/media/test/data/mse_player.html similarity index 100% rename from third_party/chromium/media/test/data/mse_player.html rename to media/test/data/mse_player.html diff --git a/third_party/chromium/media/test/data/multi_frame_mse_player.html b/media/test/data/multi_frame_mse_player.html similarity index 100% rename from third_party/chromium/media/test/data/multi_frame_mse_player.html rename to media/test/data/multi_frame_mse_player.html diff --git a/third_party/chromium/media/test/data/multiple_cdm_types.html b/media/test/data/multiple_cdm_types.html similarity index 100% rename from third_party/chromium/media/test/data/multiple_cdm_types.html rename to media/test/data/multiple_cdm_types.html diff --git a/third_party/chromium/media/test/data/multitrack-3video-2audio.webm b/media/test/data/multitrack-3video-2audio.webm similarity index 100% rename from third_party/chromium/media/test/data/multitrack-3video-2audio.webm rename to media/test/data/multitrack-3video-2audio.webm diff --git a/third_party/chromium/media/test/data/negative-audio-timestamps.avi b/media/test/data/negative-audio-timestamps.avi similarity index 100% rename from third_party/chromium/media/test/data/negative-audio-timestamps.avi rename to media/test/data/negative-audio-timestamps.avi diff --git a/third_party/chromium/media/test/data/negative_ts.flac b/media/test/data/negative_ts.flac similarity index 100% rename from third_party/chromium/media/test/data/negative_ts.flac rename to media/test/data/negative_ts.flac diff --git a/third_party/chromium/media/test/data/no_audio_video.webm b/media/test/data/no_audio_video.webm similarity index 100% rename from third_party/chromium/media/test/data/no_audio_video.webm rename to media/test/data/no_audio_video.webm diff --git a/third_party/chromium/media/test/data/no_streams.webm b/media/test/data/no_streams.webm similarity index 100% rename from third_party/chromium/media/test/data/no_streams.webm rename to media/test/data/no_streams.webm diff --git a/third_party/chromium/media/test/data/noise-xhe-aac.mp4 b/media/test/data/noise-xhe-aac.mp4 similarity index 100% rename from third_party/chromium/media/test/data/noise-xhe-aac.mp4 rename to media/test/data/noise-xhe-aac.mp4 diff --git a/third_party/chromium/media/test/data/nonzero-start-time.webm b/media/test/data/nonzero-start-time.webm similarity index 100% rename from third_party/chromium/media/test/data/nonzero-start-time.webm rename to media/test/data/nonzero-start-time.webm diff --git a/third_party/chromium/media/test/data/npot-video.h264 b/media/test/data/npot-video.h264 similarity index 100% rename from third_party/chromium/media/test/data/npot-video.h264 rename to media/test/data/npot-video.h264 diff --git a/third_party/chromium/media/test/data/opus-trimming-test.mp4 b/media/test/data/opus-trimming-test.mp4 similarity index 100% rename from third_party/chromium/media/test/data/opus-trimming-test.mp4 rename to media/test/data/opus-trimming-test.mp4 diff --git a/third_party/chromium/media/test/data/opus-trimming-test.ogg b/media/test/data/opus-trimming-test.ogg similarity index 100% rename from third_party/chromium/media/test/data/opus-trimming-test.ogg rename to media/test/data/opus-trimming-test.ogg diff --git a/third_party/chromium/media/test/data/opus-trimming-test.webm b/media/test/data/opus-trimming-test.webm similarity index 100% rename from third_party/chromium/media/test/data/opus-trimming-test.webm rename to media/test/data/opus-trimming-test.webm diff --git a/third_party/chromium/media/test/data/opus-trimming-video-test.webm b/media/test/data/opus-trimming-video-test.webm similarity index 100% rename from third_party/chromium/media/test/data/opus-trimming-video-test.webm rename to media/test/data/opus-trimming-video-test.webm diff --git a/third_party/chromium/media/test/data/peach_pi-1280x720.jpg b/media/test/data/peach_pi-1280x720.jpg similarity index 100% rename from third_party/chromium/media/test/data/peach_pi-1280x720.jpg rename to media/test/data/peach_pi-1280x720.jpg diff --git a/third_party/chromium/media/test/data/pixel-1280x720-grayscale.jpg b/media/test/data/pixel-1280x720-grayscale.jpg similarity index 100% rename from third_party/chromium/media/test/data/pixel-1280x720-grayscale.jpg rename to media/test/data/pixel-1280x720-grayscale.jpg diff --git a/third_party/chromium/media/test/data/pixel-1280x720-trailing-zeros.jpg b/media/test/data/pixel-1280x720-trailing-zeros.jpg similarity index 100% rename from third_party/chromium/media/test/data/pixel-1280x720-trailing-zeros.jpg rename to media/test/data/pixel-1280x720-trailing-zeros.jpg diff --git a/third_party/chromium/media/test/data/pixel-1280x720-yuv420.jpg b/media/test/data/pixel-1280x720-yuv420.jpg similarity index 100% rename from third_party/chromium/media/test/data/pixel-1280x720-yuv420.jpg rename to media/test/data/pixel-1280x720-yuv420.jpg diff --git a/third_party/chromium/media/test/data/pixel-1280x720-yuv444.jpg b/media/test/data/pixel-1280x720-yuv444.jpg similarity index 100% rename from third_party/chromium/media/test/data/pixel-1280x720-yuv444.jpg rename to media/test/data/pixel-1280x720-yuv444.jpg diff --git a/third_party/chromium/media/test/data/pixel-1280x720.jpg b/media/test/data/pixel-1280x720.jpg similarity index 100% rename from third_party/chromium/media/test/data/pixel-1280x720.jpg rename to media/test/data/pixel-1280x720.jpg diff --git a/third_party/chromium/media/test/data/pixel-40x23-yuv420.jpg b/media/test/data/pixel-40x23-yuv420.jpg similarity index 100% rename from third_party/chromium/media/test/data/pixel-40x23-yuv420.jpg rename to media/test/data/pixel-40x23-yuv420.jpg diff --git a/third_party/chromium/media/test/data/pixel-41x22-yuv420.jpg b/media/test/data/pixel-41x22-yuv420.jpg similarity index 100% rename from third_party/chromium/media/test/data/pixel-41x22-yuv420.jpg rename to media/test/data/pixel-41x22-yuv420.jpg diff --git a/third_party/chromium/media/test/data/pixel-41x23-yuv420.jpg b/media/test/data/pixel-41x23-yuv420.jpg similarity index 100% rename from third_party/chromium/media/test/data/pixel-41x23-yuv420.jpg rename to media/test/data/pixel-41x23-yuv420.jpg diff --git a/third_party/chromium/media/test/data/player.html b/media/test/data/player.html similarity index 100% rename from third_party/chromium/media/test/data/player.html rename to media/test/data/player.html diff --git a/third_party/chromium/media/test/data/puppets-1280x720.i420.yuv.webm b/media/test/data/puppets-1280x720.i420.yuv.webm similarity index 100% rename from third_party/chromium/media/test/data/puppets-1280x720.i420.yuv.webm rename to media/test/data/puppets-1280x720.i420.yuv.webm diff --git a/third_party/chromium/media/test/data/puppets-1280x720.nv12.yuv.json b/media/test/data/puppets-1280x720.nv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/puppets-1280x720.nv12.yuv.json rename to media/test/data/puppets-1280x720.nv12.yuv.json diff --git a/third_party/chromium/media/test/data/puppets-320x180.nv12.yuv.json b/media/test/data/puppets-320x180.nv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/puppets-320x180.nv12.yuv.json rename to media/test/data/puppets-320x180.nv12.yuv.json diff --git a/third_party/chromium/media/test/data/puppets-480x270.nv12.yuv.json b/media/test/data/puppets-480x270.nv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/puppets-480x270.nv12.yuv.json rename to media/test/data/puppets-480x270.nv12.yuv.json diff --git a/third_party/chromium/media/test/data/puppets-640x360.nv12.yuv.json b/media/test/data/puppets-640x360.nv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/puppets-640x360.nv12.yuv.json rename to media/test/data/puppets-640x360.nv12.yuv.json diff --git a/third_party/chromium/media/test/data/puppets-640x360_in_640x480.nv12.yuv.json b/media/test/data/puppets-640x360_in_640x480.nv12.yuv.json similarity index 100% rename from third_party/chromium/media/test/data/puppets-640x360_in_640x480.nv12.yuv.json rename to media/test/data/puppets-640x360_in_640x480.nv12.yuv.json diff --git a/third_party/chromium/media/test/data/rapid_video_change_test.html b/media/test/data/rapid_video_change_test.html similarity index 100% rename from third_party/chromium/media/test/data/rapid_video_change_test.html rename to media/test/data/rapid_video_change_test.html diff --git a/third_party/chromium/media/test/data/red-a500hz.webm b/media/test/data/red-a500hz.webm similarity index 100% rename from third_party/chromium/media/test/data/red-a500hz.webm rename to media/test/data/red-a500hz.webm diff --git a/third_party/chromium/media/test/data/red-green.h264 b/media/test/data/red-green.h264 similarity index 100% rename from third_party/chromium/media/test/data/red-green.h264 rename to media/test/data/red-green.h264 diff --git a/third_party/chromium/media/test/data/red_green_gradient_lossy.webp b/media/test/data/red_green_gradient_lossy.webp similarity index 100% rename from third_party/chromium/media/test/data/red_green_gradient_lossy.webp rename to media/test/data/red_green_gradient_lossy.webp diff --git a/third_party/chromium/media/test/data/resolution_change_500frames-vp8.ivf b/media/test/data/resolution_change_500frames-vp8.ivf similarity index 100% rename from third_party/chromium/media/test/data/resolution_change_500frames-vp8.ivf rename to media/test/data/resolution_change_500frames-vp8.ivf diff --git a/third_party/chromium/media/test/data/resolution_change_500frames-vp8.ivf.json b/media/test/data/resolution_change_500frames-vp8.ivf.json similarity index 100% rename from third_party/chromium/media/test/data/resolution_change_500frames-vp8.ivf.json rename to media/test/data/resolution_change_500frames-vp8.ivf.json diff --git a/third_party/chromium/media/test/data/resolution_change_500frames-vp9.ivf b/media/test/data/resolution_change_500frames-vp9.ivf similarity index 100% rename from third_party/chromium/media/test/data/resolution_change_500frames-vp9.ivf rename to media/test/data/resolution_change_500frames-vp9.ivf diff --git a/third_party/chromium/media/test/data/resolution_change_500frames-vp9.ivf.json b/media/test/data/resolution_change_500frames-vp9.ivf.json similarity index 100% rename from third_party/chromium/media/test/data/resolution_change_500frames-vp9.ivf.json rename to media/test/data/resolution_change_500frames-vp9.ivf.json diff --git a/third_party/chromium/media/test/data/sfx-flac.mp4 b/media/test/data/sfx-flac.mp4 similarity index 100% rename from third_party/chromium/media/test/data/sfx-flac.mp4 rename to media/test/data/sfx-flac.mp4 diff --git a/third_party/chromium/media/test/data/sfx-flac_frag.mp4 b/media/test/data/sfx-flac_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/sfx-flac_frag.mp4 rename to media/test/data/sfx-flac_frag.mp4 diff --git a/third_party/chromium/media/test/data/sfx-opus-441.webm b/media/test/data/sfx-opus-441.webm similarity index 100% rename from third_party/chromium/media/test/data/sfx-opus-441.webm rename to media/test/data/sfx-opus-441.webm diff --git a/third_party/chromium/media/test/data/sfx-opus.ogg b/media/test/data/sfx-opus.ogg similarity index 100% rename from third_party/chromium/media/test/data/sfx-opus.ogg rename to media/test/data/sfx-opus.ogg diff --git a/third_party/chromium/media/test/data/sfx-opus_frag.mp4 b/media/test/data/sfx-opus_frag.mp4 similarity index 100% rename from third_party/chromium/media/test/data/sfx-opus_frag.mp4 rename to media/test/data/sfx-opus_frag.mp4 diff --git a/third_party/chromium/media/test/data/sfx.adts b/media/test/data/sfx.adts similarity index 100% rename from third_party/chromium/media/test/data/sfx.adts rename to media/test/data/sfx.adts diff --git a/third_party/chromium/media/test/data/sfx.flac b/media/test/data/sfx.flac similarity index 100% rename from third_party/chromium/media/test/data/sfx.flac rename to media/test/data/sfx.flac diff --git a/third_party/chromium/media/test/data/sfx.m4a b/media/test/data/sfx.m4a similarity index 100% rename from third_party/chromium/media/test/data/sfx.m4a rename to media/test/data/sfx.m4a diff --git a/third_party/chromium/media/test/data/sfx.mp2 b/media/test/data/sfx.mp2 similarity index 100% rename from third_party/chromium/media/test/data/sfx.mp2 rename to media/test/data/sfx.mp2 diff --git a/third_party/chromium/media/test/data/sfx.mp3 b/media/test/data/sfx.mp3 similarity index 100% rename from third_party/chromium/media/test/data/sfx.mp3 rename to media/test/data/sfx.mp3 diff --git a/third_party/chromium/media/test/data/sfx.ogg b/media/test/data/sfx.ogg similarity index 100% rename from third_party/chromium/media/test/data/sfx.ogg rename to media/test/data/sfx.ogg diff --git a/third_party/chromium/media/test/data/sfx_f32le.wav b/media/test/data/sfx_f32le.wav similarity index 100% rename from third_party/chromium/media/test/data/sfx_f32le.wav rename to media/test/data/sfx_f32le.wav diff --git a/third_party/chromium/media/test/data/sfx_s16le.wav b/media/test/data/sfx_s16le.wav similarity index 100% rename from third_party/chromium/media/test/data/sfx_s16le.wav rename to media/test/data/sfx_s16le.wav diff --git a/third_party/chromium/media/test/data/sfx_s24le.wav b/media/test/data/sfx_s24le.wav similarity index 100% rename from third_party/chromium/media/test/data/sfx_s24le.wav rename to media/test/data/sfx_s24le.wav diff --git a/third_party/chromium/media/test/data/sfx_s32le.wav b/media/test/data/sfx_s32le.wav similarity index 100% rename from third_party/chromium/media/test/data/sfx_s32le.wav rename to media/test/data/sfx_s32le.wav diff --git a/third_party/chromium/media/test/data/sfx_u8.wav b/media/test/data/sfx_u8.wav similarity index 100% rename from third_party/chromium/media/test/data/sfx_u8.wav rename to media/test/data/sfx_u8.wav diff --git a/third_party/chromium/media/test/data/solid_green_2015x2015.webp b/media/test/data/solid_green_2015x2015.webp similarity index 100% rename from third_party/chromium/media/test/data/solid_green_2015x2015.webp rename to media/test/data/solid_green_2015x2015.webp diff --git a/third_party/chromium/media/test/data/speech_16b_stereo_48kHz.raw b/media/test/data/speech_16b_stereo_48kHz.raw similarity index 100% rename from third_party/chromium/media/test/data/speech_16b_stereo_48kHz.raw rename to media/test/data/speech_16b_stereo_48kHz.raw diff --git a/third_party/chromium/media/test/data/speex_audio_vorbis_video.ogv b/media/test/data/speex_audio_vorbis_video.ogv similarity index 100% rename from third_party/chromium/media/test/data/speex_audio_vorbis_video.ogv rename to media/test/data/speex_audio_vorbis_video.ogv diff --git a/third_party/chromium/media/test/data/spherical.mp4 b/media/test/data/spherical.mp4 similarity index 100% rename from third_party/chromium/media/test/data/spherical.mp4 rename to media/test/data/spherical.mp4 diff --git a/third_party/chromium/media/test/data/switch_1080p_720p_240frames.h264 b/media/test/data/switch_1080p_720p_240frames.h264 similarity index 100% rename from third_party/chromium/media/test/data/switch_1080p_720p_240frames.h264 rename to media/test/data/switch_1080p_720p_240frames.h264 diff --git a/third_party/chromium/media/test/data/switch_1080p_720p_240frames.h264.json b/media/test/data/switch_1080p_720p_240frames.h264.json similarity index 100% rename from third_party/chromium/media/test/data/switch_1080p_720p_240frames.h264.json rename to media/test/data/switch_1080p_720p_240frames.h264.json diff --git a/third_party/chromium/media/test/data/sync2.ogv b/media/test/data/sync2.ogv similarity index 100% rename from third_party/chromium/media/test/data/sync2.ogv rename to media/test/data/sync2.ogv diff --git a/third_party/chromium/media/test/data/ten_byte_file b/media/test/data/ten_byte_file similarity index 100% rename from third_party/chromium/media/test/data/ten_byte_file rename to media/test/data/ten_byte_file diff --git a/third_party/chromium/media/test/data/test-25fps.av1.ivf b/media/test/data/test-25fps.av1.ivf similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.av1.ivf rename to media/test/data/test-25fps.av1.ivf diff --git a/third_party/chromium/media/test/data/test-25fps.av1.ivf.json b/media/test/data/test-25fps.av1.ivf.json similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.av1.ivf.json rename to media/test/data/test-25fps.av1.ivf.json diff --git a/third_party/chromium/media/test/data/test-25fps.h264 b/media/test/data/test-25fps.h264 similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.h264 rename to media/test/data/test-25fps.h264 diff --git a/third_party/chromium/media/test/data/test-25fps.h264.json b/media/test/data/test-25fps.h264.json similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.h264.json rename to media/test/data/test-25fps.h264.json diff --git a/third_party/chromium/media/test/data/test-25fps.hevc b/media/test/data/test-25fps.hevc similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.hevc rename to media/test/data/test-25fps.hevc diff --git a/third_party/chromium/media/test/data/test-25fps.hevc.json b/media/test/data/test-25fps.hevc.json similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.hevc.json rename to media/test/data/test-25fps.hevc.json diff --git a/third_party/chromium/media/test/data/test-25fps.hevc10 b/media/test/data/test-25fps.hevc10 similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.hevc10 rename to media/test/data/test-25fps.hevc10 diff --git a/third_party/chromium/media/test/data/test-25fps.hevc10.json b/media/test/data/test-25fps.hevc10.json similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.hevc10.json rename to media/test/data/test-25fps.hevc10.json diff --git a/third_party/chromium/media/test/data/test-25fps.vp8 b/media/test/data/test-25fps.vp8 similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.vp8 rename to media/test/data/test-25fps.vp8 diff --git a/third_party/chromium/media/test/data/test-25fps.vp8.json b/media/test/data/test-25fps.vp8.json similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.vp8.json rename to media/test/data/test-25fps.vp8.json diff --git a/third_party/chromium/media/test/data/test-25fps.vp9 b/media/test/data/test-25fps.vp9 similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.vp9 rename to media/test/data/test-25fps.vp9 diff --git a/third_party/chromium/media/test/data/test-25fps.vp9.context b/media/test/data/test-25fps.vp9.context similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.vp9.context rename to media/test/data/test-25fps.vp9.context diff --git a/third_party/chromium/media/test/data/test-25fps.vp9.json b/media/test/data/test-25fps.vp9.json similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.vp9.json rename to media/test/data/test-25fps.vp9.json diff --git a/third_party/chromium/media/test/data/test-25fps.vp9_2 b/media/test/data/test-25fps.vp9_2 similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.vp9_2 rename to media/test/data/test-25fps.vp9_2 diff --git a/third_party/chromium/media/test/data/test-25fps.vp9_2.json b/media/test/data/test-25fps.vp9_2.json similarity index 100% rename from third_party/chromium/media/test/data/test-25fps.vp9_2.json rename to media/test/data/test-25fps.vp9_2.json diff --git a/third_party/chromium/media/test/data/test_key_system_instantiation.html b/media/test/data/test_key_system_instantiation.html similarity index 100% rename from third_party/chromium/media/test/data/test_key_system_instantiation.html rename to media/test/data/test_key_system_instantiation.html diff --git a/third_party/chromium/media/test/data/tos-h264-opus.mp4 b/media/test/data/tos-h264-opus.mp4 similarity index 100% rename from third_party/chromium/media/test/data/tos-h264-opus.mp4 rename to media/test/data/tos-h264-opus.mp4 diff --git a/third_party/chromium/media/test/data/trailing-garbage.mp3 b/media/test/data/trailing-garbage.mp3 similarity index 100% rename from third_party/chromium/media/test/data/trailing-garbage.mp3 rename to media/test/data/trailing-garbage.mp3 diff --git a/third_party/chromium/media/test/data/tulip2.webm b/media/test/data/tulip2.webm similarity index 100% rename from third_party/chromium/media/test/data/tulip2.webm rename to media/test/data/tulip2.webm diff --git a/third_party/chromium/media/test/data/vorbis-extradata b/media/test/data/vorbis-extradata similarity index 100% rename from third_party/chromium/media/test/data/vorbis-extradata rename to media/test/data/vorbis-extradata diff --git a/third_party/chromium/media/test/data/vorbis-packet-0 b/media/test/data/vorbis-packet-0 similarity index 100% rename from third_party/chromium/media/test/data/vorbis-packet-0 rename to media/test/data/vorbis-packet-0 diff --git a/third_party/chromium/media/test/data/vorbis-packet-1 b/media/test/data/vorbis-packet-1 similarity index 100% rename from third_party/chromium/media/test/data/vorbis-packet-1 rename to media/test/data/vorbis-packet-1 diff --git a/third_party/chromium/media/test/data/vorbis-packet-2 b/media/test/data/vorbis-packet-2 similarity index 100% rename from third_party/chromium/media/test/data/vorbis-packet-2 rename to media/test/data/vorbis-packet-2 diff --git a/third_party/chromium/media/test/data/vorbis-packet-3 b/media/test/data/vorbis-packet-3 similarity index 100% rename from third_party/chromium/media/test/data/vorbis-packet-3 rename to media/test/data/vorbis-packet-3 diff --git a/third_party/chromium/media/test/data/vorbis_audio_wmv_video.mkv b/media/test/data/vorbis_audio_wmv_video.mkv similarity index 100% rename from third_party/chromium/media/test/data/vorbis_audio_wmv_video.mkv rename to media/test/data/vorbis_audio_wmv_video.mkv diff --git a/third_party/chromium/media/test/data/vp8-I-frame-160x240 b/media/test/data/vp8-I-frame-160x240 similarity index 100% rename from third_party/chromium/media/test/data/vp8-I-frame-160x240 rename to media/test/data/vp8-I-frame-160x240 diff --git a/third_party/chromium/media/test/data/vp8-I-frame-320x120 b/media/test/data/vp8-I-frame-320x120 similarity index 100% rename from third_party/chromium/media/test/data/vp8-I-frame-320x120 rename to media/test/data/vp8-I-frame-320x120 diff --git a/third_party/chromium/media/test/data/vp8-I-frame-320x240 b/media/test/data/vp8-I-frame-320x240 similarity index 100% rename from third_party/chromium/media/test/data/vp8-I-frame-320x240 rename to media/test/data/vp8-I-frame-320x240 diff --git a/third_party/chromium/media/test/data/vp8-I-frame-320x480 b/media/test/data/vp8-I-frame-320x480 similarity index 100% rename from third_party/chromium/media/test/data/vp8-I-frame-320x480 rename to media/test/data/vp8-I-frame-320x480 diff --git a/third_party/chromium/media/test/data/vp8-I-frame-640x240 b/media/test/data/vp8-I-frame-640x240 similarity index 100% rename from third_party/chromium/media/test/data/vp8-I-frame-640x240 rename to media/test/data/vp8-I-frame-640x240 diff --git a/third_party/chromium/media/test/data/vp8-P-frame-320x240 b/media/test/data/vp8-P-frame-320x240 similarity index 100% rename from third_party/chromium/media/test/data/vp8-P-frame-320x240 rename to media/test/data/vp8-P-frame-320x240 diff --git a/third_party/chromium/media/test/data/vp8-corrupt-I-frame b/media/test/data/vp8-corrupt-I-frame similarity index 100% rename from third_party/chromium/media/test/data/vp8-corrupt-I-frame rename to media/test/data/vp8-corrupt-I-frame diff --git a/third_party/chromium/media/test/data/vp9-I-frame-1280x720 b/media/test/data/vp9-I-frame-1280x720 similarity index 100% rename from third_party/chromium/media/test/data/vp9-I-frame-1280x720 rename to media/test/data/vp9-I-frame-1280x720 diff --git a/third_party/chromium/media/test/data/vp9-I-frame-320x240 b/media/test/data/vp9-I-frame-320x240 similarity index 100% rename from third_party/chromium/media/test/data/vp9-I-frame-320x240 rename to media/test/data/vp9-I-frame-320x240 diff --git a/third_party/chromium/media/test/data/vp9-duplicate-frame.webm b/media/test/data/vp9-duplicate-frame.webm similarity index 100% rename from third_party/chromium/media/test/data/vp9-duplicate-frame.webm rename to media/test/data/vp9-duplicate-frame.webm diff --git a/third_party/chromium/media/test/data/vp9-hdr-init-segment.mp4 b/media/test/data/vp9-hdr-init-segment.mp4 similarity index 100% rename from third_party/chromium/media/test/data/vp9-hdr-init-segment.mp4 rename to media/test/data/vp9-hdr-init-segment.mp4 diff --git a/third_party/chromium/media/test/data/vp90_2_10_show_existing_frame2.vp9.ivf b/media/test/data/vp90_2_10_show_existing_frame2.vp9.ivf similarity index 100% rename from third_party/chromium/media/test/data/vp90_2_10_show_existing_frame2.vp9.ivf rename to media/test/data/vp90_2_10_show_existing_frame2.vp9.ivf diff --git a/third_party/chromium/media/test/data/webaudio_oscillator.html b/media/test/data/webaudio_oscillator.html similarity index 100% rename from third_party/chromium/media/test/data/webaudio_oscillator.html rename to media/test/data/webaudio_oscillator.html diff --git a/third_party/chromium/media/test/data/webm_content_encodings b/media/test/data/webm_content_encodings similarity index 100% rename from third_party/chromium/media/test/data/webm_content_encodings rename to media/test/data/webm_content_encodings diff --git a/third_party/chromium/media/test/data/webm_ebml_element b/media/test/data/webm_ebml_element similarity index 100% rename from third_party/chromium/media/test/data/webm_ebml_element rename to media/test/data/webm_ebml_element diff --git a/third_party/chromium/media/test/data/webm_info_element b/media/test/data/webm_info_element similarity index 100% rename from third_party/chromium/media/test/data/webm_info_element rename to media/test/data/webm_info_element diff --git a/third_party/chromium/media/test/data/webm_vorbis_track_entry b/media/test/data/webm_vorbis_track_entry similarity index 100% rename from third_party/chromium/media/test/data/webm_vorbis_track_entry rename to media/test/data/webm_vorbis_track_entry diff --git a/third_party/chromium/media/test/data/webm_vp8_track_entry b/media/test/data/webm_vp8_track_entry similarity index 100% rename from third_party/chromium/media/test/data/webm_vp8_track_entry rename to media/test/data/webm_vp8_track_entry diff --git a/third_party/chromium/media/test/data/yellow_pink_gradient_lossless.webp b/media/test/data/yellow_pink_gradient_lossless.webp similarity index 100% rename from third_party/chromium/media/test/data/yellow_pink_gradient_lossless.webp rename to media/test/data/yellow_pink_gradient_lossless.webp diff --git a/third_party/chromium/media/test/fake_encrypted_media.cc b/media/test/fake_encrypted_media.cc similarity index 100% rename from third_party/chromium/media/test/fake_encrypted_media.cc rename to media/test/fake_encrypted_media.cc diff --git a/third_party/chromium/media/test/fake_encrypted_media.h b/media/test/fake_encrypted_media.h similarity index 100% rename from third_party/chromium/media/test/fake_encrypted_media.h rename to media/test/fake_encrypted_media.h diff --git a/third_party/chromium/media/test/jpeg.dict b/media/test/jpeg.dict similarity index 100% rename from third_party/chromium/media/test/jpeg.dict rename to media/test/jpeg.dict diff --git a/third_party/chromium/media/test/mp4.dict b/media/test/mp4.dict similarity index 100% rename from third_party/chromium/media/test/mp4.dict rename to media/test/mp4.dict diff --git a/third_party/chromium/media/test/pipeline_integration_fuzzertest.cc b/media/test/pipeline_integration_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/test/pipeline_integration_fuzzertest.cc rename to media/test/pipeline_integration_fuzzertest.cc diff --git a/third_party/chromium/media/test/pipeline_integration_perftest.cc b/media/test/pipeline_integration_perftest.cc similarity index 100% rename from third_party/chromium/media/test/pipeline_integration_perftest.cc rename to media/test/pipeline_integration_perftest.cc diff --git a/third_party/chromium/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc similarity index 100% rename from third_party/chromium/media/test/pipeline_integration_test.cc rename to media/test/pipeline_integration_test.cc diff --git a/third_party/chromium/media/test/pipeline_integration_test_base.cc b/media/test/pipeline_integration_test_base.cc similarity index 100% rename from third_party/chromium/media/test/pipeline_integration_test_base.cc rename to media/test/pipeline_integration_test_base.cc diff --git a/third_party/chromium/media/test/pipeline_integration_test_base.h b/media/test/pipeline_integration_test_base.h similarity index 100% rename from third_party/chromium/media/test/pipeline_integration_test_base.h rename to media/test/pipeline_integration_test_base.h diff --git a/third_party/chromium/media/test/run_all_unittests.cc b/media/test/run_all_unittests.cc similarity index 100% rename from third_party/chromium/media/test/run_all_unittests.cc rename to media/test/run_all_unittests.cc diff --git a/third_party/chromium/media/test/test_media_source.cc b/media/test/test_media_source.cc similarity index 100% rename from third_party/chromium/media/test/test_media_source.cc rename to media/test/test_media_source.cc diff --git a/third_party/chromium/media/test/test_media_source.h b/media/test/test_media_source.h similarity index 100% rename from third_party/chromium/media/test/test_media_source.h rename to media/test/test_media_source.h diff --git a/third_party/chromium/media/test/vp8.dict b/media/test/vp8.dict similarity index 100% rename from third_party/chromium/media/test/vp8.dict rename to media/test/vp8.dict diff --git a/third_party/chromium/media/test/webp.dict b/media/test/webp.dict similarity index 100% rename from third_party/chromium/media/test/webp.dict rename to media/test/webp.dict diff --git a/third_party/chromium/media/tools/constrained_network_server/cn.py b/media/tools/constrained_network_server/cn.py similarity index 100% rename from third_party/chromium/media/tools/constrained_network_server/cn.py rename to media/tools/constrained_network_server/cn.py diff --git a/third_party/chromium/media/tools/constrained_network_server/cns.py b/media/tools/constrained_network_server/cns.py similarity index 100% rename from third_party/chromium/media/tools/constrained_network_server/cns.py rename to media/tools/constrained_network_server/cns.py diff --git a/third_party/chromium/media/tools/constrained_network_server/cns_test.py b/media/tools/constrained_network_server/cns_test.py similarity index 100% rename from third_party/chromium/media/tools/constrained_network_server/cns_test.py rename to media/tools/constrained_network_server/cns_test.py diff --git a/third_party/chromium/media/tools/constrained_network_server/traffic_control.py b/media/tools/constrained_network_server/traffic_control.py similarity index 100% rename from third_party/chromium/media/tools/constrained_network_server/traffic_control.py rename to media/tools/constrained_network_server/traffic_control.py diff --git a/third_party/chromium/media/tools/constrained_network_server/traffic_control_test.py b/media/tools/constrained_network_server/traffic_control_test.py similarity index 100% rename from third_party/chromium/media/tools/constrained_network_server/traffic_control_test.py rename to media/tools/constrained_network_server/traffic_control_test.py diff --git a/third_party/chromium/media/tools/constrained_network_server/traffic_control_unittest.py b/media/tools/constrained_network_server/traffic_control_unittest.py similarity index 100% rename from third_party/chromium/media/tools/constrained_network_server/traffic_control_unittest.py rename to media/tools/constrained_network_server/traffic_control_unittest.py diff --git a/third_party/chromium/media/video/BUILD.gn b/media/video/BUILD.gn similarity index 100% rename from third_party/chromium/media/video/BUILD.gn rename to media/video/BUILD.gn diff --git a/third_party/chromium/media/video/fake_gpu_memory_buffer.cc b/media/video/fake_gpu_memory_buffer.cc similarity index 100% rename from third_party/chromium/media/video/fake_gpu_memory_buffer.cc rename to media/video/fake_gpu_memory_buffer.cc diff --git a/third_party/chromium/media/video/fake_gpu_memory_buffer.h b/media/video/fake_gpu_memory_buffer.h similarity index 100% rename from third_party/chromium/media/video/fake_gpu_memory_buffer.h rename to media/video/fake_gpu_memory_buffer.h diff --git a/third_party/chromium/media/video/fake_video_encode_accelerator.cc b/media/video/fake_video_encode_accelerator.cc similarity index 100% rename from third_party/chromium/media/video/fake_video_encode_accelerator.cc rename to media/video/fake_video_encode_accelerator.cc diff --git a/third_party/chromium/media/video/fake_video_encode_accelerator.h b/media/video/fake_video_encode_accelerator.h similarity index 100% rename from third_party/chromium/media/video/fake_video_encode_accelerator.h rename to media/video/fake_video_encode_accelerator.h diff --git a/third_party/chromium/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc similarity index 100% rename from third_party/chromium/media/video/gpu_memory_buffer_video_frame_pool.cc rename to media/video/gpu_memory_buffer_video_frame_pool.cc diff --git a/third_party/chromium/media/video/gpu_memory_buffer_video_frame_pool.h b/media/video/gpu_memory_buffer_video_frame_pool.h similarity index 100% rename from third_party/chromium/media/video/gpu_memory_buffer_video_frame_pool.h rename to media/video/gpu_memory_buffer_video_frame_pool.h diff --git a/third_party/chromium/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc similarity index 100% rename from third_party/chromium/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc rename to media/video/gpu_memory_buffer_video_frame_pool_unittest.cc diff --git a/third_party/chromium/media/video/gpu_video_accelerator_factories.cc b/media/video/gpu_video_accelerator_factories.cc similarity index 100% rename from third_party/chromium/media/video/gpu_video_accelerator_factories.cc rename to media/video/gpu_video_accelerator_factories.cc diff --git a/third_party/chromium/media/video/gpu_video_accelerator_factories.h b/media/video/gpu_video_accelerator_factories.h similarity index 100% rename from third_party/chromium/media/video/gpu_video_accelerator_factories.h rename to media/video/gpu_video_accelerator_factories.h diff --git a/third_party/chromium/media/video/h264_bit_reader.cc b/media/video/h264_bit_reader.cc similarity index 100% rename from third_party/chromium/media/video/h264_bit_reader.cc rename to media/video/h264_bit_reader.cc diff --git a/third_party/chromium/media/video/h264_bit_reader.h b/media/video/h264_bit_reader.h similarity index 100% rename from third_party/chromium/media/video/h264_bit_reader.h rename to media/video/h264_bit_reader.h diff --git a/third_party/chromium/media/video/h264_bit_reader_unittest.cc b/media/video/h264_bit_reader_unittest.cc similarity index 100% rename from third_party/chromium/media/video/h264_bit_reader_unittest.cc rename to media/video/h264_bit_reader_unittest.cc diff --git a/third_party/chromium/media/video/h264_level_limits.cc b/media/video/h264_level_limits.cc similarity index 100% rename from third_party/chromium/media/video/h264_level_limits.cc rename to media/video/h264_level_limits.cc diff --git a/third_party/chromium/media/video/h264_level_limits.h b/media/video/h264_level_limits.h similarity index 100% rename from third_party/chromium/media/video/h264_level_limits.h rename to media/video/h264_level_limits.h diff --git a/third_party/chromium/media/video/h264_parser.cc b/media/video/h264_parser.cc similarity index 100% rename from third_party/chromium/media/video/h264_parser.cc rename to media/video/h264_parser.cc diff --git a/third_party/chromium/media/video/h264_parser.h b/media/video/h264_parser.h similarity index 100% rename from third_party/chromium/media/video/h264_parser.h rename to media/video/h264_parser.h diff --git a/third_party/chromium/media/video/h264_parser_fuzzertest.cc b/media/video/h264_parser_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/video/h264_parser_fuzzertest.cc rename to media/video/h264_parser_fuzzertest.cc diff --git a/third_party/chromium/media/video/h264_parser_unittest.cc b/media/video/h264_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/video/h264_parser_unittest.cc rename to media/video/h264_parser_unittest.cc diff --git a/third_party/chromium/media/video/h264_poc.cc b/media/video/h264_poc.cc similarity index 100% rename from third_party/chromium/media/video/h264_poc.cc rename to media/video/h264_poc.cc diff --git a/third_party/chromium/media/video/h264_poc.h b/media/video/h264_poc.h similarity index 100% rename from third_party/chromium/media/video/h264_poc.h rename to media/video/h264_poc.h diff --git a/third_party/chromium/media/video/h264_poc_unittest.cc b/media/video/h264_poc_unittest.cc similarity index 100% rename from third_party/chromium/media/video/h264_poc_unittest.cc rename to media/video/h264_poc_unittest.cc diff --git a/third_party/chromium/media/video/h265_nalu_parser.cc b/media/video/h265_nalu_parser.cc similarity index 100% rename from third_party/chromium/media/video/h265_nalu_parser.cc rename to media/video/h265_nalu_parser.cc diff --git a/third_party/chromium/media/video/h265_nalu_parser.h b/media/video/h265_nalu_parser.h similarity index 100% rename from third_party/chromium/media/video/h265_nalu_parser.h rename to media/video/h265_nalu_parser.h diff --git a/third_party/chromium/media/video/h265_nalu_parser_unittest.cc b/media/video/h265_nalu_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/video/h265_nalu_parser_unittest.cc rename to media/video/h265_nalu_parser_unittest.cc diff --git a/third_party/chromium/media/video/h265_parser.cc b/media/video/h265_parser.cc similarity index 100% rename from third_party/chromium/media/video/h265_parser.cc rename to media/video/h265_parser.cc diff --git a/third_party/chromium/media/video/h265_parser.h b/media/video/h265_parser.h similarity index 100% rename from third_party/chromium/media/video/h265_parser.h rename to media/video/h265_parser.h diff --git a/third_party/chromium/media/video/h265_parser_fuzzertest.cc b/media/video/h265_parser_fuzzertest.cc similarity index 100% rename from third_party/chromium/media/video/h265_parser_fuzzertest.cc rename to media/video/h265_parser_fuzzertest.cc diff --git a/third_party/chromium/media/video/h265_parser_unittest.cc b/media/video/h265_parser_unittest.cc similarity index 100% rename from third_party/chromium/media/video/h265_parser_unittest.cc rename to media/video/h265_parser_unittest.cc diff --git a/third_party/chromium/media/video/half_float_maker.cc b/media/video/half_float_maker.cc similarity index 100% rename from third_party/chromium/media/video/half_float_maker.cc rename to media/video/half_float_maker.cc diff --git a/third_party/chromium/media/video/half_float_maker.h b/media/video/half_float_maker.h similarity index 100% rename from third_party/chromium/media/video/half_float_maker.h rename to media/video/half_float_maker.h diff --git a/third_party/chromium/media/video/half_float_maker_unittest.cc b/media/video/half_float_maker_unittest.cc similarity index 100% rename from third_party/chromium/media/video/half_float_maker_unittest.cc rename to media/video/half_float_maker_unittest.cc diff --git a/third_party/chromium/media/video/mock_gpu_memory_buffer_video_frame_pool.cc b/media/video/mock_gpu_memory_buffer_video_frame_pool.cc similarity index 100% rename from third_party/chromium/media/video/mock_gpu_memory_buffer_video_frame_pool.cc rename to media/video/mock_gpu_memory_buffer_video_frame_pool.cc diff --git a/third_party/chromium/media/video/mock_gpu_memory_buffer_video_frame_pool.h b/media/video/mock_gpu_memory_buffer_video_frame_pool.h similarity index 100% rename from third_party/chromium/media/video/mock_gpu_memory_buffer_video_frame_pool.h rename to media/video/mock_gpu_memory_buffer_video_frame_pool.h diff --git a/third_party/chromium/media/video/mock_gpu_video_accelerator_factories.cc b/media/video/mock_gpu_video_accelerator_factories.cc similarity index 100% rename from third_party/chromium/media/video/mock_gpu_video_accelerator_factories.cc rename to media/video/mock_gpu_video_accelerator_factories.cc diff --git a/third_party/chromium/media/video/mock_gpu_video_accelerator_factories.h b/media/video/mock_gpu_video_accelerator_factories.h similarity index 100% rename from third_party/chromium/media/video/mock_gpu_video_accelerator_factories.h rename to media/video/mock_gpu_video_accelerator_factories.h diff --git a/third_party/chromium/media/video/mock_video_decode_accelerator.cc b/media/video/mock_video_decode_accelerator.cc similarity index 100% rename from third_party/chromium/media/video/mock_video_decode_accelerator.cc rename to media/video/mock_video_decode_accelerator.cc diff --git a/third_party/chromium/media/video/mock_video_decode_accelerator.h b/media/video/mock_video_decode_accelerator.h similarity index 100% rename from third_party/chromium/media/video/mock_video_decode_accelerator.h rename to media/video/mock_video_decode_accelerator.h diff --git a/third_party/chromium/media/video/mock_video_encode_accelerator.cc b/media/video/mock_video_encode_accelerator.cc similarity index 100% rename from third_party/chromium/media/video/mock_video_encode_accelerator.cc rename to media/video/mock_video_encode_accelerator.cc diff --git a/third_party/chromium/media/video/mock_video_encode_accelerator.h b/media/video/mock_video_encode_accelerator.h similarity index 100% rename from third_party/chromium/media/video/mock_video_encode_accelerator.h rename to media/video/mock_video_encode_accelerator.h diff --git a/third_party/chromium/media/video/openh264_video_encoder.cc b/media/video/openh264_video_encoder.cc similarity index 100% rename from third_party/chromium/media/video/openh264_video_encoder.cc rename to media/video/openh264_video_encoder.cc diff --git a/third_party/chromium/media/video/openh264_video_encoder.h b/media/video/openh264_video_encoder.h similarity index 100% rename from third_party/chromium/media/video/openh264_video_encoder.h rename to media/video/openh264_video_encoder.h diff --git a/third_party/chromium/media/video/picture.cc b/media/video/picture.cc similarity index 100% rename from third_party/chromium/media/video/picture.cc rename to media/video/picture.cc diff --git a/third_party/chromium/media/video/picture.h b/media/video/picture.h similarity index 100% rename from third_party/chromium/media/video/picture.h rename to media/video/picture.h diff --git a/third_party/chromium/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc b/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc similarity index 100% rename from third_party/chromium/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc rename to media/video/renderable_gpu_memory_buffer_video_frame_pool.cc diff --git a/third_party/chromium/media/video/renderable_gpu_memory_buffer_video_frame_pool.h b/media/video/renderable_gpu_memory_buffer_video_frame_pool.h similarity index 100% rename from third_party/chromium/media/video/renderable_gpu_memory_buffer_video_frame_pool.h rename to media/video/renderable_gpu_memory_buffer_video_frame_pool.h diff --git a/third_party/chromium/media/video/renderable_gpu_memory_buffer_video_frame_pool_unittest.cc b/media/video/renderable_gpu_memory_buffer_video_frame_pool_unittest.cc similarity index 100% rename from third_party/chromium/media/video/renderable_gpu_memory_buffer_video_frame_pool_unittest.cc rename to media/video/renderable_gpu_memory_buffer_video_frame_pool_unittest.cc diff --git a/third_party/chromium/media/video/software_video_encoder_test.cc b/media/video/software_video_encoder_test.cc similarity index 100% rename from third_party/chromium/media/video/software_video_encoder_test.cc rename to media/video/software_video_encoder_test.cc diff --git a/third_party/chromium/media/video/supported_video_decoder_config_unittest.cc b/media/video/supported_video_decoder_config_unittest.cc similarity index 100% rename from third_party/chromium/media/video/supported_video_decoder_config_unittest.cc rename to media/video/supported_video_decoder_config_unittest.cc diff --git a/third_party/chromium/media/video/trace_util.cc b/media/video/trace_util.cc similarity index 100% rename from third_party/chromium/media/video/trace_util.cc rename to media/video/trace_util.cc diff --git a/third_party/chromium/media/video/trace_util.h b/media/video/trace_util.h similarity index 100% rename from third_party/chromium/media/video/trace_util.h rename to media/video/trace_util.h diff --git a/third_party/chromium/media/video/video_decode_accelerator.cc b/media/video/video_decode_accelerator.cc similarity index 100% rename from third_party/chromium/media/video/video_decode_accelerator.cc rename to media/video/video_decode_accelerator.cc diff --git a/third_party/chromium/media/video/video_decode_accelerator.h b/media/video/video_decode_accelerator.h similarity index 100% rename from third_party/chromium/media/video/video_decode_accelerator.h rename to media/video/video_decode_accelerator.h diff --git a/third_party/chromium/media/video/video_encode_accelerator.cc b/media/video/video_encode_accelerator.cc similarity index 100% rename from third_party/chromium/media/video/video_encode_accelerator.cc rename to media/video/video_encode_accelerator.cc diff --git a/third_party/chromium/media/video/video_encode_accelerator.h b/media/video/video_encode_accelerator.h similarity index 100% rename from third_party/chromium/media/video/video_encode_accelerator.h rename to media/video/video_encode_accelerator.h diff --git a/third_party/chromium/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc similarity index 100% rename from third_party/chromium/media/video/video_encode_accelerator_adapter.cc rename to media/video/video_encode_accelerator_adapter.cc diff --git a/third_party/chromium/media/video/video_encode_accelerator_adapter.h b/media/video/video_encode_accelerator_adapter.h similarity index 100% rename from third_party/chromium/media/video/video_encode_accelerator_adapter.h rename to media/video/video_encode_accelerator_adapter.h diff --git a/third_party/chromium/media/video/video_encode_accelerator_adapter_test.cc b/media/video/video_encode_accelerator_adapter_test.cc similarity index 100% rename from third_party/chromium/media/video/video_encode_accelerator_adapter_test.cc rename to media/video/video_encode_accelerator_adapter_test.cc diff --git a/third_party/chromium/media/video/video_encoder_fallback.cc b/media/video/video_encoder_fallback.cc similarity index 100% rename from third_party/chromium/media/video/video_encoder_fallback.cc rename to media/video/video_encoder_fallback.cc diff --git a/third_party/chromium/media/video/video_encoder_fallback.h b/media/video/video_encoder_fallback.h similarity index 100% rename from third_party/chromium/media/video/video_encoder_fallback.h rename to media/video/video_encoder_fallback.h diff --git a/third_party/chromium/media/video/video_encoder_fallback_test.cc b/media/video/video_encoder_fallback_test.cc similarity index 100% rename from third_party/chromium/media/video/video_encoder_fallback_test.cc rename to media/video/video_encoder_fallback_test.cc diff --git a/third_party/chromium/media/video/video_encoder_info.cc b/media/video/video_encoder_info.cc similarity index 100% rename from third_party/chromium/media/video/video_encoder_info.cc rename to media/video/video_encoder_info.cc diff --git a/third_party/chromium/media/video/video_encoder_info.h b/media/video/video_encoder_info.h similarity index 100% rename from third_party/chromium/media/video/video_encoder_info.h rename to media/video/video_encoder_info.h diff --git a/third_party/chromium/media/video/vpx_video_encoder.cc b/media/video/vpx_video_encoder.cc similarity index 100% rename from third_party/chromium/media/video/vpx_video_encoder.cc rename to media/video/vpx_video_encoder.cc diff --git a/third_party/chromium/media/video/vpx_video_encoder.h b/media/video/vpx_video_encoder.h similarity index 100% rename from third_party/chromium/media/video/vpx_video_encoder.h rename to media/video/vpx_video_encoder.h diff --git a/third_party/chromium/media/webrtc/BUILD.gn b/media/webrtc/BUILD.gn similarity index 100% rename from third_party/chromium/media/webrtc/BUILD.gn rename to media/webrtc/BUILD.gn diff --git a/third_party/chromium/media/webrtc/DEPS b/media/webrtc/DEPS similarity index 100% rename from third_party/chromium/media/webrtc/DEPS rename to media/webrtc/DEPS diff --git a/third_party/chromium/media/webrtc/DIR_METADATA b/media/webrtc/DIR_METADATA similarity index 100% rename from third_party/chromium/media/webrtc/DIR_METADATA rename to media/webrtc/DIR_METADATA diff --git a/third_party/chromium/media/webrtc/OWNERS b/media/webrtc/OWNERS similarity index 100% rename from third_party/chromium/media/webrtc/OWNERS rename to media/webrtc/OWNERS diff --git a/third_party/chromium/media/webrtc/audio_delay_stats_reporter.cc b/media/webrtc/audio_delay_stats_reporter.cc similarity index 100% rename from third_party/chromium/media/webrtc/audio_delay_stats_reporter.cc rename to media/webrtc/audio_delay_stats_reporter.cc diff --git a/third_party/chromium/media/webrtc/audio_delay_stats_reporter.h b/media/webrtc/audio_delay_stats_reporter.h similarity index 100% rename from third_party/chromium/media/webrtc/audio_delay_stats_reporter.h rename to media/webrtc/audio_delay_stats_reporter.h diff --git a/third_party/chromium/media/webrtc/audio_processor_controls.h b/media/webrtc/audio_processor_controls.h similarity index 100% rename from third_party/chromium/media/webrtc/audio_processor_controls.h rename to media/webrtc/audio_processor_controls.h diff --git a/third_party/chromium/media/webrtc/helpers.cc b/media/webrtc/helpers.cc similarity index 100% rename from third_party/chromium/media/webrtc/helpers.cc rename to media/webrtc/helpers.cc diff --git a/third_party/chromium/media/webrtc/helpers.h b/media/webrtc/helpers.h similarity index 100% rename from third_party/chromium/media/webrtc/helpers.h rename to media/webrtc/helpers.h diff --git a/third_party/chromium/media/webrtc/helpers_unittests.cc b/media/webrtc/helpers_unittests.cc similarity index 100% rename from third_party/chromium/media/webrtc/helpers_unittests.cc rename to media/webrtc/helpers_unittests.cc diff --git a/third_party/chromium/media/webrtc/webrtc_features.cc b/media/webrtc/webrtc_features.cc similarity index 100% rename from third_party/chromium/media/webrtc/webrtc_features.cc rename to media/webrtc/webrtc_features.cc diff --git a/third_party/chromium/media/webrtc/webrtc_features.h b/media/webrtc/webrtc_features.h similarity index 100% rename from third_party/chromium/media/webrtc/webrtc_features.h rename to media/webrtc/webrtc_features.h diff --git a/net/BUILD.gn b/net/BUILD.gn index 53473942ab5d..28568c6d2c81 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn @@ -302,8 +302,6 @@ component("net") { "cert/ev_root_ca_metadata.h", "cert/internal/system_trust_store.cc", "cert/internal/system_trust_store.h", - "cert/jwk_serializer.cc", - "cert/jwk_serializer.h", "cert/known_roots.cc", "cert/known_roots.h", "cert/merkle_audit_proof.cc", @@ -3573,7 +3571,6 @@ target(gtest_target_type, "net_unittests") { "cert/internal/verify_certificate_chain_unittest.cc", "cert/internal/verify_name_match_unittest.cc", "cert/internal/verify_signed_data_unittest.cc", - "cert/jwk_serializer_unittest.cc", "cert/known_roots_unittest.cc", "cert/merkle_audit_proof_unittest.cc", "cert/merkle_tree_leaf_unittest.cc", diff --git a/net/cert/ct_log_response_parser.cc b/net/cert/ct_log_response_parser.cc index 1908d38ce356..273359f46bcb 100644 --- a/net/cert/ct_log_response_parser.cc +++ b/net/cert/ct_log_response_parser.cc @@ -35,33 +35,17 @@ struct JsonSignedTreeHead { }; bool ConvertSHA256RootHash(base::StringPiece s, std::string* result) { - if (!base::Base64Decode(s, result)) { - DVLOG(1) << "Failed decoding sha256_root_hash"; - return false; - } - - if (result->length() != kSthRootHashLength) { - DVLOG(1) << "sha256_root_hash is expected to be 32 bytes, but is " - << result->length() << " bytes."; - return false; - } - - return true; + return base::Base64Decode(s, result) && result->size() == kSthRootHashLength; } bool ConvertTreeHeadSignature(base::StringPiece s, DigitallySigned* result) { std::string tree_head_signature; if (!base::Base64Decode(s, &tree_head_signature)) { - DVLOG(1) << "Failed decoding tree_head_signature"; return false; } base::StringPiece sp(tree_head_signature); - if (!DecodeDigitallySigned(&sp, result)) { - DVLOG(1) << "Failed decoding signature to DigitallySigned"; - return false; - } - return true; + return DecodeDigitallySigned(&sp, result); } void JsonSignedTreeHead::RegisterJSONConverter( @@ -78,29 +62,8 @@ void JsonSignedTreeHead::RegisterJSONConverter( } bool IsJsonSTHStructurallyValid(const JsonSignedTreeHead& sth) { - if (sth.tree_size < 0) { - DVLOG(1) << "Tree size in Signed Tree Head JSON is negative: " - << sth.tree_size; - return false; - } - - if (sth.timestamp < 0) { - DVLOG(1) << "Timestamp in Signed Tree Head JSON is negative: " - << sth.timestamp; - return false; - } - - if (sth.sha256_root_hash.empty()) { - DVLOG(1) << "Missing SHA256 root hash from Signed Tree Head JSON."; - return false; - } - - if (sth.signature.signature_data.empty()) { - DVLOG(1) << "Missing signature from Signed Tree Head JSON."; - return false; - } - - return true; + return sth.tree_size >= 0 && sth.timestamp >= 0 && + !sth.sha256_root_hash.empty() && !sth.signature.signature_data.empty(); } // Structure for making JSON decoding easier. The string fields @@ -136,14 +99,11 @@ bool FillSignedTreeHead(const base::Value& json_signed_tree_head, SignedTreeHead* signed_tree_head) { JsonSignedTreeHead parsed_sth; base::JSONValueConverter converter; - if (!converter.Convert(json_signed_tree_head, &parsed_sth)) { - DVLOG(1) << "Invalid Signed Tree Head JSON."; + if (!converter.Convert(json_signed_tree_head, &parsed_sth) || + !IsJsonSTHStructurallyValid(parsed_sth)) { return false; } - if (!IsJsonSTHStructurallyValid(parsed_sth)) - return false; - signed_tree_head->version = SignedTreeHead::V1; signed_tree_head->tree_size = parsed_sth.tree_size; signed_tree_head->timestamp = base::Time::FromJsTime(parsed_sth.timestamp); @@ -158,14 +118,12 @@ bool FillConsistencyProof(const base::Value& json_consistency_proof, JsonConsistencyProof parsed_proof; base::JSONValueConverter converter; if (!converter.Convert(json_consistency_proof, &parsed_proof)) { - DVLOG(1) << "Invalid consistency proof."; return false; } const base::DictionaryValue* dict_value = NULL; if (!json_consistency_proof.GetAsDictionary(&dict_value) || - !dict_value->HasKey("consistency")) { - DVLOG(1) << "Missing consistency field."; + !dict_value->FindKey("consistency")) { return false; } diff --git a/net/cert/ct_log_verifier.cc b/net/cert/ct_log_verifier.cc index ae7799af4ad3..0d975002dc60 100644 --- a/net/cert/ct_log_verifier.cc +++ b/net/cert/ct_log_verifier.cc @@ -82,7 +82,6 @@ CTLogVerifier::CTLogVerifier(std::string description, std::string dns_domain) bool CTLogVerifier::Verify(const ct::SignedEntryData& entry, const ct::SignedCertificateTimestamp& sct) const { if (sct.log_id != key_id()) { - DVLOG(1) << "SCT is not signed by this log."; return false; } @@ -91,13 +90,11 @@ bool CTLogVerifier::Verify(const ct::SignedEntryData& entry, std::string serialized_log_entry; if (!ct::EncodeSignedEntry(entry, &serialized_log_entry)) { - DVLOG(1) << "Unable to serialize entry."; return false; } std::string serialized_data; if (!ct::EncodeV1SCTSignedData(sct.timestamp, serialized_log_entry, sct.extensions, &serialized_data)) { - DVLOG(1) << "Unable to create SCT to verify."; return false; } @@ -316,7 +313,7 @@ bool CTLogVerifier::Init(const base::StringPiece& public_key) { // Right now, only RSASSA-PKCS1v15 with SHA-256 and ECDSA with SHA-256 are // supported. - switch (EVP_PKEY_type(public_key_->type)) { + switch (EVP_PKEY_id(public_key_)) { case EVP_PKEY_RSA: hash_algorithm_ = ct::DigitallySigned::HASH_ALGO_SHA256; signature_algorithm_ = ct::DigitallySigned::SIG_ALGO_RSA; @@ -326,7 +323,6 @@ bool CTLogVerifier::Init(const base::StringPiece& public_key) { signature_algorithm_ = ct::DigitallySigned::SIG_ALGO_ECDSA; break; default: - DVLOG(1) << "Unsupported key type: " << EVP_PKEY_type(public_key_->type); return false; } @@ -334,7 +330,6 @@ bool CTLogVerifier::Init(const base::StringPiece& public_key) { // EVP_PKEY_size returns the size in bytes. 256 = 2048-bit RSA key. if (signature_algorithm_ == ct::DigitallySigned::SIG_ALGO_RSA && EVP_PKEY_size(public_key_) < 256) { - DVLOG(1) << "Too small a public key."; return false; } diff --git a/net/cert/ct_serialization.cc b/net/cert/ct_serialization.cc index 434529b05754..f7e9f6060301 100644 --- a/net/cert/ct_serialization.cc +++ b/net/cert/ct_serialization.cc @@ -139,11 +139,9 @@ bool ReadList(size_t max_list_length, while (!list_data.empty()) { base::StringPiece list_item; if (!ReadVariableBytes(max_item_length, &list_data, &list_item)) { - DVLOG(1) << "Failed to read item in list."; return false; } if (list_item.empty()) { - DVLOG(1) << "Empty item in list"; return false; } result.push_back(list_item); @@ -295,12 +293,8 @@ bool DecodeDigitallySigned(base::StringPiece* input, } DigitallySigned result; - if (!ConvertHashAlgorithm(hash_algo, &result.hash_algorithm)) { - DVLOG(1) << "Invalid hash algorithm " << hash_algo; - return false; - } - if (!ConvertSignatureAlgorithm(sig_algo, &result.signature_algorithm)) { - DVLOG(1) << "Invalid signature algorithm " << sig_algo; + if (!ConvertHashAlgorithm(hash_algo, &result.hash_algorithm) || + !ConvertSignatureAlgorithm(sig_algo, &result.signature_algorithm)) { return false; } sig_data.CopyToString(&result.signature_data); @@ -328,8 +322,6 @@ static bool ReadTimeSinceEpoch(base::StringPiece* input, base::Time* output) { base::CheckedNumeric time_since_epoch_signed = time_since_epoch; if (!time_since_epoch_signed.IsValid()) { - DVLOG(1) << "Timestamp value too big to cast to int64_t: " - << time_since_epoch; return false; } @@ -407,7 +399,6 @@ bool DecodeSignedCertificateTimestamp( if (!ReadUint(kVersionLength, input, &version)) return false; if (version != SignedCertificateTimestamp::V1) { - DVLOG(1) << "Unsupported/invalid version " << version; return false; } diff --git a/net/cert/jwk_serializer.cc b/net/cert/jwk_serializer.cc deleted file mode 100644 index 0faab4041641..000000000000 --- a/net/cert/jwk_serializer.cc +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/cert/jwk_serializer.h" - -#include "base/base64url.h" -#include "base/logging.h" -#include "base/strings/string_util.h" -#include "base/values.h" -#include "crypto/openssl_util.h" -#include "third_party/boringssl/src/include/openssl/bn.h" -#include "third_party/boringssl/src/include/openssl/bytestring.h" -#include "third_party/boringssl/src/include/openssl/ec.h" -#include "third_party/boringssl/src/include/openssl/ec_key.h" -#include "third_party/boringssl/src/include/openssl/evp.h" - -namespace net { - -namespace JwkSerializer { - -namespace { - -bool ConvertEcKeyToJwk(EVP_PKEY* pkey, - base::DictionaryValue* public_key_jwk, - const crypto::OpenSSLErrStackTracer& err_tracer) { - EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(pkey); - if (!ec_key) - return false; - const EC_GROUP* ec_group = EC_KEY_get0_group(ec_key); - if (!ec_group) - return false; - - std::string curve_name; - int nid = EC_GROUP_get_curve_name(ec_group); - if (nid == NID_X9_62_prime256v1) { - curve_name = "P-256"; - } else if (nid == NID_secp384r1) { - curve_name = "P-384"; - } else if (nid == NID_secp521r1) { - curve_name = "P-521"; - } else { - return false; - } - - int degree_bytes = (EC_GROUP_get_degree(ec_group) + 7) / 8; - - const EC_POINT* ec_point = EC_KEY_get0_public_key(ec_key); - if (!ec_point) - return false; - - bssl::UniquePtr x(BN_new()); - bssl::UniquePtr y(BN_new()); - if (!EC_POINT_get_affine_coordinates_GFp(ec_group, ec_point, x.get(), y.get(), - NULL)) { - return false; - } - - // The coordinates are encoded with leading zeros included. - std::string x_bytes; - std::string y_bytes; - if (!BN_bn2bin_padded(reinterpret_cast( - base::WriteInto(&x_bytes, degree_bytes + 1)), - degree_bytes, x.get()) || - !BN_bn2bin_padded(reinterpret_cast( - base::WriteInto(&y_bytes, degree_bytes + 1)), - degree_bytes, y.get())) { - return false; - } - - public_key_jwk->SetString("kty", "EC"); - public_key_jwk->SetString("crv", curve_name); - - std::string x_b64; - base::Base64UrlEncode(x_bytes, base::Base64UrlEncodePolicy::OMIT_PADDING, - &x_b64); - public_key_jwk->SetString("x", x_b64); - - std::string y_b64; - base::Base64UrlEncode(y_bytes, base::Base64UrlEncodePolicy::OMIT_PADDING, - &y_b64); - public_key_jwk->SetString("y", y_b64); - - return true; -} - -} // namespace - -bool ConvertSpkiFromDerToJwk(const base::StringPiece& spki_der, - base::DictionaryValue* public_key_jwk) { - public_key_jwk->Clear(); - - crypto::EnsureOpenSSLInit(); - crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); - - CBS cbs; - CBS_init(&cbs, reinterpret_cast(spki_der.data()), - spki_der.size()); - bssl::UniquePtr pubkey(EVP_parse_public_key(&cbs)); - if (!pubkey || CBS_len(&cbs) != 0) - return false; - - if (pubkey->type == EVP_PKEY_EC) { - return ConvertEcKeyToJwk(pubkey.get(), public_key_jwk, err_tracer); - } else { - // TODO(juanlang): other algorithms - return false; - } -} - -} // namespace JwkSerializer - -} // namespace net diff --git a/net/cert/jwk_serializer.h b/net/cert/jwk_serializer.h deleted file mode 100644 index ee8cc8ad0980..000000000000 --- a/net/cert/jwk_serializer.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef NET_CERT_JWK_SERIALIZER_H_ -#define NET_CERT_JWK_SERIALIZER_H_ - -#include "base/strings/string_piece.h" -#include "net/base/net_export.h" - -namespace base { -class DictionaryValue; -} - -namespace net { - -namespace JwkSerializer { - -// Converts a subject public key info from DER to JWK. -// See http://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-17 for -// the output format. -NET_EXPORT_PRIVATE bool ConvertSpkiFromDerToJwk( - const base::StringPiece& spki_der, - base::DictionaryValue* public_key_jwk); - -} // namespace JwkSerializer - -} // namespace net - -#endif // NET_CERT_JWK_SERIALIZER_H_ diff --git a/net/cert/jwk_serializer_unittest.cc b/net/cert/jwk_serializer_unittest.cc deleted file mode 100644 index cd041de78160..000000000000 --- a/net/cert/jwk_serializer_unittest.cc +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/cert/jwk_serializer.h" - -#include "base/base64url.h" -#include "base/values.h" -#include "starboard/memory.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace net { - -namespace { - -// This is the ASN.1 prefix for a P-256 public key. Specifically it's: -// SEQUENCE -// SEQUENCE -// OID id-ecPublicKey -// OID prime256v1 -// BIT STRING, length 66, 0 trailing bits: 0x04 -// -// The 0x04 in the BIT STRING is the prefix for an uncompressed, X9.62 -// public key. Following that are the two field elements as 32-byte, -// big-endian numbers, as required by the Channel ID. -static const unsigned char kP256SpkiPrefix[] = { - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, - 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04 -}; -static const unsigned int kEcCoordinateSize = 32U; - -// This is a valid P-256 public key. -static const unsigned char kSpkiEc[] = { - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, - 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04, - 0x29, 0x5d, 0x6e, 0xfe, 0x33, 0x77, 0x26, 0xea, - 0x5b, 0xa4, 0xe6, 0x1b, 0x34, 0x6e, 0x7b, 0xa0, - 0xa3, 0x8f, 0x33, 0x49, 0xa0, 0x9c, 0xae, 0x98, - 0xbd, 0x46, 0x0d, 0xf6, 0xd4, 0x5a, 0xdc, 0x8a, - 0x1f, 0x8a, 0xb2, 0x20, 0x51, 0xb7, 0xd2, 0x87, - 0x0d, 0x53, 0x7e, 0x5d, 0x94, 0xa3, 0xe0, 0x34, - 0x16, 0xa1, 0xcc, 0x10, 0x48, 0xcd, 0x70, 0x9c, - 0x05, 0xd3, 0xd2, 0xca, 0xdf, 0x44, 0x2f, 0xf4 -}; - -// This is a P-256 public key with a leading 0. -static const unsigned char kSpkiEcWithLeadingZero[] = { - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, - 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, - 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, - 0x42, 0x00, 0x04, - 0x00, 0x8e, 0xd5, 0x49, 0x51, 0xad, 0x7d, 0xd3, - 0x3a, 0x59, 0x86, 0xd1, 0x2c, 0xba, 0x05, 0xd3, - 0xa6, 0x3c, 0x5d, 0x6d, 0x28, 0xde, 0x8f, 0xdd, - 0xa5, 0x3d, 0x30, 0x18, 0x05, 0x86, 0x76, 0x9c, - 0x7c, 0xa7, 0xba, 0x58, 0xea, 0x1a, 0x84, 0x19, - 0x29, 0x0a, 0x15, 0x30, 0x7d, 0x6b, 0x00, 0x41, - 0x64, 0x56, 0x84, 0x19, 0x54, 0x3e, 0x26, 0x13, - 0xc9, 0x1e, 0x31, 0x89, 0xe2, 0x62, 0xcb, 0x3f -}; - -// Section 2 of RFC 7515 defines that an URL-safe base64 encoding must be used -// with all trailing '=' characters omitted. Returns whether the |input| -// contains any of the forbidden base64 characters (+, -, =). -bool ContainsNonUrlSafeBase64Characters(base::StringPiece input) { - return input.find_first_of("+-=") != std::string::npos; -} - -} // namespace - -TEST(JwkSerializerTest, ConvertSpkiFromDerToJwkEc) { - base::StringPiece spki; - base::DictionaryValue public_key_jwk; - - EXPECT_FALSE(JwkSerializer::ConvertSpkiFromDerToJwk(spki, &public_key_jwk)); - EXPECT_TRUE(public_key_jwk.empty()); - - // Test the result of a "normal" point on this curve. - spki.set(reinterpret_cast(kSpkiEc), sizeof(kSpkiEc)); - EXPECT_TRUE(JwkSerializer::ConvertSpkiFromDerToJwk(spki, &public_key_jwk)); - - std::string string_value; - EXPECT_TRUE(public_key_jwk.GetString("kty", &string_value)); - EXPECT_STREQ("EC", string_value.c_str()); - EXPECT_TRUE(public_key_jwk.GetString("crv", &string_value)); - EXPECT_STREQ("P-256", string_value.c_str()); - - EXPECT_TRUE(public_key_jwk.GetString("x", &string_value)); - EXPECT_FALSE(ContainsNonUrlSafeBase64Characters(string_value)); - std::string decoded_coordinate; - EXPECT_TRUE(base::Base64UrlDecode( - string_value, base::Base64UrlDecodePolicy::DISALLOW_PADDING, - &decoded_coordinate)); - EXPECT_EQ(kEcCoordinateSize, decoded_coordinate.size()); - EXPECT_EQ( - 0, memcmp(decoded_coordinate.data(), - kSpkiEc + sizeof(kP256SpkiPrefix), kEcCoordinateSize)); - - EXPECT_TRUE(public_key_jwk.GetString("y", &string_value)); - EXPECT_FALSE(ContainsNonUrlSafeBase64Characters(string_value)); - EXPECT_TRUE(base::Base64UrlDecode( - string_value, base::Base64UrlDecodePolicy::DISALLOW_PADDING, - &decoded_coordinate)); - EXPECT_EQ(kEcCoordinateSize, decoded_coordinate.size()); - EXPECT_EQ( - 0, memcmp(decoded_coordinate.data(), - kSpkiEc + sizeof(kP256SpkiPrefix) + kEcCoordinateSize, - kEcCoordinateSize)); - - // Test the result of a corner case: leading 0s in the x, y coordinates are - // not trimmed, but the point is fixed-length encoded. - spki.set(reinterpret_cast(kSpkiEcWithLeadingZero), - sizeof(kSpkiEcWithLeadingZero)); - EXPECT_TRUE(JwkSerializer::ConvertSpkiFromDerToJwk(spki, &public_key_jwk)); - - EXPECT_TRUE(public_key_jwk.GetString("kty", &string_value)); - EXPECT_STREQ("EC", string_value.c_str()); - EXPECT_TRUE(public_key_jwk.GetString("crv", &string_value)); - EXPECT_STREQ("P-256", string_value.c_str()); - - EXPECT_TRUE(public_key_jwk.GetString("x", &string_value)); - EXPECT_FALSE(ContainsNonUrlSafeBase64Characters(string_value)); - EXPECT_TRUE(base::Base64UrlDecode( - string_value, base::Base64UrlDecodePolicy::DISALLOW_PADDING, - &decoded_coordinate)); - EXPECT_EQ(kEcCoordinateSize, decoded_coordinate.size()); - EXPECT_EQ(0, memcmp(decoded_coordinate.data(), - kSpkiEcWithLeadingZero + sizeof(kP256SpkiPrefix), - kEcCoordinateSize)); - - EXPECT_TRUE(public_key_jwk.GetString("y", &string_value)); - EXPECT_FALSE(ContainsNonUrlSafeBase64Characters(string_value)); - EXPECT_TRUE(base::Base64UrlDecode( - string_value, base::Base64UrlDecodePolicy::DISALLOW_PADDING, - &decoded_coordinate)); - EXPECT_EQ(kEcCoordinateSize, decoded_coordinate.size()); - EXPECT_EQ(0, memcmp(decoded_coordinate.data(), - kSpkiEcWithLeadingZero + - sizeof(kP256SpkiPrefix) + kEcCoordinateSize, - kEcCoordinateSize)); -} - -} // namespace net diff --git a/net/cert/multi_log_ct_verifier.cc b/net/cert/multi_log_ct_verifier.cc index a8e2bae2fe69..fdcde4a779d1 100644 --- a/net/cert/multi_log_ct_verifier.cc +++ b/net/cert/multi_log_ct_verifier.cc @@ -72,7 +72,6 @@ MultiLogCTVerifier::~MultiLogCTVerifier() = default; void MultiLogCTVerifier::AddLogs( const std::vector>& log_verifiers) { for (const auto& log_verifier : log_verifiers) { - VLOG(1) << "Adding CT log: " << log_verifier->description(); logs_[log_verifier->key_id()] = log_verifier; } } @@ -204,7 +203,6 @@ bool MultiLogCTVerifier::VerifySingleSCT( // Assume this SCT is untrusted until proven otherwise. const auto& it = logs_.find(sct->log_id); if (it == logs_.end()) { - DVLOG(1) << "SCT does not match any known log."; AddSCTAndLogStatus(sct, ct::SCT_STATUS_LOG_UNKNOWN, output_scts); return false; } @@ -212,14 +210,12 @@ bool MultiLogCTVerifier::VerifySingleSCT( sct->log_description = it->second->description(); if (!it->second->Verify(expected_entry, *sct.get())) { - DVLOG(1) << "Unable to verify SCT signature."; AddSCTAndLogStatus(sct, ct::SCT_STATUS_INVALID_SIGNATURE, output_scts); return false; } // SCT verified ok, just make sure the timestamp is legitimate. if (sct->timestamp > base::Time::Now()) { - DVLOG(1) << "SCT is from the future!"; AddSCTAndLogStatus(sct, ct::SCT_STATUS_INVALID_TIMESTAMP, output_scts); return false; } diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc index 2bd59e8858e9..74ed4551ba74 100644 --- a/net/cert/nss_cert_database.cc +++ b/net/cert/nss_cert_database.cc @@ -155,9 +155,6 @@ int NSSCertDatabase::ImportFromPKCS12( const base::string16& password, bool is_extractable, ScopedCERTCertificateList* imported_certs) { - DVLOG(1) << __func__ << " " - << PK11_GetModuleID(slot_info) << ":" - << PK11_GetSlotID(slot_info); int result = psm::nsPKCS12Blob_Import(slot_info, data.data(), data.size(), password, diff --git a/net/cert/nss_cert_database_chromeos.cc b/net/cert/nss_cert_database_chromeos.cc index 674ecc319438..1660ffe91aad 100644 --- a/net/cert/nss_cert_database_chromeos.cc +++ b/net/cert/nss_cert_database_chromeos.cc @@ -84,12 +84,9 @@ void NSSCertDatabaseChromeOS::ListModules( bool need_rw) const { NSSCertDatabase::ListModules(modules, need_rw); - size_t pre_size = modules->size(); base::EraseIf(*modules, NSSProfileFilterChromeOS::ModuleNotAllowedForProfilePredicate( profile_filter_)); - DVLOG(1) << "filtered " << pre_size - modules->size() << " of " << pre_size - << " modules"; } ScopedCERTCertificateList NSSCertDatabaseChromeOS::ListCertsImpl( @@ -103,12 +100,9 @@ ScopedCERTCertificateList NSSCertDatabaseChromeOS::ListCertsImpl( ScopedCERTCertificateList certs( NSSCertDatabase::ListCertsImpl(crypto::ScopedPK11Slot())); - size_t pre_size = certs.size(); base::EraseIf(certs, [&profile_filter](ScopedCERTCertificate& cert) { return !profile_filter.IsCertAllowed(cert.get()); }); - DVLOG(1) << "filtered " << pre_size - certs.size() << " of " << pre_size - << " certs"; return certs; } diff --git a/net/cert/nss_profile_filter_chromeos.cc b/net/cert/nss_profile_filter_chromeos.cc index 45bd99c9f6b1..7907ac0cf37b 100644 --- a/net/cert/nss_profile_filter_chromeos.cc +++ b/net/cert/nss_profile_filter_chromeos.cc @@ -13,29 +13,6 @@ namespace net { -namespace { - -std::string CertSlotsString(CERTCertificate* cert) { - std::string result; - crypto::ScopedPK11SlotList slots_for_cert( - PK11_GetAllSlotsForCert(cert, NULL)); - for (PK11SlotListElement* slot_element = - PK11_GetFirstSafe(slots_for_cert.get()); - slot_element; - slot_element = - PK11_GetNextSafe(slots_for_cert.get(), slot_element, PR_FALSE)) { - if (!result.empty()) - result += ','; - base::StringAppendF(&result, - "%lu:%lu", - PK11_GetModuleID(slot_element->slot), - PK11_GetSlotID(slot_element->slot)); - } - return result; -} - -} // namespace - NSSProfileFilterChromeOS::NSSProfileFilterChromeOS() = default; NSSProfileFilterChromeOS::NSSProfileFilterChromeOS( @@ -117,10 +94,8 @@ bool NSSProfileFilterChromeOS::IsModuleAllowed(PK11SlotInfo* slot) const { bool NSSProfileFilterChromeOS::IsCertAllowed(CERTCertificate* cert) const { crypto::ScopedPK11SlotList slots_for_cert( PK11_GetAllSlotsForCert(cert, NULL)); - if (!slots_for_cert) { - DVLOG(2) << "cert no slots: " << base::StringPiece(cert->nickname); + if (!slots_for_cert) return false; - } for (PK11SlotListElement* slot_element = PK11_GetFirstSafe(slots_for_cert.get()); @@ -128,14 +103,11 @@ bool NSSProfileFilterChromeOS::IsCertAllowed(CERTCertificate* cert) const { slot_element = PK11_GetNextSafe(slots_for_cert.get(), slot_element, PR_FALSE)) { if (IsModuleAllowed(slot_element->slot)) { - DVLOG(3) << "cert from " << CertSlotsString(cert) - << " allowed: " << base::StringPiece(cert->nickname); PK11_FreeSlotListElement(slots_for_cert.get(), slot_element); return true; } } - DVLOG(2) << "cert from " << CertSlotsString(cert) - << " filtered: " << base::StringPiece(cert->nickname); + return false; } diff --git a/net/cert/x509_certificate.cc b/net/cert/x509_certificate.cc index d5cf24ae5d5e..113d65f71ade 100644 --- a/net/cert/x509_certificate.cc +++ b/net/cert/x509_certificate.cc @@ -573,7 +573,6 @@ bool X509Certificate::VerifyHostname( // Catch badly corrupt cert names up front. if (cert_san_dns_name.empty() || cert_san_dns_name.find('\0') != std::string::npos) { - DVLOG(1) << "Bad name in cert: " << cert_san_dns_name; continue; } std::string presented_name(base::ToLowerASCII(cert_san_dns_name)); @@ -682,7 +681,7 @@ void X509Certificate::GetPublicKeyInfo(const CRYPTO_BUFFER* cert_buffer, if (!pkey) return; - switch (pkey->type) { + switch (EVP_PKEY_id(pkey.get())) { case EVP_PKEY_RSA: *type = kPublicKeyTypeRSA; break; diff --git a/setup.cfg b/setup.cfg index 653b059ba007..271e1a679bfd 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,6 +7,7 @@ norecursedirs= .* cobalt/black_box_tests/tests cobalt/media_integration_tests + media out testing/android testing/gtest diff --git a/starboard/CHANGELOG.md b/starboard/CHANGELOG.md index 1694030dcfb5..1d125cb1bb9f 100644 --- a/starboard/CHANGELOG.md +++ b/starboard/CHANGELOG.md @@ -9,6 +9,41 @@ since the version previous to it. ## Version 16 +## Deprecated `OnScreenKeyboard` +OnScreenKeyboard Starboard API has been deprecated, an extension in +`starboard/extension/on_screen_keyboard.h` is available instead. The removal +includes the following functions: +* `SbWindowBlurOnScreenKeyboard` +* `SbWindowFocusOnScreenKeyboard` +* `SbWindowGetOnScreenKeyboardBoundingRect` +* `SbWindowHideOnScreenKeyboard` +* `SbWindowIsOnScreenKeyboardShown` +* `SbWindowOnScreenKeyboardIsSupported` +* `SbWindowOnScreenKeyboardSuggestionsSupported` +* `SbWindowSetOnScreenKeyboardKeepFocus` +* `SbWindowShowOnScreenKeyboard` +* `SbWindowUpdateOnScreenKeyboardSuggestions` + +The config value of `SB_HAS_ON_SCREEN_KEYBOARD` is also removed. + +## Removed configs for `FILESYSTEM_ZERO_FILEINFO_TIME` and `COARSE_ACCESS_TIME` +These are no longer used in Starboard and Cobalt. + +## Removed `QUIRK_HASH_FILE_NAME` +No platforms are using this config anymore. + +## Removed `QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES` +This configuration is not used in Cobalt. + +## Removed `QUIRK_SOCKET_BSD_HEADERS` configuration +This config flag is unused. + +## Removed `SB_HAS_SPEECH_SYNTHESIS` configuration +This configuration has been replaced by `SbSpeechSynthesisIsSupported()` + +## Removed `VIRTUAL_REALITY` configuration +This configuration not used in Cobalt. + ### Removed configuration for `abort_on_allocation_failure` This flag has no effect in builds, and checked allocations are removed in Starboard 16. diff --git a/starboard/android/apk/apk_sources.gni b/starboard/android/apk/apk_sources.gni index 456420209465..7f85c40f50df 100644 --- a/starboard/android/apk/apk_sources.gni +++ b/starboard/android/apk/apk_sources.gni @@ -30,8 +30,6 @@ apk_sources = [ "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltTextToSpeechHelper.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/CrashContextUpdateHandler.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/ErrorDialog.java", - "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardEditor.java", - "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardInputConnection.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/MediaPlaybackService.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/NetworkStatus.java", "//starboard/android/apk/app/src/main/java/dev/cobalt/coat/NullCobaltFactory.java", diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java index a7e85e0412a5..8c7a28d1c935 100644 --- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java +++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/CobaltActivity.java @@ -41,7 +41,7 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; -import java.util.regex.*; +import java.util.regex.Pattern; /** Native activity that has the required JNI methods called by the Starboard implementation. */ public abstract class CobaltActivity extends GameActivity { @@ -72,7 +72,6 @@ public abstract class CobaltActivity extends GameActivity { private CobaltA11yHelper a11yHelper; private VideoSurfaceView videoSurfaceView; - private KeyboardEditor keyboardEditor; private boolean forceCreateNewVideoSurfaceView = false; @@ -111,12 +110,6 @@ protected void onCreate(Bundle savedInstanceState) { a11yHelper = new CobaltA11yHelper(videoSurfaceView); addContentView( videoSurfaceView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - - if (KeyboardInputConnection.nativeHasOnScreenKeyboard()) { - keyboardEditor = new KeyboardEditor(this); - addContentView( - keyboardEditor, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - } } /** @@ -160,7 +153,7 @@ protected void onStart() { DisplayUtil.addDisplayListener(this); AudioOutputManager.addAudioDeviceListener(this); - getStarboardBridge().onActivityStart(this, keyboardEditor); + getStarboardBridge().onActivityStart(this); super.onStart(); } diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardEditor.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardEditor.java deleted file mode 100644 index b28030f12286..000000000000 --- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardEditor.java +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package dev.cobalt.coat; - -import android.app.Activity; -import android.content.Context; -import android.text.Editable; -import android.text.Selection; -import android.util.AttributeSet; -import android.view.View; -import android.view.inputmethod.CompletionInfo; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; -import android.view.inputmethod.InputMethodManager; - -/** - * The custom editor that receives text and displays it for the on-screen keyboard. It interacts - * with the Input Method Engine (IME) by receiving commands through the InputConnection interface - * and sending commands through InputMethodManager. - */ -public class KeyboardEditor extends View { - private final Context context; - private Editable editable; - private KeyboardInputConnection inputConnection; - private boolean keepFocus; - private boolean keyboardShowing; - - public KeyboardEditor(Context context) { - this(context, null); - } - - public KeyboardEditor(Context context, AttributeSet attrs) { - super(context, attrs); - this.context = context; - this.keepFocus = false; - this.keyboardShowing = false; - setFocusable(true); - } - - /** - * Create a new InputConnection for the on-screen keyboard InputMethod to interact with the view. - */ - @Override - public InputConnection onCreateInputConnection(EditorInfo outAttrs) { - outAttrs.inputType = EditorInfo.TYPE_CLASS_TEXT; - outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE; - outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN; - outAttrs.imeOptions |= EditorInfo.IME_ACTION_SEARCH; - outAttrs.initialSelStart = Selection.getSelectionStart(editable); - outAttrs.initialSelEnd = Selection.getSelectionEnd(editable); - - this.inputConnection = new KeyboardInputConnection(context, this, outAttrs); - return inputConnection; - } - - /** Update the keepFocus boolean. */ - public void updateKeepFocus(boolean keepFocus) { - this.keepFocus = keepFocus; - } - - /** If the on-screen keyboard is showing. */ - public boolean isKeyboardShowing() { - return this.keyboardShowing; - } - - /** Hide the on-screen keyboard if keepFocus is set to false. */ - public void search() { - if (!this.keepFocus) { - hideKeyboard(); - } - } - - /** Show the on-screen keyboard. */ - public void showKeyboard() { - final Activity activity = (Activity) context; - final KeyboardEditor view = this; - - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - view.setFocusable(true); - view.requestFocus(); - - InputMethodManager imm = - (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - boolean success = imm.showSoftInput(view, 0); - if (success) { - view.updateKeyboardShowing(true); - } - } - }); - } - - /** Hide the on-screen keyboard. */ - public void hideKeyboard() { - final Activity activity = (Activity) context; - final KeyboardEditor view = this; - - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - view.setFocusable(true); - view.requestFocus(); - - InputMethodManager imm = - (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - boolean success = imm.hideSoftInputFromWindow(view.getWindowToken(), 0); - if (success) { - view.updateKeyboardShowing(false); - } - } - }); - } - - /** Send the current state of the editable to the Input Method Manager. */ - public void updateSelection(View view, int selStart, int selEnd, int compStart, int compEnd) { - InputMethodManager imm = - (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.updateSelection(view, selStart, selEnd, compStart, compEnd); - } - - /** Update the custom list of completions shown within the on-screen keyboard. */ - public void updateCustomCompletions(CompletionInfo[] completions) { - InputMethodManager imm = - (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - imm.displayCompletions(this, completions); - } - - private void updateKeyboardShowing(boolean keyboardShowing) { - this.keyboardShowing = keyboardShowing; - } -} diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardInputConnection.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardInputConnection.java deleted file mode 100644 index 3a10f81ff299..000000000000 --- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/KeyboardInputConnection.java +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package dev.cobalt.coat; - -import android.content.Context; -import android.text.Editable; -import android.text.Selection; -import android.text.TextUtils; -import android.view.KeyEvent; -import android.view.inputmethod.BaseInputConnection; -import android.view.inputmethod.EditorInfo; - -/** The communication channel between the on-screen keyboard InputMethod and the KeyboardEditor. */ -public class KeyboardInputConnection extends BaseInputConnection { - private final KeyboardEditor keyboardEditor; - private final Context context; - private int numNestedBatchEdits = 0; - - public KeyboardInputConnection( - Context context, KeyboardEditor keyboardEditor, EditorInfo outAttrs) { - super(keyboardEditor, true); - this.context = context; - this.keyboardEditor = keyboardEditor; - } - - /** - * Start a batch edit, indicating to the editor that a batch of editor operations is occurring. - * The editor will avoid sending updates about its state until endBatchEdit() is called. - */ - @Override - public boolean beginBatchEdit() { - numNestedBatchEdits++; - return super.beginBatchEdit(); - } - - /** - * End a batch edit, indicating to the editor that a batch edit previously initiated with - * beginBatchEdit() is done. This ends the latest batch only. - */ - @Override - public boolean endBatchEdit() { - boolean result = super.endBatchEdit(); - numNestedBatchEdits--; - updateEditingState(); - return result; - } - - /** Replace the currently composing text with the given text, and set the new cursor position. */ - @Override - public boolean setComposingText(CharSequence text, int newCursorPosition) { - boolean result; - if (text.length() == 0) { - result = super.commitText(text, newCursorPosition); - } else { - result = super.setComposingText(text, newCursorPosition); - } - - updateEditingState(); - Editable editable = getEditable(); - return result; - } - - /** Remove the composing state from the editable text. */ - @Override - public boolean finishComposingText() { - boolean result = super.finishComposingText(); - updateEditingState(); - return result; - } - - /** Change the selection position in the current editable text. */ - @Override - public boolean setSelection(int start, int end) { - boolean result = super.setSelection(start, end); - updateEditingState(); - return result; - } - - /** Send the current state of the editable to the editor. */ - private void updateEditingState() { - if (numNestedBatchEdits > 0) { - // The IME is in the middle of a batch edit; wait until it finishes. - return; - } - - Editable editable = getEditable(); - int selectionStart = Selection.getSelectionStart(editable); - int selectionEnd = Selection.getSelectionEnd(editable); - int composingStart = BaseInputConnection.getComposingSpanStart(editable); - int composingEnd = BaseInputConnection.getComposingSpanEnd(editable); - keyboardEditor.updateSelection( - keyboardEditor, selectionStart, selectionEnd, composingStart, composingEnd); - - if (composingStart != -1) { - // Send the composing text as an input event with isComposing set to true. - nativeSendText(editable.toString().substring(composingStart, composingEnd), true); - } else { - // Send the committed text as an input event with isComposing set to false. - nativeSendText(editable.toString(), false); - } - } - - /** Send text to the search bar and set the new cursor position. */ - @Override - public boolean commitText(CharSequence newText, int newCursorPosition) { - if (TextUtils.isEmpty(newText)) { - return false; - } - boolean result = super.commitText(newText, newCursorPosition); - updateEditingState(); - return result; - } - - /** Delete around the current selection position of the editable text. */ - @Override - public boolean deleteSurroundingText(int leftLength, int rightLength) { - Editable editable = getEditable(); - if (Selection.getSelectionStart(editable) == -1) { - return true; - } - - boolean result = super.deleteSurroundingText(leftLength, rightLength); - updateEditingState(); - return result; - } - - /** Send a key event to the editor. */ - @Override - public boolean sendKeyEvent(KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN) { - if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { - keyboardEditor.search(); - } else if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) { - Editable editable = getEditable(); - int selStart = Selection.getSelectionStart(editable); - int selEnd = Selection.getSelectionEnd(editable); - if (selEnd > selStart) { - // Delete the selection. - Selection.setSelection(editable, selStart); - editable.delete(selStart, selEnd); - updateEditingState(); - return true; - } else if (selStart > 0) { - // Delete to the left of the cursor. - int newSel = Math.max(selStart - 1, 0); - Selection.setSelection(editable, newSel); - editable.delete(newSel, selStart); - updateEditingState(); - return true; - } - } - } - return false; - } - - /** Have the editor perform an action associated with a specific key press. */ - @Override - public boolean performEditorAction(int editorAction) { - if (editorAction == EditorInfo.IME_ACTION_SEARCH) { - keyboardEditor.search(); - } - return true; - } - - public static native boolean nativeHasOnScreenKeyboard(); - - public static native void nativeSendText(CharSequence text, boolean isComposing); -} diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java index 36907c1778bc..2fc034304525 100644 --- a/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java +++ b/starboard/android/apk/app/src/main/java/dev/cobalt/coat/StarboardBridge.java @@ -75,7 +75,6 @@ public interface HostApplication { private AudioOutputManager audioOutputManager; private CobaltMediaSession cobaltMediaSession; private AudioPermissionRequester audioPermissionRequester; - private KeyboardEditor keyboardEditor; private NetworkStatus networkStatus; private ResourceOverlay resourceOverlay; private AdvertisingId advertisingId; @@ -153,9 +152,8 @@ public StarboardBridge( private native long nativeCurrentMonotonicTime(); - protected void onActivityStart(Activity activity, KeyboardEditor keyboardEditor) { + protected void onActivityStart(Activity activity) { activityHolder.set(activity); - this.keyboardEditor = keyboardEditor; sysConfigChangeReceiver.setForeground(true); } @@ -689,13 +687,6 @@ AudioOutputManager getAudioOutputManager() { return audioOutputManager; } - /** Returns Java layer implementation for KeyboardEditor */ - @SuppressWarnings("unused") - @UsedByNative - KeyboardEditor getKeyboardEditor() { - return keyboardEditor; - } - /** Returns Java layer implementation for AudioPermissionRequester */ @SuppressWarnings("unused") @UsedByNative diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java index 2ae4b2306e15..64b1c545985b 100644 --- a/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java +++ b/starboard/android/apk/app/src/main/java/dev/cobalt/media/MediaCodecBridge.java @@ -818,6 +818,9 @@ public static void createVideoMediaCodecBridge( @UsedByNative public void release() { try { + mMediaCodec.setCallback(null); + mCallback = null; + String codecName = mMediaCodec.getName(); Log.w(TAG, "calling MediaCodec.release() on " + codecName); mMediaCodec.release(); diff --git a/starboard/android/shared/BUILD.gn b/starboard/android/shared/BUILD.gn index 7bc94a7df1d3..3352d8ee4788 100644 --- a/starboard/android/shared/BUILD.gn +++ b/starboard/android/shared/BUILD.gn @@ -261,6 +261,16 @@ static_library("starboard_platform") { "//starboard/shared/stub/system_request_reveal.cc", "//starboard/shared/stub/system_sign_with_certification_secret_key.cc", "//starboard/shared/stub/ui_nav_get_interface.cc", + "//starboard/shared/stub/window_blur_on_screen_keyboard.cc", + "//starboard/shared/stub/window_focus_on_screen_keyboard.cc", + "//starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc", + "//starboard/shared/stub/window_hide_on_screen_keyboard.cc", + "//starboard/shared/stub/window_is_on_screen_keyboard_shown.cc", + "//starboard/shared/stub/window_on_screen_keyboard_is_supported.cc", + "//starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc", + "//starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc", + "//starboard/shared/stub/window_show_on_screen_keyboard.cc", + "//starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc", "accessibility_get_caption_settings.cc", "accessibility_get_display_settings.cc", "accessibility_get_text_to_speech_settings.cc", @@ -402,22 +412,12 @@ static_library("starboard_platform") { "video_render_algorithm.h", "video_window.cc", "video_window.h", - "window_blur_on_screen_keyboard.cc", "window_create.cc", "window_destroy.cc", - "window_focus_on_screen_keyboard.cc", "window_get_diagonal_size_in_inches.cc", - "window_get_on_screen_keyboard_bounding_rect.cc", "window_get_platform_handle.cc", "window_get_size.cc", - "window_hide_on_screen_keyboard.cc", "window_internal.h", - "window_is_on_screen_keyboard_shown.cc", - "window_on_screen_keyboard_is_supported.cc", - "window_on_screen_keyboard_suggestions_supported.cc", - "window_set_on_screen_keyboard_keep_focus.cc", - "window_show_on_screen_keyboard.cc", - "window_update_on_screen_keyboard_suggestions.cc", ] sources += game_activity_source_files diff --git a/starboard/android/shared/application_android.cc b/starboard/android/shared/application_android.cc index 6dad4920034f..110244aed7fa 100644 --- a/starboard/android/shared/application_android.cc +++ b/starboard/android/shared/application_android.cc @@ -511,82 +511,6 @@ Java_dev_cobalt_coat_CobaltA11yHelper_nativeInjectKeyEvent(JNIEnv* env, ApplicationAndroid::Get()->SendKeyboardInject(static_cast(key)); } -extern "C" SB_EXPORT_PLATFORM jboolean -Java_dev_cobalt_coat_KeyboardInputConnection_nativeHasOnScreenKeyboard( - JniEnvExt* env, - jobject unused_this) { - return SbWindowOnScreenKeyboardIsSupported() ? JNI_TRUE : JNI_FALSE; -} - -void ApplicationAndroid::SbWindowShowOnScreenKeyboard(SbWindow window, - const char* input_text, - int ticket) { - JniEnvExt* env = JniEnvExt::Get(); - jobject j_keyboard_editor = env->CallStarboardObjectMethodOrAbort( - "getKeyboardEditor", "()Ldev/cobalt/coat/KeyboardEditor;"); - env->CallVoidMethodOrAbort(j_keyboard_editor, "showKeyboard", "()V"); - int* data = new int; - *data = ticket; - Inject(new Event(kSbEventTypeOnScreenKeyboardShown, data, - &DeleteDestructor)); - return; -} - -void ApplicationAndroid::SbWindowHideOnScreenKeyboard(SbWindow window, - int ticket) { - JniEnvExt* env = JniEnvExt::Get(); - jobject j_keyboard_editor = env->CallStarboardObjectMethodOrAbort( - "getKeyboardEditor", "()Ldev/cobalt/coat/KeyboardEditor;"); - env->CallVoidMethodOrAbort(j_keyboard_editor, "hideKeyboard", "()V"); - int* data = new int; - *data = ticket; - Inject(new Event(kSbEventTypeOnScreenKeyboardHidden, data, - &DeleteDestructor)); - return; -} - -void ApplicationAndroid::SbWindowUpdateOnScreenKeyboardSuggestions( - SbWindow window, - const std::vector& suggestions, - int ticket) { - JniEnvExt* env = JniEnvExt::Get(); - jobjectArray completions = env->NewObjectArray( - suggestions.size(), - env->FindClass("android/view/inputmethod/CompletionInfo"), 0); - jstring str; - jobject j_completion_info; - for (size_t i = 0; i < suggestions.size(); i++) { - str = env->NewStringUTF(suggestions[i].c_str()); - j_completion_info = - env->NewObjectOrAbort("android/view/inputmethod/CompletionInfo", - "(JILjava/lang/CharSequence;)V", i, i, str); - env->SetObjectArrayElement(completions, i, j_completion_info); - } - jobject j_keyboard_editor = env->CallStarboardObjectMethodOrAbort( - "getKeyboardEditor", "()Ldev/cobalt/coat/KeyboardEditor;"); - env->CallVoidMethodOrAbort(j_keyboard_editor, "updateCustomCompletions", - "([Landroid/view/inputmethod/CompletionInfo;)V", - completions); - int* data = new int; - *data = ticket; - Inject(new Event(kSbEventTypeOnScreenKeyboardSuggestionsUpdated, data, - &DeleteDestructor)); - return; -} - -extern "C" SB_EXPORT_PLATFORM void -Java_dev_cobalt_coat_KeyboardInputConnection_nativeSendText( - JniEnvExt* env, - jobject unused_clazz, - jstring text, - jboolean is_composing) { - if (text) { - std::string utf_str = env->GetStringStandardUTFOrAbort(text); - ApplicationAndroid::Get()->SbWindowSendInputEvent(utf_str.c_str(), - is_composing); - } -} - void DeleteSbInputDataWithText(void* ptr) { SbInputData* data = static_cast(ptr); const char* input_text = data->input_text; diff --git a/starboard/android/shared/application_android.h b/starboard/android/shared/application_android.h index e25cf215e04b..ce3c535a69da 100644 --- a/starboard/android/shared/application_android.h +++ b/starboard/android/shared/application_android.h @@ -92,14 +92,6 @@ class ApplicationAndroid void SendKeyboardInject(SbKey key); - void SbWindowShowOnScreenKeyboard(SbWindow window, - const char* input_text, - int ticket); - void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket); - void SbWindowUpdateOnScreenKeyboardSuggestions( - SbWindow window, - const std::vector& suggestions, - int ticket); void SbWindowSendInputEvent(const char* input_text, bool is_composing); void SendLowMemoryEvent(); void OsNetworkStatusChange(bool became_online); diff --git a/starboard/android/shared/configuration_public.h b/starboard/android/shared/configuration_public.h index 1422eaa004a3..3c1ebced4770 100644 --- a/starboard/android/shared/configuration_public.h +++ b/starboard/android/shared/configuration_public.h @@ -23,8 +23,6 @@ #ifndef STARBOARD_ANDROID_SHARED_CONFIGURATION_PUBLIC_H_ #define STARBOARD_ANDROID_SHARED_CONFIGURATION_PUBLIC_H_ -// --- Architecture Configuration -------------------------------------------- - // --- System Header Configuration ------------------------------------------- // Any system headers listed here that are not provided by the platform will be @@ -72,12 +70,6 @@ // the current linking unit. #define SB_IMPORT_PLATFORM -// --- I/O Configuration ----------------------------------------------------- -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 1 - -// --- Decoder-only Params --- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies the platform can map @@ -92,24 +84,4 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Configuration --------------------------------------- - -// --- Platform Specific Audits ---------------------------------------------- - -#if !defined(__GNUC__) -#error "Android builds need a GCC-like compiler (for the moment)." -#endif - -// --- Platform Specific Quirks ---------------------------------------------- - -// Indicates that there is no support for alignment at greater than 16 bytes for -// items on the stack. -#define SB_HAS_QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES 1 - #endif // STARBOARD_ANDROID_SHARED_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/android/shared/window_blur_on_screen_keyboard.cc b/starboard/android/shared/window_blur_on_screen_keyboard.cc deleted file mode 100644 index 83696bf46bbd..000000000000 --- a/starboard/android/shared/window_blur_on_screen_keyboard.cc +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -void SbWindowBlurOnScreenKeyboard(SbWindow window, int ticket) { - // Stub. - return; -} diff --git a/starboard/android/shared/window_focus_on_screen_keyboard.cc b/starboard/android/shared/window_focus_on_screen_keyboard.cc deleted file mode 100644 index bbcb7a3ba55c..000000000000 --- a/starboard/android/shared/window_focus_on_screen_keyboard.cc +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket) { - // Stub. - return; -} diff --git a/starboard/android/shared/window_get_on_screen_keyboard_bounding_rect.cc b/starboard/android/shared/window_get_on_screen_keyboard_bounding_rect.cc deleted file mode 100644 index 38b3536df95e..000000000000 --- a/starboard/android/shared/window_get_on_screen_keyboard_bounding_rect.cc +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -bool SbWindowGetOnScreenKeyboardBoundingRect(SbWindow window, - SbWindowRect* bounding_rect) { - // Stub. - return true; -} diff --git a/starboard/android/shared/window_hide_on_screen_keyboard.cc b/starboard/android/shared/window_hide_on_screen_keyboard.cc deleted file mode 100644 index 642060eeb940..000000000000 --- a/starboard/android/shared/window_hide_on_screen_keyboard.cc +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -#include "starboard/android/shared/application_android.h" - -void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket) { - starboard::android::shared::ApplicationAndroid::Get() - ->SbWindowHideOnScreenKeyboard(window, ticket); - return; -} diff --git a/starboard/android/shared/window_is_on_screen_keyboard_shown.cc b/starboard/android/shared/window_is_on_screen_keyboard_shown.cc deleted file mode 100644 index c7749a343a04..000000000000 --- a/starboard/android/shared/window_is_on_screen_keyboard_shown.cc +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -#include "starboard/android/shared/jni_env_ext.h" -#include "starboard/android/shared/jni_utils.h" - -using starboard::android::shared::JniEnvExt; -using starboard::android::shared::ScopedLocalJavaRef; - -bool SbWindowIsOnScreenKeyboardShown(SbWindow window) { - JniEnvExt* env = JniEnvExt::Get(); - - ScopedLocalJavaRef j_keyboard_editor( - env->CallStarboardObjectMethodOrAbort( - "getKeyboardEditor", "()Ldev/cobalt/coat/KeyboardEditor;")); - jboolean is_keyboard_shown = env->CallBooleanMethodOrAbort( - j_keyboard_editor.Get(), "isKeyboardShowing", "()Z"); - return is_keyboard_shown; -} diff --git a/starboard/android/shared/window_on_screen_keyboard_is_supported.cc b/starboard/android/shared/window_on_screen_keyboard_is_supported.cc deleted file mode 100644 index 5388180cfd88..000000000000 --- a/starboard/android/shared/window_on_screen_keyboard_is_supported.cc +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -bool SbWindowOnScreenKeyboardIsSupported() { - return false; -} diff --git a/starboard/android/shared/window_on_screen_keyboard_suggestions_supported.cc b/starboard/android/shared/window_on_screen_keyboard_suggestions_supported.cc deleted file mode 100644 index 541aa6aba278..000000000000 --- a/starboard/android/shared/window_on_screen_keyboard_suggestions_supported.cc +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window) { - return true; -} diff --git a/starboard/android/shared/window_set_on_screen_keyboard_keep_focus.cc b/starboard/android/shared/window_set_on_screen_keyboard_keep_focus.cc deleted file mode 100644 index a216937a6ae9..000000000000 --- a/starboard/android/shared/window_set_on_screen_keyboard_keep_focus.cc +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -#include "starboard/android/shared/jni_env_ext.h" - -using starboard::android::shared::JniEnvExt; - -void SbWindowSetOnScreenKeyboardKeepFocus(SbWindow window, bool keep_focus) { - JniEnvExt* env = JniEnvExt::Get(); - jobject j_keyboard_editor = env->CallStarboardObjectMethodOrAbort( - "getKeyboardEditor", "()Ldev/cobalt/coat/KeyboardEditor;"); - env->CallVoidMethodOrAbort(j_keyboard_editor, "updateKeepFocus", "(Z)V", - keep_focus); - return; -} diff --git a/starboard/android/shared/window_show_on_screen_keyboard.cc b/starboard/android/shared/window_show_on_screen_keyboard.cc deleted file mode 100644 index bd378a0a1e8a..000000000000 --- a/starboard/android/shared/window_show_on_screen_keyboard.cc +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2018 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -#include "starboard/android/shared/application_android.h" - -void SbWindowShowOnScreenKeyboard(SbWindow window, - const char* input_text, - int ticket) { - starboard::android::shared::ApplicationAndroid::Get() - ->SbWindowShowOnScreenKeyboard(window, input_text, ticket); - return; -} diff --git a/starboard/android/shared/window_update_on_screen_keyboard_suggestions.cc b/starboard/android/shared/window_update_on_screen_keyboard_suggestions.cc deleted file mode 100644 index 44bad140e4fc..000000000000 --- a/starboard/android/shared/window_update_on_screen_keyboard_suggestions.cc +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2019 The Cobalt Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "starboard/window.h" - -#include "starboard/android/shared/application_android.h" - -void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, - const char* suggestions[], - int num_suggestions, - int ticket) { - std::vector suggestions_data; - for (int i = 0; i < num_suggestions; ++i) { - suggestions_data.push_back(suggestions[i]); - } - starboard::android::shared::ApplicationAndroid::Get() - ->SbWindowUpdateOnScreenKeyboardSuggestions(window, suggestions_data, - ticket); - return; -} diff --git a/starboard/build/clang.py b/starboard/build/clang.py index 6a671faca1d0..4818c83a9e70 100644 --- a/starboard/build/clang.py +++ b/starboard/build/clang.py @@ -18,4 +18,4 @@ def GetClangSpecification(): """Gets the ClangSpecification instance for this project.""" - return ClangSpecification('16-init-17653-g39da55e8-2', '16.0.0') + return ClangSpecification('17-init-8029-g27f27d15-3', '17.0.0') diff --git a/starboard/build/config/clang.gni b/starboard/build/config/clang.gni index ded53f2ec880..65169b273d71 100644 --- a/starboard/build/config/clang.gni +++ b/starboard/build/config/clang.gni @@ -15,7 +15,7 @@ import("//starboard/build/toolchain/starboard_toolchains.gni") declare_args() { - clang_revision = "16-init-17653-g39da55e8-2" + clang_revision = "17-init-8029-g27f27d15-3" } default_clang_base_path = "$starboard_toolchains_path/x86_64-linux-gnu-clang-chromium-${clang_revision}" diff --git a/starboard/configuration.h b/starboard/configuration.h index d561db44a7ef..e80464b6537b 100644 --- a/starboard/configuration.h +++ b/starboard/configuration.h @@ -51,9 +51,6 @@ // --- Common Helper Macros -------------------------------------------------- -#define SB_TRUE #error "The macro SB_TRUE is deprecated." -#define SB_FALSE #error "The macro SB_FALSE is deprecated." - // Determines a compile-time capability of the system. #define SB_CAN(SB_FEATURE) \ ((defined SB_CAN_##SB_FEATURE) && SB_CAN_##SB_FEATURE) @@ -111,9 +108,6 @@ struct CompileAssert {}; #define SB_STRINGIFY(x) SB_STRINGIFY2(x) #define SB_STRINGIFY2(x) #x -#define SB_DISALLOW_COPY_AND_ASSIGN \ - #error "The SB_DISALLOW_COPY_AND_ASSIGN macro is deprecated." - // An enumeration of values for the kSbPreferredByteOrder configuration // variable. Setting this up properly means avoiding slow color swizzles when // passing pixel data from one library to another. Note that these definitions @@ -187,13 +181,6 @@ struct CompileAssert {}; #endif // COMPILER_GCC #endif // SB_WARN_UNUSED_RESULT -// Declares a function as overriding a virtual function on compilers that -// support it. -#define SB_OVERRIDE \ - #error \ - "The SB_OVERRIDE macro is deprecated. Please use \"override\" " \ - "instead." - // Declare numeric literals of signed 64-bit type. #if !defined(SB_INT64_C) #if defined(_MSC_VER) @@ -355,205 +342,6 @@ struct CompileAssert {}; #error "Your platform must define SB_IMPORT_PLATFORM." #endif -#if defined(SB_DEFAULT_MMAP_THRESHOLD) -#error \ - "SB_DEFAULT_MMAP_THRESHOLD should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbDefaultMmapThreshold in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_FILE_MAX_NAME) -#error \ - "SB_FILE_MAX_NAME should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbFileMaxName in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_FILE_MAX_OPEN) -#error \ - "SB_FILE_MAX_OPEN should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbFileMaxOpen in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_FILE_ALT_SEP_CHAR) -#error \ - "SB_FILE_ALT_SEP_CHAR should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbFileAltSepChar in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_FILE_ALT_SEP_STRING) -#error \ - "SB_FILE_ALT_SEP_STRING should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbFileAltSepString in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_FILE_MAX_PATH) -#error \ - "SB_FILE_MAX_PATH should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbFileMaxPath in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_FILE_SEP_CHAR) -#error \ - "SB_FILE_SEP_CHAR should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbFileSepChar in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_FILE_SEP_STRING) -#error \ - "SB_FILE_SEP_STRING should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbFileSepString in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_HAS_AC3_AUDIO) -#error \ - "SB_HAS_AC3_AUDIO should not be defined in Starboard " \ -"versions 12 and later." -#endif - -#if defined(SB_HAS_MEDIA_WEBM_VP9_SUPPORT) -#error \ - "SB_HAS_MEDIA_WEBM_VP9_SUPPORT should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbHasMediaWebmVp9Support in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_HAS_THREAD_PRIORITY_SUPPORT) -#error \ - "SB_HAS_THREAD_PRIORITY_SUPPORT should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbHasThreadPrioritySupport in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_MALLOC_ALIGNMENT) -#error \ - "SB_MALLOC_ALIGNMENT should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbMallocAlignment in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_MAX_THREADS) -#error \ - "SB_MAX_THREADS should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbMaxThreads in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_MAX_THREAD_LOCAL_KEYS) -#error \ - "SB_MAX_THREAD_LOCAL_KEYS should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbMaxThreadLocalKeys in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_MAX_THREAD_NAME_LENGTH) -#error \ - "SB_MAX_THREAD_NAME_LENGTH should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbMaxThreadNameLength in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_MEDIA_MAXIMUM_VIDEO_FRAMES) -#error \ - "SB_MEDIA_MAXIMUM_VIDEO_FRAMES should not be defined in Starboard " \ -"versions 12 and later." -#endif - -#if defined(SB_MEDIA_MAXIMUM_VIDEO_PREROLL_FRAMES) -#error \ - "SB_MEDIA_MAXIMUM_VIDEO_PREROLL_FRAMES should not be defined in " \ -"Starboard versions 12 and later." -#endif - -#if defined(SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND) -#error \ - "SB_MEDIA_MAX_AUDIO_BITRATE_IN_BITS_PER_SECOND should not be defined in " \ -"Starboard versions 12 and later. Instead, define " \ -"kSbMediaMaxAudioBitrateInBitsPerSecond in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND) -#error \ - "SB_MEDIA_MAX_VIDEO_BITRATE_IN_BITS_PER_SECOND should not be defined in " \ -"Starboard versions 12 and later. Instead, define " \ -"kSbMediaMaxVideoBitrateInBitsPerSecond in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_MEDIA_VIDEO_FRAME_ALIGNMENT) -#error \ - "SB_MEDIA_VIDEO_FRAME_ALIGNMENT should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbMediaVideoFrameAlignment in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_MEMORY_LOG_PATH) -#error \ - "SB_MEMORY_LOG_PATH should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbMemoryLogPath in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_MEMORY_PAGE_SIZE) -#error \ - "SB_MEMORY_PAGE_SIZE should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbMemoryPageSize in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_NETWORK_RECEIVE_BUFFER_SIZE) -#error \ - "SB_NETWORK_RECEIVE_BUFFER_SIZE should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbNetworkReceiveBufferSize in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_PATH_SEP_CHAR) -#error \ - "SB_PATH_SEP_CHAR should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbPathSepChar in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_PATH_SEP_STRING) -#error \ - "SB_PATH_SEP_STRING should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbPathSepString in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_PREFERRED_RGBA_BYTE_ORDER) -#error \ - "SB_PREFERRED_RGBA_BYTE_ORDER should not be defined in Starboard " \ -"versions 12 and later. Instead, define kSbPreferredRgbaByteOrder in " \ -"starboard//configuration_constants.cc." -#endif - -#if defined(SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT) -#error \ - "SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT should not be defined for " \ - "API version >= 12." -#endif // defined(SB_HAS_MEDIA_IS_VIDEO_SUPPORTED_REFINEMENT) - -#if defined(SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT) -#error \ - "SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT should not be " \ - "defined in API versions >= 12." -#endif // defined(SB_HAS_PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT) - -#if SB_HAS_QUIRK(SEEK_TO_KEYFRAME) -#error \ - "SB_HAS_QUIRK_SEEK_TO_KEYFRAME is deprecated in Starboard 12 or later." \ - " Please see configuration-public.md for more details." -#endif // SB_HAS_QUIRK(SEEK_TO_KEYFRAME) - // --- Derived Configuration ------------------------------------------------- // Whether the current platform has 64-bit atomic operations. diff --git a/starboard/elf_loader/exported_symbols.cc b/starboard/elf_loader/exported_symbols.cc index 1f15a689d202..a537c4eea2e8 100644 --- a/starboard/elf_loader/exported_symbols.cc +++ b/starboard/elf_loader/exported_symbols.cc @@ -396,23 +396,31 @@ ExportedSymbols::ExportedSymbols() { REGISTER_SYMBOL(SbUserGetProperty); REGISTER_SYMBOL(SbUserGetPropertySize); REGISTER_SYMBOL(SbUserGetSignedIn); -#endif // SB_API_VERSION < 16 REGISTER_SYMBOL(SbWindowBlurOnScreenKeyboard); +#endif // SB_API_VERSION < 16 REGISTER_SYMBOL(SbWindowCreate); REGISTER_SYMBOL(SbWindowDestroy); +#if SB_API_VERSION < 16 REGISTER_SYMBOL(SbWindowFocusOnScreenKeyboard); +#endif // SB_API_VERSION < 16 REGISTER_SYMBOL(SbWindowGetDiagonalSizeInInches); +#if SB_API_VERSION < 16 REGISTER_SYMBOL(SbWindowGetOnScreenKeyboardBoundingRect); +#endif // SB_API_VERSION < 16 REGISTER_SYMBOL(SbWindowGetPlatformHandle); REGISTER_SYMBOL(SbWindowGetSize); +#if SB_API_VERSION < 16 REGISTER_SYMBOL(SbWindowHideOnScreenKeyboard); REGISTER_SYMBOL(SbWindowIsOnScreenKeyboardShown); REGISTER_SYMBOL(SbWindowOnScreenKeyboardIsSupported); REGISTER_SYMBOL(SbWindowOnScreenKeyboardSuggestionsSupported); +#endif // SB_API_VERSION < 16 REGISTER_SYMBOL(SbWindowSetDefaultOptions); +#if SB_API_VERSION < 16 REGISTER_SYMBOL(SbWindowSetOnScreenKeyboardKeepFocus); REGISTER_SYMBOL(SbWindowShowOnScreenKeyboard); REGISTER_SYMBOL(SbWindowUpdateOnScreenKeyboardSuggestions); +#endif // SB_API_VERSION < 16 #if SB_API_VERSION >= 16 // POSIX APIs @@ -489,6 +497,8 @@ ExportedSymbols::ExportedSymbols() { reinterpret_cast(&__abi_wrap_pthread_mutex_unlock); map_["pthread_mutex_trylock"] = reinterpret_cast(&__abi_wrap_pthread_mutex_trylock); + map_["pthread_once"] = + reinterpret_cast(&__abi_wrap_pthread_once); map_["time"] = reinterpret_cast(&__abi_wrap_time); #if defined(_MSC_VER) diff --git a/starboard/event.h b/starboard/event.h index fcdd6511b2fd..b7f245559b3b 100644 --- a/starboard/event.h +++ b/starboard/event.h @@ -261,6 +261,7 @@ typedef enum SbEventType { // kSbEventOnScreenKeyboardInvalidTicket. kSbEventTypeOnScreenKeyboardBlurred, +#if SB_API_VERSION < 16 // The platform has updated the on screen keyboard suggestions. This event is // triggered by the system or by the application's OnScreenKeyboard update // suggestions method. The event has int data representing a ticket. The @@ -270,6 +271,10 @@ typedef enum SbEventType { // SbWindowUpdateOnScreenKeyboardSuggestions. System-triggered events have // ticket value kSbEventOnScreenKeyboardInvalidTicket. kSbEventTypeOnScreenKeyboardSuggestionsUpdated, +#else + // Reserved for deprecated events. + kSbEventTypeReserved1, +#endif // SB_API_VERSION < 16 // One or more of the fields returned by SbAccessibilityGetCaptionSettings // has changed. diff --git a/starboard/evergreen/arm/hardfp/configuration_public.h b/starboard/evergreen/arm/hardfp/configuration_public.h index 349fb5c26543..bf27adea7f99 100644 --- a/starboard/evergreen/arm/hardfp/configuration_public.h +++ b/starboard/evergreen/arm/hardfp/configuration_public.h @@ -21,8 +21,6 @@ #ifndef STARBOARD_EVERGREEN_ARM_HARDFP_CONFIGURATION_PUBLIC_H_ #define STARBOARD_EVERGREEN_ARM_HARDFP_CONFIGURATION_PUBLIC_H_ -// --- Architecture Configuration -------------------------------------------- - // --- System Header Configuration ------------------------------------------- // Any system headers listed here that are not provided by the platform will be @@ -70,16 +68,6 @@ // the current linking unit. #define SB_IMPORT_PLATFORM -// --- I/O Configuration ----------------------------------------------------- - -// Whether the current platform implements the on screen keyboard interface. -#define SB_HAS_ON_SCREEN_KEYBOARD 0 - -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 0 - -// --- Decoder-only Params --- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is @@ -94,16 +82,4 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Audits ---------------------------------------------- - -#if !defined(__GNUC__) -#error "Evergreen-arm builds need a GCC-like compiler (for the moment)." -#endif - #endif // STARBOARD_EVERGREEN_ARM_HARDFP_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/evergreen/arm/softfp/configuration_public.h b/starboard/evergreen/arm/softfp/configuration_public.h index bf89b81fd99a..5d85c23440ab 100644 --- a/starboard/evergreen/arm/softfp/configuration_public.h +++ b/starboard/evergreen/arm/softfp/configuration_public.h @@ -21,8 +21,6 @@ #ifndef STARBOARD_EVERGREEN_ARM_SOFTFP_CONFIGURATION_PUBLIC_H_ #define STARBOARD_EVERGREEN_ARM_SOFTFP_CONFIGURATION_PUBLIC_H_ -// --- Architecture Configuration -------------------------------------------- - // --- System Header Configuration ------------------------------------------- // Any system headers listed here that are not provided by the platform will be @@ -70,19 +68,6 @@ // the current linking unit. #define SB_IMPORT_PLATFORM -// --- I/O Configuration ----------------------------------------------------- - -// Whether the current platform has microphone supported. -#define SB_HAS_MICROPHONE 0 - -// Whether the current platform implements the on screen keyboard interface. -#define SB_HAS_ON_SCREEN_KEYBOARD 0 - -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 0 - -// --- Decoder-only Params --- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is @@ -97,16 +82,4 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Audits ---------------------------------------------- - -#if !defined(__GNUC__) -#error "Evergreen-arm builds need a GCC-like compiler (for the moment)." -#endif - #endif // STARBOARD_EVERGREEN_ARM_SOFTFP_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/evergreen/arm64/configuration_public.h b/starboard/evergreen/arm64/configuration_public.h index d0c3a6ac012a..da64cd6466f3 100644 --- a/starboard/evergreen/arm64/configuration_public.h +++ b/starboard/evergreen/arm64/configuration_public.h @@ -21,8 +21,6 @@ #ifndef STARBOARD_EVERGREEN_ARM64_CONFIGURATION_PUBLIC_H_ #define STARBOARD_EVERGREEN_ARM64_CONFIGURATION_PUBLIC_H_ -// --- Architecture Configuration -------------------------------------------- - // --- System Header Configuration ------------------------------------------- // Any system headers listed here that are not provided by the platform will be @@ -70,19 +68,6 @@ // the current linking unit. #define SB_IMPORT_PLATFORM -// --- I/O Configuration ----------------------------------------------------- - -// Whether the current platform has microphone supported. -#define SB_HAS_MICROPHONE 1 - -// Whether the current platform implements the on screen keyboard interface. -#define SB_HAS_ON_SCREEN_KEYBOARD 0 - -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 0 - -// --- Decoder-only Params --- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is @@ -97,22 +82,4 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Audits ---------------------------------------------- - -#if !defined(__GNUC__) -#error "Evergreen-arm64 builds need a GCC-like compiler (for the moment)." -#endif - -// --- Platform Specific Quirks ---------------------------------------------- - -// Indicates that there is no support for alignment at greater than 16 bytes for -// items on the stack. -#define SB_HAS_QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES 1 - #endif // STARBOARD_EVERGREEN_ARM64_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/evergreen/shared/lz4_compress_install_target.gni b/starboard/evergreen/shared/lz4_compress_install_target.gni index b9c0b27c7464..cce162edc1da 100644 --- a/starboard/evergreen/shared/lz4_compress_install_target.gni +++ b/starboard/evergreen/shared/lz4_compress_install_target.gni @@ -35,7 +35,7 @@ template("lz4_compress_install_target") { "install_target_name", ]) - tool = "//tools/lz4_compress" + tool = "//cobalt/tools/lz4_compress" outputs = [ "$sb_install_output_dir/$install_subdir/$dest_name" ] diff --git a/starboard/evergreen/x64/configuration_public.h b/starboard/evergreen/x64/configuration_public.h index dbea1449d67e..ffd5efde0a7d 100644 --- a/starboard/evergreen/x64/configuration_public.h +++ b/starboard/evergreen/x64/configuration_public.h @@ -21,8 +21,6 @@ #ifndef STARBOARD_EVERGREEN_X64_CONFIGURATION_PUBLIC_H_ #define STARBOARD_EVERGREEN_X64_CONFIGURATION_PUBLIC_H_ -// --- Architecture Configuration -------------------------------------------- - // --- System Header Configuration ------------------------------------------- // Any system headers listed here that are not provided by the platform will be @@ -70,21 +68,12 @@ // the current linking unit. #define SB_IMPORT_PLATFORM -// --- I/O Configuration ----------------------------------------------------- - -// Whether the current platform implements the on screen keyboard interface. -#define SB_HAS_ON_SCREEN_KEYBOARD 0 - -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 0 - -// --- Decoder-only Params --- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is // required for platforms that want to JIT. #define SB_CAN_MAP_EXECUTABLE_MEMORY 1 + // --- Network Configuration ------------------------------------------------- // Specifies whether this platform supports IPV6. @@ -93,16 +82,4 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Audits ---------------------------------------------- - -#if !defined(__GNUC__) -#error "Evergreen-x64 builds need a GCC-like compiler (for the moment)." -#endif - #endif // STARBOARD_EVERGREEN_X64_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/evergreen/x86/configuration_public.h b/starboard/evergreen/x86/configuration_public.h index fc760a75a32e..5f22ed70806a 100644 --- a/starboard/evergreen/x86/configuration_public.h +++ b/starboard/evergreen/x86/configuration_public.h @@ -21,8 +21,6 @@ #ifndef STARBOARD_EVERGREEN_X86_CONFIGURATION_PUBLIC_H_ #define STARBOARD_EVERGREEN_X86_CONFIGURATION_PUBLIC_H_ -// --- Architecture Configuration -------------------------------------------- - // --- System Header Configuration ------------------------------------------- // Any system headers listed here that are not provided by the platform will be @@ -70,8 +68,6 @@ // the current linking unit. #define SB_IMPORT_PLATFORM -// --- Decoder-only Params --- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is @@ -83,16 +79,4 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Audits ---------------------------------------------- - -#if !defined(__GNUC__) -#error "evergreen-x86 builds need a GCC-like compiler (for the moment)." -#endif - #endif // STARBOARD_EVERGREEN_X86_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/linux/shared/configuration_public.h b/starboard/linux/shared/configuration_public.h index e9ede37eb433..35c31b10bdc3 100644 --- a/starboard/linux/shared/configuration_public.h +++ b/starboard/linux/shared/configuration_public.h @@ -72,11 +72,6 @@ // --- I/O Configuration ----------------------------------------------------- -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 0 - -// --- Decoder-only Params --- - // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is // required for platforms that want to JIT. #define SB_CAN_MAP_EXECUTABLE_MEMORY 1 @@ -89,12 +84,6 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Platform Specific Audits ---------------------------------------------- - -#if !defined(__GNUC__) -#error "Linux builds need a GCC-like compiler (for the moment)." -#endif - // --- Media Configuration --------------------------------------------------- // The path of video_dmp_writer.h. Defined here to avoid errors building on diff --git a/starboard/linux/x64x11/configuration_public.h b/starboard/linux/x64x11/configuration_public.h index b7a301c0fc8b..86fff33eb785 100644 --- a/starboard/linux/x64x11/configuration_public.h +++ b/starboard/linux/x64x11/configuration_public.h @@ -34,11 +34,4 @@ // Include the Linux configuration that's common between all Desktop Linuxes. #include "starboard/linux/shared/configuration_public.h" -// Whether the current platform implements the on screen keyboard interface. -#define SB_HAS_ON_SCREEN_KEYBOARD 0 - -// Whether the current platform has speech synthesis. -#undef SB_HAS_SPEECH_SYNTHESIS -#define SB_HAS_SPEECH_SYNTHESIS 0 - #endif // STARBOARD_LINUX_X64X11_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/linux/x64x11/sanitizer_options.cc b/starboard/linux/x64x11/sanitizer_options.cc index f565defd7832..a9c5d69c9035 100644 --- a/starboard/linux/x64x11/sanitizer_options.cc +++ b/starboard/linux/x64x11/sanitizer_options.cc @@ -41,7 +41,7 @@ SANITIZER_HOOK_ATTRIBUTE const char* __lsan_default_suppressions() { #if defined(ASAN_SYMBOLIZER_PATH) extern "C" const char* __asan_default_options() { // TODO(b/278247547) : Remove detect_stack_use_after_return=0 once the issue - // with AddressSanitizerFlags in Clang 16 is resolved. + // with AddressSanitizerFlags in Clang is resolved. return "detect_stack_use_after_return=0:external_symbolizer_" "path=" ASAN_SYMBOLIZER_PATH; } diff --git a/starboard/nplb/BUILD.gn b/starboard/nplb/BUILD.gn index a01b3d47c31c..2827b8636049 100644 --- a/starboard/nplb/BUILD.gn +++ b/starboard/nplb/BUILD.gn @@ -152,6 +152,7 @@ target(gtest_target_type, "nplb") { "posix_compliance/posix_mutex_acquire_try_test.cc", "posix_compliance/posix_mutex_create_test.cc", "posix_compliance/posix_mutex_destroy_test.cc", + "posix_compliance/posix_once_test.cc", "posix_compliance/posix_socket_accept_test.cc", "posix_compliance/posix_socket_bind_test.cc", "posix_compliance/posix_socket_connect_test.cc", diff --git a/starboard/nplb/align_test.cc b/starboard/nplb/align_test.cc index 1a684a3a85ac..35bfa1c8e80f 100644 --- a/starboard/nplb/align_test.cc +++ b/starboard/nplb/align_test.cc @@ -100,7 +100,6 @@ TEST(SbAlignTest, AlignAsStackVariable) { EXPECT_LE(8, GetAlignment(&by_8)); EXPECT_LE(16, GetAlignment(&by_16)); -#if !SB_HAS_QUIRK(DOES_NOT_STACK_ALIGN_OVER_16_BYTES) SB_ALIGNAS(32) char by_32; char unaligned6 = 6; EXPECT_NE(unaligned6, unaligned1); @@ -118,7 +117,6 @@ TEST(SbAlignTest, AlignAsStackVariable) { EXPECT_LE(64, GetAlignment(&by_64)); EXPECT_LE(128, GetAlignment(&by_128)); EXPECT_LE(256, GetAlignment(&by_256)); -#endif // !SB_HAS_QUIRK(DOES_NOT_STACK_ALIGN_OVER_16_BYTES) } TEST(SbAlignTest, AlignOf) { diff --git a/starboard/nplb/file_get_info_test.cc b/starboard/nplb/file_get_info_test.cc index 11847c9022ed..6f531b39c8ba 100644 --- a/starboard/nplb/file_get_info_test.cc +++ b/starboard/nplb/file_get_info_test.cc @@ -42,15 +42,6 @@ TEST(SbFileGetInfoTest, WorksOnARegularFile) { const int64_t kOneMinuteInMicroseconds = 60'000'000; int64_t time = PosixTimeToWindowsTime(CurrentPosixTime()) - kOneMinuteInMicroseconds; -#if !SB_HAS_QUIRK(FILESYSTEM_ZERO_FILEINFO_TIME) -#if SB_HAS_QUIRK(FILESYSTEM_COARSE_ACCESS_TIME) - // On platforms with coarse access time, we assume 1 day precision and go - // back 2 days to avoid rounding issues. - const int64_t kOneDayInMicroseconds = 1'000'000LL * 60LL * 60LL * 24LL; - int64_t coarse_time = PosixTimeToWindowsTime(CurrentPosixTime()) - - (2 * kOneDayInMicroseconds); -#endif // FILESYSTEM_COARSE_ACCESS_TIME -#endif // FILESYSTEM_ZERO_FILEINFO_TIME const int kFileSize = 12; starboard::nplb::ScopedRandomFile random_file(kFileSize); @@ -66,19 +57,9 @@ TEST(SbFileGetInfoTest, WorksOnARegularFile) { EXPECT_EQ(kFileSize, info.size); EXPECT_FALSE(info.is_directory); EXPECT_FALSE(info.is_symbolic_link); -#if SB_HAS_QUIRK(FILESYSTEM_ZERO_FILEINFO_TIME) - EXPECT_LE(0, info.last_accessed); - EXPECT_LE(0, info.last_accessed); - EXPECT_LE(0, info.creation_time); -#else EXPECT_LE(time, info.last_modified); -#if SB_HAS_QUIRK(FILESYSTEM_COARSE_ACCESS_TIME) - EXPECT_LE(coarse_time, info.last_accessed); -#else EXPECT_LE(time, info.last_accessed); -#endif // FILESYSTEM_COARSE_ACCESS_TIME EXPECT_LE(time, info.creation_time); -#endif // FILESYSTEM_ZERO_FILEINFO_TIME } bool result = SbFileClose(file); diff --git a/starboard/nplb/file_get_path_info_test.cc b/starboard/nplb/file_get_path_info_test.cc index 687b6a1892f0..0f630b07ac7c 100644 --- a/starboard/nplb/file_get_path_info_test.cc +++ b/starboard/nplb/file_get_path_info_test.cc @@ -55,15 +55,6 @@ TEST(SbFileGetPathInfoTest, WorksOnARegularFile) { const int64_t kOneMinuteInMicroseconds = 60'000'000; int64_t time = PosixTimeToWindowsTime(CurrentPosixTime()) - kOneMinuteInMicroseconds; -#if !SB_HAS_QUIRK(FILESYSTEM_ZERO_FILEINFO_TIME) -#if SB_HAS_QUIRK(FILESYSTEM_COARSE_ACCESS_TIME) - // On platforms with coarse access time, we assume 1 day precision and go - // back 2 days to avoid rounding issues. - const int64_t kOneDayInMicroseconds = 1'000'000LL * 60LL * 60LL * 24LL; - int64_t coarse_time = PosixTimeToWindowsTime(CurrentPosixTime()) - - (2 * kOneDayInMicroseconds); -#endif // FILESYSTEM_COARSE_ACCESS_TIME -#endif // FILESYSTEM_ZERO_FILEINFO_TIME const int kFileSize = 12; ScopedRandomFile random_file(kFileSize); @@ -75,19 +66,9 @@ TEST(SbFileGetPathInfoTest, WorksOnARegularFile) { EXPECT_EQ(kFileSize, info.size); EXPECT_FALSE(info.is_directory); EXPECT_FALSE(info.is_symbolic_link); -#if SB_HAS_QUIRK(FILESYSTEM_ZERO_FILEINFO_TIME) - EXPECT_LE(0, info.last_accessed); - EXPECT_LE(0, info.last_accessed); - EXPECT_LE(0, info.creation_time); -#else EXPECT_LE(time, info.last_modified); -#if SB_HAS_QUIRK(FILESYSTEM_COARSE_ACCESS_TIME) - EXPECT_LE(coarse_time, info.last_accessed); -#else EXPECT_LE(time, info.last_accessed); -#endif // FILESYSTEM_COARSE_ACCESS_TIME EXPECT_LE(time, info.creation_time); -#endif // FILESYSTEM_ZERO_FILEINFO_TIME } } } diff --git a/starboard/nplb/posix_compliance/posix_once_test.cc b/starboard/nplb/posix_compliance/posix_once_test.cc new file mode 100644 index 000000000000..d2f75a5f509d --- /dev/null +++ b/starboard/nplb/posix_compliance/posix_once_test.cc @@ -0,0 +1,155 @@ +// Copyright 2024 The Cobalt Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "starboard/configuration_constants.h" +#include "starboard/nplb/posix_compliance/posix_thread_helpers.h" +#include "starboard/thread.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace starboard { +namespace nplb { +namespace { + +int s_global_value; + +void IncrementGlobalValue() { + ++s_global_value; +} + +TEST(PosixOnceTest, SunnyDaySingleInit) { + pthread_once_t once_control = PTHREAD_ONCE_INIT; + + s_global_value = 0; + EXPECT_EQ(pthread_once(&once_control, &IncrementGlobalValue), 0); + + EXPECT_EQ(s_global_value, 1); +} + +TEST(PosixOnceTest, SunnyDayMultipleInit) { + pthread_once_t once_control = PTHREAD_ONCE_INIT; + + s_global_value = 0; + EXPECT_EQ(pthread_once(&once_control, &IncrementGlobalValue), 0); + EXPECT_EQ(s_global_value, 1); + + s_global_value = 0; + EXPECT_EQ(pthread_once(&once_control, &IncrementGlobalValue), 0); + EXPECT_EQ(s_global_value, 0); + + s_global_value = 0; + EXPECT_EQ(pthread_once(&once_control, &IncrementGlobalValue), 0); + EXPECT_EQ(s_global_value, 0); +} + +struct RunPosixOnceContext { + RunPosixOnceContext() : once_control(PTHREAD_ONCE_INIT) { + pthread_mutex_init(&mutex, NULL); + pthread_cond_init(&condition, NULL); + } + ~RunPosixOnceContext() { + pthread_cond_destroy(&condition); + pthread_mutex_destroy(&mutex); + } + + posix::TestSemaphore semaphore; + pthread_mutex_t mutex; + pthread_cond_t condition; + + pthread_once_t once_control; +}; + +void* RunPosixOnceEntryPoint(void* context) { + RunPosixOnceContext* run_sbonce_context = + reinterpret_cast(context); + + { + pthread_mutex_lock(&run_sbonce_context->mutex); + run_sbonce_context->semaphore.Put(); + pthread_cond_wait(&run_sbonce_context->condition, + &run_sbonce_context->mutex); + pthread_mutex_unlock(&run_sbonce_context->mutex); + } + + SbThreadYield(); + static const int kIterationCount = 3; + for (int i = 0; i < kIterationCount; ++i) { + pthread_once(&run_sbonce_context->once_control, &IncrementGlobalValue); + } + + return NULL; +} + +// Here we spawn many threads each of which will call pthread_once multiple +// times using a shared pthread_once_t object. We then test that the +// initialization routine got called exactly one time. +TEST(PosixOnceTest, SunnyDayMultipleThreadsInit) { + const int kMany = kSbMaxThreads; + std::vector threads(kMany); + + const int kIterationCount = 10; + for (int i = 0; i < kIterationCount; ++i) { + pthread_once_t once_control = PTHREAD_ONCE_INIT; + RunPosixOnceContext context; + + s_global_value = 0; + for (int j = 0; j < kMany; ++j) { + threads[j] = + SbThreadCreate(0, kSbThreadNoPriority, kSbThreadNoAffinity, true, + posix::kThreadName, RunPosixOnceEntryPoint, &context); + } + + // Wait for all threads to finish initializing and become ready, then + // broadcast the signal to begin. We do this to increase the chances that + // threads will call pthread_once() at the same time as each other. + for (int j = 0; j < kMany; ++j) { + context.semaphore.Take(); + } + { + pthread_mutex_lock(&context.mutex); + pthread_cond_broadcast(&context.condition); + pthread_mutex_unlock(&context.mutex); + } + + // Signal threads to beginWait for all threads to complete. + for (int i = 0; i < kMany; ++i) { + void* result; + SbThreadJoin(threads[i], &result); + } + + EXPECT_EQ(s_global_value, 1); + } +} + +int* GetIntSingleton() { + static pthread_once_t s_once_flag = PTHREAD_ONCE_INIT; + static int* s_singleton = NULL; + struct Local { + static void Init() { s_singleton = new int(); } + }; + pthread_once(&s_once_flag, Local::Init); + return s_singleton; +} + +TEST(PosixOnceTest, InitializeOnceMacroFunction) { + int* int_singelton = GetIntSingleton(); + ASSERT_TRUE(int_singelton); + EXPECT_EQ(*int_singelton, 0) + << "Singleton Macro does not default initialize."; +} + +} // namespace. +} // namespace nplb. +} // namespace starboard. diff --git a/starboard/raspi/shared/configuration_public.h b/starboard/raspi/shared/configuration_public.h index 5aff38c2adb3..c25e6c8fee27 100644 --- a/starboard/raspi/shared/configuration_public.h +++ b/starboard/raspi/shared/configuration_public.h @@ -17,8 +17,6 @@ #ifndef STARBOARD_RASPI_SHARED_CONFIGURATION_PUBLIC_H_ #define STARBOARD_RASPI_SHARED_CONFIGURATION_PUBLIC_H_ -// --- Architecture Configuration -------------------------------------------- - // --- System Header Configuration ------------------------------------------- // Any system headers listed here that are not provided by the platform will be @@ -66,16 +64,6 @@ // the current linking unit. #define SB_IMPORT_PLATFORM -// --- I/O Configuration ----------------------------------------------------- - -// Whether the current platform implements the on screen keyboard interface. -#define SB_HAS_ON_SCREEN_KEYBOARD 0 - -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 0 - -// --- Decoder-only Params --- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is @@ -90,25 +78,4 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Audits ---------------------------------------------- - -#if !defined(__GNUC__) -#error "RasPi builds need a GCC-like compiler (for the moment)." -#endif - -// --- Platform Specific Quirks ---------------------------------------------- - -// The Raspberry Pi does not apparently align fields in a heap-allocated struct -// by over 16 bytes. -#define SB_HAS_QUIRK_DOES_NOT_ALIGN_FIELDS_IN_HEAP_OVER_16_BYTES 1 - -// The Raspberry Pi does not apparently align stack variables by over 16 bytes. -#define SB_HAS_QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES 1 - #endif // STARBOARD_RASPI_SHARED_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/shared/ffmpeg/BUILD.gn b/starboard/shared/ffmpeg/BUILD.gn index f4fe526838c4..6050196ac294 100644 --- a/starboard/shared/ffmpeg/BUILD.gn +++ b/starboard/shared/ffmpeg/BUILD.gn @@ -117,5 +117,5 @@ target(gtest_target_type, "ffmpeg_demuxer_test") { "//testing/gmock", "//testing/gtest", ] - data_deps = [ "//third_party/chromium/media/test/data:media_testdata" ] + data_deps = [ "//media/test/data:media_testdata" ] } diff --git a/starboard/shared/linux/socket_get_interface_address.cc b/starboard/shared/linux/socket_get_interface_address.cc index ec4d7e95023f..e0268ff241f1 100644 --- a/starboard/shared/linux/socket_get_interface_address.cc +++ b/starboard/shared/linux/socket_get_interface_address.cc @@ -19,11 +19,11 @@ #include #include -#if SB_HAS_QUIRK(SOCKET_BSD_HEADERS) +#if !defined(_GNU_SOURCE) #include #include #include -#else +#else // _GNU_SOURCE is set for Linux #include #include #include diff --git a/starboard/shared/modular/cobalt_layer_posix_pthread_abi_wrappers.cc b/starboard/shared/modular/cobalt_layer_posix_pthread_abi_wrappers.cc index eec84fa7e0d2..db53210dd615 100644 --- a/starboard/shared/modular/cobalt_layer_posix_pthread_abi_wrappers.cc +++ b/starboard/shared/modular/cobalt_layer_posix_pthread_abi_wrappers.cc @@ -117,6 +117,13 @@ int __abi_wrap_pthread_condattr_setclock(pthread_condattr_t* attr, int pthread_condattr_setclock(pthread_condattr_t* attr, clockid_t clock_id) { return __abi_wrap_pthread_condattr_setclock(attr, clock_id); } + +int __abi_wrap_pthread_once(pthread_once_t* once_control, + void (*init_routine)(void)); + +int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)) { + return __abi_wrap_pthread_once(once_control, init_routine); +} } #endif // SB_API_VERSION >= 16 diff --git a/starboard/shared/modular/starboard_layer_posix_pthread_abi_wrappers.cc b/starboard/shared/modular/starboard_layer_posix_pthread_abi_wrappers.cc index e41e02ec8abc..f2e01376e497 100644 --- a/starboard/shared/modular/starboard_layer_posix_pthread_abi_wrappers.cc +++ b/starboard/shared/modular/starboard_layer_posix_pthread_abi_wrappers.cc @@ -42,6 +42,11 @@ typedef struct PosixCondAttrPrivate { pthread_condattr_t cond_attr; } PosixCondAttrPrivate; +typedef struct PosixOncePrivate { + InitializedState initialized_state; + pthread_once_t once; +} PosixOncePrivate; + #define INTERNAL_MUTEX(mutex_var) \ reinterpret_cast((mutex_var)->mutex_buffer) #define PTHREAD_INTERNAL_MUTEX(mutex_var) \ @@ -61,6 +66,8 @@ typedef struct PosixCondAttrPrivate { &(reinterpret_cast( \ (condition_attr)->cond_attr_buffer) \ ->cond_attr) +#define INTERNAL_ONCE(once_control) \ + reinterpret_cast((once_control)->once_buffer) int __abi_wrap_pthread_mutex_destroy(musl_pthread_mutex_t* mutex) { if (!mutex) { @@ -272,3 +279,16 @@ int __abi_wrap_pthread_condattr_setclock(musl_pthread_condattr_t* attr, return EINVAL; #endif } + +int __abi_wrap_pthread_once(musl_pthread_once_t* once_control, + void (*init_routine)(void)) { + if (!once_control || !init_routine) { + return EINVAL; + } + + if (!EnsureInitialized(&(INTERNAL_ONCE(once_control)->initialized_state))) { + init_routine(); + SetInitialized(&(INTERNAL_ONCE(once_control)->initialized_state)); + } + return 0; +} diff --git a/starboard/shared/modular/starboard_layer_posix_pthread_abi_wrappers.h b/starboard/shared/modular/starboard_layer_posix_pthread_abi_wrappers.h index badb75dad48f..0d1b8d544336 100644 --- a/starboard/shared/modular/starboard_layer_posix_pthread_abi_wrappers.h +++ b/starboard/shared/modular/starboard_layer_posix_pthread_abi_wrappers.h @@ -47,10 +47,16 @@ typedef union musl_pthread_cond_t { #define MUSL_PTHREAD_COND_ATTR_MAX_SIZE 40 typedef union musl_pthread_condattr_t { - uint8_t cond_attr_buffer[MUSL_PTHREAD_COND_MAX_SIZE]; + uint8_t cond_attr_buffer[MUSL_PTHREAD_COND_ATTR_MAX_SIZE]; void* ptr; } musl_pthread_condattr_t; +#define MUSL_PTHREAD_ONCE_MAX_SIZE 64 +typedef union musl_pthread_once_t { + uint8_t once_buffer[MUSL_PTHREAD_ONCE_MAX_SIZE]; + void* ptr; +} musl_pthread_once_t; + SB_EXPORT int __abi_wrap_pthread_mutex_destroy(musl_pthread_mutex_t* mutex); SB_EXPORT int __abi_wrap_pthread_mutex_init( musl_pthread_mutex_t* mutex, @@ -79,6 +85,8 @@ SB_EXPORT int __abi_wrap_pthread_condattr_setclock( musl_pthread_condattr_t* attr, clockid_t clock_id); +SB_EXPORT int __abi_wrap_pthread_once(musl_pthread_once_t* once_control, + void (*init_routine)(void)); #ifdef __cplusplus } // extern "C" #endif diff --git a/starboard/shared/pthread/thread_create.cc b/starboard/shared/pthread/thread_create.cc index baec37e6808e..e913d8d96df7 100644 --- a/starboard/shared/pthread/thread_create.cc +++ b/starboard/shared/pthread/thread_create.cc @@ -54,7 +54,7 @@ void* ThreadFunc(void* context) { delete thread_params; -#if !SB_HAS_QUIRK(THREAD_AFFINITY_UNSUPPORTED) +#if defined(_GNU_SOURCE) // sched_setaffinity is a GNU extension if (SbThreadIsValidAffinity(affinity)) { cpu_set_t cpu_set; CPU_ZERO(&cpu_set); diff --git a/starboard/shared/starboard/file_storage/storage_internal.h b/starboard/shared/starboard/file_storage/storage_internal.h index d17efca22910..7880f8d1cd4f 100644 --- a/starboard/shared/starboard/file_storage/storage_internal.h +++ b/starboard/shared/starboard/file_storage/storage_internal.h @@ -17,21 +17,14 @@ #ifndef STARBOARD_SHARED_STARBOARD_FILE_STORAGE_STORAGE_INTERNAL_H_ #define STARBOARD_SHARED_STARBOARD_FILE_STORAGE_STORAGE_INTERNAL_H_ +#include + #include "starboard/common/storage.h" #include "starboard/common/string.h" #include "starboard/file.h" #include "starboard/shared/internal_only.h" #include "starboard/shared/starboard/get_home_directory.h" -#if SB_HAS_QUIRK(HASH_FILE_NAME) -#include -#include -#include -#include "starboard/common/murmurhash2.h" -#include "starboard/common/scoped_ptr.h" -#include "starboard/memory.h" -#endif - struct SbStorageRecordPrivate { void* unused_user; // deprecated in SB 16 SbFile file; @@ -54,18 +47,7 @@ static SB_C_INLINE bool GetStorageFilePath(const char* name, ::starboard::strlcat(out_path, "/.starboard", path_size); if (n > 0) { ::starboard::strlcat(out_path, ".", path_size); -#if SB_HAS_QUIRK(HASH_FILE_NAME) - size_t n = strlen(name); - // Two 32 bit hashes will create a 64 bit hash with extremely low - // probability of collisions. The seed term was chosen arbitrary. - uint32_t hash1 = MurmurHash2_32(name, n, 0x8df88a67); - uint32_t hash2 = MurmurHash2_32(name, n, 0x5bdac960); - std::stringstream name_stringstream; - name_stringstream << std::hex << hash1 << hash2; - ::starboard::strlcat(out_path, name_stringstream.str().c_str(), path_size); -#else ::starboard::strlcat(out_path, name, path_size); -#endif } ::starboard::strlcat(out_path, ".storage", path_size); return true; diff --git a/starboard/shared/stub/window_blur_on_screen_keyboard.cc b/starboard/shared/stub/window_blur_on_screen_keyboard.cc index d6ec34c755ac..389485ea8dd1 100644 --- a/starboard/shared/stub/window_blur_on_screen_keyboard.cc +++ b/starboard/shared/stub/window_blur_on_screen_keyboard.cc @@ -14,4 +14,8 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + void SbWindowBlurOnScreenKeyboard(SbWindow window, int ticket) {} + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/stub/window_focus_on_screen_keyboard.cc b/starboard/shared/stub/window_focus_on_screen_keyboard.cc index 95768e5810df..90d8e30e5a57 100644 --- a/starboard/shared/stub/window_focus_on_screen_keyboard.cc +++ b/starboard/shared/stub/window_focus_on_screen_keyboard.cc @@ -14,4 +14,8 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + void SbWindowFocusOnScreenKeyboard(SbWindow window, int ticket) {} + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc b/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc index f79cdc17a4ad..4f34c6b4eaef 100644 --- a/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc +++ b/starboard/shared/stub/window_get_on_screen_keyboard_bounding_rect.cc @@ -14,7 +14,11 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + bool SbWindowGetOnScreenKeyboardBoundingRect(SbWindow window, SbWindowRect* bounding_rect) { return false; } + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/stub/window_hide_on_screen_keyboard.cc b/starboard/shared/stub/window_hide_on_screen_keyboard.cc index 403fc7876bff..22d982c454ac 100644 --- a/starboard/shared/stub/window_hide_on_screen_keyboard.cc +++ b/starboard/shared/stub/window_hide_on_screen_keyboard.cc @@ -14,4 +14,8 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + void SbWindowHideOnScreenKeyboard(SbWindow window, int ticket) {} + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc b/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc index c9900aea9926..1578d07fff2d 100644 --- a/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc +++ b/starboard/shared/stub/window_is_on_screen_keyboard_shown.cc @@ -14,6 +14,10 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + bool SbWindowIsOnScreenKeyboardShown(SbWindow window) { return false; } + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc b/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc index 5388180cfd88..007245bd06ab 100644 --- a/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc +++ b/starboard/shared/stub/window_on_screen_keyboard_is_supported.cc @@ -14,6 +14,10 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + bool SbWindowOnScreenKeyboardIsSupported() { return false; } + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc b/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc index e18a7c8126f7..6b4fefd5d4a0 100644 --- a/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc +++ b/starboard/shared/stub/window_on_screen_keyboard_suggestions_supported.cc @@ -14,6 +14,10 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window) { return false; } + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc b/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc index 78be96e94670..3a61e02db64c 100644 --- a/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc +++ b/starboard/shared/stub/window_set_on_screen_keyboard_keep_focus.cc @@ -14,4 +14,8 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + void SbWindowSetOnScreenKeyboardKeepFocus(SbWindow window, bool keep_focus) {} + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/stub/window_show_on_screen_keyboard.cc b/starboard/shared/stub/window_show_on_screen_keyboard.cc index 579972fb1619..7ffca5fa6e91 100644 --- a/starboard/shared/stub/window_show_on_screen_keyboard.cc +++ b/starboard/shared/stub/window_show_on_screen_keyboard.cc @@ -14,6 +14,10 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + void SbWindowShowOnScreenKeyboard(SbWindow window, const char* input_text, int ticket) {} + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc b/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc index 96f3ea2d0342..3ad65ba87da7 100644 --- a/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc +++ b/starboard/shared/stub/window_update_on_screen_keyboard_suggestions.cc @@ -14,7 +14,11 @@ #include "starboard/window.h" +#if SB_API_VERSION < 16 + void SbWindowUpdateOnScreenKeyboardSuggestions(SbWindow window, const char* suggestions[], int num_suggestions, int ticket) {} + +#endif // SB_API_VERSION < 16 diff --git a/starboard/shared/win32/posix_emu/include/pthread.h b/starboard/shared/win32/posix_emu/include/pthread.h index 0aff62920ed7..73dbb17aec0a 100644 --- a/starboard/shared/win32/posix_emu/include/pthread.h +++ b/starboard/shared/win32/posix_emu/include/pthread.h @@ -22,6 +22,7 @@ #define PTHREAD_MUTEX_INITIALIZER SRWLOCK_INIT #define PTHREAD_COND_INITIALIZER CONDITION_VARIABLE_INIT +#define PTHREAD_ONCE_INIT INIT_ONCE_STATIC_INIT #ifdef __cplusplus extern "C" { @@ -32,6 +33,7 @@ typedef unsigned int pthread_mutexattr_t; typedef DWORD pthread_key_t; typedef CONDITION_VARIABLE pthread_cond_t; typedef unsigned int pthread_condattr_t; +typedef INIT_ONCE pthread_once_t; int pthread_mutex_destroy(pthread_mutex_t* mutex); int pthread_mutex_init(pthread_mutex_t* mutex, @@ -59,6 +61,8 @@ int pthread_condattr_getclock(const pthread_condattr_t* attr, int pthread_condattr_init(pthread_condattr_t* attr); int pthread_condattr_setclock(pthread_condattr_t* attr, clockid_t clock_id); +int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)); + #ifdef __cplusplus } #endif diff --git a/starboard/shared/win32/posix_emu/pthread.cc b/starboard/shared/win32/posix_emu/pthread.cc index 2f4fbaf115dd..d5babcefde45 100644 --- a/starboard/shared/win32/posix_emu/pthread.cc +++ b/starboard/shared/win32/posix_emu/pthread.cc @@ -140,4 +140,20 @@ int pthread_condattr_setclock(pthread_condattr_t* attr, clockid_t clock_id) { return -1; } +static BOOL CALLBACK OnceTrampoline(PINIT_ONCE once_control, + void* parameter, + void** context) { + static_cast(parameter)(); + return true; +} + +int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)) { + if (!once_control || !init_routine) { + return -1; + } + return InitOnceExecuteOnce(once_control, OnceTrampoline, init_routine, NULL) + ? 0 + : -1; +} + } // extern "C" diff --git a/starboard/stub/configuration_public.h b/starboard/stub/configuration_public.h index 1e9d1ef33fab..8c6204941691 100644 --- a/starboard/stub/configuration_public.h +++ b/starboard/stub/configuration_public.h @@ -22,17 +22,6 @@ #ifndef STARBOARD_STUB_CONFIGURATION_PUBLIC_H_ #define STARBOARD_STUB_CONFIGURATION_PUBLIC_H_ -// --- Architecture Configuration -------------------------------------------- - -// Some platforms will not align variables on the stack with an alignment -// greater than 16 bytes. Platforms where this is the case should define the -// following quirk. -#undef SB_HAS_QUIRK_DOES_NOT_STACK_ALIGN_OVER_16_BYTES - -// Some platforms do not have thread affinity support. Platforms where this is -// the case should define the following quirk. -#undef SB_HAS_QUIRK_THREAD_AFFINITY_UNSUPPORTED - // --- System Header Configuration ------------------------------------------- // Any system headers listed here that are not provided by the platform will be @@ -59,11 +48,6 @@ #define SB_IS_WCHAR_T_UNSIGNED 1 #endif -// This quirk is used to switch the headers included in -// starboard/shared/linux/socket_get_interface_address.cc for darwin system -// headers. It may be removed at some point in favor of a different solution. -#undef SB_HAS_QUIRK_SOCKET_BSD_HEADERS - // --- Compiler Configuration ------------------------------------------------ // The platform's annotation for forcing a C function to be inlined. @@ -85,43 +69,12 @@ // the current linking unit. #define SB_IMPORT_PLATFORM -// --- Filesystem Configuration ---------------------------------------------- - -// Some operating systems constantly return zero values for creation, access -// and modification time for files and directories. When this quirk is defined, -// we need to ignore corresponded time values in applications as well as take -// this fact into account in unit tests. -#undef SB_HAS_QUIRK_FILESYSTEM_ZERO_FILEINFO_TIME - -// On some platforms the file system stores access times at a coarser -// granularity than other times. When this quirk is defined, we assume the -// access time is of 1 day precision. -#undef SB_HAS_QUIRK_FILESYSTEM_COARSE_ACCESS_TIME - -// On some platforms the file system cannot access extremely long file names. -// We do not need this feature on stub. -#undef SB_HAS_QUIRK_HASH_FILE_NAME - -// --- Graphics Configuration ------------------------------------------------ - -#define SB_HAS_VIRTUAL_REALITY 1 - -// --- I/O Configuration ----------------------------------------------------- - -// Whether the current platform implements the on screen keyboard interface. -#define SB_HAS_ON_SCREEN_KEYBOARD 0 - -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 1 - // --- Media Configuration --------------------------------------------------- // The implementation is allowed to support kSbMediaAudioSampleTypeInt16 only // when this macro is defined. #undef SB_HAS_QUIRK_SUPPORT_INT16_AUDIO_SAMPLES -// --- Decoder-only Params --- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is @@ -136,16 +89,4 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Audits ---------------------------------------------- - -#if !defined(__GNUC__) -#error "Stub builds need a GCC-like compiler (for the moment)." -#endif - #endif // STARBOARD_STUB_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/tools/api_leak_detector/stub/gold/docker_debian10_manifest b/starboard/tools/api_leak_detector/stub/gold/docker_debian10_manifest index 55278b49d812..106ae25120c7 100644 --- a/starboard/tools/api_leak_detector/stub/gold/docker_debian10_manifest +++ b/starboard/tools/api_leak_detector/stub/gold/docker_debian10_manifest @@ -20,7 +20,6 @@ _Unwind_Resume _Unwind_Resume_or_Rethrow _Unwind_SetGR _Unwind_SetIP -__ctype_b_loc __ctype_get_mb_cur_max __ctype_toupper_loc __cxa_atexit diff --git a/starboard/tools/api_leak_detector/stub/gold/gn_built_docker_debian11_manifest b/starboard/tools/api_leak_detector/stub/gold/gn_built_docker_debian11_manifest index 79e2925abb69..6705419ef829 100644 --- a/starboard/tools/api_leak_detector/stub/gold/gn_built_docker_debian11_manifest +++ b/starboard/tools/api_leak_detector/stub/gold/gn_built_docker_debian11_manifest @@ -20,7 +20,6 @@ _Unwind_Resume _Unwind_Resume_or_Rethrow _Unwind_SetGR _Unwind_SetIP -__ctype_b_loc __ctype_get_mb_cur_max __ctype_toupper_loc __cxa_atexit diff --git a/starboard/tools/api_leak_detector/stub/gold/manifest b/starboard/tools/api_leak_detector/stub/gold/manifest index 9141362f676b..eeb7b3bb0b4d 100644 --- a/starboard/tools/api_leak_detector/stub/gold/manifest +++ b/starboard/tools/api_leak_detector/stub/gold/manifest @@ -20,7 +20,6 @@ _Unwind_Resume _Unwind_Resume_or_Rethrow _Unwind_SetGR _Unwind_SetIP -__ctype_b_loc __ctype_get_mb_cur_max __ctype_toupper_loc __cxa_atexit diff --git a/starboard/tools/download_clang.sh b/starboard/tools/download_clang.sh index af1b3d734643..42cc39e65ee7 100755 --- a/starboard/tools/download_clang.sh +++ b/starboard/tools/download_clang.sh @@ -16,30 +16,17 @@ set -e -CLANG_VERSION="${1:-16-init-17653-g39da55e8-2}" -TOOLCHAIN_ROOT="${HOME}/starboard-toolchains/" -TOOLCHAIN_HOME="${TOOLCHAIN_ROOT}/x86_64-linux-gnu-clang-chromium-${CLANG_VERSION}" +readonly CLANG_VERSION="${1:-17-init-8029-g27f27d15-3}" +readonly CLANG_DIR="${HOME}/starboard-toolchains/x86_64-linux-gnu-clang-chromium-${CLANG_VERSION}" +readonly BASE_URL="https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64" -if [ -d "${TOOLCHAIN_HOME}" ]; then - echo "Clang is already downloaded, exiting." +if [[ -d "${CLANG_DIR}" ]]; then + echo "already have Clang ${CLANG_VERSION}; not downloading" exit 0 fi -BASE_URL="https://commondatastorage.googleapis.com/chromium-browser-clang" - -cd /tmp -mkdir -p ${TOOLCHAIN_HOME} - -# Download and extract clang. -curl --silent -O -J ${BASE_URL}/Linux_x64/clang-llvmorg-${CLANG_VERSION}.tgz -tar xf clang-llvmorg-${CLANG_VERSION}.tgz -C ${TOOLCHAIN_HOME} -rm clang-llvmorg-${CLANG_VERSION}.tgz - -# Download and extract llvm coverage tools. -curl --silent -O -J ${BASE_URL}/Linux_x64/llvm-code-coverage-llvmorg-${CLANG_VERSION}.tgz -tar xf llvm-code-coverage-llvmorg-${CLANG_VERSION}.tgz -C ${TOOLCHAIN_HOME} -rm llvm-code-coverage-llvmorg-${CLANG_VERSION}.tgz - -echo ${CLANG_VERSION} >> ${TOOLCHAIN_HOME}/cr_build_revision - -echo "Downloaded clang." +mkdir -p "${CLANG_DIR}" +curl -s "${BASE_URL}/clang-llvmorg-${CLANG_VERSION}.tgz" | tar xzC "${CLANG_DIR}" +curl -s "${BASE_URL}/llvm-code-coverage-llvmorg-${CLANG_VERSION}.tgz" | tar xzC "${CLANG_DIR}" +echo "${CLANG_VERSION}" > "${CLANG_DIR}/cr_build_revision" +echo "downloaded to ${CLANG_DIR}" diff --git a/starboard/win/shared/configuration_public.h b/starboard/win/shared/configuration_public.h index 6b986ecd5434..e55dde3687e5 100644 --- a/starboard/win/shared/configuration_public.h +++ b/starboard/win/shared/configuration_public.h @@ -18,8 +18,6 @@ #ifndef STARBOARD_WIN_SHARED_CONFIGURATION_PUBLIC_H_ #define STARBOARD_WIN_SHARED_CONFIGURATION_PUBLIC_H_ -// --- Architecture Configuration -------------------------------------------- - // --- System Header Configuration ------------------------------------------- // Any system headers listed here that are not provided by the platform will be @@ -73,20 +71,6 @@ // the current linking unit. #define SB_IMPORT_PLATFORM -// --- Graphics Configuration ------------------------------------------------ - -#define SB_HAS_VIRTUAL_REALITY 0 - -// --- I/O Configuration ----------------------------------------------------- - -// Whether the current platform supports on screen keyboard. -#define SB_HAS_ON_SCREEN_KEYBOARD 0 - -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 0 - -// --- Media Configuration --------------------------------------------------- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies SB_HAS_MMAP. This is @@ -101,19 +85,4 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Configuration --------------------------------------- - -// Whether or not the platform supports socket connection reset. -#define SB_HAS_SOCKET_ERROR_CONNECTION_RESET_SUPPORT 1 - -// --- Platform Specific Audits ---------------------------------------------- - -// --- Platform Specific Quirks ---------------------------------------------- - #endif // STARBOARD_WIN_SHARED_CONFIGURATION_PUBLIC_H_ diff --git a/starboard/window.h b/starboard/window.h index bbd7bc2114ce..4576cafa507e 100644 --- a/starboard/window.h +++ b/starboard/window.h @@ -139,10 +139,12 @@ SB_EXPORT void* SbWindowGetPlatformHandle(SbWindow window); // System-triggered OnScreenKeyboard events have ticket value // kSbEventOnScreenKeyboardInvalidTicket. +// TODO(b/151173891): This should be moved to the extension header #define kSbEventOnScreenKeyboardInvalidTicket (-1) // Defines a rectangle via a point |(x, y)| and a size |(width, height)|. This // structure is used as output for SbWindowGetOnScreenKeyboardBoundingRect. +// TODO(b/151173891): This should be moved to the extension header typedef struct SbWindowRect { float x; float y; @@ -150,6 +152,8 @@ typedef struct SbWindowRect { float height; } SbWindowRect; +#if SB_API_VERSION < 16 + // Return whether the current platform supports an on screen keyboard SB_EXPORT bool SbWindowOnScreenKeyboardIsSupported(); @@ -221,6 +225,8 @@ SB_EXPORT void SbWindowUpdateOnScreenKeyboardSuggestions( // be undefined. SB_EXPORT bool SbWindowOnScreenKeyboardSuggestionsSupported(SbWindow window); +#endif // SB_API_VERSION < 16 + #ifdef __cplusplus } // extern "C" #endif diff --git a/starboard/xb1/shared/configuration_public.h b/starboard/xb1/shared/configuration_public.h index 37ba6f123aac..bf84dfaffdce 100644 --- a/starboard/xb1/shared/configuration_public.h +++ b/starboard/xb1/shared/configuration_public.h @@ -72,22 +72,6 @@ // the current linking unit. #define SB_IMPORT_PLATFORM __declspec(dllimport) -// --- Graphics Configuration ------------------------------------------------ - -#define SB_HAS_VIRTUAL_REALITY 0 - -// --- I/O Configuration ----------------------------------------------------- - -// Whether the current platform has speech synthesis. -#define SB_HAS_SPEECH_SYNTHESIS 0 - -// --- Media Configuration --------------------------------------------------- - -// Whether the current platform uses a media player that relies on a URL. -#define SB_HAS_PLAYER_WITH_URL 0 - -// --- Decoder-only Params --- - // --- Memory Configuration -------------------------------------------------- // Whether this platform can map executable memory. Implies the platform can map @@ -102,19 +86,6 @@ // Specifies whether this platform supports pipe. #define SB_HAS_PIPE 1 -// --- Thread Configuration -------------------------------------------------- - -// --- Tuneable Parameters --------------------------------------------------- - -// --- User Configuration ---------------------------------------------------- - -// --- Platform Specific Configuration --------------------------------------- - -// Whether or not the platform supports socket connection reset. -#define SB_HAS_SOCKET_ERROR_CONNECTION_RESET_SUPPORT 1 - -// --- Platform Specific Audits ---------------------------------------------- - // --- Platform Specific Quirks ---------------------------------------------- // The implementation is allowed to support kSbMediaAudioSampleTypeInt16 only diff --git a/third_party/boringssl/BUILD.generated.gni b/third_party/boringssl/BUILD.generated.gni index 71fed77bf5ba..d5e075babcc6 100644 --- a/third_party/boringssl/BUILD.generated.gni +++ b/third_party/boringssl/BUILD.generated.gni @@ -1,6 +1,16 @@ -# Copyright 2016 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. +# 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. # This file is created by generate_build_files.py. Do not edit manually. @@ -16,13 +26,11 @@ crypto_sources = [ "src/crypto/asn1/a_mbstr.c", "src/crypto/asn1/a_object.c", "src/crypto/asn1/a_octet.c", - "src/crypto/asn1/a_print.c", "src/crypto/asn1/a_strex.c", "src/crypto/asn1/a_strnid.c", "src/crypto/asn1/a_time.c", "src/crypto/asn1/a_type.c", "src/crypto/asn1/a_utctm.c", - "src/crypto/asn1/a_utf8.c", "src/crypto/asn1/asn1_lib.c", "src/crypto/asn1/asn1_par.c", "src/crypto/asn1/asn_pack.c", @@ -76,14 +84,15 @@ crypto_sources = [ "src/crypto/conf/conf_def.h", "src/crypto/conf/internal.h", "src/crypto/cpu_aarch64_apple.c", + "src/crypto/cpu_aarch64_freebsd.c", "src/crypto/cpu_aarch64_fuchsia.c", "src/crypto/cpu_aarch64_linux.c", "src/crypto/cpu_aarch64_win.c", "src/crypto/cpu_arm.c", + "src/crypto/cpu_arm_freebsd.c", "src/crypto/cpu_arm_linux.c", "src/crypto/cpu_arm_linux.h", "src/crypto/cpu_intel.c", - "src/crypto/cpu_ppc64le.c", "src/crypto/crypto.c", "src/crypto/curve25519/curve25519.c", "src/crypto/curve25519/curve25519_tables.h", @@ -149,11 +158,13 @@ crypto_sources = [ "src/crypto/fipsmodule/service_indicator/internal.h", "src/crypto/fipsmodule/sha/internal.h", "src/crypto/fipsmodule/tls/internal.h", - "src/crypto/hkdf/hkdf.c", "src/crypto/hpke/hpke.c", "src/crypto/hrss/hrss.c", "src/crypto/hrss/internal.h", "src/crypto/internal.h", + "src/crypto/kyber/internal.h", + "src/crypto/kyber/keccak.c", + "src/crypto/kyber/kyber.c", "src/crypto/lhash/internal.h", "src/crypto/lhash/lhash.c", "src/crypto/mem.c", @@ -190,7 +201,9 @@ crypto_sources = [ "src/crypto/rc4/rc4.c", "src/crypto/refcount_c11.c", "src/crypto/refcount_lock.c", + "src/crypto/rsa_extra/internal.h", "src/crypto/rsa_extra/rsa_asn1.c", + "src/crypto/rsa_extra/rsa_crypt.c", "src/crypto/rsa_extra/rsa_print.c", "src/crypto/siphash/siphash.c", "src/crypto/stack/stack.c", @@ -212,6 +225,7 @@ crypto_sources = [ "src/crypto/x509/i2d_pr.c", "src/crypto/x509/internal.h", "src/crypto/x509/name_print.c", + "src/crypto/x509/policy.c", "src/crypto/x509/rsa_pss.c", "src/crypto/x509/t_crl.c", "src/crypto/x509/t_req.c", @@ -253,11 +267,6 @@ crypto_sources = [ "src/crypto/x509/x_x509a.c", "src/crypto/x509v3/ext_dat.h", "src/crypto/x509v3/internal.h", - "src/crypto/x509v3/pcy_cache.c", - "src/crypto/x509v3/pcy_data.c", - "src/crypto/x509v3/pcy_map.c", - "src/crypto/x509v3/pcy_node.c", - "src/crypto/x509v3/pcy_tree.c", "src/crypto/x509v3/v3_akey.c", "src/crypto/x509v3/v3_akeya.c", "src/crypto/x509v3/v3_alt.c", @@ -275,8 +284,6 @@ crypto_sources = [ "src/crypto/x509v3/v3_lib.c", "src/crypto/x509v3/v3_ncons.c", "src/crypto/x509v3/v3_ocsp.c", - "src/crypto/x509v3/v3_pci.c", - "src/crypto/x509v3/v3_pcia.c", "src/crypto/x509v3/v3_pcons.c", "src/crypto/x509v3/v3_pmaps.c", "src/crypto/x509v3/v3_prn.c", @@ -285,8 +292,10 @@ crypto_sources = [ "src/crypto/x509v3/v3_utl.c", "src/third_party/fiat/curve25519_32.h", "src/third_party/fiat/curve25519_64.h", + "src/third_party/fiat/curve25519_64_msvc.h", "src/third_party/fiat/p256_32.h", "src/third_party/fiat/p256_64.h", + "src/third_party/fiat/p256_64_msvc.h", ] crypto_headers = [ @@ -334,6 +343,7 @@ crypto_headers = [ "src/include/openssl/hrss.h", "src/include/openssl/is_boringssl.h", "src/include/openssl/kdf.h", + "src/include/openssl/kyber.h", "src/include/openssl/lhash.h", "src/include/openssl/md4.h", "src/include/openssl/md5.h", @@ -362,6 +372,7 @@ crypto_headers = [ "src/include/openssl/span.h", "src/include/openssl/stack.h", "src/include/openssl/thread.h", + "src/include/openssl/time.h", "src/include/openssl/trust_token.h", "src/include/openssl/type_check.h", "src/include/openssl/x509.h", @@ -441,202 +452,202 @@ tool_sources = [ ] crypto_sources_apple_aarch64 = [ - "apple-aarch64/crypto/chacha/chacha-armv8.S", - "apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S", - "apple-aarch64/crypto/fipsmodule/aesv8-armx64.S", - "apple-aarch64/crypto/fipsmodule/armv8-mont.S", - "apple-aarch64/crypto/fipsmodule/ghash-neon-armv8.S", - "apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S", - "apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S", - "apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S", - "apple-aarch64/crypto/fipsmodule/sha1-armv8.S", - "apple-aarch64/crypto/fipsmodule/sha256-armv8.S", - "apple-aarch64/crypto/fipsmodule/sha512-armv8.S", - "apple-aarch64/crypto/fipsmodule/vpaes-armv8.S", - "apple-aarch64/crypto/test/trampoline-armv8.S", + "apple-aarch64/crypto/chacha/chacha-armv8-apple.S", + "apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-apple.S", + "apple-aarch64/crypto/fipsmodule/aesv8-armv8-apple.S", + "apple-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-apple.S", + "apple-aarch64/crypto/fipsmodule/armv8-mont-apple.S", + "apple-aarch64/crypto/fipsmodule/bn-armv8-apple.S", + "apple-aarch64/crypto/fipsmodule/ghash-neon-armv8-apple.S", + "apple-aarch64/crypto/fipsmodule/ghashv8-armv8-apple.S", + "apple-aarch64/crypto/fipsmodule/p256-armv8-asm-apple.S", + "apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-apple.S", + "apple-aarch64/crypto/fipsmodule/sha1-armv8-apple.S", + "apple-aarch64/crypto/fipsmodule/sha256-armv8-apple.S", + "apple-aarch64/crypto/fipsmodule/sha512-armv8-apple.S", + "apple-aarch64/crypto/fipsmodule/vpaes-armv8-apple.S", + "apple-aarch64/crypto/test/trampoline-armv8-apple.S", ] crypto_sources_apple_arm = [ - "apple-arm/crypto/chacha/chacha-armv4.S", - "apple-arm/crypto/fipsmodule/aesv8-armx32.S", - "apple-arm/crypto/fipsmodule/armv4-mont.S", - "apple-arm/crypto/fipsmodule/bsaes-armv7.S", - "apple-arm/crypto/fipsmodule/ghash-armv4.S", - "apple-arm/crypto/fipsmodule/ghashv8-armx32.S", - "apple-arm/crypto/fipsmodule/sha1-armv4-large.S", - "apple-arm/crypto/fipsmodule/sha256-armv4.S", - "apple-arm/crypto/fipsmodule/sha512-armv4.S", - "apple-arm/crypto/fipsmodule/vpaes-armv7.S", - "apple-arm/crypto/test/trampoline-armv4.S", + "apple-arm/crypto/chacha/chacha-armv4-apple.S", + "apple-arm/crypto/fipsmodule/aesv8-armv7-apple.S", + "apple-arm/crypto/fipsmodule/armv4-mont-apple.S", + "apple-arm/crypto/fipsmodule/bsaes-armv7-apple.S", + "apple-arm/crypto/fipsmodule/ghash-armv4-apple.S", + "apple-arm/crypto/fipsmodule/ghashv8-armv7-apple.S", + "apple-arm/crypto/fipsmodule/sha1-armv4-large-apple.S", + "apple-arm/crypto/fipsmodule/sha256-armv4-apple.S", + "apple-arm/crypto/fipsmodule/sha512-armv4-apple.S", + "apple-arm/crypto/fipsmodule/vpaes-armv7-apple.S", + "apple-arm/crypto/test/trampoline-armv4-apple.S", ] crypto_sources_apple_x86 = [ - "apple-x86/crypto/chacha/chacha-x86.S", - "apple-x86/crypto/fipsmodule/aesni-x86.S", - "apple-x86/crypto/fipsmodule/bn-586.S", - "apple-x86/crypto/fipsmodule/co-586.S", - "apple-x86/crypto/fipsmodule/ghash-ssse3-x86.S", - "apple-x86/crypto/fipsmodule/ghash-x86.S", - "apple-x86/crypto/fipsmodule/md5-586.S", - "apple-x86/crypto/fipsmodule/sha1-586.S", - "apple-x86/crypto/fipsmodule/sha256-586.S", - "apple-x86/crypto/fipsmodule/sha512-586.S", - "apple-x86/crypto/fipsmodule/vpaes-x86.S", - "apple-x86/crypto/fipsmodule/x86-mont.S", - "apple-x86/crypto/test/trampoline-x86.S", + "apple-x86/crypto/chacha/chacha-x86-apple.S", + "apple-x86/crypto/fipsmodule/aesni-x86-apple.S", + "apple-x86/crypto/fipsmodule/bn-586-apple.S", + "apple-x86/crypto/fipsmodule/co-586-apple.S", + "apple-x86/crypto/fipsmodule/ghash-ssse3-x86-apple.S", + "apple-x86/crypto/fipsmodule/ghash-x86-apple.S", + "apple-x86/crypto/fipsmodule/md5-586-apple.S", + "apple-x86/crypto/fipsmodule/sha1-586-apple.S", + "apple-x86/crypto/fipsmodule/sha256-586-apple.S", + "apple-x86/crypto/fipsmodule/sha512-586-apple.S", + "apple-x86/crypto/fipsmodule/vpaes-x86-apple.S", + "apple-x86/crypto/fipsmodule/x86-mont-apple.S", + "apple-x86/crypto/test/trampoline-x86-apple.S", ] crypto_sources_apple_x86_64 = [ - "apple-x86_64/crypto/chacha/chacha-x86_64.S", - "apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S", - "apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S", - "apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S", - "apple-x86_64/crypto/fipsmodule/aesni-x86_64.S", - "apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S", - "apple-x86_64/crypto/fipsmodule/ghash-x86_64.S", - "apple-x86_64/crypto/fipsmodule/md5-x86_64.S", - "apple-x86_64/crypto/fipsmodule/p256-x86_64-asm.S", - "apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S", - "apple-x86_64/crypto/fipsmodule/rdrand-x86_64.S", - "apple-x86_64/crypto/fipsmodule/rsaz-avx2.S", - "apple-x86_64/crypto/fipsmodule/sha1-x86_64.S", - "apple-x86_64/crypto/fipsmodule/sha256-x86_64.S", - "apple-x86_64/crypto/fipsmodule/sha512-x86_64.S", - "apple-x86_64/crypto/fipsmodule/vpaes-x86_64.S", - "apple-x86_64/crypto/fipsmodule/x86_64-mont.S", - "apple-x86_64/crypto/fipsmodule/x86_64-mont5.S", - "apple-x86_64/crypto/test/trampoline-x86_64.S", + "apple-x86_64/crypto/chacha/chacha-x86_64-apple.S", + "apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-apple.S", + "apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/aesni-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/ghash-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/md5-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/p256-x86_64-asm-apple.S", + "apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-apple.S", + "apple-x86_64/crypto/fipsmodule/rdrand-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/rsaz-avx2-apple.S", + "apple-x86_64/crypto/fipsmodule/sha1-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/sha256-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/sha512-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/vpaes-x86_64-apple.S", + "apple-x86_64/crypto/fipsmodule/x86_64-mont-apple.S", + "apple-x86_64/crypto/fipsmodule/x86_64-mont5-apple.S", + "apple-x86_64/crypto/test/trampoline-x86_64-apple.S", ] crypto_sources_linux_aarch64 = [ - "linux-aarch64/crypto/chacha/chacha-armv8.S", - "linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S", - "linux-aarch64/crypto/fipsmodule/aesv8-armx64.S", - "linux-aarch64/crypto/fipsmodule/armv8-mont.S", - "linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S", - "linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S", - "linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S", - "linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S", - "linux-aarch64/crypto/fipsmodule/sha1-armv8.S", - "linux-aarch64/crypto/fipsmodule/sha256-armv8.S", - "linux-aarch64/crypto/fipsmodule/sha512-armv8.S", - "linux-aarch64/crypto/fipsmodule/vpaes-armv8.S", - "linux-aarch64/crypto/test/trampoline-armv8.S", + "linux-aarch64/crypto/chacha/chacha-armv8-linux.S", + "linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-linux.S", + "linux-aarch64/crypto/fipsmodule/aesv8-armv8-linux.S", + "linux-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-linux.S", + "linux-aarch64/crypto/fipsmodule/armv8-mont-linux.S", + "linux-aarch64/crypto/fipsmodule/bn-armv8-linux.S", + "linux-aarch64/crypto/fipsmodule/ghash-neon-armv8-linux.S", + "linux-aarch64/crypto/fipsmodule/ghashv8-armv8-linux.S", + "linux-aarch64/crypto/fipsmodule/p256-armv8-asm-linux.S", + "linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-linux.S", + "linux-aarch64/crypto/fipsmodule/sha1-armv8-linux.S", + "linux-aarch64/crypto/fipsmodule/sha256-armv8-linux.S", + "linux-aarch64/crypto/fipsmodule/sha512-armv8-linux.S", + "linux-aarch64/crypto/fipsmodule/vpaes-armv8-linux.S", + "linux-aarch64/crypto/test/trampoline-armv8-linux.S", ] crypto_sources_linux_arm = [ - "linux-arm/crypto/chacha/chacha-armv4.S", - "linux-arm/crypto/fipsmodule/aesv8-armx32.S", - "linux-arm/crypto/fipsmodule/armv4-mont.S", - "linux-arm/crypto/fipsmodule/bsaes-armv7.S", - "linux-arm/crypto/fipsmodule/ghash-armv4.S", - "linux-arm/crypto/fipsmodule/ghashv8-armx32.S", - "linux-arm/crypto/fipsmodule/sha1-armv4-large.S", - "linux-arm/crypto/fipsmodule/sha256-armv4.S", - "linux-arm/crypto/fipsmodule/sha512-armv4.S", - "linux-arm/crypto/fipsmodule/vpaes-armv7.S", - "linux-arm/crypto/test/trampoline-armv4.S", + "linux-arm/crypto/chacha/chacha-armv4-linux.S", + "linux-arm/crypto/fipsmodule/aesv8-armv7-linux.S", + "linux-arm/crypto/fipsmodule/armv4-mont-linux.S", + "linux-arm/crypto/fipsmodule/bsaes-armv7-linux.S", + "linux-arm/crypto/fipsmodule/ghash-armv4-linux.S", + "linux-arm/crypto/fipsmodule/ghashv8-armv7-linux.S", + "linux-arm/crypto/fipsmodule/sha1-armv4-large-linux.S", + "linux-arm/crypto/fipsmodule/sha256-armv4-linux.S", + "linux-arm/crypto/fipsmodule/sha512-armv4-linux.S", + "linux-arm/crypto/fipsmodule/vpaes-armv7-linux.S", + "linux-arm/crypto/test/trampoline-armv4-linux.S", "src/crypto/curve25519/asm/x25519-asm-arm.S", "src/crypto/poly1305/poly1305_arm_asm.S", ] -crypto_sources_linux_ppc64le = [ - "linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S", - "linux-ppc64le/crypto/fipsmodule/ghashp8-ppc.S", - "linux-ppc64le/crypto/test/trampoline-ppc.S", -] - crypto_sources_linux_x86 = [ - "linux-x86/crypto/chacha/chacha-x86.S", - "linux-x86/crypto/fipsmodule/aesni-x86.S", - "linux-x86/crypto/fipsmodule/bn-586.S", - "linux-x86/crypto/fipsmodule/co-586.S", - "linux-x86/crypto/fipsmodule/ghash-ssse3-x86.S", - "linux-x86/crypto/fipsmodule/ghash-x86.S", - "linux-x86/crypto/fipsmodule/md5-586.S", - "linux-x86/crypto/fipsmodule/sha1-586.S", - "linux-x86/crypto/fipsmodule/sha256-586.S", - "linux-x86/crypto/fipsmodule/sha512-586.S", - "linux-x86/crypto/fipsmodule/vpaes-x86.S", - "linux-x86/crypto/fipsmodule/x86-mont.S", - "linux-x86/crypto/test/trampoline-x86.S", + "linux-x86/crypto/chacha/chacha-x86-linux.S", + "linux-x86/crypto/fipsmodule/aesni-x86-linux.S", + "linux-x86/crypto/fipsmodule/bn-586-linux.S", + "linux-x86/crypto/fipsmodule/co-586-linux.S", + "linux-x86/crypto/fipsmodule/ghash-ssse3-x86-linux.S", + "linux-x86/crypto/fipsmodule/ghash-x86-linux.S", + "linux-x86/crypto/fipsmodule/md5-586-linux.S", + "linux-x86/crypto/fipsmodule/sha1-586-linux.S", + "linux-x86/crypto/fipsmodule/sha256-586-linux.S", + "linux-x86/crypto/fipsmodule/sha512-586-linux.S", + "linux-x86/crypto/fipsmodule/vpaes-x86-linux.S", + "linux-x86/crypto/fipsmodule/x86-mont-linux.S", + "linux-x86/crypto/test/trampoline-x86-linux.S", ] crypto_sources_linux_x86_64 = [ - "linux-x86_64/crypto/chacha/chacha-x86_64.S", - "linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S", - "linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S", - "linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S", - "linux-x86_64/crypto/fipsmodule/aesni-x86_64.S", - "linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S", - "linux-x86_64/crypto/fipsmodule/ghash-x86_64.S", - "linux-x86_64/crypto/fipsmodule/md5-x86_64.S", - "linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S", - "linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S", - "linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S", - "linux-x86_64/crypto/fipsmodule/rsaz-avx2.S", - "linux-x86_64/crypto/fipsmodule/sha1-x86_64.S", - "linux-x86_64/crypto/fipsmodule/sha256-x86_64.S", - "linux-x86_64/crypto/fipsmodule/sha512-x86_64.S", - "linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S", - "linux-x86_64/crypto/fipsmodule/x86_64-mont.S", - "linux-x86_64/crypto/fipsmodule/x86_64-mont5.S", - "linux-x86_64/crypto/test/trampoline-x86_64.S", + "linux-x86_64/crypto/chacha/chacha-x86_64-linux.S", + "linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-linux.S", + "linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/aesni-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/ghash-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/md5-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/p256-x86_64-asm-linux.S", + "linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-linux.S", + "linux-x86_64/crypto/fipsmodule/rdrand-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/rsaz-avx2-linux.S", + "linux-x86_64/crypto/fipsmodule/sha1-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/sha256-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/sha512-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/vpaes-x86_64-linux.S", + "linux-x86_64/crypto/fipsmodule/x86_64-mont-linux.S", + "linux-x86_64/crypto/fipsmodule/x86_64-mont5-linux.S", + "linux-x86_64/crypto/test/trampoline-x86_64-linux.S", "src/crypto/hrss/asm/poly_rq_mul.S", ] crypto_sources_win_aarch64 = [ - "win-aarch64/crypto/chacha/chacha-armv8.S", - "win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S", - "win-aarch64/crypto/fipsmodule/aesv8-armx64.S", - "win-aarch64/crypto/fipsmodule/armv8-mont.S", - "win-aarch64/crypto/fipsmodule/ghash-neon-armv8.S", - "win-aarch64/crypto/fipsmodule/ghashv8-armx64.S", - "win-aarch64/crypto/fipsmodule/p256-armv8-asm.S", - "win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S", - "win-aarch64/crypto/fipsmodule/sha1-armv8.S", - "win-aarch64/crypto/fipsmodule/sha256-armv8.S", - "win-aarch64/crypto/fipsmodule/sha512-armv8.S", - "win-aarch64/crypto/fipsmodule/vpaes-armv8.S", - "win-aarch64/crypto/test/trampoline-armv8.S", + "win-aarch64/crypto/chacha/chacha-armv8-win.S", + "win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-win.S", + "win-aarch64/crypto/fipsmodule/aesv8-armv8-win.S", + "win-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-win.S", + "win-aarch64/crypto/fipsmodule/armv8-mont-win.S", + "win-aarch64/crypto/fipsmodule/bn-armv8-win.S", + "win-aarch64/crypto/fipsmodule/ghash-neon-armv8-win.S", + "win-aarch64/crypto/fipsmodule/ghashv8-armv8-win.S", + "win-aarch64/crypto/fipsmodule/p256-armv8-asm-win.S", + "win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-win.S", + "win-aarch64/crypto/fipsmodule/sha1-armv8-win.S", + "win-aarch64/crypto/fipsmodule/sha256-armv8-win.S", + "win-aarch64/crypto/fipsmodule/sha512-armv8-win.S", + "win-aarch64/crypto/fipsmodule/vpaes-armv8-win.S", + "win-aarch64/crypto/test/trampoline-armv8-win.S", ] crypto_sources_win_x86 = [ - "win-x86/crypto/chacha/chacha-x86.asm", - "win-x86/crypto/fipsmodule/aesni-x86.asm", - "win-x86/crypto/fipsmodule/bn-586.asm", - "win-x86/crypto/fipsmodule/co-586.asm", - "win-x86/crypto/fipsmodule/ghash-ssse3-x86.asm", - "win-x86/crypto/fipsmodule/ghash-x86.asm", - "win-x86/crypto/fipsmodule/md5-586.asm", - "win-x86/crypto/fipsmodule/sha1-586.asm", - "win-x86/crypto/fipsmodule/sha256-586.asm", - "win-x86/crypto/fipsmodule/sha512-586.asm", - "win-x86/crypto/fipsmodule/vpaes-x86.asm", - "win-x86/crypto/fipsmodule/x86-mont.asm", - "win-x86/crypto/test/trampoline-x86.asm", + "win-x86/crypto/chacha/chacha-x86-win.asm", + "win-x86/crypto/fipsmodule/aesni-x86-win.asm", + "win-x86/crypto/fipsmodule/bn-586-win.asm", + "win-x86/crypto/fipsmodule/co-586-win.asm", + "win-x86/crypto/fipsmodule/ghash-ssse3-x86-win.asm", + "win-x86/crypto/fipsmodule/ghash-x86-win.asm", + "win-x86/crypto/fipsmodule/md5-586-win.asm", + "win-x86/crypto/fipsmodule/sha1-586-win.asm", + "win-x86/crypto/fipsmodule/sha256-586-win.asm", + "win-x86/crypto/fipsmodule/sha512-586-win.asm", + "win-x86/crypto/fipsmodule/vpaes-x86-win.asm", + "win-x86/crypto/fipsmodule/x86-mont-win.asm", + "win-x86/crypto/test/trampoline-x86-win.asm", ] crypto_sources_win_x86_64 = [ - "win-x86_64/crypto/chacha/chacha-x86_64.asm", - "win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.asm", - "win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.asm", - "win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.asm", - "win-x86_64/crypto/fipsmodule/aesni-x86_64.asm", - "win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.asm", - "win-x86_64/crypto/fipsmodule/ghash-x86_64.asm", - "win-x86_64/crypto/fipsmodule/md5-x86_64.asm", - "win-x86_64/crypto/fipsmodule/p256-x86_64-asm.asm", - "win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.asm", - "win-x86_64/crypto/fipsmodule/rdrand-x86_64.asm", - "win-x86_64/crypto/fipsmodule/rsaz-avx2.asm", - "win-x86_64/crypto/fipsmodule/sha1-x86_64.asm", - "win-x86_64/crypto/fipsmodule/sha256-x86_64.asm", - "win-x86_64/crypto/fipsmodule/sha512-x86_64.asm", - "win-x86_64/crypto/fipsmodule/vpaes-x86_64.asm", - "win-x86_64/crypto/fipsmodule/x86_64-mont.asm", - "win-x86_64/crypto/fipsmodule/x86_64-mont5.asm", - "win-x86_64/crypto/test/trampoline-x86_64.asm", + "win-x86_64/crypto/chacha/chacha-x86_64-win.asm", + "win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-win.asm", + "win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/aesni-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/ghash-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/md5-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/p256-x86_64-asm-win.asm", + "win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-win.asm", + "win-x86_64/crypto/fipsmodule/rdrand-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/rsaz-avx2-win.asm", + "win-x86_64/crypto/fipsmodule/sha1-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/sha256-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/sha512-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/vpaes-x86_64-win.asm", + "win-x86_64/crypto/fipsmodule/x86_64-mont-win.asm", + "win-x86_64/crypto/fipsmodule/x86_64-mont5-win.asm", + "win-x86_64/crypto/test/trampoline-x86_64-win.asm", ] fuzzers = [ @@ -645,6 +656,7 @@ fuzzers = [ "bn_mod_exp", "cert", "client", + "conf", "decode_client_hello_inner", "der_roundtrip", "dtls_client", diff --git a/third_party/boringssl/BUILD.generated_tests.gni b/third_party/boringssl/BUILD.generated_tests.gni index 6dcfcefcf009..eed5746c3215 100644 --- a/third_party/boringssl/BUILD.generated_tests.gni +++ b/third_party/boringssl/BUILD.generated_tests.gni @@ -1,6 +1,16 @@ -# Copyright 2016 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. +# 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. # This file is created by generate_build_files.py. Do not edit manually. @@ -9,7 +19,6 @@ test_support_sources = [ "src/crypto/test/file_test.cc", "src/crypto/test/file_test.h", "src/crypto/test/gtest_main.h", - "src/crypto/test/malloc.cc", "src/crypto/test/test_util.cc", "src/crypto/test/test_util.h", "src/crypto/test/wycheproof_util.cc", @@ -59,17 +68,18 @@ crypto_test_sources = [ "src/crypto/fipsmodule/ec/ec_test.cc", "src/crypto/fipsmodule/ec/p256-nistz_test.cc", "src/crypto/fipsmodule/ecdsa/ecdsa_test.cc", + "src/crypto/fipsmodule/hkdf/hkdf_test.cc", "src/crypto/fipsmodule/md5/md5_test.cc", "src/crypto/fipsmodule/modes/gcm_test.cc", "src/crypto/fipsmodule/rand/ctrdrbg_test.cc", "src/crypto/fipsmodule/rand/fork_detect_test.cc", "src/crypto/fipsmodule/service_indicator/service_indicator_test.cc", "src/crypto/fipsmodule/sha/sha_test.cc", - "src/crypto/hkdf/hkdf_test.cc", "src/crypto/hmac_extra/hmac_test.cc", "src/crypto/hpke/hpke_test.cc", "src/crypto/hrss/hrss_test.cc", "src/crypto/impl_dispatch_test.cc", + "src/crypto/kyber/kyber_test.cc", "src/crypto/lhash/lhash_test.cc", "src/crypto/obj/obj_test.cc", "src/crypto/pem/pem_test.cc", @@ -132,8 +142,17 @@ crypto_test_data = [ "src/crypto/evp/evp_tests.txt", "src/crypto/evp/scrypt_tests.txt", "src/crypto/fipsmodule/aes/aes_tests.txt", - "src/crypto/fipsmodule/bn/bn_tests.txt", - "src/crypto/fipsmodule/bn/miller_rabin_tests.txt", + "src/crypto/fipsmodule/bn/test/exp_tests.txt", + "src/crypto/fipsmodule/bn/test/gcd_tests.txt", + "src/crypto/fipsmodule/bn/test/miller_rabin_tests.txt", + "src/crypto/fipsmodule/bn/test/mod_exp_tests.txt", + "src/crypto/fipsmodule/bn/test/mod_inv_tests.txt", + "src/crypto/fipsmodule/bn/test/mod_mul_tests.txt", + "src/crypto/fipsmodule/bn/test/mod_sqrt_tests.txt", + "src/crypto/fipsmodule/bn/test/product_tests.txt", + "src/crypto/fipsmodule/bn/test/quotient_tests.txt", + "src/crypto/fipsmodule/bn/test/shift_tests.txt", + "src/crypto/fipsmodule/bn/test/sum_tests.txt", "src/crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt", "src/crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt", "src/crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt", @@ -146,6 +165,8 @@ crypto_test_data = [ "src/crypto/fipsmodule/rand/ctrdrbg_vectors.txt", "src/crypto/hmac_extra/hmac_tests.txt", "src/crypto/hpke/hpke_test_vectors.txt", + "src/crypto/kyber/keccak_tests.txt", + "src/crypto/kyber/kyber_tests.txt", "src/crypto/pkcs8/test/empty_password.p12", "src/crypto/pkcs8/test/no_encryption.p12", "src/crypto/pkcs8/test/nss.p12", @@ -191,6 +212,33 @@ crypto_test_data = [ "src/crypto/x509/test/many_names1.pem", "src/crypto/x509/test/many_names2.pem", "src/crypto/x509/test/many_names3.pem", + "src/crypto/x509/test/policy_intermediate.pem", + "src/crypto/x509/test/policy_intermediate_any.pem", + "src/crypto/x509/test/policy_intermediate_duplicate.pem", + "src/crypto/x509/test/policy_intermediate_invalid.pem", + "src/crypto/x509/test/policy_intermediate_mapped.pem", + "src/crypto/x509/test/policy_intermediate_mapped_any.pem", + "src/crypto/x509/test/policy_intermediate_mapped_oid3.pem", + "src/crypto/x509/test/policy_intermediate_require.pem", + "src/crypto/x509/test/policy_intermediate_require1.pem", + "src/crypto/x509/test/policy_intermediate_require2.pem", + "src/crypto/x509/test/policy_intermediate_require_duplicate.pem", + "src/crypto/x509/test/policy_intermediate_require_no_policies.pem", + "src/crypto/x509/test/policy_leaf.pem", + "src/crypto/x509/test/policy_leaf_any.pem", + "src/crypto/x509/test/policy_leaf_duplicate.pem", + "src/crypto/x509/test/policy_leaf_invalid.pem", + "src/crypto/x509/test/policy_leaf_none.pem", + "src/crypto/x509/test/policy_leaf_oid1.pem", + "src/crypto/x509/test/policy_leaf_oid2.pem", + "src/crypto/x509/test/policy_leaf_oid3.pem", + "src/crypto/x509/test/policy_leaf_oid4.pem", + "src/crypto/x509/test/policy_leaf_oid5.pem", + "src/crypto/x509/test/policy_leaf_require.pem", + "src/crypto/x509/test/policy_leaf_require1.pem", + "src/crypto/x509/test/policy_root.pem", + "src/crypto/x509/test/policy_root2.pem", + "src/crypto/x509/test/policy_root_cross_inhibit_mapping.pem", "src/crypto/x509/test/pss_sha1.pem", "src/crypto/x509/test/pss_sha1_explicit.pem", "src/crypto/x509/test/pss_sha1_mgf1_syntax_error.pem", diff --git a/third_party/boringssl/BUILD.gn b/third_party/boringssl/BUILD.gn index 46877c0aac00..ad88eb2d5f6c 100644 --- a/third_party/boringssl/BUILD.gn +++ b/third_party/boringssl/BUILD.gn @@ -5,12 +5,18 @@ import("//build/config/android/config.gni") import("//build/config/arm.gni") import("//build/config/compiler/compiler.gni") +import("//build/config/rust.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build_overrides/build.gni") import("//testing/libfuzzer/fuzzer_test.gni") import("BUILD.generated.gni") import("BUILD.generated_tests.gni") +if (enable_rust) { + import("//build/rust/cargo_crate.gni") + import("//build/rust/rust_bindgen.gni") +} + # Config for us and everybody else depending on BoringSSL. config("external_config") { include_dirs = [ "src/include" ] @@ -79,6 +85,48 @@ config("no_asm_config") { all_sources = crypto_sources + ssl_sources all_headers = crypto_headers + ssl_headers +if (enable_rust_boringssl) { + rust_bindgen("raw_bssl_sys_bindings") { + header = "src/rust/bssl-sys/wrapper.h" + deps = [ ":boringssl" ] + bindgen_flags = [ + "no-derive-default", + "enable-function-attribute-detection", + "use-core", + "default-macro-constant-type=signed", + "rustified-enum=point_conversion_form_t", + "allowlist-file=.*[[:punct:]]include[[:punct:]]openssl[[:punct:]].*\\.h", + "allowlist-file=.*[[:punct:]]rust_wrapper\\.h", + ] + visibility = [ ":*" ] # private, should only be exposed through bssl_crypto + } + + # Low level, bindgen generates system bindings to boringssl + cargo_crate("bssl_sys") { + crate_type = "rlib" + crate_root = "src/rust/bssl-sys/src/lib.rs" + sources = [ "src/rust/bssl-sys/src/lib.rs" ] + edition = "2021" + deps = [ + ":boringssl", + ":raw_bssl_sys_bindings", + ] + visibility = [ ":*" ] # private, should only be exposed through bssl_crypto + + _bindgen_output = get_target_outputs(":raw_bssl_sys_bindings") + rustenv = [ "BINDGEN_RS_FILE=" + rebase_path(_bindgen_output[0]) ] + } + + # Rust bindings to boringssl + cargo_crate("bssl_crypto") { + crate_type = "rlib" + crate_root = "src/rust/bssl-crypto/src/lib.rs" + sources = [ "src/rust/bssl-crypto/src/lib.rs" ] + edition = "2021" + deps = [ ":bssl_sys" ] + } +} + if (!use_cobalt_customizations) { # Windows' assembly is built with NASM. The other platforms use the platform # assembler. Exclude Windows ARM64 because NASM targets x86 and x64 only. @@ -298,12 +346,7 @@ if (build_with_chromium) { ] # Chromium infrastructure does not support GTest, only the //base wrapper. - sources -= [ - "src/crypto/test/gtest_main.cc", - - # //base includes its own conflicting malloc shim. - "src/crypto/test/malloc.cc", - ] + sources -= [ "src/crypto/test/gtest_main.cc" ] sources += [ "gtest_main_chromium.cc", "test_data_chromium.cc", @@ -330,12 +373,7 @@ if (build_with_chromium) { ] # Chromium infrastructure does not support GTest, only the //base wrapper. - sources -= [ - "src/crypto/test/gtest_main.cc", - - # //base includes its own conflicting malloc shim. - "src/crypto/test/malloc.cc", - ] + sources -= [ "src/crypto/test/gtest_main.cc" ] sources += [ "gtest_main_chromium.cc" ] deps += [ "//base/test:test_support" ] } diff --git a/third_party/boringssl/METADATA b/third_party/boringssl/METADATA index 271c0cae23c2..94e3c18c2162 100644 --- a/third_party/boringssl/METADATA +++ b/third_party/boringssl/METADATA @@ -1,12 +1,12 @@ third_party { identifier { type: "ChromiumVersion" - value: "108.0.5359.243" # from https://chromereleases.googleblog.com/2023/09/long-term-support-channel-update-for_18.html + value: "114.0.5735.355" # from https://chromereleases.googleblog.com/2024/03/long-term-support-channel-update-for.html } identifier { type: "Git" value: "https://chromium.googlesource.com/chromium/src.git" - version: "60f10bcddac0f909b6ba2ddbaf2b49ca9c5ba714" + version: "423afdedc74c5c559a30b028747fd635005af431" } identifier { type: "UpstreamSubdir" diff --git a/third_party/boringssl/apple-aarch64/crypto/chacha/chacha-armv8.S b/third_party/boringssl/apple-aarch64/crypto/chacha/chacha-armv8-apple.S similarity index 99% rename from third_party/boringssl/apple-aarch64/crypto/chacha/chacha-armv8.S rename to third_party/boringssl/apple-aarch64/crypto/chacha/chacha-armv8-apple.S index dd992a2e39d3..6197428551c1 100644 --- a/third_party/boringssl/apple-aarch64/crypto/chacha/chacha-armv8.S +++ b/third_party/boringssl/apple-aarch64/crypto/chacha/chacha-armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1989,4 +1989,8 @@ Ldone_512_neon: AARCH64_VALIDATE_LINK_REGISTER ret -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S b/third_party/boringssl/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-apple.S similarity index 99% rename from third_party/boringssl/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S rename to third_party/boringssl/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-apple.S index eea0722f76de..7fce1759336d 100644 --- a/third_party/boringssl/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S +++ b/third_party/boringssl/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -3014,4 +3014,8 @@ Lopen_128_hash_64: b Lopen_128_hash_64 .cfi_endproc -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/aesv8-armx64.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/aesv8-armv8-apple.S similarity index 98% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/aesv8-armx64.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/aesv8-armv8-apple.S index 50d7deaa5cfc..7e9cf4023748 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/aesv8-armx64.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/aesv8-armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -796,4 +796,8 @@ Lctr32_done: ret #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-apple.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-apple.S new file mode 100644 index 000000000000..30ca50baa20c --- /dev/null +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-apple.S @@ -0,0 +1,1567 @@ +// This file is generated from a similarly-named Perl script in the BoringSSL +// source tree. Do not edit by hand. + +#if !defined(__has_feature) +#define __has_feature(x) 0 +#endif +#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) +#define OPENSSL_NO_ASM +#endif + +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(BORINGSSL_PREFIX) +#include +#endif +#include +#if __ARM_MAX_ARCH__ >= 8 + + +.text +.globl _aes_gcm_enc_kernel +.private_extern _aes_gcm_enc_kernel + +.align 4 +_aes_gcm_enc_kernel: + AARCH64_SIGN_LINK_REGISTER + stp x29, x30, [sp, #-128]! + mov x29, sp + stp x19, x20, [sp, #16] + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #32] + stp x23, x24, [sp, #48] + stp d8, d9, [sp, #64] + stp d10, d11, [sp, #80] + stp d12, d13, [sp, #96] + stp d14, d15, [sp, #112] + ldr w17, [x8, #240] + add x19, x8, x17, lsl #4 // borrow input_l1 for last key + ldp x13, x14, [x19] // load round N keys + ldr q31, [x19, #-16] // load round N-1 keys + add x4, x0, x1, lsr #3 // end_input_ptr + lsr x5, x1, #3 // byte_len + mov x15, x5 + ldp x10, x11, [x16] // ctr96_b64, ctr96_t32 + ld1 { v0.16b}, [x16] // special case vector load initial counter so we can start first AES block as quickly as possible + sub x5, x5, #1 // byte_len - 1 + ldr q18, [x8, #0] // load rk0 + and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + ldr q25, [x8, #112] // load rk7 + add x5, x5, x0 + lsr x12, x11, #32 + fmov d2, x10 // CTR block 2 + orr w11, w11, w11 + rev w12, w12 // rev_ctr32 + fmov d1, x10 // CTR block 1 + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 0 - round 0 + add w12, w12, #1 // increment rev_ctr32 + rev w9, w12 // CTR block 1 + fmov d3, x10 // CTR block 3 + orr x9, x11, x9, lsl #32 // CTR block 1 + add w12, w12, #1 // CTR block 1 + ldr q19, [x8, #16] // load rk1 + fmov v1.d[1], x9 // CTR block 1 + rev w9, w12 // CTR block 2 + add w12, w12, #1 // CTR block 2 + orr x9, x11, x9, lsl #32 // CTR block 2 + ldr q20, [x8, #32] // load rk2 + fmov v2.d[1], x9 // CTR block 2 + rev w9, w12 // CTR block 3 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 0 - round 1 + orr x9, x11, x9, lsl #32 // CTR block 3 + fmov v3.d[1], x9 // CTR block 3 + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 1 - round 0 + ldr q21, [x8, #48] // load rk3 + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 0 - round 2 + ldr q24, [x8, #96] // load rk6 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 2 - round 0 + ldr q23, [x8, #80] // load rk5 + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 1 - round 1 + ldr q14, [x3, #80] // load h3l | h3h + ext v14.16b, v14.16b, v14.16b, #8 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 3 - round 0 + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 2 - round 1 + ldr q22, [x8, #64] // load rk4 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 1 - round 2 + ldr q13, [x3, #64] // load h2l | h2h + ext v13.16b, v13.16b, v13.16b, #8 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 3 - round 1 + ldr q30, [x8, #192] // load rk12 + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 2 - round 2 + ldr q15, [x3, #112] // load h4l | h4h + ext v15.16b, v15.16b, v15.16b, #8 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 1 - round 3 + ldr q29, [x8, #176] // load rk11 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 3 - round 2 + ldr q26, [x8, #128] // load rk8 + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 2 - round 3 + add w12, w12, #1 // CTR block 3 + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 0 - round 3 + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 3 - round 3 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 2 - round 4 + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 0 - round 4 + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 1 - round 4 + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 3 - round 4 + cmp x17, #12 // setup flags for AES-128/192/256 check + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 0 - round 5 + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 1 - round 5 + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 3 - round 5 + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 2 - round 5 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 1 - round 6 + trn2 v17.2d, v14.2d, v15.2d // h4l | h3l + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 3 - round 6 + ldr q27, [x8, #144] // load rk9 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 0 - round 6 + ldr q12, [x3, #32] // load h1l | h1h + ext v12.16b, v12.16b, v12.16b, #8 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 2 - round 6 + ldr q28, [x8, #160] // load rk10 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 1 - round 7 + trn1 v9.2d, v14.2d, v15.2d // h4h | h3h + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 0 - round 7 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 2 - round 7 + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 3 - round 7 + trn2 v16.2d, v12.2d, v13.2d // h2l | h1l + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 1 - round 8 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 2 - round 8 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 3 - round 8 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 0 - round 8 + b.lt Lenc_finish_first_blocks // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 1 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 2 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 3 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 0 - round 9 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 1 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 2 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 3 - round 10 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 0 - round 10 + b.eq Lenc_finish_first_blocks // branch if AES-192 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 1 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 2 - round 11 + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 0 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 3 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 1 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 2 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 0 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 3 - round 12 + +Lenc_finish_first_blocks: + cmp x0, x5 // check if we have <= 4 blocks + eor v17.16b, v17.16b, v9.16b // h4k | h3k + aese v2.16b, v31.16b // AES block 2 - round N-1 + trn1 v8.2d, v12.2d, v13.2d // h2h | h1h + aese v1.16b, v31.16b // AES block 1 - round N-1 + aese v0.16b, v31.16b // AES block 0 - round N-1 + aese v3.16b, v31.16b // AES block 3 - round N-1 + eor v16.16b, v16.16b, v8.16b // h2k | h1k + b.ge Lenc_tail // handle tail + + ldp x19, x20, [x0, #16] // AES block 1 - load plaintext + rev w9, w12 // CTR block 4 + ldp x6, x7, [x0, #0] // AES block 0 - load plaintext + ldp x23, x24, [x0, #48] // AES block 3 - load plaintext + ldp x21, x22, [x0, #32] // AES block 2 - load plaintext + add x0, x0, #64 // AES input_ptr update + eor x19, x19, x13 // AES block 1 - round N low + eor x20, x20, x14 // AES block 1 - round N high + fmov d5, x19 // AES block 1 - mov low + eor x6, x6, x13 // AES block 0 - round N low + eor x7, x7, x14 // AES block 0 - round N high + eor x24, x24, x14 // AES block 3 - round N high + fmov d4, x6 // AES block 0 - mov low + cmp x0, x5 // check if we have <= 8 blocks + fmov v4.d[1], x7 // AES block 0 - mov high + eor x23, x23, x13 // AES block 3 - round N low + eor x21, x21, x13 // AES block 2 - round N low + fmov v5.d[1], x20 // AES block 1 - mov high + fmov d6, x21 // AES block 2 - mov low + add w12, w12, #1 // CTR block 4 + orr x9, x11, x9, lsl #32 // CTR block 4 + fmov d7, x23 // AES block 3 - mov low + eor x22, x22, x14 // AES block 2 - round N high + fmov v6.d[1], x22 // AES block 2 - mov high + eor v4.16b, v4.16b, v0.16b // AES block 0 - result + fmov d0, x10 // CTR block 4 + fmov v0.d[1], x9 // CTR block 4 + rev w9, w12 // CTR block 5 + add w12, w12, #1 // CTR block 5 + eor v5.16b, v5.16b, v1.16b // AES block 1 - result + fmov d1, x10 // CTR block 5 + orr x9, x11, x9, lsl #32 // CTR block 5 + fmov v1.d[1], x9 // CTR block 5 + rev w9, w12 // CTR block 6 + st1 { v4.16b}, [x2], #16 // AES block 0 - store result + fmov v7.d[1], x24 // AES block 3 - mov high + orr x9, x11, x9, lsl #32 // CTR block 6 + eor v6.16b, v6.16b, v2.16b // AES block 2 - result + st1 { v5.16b}, [x2], #16 // AES block 1 - store result + add w12, w12, #1 // CTR block 6 + fmov d2, x10 // CTR block 6 + fmov v2.d[1], x9 // CTR block 6 + st1 { v6.16b}, [x2], #16 // AES block 2 - store result + rev w9, w12 // CTR block 7 + orr x9, x11, x9, lsl #32 // CTR block 7 + eor v7.16b, v7.16b, v3.16b // AES block 3 - result + st1 { v7.16b}, [x2], #16 // AES block 3 - store result + b.ge Lenc_prepretail // do prepretail + +Lenc_main_loop: // main loop start + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + rev64 v4.16b, v4.16b // GHASH block 4k (only t0 is free) + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + fmov d3, x10 // CTR block 4k+3 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + fmov v3.d[1], x9 // CTR block 4k+3 + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + ldp x23, x24, [x0, #48] // AES block 4k+7 - load plaintext + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + ldp x21, x22, [x0, #32] // AES block 4k+6 - load plaintext + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + eor v4.16b, v4.16b, v11.16b // PRE 1 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + eor x23, x23, x13 // AES block 4k+7 - round N low + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + mov d10, v17.d[1] // GHASH block 4k - mid + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + eor x22, x22, x14 // AES block 4k+6 - round N high + mov d8, v4.d[1] // GHASH block 4k - mid + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + rev64 v5.16b, v5.16b // GHASH block 4k+1 (t0 and t1 free) + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + rev64 v7.16b, v7.16b // GHASH block 4k+3 (t0, t1, t2 and t3 free) + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + rev64 v6.16b, v6.16b // GHASH block 4k+2 (t0, t1, and t2 free) + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + pmull v6.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + ldp x19, x20, [x0, #16] // AES block 4k+5 - load plaintext + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + mov d4, v7.d[1] // GHASH block 4k+3 - mid + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + eor v4.8b, v4.8b, v7.8b // GHASH block 4k+3 - mid + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor x19, x19, x13 // AES block 4k+5 - round N low + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + eor x21, x21, x13 // AES block 4k+6 - round N low + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + movi v8.8b, #0xc2 + pmull v4.1q, v4.1d, v16.1d // GHASH block 4k+3 - mid + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + cmp x17, #12 // setup flags for AES-128/192/256 check + fmov d5, x19 // AES block 4k+5 - mov low + ldp x6, x7, [x0, #0] // AES block 4k+4 - load plaintext + b.lt Lenc_main_loop_continue // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + b.eq Lenc_main_loop_continue // branch if AES-192 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + +Lenc_main_loop_continue: + shl d8, d8, #56 // mod_constant + eor v11.16b, v11.16b, v6.16b // GHASH block 4k+3 - low + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+3 - mid + add w12, w12, #1 // CTR block 4k+3 + eor v4.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + add x0, x0, #64 // AES input_ptr update + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + rev w9, w12 // CTR block 4k+8 + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor x6, x6, x13 // AES block 4k+4 - round N low + eor v10.16b, v10.16b, v4.16b // MODULO - karatsuba tidy up + eor x7, x7, x14 // AES block 4k+4 - round N high + fmov d4, x6 // AES block 4k+4 - mov low + orr x9, x11, x9, lsl #32 // CTR block 4k+8 + eor v7.16b, v9.16b, v7.16b // MODULO - fold into mid + eor x20, x20, x14 // AES block 4k+5 - round N high + eor x24, x24, x14 // AES block 4k+7 - round N high + add w12, w12, #1 // CTR block 4k+8 + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + fmov v4.d[1], x7 // AES block 4k+4 - mov high + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + fmov d7, x23 // AES block 4k+7 - mov low + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + fmov v5.d[1], x20 // AES block 4k+5 - mov high + fmov d6, x21 // AES block 4k+6 - mov low + cmp x0, x5 // LOOP CONTROL + fmov v6.d[1], x22 // AES block 4k+6 - mov high + pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + eor v4.16b, v4.16b, v0.16b // AES block 4k+4 - result + fmov d0, x10 // CTR block 4k+8 + fmov v0.d[1], x9 // CTR block 4k+8 + rev w9, w12 // CTR block 4k+9 + add w12, w12, #1 // CTR block 4k+9 + eor v5.16b, v5.16b, v1.16b // AES block 4k+5 - result + fmov d1, x10 // CTR block 4k+9 + orr x9, x11, x9, lsl #32 // CTR block 4k+9 + fmov v1.d[1], x9 // CTR block 4k+9 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + rev w9, w12 // CTR block 4k+10 + st1 { v4.16b}, [x2], #16 // AES block 4k+4 - store result + orr x9, x11, x9, lsl #32 // CTR block 4k+10 + eor v11.16b, v11.16b, v9.16b // MODULO - fold into low + fmov v7.d[1], x24 // AES block 4k+7 - mov high + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + st1 { v5.16b}, [x2], #16 // AES block 4k+5 - store result + add w12, w12, #1 // CTR block 4k+10 + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + eor v6.16b, v6.16b, v2.16b // AES block 4k+6 - result + fmov d2, x10 // CTR block 4k+10 + st1 { v6.16b}, [x2], #16 // AES block 4k+6 - store result + fmov v2.d[1], x9 // CTR block 4k+10 + rev w9, w12 // CTR block 4k+11 + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + orr x9, x11, x9, lsl #32 // CTR block 4k+11 + eor v7.16b, v7.16b, v3.16b // AES block 4k+7 - result + st1 { v7.16b}, [x2], #16 // AES block 4k+7 - store result + b.lt Lenc_main_loop + +Lenc_prepretail: // PREPRETAIL + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + rev64 v6.16b, v6.16b // GHASH block 4k+2 (t0, t1, and t2 free) + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + fmov d3, x10 // CTR block 4k+3 + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + rev64 v4.16b, v4.16b // GHASH block 4k (only t0 is free) + fmov v3.d[1], x9 // CTR block 4k+3 + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + eor v4.16b, v4.16b, v11.16b // PRE 1 + rev64 v5.16b, v5.16b // GHASH block 4k+1 (t0 and t1 free) + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + mov d10, v17.d[1] // GHASH block 4k - mid + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + mov d8, v4.d[1] // GHASH block 4k - mid + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + rev64 v7.16b, v7.16b // GHASH block 4k+3 (t0, t1, t2 and t3 free) + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + add w12, w12, #1 // CTR block 4k+3 + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + mov d4, v7.d[1] // GHASH block 4k+3 - mid + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + eor v4.8b, v4.8b, v7.8b // GHASH block 4k+3 - mid + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + pmull v4.1q, v4.1d, v16.1d // GHASH block 4k+3 - mid + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + movi v8.8b, #0xc2 + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + shl d8, d8, #56 // mod_constant + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+3 - mid + pmull v6.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + cmp x17, #12 // setup flags for AES-128/192/256 check + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + eor v11.16b, v11.16b, v6.16b // GHASH block 4k+3 - low + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor v10.16b, v10.16b, v9.16b // karatsuba tidy up + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + pmull v4.1q, v9.1d, v8.1d + ext v9.16b, v9.16b, v9.16b, #8 + eor v10.16b, v10.16b, v11.16b + b.lt Lenc_finish_prepretail // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + b.eq Lenc_finish_prepretail // branch if AES-192 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + +Lenc_finish_prepretail: + eor v10.16b, v10.16b, v4.16b + eor v10.16b, v10.16b, v9.16b + pmull v4.1q, v10.1d, v8.1d + ext v10.16b, v10.16b, v10.16b, #8 + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + eor v11.16b, v11.16b, v4.16b + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + eor v11.16b, v11.16b, v10.16b + +Lenc_tail: // TAIL + ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag + sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process + ldp x6, x7, [x0], #16 // AES block 4k+4 - load plaintext + eor x6, x6, x13 // AES block 4k+4 - round N low + eor x7, x7, x14 // AES block 4k+4 - round N high + cmp x5, #48 + fmov d4, x6 // AES block 4k+4 - mov low + fmov v4.d[1], x7 // AES block 4k+4 - mov high + eor v5.16b, v4.16b, v0.16b // AES block 4k+4 - result + b.gt Lenc_blocks_more_than_3 + cmp x5, #32 + mov v3.16b, v2.16b + movi v11.8b, #0 + movi v9.8b, #0 + sub w12, w12, #1 + mov v2.16b, v1.16b + movi v10.8b, #0 + b.gt Lenc_blocks_more_than_2 + mov v3.16b, v1.16b + sub w12, w12, #1 + cmp x5, #16 + b.gt Lenc_blocks_more_than_1 + sub w12, w12, #1 + b Lenc_blocks_less_than_1 +Lenc_blocks_more_than_3: // blocks left > 3 + st1 { v5.16b}, [x2], #16 // AES final-3 block - store result + ldp x6, x7, [x0], #16 // AES final-2 block - load input low & high + rev64 v4.16b, v5.16b // GHASH final-3 block + eor x6, x6, x13 // AES final-2 block - round N low + eor v4.16b, v4.16b, v8.16b // feed in partial tag + eor x7, x7, x14 // AES final-2 block - round N high + mov d22, v4.d[1] // GHASH final-3 block - mid + fmov d5, x6 // AES final-2 block - mov low + fmov v5.d[1], x7 // AES final-2 block - mov high + eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid + movi v8.8b, #0 // suppress further partial tag feed in + mov d10, v17.d[1] // GHASH final-3 block - mid + pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low + pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high + pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid + eor v5.16b, v5.16b, v1.16b // AES final-2 block - result +Lenc_blocks_more_than_2: // blocks left > 2 + st1 { v5.16b}, [x2], #16 // AES final-2 block - store result + ldp x6, x7, [x0], #16 // AES final-1 block - load input low & high + rev64 v4.16b, v5.16b // GHASH final-2 block + eor x6, x6, x13 // AES final-1 block - round N low + eor v4.16b, v4.16b, v8.16b // feed in partial tag + fmov d5, x6 // AES final-1 block - mov low + eor x7, x7, x14 // AES final-1 block - round N high + fmov v5.d[1], x7 // AES final-1 block - mov high + movi v8.8b, #0 // suppress further partial tag feed in + pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high + mov d22, v4.d[1] // GHASH final-2 block - mid + pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low + eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid + eor v5.16b, v5.16b, v2.16b // AES final-1 block - result + eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high + pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid + eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low + eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid +Lenc_blocks_more_than_1: // blocks left > 1 + st1 { v5.16b}, [x2], #16 // AES final-1 block - store result + rev64 v4.16b, v5.16b // GHASH final-1 block + ldp x6, x7, [x0], #16 // AES final block - load input low & high + eor v4.16b, v4.16b, v8.16b // feed in partial tag + movi v8.8b, #0 // suppress further partial tag feed in + eor x6, x6, x13 // AES final block - round N low + mov d22, v4.d[1] // GHASH final-1 block - mid + pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high + eor x7, x7, x14 // AES final block - round N high + eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid + eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high + ins v22.d[1], v22.d[0] // GHASH final-1 block - mid + fmov d5, x6 // AES final block - mov low + fmov v5.d[1], x7 // AES final block - mov high + pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid + pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low + eor v5.16b, v5.16b, v3.16b // AES final block - result + eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid + eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low +Lenc_blocks_less_than_1: // blocks left <= 1 + and x1, x1, #127 // bit_length %= 128 + mvn x13, xzr // rkN_l = 0xffffffffffffffff + sub x1, x1, #128 // bit_length -= 128 + neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128]) + ld1 { v18.16b}, [x2] // load existing bytes where the possibly partial last block is to be stored + mvn x14, xzr // rkN_h = 0xffffffffffffffff + and x1, x1, #127 // bit_length %= 128 + lsr x14, x14, x1 // rkN_h is mask for top 64b of last block + cmp x1, #64 + csel x6, x13, x14, lt + csel x7, x14, xzr, lt + fmov d0, x6 // ctr0b is mask for last block + fmov v0.d[1], x7 + and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits + rev64 v4.16b, v5.16b // GHASH final block + eor v4.16b, v4.16b, v8.16b // feed in partial tag + bif v5.16b, v18.16b, v0.16b // insert existing bytes in top end of result before storing + pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high + mov d8, v4.d[1] // GHASH final block - mid + rev w9, w12 + pmull v21.1q, v4.1d, v12.1d // GHASH final block - low + eor v9.16b, v9.16b, v20.16b // GHASH final block - high + eor v8.8b, v8.8b, v4.8b // GHASH final block - mid + pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid + eor v11.16b, v11.16b, v21.16b // GHASH final block - low + eor v10.16b, v10.16b, v8.16b // GHASH final block - mid + movi v8.8b, #0xc2 + eor v4.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + shl d8, d8, #56 // mod_constant + eor v10.16b, v10.16b, v4.16b // MODULO - karatsuba tidy up + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + str w9, [x16, #12] // store the updated counter + st1 { v5.16b}, [x2] // store all 16B + eor v11.16b, v11.16b, v9.16b // MODULO - fold into low + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + ldp x19, x20, [sp, #16] + ldp x21, x22, [sp, #32] + ldp x23, x24, [sp, #48] + ldp d8, d9, [sp, #64] + ldp d10, d11, [sp, #80] + ldp d12, d13, [sp, #96] + ldp d14, d15, [sp, #112] + ldp x29, x30, [sp], #128 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl _aes_gcm_dec_kernel +.private_extern _aes_gcm_dec_kernel + +.align 4 +_aes_gcm_dec_kernel: + AARCH64_SIGN_LINK_REGISTER + stp x29, x30, [sp, #-128]! + mov x29, sp + stp x19, x20, [sp, #16] + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #32] + stp x23, x24, [sp, #48] + stp d8, d9, [sp, #64] + stp d10, d11, [sp, #80] + stp d12, d13, [sp, #96] + stp d14, d15, [sp, #112] + ldr w17, [x8, #240] + add x19, x8, x17, lsl #4 // borrow input_l1 for last key + ldp x13, x14, [x19] // load round N keys + ldr q31, [x19, #-16] // load round N-1 keys + lsr x5, x1, #3 // byte_len + mov x15, x5 + ldp x10, x11, [x16] // ctr96_b64, ctr96_t32 + ldr q26, [x8, #128] // load rk8 + sub x5, x5, #1 // byte_len - 1 + ldr q25, [x8, #112] // load rk7 + and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + add x4, x0, x1, lsr #3 // end_input_ptr + ldr q24, [x8, #96] // load rk6 + lsr x12, x11, #32 + ldr q23, [x8, #80] // load rk5 + orr w11, w11, w11 + ldr q21, [x8, #48] // load rk3 + add x5, x5, x0 + rev w12, w12 // rev_ctr32 + add w12, w12, #1 // increment rev_ctr32 + fmov d3, x10 // CTR block 3 + rev w9, w12 // CTR block 1 + add w12, w12, #1 // CTR block 1 + fmov d1, x10 // CTR block 1 + orr x9, x11, x9, lsl #32 // CTR block 1 + ld1 { v0.16b}, [x16] // special case vector load initial counter so we can start first AES block as quickly as possible + fmov v1.d[1], x9 // CTR block 1 + rev w9, w12 // CTR block 2 + add w12, w12, #1 // CTR block 2 + fmov d2, x10 // CTR block 2 + orr x9, x11, x9, lsl #32 // CTR block 2 + fmov v2.d[1], x9 // CTR block 2 + rev w9, w12 // CTR block 3 + orr x9, x11, x9, lsl #32 // CTR block 3 + ldr q18, [x8, #0] // load rk0 + fmov v3.d[1], x9 // CTR block 3 + add w12, w12, #1 // CTR block 3 + ldr q22, [x8, #64] // load rk4 + ldr q19, [x8, #16] // load rk1 + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 0 - round 0 + ldr q14, [x3, #80] // load h3l | h3h + ext v14.16b, v14.16b, v14.16b, #8 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 3 - round 0 + ldr q15, [x3, #112] // load h4l | h4h + ext v15.16b, v15.16b, v15.16b, #8 + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 1 - round 0 + ldr q13, [x3, #64] // load h2l | h2h + ext v13.16b, v13.16b, v13.16b, #8 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 2 - round 0 + ldr q20, [x8, #32] // load rk2 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 0 - round 1 + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 1 - round 1 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 2 - round 1 + ldr q27, [x8, #144] // load rk9 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 3 - round 1 + ldr q30, [x8, #192] // load rk12 + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 0 - round 2 + ldr q12, [x3, #32] // load h1l | h1h + ext v12.16b, v12.16b, v12.16b, #8 + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 2 - round 2 + ldr q28, [x8, #160] // load rk10 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 3 - round 2 + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 0 - round 3 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 1 - round 2 + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 3 - round 3 + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 0 - round 4 + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 2 - round 3 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 1 - round 3 + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 3 - round 4 + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 2 - round 4 + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 1 - round 4 + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 3 - round 5 + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 0 - round 5 + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 1 - round 5 + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 2 - round 5 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 0 - round 6 + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 3 - round 6 + cmp x17, #12 // setup flags for AES-128/192/256 check + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 1 - round 6 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 2 - round 6 + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 0 - round 7 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 1 - round 7 + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 3 - round 7 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 0 - round 8 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 2 - round 7 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 3 - round 8 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 1 - round 8 + ldr q29, [x8, #176] // load rk11 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 2 - round 8 + b.lt Ldec_finish_first_blocks // branch if AES-128 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 0 - round 9 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 1 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 3 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 2 - round 9 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 0 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 1 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 3 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 2 - round 10 + b.eq Ldec_finish_first_blocks // branch if AES-192 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 0 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 3 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 1 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 2 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 1 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 0 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 2 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 3 - round 12 + +Ldec_finish_first_blocks: + cmp x0, x5 // check if we have <= 4 blocks + trn1 v9.2d, v14.2d, v15.2d // h4h | h3h + trn2 v17.2d, v14.2d, v15.2d // h4l | h3l + trn1 v8.2d, v12.2d, v13.2d // h2h | h1h + trn2 v16.2d, v12.2d, v13.2d // h2l | h1l + eor v17.16b, v17.16b, v9.16b // h4k | h3k + aese v1.16b, v31.16b // AES block 1 - round N-1 + aese v2.16b, v31.16b // AES block 2 - round N-1 + eor v16.16b, v16.16b, v8.16b // h2k | h1k + aese v3.16b, v31.16b // AES block 3 - round N-1 + aese v0.16b, v31.16b // AES block 0 - round N-1 + b.ge Ldec_tail // handle tail + + ldr q4, [x0, #0] // AES block 0 - load ciphertext + ldr q5, [x0, #16] // AES block 1 - load ciphertext + rev w9, w12 // CTR block 4 + eor v0.16b, v4.16b, v0.16b // AES block 0 - result + eor v1.16b, v5.16b, v1.16b // AES block 1 - result + rev64 v5.16b, v5.16b // GHASH block 1 + ldr q7, [x0, #48] // AES block 3 - load ciphertext + mov x7, v0.d[1] // AES block 0 - mov high + mov x6, v0.d[0] // AES block 0 - mov low + rev64 v4.16b, v4.16b // GHASH block 0 + add w12, w12, #1 // CTR block 4 + fmov d0, x10 // CTR block 4 + orr x9, x11, x9, lsl #32 // CTR block 4 + fmov v0.d[1], x9 // CTR block 4 + rev w9, w12 // CTR block 5 + add w12, w12, #1 // CTR block 5 + mov x19, v1.d[0] // AES block 1 - mov low + orr x9, x11, x9, lsl #32 // CTR block 5 + mov x20, v1.d[1] // AES block 1 - mov high + eor x7, x7, x14 // AES block 0 - round N high + eor x6, x6, x13 // AES block 0 - round N low + stp x6, x7, [x2], #16 // AES block 0 - store result + fmov d1, x10 // CTR block 5 + ldr q6, [x0, #32] // AES block 2 - load ciphertext + add x0, x0, #64 // AES input_ptr update + fmov v1.d[1], x9 // CTR block 5 + rev w9, w12 // CTR block 6 + add w12, w12, #1 // CTR block 6 + eor x19, x19, x13 // AES block 1 - round N low + orr x9, x11, x9, lsl #32 // CTR block 6 + eor x20, x20, x14 // AES block 1 - round N high + stp x19, x20, [x2], #16 // AES block 1 - store result + eor v2.16b, v6.16b, v2.16b // AES block 2 - result + cmp x0, x5 // check if we have <= 8 blocks + b.ge Ldec_prepretail // do prepretail + +Ldec_main_loop: // main loop start + mov x21, v2.d[0] // AES block 4k+2 - mov low + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + eor v3.16b, v7.16b, v3.16b // AES block 4k+3 - result + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + mov x22, v2.d[1] // AES block 4k+2 - mov high + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + fmov d2, x10 // CTR block 4k+6 + fmov v2.d[1], x9 // CTR block 4k+6 + eor v4.16b, v4.16b, v11.16b // PRE 1 + rev w9, w12 // CTR block 4k+7 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + mov x24, v3.d[1] // AES block 4k+3 - mov high + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + mov x23, v3.d[0] // AES block 4k+3 - mov low + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + mov d8, v4.d[1] // GHASH block 4k - mid + fmov d3, x10 // CTR block 4k+7 + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + orr x9, x11, x9, lsl #32 // CTR block 4k+7 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + fmov v3.d[1], x9 // CTR block 4k+7 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + eor x22, x22, x14 // AES block 4k+2 - round N high + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + mov d10, v17.d[1] // GHASH block 4k - mid + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + rev64 v6.16b, v6.16b // GHASH block 4k+2 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + eor x21, x21, x13 // AES block 4k+2 - round N low + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + stp x21, x22, [x2], #16 // AES block 4k+2 - store result + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + rev64 v7.16b, v7.16b // GHASH block 4k+3 + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + eor x23, x23, x13 // AES block 4k+3 - round N low + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + eor x24, x24, x14 // AES block 4k+3 - round N high + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + add w12, w12, #1 // CTR block 4k+7 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + rev w9, w12 // CTR block 4k+8 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + add w12, w12, #1 // CTR block 4k+8 + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + mov d6, v7.d[1] // GHASH block 4k+3 - mid + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + pmull v4.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + orr x9, x11, x9, lsl #32 // CTR block 4k+8 + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + cmp x17, #12 // setup flags for AES-128/192/256 check + eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid + movi v8.8b, #0xc2 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor v11.16b, v11.16b, v4.16b // GHASH block 4k+3 - low + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + shl d8, d8, #56 // mod_constant + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + eor v10.16b, v10.16b, v6.16b // GHASH block 4k+3 - mid + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + b.lt Ldec_main_loop_continue // branch if AES-128 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + b.eq Ldec_main_loop_continue // branch if AES-192 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + +Ldec_main_loop_continue: + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + ldr q4, [x0, #0] // AES block 4k+4 - load ciphertext + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up + ldr q5, [x0, #16] // AES block 4k+5 - load ciphertext + eor v0.16b, v4.16b, v0.16b // AES block 4k+4 - result + stp x23, x24, [x2], #16 // AES block 4k+3 - store result + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + ldr q7, [x0, #48] // AES block 4k+7 - load ciphertext + ldr q6, [x0, #32] // AES block 4k+6 - load ciphertext + mov x7, v0.d[1] // AES block 4k+4 - mov high + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + add x0, x0, #64 // AES input_ptr update + mov x6, v0.d[0] // AES block 4k+4 - mov low + fmov d0, x10 // CTR block 4k+8 + fmov v0.d[1], x9 // CTR block 4k+8 + pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + eor v1.16b, v5.16b, v1.16b // AES block 4k+5 - result + rev w9, w12 // CTR block 4k+9 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + orr x9, x11, x9, lsl #32 // CTR block 4k+9 + cmp x0, x5 // LOOP CONTROL + add w12, w12, #1 // CTR block 4k+9 + eor x6, x6, x13 // AES block 4k+4 - round N low + eor x7, x7, x14 // AES block 4k+4 - round N high + mov x20, v1.d[1] // AES block 4k+5 - mov high + eor v2.16b, v6.16b, v2.16b // AES block 4k+6 - result + eor v11.16b, v11.16b, v8.16b // MODULO - fold into low + mov x19, v1.d[0] // AES block 4k+5 - mov low + fmov d1, x10 // CTR block 4k+9 + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + fmov v1.d[1], x9 // CTR block 4k+9 + rev w9, w12 // CTR block 4k+10 + add w12, w12, #1 // CTR block 4k+10 + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + orr x9, x11, x9, lsl #32 // CTR block 4k+10 + rev64 v5.16b, v5.16b // GHASH block 4k+5 + eor x20, x20, x14 // AES block 4k+5 - round N high + stp x6, x7, [x2], #16 // AES block 4k+4 - store result + eor x19, x19, x13 // AES block 4k+5 - round N low + stp x19, x20, [x2], #16 // AES block 4k+5 - store result + rev64 v4.16b, v4.16b // GHASH block 4k+4 + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + b.lt Ldec_main_loop + +Ldec_prepretail: // PREPRETAIL + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + mov x21, v2.d[0] // AES block 4k+2 - mov low + eor v3.16b, v7.16b, v3.16b // AES block 4k+3 - result + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + mov x22, v2.d[1] // AES block 4k+2 - mov high + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + fmov d2, x10 // CTR block 4k+6 + fmov v2.d[1], x9 // CTR block 4k+6 + rev w9, w12 // CTR block 4k+7 + eor v4.16b, v4.16b, v11.16b // PRE 1 + rev64 v6.16b, v6.16b // GHASH block 4k+2 + orr x9, x11, x9, lsl #32 // CTR block 4k+7 + mov x23, v3.d[0] // AES block 4k+3 - mov low + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + mov x24, v3.d[1] // AES block 4k+3 - mov high + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + mov d8, v4.d[1] // GHASH block 4k - mid + fmov d3, x10 // CTR block 4k+7 + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + fmov v3.d[1], x9 // CTR block 4k+7 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + mov d10, v17.d[1] // GHASH block 4k - mid + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + rev64 v7.16b, v7.16b // GHASH block 4k+3 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + pmull v4.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + mov d6, v7.d[1] // GHASH block 4k+3 - mid + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + movi v8.8b, #0xc2 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + eor v11.16b, v11.16b, v4.16b // GHASH block 4k+3 - low + pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + cmp x17, #12 // setup flags for AES-128/192/256 check + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + eor v10.16b, v10.16b, v6.16b // GHASH block 4k+3 - mid + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + shl d8, d8, #56 // mod_constant + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + b.lt Ldec_finish_prepretail // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + b.eq Ldec_finish_prepretail // branch if AES-192 + + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + +Ldec_finish_prepretail: + eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + eor x22, x22, x14 // AES block 4k+2 - round N high + eor x23, x23, x13 // AES block 4k+3 - round N low + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + add w12, w12, #1 // CTR block 4k+7 + eor x21, x21, x13 // AES block 4k+2 - round N low + pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + eor x24, x24, x14 // AES block 4k+3 - round N high + stp x21, x22, [x2], #16 // AES block 4k+2 - store result + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + stp x23, x24, [x2], #16 // AES block 4k+3 - store result + + eor v11.16b, v11.16b, v8.16b // MODULO - fold into low + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + +Ldec_tail: // TAIL + sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process + ld1 { v5.16b}, [x0], #16 // AES block 4k+4 - load ciphertext + eor v0.16b, v5.16b, v0.16b // AES block 4k+4 - result + mov x6, v0.d[0] // AES block 4k+4 - mov low + mov x7, v0.d[1] // AES block 4k+4 - mov high + ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag + cmp x5, #48 + eor x6, x6, x13 // AES block 4k+4 - round N low + eor x7, x7, x14 // AES block 4k+4 - round N high + b.gt Ldec_blocks_more_than_3 + sub w12, w12, #1 + mov v3.16b, v2.16b + movi v10.8b, #0 + movi v11.8b, #0 + cmp x5, #32 + movi v9.8b, #0 + mov v2.16b, v1.16b + b.gt Ldec_blocks_more_than_2 + sub w12, w12, #1 + mov v3.16b, v1.16b + cmp x5, #16 + b.gt Ldec_blocks_more_than_1 + sub w12, w12, #1 + b Ldec_blocks_less_than_1 +Ldec_blocks_more_than_3: // blocks left > 3 + rev64 v4.16b, v5.16b // GHASH final-3 block + ld1 { v5.16b}, [x0], #16 // AES final-2 block - load ciphertext + stp x6, x7, [x2], #16 // AES final-3 block - store result + mov d10, v17.d[1] // GHASH final-3 block - mid + eor v4.16b, v4.16b, v8.16b // feed in partial tag + eor v0.16b, v5.16b, v1.16b // AES final-2 block - result + mov d22, v4.d[1] // GHASH final-3 block - mid + mov x6, v0.d[0] // AES final-2 block - mov low + mov x7, v0.d[1] // AES final-2 block - mov high + eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid + movi v8.8b, #0 // suppress further partial tag feed in + pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high + pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid + eor x6, x6, x13 // AES final-2 block - round N low + pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low + eor x7, x7, x14 // AES final-2 block - round N high +Ldec_blocks_more_than_2: // blocks left > 2 + rev64 v4.16b, v5.16b // GHASH final-2 block + ld1 { v5.16b}, [x0], #16 // AES final-1 block - load ciphertext + eor v4.16b, v4.16b, v8.16b // feed in partial tag + stp x6, x7, [x2], #16 // AES final-2 block - store result + eor v0.16b, v5.16b, v2.16b // AES final-1 block - result + mov d22, v4.d[1] // GHASH final-2 block - mid + pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low + pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high + eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid + mov x6, v0.d[0] // AES final-1 block - mov low + mov x7, v0.d[1] // AES final-1 block - mov high + eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low + movi v8.8b, #0 // suppress further partial tag feed in + pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid + eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high + eor x6, x6, x13 // AES final-1 block - round N low + eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid + eor x7, x7, x14 // AES final-1 block - round N high +Ldec_blocks_more_than_1: // blocks left > 1 + stp x6, x7, [x2], #16 // AES final-1 block - store result + rev64 v4.16b, v5.16b // GHASH final-1 block + ld1 { v5.16b}, [x0], #16 // AES final block - load ciphertext + eor v4.16b, v4.16b, v8.16b // feed in partial tag + movi v8.8b, #0 // suppress further partial tag feed in + mov d22, v4.d[1] // GHASH final-1 block - mid + eor v0.16b, v5.16b, v3.16b // AES final block - result + pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high + eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid + pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low + mov x6, v0.d[0] // AES final block - mov low + ins v22.d[1], v22.d[0] // GHASH final-1 block - mid + mov x7, v0.d[1] // AES final block - mov high + pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid + eor x6, x6, x13 // AES final block - round N low + eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low + eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high + eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid + eor x7, x7, x14 // AES final block - round N high +Ldec_blocks_less_than_1: // blocks left <= 1 + and x1, x1, #127 // bit_length %= 128 + mvn x14, xzr // rkN_h = 0xffffffffffffffff + sub x1, x1, #128 // bit_length -= 128 + mvn x13, xzr // rkN_l = 0xffffffffffffffff + ldp x4, x5, [x2] // load existing bytes we need to not overwrite + neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128]) + and x1, x1, #127 // bit_length %= 128 + lsr x14, x14, x1 // rkN_h is mask for top 64b of last block + cmp x1, #64 + csel x9, x13, x14, lt + csel x10, x14, xzr, lt + fmov d0, x9 // ctr0b is mask for last block + and x6, x6, x9 + mov v0.d[1], x10 + bic x4, x4, x9 // mask out low existing bytes + rev w9, w12 + bic x5, x5, x10 // mask out high existing bytes + orr x6, x6, x4 + and x7, x7, x10 + orr x7, x7, x5 + and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits + rev64 v4.16b, v5.16b // GHASH final block + eor v4.16b, v4.16b, v8.16b // feed in partial tag + pmull v21.1q, v4.1d, v12.1d // GHASH final block - low + mov d8, v4.d[1] // GHASH final block - mid + eor v8.8b, v8.8b, v4.8b // GHASH final block - mid + pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high + pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid + eor v9.16b, v9.16b, v20.16b // GHASH final block - high + eor v11.16b, v11.16b, v21.16b // GHASH final block - low + eor v10.16b, v10.16b, v8.16b // GHASH final block - mid + movi v8.8b, #0xc2 + eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + shl d8, d8, #56 // mod_constant + eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + eor v11.16b, v11.16b, v8.16b // MODULO - fold into low + stp x6, x7, [x2] + str w9, [x16, #12] // store the updated counter + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + ldp x19, x20, [sp, #16] + ldp x21, x22, [sp, #32] + ldp x23, x24, [sp, #48] + ldp d8, d9, [sp, #64] + ldp d10, d11, [sp, #80] + ldp d12, d13, [sp, #96] + ldp d14, d15, [sp, #112] + ldp x29, x30, [sp], #128 + AARCH64_VALIDATE_LINK_REGISTER + ret + +#endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/armv8-mont.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/armv8-mont-apple.S similarity index 99% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/armv8-mont.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/armv8-mont-apple.S index 2493ae08a65e..9f1b81053089 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/armv8-mont.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/armv8-mont-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1430,4 +1430,8 @@ Lmul4x_done: .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 4 -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/bn-armv8-apple.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/bn-armv8-apple.S new file mode 100644 index 000000000000..9334ed426c59 --- /dev/null +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/bn-armv8-apple.S @@ -0,0 +1,101 @@ +// This file is generated from a similarly-named Perl script in the BoringSSL +// source tree. Do not edit by hand. + +#if !defined(__has_feature) +#define __has_feature(x) 0 +#endif +#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) +#define OPENSSL_NO_ASM +#endif + +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(BORINGSSL_PREFIX) +#include +#endif +#include + +.text + +// BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, +// size_t num); + +.globl _bn_add_words +.private_extern _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 x3 = 2 * x8 + x3. This allows loop + # operations to use CBNZ without clobbering the carry flag. + lsr x8, x3, #1 + and x3, x3, #1 + + cbz x8, Ladd_tail +Ladd_loop: + ldp x4, x5, [x1], #16 + ldp x6, x7, [x2], #16 + sub x8, x8, #1 + adcs x4, x4, x6 + adcs x5, x5, x7 + stp x4, x5, [x0], #16 + cbnz x8, Ladd_loop + +Ladd_tail: + cbz x3, Ladd_exit + ldr x4, [x1], #8 + ldr x6, [x2], #8 + adcs x4, x4, x6 + str x4, [x0], #8 + +Ladd_exit: + cset x0, cs + ret + + +// BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, +// size_t num); + +.globl _bn_sub_words +.private_extern _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 x3 = 2 * x8 + x3. This allows loop + # operations to use CBNZ without clobbering the carry flag. + lsr x8, x3, #1 + and x3, x3, #1 + + cbz x8, Lsub_tail +Lsub_loop: + ldp x4, x5, [x1], #16 + ldp x6, x7, [x2], #16 + sub x8, x8, #1 + sbcs x4, x4, x6 + sbcs x5, x5, x7 + stp x4, x5, [x0], #16 + cbnz x8, Lsub_loop + +Lsub_tail: + cbz x3, Lsub_exit + ldr x4, [x1], #8 + ldr x6, [x2], #8 + sbcs x4, x4, x6 + str x4, [x0], #8 + +Lsub_exit: + cset x0, cc + ret + +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghash-neon-armv8.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghash-neon-armv8-apple.S similarity index 97% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghash-neon-armv8.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghash-neon-armv8-apple.S index 5441afc06e24..d4cc16f789c5 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghash-neon-armv8.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghash-neon-armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -340,4 +340,8 @@ Lmasks: .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,100,101,114,105,118,101,100,32,102,114,111,109,32,65,82,77,118,52,32,118,101,114,115,105,111,110,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghashv8-armv8-apple.S similarity index 98% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghashv8-armv8-apple.S index 0ba0cdd16fe2..829c1e17be28 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghashv8-armx64.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/ghashv8-armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -570,4 +570,8 @@ Ldone4x: .align 2 .align 2 #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256-armv8-asm-apple.S similarity index 96% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256-armv8-asm-apple.S index 7a5202dd92f0..b18602f9c10a 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256-armv8-asm.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256-armv8-asm-apple.S @@ -8,13 +8,13 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif #include "openssl/arm_arch.h" -.text +.section __TEXT,__const .align 5 Lpoly: .quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 @@ -30,6 +30,7 @@ LordK: .quad 0xccd1c8aaee00bc4f .byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 +.text // void ecp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); @@ -46,8 +47,10 @@ _ecp_nistz256_mul_mont: ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_mul_mont @@ -70,8 +73,10 @@ _ecp_nistz256_sqr_mont: ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sqr_mont @@ -93,8 +98,10 @@ _ecp_nistz256_div_by_2: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_div_by_2 @@ -115,8 +122,10 @@ _ecp_nistz256_mul_by_2: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] + ldr x13,[x13,#24] mov x8,x14 mov x9,x15 mov x10,x16 @@ -141,8 +150,10 @@ _ecp_nistz256_mul_by_3: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] + ldr x13,[x13,#24] mov x8,x14 mov x9,x15 mov x10,x16 @@ -179,8 +190,10 @@ _ecp_nistz256_sub: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sub_from @@ -204,8 +217,10 @@ _ecp_nistz256_neg: mov x15,xzr mov x16,xzr mov x17,xzr - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sub_from @@ -601,9 +616,11 @@ Ldouble_shortcut: mov x21,x0 ldp x16,x17,[x1,#48] mov x22,x1 - ldr x12,Lpoly+8 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] mov x8,x14 - ldr x13,Lpoly+24 + ldr x13,[x13,#24] mov x9,x15 ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont mov x10,x16 @@ -747,8 +764,10 @@ _ecp_nistz256_point_add: mov x21,x0 mov x22,x1 mov x23,x2 - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] + ldr x13,[x13,#24] orr x8,x4,x5 orr x10,x6,x7 orr x25,x8,x10 @@ -999,8 +1018,10 @@ _ecp_nistz256_point_add_affine: mov x21,x0 mov x22,x1 mov x23,x2 - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly@PAGE + add x13,x13,Lpoly@PAGEOFF + ldr x12,[x13,#8] + ldr x13,[x13,#24] ldp x4,x5,[x1,#64] // in1_z ldp x6,x7,[x1,#64+16] @@ -1146,7 +1167,8 @@ _ecp_nistz256_point_add_affine: ldp x10,x11,[x23,#0+48] stp x14,x15,[x21,#0] stp x16,x17,[x21,#0+16] - adr x23,Lone_mont-64 + adrp x23,Lone_mont@PAGE-64 + add x23,x23,Lone_mont@PAGEOFF-64 ldp x14,x15,[x22,#32] // in1 cmp x24,#0 // ~, remember? ldp x16,x17,[x22,#32+16] @@ -1205,7 +1227,8 @@ _ecp_nistz256_ord_mul_mont: stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr x23,Lord + adrp x23,Lord@PAGE + add x23,x23,Lord@PAGEOFF ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] @@ -1402,7 +1425,7 @@ _ecp_nistz256_ord_mul_mont: //////////////////////////////////////////////////////////////////////// // void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4], -// int rep); +// uint64_t rep); .globl _ecp_nistz256_ord_sqr_mont .private_extern _ecp_nistz256_ord_sqr_mont @@ -1416,7 +1439,8 @@ _ecp_nistz256_ord_sqr_mont: stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr x23,Lord + adrp x23,Lord@PAGE + add x23,x23,Lord@PAGEOFF ldp x4,x5,[x1] ldp x6,x7,[x1,#16] @@ -1707,4 +1731,8 @@ Lselect_w7_loop: ret -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-apple.S similarity index 96% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-apple.S index 317b813803f7..8214e11645ba 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -314,4 +314,8 @@ Lbeeu_finish: AARCH64_VALIDATE_LINK_REGISTER ret -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha1-armv8.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha1-armv8-apple.S similarity index 99% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha1-armv8.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha1-armv8-apple.S index 62ba800f2985..94c4fc586b35 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha1-armv8.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha1-armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1232,4 +1232,8 @@ Lconst: .byte 83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha256-armv8.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha256-armv8-apple.S similarity index 99% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha256-armv8.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha256-armv8-apple.S index b40b260fdeaa..f4a5283cfd9c 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha256-armv8.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha256-armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1209,4 +1209,8 @@ Loop_hw: ret #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha512-armv8.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha512-armv8-apple.S similarity index 99% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha512-armv8.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha512-armv8-apple.S index b2d366d7812e..d005b0d0932c 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha512-armv8.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/sha512-armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1611,4 +1611,8 @@ Loop_hw: ret #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/vpaes-armv8.S b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/vpaes-armv8-apple.S similarity index 99% rename from third_party/boringssl/apple-aarch64/crypto/fipsmodule/vpaes-armv8.S rename to third_party/boringssl/apple-aarch64/crypto/fipsmodule/vpaes-armv8-apple.S index 6dfc25d9570f..3beb563d1d54 100644 --- a/third_party/boringssl/apple-aarch64/crypto/fipsmodule/vpaes-armv8.S +++ b/third_party/boringssl/apple-aarch64/crypto/fipsmodule/vpaes-armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1229,4 +1229,8 @@ Lctr32_done: AARCH64_VALIDATE_LINK_REGISTER ret -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-aarch64/crypto/test/trampoline-armv8.S b/third_party/boringssl/apple-aarch64/crypto/test/trampoline-armv8-apple.S similarity index 98% rename from third_party/boringssl/apple-aarch64/crypto/test/trampoline-armv8.S rename to third_party/boringssl/apple-aarch64/crypto/test/trampoline-armv8-apple.S index 325da9b100ed..5e1b1ee13329 100644 --- a/third_party/boringssl/apple-aarch64/crypto/test/trampoline-armv8.S +++ b/third_party/boringssl/apple-aarch64/crypto/test/trampoline-armv8-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -755,4 +755,8 @@ _abi_test_clobber_v15_upper: fmov v15.d[1], xzr ret -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/chacha/chacha-armv4.S b/third_party/boringssl/apple-arm/crypto/chacha/chacha-armv4-apple.S similarity index 99% rename from third_party/boringssl/apple-arm/crypto/chacha/chacha-armv4.S rename to third_party/boringssl/apple-arm/crypto/chacha/chacha-armv4-apple.S index cadf2b623b97..c42b0d22080d 100644 --- a/third_party/boringssl/apple-arm/crypto/chacha/chacha-armv4.S +++ b/third_party/boringssl/apple-arm/crypto/chacha/chacha-armv4-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1495,4 +1495,8 @@ OPENSSL_armcap_P: .indirect_symbol _OPENSSL_armcap_P .long 0 #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/fipsmodule/aesv8-armx32.S b/third_party/boringssl/apple-arm/crypto/fipsmodule/aesv8-armv7-apple.S similarity index 98% rename from third_party/boringssl/apple-arm/crypto/fipsmodule/aesv8-armx32.S rename to third_party/boringssl/apple-arm/crypto/fipsmodule/aesv8-armv7-apple.S index 87b4b0aee19b..3695e57c2a0e 100644 --- a/third_party/boringssl/apple-arm/crypto/fipsmodule/aesv8-armx32.S +++ b/third_party/boringssl/apple-arm/crypto/fipsmodule/aesv8-armv7-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -806,4 +806,8 @@ Lctr32_done: ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,pc} #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/fipsmodule/armv4-mont.S b/third_party/boringssl/apple-arm/crypto/fipsmodule/armv4-mont-apple.S similarity index 98% rename from third_party/boringssl/apple-arm/crypto/fipsmodule/armv4-mont.S rename to third_party/boringssl/apple-arm/crypto/fipsmodule/armv4-mont-apple.S index e549d1f16305..a552fb57ca7b 100644 --- a/third_party/boringssl/apple-arm/crypto/fipsmodule/armv4-mont.S +++ b/third_party/boringssl/apple-arm/crypto/fipsmodule/armv4-mont-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -979,4 +979,8 @@ OPENSSL_armcap_P: .long 0 .private_extern _OPENSSL_armcap_P #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/fipsmodule/bsaes-armv7.S b/third_party/boringssl/apple-arm/crypto/fipsmodule/bsaes-armv7-apple.S similarity index 99% rename from third_party/boringssl/apple-arm/crypto/fipsmodule/bsaes-armv7.S rename to third_party/boringssl/apple-arm/crypto/fipsmodule/bsaes-armv7-apple.S index 8329a8c20294..a72b437b6ed3 100644 --- a/third_party/boringssl/apple-arm/crypto/fipsmodule/bsaes-armv7.S +++ b/third_party/boringssl/apple-arm/crypto/fipsmodule/bsaes-armv7-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1533,4 +1533,8 @@ Lctr_enc_bzero:@ wipe key schedule [if any] @ out to retain a constant-time implementation. #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/fipsmodule/ghash-armv4.S b/third_party/boringssl/apple-arm/crypto/fipsmodule/ghash-armv4-apple.S similarity index 96% rename from third_party/boringssl/apple-arm/crypto/fipsmodule/ghash-armv4.S rename to third_party/boringssl/apple-arm/crypto/fipsmodule/ghash-armv4-apple.S index 36f4ccebdfe8..762ada8f97bc 100644 --- a/third_party/boringssl/apple-arm/crypto/fipsmodule/ghash-armv4.S +++ b/third_party/boringssl/apple-arm/crypto/fipsmodule/ghash-armv4-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -255,4 +255,8 @@ Lgmult_neon: .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/fipsmodule/ghashv8-armx32.S b/third_party/boringssl/apple-arm/crypto/fipsmodule/ghashv8-armv7-apple.S similarity index 96% rename from third_party/boringssl/apple-arm/crypto/fipsmodule/ghashv8-armx32.S rename to third_party/boringssl/apple-arm/crypto/fipsmodule/ghashv8-armv7-apple.S index dcac580ece3f..36d8937c2b02 100644 --- a/third_party/boringssl/apple-arm/crypto/fipsmodule/ghashv8-armx32.S +++ b/third_party/boringssl/apple-arm/crypto/fipsmodule/ghashv8-armv7-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -257,4 +257,8 @@ Ldone_v8: .align 2 .align 2 #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/fipsmodule/sha1-armv4-large.S b/third_party/boringssl/apple-arm/crypto/fipsmodule/sha1-armv4-large-apple.S similarity index 99% rename from third_party/boringssl/apple-arm/crypto/fipsmodule/sha1-armv4-large.S rename to third_party/boringssl/apple-arm/crypto/fipsmodule/sha1-armv4-large-apple.S index 82ac8df4fc69..fc0a2627d289 100644 --- a/third_party/boringssl/apple-arm/crypto/fipsmodule/sha1-armv4-large.S +++ b/third_party/boringssl/apple-arm/crypto/fipsmodule/sha1-armv4-large-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1515,4 +1515,8 @@ OPENSSL_armcap_P: .long 0 .private_extern _OPENSSL_armcap_P #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/fipsmodule/sha256-armv4.S b/third_party/boringssl/apple-arm/crypto/fipsmodule/sha256-armv4-apple.S similarity index 99% rename from third_party/boringssl/apple-arm/crypto/fipsmodule/sha256-armv4.S rename to third_party/boringssl/apple-arm/crypto/fipsmodule/sha256-armv4-apple.S index 0cf36482d4c8..26e58cf72cf0 100644 --- a/third_party/boringssl/apple-arm/crypto/fipsmodule/sha256-armv4.S +++ b/third_party/boringssl/apple-arm/crypto/fipsmodule/sha256-armv4-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -2843,4 +2843,8 @@ OPENSSL_armcap_P: .long 0 .private_extern _OPENSSL_armcap_P #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/fipsmodule/sha512-armv4.S b/third_party/boringssl/apple-arm/crypto/fipsmodule/sha512-armv4-apple.S similarity index 99% rename from third_party/boringssl/apple-arm/crypto/fipsmodule/sha512-armv4.S rename to third_party/boringssl/apple-arm/crypto/fipsmodule/sha512-armv4-apple.S index 21913cb2ba20..95ff7743e3d1 100644 --- a/third_party/boringssl/apple-arm/crypto/fipsmodule/sha512-armv4.S +++ b/third_party/boringssl/apple-arm/crypto/fipsmodule/sha512-armv4-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1896,4 +1896,8 @@ OPENSSL_armcap_P: .long 0 .private_extern _OPENSSL_armcap_P #endif -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/fipsmodule/vpaes-armv7.S b/third_party/boringssl/apple-arm/crypto/fipsmodule/vpaes-armv7-apple.S similarity index 99% rename from third_party/boringssl/apple-arm/crypto/fipsmodule/vpaes-armv7.S rename to third_party/boringssl/apple-arm/crypto/fipsmodule/vpaes-armv7-apple.S index 6aead7cac2ac..31690229aa49 100644 --- a/third_party/boringssl/apple-arm/crypto/fipsmodule/vpaes-armv7.S +++ b/third_party/boringssl/apple-arm/crypto/fipsmodule/vpaes-armv7-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1262,4 +1262,8 @@ Lctr32_done: vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15} ldmia sp!, {r7,r8,r9,r10,r11, pc} @ return -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-arm/crypto/test/trampoline-armv4.S b/third_party/boringssl/apple-arm/crypto/test/trampoline-armv4-apple.S similarity index 96% rename from third_party/boringssl/apple-arm/crypto/test/trampoline-armv4.S rename to third_party/boringssl/apple-arm/crypto/test/trampoline-armv4-apple.S index 9d74f553adfa..2516f66a603d 100644 --- a/third_party/boringssl/apple-arm/crypto/test/trampoline-armv4.S +++ b/third_party/boringssl/apple-arm/crypto/test/trampoline-armv4-apple.S @@ -8,7 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -373,4 +373,8 @@ _abi_test_clobber_d15: vmov s31, r0 bx lr -#endif // !OPENSSL_NO_ASM +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86/crypto/chacha/chacha-x86.S b/third_party/boringssl/apple-x86/crypto/chacha/chacha-x86-apple.S similarity index 98% rename from third_party/boringssl/apple-x86/crypto/chacha/chacha-x86.S rename to third_party/boringssl/apple-x86/crypto/chacha/chacha-x86-apple.S index ef535b219c1f..8d0de1dbba96 100644 --- a/third_party/boringssl/apple-x86/crypto/chacha/chacha-x86.S +++ b/third_party/boringssl/apple-x86/crypto/chacha/chacha-x86-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -971,4 +977,8 @@ Lssse3_data: L_OPENSSL_ia32cap_P$non_lazy_ptr: .indirect_symbol _OPENSSL_ia32cap_P .long 0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/aesni-x86.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/aesni-x86-apple.S similarity index 99% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/aesni-x86.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/aesni-x86-apple.S index 00f6003d22f2..8a55e3fd2a15 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/aesni-x86.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/aesni-x86-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -2473,4 +2479,8 @@ Lkey_const: L_OPENSSL_ia32cap_P$non_lazy_ptr: .indirect_symbol _OPENSSL_ia32cap_P .long 0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/bn-586.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/bn-586-apple.S similarity index 97% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/bn-586.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/bn-586-apple.S index ede2e76de424..a169595a460e 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/bn-586.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/bn-586-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -985,4 +991,8 @@ L028aw_end: L_OPENSSL_ia32cap_P$non_lazy_ptr: .indirect_symbol _OPENSSL_ia32cap_P .long 0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/co-586.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/co-586-apple.S similarity index 98% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/co-586.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/co-586-apple.S index 015dffaa8c95..0d4554c27063 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/co-586.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/co-586-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1254,4 +1260,8 @@ L_bn_sqr_comba4_begin: popl %edi popl %esi ret +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-ssse3-x86.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-ssse3-x86-apple.S similarity index 93% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-ssse3-x86.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-ssse3-x86-apple.S index 8656679034f6..9d3bac5cd9d5 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-ssse3-x86.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-ssse3-x86-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -286,4 +292,8 @@ Lreverse_bytes: .align 4,0x90 Llow4_mask: .long 252645135,252645135,252645135,252645135 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-x86.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-x86-apple.S similarity index 94% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-x86.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-x86-apple.S index c1e0d5399f42..e39452fa5e41 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-x86.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/ghash-x86-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -320,4 +326,8 @@ Lbswap: .byte 82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112 .byte 112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62 .byte 0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/md5-586.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/md5-586-apple.S similarity index 96% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/md5-586.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/md5-586-apple.S index f4c4b50cf6e0..7ff200e03213 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/md5-586.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/md5-586-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -682,4 +688,8 @@ L000start: popl %edi popl %esi ret +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/sha1-586.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/sha1-586-apple.S similarity index 99% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/sha1-586.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/sha1-586-apple.S index 3213a621a49e..8951d0c60d21 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/sha1-586.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/sha1-586-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -3802,4 +3808,8 @@ LK_XX_XX: L_OPENSSL_ia32cap_P$non_lazy_ptr: .indirect_symbol _OPENSSL_ia32cap_P .long 0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/sha256-586.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/sha256-586-apple.S similarity index 99% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/sha256-586.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/sha256-586-apple.S index c81cb9afac7d..b9afaf0047bd 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/sha256-586.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/sha256-586-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -5565,4 +5571,8 @@ L013avx_00_47: L_OPENSSL_ia32cap_P$non_lazy_ptr: .indirect_symbol _OPENSSL_ia32cap_P .long 0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/sha512-586.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/sha512-586-apple.S similarity index 99% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/sha512-586.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/sha512-586-apple.S index 8c33cf595172..b3a53f3aa09c 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/sha512-586.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/sha512-586-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -2835,4 +2841,8 @@ L001K512: L_OPENSSL_ia32cap_P$non_lazy_ptr: .indirect_symbol _OPENSSL_ia32cap_P .long 0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/vpaes-x86.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/vpaes-x86-apple.S similarity index 97% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/vpaes-x86.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/vpaes-x86-apple.S index 00c0190d5e31..476529a1b891 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/vpaes-x86.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/vpaes-x86-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -678,4 +684,8 @@ L022cbc_abort: popl %ebx popl %ebp ret +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/fipsmodule/x86-mont.S b/third_party/boringssl/apple-x86/crypto/fipsmodule/x86-mont-apple.S similarity index 95% rename from third_party/boringssl/apple-x86/crypto/fipsmodule/x86-mont.S rename to third_party/boringssl/apple-x86/crypto/fipsmodule/x86-mont-apple.S index 7850a37a6cb9..a977cec23b39 100644 --- a/third_party/boringssl/apple-x86/crypto/fipsmodule/x86-mont.S +++ b/third_party/boringssl/apple-x86/crypto/fipsmodule/x86-mont-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -482,4 +488,8 @@ L000just_leave: L_OPENSSL_ia32cap_P$non_lazy_ptr: .indirect_symbol _OPENSSL_ia32cap_P .long 0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86/crypto/test/trampoline-x86.S b/third_party/boringssl/apple-x86/crypto/test/trampoline-x86-apple.S similarity index 90% rename from third_party/boringssl/apple-x86/crypto/test/trampoline-x86.S rename to third_party/boringssl/apple-x86/crypto/test/trampoline-x86-apple.S index fd40b95721fb..17d84feb4fd9 100644 --- a/third_party/boringssl/apple-x86/crypto/test/trampoline-x86.S +++ b/third_party/boringssl/apple-x86/crypto/test/trampoline-x86-apple.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -166,4 +172,8 @@ _abi_test_clobber_xmm7: L_abi_test_clobber_xmm7_begin: pxor %xmm7,%xmm7 ret +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__APPLE__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/chacha/chacha-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/chacha/chacha-x86_64-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/chacha/chacha-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/chacha/chacha-x86_64-apple.S index 782ddf4b2849..583c4e37673e 100644 --- a/third_party/boringssl/apple-x86_64/crypto/chacha/chacha-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/chacha/chacha-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -15,6 +15,7 @@ +.section __DATA,__const .p2align 6 L$zero: .long 0,0,0,0 @@ -44,6 +45,7 @@ L$incz: L$sixteen: .long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 .byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.text .globl _ChaCha20_ctr32 .private_extern _ChaCha20_ctr32 @@ -1623,3 +1625,7 @@ L$8x_epilogue: #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-apple.S index f988089d8b12..cd6d6a79e111 100644 --- a/third_party/boringssl/apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-apple.S @@ -7,11 +7,11 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif -.data +.section __DATA,__const .p2align 4 one: @@ -3066,3 +3066,7 @@ _aes256gcmsiv_kdf: #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S b/third_party/boringssl/apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-apple.S index 6813510c2948..5f04f7fdf607 100644 --- a/third_party/boringssl/apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -16,6 +16,7 @@ chacha20_poly1305_constants: +.section __DATA,__const .p2align 6 L$chacha20_consts: .byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' @@ -53,6 +54,7 @@ L$and_masks: .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 .p2align 6 @@ -8876,3 +8878,7 @@ L$seal_avx2_exit: #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-apple.S similarity index 96% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-apple.S index e497c35f4966..d04102e0101f 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -221,7 +221,7 @@ L$resume_ctr32: movbeq 0(%r14),%r12 vaesenc %xmm1,%xmm14,%xmm14 vmovups 160-128(%rcx),%xmm1 - cmpl $11,%ebp + cmpl $11,%r10d jb L$enc_tail vaesenc %xmm15,%xmm9,%xmm9 @@ -305,6 +305,9 @@ L$enc_tail: vpaddb %xmm2,%xmm1,%xmm0 movq %r13,112+8(%rsp) leaq 96(%rdi),%rdi + + prefetcht0 512(%rdi) + prefetcht0 576(%rdi) vaesenclast %xmm5,%xmm11,%xmm11 vpaddb %xmm2,%xmm0,%xmm5 movq %r12,120+8(%rsp) @@ -317,7 +320,7 @@ L$enc_tail: vaesenclast %xmm3,%xmm14,%xmm14 vpaddb %xmm2,%xmm7,%xmm3 - addq $0x60,%r10 + addq $0x60,%rax subq $0x6,%rdx jc L$6x_done @@ -349,27 +352,34 @@ L$6x_done: .p2align 5 _aesni_gcm_decrypt: - xorq %r10,%r10 + + xorq %rax,%rax cmpq $0x60,%rdx jb L$gcm_dec_abort - leaq (%rsp),%rax + pushq %rbp + + + movq %rsp,%rbp pushq %rbx - pushq %rbp pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + vzeroupper vmovdqu (%r8),%xmm1 @@ -383,7 +393,7 @@ _aesni_gcm_decrypt: vmovdqu (%r11),%xmm0 leaq 128(%rcx),%rcx leaq 32+32(%r9),%r9 - movl 240-128(%rcx),%ebp + movl 240-128(%rcx),%r10d vpshufb %xmm0,%xmm8,%xmm8 andq %r15,%r14 @@ -396,7 +406,7 @@ _aesni_gcm_decrypt: L$dec_no_key_aliasing: vmovdqu 80(%rdi),%xmm7 - leaq (%rdi),%r14 + movq %rdi,%r14 vmovdqu 64(%rdi),%xmm4 @@ -409,7 +419,7 @@ L$dec_no_key_aliasing: vmovdqu 48(%rdi),%xmm5 shrq $4,%rdx - xorq %r10,%r10 + xorq %rax,%rax vmovdqu 32(%rdi),%xmm6 vpshufb %xmm0,%xmm7,%xmm7 vmovdqu 16(%rdi),%xmm2 @@ -438,32 +448,32 @@ L$dec_no_key_aliasing: vmovdqu %xmm8,-64(%r9) vzeroupper - movq -48(%rax),%r15 + leaq -40(%rbp),%rsp - movq -40(%rax),%r14 + popq %r15 - movq -32(%rax),%r13 + popq %r14 - movq -24(%rax),%r12 + popq %r13 - movq -16(%rax),%rbp + popq %r12 - movq -8(%rax),%rbx + popq %rbx - leaq (%rax),%rsp + popq %rbp L$gcm_dec_abort: - movq %r10,%rax .byte 0xf3,0xc3 + .p2align 5 _aesni_ctr32_6x: vmovdqu 0-128(%rcx),%xmm4 vmovdqu 32(%r11),%xmm2 - leaq -1(%rbp),%r13 + leaq -1(%r10),%r13 vmovups 16-128(%rcx),%xmm15 leaq 32-128(%rcx),%r12 vpxor %xmm4,%xmm1,%xmm9 @@ -556,11 +566,12 @@ L$handle_ctr32_2: .p2align 5 _aesni_gcm_encrypt: + #ifdef BORINGSSL_DISPATCH_TEST movb $1,_BORINGSSL_function_hit+2(%rip) #endif - xorq %r10,%r10 + xorq %rax,%rax @@ -568,20 +579,26 @@ _aesni_gcm_encrypt: cmpq $288,%rdx jb L$gcm_enc_abort - leaq (%rsp),%rax + pushq %rbp + + + movq %rsp,%rbp pushq %rbx - pushq %rbp pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + vzeroupper vmovdqu (%r8),%xmm1 @@ -593,7 +610,7 @@ _aesni_gcm_encrypt: leaq 128(%rcx),%rcx vmovdqu (%r11),%xmm0 andq $-128,%rsp - movl 240-128(%rcx),%ebp + movl 240-128(%rcx),%r10d andq %r15,%r14 andq %rsp,%r15 @@ -604,7 +621,7 @@ _aesni_gcm_encrypt: subq %r15,%rsp L$enc_no_key_aliasing: - leaq (%rsi),%r14 + movq %rsi,%r14 @@ -635,7 +652,7 @@ L$enc_no_key_aliasing: vmovdqu (%r9),%xmm8 leaq 32+32(%r9),%r9 subq $12,%rdx - movq $192,%r10 + movq $192,%rax vpshufb %xmm0,%xmm8,%xmm8 call _aesni_ctr32_ghash_6x @@ -815,25 +832,26 @@ L$enc_no_key_aliasing: vmovdqu %xmm8,-64(%r9) vzeroupper - movq -48(%rax),%r15 + leaq -40(%rbp),%rsp - movq -40(%rax),%r14 + popq %r15 - movq -32(%rax),%r13 + popq %r14 - movq -24(%rax),%r12 + popq %r13 - movq -16(%rax),%rbp + popq %r12 - movq -8(%rax),%rbx + popq %rbx - leaq (%rax),%rsp + popq %rbp L$gcm_enc_abort: - movq %r10,%rax .byte 0xf3,0xc3 + +.section __DATA,__const .p2align 6 L$bswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -847,4 +865,9 @@ L$one_lsb: .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-x86_64-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-x86_64-apple.S index 7633880e888d..60fd58c01526 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/aesni-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -2478,6 +2478,7 @@ L$key_expansion_256b: .byte 0xf3,0xc3 +.section __DATA,__const .p2align 6 L$bswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -2500,4 +2501,9 @@ L$key_rcon1b: .byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69,83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-apple.S similarity index 95% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-apple.S index 7f92fc51b003..d305be63caa9 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -23,7 +23,7 @@ .p2align 4 _gcm_gmult_ssse3: -L$gmult_seh_begin: + movdqu (%rdi),%xmm0 movdqa L$reverse_bytes(%rip),%xmm10 movdqa L$low4_mask(%rip),%xmm2 @@ -199,7 +199,7 @@ L$oop_row_3: pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 .byte 0xf3,0xc3 -L$gmult_seh_end: + @@ -212,7 +212,7 @@ L$gmult_seh_end: .private_extern _gcm_ghash_ssse3 .p2align 4 _gcm_ghash_ssse3: -L$ghash_seh_begin: + movdqu (%rdi),%xmm0 movdqa L$reverse_bytes(%rip),%xmm10 @@ -411,10 +411,11 @@ L$oop_row_6: pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 .byte 0xf3,0xc3 -L$ghash_seh_end: + +.section __DATA,__const .p2align 4 @@ -423,4 +424,9 @@ L$reverse_bytes: L$low4_mask: .quad 0x0f0f0f0f0f0f0f0f, 0x0f0f0f0f0f0f0f0f +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-x86_64-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-x86_64-apple.S index fd767a055bb1..b26ad8429680 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/ghash-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -19,6 +19,7 @@ .p2align 4 _gcm_init_clmul: + L$_init_clmul: movdqu (%rsi),%xmm2 pshufd $78,%xmm2,%xmm2 @@ -172,6 +173,7 @@ L$_init_clmul: .byte 0xf3,0xc3 + .globl _gcm_gmult_clmul .private_extern _gcm_gmult_clmul @@ -232,6 +234,7 @@ L$_gmult_clmul: .p2align 5 _gcm_ghash_clmul: + L$_ghash_clmul: movdqa L$bswap_mask(%rip),%xmm10 @@ -613,6 +616,7 @@ L$done: .byte 0xf3,0xc3 + .globl _gcm_init_avx .private_extern _gcm_init_avx @@ -723,6 +727,7 @@ L$init_start_avx: .byte 0xf3,0xc3 + .globl _gcm_gmult_avx .private_extern _gcm_gmult_avx @@ -1111,6 +1116,8 @@ L$tail_no_xor_avx: .byte 0xf3,0xc3 + +.section __DATA,__const .p2align 6 L$bswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -1122,4 +1129,9 @@ L$7_mask: .byte 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/md5-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/md5-x86_64-apple.S similarity index 98% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/md5-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/md5-x86_64-apple.S index 06e3ba06b396..60afa5afbd3c 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/md5-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/md5-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -694,3 +694,7 @@ L$epilogue: #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256-x86_64-asm.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256-x86_64-asm-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256-x86_64-asm.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256-x86_64-asm-apple.S index 36057aa1f3e4..a766757bd845 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256-x86_64-asm.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256-x86_64-asm-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -15,6 +15,7 @@ +.section __DATA,__const .p2align 6 L$poly: .quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001 @@ -33,6 +34,7 @@ L$ord: .quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000 L$ordK: .quad 0xccd1c8aaee00bc4f +.text @@ -4465,3 +4467,7 @@ L$add_affinex_epilogue: #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-apple.S similarity index 95% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-apple.S index ae7293ac8972..3a71b3790a9a 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -325,4 +325,8 @@ L$beeu_finish: +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/rdrand-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/rdrand-x86_64-apple.S similarity index 82% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/rdrand-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/rdrand-x86_64-apple.S index 664c0674e585..08cd93fd4233 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/rdrand-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/rdrand-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -60,3 +60,7 @@ L$err: #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/rsaz-avx2.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/rsaz-avx2-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/rsaz-avx2.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/rsaz-avx2-apple.S index bebc699a154d..258b62431d45 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/rsaz-avx2.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/rsaz-avx2-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1733,6 +1733,7 @@ L$oop_gather_1024: L$SEH_end_rsaz_1024_gather5: +.section __DATA,__const .p2align 6 L$and_mask: .quad 0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff @@ -1745,4 +1746,9 @@ L$inc: .long 2,2,2,2, 3,3,3,3 .long 4,4,4,4, 4,4,4,4 .p2align 6 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha1-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha1-x86_64-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha1-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha1-x86_64-apple.S index d50851ed3aa8..2a6a6928720c 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha1-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha1-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1298,6 +1298,7 @@ L$oop_shaext: leaq 64(%rsi),%r8 paddd %xmm4,%xmm1 cmovneq %r8,%rsi + prefetcht0 512(%rsi) movdqa %xmm0,%xmm8 .byte 15,56,201,229 movdqa %xmm0,%xmm2 @@ -5448,6 +5449,7 @@ L$epilogue_avx2: .byte 0xf3,0xc3 +.section __DATA,__const .p2align 6 K_XX_XX: .long 0x5a827999,0x5a827999,0x5a827999,0x5a827999 @@ -5463,4 +5465,9 @@ K_XX_XX: .byte 0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0 .byte 83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha256-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha256-x86_64-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha256-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha256-x86_64-apple.S index 00dc01c99748..c17a8cd36eea 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha256-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha256-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1739,6 +1739,7 @@ L$epilogue: .byte 0xf3,0xc3 +.section __DATA,__const .p2align 6 K256: @@ -1782,6 +1783,7 @@ K256: .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.text .p2align 6 sha256_block_data_order_shaext: @@ -4180,3 +4182,7 @@ L$epilogue_avx: #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha512-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha512-x86_64-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha512-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha512-x86_64-apple.S index 5732f43916c1..f6d0e1974e8c 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha512-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/sha512-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1735,6 +1735,7 @@ L$epilogue: .byte 0xf3,0xc3 +.section __DATA,__const .p2align 6 K512: @@ -1822,6 +1823,7 @@ K512: .quad 0x0001020304050607,0x08090a0b0c0d0e0f .quad 0x0001020304050607,0x08090a0b0c0d0e0f .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.text .p2align 6 sha512_block_data_order_avx: @@ -2988,3 +2990,7 @@ L$epilogue_avx: #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/vpaes-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/vpaes-x86_64-apple.S similarity index 98% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/vpaes-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/vpaes-x86_64-apple.S index 31cf32904883..08df86a9ffd7 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/vpaes-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/vpaes-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1018,6 +1018,7 @@ _vpaes_preheat: +.section __DATA,__const .p2align 6 _vpaes_consts: L$k_inv: @@ -1127,4 +1128,9 @@ L$ctr_add_two: .byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54,52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 .p2align 6 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont-apple.S index d354b2d47f6a..c0c8a056ba45 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1254,3 +1254,7 @@ L$mulx4x_epilogue: .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 4 #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont5.S b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont5-apple.S similarity index 99% rename from third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont5.S rename to third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont5-apple.S index 3a1768f59aa6..1aa66fc19dc9 100644 --- a/third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont5.S +++ b/third_party/boringssl/apple-x86_64/crypto/fipsmodule/x86_64-mont5-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -206,6 +206,7 @@ L$mul_body: por %xmm2,%xmm0 por %xmm3,%xmm1 por %xmm1,%xmm0 + pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%r12),%r12 @@ -329,6 +330,7 @@ L$outer: por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 + pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%r12),%r12 @@ -697,6 +699,7 @@ mul4x_internal: por %xmm2,%xmm0 por %xmm3,%xmm1 por %xmm1,%xmm0 + pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%r12),%r12 @@ -904,6 +907,7 @@ L$outer4x: por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 + pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%r12),%r12 @@ -2320,6 +2324,7 @@ mulx4x_internal: por %xmm2,%xmm0 por %xmm3,%xmm1 pxor %xmm1,%xmm0 + pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%rdi),%rdi @@ -2470,6 +2475,7 @@ L$mulx4x_outer: por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 + pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%rdi),%rdi @@ -3418,6 +3424,15 @@ _bn_scatter5: cmpl $0,%esi jz L$scatter_epilogue + + + + + + + + + leaq (%rdx,%rcx,8),%rdx L$scatter: movq (%rdi),%rax @@ -3586,6 +3601,7 @@ L$gather: por %xmm3,%xmm5 por %xmm5,%xmm4 leaq 256(%r11),%r11 + pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 movq %xmm0,(%rdi) @@ -3599,9 +3615,15 @@ L$gather: L$SEH_end_bn_gather5: +.section __DATA,__const .p2align 6 L$inc: .long 0,0, 1,1 .long 2,2, 2,2 .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115,99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/apple-x86_64/crypto/test/trampoline-x86_64.S b/third_party/boringssl/apple-x86_64/crypto/test/trampoline-x86_64-apple.S similarity index 91% rename from third_party/boringssl/apple-x86_64/crypto/test/trampoline-x86_64.S rename to third_party/boringssl/apple-x86_64/crypto/test/trampoline-x86_64-apple.S index 5f20aa78d2f6..966ec0ae805c 100644 --- a/third_party/boringssl/apple-x86_64/crypto/test/trampoline-x86_64.S +++ b/third_party/boringssl/apple-x86_64/crypto/test/trampoline-x86_64-apple.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__APPLE__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -25,7 +25,7 @@ .private_extern _abi_test_trampoline .p2align 4 _abi_test_trampoline: -L$abi_test_trampoline_seh_begin: + @@ -38,27 +38,26 @@ L$abi_test_trampoline_seh_begin: subq $120,%rsp -L$abi_test_trampoline_seh_prolog_alloc: + movq %r8,48(%rsp) movq %rbx,64(%rsp) -L$abi_test_trampoline_seh_prolog_rbx: + movq %rbp,72(%rsp) -L$abi_test_trampoline_seh_prolog_rbp: + movq %r12,80(%rsp) -L$abi_test_trampoline_seh_prolog_r12: + movq %r13,88(%rsp) -L$abi_test_trampoline_seh_prolog_r13: + movq %r14,96(%rsp) -L$abi_test_trampoline_seh_prolog_r14: + movq %r15,104(%rsp) -L$abi_test_trampoline_seh_prolog_r15: -L$abi_test_trampoline_seh_prolog_end: + movq 0(%rsi),%rbx movq 8(%rsi),%rbp movq 16(%rsi),%r12 @@ -182,7 +181,7 @@ L$call_done: .byte 0xf3,0xc3 -L$abi_test_trampoline_seh_end: + .globl _abi_test_clobber_rax @@ -441,10 +440,10 @@ _abi_test_clobber_xmm15: .p2align 4 _abi_test_bad_unwind_wrong_register: -L$abi_test_bad_unwind_wrong_register_seh_begin: + pushq %r12 -L$abi_test_bad_unwind_wrong_register_seh_push_r13: + @@ -452,7 +451,7 @@ L$abi_test_bad_unwind_wrong_register_seh_push_r13: popq %r12 .byte 0xf3,0xc3 -L$abi_test_bad_unwind_wrong_register_seh_end: + @@ -465,10 +464,10 @@ L$abi_test_bad_unwind_wrong_register_seh_end: .p2align 4 _abi_test_bad_unwind_temporary: -L$abi_test_bad_unwind_temporary_seh_begin: + pushq %r12 -L$abi_test_bad_unwind_temporary_seh_push_r12: + movq %r12,%rax incq %rax @@ -482,7 +481,7 @@ L$abi_test_bad_unwind_temporary_seh_push_r12: popq %r12 .byte 0xf3,0xc3 -L$abi_test_bad_unwind_temporary_seh_end: + @@ -511,3 +510,7 @@ _abi_test_set_direction_flag: .byte 0xf3,0xc3 #endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/err_data.c b/third_party/boringssl/err_data.c index 7991be6f2f36..6a0e855e98f0 100644 --- a/third_party/boringssl/err_data.c +++ b/third_party/boringssl/err_data.c @@ -193,6 +193,7 @@ const uint32_t kOpenSSLReasonValues[] = { 0x283480b9, 0x283500f7, 0x28358cb7, + 0x2836099a, 0x2c3232bf, 0x2c329351, 0x2c3332cd, @@ -205,38 +206,39 @@ const uint32_t kOpenSSLReasonValues[] = { 0x2c36833a, 0x2c37336f, 0x2c37b39b, - 0x2c3833c0, - 0x2c38b3d7, - 0x2c3933f5, - 0x2c39b405, - 0x2c3a3417, - 0x2c3ab42b, - 0x2c3b343c, - 0x2c3bb45b, + 0x2c3833d9, + 0x2c38b3f0, + 0x2c39340e, + 0x2c39b41e, + 0x2c3a3430, + 0x2c3ab444, + 0x2c3b3455, + 0x2c3bb474, 0x2c3c1363, 0x2c3c9379, - 0x2c3d34a0, + 0x2c3d34b9, 0x2c3d9392, - 0x2c3e34ca, - 0x2c3eb4d8, - 0x2c3f34f0, - 0x2c3fb508, - 0x2c403532, + 0x2c3e34e3, + 0x2c3eb4f1, + 0x2c3f3509, + 0x2c3fb521, + 0x2c40354b, 0x2c409264, - 0x2c413543, - 0x2c41b556, + 0x2c41355c, + 0x2c41b56f, 0x2c42122a, - 0x2c42b567, + 0x2c42b580, 0x2c43076d, - 0x2c43b44d, + 0x2c43b466, 0x2c4433ae, - 0x2c44b515, + 0x2c44b52e, 0x2c453345, 0x2c45b381, - 0x2c4633e5, - 0x2c46b46f, - 0x2c473484, - 0x2c47b4bd, + 0x2c4633fe, + 0x2c46b488, + 0x2c47349d, + 0x2c47b4d6, + 0x2c4833c0, 0x30320000, 0x30328015, 0x3033001f, @@ -685,71 +687,71 @@ const uint32_t kOpenSSLReasonValues[] = { 0x4c41945b, 0x4c4215c4, 0x4c4293a3, - 0x50323579, - 0x5032b588, - 0x50333593, - 0x5033b5a3, - 0x503435bc, - 0x5034b5d6, - 0x503535e4, - 0x5035b5fa, - 0x5036360c, - 0x5036b622, - 0x5037363b, - 0x5037b64e, - 0x50383666, - 0x5038b677, - 0x5039368c, - 0x5039b6a0, - 0x503a36c0, - 0x503ab6d6, - 0x503b36ee, - 0x503bb700, - 0x503c371c, - 0x503cb733, - 0x503d374c, - 0x503db762, - 0x503e376f, - 0x503eb785, - 0x503f3797, + 0x50323592, + 0x5032b5a1, + 0x503335ac, + 0x5033b5bc, + 0x503435d5, + 0x5034b5ef, + 0x503535fd, + 0x5035b613, + 0x50363625, + 0x5036b63b, + 0x50373654, + 0x5037b667, + 0x5038367f, + 0x5038b690, + 0x503936a5, + 0x5039b6b9, + 0x503a36d9, + 0x503ab6ef, + 0x503b3707, + 0x503bb719, + 0x503c3735, + 0x503cb74c, + 0x503d3765, + 0x503db77b, + 0x503e3788, + 0x503eb79e, + 0x503f37b0, 0x503f83b3, - 0x504037aa, - 0x5040b7ba, - 0x504137d4, - 0x5041b7e3, - 0x504237fd, - 0x5042b81a, - 0x5043382a, - 0x5043b83a, - 0x50443857, + 0x504037c3, + 0x5040b7d3, + 0x504137ed, + 0x5041b7fc, + 0x50423816, + 0x5042b833, + 0x50433843, + 0x5043b853, + 0x50443870, 0x50448469, - 0x5045386b, - 0x5045b889, - 0x5046389c, - 0x5046b8b2, - 0x504738c4, - 0x5047b8d9, - 0x504838ff, - 0x5048b90d, - 0x50493920, - 0x5049b935, - 0x504a394b, - 0x504ab95b, - 0x504b397b, - 0x504bb98e, - 0x504c39b1, - 0x504cb9df, - 0x504d3a0c, - 0x504dba29, - 0x504e3a44, - 0x504eba60, - 0x504f3a72, - 0x504fba89, - 0x50503a98, + 0x50453884, + 0x5045b8a2, + 0x504638b5, + 0x5046b8cb, + 0x504738dd, + 0x5047b8f2, + 0x50483918, + 0x5048b926, + 0x50493939, + 0x5049b94e, + 0x504a3964, + 0x504ab974, + 0x504b3994, + 0x504bb9a7, + 0x504c39ca, + 0x504cb9f8, + 0x504d3a25, + 0x504dba42, + 0x504e3a5d, + 0x504eba79, + 0x504f3a8b, + 0x504fbaa2, + 0x50503ab1, 0x50508729, - 0x50513aab, - 0x5051b849, - 0x505239f1, + 0x50513ac4, + 0x5051b862, + 0x50523a0a, 0x58320fb0, 0x68320f72, 0x68328cca, @@ -757,6 +759,7 @@ const uint32_t kOpenSSLReasonValues[] = { 0x68338f80, 0x68340f90, 0x683480f7, + 0x6835099a, 0x6c320f38, 0x6c328c81, 0x6c330f43, @@ -1416,6 +1419,7 @@ const char kOpenSSLReasonStringData[] = "INVALID_FIELD_FOR_VERSION\0" "INVALID_FIELD_NAME\0" "INVALID_PARAMETER\0" + "INVALID_POLICY_EXTENSION\0" "INVALID_PSS_PARAMETERS\0" "INVALID_TRUST\0" "INVALID_VERSION\0" diff --git a/third_party/boringssl/gtest_main_chromium.cc b/third_party/boringssl/gtest_main_chromium.cc index d9832478b30d..6f0b7a374b3f 100644 --- a/third_party/boringssl/gtest_main_chromium.cc +++ b/third_party/boringssl/gtest_main_chromium.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/bind.h" +#include "base/functional/bind.h" #include "base/test/launcher/unit_test_launcher.h" #include "base/test/test_suite.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/third_party/boringssl/linux-aarch64/crypto/chacha/chacha-armv8.S b/third_party/boringssl/linux-aarch64/crypto/chacha/chacha-armv8-linux.S similarity index 99% rename from third_party/boringssl/linux-aarch64/crypto/chacha/chacha-armv8.S rename to third_party/boringssl/linux-aarch64/crypto/chacha/chacha-armv8-linux.S index 439211116edb..598cb2a8c936 100644 --- a/third_party/boringssl/linux-aarch64/crypto/chacha/chacha-armv8.S +++ b/third_party/boringssl/linux-aarch64/crypto/chacha/chacha-armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1990,6 +1989,8 @@ ChaCha20_512_neon: AARCH64_VALIDATE_LINK_REGISTER ret .size ChaCha20_512_neon,.-ChaCha20_512_neon +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S b/third_party/boringssl/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-linux.S similarity index 99% rename from third_party/boringssl/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S rename to third_party/boringssl/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-linux.S index 69e1296bf66e..73a3d6466401 100644 --- a/third_party/boringssl/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S +++ b/third_party/boringssl/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -3015,6 +3014,8 @@ chacha20_poly1305_open: b .Lopen_128_hash_64 .cfi_endproc .size chacha20_poly1305_open,.-chacha20_poly1305_open +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-armv8-linux.S similarity index 98% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-armv8-linux.S index 4949ba30e64a..fe13c64ddb8f 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -797,6 +796,8 @@ aes_hw_ctr32_encrypt_blocks: ret .size aes_hw_ctr32_encrypt_blocks,.-aes_hw_ctr32_encrypt_blocks #endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-linux.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-linux.S new file mode 100644 index 000000000000..a179975c0ccc --- /dev/null +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-linux.S @@ -0,0 +1,1567 @@ +// This file is generated from a similarly-named Perl script in the BoringSSL +// source tree. Do not edit by hand. + +#if !defined(__has_feature) +#define __has_feature(x) 0 +#endif +#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) +#define OPENSSL_NO_ASM +#endif + +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(BORINGSSL_PREFIX) +#include +#endif +#include +#if __ARM_MAX_ARCH__ >= 8 + +.arch armv8-a+crypto +.text +.globl aes_gcm_enc_kernel +.hidden aes_gcm_enc_kernel +.type aes_gcm_enc_kernel,%function +.align 4 +aes_gcm_enc_kernel: + AARCH64_SIGN_LINK_REGISTER + stp x29, x30, [sp, #-128]! + mov x29, sp + stp x19, x20, [sp, #16] + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #32] + stp x23, x24, [sp, #48] + stp d8, d9, [sp, #64] + stp d10, d11, [sp, #80] + stp d12, d13, [sp, #96] + stp d14, d15, [sp, #112] + ldr w17, [x8, #240] + add x19, x8, x17, lsl #4 // borrow input_l1 for last key + ldp x13, x14, [x19] // load round N keys + ldr q31, [x19, #-16] // load round N-1 keys + add x4, x0, x1, lsr #3 // end_input_ptr + lsr x5, x1, #3 // byte_len + mov x15, x5 + ldp x10, x11, [x16] // ctr96_b64, ctr96_t32 + ld1 { v0.16b}, [x16] // special case vector load initial counter so we can start first AES block as quickly as possible + sub x5, x5, #1 // byte_len - 1 + ldr q18, [x8, #0] // load rk0 + and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + ldr q25, [x8, #112] // load rk7 + add x5, x5, x0 + lsr x12, x11, #32 + fmov d2, x10 // CTR block 2 + orr w11, w11, w11 + rev w12, w12 // rev_ctr32 + fmov d1, x10 // CTR block 1 + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 0 - round 0 + add w12, w12, #1 // increment rev_ctr32 + rev w9, w12 // CTR block 1 + fmov d3, x10 // CTR block 3 + orr x9, x11, x9, lsl #32 // CTR block 1 + add w12, w12, #1 // CTR block 1 + ldr q19, [x8, #16] // load rk1 + fmov v1.d[1], x9 // CTR block 1 + rev w9, w12 // CTR block 2 + add w12, w12, #1 // CTR block 2 + orr x9, x11, x9, lsl #32 // CTR block 2 + ldr q20, [x8, #32] // load rk2 + fmov v2.d[1], x9 // CTR block 2 + rev w9, w12 // CTR block 3 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 0 - round 1 + orr x9, x11, x9, lsl #32 // CTR block 3 + fmov v3.d[1], x9 // CTR block 3 + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 1 - round 0 + ldr q21, [x8, #48] // load rk3 + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 0 - round 2 + ldr q24, [x8, #96] // load rk6 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 2 - round 0 + ldr q23, [x8, #80] // load rk5 + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 1 - round 1 + ldr q14, [x3, #80] // load h3l | h3h + ext v14.16b, v14.16b, v14.16b, #8 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 3 - round 0 + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 2 - round 1 + ldr q22, [x8, #64] // load rk4 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 1 - round 2 + ldr q13, [x3, #64] // load h2l | h2h + ext v13.16b, v13.16b, v13.16b, #8 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 3 - round 1 + ldr q30, [x8, #192] // load rk12 + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 2 - round 2 + ldr q15, [x3, #112] // load h4l | h4h + ext v15.16b, v15.16b, v15.16b, #8 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 1 - round 3 + ldr q29, [x8, #176] // load rk11 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 3 - round 2 + ldr q26, [x8, #128] // load rk8 + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 2 - round 3 + add w12, w12, #1 // CTR block 3 + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 0 - round 3 + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 3 - round 3 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 2 - round 4 + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 0 - round 4 + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 1 - round 4 + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 3 - round 4 + cmp x17, #12 // setup flags for AES-128/192/256 check + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 0 - round 5 + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 1 - round 5 + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 3 - round 5 + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 2 - round 5 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 1 - round 6 + trn2 v17.2d, v14.2d, v15.2d // h4l | h3l + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 3 - round 6 + ldr q27, [x8, #144] // load rk9 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 0 - round 6 + ldr q12, [x3, #32] // load h1l | h1h + ext v12.16b, v12.16b, v12.16b, #8 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 2 - round 6 + ldr q28, [x8, #160] // load rk10 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 1 - round 7 + trn1 v9.2d, v14.2d, v15.2d // h4h | h3h + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 0 - round 7 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 2 - round 7 + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 3 - round 7 + trn2 v16.2d, v12.2d, v13.2d // h2l | h1l + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 1 - round 8 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 2 - round 8 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 3 - round 8 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 0 - round 8 + b.lt .Lenc_finish_first_blocks // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 1 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 2 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 3 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 0 - round 9 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 1 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 2 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 3 - round 10 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 0 - round 10 + b.eq .Lenc_finish_first_blocks // branch if AES-192 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 1 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 2 - round 11 + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 0 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 3 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 1 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 2 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 0 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 3 - round 12 + +.Lenc_finish_first_blocks: + cmp x0, x5 // check if we have <= 4 blocks + eor v17.16b, v17.16b, v9.16b // h4k | h3k + aese v2.16b, v31.16b // AES block 2 - round N-1 + trn1 v8.2d, v12.2d, v13.2d // h2h | h1h + aese v1.16b, v31.16b // AES block 1 - round N-1 + aese v0.16b, v31.16b // AES block 0 - round N-1 + aese v3.16b, v31.16b // AES block 3 - round N-1 + eor v16.16b, v16.16b, v8.16b // h2k | h1k + b.ge .Lenc_tail // handle tail + + ldp x19, x20, [x0, #16] // AES block 1 - load plaintext + rev w9, w12 // CTR block 4 + ldp x6, x7, [x0, #0] // AES block 0 - load plaintext + ldp x23, x24, [x0, #48] // AES block 3 - load plaintext + ldp x21, x22, [x0, #32] // AES block 2 - load plaintext + add x0, x0, #64 // AES input_ptr update + eor x19, x19, x13 // AES block 1 - round N low + eor x20, x20, x14 // AES block 1 - round N high + fmov d5, x19 // AES block 1 - mov low + eor x6, x6, x13 // AES block 0 - round N low + eor x7, x7, x14 // AES block 0 - round N high + eor x24, x24, x14 // AES block 3 - round N high + fmov d4, x6 // AES block 0 - mov low + cmp x0, x5 // check if we have <= 8 blocks + fmov v4.d[1], x7 // AES block 0 - mov high + eor x23, x23, x13 // AES block 3 - round N low + eor x21, x21, x13 // AES block 2 - round N low + fmov v5.d[1], x20 // AES block 1 - mov high + fmov d6, x21 // AES block 2 - mov low + add w12, w12, #1 // CTR block 4 + orr x9, x11, x9, lsl #32 // CTR block 4 + fmov d7, x23 // AES block 3 - mov low + eor x22, x22, x14 // AES block 2 - round N high + fmov v6.d[1], x22 // AES block 2 - mov high + eor v4.16b, v4.16b, v0.16b // AES block 0 - result + fmov d0, x10 // CTR block 4 + fmov v0.d[1], x9 // CTR block 4 + rev w9, w12 // CTR block 5 + add w12, w12, #1 // CTR block 5 + eor v5.16b, v5.16b, v1.16b // AES block 1 - result + fmov d1, x10 // CTR block 5 + orr x9, x11, x9, lsl #32 // CTR block 5 + fmov v1.d[1], x9 // CTR block 5 + rev w9, w12 // CTR block 6 + st1 { v4.16b}, [x2], #16 // AES block 0 - store result + fmov v7.d[1], x24 // AES block 3 - mov high + orr x9, x11, x9, lsl #32 // CTR block 6 + eor v6.16b, v6.16b, v2.16b // AES block 2 - result + st1 { v5.16b}, [x2], #16 // AES block 1 - store result + add w12, w12, #1 // CTR block 6 + fmov d2, x10 // CTR block 6 + fmov v2.d[1], x9 // CTR block 6 + st1 { v6.16b}, [x2], #16 // AES block 2 - store result + rev w9, w12 // CTR block 7 + orr x9, x11, x9, lsl #32 // CTR block 7 + eor v7.16b, v7.16b, v3.16b // AES block 3 - result + st1 { v7.16b}, [x2], #16 // AES block 3 - store result + b.ge .Lenc_prepretail // do prepretail + +.Lenc_main_loop: // main loop start + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + rev64 v4.16b, v4.16b // GHASH block 4k (only t0 is free) + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + fmov d3, x10 // CTR block 4k+3 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + fmov v3.d[1], x9 // CTR block 4k+3 + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + ldp x23, x24, [x0, #48] // AES block 4k+7 - load plaintext + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + ldp x21, x22, [x0, #32] // AES block 4k+6 - load plaintext + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + eor v4.16b, v4.16b, v11.16b // PRE 1 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + eor x23, x23, x13 // AES block 4k+7 - round N low + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + mov d10, v17.d[1] // GHASH block 4k - mid + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + eor x22, x22, x14 // AES block 4k+6 - round N high + mov d8, v4.d[1] // GHASH block 4k - mid + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + rev64 v5.16b, v5.16b // GHASH block 4k+1 (t0 and t1 free) + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + rev64 v7.16b, v7.16b // GHASH block 4k+3 (t0, t1, t2 and t3 free) + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + rev64 v6.16b, v6.16b // GHASH block 4k+2 (t0, t1, and t2 free) + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + pmull v6.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + ldp x19, x20, [x0, #16] // AES block 4k+5 - load plaintext + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + mov d4, v7.d[1] // GHASH block 4k+3 - mid + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + eor v4.8b, v4.8b, v7.8b // GHASH block 4k+3 - mid + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor x19, x19, x13 // AES block 4k+5 - round N low + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + eor x21, x21, x13 // AES block 4k+6 - round N low + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + movi v8.8b, #0xc2 + pmull v4.1q, v4.1d, v16.1d // GHASH block 4k+3 - mid + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + cmp x17, #12 // setup flags for AES-128/192/256 check + fmov d5, x19 // AES block 4k+5 - mov low + ldp x6, x7, [x0, #0] // AES block 4k+4 - load plaintext + b.lt .Lenc_main_loop_continue // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + b.eq .Lenc_main_loop_continue // branch if AES-192 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + +.Lenc_main_loop_continue: + shl d8, d8, #56 // mod_constant + eor v11.16b, v11.16b, v6.16b // GHASH block 4k+3 - low + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+3 - mid + add w12, w12, #1 // CTR block 4k+3 + eor v4.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + add x0, x0, #64 // AES input_ptr update + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + rev w9, w12 // CTR block 4k+8 + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor x6, x6, x13 // AES block 4k+4 - round N low + eor v10.16b, v10.16b, v4.16b // MODULO - karatsuba tidy up + eor x7, x7, x14 // AES block 4k+4 - round N high + fmov d4, x6 // AES block 4k+4 - mov low + orr x9, x11, x9, lsl #32 // CTR block 4k+8 + eor v7.16b, v9.16b, v7.16b // MODULO - fold into mid + eor x20, x20, x14 // AES block 4k+5 - round N high + eor x24, x24, x14 // AES block 4k+7 - round N high + add w12, w12, #1 // CTR block 4k+8 + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + fmov v4.d[1], x7 // AES block 4k+4 - mov high + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + fmov d7, x23 // AES block 4k+7 - mov low + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + fmov v5.d[1], x20 // AES block 4k+5 - mov high + fmov d6, x21 // AES block 4k+6 - mov low + cmp x0, x5 // .LOOP CONTROL + fmov v6.d[1], x22 // AES block 4k+6 - mov high + pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + eor v4.16b, v4.16b, v0.16b // AES block 4k+4 - result + fmov d0, x10 // CTR block 4k+8 + fmov v0.d[1], x9 // CTR block 4k+8 + rev w9, w12 // CTR block 4k+9 + add w12, w12, #1 // CTR block 4k+9 + eor v5.16b, v5.16b, v1.16b // AES block 4k+5 - result + fmov d1, x10 // CTR block 4k+9 + orr x9, x11, x9, lsl #32 // CTR block 4k+9 + fmov v1.d[1], x9 // CTR block 4k+9 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + rev w9, w12 // CTR block 4k+10 + st1 { v4.16b}, [x2], #16 // AES block 4k+4 - store result + orr x9, x11, x9, lsl #32 // CTR block 4k+10 + eor v11.16b, v11.16b, v9.16b // MODULO - fold into low + fmov v7.d[1], x24 // AES block 4k+7 - mov high + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + st1 { v5.16b}, [x2], #16 // AES block 4k+5 - store result + add w12, w12, #1 // CTR block 4k+10 + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + eor v6.16b, v6.16b, v2.16b // AES block 4k+6 - result + fmov d2, x10 // CTR block 4k+10 + st1 { v6.16b}, [x2], #16 // AES block 4k+6 - store result + fmov v2.d[1], x9 // CTR block 4k+10 + rev w9, w12 // CTR block 4k+11 + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + orr x9, x11, x9, lsl #32 // CTR block 4k+11 + eor v7.16b, v7.16b, v3.16b // AES block 4k+7 - result + st1 { v7.16b}, [x2], #16 // AES block 4k+7 - store result + b.lt .Lenc_main_loop + +.Lenc_prepretail: // PREPRETAIL + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + rev64 v6.16b, v6.16b // GHASH block 4k+2 (t0, t1, and t2 free) + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + fmov d3, x10 // CTR block 4k+3 + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + rev64 v4.16b, v4.16b // GHASH block 4k (only t0 is free) + fmov v3.d[1], x9 // CTR block 4k+3 + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + eor v4.16b, v4.16b, v11.16b // PRE 1 + rev64 v5.16b, v5.16b // GHASH block 4k+1 (t0 and t1 free) + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + mov d10, v17.d[1] // GHASH block 4k - mid + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + mov d8, v4.d[1] // GHASH block 4k - mid + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + rev64 v7.16b, v7.16b // GHASH block 4k+3 (t0, t1, t2 and t3 free) + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + add w12, w12, #1 // CTR block 4k+3 + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + mov d4, v7.d[1] // GHASH block 4k+3 - mid + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + eor v4.8b, v4.8b, v7.8b // GHASH block 4k+3 - mid + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + pmull v4.1q, v4.1d, v16.1d // GHASH block 4k+3 - mid + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + movi v8.8b, #0xc2 + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + shl d8, d8, #56 // mod_constant + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+3 - mid + pmull v6.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + cmp x17, #12 // setup flags for AES-128/192/256 check + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + eor v11.16b, v11.16b, v6.16b // GHASH block 4k+3 - low + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor v10.16b, v10.16b, v9.16b // karatsuba tidy up + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + pmull v4.1q, v9.1d, v8.1d + ext v9.16b, v9.16b, v9.16b, #8 + eor v10.16b, v10.16b, v11.16b + b.lt .Lenc_finish_prepretail // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + b.eq .Lenc_finish_prepretail // branch if AES-192 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + +.Lenc_finish_prepretail: + eor v10.16b, v10.16b, v4.16b + eor v10.16b, v10.16b, v9.16b + pmull v4.1q, v10.1d, v8.1d + ext v10.16b, v10.16b, v10.16b, #8 + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + eor v11.16b, v11.16b, v4.16b + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + eor v11.16b, v11.16b, v10.16b + +.Lenc_tail: // TAIL + ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag + sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process + ldp x6, x7, [x0], #16 // AES block 4k+4 - load plaintext + eor x6, x6, x13 // AES block 4k+4 - round N low + eor x7, x7, x14 // AES block 4k+4 - round N high + cmp x5, #48 + fmov d4, x6 // AES block 4k+4 - mov low + fmov v4.d[1], x7 // AES block 4k+4 - mov high + eor v5.16b, v4.16b, v0.16b // AES block 4k+4 - result + b.gt .Lenc_blocks_more_than_3 + cmp x5, #32 + mov v3.16b, v2.16b + movi v11.8b, #0 + movi v9.8b, #0 + sub w12, w12, #1 + mov v2.16b, v1.16b + movi v10.8b, #0 + b.gt .Lenc_blocks_more_than_2 + mov v3.16b, v1.16b + sub w12, w12, #1 + cmp x5, #16 + b.gt .Lenc_blocks_more_than_1 + sub w12, w12, #1 + b .Lenc_blocks_less_than_1 +.Lenc_blocks_more_than_3: // blocks left > 3 + st1 { v5.16b}, [x2], #16 // AES final-3 block - store result + ldp x6, x7, [x0], #16 // AES final-2 block - load input low & high + rev64 v4.16b, v5.16b // GHASH final-3 block + eor x6, x6, x13 // AES final-2 block - round N low + eor v4.16b, v4.16b, v8.16b // feed in partial tag + eor x7, x7, x14 // AES final-2 block - round N high + mov d22, v4.d[1] // GHASH final-3 block - mid + fmov d5, x6 // AES final-2 block - mov low + fmov v5.d[1], x7 // AES final-2 block - mov high + eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid + movi v8.8b, #0 // suppress further partial tag feed in + mov d10, v17.d[1] // GHASH final-3 block - mid + pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low + pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high + pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid + eor v5.16b, v5.16b, v1.16b // AES final-2 block - result +.Lenc_blocks_more_than_2: // blocks left > 2 + st1 { v5.16b}, [x2], #16 // AES final-2 block - store result + ldp x6, x7, [x0], #16 // AES final-1 block - load input low & high + rev64 v4.16b, v5.16b // GHASH final-2 block + eor x6, x6, x13 // AES final-1 block - round N low + eor v4.16b, v4.16b, v8.16b // feed in partial tag + fmov d5, x6 // AES final-1 block - mov low + eor x7, x7, x14 // AES final-1 block - round N high + fmov v5.d[1], x7 // AES final-1 block - mov high + movi v8.8b, #0 // suppress further partial tag feed in + pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high + mov d22, v4.d[1] // GHASH final-2 block - mid + pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low + eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid + eor v5.16b, v5.16b, v2.16b // AES final-1 block - result + eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high + pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid + eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low + eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid +.Lenc_blocks_more_than_1: // blocks left > 1 + st1 { v5.16b}, [x2], #16 // AES final-1 block - store result + rev64 v4.16b, v5.16b // GHASH final-1 block + ldp x6, x7, [x0], #16 // AES final block - load input low & high + eor v4.16b, v4.16b, v8.16b // feed in partial tag + movi v8.8b, #0 // suppress further partial tag feed in + eor x6, x6, x13 // AES final block - round N low + mov d22, v4.d[1] // GHASH final-1 block - mid + pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high + eor x7, x7, x14 // AES final block - round N high + eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid + eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high + ins v22.d[1], v22.d[0] // GHASH final-1 block - mid + fmov d5, x6 // AES final block - mov low + fmov v5.d[1], x7 // AES final block - mov high + pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid + pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low + eor v5.16b, v5.16b, v3.16b // AES final block - result + eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid + eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low +.Lenc_blocks_less_than_1: // blocks left <= 1 + and x1, x1, #127 // bit_length %= 128 + mvn x13, xzr // rkN_l = 0xffffffffffffffff + sub x1, x1, #128 // bit_length -= 128 + neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128]) + ld1 { v18.16b}, [x2] // load existing bytes where the possibly partial last block is to be stored + mvn x14, xzr // rkN_h = 0xffffffffffffffff + and x1, x1, #127 // bit_length %= 128 + lsr x14, x14, x1 // rkN_h is mask for top 64b of last block + cmp x1, #64 + csel x6, x13, x14, lt + csel x7, x14, xzr, lt + fmov d0, x6 // ctr0b is mask for last block + fmov v0.d[1], x7 + and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits + rev64 v4.16b, v5.16b // GHASH final block + eor v4.16b, v4.16b, v8.16b // feed in partial tag + bif v5.16b, v18.16b, v0.16b // insert existing bytes in top end of result before storing + pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high + mov d8, v4.d[1] // GHASH final block - mid + rev w9, w12 + pmull v21.1q, v4.1d, v12.1d // GHASH final block - low + eor v9.16b, v9.16b, v20.16b // GHASH final block - high + eor v8.8b, v8.8b, v4.8b // GHASH final block - mid + pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid + eor v11.16b, v11.16b, v21.16b // GHASH final block - low + eor v10.16b, v10.16b, v8.16b // GHASH final block - mid + movi v8.8b, #0xc2 + eor v4.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + shl d8, d8, #56 // mod_constant + eor v10.16b, v10.16b, v4.16b // MODULO - karatsuba tidy up + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + str w9, [x16, #12] // store the updated counter + st1 { v5.16b}, [x2] // store all 16B + eor v11.16b, v11.16b, v9.16b // MODULO - fold into low + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + ldp x19, x20, [sp, #16] + ldp x21, x22, [sp, #32] + ldp x23, x24, [sp, #48] + ldp d8, d9, [sp, #64] + ldp d10, d11, [sp, #80] + ldp d12, d13, [sp, #96] + ldp d14, d15, [sp, #112] + ldp x29, x30, [sp], #128 + AARCH64_VALIDATE_LINK_REGISTER + ret +.size aes_gcm_enc_kernel,.-aes_gcm_enc_kernel +.globl aes_gcm_dec_kernel +.hidden aes_gcm_dec_kernel +.type aes_gcm_dec_kernel,%function +.align 4 +aes_gcm_dec_kernel: + AARCH64_SIGN_LINK_REGISTER + stp x29, x30, [sp, #-128]! + mov x29, sp + stp x19, x20, [sp, #16] + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #32] + stp x23, x24, [sp, #48] + stp d8, d9, [sp, #64] + stp d10, d11, [sp, #80] + stp d12, d13, [sp, #96] + stp d14, d15, [sp, #112] + ldr w17, [x8, #240] + add x19, x8, x17, lsl #4 // borrow input_l1 for last key + ldp x13, x14, [x19] // load round N keys + ldr q31, [x19, #-16] // load round N-1 keys + lsr x5, x1, #3 // byte_len + mov x15, x5 + ldp x10, x11, [x16] // ctr96_b64, ctr96_t32 + ldr q26, [x8, #128] // load rk8 + sub x5, x5, #1 // byte_len - 1 + ldr q25, [x8, #112] // load rk7 + and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + add x4, x0, x1, lsr #3 // end_input_ptr + ldr q24, [x8, #96] // load rk6 + lsr x12, x11, #32 + ldr q23, [x8, #80] // load rk5 + orr w11, w11, w11 + ldr q21, [x8, #48] // load rk3 + add x5, x5, x0 + rev w12, w12 // rev_ctr32 + add w12, w12, #1 // increment rev_ctr32 + fmov d3, x10 // CTR block 3 + rev w9, w12 // CTR block 1 + add w12, w12, #1 // CTR block 1 + fmov d1, x10 // CTR block 1 + orr x9, x11, x9, lsl #32 // CTR block 1 + ld1 { v0.16b}, [x16] // special case vector load initial counter so we can start first AES block as quickly as possible + fmov v1.d[1], x9 // CTR block 1 + rev w9, w12 // CTR block 2 + add w12, w12, #1 // CTR block 2 + fmov d2, x10 // CTR block 2 + orr x9, x11, x9, lsl #32 // CTR block 2 + fmov v2.d[1], x9 // CTR block 2 + rev w9, w12 // CTR block 3 + orr x9, x11, x9, lsl #32 // CTR block 3 + ldr q18, [x8, #0] // load rk0 + fmov v3.d[1], x9 // CTR block 3 + add w12, w12, #1 // CTR block 3 + ldr q22, [x8, #64] // load rk4 + ldr q19, [x8, #16] // load rk1 + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 0 - round 0 + ldr q14, [x3, #80] // load h3l | h3h + ext v14.16b, v14.16b, v14.16b, #8 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 3 - round 0 + ldr q15, [x3, #112] // load h4l | h4h + ext v15.16b, v15.16b, v15.16b, #8 + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 1 - round 0 + ldr q13, [x3, #64] // load h2l | h2h + ext v13.16b, v13.16b, v13.16b, #8 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 2 - round 0 + ldr q20, [x8, #32] // load rk2 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 0 - round 1 + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 1 - round 1 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 2 - round 1 + ldr q27, [x8, #144] // load rk9 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 3 - round 1 + ldr q30, [x8, #192] // load rk12 + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 0 - round 2 + ldr q12, [x3, #32] // load h1l | h1h + ext v12.16b, v12.16b, v12.16b, #8 + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 2 - round 2 + ldr q28, [x8, #160] // load rk10 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 3 - round 2 + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 0 - round 3 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 1 - round 2 + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 3 - round 3 + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 0 - round 4 + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 2 - round 3 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 1 - round 3 + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 3 - round 4 + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 2 - round 4 + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 1 - round 4 + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 3 - round 5 + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 0 - round 5 + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 1 - round 5 + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 2 - round 5 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 0 - round 6 + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 3 - round 6 + cmp x17, #12 // setup flags for AES-128/192/256 check + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 1 - round 6 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 2 - round 6 + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 0 - round 7 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 1 - round 7 + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 3 - round 7 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 0 - round 8 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 2 - round 7 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 3 - round 8 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 1 - round 8 + ldr q29, [x8, #176] // load rk11 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 2 - round 8 + b.lt .Ldec_finish_first_blocks // branch if AES-128 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 0 - round 9 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 1 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 3 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 2 - round 9 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 0 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 1 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 3 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 2 - round 10 + b.eq .Ldec_finish_first_blocks // branch if AES-192 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 0 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 3 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 1 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 2 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 1 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 0 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 2 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 3 - round 12 + +.Ldec_finish_first_blocks: + cmp x0, x5 // check if we have <= 4 blocks + trn1 v9.2d, v14.2d, v15.2d // h4h | h3h + trn2 v17.2d, v14.2d, v15.2d // h4l | h3l + trn1 v8.2d, v12.2d, v13.2d // h2h | h1h + trn2 v16.2d, v12.2d, v13.2d // h2l | h1l + eor v17.16b, v17.16b, v9.16b // h4k | h3k + aese v1.16b, v31.16b // AES block 1 - round N-1 + aese v2.16b, v31.16b // AES block 2 - round N-1 + eor v16.16b, v16.16b, v8.16b // h2k | h1k + aese v3.16b, v31.16b // AES block 3 - round N-1 + aese v0.16b, v31.16b // AES block 0 - round N-1 + b.ge .Ldec_tail // handle tail + + ldr q4, [x0, #0] // AES block 0 - load ciphertext + ldr q5, [x0, #16] // AES block 1 - load ciphertext + rev w9, w12 // CTR block 4 + eor v0.16b, v4.16b, v0.16b // AES block 0 - result + eor v1.16b, v5.16b, v1.16b // AES block 1 - result + rev64 v5.16b, v5.16b // GHASH block 1 + ldr q7, [x0, #48] // AES block 3 - load ciphertext + mov x7, v0.d[1] // AES block 0 - mov high + mov x6, v0.d[0] // AES block 0 - mov low + rev64 v4.16b, v4.16b // GHASH block 0 + add w12, w12, #1 // CTR block 4 + fmov d0, x10 // CTR block 4 + orr x9, x11, x9, lsl #32 // CTR block 4 + fmov v0.d[1], x9 // CTR block 4 + rev w9, w12 // CTR block 5 + add w12, w12, #1 // CTR block 5 + mov x19, v1.d[0] // AES block 1 - mov low + orr x9, x11, x9, lsl #32 // CTR block 5 + mov x20, v1.d[1] // AES block 1 - mov high + eor x7, x7, x14 // AES block 0 - round N high + eor x6, x6, x13 // AES block 0 - round N low + stp x6, x7, [x2], #16 // AES block 0 - store result + fmov d1, x10 // CTR block 5 + ldr q6, [x0, #32] // AES block 2 - load ciphertext + add x0, x0, #64 // AES input_ptr update + fmov v1.d[1], x9 // CTR block 5 + rev w9, w12 // CTR block 6 + add w12, w12, #1 // CTR block 6 + eor x19, x19, x13 // AES block 1 - round N low + orr x9, x11, x9, lsl #32 // CTR block 6 + eor x20, x20, x14 // AES block 1 - round N high + stp x19, x20, [x2], #16 // AES block 1 - store result + eor v2.16b, v6.16b, v2.16b // AES block 2 - result + cmp x0, x5 // check if we have <= 8 blocks + b.ge .Ldec_prepretail // do prepretail + +.Ldec_main_loop: // main loop start + mov x21, v2.d[0] // AES block 4k+2 - mov low + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + eor v3.16b, v7.16b, v3.16b // AES block 4k+3 - result + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + mov x22, v2.d[1] // AES block 4k+2 - mov high + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + fmov d2, x10 // CTR block 4k+6 + fmov v2.d[1], x9 // CTR block 4k+6 + eor v4.16b, v4.16b, v11.16b // PRE 1 + rev w9, w12 // CTR block 4k+7 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + mov x24, v3.d[1] // AES block 4k+3 - mov high + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + mov x23, v3.d[0] // AES block 4k+3 - mov low + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + mov d8, v4.d[1] // GHASH block 4k - mid + fmov d3, x10 // CTR block 4k+7 + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + orr x9, x11, x9, lsl #32 // CTR block 4k+7 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + fmov v3.d[1], x9 // CTR block 4k+7 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + eor x22, x22, x14 // AES block 4k+2 - round N high + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + mov d10, v17.d[1] // GHASH block 4k - mid + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + rev64 v6.16b, v6.16b // GHASH block 4k+2 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + eor x21, x21, x13 // AES block 4k+2 - round N low + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + stp x21, x22, [x2], #16 // AES block 4k+2 - store result + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + rev64 v7.16b, v7.16b // GHASH block 4k+3 + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + eor x23, x23, x13 // AES block 4k+3 - round N low + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + eor x24, x24, x14 // AES block 4k+3 - round N high + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + add w12, w12, #1 // CTR block 4k+7 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + rev w9, w12 // CTR block 4k+8 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + add w12, w12, #1 // CTR block 4k+8 + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + mov d6, v7.d[1] // GHASH block 4k+3 - mid + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + pmull v4.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + orr x9, x11, x9, lsl #32 // CTR block 4k+8 + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + cmp x17, #12 // setup flags for AES-128/192/256 check + eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid + movi v8.8b, #0xc2 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor v11.16b, v11.16b, v4.16b // GHASH block 4k+3 - low + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + shl d8, d8, #56 // mod_constant + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + eor v10.16b, v10.16b, v6.16b // GHASH block 4k+3 - mid + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + b.lt .Ldec_main_loop_continue // branch if AES-128 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + b.eq .Ldec_main_loop_continue // branch if AES-192 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + +.Ldec_main_loop_continue: + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + ldr q4, [x0, #0] // AES block 4k+4 - load ciphertext + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up + ldr q5, [x0, #16] // AES block 4k+5 - load ciphertext + eor v0.16b, v4.16b, v0.16b // AES block 4k+4 - result + stp x23, x24, [x2], #16 // AES block 4k+3 - store result + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + ldr q7, [x0, #48] // AES block 4k+7 - load ciphertext + ldr q6, [x0, #32] // AES block 4k+6 - load ciphertext + mov x7, v0.d[1] // AES block 4k+4 - mov high + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + add x0, x0, #64 // AES input_ptr update + mov x6, v0.d[0] // AES block 4k+4 - mov low + fmov d0, x10 // CTR block 4k+8 + fmov v0.d[1], x9 // CTR block 4k+8 + pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + eor v1.16b, v5.16b, v1.16b // AES block 4k+5 - result + rev w9, w12 // CTR block 4k+9 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + orr x9, x11, x9, lsl #32 // CTR block 4k+9 + cmp x0, x5 // .LOOP CONTROL + add w12, w12, #1 // CTR block 4k+9 + eor x6, x6, x13 // AES block 4k+4 - round N low + eor x7, x7, x14 // AES block 4k+4 - round N high + mov x20, v1.d[1] // AES block 4k+5 - mov high + eor v2.16b, v6.16b, v2.16b // AES block 4k+6 - result + eor v11.16b, v11.16b, v8.16b // MODULO - fold into low + mov x19, v1.d[0] // AES block 4k+5 - mov low + fmov d1, x10 // CTR block 4k+9 + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + fmov v1.d[1], x9 // CTR block 4k+9 + rev w9, w12 // CTR block 4k+10 + add w12, w12, #1 // CTR block 4k+10 + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + orr x9, x11, x9, lsl #32 // CTR block 4k+10 + rev64 v5.16b, v5.16b // GHASH block 4k+5 + eor x20, x20, x14 // AES block 4k+5 - round N high + stp x6, x7, [x2], #16 // AES block 4k+4 - store result + eor x19, x19, x13 // AES block 4k+5 - round N low + stp x19, x20, [x2], #16 // AES block 4k+5 - store result + rev64 v4.16b, v4.16b // GHASH block 4k+4 + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + b.lt .Ldec_main_loop + +.Ldec_prepretail: // PREPRETAIL + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + mov x21, v2.d[0] // AES block 4k+2 - mov low + eor v3.16b, v7.16b, v3.16b // AES block 4k+3 - result + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + mov x22, v2.d[1] // AES block 4k+2 - mov high + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + fmov d2, x10 // CTR block 4k+6 + fmov v2.d[1], x9 // CTR block 4k+6 + rev w9, w12 // CTR block 4k+7 + eor v4.16b, v4.16b, v11.16b // PRE 1 + rev64 v6.16b, v6.16b // GHASH block 4k+2 + orr x9, x11, x9, lsl #32 // CTR block 4k+7 + mov x23, v3.d[0] // AES block 4k+3 - mov low + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + mov x24, v3.d[1] // AES block 4k+3 - mov high + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + mov d8, v4.d[1] // GHASH block 4k - mid + fmov d3, x10 // CTR block 4k+7 + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + fmov v3.d[1], x9 // CTR block 4k+7 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + mov d10, v17.d[1] // GHASH block 4k - mid + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + rev64 v7.16b, v7.16b // GHASH block 4k+3 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + pmull v4.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + mov d6, v7.d[1] // GHASH block 4k+3 - mid + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + movi v8.8b, #0xc2 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + eor v11.16b, v11.16b, v4.16b // GHASH block 4k+3 - low + pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + cmp x17, #12 // setup flags for AES-128/192/256 check + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + eor v10.16b, v10.16b, v6.16b // GHASH block 4k+3 - mid + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + shl d8, d8, #56 // mod_constant + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + b.lt .Ldec_finish_prepretail // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + b.eq .Ldec_finish_prepretail // branch if AES-192 + + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + +.Ldec_finish_prepretail: + eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + eor x22, x22, x14 // AES block 4k+2 - round N high + eor x23, x23, x13 // AES block 4k+3 - round N low + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + add w12, w12, #1 // CTR block 4k+7 + eor x21, x21, x13 // AES block 4k+2 - round N low + pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + eor x24, x24, x14 // AES block 4k+3 - round N high + stp x21, x22, [x2], #16 // AES block 4k+2 - store result + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + stp x23, x24, [x2], #16 // AES block 4k+3 - store result + + eor v11.16b, v11.16b, v8.16b // MODULO - fold into low + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + +.Ldec_tail: // TAIL + sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process + ld1 { v5.16b}, [x0], #16 // AES block 4k+4 - load ciphertext + eor v0.16b, v5.16b, v0.16b // AES block 4k+4 - result + mov x6, v0.d[0] // AES block 4k+4 - mov low + mov x7, v0.d[1] // AES block 4k+4 - mov high + ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag + cmp x5, #48 + eor x6, x6, x13 // AES block 4k+4 - round N low + eor x7, x7, x14 // AES block 4k+4 - round N high + b.gt .Ldec_blocks_more_than_3 + sub w12, w12, #1 + mov v3.16b, v2.16b + movi v10.8b, #0 + movi v11.8b, #0 + cmp x5, #32 + movi v9.8b, #0 + mov v2.16b, v1.16b + b.gt .Ldec_blocks_more_than_2 + sub w12, w12, #1 + mov v3.16b, v1.16b + cmp x5, #16 + b.gt .Ldec_blocks_more_than_1 + sub w12, w12, #1 + b .Ldec_blocks_less_than_1 +.Ldec_blocks_more_than_3: // blocks left > 3 + rev64 v4.16b, v5.16b // GHASH final-3 block + ld1 { v5.16b}, [x0], #16 // AES final-2 block - load ciphertext + stp x6, x7, [x2], #16 // AES final-3 block - store result + mov d10, v17.d[1] // GHASH final-3 block - mid + eor v4.16b, v4.16b, v8.16b // feed in partial tag + eor v0.16b, v5.16b, v1.16b // AES final-2 block - result + mov d22, v4.d[1] // GHASH final-3 block - mid + mov x6, v0.d[0] // AES final-2 block - mov low + mov x7, v0.d[1] // AES final-2 block - mov high + eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid + movi v8.8b, #0 // suppress further partial tag feed in + pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high + pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid + eor x6, x6, x13 // AES final-2 block - round N low + pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low + eor x7, x7, x14 // AES final-2 block - round N high +.Ldec_blocks_more_than_2: // blocks left > 2 + rev64 v4.16b, v5.16b // GHASH final-2 block + ld1 { v5.16b}, [x0], #16 // AES final-1 block - load ciphertext + eor v4.16b, v4.16b, v8.16b // feed in partial tag + stp x6, x7, [x2], #16 // AES final-2 block - store result + eor v0.16b, v5.16b, v2.16b // AES final-1 block - result + mov d22, v4.d[1] // GHASH final-2 block - mid + pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low + pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high + eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid + mov x6, v0.d[0] // AES final-1 block - mov low + mov x7, v0.d[1] // AES final-1 block - mov high + eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low + movi v8.8b, #0 // suppress further partial tag feed in + pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid + eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high + eor x6, x6, x13 // AES final-1 block - round N low + eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid + eor x7, x7, x14 // AES final-1 block - round N high +.Ldec_blocks_more_than_1: // blocks left > 1 + stp x6, x7, [x2], #16 // AES final-1 block - store result + rev64 v4.16b, v5.16b // GHASH final-1 block + ld1 { v5.16b}, [x0], #16 // AES final block - load ciphertext + eor v4.16b, v4.16b, v8.16b // feed in partial tag + movi v8.8b, #0 // suppress further partial tag feed in + mov d22, v4.d[1] // GHASH final-1 block - mid + eor v0.16b, v5.16b, v3.16b // AES final block - result + pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high + eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid + pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low + mov x6, v0.d[0] // AES final block - mov low + ins v22.d[1], v22.d[0] // GHASH final-1 block - mid + mov x7, v0.d[1] // AES final block - mov high + pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid + eor x6, x6, x13 // AES final block - round N low + eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low + eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high + eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid + eor x7, x7, x14 // AES final block - round N high +.Ldec_blocks_less_than_1: // blocks left <= 1 + and x1, x1, #127 // bit_length %= 128 + mvn x14, xzr // rkN_h = 0xffffffffffffffff + sub x1, x1, #128 // bit_length -= 128 + mvn x13, xzr // rkN_l = 0xffffffffffffffff + ldp x4, x5, [x2] // load existing bytes we need to not overwrite + neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128]) + and x1, x1, #127 // bit_length %= 128 + lsr x14, x14, x1 // rkN_h is mask for top 64b of last block + cmp x1, #64 + csel x9, x13, x14, lt + csel x10, x14, xzr, lt + fmov d0, x9 // ctr0b is mask for last block + and x6, x6, x9 + mov v0.d[1], x10 + bic x4, x4, x9 // mask out low existing bytes + rev w9, w12 + bic x5, x5, x10 // mask out high existing bytes + orr x6, x6, x4 + and x7, x7, x10 + orr x7, x7, x5 + and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits + rev64 v4.16b, v5.16b // GHASH final block + eor v4.16b, v4.16b, v8.16b // feed in partial tag + pmull v21.1q, v4.1d, v12.1d // GHASH final block - low + mov d8, v4.d[1] // GHASH final block - mid + eor v8.8b, v8.8b, v4.8b // GHASH final block - mid + pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high + pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid + eor v9.16b, v9.16b, v20.16b // GHASH final block - high + eor v11.16b, v11.16b, v21.16b // GHASH final block - low + eor v10.16b, v10.16b, v8.16b // GHASH final block - mid + movi v8.8b, #0xc2 + eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + shl d8, d8, #56 // mod_constant + eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + eor v11.16b, v11.16b, v8.16b // MODULO - fold into low + stp x6, x7, [x2] + str w9, [x16, #12] // store the updated counter + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + ldp x19, x20, [sp, #16] + ldp x21, x22, [sp, #32] + ldp x23, x24, [sp, #48] + ldp d8, d9, [sp, #64] + ldp d10, d11, [sp, #80] + ldp d12, d13, [sp, #96] + ldp d14, d15, [sp, #112] + ldp x29, x30, [sp], #128 + AARCH64_VALIDATE_LINK_REGISTER + ret +.size aes_gcm_dec_kernel,.-aes_gcm_dec_kernel +#endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/armv8-mont.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/armv8-mont-linux.S similarity index 99% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/armv8-mont.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/armv8-mont-linux.S index db89859a36ac..8ba78192d288 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/armv8-mont.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/armv8-mont-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1431,6 +1430,8 @@ __bn_mul4x_mont: .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 4 +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/bn-armv8-linux.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/bn-armv8-linux.S new file mode 100644 index 000000000000..d18381e48f08 --- /dev/null +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/bn-armv8-linux.S @@ -0,0 +1,101 @@ +// This file is generated from a similarly-named Perl script in the BoringSSL +// source tree. Do not edit by hand. + +#if !defined(__has_feature) +#define __has_feature(x) 0 +#endif +#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) +#define OPENSSL_NO_ASM +#endif + +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(BORINGSSL_PREFIX) +#include +#endif +#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 +.hidden 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 x3 = 2 * x8 + x3. This allows loop + # operations to use CBNZ without clobbering the carry flag. + lsr x8, x3, #1 + and x3, x3, #1 + + cbz x8, .Ladd_tail +.Ladd_loop: + ldp x4, x5, [x1], #16 + ldp x6, x7, [x2], #16 + sub x8, x8, #1 + adcs x4, x4, x6 + adcs x5, x5, x7 + stp x4, x5, [x0], #16 + cbnz x8, .Ladd_loop + +.Ladd_tail: + cbz x3, .Ladd_exit + ldr x4, [x1], #8 + ldr x6, [x2], #8 + adcs x4, x4, x6 + str x4, [x0], #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 +.hidden 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 x3 = 2 * x8 + x3. This allows loop + # operations to use CBNZ without clobbering the carry flag. + lsr x8, x3, #1 + and x3, x3, #1 + + cbz x8, .Lsub_tail +.Lsub_loop: + ldp x4, x5, [x1], #16 + ldp x6, x7, [x2], #16 + sub x8, x8, #1 + sbcs x4, x4, x6 + sbcs x5, x5, x7 + stp x4, x5, [x0], #16 + cbnz x8, .Lsub_loop + +.Lsub_tail: + cbz x3, .Lsub_exit + ldr x4, [x1], #8 + ldr x6, [x2], #8 + sbcs x4, x4, x6 + str x4, [x0], #8 + +.Lsub_exit: + cset x0, cc + ret +.size bn_sub_words,.-bn_sub_words +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8-linux.S similarity index 97% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8-linux.S index 098967b5de8a..1f81498096a5 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -341,6 +340,8 @@ gcm_ghash_neon: .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,100,101,114,105,118,101,100,32,102,114,111,109,32,65,82,77,118,52,32,118,101,114,115,105,111,110,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghashv8-armv8-linux.S similarity index 98% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghashv8-armv8-linux.S index 4544cee0e943..bfe17cb99dc2 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghashv8-armx64.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/ghashv8-armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -571,6 +570,8 @@ gcm_ghash_v8_4x: .align 2 .align 2 #endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256-armv8-asm-linux.S similarity index 96% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256-armv8-asm-linux.S index 3efcccb6c5ef..accc3755265a 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256-armv8-asm.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256-armv8-asm-linux.S @@ -8,14 +8,13 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif #include "openssl/arm_arch.h" -.text +.section .rodata .align 5 .Lpoly: .quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 @@ -31,6 +30,7 @@ .quad 0xccd1c8aaee00bc4f .byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 +.text // void ecp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); @@ -47,8 +47,10 @@ ecp_nistz256_mul_mont: ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_mul_mont @@ -71,8 +73,10 @@ ecp_nistz256_sqr_mont: ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sqr_mont @@ -94,8 +98,10 @@ ecp_nistz256_div_by_2: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_div_by_2 @@ -116,8 +122,10 @@ ecp_nistz256_mul_by_2: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] mov x8,x14 mov x9,x15 mov x10,x16 @@ -142,8 +150,10 @@ ecp_nistz256_mul_by_3: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] mov x8,x14 mov x9,x15 mov x10,x16 @@ -180,8 +190,10 @@ ecp_nistz256_sub: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sub_from @@ -205,8 +217,10 @@ ecp_nistz256_neg: mov x15,xzr mov x16,xzr mov x17,xzr - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sub_from @@ -602,9 +616,11 @@ ecp_nistz256_point_double: mov x21,x0 ldp x16,x17,[x1,#48] mov x22,x1 - ldr x12,.Lpoly+8 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] mov x8,x14 - ldr x13,.Lpoly+24 + ldr x13,[x13,#24] mov x9,x15 ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont mov x10,x16 @@ -748,8 +764,10 @@ ecp_nistz256_point_add: mov x21,x0 mov x22,x1 mov x23,x2 - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] orr x8,x4,x5 orr x10,x6,x7 orr x25,x8,x10 @@ -1000,8 +1018,10 @@ ecp_nistz256_point_add_affine: mov x21,x0 mov x22,x1 mov x23,x2 - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] ldp x4,x5,[x1,#64] // in1_z ldp x6,x7,[x1,#64+16] @@ -1147,7 +1167,8 @@ ecp_nistz256_point_add_affine: ldp x10,x11,[x23,#0+48] stp x14,x15,[x21,#0] stp x16,x17,[x21,#0+16] - adr x23,.Lone_mont-64 + adrp x23,.Lone_mont-64 + add x23,x23,:lo12:.Lone_mont-64 ldp x14,x15,[x22,#32] // in1 cmp x24,#0 // ~, remember? ldp x16,x17,[x22,#32+16] @@ -1206,7 +1227,8 @@ ecp_nistz256_ord_mul_mont: stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr x23,.Lord + adrp x23,.Lord + add x23,x23,:lo12:.Lord ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] @@ -1403,7 +1425,7 @@ ecp_nistz256_ord_mul_mont: //////////////////////////////////////////////////////////////////////// // void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4], -// int rep); +// uint64_t rep); .globl ecp_nistz256_ord_sqr_mont .hidden ecp_nistz256_ord_sqr_mont .type ecp_nistz256_ord_sqr_mont,%function @@ -1417,7 +1439,8 @@ ecp_nistz256_ord_sqr_mont: stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr x23,.Lord + adrp x23,.Lord + add x23,x23,:lo12:.Lord ldp x4,x5,[x1] ldp x6,x7,[x1,#16] @@ -1708,6 +1731,8 @@ ecp_nistz256_select_w7: ret .size ecp_nistz256_select_w7,.-ecp_nistz256_select_w7 +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-linux.S similarity index 96% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-linux.S index 9243b8b33392..0f8645f74a13 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -315,6 +314,8 @@ beeu_mod_inverse_vartime: AARCH64_VALIDATE_LINK_REGISTER ret .size beeu_mod_inverse_vartime,.-beeu_mod_inverse_vartime +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha1-armv8.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha1-armv8-linux.S similarity index 99% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha1-armv8.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha1-armv8-linux.S index d7a87958231b..079f2723d87f 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha1-armv8.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha1-armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1233,6 +1232,8 @@ sha1_block_armv8: .byte 83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha256-armv8.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha256-armv8-linux.S similarity index 99% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha256-armv8.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha256-armv8-linux.S index c777ec820970..98a685f13cd7 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha256-armv8.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha256-armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1210,6 +1209,8 @@ sha256_block_armv8: ret .size sha256_block_armv8,.-sha256_block_armv8 #endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha512-armv8.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha512-armv8-linux.S similarity index 99% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha512-armv8.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha512-armv8-linux.S index a3b458a24d42..5e2f88574f41 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha512-armv8.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/sha512-armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1612,6 +1611,8 @@ sha512_block_armv8: ret .size sha512_block_armv8,.-sha512_block_armv8 #endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/vpaes-armv8.S b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/vpaes-armv8-linux.S similarity index 99% rename from third_party/boringssl/linux-aarch64/crypto/fipsmodule/vpaes-armv8.S rename to third_party/boringssl/linux-aarch64/crypto/fipsmodule/vpaes-armv8-linux.S index 59b1d31d429a..a4c2f83f7250 100644 --- a/third_party/boringssl/linux-aarch64/crypto/fipsmodule/vpaes-armv8.S +++ b/third_party/boringssl/linux-aarch64/crypto/fipsmodule/vpaes-armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1230,6 +1229,8 @@ vpaes_ctr32_encrypt_blocks: AARCH64_VALIDATE_LINK_REGISTER ret .size vpaes_ctr32_encrypt_blocks,.-vpaes_ctr32_encrypt_blocks +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-aarch64/crypto/test/trampoline-armv8.S b/third_party/boringssl/linux-aarch64/crypto/test/trampoline-armv8-linux.S similarity index 98% rename from third_party/boringssl/linux-aarch64/crypto/test/trampoline-armv8.S rename to third_party/boringssl/linux-aarch64/crypto/test/trampoline-armv8-linux.S index 8928d7f54ed0..08e0bc35f6b4 100644 --- a/third_party/boringssl/linux-aarch64/crypto/test/trampoline-armv8.S +++ b/third_party/boringssl/linux-aarch64/crypto/test/trampoline-armv8-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -756,6 +755,8 @@ abi_test_clobber_v15_upper: fmov v15.d[1], xzr ret .size abi_test_clobber_v15_upper,.-abi_test_clobber_v15_upper +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/chacha/chacha-armv4.S b/third_party/boringssl/linux-arm/crypto/chacha/chacha-armv4-linux.S similarity index 99% rename from third_party/boringssl/linux-arm/crypto/chacha/chacha-armv4.S rename to third_party/boringssl/linux-arm/crypto/chacha/chacha-armv4-linux.S index 363aeee5f501..8de81965c14d 100644 --- a/third_party/boringssl/linux-arm/crypto/chacha/chacha-armv4.S +++ b/third_party/boringssl/linux-arm/crypto/chacha/chacha-armv4-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1488,6 +1487,8 @@ ChaCha20_neon: .size ChaCha20_neon,.-ChaCha20_neon .comm OPENSSL_armcap_P,4,4 #endif +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/fipsmodule/aesv8-armx32.S b/third_party/boringssl/linux-arm/crypto/fipsmodule/aesv8-armv7-linux.S similarity index 98% rename from third_party/boringssl/linux-arm/crypto/fipsmodule/aesv8-armx32.S rename to third_party/boringssl/linux-arm/crypto/fipsmodule/aesv8-armv7-linux.S index 30c6525d3921..e44cb77c8228 100644 --- a/third_party/boringssl/linux-arm/crypto/fipsmodule/aesv8-armx32.S +++ b/third_party/boringssl/linux-arm/crypto/fipsmodule/aesv8-armv7-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -795,6 +794,8 @@ aes_hw_ctr32_encrypt_blocks: ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,pc} .size aes_hw_ctr32_encrypt_blocks,.-aes_hw_ctr32_encrypt_blocks #endif +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/fipsmodule/armv4-mont.S b/third_party/boringssl/linux-arm/crypto/fipsmodule/armv4-mont-linux.S similarity index 98% rename from third_party/boringssl/linux-arm/crypto/fipsmodule/armv4-mont.S rename to third_party/boringssl/linux-arm/crypto/fipsmodule/armv4-mont-linux.S index 029689475b1b..4cbd5fac70a0 100644 --- a/third_party/boringssl/linux-arm/crypto/fipsmodule/armv4-mont.S +++ b/third_party/boringssl/linux-arm/crypto/fipsmodule/armv4-mont-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -972,6 +971,8 @@ bn_mul8x_mont_neon: .comm OPENSSL_armcap_P,4,4 .hidden OPENSSL_armcap_P #endif +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/fipsmodule/bsaes-armv7.S b/third_party/boringssl/linux-arm/crypto/fipsmodule/bsaes-armv7-linux.S similarity index 99% rename from third_party/boringssl/linux-arm/crypto/fipsmodule/bsaes-armv7.S rename to third_party/boringssl/linux-arm/crypto/fipsmodule/bsaes-armv7-linux.S index 69a8fcacd0a0..45ae4b014ebe 100644 --- a/third_party/boringssl/linux-arm/crypto/fipsmodule/bsaes-armv7.S +++ b/third_party/boringssl/linux-arm/crypto/fipsmodule/bsaes-armv7-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1524,6 +1523,8 @@ bsaes_ctr32_encrypt_blocks: @ out to retain a constant-time implementation. .size bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks #endif +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/fipsmodule/ghash-armv4.S b/third_party/boringssl/linux-arm/crypto/fipsmodule/ghash-armv4-linux.S similarity index 96% rename from third_party/boringssl/linux-arm/crypto/fipsmodule/ghash-armv4.S rename to third_party/boringssl/linux-arm/crypto/fipsmodule/ghash-armv4-linux.S index 0532695a6257..57ca0983f1e6 100644 --- a/third_party/boringssl/linux-arm/crypto/fipsmodule/ghash-armv4.S +++ b/third_party/boringssl/linux-arm/crypto/fipsmodule/ghash-armv4-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -250,6 +249,8 @@ gcm_ghash_neon: .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/fipsmodule/ghashv8-armx32.S b/third_party/boringssl/linux-arm/crypto/fipsmodule/ghashv8-armv7-linux.S similarity index 96% rename from third_party/boringssl/linux-arm/crypto/fipsmodule/ghashv8-armx32.S rename to third_party/boringssl/linux-arm/crypto/fipsmodule/ghashv8-armv7-linux.S index 096dfb7499e9..46fa918142b7 100644 --- a/third_party/boringssl/linux-arm/crypto/fipsmodule/ghashv8-armx32.S +++ b/third_party/boringssl/linux-arm/crypto/fipsmodule/ghashv8-armv7-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -252,6 +251,8 @@ gcm_ghash_v8: .align 2 .align 2 #endif +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/fipsmodule/sha1-armv4-large.S b/third_party/boringssl/linux-arm/crypto/fipsmodule/sha1-armv4-large-linux.S similarity index 99% rename from third_party/boringssl/linux-arm/crypto/fipsmodule/sha1-armv4-large.S rename to third_party/boringssl/linux-arm/crypto/fipsmodule/sha1-armv4-large-linux.S index 61deddf8e7d0..4e7aa299df55 100644 --- a/third_party/boringssl/linux-arm/crypto/fipsmodule/sha1-armv4-large.S +++ b/third_party/boringssl/linux-arm/crypto/fipsmodule/sha1-armv4-large-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1506,6 +1505,8 @@ sha1_block_data_order_armv8: .comm OPENSSL_armcap_P,4,4 .hidden OPENSSL_armcap_P #endif +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/fipsmodule/sha256-armv4.S b/third_party/boringssl/linux-arm/crypto/fipsmodule/sha256-armv4-linux.S similarity index 99% rename from third_party/boringssl/linux-arm/crypto/fipsmodule/sha256-armv4.S rename to third_party/boringssl/linux-arm/crypto/fipsmodule/sha256-armv4-linux.S index aee04785c0a8..eaa5701e102e 100644 --- a/third_party/boringssl/linux-arm/crypto/fipsmodule/sha256-armv4.S +++ b/third_party/boringssl/linux-arm/crypto/fipsmodule/sha256-armv4-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -2834,6 +2833,8 @@ sha256_block_data_order_armv8: .comm OPENSSL_armcap_P,4,4 .hidden OPENSSL_armcap_P #endif +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/fipsmodule/sha512-armv4.S b/third_party/boringssl/linux-arm/crypto/fipsmodule/sha512-armv4-linux.S similarity index 99% rename from third_party/boringssl/linux-arm/crypto/fipsmodule/sha512-armv4.S rename to third_party/boringssl/linux-arm/crypto/fipsmodule/sha512-armv4-linux.S index a06d41fee56e..02489b863266 100644 --- a/third_party/boringssl/linux-arm/crypto/fipsmodule/sha512-armv4.S +++ b/third_party/boringssl/linux-arm/crypto/fipsmodule/sha512-armv4-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1889,6 +1888,8 @@ sha512_block_data_order_neon: .comm OPENSSL_armcap_P,4,4 .hidden OPENSSL_armcap_P #endif +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/fipsmodule/vpaes-armv7.S b/third_party/boringssl/linux-arm/crypto/fipsmodule/vpaes-armv7-linux.S similarity index 99% rename from third_party/boringssl/linux-arm/crypto/fipsmodule/vpaes-armv7.S rename to third_party/boringssl/linux-arm/crypto/fipsmodule/vpaes-armv7-linux.S index e5ad6ed99b91..dd354ef4549b 100644 --- a/third_party/boringssl/linux-arm/crypto/fipsmodule/vpaes-armv7.S +++ b/third_party/boringssl/linux-arm/crypto/fipsmodule/vpaes-armv7-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1231,6 +1230,8 @@ vpaes_ctr32_encrypt_blocks: vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15} ldmia sp!, {r7,r8,r9,r10,r11, pc} @ return .size vpaes_ctr32_encrypt_blocks,.-vpaes_ctr32_encrypt_blocks +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-arm/crypto/test/trampoline-armv4.S b/third_party/boringssl/linux-arm/crypto/test/trampoline-armv4-linux.S similarity index 97% rename from third_party/boringssl/linux-arm/crypto/test/trampoline-armv4.S rename to third_party/boringssl/linux-arm/crypto/test/trampoline-armv4-linux.S index 9a73ba826a1f..4649b0437f9e 100644 --- a/third_party/boringssl/linux-arm/crypto/test/trampoline-armv4.S +++ b/third_party/boringssl/linux-arm/crypto/test/trampoline-armv4-linux.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -374,6 +373,8 @@ abi_test_clobber_d15: vmov s31, r0 bx lr .size abi_test_clobber_d15,.-abi_test_clobber_d15 +#endif // !OPENSSL_NO_ASM && defined(__ARMEL__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S b/third_party/boringssl/linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S deleted file mode 100644 index ea2a7f68037d..000000000000 --- a/third_party/boringssl/linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S +++ /dev/null @@ -1,3670 +0,0 @@ -// 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__) -.machine "any" - -.abiversion 2 -.text - -.align 7 -.Lrcon: -.byte 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01 -.byte 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1b -.byte 0x0c,0x0f,0x0e,0x0d,0x0c,0x0f,0x0e,0x0d,0x0c,0x0f,0x0e,0x0d,0x0c,0x0f,0x0e,0x0d -.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.Lconsts: - mflr 0 - bcl 20,31,$+4 - mflr 6 - addi 6,6,-0x48 - mtlr 0 - blr -.long 0 -.byte 0,12,0x14,0,0,0,0,0 -.byte 65,69,83,32,102,111,114,32,80,111,119,101,114,73,83,65,32,50,46,48,55,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 - -.globl aes_hw_set_encrypt_key -.type aes_hw_set_encrypt_key,@function -.align 5 -aes_hw_set_encrypt_key: -.localentry aes_hw_set_encrypt_key,0 - -.Lset_encrypt_key: - mflr 11 - std 11,16(1) - - li 6,-1 - cmpldi 3,0 - beq- .Lenc_key_abort - cmpldi 5,0 - beq- .Lenc_key_abort - li 6,-2 - cmpwi 4,128 - blt- .Lenc_key_abort - cmpwi 4,256 - bgt- .Lenc_key_abort - andi. 0,4,0x3f - bne- .Lenc_key_abort - - lis 0,0xfff0 - li 12,-1 - or 0,0,0 - - bl .Lconsts - mtlr 11 - - neg 9,3 - lvx 1,0,3 - addi 3,3,15 - lvsr 3,0,9 - li 8,0x20 - cmpwi 4,192 - lvx 2,0,3 - vspltisb 5,0x0f - lvx 4,0,6 - vxor 3,3,5 - lvx 5,8,6 - addi 6,6,0x10 - vperm 1,1,2,3 - li 7,8 - vxor 0,0,0 - mtctr 7 - - lvsl 8,0,5 - vspltisb 9,-1 - lvx 10,0,5 - vperm 9,9,0,8 - - blt .Loop128 - addi 3,3,8 - beq .L192 - addi 3,3,8 - b .L256 - -.align 4 -.Loop128: - vperm 3,1,1,5 - vsldoi 6,0,1,12 - vperm 11,1,1,8 - vsel 7,10,11,9 - vor 10,11,11 - .long 0x10632509 - stvx 7,0,5 - addi 5,5,16 - - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - vadduwm 4,4,4 - vxor 1,1,3 - bdnz .Loop128 - - lvx 4,0,6 - - vperm 3,1,1,5 - vsldoi 6,0,1,12 - vperm 11,1,1,8 - vsel 7,10,11,9 - vor 10,11,11 - .long 0x10632509 - stvx 7,0,5 - addi 5,5,16 - - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - vadduwm 4,4,4 - vxor 1,1,3 - - vperm 3,1,1,5 - vsldoi 6,0,1,12 - vperm 11,1,1,8 - vsel 7,10,11,9 - vor 10,11,11 - .long 0x10632509 - stvx 7,0,5 - addi 5,5,16 - - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - vxor 1,1,3 - vperm 11,1,1,8 - vsel 7,10,11,9 - vor 10,11,11 - stvx 7,0,5 - - addi 3,5,15 - addi 5,5,0x50 - - li 8,10 - b .Ldone - -.align 4 -.L192: - lvx 6,0,3 - li 7,4 - vperm 11,1,1,8 - vsel 7,10,11,9 - vor 10,11,11 - stvx 7,0,5 - addi 5,5,16 - vperm 2,2,6,3 - vspltisb 3,8 - mtctr 7 - vsububm 5,5,3 - -.Loop192: - vperm 3,2,2,5 - vsldoi 6,0,1,12 - .long 0x10632509 - - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - - vsldoi 7,0,2,8 - vspltw 6,1,3 - vxor 6,6,2 - vsldoi 2,0,2,12 - vadduwm 4,4,4 - vxor 2,2,6 - vxor 1,1,3 - vxor 2,2,3 - vsldoi 7,7,1,8 - - vperm 3,2,2,5 - vsldoi 6,0,1,12 - vperm 11,7,7,8 - vsel 7,10,11,9 - vor 10,11,11 - .long 0x10632509 - stvx 7,0,5 - addi 5,5,16 - - vsldoi 7,1,2,8 - vxor 1,1,6 - vsldoi 6,0,6,12 - vperm 11,7,7,8 - vsel 7,10,11,9 - vor 10,11,11 - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - stvx 7,0,5 - addi 5,5,16 - - vspltw 6,1,3 - vxor 6,6,2 - vsldoi 2,0,2,12 - vadduwm 4,4,4 - vxor 2,2,6 - vxor 1,1,3 - vxor 2,2,3 - vperm 11,1,1,8 - vsel 7,10,11,9 - vor 10,11,11 - stvx 7,0,5 - addi 3,5,15 - addi 5,5,16 - bdnz .Loop192 - - li 8,12 - addi 5,5,0x20 - b .Ldone - -.align 4 -.L256: - lvx 6,0,3 - li 7,7 - li 8,14 - vperm 11,1,1,8 - vsel 7,10,11,9 - vor 10,11,11 - stvx 7,0,5 - addi 5,5,16 - vperm 2,2,6,3 - mtctr 7 - -.Loop256: - vperm 3,2,2,5 - vsldoi 6,0,1,12 - vperm 11,2,2,8 - vsel 7,10,11,9 - vor 10,11,11 - .long 0x10632509 - stvx 7,0,5 - addi 5,5,16 - - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - vsldoi 6,0,6,12 - vxor 1,1,6 - vadduwm 4,4,4 - vxor 1,1,3 - vperm 11,1,1,8 - vsel 7,10,11,9 - vor 10,11,11 - stvx 7,0,5 - addi 3,5,15 - addi 5,5,16 - bdz .Ldone - - vspltw 3,1,3 - vsldoi 6,0,2,12 - .long 0x106305C8 - - vxor 2,2,6 - vsldoi 6,0,6,12 - vxor 2,2,6 - vsldoi 6,0,6,12 - vxor 2,2,6 - - vxor 2,2,3 - b .Loop256 - -.align 4 -.Ldone: - lvx 2,0,3 - vsel 2,10,2,9 - stvx 2,0,3 - li 6,0 - or 12,12,12 - stw 8,0(5) - -.Lenc_key_abort: - mr 3,6 - blr -.long 0 -.byte 0,12,0x14,1,0,0,3,0 -.long 0 -.size aes_hw_set_encrypt_key,.-aes_hw_set_encrypt_key - -.globl aes_hw_set_decrypt_key -.type aes_hw_set_decrypt_key,@function -.align 5 -aes_hw_set_decrypt_key: -.localentry aes_hw_set_decrypt_key,0 - - stdu 1,-64(1) - mflr 10 - std 10,80(1) - bl .Lset_encrypt_key - mtlr 10 - - cmpwi 3,0 - bne- .Ldec_key_abort - - slwi 7,8,4 - subi 3,5,240 - srwi 8,8,1 - add 5,3,7 - mtctr 8 - -.Ldeckey: - lwz 0, 0(3) - lwz 6, 4(3) - lwz 7, 8(3) - lwz 8, 12(3) - addi 3,3,16 - lwz 9, 0(5) - lwz 10,4(5) - lwz 11,8(5) - lwz 12,12(5) - stw 0, 0(5) - stw 6, 4(5) - stw 7, 8(5) - stw 8, 12(5) - subi 5,5,16 - stw 9, -16(3) - stw 10,-12(3) - stw 11,-8(3) - stw 12,-4(3) - bdnz .Ldeckey - - xor 3,3,3 -.Ldec_key_abort: - addi 1,1,64 - blr -.long 0 -.byte 0,12,4,1,0x80,0,3,0 -.long 0 -.size aes_hw_set_decrypt_key,.-aes_hw_set_decrypt_key -.globl aes_hw_encrypt -.type aes_hw_encrypt,@function -.align 5 -aes_hw_encrypt: -.localentry aes_hw_encrypt,0 - - lwz 6,240(5) - lis 0,0xfc00 - li 12,-1 - li 7,15 - or 0,0,0 - - lvx 0,0,3 - neg 11,4 - lvx 1,7,3 - lvsl 2,0,3 - vspltisb 4,0x0f - lvsr 3,0,11 - vxor 2,2,4 - li 7,16 - vperm 0,0,1,2 - lvx 1,0,5 - lvsr 5,0,5 - srwi 6,6,1 - lvx 2,7,5 - addi 7,7,16 - subi 6,6,1 - vperm 1,2,1,5 - - vxor 0,0,1 - lvx 1,7,5 - addi 7,7,16 - mtctr 6 - -.Loop_enc: - vperm 2,1,2,5 - .long 0x10001508 - lvx 2,7,5 - addi 7,7,16 - vperm 1,2,1,5 - .long 0x10000D08 - lvx 1,7,5 - addi 7,7,16 - bdnz .Loop_enc - - vperm 2,1,2,5 - .long 0x10001508 - lvx 2,7,5 - vperm 1,2,1,5 - .long 0x10000D09 - - vspltisb 2,-1 - vxor 1,1,1 - li 7,15 - vperm 2,2,1,3 - vxor 3,3,4 - lvx 1,0,4 - vperm 0,0,0,3 - vsel 1,1,0,2 - lvx 4,7,4 - stvx 1,0,4 - vsel 0,0,4,2 - stvx 0,7,4 - - or 12,12,12 - blr -.long 0 -.byte 0,12,0x14,0,0,0,3,0 -.long 0 -.size aes_hw_encrypt,.-aes_hw_encrypt -.globl aes_hw_decrypt -.type aes_hw_decrypt,@function -.align 5 -aes_hw_decrypt: -.localentry aes_hw_decrypt,0 - - lwz 6,240(5) - lis 0,0xfc00 - li 12,-1 - li 7,15 - or 0,0,0 - - lvx 0,0,3 - neg 11,4 - lvx 1,7,3 - lvsl 2,0,3 - vspltisb 4,0x0f - lvsr 3,0,11 - vxor 2,2,4 - li 7,16 - vperm 0,0,1,2 - lvx 1,0,5 - lvsr 5,0,5 - srwi 6,6,1 - lvx 2,7,5 - addi 7,7,16 - subi 6,6,1 - vperm 1,2,1,5 - - vxor 0,0,1 - lvx 1,7,5 - addi 7,7,16 - mtctr 6 - -.Loop_dec: - vperm 2,1,2,5 - .long 0x10001548 - lvx 2,7,5 - addi 7,7,16 - vperm 1,2,1,5 - .long 0x10000D48 - lvx 1,7,5 - addi 7,7,16 - bdnz .Loop_dec - - vperm 2,1,2,5 - .long 0x10001548 - lvx 2,7,5 - vperm 1,2,1,5 - .long 0x10000D49 - - vspltisb 2,-1 - vxor 1,1,1 - li 7,15 - vperm 2,2,1,3 - vxor 3,3,4 - lvx 1,0,4 - vperm 0,0,0,3 - vsel 1,1,0,2 - lvx 4,7,4 - stvx 1,0,4 - vsel 0,0,4,2 - stvx 0,7,4 - - or 12,12,12 - blr -.long 0 -.byte 0,12,0x14,0,0,0,3,0 -.long 0 -.size aes_hw_decrypt,.-aes_hw_decrypt -.globl aes_hw_cbc_encrypt -.type aes_hw_cbc_encrypt,@function -.align 5 -aes_hw_cbc_encrypt: -.localentry aes_hw_cbc_encrypt,0 - - cmpldi 5,16 - .long 0x4dc00020 - - cmpwi 8,0 - lis 0,0xffe0 - li 12,-1 - or 0,0,0 - - li 10,15 - vxor 0,0,0 - vspltisb 3,0x0f - - lvx 4,0,7 - lvsl 6,0,7 - lvx 5,10,7 - vxor 6,6,3 - vperm 4,4,5,6 - - neg 11,3 - lvsr 10,0,6 - lwz 9,240(6) - - lvsr 6,0,11 - lvx 5,0,3 - addi 3,3,15 - vxor 6,6,3 - - lvsl 8,0,4 - vspltisb 9,-1 - lvx 7,0,4 - vperm 9,9,0,8 - vxor 8,8,3 - - srwi 9,9,1 - li 10,16 - subi 9,9,1 - beq .Lcbc_dec - -.Lcbc_enc: - vor 2,5,5 - lvx 5,0,3 - addi 3,3,16 - mtctr 9 - subi 5,5,16 - - lvx 0,0,6 - vperm 2,2,5,6 - lvx 1,10,6 - addi 10,10,16 - vperm 0,1,0,10 - vxor 2,2,0 - lvx 0,10,6 - addi 10,10,16 - vxor 2,2,4 - -.Loop_cbc_enc: - vperm 1,0,1,10 - .long 0x10420D08 - lvx 1,10,6 - addi 10,10,16 - vperm 0,1,0,10 - .long 0x10420508 - lvx 0,10,6 - addi 10,10,16 - bdnz .Loop_cbc_enc - - vperm 1,0,1,10 - .long 0x10420D08 - lvx 1,10,6 - li 10,16 - vperm 0,1,0,10 - .long 0x10820509 - cmpldi 5,16 - - vperm 3,4,4,8 - vsel 2,7,3,9 - vor 7,3,3 - stvx 2,0,4 - addi 4,4,16 - bge .Lcbc_enc - - b .Lcbc_done - -.align 4 -.Lcbc_dec: - cmpldi 5,128 - bge _aesp8_cbc_decrypt8x - vor 3,5,5 - lvx 5,0,3 - addi 3,3,16 - mtctr 9 - subi 5,5,16 - - lvx 0,0,6 - vperm 3,3,5,6 - lvx 1,10,6 - addi 10,10,16 - vperm 0,1,0,10 - vxor 2,3,0 - lvx 0,10,6 - addi 10,10,16 - -.Loop_cbc_dec: - vperm 1,0,1,10 - .long 0x10420D48 - lvx 1,10,6 - addi 10,10,16 - vperm 0,1,0,10 - .long 0x10420548 - lvx 0,10,6 - addi 10,10,16 - bdnz .Loop_cbc_dec - - vperm 1,0,1,10 - .long 0x10420D48 - lvx 1,10,6 - li 10,16 - vperm 0,1,0,10 - .long 0x10420549 - cmpldi 5,16 - - vxor 2,2,4 - vor 4,3,3 - vperm 3,2,2,8 - vsel 2,7,3,9 - vor 7,3,3 - stvx 2,0,4 - addi 4,4,16 - bge .Lcbc_dec - -.Lcbc_done: - addi 4,4,-1 - lvx 2,0,4 - vsel 2,7,2,9 - stvx 2,0,4 - - neg 8,7 - li 10,15 - vxor 0,0,0 - vspltisb 9,-1 - vspltisb 3,0x0f - lvsr 8,0,8 - vperm 9,9,0,8 - vxor 8,8,3 - lvx 7,0,7 - vperm 4,4,4,8 - vsel 2,7,4,9 - lvx 5,10,7 - stvx 2,0,7 - vsel 2,4,5,9 - stvx 2,10,7 - - or 12,12,12 - blr -.long 0 -.byte 0,12,0x14,0,0,0,6,0 -.long 0 -.align 5 -_aesp8_cbc_decrypt8x: - stdu 1,-448(1) - li 10,207 - li 11,223 - stvx 20,10,1 - addi 10,10,32 - stvx 21,11,1 - addi 11,11,32 - stvx 22,10,1 - addi 10,10,32 - stvx 23,11,1 - addi 11,11,32 - stvx 24,10,1 - addi 10,10,32 - stvx 25,11,1 - addi 11,11,32 - stvx 26,10,1 - addi 10,10,32 - stvx 27,11,1 - addi 11,11,32 - stvx 28,10,1 - addi 10,10,32 - stvx 29,11,1 - addi 11,11,32 - stvx 30,10,1 - stvx 31,11,1 - li 0,-1 - stw 12,396(1) - li 8,0x10 - std 26,400(1) - li 26,0x20 - std 27,408(1) - li 27,0x30 - std 28,416(1) - li 28,0x40 - std 29,424(1) - li 29,0x50 - std 30,432(1) - li 30,0x60 - std 31,440(1) - li 31,0x70 - or 0,0,0 - - subi 9,9,3 - subi 5,5,128 - - lvx 23,0,6 - lvx 30,8,6 - addi 6,6,0x20 - lvx 31,0,6 - vperm 23,30,23,10 - addi 11,1,79 - mtctr 9 - -.Load_cbc_dec_key: - vperm 24,31,30,10 - lvx 30,8,6 - addi 6,6,0x20 - stvx 24,0,11 - vperm 25,30,31,10 - lvx 31,0,6 - stvx 25,8,11 - addi 11,11,0x20 - bdnz .Load_cbc_dec_key - - lvx 26,8,6 - vperm 24,31,30,10 - lvx 27,26,6 - stvx 24,0,11 - vperm 25,26,31,10 - lvx 28,27,6 - stvx 25,8,11 - addi 11,1,79 - vperm 26,27,26,10 - lvx 29,28,6 - vperm 27,28,27,10 - lvx 30,29,6 - vperm 28,29,28,10 - lvx 31,30,6 - vperm 29,30,29,10 - lvx 14,31,6 - vperm 30,31,30,10 - lvx 24,0,11 - vperm 31,14,31,10 - lvx 25,8,11 - - - - subi 3,3,15 - - li 10,8 - .long 0x7C001E99 - lvsl 6,0,10 - vspltisb 3,0x0f - .long 0x7C281E99 - vxor 6,6,3 - .long 0x7C5A1E99 - vperm 0,0,0,6 - .long 0x7C7B1E99 - vperm 1,1,1,6 - .long 0x7D5C1E99 - vperm 2,2,2,6 - vxor 14,0,23 - .long 0x7D7D1E99 - vperm 3,3,3,6 - vxor 15,1,23 - .long 0x7D9E1E99 - vperm 10,10,10,6 - vxor 16,2,23 - .long 0x7DBF1E99 - addi 3,3,0x80 - vperm 11,11,11,6 - vxor 17,3,23 - vperm 12,12,12,6 - vxor 18,10,23 - vperm 13,13,13,6 - vxor 19,11,23 - vxor 20,12,23 - vxor 21,13,23 - - mtctr 9 - b .Loop_cbc_dec8x -.align 5 -.Loop_cbc_dec8x: - .long 0x11CEC548 - .long 0x11EFC548 - .long 0x1210C548 - .long 0x1231C548 - .long 0x1252C548 - .long 0x1273C548 - .long 0x1294C548 - .long 0x12B5C548 - lvx 24,26,11 - addi 11,11,0x20 - - .long 0x11CECD48 - .long 0x11EFCD48 - .long 0x1210CD48 - .long 0x1231CD48 - .long 0x1252CD48 - .long 0x1273CD48 - .long 0x1294CD48 - .long 0x12B5CD48 - lvx 25,8,11 - bdnz .Loop_cbc_dec8x - - subic 5,5,128 - .long 0x11CEC548 - .long 0x11EFC548 - .long 0x1210C548 - .long 0x1231C548 - .long 0x1252C548 - .long 0x1273C548 - .long 0x1294C548 - .long 0x12B5C548 - - subfe. 0,0,0 - .long 0x11CECD48 - .long 0x11EFCD48 - .long 0x1210CD48 - .long 0x1231CD48 - .long 0x1252CD48 - .long 0x1273CD48 - .long 0x1294CD48 - .long 0x12B5CD48 - - and 0,0,5 - .long 0x11CED548 - .long 0x11EFD548 - .long 0x1210D548 - .long 0x1231D548 - .long 0x1252D548 - .long 0x1273D548 - .long 0x1294D548 - .long 0x12B5D548 - - add 3,3,0 - - - - .long 0x11CEDD48 - .long 0x11EFDD48 - .long 0x1210DD48 - .long 0x1231DD48 - .long 0x1252DD48 - .long 0x1273DD48 - .long 0x1294DD48 - .long 0x12B5DD48 - - addi 11,1,79 - .long 0x11CEE548 - .long 0x11EFE548 - .long 0x1210E548 - .long 0x1231E548 - .long 0x1252E548 - .long 0x1273E548 - .long 0x1294E548 - .long 0x12B5E548 - lvx 24,0,11 - - .long 0x11CEED48 - .long 0x11EFED48 - .long 0x1210ED48 - .long 0x1231ED48 - .long 0x1252ED48 - .long 0x1273ED48 - .long 0x1294ED48 - .long 0x12B5ED48 - lvx 25,8,11 - - .long 0x11CEF548 - vxor 4,4,31 - .long 0x11EFF548 - vxor 0,0,31 - .long 0x1210F548 - vxor 1,1,31 - .long 0x1231F548 - vxor 2,2,31 - .long 0x1252F548 - vxor 3,3,31 - .long 0x1273F548 - vxor 10,10,31 - .long 0x1294F548 - vxor 11,11,31 - .long 0x12B5F548 - vxor 12,12,31 - - .long 0x11CE2549 - .long 0x11EF0549 - .long 0x7C001E99 - .long 0x12100D49 - .long 0x7C281E99 - .long 0x12311549 - vperm 0,0,0,6 - .long 0x7C5A1E99 - .long 0x12521D49 - vperm 1,1,1,6 - .long 0x7C7B1E99 - .long 0x12735549 - vperm 2,2,2,6 - .long 0x7D5C1E99 - .long 0x12945D49 - vperm 3,3,3,6 - .long 0x7D7D1E99 - .long 0x12B56549 - vperm 10,10,10,6 - .long 0x7D9E1E99 - vor 4,13,13 - vperm 11,11,11,6 - .long 0x7DBF1E99 - addi 3,3,0x80 - - vperm 14,14,14,6 - vperm 15,15,15,6 - .long 0x7DC02799 - vperm 12,12,12,6 - vxor 14,0,23 - vperm 16,16,16,6 - .long 0x7DE82799 - vperm 13,13,13,6 - vxor 15,1,23 - vperm 17,17,17,6 - .long 0x7E1A2799 - vxor 16,2,23 - vperm 18,18,18,6 - .long 0x7E3B2799 - vxor 17,3,23 - vperm 19,19,19,6 - .long 0x7E5C2799 - vxor 18,10,23 - vperm 20,20,20,6 - .long 0x7E7D2799 - vxor 19,11,23 - vperm 21,21,21,6 - .long 0x7E9E2799 - vxor 20,12,23 - .long 0x7EBF2799 - addi 4,4,0x80 - vxor 21,13,23 - - mtctr 9 - beq .Loop_cbc_dec8x - - addic. 5,5,128 - beq .Lcbc_dec8x_done - nop - nop - -.Loop_cbc_dec8x_tail: - .long 0x11EFC548 - .long 0x1210C548 - .long 0x1231C548 - .long 0x1252C548 - .long 0x1273C548 - .long 0x1294C548 - .long 0x12B5C548 - lvx 24,26,11 - addi 11,11,0x20 - - .long 0x11EFCD48 - .long 0x1210CD48 - .long 0x1231CD48 - .long 0x1252CD48 - .long 0x1273CD48 - .long 0x1294CD48 - .long 0x12B5CD48 - lvx 25,8,11 - bdnz .Loop_cbc_dec8x_tail - - .long 0x11EFC548 - .long 0x1210C548 - .long 0x1231C548 - .long 0x1252C548 - .long 0x1273C548 - .long 0x1294C548 - .long 0x12B5C548 - - .long 0x11EFCD48 - .long 0x1210CD48 - .long 0x1231CD48 - .long 0x1252CD48 - .long 0x1273CD48 - .long 0x1294CD48 - .long 0x12B5CD48 - - .long 0x11EFD548 - .long 0x1210D548 - .long 0x1231D548 - .long 0x1252D548 - .long 0x1273D548 - .long 0x1294D548 - .long 0x12B5D548 - - .long 0x11EFDD48 - .long 0x1210DD48 - .long 0x1231DD48 - .long 0x1252DD48 - .long 0x1273DD48 - .long 0x1294DD48 - .long 0x12B5DD48 - - .long 0x11EFE548 - .long 0x1210E548 - .long 0x1231E548 - .long 0x1252E548 - .long 0x1273E548 - .long 0x1294E548 - .long 0x12B5E548 - - .long 0x11EFED48 - .long 0x1210ED48 - .long 0x1231ED48 - .long 0x1252ED48 - .long 0x1273ED48 - .long 0x1294ED48 - .long 0x12B5ED48 - - .long 0x11EFF548 - vxor 4,4,31 - .long 0x1210F548 - vxor 1,1,31 - .long 0x1231F548 - vxor 2,2,31 - .long 0x1252F548 - vxor 3,3,31 - .long 0x1273F548 - vxor 10,10,31 - .long 0x1294F548 - vxor 11,11,31 - .long 0x12B5F548 - vxor 12,12,31 - - cmplwi 5,32 - blt .Lcbc_dec8x_one - nop - beq .Lcbc_dec8x_two - cmplwi 5,64 - blt .Lcbc_dec8x_three - nop - beq .Lcbc_dec8x_four - cmplwi 5,96 - blt .Lcbc_dec8x_five - nop - beq .Lcbc_dec8x_six - -.Lcbc_dec8x_seven: - .long 0x11EF2549 - .long 0x12100D49 - .long 0x12311549 - .long 0x12521D49 - .long 0x12735549 - .long 0x12945D49 - .long 0x12B56549 - vor 4,13,13 - - vperm 15,15,15,6 - vperm 16,16,16,6 - .long 0x7DE02799 - vperm 17,17,17,6 - .long 0x7E082799 - vperm 18,18,18,6 - .long 0x7E3A2799 - vperm 19,19,19,6 - .long 0x7E5B2799 - vperm 20,20,20,6 - .long 0x7E7C2799 - vperm 21,21,21,6 - .long 0x7E9D2799 - .long 0x7EBE2799 - addi 4,4,0x70 - b .Lcbc_dec8x_done - -.align 5 -.Lcbc_dec8x_six: - .long 0x12102549 - .long 0x12311549 - .long 0x12521D49 - .long 0x12735549 - .long 0x12945D49 - .long 0x12B56549 - vor 4,13,13 - - vperm 16,16,16,6 - vperm 17,17,17,6 - .long 0x7E002799 - vperm 18,18,18,6 - .long 0x7E282799 - vperm 19,19,19,6 - .long 0x7E5A2799 - vperm 20,20,20,6 - .long 0x7E7B2799 - vperm 21,21,21,6 - .long 0x7E9C2799 - .long 0x7EBD2799 - addi 4,4,0x60 - b .Lcbc_dec8x_done - -.align 5 -.Lcbc_dec8x_five: - .long 0x12312549 - .long 0x12521D49 - .long 0x12735549 - .long 0x12945D49 - .long 0x12B56549 - vor 4,13,13 - - vperm 17,17,17,6 - vperm 18,18,18,6 - .long 0x7E202799 - vperm 19,19,19,6 - .long 0x7E482799 - vperm 20,20,20,6 - .long 0x7E7A2799 - vperm 21,21,21,6 - .long 0x7E9B2799 - .long 0x7EBC2799 - addi 4,4,0x50 - b .Lcbc_dec8x_done - -.align 5 -.Lcbc_dec8x_four: - .long 0x12522549 - .long 0x12735549 - .long 0x12945D49 - .long 0x12B56549 - vor 4,13,13 - - vperm 18,18,18,6 - vperm 19,19,19,6 - .long 0x7E402799 - vperm 20,20,20,6 - .long 0x7E682799 - vperm 21,21,21,6 - .long 0x7E9A2799 - .long 0x7EBB2799 - addi 4,4,0x40 - b .Lcbc_dec8x_done - -.align 5 -.Lcbc_dec8x_three: - .long 0x12732549 - .long 0x12945D49 - .long 0x12B56549 - vor 4,13,13 - - vperm 19,19,19,6 - vperm 20,20,20,6 - .long 0x7E602799 - vperm 21,21,21,6 - .long 0x7E882799 - .long 0x7EBA2799 - addi 4,4,0x30 - b .Lcbc_dec8x_done - -.align 5 -.Lcbc_dec8x_two: - .long 0x12942549 - .long 0x12B56549 - vor 4,13,13 - - vperm 20,20,20,6 - vperm 21,21,21,6 - .long 0x7E802799 - .long 0x7EA82799 - addi 4,4,0x20 - b .Lcbc_dec8x_done - -.align 5 -.Lcbc_dec8x_one: - .long 0x12B52549 - vor 4,13,13 - - vperm 21,21,21,6 - .long 0x7EA02799 - addi 4,4,0x10 - -.Lcbc_dec8x_done: - vperm 4,4,4,6 - .long 0x7C803F99 - - li 10,79 - li 11,95 - stvx 6,10,1 - addi 10,10,32 - stvx 6,11,1 - addi 11,11,32 - stvx 6,10,1 - addi 10,10,32 - stvx 6,11,1 - addi 11,11,32 - stvx 6,10,1 - addi 10,10,32 - stvx 6,11,1 - addi 11,11,32 - stvx 6,10,1 - addi 10,10,32 - stvx 6,11,1 - addi 11,11,32 - - or 12,12,12 - lvx 20,10,1 - addi 10,10,32 - lvx 21,11,1 - addi 11,11,32 - lvx 22,10,1 - addi 10,10,32 - lvx 23,11,1 - addi 11,11,32 - lvx 24,10,1 - addi 10,10,32 - lvx 25,11,1 - addi 11,11,32 - lvx 26,10,1 - addi 10,10,32 - lvx 27,11,1 - addi 11,11,32 - lvx 28,10,1 - addi 10,10,32 - lvx 29,11,1 - addi 11,11,32 - lvx 30,10,1 - lvx 31,11,1 - ld 26,400(1) - ld 27,408(1) - ld 28,416(1) - ld 29,424(1) - ld 30,432(1) - ld 31,440(1) - addi 1,1,448 - blr -.long 0 -.byte 0,12,0x04,0,0x80,6,6,0 -.long 0 -.size aes_hw_cbc_encrypt,.-aes_hw_cbc_encrypt -.globl aes_hw_ctr32_encrypt_blocks -.type aes_hw_ctr32_encrypt_blocks,@function -.align 5 -aes_hw_ctr32_encrypt_blocks: -.localentry aes_hw_ctr32_encrypt_blocks,0 - - cmpldi 5,1 - .long 0x4dc00020 - - lis 0,0xfff0 - li 12,-1 - or 0,0,0 - - li 10,15 - vxor 0,0,0 - vspltisb 3,0x0f - - lvx 4,0,7 - lvsl 6,0,7 - lvx 5,10,7 - vspltisb 11,1 - vxor 6,6,3 - vperm 4,4,5,6 - vsldoi 11,0,11,1 - - neg 11,3 - lvsr 10,0,6 - lwz 9,240(6) - - lvsr 6,0,11 - lvx 5,0,3 - addi 3,3,15 - vxor 6,6,3 - - srwi 9,9,1 - li 10,16 - subi 9,9,1 - - cmpldi 5,8 - bge _aesp8_ctr32_encrypt8x - - lvsl 8,0,4 - vspltisb 9,-1 - lvx 7,0,4 - vperm 9,9,0,8 - vxor 8,8,3 - - lvx 0,0,6 - mtctr 9 - lvx 1,10,6 - addi 10,10,16 - vperm 0,1,0,10 - vxor 2,4,0 - lvx 0,10,6 - addi 10,10,16 - b .Loop_ctr32_enc - -.align 5 -.Loop_ctr32_enc: - vperm 1,0,1,10 - .long 0x10420D08 - lvx 1,10,6 - addi 10,10,16 - vperm 0,1,0,10 - .long 0x10420508 - lvx 0,10,6 - addi 10,10,16 - bdnz .Loop_ctr32_enc - - vadduwm 4,4,11 - vor 3,5,5 - lvx 5,0,3 - addi 3,3,16 - subic. 5,5,1 - - vperm 1,0,1,10 - .long 0x10420D08 - lvx 1,10,6 - vperm 3,3,5,6 - li 10,16 - vperm 1,1,0,10 - lvx 0,0,6 - vxor 3,3,1 - .long 0x10421D09 - - lvx 1,10,6 - addi 10,10,16 - vperm 2,2,2,8 - vsel 3,7,2,9 - mtctr 9 - vperm 0,1,0,10 - vor 7,2,2 - vxor 2,4,0 - lvx 0,10,6 - addi 10,10,16 - stvx 3,0,4 - addi 4,4,16 - bne .Loop_ctr32_enc - - addi 4,4,-1 - lvx 2,0,4 - vsel 2,7,2,9 - stvx 2,0,4 - - or 12,12,12 - blr -.long 0 -.byte 0,12,0x14,0,0,0,6,0 -.long 0 -.align 5 -_aesp8_ctr32_encrypt8x: - stdu 1,-448(1) - li 10,207 - li 11,223 - stvx 20,10,1 - addi 10,10,32 - stvx 21,11,1 - addi 11,11,32 - stvx 22,10,1 - addi 10,10,32 - stvx 23,11,1 - addi 11,11,32 - stvx 24,10,1 - addi 10,10,32 - stvx 25,11,1 - addi 11,11,32 - stvx 26,10,1 - addi 10,10,32 - stvx 27,11,1 - addi 11,11,32 - stvx 28,10,1 - addi 10,10,32 - stvx 29,11,1 - addi 11,11,32 - stvx 30,10,1 - stvx 31,11,1 - li 0,-1 - stw 12,396(1) - li 8,0x10 - std 26,400(1) - li 26,0x20 - std 27,408(1) - li 27,0x30 - std 28,416(1) - li 28,0x40 - std 29,424(1) - li 29,0x50 - std 30,432(1) - li 30,0x60 - std 31,440(1) - li 31,0x70 - or 0,0,0 - - subi 9,9,3 - - lvx 23,0,6 - lvx 30,8,6 - addi 6,6,0x20 - lvx 31,0,6 - vperm 23,30,23,10 - addi 11,1,79 - mtctr 9 - -.Load_ctr32_enc_key: - vperm 24,31,30,10 - lvx 30,8,6 - addi 6,6,0x20 - stvx 24,0,11 - vperm 25,30,31,10 - lvx 31,0,6 - stvx 25,8,11 - addi 11,11,0x20 - bdnz .Load_ctr32_enc_key - - lvx 26,8,6 - vperm 24,31,30,10 - lvx 27,26,6 - stvx 24,0,11 - vperm 25,26,31,10 - lvx 28,27,6 - stvx 25,8,11 - addi 11,1,79 - vperm 26,27,26,10 - lvx 29,28,6 - vperm 27,28,27,10 - lvx 30,29,6 - vperm 28,29,28,10 - lvx 31,30,6 - vperm 29,30,29,10 - lvx 15,31,6 - vperm 30,31,30,10 - lvx 24,0,11 - vperm 31,15,31,10 - lvx 25,8,11 - - vadduwm 7,11,11 - subi 3,3,15 - sldi 5,5,4 - - vadduwm 16,4,11 - vadduwm 17,4,7 - vxor 15,4,23 - li 10,8 - vadduwm 18,16,7 - vxor 16,16,23 - lvsl 6,0,10 - vadduwm 19,17,7 - vxor 17,17,23 - vspltisb 3,0x0f - vadduwm 20,18,7 - vxor 18,18,23 - vxor 6,6,3 - vadduwm 21,19,7 - vxor 19,19,23 - vadduwm 22,20,7 - vxor 20,20,23 - vadduwm 4,21,7 - vxor 21,21,23 - vxor 22,22,23 - - mtctr 9 - b .Loop_ctr32_enc8x -.align 5 -.Loop_ctr32_enc8x: - .long 0x11EFC508 - .long 0x1210C508 - .long 0x1231C508 - .long 0x1252C508 - .long 0x1273C508 - .long 0x1294C508 - .long 0x12B5C508 - .long 0x12D6C508 -.Loop_ctr32_enc8x_middle: - lvx 24,26,11 - addi 11,11,0x20 - - .long 0x11EFCD08 - .long 0x1210CD08 - .long 0x1231CD08 - .long 0x1252CD08 - .long 0x1273CD08 - .long 0x1294CD08 - .long 0x12B5CD08 - .long 0x12D6CD08 - lvx 25,8,11 - bdnz .Loop_ctr32_enc8x - - subic 11,5,256 - .long 0x11EFC508 - .long 0x1210C508 - .long 0x1231C508 - .long 0x1252C508 - .long 0x1273C508 - .long 0x1294C508 - .long 0x12B5C508 - .long 0x12D6C508 - - subfe 0,0,0 - .long 0x11EFCD08 - .long 0x1210CD08 - .long 0x1231CD08 - .long 0x1252CD08 - .long 0x1273CD08 - .long 0x1294CD08 - .long 0x12B5CD08 - .long 0x12D6CD08 - - and 0,0,11 - addi 11,1,79 - .long 0x11EFD508 - .long 0x1210D508 - .long 0x1231D508 - .long 0x1252D508 - .long 0x1273D508 - .long 0x1294D508 - .long 0x12B5D508 - .long 0x12D6D508 - lvx 24,0,11 - - subic 5,5,129 - .long 0x11EFDD08 - addi 5,5,1 - .long 0x1210DD08 - .long 0x1231DD08 - .long 0x1252DD08 - .long 0x1273DD08 - .long 0x1294DD08 - .long 0x12B5DD08 - .long 0x12D6DD08 - lvx 25,8,11 - - .long 0x11EFE508 - .long 0x7C001E99 - .long 0x1210E508 - .long 0x7C281E99 - .long 0x1231E508 - .long 0x7C5A1E99 - .long 0x1252E508 - .long 0x7C7B1E99 - .long 0x1273E508 - .long 0x7D5C1E99 - .long 0x1294E508 - .long 0x7D9D1E99 - .long 0x12B5E508 - .long 0x7DBE1E99 - .long 0x12D6E508 - .long 0x7DDF1E99 - addi 3,3,0x80 - - .long 0x11EFED08 - vperm 0,0,0,6 - .long 0x1210ED08 - vperm 1,1,1,6 - .long 0x1231ED08 - vperm 2,2,2,6 - .long 0x1252ED08 - vperm 3,3,3,6 - .long 0x1273ED08 - vperm 10,10,10,6 - .long 0x1294ED08 - vperm 12,12,12,6 - .long 0x12B5ED08 - vperm 13,13,13,6 - .long 0x12D6ED08 - vperm 14,14,14,6 - - add 3,3,0 - - - - subfe. 0,0,0 - .long 0x11EFF508 - vxor 0,0,31 - .long 0x1210F508 - vxor 1,1,31 - .long 0x1231F508 - vxor 2,2,31 - .long 0x1252F508 - vxor 3,3,31 - .long 0x1273F508 - vxor 10,10,31 - .long 0x1294F508 - vxor 12,12,31 - .long 0x12B5F508 - vxor 13,13,31 - .long 0x12D6F508 - vxor 14,14,31 - - bne .Lctr32_enc8x_break - - .long 0x100F0509 - .long 0x10300D09 - vadduwm 16,4,11 - .long 0x10511509 - vadduwm 17,4,7 - vxor 15,4,23 - .long 0x10721D09 - vadduwm 18,16,7 - vxor 16,16,23 - .long 0x11535509 - vadduwm 19,17,7 - vxor 17,17,23 - .long 0x11946509 - vadduwm 20,18,7 - vxor 18,18,23 - .long 0x11B56D09 - vadduwm 21,19,7 - vxor 19,19,23 - .long 0x11D67509 - vadduwm 22,20,7 - vxor 20,20,23 - vperm 0,0,0,6 - vadduwm 4,21,7 - vxor 21,21,23 - vperm 1,1,1,6 - vxor 22,22,23 - mtctr 9 - - .long 0x11EFC508 - .long 0x7C002799 - vperm 2,2,2,6 - .long 0x1210C508 - .long 0x7C282799 - vperm 3,3,3,6 - .long 0x1231C508 - .long 0x7C5A2799 - vperm 10,10,10,6 - .long 0x1252C508 - .long 0x7C7B2799 - vperm 12,12,12,6 - .long 0x1273C508 - .long 0x7D5C2799 - vperm 13,13,13,6 - .long 0x1294C508 - .long 0x7D9D2799 - vperm 14,14,14,6 - .long 0x12B5C508 - .long 0x7DBE2799 - .long 0x12D6C508 - .long 0x7DDF2799 - addi 4,4,0x80 - - b .Loop_ctr32_enc8x_middle - -.align 5 -.Lctr32_enc8x_break: - cmpwi 5,-0x60 - blt .Lctr32_enc8x_one - nop - beq .Lctr32_enc8x_two - cmpwi 5,-0x40 - blt .Lctr32_enc8x_three - nop - beq .Lctr32_enc8x_four - cmpwi 5,-0x20 - blt .Lctr32_enc8x_five - nop - beq .Lctr32_enc8x_six - cmpwi 5,0x00 - blt .Lctr32_enc8x_seven - -.Lctr32_enc8x_eight: - .long 0x11EF0509 - .long 0x12100D09 - .long 0x12311509 - .long 0x12521D09 - .long 0x12735509 - .long 0x12946509 - .long 0x12B56D09 - .long 0x12D67509 - - vperm 15,15,15,6 - vperm 16,16,16,6 - .long 0x7DE02799 - vperm 17,17,17,6 - .long 0x7E082799 - vperm 18,18,18,6 - .long 0x7E3A2799 - vperm 19,19,19,6 - .long 0x7E5B2799 - vperm 20,20,20,6 - .long 0x7E7C2799 - vperm 21,21,21,6 - .long 0x7E9D2799 - vperm 22,22,22,6 - .long 0x7EBE2799 - .long 0x7EDF2799 - addi 4,4,0x80 - b .Lctr32_enc8x_done - -.align 5 -.Lctr32_enc8x_seven: - .long 0x11EF0D09 - .long 0x12101509 - .long 0x12311D09 - .long 0x12525509 - .long 0x12736509 - .long 0x12946D09 - .long 0x12B57509 - - vperm 15,15,15,6 - vperm 16,16,16,6 - .long 0x7DE02799 - vperm 17,17,17,6 - .long 0x7E082799 - vperm 18,18,18,6 - .long 0x7E3A2799 - vperm 19,19,19,6 - .long 0x7E5B2799 - vperm 20,20,20,6 - .long 0x7E7C2799 - vperm 21,21,21,6 - .long 0x7E9D2799 - .long 0x7EBE2799 - addi 4,4,0x70 - b .Lctr32_enc8x_done - -.align 5 -.Lctr32_enc8x_six: - .long 0x11EF1509 - .long 0x12101D09 - .long 0x12315509 - .long 0x12526509 - .long 0x12736D09 - .long 0x12947509 - - vperm 15,15,15,6 - vperm 16,16,16,6 - .long 0x7DE02799 - vperm 17,17,17,6 - .long 0x7E082799 - vperm 18,18,18,6 - .long 0x7E3A2799 - vperm 19,19,19,6 - .long 0x7E5B2799 - vperm 20,20,20,6 - .long 0x7E7C2799 - .long 0x7E9D2799 - addi 4,4,0x60 - b .Lctr32_enc8x_done - -.align 5 -.Lctr32_enc8x_five: - .long 0x11EF1D09 - .long 0x12105509 - .long 0x12316509 - .long 0x12526D09 - .long 0x12737509 - - vperm 15,15,15,6 - vperm 16,16,16,6 - .long 0x7DE02799 - vperm 17,17,17,6 - .long 0x7E082799 - vperm 18,18,18,6 - .long 0x7E3A2799 - vperm 19,19,19,6 - .long 0x7E5B2799 - .long 0x7E7C2799 - addi 4,4,0x50 - b .Lctr32_enc8x_done - -.align 5 -.Lctr32_enc8x_four: - .long 0x11EF5509 - .long 0x12106509 - .long 0x12316D09 - .long 0x12527509 - - vperm 15,15,15,6 - vperm 16,16,16,6 - .long 0x7DE02799 - vperm 17,17,17,6 - .long 0x7E082799 - vperm 18,18,18,6 - .long 0x7E3A2799 - .long 0x7E5B2799 - addi 4,4,0x40 - b .Lctr32_enc8x_done - -.align 5 -.Lctr32_enc8x_three: - .long 0x11EF6509 - .long 0x12106D09 - .long 0x12317509 - - vperm 15,15,15,6 - vperm 16,16,16,6 - .long 0x7DE02799 - vperm 17,17,17,6 - .long 0x7E082799 - .long 0x7E3A2799 - addi 4,4,0x30 - b .Lctr32_enc8x_done - -.align 5 -.Lctr32_enc8x_two: - .long 0x11EF6D09 - .long 0x12107509 - - vperm 15,15,15,6 - vperm 16,16,16,6 - .long 0x7DE02799 - .long 0x7E082799 - addi 4,4,0x20 - b .Lctr32_enc8x_done - -.align 5 -.Lctr32_enc8x_one: - .long 0x11EF7509 - - vperm 15,15,15,6 - .long 0x7DE02799 - addi 4,4,0x10 - -.Lctr32_enc8x_done: - li 10,79 - li 11,95 - stvx 6,10,1 - addi 10,10,32 - stvx 6,11,1 - addi 11,11,32 - stvx 6,10,1 - addi 10,10,32 - stvx 6,11,1 - addi 11,11,32 - stvx 6,10,1 - addi 10,10,32 - stvx 6,11,1 - addi 11,11,32 - stvx 6,10,1 - addi 10,10,32 - stvx 6,11,1 - addi 11,11,32 - - or 12,12,12 - lvx 20,10,1 - addi 10,10,32 - lvx 21,11,1 - addi 11,11,32 - lvx 22,10,1 - addi 10,10,32 - lvx 23,11,1 - addi 11,11,32 - lvx 24,10,1 - addi 10,10,32 - lvx 25,11,1 - addi 11,11,32 - lvx 26,10,1 - addi 10,10,32 - lvx 27,11,1 - addi 11,11,32 - lvx 28,10,1 - addi 10,10,32 - lvx 29,11,1 - addi 11,11,32 - lvx 30,10,1 - lvx 31,11,1 - ld 26,400(1) - ld 27,408(1) - ld 28,416(1) - ld 29,424(1) - ld 30,432(1) - ld 31,440(1) - addi 1,1,448 - blr -.long 0 -.byte 0,12,0x04,0,0x80,6,6,0 -.long 0 -.size aes_hw_ctr32_encrypt_blocks,.-aes_hw_ctr32_encrypt_blocks -.globl aes_hw_xts_encrypt -.type aes_hw_xts_encrypt,@function -.align 5 -aes_hw_xts_encrypt: -.localentry aes_hw_xts_encrypt,0 - - mr 10,3 - li 3,-1 - cmpldi 5,16 - .long 0x4dc00020 - - lis 0,0xfff0 - li 12,-1 - li 11,0 - or 0,0,0 - - vspltisb 9,0x07 - lvsl 6,11,11 - vspltisb 11,0x0f - vxor 6,6,9 - - li 3,15 - lvx 8,0,8 - lvsl 5,0,8 - lvx 4,3,8 - vxor 5,5,11 - vperm 8,8,4,5 - - neg 11,10 - lvsr 5,0,11 - lvx 2,0,10 - addi 10,10,15 - vxor 5,5,11 - - cmpldi 7,0 - beq .Lxts_enc_no_key2 - - lvsr 7,0,7 - lwz 9,240(7) - srwi 9,9,1 - subi 9,9,1 - li 3,16 - - lvx 0,0,7 - lvx 1,3,7 - addi 3,3,16 - vperm 0,1,0,7 - vxor 8,8,0 - lvx 0,3,7 - addi 3,3,16 - mtctr 9 - -.Ltweak_xts_enc: - vperm 1,0,1,7 - .long 0x11080D08 - lvx 1,3,7 - addi 3,3,16 - vperm 0,1,0,7 - .long 0x11080508 - lvx 0,3,7 - addi 3,3,16 - bdnz .Ltweak_xts_enc - - vperm 1,0,1,7 - .long 0x11080D08 - lvx 1,3,7 - vperm 0,1,0,7 - .long 0x11080509 - - li 8,0 - b .Lxts_enc - -.Lxts_enc_no_key2: - li 3,-16 - and 5,5,3 - - -.Lxts_enc: - lvx 4,0,10 - addi 10,10,16 - - lvsr 7,0,6 - lwz 9,240(6) - srwi 9,9,1 - subi 9,9,1 - li 3,16 - - vslb 10,9,9 - vor 10,10,9 - vspltisb 11,1 - vsldoi 10,10,11,15 - - cmpldi 5,96 - bge _aesp8_xts_encrypt6x - - andi. 7,5,15 - subic 0,5,32 - subi 7,7,16 - subfe 0,0,0 - and 0,0,7 - add 10,10,0 - - lvx 0,0,6 - lvx 1,3,6 - addi 3,3,16 - vperm 2,2,4,5 - vperm 0,1,0,7 - vxor 2,2,8 - vxor 2,2,0 - lvx 0,3,6 - addi 3,3,16 - mtctr 9 - b .Loop_xts_enc - -.align 5 -.Loop_xts_enc: - vperm 1,0,1,7 - .long 0x10420D08 - lvx 1,3,6 - addi 3,3,16 - vperm 0,1,0,7 - .long 0x10420508 - lvx 0,3,6 - addi 3,3,16 - bdnz .Loop_xts_enc - - vperm 1,0,1,7 - .long 0x10420D08 - lvx 1,3,6 - li 3,16 - vperm 0,1,0,7 - vxor 0,0,8 - .long 0x10620509 - - vperm 11,3,3,6 - - .long 0x7D602799 - - addi 4,4,16 - - subic. 5,5,16 - beq .Lxts_enc_done - - vor 2,4,4 - lvx 4,0,10 - addi 10,10,16 - lvx 0,0,6 - lvx 1,3,6 - addi 3,3,16 - - subic 0,5,32 - subfe 0,0,0 - and 0,0,7 - add 10,10,0 - - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vand 11,11,10 - vxor 8,8,11 - - vperm 2,2,4,5 - vperm 0,1,0,7 - vxor 2,2,8 - vxor 3,3,0 - vxor 2,2,0 - lvx 0,3,6 - addi 3,3,16 - - mtctr 9 - cmpldi 5,16 - bge .Loop_xts_enc - - vxor 3,3,8 - lvsr 5,0,5 - vxor 4,4,4 - vspltisb 11,-1 - vperm 4,4,11,5 - vsel 2,2,3,4 - - subi 11,4,17 - subi 4,4,16 - mtctr 5 - li 5,16 -.Loop_xts_enc_steal: - lbzu 0,1(11) - stb 0,16(11) - bdnz .Loop_xts_enc_steal - - mtctr 9 - b .Loop_xts_enc - -.Lxts_enc_done: - cmpldi 8,0 - beq .Lxts_enc_ret - - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vand 11,11,10 - vxor 8,8,11 - - vperm 8,8,8,6 - .long 0x7D004799 - -.Lxts_enc_ret: - or 12,12,12 - li 3,0 - blr -.long 0 -.byte 0,12,0x04,0,0x80,6,6,0 -.long 0 -.size aes_hw_xts_encrypt,.-aes_hw_xts_encrypt - -.globl aes_hw_xts_decrypt -.type aes_hw_xts_decrypt,@function -.align 5 -aes_hw_xts_decrypt: -.localentry aes_hw_xts_decrypt,0 - - mr 10,3 - li 3,-1 - cmpldi 5,16 - .long 0x4dc00020 - - lis 0,0xfff8 - li 12,-1 - li 11,0 - or 0,0,0 - - andi. 0,5,15 - neg 0,0 - andi. 0,0,16 - sub 5,5,0 - - vspltisb 9,0x07 - lvsl 6,11,11 - vspltisb 11,0x0f - vxor 6,6,9 - - li 3,15 - lvx 8,0,8 - lvsl 5,0,8 - lvx 4,3,8 - vxor 5,5,11 - vperm 8,8,4,5 - - neg 11,10 - lvsr 5,0,11 - lvx 2,0,10 - addi 10,10,15 - vxor 5,5,11 - - cmpldi 7,0 - beq .Lxts_dec_no_key2 - - lvsr 7,0,7 - lwz 9,240(7) - srwi 9,9,1 - subi 9,9,1 - li 3,16 - - lvx 0,0,7 - lvx 1,3,7 - addi 3,3,16 - vperm 0,1,0,7 - vxor 8,8,0 - lvx 0,3,7 - addi 3,3,16 - mtctr 9 - -.Ltweak_xts_dec: - vperm 1,0,1,7 - .long 0x11080D08 - lvx 1,3,7 - addi 3,3,16 - vperm 0,1,0,7 - .long 0x11080508 - lvx 0,3,7 - addi 3,3,16 - bdnz .Ltweak_xts_dec - - vperm 1,0,1,7 - .long 0x11080D08 - lvx 1,3,7 - vperm 0,1,0,7 - .long 0x11080509 - - li 8,0 - b .Lxts_dec - -.Lxts_dec_no_key2: - neg 3,5 - andi. 3,3,15 - add 5,5,3 - - -.Lxts_dec: - lvx 4,0,10 - addi 10,10,16 - - lvsr 7,0,6 - lwz 9,240(6) - srwi 9,9,1 - subi 9,9,1 - li 3,16 - - vslb 10,9,9 - vor 10,10,9 - vspltisb 11,1 - vsldoi 10,10,11,15 - - cmpldi 5,96 - bge _aesp8_xts_decrypt6x - - lvx 0,0,6 - lvx 1,3,6 - addi 3,3,16 - vperm 2,2,4,5 - vperm 0,1,0,7 - vxor 2,2,8 - vxor 2,2,0 - lvx 0,3,6 - addi 3,3,16 - mtctr 9 - - cmpldi 5,16 - blt .Ltail_xts_dec - - -.align 5 -.Loop_xts_dec: - vperm 1,0,1,7 - .long 0x10420D48 - lvx 1,3,6 - addi 3,3,16 - vperm 0,1,0,7 - .long 0x10420548 - lvx 0,3,6 - addi 3,3,16 - bdnz .Loop_xts_dec - - vperm 1,0,1,7 - .long 0x10420D48 - lvx 1,3,6 - li 3,16 - vperm 0,1,0,7 - vxor 0,0,8 - .long 0x10620549 - - vperm 11,3,3,6 - - .long 0x7D602799 - - addi 4,4,16 - - subic. 5,5,16 - beq .Lxts_dec_done - - vor 2,4,4 - lvx 4,0,10 - addi 10,10,16 - lvx 0,0,6 - lvx 1,3,6 - addi 3,3,16 - - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vand 11,11,10 - vxor 8,8,11 - - vperm 2,2,4,5 - vperm 0,1,0,7 - vxor 2,2,8 - vxor 2,2,0 - lvx 0,3,6 - addi 3,3,16 - - mtctr 9 - cmpldi 5,16 - bge .Loop_xts_dec - -.Ltail_xts_dec: - vsrab 11,8,9 - vaddubm 12,8,8 - vsldoi 11,11,11,15 - vand 11,11,10 - vxor 12,12,11 - - subi 10,10,16 - add 10,10,5 - - vxor 2,2,8 - vxor 2,2,12 - -.Loop_xts_dec_short: - vperm 1,0,1,7 - .long 0x10420D48 - lvx 1,3,6 - addi 3,3,16 - vperm 0,1,0,7 - .long 0x10420548 - lvx 0,3,6 - addi 3,3,16 - bdnz .Loop_xts_dec_short - - vperm 1,0,1,7 - .long 0x10420D48 - lvx 1,3,6 - li 3,16 - vperm 0,1,0,7 - vxor 0,0,12 - .long 0x10620549 - - vperm 11,3,3,6 - - .long 0x7D602799 - - - vor 2,4,4 - lvx 4,0,10 - - lvx 0,0,6 - lvx 1,3,6 - addi 3,3,16 - vperm 2,2,4,5 - vperm 0,1,0,7 - - lvsr 5,0,5 - vxor 4,4,4 - vspltisb 11,-1 - vperm 4,4,11,5 - vsel 2,2,3,4 - - vxor 0,0,8 - vxor 2,2,0 - lvx 0,3,6 - addi 3,3,16 - - subi 11,4,1 - mtctr 5 - li 5,16 -.Loop_xts_dec_steal: - lbzu 0,1(11) - stb 0,16(11) - bdnz .Loop_xts_dec_steal - - mtctr 9 - b .Loop_xts_dec - -.Lxts_dec_done: - cmpldi 8,0 - beq .Lxts_dec_ret - - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vand 11,11,10 - vxor 8,8,11 - - vperm 8,8,8,6 - .long 0x7D004799 - -.Lxts_dec_ret: - or 12,12,12 - li 3,0 - blr -.long 0 -.byte 0,12,0x04,0,0x80,6,6,0 -.long 0 -.size aes_hw_xts_decrypt,.-aes_hw_xts_decrypt -.align 5 -_aesp8_xts_encrypt6x: - stdu 1,-448(1) - mflr 11 - li 7,207 - li 3,223 - std 11,464(1) - stvx 20,7,1 - addi 7,7,32 - stvx 21,3,1 - addi 3,3,32 - stvx 22,7,1 - addi 7,7,32 - stvx 23,3,1 - addi 3,3,32 - stvx 24,7,1 - addi 7,7,32 - stvx 25,3,1 - addi 3,3,32 - stvx 26,7,1 - addi 7,7,32 - stvx 27,3,1 - addi 3,3,32 - stvx 28,7,1 - addi 7,7,32 - stvx 29,3,1 - addi 3,3,32 - stvx 30,7,1 - stvx 31,3,1 - li 0,-1 - stw 12,396(1) - li 3,0x10 - std 26,400(1) - li 26,0x20 - std 27,408(1) - li 27,0x30 - std 28,416(1) - li 28,0x40 - std 29,424(1) - li 29,0x50 - std 30,432(1) - li 30,0x60 - std 31,440(1) - li 31,0x70 - or 0,0,0 - - subi 9,9,3 - - lvx 23,0,6 - lvx 30,3,6 - addi 6,6,0x20 - lvx 31,0,6 - vperm 23,30,23,7 - addi 7,1,79 - mtctr 9 - -.Load_xts_enc_key: - vperm 24,31,30,7 - lvx 30,3,6 - addi 6,6,0x20 - stvx 24,0,7 - vperm 25,30,31,7 - lvx 31,0,6 - stvx 25,3,7 - addi 7,7,0x20 - bdnz .Load_xts_enc_key - - lvx 26,3,6 - vperm 24,31,30,7 - lvx 27,26,6 - stvx 24,0,7 - vperm 25,26,31,7 - lvx 28,27,6 - stvx 25,3,7 - addi 7,1,79 - vperm 26,27,26,7 - lvx 29,28,6 - vperm 27,28,27,7 - lvx 30,29,6 - vperm 28,29,28,7 - lvx 31,30,6 - vperm 29,30,29,7 - lvx 22,31,6 - vperm 30,31,30,7 - lvx 24,0,7 - vperm 31,22,31,7 - lvx 25,3,7 - - vperm 0,2,4,5 - subi 10,10,31 - vxor 17,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vand 11,11,10 - vxor 7,0,17 - vxor 8,8,11 - - .long 0x7C235699 - vxor 18,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 1,1,1,6 - vand 11,11,10 - vxor 12,1,18 - vxor 8,8,11 - - .long 0x7C5A5699 - andi. 31,5,15 - vxor 19,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 2,2,2,6 - vand 11,11,10 - vxor 13,2,19 - vxor 8,8,11 - - .long 0x7C7B5699 - sub 5,5,31 - vxor 20,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 3,3,3,6 - vand 11,11,10 - vxor 14,3,20 - vxor 8,8,11 - - .long 0x7C9C5699 - subi 5,5,0x60 - vxor 21,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 4,4,4,6 - vand 11,11,10 - vxor 15,4,21 - vxor 8,8,11 - - .long 0x7CBD5699 - addi 10,10,0x60 - vxor 22,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 5,5,5,6 - vand 11,11,10 - vxor 16,5,22 - vxor 8,8,11 - - vxor 31,31,23 - mtctr 9 - b .Loop_xts_enc6x - -.align 5 -.Loop_xts_enc6x: - .long 0x10E7C508 - .long 0x118CC508 - .long 0x11ADC508 - .long 0x11CEC508 - .long 0x11EFC508 - .long 0x1210C508 - lvx 24,26,7 - addi 7,7,0x20 - - .long 0x10E7CD08 - .long 0x118CCD08 - .long 0x11ADCD08 - .long 0x11CECD08 - .long 0x11EFCD08 - .long 0x1210CD08 - lvx 25,3,7 - bdnz .Loop_xts_enc6x - - subic 5,5,96 - vxor 0,17,31 - .long 0x10E7C508 - .long 0x118CC508 - vsrab 11,8,9 - vxor 17,8,23 - vaddubm 8,8,8 - .long 0x11ADC508 - .long 0x11CEC508 - vsldoi 11,11,11,15 - .long 0x11EFC508 - .long 0x1210C508 - - subfe. 0,0,0 - vand 11,11,10 - .long 0x10E7CD08 - .long 0x118CCD08 - vxor 8,8,11 - .long 0x11ADCD08 - .long 0x11CECD08 - vxor 1,18,31 - vsrab 11,8,9 - vxor 18,8,23 - .long 0x11EFCD08 - .long 0x1210CD08 - - and 0,0,5 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - .long 0x10E7D508 - .long 0x118CD508 - vand 11,11,10 - .long 0x11ADD508 - .long 0x11CED508 - vxor 8,8,11 - .long 0x11EFD508 - .long 0x1210D508 - - add 10,10,0 - - - - vxor 2,19,31 - vsrab 11,8,9 - vxor 19,8,23 - vaddubm 8,8,8 - .long 0x10E7DD08 - .long 0x118CDD08 - vsldoi 11,11,11,15 - .long 0x11ADDD08 - .long 0x11CEDD08 - vand 11,11,10 - .long 0x11EFDD08 - .long 0x1210DD08 - - addi 7,1,79 - vxor 8,8,11 - .long 0x10E7E508 - .long 0x118CE508 - vxor 3,20,31 - vsrab 11,8,9 - vxor 20,8,23 - .long 0x11ADE508 - .long 0x11CEE508 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - .long 0x11EFE508 - .long 0x1210E508 - lvx 24,0,7 - vand 11,11,10 - - .long 0x10E7ED08 - .long 0x118CED08 - vxor 8,8,11 - .long 0x11ADED08 - .long 0x11CEED08 - vxor 4,21,31 - vsrab 11,8,9 - vxor 21,8,23 - .long 0x11EFED08 - .long 0x1210ED08 - lvx 25,3,7 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - - .long 0x10E7F508 - .long 0x118CF508 - vand 11,11,10 - .long 0x11ADF508 - .long 0x11CEF508 - vxor 8,8,11 - .long 0x11EFF508 - .long 0x1210F508 - vxor 5,22,31 - vsrab 11,8,9 - vxor 22,8,23 - - .long 0x10E70509 - .long 0x7C005699 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - .long 0x118C0D09 - .long 0x7C235699 - .long 0x11AD1509 - vperm 0,0,0,6 - .long 0x7C5A5699 - vand 11,11,10 - .long 0x11CE1D09 - vperm 1,1,1,6 - .long 0x7C7B5699 - .long 0x11EF2509 - vperm 2,2,2,6 - .long 0x7C9C5699 - vxor 8,8,11 - .long 0x11702D09 - - vperm 3,3,3,6 - .long 0x7CBD5699 - addi 10,10,0x60 - vperm 4,4,4,6 - vperm 5,5,5,6 - - vperm 7,7,7,6 - vperm 12,12,12,6 - .long 0x7CE02799 - vxor 7,0,17 - vperm 13,13,13,6 - .long 0x7D832799 - vxor 12,1,18 - vperm 14,14,14,6 - .long 0x7DBA2799 - vxor 13,2,19 - vperm 15,15,15,6 - .long 0x7DDB2799 - vxor 14,3,20 - vperm 16,11,11,6 - .long 0x7DFC2799 - vxor 15,4,21 - .long 0x7E1D2799 - - vxor 16,5,22 - addi 4,4,0x60 - - mtctr 9 - beq .Loop_xts_enc6x - - addic. 5,5,0x60 - beq .Lxts_enc6x_zero - cmpwi 5,0x20 - blt .Lxts_enc6x_one - nop - beq .Lxts_enc6x_two - cmpwi 5,0x40 - blt .Lxts_enc6x_three - nop - beq .Lxts_enc6x_four - -.Lxts_enc6x_five: - vxor 7,1,17 - vxor 12,2,18 - vxor 13,3,19 - vxor 14,4,20 - vxor 15,5,21 - - bl _aesp8_xts_enc5x - - vperm 7,7,7,6 - vor 17,22,22 - vperm 12,12,12,6 - .long 0x7CE02799 - vperm 13,13,13,6 - .long 0x7D832799 - vperm 14,14,14,6 - .long 0x7DBA2799 - vxor 11,15,22 - vperm 15,15,15,6 - .long 0x7DDB2799 - .long 0x7DFC2799 - addi 4,4,0x50 - bne .Lxts_enc6x_steal - b .Lxts_enc6x_done - -.align 4 -.Lxts_enc6x_four: - vxor 7,2,17 - vxor 12,3,18 - vxor 13,4,19 - vxor 14,5,20 - vxor 15,15,15 - - bl _aesp8_xts_enc5x - - vperm 7,7,7,6 - vor 17,21,21 - vperm 12,12,12,6 - .long 0x7CE02799 - vperm 13,13,13,6 - .long 0x7D832799 - vxor 11,14,21 - vperm 14,14,14,6 - .long 0x7DBA2799 - .long 0x7DDB2799 - addi 4,4,0x40 - bne .Lxts_enc6x_steal - b .Lxts_enc6x_done - -.align 4 -.Lxts_enc6x_three: - vxor 7,3,17 - vxor 12,4,18 - vxor 13,5,19 - vxor 14,14,14 - vxor 15,15,15 - - bl _aesp8_xts_enc5x - - vperm 7,7,7,6 - vor 17,20,20 - vperm 12,12,12,6 - .long 0x7CE02799 - vxor 11,13,20 - vperm 13,13,13,6 - .long 0x7D832799 - .long 0x7DBA2799 - addi 4,4,0x30 - bne .Lxts_enc6x_steal - b .Lxts_enc6x_done - -.align 4 -.Lxts_enc6x_two: - vxor 7,4,17 - vxor 12,5,18 - vxor 13,13,13 - vxor 14,14,14 - vxor 15,15,15 - - bl _aesp8_xts_enc5x - - vperm 7,7,7,6 - vor 17,19,19 - vxor 11,12,19 - vperm 12,12,12,6 - .long 0x7CE02799 - .long 0x7D832799 - addi 4,4,0x20 - bne .Lxts_enc6x_steal - b .Lxts_enc6x_done - -.align 4 -.Lxts_enc6x_one: - vxor 7,5,17 - nop -.Loop_xts_enc1x: - .long 0x10E7C508 - lvx 24,26,7 - addi 7,7,0x20 - - .long 0x10E7CD08 - lvx 25,3,7 - bdnz .Loop_xts_enc1x - - add 10,10,31 - cmpwi 31,0 - .long 0x10E7C508 - - subi 10,10,16 - .long 0x10E7CD08 - - lvsr 5,0,31 - .long 0x10E7D508 - - .long 0x7C005699 - .long 0x10E7DD08 - - addi 7,1,79 - .long 0x10E7E508 - lvx 24,0,7 - - .long 0x10E7ED08 - lvx 25,3,7 - vxor 17,17,31 - - vperm 0,0,0,6 - .long 0x10E7F508 - - vperm 0,0,0,5 - .long 0x10E78D09 - - vor 17,18,18 - vxor 11,7,18 - vperm 7,7,7,6 - .long 0x7CE02799 - addi 4,4,0x10 - bne .Lxts_enc6x_steal - b .Lxts_enc6x_done - -.align 4 -.Lxts_enc6x_zero: - cmpwi 31,0 - beq .Lxts_enc6x_done - - add 10,10,31 - subi 10,10,16 - .long 0x7C005699 - lvsr 5,0,31 - vperm 0,0,0,6 - vperm 0,0,0,5 - vxor 11,11,17 -.Lxts_enc6x_steal: - vxor 0,0,17 - vxor 7,7,7 - vspltisb 12,-1 - vperm 7,7,12,5 - vsel 7,0,11,7 - - subi 30,4,17 - subi 4,4,16 - mtctr 31 -.Loop_xts_enc6x_steal: - lbzu 0,1(30) - stb 0,16(30) - bdnz .Loop_xts_enc6x_steal - - li 31,0 - mtctr 9 - b .Loop_xts_enc1x - -.align 4 -.Lxts_enc6x_done: - cmpldi 8,0 - beq .Lxts_enc6x_ret - - vxor 8,17,23 - vperm 8,8,8,6 - .long 0x7D004799 - -.Lxts_enc6x_ret: - mtlr 11 - li 10,79 - li 11,95 - stvx 9,10,1 - addi 10,10,32 - stvx 9,11,1 - addi 11,11,32 - stvx 9,10,1 - addi 10,10,32 - stvx 9,11,1 - addi 11,11,32 - stvx 9,10,1 - addi 10,10,32 - stvx 9,11,1 - addi 11,11,32 - stvx 9,10,1 - addi 10,10,32 - stvx 9,11,1 - addi 11,11,32 - - or 12,12,12 - lvx 20,10,1 - addi 10,10,32 - lvx 21,11,1 - addi 11,11,32 - lvx 22,10,1 - addi 10,10,32 - lvx 23,11,1 - addi 11,11,32 - lvx 24,10,1 - addi 10,10,32 - lvx 25,11,1 - addi 11,11,32 - lvx 26,10,1 - addi 10,10,32 - lvx 27,11,1 - addi 11,11,32 - lvx 28,10,1 - addi 10,10,32 - lvx 29,11,1 - addi 11,11,32 - lvx 30,10,1 - lvx 31,11,1 - ld 26,400(1) - ld 27,408(1) - ld 28,416(1) - ld 29,424(1) - ld 30,432(1) - ld 31,440(1) - addi 1,1,448 - blr -.long 0 -.byte 0,12,0x04,1,0x80,6,6,0 -.long 0 - -.align 5 -_aesp8_xts_enc5x: - .long 0x10E7C508 - .long 0x118CC508 - .long 0x11ADC508 - .long 0x11CEC508 - .long 0x11EFC508 - lvx 24,26,7 - addi 7,7,0x20 - - .long 0x10E7CD08 - .long 0x118CCD08 - .long 0x11ADCD08 - .long 0x11CECD08 - .long 0x11EFCD08 - lvx 25,3,7 - bdnz _aesp8_xts_enc5x - - add 10,10,31 - cmpwi 31,0 - .long 0x10E7C508 - .long 0x118CC508 - .long 0x11ADC508 - .long 0x11CEC508 - .long 0x11EFC508 - - subi 10,10,16 - .long 0x10E7CD08 - .long 0x118CCD08 - .long 0x11ADCD08 - .long 0x11CECD08 - .long 0x11EFCD08 - vxor 17,17,31 - - .long 0x10E7D508 - lvsr 5,0,31 - .long 0x118CD508 - .long 0x11ADD508 - .long 0x11CED508 - .long 0x11EFD508 - vxor 1,18,31 - - .long 0x10E7DD08 - .long 0x7C005699 - .long 0x118CDD08 - .long 0x11ADDD08 - .long 0x11CEDD08 - .long 0x11EFDD08 - vxor 2,19,31 - - addi 7,1,79 - .long 0x10E7E508 - .long 0x118CE508 - .long 0x11ADE508 - .long 0x11CEE508 - .long 0x11EFE508 - lvx 24,0,7 - vxor 3,20,31 - - .long 0x10E7ED08 - vperm 0,0,0,6 - .long 0x118CED08 - .long 0x11ADED08 - .long 0x11CEED08 - .long 0x11EFED08 - lvx 25,3,7 - vxor 4,21,31 - - .long 0x10E7F508 - vperm 0,0,0,5 - .long 0x118CF508 - .long 0x11ADF508 - .long 0x11CEF508 - .long 0x11EFF508 - - .long 0x10E78D09 - .long 0x118C0D09 - .long 0x11AD1509 - .long 0x11CE1D09 - .long 0x11EF2509 - blr -.long 0 -.byte 0,12,0x14,0,0,0,0,0 - -.align 5 -_aesp8_xts_decrypt6x: - stdu 1,-448(1) - mflr 11 - li 7,207 - li 3,223 - std 11,464(1) - stvx 20,7,1 - addi 7,7,32 - stvx 21,3,1 - addi 3,3,32 - stvx 22,7,1 - addi 7,7,32 - stvx 23,3,1 - addi 3,3,32 - stvx 24,7,1 - addi 7,7,32 - stvx 25,3,1 - addi 3,3,32 - stvx 26,7,1 - addi 7,7,32 - stvx 27,3,1 - addi 3,3,32 - stvx 28,7,1 - addi 7,7,32 - stvx 29,3,1 - addi 3,3,32 - stvx 30,7,1 - stvx 31,3,1 - li 0,-1 - stw 12,396(1) - li 3,0x10 - std 26,400(1) - li 26,0x20 - std 27,408(1) - li 27,0x30 - std 28,416(1) - li 28,0x40 - std 29,424(1) - li 29,0x50 - std 30,432(1) - li 30,0x60 - std 31,440(1) - li 31,0x70 - or 0,0,0 - - subi 9,9,3 - - lvx 23,0,6 - lvx 30,3,6 - addi 6,6,0x20 - lvx 31,0,6 - vperm 23,30,23,7 - addi 7,1,79 - mtctr 9 - -.Load_xts_dec_key: - vperm 24,31,30,7 - lvx 30,3,6 - addi 6,6,0x20 - stvx 24,0,7 - vperm 25,30,31,7 - lvx 31,0,6 - stvx 25,3,7 - addi 7,7,0x20 - bdnz .Load_xts_dec_key - - lvx 26,3,6 - vperm 24,31,30,7 - lvx 27,26,6 - stvx 24,0,7 - vperm 25,26,31,7 - lvx 28,27,6 - stvx 25,3,7 - addi 7,1,79 - vperm 26,27,26,7 - lvx 29,28,6 - vperm 27,28,27,7 - lvx 30,29,6 - vperm 28,29,28,7 - lvx 31,30,6 - vperm 29,30,29,7 - lvx 22,31,6 - vperm 30,31,30,7 - lvx 24,0,7 - vperm 31,22,31,7 - lvx 25,3,7 - - vperm 0,2,4,5 - subi 10,10,31 - vxor 17,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vand 11,11,10 - vxor 7,0,17 - vxor 8,8,11 - - .long 0x7C235699 - vxor 18,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 1,1,1,6 - vand 11,11,10 - vxor 12,1,18 - vxor 8,8,11 - - .long 0x7C5A5699 - andi. 31,5,15 - vxor 19,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 2,2,2,6 - vand 11,11,10 - vxor 13,2,19 - vxor 8,8,11 - - .long 0x7C7B5699 - sub 5,5,31 - vxor 20,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 3,3,3,6 - vand 11,11,10 - vxor 14,3,20 - vxor 8,8,11 - - .long 0x7C9C5699 - subi 5,5,0x60 - vxor 21,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 4,4,4,6 - vand 11,11,10 - vxor 15,4,21 - vxor 8,8,11 - - .long 0x7CBD5699 - addi 10,10,0x60 - vxor 22,8,23 - vsrab 11,8,9 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - vperm 5,5,5,6 - vand 11,11,10 - vxor 16,5,22 - vxor 8,8,11 - - vxor 31,31,23 - mtctr 9 - b .Loop_xts_dec6x - -.align 5 -.Loop_xts_dec6x: - .long 0x10E7C548 - .long 0x118CC548 - .long 0x11ADC548 - .long 0x11CEC548 - .long 0x11EFC548 - .long 0x1210C548 - lvx 24,26,7 - addi 7,7,0x20 - - .long 0x10E7CD48 - .long 0x118CCD48 - .long 0x11ADCD48 - .long 0x11CECD48 - .long 0x11EFCD48 - .long 0x1210CD48 - lvx 25,3,7 - bdnz .Loop_xts_dec6x - - subic 5,5,96 - vxor 0,17,31 - .long 0x10E7C548 - .long 0x118CC548 - vsrab 11,8,9 - vxor 17,8,23 - vaddubm 8,8,8 - .long 0x11ADC548 - .long 0x11CEC548 - vsldoi 11,11,11,15 - .long 0x11EFC548 - .long 0x1210C548 - - subfe. 0,0,0 - vand 11,11,10 - .long 0x10E7CD48 - .long 0x118CCD48 - vxor 8,8,11 - .long 0x11ADCD48 - .long 0x11CECD48 - vxor 1,18,31 - vsrab 11,8,9 - vxor 18,8,23 - .long 0x11EFCD48 - .long 0x1210CD48 - - and 0,0,5 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - .long 0x10E7D548 - .long 0x118CD548 - vand 11,11,10 - .long 0x11ADD548 - .long 0x11CED548 - vxor 8,8,11 - .long 0x11EFD548 - .long 0x1210D548 - - add 10,10,0 - - - - vxor 2,19,31 - vsrab 11,8,9 - vxor 19,8,23 - vaddubm 8,8,8 - .long 0x10E7DD48 - .long 0x118CDD48 - vsldoi 11,11,11,15 - .long 0x11ADDD48 - .long 0x11CEDD48 - vand 11,11,10 - .long 0x11EFDD48 - .long 0x1210DD48 - - addi 7,1,79 - vxor 8,8,11 - .long 0x10E7E548 - .long 0x118CE548 - vxor 3,20,31 - vsrab 11,8,9 - vxor 20,8,23 - .long 0x11ADE548 - .long 0x11CEE548 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - .long 0x11EFE548 - .long 0x1210E548 - lvx 24,0,7 - vand 11,11,10 - - .long 0x10E7ED48 - .long 0x118CED48 - vxor 8,8,11 - .long 0x11ADED48 - .long 0x11CEED48 - vxor 4,21,31 - vsrab 11,8,9 - vxor 21,8,23 - .long 0x11EFED48 - .long 0x1210ED48 - lvx 25,3,7 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - - .long 0x10E7F548 - .long 0x118CF548 - vand 11,11,10 - .long 0x11ADF548 - .long 0x11CEF548 - vxor 8,8,11 - .long 0x11EFF548 - .long 0x1210F548 - vxor 5,22,31 - vsrab 11,8,9 - vxor 22,8,23 - - .long 0x10E70549 - .long 0x7C005699 - vaddubm 8,8,8 - vsldoi 11,11,11,15 - .long 0x118C0D49 - .long 0x7C235699 - .long 0x11AD1549 - vperm 0,0,0,6 - .long 0x7C5A5699 - vand 11,11,10 - .long 0x11CE1D49 - vperm 1,1,1,6 - .long 0x7C7B5699 - .long 0x11EF2549 - vperm 2,2,2,6 - .long 0x7C9C5699 - vxor 8,8,11 - .long 0x12102D49 - vperm 3,3,3,6 - .long 0x7CBD5699 - addi 10,10,0x60 - vperm 4,4,4,6 - vperm 5,5,5,6 - - vperm 7,7,7,6 - vperm 12,12,12,6 - .long 0x7CE02799 - vxor 7,0,17 - vperm 13,13,13,6 - .long 0x7D832799 - vxor 12,1,18 - vperm 14,14,14,6 - .long 0x7DBA2799 - vxor 13,2,19 - vperm 15,15,15,6 - .long 0x7DDB2799 - vxor 14,3,20 - vperm 16,16,16,6 - .long 0x7DFC2799 - vxor 15,4,21 - .long 0x7E1D2799 - vxor 16,5,22 - addi 4,4,0x60 - - mtctr 9 - beq .Loop_xts_dec6x - - addic. 5,5,0x60 - beq .Lxts_dec6x_zero - cmpwi 5,0x20 - blt .Lxts_dec6x_one - nop - beq .Lxts_dec6x_two - cmpwi 5,0x40 - blt .Lxts_dec6x_three - nop - beq .Lxts_dec6x_four - -.Lxts_dec6x_five: - vxor 7,1,17 - vxor 12,2,18 - vxor 13,3,19 - vxor 14,4,20 - vxor 15,5,21 - - bl _aesp8_xts_dec5x - - vperm 7,7,7,6 - vor 17,22,22 - vxor 18,8,23 - vperm 12,12,12,6 - .long 0x7CE02799 - vxor 7,0,18 - vperm 13,13,13,6 - .long 0x7D832799 - vperm 14,14,14,6 - .long 0x7DBA2799 - vperm 15,15,15,6 - .long 0x7DDB2799 - .long 0x7DFC2799 - addi 4,4,0x50 - bne .Lxts_dec6x_steal - b .Lxts_dec6x_done - -.align 4 -.Lxts_dec6x_four: - vxor 7,2,17 - vxor 12,3,18 - vxor 13,4,19 - vxor 14,5,20 - vxor 15,15,15 - - bl _aesp8_xts_dec5x - - vperm 7,7,7,6 - vor 17,21,21 - vor 18,22,22 - vperm 12,12,12,6 - .long 0x7CE02799 - vxor 7,0,22 - vperm 13,13,13,6 - .long 0x7D832799 - vperm 14,14,14,6 - .long 0x7DBA2799 - .long 0x7DDB2799 - addi 4,4,0x40 - bne .Lxts_dec6x_steal - b .Lxts_dec6x_done - -.align 4 -.Lxts_dec6x_three: - vxor 7,3,17 - vxor 12,4,18 - vxor 13,5,19 - vxor 14,14,14 - vxor 15,15,15 - - bl _aesp8_xts_dec5x - - vperm 7,7,7,6 - vor 17,20,20 - vor 18,21,21 - vperm 12,12,12,6 - .long 0x7CE02799 - vxor 7,0,21 - vperm 13,13,13,6 - .long 0x7D832799 - .long 0x7DBA2799 - addi 4,4,0x30 - bne .Lxts_dec6x_steal - b .Lxts_dec6x_done - -.align 4 -.Lxts_dec6x_two: - vxor 7,4,17 - vxor 12,5,18 - vxor 13,13,13 - vxor 14,14,14 - vxor 15,15,15 - - bl _aesp8_xts_dec5x - - vperm 7,7,7,6 - vor 17,19,19 - vor 18,20,20 - vperm 12,12,12,6 - .long 0x7CE02799 - vxor 7,0,20 - .long 0x7D832799 - addi 4,4,0x20 - bne .Lxts_dec6x_steal - b .Lxts_dec6x_done - -.align 4 -.Lxts_dec6x_one: - vxor 7,5,17 - nop -.Loop_xts_dec1x: - .long 0x10E7C548 - lvx 24,26,7 - addi 7,7,0x20 - - .long 0x10E7CD48 - lvx 25,3,7 - bdnz .Loop_xts_dec1x - - subi 0,31,1 - .long 0x10E7C548 - - andi. 0,0,16 - cmpwi 31,0 - .long 0x10E7CD48 - - sub 10,10,0 - .long 0x10E7D548 - - .long 0x7C005699 - .long 0x10E7DD48 - - addi 7,1,79 - .long 0x10E7E548 - lvx 24,0,7 - - .long 0x10E7ED48 - lvx 25,3,7 - vxor 17,17,31 - - vperm 0,0,0,6 - .long 0x10E7F548 - - mtctr 9 - .long 0x10E78D49 - - vor 17,18,18 - vor 18,19,19 - vperm 7,7,7,6 - .long 0x7CE02799 - addi 4,4,0x10 - vxor 7,0,19 - bne .Lxts_dec6x_steal - b .Lxts_dec6x_done - -.align 4 -.Lxts_dec6x_zero: - cmpwi 31,0 - beq .Lxts_dec6x_done - - .long 0x7C005699 - vperm 0,0,0,6 - vxor 7,0,18 -.Lxts_dec6x_steal: - .long 0x10E7C548 - lvx 24,26,7 - addi 7,7,0x20 - - .long 0x10E7CD48 - lvx 25,3,7 - bdnz .Lxts_dec6x_steal - - add 10,10,31 - .long 0x10E7C548 - - cmpwi 31,0 - .long 0x10E7CD48 - - .long 0x7C005699 - .long 0x10E7D548 - - lvsr 5,0,31 - .long 0x10E7DD48 - - addi 7,1,79 - .long 0x10E7E548 - lvx 24,0,7 - - .long 0x10E7ED48 - lvx 25,3,7 - vxor 18,18,31 - - vperm 0,0,0,6 - .long 0x10E7F548 - - vperm 0,0,0,5 - .long 0x11679549 - - vperm 7,11,11,6 - .long 0x7CE02799 - - - vxor 7,7,7 - vspltisb 12,-1 - vperm 7,7,12,5 - vsel 7,0,11,7 - vxor 7,7,17 - - subi 30,4,1 - mtctr 31 -.Loop_xts_dec6x_steal: - lbzu 0,1(30) - stb 0,16(30) - bdnz .Loop_xts_dec6x_steal - - li 31,0 - mtctr 9 - b .Loop_xts_dec1x - -.align 4 -.Lxts_dec6x_done: - cmpldi 8,0 - beq .Lxts_dec6x_ret - - vxor 8,17,23 - vperm 8,8,8,6 - .long 0x7D004799 - -.Lxts_dec6x_ret: - mtlr 11 - li 10,79 - li 11,95 - stvx 9,10,1 - addi 10,10,32 - stvx 9,11,1 - addi 11,11,32 - stvx 9,10,1 - addi 10,10,32 - stvx 9,11,1 - addi 11,11,32 - stvx 9,10,1 - addi 10,10,32 - stvx 9,11,1 - addi 11,11,32 - stvx 9,10,1 - addi 10,10,32 - stvx 9,11,1 - addi 11,11,32 - - or 12,12,12 - lvx 20,10,1 - addi 10,10,32 - lvx 21,11,1 - addi 11,11,32 - lvx 22,10,1 - addi 10,10,32 - lvx 23,11,1 - addi 11,11,32 - lvx 24,10,1 - addi 10,10,32 - lvx 25,11,1 - addi 11,11,32 - lvx 26,10,1 - addi 10,10,32 - lvx 27,11,1 - addi 11,11,32 - lvx 28,10,1 - addi 10,10,32 - lvx 29,11,1 - addi 11,11,32 - lvx 30,10,1 - lvx 31,11,1 - ld 26,400(1) - ld 27,408(1) - ld 28,416(1) - ld 29,424(1) - ld 30,432(1) - ld 31,440(1) - addi 1,1,448 - blr -.long 0 -.byte 0,12,0x04,1,0x80,6,6,0 -.long 0 - -.align 5 -_aesp8_xts_dec5x: - .long 0x10E7C548 - .long 0x118CC548 - .long 0x11ADC548 - .long 0x11CEC548 - .long 0x11EFC548 - lvx 24,26,7 - addi 7,7,0x20 - - .long 0x10E7CD48 - .long 0x118CCD48 - .long 0x11ADCD48 - .long 0x11CECD48 - .long 0x11EFCD48 - lvx 25,3,7 - bdnz _aesp8_xts_dec5x - - subi 0,31,1 - .long 0x10E7C548 - .long 0x118CC548 - .long 0x11ADC548 - .long 0x11CEC548 - .long 0x11EFC548 - - andi. 0,0,16 - cmpwi 31,0 - .long 0x10E7CD48 - .long 0x118CCD48 - .long 0x11ADCD48 - .long 0x11CECD48 - .long 0x11EFCD48 - vxor 17,17,31 - - sub 10,10,0 - .long 0x10E7D548 - .long 0x118CD548 - .long 0x11ADD548 - .long 0x11CED548 - .long 0x11EFD548 - vxor 1,18,31 - - .long 0x10E7DD48 - .long 0x7C005699 - .long 0x118CDD48 - .long 0x11ADDD48 - .long 0x11CEDD48 - .long 0x11EFDD48 - vxor 2,19,31 - - addi 7,1,79 - .long 0x10E7E548 - .long 0x118CE548 - .long 0x11ADE548 - .long 0x11CEE548 - .long 0x11EFE548 - lvx 24,0,7 - vxor 3,20,31 - - .long 0x10E7ED48 - vperm 0,0,0,6 - .long 0x118CED48 - .long 0x11ADED48 - .long 0x11CEED48 - .long 0x11EFED48 - lvx 25,3,7 - vxor 4,21,31 - - .long 0x10E7F548 - .long 0x118CF548 - .long 0x11ADF548 - .long 0x11CEF548 - .long 0x11EFF548 - - .long 0x10E78D49 - .long 0x118C0D49 - .long 0x11AD1549 - .long 0x11CE1D49 - .long 0x11EF2549 - mtctr 9 - blr -.long 0 -.byte 0,12,0x14,0,0,0,0,0 -#endif // !OPENSSL_NO_ASM && __powerpc64__ -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-ppc64le/crypto/fipsmodule/ghashp8-ppc.S b/third_party/boringssl/linux-ppc64le/crypto/fipsmodule/ghashp8-ppc.S deleted file mode 100644 index 76b4e739607d..000000000000 --- a/third_party/boringssl/linux-ppc64le/crypto/fipsmodule/ghashp8-ppc.S +++ /dev/null @@ -1,587 +0,0 @@ -// 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__) -.machine "any" - -.abiversion 2 -.text - -.globl gcm_init_p8 -.type gcm_init_p8,@function -.align 5 -gcm_init_p8: -.localentry gcm_init_p8,0 - - li 0,-4096 - li 8,0x10 - li 12,-1 - li 9,0x20 - or 0,0,0 - li 10,0x30 - .long 0x7D202699 - - vspltisb 8,-16 - vspltisb 5,1 - vaddubm 8,8,8 - vxor 4,4,4 - vor 8,8,5 - vsldoi 8,8,4,15 - vsldoi 6,4,5,1 - vaddubm 8,8,8 - vspltisb 7,7 - vor 8,8,6 - vspltb 6,9,0 - vsl 9,9,5 - vsrab 6,6,7 - vand 6,6,8 - vxor 3,9,6 - - vsldoi 9,3,3,8 - vsldoi 8,4,8,8 - vsldoi 11,4,9,8 - vsldoi 10,9,4,8 - - .long 0x7D001F99 - .long 0x7D681F99 - li 8,0x40 - .long 0x7D291F99 - li 9,0x50 - .long 0x7D4A1F99 - li 10,0x60 - - .long 0x10035CC8 - .long 0x10234CC8 - .long 0x104354C8 - - .long 0x10E044C8 - - vsldoi 5,1,4,8 - vsldoi 6,4,1,8 - vxor 0,0,5 - vxor 2,2,6 - - vsldoi 0,0,0,8 - vxor 0,0,7 - - vsldoi 6,0,0,8 - .long 0x100044C8 - vxor 6,6,2 - vxor 16,0,6 - - vsldoi 17,16,16,8 - vsldoi 19,4,17,8 - vsldoi 18,17,4,8 - - .long 0x7E681F99 - li 8,0x70 - .long 0x7E291F99 - li 9,0x80 - .long 0x7E4A1F99 - li 10,0x90 - .long 0x10039CC8 - .long 0x11B09CC8 - .long 0x10238CC8 - .long 0x11D08CC8 - .long 0x104394C8 - .long 0x11F094C8 - - .long 0x10E044C8 - .long 0x114D44C8 - - vsldoi 5,1,4,8 - vsldoi 6,4,1,8 - vsldoi 11,14,4,8 - vsldoi 9,4,14,8 - vxor 0,0,5 - vxor 2,2,6 - vxor 13,13,11 - vxor 15,15,9 - - vsldoi 0,0,0,8 - vsldoi 13,13,13,8 - vxor 0,0,7 - vxor 13,13,10 - - vsldoi 6,0,0,8 - vsldoi 9,13,13,8 - .long 0x100044C8 - .long 0x11AD44C8 - vxor 6,6,2 - vxor 9,9,15 - vxor 0,0,6 - vxor 13,13,9 - - vsldoi 9,0,0,8 - vsldoi 17,13,13,8 - vsldoi 11,4,9,8 - vsldoi 10,9,4,8 - vsldoi 19,4,17,8 - vsldoi 18,17,4,8 - - .long 0x7D681F99 - li 8,0xa0 - .long 0x7D291F99 - li 9,0xb0 - .long 0x7D4A1F99 - li 10,0xc0 - .long 0x7E681F99 - .long 0x7E291F99 - .long 0x7E4A1F99 - - or 12,12,12 - blr -.long 0 -.byte 0,12,0x14,0,0,0,2,0 -.long 0 -.size gcm_init_p8,.-gcm_init_p8 -.globl gcm_gmult_p8 -.type gcm_gmult_p8,@function -.align 5 -gcm_gmult_p8: -.localentry gcm_gmult_p8,0 - - lis 0,0xfff8 - li 8,0x10 - li 12,-1 - li 9,0x20 - or 0,0,0 - li 10,0x30 - .long 0x7C601E99 - - .long 0x7D682699 - lvsl 12,0,0 - .long 0x7D292699 - vspltisb 5,0x07 - .long 0x7D4A2699 - vxor 12,12,5 - .long 0x7D002699 - vperm 3,3,3,12 - vxor 4,4,4 - - .long 0x10035CC8 - .long 0x10234CC8 - .long 0x104354C8 - - .long 0x10E044C8 - - vsldoi 5,1,4,8 - vsldoi 6,4,1,8 - vxor 0,0,5 - vxor 2,2,6 - - vsldoi 0,0,0,8 - vxor 0,0,7 - - vsldoi 6,0,0,8 - .long 0x100044C8 - vxor 6,6,2 - vxor 0,0,6 - - vperm 0,0,0,12 - .long 0x7C001F99 - - or 12,12,12 - 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 -.type gcm_ghash_p8,@function -.align 5 -gcm_ghash_p8: -.localentry gcm_ghash_p8,0 - - li 0,-4096 - li 8,0x10 - li 12,-1 - li 9,0x20 - or 0,0,0 - li 10,0x30 - .long 0x7C001E99 - - .long 0x7D682699 - li 8,0x40 - lvsl 12,0,0 - .long 0x7D292699 - li 9,0x50 - vspltisb 5,0x07 - .long 0x7D4A2699 - li 10,0x60 - vxor 12,12,5 - .long 0x7D002699 - vperm 0,0,0,12 - vxor 4,4,4 - - cmpldi 6,64 - bge .Lgcm_ghash_p8_4x - - .long 0x7C602E99 - addi 5,5,16 - subic. 6,6,16 - vperm 3,3,3,12 - vxor 3,3,0 - beq .Lshort - - .long 0x7E682699 - li 8,16 - .long 0x7E292699 - add 9,5,6 - .long 0x7E4A2699 - - -.align 5 -.Loop_2x: - .long 0x7E002E99 - vperm 16,16,16,12 - - subic 6,6,32 - .long 0x10039CC8 - .long 0x11B05CC8 - subfe 0,0,0 - .long 0x10238CC8 - .long 0x11D04CC8 - and 0,0,6 - .long 0x104394C8 - .long 0x11F054C8 - add 5,5,0 - - vxor 0,0,13 - vxor 1,1,14 - - .long 0x10E044C8 - - vsldoi 5,1,4,8 - vsldoi 6,4,1,8 - vxor 2,2,15 - vxor 0,0,5 - vxor 2,2,6 - - vsldoi 0,0,0,8 - vxor 0,0,7 - .long 0x7C682E99 - addi 5,5,32 - - vsldoi 6,0,0,8 - .long 0x100044C8 - vperm 3,3,3,12 - vxor 6,6,2 - vxor 3,3,6 - vxor 3,3,0 - cmpld 9,5 - bgt .Loop_2x - - cmplwi 6,0 - bne .Leven - -.Lshort: - .long 0x10035CC8 - .long 0x10234CC8 - .long 0x104354C8 - - .long 0x10E044C8 - - vsldoi 5,1,4,8 - vsldoi 6,4,1,8 - vxor 0,0,5 - vxor 2,2,6 - - vsldoi 0,0,0,8 - vxor 0,0,7 - - vsldoi 6,0,0,8 - .long 0x100044C8 - vxor 6,6,2 - -.Leven: - vxor 0,0,6 - vperm 0,0,0,12 - .long 0x7C001F99 - - or 12,12,12 - blr -.long 0 -.byte 0,12,0x14,0,0,0,4,0 -.long 0 -.align 5 -.gcm_ghash_p8_4x: -.Lgcm_ghash_p8_4x: - stdu 1,-256(1) - li 10,63 - li 11,79 - stvx 20,10,1 - addi 10,10,32 - stvx 21,11,1 - addi 11,11,32 - stvx 22,10,1 - addi 10,10,32 - stvx 23,11,1 - addi 11,11,32 - stvx 24,10,1 - addi 10,10,32 - stvx 25,11,1 - addi 11,11,32 - stvx 26,10,1 - addi 10,10,32 - stvx 27,11,1 - addi 11,11,32 - stvx 28,10,1 - addi 10,10,32 - stvx 29,11,1 - addi 11,11,32 - stvx 30,10,1 - li 10,0x60 - stvx 31,11,1 - li 0,-1 - stw 12,252(1) - or 0,0,0 - - lvsl 5,0,8 - - li 8,0x70 - .long 0x7E292699 - li 9,0x80 - vspltisb 6,8 - - li 10,0x90 - .long 0x7EE82699 - li 8,0xa0 - .long 0x7F092699 - li 9,0xb0 - .long 0x7F2A2699 - li 10,0xc0 - .long 0x7FA82699 - li 8,0x10 - .long 0x7FC92699 - li 9,0x20 - .long 0x7FEA2699 - li 10,0x30 - - vsldoi 7,4,6,8 - vaddubm 18,5,7 - vaddubm 19,6,18 - - srdi 6,6,4 - - .long 0x7C602E99 - .long 0x7E082E99 - subic. 6,6,8 - .long 0x7EC92E99 - .long 0x7F8A2E99 - addi 5,5,0x40 - vperm 3,3,3,12 - vperm 16,16,16,12 - vperm 22,22,22,12 - vperm 28,28,28,12 - - vxor 2,3,0 - - .long 0x11B0BCC8 - .long 0x11D0C4C8 - .long 0x11F0CCC8 - - vperm 11,17,9,18 - vperm 5,22,28,19 - vperm 10,17,9,19 - vperm 6,22,28,18 - .long 0x12B68CC8 - .long 0x12855CC8 - .long 0x137C4CC8 - .long 0x134654C8 - - vxor 21,21,14 - vxor 20,20,13 - vxor 27,27,21 - vxor 26,26,15 - - blt .Ltail_4x - -.Loop_4x: - .long 0x7C602E99 - .long 0x7E082E99 - subic. 6,6,4 - .long 0x7EC92E99 - .long 0x7F8A2E99 - addi 5,5,0x40 - vperm 16,16,16,12 - vperm 22,22,22,12 - vperm 28,28,28,12 - vperm 3,3,3,12 - - .long 0x1002ECC8 - .long 0x1022F4C8 - .long 0x1042FCC8 - .long 0x11B0BCC8 - .long 0x11D0C4C8 - .long 0x11F0CCC8 - - vxor 0,0,20 - vxor 1,1,27 - vxor 2,2,26 - vperm 5,22,28,19 - vperm 6,22,28,18 - - .long 0x10E044C8 - .long 0x12855CC8 - .long 0x134654C8 - - vsldoi 5,1,4,8 - vsldoi 6,4,1,8 - vxor 0,0,5 - vxor 2,2,6 - - vsldoi 0,0,0,8 - vxor 0,0,7 - - vsldoi 6,0,0,8 - .long 0x12B68CC8 - .long 0x137C4CC8 - .long 0x100044C8 - - vxor 20,20,13 - vxor 26,26,15 - vxor 2,2,3 - vxor 21,21,14 - vxor 2,2,6 - vxor 27,27,21 - vxor 2,2,0 - bge .Loop_4x - -.Ltail_4x: - .long 0x1002ECC8 - .long 0x1022F4C8 - .long 0x1042FCC8 - - vxor 0,0,20 - vxor 1,1,27 - - .long 0x10E044C8 - - vsldoi 5,1,4,8 - vsldoi 6,4,1,8 - vxor 2,2,26 - vxor 0,0,5 - vxor 2,2,6 - - vsldoi 0,0,0,8 - vxor 0,0,7 - - vsldoi 6,0,0,8 - .long 0x100044C8 - vxor 6,6,2 - vxor 0,0,6 - - addic. 6,6,4 - beq .Ldone_4x - - .long 0x7C602E99 - cmpldi 6,2 - li 6,-4 - blt .Lone - .long 0x7E082E99 - beq .Ltwo - -.Lthree: - .long 0x7EC92E99 - vperm 3,3,3,12 - vperm 16,16,16,12 - vperm 22,22,22,12 - - vxor 2,3,0 - vor 29,23,23 - vor 30, 24, 24 - vor 31,25,25 - - vperm 5,16,22,19 - vperm 6,16,22,18 - .long 0x12B08CC8 - .long 0x13764CC8 - .long 0x12855CC8 - .long 0x134654C8 - - vxor 27,27,21 - b .Ltail_4x - -.align 4 -.Ltwo: - vperm 3,3,3,12 - vperm 16,16,16,12 - - vxor 2,3,0 - vperm 5,4,16,19 - vperm 6,4,16,18 - - vsldoi 29,4,17,8 - vor 30, 17, 17 - vsldoi 31,17,4,8 - - .long 0x12855CC8 - .long 0x13704CC8 - .long 0x134654C8 - - b .Ltail_4x - -.align 4 -.Lone: - vperm 3,3,3,12 - - vsldoi 29,4,9,8 - vor 30, 9, 9 - vsldoi 31,9,4,8 - - vxor 2,3,0 - vxor 20,20,20 - vxor 27,27,27 - vxor 26,26,26 - - b .Ltail_4x - -.Ldone_4x: - vperm 0,0,0,12 - .long 0x7C001F99 - - li 10,63 - li 11,79 - or 12,12,12 - lvx 20,10,1 - addi 10,10,32 - lvx 21,11,1 - addi 11,11,32 - lvx 22,10,1 - addi 10,10,32 - lvx 23,11,1 - addi 11,11,32 - lvx 24,10,1 - addi 10,10,32 - lvx 25,11,1 - addi 11,11,32 - lvx 26,10,1 - addi 10,10,32 - lvx 27,11,1 - addi 11,11,32 - lvx 28,10,1 - addi 10,10,32 - lvx 29,11,1 - addi 11,11,32 - lvx 30,10,1 - lvx 31,11,1 - addi 1,1,256 - blr -.long 0 -.byte 0,12,0x04,0,0x80,0,4,0 -.long 0 -.size gcm_ghash_p8,.-gcm_ghash_p8 - -.byte 71,72,65,83,72,32,102,111,114,32,80,111,119,101,114,73,83,65,32,50,46,48,55,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif // !OPENSSL_NO_ASM && __powerpc64__ -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-ppc64le/crypto/test/trampoline-ppc.S b/third_party/boringssl/linux-ppc64le/crypto/test/trampoline-ppc.S deleted file mode 100644 index 8166d31af833..000000000000 --- a/third_party/boringssl/linux-ppc64le/crypto/test/trampoline-ppc.S +++ /dev/null @@ -1,1410 +0,0 @@ -// 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__) -.machine "any" -.abiversion 2 -.text - - - - - - - -.globl abi_test_trampoline -.type abi_test_trampoline,@function -.align 5 -abi_test_trampoline: -.localentry abi_test_trampoline,0 - - - mflr 0 - std 0, 16(1) - - - - - - - - - - - - - - - - - - - - stdu 1, -528(1) - - mfcr 0 - std 0, 8(1) - std 2, 24(1) - std 4, 32(1) - li 11, 48 - stvx 20, 11, 1 - li 11, 64 - stvx 21, 11, 1 - li 11, 80 - stvx 22, 11, 1 - li 11, 96 - stvx 23, 11, 1 - li 11, 112 - stvx 24, 11, 1 - li 11, 128 - stvx 25, 11, 1 - li 11, 144 - stvx 26, 11, 1 - li 11, 160 - stvx 27, 11, 1 - li 11, 176 - stvx 28, 11, 1 - li 11, 192 - stvx 29, 11, 1 - li 11, 208 - stvx 30, 11, 1 - li 11, 224 - stvx 31, 11, 1 - std 14, 240(1) - std 15, 248(1) - std 16, 256(1) - std 17, 264(1) - std 18, 272(1) - std 19, 280(1) - std 20, 288(1) - std 21, 296(1) - std 22, 304(1) - std 23, 312(1) - std 24, 320(1) - std 25, 328(1) - std 26, 336(1) - std 27, 344(1) - std 28, 352(1) - std 29, 360(1) - std 30, 368(1) - std 31, 376(1) - stfd 14, 384(1) - stfd 15, 392(1) - stfd 16, 400(1) - stfd 17, 408(1) - stfd 18, 416(1) - stfd 19, 424(1) - stfd 20, 432(1) - stfd 21, 440(1) - stfd 22, 448(1) - stfd 23, 456(1) - stfd 24, 464(1) - stfd 25, 472(1) - stfd 26, 480(1) - stfd 27, 488(1) - stfd 28, 496(1) - stfd 29, 504(1) - stfd 30, 512(1) - stfd 31, 520(1) - li 11, 0 - lvx 20, 11, 4 - li 11, 16 - lvx 21, 11, 4 - li 11, 32 - lvx 22, 11, 4 - li 11, 48 - lvx 23, 11, 4 - li 11, 64 - lvx 24, 11, 4 - li 11, 80 - lvx 25, 11, 4 - li 11, 96 - lvx 26, 11, 4 - li 11, 112 - lvx 27, 11, 4 - li 11, 128 - lvx 28, 11, 4 - li 11, 144 - lvx 29, 11, 4 - li 11, 160 - lvx 30, 11, 4 - li 11, 176 - lvx 31, 11, 4 - ld 14, 192(4) - ld 15, 200(4) - ld 16, 208(4) - ld 17, 216(4) - ld 18, 224(4) - ld 19, 232(4) - ld 20, 240(4) - ld 21, 248(4) - ld 22, 256(4) - ld 23, 264(4) - ld 24, 272(4) - ld 25, 280(4) - ld 26, 288(4) - ld 27, 296(4) - ld 28, 304(4) - ld 29, 312(4) - ld 30, 320(4) - ld 31, 328(4) - lfd 14, 336(4) - lfd 15, 344(4) - lfd 16, 352(4) - lfd 17, 360(4) - lfd 18, 368(4) - lfd 19, 376(4) - lfd 20, 384(4) - lfd 21, 392(4) - lfd 22, 400(4) - lfd 23, 408(4) - lfd 24, 416(4) - lfd 25, 424(4) - lfd 26, 432(4) - lfd 27, 440(4) - lfd 28, 448(4) - lfd 29, 456(4) - lfd 30, 464(4) - lfd 31, 472(4) - - ld 0, 480(4) - mtcr 0 - - - addi 11, 5, -8 - mr 12, 3 - - - cmpdi 6, 0 - beq .Largs_done - mtctr 6 - ldu 3, 8(11) - bdz .Largs_done - ldu 4, 8(11) - bdz .Largs_done - ldu 5, 8(11) - bdz .Largs_done - ldu 6, 8(11) - bdz .Largs_done - ldu 7, 8(11) - bdz .Largs_done - ldu 8, 8(11) - bdz .Largs_done - ldu 9, 8(11) - bdz .Largs_done - ldu 10, 8(11) - -.Largs_done: - li 2, 0 - mtctr 12 - bctrl - ld 2, 24(1) - - ld 4, 32(1) - li 11, 0 - stvx 20, 11, 4 - li 11, 16 - stvx 21, 11, 4 - li 11, 32 - stvx 22, 11, 4 - li 11, 48 - stvx 23, 11, 4 - li 11, 64 - stvx 24, 11, 4 - li 11, 80 - stvx 25, 11, 4 - li 11, 96 - stvx 26, 11, 4 - li 11, 112 - stvx 27, 11, 4 - li 11, 128 - stvx 28, 11, 4 - li 11, 144 - stvx 29, 11, 4 - li 11, 160 - stvx 30, 11, 4 - li 11, 176 - stvx 31, 11, 4 - std 14, 192(4) - std 15, 200(4) - std 16, 208(4) - std 17, 216(4) - std 18, 224(4) - std 19, 232(4) - std 20, 240(4) - std 21, 248(4) - std 22, 256(4) - std 23, 264(4) - std 24, 272(4) - std 25, 280(4) - std 26, 288(4) - std 27, 296(4) - std 28, 304(4) - std 29, 312(4) - std 30, 320(4) - std 31, 328(4) - stfd 14, 336(4) - stfd 15, 344(4) - stfd 16, 352(4) - stfd 17, 360(4) - stfd 18, 368(4) - stfd 19, 376(4) - stfd 20, 384(4) - stfd 21, 392(4) - stfd 22, 400(4) - stfd 23, 408(4) - stfd 24, 416(4) - stfd 25, 424(4) - stfd 26, 432(4) - stfd 27, 440(4) - stfd 28, 448(4) - stfd 29, 456(4) - stfd 30, 464(4) - stfd 31, 472(4) - li 11, 48 - lvx 20, 11, 1 - li 11, 64 - lvx 21, 11, 1 - li 11, 80 - lvx 22, 11, 1 - li 11, 96 - lvx 23, 11, 1 - li 11, 112 - lvx 24, 11, 1 - li 11, 128 - lvx 25, 11, 1 - li 11, 144 - lvx 26, 11, 1 - li 11, 160 - lvx 27, 11, 1 - li 11, 176 - lvx 28, 11, 1 - li 11, 192 - lvx 29, 11, 1 - li 11, 208 - lvx 30, 11, 1 - li 11, 224 - lvx 31, 11, 1 - ld 14, 240(1) - ld 15, 248(1) - ld 16, 256(1) - ld 17, 264(1) - ld 18, 272(1) - ld 19, 280(1) - ld 20, 288(1) - ld 21, 296(1) - ld 22, 304(1) - ld 23, 312(1) - ld 24, 320(1) - ld 25, 328(1) - ld 26, 336(1) - ld 27, 344(1) - ld 28, 352(1) - ld 29, 360(1) - ld 30, 368(1) - ld 31, 376(1) - lfd 14, 384(1) - lfd 15, 392(1) - lfd 16, 400(1) - lfd 17, 408(1) - lfd 18, 416(1) - lfd 19, 424(1) - lfd 20, 432(1) - lfd 21, 440(1) - lfd 22, 448(1) - lfd 23, 456(1) - lfd 24, 464(1) - lfd 25, 472(1) - lfd 26, 480(1) - lfd 27, 488(1) - lfd 28, 496(1) - lfd 29, 504(1) - lfd 30, 512(1) - lfd 31, 520(1) - mfcr 0 - std 0, 480(4) - ld 0, 8(1) - mtcrf 0b00111000, 0 - addi 1, 1, 528 - ld 0, 16(1) - mtlr 0 - blr -.size abi_test_trampoline,.-abi_test_trampoline -.globl abi_test_clobber_r0 -.type abi_test_clobber_r0,@function -.align 5 -abi_test_clobber_r0: -.localentry abi_test_clobber_r0,0 - - li 0, 0 - blr -.size abi_test_clobber_r0,.-abi_test_clobber_r0 -.globl abi_test_clobber_r2 -.type abi_test_clobber_r2,@function -.align 5 -abi_test_clobber_r2: -.localentry abi_test_clobber_r2,0 - - li 2, 0 - blr -.size abi_test_clobber_r2,.-abi_test_clobber_r2 -.globl abi_test_clobber_r3 -.type abi_test_clobber_r3,@function -.align 5 -abi_test_clobber_r3: -.localentry abi_test_clobber_r3,0 - - li 3, 0 - blr -.size abi_test_clobber_r3,.-abi_test_clobber_r3 -.globl abi_test_clobber_r4 -.type abi_test_clobber_r4,@function -.align 5 -abi_test_clobber_r4: -.localentry abi_test_clobber_r4,0 - - li 4, 0 - blr -.size abi_test_clobber_r4,.-abi_test_clobber_r4 -.globl abi_test_clobber_r5 -.type abi_test_clobber_r5,@function -.align 5 -abi_test_clobber_r5: -.localentry abi_test_clobber_r5,0 - - li 5, 0 - blr -.size abi_test_clobber_r5,.-abi_test_clobber_r5 -.globl abi_test_clobber_r6 -.type abi_test_clobber_r6,@function -.align 5 -abi_test_clobber_r6: -.localentry abi_test_clobber_r6,0 - - li 6, 0 - blr -.size abi_test_clobber_r6,.-abi_test_clobber_r6 -.globl abi_test_clobber_r7 -.type abi_test_clobber_r7,@function -.align 5 -abi_test_clobber_r7: -.localentry abi_test_clobber_r7,0 - - li 7, 0 - blr -.size abi_test_clobber_r7,.-abi_test_clobber_r7 -.globl abi_test_clobber_r8 -.type abi_test_clobber_r8,@function -.align 5 -abi_test_clobber_r8: -.localentry abi_test_clobber_r8,0 - - li 8, 0 - blr -.size abi_test_clobber_r8,.-abi_test_clobber_r8 -.globl abi_test_clobber_r9 -.type abi_test_clobber_r9,@function -.align 5 -abi_test_clobber_r9: -.localentry abi_test_clobber_r9,0 - - li 9, 0 - blr -.size abi_test_clobber_r9,.-abi_test_clobber_r9 -.globl abi_test_clobber_r10 -.type abi_test_clobber_r10,@function -.align 5 -abi_test_clobber_r10: -.localentry abi_test_clobber_r10,0 - - li 10, 0 - blr -.size abi_test_clobber_r10,.-abi_test_clobber_r10 -.globl abi_test_clobber_r11 -.type abi_test_clobber_r11,@function -.align 5 -abi_test_clobber_r11: -.localentry abi_test_clobber_r11,0 - - li 11, 0 - blr -.size abi_test_clobber_r11,.-abi_test_clobber_r11 -.globl abi_test_clobber_r12 -.type abi_test_clobber_r12,@function -.align 5 -abi_test_clobber_r12: -.localentry abi_test_clobber_r12,0 - - li 12, 0 - blr -.size abi_test_clobber_r12,.-abi_test_clobber_r12 -.globl abi_test_clobber_r14 -.type abi_test_clobber_r14,@function -.align 5 -abi_test_clobber_r14: -.localentry abi_test_clobber_r14,0 - - li 14, 0 - blr -.size abi_test_clobber_r14,.-abi_test_clobber_r14 -.globl abi_test_clobber_r15 -.type abi_test_clobber_r15,@function -.align 5 -abi_test_clobber_r15: -.localentry abi_test_clobber_r15,0 - - li 15, 0 - blr -.size abi_test_clobber_r15,.-abi_test_clobber_r15 -.globl abi_test_clobber_r16 -.type abi_test_clobber_r16,@function -.align 5 -abi_test_clobber_r16: -.localentry abi_test_clobber_r16,0 - - li 16, 0 - blr -.size abi_test_clobber_r16,.-abi_test_clobber_r16 -.globl abi_test_clobber_r17 -.type abi_test_clobber_r17,@function -.align 5 -abi_test_clobber_r17: -.localentry abi_test_clobber_r17,0 - - li 17, 0 - blr -.size abi_test_clobber_r17,.-abi_test_clobber_r17 -.globl abi_test_clobber_r18 -.type abi_test_clobber_r18,@function -.align 5 -abi_test_clobber_r18: -.localentry abi_test_clobber_r18,0 - - li 18, 0 - blr -.size abi_test_clobber_r18,.-abi_test_clobber_r18 -.globl abi_test_clobber_r19 -.type abi_test_clobber_r19,@function -.align 5 -abi_test_clobber_r19: -.localentry abi_test_clobber_r19,0 - - li 19, 0 - blr -.size abi_test_clobber_r19,.-abi_test_clobber_r19 -.globl abi_test_clobber_r20 -.type abi_test_clobber_r20,@function -.align 5 -abi_test_clobber_r20: -.localentry abi_test_clobber_r20,0 - - li 20, 0 - blr -.size abi_test_clobber_r20,.-abi_test_clobber_r20 -.globl abi_test_clobber_r21 -.type abi_test_clobber_r21,@function -.align 5 -abi_test_clobber_r21: -.localentry abi_test_clobber_r21,0 - - li 21, 0 - blr -.size abi_test_clobber_r21,.-abi_test_clobber_r21 -.globl abi_test_clobber_r22 -.type abi_test_clobber_r22,@function -.align 5 -abi_test_clobber_r22: -.localentry abi_test_clobber_r22,0 - - li 22, 0 - blr -.size abi_test_clobber_r22,.-abi_test_clobber_r22 -.globl abi_test_clobber_r23 -.type abi_test_clobber_r23,@function -.align 5 -abi_test_clobber_r23: -.localentry abi_test_clobber_r23,0 - - li 23, 0 - blr -.size abi_test_clobber_r23,.-abi_test_clobber_r23 -.globl abi_test_clobber_r24 -.type abi_test_clobber_r24,@function -.align 5 -abi_test_clobber_r24: -.localentry abi_test_clobber_r24,0 - - li 24, 0 - blr -.size abi_test_clobber_r24,.-abi_test_clobber_r24 -.globl abi_test_clobber_r25 -.type abi_test_clobber_r25,@function -.align 5 -abi_test_clobber_r25: -.localentry abi_test_clobber_r25,0 - - li 25, 0 - blr -.size abi_test_clobber_r25,.-abi_test_clobber_r25 -.globl abi_test_clobber_r26 -.type abi_test_clobber_r26,@function -.align 5 -abi_test_clobber_r26: -.localentry abi_test_clobber_r26,0 - - li 26, 0 - blr -.size abi_test_clobber_r26,.-abi_test_clobber_r26 -.globl abi_test_clobber_r27 -.type abi_test_clobber_r27,@function -.align 5 -abi_test_clobber_r27: -.localentry abi_test_clobber_r27,0 - - li 27, 0 - blr -.size abi_test_clobber_r27,.-abi_test_clobber_r27 -.globl abi_test_clobber_r28 -.type abi_test_clobber_r28,@function -.align 5 -abi_test_clobber_r28: -.localentry abi_test_clobber_r28,0 - - li 28, 0 - blr -.size abi_test_clobber_r28,.-abi_test_clobber_r28 -.globl abi_test_clobber_r29 -.type abi_test_clobber_r29,@function -.align 5 -abi_test_clobber_r29: -.localentry abi_test_clobber_r29,0 - - li 29, 0 - blr -.size abi_test_clobber_r29,.-abi_test_clobber_r29 -.globl abi_test_clobber_r30 -.type abi_test_clobber_r30,@function -.align 5 -abi_test_clobber_r30: -.localentry abi_test_clobber_r30,0 - - li 30, 0 - blr -.size abi_test_clobber_r30,.-abi_test_clobber_r30 -.globl abi_test_clobber_r31 -.type abi_test_clobber_r31,@function -.align 5 -abi_test_clobber_r31: -.localentry abi_test_clobber_r31,0 - - li 31, 0 - blr -.size abi_test_clobber_r31,.-abi_test_clobber_r31 -.globl abi_test_clobber_f0 -.type abi_test_clobber_f0,@function -.align 4 -abi_test_clobber_f0: -.localentry abi_test_clobber_f0,0 - - li 0, 0 - - std 0, -8(1) - lfd 0, -8(1) - blr -.size abi_test_clobber_f0,.-abi_test_clobber_f0 -.globl abi_test_clobber_f1 -.type abi_test_clobber_f1,@function -.align 4 -abi_test_clobber_f1: -.localentry abi_test_clobber_f1,0 - - li 0, 0 - - std 0, -8(1) - lfd 1, -8(1) - blr -.size abi_test_clobber_f1,.-abi_test_clobber_f1 -.globl abi_test_clobber_f2 -.type abi_test_clobber_f2,@function -.align 4 -abi_test_clobber_f2: -.localentry abi_test_clobber_f2,0 - - li 0, 0 - - std 0, -8(1) - lfd 2, -8(1) - blr -.size abi_test_clobber_f2,.-abi_test_clobber_f2 -.globl abi_test_clobber_f3 -.type abi_test_clobber_f3,@function -.align 4 -abi_test_clobber_f3: -.localentry abi_test_clobber_f3,0 - - li 0, 0 - - std 0, -8(1) - lfd 3, -8(1) - blr -.size abi_test_clobber_f3,.-abi_test_clobber_f3 -.globl abi_test_clobber_f4 -.type abi_test_clobber_f4,@function -.align 4 -abi_test_clobber_f4: -.localentry abi_test_clobber_f4,0 - - li 0, 0 - - std 0, -8(1) - lfd 4, -8(1) - blr -.size abi_test_clobber_f4,.-abi_test_clobber_f4 -.globl abi_test_clobber_f5 -.type abi_test_clobber_f5,@function -.align 4 -abi_test_clobber_f5: -.localentry abi_test_clobber_f5,0 - - li 0, 0 - - std 0, -8(1) - lfd 5, -8(1) - blr -.size abi_test_clobber_f5,.-abi_test_clobber_f5 -.globl abi_test_clobber_f6 -.type abi_test_clobber_f6,@function -.align 4 -abi_test_clobber_f6: -.localentry abi_test_clobber_f6,0 - - li 0, 0 - - std 0, -8(1) - lfd 6, -8(1) - blr -.size abi_test_clobber_f6,.-abi_test_clobber_f6 -.globl abi_test_clobber_f7 -.type abi_test_clobber_f7,@function -.align 4 -abi_test_clobber_f7: -.localentry abi_test_clobber_f7,0 - - li 0, 0 - - std 0, -8(1) - lfd 7, -8(1) - blr -.size abi_test_clobber_f7,.-abi_test_clobber_f7 -.globl abi_test_clobber_f8 -.type abi_test_clobber_f8,@function -.align 4 -abi_test_clobber_f8: -.localentry abi_test_clobber_f8,0 - - li 0, 0 - - std 0, -8(1) - lfd 8, -8(1) - blr -.size abi_test_clobber_f8,.-abi_test_clobber_f8 -.globl abi_test_clobber_f9 -.type abi_test_clobber_f9,@function -.align 4 -abi_test_clobber_f9: -.localentry abi_test_clobber_f9,0 - - li 0, 0 - - std 0, -8(1) - lfd 9, -8(1) - blr -.size abi_test_clobber_f9,.-abi_test_clobber_f9 -.globl abi_test_clobber_f10 -.type abi_test_clobber_f10,@function -.align 4 -abi_test_clobber_f10: -.localentry abi_test_clobber_f10,0 - - li 0, 0 - - std 0, -8(1) - lfd 10, -8(1) - blr -.size abi_test_clobber_f10,.-abi_test_clobber_f10 -.globl abi_test_clobber_f11 -.type abi_test_clobber_f11,@function -.align 4 -abi_test_clobber_f11: -.localentry abi_test_clobber_f11,0 - - li 0, 0 - - std 0, -8(1) - lfd 11, -8(1) - blr -.size abi_test_clobber_f11,.-abi_test_clobber_f11 -.globl abi_test_clobber_f12 -.type abi_test_clobber_f12,@function -.align 4 -abi_test_clobber_f12: -.localentry abi_test_clobber_f12,0 - - li 0, 0 - - std 0, -8(1) - lfd 12, -8(1) - blr -.size abi_test_clobber_f12,.-abi_test_clobber_f12 -.globl abi_test_clobber_f13 -.type abi_test_clobber_f13,@function -.align 4 -abi_test_clobber_f13: -.localentry abi_test_clobber_f13,0 - - li 0, 0 - - std 0, -8(1) - lfd 13, -8(1) - blr -.size abi_test_clobber_f13,.-abi_test_clobber_f13 -.globl abi_test_clobber_f14 -.type abi_test_clobber_f14,@function -.align 4 -abi_test_clobber_f14: -.localentry abi_test_clobber_f14,0 - - li 0, 0 - - std 0, -8(1) - lfd 14, -8(1) - blr -.size abi_test_clobber_f14,.-abi_test_clobber_f14 -.globl abi_test_clobber_f15 -.type abi_test_clobber_f15,@function -.align 4 -abi_test_clobber_f15: -.localentry abi_test_clobber_f15,0 - - li 0, 0 - - std 0, -8(1) - lfd 15, -8(1) - blr -.size abi_test_clobber_f15,.-abi_test_clobber_f15 -.globl abi_test_clobber_f16 -.type abi_test_clobber_f16,@function -.align 4 -abi_test_clobber_f16: -.localentry abi_test_clobber_f16,0 - - li 0, 0 - - std 0, -8(1) - lfd 16, -8(1) - blr -.size abi_test_clobber_f16,.-abi_test_clobber_f16 -.globl abi_test_clobber_f17 -.type abi_test_clobber_f17,@function -.align 4 -abi_test_clobber_f17: -.localentry abi_test_clobber_f17,0 - - li 0, 0 - - std 0, -8(1) - lfd 17, -8(1) - blr -.size abi_test_clobber_f17,.-abi_test_clobber_f17 -.globl abi_test_clobber_f18 -.type abi_test_clobber_f18,@function -.align 4 -abi_test_clobber_f18: -.localentry abi_test_clobber_f18,0 - - li 0, 0 - - std 0, -8(1) - lfd 18, -8(1) - blr -.size abi_test_clobber_f18,.-abi_test_clobber_f18 -.globl abi_test_clobber_f19 -.type abi_test_clobber_f19,@function -.align 4 -abi_test_clobber_f19: -.localentry abi_test_clobber_f19,0 - - li 0, 0 - - std 0, -8(1) - lfd 19, -8(1) - blr -.size abi_test_clobber_f19,.-abi_test_clobber_f19 -.globl abi_test_clobber_f20 -.type abi_test_clobber_f20,@function -.align 4 -abi_test_clobber_f20: -.localentry abi_test_clobber_f20,0 - - li 0, 0 - - std 0, -8(1) - lfd 20, -8(1) - blr -.size abi_test_clobber_f20,.-abi_test_clobber_f20 -.globl abi_test_clobber_f21 -.type abi_test_clobber_f21,@function -.align 4 -abi_test_clobber_f21: -.localentry abi_test_clobber_f21,0 - - li 0, 0 - - std 0, -8(1) - lfd 21, -8(1) - blr -.size abi_test_clobber_f21,.-abi_test_clobber_f21 -.globl abi_test_clobber_f22 -.type abi_test_clobber_f22,@function -.align 4 -abi_test_clobber_f22: -.localentry abi_test_clobber_f22,0 - - li 0, 0 - - std 0, -8(1) - lfd 22, -8(1) - blr -.size abi_test_clobber_f22,.-abi_test_clobber_f22 -.globl abi_test_clobber_f23 -.type abi_test_clobber_f23,@function -.align 4 -abi_test_clobber_f23: -.localentry abi_test_clobber_f23,0 - - li 0, 0 - - std 0, -8(1) - lfd 23, -8(1) - blr -.size abi_test_clobber_f23,.-abi_test_clobber_f23 -.globl abi_test_clobber_f24 -.type abi_test_clobber_f24,@function -.align 4 -abi_test_clobber_f24: -.localentry abi_test_clobber_f24,0 - - li 0, 0 - - std 0, -8(1) - lfd 24, -8(1) - blr -.size abi_test_clobber_f24,.-abi_test_clobber_f24 -.globl abi_test_clobber_f25 -.type abi_test_clobber_f25,@function -.align 4 -abi_test_clobber_f25: -.localentry abi_test_clobber_f25,0 - - li 0, 0 - - std 0, -8(1) - lfd 25, -8(1) - blr -.size abi_test_clobber_f25,.-abi_test_clobber_f25 -.globl abi_test_clobber_f26 -.type abi_test_clobber_f26,@function -.align 4 -abi_test_clobber_f26: -.localentry abi_test_clobber_f26,0 - - li 0, 0 - - std 0, -8(1) - lfd 26, -8(1) - blr -.size abi_test_clobber_f26,.-abi_test_clobber_f26 -.globl abi_test_clobber_f27 -.type abi_test_clobber_f27,@function -.align 4 -abi_test_clobber_f27: -.localentry abi_test_clobber_f27,0 - - li 0, 0 - - std 0, -8(1) - lfd 27, -8(1) - blr -.size abi_test_clobber_f27,.-abi_test_clobber_f27 -.globl abi_test_clobber_f28 -.type abi_test_clobber_f28,@function -.align 4 -abi_test_clobber_f28: -.localentry abi_test_clobber_f28,0 - - li 0, 0 - - std 0, -8(1) - lfd 28, -8(1) - blr -.size abi_test_clobber_f28,.-abi_test_clobber_f28 -.globl abi_test_clobber_f29 -.type abi_test_clobber_f29,@function -.align 4 -abi_test_clobber_f29: -.localentry abi_test_clobber_f29,0 - - li 0, 0 - - std 0, -8(1) - lfd 29, -8(1) - blr -.size abi_test_clobber_f29,.-abi_test_clobber_f29 -.globl abi_test_clobber_f30 -.type abi_test_clobber_f30,@function -.align 4 -abi_test_clobber_f30: -.localentry abi_test_clobber_f30,0 - - li 0, 0 - - std 0, -8(1) - lfd 30, -8(1) - blr -.size abi_test_clobber_f30,.-abi_test_clobber_f30 -.globl abi_test_clobber_f31 -.type abi_test_clobber_f31,@function -.align 4 -abi_test_clobber_f31: -.localentry abi_test_clobber_f31,0 - - li 0, 0 - - std 0, -8(1) - lfd 31, -8(1) - blr -.size abi_test_clobber_f31,.-abi_test_clobber_f31 -.globl abi_test_clobber_v0 -.type abi_test_clobber_v0,@function -.align 4 -abi_test_clobber_v0: -.localentry abi_test_clobber_v0,0 - - vxor 0, 0, 0 - blr -.size abi_test_clobber_v0,.-abi_test_clobber_v0 -.globl abi_test_clobber_v1 -.type abi_test_clobber_v1,@function -.align 4 -abi_test_clobber_v1: -.localentry abi_test_clobber_v1,0 - - vxor 1, 1, 1 - blr -.size abi_test_clobber_v1,.-abi_test_clobber_v1 -.globl abi_test_clobber_v2 -.type abi_test_clobber_v2,@function -.align 4 -abi_test_clobber_v2: -.localentry abi_test_clobber_v2,0 - - vxor 2, 2, 2 - blr -.size abi_test_clobber_v2,.-abi_test_clobber_v2 -.globl abi_test_clobber_v3 -.type abi_test_clobber_v3,@function -.align 4 -abi_test_clobber_v3: -.localentry abi_test_clobber_v3,0 - - vxor 3, 3, 3 - blr -.size abi_test_clobber_v3,.-abi_test_clobber_v3 -.globl abi_test_clobber_v4 -.type abi_test_clobber_v4,@function -.align 4 -abi_test_clobber_v4: -.localentry abi_test_clobber_v4,0 - - vxor 4, 4, 4 - blr -.size abi_test_clobber_v4,.-abi_test_clobber_v4 -.globl abi_test_clobber_v5 -.type abi_test_clobber_v5,@function -.align 4 -abi_test_clobber_v5: -.localentry abi_test_clobber_v5,0 - - vxor 5, 5, 5 - blr -.size abi_test_clobber_v5,.-abi_test_clobber_v5 -.globl abi_test_clobber_v6 -.type abi_test_clobber_v6,@function -.align 4 -abi_test_clobber_v6: -.localentry abi_test_clobber_v6,0 - - vxor 6, 6, 6 - blr -.size abi_test_clobber_v6,.-abi_test_clobber_v6 -.globl abi_test_clobber_v7 -.type abi_test_clobber_v7,@function -.align 4 -abi_test_clobber_v7: -.localentry abi_test_clobber_v7,0 - - vxor 7, 7, 7 - blr -.size abi_test_clobber_v7,.-abi_test_clobber_v7 -.globl abi_test_clobber_v8 -.type abi_test_clobber_v8,@function -.align 4 -abi_test_clobber_v8: -.localentry abi_test_clobber_v8,0 - - vxor 8, 8, 8 - blr -.size abi_test_clobber_v8,.-abi_test_clobber_v8 -.globl abi_test_clobber_v9 -.type abi_test_clobber_v9,@function -.align 4 -abi_test_clobber_v9: -.localentry abi_test_clobber_v9,0 - - vxor 9, 9, 9 - blr -.size abi_test_clobber_v9,.-abi_test_clobber_v9 -.globl abi_test_clobber_v10 -.type abi_test_clobber_v10,@function -.align 4 -abi_test_clobber_v10: -.localentry abi_test_clobber_v10,0 - - vxor 10, 10, 10 - blr -.size abi_test_clobber_v10,.-abi_test_clobber_v10 -.globl abi_test_clobber_v11 -.type abi_test_clobber_v11,@function -.align 4 -abi_test_clobber_v11: -.localentry abi_test_clobber_v11,0 - - vxor 11, 11, 11 - blr -.size abi_test_clobber_v11,.-abi_test_clobber_v11 -.globl abi_test_clobber_v12 -.type abi_test_clobber_v12,@function -.align 4 -abi_test_clobber_v12: -.localentry abi_test_clobber_v12,0 - - vxor 12, 12, 12 - blr -.size abi_test_clobber_v12,.-abi_test_clobber_v12 -.globl abi_test_clobber_v13 -.type abi_test_clobber_v13,@function -.align 4 -abi_test_clobber_v13: -.localentry abi_test_clobber_v13,0 - - vxor 13, 13, 13 - blr -.size abi_test_clobber_v13,.-abi_test_clobber_v13 -.globl abi_test_clobber_v14 -.type abi_test_clobber_v14,@function -.align 4 -abi_test_clobber_v14: -.localentry abi_test_clobber_v14,0 - - vxor 14, 14, 14 - blr -.size abi_test_clobber_v14,.-abi_test_clobber_v14 -.globl abi_test_clobber_v15 -.type abi_test_clobber_v15,@function -.align 4 -abi_test_clobber_v15: -.localentry abi_test_clobber_v15,0 - - vxor 15, 15, 15 - blr -.size abi_test_clobber_v15,.-abi_test_clobber_v15 -.globl abi_test_clobber_v16 -.type abi_test_clobber_v16,@function -.align 4 -abi_test_clobber_v16: -.localentry abi_test_clobber_v16,0 - - vxor 16, 16, 16 - blr -.size abi_test_clobber_v16,.-abi_test_clobber_v16 -.globl abi_test_clobber_v17 -.type abi_test_clobber_v17,@function -.align 4 -abi_test_clobber_v17: -.localentry abi_test_clobber_v17,0 - - vxor 17, 17, 17 - blr -.size abi_test_clobber_v17,.-abi_test_clobber_v17 -.globl abi_test_clobber_v18 -.type abi_test_clobber_v18,@function -.align 4 -abi_test_clobber_v18: -.localentry abi_test_clobber_v18,0 - - vxor 18, 18, 18 - blr -.size abi_test_clobber_v18,.-abi_test_clobber_v18 -.globl abi_test_clobber_v19 -.type abi_test_clobber_v19,@function -.align 4 -abi_test_clobber_v19: -.localentry abi_test_clobber_v19,0 - - vxor 19, 19, 19 - blr -.size abi_test_clobber_v19,.-abi_test_clobber_v19 -.globl abi_test_clobber_v20 -.type abi_test_clobber_v20,@function -.align 4 -abi_test_clobber_v20: -.localentry abi_test_clobber_v20,0 - - vxor 20, 20, 20 - blr -.size abi_test_clobber_v20,.-abi_test_clobber_v20 -.globl abi_test_clobber_v21 -.type abi_test_clobber_v21,@function -.align 4 -abi_test_clobber_v21: -.localentry abi_test_clobber_v21,0 - - vxor 21, 21, 21 - blr -.size abi_test_clobber_v21,.-abi_test_clobber_v21 -.globl abi_test_clobber_v22 -.type abi_test_clobber_v22,@function -.align 4 -abi_test_clobber_v22: -.localentry abi_test_clobber_v22,0 - - vxor 22, 22, 22 - blr -.size abi_test_clobber_v22,.-abi_test_clobber_v22 -.globl abi_test_clobber_v23 -.type abi_test_clobber_v23,@function -.align 4 -abi_test_clobber_v23: -.localentry abi_test_clobber_v23,0 - - vxor 23, 23, 23 - blr -.size abi_test_clobber_v23,.-abi_test_clobber_v23 -.globl abi_test_clobber_v24 -.type abi_test_clobber_v24,@function -.align 4 -abi_test_clobber_v24: -.localentry abi_test_clobber_v24,0 - - vxor 24, 24, 24 - blr -.size abi_test_clobber_v24,.-abi_test_clobber_v24 -.globl abi_test_clobber_v25 -.type abi_test_clobber_v25,@function -.align 4 -abi_test_clobber_v25: -.localentry abi_test_clobber_v25,0 - - vxor 25, 25, 25 - blr -.size abi_test_clobber_v25,.-abi_test_clobber_v25 -.globl abi_test_clobber_v26 -.type abi_test_clobber_v26,@function -.align 4 -abi_test_clobber_v26: -.localentry abi_test_clobber_v26,0 - - vxor 26, 26, 26 - blr -.size abi_test_clobber_v26,.-abi_test_clobber_v26 -.globl abi_test_clobber_v27 -.type abi_test_clobber_v27,@function -.align 4 -abi_test_clobber_v27: -.localentry abi_test_clobber_v27,0 - - vxor 27, 27, 27 - blr -.size abi_test_clobber_v27,.-abi_test_clobber_v27 -.globl abi_test_clobber_v28 -.type abi_test_clobber_v28,@function -.align 4 -abi_test_clobber_v28: -.localentry abi_test_clobber_v28,0 - - vxor 28, 28, 28 - blr -.size abi_test_clobber_v28,.-abi_test_clobber_v28 -.globl abi_test_clobber_v29 -.type abi_test_clobber_v29,@function -.align 4 -abi_test_clobber_v29: -.localentry abi_test_clobber_v29,0 - - vxor 29, 29, 29 - blr -.size abi_test_clobber_v29,.-abi_test_clobber_v29 -.globl abi_test_clobber_v30 -.type abi_test_clobber_v30,@function -.align 4 -abi_test_clobber_v30: -.localentry abi_test_clobber_v30,0 - - vxor 30, 30, 30 - blr -.size abi_test_clobber_v30,.-abi_test_clobber_v30 -.globl abi_test_clobber_v31 -.type abi_test_clobber_v31,@function -.align 4 -abi_test_clobber_v31: -.localentry abi_test_clobber_v31,0 - - vxor 31, 31, 31 - blr -.size abi_test_clobber_v31,.-abi_test_clobber_v31 -.globl abi_test_clobber_cr0 -.type abi_test_clobber_cr0,@function -.align 4 -abi_test_clobber_cr0: -.localentry abi_test_clobber_cr0,0 - - - - mfcr 0 - not 0, 0 - mtcrf 128, 0 - blr -.size abi_test_clobber_cr0,.-abi_test_clobber_cr0 -.globl abi_test_clobber_cr1 -.type abi_test_clobber_cr1,@function -.align 4 -abi_test_clobber_cr1: -.localentry abi_test_clobber_cr1,0 - - - - mfcr 0 - not 0, 0 - mtcrf 64, 0 - blr -.size abi_test_clobber_cr1,.-abi_test_clobber_cr1 -.globl abi_test_clobber_cr2 -.type abi_test_clobber_cr2,@function -.align 4 -abi_test_clobber_cr2: -.localentry abi_test_clobber_cr2,0 - - - - mfcr 0 - not 0, 0 - mtcrf 32, 0 - blr -.size abi_test_clobber_cr2,.-abi_test_clobber_cr2 -.globl abi_test_clobber_cr3 -.type abi_test_clobber_cr3,@function -.align 4 -abi_test_clobber_cr3: -.localentry abi_test_clobber_cr3,0 - - - - mfcr 0 - not 0, 0 - mtcrf 16, 0 - blr -.size abi_test_clobber_cr3,.-abi_test_clobber_cr3 -.globl abi_test_clobber_cr4 -.type abi_test_clobber_cr4,@function -.align 4 -abi_test_clobber_cr4: -.localentry abi_test_clobber_cr4,0 - - - - mfcr 0 - not 0, 0 - mtcrf 8, 0 - blr -.size abi_test_clobber_cr4,.-abi_test_clobber_cr4 -.globl abi_test_clobber_cr5 -.type abi_test_clobber_cr5,@function -.align 4 -abi_test_clobber_cr5: -.localentry abi_test_clobber_cr5,0 - - - - mfcr 0 - not 0, 0 - mtcrf 4, 0 - blr -.size abi_test_clobber_cr5,.-abi_test_clobber_cr5 -.globl abi_test_clobber_cr6 -.type abi_test_clobber_cr6,@function -.align 4 -abi_test_clobber_cr6: -.localentry abi_test_clobber_cr6,0 - - - - mfcr 0 - not 0, 0 - mtcrf 2, 0 - blr -.size abi_test_clobber_cr6,.-abi_test_clobber_cr6 -.globl abi_test_clobber_cr7 -.type abi_test_clobber_cr7,@function -.align 4 -abi_test_clobber_cr7: -.localentry abi_test_clobber_cr7,0 - - - - mfcr 0 - not 0, 0 - mtcrf 1, 0 - blr -.size abi_test_clobber_cr7,.-abi_test_clobber_cr7 -.globl abi_test_clobber_ctr -.type abi_test_clobber_ctr,@function -.align 4 -abi_test_clobber_ctr: -.localentry abi_test_clobber_ctr,0 - - li 0, 0 - mtctr 0 - blr -.size abi_test_clobber_ctr,.-abi_test_clobber_ctr - -.globl abi_test_clobber_lr -.type abi_test_clobber_lr,@function -.align 4 -abi_test_clobber_lr: -.localentry abi_test_clobber_lr,0 - - mflr 0 - mtctr 0 - li 0, 0 - mtlr 0 - bctr -.size abi_test_clobber_lr,.-abi_test_clobber_lr - -#endif // !OPENSSL_NO_ASM && __powerpc64__ -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/chacha/chacha-x86.S b/third_party/boringssl/linux-x86/crypto/chacha/chacha-x86-linux.S similarity index 98% rename from third_party/boringssl/linux-x86/crypto/chacha/chacha-x86.S rename to third_party/boringssl/linux-x86/crypto/chacha/chacha-x86-linux.S index 0ae7a4bb7f4c..17d280d4f564 100644 --- a/third_party/boringssl/linux-x86/crypto/chacha/chacha-x86.S +++ b/third_party/boringssl/linux-x86/crypto/chacha/chacha-x86-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -971,5 +977,8 @@ ChaCha20_ssse3: .byte 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 .byte 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 .byte 114,103,62,0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/aesni-x86.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/aesni-x86-linux.S similarity index 99% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/aesni-x86.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/aesni-x86-linux.S index 00a6ec21a0a2..34e1e432fbca 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/aesni-x86.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/aesni-x86-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -2509,5 +2515,8 @@ aes_hw_set_decrypt_key: .byte 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 .byte 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 .byte 115,108,46,111,114,103,62,0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/bn-586.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/bn-586-linux.S similarity index 97% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/bn-586.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/bn-586-linux.S index 638c03613052..d3b83f89f6d8 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/bn-586.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/bn-586-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -993,5 +999,8 @@ bn_sub_words: popl %ebp ret .size bn_sub_words,.-.L_bn_sub_words_begin +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/co-586.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/co-586-linux.S similarity index 97% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/co-586.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/co-586-linux.S index f1e67caf4812..bb75ab4cf3e3 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/co-586.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/co-586-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1262,5 +1268,8 @@ bn_sqr_comba4: popl %esi ret .size bn_sqr_comba4,.-.L_bn_sqr_comba4_begin +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-ssse3-x86.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-ssse3-x86-linux.S similarity index 93% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-ssse3-x86.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-ssse3-x86-linux.S index 840e43898369..19fd370b6f01 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-ssse3-x86.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-ssse3-x86-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -290,5 +296,8 @@ gcm_ghash_ssse3: .align 16 .Llow4_mask: .long 252645135,252645135,252645135,252645135 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-x86.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-x86-linux.S similarity index 94% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-x86.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-x86-linux.S index 13b94457898e..e912e86d241f 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-x86.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/ghash-x86-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -326,5 +332,8 @@ gcm_ghash_clmul: .byte 82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112 .byte 112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62 .byte 0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/md5-586.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/md5-586-linux.S similarity index 96% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/md5-586.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/md5-586-linux.S index 58872344c405..d28e1f4ee6af 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/md5-586.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/md5-586-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -684,5 +690,8 @@ md5_block_asm_data_order: popl %esi ret .size md5_block_asm_data_order,.-.L_md5_block_asm_data_order_begin +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/sha1-586.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/sha1-586-linux.S similarity index 99% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/sha1-586.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/sha1-586-linux.S index e224da4d236d..b63882db93b6 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/sha1-586.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/sha1-586-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -3804,5 +3810,8 @@ _sha1_block_data_order_avx: .byte 102,111,114,109,32,102,111,114,32,120,56,54,44,32,67,82 .byte 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112 .byte 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/sha256-586.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/sha256-586-linux.S similarity index 99% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/sha256-586.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/sha256-586-linux.S index dcaf8755e397..8eb929f4cc75 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/sha256-586.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/sha256-586-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -5563,5 +5569,8 @@ sha256_block_data_order: popl %ebp ret .size sha256_block_data_order,.-.L_sha256_block_data_order_begin +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/sha512-586.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/sha512-586-linux.S similarity index 99% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/sha512-586.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/sha512-586-linux.S index 282cddaa76c2..eb0695ef710b 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/sha512-586.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/sha512-586-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -2833,5 +2839,8 @@ sha512_block_data_order: .byte 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97 .byte 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103 .byte 62,0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/vpaes-x86.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/vpaes-x86-linux.S similarity index 97% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/vpaes-x86.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/vpaes-x86-linux.S index 66bd5f5e38e8..efd56e38afc3 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/vpaes-x86.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/vpaes-x86-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -704,5 +710,8 @@ vpaes_cbc_encrypt: popl %ebp ret .size vpaes_cbc_encrypt,.-.L_vpaes_cbc_encrypt_begin +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/fipsmodule/x86-mont.S b/third_party/boringssl/linux-x86/crypto/fipsmodule/x86-mont-linux.S similarity index 95% rename from third_party/boringssl/linux-x86/crypto/fipsmodule/x86-mont.S rename to third_party/boringssl/linux-x86/crypto/fipsmodule/x86-mont-linux.S index 5de32518887f..2085caf46fcc 100644 --- a/third_party/boringssl/linux-x86/crypto/fipsmodule/x86-mont.S +++ b/third_party/boringssl/linux-x86/crypto/fipsmodule/x86-mont-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -480,5 +486,8 @@ bn_mul_mont: .byte 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 .byte 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 .byte 111,114,103,62,0 +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86/crypto/test/trampoline-x86.S b/third_party/boringssl/linux-x86/crypto/test/trampoline-x86-linux.S similarity index 93% rename from third_party/boringssl/linux-x86/crypto/test/trampoline-x86.S rename to third_party/boringssl/linux-x86/crypto/test/trampoline-x86-linux.S index e7162dfaf975..3d560af35422 100644 --- a/third_party/boringssl/linux-x86/crypto/test/trampoline-x86.S +++ b/third_party/boringssl/linux-x86/crypto/test/trampoline-x86-linux.S @@ -1,7 +1,13 @@ // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. -#if defined(__i386__) +#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(__i386__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -202,5 +208,8 @@ abi_test_clobber_xmm7: pxor %xmm7,%xmm7 ret .size abi_test_clobber_xmm7,.-.L_abi_test_clobber_xmm7_begin +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && defined(__ELF__) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86_64/crypto/chacha/chacha-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/chacha/chacha-x86_64-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/chacha/chacha-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/chacha/chacha-x86_64-linux.S index b862f4e9d0a9..57919a2564f9 100644 --- a/third_party/boringssl/linux-x86_64/crypto/chacha/chacha-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/chacha/chacha-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -16,6 +16,7 @@ .extern OPENSSL_ia32cap_P .hidden OPENSSL_ia32cap_P +.section .rodata .align 64 .Lzero: .long 0,0,0,0 @@ -45,6 +46,7 @@ .Lsixteen: .long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 .byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.text .globl ChaCha20_ctr32 .hidden ChaCha20_ctr32 .type ChaCha20_ctr32,@function @@ -1630,4 +1632,7 @@ ChaCha20_8x: .cfi_endproc .size ChaCha20_8x,.-ChaCha20_8x #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-linux.S index 2e41e91f0ce4..dff6ddaa977a 100644 --- a/third_party/boringssl/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-linux.S @@ -7,11 +7,11 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif -.data +.section .rodata .align 16 one: @@ -3076,4 +3076,7 @@ aes256gcmsiv_kdf: .cfi_endproc .size aes256gcmsiv_kdf, .-aes256gcmsiv_kdf #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S b/third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-linux.S index 2f3f641ab7d9..cb4df76213ac 100644 --- a/third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -17,6 +17,7 @@ chacha20_poly1305_constants: +.section .rodata .align 64 .Lchacha20_consts: .byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' @@ -54,6 +55,7 @@ chacha20_poly1305_constants: .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 .type poly_hash_ad_internal,@function .align 64 @@ -8919,4 +8921,7 @@ chacha20_poly1305_seal_avx2: .cfi_endproc .size chacha20_poly1305_seal_avx2, .-chacha20_poly1305_seal_avx2 #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-linux.S similarity index 93% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-linux.S index b28f7f809378..734249b27a2c 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -221,7 +221,7 @@ _aesni_ctr32_ghash_6x: movbeq 0(%r14),%r12 vaesenc %xmm1,%xmm14,%xmm14 vmovups 160-128(%rcx),%xmm1 - cmpl $11,%ebp + cmpl $11,%r10d jb .Lenc_tail vaesenc %xmm15,%xmm9,%xmm9 @@ -305,6 +305,9 @@ _aesni_ctr32_ghash_6x: vpaddb %xmm2,%xmm1,%xmm0 movq %r13,112+8(%rsp) leaq 96(%rdi),%rdi + + prefetcht0 512(%rdi) + prefetcht0 576(%rdi) vaesenclast %xmm5,%xmm11,%xmm11 vpaddb %xmm2,%xmm0,%xmm5 movq %r12,120+8(%rsp) @@ -317,7 +320,7 @@ _aesni_ctr32_ghash_6x: vaesenclast %xmm3,%xmm14,%xmm14 vpaddb %xmm2,%xmm7,%xmm3 - addq $0x60,%r10 + addq $0x60,%rax subq $0x6,%rdx jc .L6x_done @@ -349,27 +352,35 @@ _aesni_ctr32_ghash_6x: .align 32 aesni_gcm_decrypt: .cfi_startproc - xorq %r10,%r10 + + xorq %rax,%rax cmpq $0x60,%rdx jb .Lgcm_dec_abort - leaq (%rsp),%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 pushq %rbp -.cfi_offset %rbp,-24 +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbp,-16 + + movq %rsp,%rbp +.cfi_def_cfa_register %rbp + pushq %rbx +.cfi_offset %rbx,-24 + pushq %r12 .cfi_offset %r12,-32 + pushq %r13 .cfi_offset %r13,-40 + pushq %r14 .cfi_offset %r14,-48 + pushq %r15 .cfi_offset %r15,-56 + vzeroupper vmovdqu (%r8),%xmm1 @@ -383,7 +394,7 @@ aesni_gcm_decrypt: vmovdqu (%r11),%xmm0 leaq 128(%rcx),%rcx leaq 32+32(%r9),%r9 - movl 240-128(%rcx),%ebp + movl 240-128(%rcx),%r10d vpshufb %xmm0,%xmm8,%xmm8 andq %r15,%r14 @@ -396,7 +407,7 @@ aesni_gcm_decrypt: .Ldec_no_key_aliasing: vmovdqu 80(%rdi),%xmm7 - leaq (%rdi),%r14 + movq %rdi,%r14 vmovdqu 64(%rdi),%xmm4 @@ -409,7 +420,7 @@ aesni_gcm_decrypt: vmovdqu 48(%rdi),%xmm5 shrq $4,%rdx - xorq %r10,%r10 + xorq %rax,%rax vmovdqu 32(%rdi),%xmm6 vpshufb %xmm0,%xmm7,%xmm7 vmovdqu 16(%rdi),%xmm2 @@ -438,23 +449,29 @@ aesni_gcm_decrypt: vmovdqu %xmm8,-64(%r9) vzeroupper - movq -48(%rax),%r15 + leaq -40(%rbp),%rsp +.cfi_def_cfa %rsp, 0x38 + popq %r15 +.cfi_adjust_cfa_offset -8 .cfi_restore %r15 - movq -40(%rax),%r14 + popq %r14 +.cfi_adjust_cfa_offset -8 .cfi_restore %r14 - movq -32(%rax),%r13 + popq %r13 +.cfi_adjust_cfa_offset -8 .cfi_restore %r13 - movq -24(%rax),%r12 + popq %r12 +.cfi_adjust_cfa_offset -8 .cfi_restore %r12 - movq -16(%rax),%rbp -.cfi_restore %rbp - movq -8(%rax),%rbx + popq %rbx +.cfi_adjust_cfa_offset -8 .cfi_restore %rbx - leaq (%rax),%rsp -.cfi_def_cfa_register %rsp + popq %rbp +.cfi_adjust_cfa_offset -8 +.cfi_restore %rbp .Lgcm_dec_abort: - movq %r10,%rax .byte 0xf3,0xc3 + .cfi_endproc .size aesni_gcm_decrypt,.-aesni_gcm_decrypt .type _aesni_ctr32_6x,@function @@ -463,7 +480,7 @@ _aesni_ctr32_6x: .cfi_startproc vmovdqu 0-128(%rcx),%xmm4 vmovdqu 32(%r11),%xmm2 - leaq -1(%rbp),%r13 + leaq -1(%r10),%r13 vmovups 16-128(%rcx),%xmm15 leaq 32-128(%rcx),%r12 vpxor %xmm4,%xmm1,%xmm9 @@ -556,12 +573,13 @@ _aesni_ctr32_6x: .align 32 aesni_gcm_encrypt: .cfi_startproc + #ifdef BORINGSSL_DISPATCH_TEST .extern BORINGSSL_function_hit .hidden BORINGSSL_function_hit movb $1,BORINGSSL_function_hit+2(%rip) #endif - xorq %r10,%r10 + xorq %rax,%rax @@ -569,20 +587,27 @@ aesni_gcm_encrypt: cmpq $288,%rdx jb .Lgcm_enc_abort - leaq (%rsp),%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 pushq %rbp -.cfi_offset %rbp,-24 +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbp,-16 + + movq %rsp,%rbp +.cfi_def_cfa_register %rbp + pushq %rbx +.cfi_offset %rbx,-24 + pushq %r12 .cfi_offset %r12,-32 + pushq %r13 .cfi_offset %r13,-40 + pushq %r14 .cfi_offset %r14,-48 + pushq %r15 .cfi_offset %r15,-56 + vzeroupper vmovdqu (%r8),%xmm1 @@ -594,7 +619,7 @@ aesni_gcm_encrypt: leaq 128(%rcx),%rcx vmovdqu (%r11),%xmm0 andq $-128,%rsp - movl 240-128(%rcx),%ebp + movl 240-128(%rcx),%r10d andq %r15,%r14 andq %rsp,%r15 @@ -605,7 +630,7 @@ aesni_gcm_encrypt: subq %r15,%rsp .Lenc_no_key_aliasing: - leaq (%rsi),%r14 + movq %rsi,%r14 @@ -636,7 +661,7 @@ aesni_gcm_encrypt: vmovdqu (%r9),%xmm8 leaq 32+32(%r9),%r9 subq $12,%rdx - movq $192,%r10 + movq $192,%rax vpshufb %xmm0,%xmm8,%xmm8 call _aesni_ctr32_ghash_6x @@ -816,25 +841,32 @@ aesni_gcm_encrypt: vmovdqu %xmm8,-64(%r9) vzeroupper - movq -48(%rax),%r15 + leaq -40(%rbp),%rsp +.cfi_def_cfa %rsp, 0x38 + popq %r15 +.cfi_adjust_cfa_offset -8 .cfi_restore %r15 - movq -40(%rax),%r14 + popq %r14 +.cfi_adjust_cfa_offset -8 .cfi_restore %r14 - movq -32(%rax),%r13 + popq %r13 +.cfi_adjust_cfa_offset -8 .cfi_restore %r13 - movq -24(%rax),%r12 + popq %r12 +.cfi_adjust_cfa_offset -8 .cfi_restore %r12 - movq -16(%rax),%rbp -.cfi_restore %rbp - movq -8(%rax),%rbx + popq %rbx +.cfi_adjust_cfa_offset -8 .cfi_restore %rbx - leaq (%rax),%rsp -.cfi_def_cfa_register %rsp + popq %rbp +.cfi_adjust_cfa_offset -8 +.cfi_restore %rbp .Lgcm_enc_abort: - movq %r10,%rax .byte 0xf3,0xc3 + .cfi_endproc -.size aesni_gcm_encrypt,.-aesni_gcm_encrypt +.size aesni_gcm_decrypt,.-aesni_gcm_decrypt +.section .rodata .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -848,5 +880,9 @@ aesni_gcm_encrypt: .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 64 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64-linux.S index 2d4654f83224..a450c784727f 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/aesni-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -2480,6 +2480,7 @@ __aesni_set_encrypt_key: .byte 0xf3,0xc3 .size aes_hw_set_encrypt_key,.-aes_hw_set_encrypt_key .size __aesni_set_encrypt_key,.-__aesni_set_encrypt_key +.section .rodata .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -2502,5 +2503,9 @@ __aesni_set_encrypt_key: .byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69,83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 64 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-linux.S similarity index 96% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-linux.S index b5fbdc8177e3..0754e9bd76c6 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -23,7 +23,7 @@ .align 16 gcm_gmult_ssse3: .cfi_startproc -.Lgmult_seh_begin: + movdqu (%rdi),%xmm0 movdqa .Lreverse_bytes(%rip),%xmm10 movdqa .Llow4_mask(%rip),%xmm2 @@ -199,8 +199,8 @@ gcm_gmult_ssse3: pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 .byte 0xf3,0xc3 -.Lgmult_seh_end: .cfi_endproc + .size gcm_gmult_ssse3,.-gcm_gmult_ssse3 @@ -212,8 +212,8 @@ gcm_gmult_ssse3: .hidden gcm_ghash_ssse3 .align 16 gcm_ghash_ssse3: -.Lghash_seh_begin: .cfi_startproc + movdqu (%rdi),%xmm0 movdqa .Lreverse_bytes(%rip),%xmm10 movdqa .Llow4_mask(%rip),%xmm11 @@ -411,10 +411,11 @@ gcm_ghash_ssse3: pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 .byte 0xf3,0xc3 -.Lghash_seh_end: .cfi_endproc + .size gcm_ghash_ssse3,.-gcm_ghash_ssse3 +.section .rodata .align 16 @@ -423,5 +424,9 @@ gcm_ghash_ssse3: .Llow4_mask: .quad 0x0f0f0f0f0f0f0f0f, 0x0f0f0f0f0f0f0f0f +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64-linux.S index 91cea671068f..e0cbc99a1069 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/ghash-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -20,6 +20,7 @@ .align 16 gcm_init_clmul: .cfi_startproc + .L_init_clmul: movdqu (%rsi),%xmm2 pshufd $78,%xmm2,%xmm2 @@ -172,6 +173,7 @@ gcm_init_clmul: movdqu %xmm4,80(%rdi) .byte 0xf3,0xc3 .cfi_endproc + .size gcm_init_clmul,.-gcm_init_clmul .globl gcm_gmult_clmul .hidden gcm_gmult_clmul @@ -233,6 +235,7 @@ gcm_gmult_clmul: .align 32 gcm_ghash_clmul: .cfi_startproc + .L_ghash_clmul: movdqa .Lbswap_mask(%rip),%xmm10 @@ -613,6 +616,7 @@ gcm_ghash_clmul: movdqu %xmm0,(%rdi) .byte 0xf3,0xc3 .cfi_endproc + .size gcm_ghash_clmul,.-gcm_ghash_clmul .globl gcm_init_avx .hidden gcm_init_avx @@ -722,6 +726,7 @@ gcm_init_avx: vzeroupper .byte 0xf3,0xc3 + .cfi_endproc .size gcm_init_avx,.-gcm_init_avx .globl gcm_gmult_avx @@ -1111,7 +1116,9 @@ gcm_ghash_avx: vzeroupper .byte 0xf3,0xc3 .cfi_endproc + .size gcm_ghash_avx,.-gcm_ghash_avx +.section .rodata .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -1123,5 +1130,9 @@ gcm_ghash_avx: .byte 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 64 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64-linux.S similarity index 98% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64-linux.S index 4f082070423f..88ba8b2915a1 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/md5-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -699,4 +699,7 @@ md5_block_asm_data_order: .cfi_endproc .size md5_block_asm_data_order,.-md5_block_asm_data_order #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm-linux.S index 655f1a2acb12..56a48ad72eec 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -16,6 +16,7 @@ .hidden OPENSSL_ia32cap_P +.section .rodata .align 64 .Lpoly: .quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001 @@ -34,6 +35,7 @@ .quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000 .LordK: .quad 0xccd1c8aaee00bc4f +.text @@ -4540,4 +4542,7 @@ ecp_nistz256_point_add_affinex: .cfi_endproc .size ecp_nistz256_point_add_affinex,.-ecp_nistz256_point_add_affinex #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-linux.S similarity index 96% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-linux.S index cf056e3e8dcb..5c0eaf7df5cd 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -340,4 +340,7 @@ beeu_mod_inverse_vartime: .size beeu_mod_inverse_vartime, .-beeu_mod_inverse_vartime #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64-linux.S similarity index 85% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64-linux.S index b392637c2314..44eb652dd1b3 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/rdrand-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -60,4 +60,7 @@ CRYPTO_rdrand_multiple8_buf: .cfi_endproc .size CRYPTO_rdrand_multiple8_buf,.-CRYPTO_rdrand_multiple8_buf #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2-linux.S index 0f8a978a4994..ccf5478dc4bc 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/rsaz-avx2-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1733,6 +1733,7 @@ rsaz_1024_gather5_avx2: .cfi_endproc .LSEH_end_rsaz_1024_gather5: .size rsaz_1024_gather5_avx2,.-rsaz_1024_gather5_avx2 +.section .rodata .align 64 .Land_mask: .quad 0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff @@ -1745,5 +1746,9 @@ rsaz_1024_gather5_avx2: .long 2,2,2,2, 3,3,3,3 .long 4,4,4,4, 4,4,4,4 .align 64 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64-linux.S index cf2e7bc73369..f9c7250de43c 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha1-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1299,6 +1299,7 @@ _shaext_shortcut: leaq 64(%rsi),%r8 paddd %xmm4,%xmm1 cmovneq %r8,%rsi + prefetcht0 512(%rsi) movdqa %xmm0,%xmm8 .byte 15,56,201,229 movdqa %xmm0,%xmm2 @@ -5449,6 +5450,7 @@ _avx2_shortcut: .byte 0xf3,0xc3 .cfi_endproc .size sha1_block_data_order_avx2,.-sha1_block_data_order_avx2 +.section .rodata .align 64 K_XX_XX: .long 0x5a827999,0x5a827999,0x5a827999,0x5a827999 @@ -5464,5 +5466,9 @@ K_XX_XX: .byte 0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0 .byte 83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 64 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha256-x86_64-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha256-x86_64-linux.S index 6ce216f24e57..9472e2bd72a8 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha256-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1740,6 +1740,7 @@ sha256_block_data_order: .byte 0xf3,0xc3 .cfi_endproc .size sha256_block_data_order,.-sha256_block_data_order +.section .rodata .align 64 .type K256,@object K256: @@ -1783,6 +1784,7 @@ K256: .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.text .type sha256_block_data_order_shaext,@function .align 64 sha256_block_data_order_shaext: @@ -4181,4 +4183,7 @@ sha256_block_data_order_avx: .cfi_endproc .size sha256_block_data_order_avx,.-sha256_block_data_order_avx #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_64-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_64-linux.S index 45a58a1d008f..d9fd3a4066af 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/sha512-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1736,6 +1736,7 @@ sha512_block_data_order: .byte 0xf3,0xc3 .cfi_endproc .size sha512_block_data_order,.-sha512_block_data_order +.section .rodata .align 64 .type K512,@object K512: @@ -1823,6 +1824,7 @@ K512: .quad 0x0001020304050607,0x08090a0b0c0d0e0f .quad 0x0001020304050607,0x08090a0b0c0d0e0f .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.text .type sha512_block_data_order_avx,@function .align 64 sha512_block_data_order_avx: @@ -2989,4 +2991,7 @@ sha512_block_data_order_avx: .cfi_endproc .size sha512_block_data_order_avx,.-sha512_block_data_order_avx #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64-linux.S similarity index 98% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64-linux.S index b651713ffeda..f00ef0ed7c14 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/vpaes-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1020,6 +1020,7 @@ _vpaes_preheat: .type _vpaes_consts,@object +.section .rodata .align 64 _vpaes_consts: .Lk_inv: @@ -1129,5 +1130,9 @@ _vpaes_consts: .byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54,52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 .align 64 .size _vpaes_consts,.-_vpaes_consts +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont-linux.S index e39b5ca7fa19..6dfb885379ad 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1257,4 +1257,7 @@ bn_mulx4x_mont: .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 16 #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5-linux.S similarity index 99% rename from third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S rename to third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5-linux.S index 59367b6e8a0b..7e42e808479f 100644 --- a/third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5.S +++ b/third_party/boringssl/linux-x86_64/crypto/fipsmodule/x86_64-mont5-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -207,6 +207,7 @@ bn_mul_mont_gather5: por %xmm2,%xmm0 por %xmm3,%xmm1 por %xmm1,%xmm0 + pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%r12),%r12 @@ -330,6 +331,7 @@ bn_mul_mont_gather5: por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 + pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%r12),%r12 @@ -698,6 +700,7 @@ mul4x_internal: por %xmm2,%xmm0 por %xmm3,%xmm1 por %xmm1,%xmm0 + pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%r12),%r12 @@ -905,6 +908,7 @@ mul4x_internal: por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 + pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%r12),%r12 @@ -2321,6 +2325,7 @@ mulx4x_internal: por %xmm2,%xmm0 por %xmm3,%xmm1 pxor %xmm1,%xmm0 + pshufd $0x4e,%xmm0,%xmm1 por %xmm1,%xmm0 leaq 256(%rdi),%rdi @@ -2471,6 +2476,7 @@ mulx4x_internal: por %xmm2,%xmm4 por %xmm3,%xmm5 por %xmm5,%xmm4 + pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 leaq 256(%rdi),%rdi @@ -3419,6 +3425,15 @@ bn_scatter5: .cfi_startproc cmpl $0,%esi jz .Lscatter_epilogue + + + + + + + + + leaq (%rdx,%rcx,8),%rdx .Lscatter: movq (%rdi),%rax @@ -3587,6 +3602,7 @@ bn_gather5: por %xmm3,%xmm5 por %xmm5,%xmm4 leaq 256(%r11),%r11 + pshufd $0x4e,%xmm4,%xmm0 por %xmm4,%xmm0 movq %xmm0,(%rdi) @@ -3600,10 +3616,15 @@ bn_gather5: .LSEH_end_bn_gather5: .cfi_endproc .size bn_gather5,.-bn_gather5 +.section .rodata .align 64 .Linc: .long 0,0, 1,1 .long 2,2, 2,2 .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115,99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.text +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -.section .note.GNU-stack,"",@progbits diff --git a/third_party/boringssl/linux-x86_64/crypto/test/trampoline-x86_64.S b/third_party/boringssl/linux-x86_64/crypto/test/trampoline-x86_64-linux.S similarity index 93% rename from third_party/boringssl/linux-x86_64/crypto/test/trampoline-x86_64.S rename to third_party/boringssl/linux-x86_64/crypto/test/trampoline-x86_64-linux.S index b7d6101bc45a..aa269804768b 100644 --- a/third_party/boringssl/linux-x86_64/crypto/test/trampoline-x86_64.S +++ b/third_party/boringssl/linux-x86_64/crypto/test/trampoline-x86_64-linux.S @@ -7,7 +7,7 @@ #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include #endif @@ -25,7 +25,6 @@ .hidden abi_test_trampoline .align 16 abi_test_trampoline: -.Labi_test_trampoline_seh_begin: .cfi_startproc @@ -36,29 +35,29 @@ abi_test_trampoline: + subq $120,%rsp .cfi_adjust_cfa_offset 120 -.Labi_test_trampoline_seh_prolog_alloc: + movq %r8,48(%rsp) movq %rbx,64(%rsp) .cfi_offset rbx, -64 -.Labi_test_trampoline_seh_prolog_rbx: + movq %rbp,72(%rsp) .cfi_offset rbp, -56 -.Labi_test_trampoline_seh_prolog_rbp: + movq %r12,80(%rsp) .cfi_offset r12, -48 -.Labi_test_trampoline_seh_prolog_r12: + movq %r13,88(%rsp) .cfi_offset r13, -40 -.Labi_test_trampoline_seh_prolog_r13: + movq %r14,96(%rsp) .cfi_offset r14, -32 -.Labi_test_trampoline_seh_prolog_r14: + movq %r15,104(%rsp) .cfi_offset r15, -24 -.Labi_test_trampoline_seh_prolog_r15: -.Labi_test_trampoline_seh_prolog_end: + movq 0(%rsi),%rbx movq 8(%rsi),%rbp movq 16(%rsi),%r12 @@ -182,7 +181,7 @@ abi_test_unwind_stop: .byte 0xf3,0xc3 .cfi_endproc -.Labi_test_trampoline_seh_end: + .size abi_test_trampoline,.-abi_test_trampoline .type abi_test_clobber_rax, @function .globl abi_test_clobber_rax @@ -441,11 +440,11 @@ abi_test_clobber_xmm15: .align 16 abi_test_bad_unwind_wrong_register: .cfi_startproc -.Labi_test_bad_unwind_wrong_register_seh_begin: + pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r13,-16 -.Labi_test_bad_unwind_wrong_register_seh_push_r13: + @@ -454,7 +453,7 @@ abi_test_bad_unwind_wrong_register: .cfi_adjust_cfa_offset -8 .cfi_restore %r12 .byte 0xf3,0xc3 -.Labi_test_bad_unwind_wrong_register_seh_end: + .cfi_endproc .size abi_test_bad_unwind_wrong_register,.-abi_test_bad_unwind_wrong_register @@ -467,11 +466,11 @@ abi_test_bad_unwind_wrong_register: .align 16 abi_test_bad_unwind_temporary: .cfi_startproc -.Labi_test_bad_unwind_temporary_seh_begin: + pushq %r12 .cfi_adjust_cfa_offset 8 .cfi_offset %r12,-16 -.Labi_test_bad_unwind_temporary_seh_push_r12: + movq %r12,%rax incq %rax @@ -486,8 +485,8 @@ abi_test_bad_unwind_temporary: .cfi_adjust_cfa_offset -8 .cfi_restore %r12 .byte 0xf3,0xc3 -.Labi_test_bad_unwind_temporary_seh_end: .cfi_endproc + .size abi_test_bad_unwind_temporary,.-abi_test_bad_unwind_temporary @@ -515,4 +514,7 @@ abi_test_set_direction_flag: .byte 0xf3,0xc3 .size abi_test_set_direction_flag,.-abi_test_set_direction_flag #endif -.section .note.GNU-stack,"",@progbits +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/src/.clang-format b/third_party/boringssl/src/.clang-format index 0ab585e26f34..33b77f9ad7f9 100644 --- a/third_party/boringssl/src/.clang-format +++ b/third_party/boringssl/src/.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/third_party/boringssl/src/.gitignore b/third_party/boringssl/src/.gitignore index ab8580c1cb62..3e22141d954f 100644 --- a/third_party/boringssl/src/.gitignore +++ b/third_party/boringssl/src/.gitignore @@ -8,23 +8,23 @@ ssl/test/runner/runner doc/*.html doc/doc.css rust/Cargo.lock +rust/bssl-crypto/Cargo.lock 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 util/bot/libcxxabi 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 util/bot/sde-win32.tar.xz util/bot/win_toolchain.json +target/ diff --git a/third_party/boringssl/src/BUILDING.md b/third_party/boringssl/src/BUILDING.md index 73bc29c1ea2f..4dcd0f48f5be 100644 --- a/third_party/boringssl/src/BUILDING.md +++ b/third_party/boringssl/src/BUILDING.md @@ -10,7 +10,7 @@ Unless otherwise noted, build tools must at most five years old, matching [Abseil guidelines](https://abseil.io/about/compatibility). If in doubt, use the most recent stable version of each tool. - * [CMake](https://cmake.org/download/) 3.8 or later is required. + * [CMake](https://cmake.org/download/) 3.10 or later is required. * A recent version of Perl is required. On Windows, [Active State Perl](http://www.activestate.com/activeperl/) has been @@ -48,17 +48,13 @@ most recent stable version of each tool. Using Ninja (note the 'N' is capitalized in the cmake invocation): - mkdir build - cd build - cmake -GNinja .. - ninja + cmake -GNinja -B build + ninja -C build Using Make (does not work on Windows): - mkdir build - cd build - cmake .. - make + cmake -B build + make -C build You usually don't need to run `cmake` again after changing `CMakeLists.txt` files because the build scripts will detect changes to them and rebuild @@ -69,10 +65,9 @@ debugging—optimisation isn't enabled. Pass `-DCMAKE_BUILD_TYPE=Release` to `cmake` to configure a release build. If you want to cross-compile then there is an example toolchain file for 32-bit -Intel in `util/`. Wipe out the build directory, recreate it and run `cmake` like -this: +Intel in `util/`. Wipe out the build directory, run `cmake` like this: - cmake -DCMAKE_TOOLCHAIN_FILE=../util/32-bit-toolchain.cmake -GNinja .. + cmake -B build -DCMAKE_TOOLCHAIN_FILE=../util/32-bit-toolchain.cmake -GNinja If you want to build as a shared library, pass `-DBUILD_SHARED_LIBS=1`. On Windows, where functions need to be tagged with `dllimport` when coming from a @@ -93,12 +88,12 @@ versions of the NDK include a CMake toolchain file which works with CMake 3.6.0 or later. This has been tested with version r16b of the NDK. 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: +directory. Then 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 .. + -GNinja -B build Once you've run that, Ninja should produce Android-compatible binaries. You can replace `armeabi-v7a` in the above with `arm64-v8a` and use API level 21 or @@ -140,7 +135,7 @@ In order to build with prefixed symbols, the `BORINGSSL_PREFIX` CMake variable should specify the prefix to add to all symbols, and the `BORINGSSL_PREFIX_SYMBOLS` CMake variable should specify the path to a file which contains a list of symbols which should be prefixed (one per line; -comments are supported with `#`). In other words, `cmake .. +comments are supported with `#`). In other words, `cmake -B build -DBORINGSSL_PREFIX=MY_CUSTOM_PREFIX -DBORINGSSL_PREFIX_SYMBOLS=/path/to/symbols.txt` will configure the build to add the prefix `MY_CUSTOM_PREFIX` to all of the symbols listed in diff --git a/third_party/boringssl/src/CMakeLists.txt b/third_party/boringssl/src/CMakeLists.txt index 0864958aa9dd..aac5f0d13fb3 100644 --- a/third_party/boringssl/src/CMakeLists.txt +++ b/third_party/boringssl/src/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.10) # Defer enabling C and CXX languages. project(BoringSSL NONE) @@ -16,29 +16,41 @@ if(WIN32) endif() include(sources.cmake) +include(cmake/go.cmake) +include(cmake/paths.cmake) +include(cmake/perlasm.cmake) enable_language(C) enable_language(CXX) include(GNUInstallDirs) -# 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) +# 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() 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) @@ -55,10 +67,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() @@ -100,7 +108,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. @@ -109,9 +117,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") @@ -124,23 +133,18 @@ 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 # primarily on our normal Clang one. - set(C_CXX_FLAGS "-Werror -Wformat=2 -Wsign-compare -Wmissing-field-initializers -Wwrite-strings -Wvla -Wshadow") + set(C_CXX_FLAGS "-Werror -Wformat=2 -Wsign-compare -Wmissing-field-initializers -Wwrite-strings -Wvla -Wshadow -Wtype-limits") if(MSVC) # clang-cl sets different default warnings than clang. It also treats -Wall # 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. @@ -160,6 +164,16 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CLANG) set(C_CXX_FLAGS "${C_CXX_FLAGS} -Wno-free-nonheap-object") endif() + # -Wstring-concatenation was added in Clang 12.0.0, which corresponds to + # AppleClang 13.0.0 per the table in + # https://en.wikipedia.org/wiki/Xcode#Toolchain_versions + if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND + CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "12.0.0") OR + (CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND + CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "13.0.0")) + set(C_CXX_FLAGS "${C_CXX_FLAGS} -Wstring-concatenation") + endif() + if(CLANG OR CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "7.0.0") set(C_CXX_FLAGS "${C_CXX_FLAGS} -Wimplicit-fallthrough") endif() @@ -187,67 +201,22 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CLANG) endif() elseif(MSVC) set(MSVC_DISABLED_WARNINGS_LIST - "C4061" # enumerator 'identifier' in switch of enum 'enumeration' is not - # explicitly handled by a case label - # Disable this because it flags even when there is a default. "C4100" # 'exarg' : unreferenced formal parameter "C4127" # conditional expression is constant - "C4200" # nonstandard extension used : zero-sized array in - # struct/union. + # C4204 and C4221 are C89-only restrictions which were dropped in C99, but + # VS2017 warns about it. They can be removed when we require VS2019. "C4204" # nonstandard extension used: non-constant aggregate initializer "C4221" # nonstandard extension used : 'identifier' : cannot be # initialized using address of automatic variable - "C4242" # 'function' : conversion from 'int' to 'uint8_t', - # possible loss of data "C4244" # 'function' : conversion from 'int' to 'uint8_t', # possible loss of data "C4267" # conversion from 'size_t' to 'int', possible loss of data - "C4371" # layout of class may have changed from a previous version of the - # compiler due to better packing of member '...' - "C4388" # signed/unsigned mismatch - "C4296" # '>=' : expression is always true - "C4350" # behavior change: 'std::_Wrap_alloc...' - "C4365" # '=' : conversion from 'size_t' to 'int', - # signed/unsigned mismatch - "C4389" # '!=' : signed/unsigned mismatch - "C4464" # relative include path contains '..' - "C4510" # 'argument' : default constructor could not be generated - "C4512" # 'argument' : assignment operator could not be generated - "C4514" # 'function': unreferenced inline function has been removed - "C4548" # expression before comma has no effect; expected expression with - # side-effect" caused by FD_* macros. - "C4610" # struct 'argument' can never be instantiated - user defined - # constructor required. - "C4623" # default constructor was implicitly defined as deleted - "C4625" # copy constructor could not be generated because a base class - # copy constructor is inaccessible or deleted - "C4626" # assignment operator could not be generated because a base class - # assignment operator is inaccessible or deleted - "C4628" # digraphs not supported with -Ze - "C4668" # 'symbol' is not defined as a preprocessor macro, replacing with - # '0' for 'directives' - # Disable this because GTest uses it everywhere. "C4706" # assignment within conditional expression - "C4710" # 'function': function not inlined - "C4711" # function 'function' selected for inline expansion - "C4800" # 'int' : forcing value to bool 'true' or 'false' - # (performance warning) - "C4820" # 'bytes' bytes padding added after construct 'member_name' - "C5026" # move constructor was implicitly defined as deleted - "C5027" # move assignment operator was implicitly defined as deleted - "C5045" # Compiler will insert Spectre mitigation for memory load if - # /Qspectre switch specified - ) - set(MSVC_LEVEL4_WARNINGS_LIST - # See https://connect.microsoft.com/VisualStudio/feedback/details/1217660/warning-c4265-when-using-functional-header - "C4265" # class has virtual functions, but destructor is not virtual ) string(REPLACE "C" " -wd" MSVC_DISABLED_WARNINGS_STR ${MSVC_DISABLED_WARNINGS_LIST}) - string(REPLACE "C" " -w4" MSVC_LEVEL4_WARNINGS_STR - ${MSVC_LEVEL4_WARNINGS_LIST}) - set(CMAKE_C_FLAGS "-utf-8 -Wall -WX ${MSVC_DISABLED_WARNINGS_STR} ${MSVC_LEVEL4_WARNINGS_STR}") - set(CMAKE_CXX_FLAGS "-utf-8 -Wall -WX ${MSVC_DISABLED_WARNINGS_STR} ${MSVC_LEVEL4_WARNINGS_STR}") + set(CMAKE_C_FLAGS "-utf-8 -W4 -WX ${MSVC_DISABLED_WARNINGS_STR}") + set(CMAKE_CXX_FLAGS "-utf-8 -W4 -WX ${MSVC_DISABLED_WARNINGS_STR}") endif() if(WIN32) @@ -256,10 +225,6 @@ if(WIN32) 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() # pthread_rwlock_t on Linux requires a feature flag. We limit this to Linux @@ -404,110 +369,45 @@ if(CONSTANT_TIME_VALIDATION) add_definitions(-DNDEBUG) 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() - -# 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_SSE2_FOR_TESTING) - add_definitions(-DOPENSSL_NO_SSE2_FOR_TESTING) +if(MALLOC_FAILURE_TESTING) + add_definitions(-DBORINGSSL_MALLOC_FAILURE_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") +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() - set(ARCH "x86") + enable_language(ASM) + set(OPENSSL_ASM TRUE) + # 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() + 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() -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(ANDROID AND NOT ANDROID_NDK_REVISION AND ARCH STREQUAL "arm") - # The third-party Android-NDK CMake files somehow fail to set the -march flag - # for assembly files. Without this flag, the compiler believes that it's - # building for ARMv5. - set(CMAKE_ASM_FLAGS "-march=${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_ASM_FLAGS}") +if(OPENSSL_NO_SSE2_FOR_TESTING) + add_definitions(-DOPENSSL_NO_SSE2_FOR_TESTING) endif() if(USE_CUSTOM_LIBCXX) @@ -515,6 +415,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. @@ -548,10 +454,6 @@ if(USE_CUSTOM_LIBCXX) libcxxabi PRIVATE -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ) - set_target_properties(libcxxabi PROPERTIES COMPILE_FLAGS "-Wno-missing-prototypes -Wno-implicit-fallthrough") - # libc++abi depends on libc++ internal headers. - set_property(TARGET libcxxabi APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/util/bot/libcxx/src") - install(TARGETS libcxxabi EXPORT OpenSSLTargets) add_library(libcxx ${LIBCXX_SOURCES}) if(ASAN OR MSAN OR TSAN) @@ -566,16 +468,29 @@ if(USE_CUSTOM_LIBCXX) -D_LIBCPP_BUILDING_LIBRARY -DLIBCXX_BUILDING_LIBCXXABI ) + set_target_properties( + libcxx libcxxabi PROPERTIES + COMPILE_FLAGS "-Wno-missing-prototypes -Wno-implicit-fallthrough" + # libc++ and libc++abi must be built in C++20 mode. + CXX_STANDARD 20 + CXX_STANDARD_REQUIRED TRUE + ) + # libc++abi depends on libc++ internal headers. + set_property(TARGET libcxx libcxxabi APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_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 # 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) +if(USE_CUSTOM_LIBCXX) + target_link_libraries(boringssl_gtest libcxx) +endif() +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. @@ -637,16 +552,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) @@ -658,22 +573,30 @@ 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} test ${GO_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} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 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 OpenSSLConfig.cmake DESTINATION lib/cmake/OpenSSL) +install_if_enabled(FILES cmake/OpenSSLConfig.cmake DESTINATION lib/cmake/OpenSSL) diff --git a/third_party/boringssl/src/CONTRIBUTING.md b/third_party/boringssl/src/CONTRIBUTING.md index 5e161e8e0d72..69dbc20d8e76 100644 --- a/third_party/boringssl/src/CONTRIBUTING.md +++ b/third_party/boringssl/src/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.) diff --git a/third_party/boringssl/src/FUZZING.md b/third_party/boringssl/src/FUZZING.md index 5653acc1f328..89cf5e9302b2 100644 --- a/third_party/boringssl/src/FUZZING.md +++ b/third_party/boringssl/src/FUZZING.md @@ -7,10 +7,8 @@ We use Clang's [libFuzzer](http://llvm.org/docs/LibFuzzer.html) for fuzz testing In order to build the fuzz tests you will need at least Clang 6.0. Pass `-DFUZZ=1` on the CMake command line to enable building BoringSSL with coverage and AddressSanitizer, and to build the fuzz test binaries. You'll probably need to set the `CC` and `CXX` environment variables too, like this: ``` -mkdir build -cd build -CC=clang CXX=clang++ cmake -GNinja -DFUZZ=1 .. -ninja +CC=clang CXX=clang++ cmake -GNinja -DFUZZ=1 -B build +ninja -C build ``` diff --git a/third_party/boringssl/src/INCORPORATING.md b/third_party/boringssl/src/INCORPORATING.md index 96bf90880bac..f793e88acc36 100644 --- a/third_party/boringssl/src/INCORPORATING.md +++ b/third_party/boringssl/src/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 diff --git a/third_party/boringssl/src/LICENSE b/third_party/boringssl/src/LICENSE index 49c41fa7afc2..fc1cebbad788 100644 --- a/third_party/boringssl/src/LICENSE +++ b/third_party/boringssl/src/LICENSE @@ -21,6 +21,7 @@ record keeping.) 27287199 27287880 27287883 + 263291445 OpenSSL License --------------- diff --git a/third_party/boringssl/src/METADATA b/third_party/boringssl/src/METADATA index a216cfb8066c..724875d8aaa5 100644 --- a/third_party/boringssl/src/METADATA +++ b/third_party/boringssl/src/METADATA @@ -5,13 +5,13 @@ description: third_party { identifier { type: "ChromiumVersion" - value: "108.0.5359.243" # from https://chromereleases.googleblog.com/2023/09/long-term-support-channel-update-for_18.html + value: "114.0.5735.355" # from https://chromereleases.googleblog.com/2024/03/long-term-support-channel-update-for.html } identifier { type: "Git" value: "https://boringssl.googlesource.com/boringssl.git" - version: "1ccef4908ce04adc6d246262846f3cd8a111fa44" - # from https://chromium.googlesource.com/chromium/src/+/108.0.5359.243/DEPS#339 + version: "4b6d950d8921d6dd5365de0797fcc97302b9561b" + # from https://chromium.googlesource.com/chromium/src/+/114.0.5735.355/DEPS#319 } last_upgrade_date { year: 2018 diff --git a/third_party/boringssl/src/PORTING.md b/third_party/boringssl/src/PORTING.md index 9adaf738ec95..eb951f577fe1 100644 --- a/third_party/boringssl/src/PORTING.md +++ b/third_party/boringssl/src/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/third_party/boringssl/src/README.md b/third_party/boringssl/src/README.md index 2a99b60b726f..d3d5e29d610c 100644 --- a/third_party/boringssl/src/README.md +++ b/third_party/boringssl/src/README.md @@ -30,13 +30,13 @@ Project links: There are other files in this directory which might be helpful: - * [PORTING.md](/PORTING.md): how to port OpenSSL-using code to BoringSSL. - * [BUILDING.md](/BUILDING.md): how to build BoringSSL - * [INCORPORATING.md](/INCORPORATING.md): how to incorporate BoringSSL into a project. - * [API-CONVENTIONS.md](/API-CONVENTIONS.md): general API conventions for BoringSSL consumers and developers. - * [STYLE.md](/STYLE.md): rules and guidelines for coding style. + * [PORTING.md](./PORTING.md): how to port OpenSSL-using code to BoringSSL. + * [BUILDING.md](./BUILDING.md): how to build BoringSSL + * [INCORPORATING.md](./INCORPORATING.md): how to incorporate BoringSSL into a project. + * [API-CONVENTIONS.md](./API-CONVENTIONS.md): general API conventions for BoringSSL consumers and developers. + * [STYLE.md](./STYLE.md): rules and guidelines for coding style. * include/openssl: public headers with API documentation in comments. Also [available online](https://commondatastorage.googleapis.com/chromium-boringssl-docs/headers.html). - * [FUZZING.md](/FUZZING.md): information about fuzzing BoringSSL. - * [CONTRIBUTING.md](/CONTRIBUTING.md): how to contribute to BoringSSL. - * [BREAKING-CHANGES.md](/BREAKING-CHANGES.md): notes on potentially-breaking changes. - * [SANDBOXING.md](/SANDBOXING.md): notes on using BoringSSL in a sandboxed environment. + * [FUZZING.md](./FUZZING.md): information about fuzzing BoringSSL. + * [CONTRIBUTING.md](./CONTRIBUTING.md): how to contribute to BoringSSL. + * [BREAKING-CHANGES.md](./BREAKING-CHANGES.md): notes on potentially-breaking changes. + * [SANDBOXING.md](./SANDBOXING.md): notes on using BoringSSL in a sandboxed environment. diff --git a/third_party/boringssl/src/OpenSSLConfig.cmake b/third_party/boringssl/src/cmake/OpenSSLConfig.cmake similarity index 100% rename from third_party/boringssl/src/OpenSSLConfig.cmake rename to third_party/boringssl/src/cmake/OpenSSLConfig.cmake diff --git a/third_party/boringssl/src/cmake/go.cmake b/third_party/boringssl/src/cmake/go.cmake new file mode 100644 index 000000000000..966ad32ddb97 --- /dev/null +++ b/third_party/boringssl/src/cmake/go.cmake @@ -0,0 +1,50 @@ +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 "${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. + # 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} ${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. + binary_dir_relative_path(${dest} target) + + 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} ${PROJECT_SOURCE_DIR}/go.mod + DEPFILE ${depfile}) + endif() +endfunction() + diff --git a/third_party/boringssl/src/cmake/paths.cmake b/third_party/boringssl/src/cmake/paths.cmake new file mode 100644 index 000000000000..43ebc406283d --- /dev/null +++ b/third_party/boringssl/src/cmake/paths.cmake @@ -0,0 +1,11 @@ +# binary_dir_relative_path sets outvar to +# ${CMAKE_CURRENT_BINARY_DIR}/${cur_bin_dir_relative}, but expressed relative to +# ${CMAKE_BINARY_DIR}. +# +# TODO(davidben): When we require CMake 3.20 or later, this can be replaced with +# the built-in cmake_path(RELATIVE_PATH) function. +function(binary_dir_relative_path cur_bin_dir_relative outvar) + string(LENGTH "${CMAKE_BINARY_DIR}/" root_dir_length) + string(SUBSTRING "${CMAKE_CURRENT_BINARY_DIR}/${cur_bin_dir_relative}" ${root_dir_length} -1 result) + set(${outvar} ${result} PARENT_SCOPE) +endfunction() diff --git a/third_party/boringssl/src/cmake/perlasm.cmake b/third_party/boringssl/src/cmake/perlasm.cmake new file mode 100644 index 000000000000..9828799007c2 --- /dev/null +++ b/third_party/boringssl/src/cmake/perlasm.cmake @@ -0,0 +1,58 @@ +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/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 "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/third_party/boringssl/src/crypto/CMakeLists.txt b/third_party/boringssl/src/crypto/CMakeLists.txt index d769efdaa496..cdb5ddca19f2 100644 --- a/third_party/boringssl/src/crypto/CMakeLists.txt +++ b/third_party/boringssl/src/crypto/CMakeLists.txt @@ -1,95 +1,3 @@ -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,68 +12,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} - hrss/asm/poly_rq_mul.S - 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 + hrss/asm/poly_rq_mul.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 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 @@ -211,13 +74,11 @@ add_library( asn1/a_mbstr.c asn1/a_object.c asn1/a_octet.c - asn1/a_print.c asn1/a_strex.c asn1/a_strnid.c asn1/a_time.c asn1/a_type.c asn1/a_utctm.c - asn1/a_utf8.c asn1/asn1_lib.c asn1/asn1_par.c asn1/asn_pack.c @@ -264,13 +125,14 @@ add_library( cipher_extra/tls_cbc.c conf/conf.c cpu_aarch64_apple.c + cpu_aarch64_freebsd.c cpu_aarch64_fuchsia.c cpu_aarch64_linux.c cpu_aarch64_win.c + cpu_arm_freebsd.c cpu_arm_linux.c cpu_arm.c cpu_intel.c - cpu_ppc64le.c crypto.c curve25519/curve25519.c curve25519/spake25519.c @@ -306,9 +168,10 @@ add_library( evp/scrypt.c evp/sign.c ex_data.c - hkdf/hkdf.c hpke/hpke.c hrss/hrss.c + kyber/keccak.c + kyber/kyber.c lhash/lhash.c mem.c obj/obj.c @@ -340,6 +203,7 @@ add_library( refcount_c11.c refcount_lock.c rsa_extra/rsa_asn1.c + rsa_extra/rsa_crypt.c rsa_extra/rsa_print.c stack/stack.c siphash/siphash.c @@ -359,6 +223,7 @@ add_library( x509/by_file.c x509/i2d_pr.c x509/name_print.c + x509/policy.c x509/rsa_pss.c x509/t_crl.c x509/t_req.c @@ -398,11 +263,6 @@ add_library( x509/x_val.c x509/x_x509.c x509/x_x509a.c - x509v3/pcy_cache.c - x509v3/pcy_data.c - x509v3/pcy_map.c - x509v3/pcy_node.c - x509v3/pcy_tree.c x509v3/v3_akey.c x509v3/v3_akeya.c x509v3/v3_alt.c @@ -420,8 +280,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 @@ -430,19 +288,19 @@ add_library( x509v3/v3_utl.c $ - - ${CRYPTO_ARCH_SOURCES} ${CRYPTO_FIPS_OBJECTS} ) -target_include_directories(crypto INTERFACE - $ - $ -) -install(TARGETS crypto EXPORT OpenSSLTargets - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +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 PUBLIC + $ + $ ) +install_if_enabled(TARGETS crypto EXPORT OpenSSLTargets ${INSTALL_DESTINATION_DEFAULT}) set_property(TARGET crypto PROPERTY EXPORT_NAME Crypto) if(FIPS_SHARED) @@ -461,13 +319,17 @@ 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) 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) +endif() if(NOT ANDROID) find_package(Threads REQUIRED) @@ -488,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( @@ -530,17 +389,18 @@ add_executable( fipsmodule/ec/ec_test.cc fipsmodule/ec/p256-nistz_test.cc fipsmodule/ecdsa/ecdsa_test.cc + fipsmodule/hkdf/hkdf_test.cc fipsmodule/md5/md5_test.cc fipsmodule/modes/gcm_test.cc fipsmodule/rand/ctrdrbg_test.cc fipsmodule/rand/fork_detect_test.cc fipsmodule/service_indicator/service_indicator_test.cc fipsmodule/sha/sha_test.cc - hkdf/hkdf_test.cc hpke/hpke_test.cc 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 @@ -563,13 +423,6 @@ add_executable( x509v3/tab_test.cc $ - $ ) - -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() +target_link_libraries(crypto_test test_support_lib boringssl_gtest_main crypto) add_dependencies(all_tests crypto_test) diff --git a/third_party/boringssl/src/crypto/abi_self_test.cc b/third_party/boringssl/src/crypto/abi_self_test.cc index 96814985e9ad..a42bd1de4bae 100644 --- a/third_party/boringssl/src/crypto/abi_self_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/asn1/a_bitstr.c b/third_party/boringssl/src/crypto/asn1/a_bitstr.c index 9c5085770472..2be07a45aa1c 100644 --- a/third_party/boringssl/src/crypto/asn1/a_bitstr.c +++ b/third_party/boringssl/src/crypto/asn1/a_bitstr.c @@ -66,7 +66,8 @@ #include "internal.h" -int ASN1_BIT_STRING_set(ASN1_BIT_STRING *x, const unsigned char *d, int len) { +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *x, const unsigned char *d, + ossl_ssize_t len) { return ASN1_STRING_set(x, d, len); } @@ -115,6 +116,10 @@ int i2c_ASN1_BIT_STRING(const ASN1_BIT_STRING *a, unsigned char **pp) { uint8_t bits; int len = asn1_bit_string_length(a, &bits); + if (len > INT_MAX - 1) { + OPENSSL_PUT_ERROR(ASN1, ERR_R_OVERFLOW); + return 0; + } int ret = 1 + len; if (pp == NULL) { return ret; @@ -179,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; @@ -231,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/third_party/boringssl/src/crypto/asn1/a_bool.c b/third_party/boringssl/src/crypto/asn1/a_bool.c index 2a4448cc4f8a..e227b7f7969b 100644 --- a/third_party/boringssl/src/crypto/asn1/a_bool.c +++ b/third_party/boringssl/src/crypto/asn1/a_bool.c @@ -56,65 +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) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); - return -1; - } - } else { - p = *pp; - } - - ASN1_put_object(&p, 0, 1, V_ASN1_BOOLEAN, V_ASN1_UNIVERSAL); - *p = a ? 0xff : 0x00; - - // 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; -} -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); +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; } + return CBB_finish_i2d(&cbb, outp); +} - if (inf & V_ASN1_CONSTRUCTED) { - OPENSSL_PUT_ERROR(ASN1, ASN1_R_TYPE_NOT_PRIMITIVE); - return -1; +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); - return -1; + 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 -1; - } - 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/third_party/boringssl/src/crypto/asn1/a_dup.c b/third_party/boringssl/src/crypto/asn1/a_dup.c index 8ee0c7eb7226..b37a5c61b958 100644 --- a/third_party/boringssl/src/crypto/asn1/a_dup.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/asn1/a_gentm.c b/third_party/boringssl/src/crypto/asn1/a_gentm.c index 283ff7d3498b..ff1f97cbbaf4 100644 --- a/third_party/boringssl/src/crypto/asn1/a_gentm.c +++ b/third_party/boringssl/src/crypto/asn1/a_gentm.c @@ -58,6 +58,7 @@ #include #include #include +#include #include #include @@ -81,34 +82,32 @@ int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *d) { } int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str) { - ASN1_GENERALIZEDTIME t; - - t.type = V_ASN1_GENERALIZEDTIME; - t.length = strlen(str); - t.data = (unsigned char *)str; - if (ASN1_GENERALIZEDTIME_check(&t)) { - if (s != NULL) { - if (!ASN1_STRING_set((ASN1_STRING *)s, (unsigned char *)str, t.length)) { - return 0; - } - s->type = V_ASN1_GENERALIZEDTIME; - } - return 1; - } else { + size_t len = strlen(str); + CBS cbs; + CBS_init(&cbs, (const uint8_t *)str, len); + if (!CBS_parse_generalized_time(&cbs, /*out_tm=*/NULL, + /*allow_timezone_offset=*/0)) { return 0; } + if (s != NULL) { + if (!ASN1_STRING_set(s, str, len)) { + return 0; + } + s->type = V_ASN1_GENERALIZEDTIME; + } + return 1; } 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/third_party/boringssl/src/crypto/asn1/a_i2d_fp.c b/third_party/boringssl/src/crypto/asn1/a_i2d_fp.c index 4a14f2bcc1cc..e0713faecdee 100644 --- a/third_party/boringssl/src/crypto/asn1/a_i2d_fp.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/asn1/a_int.c b/third_party/boringssl/src/crypto/asn1/a_int.c index 78d1f09e9183..27845c0be609 100644 --- a/third_party/boringssl/src/crypto/asn1/a_int.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/asn1/a_mbstr.c b/third_party/boringssl/src/crypto/asn1/a_mbstr.c index c53d6d588f7c..8fc82ab5caf4 100644 --- a/third_party/boringssl/src/crypto/asn1/a_mbstr.c +++ b/third_party/boringssl/src/crypto/asn1/a_mbstr.c @@ -73,23 +73,19 @@ // horrible: it has to be :-( The 'ncopy' form checks minimum and maximum // size limits too. -int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, - int inform, unsigned long mask) { - return ASN1_mbstring_ncopy(out, in, len, inform, mask, 0, 0); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, + ossl_ssize_t len, int inform, unsigned long mask) { + return ASN1_mbstring_ncopy(out, in, len, inform, mask, /*minsize=*/0, + /*maxsize=*/0); } OPENSSL_DECLARE_ERROR_REASON(ASN1, INVALID_BMPSTRING) OPENSSL_DECLARE_ERROR_REASON(ASN1, INVALID_UNIVERSALSTRING) 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]; +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, + ossl_ssize_t len, int inform, unsigned long mask, + ossl_ssize_t minsize, ossl_ssize_t maxsize) { if (len == -1) { len = strlen((const char *)in); } @@ -128,7 +124,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)) { @@ -167,23 +163,21 @@ 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=%zu", (size_t)maxsize); + return -1; + } } 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=%zu", (size_t)minsize); return -1; } // 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,37 +210,31 @@ 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; } + CBB cbb; + CBB_zero(&cbb); // 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; } - - CBB cbb; if (!CBB_init(&cbb, size_estimate + 1)) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); goto err; } CBS_init(&cbs, in, len); @@ -267,12 +255,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); @@ -283,10 +272,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/third_party/boringssl/src/crypto/asn1/a_object.c b/third_party/boringssl/src/crypto/asn1/a_object.c index c854fb8871ae..e50193413576 100644 --- a/third_party/boringssl/src/crypto/asn1/a_object.c +++ b/third_party/boringssl/src/crypto/asn1/a_object.c @@ -59,47 +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) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); - 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) { @@ -107,8 +96,12 @@ int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a) { } static int write_str(BIO *bp, const char *str) { - int len = strlen(str); - return BIO_write(bp, str, len) == len ? len : -1; + size_t len = strlen(str); + if (len > INT_MAX) { + OPENSSL_PUT_ERROR(ASN1, ERR_R_OVERFLOW); + return -1; + } + return BIO_write(bp, str, (int)len) == (int)len ? (int)len : -1; } int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a) { @@ -137,106 +130,55 @@ 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; } -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) { - i = ERR_R_MALLOC_FAILURE; - 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: - OPENSSL_PUT_ERROR(ASN1, i); - if ((ret != NULL) && ((a == NULL) || (*a != ret))) { - ASN1_OBJECT_free(ret); - } - return NULL; } ASN1_OBJECT *ASN1_OBJECT_new(void) { @@ -244,7 +186,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; @@ -275,16 +216,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/third_party/boringssl/src/crypto/asn1/a_strex.c b/third_party/boringssl/src/crypto/asn1/a_strex.c index fd08b02fe3b2..f21d14655747 100644 --- a/third_party/boringssl/src/crypto/asn1/a_strex.c +++ b/third_party/boringssl/src/crypto/asn1/a_strex.c @@ -59,6 +59,7 @@ #include #include #include +#include #include #include @@ -121,7 +122,8 @@ static int do_esc_char(uint32_t c, unsigned long flags, char *do_quotes, return maybe_write(out, &u8, 1) ? 1 : -1; } - int len = strlen(buf); + static_assert(sizeof(buf) < INT_MAX, "len may not fit in int"); + int len = (int)strlen(buf); return maybe_write(out, buf, len) ? len : -1; } @@ -167,12 +169,17 @@ static int do_buf(const unsigned char *buf, int buflen, int encoding, } const int is_last = CBS_len(&cbs) == 0; if (flags & ASN1_STRFLGS_UTF8_CONVERT) { - unsigned char utfbuf[6]; - int utflen; - utflen = UTF8_putc(utfbuf, sizeof(utfbuf), c); - for (int i = 0; i < utflen; i++) { - int len = do_esc_char(utfbuf[i], flags, quotes, out, is_first && i == 0, - is_last && i == utflen - 1); + uint8_t utf8_buf[6]; + CBB utf8_cbb; + CBB_init_fixed(&utf8_cbb, utf8_buf, sizeof(utf8_buf)); + if (!cbb_add_utf8(&utf8_cbb, c)) { + OPENSSL_PUT_ERROR(ASN1, ERR_R_INTERNAL_ERROR); + return 1; + } + size_t utf8_len = CBB_len(&utf8_cbb); + for (size_t i = 0; i < utf8_len; i++) { + int len = do_esc_char(utf8_buf[i], flags, quotes, out, + is_first && i == 0, is_last && i == utf8_len - 1); if (len < 0) { return -1; } diff --git a/third_party/boringssl/src/crypto/asn1/a_strnid.c b/third_party/boringssl/src/crypto/asn1/a_strnid.c index 3be266e8d1f1..48c223d6ad6d 100644 --- a/third_party/boringssl/src/crypto/asn1/a_strnid.c +++ b/third_party/boringssl/src/crypto/asn1/a_strnid.c @@ -87,7 +87,7 @@ static const ASN1_STRING_TABLE *asn1_string_table_get(int nid); // a corresponding OID. For example certificates and certificate requests. ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in, - int len, int inform, int nid) { + ossl_ssize_t len, int inform, int nid) { ASN1_STRING *str = NULL; int ret; if (!out) { diff --git a/third_party/boringssl/src/crypto/asn1/a_time.c b/third_party/boringssl/src/crypto/asn1/a_time.c index 50829690c1aa..87bf092138c1 100644 --- a/third_party/boringssl/src/crypto/asn1/a_time.c +++ b/third_party/boringssl/src/crypto/asn1/a_time.c @@ -55,6 +55,7 @@ * [including the GNU Public Licence.] */ #include +#include #include #include @@ -73,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) { @@ -163,36 +166,15 @@ ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t, return NULL; } - int ASN1_TIME_set_string(ASN1_TIME *s, const char *str) { - ASN1_TIME t; - - t.length = strlen(str); - t.data = (unsigned char *)str; - t.flags = 0; - - t.type = V_ASN1_UTCTIME; - - if (!ASN1_TIME_check(&t)) { - t.type = V_ASN1_GENERALIZEDTIME; - if (!ASN1_TIME_check(&t)) { - return 0; - } - } - - if (s && !ASN1_STRING_copy((ASN1_STRING *)s, (ASN1_STRING *)&t)) { - return 0; - } - - return 1; + return ASN1_UTCTIME_set_string(s, str) || + ASN1_GENERALIZEDTIME_set_string(s, 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/third_party/boringssl/src/crypto/asn1/a_type.c b/third_party/boringssl/src/crypto/asn1/a_type.c index d59fdba8ac6e..0c2fd136d367 100644 --- a/third_party/boringssl/src/crypto/asn1/a_type.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/asn1/a_utctm.c b/third_party/boringssl/src/crypto/asn1/a_utctm.c index 201c654327a3..45c4081ec55b 100644 --- a/third_party/boringssl/src/crypto/asn1/a_utctm.c +++ b/third_party/boringssl/src/crypto/asn1/a_utctm.c @@ -58,6 +58,7 @@ #include #include #include +#include #include #include @@ -82,32 +83,30 @@ int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) { } int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str) { - ASN1_UTCTIME t; - - t.type = V_ASN1_UTCTIME; - t.length = strlen(str); - t.data = (unsigned char *)str; - if (ASN1_UTCTIME_check(&t)) { - if (s != NULL) { - if (!ASN1_STRING_set((ASN1_STRING *)s, (unsigned char *)str, t.length)) { - return 0; - } - s->type = V_ASN1_UTCTIME; - } - return 1; - } else { + size_t len = strlen(str); + CBS cbs; + CBS_init(&cbs, (const uint8_t *)str, len); + if (!CBS_parse_utc_time(&cbs, /*out_tm=*/NULL, + /*allow_timezone_offset=*/1)) { return 0; } + if (s != NULL) { + if (!ASN1_STRING_set(s, str, len)) { + return 0; + } + s->type = V_ASN1_UTCTIME; + } + 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; } @@ -153,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/third_party/boringssl/src/crypto/asn1/a_utf8.c b/third_party/boringssl/src/crypto/asn1/a_utf8.c deleted file mode 100644 index 02c1d56c66e7..000000000000 --- a/third_party/boringssl/src/crypto/asn1/a_utf8.c +++ /dev/null @@ -1,142 +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.] */ - -#include - -#include -#include - -#include "internal.h" - -// UTF8 utilities - -// This takes a character 'value' and writes the UTF8 encoded value in 'str' -// where 'str' is a buffer containing 'len' characters. Returns the number of -// characters written or -1 if 'len' is too small. 'str' can be set to NULL -// in which case it just returns the number of characters. It will need at -// most 6 characters. - -int UTF8_putc(unsigned char *str, int len, uint32_t value) { - if (!str) { - len = 6; // Maximum we will need - } else if (len <= 0) { - return -1; - } - if (value < 0x80) { - if (str) { - *str = (unsigned char)value; - } - return 1; - } - if (value < 0x800) { - if (len < 2) { - return -1; - } - if (str) { - *str++ = (unsigned char)(((value >> 6) & 0x1f) | 0xc0); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 2; - } - if (value < 0x10000) { - if (len < 3) { - return -1; - } - if (str) { - *str++ = (unsigned char)(((value >> 12) & 0xf) | 0xe0); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 3; - } - if (value < 0x200000) { - if (len < 4) { - return -1; - } - if (str) { - *str++ = (unsigned char)(((value >> 18) & 0x7) | 0xf0); - *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 4; - } - if (value < 0x4000000) { - if (len < 5) { - return -1; - } - if (str) { - *str++ = (unsigned char)(((value >> 24) & 0x3) | 0xf8); - *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 5; - } - if (len < 6) { - return -1; - } - if (str) { - *str++ = (unsigned char)(((value >> 30) & 0x1) | 0xfc); - *str++ = (unsigned char)(((value >> 24) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 18) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 12) & 0x3f) | 0x80); - *str++ = (unsigned char)(((value >> 6) & 0x3f) | 0x80); - *str = (unsigned char)((value & 0x3f) | 0x80); - } - return 6; -} diff --git a/third_party/boringssl/src/crypto/asn1/asn1_lib.c b/third_party/boringssl/src/crypto/asn1/asn1_lib.c index 98061db37fc3..dd56c9890bf6 100644 --- a/third_party/boringssl/src/crypto/asn1/asn1_lib.c +++ b/third_party/boringssl/src/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. - unsigned tag; - size_t header_len; - int indefinite; + CBS_ASN1_TAG tag; 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) { @@ -271,19 +261,27 @@ ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *str) { return ret; } -int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len) { - unsigned char *c; +int ASN1_STRING_set(ASN1_STRING *str, const void *_data, ossl_ssize_t len_s) { const char *data = _data; - - if (len < 0) { + size_t len; + if (len_s < 0) { if (data == NULL) { return 0; - } else { - len = strlen(data); } + len = strlen(data); + } else { + len = (size_t)len_s; + } + + // |ASN1_STRING| cannot represent strings that exceed |int|, and we must + // reserve space for a trailing NUL below. + if (len > INT_MAX || len + 1 < len) { + OPENSSL_PUT_ERROR(ASN1, ERR_R_OVERFLOW); + return 0; } - if ((str->length <= len) || (str->data == NULL)) { - c = str->data; + + if (str->length <= (int)len || str->data == NULL) { + unsigned char *c = str->data; if (c == NULL) { str->data = OPENSSL_malloc(len + 1); } else { @@ -291,15 +289,17 @@ int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len) { } if (str->data == NULL) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); str->data = c; return 0; } } - str->length = len; + str->length = (int)len; if (data != NULL) { OPENSSL_memcpy(str->data, data, len); - // an allowance for strings :-) + // Historically, OpenSSL would NUL-terminate most (but not all) + // |ASN1_STRING|s, in case anyone accidentally passed |str->data| into a + // function expecting a C string. We retain this behavior for compatibility, + // but code must not rely on this. See CVE-2021-3712. str->data[len] = '\0'; } return 1; @@ -320,7 +320,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/third_party/boringssl/src/crypto/asn1/asn1_test.cc b/third_party/boringssl/src/crypto/asn1/asn1_test.cc index 2f0ec760f273..849cfe90c499 100644 --- a/third_party/boringssl/src/crypto/asn1/asn1_test.cc +++ b/third_party/boringssl/src/crypto/asn1/asn1_test.cc @@ -28,7 +28,10 @@ #include #include #include +#include #include +#include +#include #include #include "../test/test_util.h" @@ -39,45 +42,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 @@ -106,6 +70,71 @@ 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 128. This is no + // longer used but is still accepted by the encoder. + // + // TODO(crbug.com/boringssl/412): The encoder should reject it. However, it is + // still needed to support some edge cases in |ASN1_PRINTABLE|. When that is + // fixed, test that we reject it. + 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))); + TestSerialize(obj.get(), i2d_ASN1_TYPE, kTag128); + + // 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 || @@ -551,8 +580,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)); @@ -689,6 +720,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)); @@ -921,7 +954,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; @@ -939,7 +972,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; } @@ -963,37 +996,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)); @@ -1001,8 +1032,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); @@ -1016,8 +1047,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), @@ -1028,7 +1059,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) { @@ -1038,8 +1069,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); @@ -1047,6 +1078,72 @@ TEST(ASN1Test, SetTime) { } } +TEST(ASN1Test, TimeSetString) { + bssl::UniquePtr s(ASN1_STRING_new()); + ASSERT_TRUE(s); + + ASSERT_TRUE(ASN1_UTCTIME_set_string(s.get(), "700101000000Z")); + EXPECT_EQ(V_ASN1_UTCTIME, ASN1_STRING_type(s.get())); + EXPECT_EQ("700101000000Z", ASN1StringToStdString(s.get())); + + ASSERT_TRUE(ASN1_GENERALIZEDTIME_set_string(s.get(), "19700101000000Z")); + EXPECT_EQ(V_ASN1_GENERALIZEDTIME, ASN1_STRING_type(s.get())); + EXPECT_EQ("19700101000000Z", ASN1StringToStdString(s.get())); + + // |ASN1_TIME_set_string| accepts either format. It relies on there being no + // overlap between the two. + ASSERT_TRUE(ASN1_TIME_set_string(s.get(), "700101000000Z")); + EXPECT_EQ(V_ASN1_UTCTIME, ASN1_STRING_type(s.get())); + EXPECT_EQ("700101000000Z", ASN1StringToStdString(s.get())); + + ASSERT_TRUE(ASN1_TIME_set_string(s.get(), "19700101000000Z")); + EXPECT_EQ(V_ASN1_GENERALIZEDTIME, ASN1_STRING_type(s.get())); + EXPECT_EQ("19700101000000Z", ASN1StringToStdString(s.get())); + + // Invalid inputs are rejected. + EXPECT_FALSE(ASN1_UTCTIME_set_string(s.get(), "nope")); + EXPECT_FALSE(ASN1_UTCTIME_set_string(s.get(), "19700101000000Z")); + EXPECT_FALSE(ASN1_GENERALIZEDTIME_set_string(s.get(), "nope")); + EXPECT_FALSE(ASN1_GENERALIZEDTIME_set_string(s.get(), "700101000000Z")); + EXPECT_FALSE(ASN1_TIME_set_string(s.get(), "nope")); + + // If passed a null object, the functions validate the input without writing + // to anything. + EXPECT_TRUE(ASN1_UTCTIME_set_string(nullptr, "700101000000Z")); + EXPECT_TRUE(ASN1_TIME_set_string(nullptr, "700101000000Z")); + EXPECT_TRUE(ASN1_GENERALIZEDTIME_set_string(nullptr, "19700101000000Z")); + EXPECT_TRUE(ASN1_TIME_set_string(nullptr, "19700101000000Z")); + EXPECT_FALSE(ASN1_UTCTIME_set_string(nullptr, "nope")); + EXPECT_FALSE(ASN1_GENERALIZEDTIME_set_string(nullptr, "nope")); + EXPECT_FALSE(ASN1_TIME_set_string(nullptr, "nope")); +} + +TEST(ASN1Test, AdjTime) { + struct tm tm1, tm2; + int days, secs; + + OPENSSL_posix_to_tm(0, &tm1); + OPENSSL_posix_to_tm(0, &tm2); + // Test values that are too large and should be rejected. + EXPECT_FALSE(OPENSSL_gmtime_adj(&tm1, INT_MIN, INT_MIN)); + EXPECT_FALSE(OPENSSL_gmtime_adj(&tm1, INT_MAX, INT_MAX)); + // Basic functionality. + EXPECT_TRUE(OPENSSL_gmtime_adj(&tm2, 1, 1)); + EXPECT_TRUE(OPENSSL_gmtime_diff(&days, &secs, &tm1, &tm2)); + EXPECT_EQ(days, 1); + EXPECT_EQ(secs, 1); + EXPECT_TRUE(OPENSSL_gmtime_diff(&days, &secs, &tm2, &tm1)); + EXPECT_EQ(days, -1); + EXPECT_EQ(secs, -1); + // Test a value of days that is very large, but valid. + EXPECT_TRUE(OPENSSL_gmtime_adj(&tm2, 2932800, 0)); + EXPECT_TRUE(OPENSSL_gmtime_diff(&days, &secs, &tm1, &tm2)); + EXPECT_EQ(days, 2932801); + EXPECT_EQ(secs, 1); + EXPECT_TRUE(OPENSSL_gmtime_diff(&days, &secs, &tm2, &tm1)); + EXPECT_EQ(days, -2932801); + EXPECT_EQ(secs, -1); +} static std::vector StringToVector(const std::string &str) { return std::vector(str.begin(), str.end()); } @@ -1272,6 +1369,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; @@ -1326,6 +1424,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; @@ -1787,27 +1886,6 @@ TEST(ASN1Test, NegativeEnumeratedMultistring) { TestSerialize(str.get(), i2d_ASN1_PRINTABLE, kMinusOne); } -TEST(ASN1Test, PrintableType) { - const struct { - std::vector in; - int result; - } kTests[] = { - {{}, V_ASN1_PRINTABLESTRING}, - {{'a', 'A', '0', '\'', '(', ')', '+', ',', '-', '.', '/', ':', '=', '?'}, - V_ASN1_PRINTABLESTRING}, - {{'*'}, V_ASN1_IA5STRING}, - {{'\0'}, V_ASN1_IA5STRING}, - {{'\0', 'a'}, V_ASN1_IA5STRING}, - {{0, 1, 2, 3, 125, 126, 127}, V_ASN1_IA5STRING}, - {{0, 1, 2, 3, 125, 126, 127, 128}, V_ASN1_T61STRING}, - {{128, 0, 1, 2, 3, 125, 126, 127}, V_ASN1_T61STRING}, - }; - for (const auto &t : kTests) { - SCOPED_TRACE(Bytes(t.in)); - EXPECT_EQ(t.result, ASN1_PRINTABLE_type(t.in.data(), t.in.size())); - } -} - // Encoding a CHOICE type with an invalid selector should fail. TEST(ASN1Test, InvalidChoice) { bssl::UniquePtr name(GENERAL_NAME_new()); @@ -2163,10 +2241,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 @@ -2480,4 +2572,286 @@ 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. +} + +// 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); +} + +#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); +} + +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/third_party/boringssl/src/crypto/asn1/asn_pack.c b/third_party/boringssl/src/crypto/asn1/asn_pack.c index 069cef0b3c0c..c42cc05ea013 100644 --- a/third_party/boringssl/src/crypto/asn1/asn_pack.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/asn1/internal.h b/third_party/boringssl/src/crypto/asn1/internal.h index 3d78dd6365ff..5dca7280ca09 100644 --- a/third_party/boringssl/src/crypto/asn1/internal.h +++ b/third_party/boringssl/src/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 @@ -71,16 +71,6 @@ extern "C" { // Wrapper functions for time functions. -// OPENSSL_posix_to_tm converts a int64_t POSIX time value in |time| whuch must -// be in the range of year 0000 to 9999 to a broken out time value in |tm|. It -// returns one on success and zero on error. -OPENSSL_EXPORT int OPENSSL_posix_to_tm(int64_t time, struct tm *out_tm); - -// OPENSSL_tm_to_posix converts a time value between the years 0 and 9999 in -// |tm| to a POSIX time value in |out|. One is returned on success, zero is -// returned on failure. It is a failure if the tm contains out of range values. -OPENSSL_EXPORT int OPENSSL_tm_to_posix(const struct tm *tm, int64_t *out); - // OPENSSL_gmtime converts a time_t value in |time| which must be in the range // of year 0000 to 9999 to a broken out time value in |tm|. On success |tm| is // returned. On failure NULL is returned. @@ -96,7 +86,8 @@ OPENSSL_EXPORT int OPENSSL_timegm(const struct tm *tm, time_t *out); // |offset_day| days and |offset_sec| seconds. It returns zero on failure. |tm| // must be in the range of year 0000 to 9999 both before and after the update or // a failure will be returned. -int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); +OPENSSL_EXPORT int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, + long offset_sec); // OPENSSL_gmtime_diff calculates the difference between |from| and |to|. It // returns one, and outputs the difference as a number of days and seconds in @@ -131,21 +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 - int modified; // set to 1 if 'enc' is invalid - // 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, @@ -153,18 +139,22 @@ 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 UTF8_putc(unsigned char *str, int len, uint32_t value); - 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 @@ -206,14 +196,24 @@ 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); // asn1_type_value_as_pointer returns |a|'s value in pointer form. This is // usually the value object but, for BOOLEAN values, is 0 or 0xff cast to // 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); @@ -239,9 +239,31 @@ 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 #endif -#endif // OPENSSL_HEADER_ASN1_ASN1_LOCL_H +#endif // OPENSSL_HEADER_ASN1_INTERNAL_H diff --git a/third_party/boringssl/src/crypto/asn1/posix_time.c b/third_party/boringssl/src/crypto/asn1/posix_time.c index 81fbe8331891..31d184c08ee5 100644 --- a/third_party/boringssl/src/crypto/asn1/posix_time.c +++ b/third_party/boringssl/src/crypto/asn1/posix_time.c @@ -15,6 +15,8 @@ // Time conversion to/from POSIX time_t and struct tm, with no support // for time zones other than UTC +#include + #include #include #include @@ -191,9 +193,10 @@ int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) { tm->tm_hour, tm->tm_min, tm->tm_sec, &posix_time)) { return 0; } - if (!utc_from_posix_time(posix_time + off_day * SECS_PER_DAY + offset_sec, - &tm->tm_year, &tm->tm_mon, &tm->tm_mday, - &tm->tm_hour, &tm->tm_min, &tm->tm_sec)) { + if (!utc_from_posix_time( + posix_time + (int64_t)off_day * SECS_PER_DAY + offset_sec, + &tm->tm_year, &tm->tm_mon, &tm->tm_mday, &tm->tm_hour, &tm->tm_min, + &tm->tm_sec)) { return 0; } tm->tm_year -= 1900; diff --git a/third_party/boringssl/src/crypto/asn1/tasn_dec.c b/third_party/boringssl/src/crypto/asn1/tasn_dec.c index de8779171f24..24ab04f2704e 100644 --- a/third_party/boringssl/src/crypto/asn1/tasn_dec.c +++ b/third_party/boringssl/src/crypto/asn1/tasn_dec.c @@ -59,7 +59,9 @@ #include #include #include +#include +#include #include #include @@ -79,18 +81,18 @@ 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); -static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, + CRYPTO_BUFFER *buf, int depth); +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, 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] = { @@ -134,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' @@ -143,25 +162,40 @@ 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, -1, 0, 0, 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, - char opt, int depth) { + char opt, CRYPTO_BUFFER *buf, 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; @@ -169,12 +203,15 @@ 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; } + 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) { @@ -197,7 +234,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; @@ -238,10 +276,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 @@ -275,7 +318,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; @@ -377,11 +420,11 @@ static int asn1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, if (i == (it->tcount - 1)) { isopt = 0; } else { - isopt = (char)(seqtt->flags & ASN1_TFLG_OPTIONAL); + isopt = (seqtt->flags & ASN1_TFLG_OPTIONAL) != 0; } // 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; @@ -420,7 +463,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)) { @@ -436,9 +479,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 { @@ -449,8 +490,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,15 +500,15 @@ 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) { - int flags, aclass; + CRYPTO_BUFFER *buf, int depth) { + int aclass; int ret; long len; const unsigned char *p, *q; if (!val) { return 0; } - flags = tt->flags; + uint32_t flags = tt->flags; aclass = flags & ASN1_TFLG_TAG_CLASS; p = *in; @@ -490,7 +532,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 +545,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,14 +558,14 @@ 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) { - int flags, aclass; + CRYPTO_BUFFER *buf, int depth) { + int aclass; int ret; const unsigned char *p; if (!val) { return 0; } - flags = tt->flags; + uint32_t flags = tt->flags; aclass = flags & ASN1_TFLG_TAG_CLASS; p = *in; @@ -565,7 +607,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; } @@ -574,22 +615,21 @@ 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; } 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; } } } 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 +638,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), /*tag=*/-1, + /*aclass=*/0, opt, buf, depth); if (!ret) { OPENSSL_PUT_ERROR(ASN1, ASN1_R_NESTED_ASN1_ERROR); goto err; @@ -654,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; } } @@ -709,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; @@ -798,6 +838,12 @@ static int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, case V_ASN1_OTHER: case V_ASN1_SET: case V_ASN1_SEQUENCE: + // TODO(crbug.com/boringssl/412): This default case should be removed, now + // that we've resolved https://crbug.com/boringssl/561. However, it is still + // needed to support some edge cases in |ASN1_PRINTABLE|. |ASN1_PRINTABLE| + // broadly doesn't tolerate unrecognized universal tags, but except for + // eight values that map to |B_ASN1_UNKNOWN| instead of zero. See the + // X509Test.NameAttributeValues test. default: { CBS cbs; CBS_init(&cbs, cont, (size_t)len); @@ -847,7 +893,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; @@ -856,7 +901,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/third_party/boringssl/src/crypto/asn1/tasn_enc.c b/third_party/boringssl/src/crypto/asn1/tasn_enc.c index 39a3d52143c6..e85400b2c8c4 100644 --- a/third_party/boringssl/src/crypto/asn1/tasn_enc.c +++ b/third_party/boringssl/src/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 @@ -91,12 +92,12 @@ 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; int len2 = ASN1_item_ex_i2d(&val, &p, it, /*tag=*/-1, /*aclass=*/0); if (len2 <= 0) { + OPENSSL_free(buf); return len2; } assert(len == len2); @@ -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,13 +182,17 @@ 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: { - // 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 @@ -223,7 +230,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 +252,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,13 +268,13 @@ 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) { - int i, ret, flags, ttag, tclass; + const ASN1_TEMPLATE *tt, int tag, int iclass, + int optional) { + int i, ret, ttag, tclass; size_t j; - flags = tt->flags; + uint32_t flags = tt->flags; // Historically, |iclass| was repurposed to pass additional flags into the // encoding process. @@ -294,7 +303,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. @@ -447,7 +461,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; } @@ -631,7 +644,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; } @@ -678,12 +691,19 @@ 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: + // This is not a valid |ASN1_ITEM| type, but it appears in |ASN1_TYPE|. + case V_ASN1_OTHER: + // TODO(crbug.com/boringssl/412): This default case should be removed, now + // that we've resolved https://crbug.com/boringssl/561. However, it is still + // needed to support some edge cases in |ASN1_PRINTABLE|. |ASN1_PRINTABLE| + // broadly doesn't tolerate unrecognized universal tags, but except for + // eight values that map to |B_ASN1_UNKNOWN| instead of zero. See the + // X509Test.NameAttributeValues test. default: // All based on ASN1_STRING and handled the same strtmp = (ASN1_STRING *)*pval; cont = strtmp->data; len = strtmp->length; - break; } if (cout && len) { diff --git a/third_party/boringssl/src/crypto/asn1/tasn_fre.c b/third_party/boringssl/src/crypto/asn1/tasn_fre.c index 3da1fa643312..add46f53240e 100644 --- a/third_party/boringssl/src/crypto/asn1/tasn_fre.c +++ b/third_party/boringssl/src/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,57 +153,33 @@ 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; } } } 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); - asn1_item_combine_free(&vtmp, ASN1_ITEM_ptr(tt->item), 0); + 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); *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)); } } 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); @@ -218,9 +187,9 @@ void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { case V_ASN1_BOOLEAN: if (it) { - *(ASN1_BOOLEAN *)pval = it->size; + *(ASN1_BOOLEAN *)pval = (ASN1_BOOLEAN)it->size; } else { - *(ASN1_BOOLEAN *)pval = -1; + *(ASN1_BOOLEAN *)pval = ASN1_BOOLEAN_NONE; } return; @@ -228,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: diff --git a/third_party/boringssl/src/crypto/asn1/tasn_new.c b/third_party/boringssl/src/crypto/asn1/tasn_new.c index 97411c53f0a8..8a90b436d123 100644 --- a/third_party/boringssl/src/crypto/asn1/tasn_new.c +++ b/third_party/boringssl/src/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,12 @@ 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; @@ -246,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; } @@ -255,7 +242,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; } @@ -273,9 +260,6 @@ static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { // all the old functions. static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { - ASN1_TYPE *typ; - int utype; - if (!it) { return 0; } @@ -284,6 +268,7 @@ static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { // |ASN1_PRIMITIVE_FUNCS| table of calbacks. assert(it->funcs == NULL); + int utype; if (it->itype == ASN1_ITYPE_MSTRING) { utype = -1; } else { @@ -295,15 +280,15 @@ static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { return 1; case V_ASN1_BOOLEAN: - *(ASN1_BOOLEAN *)pval = it->size; + *(ASN1_BOOLEAN *)pval = (ASN1_BOOLEAN)it->size; return 1; case V_ASN1_NULL: *pval = (ASN1_VALUE *)1; return 1; - case V_ASN1_ANY: - typ = OPENSSL_malloc(sizeof(ASN1_TYPE)); + case V_ASN1_ANY: { + ASN1_TYPE *typ = OPENSSL_malloc(sizeof(ASN1_TYPE)); if (!typ) { return 0; } @@ -311,6 +296,7 @@ static int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { typ->type = -1; *pval = (ASN1_VALUE *)typ; break; + } default: *pval = (ASN1_VALUE *)ASN1_STRING_type_new(utype); @@ -333,7 +319,7 @@ static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) { utype = it->utype; } if (utype == V_ASN1_BOOLEAN) { - *(ASN1_BOOLEAN *)pval = it->size; + *(ASN1_BOOLEAN *)pval = (ASN1_BOOLEAN)it->size; } else { *pval = NULL; } diff --git a/third_party/boringssl/src/crypto/asn1/tasn_typ.c b/third_party/boringssl/src/crypto/asn1/tasn_typ.c index abfac934d658..ebeda542e681 100644 --- a/third_party/boringssl/src/crypto/asn1/tasn_typ.c +++ b/third_party/boringssl/src/crypto/asn1/tasn_typ.c @@ -107,9 +107,9 @@ 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) -IMPLEMENT_ASN1_TYPE_ex(ASN1_TBOOLEAN, ASN1_BOOLEAN, 1) -IMPLEMENT_ASN1_TYPE_ex(ASN1_FBOOLEAN, ASN1_BOOLEAN, 0) +IMPLEMENT_ASN1_TYPE_ex(ASN1_BOOLEAN, ASN1_BOOLEAN, ASN1_BOOLEAN_NONE) +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) = ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, ASN1_SEQUENCE_ANY, ASN1_ANY) diff --git a/third_party/boringssl/src/crypto/asn1/tasn_utl.c b/third_party/boringssl/src/crypto/asn1/tasn_utl.c index 4a9757437aa9..488c206c4530 100644 --- a/third_party/boringssl/src/crypto/asn1/tasn_utl.c +++ b/third_party/boringssl/src/crypto/asn1/tasn_utl.c @@ -63,6 +63,7 @@ #include #include #include +#include #include #include "../internal.h" @@ -131,68 +132,62 @@ static ASN1_ENCODING *asn1_get_enc_ptr(ASN1_VALUE **pval, const ASN1_ITEM *it) { } void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it) { - ASN1_ENCODING *enc; - enc = asn1_get_enc_ptr(pval, it); + ASN1_ENCODING *enc = asn1_get_enc_ptr(pval, it); if (enc) { enc->enc = NULL; enc->len = 0; - enc->alias_only = 0; - enc->alias_only_on_next_parse = 0; - enc->modified = 1; + enc->buf = NULL; } } void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it) { - ASN1_ENCODING *enc; - enc = asn1_get_enc_ptr(pval, it); + ASN1_ENCODING *enc = asn1_get_enc_ptr(pval, it); if (enc) { - if (!enc->alias_only) { - OPENSSL_free(enc->enc); - } - enc->enc = NULL; - enc->len = 0; - enc->alias_only = 0; - enc->alias_only_on_next_parse = 0; - enc->modified = 1; + asn1_encoding_clear(enc); } } -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_malloc(inlen); + enc->enc = OPENSSL_memdup(in, in_len); if (!enc->enc) { return 0; } - OPENSSL_memcpy(enc->enc, in, inlen); } - enc->len = inlen; - enc->modified = 0; - + enc->len = in_len; return 1; } +void asn1_encoding_clear(ASN1_ENCODING *enc) { + if (enc->buf != NULL) { + CRYPTO_BUFFER_free(enc->buf); + } else { + OPENSSL_free(enc->enc); + } + enc->enc = NULL; + enc->len = 0; + enc->buf = NULL; +} + int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, const ASN1_ITEM *it) { - ASN1_ENCODING *enc; - enc = asn1_get_enc_ptr(pval, it); - if (!enc || enc->modified) { + ASN1_ENCODING *enc = asn1_get_enc_ptr(pval, it); + if (!enc || enc->len == 0) { return 0; } if (out) { @@ -207,11 +202,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/third_party/boringssl/src/crypto/bio/bio.c b/third_party/boringssl/src/crypto/bio/bio.c index 3d36e28d4373..ca5cbff36df5 100644 --- a/third_party/boringssl/src/crypto/bio/bio.c +++ b/third_party/boringssl/src/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; } @@ -192,11 +191,17 @@ int BIO_write_all(BIO *bio, const void *data, size_t len) { } int BIO_puts(BIO *bio, const char *in) { - return BIO_write(bio, in, strlen(in)); + size_t len = strlen(in); + if (len > INT_MAX) { + // |BIO_write| and the return value both assume the string fits in |int|. + OPENSSL_PUT_ERROR(BIO, ERR_R_OVERFLOW); + return -1; + } + return BIO_write(bio, in, (int)len); } int BIO_flush(BIO *bio) { - return BIO_ctrl(bio, BIO_CTRL_FLUSH, 0, NULL); + return (int)BIO_ctrl(bio, BIO_CTRL_FLUSH, 0, NULL); } long BIO_ctrl(BIO *bio, int cmd, long larg, void *parg) { @@ -229,11 +234,11 @@ long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) { } int BIO_reset(BIO *bio) { - return BIO_ctrl(bio, BIO_CTRL_RESET, 0, NULL); + return (int)BIO_ctrl(bio, BIO_CTRL_RESET, 0, NULL); } int BIO_eof(BIO *bio) { - return BIO_ctrl(bio, BIO_CTRL_EOF, 0, NULL); + return (int)BIO_ctrl(bio, BIO_CTRL_EOF, 0, NULL); } void BIO_set_flags(BIO *bio, int flags) { @@ -333,7 +338,7 @@ size_t BIO_wpending(const BIO *bio) { } int BIO_set_close(BIO *bio, int close_flag) { - return BIO_ctrl(bio, BIO_CTRL_SET_CLOSE, close_flag, NULL); + return (int)BIO_ctrl(bio, BIO_CTRL_SET_CLOSE, close_flag, NULL); } OPENSSL_EXPORT size_t BIO_number_read(const BIO *bio) { @@ -418,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) { @@ -457,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; @@ -603,7 +610,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/third_party/boringssl/src/crypto/bio/bio_mem.c b/third_party/boringssl/src/crypto/bio/bio_mem.c index f40a9a792eda..1ee148b074b0 100644 --- a/third_party/boringssl/src/crypto/bio/bio_mem.c +++ b/third_party/boringssl/src/crypto/bio/bio_mem.c @@ -66,7 +66,7 @@ #include "../internal.h" -BIO *BIO_new_mem_buf(const void *buf, int len) { +BIO *BIO_new_mem_buf(const void *buf, ossl_ssize_t len) { BIO *ret; BUF_MEM *b; const size_t size = len < 0 ? strlen((char *)buf) : (size_t)len; @@ -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) { @@ -312,13 +298,13 @@ long BIO_get_mem_data(BIO *bio, char **contents) { } int BIO_get_mem_ptr(BIO *bio, BUF_MEM **out) { - return BIO_ctrl(bio, BIO_C_GET_BUF_MEM_PTR, 0, (char *) out); + return (int)BIO_ctrl(bio, BIO_C_GET_BUF_MEM_PTR, 0, (char *) out); } int BIO_set_mem_buf(BIO *bio, BUF_MEM *b, int take_ownership) { - return BIO_ctrl(bio, BIO_C_SET_BUF_MEM, take_ownership, (char *) b); + return (int)BIO_ctrl(bio, BIO_C_SET_BUF_MEM, take_ownership, (char *) b); } int BIO_set_mem_eof_return(BIO *bio, int eof_value) { - return BIO_ctrl(bio, BIO_C_SET_BUF_MEM_EOF_RETURN, eof_value, NULL); + return (int)BIO_ctrl(bio, BIO_C_SET_BUF_MEM_EOF_RETURN, eof_value, NULL); } diff --git a/third_party/boringssl/src/crypto/bio/bio_test.cc b/third_party/boringssl/src/crypto/bio/bio_test.cc index 765e9629b5b9..6610be9a28d4 100644 --- a/third_party/boringssl/src/crypto/bio/bio_test.cc +++ b/third_party/boringssl/src/crypto/bio/bio_test.cc @@ -154,73 +154,329 @@ TEST(BIOTest, Printf) { } } -static const size_t kLargeASN1PayloadLen = 8000; - -struct ASN1TestParam { - bool should_succeed; - std::vector input; - // suffix_len is the number of zeros to append to |input|. - size_t suffix_len; - // expected_len, if |should_succeed| is true, is the expected length of the - // ASN.1 element. - size_t expected_len; - size_t max_len; -} kASN1TestParams[] = { - {true, {0x30, 2, 1, 2, 0, 0}, 0, 4, 100}, - {false /* truncated */, {0x30, 3, 1, 2}, 0, 0, 100}, - {false /* should be short len */, {0x30, 0x81, 1, 1}, 0, 0, 100}, - {false /* zero padded */, {0x30, 0x82, 0, 1, 1}, 0, 0, 100}, - - // Test a large payload. - {true, - {0x30, 0x82, kLargeASN1PayloadLen >> 8, kLargeASN1PayloadLen & 0xff}, - kLargeASN1PayloadLen, - 4 + kLargeASN1PayloadLen, - kLargeASN1PayloadLen * 2}, - {false /* max_len too short */, - {0x30, 0x82, kLargeASN1PayloadLen >> 8, kLargeASN1PayloadLen & 0xff}, - kLargeASN1PayloadLen, - 4 + kLargeASN1PayloadLen, - 3 + kLargeASN1PayloadLen}, - - // Test an indefinite-length input. - {true, - {0x30, 0x80}, - kLargeASN1PayloadLen + 2, - 2 + kLargeASN1PayloadLen + 2, - kLargeASN1PayloadLen * 2}, - {false /* max_len too short */, - {0x30, 0x80}, - kLargeASN1PayloadLen + 2, - 2 + kLargeASN1PayloadLen + 2, - 2 + kLargeASN1PayloadLen + 1}, -}; +TEST(BIOTest, ReadASN1) { + static const size_t kLargeASN1PayloadLen = 8000; + + struct ASN1Test { + bool should_succeed; + std::vector input; + // suffix_len is the number of zeros to append to |input|. + size_t suffix_len; + // expected_len, if |should_succeed| is true, is the expected length of the + // ASN.1 element. + size_t expected_len; + size_t max_len; + } kASN1Tests[] = { + {true, {0x30, 2, 1, 2, 0, 0}, 0, 4, 100}, + {false /* truncated */, {0x30, 3, 1, 2}, 0, 0, 100}, + {false /* should be short len */, {0x30, 0x81, 1, 1}, 0, 0, 100}, + {false /* zero padded */, {0x30, 0x82, 0, 1, 1}, 0, 0, 100}, + + // Test a large payload. + {true, + {0x30, 0x82, kLargeASN1PayloadLen >> 8, kLargeASN1PayloadLen & 0xff}, + kLargeASN1PayloadLen, + 4 + kLargeASN1PayloadLen, + kLargeASN1PayloadLen * 2}, + {false /* max_len too short */, + {0x30, 0x82, kLargeASN1PayloadLen >> 8, kLargeASN1PayloadLen & 0xff}, + kLargeASN1PayloadLen, + 4 + kLargeASN1PayloadLen, + 3 + kLargeASN1PayloadLen}, + + // Test an indefinite-length input. + {true, + {0x30, 0x80}, + kLargeASN1PayloadLen + 2, + 2 + kLargeASN1PayloadLen + 2, + kLargeASN1PayloadLen * 2}, + {false /* max_len too short */, + {0x30, 0x80}, + kLargeASN1PayloadLen + 2, + 2 + kLargeASN1PayloadLen + 2, + 2 + kLargeASN1PayloadLen + 1}, + }; + + for (const auto &t : kASN1Tests) { + std::vector input = t.input; + input.resize(input.size() + t.suffix_len, 0); + + bssl::UniquePtr bio(BIO_new_mem_buf(input.data(), input.size())); + ASSERT_TRUE(bio); + + uint8_t *out; + size_t out_len; + int ok = BIO_read_asn1(bio.get(), &out, &out_len, t.max_len); + if (!ok) { + out = nullptr; + } + bssl::UniquePtr out_storage(out); + + ASSERT_EQ(t.should_succeed, (ok == 1)); + if (t.should_succeed) { + EXPECT_EQ(Bytes(input.data(), t.expected_len), Bytes(out, out_len)); + } + } +} -class BIOASN1Test : public testing::TestWithParam {}; +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); -TEST_P(BIOASN1Test, ReadASN1) { - const ASN1TestParam& param = GetParam(); - std::vector input = param.input; - input.resize(input.size() + param.suffix_len, 0); + // 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); +} - bssl::UniquePtr bio(BIO_new_mem_buf(input.data(), input.size())); +TEST(BIOTest, MemWritable) { + // A memory BIO created from |BIO_new| is writable. + bssl::UniquePtr bio(BIO_new(BIO_s_mem())); ASSERT_TRUE(bio); - uint8_t *out; - size_t out_len; - int ok = BIO_read_asn1(bio.get(), &out, &out_len, param.max_len); - if (!ok) { - out = nullptr; - } - bssl::UniquePtr out_storage(out); + // 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); +} - ASSERT_EQ(param.should_succeed, (ok == 1)); - if (param.should_succeed) { - EXPECT_EQ(Bytes(input.data(), param.expected_len), Bytes(out, out_len)); +TEST(BIOTest, Gets) { + 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. + {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); + + 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()); + } + + using ScopedFILE = std::unique_ptr; + ScopedFILE file(tmpfile(), fclose); +#if defined(OPENSSL_ANDROID) + // On Android, when running from an APK, |tmpfile| does not work. See + // b/36991167#comment8. + if (!file) { + fprintf(stderr, "tmpfile failed: %s (%d). Skipping file-based tests.\n", + strerror(errno), errno); + continue; + } +#else + ASSERT_TRUE(file); +#endif + + 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)); + } + + // 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()); + } } -} -INSTANTIATE_TEST_SUITE_P(All, BIOASN1Test, testing::ValuesIn(kASN1TestParams)); + // 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 {}; diff --git a/third_party/boringssl/src/crypto/bio/connect.c b/third_party/boringssl/src/crypto/bio/connect.c index 9b86e5138ace..c19f1c4e6506 100644 --- a/third_party/boringssl/src/crypto/bio/connect.c +++ b/third_party/boringssl/src/crypto/bio/connect.c @@ -363,7 +363,7 @@ static int conn_read(BIO *bio, char *out, int out_len) { } bio_clear_socket_error(); - ret = recv(bio->num, out, out_len, 0); + ret = (int)recv(bio->num, out, out_len, 0); BIO_clear_retry_flags(bio); if (ret <= 0) { if (bio_fd_should_retry(ret)) { @@ -387,7 +387,7 @@ static int conn_write(BIO *bio, const char *in, int in_len) { } bio_clear_socket_error(); - ret = send(bio->num, in, in_len, 0); + ret = (int)send(bio->num, in, in_len, 0); BIO_clear_retry_flags(bio); if (ret <= 0) { if (bio_fd_should_retry(ret)) { @@ -523,11 +523,11 @@ static const BIO_METHOD methods_connectp = { const BIO_METHOD *BIO_s_connect(void) { return &methods_connectp; } int BIO_set_conn_hostname(BIO *bio, const char *name) { - return BIO_ctrl(bio, BIO_C_SET_CONNECT, 0, (void*) name); + return (int)BIO_ctrl(bio, BIO_C_SET_CONNECT, 0, (void*) name); } int BIO_set_conn_port(BIO *bio, const char *port_str) { - return BIO_ctrl(bio, BIO_C_SET_CONNECT, 1, (void*) port_str); + return (int)BIO_ctrl(bio, BIO_C_SET_CONNECT, 1, (void*) port_str); } int BIO_set_conn_int_port(BIO *bio, const int *port) { @@ -537,11 +537,11 @@ int BIO_set_conn_int_port(BIO *bio, const int *port) { } int BIO_set_nbio(BIO *bio, int on) { - return BIO_ctrl(bio, BIO_C_SET_NBIO, on, NULL); + return (int)BIO_ctrl(bio, BIO_C_SET_NBIO, on, NULL); } int BIO_do_connect(BIO *bio) { - return BIO_ctrl(bio, BIO_C_DO_STATE_MACHINE, 0, NULL); + return (int)BIO_ctrl(bio, BIO_C_DO_STATE_MACHINE, 0, NULL); } #endif // OPENSSL_TRUSTY diff --git a/third_party/boringssl/src/crypto/bio/fd.c b/third_party/boringssl/src/crypto/bio/fd.c index 349ee9dd0943..7775d7a75a15 100644 --- a/third_party/boringssl/src/crypto/bio/fd.c +++ b/third_party/boringssl/src/crypto/bio/fd.c @@ -158,7 +158,7 @@ static int fd_free(BIO *bio) { static int fd_read(BIO *b, char *out, int outl) { int ret = 0; - ret = BORINGSSL_READ(b->num, out, outl); + ret = (int)BORINGSSL_READ(b->num, out, outl); BIO_clear_retry_flags(b); if (ret <= 0) { if (bio_fd_should_retry(ret)) { @@ -170,7 +170,7 @@ static int fd_read(BIO *b, char *out, int outl) { } static int fd_write(BIO *b, const char *in, int inl) { - int ret = BORINGSSL_WRITE(b->num, in, inl); + int ret = (int)BORINGSSL_WRITE(b->num, in, inl); BIO_clear_retry_flags(b); if (ret <= 0) { if (bio_fd_should_retry(ret)) { @@ -241,20 +241,24 @@ 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'; - return ptr - buf; + // The output length is bounded by |size|. + return (int)(ptr - buf); } static const BIO_METHOD methods_fdp = { @@ -265,11 +269,11 @@ static const BIO_METHOD methods_fdp = { const BIO_METHOD *BIO_s_fd(void) { return &methods_fdp; } int BIO_set_fd(BIO *bio, int fd, int close_flag) { - return BIO_int_ctrl(bio, BIO_C_SET_FD, close_flag, fd); + return (int)BIO_int_ctrl(bio, BIO_C_SET_FD, close_flag, fd); } int BIO_get_fd(BIO *bio, int *out_fd) { - return BIO_ctrl(bio, BIO_C_GET_FD, 0, (char *) out_fd); + return (int)BIO_ctrl(bio, BIO_C_GET_FD, 0, (char *) out_fd); } #endif // OPENSSL_TRUSTY diff --git a/third_party/boringssl/src/crypto/bio/file.c b/third_party/boringssl/src/crypto/bio/file.c index 823ae7c78f99..a9614e098f42 100644 --- a/third_party/boringssl/src/crypto/bio/file.c +++ b/third_party/boringssl/src/crypto/bio/file.c @@ -654,31 +654,32 @@ static int MS_CALLBACK file_puts(BIO *bp, const char *str) { #ifdef NATIVE_TARGET_BUILD // These definitions were restored from revision 5470252 of this file. int BIO_get_fp(BIO *bio, FILE **out_file) { - return BIO_ctrl(bio, BIO_C_GET_FILE_PTR, 0, (char*) out_file); + return (int)BIO_ctrl(bio, BIO_C_GET_FILE_PTR, 0, (char *)out_file); } int BIO_set_fp(BIO *bio, FILE *file, int close_flag) { - return BIO_ctrl(bio, BIO_C_SET_FILE_PTR, close_flag, (char *) file); + return (int)BIO_ctrl(bio, BIO_C_SET_FILE_PTR, close_flag, (char *)file); } int BIO_read_filename(BIO *bio, const char *filename) { - return BIO_ctrl(bio, BIO_C_SET_FILENAME, BIO_CLOSE | BIO_FP_READ, - (char *)filename); + return (int)BIO_ctrl(bio, BIO_C_SET_FILENAME, BIO_CLOSE | BIO_FP_READ, + (char *)filename); } int BIO_write_filename(BIO *bio, const char *filename) { - return BIO_ctrl(bio, BIO_C_SET_FILENAME, BIO_CLOSE | BIO_FP_WRITE, - (char *)filename); + return (int)BIO_ctrl(bio, BIO_C_SET_FILENAME, BIO_CLOSE | BIO_FP_WRITE, + (char *)filename); } int BIO_append_filename(BIO *bio, const char *filename) { - return BIO_ctrl(bio, BIO_C_SET_FILENAME, BIO_CLOSE | BIO_FP_APPEND, - (char *)filename); + return (int)BIO_ctrl(bio, BIO_C_SET_FILENAME, BIO_CLOSE | BIO_FP_APPEND, + (char *)filename); } int BIO_rw_filename(BIO *bio, const char *filename) { - return BIO_ctrl(bio, BIO_C_SET_FILENAME, - BIO_CLOSE | BIO_FP_READ | BIO_FP_WRITE, (char *)filename); + return (int)BIO_ctrl(bio, BIO_C_SET_FILENAME, + BIO_CLOSE | BIO_FP_READ | BIO_FP_WRITE, + (char *)filename); } long BIO_tell(BIO *bio) { return BIO_ctrl(bio, BIO_C_FILE_TELL, 0, NULL); } diff --git a/third_party/boringssl/src/crypto/bio/pair.c b/third_party/boringssl/src/crypto/bio/pair.c index a1a9c9c92ab8..40711cdf9571 100644 --- a/third_party/boringssl/src/crypto/bio/pair.c +++ b/third_party/boringssl/src/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, @@ -317,7 +319,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 +331,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; @@ -479,5 +479,5 @@ size_t BIO_ctrl_get_write_guarantee(BIO *bio) { } int BIO_shutdown_wr(BIO *bio) { - return BIO_ctrl(bio, BIO_C_SHUTDOWN_WR, 0, NULL); + return (int)BIO_ctrl(bio, BIO_C_SHUTDOWN_WR, 0, NULL); } diff --git a/third_party/boringssl/src/crypto/bio/printf.c b/third_party/boringssl/src/crypto/bio/printf.c index 253546b7cf14..102256bccb34 100644 --- a/third_party/boringssl/src/crypto/bio/printf.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/bio/socket.c b/third_party/boringssl/src/crypto/bio/socket.c index 679959eb8d6d..c5bf60941b53 100644 --- a/third_party/boringssl/src/crypto/bio/socket.c +++ b/third_party/boringssl/src/crypto/bio/socket.c @@ -1,4 +1,3 @@ -/* crypto/bio/bss_sock.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -101,7 +100,7 @@ static int sock_read(BIO *b, char *out, int outl) { #if defined(OPENSSL_WINDOWS) int ret = recv(b->num, out, outl, 0); #else - int ret = read(b->num, out, outl); + int ret = (int)read(b->num, out, outl); #endif BIO_clear_retry_flags(b); if (ret <= 0) { @@ -113,13 +112,11 @@ static int sock_read(BIO *b, char *out, int outl) { } static int sock_write(BIO *b, const char *in, int inl) { - int ret; - bio_clear_socket_error(); #if defined(OPENSSL_WINDOWS) - ret = send(b->num, in, inl, 0); + int ret = send(b->num, in, inl, 0); #else - ret = write(b->num, in, inl); + int ret = (int)write(b->num, in, inl); #endif BIO_clear_retry_flags(b); if (ret <= 0) { diff --git a/third_party/boringssl/src/crypto/blake2/blake2.c b/third_party/boringssl/src/crypto/blake2/blake2.c index 5c6b17edfee8..848ed4fa2154 100644 --- a/third_party/boringssl/src/crypto/blake2/blake2.c +++ b/third_party/boringssl/src/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; diff --git a/third_party/boringssl/src/crypto/bn_extra/convert.c b/third_party/boringssl/src/crypto/bn_extra/convert.c index 6e930fc69f79..29234effd239 100644 --- a/third_party/boringssl/src/crypto/bn_extra/convert.c +++ b/third_party/boringssl/src/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; } @@ -133,18 +132,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 +230,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) { @@ -250,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); @@ -272,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; } @@ -282,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. @@ -301,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); @@ -310,7 +298,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) { @@ -436,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/third_party/boringssl/src/crypto/buf/buf.c b/third_party/boringssl/src/crypto/buf/buf.c index bd97dd347cb3..57bf34d4b07d 100644 --- a/third_party/boringssl/src/crypto/buf/buf.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/bytestring/asn1_compat.c b/third_party/boringssl/src/crypto/bytestring/asn1_compat.c index 50df9cce0d74..a565c44b3740 100644 --- a/third_party/boringssl/src/crypto/bytestring/asn1_compat.c +++ b/third_party/boringssl/src/crypto/bytestring/asn1_compat.c @@ -26,7 +26,8 @@ int CBB_finish_i2d(CBB *cbb, uint8_t **outp) { - assert(cbb->base->can_resize); + assert(!cbb->is_child); + assert(cbb->u.base.can_resize); uint8_t *der; size_t der_len; diff --git a/third_party/boringssl/src/crypto/bytestring/ber.c b/third_party/boringssl/src/crypto/bytestring/ber.c index dc707b93fe4e..5d43d0b7f1a2 100644 --- a/third_party/boringssl/src/crypto/bytestring/ber.c +++ b/third_party/boringssl/src/crypto/bytestring/ber.c @@ -24,11 +24,11 @@ // kMaxDepth is a just a sanity limit. The code should be such that the length // of the input being processes always decreases. None the less, a very large // input could otherwise cause the stack to overflow. -static const unsigned kMaxDepth = 2048; +static const uint32_t kMaxDepth = 2048; // is_string_type returns one if |tag| is a string type and zero otherwise. It // ignores the constructed bit. -static int is_string_type(unsigned tag) { +static int is_string_type(CBS_ASN1_TAG tag) { // While BER supports constructed BIT STRINGS, OpenSSL misparses them. To // avoid acting on an ambiguous input, we do not support constructed BIT // STRINGS. See https://github.com/openssl/openssl/issues/12810. @@ -55,7 +55,7 @@ static int is_string_type(unsigned tag) { // depending on whether an indefinite length element or constructed string was // found. The value of |orig_in| is not changed. It returns one on success (i.e. // |*ber_found| was set) and zero on error. -static int cbs_find_ber(const CBS *orig_in, int *ber_found, unsigned depth) { +static int cbs_find_ber(const CBS *orig_in, int *ber_found, uint32_t depth) { CBS in; if (depth > kMaxDepth) { @@ -67,7 +67,7 @@ static int cbs_find_ber(const CBS *orig_in, int *ber_found, unsigned depth) { while (CBS_len(&in) > 0) { CBS contents; - unsigned tag; + CBS_ASN1_TAG tag; size_t header_len; int indefinite; if (!CBS_get_any_ber_asn1_element(&in, &contents, &tag, &header_len, @@ -110,8 +110,8 @@ static int cbs_get_eoc(CBS *cbs) { // constructed string. If |looking_for_eoc| is set then any EOC elements found // will cause the function to return after consuming it. It returns one on // success and zero on error. -static int cbs_convert_ber(CBS *in, CBB *out, unsigned string_tag, - char looking_for_eoc, unsigned depth) { +static int cbs_convert_ber(CBS *in, CBB *out, CBS_ASN1_TAG string_tag, + int looking_for_eoc, uint32_t depth) { assert(!(string_tag & CBS_ASN1_CONSTRUCTED)); if (depth > kMaxDepth) { @@ -124,7 +124,7 @@ static int cbs_convert_ber(CBS *in, CBB *out, unsigned string_tag, } CBS contents; - unsigned tag, child_string_tag = string_tag; + CBS_ASN1_TAG tag, child_string_tag = string_tag; size_t header_len; int indefinite; CBB *out_contents, out_contents_storage; @@ -142,7 +142,7 @@ static int cbs_convert_ber(CBS *in, CBB *out, unsigned string_tag, } out_contents = out; } else { - unsigned out_tag = tag; + CBS_ASN1_TAG out_tag = tag; if ((tag & CBS_ASN1_CONSTRUCTED) && is_string_type(tag)) { // If a constructed string, clear the constructed bit and inform // children to concatenate bodies. @@ -221,7 +221,8 @@ int CBS_asn1_ber_to_der(CBS *in, CBS *out, uint8_t **out_storage) { } int CBS_get_asn1_implicit_string(CBS *in, CBS *out, uint8_t **out_storage, - unsigned outer_tag, unsigned inner_tag) { + CBS_ASN1_TAG outer_tag, + CBS_ASN1_TAG inner_tag) { assert(!(outer_tag & CBS_ASN1_CONSTRUCTED)); assert(!(inner_tag & CBS_ASN1_CONSTRUCTED)); assert(is_string_type(inner_tag)); diff --git a/third_party/boringssl/src/crypto/bytestring/bytestring_test.cc b/third_party/boringssl/src/crypto/bytestring/bytestring_test.cc index 27aae79eeaaa..10d34697a826 100644 --- a/third_party/boringssl/src/crypto/bytestring/bytestring_test.cc +++ b/third_party/boringssl/src/crypto/bytestring/bytestring_test.cc @@ -249,7 +249,7 @@ TEST(CBSTest, GetASN1) { EXPECT_FALSE(CBS_get_optional_asn1_uint64( &data, &value, CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 1, 42)); - unsigned tag; + CBS_ASN1_TAG tag; CBS_init(&data, kData1, sizeof(kData1)); ASSERT_TRUE(CBS_get_any_asn1(&data, &contents, &tag)); EXPECT_EQ(CBS_ASN1_SEQUENCE, tag); @@ -267,7 +267,7 @@ TEST(CBSTest, GetASN1) { TEST(CBSTest, ParseASN1Tag) { const struct { bool ok; - unsigned tag; + CBS_ASN1_TAG tag; std::vector in; } kTests[] = { {true, CBS_ASN1_SEQUENCE, {0x30, 0}}, @@ -278,9 +278,9 @@ TEST(CBSTest, ParseASN1Tag) { {true, CBS_ASN1_PRIVATE | CBS_ASN1_CONSTRUCTED | 0x1fffffff, {0xff, 0x81, 0xff, 0xff, 0xff, 0x7f, 0}}, - // Tag number fits in unsigned but not |CBS_ASN1_TAG_NUMBER_MASK|. + // Tag number fits in |uint32_t| but not |CBS_ASN1_TAG_NUMBER_MASK|. {false, 0, {0xff, 0x82, 0xff, 0xff, 0xff, 0x7f, 0}}, - // Tag number does not fit in unsigned. + // Tag number does not fit in |uint32_t|. {false, 0, {0xff, 0x90, 0x80, 0x80, 0x80, 0, 0}}, // Tag number is not minimally-encoded {false, 0, {0x5f, 0x80, 0x1f, 0}}, @@ -289,7 +289,7 @@ TEST(CBSTest, ParseASN1Tag) { }; for (const auto &t : kTests) { SCOPED_TRACE(Bytes(t.in)); - unsigned tag; + CBS_ASN1_TAG tag; CBS cbs, child; CBS_init(&cbs, t.in.data(), t.in.size()); ASSERT_EQ(t.ok, !!CBS_get_any_asn1(&cbs, &child, &tag)); @@ -376,28 +376,36 @@ TEST(CBBTest, Basic) { } TEST(CBBTest, Fixed) { - bssl::ScopedCBB cbb; + CBB cbb; uint8_t buf[1]; uint8_t *out_buf; size_t out_size; - ASSERT_TRUE(CBB_init_fixed(cbb.get(), NULL, 0)); - ASSERT_TRUE(CBB_finish(cbb.get(), &out_buf, &out_size)); + ASSERT_TRUE(CBB_init_fixed(&cbb, NULL, 0)); + ASSERT_TRUE(CBB_finish(&cbb, &out_buf, &out_size)); EXPECT_EQ(NULL, out_buf); EXPECT_EQ(0u, out_size); - cbb.Reset(); - ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, 1)); - ASSERT_TRUE(CBB_add_u8(cbb.get(), 1)); - ASSERT_TRUE(CBB_finish(cbb.get(), &out_buf, &out_size)); + ASSERT_TRUE(CBB_init_fixed(&cbb, buf, 1)); + ASSERT_TRUE(CBB_add_u8(&cbb, 1)); + ASSERT_TRUE(CBB_finish(&cbb, &out_buf, &out_size)); EXPECT_EQ(buf, out_buf); EXPECT_EQ(1u, out_size); EXPECT_EQ(1u, buf[0]); - cbb.Reset(); - ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, 1)); - ASSERT_TRUE(CBB_add_u8(cbb.get(), 1)); - EXPECT_FALSE(CBB_add_u8(cbb.get(), 2)); + ASSERT_TRUE(CBB_init_fixed(&cbb, buf, 1)); + ASSERT_TRUE(CBB_add_u8(&cbb, 1)); + EXPECT_FALSE(CBB_add_u8(&cbb, 2)); + // We do not need |CBB_cleanup| or |bssl::ScopedCBB| here because a fixed + // |CBB| has no allocations. Leak-checking tools will confirm there was + // nothing to clean up. + + // However, it should be harmless to call |CBB_cleanup|. + CBB cbb2; + ASSERT_TRUE(CBB_init_fixed(&cbb2, buf, 1)); + ASSERT_TRUE(CBB_add_u8(&cbb2, 1)); + EXPECT_FALSE(CBB_add_u8(&cbb2, 2)); + CBB_cleanup(&cbb2); } // Test that calling CBB_finish on a child does nothing. @@ -694,7 +702,7 @@ struct BERTest { bool ok; bool ber_found; bool indefinite; - unsigned tag; + CBS_ASN1_TAG tag; }; static const BERTest kBERTests[] = { @@ -740,7 +748,7 @@ TEST(CBSTest, BERElementTest) { ASSERT_TRUE(DecodeHex(&in_bytes, test.in_hex)); CBS in(in_bytes); CBS out; - unsigned tag; + CBS_ASN1_TAG tag; size_t header_len; int ber_found; int indefinite; @@ -1191,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) { @@ -1220,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) { @@ -1230,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)); } } @@ -1649,3 +1667,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/third_party/boringssl/src/crypto/bytestring/cbb.c b/third_party/boringssl/src/crypto/bytestring/cbb.c index 100c7139c74b..5280dc8f9c54 100644 --- a/third_party/boringssl/src/crypto/bytestring/cbb.c +++ b/third_party/boringssl/src/crypto/bytestring/cbb.c @@ -19,6 +19,7 @@ #include #include +#include #include "../internal.h" @@ -27,24 +28,14 @@ void CBB_zero(CBB *cbb) { OPENSSL_memset(cbb, 0, sizeof(CBB)); } -static int cbb_init(CBB *cbb, uint8_t *buf, size_t cap) { - // This assumes that |cbb| has already been zeroed. - struct cbb_buffer_st *base; - - base = OPENSSL_malloc(sizeof(struct cbb_buffer_st)); - if (base == NULL) { - return 0; - } - - base->buf = buf; - base->len = 0; - base->cap = cap; - base->can_resize = 1; - base->error = 0; - - cbb->base = base; +static void cbb_init(CBB *cbb, uint8_t *buf, size_t cap, int can_resize) { cbb->is_child = 0; - return 1; + cbb->child = NULL; + cbb->u.base.buf = buf; + cbb->u.base.len = 0; + cbb->u.base.cap = cap; + cbb->u.base.can_resize = can_resize; + cbb->u.base.error = 0; } int CBB_init(CBB *cbb, size_t initial_capacity) { @@ -55,22 +46,13 @@ int CBB_init(CBB *cbb, size_t initial_capacity) { return 0; } - if (!cbb_init(cbb, buf, initial_capacity)) { - OPENSSL_free(buf); - return 0; - } - + cbb_init(cbb, buf, initial_capacity, /*can_resize=*/1); return 1; } int CBB_init_fixed(CBB *cbb, uint8_t *buf, size_t len) { CBB_zero(cbb); - - if (!cbb_init(cbb, buf, len)) { - return 0; - } - - cbb->base->can_resize = 0; + cbb_init(cbb, buf, len, /*can_resize=*/0); return 1; } @@ -82,41 +64,35 @@ void CBB_cleanup(CBB *cbb) { return; } - if (cbb->base) { - if (cbb->base->can_resize) { - OPENSSL_free(cbb->base->buf); - } - OPENSSL_free(cbb->base); + if (cbb->u.base.can_resize) { + OPENSSL_free(cbb->u.base.buf); } - cbb->base = NULL; } static int cbb_buffer_reserve(struct cbb_buffer_st *base, uint8_t **out, size_t len) { - size_t newlen; - if (base == NULL) { return 0; } - newlen = base->len + len; + size_t newlen = base->len + len; if (newlen < base->len) { // Overflow + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); goto err; } if (newlen > base->cap) { - size_t newcap = base->cap * 2; - uint8_t *newbuf; - if (!base->can_resize) { + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); goto err; } + size_t newcap = base->cap * 2; if (newcap < base->cap || newcap < newlen) { newcap = newlen; } - newbuf = OPENSSL_realloc(base->buf, newcap); + uint8_t *newbuf = OPENSSL_realloc(base->buf, newcap); if (newbuf == NULL) { goto err; } @@ -146,32 +122,9 @@ static int cbb_buffer_add(struct cbb_buffer_st *base, uint8_t **out, return 1; } -static int cbb_buffer_add_u(struct cbb_buffer_st *base, uint64_t v, - size_t len_len) { - if (len_len == 0) { - return 1; - } - - uint8_t *buf; - if (!cbb_buffer_add(base, &buf, len_len)) { - return 0; - } - - for (size_t i = len_len - 1; i < len_len; i--) { - buf[i] = v; - v >>= 8; - } - - if (v != 0) { - base->error = 1; - return 0; - } - - return 1; -} - 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; } @@ -179,59 +132,70 @@ int CBB_finish(CBB *cbb, uint8_t **out_data, size_t *out_len) { return 0; } - if (cbb->base->can_resize && (out_data == NULL || out_len == NULL)) { + if (cbb->u.base.can_resize && (out_data == NULL || out_len == NULL)) { // |out_data| and |out_len| can only be NULL if the CBB is fixed. return 0; } if (out_data != NULL) { - *out_data = cbb->base->buf; + *out_data = cbb->u.base.buf; } if (out_len != NULL) { - *out_len = cbb->base->len; + *out_len = cbb->u.base.len; } - cbb->base->buf = NULL; + cbb->u.base.buf = NULL; CBB_cleanup(cbb); return 1; } +static struct cbb_buffer_st *cbb_get_base(CBB *cbb) { + if (cbb->is_child) { + return cbb->u.child.base; + } + return &cbb->u.base; +} + // CBB_flush recurses and then writes out any pending length prefix. The // current length of the underlying base is taken to be the length of the // length-prefixed data. int CBB_flush(CBB *cbb) { - size_t child_start, i, len; - - // If |cbb->base| has hit an error, the buffer is in an undefined state, so + // If |base| has hit an error, the buffer is in an undefined state, so // fail all following calls. In particular, |cbb->child| may point to invalid // memory. - if (cbb->base == NULL || cbb->base->error) { + struct cbb_buffer_st *base = cbb_get_base(cbb); + if (base == NULL || base->error) { return 0; } - if (cbb->child == NULL || cbb->child->pending_len_len == 0) { + if (cbb->child == NULL) { + // Nothing to flush. return 1; } - child_start = cbb->child->offset + cbb->child->pending_len_len; + assert(cbb->child->is_child); + struct cbb_child_st *child = &cbb->child->u.child; + assert(child->base == base); + size_t child_start = child->offset + child->pending_len_len; if (!CBB_flush(cbb->child) || - child_start < cbb->child->offset || - cbb->base->len < child_start) { + child_start < child->offset || + base->len < child_start) { goto err; } - len = cbb->base->len - child_start; + size_t len = base->len - child_start; - if (cbb->child->pending_is_asn1) { + if (child->pending_is_asn1) { // For ASN.1 we assume that we'll only need a single byte for the length. // If that turned out to be incorrect, we have to move the contents along // in order to make space. uint8_t len_len; uint8_t initial_length_byte; - assert (cbb->child->pending_len_len == 1); + assert (child->pending_len_len == 1); if (len > 0xfffffffe) { + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); // Too large. goto err; } else if (len > 0xffffff) { @@ -255,70 +219,86 @@ int CBB_flush(CBB *cbb) { if (len_len != 1) { // We need to move the contents along in order to make space. size_t extra_bytes = len_len - 1; - if (!cbb_buffer_add(cbb->base, NULL, extra_bytes)) { + if (!cbb_buffer_add(base, NULL, extra_bytes)) { goto err; } - OPENSSL_memmove(cbb->base->buf + child_start + extra_bytes, - cbb->base->buf + child_start, len); + OPENSSL_memmove(base->buf + child_start + extra_bytes, + base->buf + child_start, len); } - cbb->base->buf[cbb->child->offset++] = initial_length_byte; - cbb->child->pending_len_len = len_len - 1; + base->buf[child->offset++] = initial_length_byte; + child->pending_len_len = len_len - 1; } - for (i = cbb->child->pending_len_len - 1; i < cbb->child->pending_len_len; - i--) { - cbb->base->buf[cbb->child->offset + i] = (uint8_t)len; + for (size_t i = child->pending_len_len - 1; i < child->pending_len_len; i--) { + base->buf[child->offset + i] = (uint8_t)len; len >>= 8; } if (len != 0) { + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); goto err; } - cbb->child->base = NULL; + child->base = NULL; cbb->child = NULL; return 1; err: - cbb->base->error = 1; + base->error = 1; return 0; } const uint8_t *CBB_data(const CBB *cbb) { assert(cbb->child == NULL); - return cbb->base->buf + cbb->offset + cbb->pending_len_len; + if (cbb->is_child) { + return cbb->u.child.base->buf + cbb->u.child.offset + + cbb->u.child.pending_len_len; + } + return cbb->u.base.buf; } size_t CBB_len(const CBB *cbb) { assert(cbb->child == NULL); - assert(cbb->offset + cbb->pending_len_len <= cbb->base->len); - - return cbb->base->len - cbb->offset - cbb->pending_len_len; + if (cbb->is_child) { + assert(cbb->u.child.offset + cbb->u.child.pending_len_len <= + cbb->u.child.base->len); + return cbb->u.child.base->len - cbb->u.child.offset - + cbb->u.child.pending_len_len; + } + return cbb->u.base.len; } -static int cbb_add_length_prefixed(CBB *cbb, CBB *out_contents, - uint8_t len_len) { - uint8_t *prefix_bytes; +static int cbb_add_child(CBB *cbb, CBB *out_child, uint8_t len_len, + int is_asn1) { + assert(cbb->child == NULL); + assert(!is_asn1 || len_len == 1); + struct cbb_buffer_st *base = cbb_get_base(cbb); + size_t offset = base->len; - if (!CBB_flush(cbb)) { + // Reserve space for the length prefix. + uint8_t *prefix_bytes; + if (!cbb_buffer_add(base, &prefix_bytes, len_len)) { return 0; } + OPENSSL_memset(prefix_bytes, 0, len_len); - size_t offset = cbb->base->len; - if (!cbb_buffer_add(cbb->base, &prefix_bytes, len_len)) { + CBB_zero(out_child); + out_child->is_child = 1; + out_child->u.child.base = base; + out_child->u.child.offset = offset; + out_child->u.child.pending_len_len = len_len; + out_child->u.child.pending_is_asn1 = is_asn1; + cbb->child = out_child; + return 1; +} + +static int cbb_add_length_prefixed(CBB *cbb, CBB *out_contents, + uint8_t len_len) { + if (!CBB_flush(cbb)) { return 0; } - OPENSSL_memset(prefix_bytes, 0, len_len); - OPENSSL_memset(out_contents, 0, sizeof(CBB)); - out_contents->base = cbb->base; - out_contents->is_child = 1; - cbb->child = out_contents; - cbb->child->offset = offset; - cbb->child->pending_len_len = len_len; - cbb->child->pending_is_asn1 = 0; - - return 1; + return cbb_add_child(cbb, out_contents, len_len, /*is_asn1=*/0); } int CBB_add_u8_length_prefixed(CBB *cbb, CBB *out_contents) { @@ -359,14 +339,14 @@ static int add_base128_integer(CBB *cbb, uint64_t v) { return 1; } -int CBB_add_asn1(CBB *cbb, CBB *out_contents, unsigned tag) { +int CBB_add_asn1(CBB *cbb, CBB *out_contents, CBS_ASN1_TAG tag) { if (!CBB_flush(cbb)) { return 0; } // Split the tag into leading bits and tag number. uint8_t tag_bits = (tag >> CBS_ASN1_TAG_SHIFT) & 0xe0; - unsigned tag_number = tag & CBS_ASN1_TAG_NUMBER_MASK; + CBS_ASN1_TAG tag_number = tag & CBS_ASN1_TAG_NUMBER_MASK; if (tag_number >= 0x1f) { // Set all the bits in the tag number to signal high tag number form. if (!CBB_add_u8(cbb, tag_bits | 0x1f) || @@ -377,30 +357,16 @@ int CBB_add_asn1(CBB *cbb, CBB *out_contents, unsigned tag) { return 0; } - size_t offset = cbb->base->len; - if (!CBB_add_u8(cbb, 0)) { - return 0; - } - - OPENSSL_memset(out_contents, 0, sizeof(CBB)); - out_contents->base = cbb->base; - out_contents->is_child = 1; - cbb->child = out_contents; - cbb->child->offset = offset; - cbb->child->pending_len_len = 1; - cbb->child->pending_is_asn1 = 1; - - return 1; + // Reserve one byte of length prefix. |CBB_flush| will finish it later. + return cbb_add_child(cbb, out_contents, /*len_len=*/1, /*is_asn1=*/1); } int CBB_add_bytes(CBB *cbb, const uint8_t *data, size_t len) { - uint8_t *dest; - - if (!CBB_flush(cbb) || - !cbb_buffer_add(cbb->base, &dest, len)) { + uint8_t *out; + if (!CBB_add_space(cbb, &out, len)) { return 0; } - OPENSSL_memcpy(dest, data, len); + OPENSSL_memcpy(out, data, len); return 1; } @@ -415,7 +381,7 @@ int CBB_add_zeros(CBB *cbb, size_t len) { int CBB_add_space(CBB *cbb, uint8_t **out_data, size_t len) { if (!CBB_flush(cbb) || - !cbb_buffer_add(cbb->base, out_data, len)) { + !cbb_buffer_add(cbb_get_base(cbb), out_data, len)) { return 0; } return 1; @@ -423,37 +389,50 @@ int CBB_add_space(CBB *cbb, uint8_t **out_data, size_t len) { int CBB_reserve(CBB *cbb, uint8_t **out_data, size_t len) { if (!CBB_flush(cbb) || - !cbb_buffer_reserve(cbb->base, out_data, len)) { + !cbb_buffer_reserve(cbb_get_base(cbb), out_data, len)) { return 0; } return 1; } int CBB_did_write(CBB *cbb, size_t len) { - size_t newlen = cbb->base->len + len; + struct cbb_buffer_st *base = cbb_get_base(cbb); + size_t newlen = base->len + len; if (cbb->child != NULL || - newlen < cbb->base->len || - newlen > cbb->base->cap) { + newlen < base->len || + newlen > base->cap) { return 0; } - cbb->base->len = newlen; + base->len = newlen; return 1; } -int CBB_add_u8(CBB *cbb, uint8_t value) { - if (!CBB_flush(cbb)) { +static int cbb_add_u(CBB *cbb, uint64_t v, size_t len_len) { + uint8_t *buf; + if (!CBB_add_space(cbb, &buf, len_len)) { return 0; } - return cbb_buffer_add_u(cbb->base, value, 1); -} + for (size_t i = len_len - 1; i < len_len; i--) { + buf[i] = v; + v >>= 8; + } -int CBB_add_u16(CBB *cbb, uint16_t value) { - if (!CBB_flush(cbb)) { + // |v| must fit in |len_len| bytes. + if (v != 0) { + cbb_get_base(cbb)->error = 1; return 0; } - return cbb_buffer_add_u(cbb->base, value, 2); + return 1; +} + +int CBB_add_u8(CBB *cbb, uint8_t value) { + return cbb_add_u(cbb, value, 1); +} + +int CBB_add_u16(CBB *cbb, uint16_t value) { + return cbb_add_u(cbb, value, 2); } int CBB_add_u16le(CBB *cbb, uint16_t value) { @@ -461,19 +440,11 @@ int CBB_add_u16le(CBB *cbb, uint16_t value) { } int CBB_add_u24(CBB *cbb, uint32_t value) { - if (!CBB_flush(cbb)) { - return 0; - } - - return cbb_buffer_add_u(cbb->base, value, 3); + return cbb_add_u(cbb, value, 3); } int CBB_add_u32(CBB *cbb, uint32_t value) { - if (!CBB_flush(cbb)) { - return 0; - } - - return cbb_buffer_add_u(cbb->base, value, 4); + return cbb_add_u(cbb, value, 4); } int CBB_add_u32le(CBB *cbb, uint32_t value) { @@ -481,10 +452,7 @@ int CBB_add_u32le(CBB *cbb, uint32_t value) { } int CBB_add_u64(CBB *cbb, uint64_t value) { - if (!CBB_flush(cbb)) { - return 0; - } - return cbb_buffer_add_u(cbb->base, value, 8); + return cbb_add_u(cbb, value, 8); } int CBB_add_u64le(CBB *cbb, uint64_t value) { @@ -496,9 +464,11 @@ void CBB_discard_child(CBB *cbb) { return; } - cbb->base->len = cbb->child->offset; + struct cbb_buffer_st *base = cbb_get_base(cbb); + assert(cbb->child->is_child); + base->len = cbb->child->u.child.offset; - cbb->child->base = NULL; + cbb->child->u.child.base = NULL; cbb->child = NULL; } @@ -506,7 +476,7 @@ int CBB_add_asn1_uint64(CBB *cbb, uint64_t value) { return CBB_add_asn1_uint64_with_tag(cbb, value, CBS_ASN1_INTEGER); } -int CBB_add_asn1_uint64_with_tag(CBB *cbb, uint64_t value, unsigned tag) { +int CBB_add_asn1_uint64_with_tag(CBB *cbb, uint64_t value, CBS_ASN1_TAG tag) { CBB child; if (!CBB_add_asn1(cbb, &child, tag)) { return 0; @@ -544,7 +514,7 @@ int CBB_add_asn1_int64(CBB *cbb, int64_t value) { return CBB_add_asn1_int64_with_tag(cbb, value, CBS_ASN1_INTEGER); } -int CBB_add_asn1_int64_with_tag(CBB *cbb, int64_t value, unsigned tag) { +int CBB_add_asn1_int64_with_tag(CBB *cbb, int64_t value, CBS_ASN1_TAG tag) { if (value >= 0) { return CBB_add_asn1_uint64_with_tag(cbb, (uint64_t)value, tag); } @@ -596,30 +566,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) { @@ -685,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++; @@ -714,14 +670,14 @@ int CBB_flush_asn1_set_of(CBB *cbb) { } qsort(children, num_children, sizeof(CBS), compare_set_of_element); - // Rewind |cbb| and write the contents back in the new order. - cbb->base->len = cbb->offset + cbb->pending_len_len; + // Write the contents back in the new order. + uint8_t *out = (uint8_t *)CBB_data(cbb); + size_t offset = 0; for (size_t i = 0; i < num_children; i++) { - if (!CBB_add_bytes(cbb, CBS_data(&children[i]), CBS_len(&children[i]))) { - goto err; - } + OPENSSL_memcpy(out + offset, CBS_data(&children[i]), CBS_len(&children[i])); + offset += CBS_len(&children[i]); } - assert(CBB_len(cbb) == buf_len); + assert(offset == buf_len); ret = 1; diff --git a/third_party/boringssl/src/crypto/bytestring/cbs.c b/third_party/boringssl/src/crypto/bytestring/cbs.c index 4e7f37971e16..eb7e4dc984e0 100644 --- a/third_party/boringssl/src/crypto/bytestring/cbs.c +++ b/third_party/boringssl/src/crypto/bytestring/cbs.c @@ -136,7 +136,7 @@ int CBS_get_u24(CBS *cbs, uint32_t *out) { if (!cbs_get_u(cbs, &v, 3)) { return 0; } - *out = v; + *out = (uint32_t)v; return 1; } @@ -145,7 +145,7 @@ int CBS_get_u32(CBS *cbs, uint32_t *out) { if (!cbs_get_u(cbs, &v, 4)) { return 0; } - *out = v; + *out = (uint32_t)v; return 1; } @@ -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 (!OPENSSL_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. @@ -254,7 +278,7 @@ static int parse_base128_integer(CBS *cbs, uint64_t *out) { return 1; } -static int parse_asn1_tag(CBS *cbs, unsigned *out) { +static int parse_asn1_tag(CBS *cbs, CBS_ASN1_TAG *out) { uint8_t tag_byte; if (!CBS_get_u8(cbs, &tag_byte)) { return 0; @@ -266,8 +290,8 @@ static int parse_asn1_tag(CBS *cbs, unsigned *out) { // If the number portion is 31 (0x1f, the largest value that fits in the // allotted bits), then the tag is more than one byte long and the // continuation bytes contain the tag number. - unsigned tag = ((unsigned)tag_byte & 0xe0) << CBS_ASN1_TAG_SHIFT; - unsigned tag_number = tag_byte & 0x1f; + CBS_ASN1_TAG tag = ((CBS_ASN1_TAG)tag_byte & 0xe0) << CBS_ASN1_TAG_SHIFT; + CBS_ASN1_TAG tag_number = tag_byte & 0x1f; if (tag_number == 0x1f) { uint64_t v; if (!parse_base128_integer(cbs, &v) || @@ -277,7 +301,7 @@ static int parse_asn1_tag(CBS *cbs, unsigned *out) { v < 0x1f) { return 0; } - tag_number = (unsigned)v; + tag_number = (CBS_ASN1_TAG)v; } tag |= tag_number; @@ -293,7 +317,7 @@ static int parse_asn1_tag(CBS *cbs, unsigned *out) { return 1; } -static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag, +static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag, size_t *out_header_len, int *out_ber_found, int *out_indefinite, int ber_ok) { CBS header = *cbs; @@ -310,7 +334,7 @@ static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag, assert(out_indefinite == NULL); } - unsigned tag; + CBS_ASN1_TAG tag; if (!parse_asn1_tag(&header, &tag)) { return 0; } @@ -394,7 +418,7 @@ static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag, return CBS_get_bytes(cbs, out, len); } -int CBS_get_any_asn1(CBS *cbs, CBS *out, unsigned *out_tag) { +int CBS_get_any_asn1(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag) { size_t header_len; if (!CBS_get_any_asn1_element(cbs, out, out_tag, &header_len)) { return 0; @@ -408,13 +432,13 @@ int CBS_get_any_asn1(CBS *cbs, CBS *out, unsigned *out_tag) { return 1; } -int CBS_get_any_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag, +int CBS_get_any_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag, size_t *out_header_len) { return cbs_get_any_asn1_element(cbs, out, out_tag, out_header_len, NULL, NULL, /*ber_ok=*/0); } -int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag, +int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG *out_tag, size_t *out_header_len, int *out_ber_found, int *out_indefinite) { int ber_found_temp; @@ -424,10 +448,10 @@ int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag, /*ber_ok=*/1); } -static int cbs_get_asn1(CBS *cbs, CBS *out, unsigned tag_value, +static int cbs_get_asn1(CBS *cbs, CBS *out, CBS_ASN1_TAG tag_value, int skip_header) { size_t header_len; - unsigned tag; + CBS_ASN1_TAG tag; CBS throwaway; if (out == NULL) { @@ -447,21 +471,17 @@ static int cbs_get_asn1(CBS *cbs, CBS *out, unsigned tag_value, return 1; } -int CBS_get_asn1(CBS *cbs, CBS *out, unsigned tag_value) { +int CBS_get_asn1(CBS *cbs, CBS *out, CBS_ASN1_TAG tag_value) { return cbs_get_asn1(cbs, out, tag_value, 1 /* skip header */); } -int CBS_get_asn1_element(CBS *cbs, CBS *out, unsigned tag_value) { +int CBS_get_asn1_element(CBS *cbs, CBS *out, CBS_ASN1_TAG tag_value) { return cbs_get_asn1(cbs, out, tag_value, 0 /* include header */); } -int CBS_peek_asn1_tag(const CBS *cbs, unsigned tag_value) { - if (CBS_len(cbs) < 1) { - return 0; - } - +int CBS_peek_asn1_tag(const CBS *cbs, CBS_ASN1_TAG tag_value) { CBS copy = *cbs; - unsigned actual_tag; + CBS_ASN1_TAG actual_tag; return parse_asn1_tag(©, &actual_tag) && tag_value == actual_tag; } @@ -524,7 +544,7 @@ int CBS_get_asn1_bool(CBS *cbs, int *out) { return 1; } -int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present, unsigned tag) { +int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present, CBS_ASN1_TAG tag) { int present = 0; if (CBS_peek_asn1_tag(cbs, tag)) { @@ -542,7 +562,7 @@ int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present, unsigned tag) { } int CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out, int *out_present, - unsigned tag) { + CBS_ASN1_TAG tag) { CBS child; int present; if (!CBS_get_optional_asn1(cbs, &child, &present, tag)) { @@ -563,7 +583,7 @@ int CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out, int *out_present, return 1; } -int CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out, unsigned tag, +int CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out, CBS_ASN1_TAG tag, uint64_t default_value) { CBS child; int present; @@ -581,7 +601,7 @@ int CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out, unsigned tag, return 1; } -int CBS_get_optional_asn1_bool(CBS *cbs, int *out, unsigned tag, +int CBS_get_optional_asn1_bool(CBS *cbs, int *out, CBS_ASN1_TAG tag, int default_value) { CBS child, child2; int present; @@ -678,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)) { @@ -729,13 +772,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/third_party/boringssl/src/crypto/bytestring/internal.h b/third_party/boringssl/src/crypto/bytestring/internal.h index 7ef0e21c6aee..ba23244f6b1a 100644 --- a/third_party/boringssl/src/crypto/bytestring/internal.h +++ b/third_party/boringssl/src/crypto/bytestring/internal.h @@ -54,8 +54,8 @@ OPENSSL_EXPORT int CBS_asn1_ber_to_der(CBS *in, CBS *out, // It returns one on success and zero otherwise. OPENSSL_EXPORT int CBS_get_asn1_implicit_string(CBS *in, CBS *out, uint8_t **out_storage, - unsigned outer_tag, - unsigned inner_tag); + CBS_ASN1_TAG outer_tag, + CBS_ASN1_TAG inner_tag); // CBB_finish_i2d calls |CBB_finish| on |cbb| which must have been initialized // with |CBB_init|. If |outp| is not NULL then the result is written to |*outp| diff --git a/third_party/boringssl/src/crypto/chacha/asm/chacha-x86_64.pl b/third_party/boringssl/src/crypto/chacha/asm/chacha-x86_64.pl index 8f3f4cee7f86..31384defb096 100755 --- a/third_party/boringssl/src/crypto/chacha/asm/chacha-x86_64.pl +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/cipher_extra/aead_test.cc b/third_party/boringssl/src/crypto/cipher_extra/aead_test.cc index 506db2672067..a8d2dbd8c28b 100644 --- a/third_party/boringssl/src/crypto/cipher_extra/aead_test.cc +++ b/third_party/boringssl/src/crypto/cipher_extra/aead_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 @@ -48,13 +49,8 @@ constexpr uint32_t kNondeterministic = 1 << 7; // RequiresADLength encodes an AD length requirement into flags. constexpr uint32_t RequiresADLength(size_t length) { - // If we had a more recent C++ version we could assert that the length is - // sufficiently small with: - // - // if (length >= 16) { - // __builtin_unreachable(); - // } - return (length & 0xf) << 3; + assert(length < 16); + return static_cast((length & 0xf) << 3); } // RequiredADLength returns the AD length requirement encoded in |flags|, or @@ -64,9 +60,8 @@ constexpr size_t RequiredADLength(uint32_t flags) { } constexpr uint32_t RequiresMinimumTagLength(size_t length) { - // See above for statically checking the size at compile time with future C++ - // versions. - return (length & 0xf) << 8; + assert(length < 16); + return static_cast((length & 0xf) << 8); } constexpr size_t MinimumTagLength(uint32_t flags) { diff --git a/third_party/boringssl/src/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl b/third_party/boringssl/src/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl index aad31ab7a371..f7d419bb8587 100644 --- a/third_party/boringssl/src/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl +++ b/third_party/boringssl/src/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl @@ -32,7 +32,7 @@ *STDOUT=*OUT; $code.=<<___; -.data +.section .rodata .align 16 one: diff --git a/third_party/boringssl/src/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl b/third_party/boringssl/src/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl index b2067c78dcd4..f0430c3e852c 100644 --- a/third_party/boringssl/src/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/cipher_extra/cipher_test.cc b/third_party/boringssl/src/crypto/cipher_extra/cipher_test.cc index ad939e249bf3..4c8c142ccf57 100644 --- a/third_party/boringssl/src/crypto/cipher_extra/cipher_test.cc +++ b/third_party/boringssl/src/crypto/cipher_extra/cipher_test.cc @@ -106,6 +106,8 @@ static const EVP_CIPHER *GetCipher(const std::string &name) { return EVP_aes_192_ctr(); } else if (name == "AES-192-ECB") { return EVP_aes_192_ecb(); + } else if (name == "AES-192-GCM") { + return EVP_aes_192_gcm(); } else if (name == "AES-192-OFB") { return EVP_aes_192_ofb(); } else if (name == "AES-256-CBC") { @@ -122,198 +124,341 @@ static const EVP_CIPHER *GetCipher(const std::string &name) { return nullptr; } -static bool DoCipher(EVP_CIPHER_CTX *ctx, std::vector *out, - bssl::Span in, size_t chunk, - bool in_place) { - size_t max_out = in.size(); - if ((EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_NO_PADDING) == 0 && - EVP_CIPHER_CTX_encrypting(ctx)) { - unsigned block_size = EVP_CIPHER_CTX_block_size(ctx); - max_out += block_size - (max_out % block_size); - } - out->resize(max_out); - if (in_place) { - std::copy(in.begin(), in.end(), out->begin()); - in = bssl::MakeConstSpan(out->data(), in.size()); +enum class Operation { + // kBoth tests both encryption and decryption. + kBoth, + // kEncrypt tests encryption. The result of encryption should always + // successfully decrypt, so this should only be used if the test file has a + // matching decrypt-only vector. + kEncrypt, + // kDecrypt tests decryption. This should only be used if the test file has a + // matching encrypt-only input, or if multiple ciphertexts are valid for + // a given plaintext and this is a non-canonical ciphertext. + kDecrypt, + // kInvalidDecrypt tests decryption and expects it to fail, e.g. due to + // invalid tag or padding. + kInvalidDecrypt, +}; + +static const char *OperationToString(Operation op) { + switch (op) { + case Operation::kBoth: + return "Both"; + case Operation::kEncrypt: + return "Encrypt"; + case Operation::kDecrypt: + return "Decrypt"; + case Operation::kInvalidDecrypt: + return "InvalidDecrypt"; } + abort(); +} - size_t total = 0; - int len; - while (!in.empty()) { - size_t todo = chunk == 0 ? in.size() : std::min(in.size(), chunk); - EXPECT_LE(todo, static_cast(INT_MAX)); - if (!EVP_CipherUpdate(ctx, out->data() + total, &len, in.data(), - static_cast(todo))) { - return false; - } - EXPECT_GE(len, 0); - total += static_cast(len); - in = in.subspan(todo); +// MaybeCopyCipherContext, if |copy| is true, replaces |*ctx| with a, hopefully +// equivalent, copy of it. +static bool MaybeCopyCipherContext(bool copy, + bssl::UniquePtr *ctx) { + if (!copy) { + return true; } - if (!EVP_CipherFinal_ex(ctx, out->data() + total, &len)) { + bssl::UniquePtr ctx2(EVP_CIPHER_CTX_new()); + if (!ctx2 || !EVP_CIPHER_CTX_copy(ctx2.get(), ctx->get())) { return false; } - EXPECT_GE(len, 0); - total += static_cast(len); - out->resize(total); + *ctx = std::move(ctx2); return true; } -static void TestOperation(FileTest *t, const EVP_CIPHER *cipher, bool encrypt, - bool copy, bool in_place, size_t chunk_size, - const std::vector &key, - const std::vector &iv, - const std::vector &plaintext, - const std::vector &ciphertext, - const std::vector &aad, - const std::vector &tag) { - const std::vector *in, *out; - if (encrypt) { - in = &plaintext; - out = &ciphertext; - } else { - in = &ciphertext; - out = &plaintext; - } - +static void TestCipherAPI(const EVP_CIPHER *cipher, Operation op, bool padding, + bool copy, bool in_place, bool use_evp_cipher, + size_t chunk_size, bssl::Span key, + bssl::Span iv, + bssl::Span plaintext, + bssl::Span ciphertext, + bssl::Span aad, + bssl::Span tag) { + bool encrypt = op == Operation::kEncrypt; + bool is_custom_cipher = + EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_CUSTOM_CIPHER; + bssl::Span in = encrypt ? plaintext : ciphertext; + bssl::Span expected = encrypt ? ciphertext : plaintext; bool is_aead = EVP_CIPHER_mode(cipher) == EVP_CIPH_GCM_MODE; - bssl::ScopedEVP_CIPHER_CTX ctx1; - ASSERT_TRUE(EVP_CipherInit_ex(ctx1.get(), cipher, nullptr, nullptr, nullptr, + // Some |EVP_CIPHER|s take a variable-length key, and need to first be + // configured with the key length, which requires configuring the cipher. + bssl::UniquePtr ctx(EVP_CIPHER_CTX_new()); + ASSERT_TRUE(ctx); + ASSERT_TRUE(EVP_CipherInit_ex(ctx.get(), cipher, /*engine=*/nullptr, + /*key=*/nullptr, /*iv=*/nullptr, encrypt ? 1 : 0)); - if (t->HasAttribute("IV")) { - if (is_aead) { - ASSERT_TRUE(EVP_CIPHER_CTX_ctrl(ctx1.get(), EVP_CTRL_AEAD_SET_IVLEN, - iv.size(), 0)); - } else { - ASSERT_EQ(iv.size(), EVP_CIPHER_CTX_iv_length(ctx1.get())); - } + ASSERT_TRUE(EVP_CIPHER_CTX_set_key_length(ctx.get(), key.size())); + if (!padding) { + ASSERT_TRUE(EVP_CIPHER_CTX_set_padding(ctx.get(), 0)); } - bssl::ScopedEVP_CIPHER_CTX ctx2; - EVP_CIPHER_CTX *ctx = ctx1.get(); - if (copy) { - ASSERT_TRUE(EVP_CIPHER_CTX_copy(ctx2.get(), ctx1.get())); - ctx = ctx2.get(); + // Configure the key. + ASSERT_TRUE(MaybeCopyCipherContext(copy, &ctx)); + ASSERT_TRUE(EVP_CipherInit_ex(ctx.get(), /*cipher=*/nullptr, + /*engine=*/nullptr, key.data(), /*iv=*/nullptr, + /*enc=*/-1)); + + // Configure the IV to run the actual operation. Callers that wish to use a + // key for multiple, potentially concurrent, operations will likely copy at + // this point. The |EVP_CIPHER_CTX| API uses the same type to represent a + // pre-computed key schedule and a streaming operation. + ASSERT_TRUE(MaybeCopyCipherContext(copy, &ctx)); + if (is_aead) { + 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())); } + ASSERT_TRUE(EVP_CipherInit_ex(ctx.get(), /*cipher=*/nullptr, + /*engine=*/nullptr, + /*key=*/nullptr, iv.data(), /*enc=*/-1)); if (is_aead && !encrypt) { - ASSERT_TRUE(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag.size(), + ASSERT_TRUE(EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_SET_TAG, + tag.size(), const_cast(tag.data()))); } - // The ciphers are run with no padding. For each of the ciphers we test, the - // output size matches the input size. - ASSERT_EQ(in->size(), out->size()); - ASSERT_TRUE(EVP_CIPHER_CTX_set_key_length(ctx, key.size())); - ASSERT_TRUE( - EVP_CipherInit_ex(ctx, nullptr, nullptr, key.data(), iv.data(), -1)); + // Note: the deprecated |EVP_CIPHER|-based AEAD API is sensitive to whether // parameters are NULL, so it is important to skip the |in| and |aad| // |EVP_CipherUpdate| calls when empty. - if (!aad.empty()) { - int unused; - ASSERT_TRUE( - EVP_CipherUpdate(ctx, nullptr, &unused, aad.data(), aad.size())); + while (!aad.empty()) { + size_t todo = + chunk_size == 0 ? aad.size() : std::min(aad.size(), chunk_size); + if (use_evp_cipher) { + // AEADs always use the "custom cipher" return value convention. Passing a + // null output pointer triggers the AAD logic. + ASSERT_TRUE(is_custom_cipher); + ASSERT_EQ(static_cast(todo), + EVP_Cipher(ctx.get(), nullptr, aad.data(), todo)); + } else { + int len; + ASSERT_TRUE(EVP_CipherUpdate(ctx.get(), nullptr, &len, aad.data(), todo)); + // Although it doesn't output anything, |EVP_CipherUpdate| should claim to + // output the input length. + EXPECT_EQ(len, static_cast(todo)); + } + aad = aad.subspan(todo); } - ASSERT_TRUE(EVP_CIPHER_CTX_set_padding(ctx, 0)); - std::vector result; - ASSERT_TRUE(DoCipher(ctx, &result, *in, chunk_size, in_place)); - EXPECT_EQ(Bytes(*out), Bytes(result)); - if (encrypt && is_aead) { - uint8_t rtag[16]; - ASSERT_LE(tag.size(), sizeof(rtag)); - ASSERT_TRUE( - EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, tag.size(), rtag)); - EXPECT_EQ(Bytes(tag), Bytes(rtag, tag.size())); + + // Set up the output buffer. + size_t max_out = in.size(); + size_t block_size = EVP_CIPHER_CTX_block_size(ctx.get()); + if (block_size > 1 && + (EVP_CIPHER_CTX_flags(ctx.get()) & EVP_CIPH_NO_PADDING) == 0 && + EVP_CIPHER_CTX_encrypting(ctx.get())) { + max_out += block_size - (max_out % block_size); + } + std::vector result(max_out); + if (in_place) { + std::copy(in.begin(), in.end(), result.begin()); + in = bssl::MakeConstSpan(result).first(in.size()); } - // Additionally test low-level AES mode APIs. Skip runs where |copy| because - // it does not apply. - if (!copy) { - int nid = EVP_CIPHER_nid(cipher); - bool is_ctr = nid == NID_aes_128_ctr || nid == NID_aes_192_ctr || - nid == NID_aes_256_ctr; - bool is_cbc = nid == NID_aes_128_cbc || nid == NID_aes_192_cbc || - nid == NID_aes_256_cbc; - bool is_ofb = nid == NID_aes_128_ofb128 || nid == NID_aes_192_ofb128 || - nid == NID_aes_256_ofb128; - if (is_ctr || is_cbc || is_ofb) { - AES_KEY aes; - if (encrypt || !is_cbc) { - ASSERT_EQ(0, AES_set_encrypt_key(key.data(), key.size() * 8, &aes)); + size_t total = 0; + int len; + while (!in.empty()) { + size_t todo = chunk_size == 0 ? in.size() : std::min(in.size(), chunk_size); + EXPECT_LE(todo, static_cast(INT_MAX)); + ASSERT_TRUE(MaybeCopyCipherContext(copy, &ctx)); + if (use_evp_cipher) { + // |EVP_Cipher| sometimes returns the number of bytes written, or -1 on + // error, and sometimes 1 or 0, implicitly writing |in_len| bytes. + if (is_custom_cipher) { + len = EVP_Cipher(ctx.get(), result.data() + total, in.data(), todo); } else { - ASSERT_EQ(0, AES_set_decrypt_key(key.data(), key.size() * 8, &aes)); + ASSERT_EQ( + 1, EVP_Cipher(ctx.get(), result.data() + total, in.data(), todo)); + len = static_cast(todo); } - - // The low-level APIs all work in-place. - bssl::Span input = *in; - result.clear(); - if (in_place) { - result = *in; - input = result; + } else { + ASSERT_TRUE(EVP_CipherUpdate(ctx.get(), result.data() + total, &len, + in.data(), static_cast(todo))); + } + ASSERT_GE(len, 0); + total += static_cast(len); + in = in.subspan(todo); + } + if (op == Operation::kInvalidDecrypt) { + if (use_evp_cipher) { + // Only the "custom cipher" return value convention can report failures. + // Passing all nulls should act like |EVP_CipherFinal_ex|. + ASSERT_TRUE(is_custom_cipher); + EXPECT_EQ(-1, EVP_Cipher(ctx.get(), nullptr, nullptr, 0)); + } else { + // Invalid padding and invalid tags all appear as a failed + // |EVP_CipherFinal_ex|. + EXPECT_FALSE(EVP_CipherFinal_ex(ctx.get(), result.data() + total, &len)); + } + } else { + if (use_evp_cipher) { + if (is_custom_cipher) { + // Only the "custom cipher" convention has an |EVP_CipherFinal_ex| + // equivalent. + len = EVP_Cipher(ctx.get(), nullptr, nullptr, 0); } else { - result.resize(out->size()); + len = 0; } - bssl::Span output = bssl::MakeSpan(result); - ASSERT_EQ(input.size(), output.size()); - - // The low-level APIs all use block-size IVs. - ASSERT_EQ(iv.size(), size_t{AES_BLOCK_SIZE}); - uint8_t ivec[AES_BLOCK_SIZE]; - OPENSSL_memcpy(ivec, iv.data(), iv.size()); - - if (is_ctr) { - unsigned num = 0; - uint8_t ecount_buf[AES_BLOCK_SIZE]; - if (chunk_size == 0) { - AES_ctr128_encrypt(input.data(), output.data(), input.size(), &aes, - ivec, ecount_buf, &num); - } else { - do { - size_t todo = std::min(input.size(), chunk_size); - AES_ctr128_encrypt(input.data(), output.data(), todo, &aes, ivec, - ecount_buf, &num); - input = input.subspan(todo); - output = output.subspan(todo); - } while (!input.empty()); - } - EXPECT_EQ(Bytes(*out), Bytes(result)); - } else if (is_cbc && chunk_size % AES_BLOCK_SIZE == 0) { - // Note |AES_cbc_encrypt| requires block-aligned chunks. - if (chunk_size == 0) { - AES_cbc_encrypt(input.data(), output.data(), input.size(), &aes, ivec, - encrypt); - } else { - do { - size_t todo = std::min(input.size(), chunk_size); - AES_cbc_encrypt(input.data(), output.data(), todo, &aes, ivec, - encrypt); - input = input.subspan(todo); - output = output.subspan(todo); - } while (!input.empty()); + } else { + ASSERT_TRUE(EVP_CipherFinal_ex(ctx.get(), result.data() + total, &len)); + } + ASSERT_GE(len, 0); + total += static_cast(len); + result.resize(total); + EXPECT_EQ(Bytes(expected), Bytes(result)); + if (encrypt && is_aead) { + uint8_t rtag[16]; + ASSERT_LE(tag.size(), sizeof(rtag)); + ASSERT_TRUE(MaybeCopyCipherContext(copy, &ctx)); + ASSERT_TRUE(EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_GET_TAG, + tag.size(), rtag)); + EXPECT_EQ(Bytes(tag), Bytes(rtag, tag.size())); + } + } +} + +static void TestLowLevelAPI( + const EVP_CIPHER *cipher, Operation op, bool in_place, size_t chunk_size, + bssl::Span key, bssl::Span iv, + bssl::Span plaintext, bssl::Span ciphertext) { + bool encrypt = op == Operation::kEncrypt; + bssl::Span in = encrypt ? plaintext : ciphertext; + bssl::Span expected = encrypt ? ciphertext : plaintext; + int nid = EVP_CIPHER_nid(cipher); + bool is_ctr = nid == NID_aes_128_ctr || nid == NID_aes_192_ctr || + nid == NID_aes_256_ctr; + bool is_cbc = nid == NID_aes_128_cbc || nid == NID_aes_192_cbc || + nid == NID_aes_256_cbc; + bool is_ofb = nid == NID_aes_128_ofb128 || nid == NID_aes_192_ofb128 || + nid == NID_aes_256_ofb128; + if (!is_ctr && !is_cbc && !is_ofb) { + return; + } + + // Invalid ciphertexts are not possible in any of the ciphers where this API + // applies. + ASSERT_NE(op, Operation::kInvalidDecrypt); + + AES_KEY aes; + if (encrypt || !is_cbc) { + ASSERT_EQ(0, AES_set_encrypt_key(key.data(), key.size() * 8, &aes)); + } else { + ASSERT_EQ(0, AES_set_decrypt_key(key.data(), key.size() * 8, &aes)); + } + + std::vector result; + if (in_place) { + result.assign(in.begin(), in.end()); + } else { + result.resize(expected.size()); + } + bssl::Span out = bssl::MakeSpan(result); + // Input and output sizes for all the low-level APIs should match. + ASSERT_EQ(in.size(), out.size()); + + // The low-level APIs all use block-size IVs. + ASSERT_EQ(iv.size(), size_t{AES_BLOCK_SIZE}); + uint8_t ivec[AES_BLOCK_SIZE]; + OPENSSL_memcpy(ivec, iv.data(), iv.size()); + + if (is_ctr) { + unsigned num = 0; + uint8_t ecount_buf[AES_BLOCK_SIZE]; + if (chunk_size == 0) { + AES_ctr128_encrypt(in.data(), out.data(), in.size(), &aes, ivec, + ecount_buf, &num); + } else { + do { + size_t todo = std::min(in.size(), chunk_size); + AES_ctr128_encrypt(in.data(), out.data(), todo, &aes, ivec, ecount_buf, + &num); + in = in.subspan(todo); + out = out.subspan(todo); + } while (!in.empty()); + } + EXPECT_EQ(Bytes(expected), Bytes(result)); + } else if (is_cbc && chunk_size % AES_BLOCK_SIZE == 0) { + // Note |AES_cbc_encrypt| requires block-aligned chunks. + if (chunk_size == 0) { + AES_cbc_encrypt(in.data(), out.data(), in.size(), &aes, ivec, encrypt); + } else { + do { + size_t todo = std::min(in.size(), chunk_size); + AES_cbc_encrypt(in.data(), out.data(), todo, &aes, ivec, encrypt); + in = in.subspan(todo); + out = out.subspan(todo); + } while (!in.empty()); + } + EXPECT_EQ(Bytes(expected), Bytes(result)); + } else if (is_ofb) { + int num = 0; + if (chunk_size == 0) { + AES_ofb128_encrypt(in.data(), out.data(), in.size(), &aes, ivec, &num); + } else { + do { + size_t todo = std::min(in.size(), chunk_size); + AES_ofb128_encrypt(in.data(), out.data(), todo, &aes, ivec, &num); + in = in.subspan(todo); + out = out.subspan(todo); + } while (!in.empty()); + } + EXPECT_EQ(Bytes(expected), Bytes(result)); + } +} + +static void TestCipher(const EVP_CIPHER *cipher, Operation input_op, + bool padding, bssl::Span key, + bssl::Span iv, + bssl::Span plaintext, + bssl::Span ciphertext, + bssl::Span aad, + bssl::Span tag) { + size_t block_size = EVP_CIPHER_block_size(cipher); + std::vector ops; + if (input_op == Operation::kBoth) { + ops = {Operation::kEncrypt, Operation::kDecrypt}; + } else { + ops = {input_op}; + } + for (Operation op : ops) { + SCOPED_TRACE(OperationToString(op)); + // Zero indicates a single-shot API. + static const size_t kChunkSizes[] = {0, 1, 2, 5, 7, 8, 9, 15, 16, + 17, 31, 32, 33, 63, 64, 65, 512}; + for (size_t chunk_size : kChunkSizes) { + SCOPED_TRACE(chunk_size); + if (chunk_size > plaintext.size() && chunk_size > ciphertext.size() && + chunk_size > aad.size()) { + continue; + } + for (bool in_place : {false, true}) { + SCOPED_TRACE(in_place); + for (bool copy : {false, true}) { + SCOPED_TRACE(copy); + TestCipherAPI(cipher, op, padding, copy, in_place, + /*use_evp_cipher=*/false, chunk_size, key, iv, + plaintext, ciphertext, aad, tag); + if (!padding && chunk_size % block_size == 0) { + TestCipherAPI(cipher, op, padding, copy, in_place, + /*use_evp_cipher=*/true, chunk_size, key, iv, + plaintext, ciphertext, aad, tag); + } } - EXPECT_EQ(Bytes(*out), Bytes(result)); - } else if (is_ofb) { - int num = 0; - if (chunk_size == 0) { - AES_ofb128_encrypt(input.data(), output.data(), input.size(), &aes, - ivec, &num); - } else { - do { - size_t todo = std::min(input.size(), chunk_size); - AES_ofb128_encrypt(input.data(), output.data(), todo, &aes, ivec, - &num); - input = input.subspan(todo); - output = output.subspan(todo); - } while (!input.empty()); + if (!padding) { + TestLowLevelAPI(cipher, op, in_place, chunk_size, key, iv, plaintext, + ciphertext); } - EXPECT_EQ(Bytes(*out), Bytes(result)); } } } } -static void TestCipher(FileTest *t) { +static void CipherFileTest(FileTest *t) { std::string cipher_str; ASSERT_TRUE(t->GetAttribute(&cipher_str, "Cipher")); const EVP_CIPHER *cipher = GetCipher(cipher_str); @@ -331,151 +476,104 @@ static void TestCipher(FileTest *t) { ASSERT_TRUE(t->GetBytes(&tag, "Tag")); } - enum { - kEncrypt, - kDecrypt, - kBoth, - } operation = kBoth; + Operation op = Operation::kBoth; if (t->HasAttribute("Operation")) { const std::string &str = t->GetAttributeOrDie("Operation"); - if (str == "ENCRYPT") { - operation = kEncrypt; - } else if (str == "DECRYPT") { - operation = kDecrypt; + if (str == "Encrypt" || str == "ENCRYPT") { + op = Operation::kEncrypt; + } else if (str == "Decrypt" || str == "DECRYPT") { + op = Operation::kDecrypt; + } else if (str == "InvalidDecrypt") { + op = Operation::kInvalidDecrypt; } else { FAIL() << "Unknown operation: " << str; } } - const std::vector chunk_sizes = {0, 1, 2, 5, 7, 8, 9, 15, 16, - 17, 31, 32, 33, 63, 64, 65, 512}; - - for (size_t chunk_size : chunk_sizes) { - SCOPED_TRACE(chunk_size); - for (bool copy : {false, true}) { - SCOPED_TRACE(copy); - for (bool in_place : {false, true}) { - SCOPED_TRACE(in_place); - // By default, both directions are run, unless overridden by the - // operation. - if (operation != kDecrypt) { - SCOPED_TRACE("encrypt"); - TestOperation(t, cipher, true /* encrypt */, copy, in_place, - chunk_size, key, iv, plaintext, ciphertext, aad, tag); - } - - if (operation != kEncrypt) { - SCOPED_TRACE("decrypt"); - TestOperation(t, cipher, false /* decrypt */, copy, in_place, - chunk_size, key, iv, plaintext, ciphertext, aad, tag); - } - } - } - } + TestCipher(cipher, op, /*padding=*/false, key, iv, plaintext, ciphertext, aad, + tag); } TEST(CipherTest, TestVectors) { - FileTestGTest("crypto/cipher_extra/test/cipher_tests.txt", TestCipher); + FileTestGTest("crypto/cipher_extra/test/cipher_tests.txt", CipherFileTest); } TEST(CipherTest, CAVP_AES_128_CBC) { FileTestGTest("crypto/cipher_extra/test/nist_cavp/aes_128_cbc.txt", - TestCipher); + CipherFileTest); } TEST(CipherTest, CAVP_AES_128_CTR) { FileTestGTest("crypto/cipher_extra/test/nist_cavp/aes_128_ctr.txt", - TestCipher); + CipherFileTest); } TEST(CipherTest, CAVP_AES_192_CBC) { FileTestGTest("crypto/cipher_extra/test/nist_cavp/aes_192_cbc.txt", - TestCipher); + CipherFileTest); } TEST(CipherTest, CAVP_AES_192_CTR) { FileTestGTest("crypto/cipher_extra/test/nist_cavp/aes_192_ctr.txt", - TestCipher); + CipherFileTest); } TEST(CipherTest, CAVP_AES_256_CBC) { FileTestGTest("crypto/cipher_extra/test/nist_cavp/aes_256_cbc.txt", - TestCipher); + CipherFileTest); } TEST(CipherTest, CAVP_AES_256_CTR) { FileTestGTest("crypto/cipher_extra/test/nist_cavp/aes_256_ctr.txt", - TestCipher); + CipherFileTest); } TEST(CipherTest, CAVP_TDES_CBC) { - FileTestGTest("crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt", TestCipher); + FileTestGTest("crypto/cipher_extra/test/nist_cavp/tdes_cbc.txt", + CipherFileTest); } TEST(CipherTest, CAVP_TDES_ECB) { - FileTestGTest("crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt", TestCipher); + FileTestGTest("crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt", + CipherFileTest); } TEST(CipherTest, WycheproofAESCBC) { - FileTestGTest( - "third_party/wycheproof_testvectors/aes_cbc_pkcs5_test.txt", - [](FileTest *t) { - t->IgnoreInstruction("type"); - t->IgnoreInstruction("ivSize"); - - std::string key_size; - ASSERT_TRUE(t->GetInstruction(&key_size, "keySize")); - const EVP_CIPHER *cipher; - switch (atoi(key_size.c_str())) { - case 128: - cipher = EVP_aes_128_cbc(); - break; - case 192: - cipher = EVP_aes_192_cbc(); - break; - case 256: - cipher = EVP_aes_256_cbc(); - break; - default: - FAIL() << "Unsupported key size: " << key_size; - } - - std::vector key, iv, msg, ct; - ASSERT_TRUE(t->GetBytes(&key, "key")); - ASSERT_TRUE(t->GetBytes(&iv, "iv")); - ASSERT_TRUE(t->GetBytes(&msg, "msg")); - ASSERT_TRUE(t->GetBytes(&ct, "ct")); - ASSERT_EQ(EVP_CIPHER_key_length(cipher), key.size()); - ASSERT_EQ(EVP_CIPHER_iv_length(cipher), iv.size()); - WycheproofResult result; - ASSERT_TRUE(GetWycheproofResult(t, &result)); - - bssl::ScopedEVP_CIPHER_CTX ctx; - std::vector out; - const std::vector chunk_sizes = { - 0, 1, 2, 5, 7, 8, 9, 15, 16, 17, 31, 32, 33, 63, 64, 65, 512}; - for (size_t chunk : chunk_sizes) { - SCOPED_TRACE(chunk); - for (bool in_place : {false, true}) { - SCOPED_TRACE(in_place); - if (result.IsValid()) { - ASSERT_TRUE(EVP_DecryptInit_ex(ctx.get(), cipher, nullptr, - key.data(), iv.data())); - ASSERT_TRUE(DoCipher(ctx.get(), &out, ct, chunk, in_place)); - EXPECT_EQ(Bytes(msg), Bytes(out)); - - ASSERT_TRUE(EVP_EncryptInit_ex(ctx.get(), cipher, nullptr, - key.data(), iv.data())); - ASSERT_TRUE(DoCipher(ctx.get(), &out, msg, chunk, in_place)); - EXPECT_EQ(Bytes(ct), Bytes(out)); - } else { - ASSERT_TRUE(EVP_DecryptInit_ex(ctx.get(), cipher, nullptr, - key.data(), iv.data())); - EXPECT_FALSE(DoCipher(ctx.get(), &out, ct, chunk, in_place)); - } - } - } - }); + FileTestGTest("third_party/wycheproof_testvectors/aes_cbc_pkcs5_test.txt", + [](FileTest *t) { + t->IgnoreInstruction("type"); + t->IgnoreInstruction("ivSize"); + + std::string key_size; + ASSERT_TRUE(t->GetInstruction(&key_size, "keySize")); + const EVP_CIPHER *cipher; + switch (atoi(key_size.c_str())) { + case 128: + cipher = EVP_aes_128_cbc(); + break; + case 192: + cipher = EVP_aes_192_cbc(); + break; + case 256: + cipher = EVP_aes_256_cbc(); + break; + default: + FAIL() << "Unsupported key size: " << key_size; + } + + std::vector key, iv, msg, ct; + ASSERT_TRUE(t->GetBytes(&key, "key")); + ASSERT_TRUE(t->GetBytes(&iv, "iv")); + ASSERT_TRUE(t->GetBytes(&msg, "msg")); + ASSERT_TRUE(t->GetBytes(&ct, "ct")); + WycheproofResult result; + ASSERT_TRUE(GetWycheproofResult(t, &result)); + TestCipher(cipher, + result.IsValid() ? Operation::kBoth + : Operation::kInvalidDecrypt, + /*padding=*/true, key, iv, msg, ct, /*aad=*/{}, + /*tag=*/{}); + }); } TEST(CipherTest, SHA1WithSecretSuffix) { diff --git a/third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c b/third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c index 4a46a1df45ec..6510ff48ad44 100644 --- a/third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c +++ b/third_party/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c @@ -145,7 +145,7 @@ static int chacha20_poly1305_seal_scatter( // encrypted byte-by-byte first. if (extra_in_len) { static const size_t kChaChaBlockSize = 64; - uint32_t block_counter = 1 + (in_len / kChaChaBlockSize); + uint32_t block_counter = (uint32_t)(1 + (in_len / kChaChaBlockSize)); size_t offset = in_len % kChaChaBlockSize; uint8_t block[64 /* kChaChaBlockSize */]; diff --git a/third_party/boringssl/src/crypto/cipher_extra/e_tls.c b/third_party/boringssl/src/crypto/cipher_extra/e_tls.c index cfaf95dc70a9..00b482432c0d 100644 --- a/third_party/boringssl/src/crypto/cipher_extra/e_tls.c +++ b/third_party/boringssl/src/crypto/cipher_extra/e_tls.c @@ -442,13 +442,6 @@ static int aead_tls_get_iv(const EVP_AEAD_CTX *ctx, const uint8_t **out_iv, return 1; } -static int aead_null_sha1_tls_init(EVP_AEAD_CTX *ctx, const uint8_t *key, - size_t key_len, size_t tag_len, - enum evp_aead_direction_t dir) { - return aead_tls_init(ctx, key, key_len, tag_len, dir, EVP_enc_null(), - EVP_sha1(), 1 /* implicit iv */); -} - static const EVP_AEAD aead_aes_128_cbc_sha1_tls = { SHA_DIGEST_LENGTH + 16, // key len (SHA1 + AES128) 16, // nonce len (IV) @@ -551,23 +544,6 @@ static const EVP_AEAD aead_des_ede3_cbc_sha1_tls_implicit_iv = { aead_tls_tag_len, }; -static const EVP_AEAD aead_null_sha1_tls = { - SHA_DIGEST_LENGTH, // key len - 0, // nonce len - SHA_DIGEST_LENGTH, // overhead (SHA1) - SHA_DIGEST_LENGTH, // max tag length - 0, // seal_scatter_supports_extra_in - - NULL, // init - aead_null_sha1_tls_init, - aead_tls_cleanup, - aead_tls_open, - aead_tls_seal_scatter, - NULL, // open_gather - NULL, // get_iv - aead_tls_tag_len, -}; - const EVP_AEAD *EVP_aead_aes_128_cbc_sha1_tls(void) { return &aead_aes_128_cbc_sha1_tls; } @@ -591,5 +567,3 @@ const EVP_AEAD *EVP_aead_des_ede3_cbc_sha1_tls(void) { const EVP_AEAD *EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv(void) { return &aead_des_ede3_cbc_sha1_tls_implicit_iv; } - -const EVP_AEAD *EVP_aead_null_sha1_tls(void) { return &aead_null_sha1_tls; } diff --git a/third_party/boringssl/src/crypto/cipher_extra/test/cipher_tests.txt b/third_party/boringssl/src/crypto/cipher_extra/test/cipher_tests.txt index 782b08e763cd..1622a88dd142 100644 --- a/third_party/boringssl/src/crypto/cipher_extra/test/cipher_tests.txt +++ b/third_party/boringssl/src/crypto/cipher_extra/test/cipher_tests.txt @@ -123,13 +123,11 @@ Ciphertext = # DES EDE tests Cipher = DES-EDE Key = 0123456789abcdeff1e0d3c2b5a49786 -IV = fedcba9876543210 Plaintext = 37363534333231204E6F77206973207468652074696D6520666F722000000000 Ciphertext = 22E889402E28422F8167AD279D90A566DA75B734E12C671FC2669AECB3E4FE8F Cipher = DES-EDE Key = 0123456789abcdeff1e0d3c2b5a49786 -IV = fedcba9876543210 Plaintext = Ciphertext = @@ -377,6 +375,15 @@ Ciphertext = 8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Tag = 619cc5aefffe0bfa462af43c1699d050 +Cipher = AES-128-GCM +Key = feffe9928665731c6d6a8f9467308308 +IV = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b +Plaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 +Ciphertext = 8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5 +AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 +Tag = 619cc5aefffe0bfa462af43c1699d051 +Operation = InvalidDecrypt + Cipher = AES-128-GCM Key = 3de7b368783bd7287f2b9b731814c876 IV = 90dedcfff100eb1f1db9d935 @@ -385,6 +392,63 @@ Ciphertext = 66c03198b3422cf3fd8291080f6fb3ebd9ad863e41cdff169becde726946a342ffa AAD = 85ddde4720659e80e25168585a354eb1e021c0b5d2ee289f2314dd5aae52bdf1fd44755bb56a6e659111a1d4b4da73315bde01c7d2c15a4f7114aefd68c141049fac27acfdca24e65c51fb1c27d307cd948e13af2963166bbc9411401d124f1ddf20f890db5611385257f52aa05c09b467e3ae886decf5744ec3749e5879f2a60017f601bbee11a66604d5f3d521d2c48cea1794f77366f29c7bd12a8aa51d34a4f3fb52809561b527016bc6badf9d136156c330e1d69d1aab98c7caa9cb46e782a898b4c66e4ee3e2445fbfacaadf9a8f73c4cbcb2a1ceb604ba5637b51337fcbe0fc366da98e805ceeb29feaf05420113b16e1005079c0e88af33f5970b3d7a8b51d0d9f5120a0795063db508171b75ed07705ac6d6bfe4ecc59243091d48865536515e036860affa880bfc91aae2fd1700de15994792aefc4a176e5d49d0f9135c7d670f3cb8798bfbe83fe73de7427e0f3e6a2df561cfa15ffe6ae80d5016096c8875b0beac8cee8fb530fb421b9a8ada4d551a528d0a0b521086f5a2db371a3bf12a2ef861f831fcb44cb2baede907a9306d3e5a3af796e0a50ba2c8dd61fb03727df5f0654d837dabee2fd90eecb7b2e8f303b0d57f97dc6a52d8281574d8457c89c6a9f5d80e0bd86c90ed39b1db4253affee614e8cf1ff05166c66e7d2a2aa2fe8a81c4741339683debe189c126e7f553a5f2dc16fc16672f74aebf94c7e3041c758fbc6d0c7f71c192cfd0fb2ec52d0a0705b05815d567f3d19f9b5d553a2adce9a79159b0e38980851bf64e97f896c028a6df8363cf1f13f4654265a7b0c0b24198efcf4418c32772bafd3980dbc689fab12e85b3ef4a491e2e5ffaa2fadaaf3deb392105a42380797d3b41ef61303a6016b269ec9a9f6e3f26070ff33cb467435ecb325dc7e18728a5c2e882e720c8f876fef10f5bffd5a925cdc9689d934272019e90e3a3bbf63a295f207faa5c014e1517c7d5c18c3ed70e92304d51944dcd3604c999d4aa8d8dbf2a4c69cbbc08635c968a20dcb80f438d43c57851c4cafec0b9568dd6c19932fd3f1294afd16f019f20e40ec87f6f5dffc7717470614b2de6e9000969e6b7e561cf91c06dd379a09c6c25c7841330dc78fc5be1d9b86581a81f55c0289531128638441fc98a1ad9472d74e2be2f874aff2fcf9c941502f59f716185a4c39289ca368c6dbf5257b5dc5e57a420792c26e602e4ecbc4f17c8787004eb88ea091d6b6ddc3c85dc110b5d1f46f6e1d872723176f4c73664ecb4219258fedce19ae22360354fa4894fe51d69434c2e58e1ec665b5cc33bb295053c591b474b6ae178c8834667bef971604279440170ebf3e739a4ff19704e5886767f81edce95a3dd93d1147995e7eb6c794b7be136658ed23cec7c374705ec0d8479dfb44cc7213076668e5fbe6a508537a9157815c6e5187b89f Tag = 469e3ef168a64945f76d7a2013f27b68 +Cipher = AES-192-GCM +Key = 000000000000000000000000000000000000000000000000 +IV = 000000000000000000000000 +AAD = +Tag = cd33b28ac773f74ba00ed1f312572435 +Plaintext = +Ciphertext = + +Cipher = AES-192-GCM +Key = 000000000000000000000000000000000000000000000000 +IV = 000000000000000000000000 +AAD = +Tag = 2ff58d80033927ab8ef4d4587514f0fb +Plaintext = 00000000000000000000000000000000 +Ciphertext = 98e7247c07f0fe411c267e4384b0f600 + +Cipher = AES-192-GCM +Key = feffe9928665731c6d6a8f9467308308feffe9928665731c +IV = cafebabefacedbaddecaf888 +AAD = +Tag = 9924a7c8587336bfb118024db8674a14 +Plaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255 +Ciphertext = 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256 + +Cipher = AES-192-GCM +Key = feffe9928665731c6d6a8f9467308308feffe9928665731c +IV = cafebabefacedbaddecaf888 +AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 +Tag = 2519498e80f1478f37ba55bd6d27618c +Plaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 +Ciphertext = 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710 + +Cipher = AES-192-GCM +Key = feffe9928665731c6d6a8f9467308308feffe9928665731c +IV = cafebabefacedbad +AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 +Tag = 65dcc57fcf623a24094fcca40d3533f8 +Plaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 +Ciphertext = 0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7 + +Cipher = AES-192-GCM +Key = feffe9928665731c6d6a8f9467308308feffe9928665731c +IV = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b +AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 +Tag = dcf566ff291c25bbb8568fc3d376a6d9 +Plaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 +Ciphertext = d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b + +Cipher = AES-192-GCM +Key = feffe9928665731c6d6a8f9467308308feffe9928665731c +IV = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b +AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 +Tag = dcf566ff291c25bbb8568fc3d376a6d8 +Plaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 +Ciphertext = d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b +Operation = InvalidDecrypt + Cipher = AES-256-GCM Key = 0000000000000000000000000000000000000000000000000000000000000000 IV = 000000000000000000000000 @@ -433,6 +497,15 @@ Ciphertext = 5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Tag = a44a8266ee1c8eb0c8b5d4cf5ae9f19a +Cipher = AES-256-GCM +Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 +IV = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b +Plaintext = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 +Ciphertext = 5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f +AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 +Tag = a44a8266ee1c8eb0c8b5d4cf5ae9f19b +Operation = InvalidDecrypt + # local add-ons, primarily streaming ghash tests # 128 bytes aad Cipher = AES-128-GCM diff --git a/third_party/boringssl/src/crypto/compiler_test.cc b/third_party/boringssl/src/crypto/compiler_test.cc index 29375a57e7bb..910233759477 100644 --- a/third_party/boringssl/src/crypto/compiler_test.cc +++ b/third_party/boringssl/src/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)); diff --git a/third_party/boringssl/src/crypto/conf/conf.c b/third_party/boringssl/src/crypto/conf/conf.c index 620b1042b15c..622c13ed0064 100644 --- a/third_party/boringssl/src/crypto/conf/conf.c +++ b/third_party/boringssl/src/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) { @@ -385,8 +383,9 @@ static CONF_VALUE *get_section(const CONF *conf, const char *section) { return lh_CONF_VALUE_retrieve(conf->data, &template); } -STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, const char *section) { - CONF_VALUE *section_value = get_section(conf, section); +const STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, + const char *section) { + const CONF_VALUE *section_value = get_section(conf, section); if (section_value == NULL) { return NULL; } @@ -551,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; } @@ -686,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)) { @@ -705,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; @@ -779,7 +775,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++; } } @@ -793,7 +789,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/third_party/boringssl/src/crypto/conf/conf_def.h b/third_party/boringssl/src/crypto/conf/conf_def.h index b1e6ba63ac3b..f01a79b26018 100644 --- a/third_party/boringssl/src/crypto/conf/conf_def.h +++ b/third_party/boringssl/src/crypto/conf/conf_def.h @@ -1,4 +1,3 @@ -/* crypto/conf/conf_def.h */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/crypto/cpu_aarch64_freebsd.c b/third_party/boringssl/src/crypto/cpu_aarch64_freebsd.c new file mode 100644 index 000000000000..42d8afa0aeb3 --- /dev/null +++ b/third_party/boringssl/src/crypto/cpu_aarch64_freebsd.c @@ -0,0 +1,62 @@ +/* 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 "internal.h" + +#if defined(OPENSSL_AARCH64) && defined(OPENSSL_FREEBSD) && \ + !defined(OPENSSL_STATIC_ARMCAP) + +#include +#include + +#include + +extern uint32_t OPENSSL_armcap_P; + +// ID_AA64ISAR0_*_VAL are defined starting FreeBSD 13.0. When FreeBSD +// 12.x is out of support, these compatibility macros can be removed. + +#ifndef ID_AA64ISAR0_AES_VAL +#define ID_AA64ISAR0_AES_VAL ID_AA64ISAR0_AES +#endif +#ifndef ID_AA64ISAR0_SHA1_VAL +#define ID_AA64ISAR0_SHA1_VAL ID_AA64ISAR0_SHA1 +#endif +#ifndef ID_AA64ISAR0_SHA2_VAL +#define ID_AA64ISAR0_SHA2_VAL ID_AA64ISAR0_SHA2 +#endif + +void OPENSSL_cpuid_setup(void) { + uint64_t id_aa64isar0 = READ_SPECIALREG(id_aa64isar0_el1); + + OPENSSL_armcap_P |= ARMV7_NEON; + + if (ID_AA64ISAR0_AES_VAL(id_aa64isar0) >= ID_AA64ISAR0_AES_BASE) { + OPENSSL_armcap_P |= ARMV8_AES; + } + if (ID_AA64ISAR0_AES_VAL(id_aa64isar0) >= ID_AA64ISAR0_AES_PMULL) { + OPENSSL_armcap_P |= ARMV8_PMULL; + } + if (ID_AA64ISAR0_SHA1_VAL(id_aa64isar0) >= ID_AA64ISAR0_SHA1_BASE) { + OPENSSL_armcap_P |= ARMV8_SHA1; + } + if (ID_AA64ISAR0_SHA2_VAL(id_aa64isar0) >= ID_AA64ISAR0_SHA2_BASE) { + OPENSSL_armcap_P |= ARMV8_SHA256; + } + if (ID_AA64ISAR0_SHA2_VAL(id_aa64isar0) >= ID_AA64ISAR0_SHA2_512) { + OPENSSL_armcap_P |= ARMV8_SHA512; + } +} + +#endif // OPENSSL_AARCH64 && OPENSSL_FREEBSD && !OPENSSL_STATIC_ARMCAP diff --git a/third_party/boringssl/src/crypto/cpu_arm_freebsd.c b/third_party/boringssl/src/crypto/cpu_arm_freebsd.c new file mode 100644 index 000000000000..dcc792055c18 --- /dev/null +++ b/third_party/boringssl/src/crypto/cpu_arm_freebsd.c @@ -0,0 +1,55 @@ +/* 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 "internal.h" + +#if defined(OPENSSL_ARM) && defined(OPENSSL_FREEBSD) && \ + !defined(OPENSSL_STATIC_ARMCAP) +#include +#include + +#include +#include + +extern uint32_t OPENSSL_armcap_P; + +void OPENSSL_cpuid_setup(void) { + unsigned long hwcap = 0, hwcap2 = 0; + + // |elf_aux_info| may fail, in which case |hwcap| and |hwcap2| will be + // left at zero. The rest of this function will then gracefully report + // the features are absent. + elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap)); + elf_aux_info(AT_HWCAP2, &hwcap2, sizeof(hwcap2)); + + // Matching OpenSSL, only report other features if NEON is present. + if (hwcap & HWCAP_NEON) { + OPENSSL_armcap_P |= ARMV7_NEON; + + if (hwcap2 & HWCAP2_AES) { + OPENSSL_armcap_P |= ARMV8_AES; + } + if (hwcap2 & HWCAP2_PMULL) { + OPENSSL_armcap_P |= ARMV8_PMULL; + } + if (hwcap2 & HWCAP2_SHA1) { + OPENSSL_armcap_P |= ARMV8_SHA1; + } + if (hwcap2 & HWCAP2_SHA2) { + OPENSSL_armcap_P |= ARMV8_SHA256; + } + } +} + +#endif // OPENSSL_ARM && OPENSSL_OPENBSD && !OPENSSL_STATIC_ARMCAP diff --git a/third_party/boringssl/src/crypto/cpu_arm_linux.c b/third_party/boringssl/src/crypto/cpu_arm_linux.c index 67e6a1bae554..d13ac215c4df 100644 --- a/third_party/boringssl/src/crypto/cpu_arm_linux.c +++ b/third_party/boringssl/src/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,41 +95,14 @@ 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_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"); @@ -158,37 +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); - } - - // 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. + unsigned long hwcap = getauxval(AT_HWCAP); if (hwcap & HWCAP_NEON) { OPENSSL_armcap_P |= ARMV7_NEON; @@ -197,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; @@ -223,7 +143,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/third_party/boringssl/src/crypto/cpu_arm_linux.h b/third_party/boringssl/src/crypto/cpu_arm_linux.h index e326285f3273..895099787439 100644 --- a/third_party/boringssl/src/crypto/cpu_arm_linux.h +++ b/third_party/boringssl/src/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( @@ -183,16 +155,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/third_party/boringssl/src/crypto/cpu_arm_linux_test.cc b/third_party/boringssl/src/crypto/cpu_arm_linux_test.cc index 019b579051da..0b6b02fbe4d1 100644 --- a/third_party/boringssl/src/crypto/cpu_arm_linux_test.cc +++ b/third_party/boringssl/src/crypto/cpu_arm_linux_test.cc @@ -22,55 +22,8 @@ TEST(ARMLinuxTest, CPUInfo) { struct CPUInfoTest { 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" @@ -97,30 +50,7 @@ TEST(ARMLinuxTest, CPUInfo) { "Hardware : QCT APQ8064 MAKO\n" "Revision : 000b\n" "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) { @@ -163,77 +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, - 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). { "Features : aes pmull sha1 sha2\n" "CPU architecture: 8\n", - HWCAP_NEON, HWCAP2_AES | HWCAP2_PMULL | HWCAP2_SHA1 | HWCAP2_SHA2, - false, }, // Various combinations of ARMv8 flags. { "Features : aes sha1 sha2\n" "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, }, }; 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)); - EXPECT_EQ(t.broken_neon ? 1 : 0, crypto_cpuinfo_has_broken_neon(&sp)); } } diff --git a/third_party/boringssl/src/crypto/crypto.c b/third_party/boringssl/src/crypto/crypto.c index 428c973d7937..9e2ea95fdebc 100644 --- a/third_party/boringssl/src/crypto/crypto.c +++ b/third_party/boringssl/src/crypto/crypto.c @@ -14,18 +14,21 @@ #include +#include + #include "fipsmodule/rand/fork_detect.h" #include "fipsmodule/rand/internal.h" #include "internal.h" +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 @@ -36,8 +39,7 @@ #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 @@ -76,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/third_party/boringssl/src/crypto/crypto_test.cc b/third_party/boringssl/src/crypto/crypto_test.cc index caccba53a03c..4543d5c10650 100644 --- a/third_party/boringssl/src/crypto/crypto_test.cc +++ b/third_party/boringssl/src/crypto/crypto_test.cc @@ -158,3 +158,12 @@ TEST(Crypto, OnDemandIntegrityTest) { BORINGSSL_integrity_test(); } #endif + +OPENSSL_DEPRECATED static void DeprecatedFunction() {} + +OPENSSL_BEGIN_ALLOW_DEPRECATED +TEST(CryptoTest, DeprecatedFunction) { + // This is deprecated, but should not trigger any warnings. + DeprecatedFunction(); +} +OPENSSL_END_ALLOW_DEPRECATED diff --git a/third_party/boringssl/src/crypto/curve25519/asm/x25519-asm-arm.S b/third_party/boringssl/src/crypto/curve25519/asm/x25519-asm-arm.S index 41bc0c6e8628..ab84c104be6f 100644 --- a/third_party/boringssl/src/crypto/curve25519/asm/x25519-asm-arm.S +++ b/third_party/boringssl/src/crypto/curve25519/asm/x25519-asm-arm.S @@ -23,7 +23,7 @@ #endif #endif -#if !defined(OPENSSL_NO_ASM) && defined(__arm__) && !defined(__APPLE__) +#if !defined(OPENSSL_NO_ASM) && defined(__ARMEL__) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include @@ -2129,7 +2129,7 @@ mov sp,r12 vpop {q4,q5,q6,q7} bx lr -#endif /* !OPENSSL_NO_ASM && __arm__ && !__APPLE__ */ +#endif /* !OPENSSL_NO_ASM && __ARMEL__ && __ELF__ */ #if defined(__ELF__) .section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/src/crypto/curve25519/curve25519.c b/third_party/boringssl/src/crypto/curve25519/curve25519.c index 17740b83eafa..c0289ffe781f 100644 --- a/third_party/boringssl/src/crypto/curve25519/curve25519.c +++ b/third_party/boringssl/src/crypto/curve25519/curve25519.c @@ -35,15 +35,13 @@ // Various pre-computed constants. #include "./curve25519_tables.h" -#if defined(OPENSSL_NO_ASM) -#define FIAT_25519_NO_ASM -#endif - -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(BORINGSSL_HAS_UINT128) #include "../../third_party/fiat/curve25519_64.h" +#elif defined(OPENSSL_64_BIT) +#include "../../third_party/fiat/curve25519_64_msvc.h" #else #include "../../third_party/fiat/curve25519_32.h" -#endif // BORINGSSL_CURVE25519_64BIT +#endif // Low-level intrinsic operations @@ -68,7 +66,7 @@ static uint64_t load_4(const uint8_t *in) { // Field operations. -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) typedef uint64_t fe_limb_t; #define FE_NUM_LIMBS 5 @@ -148,7 +146,7 @@ typedef uint32_t fe_limb_t; } \ } while (0) -#endif // BORINGSSL_CURVE25519_64BIT +#endif // OPENSSL_64_BIT static_assert(sizeof(fe) == sizeof(fe_limb_t) * FE_NUM_LIMBS, "fe_limb_t[FE_NUM_LIMBS] is inconsistent with fe"); diff --git a/third_party/boringssl/src/crypto/curve25519/curve25519_tables.h b/third_party/boringssl/src/crypto/curve25519/curve25519_tables.h index 310581cf3bb9..ad1f036a44c4 100644 --- a/third_party/boringssl/src/crypto/curve25519/curve25519_tables.h +++ b/third_party/boringssl/src/crypto/curve25519/curve25519_tables.h @@ -17,7 +17,7 @@ static const fe d = {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 929955233495203, 466365720129213, 1662059464998953, 2033849074728123, 1442794654840575 #else @@ -27,7 +27,7 @@ static const fe d = {{ }}; static const fe sqrtm1 = {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1718705420411056, 234908883556509, 2233514472574048, 2117202627021982, 765476049583133 #else @@ -37,7 +37,7 @@ static const fe sqrtm1 = {{ }}; static const fe d2 = {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1859910466990425, 932731440258426, 1072319116312658, 1815898335770999, 633789495995903 #else @@ -146,7 +146,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1288382639258501, 245678601348599, 269427782077623, 1462984067271730, 137412439391563 #else @@ -155,7 +155,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 62697248952638, 204681361388450, 631292143396476, 338455783676468, 1213667448819585 #else @@ -164,7 +164,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 301289933810280, 1259582250014073, 1422107436869536, 796239922652654, 1953934009299142 #else @@ -175,7 +175,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1380971894829527, 790832306631236, 2067202295274102, 1995808275510000, 1566530869037010 #else @@ -184,7 +184,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 463307831301544, 432984605774163, 1610641361907204, 750899048855000, 1894842303421586 #else @@ -193,7 +193,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 748439484463711, 1033211726465151, 1396005112841647, 1611506220286469, 1972177495910992 #else @@ -204,7 +204,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1601611775252272, 1720807796594148, 1132070835939856, 1260455018889551, 2147779492816911 #else @@ -213,7 +213,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 316559037616741, 2177824224946892, 1459442586438991, 1461528397712656, 751590696113597 #else @@ -222,7 +222,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1850748884277385, 1200145853858453, 1068094770532492, 672251375690438, 1586055907191707 #else @@ -233,7 +233,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 934282339813791, 1846903124198670, 1172395437954843, 1007037127761661, 1830588347719256 #else @@ -242,7 +242,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1694390458783935, 1735906047636159, 705069562067493, 648033061693059, 696214010414170 #else @@ -251,7 +251,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1121406372216585, 192876649532226, 190294192191717, 1994165897297032, 2245000007398739 #else @@ -262,7 +262,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 769950342298419, 132954430919746, 844085933195555, 974092374476333, 726076285546016 #else @@ -271,7 +271,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 425251763115706, 608463272472562, 442562545713235, 837766094556764, 374555092627893 #else @@ -280,7 +280,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1086255230780037, 274979815921559, 1960002765731872, 929474102396301, 1190409889297339 #else @@ -291,7 +291,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1388594989461809, 316767091099457, 394298842192982, 1230079486801005, 1440737038838979 #else @@ -300,7 +300,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 7380825640100, 146210432690483, 304903576448906, 1198869323871120, 997689833219095 #else @@ -309,7 +309,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1181317918772081, 114573476638901, 262805072233344, 265712217171332, 294181933805782 #else @@ -320,7 +320,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 665000864555967, 2065379846933859, 370231110385876, 350988370788628, 1233371373142985 #else @@ -329,7 +329,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2019367628972465, 676711900706637, 110710997811333, 1108646842542025, 517791959672113 #else @@ -338,7 +338,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 965130719900578, 247011430587952, 526356006571389, 91986625355052, 2157223321444601 #else @@ -349,7 +349,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2068619540119183, 1966274918058806, 957728544705549, 729906502578991, 159834893065166 #else @@ -358,7 +358,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2073601412052185, 31021124762708, 264500969797082, 248034690651703, 1030252227928288 #else @@ -367,7 +367,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 551790716293402, 1989538725166328, 801169423371717, 2052451893578887, 678432056995012 #else @@ -380,7 +380,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1368953770187805, 790347636712921, 437508475667162, 2142576377050580, 1932081720066286 #else @@ -389,7 +389,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 953638594433374, 1092333936795051, 1419774766716690, 805677984380077, 859228993502513 #else @@ -398,7 +398,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1200766035879111, 20142053207432, 1465634435977050, 1645256912097844, 295121984874596 #else @@ -409,7 +409,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1735718747031557, 1248237894295956, 1204753118328107, 976066523550493, 65943769534592 #else @@ -418,7 +418,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1060098822528990, 1586825862073490, 212301317240126, 1975302711403555, 666724059764335 #else @@ -427,7 +427,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1091990273418756, 1572899409348578, 80968014455247, 306009358661350, 1520450739132526 #else @@ -438,7 +438,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1480517209436112, 1511153322193952, 1244343858991172, 304788150493241, 369136856496443 #else @@ -447,7 +447,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2151330273626164, 762045184746182, 1688074332551515, 823046109005759, 907602769079491 #else @@ -456,7 +456,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2047386910586836, 168470092900250, 1552838872594810, 340951180073789, 360819374702533 #else @@ -467,7 +467,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1982622644432056, 2014393600336956, 128909208804214, 1617792623929191, 105294281913815 #else @@ -476,7 +476,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 980234343912898, 1712256739246056, 588935272190264, 204298813091998, 841798321043288 #else @@ -485,7 +485,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 197561292938973, 454817274782871, 1963754960082318, 2113372252160468, 971377527342673 #else @@ -496,7 +496,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 164699448829328, 3127451757672, 1199504971548753, 1766155447043652, 1899238924683527 #else @@ -505,7 +505,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 732262946680281, 1674412764227063, 2182456405662809, 1350894754474250, 558458873295247 #else @@ -514,7 +514,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2103305098582922, 1960809151316468, 715134605001343, 1454892949167181, 40827143824949 #else @@ -525,7 +525,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1239289043050212, 1744654158124578, 758702410031698, 1796762995074688, 1603056663766 #else @@ -534,7 +534,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2232056027107988, 987343914584615, 2115594492994461, 1819598072792159, 1119305654014850 #else @@ -543,7 +543,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 320153677847348, 939613871605645, 641883205761567, 1930009789398224, 329165806634126 #else @@ -554,7 +554,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 980930490474130, 1242488692177893, 1251446316964684, 1086618677993530, 1961430968465772 #else @@ -563,7 +563,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 276821765317453, 1536835591188030, 1305212741412361, 61473904210175, 2051377036983058 #else @@ -572,7 +572,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 833449923882501, 1750270368490475, 1123347002068295, 185477424765687, 278090826653186 #else @@ -583,7 +583,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 794524995833413, 1849907304548286, 53348672473145, 1272368559505217, 1147304168324779 #else @@ -592,7 +592,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1504846112759364, 1203096289004681, 562139421471418, 274333017451844, 1284344053775441 #else @@ -601,7 +601,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 483048732424432, 2116063063343382, 30120189902313, 292451576741007, 1156379271702225 #else @@ -614,7 +614,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 928372153029038, 2147692869914564, 1455665844462196, 1986737809425946, 185207050258089 #else @@ -623,7 +623,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 137732961814206, 706670923917341, 1387038086865771, 1965643813686352, 1384777115696347 #else @@ -632,7 +632,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 481144981981577, 2053319313589856, 2065402289827512, 617954271490316, 1106602634668125 #else @@ -643,7 +643,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 696298019648792, 893299659040895, 1148636718636009, 26734077349617, 2203955659340681 #else @@ -652,7 +652,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 657390353372855, 998499966885562, 991893336905797, 810470207106761, 343139804608786 #else @@ -661,7 +661,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 791736669492960, 934767652997115, 824656780392914, 1759463253018643, 361530362383518 #else @@ -672,7 +672,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2022541353055597, 2094700262587466, 1551008075025686, 242785517418164, 695985404963562 #else @@ -681,7 +681,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1287487199965223, 2215311941380308, 1552928390931986, 1664859529680196, 1125004975265243 #else @@ -690,7 +690,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 677434665154918, 989582503122485, 1817429540898386, 1052904935475344, 1143826298169798 #else @@ -701,7 +701,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 367266328308408, 318431188922404, 695629353755355, 634085657580832, 24581612564426 #else @@ -710,7 +710,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 773360688841258, 1815381330538070, 363773437667376, 539629987070205, 783280434248437 #else @@ -719,7 +719,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 180820816194166, 168937968377394, 748416242794470, 1227281252254508, 1567587861004268 #else @@ -730,7 +730,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 478775558583645, 2062896624554807, 699391259285399, 358099408427873, 1277310261461761 #else @@ -739,7 +739,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1984740906540026, 1079164179400229, 1056021349262661, 1659958556483663, 1088529069025527 #else @@ -748,7 +748,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 580736401511151, 1842931091388998, 1177201471228238, 2075460256527244, 1301133425678027 #else @@ -759,7 +759,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1515728832059182, 1575261009617579, 1510246567196186, 191078022609704, 116661716289141 #else @@ -768,7 +768,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1295295738269652, 1714742313707026, 545583042462581, 2034411676262552, 1513248090013606 #else @@ -777,7 +777,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 230710545179830, 30821514358353, 760704303452229, 390668103790604, 573437871383156 #else @@ -788,7 +788,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1169380107545646, 263167233745614, 2022901299054448, 819900753251120, 2023898464874585 #else @@ -797,7 +797,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2102254323485823, 1570832666216754, 34696906544624, 1993213739807337, 70638552271463 #else @@ -806,7 +806,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 894132856735058, 548675863558441, 845349339503395, 1942269668326667, 1615682209874691 #else @@ -817,7 +817,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1287670217537834, 1222355136884920, 1846481788678694, 1150426571265110, 1613523400722047 #else @@ -826,7 +826,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 793388516527298, 1315457083650035, 1972286999342417, 1901825953052455, 338269477222410 #else @@ -835,7 +835,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 550201530671806, 778605267108140, 2063911101902983, 115500557286349, 2041641272971022 #else @@ -848,7 +848,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 717255318455100, 519313764361315, 2080406977303708, 541981206705521, 774328150311600 #else @@ -857,7 +857,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 261715221532238, 1795354330069993, 1496878026850283, 499739720521052, 389031152673770 #else @@ -866,7 +866,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1997217696294013, 1717306351628065, 1684313917746180, 1644426076011410, 1857378133465451 #else @@ -877,7 +877,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1475434724792648, 76931896285979, 1116729029771667, 2002544139318042, 725547833803938 #else @@ -886,7 +886,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2022306639183567, 726296063571875, 315345054448644, 1058733329149221, 1448201136060677 #else @@ -895,7 +895,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1710065158525665, 1895094923036397, 123988286168546, 1145519900776355, 1607510767693874 #else @@ -906,7 +906,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 561605375422540, 1071733543815037, 131496498800990, 1946868434569999, 828138133964203 #else @@ -915,7 +915,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1548495173745801, 442310529226540, 998072547000384, 553054358385281, 644824326376171 #else @@ -924,7 +924,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1445526537029440, 2225519789662536, 914628859347385, 1064754194555068, 1660295614401091 #else @@ -935,7 +935,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1199690223111956, 24028135822341, 66638289244341, 57626156285975, 565093967979607 #else @@ -944,7 +944,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 876926774220824, 554618976488214, 1012056309841565, 839961821554611, 1414499340307677 #else @@ -953,7 +953,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 703047626104145, 1266841406201770, 165556500219173, 486991595001879, 1011325891650656 #else @@ -964,7 +964,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1622861044480487, 1156394801573634, 1869132565415504, 327103985777730, 2095342781472284 #else @@ -973,7 +973,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 334886927423922, 489511099221528, 129160865966726, 1720809113143481, 619700195649254 #else @@ -982,7 +982,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1646545795166119, 1758370782583567, 714746174550637, 1472693650165135, 898994790308209 #else @@ -993,7 +993,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 333403773039279, 295772542452938, 1693106465353610, 912330357530760, 471235657950362 #else @@ -1002,7 +1002,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1811196219982022, 1068969825533602, 289602974833439, 1988956043611592, 863562343398367 #else @@ -1011,7 +1011,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 906282429780072, 2108672665779781, 432396390473936, 150625823801893, 1708930497638539 #else @@ -1022,7 +1022,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 925664675702328, 21416848568684, 1831436641861340, 601157008940113, 371818055044496 #else @@ -1031,7 +1031,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1479786007267725, 1738881859066675, 68646196476567, 2146507056100328, 1247662817535471 #else @@ -1040,7 +1040,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 52035296774456, 939969390708103, 312023458773250, 59873523517659, 1231345905848899 #else @@ -1051,7 +1051,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 643355106415761, 290186807495774, 2013561737429023, 319648069511546, 393736678496162 #else @@ -1060,7 +1060,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 129358342392716, 1932811617704777, 1176749390799681, 398040349861790, 1170779668090425 #else @@ -1069,7 +1069,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2051980782668029, 121859921510665, 2048329875753063, 1235229850149665, 519062146124755 #else @@ -1082,7 +1082,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1608170971973096, 415809060360428, 1350468408164766, 2038620059057678, 1026904485989112 #else @@ -1091,7 +1091,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1837656083115103, 1510134048812070, 906263674192061, 1821064197805734, 565375124676301 #else @@ -1100,7 +1100,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 578027192365650, 2034800251375322, 2128954087207123, 478816193810521, 2196171989962750 #else @@ -1111,7 +1111,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1633188840273139, 852787172373708, 1548762607215796, 1266275218902681, 1107218203325133 #else @@ -1120,7 +1120,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 462189358480054, 1784816734159228, 1611334301651368, 1303938263943540, 707589560319424 #else @@ -1129,7 +1129,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1038829280972848, 38176604650029, 753193246598573, 1136076426528122, 595709990562434 #else @@ -1140,7 +1140,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1408451820859834, 2194984964010833, 2198361797561729, 1061962440055713, 1645147963442934 #else @@ -1149,7 +1149,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 4701053362120, 1647641066302348, 1047553002242085, 1923635013395977, 206970314902065 #else @@ -1158,7 +1158,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1750479161778571, 1362553355169293, 1891721260220598, 966109370862782, 1024913988299801 #else @@ -1169,7 +1169,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 212699049131723, 1117950018299775, 1873945661751056, 1403802921984058, 130896082652698 #else @@ -1178,7 +1178,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 636808533673210, 1262201711667560, 390951380330599, 1663420692697294, 561951321757406 #else @@ -1187,7 +1187,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 520731594438141, 1446301499955692, 273753264629267, 1565101517999256, 1019411827004672 #else @@ -1198,7 +1198,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 926527492029409, 1191853477411379, 734233225181171, 184038887541270, 1790426146325343 #else @@ -1207,7 +1207,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1464651961852572, 1483737295721717, 1519450561335517, 1161429831763785, 405914998179977 #else @@ -1216,7 +1216,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 996126634382301, 796204125879525, 127517800546509, 344155944689303, 615279846169038 #else @@ -1227,7 +1227,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 738724080975276, 2188666632415296, 1961313708559162, 1506545807547587, 1151301638969740 #else @@ -1236,7 +1236,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 622917337413835, 1218989177089035, 1284857712846592, 970502061709359, 351025208117090 #else @@ -1245,7 +1245,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2067814584765580, 1677855129927492, 2086109782475197, 235286517313238, 1416314046739645 #else @@ -1256,7 +1256,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 586844262630358, 307444381952195, 458399356043426, 602068024507062, 1028548203415243 #else @@ -1265,7 +1265,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 678489922928203, 2016657584724032, 90977383049628, 1026831907234582, 615271492942522 #else @@ -1274,7 +1274,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 301225714012278, 1094837270268560, 1202288391010439, 644352775178361, 1647055902137983 #else @@ -1285,7 +1285,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1210746697896478, 1416608304244708, 686487477217856, 1245131191434135, 1051238336855737 #else @@ -1294,7 +1294,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1135604073198207, 1683322080485474, 769147804376683, 2086688130589414, 900445683120379 #else @@ -1303,7 +1303,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1971518477615628, 401909519527336, 448627091057375, 1409486868273821, 1214789035034363 #else @@ -1316,7 +1316,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1364039144731711, 1897497433586190, 2203097701135459, 145461396811251, 1349844460790699 #else @@ -1325,7 +1325,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1045230323257973, 818206601145807, 630513189076103, 1672046528998132, 807204017562437 #else @@ -1334,7 +1334,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 439961968385997, 386362664488986, 1382706320807688, 309894000125359, 2207801346498567 #else @@ -1345,7 +1345,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1229004686397588, 920643968530863, 123975893911178, 681423993215777, 1400559197080973 #else @@ -1354,7 +1354,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2003766096898049, 170074059235165, 1141124258967971, 1485419893480973, 1573762821028725 #else @@ -1363,7 +1363,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 729905708611432, 1270323270673202, 123353058984288, 426460209632942, 2195574535456672 #else @@ -1374,7 +1374,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1271140255321235, 2044363183174497, 52125387634689, 1445120246694705, 942541986339084 #else @@ -1383,7 +1383,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1761608437466135, 583360847526804, 1586706389685493, 2157056599579261, 1170692369685772 #else @@ -1392,7 +1392,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 871476219910823, 1878769545097794, 2241832391238412, 548957640601001, 690047440233174 #else @@ -1403,7 +1403,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 297194732135507, 1366347803776820, 1301185512245601, 561849853336294, 1533554921345731 #else @@ -1412,7 +1412,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 999628998628371, 1132836708493400, 2084741674517453, 469343353015612, 678782988708035 #else @@ -1421,7 +1421,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2189427607417022, 699801937082607, 412764402319267, 1478091893643349, 2244675696854460 #else @@ -1432,7 +1432,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1712292055966563, 204413590624874, 1405738637332841, 408981300829763, 861082219276721 #else @@ -1441,7 +1441,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 508561155940631, 966928475686665, 2236717801150132, 424543858577297, 2089272956986143 #else @@ -1450,7 +1450,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 221245220129925, 1156020201681217, 491145634799213, 542422431960839, 828100817819207 #else @@ -1461,7 +1461,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 153756971240384, 1299874139923977, 393099165260502, 1058234455773022, 996989038681183 #else @@ -1470,7 +1470,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 559086812798481, 573177704212711, 1629737083816402, 1399819713462595, 1646954378266038 #else @@ -1479,7 +1479,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1887963056288059, 228507035730124, 1468368348640282, 930557653420194, 613513962454686 #else @@ -1490,7 +1490,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1224529808187553, 1577022856702685, 2206946542980843, 625883007765001, 279930793512158 #else @@ -1499,7 +1499,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1076287717051609, 1114455570543035, 187297059715481, 250446884292121, 1885187512550540 #else @@ -1508,7 +1508,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 902497362940219, 76749815795675, 1657927525633846, 1420238379745202, 1340321636548352 #else @@ -1519,7 +1519,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1129576631190784, 1281994010027327, 996844254743018, 257876363489249, 1150850742055018 #else @@ -1528,7 +1528,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 628740660038789, 1943038498527841, 467786347793886, 1093341428303375, 235413859513003 #else @@ -1537,7 +1537,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 237425418909360, 469614029179605, 1512389769174935, 1241726368345357, 441602891065214 #else @@ -1550,7 +1550,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1736417953058555, 726531315520508, 1833335034432527, 1629442561574747, 624418919286085 #else @@ -1559,7 +1559,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1960754663920689, 497040957888962, 1909832851283095, 1271432136996826, 2219780368020940 #else @@ -1568,7 +1568,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1537037379417136, 1358865369268262, 2130838645654099, 828733687040705, 1999987652890901 #else @@ -1579,7 +1579,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 629042105241814, 1098854999137608, 887281544569320, 1423102019874777, 7911258951561 #else @@ -1588,7 +1588,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1811562332665373, 1501882019007673, 2213763501088999, 359573079719636, 36370565049116 #else @@ -1597,7 +1597,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 218907117361280, 1209298913016966, 1944312619096112, 1130690631451061, 1342327389191701 #else @@ -1608,7 +1608,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1369976867854704, 1396479602419169, 1765656654398856, 2203659200586299, 998327836117241 #else @@ -1617,7 +1617,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2230701885562825, 1348173180338974, 2172856128624598, 1426538746123771, 444193481326151 #else @@ -1626,7 +1626,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 784210426627951, 918204562375674, 1284546780452985, 1324534636134684, 1872449409642708 #else @@ -1637,7 +1637,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 319638829540294, 596282656808406, 2037902696412608, 1557219121643918, 341938082688094 #else @@ -1646,7 +1646,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1901860206695915, 2004489122065736, 1625847061568236, 973529743399879, 2075287685312905 #else @@ -1655,7 +1655,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1371853944110545, 1042332820512553, 1949855697918254, 1791195775521505, 37487364849293 #else @@ -1666,7 +1666,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 687200189577855, 1082536651125675, 644224940871546, 340923196057951, 343581346747396 #else @@ -1675,7 +1675,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2082717129583892, 27829425539422, 145655066671970, 1690527209845512, 1865260509673478 #else @@ -1684,7 +1684,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1059729620568824, 2163709103470266, 1440302280256872, 1769143160546397, 869830310425069 #else @@ -1695,7 +1695,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1609516219779025, 777277757338817, 2101121130363987, 550762194946473, 1905542338659364 #else @@ -1704,7 +1704,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2024821921041576, 426948675450149, 595133284085473, 471860860885970, 600321679413000 #else @@ -1713,7 +1713,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 598474602406721, 1468128276358244, 1191923149557635, 1501376424093216, 1281662691293476 #else @@ -1724,7 +1724,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1721138489890707, 1264336102277790, 433064545421287, 1359988423149466, 1561871293409447 #else @@ -1733,7 +1733,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 719520245587143, 393380711632345, 132350400863381, 1543271270810729, 1819543295798660 #else @@ -1742,7 +1742,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 396397949784152, 1811354474471839, 1362679985304303, 2117033964846756, 498041172552279 #else @@ -1753,7 +1753,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1812471844975748, 1856491995543149, 126579494584102, 1036244859282620, 1975108050082550 #else @@ -1762,7 +1762,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 650623932407995, 1137551288410575, 2125223403615539, 1725658013221271, 2134892965117796 #else @@ -1771,7 +1771,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 522584000310195, 1241762481390450, 1743702789495384, 2227404127826575, 1686746002148897 #else @@ -1784,7 +1784,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 427904865186312, 1703211129693455, 1585368107547509, 1436984488744336, 761188534613978 #else @@ -1793,7 +1793,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 318101947455002, 248138407995851, 1481904195303927, 309278454311197, 1258516760217879 #else @@ -1802,7 +1802,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1275068538599310, 513726919533379, 349926553492294, 688428871968420, 1702400196000666 #else @@ -1813,7 +1813,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1061864036265233, 961611260325381, 321859632700838, 1045600629959517, 1985130202504038 #else @@ -1822,7 +1822,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1558816436882417, 1962896332636523, 1337709822062152, 1501413830776938, 294436165831932 #else @@ -1831,7 +1831,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 818359826554971, 1862173000996177, 626821592884859, 573655738872376, 1749691246745455 #else @@ -1842,7 +1842,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1988022651432119, 1082111498586040, 1834020786104821, 1454826876423687, 692929915223122 #else @@ -1851,7 +1851,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2146513703733331, 584788900394667, 464965657279958, 2183973639356127, 238371159456790 #else @@ -1860,7 +1860,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1129007025494441, 2197883144413266, 265142755578169, 971864464758890, 1983715884903702 #else @@ -1871,7 +1871,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1291366624493075, 381456718189114, 1711482489312444, 1815233647702022, 892279782992467 #else @@ -1880,7 +1880,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 444548969917454, 1452286453853356, 2113731441506810, 645188273895859, 810317625309512 #else @@ -1889,7 +1889,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2242724082797924, 1373354730327868, 1006520110883049, 2147330369940688, 1151816104883620 #else @@ -1900,7 +1900,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1745720200383796, 1911723143175317, 2056329390702074, 355227174309849, 879232794371100 #else @@ -1909,7 +1909,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 163723479936298, 115424889803150, 1156016391581227, 1894942220753364, 1970549419986329 #else @@ -1918,7 +1918,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 681981452362484, 267208874112496, 1374683991933094, 638600984916117, 646178654558546 #else @@ -1929,7 +1929,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 13378654854251, 106237307029567, 1944412051589651, 1841976767925457, 230702819835573 #else @@ -1938,7 +1938,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 260683893467075, 854060306077237, 913639551980112, 4704576840123, 280254810808712 #else @@ -1947,7 +1947,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 715374893080287, 1173334812210491, 1806524662079626, 1894596008000979, 398905715033393 #else @@ -1958,7 +1958,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 500026409727661, 1596431288195371, 1420380351989370, 985211561521489, 392444930785633 #else @@ -1967,7 +1967,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2096421546958141, 1922523000950363, 789831022876840, 427295144688779, 320923973161730 #else @@ -1976,7 +1976,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1927770723575450, 1485792977512719, 1850996108474547, 551696031508956, 2126047405475647 #else @@ -1987,7 +1987,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2112099158080148, 742570803909715, 6484558077432, 1951119898618916, 93090382703416 #else @@ -1996,7 +1996,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 383905201636970, 859946997631870, 855623867637644, 1017125780577795, 794250831877809 #else @@ -2005,7 +2005,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 77571826285752, 999304298101753, 487841111777762, 1038031143212339, 339066367948762 #else @@ -2018,7 +2018,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 674994775520533, 266035846330789, 826951213393478, 1405007746162285, 1781791018620876 #else @@ -2027,7 +2027,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1001412661522686, 348196197067298, 1666614366723946, 888424995032760, 580747687801357 #else @@ -2036,7 +2036,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1939560076207777, 1409892634407635, 552574736069277, 383854338280405, 190706709864139 #else @@ -2047,7 +2047,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2177087163428741, 1439255351721944, 1208070840382793, 2230616362004769, 1396886392021913 #else @@ -2056,7 +2056,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 676962063230039, 1880275537148808, 2046721011602706, 888463247083003, 1318301552024067 #else @@ -2065,7 +2065,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1466980508178206, 617045217998949, 652303580573628, 757303753529064, 207583137376902 #else @@ -2076,7 +2076,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1511056752906902, 105403126891277, 493434892772846, 1091943425335976, 1802717338077427 #else @@ -2085,7 +2085,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1853982405405128, 1878664056251147, 1528011020803992, 1019626468153565, 1128438412189035 #else @@ -2094,7 +2094,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1963939888391106, 293456433791664, 697897559513649, 985882796904380, 796244541237972 #else @@ -2105,7 +2105,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 416770998629779, 389655552427054, 1314476859406756, 1749382513022778, 1161905598739491 #else @@ -2114,7 +2114,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1428358296490651, 1027115282420478, 304840698058337, 441410174026628, 1819358356278573 #else @@ -2123,7 +2123,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 204943430200135, 1554861433819175, 216426658514651, 264149070665950, 2047097371738319 #else @@ -2134,7 +2134,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1934415182909034, 1393285083565062, 516409331772960, 1157690734993892, 121039666594268 #else @@ -2143,7 +2143,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 662035583584445, 286736105093098, 1131773000510616, 818494214211439, 472943792054479 #else @@ -2152,7 +2152,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 665784778135882, 1893179629898606, 808313193813106, 276797254706413, 1563426179676396 #else @@ -2163,7 +2163,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 945205108984232, 526277562959295, 1324180513733566, 1666970227868664, 153547609289173 #else @@ -2172,7 +2172,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2031433403516252, 203996615228162, 170487168837083, 981513604791390, 843573964916831 #else @@ -2181,7 +2181,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1476570093962618, 838514669399805, 1857930577281364, 2017007352225784, 317085545220047 #else @@ -2192,7 +2192,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1461557121912842, 1600674043318359, 2157134900399597, 1670641601940616, 127765583803283 #else @@ -2201,7 +2201,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1293543509393474, 2143624609202546, 1058361566797508, 214097127393994, 946888515472729 #else @@ -2210,7 +2210,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 357067959932916, 1290876214345711, 521245575443703, 1494975468601005, 800942377643885 #else @@ -2221,7 +2221,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 566116659100033, 820247422481740, 994464017954148, 327157611686365, 92591318111744 #else @@ -2230,7 +2230,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 617256647603209, 1652107761099439, 1857213046645471, 1085597175214970, 817432759830522 #else @@ -2239,7 +2239,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 771808161440705, 1323510426395069, 680497615846440, 851580615547985, 1320806384849017 #else @@ -2252,7 +2252,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1219260086131915, 647169006596815, 79601124759706, 2161724213426748, 404861897060198 #else @@ -2261,7 +2261,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1327968293887866, 1335500852943256, 1401587164534264, 558137311952440, 1551360549268902 #else @@ -2270,7 +2270,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 417621685193956, 1429953819744454, 396157358457099, 1940470778873255, 214000046234152 #else @@ -2281,7 +2281,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1268047918491973, 2172375426948536, 1533916099229249, 1761293575457130, 1590622667026765 #else @@ -2290,7 +2290,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1627072914981959, 2211603081280073, 1912369601616504, 1191770436221309, 2187309757525860 #else @@ -2299,7 +2299,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1149147819689533, 378692712667677, 828475842424202, 2218619146419342, 70688125792186 #else @@ -2310,7 +2310,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1299739417079761, 1438616663452759, 1536729078504412, 2053896748919838, 1008421032591246 #else @@ -2319,7 +2319,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2040723824657366, 399555637875075, 632543375452995, 872649937008051, 1235394727030233 #else @@ -2328,7 +2328,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2211311599327900, 2139787259888175, 938706616835350, 12609661139114, 2081897930719789 #else @@ -2339,7 +2339,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1324994503390450, 336982330582631, 1183998925654177, 1091654665913274, 48727673971319 #else @@ -2348,7 +2348,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1845522914617879, 1222198248335542, 150841072760134, 1927029069940982, 1189913404498011 #else @@ -2357,7 +2357,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1079559557592645, 2215338383666441, 1903569501302605, 49033973033940, 305703433934152 #else @@ -2368,7 +2368,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 94653405416909, 1386121349852999, 1062130477891762, 36553947479274, 833669648948846 #else @@ -2377,7 +2377,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1432015813136298, 440364795295369, 1395647062821501, 1976874522764578, 934452372723352 #else @@ -2386,7 +2386,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1296625309219774, 2068273464883862, 1858621048097805, 1492281814208508, 2235868981918946 #else @@ -2397,7 +2397,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1490330266465570, 1858795661361448, 1436241134969763, 294573218899647, 1208140011028933 #else @@ -2406,7 +2406,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1282462923712748, 741885683986255, 2027754642827561, 518989529541027, 1826610009555945 #else @@ -2415,7 +2415,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1525827120027511, 723686461809551, 1597702369236987, 244802101764964, 1502833890372311 #else @@ -2426,7 +2426,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 113622036244513, 1233740067745854, 674109952278496, 2114345180342965, 166764512856263 #else @@ -2435,7 +2435,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2041668749310338, 2184405322203901, 1633400637611036, 2110682505536899, 2048144390084644 #else @@ -2444,7 +2444,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 503058759232932, 760293024620937, 2027152777219493, 666858468148475, 1539184379870952 #else @@ -2455,7 +2455,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1916168475367211, 915626432541343, 883217071712575, 363427871374304, 1976029821251593 #else @@ -2464,7 +2464,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 678039535434506, 570587290189340, 1605302676614120, 2147762562875701, 1706063797091704 #else @@ -2473,7 +2473,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1439489648586438, 2194580753290951, 832380563557396, 561521973970522, 584497280718389 #else @@ -2486,7 +2486,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 187989455492609, 681223515948275, 1933493571072456, 1872921007304880, 488162364135671 #else @@ -2495,7 +2495,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1413466089534451, 410844090765630, 1397263346404072, 408227143123410, 1594561803147811 #else @@ -2504,7 +2504,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2102170800973153, 719462588665004, 1479649438510153, 1097529543970028, 1302363283777685 #else @@ -2515,7 +2515,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 942065717847195, 1069313679352961, 2007341951411051, 70973416446291, 1419433790163706 #else @@ -2524,7 +2524,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1146565545556377, 1661971299445212, 406681704748893, 564452436406089, 1109109865829139 #else @@ -2533,7 +2533,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2214421081775077, 1165671861210569, 1890453018796184, 3556249878661, 442116172656317 #else @@ -2544,7 +2544,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 753830546620811, 1666955059895019, 1530775289309243, 1119987029104146, 2164156153857580 #else @@ -2553,7 +2553,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 615171919212796, 1523849404854568, 854560460547503, 2067097370290715, 1765325848586042 #else @@ -2562,7 +2562,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1094538949313667, 1796592198908825, 870221004284388, 2025558921863561, 1699010892802384 #else @@ -2573,7 +2573,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1951351290725195, 1916457206844795, 198025184438026, 1909076887557595, 1938542290318919 #else @@ -2582,7 +2582,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1014323197538413, 869150639940606, 1756009942696599, 1334952557375672, 1544945379082874 #else @@ -2591,7 +2591,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 764055910920305, 1603590757375439, 146805246592357, 1843313433854297, 954279890114939 #else @@ -2602,7 +2602,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 80113526615750, 764536758732259, 1055139345100233, 469252651759390, 617897512431515 #else @@ -2611,7 +2611,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 74497112547268, 740094153192149, 1745254631717581, 727713886503130, 1283034364416928 #else @@ -2620,7 +2620,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 525892105991110, 1723776830270342, 1476444848991936, 573789489857760, 133864092632978 #else @@ -2631,7 +2631,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 542611720192581, 1986812262899321, 1162535242465837, 481498966143464, 544600533583622 #else @@ -2640,7 +2640,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 64123227344372, 1239927720647794, 1360722983445904, 222610813654661, 62429487187991 #else @@ -2649,7 +2649,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1793193323953132, 91096687857833, 70945970938921, 2158587638946380, 1537042406482111 #else @@ -2660,7 +2660,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1895854577604609, 1394895708949416, 1728548428495944, 1140864900240149, 563645333603061 #else @@ -2669,7 +2669,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 141358280486863, 91435889572504, 1087208572552643, 1829599652522921, 1193307020643647 #else @@ -2678,7 +2678,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1611230858525381, 950720175540785, 499589887488610, 2001656988495019, 88977313255908 #else @@ -2689,7 +2689,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1189080501479658, 2184348804772597, 1040818725742319, 2018318290311834, 1712060030915354 #else @@ -2698,7 +2698,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 873966876953756, 1090638350350440, 1708559325189137, 672344594801910, 1320437969700239 #else @@ -2707,7 +2707,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1508590048271766, 1131769479776094, 101550868699323, 428297785557897, 561791648661744 #else @@ -2720,7 +2720,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 756417570499462, 237882279232602, 2136263418594016, 1701968045454886, 703713185137472 #else @@ -2729,7 +2729,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1781187809325462, 1697624151492346, 1381393690939988, 175194132284669, 1483054666415238 #else @@ -2738,7 +2738,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2175517777364616, 708781536456029, 955668231122942, 1967557500069555, 2021208005604118 #else @@ -2749,7 +2749,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1115135966606887, 224217372950782, 915967306279222, 593866251291540, 561747094208006 #else @@ -2758,7 +2758,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1443163092879439, 391875531646162, 2180847134654632, 464538543018753, 1594098196837178 #else @@ -2767,7 +2767,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 850858855888869, 319436476624586, 327807784938441, 740785849558761, 17128415486016 #else @@ -2778,7 +2778,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2132756334090067, 536247820155645, 48907151276867, 608473197600695, 1261689545022784 #else @@ -2787,7 +2787,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1525176236978354, 974205476721062, 293436255662638, 148269621098039, 137961998433963 #else @@ -2796,7 +2796,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1121075518299410, 2071745529082111, 1265567917414828, 1648196578317805, 496232102750820 #else @@ -2807,7 +2807,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 122321229299801, 1022922077493685, 2001275453369484, 2017441881607947, 993205880778002 #else @@ -2816,7 +2816,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 654925550560074, 1168810995576858, 575655959430926, 905758704861388, 496774564663534 #else @@ -2825,7 +2825,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1954109525779738, 2117022646152485, 338102630417180, 1194140505732026, 107881734943492 #else @@ -2836,7 +2836,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1714785840001267, 2036500018681589, 1876380234251966, 2056717182974196, 1645855254384642 #else @@ -2845,7 +2845,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 106431476499341, 62482972120563, 1513446655109411, 807258751769522, 538491469114 #else @@ -2854,7 +2854,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2002850762893643, 1243624520538135, 1486040410574605, 2184752338181213, 378495998083531 #else @@ -2865,7 +2865,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 922510868424903, 1089502620807680, 402544072617374, 1131446598479839, 1290278588136533 #else @@ -2874,7 +2874,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1867998812076769, 715425053580701, 39968586461416, 2173068014586163, 653822651801304 #else @@ -2883,7 +2883,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 162892278589453, 182585796682149, 75093073137630, 497037941226502, 133871727117371 #else @@ -2894,7 +2894,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1914596576579670, 1608999621851578, 1987629837704609, 1519655314857977, 1819193753409464 #else @@ -2903,7 +2903,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1949315551096831, 1069003344994464, 1939165033499916, 1548227205730856, 1933767655861407 #else @@ -2912,7 +2912,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1730519386931635, 1393284965610134, 1597143735726030, 416032382447158, 1429665248828629 #else @@ -2923,7 +2923,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 360275475604565, 547835731063078, 215360904187529, 596646739879007, 332709650425085 #else @@ -2932,7 +2932,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 47602113726801, 1522314509708010, 437706261372925, 814035330438027, 335930650933545 #else @@ -2941,7 +2941,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1291597595523886, 1058020588994081, 402837842324045, 1363323695882781, 2105763393033193 #else @@ -2954,7 +2954,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 109521982566564, 1715257748585139, 1112231216891516, 2046641005101484, 134249157157013 #else @@ -2963,7 +2963,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2156991030936798, 2227544497153325, 1869050094431622, 754875860479115, 1754242344267058 #else @@ -2972,7 +2972,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1846089562873800, 98894784984326, 1412430299204844, 171351226625762, 1100604760929008 #else @@ -2983,7 +2983,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 84172382130492, 499710970700046, 425749630620778, 1762872794206857, 612842602127960 #else @@ -2992,7 +2992,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 868309334532756, 1703010512741873, 1952690008738057, 4325269926064, 2071083554962116 #else @@ -3001,7 +3001,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 523094549451158, 401938899487815, 1407690589076010, 2022387426254453, 158660516411257 #else @@ -3012,7 +3012,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 612867287630009, 448212612103814, 571629077419196, 1466796750919376, 1728478129663858 #else @@ -3021,7 +3021,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1723848973783452, 2208822520534681, 1718748322776940, 1974268454121942, 1194212502258141 #else @@ -3030,7 +3030,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1254114807944608, 977770684047110, 2010756238954993, 1783628927194099, 1525962994408256 #else @@ -3041,7 +3041,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 232464058235826, 1948628555342434, 1835348780427694, 1031609499437291, 64472106918373 #else @@ -3050,7 +3050,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 767338676040683, 754089548318405, 1523192045639075, 435746025122062, 512692508440385 #else @@ -3059,7 +3059,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1255955808701983, 1700487367990941, 1166401238800299, 1175121994891534, 1190934801395380 #else @@ -3070,7 +3070,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 349144008168292, 1337012557669162, 1475912332999108, 1321618454900458, 47611291904320 #else @@ -3079,7 +3079,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 877519947135419, 2172838026132651, 272304391224129, 1655143327559984, 886229406429814 #else @@ -3088,7 +3088,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 375806028254706, 214463229793940, 572906353144089, 572168269875638, 697556386112979 #else @@ -3099,7 +3099,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1168827102357844, 823864273033637, 2071538752104697, 788062026895924, 599578340743362 #else @@ -3108,7 +3108,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1948116082078088, 2054898304487796, 2204939184983900, 210526805152138, 786593586607626 #else @@ -3117,7 +3117,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1915320147894736, 156481169009469, 655050471180417, 592917090415421, 2165897438660879 #else @@ -3128,7 +3128,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1726336468579724, 1119932070398949, 1929199510967666, 33918788322959, 1836837863503150 #else @@ -3137,7 +3137,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 829996854845988, 217061778005138, 1686565909803640, 1346948817219846, 1723823550730181 #else @@ -3146,7 +3146,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 384301494966394, 687038900403062, 2211195391021739, 254684538421383, 1245698430589680 #else @@ -3157,7 +3157,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1247567493562688, 1978182094455847, 183871474792955, 806570235643435, 288461518067916 #else @@ -3166,7 +3166,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1449077384734201, 38285445457996, 2136537659177832, 2146493000841573, 725161151123125 #else @@ -3175,7 +3175,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1201928866368855, 800415690605445, 1703146756828343, 997278587541744, 1858284414104014 #else @@ -3188,7 +3188,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 356468809648877, 782373916933152, 1718002439402870, 1392222252219254, 663171266061951 #else @@ -3197,7 +3197,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 759628738230460, 1012693474275852, 353780233086498, 246080061387552, 2030378857679162 #else @@ -3206,7 +3206,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2040672435071076, 888593182036908, 1298443657189359, 1804780278521327, 354070726137060 #else @@ -3217,7 +3217,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1894938527423184, 1463213041477277, 474410505497651, 247294963033299, 877975941029128 #else @@ -3226,7 +3226,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 207937160991127, 12966911039119, 820997788283092, 1010440472205286, 1701372890140810 #else @@ -3235,7 +3235,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 218882774543183, 533427444716285, 1233243976733245, 435054256891319, 1509568989549904 #else @@ -3246,7 +3246,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1888838535711826, 1052177758340622, 1213553803324135, 169182009127332, 463374268115872 #else @@ -3255,7 +3255,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 299137589460312, 1594371588983567, 868058494039073, 257771590636681, 1805012993142921 #else @@ -3264,7 +3264,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1806842755664364, 2098896946025095, 1356630998422878, 1458279806348064, 347755825962072 #else @@ -3275,7 +3275,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1402334161391744, 1560083671046299, 1008585416617747, 1147797150908892, 1420416683642459 #else @@ -3284,7 +3284,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 665506704253369, 273770475169863, 799236974202630, 848328990077558, 1811448782807931 #else @@ -3293,7 +3293,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1468412523962641, 771866649897997, 1931766110147832, 799561180078482, 524837559150077 #else @@ -3304,7 +3304,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2223212657821850, 630416247363666, 2144451165500328, 816911130947791, 1024351058410032 #else @@ -3313,7 +3313,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1266603897524861, 156378408858100, 1275649024228779, 447738405888420, 253186462063095 #else @@ -3322,7 +3322,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2022215964509735, 136144366993649, 1800716593296582, 1193970603800203, 871675847064218 #else @@ -3333,7 +3333,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1862751661970328, 851596246739884, 1519315554814041, 1542798466547449, 1417975335901520 #else @@ -3342,7 +3342,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1228168094547481, 334133883362894, 587567568420081, 433612590281181, 603390400373205 #else @@ -3351,7 +3351,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 121893973206505, 1843345804916664, 1703118377384911, 497810164760654, 101150811654673 #else @@ -3362,7 +3362,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 458346255946468, 290909935619344, 1452768413850679, 550922875254215, 1537286854336538 #else @@ -3371,7 +3371,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 584322311184395, 380661238802118, 114839394528060, 655082270500073, 2111856026034852 #else @@ -3380,7 +3380,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 996965581008991, 2148998626477022, 1012273164934654, 1073876063914522, 1688031788934939 #else @@ -3391,7 +3391,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 923487018849600, 2085106799623355, 528082801620136, 1606206360876188, 735907091712524 #else @@ -3400,7 +3400,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1697697887804317, 1335343703828273, 831288615207040, 949416685250051, 288760277392022 #else @@ -3409,7 +3409,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1419122478109648, 1325574567803701, 602393874111094, 2107893372601700, 1314159682671307 #else @@ -3422,7 +3422,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2201150872731804, 2180241023425241, 97663456423163, 1633405770247824, 848945042443986 #else @@ -3431,7 +3431,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1173339555550611, 818605084277583, 47521504364289, 924108720564965, 735423405754506 #else @@ -3440,7 +3440,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 830104860549448, 1886653193241086, 1600929509383773, 1475051275443631, 286679780900937 #else @@ -3451,7 +3451,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1577111294832995, 1030899169768747, 144900916293530, 1964672592979567, 568390100955250 #else @@ -3460,7 +3460,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 278388655910247, 487143369099838, 927762205508727, 181017540174210, 1616886700741287 #else @@ -3469,7 +3469,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1191033906638969, 940823957346562, 1606870843663445, 861684761499847, 658674867251089 #else @@ -3480,7 +3480,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1875032594195546, 1427106132796197, 724736390962158, 901860512044740, 635268497268760 #else @@ -3489,7 +3489,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 622869792298357, 1903919278950367, 1922588621661629, 1520574711600434, 1087100760174640 #else @@ -3498,7 +3498,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 25465949416618, 1693639527318811, 1526153382657203, 125943137857169, 145276964043999 #else @@ -3509,7 +3509,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 214739857969358, 920212862967915, 1939901550972269, 1211862791775221, 85097515720120 #else @@ -3518,7 +3518,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2006245852772938, 734762734836159, 254642929763427, 1406213292755966, 239303749517686 #else @@ -3527,7 +3527,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1619678837192149, 1919424032779215, 1357391272956794, 1525634040073113, 1310226789796241 #else @@ -3538,7 +3538,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1040763709762123, 1704449869235352, 605263070456329, 1998838089036355, 1312142911487502 #else @@ -3547,7 +3547,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1996723311435669, 1844342766567060, 985455700466044, 1165924681400960, 311508689870129 #else @@ -3556,7 +3556,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 43173156290518, 2202883069785309, 1137787467085917, 1733636061944606, 1394992037553852 #else @@ -3567,7 +3567,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 670078326344559, 555655025059356, 471959386282438, 2141455487356409, 849015953823125 #else @@ -3576,7 +3576,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2197214573372804, 794254097241315, 1030190060513737, 267632515541902, 2040478049202624 #else @@ -3585,7 +3585,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1812516004670529, 1609256702920783, 1706897079364493, 258549904773295, 996051247540686 #else @@ -3596,7 +3596,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1540374301420584, 1764656898914615, 1810104162020396, 923808779163088, 664390074196579 #else @@ -3605,7 +3605,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1323460699404750, 1262690757880991, 871777133477900, 1060078894988977, 1712236889662886 #else @@ -3614,7 +3614,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1696163952057966, 1391710137550823, 608793846867416, 1034391509472039, 1780770894075012 #else @@ -3625,7 +3625,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1367603834210841, 2131988646583224, 890353773628144, 1908908219165595, 270836895252891 #else @@ -3634,7 +3634,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 597536315471731, 40375058742586, 1942256403956049, 1185484645495932, 312666282024145 #else @@ -3643,7 +3643,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1919411405316294, 1234508526402192, 1066863051997083, 1008444703737597, 1348810787701552 #else @@ -3656,7 +3656,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2102881477513865, 1570274565945361, 1573617900503708, 18662635732583, 2232324307922098 #else @@ -3665,7 +3665,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1853931367696942, 8107973870707, 350214504129299, 775206934582587, 1752317649166792 #else @@ -3674,7 +3674,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1417148368003523, 721357181628282, 505725498207811, 373232277872983, 261634707184480 #else @@ -3685,7 +3685,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2186733281493267, 2250694917008620, 1014829812957440, 479998161452389, 83566193876474 #else @@ -3694,7 +3694,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1268116367301224, 560157088142809, 802626839600444, 2210189936605713, 1129993785579988 #else @@ -3703,7 +3703,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 615183387352312, 917611676109240, 878893615973325, 978940963313282, 938686890583575 #else @@ -3714,7 +3714,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 522024729211672, 1045059315315808, 1892245413707790, 1907891107684253, 2059998109500714 #else @@ -3723,7 +3723,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1799679152208884, 912132775900387, 25967768040979, 432130448590461, 274568990261996 #else @@ -3732,7 +3732,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 98698809797682, 2144627600856209, 1907959298569602, 811491302610148, 1262481774981493 #else @@ -3743,7 +3743,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1791451399743152, 1713538728337276, 118349997257490, 1882306388849954, 158235232210248 #else @@ -3752,7 +3752,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1217809823321928, 2173947284933160, 1986927836272325, 1388114931125539, 12686131160169 #else @@ -3761,7 +3761,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1650875518872272, 1136263858253897, 1732115601395988, 734312880662190, 1252904681142109 #else @@ -3772,7 +3772,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 372986456113865, 525430915458171, 2116279931702135, 501422713587815, 1907002872974925 #else @@ -3781,7 +3781,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 803147181835288, 868941437997146, 316299302989663, 943495589630550, 571224287904572 #else @@ -3790,7 +3790,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 227742695588364, 1776969298667369, 628602552821802, 457210915378118, 2041906378111140 #else @@ -3801,7 +3801,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 815000523470260, 913085688728307, 1052060118271173, 1345536665214223, 541623413135555 #else @@ -3810,7 +3810,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1580216071604333, 1877997504342444, 857147161260913, 703522726778478, 2182763974211603 #else @@ -3819,7 +3819,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1870080310923419, 71988220958492, 1783225432016732, 615915287105016, 1035570475990230 #else @@ -3830,7 +3830,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 730987750830150, 857613889540280, 1083813157271766, 1002817255970169, 1719228484436074 #else @@ -3839,7 +3839,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 377616581647602, 1581980403078513, 804044118130621, 2034382823044191, 643844048472185 #else @@ -3848,7 +3848,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 176957326463017, 1573744060478586, 528642225008045, 1816109618372371, 1515140189765006 #else @@ -3859,7 +3859,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1888911448245718, 1387110895611080, 1924503794066429, 1731539523700949, 2230378382645454 #else @@ -3868,7 +3868,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 443392177002051, 233793396845137, 2199506622312416, 1011858706515937, 974676837063129 #else @@ -3877,7 +3877,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1846351103143623, 1949984838808427, 671247021915253, 1946756846184401, 1929296930380217 #else @@ -3890,7 +3890,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 849646212452002, 1410198775302919, 73767886183695, 1641663456615812, 762256272452411 #else @@ -3899,7 +3899,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 692017667358279, 723305578826727, 1638042139863265, 748219305990306, 334589200523901 #else @@ -3908,7 +3908,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 22893968530686, 2235758574399251, 1661465835630252, 925707319443452, 1203475116966621 #else @@ -3919,7 +3919,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 801299035785166, 1733292596726131, 1664508947088596, 467749120991922, 1647498584535623 #else @@ -3928,7 +3928,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 903105258014366, 427141894933047, 561187017169777, 1884330244401954, 1914145708422219 #else @@ -3937,7 +3937,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1344191060517578, 1960935031767890, 1518838929955259, 1781502350597190, 1564784025565682 #else @@ -3948,7 +3948,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 673723351748086, 1979969272514923, 1175287312495508, 1187589090978666, 1881897672213940 #else @@ -3957,7 +3957,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1917185587363432, 1098342571752737, 5935801044414, 2000527662351839, 1538640296181569 #else @@ -3966,7 +3966,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2495540013192, 678856913479236, 224998292422872, 219635787698590, 1972465269000940 #else @@ -3977,7 +3977,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 271413961212179, 1353052061471651, 344711291283483, 2014925838520662, 2006221033113941 #else @@ -3986,7 +3986,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 194583029968109, 514316781467765, 829677956235672, 1676415686873082, 810104584395840 #else @@ -3995,7 +3995,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1980510813313589, 1948645276483975, 152063780665900, 129968026417582, 256984195613935 #else @@ -4006,7 +4006,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1860190562533102, 1936576191345085, 461100292705964, 1811043097042830, 957486749306835 #else @@ -4015,7 +4015,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 796664815624365, 1543160838872951, 1500897791837765, 1667315977988401, 599303877030711 #else @@ -4024,7 +4024,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1151480509533204, 2136010406720455, 738796060240027, 319298003765044, 1150614464349587 #else @@ -4035,7 +4035,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1731069268103150, 735642447616087, 1364750481334268, 417232839982871, 927108269127661 #else @@ -4044,7 +4044,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1017222050227968, 1987716148359, 2234319589635701, 621282683093392, 2132553131763026 #else @@ -4053,7 +4053,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1567828528453324, 1017807205202360, 565295260895298, 829541698429100, 307243822276582 #else @@ -4064,7 +4064,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 249079270936248, 1501514259790706, 947909724204848, 944551802437487, 552658763982480 #else @@ -4073,7 +4073,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2089966982947227, 1854140343916181, 2151980759220007, 2139781292261749, 158070445864917 #else @@ -4082,7 +4082,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1338766321464554, 1906702607371284, 1519569445519894, 115384726262267, 1393058953390992 #else @@ -4093,7 +4093,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1364621558265400, 1512388234908357, 1926731583198686, 2041482526432505, 920401122333774 #else @@ -4102,7 +4102,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1884844597333588, 601480070269079, 620203503079537, 1079527400117915, 1202076693132015 #else @@ -4111,7 +4111,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 840922919763324, 727955812569642, 1303406629750194, 522898432152867, 294161410441865 #else @@ -4124,7 +4124,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 353760790835310, 1598361541848743, 1122905698202299, 1922533590158905, 419107700666580 #else @@ -4133,7 +4133,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 359856369838236, 180914355488683, 861726472646627, 218807937262986, 575626773232501 #else @@ -4142,7 +4142,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 755467689082474, 909202735047934, 730078068932500, 936309075711518, 2007798262842972 #else @@ -4153,7 +4153,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1609384177904073, 362745185608627, 1335318541768201, 800965770436248, 547877979267412 #else @@ -4162,7 +4162,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 984339177776787, 815727786505884, 1645154585713747, 1659074964378553, 1686601651984156 #else @@ -4171,7 +4171,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1697863093781930, 599794399429786, 1104556219769607, 830560774794755, 12812858601017 #else @@ -4182,7 +4182,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1168737550514982, 897832437380552, 463140296333799, 302564600022547, 2008360505135501 #else @@ -4191,7 +4191,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1856930662813910, 678090852002597, 1920179140755167, 1259527833759868, 55540971895511 #else @@ -4200,7 +4200,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1158643631044921, 476554103621892, 178447851439725, 1305025542653569, 103433927680625 #else @@ -4211,7 +4211,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2176793111709008, 1576725716350391, 2009350167273523, 2012390194631546, 2125297410909580 #else @@ -4220,7 +4220,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 825403285195098, 2144208587560784, 1925552004644643, 1915177840006985, 1015952128947864 #else @@ -4229,7 +4229,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1807108316634472, 1534392066433717, 347342975407218, 1153820745616376, 7375003497471 #else @@ -4240,7 +4240,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 983061001799725, 431211889901241, 2201903782961093, 817393911064341, 2214616493042167 #else @@ -4249,7 +4249,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 228567918409756, 865093958780220, 358083886450556, 159617889659320, 1360637926292598 #else @@ -4258,7 +4258,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 234147501399755, 2229469128637390, 2175289352258889, 1397401514549353, 1885288963089922 #else @@ -4269,7 +4269,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1111762412951562, 252849572507389, 1048714233823341, 146111095601446, 1237505378776770 #else @@ -4278,7 +4278,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1113790697840279, 1051167139966244, 1045930658550944, 2011366241542643, 1686166824620755 #else @@ -4287,7 +4287,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1054097349305049, 1872495070333352, 182121071220717, 1064378906787311, 100273572924182 #else @@ -4298,7 +4298,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1306410853171605, 1627717417672447, 50983221088417, 1109249951172250, 870201789081392 #else @@ -4307,7 +4307,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 104233794644221, 1548919791188248, 2224541913267306, 2054909377116478, 1043803389015153 #else @@ -4316,7 +4316,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 216762189468802, 707284285441622, 190678557969733, 973969342604308, 1403009538434867 #else @@ -4327,7 +4327,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1279024291038477, 344776835218310, 273722096017199, 1834200436811442, 634517197663804 #else @@ -4336,7 +4336,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 343805853118335, 1302216857414201, 566872543223541, 2051138939539004, 321428858384280 #else @@ -4345,7 +4345,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 470067171324852, 1618629234173951, 2000092177515639, 7307679772789, 1117521120249968 #else @@ -4358,7 +4358,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 278151578291475, 1810282338562947, 1771599529530998, 1383659409671631, 685373414471841 #else @@ -4367,7 +4367,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 577009397403102, 1791440261786291, 2177643735971638, 174546149911960, 1412505077782326 #else @@ -4376,7 +4376,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 893719721537457, 1201282458018197, 1522349501711173, 58011597740583, 1130406465887139 #else @@ -4387,7 +4387,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 412607348255453, 1280455764199780, 2233277987330768, 14180080401665, 331584698417165 #else @@ -4396,7 +4396,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 262483770854550, 990511055108216, 526885552771698, 571664396646158, 354086190278723 #else @@ -4405,7 +4405,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1820352417585487, 24495617171480, 1547899057533253, 10041836186225, 480457105094042 #else @@ -4416,7 +4416,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2023310314989233, 637905337525881, 2106474638900687, 557820711084072, 1687858215057826 #else @@ -4425,7 +4425,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1144168702609745, 604444390410187, 1544541121756138, 1925315550126027, 626401428894002 #else @@ -4434,7 +4434,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1922168257351784, 2018674099908659, 1776454117494445, 956539191509034, 36031129147635 #else @@ -4445,7 +4445,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 544644538748041, 1039872944430374, 876750409130610, 710657711326551, 1216952687484972 #else @@ -4454,7 +4454,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 58242421545916, 2035812695641843, 2118491866122923, 1191684463816273, 46921517454099 #else @@ -4463,7 +4463,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 272268252444639, 1374166457774292, 2230115177009552, 1053149803909880, 1354288411641016 #else @@ -4474,7 +4474,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1857910905368338, 1754729879288912, 885945464109877, 1516096106802166, 1602902393369811 #else @@ -4483,7 +4483,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1193437069800958, 901107149704790, 999672920611411, 477584824802207, 364239578697845 #else @@ -4492,7 +4492,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 886299989548838, 1538292895758047, 1590564179491896, 1944527126709657, 837344427345298 #else @@ -4503,7 +4503,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 754558365378305, 1712186480903618, 1703656826337531, 750310918489786, 518996040250900 #else @@ -4512,7 +4512,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1309847803895382, 1462151862813074, 211370866671570, 1544595152703681, 1027691798954090 #else @@ -4521,7 +4521,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 803217563745370, 1884799722343599, 1357706345069218, 2244955901722095, 730869460037413 #else @@ -4532,7 +4532,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 689299471295966, 1831210565161071, 1375187341585438, 1106284977546171, 1893781834054269 #else @@ -4541,7 +4541,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 696351368613042, 1494385251239250, 738037133616932, 636385507851544, 927483222611406 #else @@ -4550,7 +4550,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1949114198209333, 1104419699537997, 783495707664463, 1747473107602770, 2002634765788641 #else @@ -4561,7 +4561,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1607325776830197, 530883941415333, 1451089452727895, 1581691157083423, 496100432831154 #else @@ -4570,7 +4570,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1068900648804224, 2006891997072550, 1134049269345549, 1638760646180091, 2055396084625778 #else @@ -4579,7 +4579,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2222475519314561, 1870703901472013, 1884051508440561, 1344072275216753, 1318025677799069 #else @@ -4592,7 +4592,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 155711679280656, 681100400509288, 389811735211209, 2135723811340709, 408733211204125 #else @@ -4601,7 +4601,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 7813206966729, 194444201427550, 2071405409526507, 1065605076176312, 1645486789731291 #else @@ -4610,7 +4610,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 16625790644959, 1647648827778410, 1579910185572704, 436452271048548, 121070048451050 #else @@ -4621,7 +4621,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1037263028552531, 568385780377829, 297953104144430, 1558584511931211, 2238221839292471 #else @@ -4630,7 +4630,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 190565267697443, 672855706028058, 338796554369226, 337687268493904, 853246848691734 #else @@ -4639,7 +4639,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1763863028400139, 766498079432444, 1321118624818005, 69494294452268, 858786744165651 #else @@ -4650,7 +4650,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1292056768563024, 1456632109855638, 1100631247050184, 1386133165675321, 1232898350193752 #else @@ -4659,7 +4659,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 366253102478259, 525676242508811, 1449610995265438, 1183300845322183, 185960306491545 #else @@ -4668,7 +4668,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 28315355815982, 460422265558930, 1799675876678724, 1969256312504498, 1051823843138725 #else @@ -4679,7 +4679,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 156914999361983, 1606148405719949, 1665208410108430, 317643278692271, 1383783705665320 #else @@ -4688,7 +4688,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 54684536365732, 2210010038536222, 1194984798155308, 535239027773705, 1516355079301361 #else @@ -4697,7 +4697,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1484387703771650, 198537510937949, 2186282186359116, 617687444857508, 647477376402122 #else @@ -4708,7 +4708,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2147715541830533, 500032538445817, 646380016884826, 352227855331122, 1488268620408052 #else @@ -4717,7 +4717,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 159386186465542, 1877626593362941, 618737197060512, 1026674284330807, 1158121760792685 #else @@ -4726,7 +4726,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1744544377739822, 1964054180355661, 1685781755873170, 2169740670377448, 1286112621104591 #else @@ -4737,7 +4737,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 81977249784993, 1667943117713086, 1668983819634866, 1605016835177615, 1353960708075544 #else @@ -4746,7 +4746,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1602253788689063, 439542044889886, 2220348297664483, 657877410752869, 157451572512238 #else @@ -4755,7 +4755,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1029287186166717, 65860128430192, 525298368814832, 1491902500801986, 1461064796385400 #else @@ -4766,7 +4766,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 408216988729246, 2121095722306989, 913562102267595, 1879708920318308, 241061448436731 #else @@ -4775,7 +4775,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1185483484383269, 1356339572588553, 584932367316448, 102132779946470, 1792922621116791 #else @@ -4784,7 +4784,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1966196870701923, 2230044620318636, 1425982460745905, 261167817826569, 46517743394330 #else @@ -4795,7 +4795,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 107077591595359, 884959942172345, 27306869797400, 2224911448949390, 964352058245223 #else @@ -4804,7 +4804,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1730194207717538, 431790042319772, 1831515233279467, 1372080552768581, 1074513929381760 #else @@ -4813,7 +4813,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1450880638731607, 1019861580989005, 1229729455116861, 1174945729836143, 826083146840706 #else @@ -4826,7 +4826,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1899935429242705, 1602068751520477, 940583196550370, 82431069053859, 1540863155745696 #else @@ -4835,7 +4835,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2136688454840028, 2099509000964294, 1690800495246475, 1217643678575476, 828720645084218 #else @@ -4844,7 +4844,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 765548025667841, 462473984016099, 998061409979798, 546353034089527, 2212508972466858 #else @@ -4855,7 +4855,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 46575283771160, 892570971573071, 1281983193144090, 1491520128287375, 75847005908304 #else @@ -4864,7 +4864,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1801436127943107, 1734436817907890, 1268728090345068, 167003097070711, 2233597765834956 #else @@ -4873,7 +4873,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1997562060465113, 1048700225534011, 7615603985628, 1855310849546841, 2242557647635213 #else @@ -4884,7 +4884,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1161017320376250, 492624580169043, 2169815802355237, 976496781732542, 1770879511019629 #else @@ -4893,7 +4893,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1357044908364776, 729130645262438, 1762469072918979, 1365633616878458, 181282906404941 #else @@ -4902,7 +4902,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1080413443139865, 1155205815510486, 1848782073549786, 622566975152580, 124965574467971 #else @@ -4913,7 +4913,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1184526762066993, 247622751762817, 692129017206356, 820018689412496, 2188697339828085 #else @@ -4922,7 +4922,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2020536369003019, 202261491735136, 1053169669150884, 2056531979272544, 778165514694311 #else @@ -4931,7 +4931,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 237404399610207, 1308324858405118, 1229680749538400, 720131409105291, 1958958863624906 #else @@ -4942,7 +4942,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 515583508038846, 17656978857189, 1717918437373989, 1568052070792483, 46975803123923 #else @@ -4951,7 +4951,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 281527309158085, 36970532401524, 866906920877543, 2222282602952734, 1289598729589882 #else @@ -4960,7 +4960,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1278207464902042, 494742455008756, 1262082121427081, 1577236621659884, 1888786707293291 #else @@ -4971,7 +4971,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 353042527954210, 1830056151907359, 1111731275799225, 174960955838824, 404312815582675 #else @@ -4980,7 +4980,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2064251142068628, 1666421603389706, 1419271365315441, 468767774902855, 191535130366583 #else @@ -4989,7 +4989,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1716987058588002, 1859366439773457, 1767194234188234, 64476199777924, 1117233614485261 #else @@ -5000,7 +5000,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 984292135520292, 135138246951259, 2220652137473167, 1722843421165029, 190482558012909 #else @@ -5009,7 +5009,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 298845952651262, 1166086588952562, 1179896526238434, 1347812759398693, 1412945390096208 #else @@ -5018,7 +5018,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1143239552672925, 906436640714209, 2177000572812152, 2075299936108548, 325186347798433 #else @@ -5029,7 +5029,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 721024854374772, 684487861263316, 1373438744094159, 2193186935276995, 1387043709851261 #else @@ -5038,7 +5038,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 418098668140962, 715065997721283, 1471916138376055, 2168570337288357, 937812682637044 #else @@ -5047,7 +5047,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1043584187226485, 2143395746619356, 2209558562919611, 482427979307092, 847556718384018 #else @@ -5060,7 +5060,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1248731221520759, 1465200936117687, 540803492710140, 52978634680892, 261434490176109 #else @@ -5069,7 +5069,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1057329623869501, 620334067429122, 461700859268034, 2012481616501857, 297268569108938 #else @@ -5078,7 +5078,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1055352180870759, 1553151421852298, 1510903185371259, 1470458349428097, 1226259419062731 #else @@ -5089,7 +5089,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1492988790301668, 790326625573331, 1190107028409745, 1389394752159193, 1620408196604194 #else @@ -5098,7 +5098,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 47000654413729, 1004754424173864, 1868044813557703, 173236934059409, 588771199737015 #else @@ -5107,7 +5107,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 30498470091663, 1082245510489825, 576771653181956, 806509986132686, 1317634017056939 #else @@ -5118,7 +5118,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 420308055751555, 1493354863316002, 165206721528088, 1884845694919786, 2065456951573059 #else @@ -5127,7 +5127,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1115636332012334, 1854340990964155, 83792697369514, 1972177451994021, 457455116057587 #else @@ -5136,7 +5136,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1698968457310898, 1435137169051090, 1083661677032510, 938363267483709, 340103887207182 #else @@ -5147,7 +5147,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1995325341336574, 911500251774648, 164010755403692, 855378419194762, 1573601397528842 #else @@ -5156,7 +5156,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 241719380661528, 310028521317150, 1215881323380194, 1408214976493624, 2141142156467363 #else @@ -5165,7 +5165,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1315157046163473, 727368447885818, 1363466668108618, 1668921439990361, 1398483384337907 #else @@ -5176,7 +5176,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 75029678299646, 1015388206460473, 1849729037055212, 1939814616452984, 444404230394954 #else @@ -5185,7 +5185,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2053597130993710, 2024431685856332, 2233550957004860, 2012407275509545, 872546993104440 #else @@ -5194,7 +5194,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1217269667678610, 599909351968693, 1390077048548598, 1471879360694802, 739586172317596 #else @@ -5205,7 +5205,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1718318639380794, 1560510726633958, 904462881159922, 1418028351780052, 94404349451937 #else @@ -5214,7 +5214,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2132502667405250, 214379346175414, 1502748313768060, 1960071701057800, 1353971822643138 #else @@ -5223,7 +5223,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 319394212043702, 2127459436033571, 717646691535162, 663366796076914, 318459064945314 #else @@ -5234,7 +5234,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 405989424923593, 1960452633787083, 667349034401665, 1492674260767112, 1451061489880787 #else @@ -5243,7 +5243,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 947085906234007, 323284730494107, 1485778563977200, 728576821512394, 901584347702286 #else @@ -5252,7 +5252,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1575783124125742, 2126210792434375, 1569430791264065, 1402582372904727, 1891780248341114 #else @@ -5263,7 +5263,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 838432205560695, 1997703511451664, 1018791879907867, 1662001808174331, 78328132957753 #else @@ -5272,7 +5272,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 739152638255629, 2074935399403557, 505483666745895, 1611883356514088, 628654635394878 #else @@ -5281,7 +5281,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1822054032121349, 643057948186973, 7306757352712, 577249257962099, 284735863382083 #else @@ -5294,7 +5294,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1366558556363930, 1448606567552086, 1478881020944768, 165803179355898, 1115718458123498 #else @@ -5303,7 +5303,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 204146226972102, 1630511199034723, 2215235214174763, 174665910283542, 956127674017216 #else @@ -5312,7 +5312,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1562934578796716, 1070893489712745, 11324610642270, 958989751581897, 2172552325473805 #else @@ -5323,7 +5323,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1770564423056027, 735523631664565, 1326060113795289, 1509650369341127, 65892421582684 #else @@ -5332,7 +5332,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 623682558650637, 1337866509471512, 990313350206649, 1314236615762469, 1164772974270275 #else @@ -5341,7 +5341,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 223256821462517, 723690150104139, 1000261663630601, 933280913953265, 254872671543046 #else @@ -5352,7 +5352,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1969087237026041, 624795725447124, 1335555107635969, 2069986355593023, 1712100149341902 #else @@ -5361,7 +5361,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1236103475266979, 1837885883267218, 1026072585230455, 1025865513954973, 1801964901432134 #else @@ -5370,7 +5370,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1115241013365517, 1712251818829143, 2148864332502771, 2096001471438138, 2235017246626125 #else @@ -5381,7 +5381,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1299268198601632, 2047148477845621, 2165648650132450, 1612539282026145, 514197911628890 #else @@ -5390,7 +5390,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 118352772338543, 1067608711804704, 1434796676193498, 1683240170548391, 230866769907437 #else @@ -5399,7 +5399,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1850689576796636, 1601590730430274, 1139674615958142, 1954384401440257, 76039205311 #else @@ -5410,7 +5410,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1723387471374172, 997301467038410, 533927635123657, 20928644693965, 1756575222802513 #else @@ -5419,7 +5419,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2146711623855116, 503278928021499, 625853062251406, 1109121378393107, 1033853809911861 #else @@ -5428,7 +5428,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 571005965509422, 2005213373292546, 1016697270349626, 56607856974274, 914438579435146 #else @@ -5439,7 +5439,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1346698876211176, 2076651707527589, 1084761571110205, 265334478828406, 1068954492309671 #else @@ -5448,7 +5448,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1769967932677654, 1695893319756416, 1151863389675920, 1781042784397689, 400287774418285 #else @@ -5457,7 +5457,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1851867764003121, 403841933237558, 820549523771987, 761292590207581, 1743735048551143 #else @@ -5468,7 +5468,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 410915148140008, 2107072311871739, 1004367461876503, 99684895396761, 1180818713503224 #else @@ -5477,7 +5477,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 285945406881439, 648174397347453, 1098403762631981, 1366547441102991, 1505876883139217 #else @@ -5486,7 +5486,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 672095903120153, 1675918957959872, 636236529315028, 1569297300327696, 2164144194785875 #else @@ -5497,7 +5497,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1902708175321798, 1035343530915438, 1178560808893263, 301095684058146, 1280977479761118 #else @@ -5506,7 +5506,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1615357281742403, 404257611616381, 2160201349780978, 1160947379188955, 1578038619549541 #else @@ -5515,7 +5515,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2013087639791217, 822734930507457, 1785668418619014, 1668650702946164, 389450875221715 #else @@ -5528,7 +5528,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 453918449698368, 106406819929001, 2072540975937135, 308588860670238, 1304394580755385 #else @@ -5537,7 +5537,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1295082798350326, 2091844511495996, 1851348972587817, 3375039684596, 789440738712837 #else @@ -5546,7 +5546,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2083069137186154, 848523102004566, 993982213589257, 1405313299916317, 1532824818698468 #else @@ -5557,7 +5557,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1495961298852430, 1397203457344779, 1774950217066942, 139302743555696, 66603584342787 #else @@ -5566,7 +5566,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1782411379088302, 1096724939964781, 27593390721418, 542241850291353, 1540337798439873 #else @@ -5575,7 +5575,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 693543956581437, 171507720360750, 1557908942697227, 1074697073443438, 1104093109037196 #else @@ -5586,7 +5586,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 345288228393419, 1099643569747172, 134881908403743, 1740551994106740, 248212179299770 #else @@ -5595,7 +5595,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 231429562203065, 1526290236421172, 2021375064026423, 1520954495658041, 806337791525116 #else @@ -5604,7 +5604,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1079623667189886, 872403650198613, 766894200588288, 2163700860774109, 2023464507911816 #else @@ -5615,7 +5615,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 854645372543796, 1936406001954827, 151460662541253, 825325739271555, 1554306377287556 #else @@ -5624,7 +5624,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1497138821904622, 1044820250515590, 1742593886423484, 1237204112746837, 849047450816987 #else @@ -5633,7 +5633,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 667962773375330, 1897271816877105, 1399712621683474, 1143302161683099, 2081798441209593 #else @@ -5644,7 +5644,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 127147851567005, 1936114012888110, 1704424366552046, 856674880716312, 716603621335359 #else @@ -5653,7 +5653,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1072409664800960, 2146937497077528, 1508780108920651, 935767602384853, 1112800433544068 #else @@ -5662,7 +5662,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 333549023751292, 280219272863308, 2104176666454852, 1036466864875785, 536135186520207 #else @@ -5673,7 +5673,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 373666279883137, 146457241530109, 304116267127857, 416088749147715, 1258577131183391 #else @@ -5682,7 +5682,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1186115062588401, 2251609796968486, 1098944457878953, 1153112761201374, 1791625503417267 #else @@ -5691,7 +5691,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1870078460219737, 2129630962183380, 852283639691142, 292865602592851, 401904317342226 #else @@ -5702,7 +5702,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1361070124828035, 815664541425524, 1026798897364671, 1951790935390647, 555874891834790 #else @@ -5711,7 +5711,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1546301003424277, 459094500062839, 1097668518375311, 1780297770129643, 720763293687608 #else @@ -5720,7 +5720,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1212405311403990, 1536693382542438, 61028431067459, 1863929423417129, 1223219538638038 #else @@ -5731,7 +5731,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1294303766540260, 1183557465955093, 882271357233093, 63854569425375, 2213283684565087 #else @@ -5740,7 +5740,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 339050984211414, 601386726509773, 413735232134068, 966191255137228, 1839475899458159 #else @@ -5749,7 +5749,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 235605972169408, 2174055643032978, 1538335001838863, 1281866796917192, 1815940222628465 #else @@ -5762,7 +5762,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1632352921721536, 1833328609514701, 2092779091951987, 1923956201873226, 2210068022482919 #else @@ -5771,7 +5771,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 35271216625062, 1712350667021807, 983664255668860, 98571260373038, 1232645608559836 #else @@ -5780,7 +5780,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1998172393429622, 1798947921427073, 784387737563581, 1589352214827263, 1589861734168180 #else @@ -5791,7 +5791,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1733739258725305, 31715717059538, 201969945218860, 992093044556990, 1194308773174556 #else @@ -5800,7 +5800,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 846415389605137, 746163495539180, 829658752826080, 592067705956946, 957242537821393 #else @@ -5809,7 +5809,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1758148849754419, 619249044817679, 168089007997045, 1371497636330523, 1867101418880350 #else @@ -5820,7 +5820,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 326633984209635, 261759506071016, 1700682323676193, 1577907266349064, 1217647663383016 #else @@ -5829,7 +5829,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1714182387328607, 1477856482074168, 574895689942184, 2159118410227270, 1555532449716575 #else @@ -5838,7 +5838,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 853828206885131, 998498946036955, 1835887550391235, 207627336608048, 258363815956050 #else @@ -5849,7 +5849,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 141141474651677, 1236728744905256, 643101419899887, 1646615130509173, 1208239602291765 #else @@ -5858,7 +5858,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1501663228068911, 1354879465566912, 1444432675498247, 897812463852601, 855062598754348 #else @@ -5867,7 +5867,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 714380763546606, 1032824444965790, 1774073483745338, 1063840874947367, 1738680636537158 #else @@ -5878,7 +5878,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1640635546696252, 633168953192112, 2212651044092396, 30590958583852, 368515260889378 #else @@ -5887,7 +5887,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1171650314802029, 1567085444565577, 1453660792008405, 757914533009261, 1619511342778196 #else @@ -5896,7 +5896,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 420958967093237, 971103481109486, 2169549185607107, 1301191633558497, 1661514101014240 #else @@ -5907,7 +5907,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 907123651818302, 1332556122804146, 1824055253424487, 1367614217442959, 1982558335973172 #else @@ -5916,7 +5916,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1121533090144639, 1021251337022187, 110469995947421, 1511059774758394, 2110035908131662 #else @@ -5925,7 +5925,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 303213233384524, 2061932261128138, 352862124777736, 40828818670255, 249879468482660 #else @@ -5936,7 +5936,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 856559257852200, 508517664949010, 1378193767894916, 1723459126947129, 1962275756614521 #else @@ -5945,7 +5945,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1445691340537320, 40614383122127, 402104303144865, 485134269878232, 1659439323587426 #else @@ -5954,7 +5954,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 20057458979482, 1183363722525800, 2140003847237215, 2053873950687614, 2112017736174909 #else @@ -5965,7 +5965,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2228654250927986, 1483591363415267, 1368661293910956, 1076511285177291, 526650682059608 #else @@ -5974,7 +5974,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 709481497028540, 531682216165724, 316963769431931, 1814315888453765, 258560242424104 #else @@ -5983,7 +5983,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1053447823660455, 1955135194248683, 1010900954918985, 1182614026976701, 1240051576966610 #else @@ -5996,7 +5996,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1957943897155497, 1788667368028035, 137692910029106, 1039519607062, 826404763313028 #else @@ -6005,7 +6005,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1848942433095597, 1582009882530495, 1849292741020143, 1068498323302788, 2001402229799484 #else @@ -6014,7 +6014,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1528282417624269, 2142492439828191, 2179662545816034, 362568973150328, 1591374675250271 #else @@ -6025,7 +6025,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 160026679434388, 232341189218716, 2149181472355545, 598041771119831, 183859001910173 #else @@ -6034,7 +6034,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2013278155187349, 662660471354454, 793981225706267, 411706605985744, 804490933124791 #else @@ -6043,7 +6043,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2051892037280204, 488391251096321, 2230187337030708, 930221970662692, 679002758255210 #else @@ -6054,7 +6054,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1530723630438670, 875873929577927, 341560134269988, 449903119530753, 1055551308214179 #else @@ -6063,7 +6063,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1461835919309432, 1955256480136428, 180866187813063, 1551979252664528, 557743861963950 #else @@ -6072,7 +6072,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 359179641731115, 1324915145732949, 902828372691474, 294254275669987, 1887036027752957 #else @@ -6083,7 +6083,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2043271609454323, 2038225437857464, 1317528426475850, 1398989128982787, 2027639881006861 #else @@ -6092,7 +6092,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2072902725256516, 312132452743412, 309930885642209, 996244312618453, 1590501300352303 #else @@ -6101,7 +6101,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1397254305160710, 695734355138021, 2233992044438756, 1776180593969996, 1085588199351115 #else @@ -6112,7 +6112,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 440567051331029, 254894786356681, 493869224930222, 1556322069683366, 1567456540319218 #else @@ -6121,7 +6121,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1950722461391320, 1907845598854797, 1822757481635527, 2121567704750244, 73811931471221 #else @@ -6130,7 +6130,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 387139307395758, 2058036430315676, 1220915649965325, 1794832055328951, 1230009312169328 #else @@ -6141,7 +6141,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1765973779329517, 659344059446977, 19821901606666, 1301928341311214, 1116266004075885 #else @@ -6150,7 +6150,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1127572801181483, 1224743760571696, 1276219889847274, 1529738721702581, 1589819666871853 #else @@ -6159,7 +6159,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2181229378964934, 2190885205260020, 1511536077659137, 1246504208580490, 668883326494241 #else @@ -6170,7 +6170,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 437866655573314, 669026411194768, 81896997980338, 523874406393178, 245052060935236 #else @@ -6179,7 +6179,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1975438052228868, 1071801519999806, 594652299224319, 1877697652668809, 1489635366987285 #else @@ -6188,7 +6188,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 958592545673770, 233048016518599, 851568750216589, 567703851596087, 1740300006094761 #else @@ -6199,7 +6199,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2014540178270324, 192672779514432, 213877182641530, 2194819933853411, 1716422829364835 #else @@ -6208,7 +6208,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1540769606609725, 2148289943846077, 1597804156127445, 1230603716683868, 815423458809453 #else @@ -6217,7 +6217,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1738560251245018, 1779576754536888, 1783765347671392, 1880170990446751, 1088225159617541 #else @@ -6230,7 +6230,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 659303913929492, 1956447718227573, 1830568515922666, 841069049744408, 1669607124206368 #else @@ -6239,7 +6239,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1143465490433355, 1532194726196059, 1093276745494697, 481041706116088, 2121405433561163 #else @@ -6248,7 +6248,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1686424298744462, 1451806974487153, 266296068846582, 1834686947542675, 1720762336132256 #else @@ -6259,7 +6259,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 889217026388959, 1043290623284660, 856125087551909, 1669272323124636, 1603340330827879 #else @@ -6268,7 +6268,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1206396181488998, 333158148435054, 1402633492821422, 1120091191722026, 1945474114550509 #else @@ -6277,7 +6277,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 766720088232571, 1512222781191002, 1189719893490790, 2091302129467914, 2141418006894941 #else @@ -6288,7 +6288,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 419663647306612, 1998875112167987, 1426599870253707, 1154928355379510, 486538532138187 #else @@ -6297,7 +6297,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 938160078005954, 1421776319053174, 1941643234741774, 180002183320818, 1414380336750546 #else @@ -6306,7 +6306,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 398001940109652, 1577721237663248, 1012748649830402, 1540516006905144, 1011684812884559 #else @@ -6317,7 +6317,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1653276489969630, 6081825167624, 1921777941170836, 1604139841794531, 861211053640641 #else @@ -6326,7 +6326,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 996661541407379, 1455877387952927, 744312806857277, 139213896196746, 1000282908547789 #else @@ -6335,7 +6335,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1450817495603008, 1476865707053229, 1030490562252053, 620966950353376, 1744760161539058 #else @@ -6346,7 +6346,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 559728410002599, 37056661641185, 2038622963352006, 1637244893271723, 1026565352238948 #else @@ -6355,7 +6355,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 962165956135846, 1116599660248791, 182090178006815, 1455605467021751, 196053588803284 #else @@ -6364,7 +6364,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 796863823080135, 1897365583584155, 420466939481601, 2165972651724672, 932177357788289 #else @@ -6375,7 +6375,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 877047233620632, 1375632631944375, 643773611882121, 660022738847877, 19353932331831 #else @@ -6384,7 +6384,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2216943882299338, 394841323190322, 2222656898319671, 558186553950529, 1077236877025190 #else @@ -6393,7 +6393,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 801118384953213, 1914330175515892, 574541023311511, 1471123787903705, 1526158900256288 #else @@ -6404,7 +6404,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 949617889087234, 2207116611267331, 912920039141287, 501158539198789, 62362560771472 #else @@ -6413,7 +6413,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1474518386765335, 1760793622169197, 1157399790472736, 1622864308058898, 165428294422792 #else @@ -6422,7 +6422,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1961673048027128, 102619413083113, 1051982726768458, 1603657989805485, 1941613251499678 #else @@ -6433,7 +6433,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1401939116319266, 335306339903072, 72046196085786, 862423201496006, 850518754531384 #else @@ -6442,7 +6442,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1234706593321979, 1083343891215917, 898273974314935, 1640859118399498, 157578398571149 #else @@ -6451,7 +6451,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1143483057726416, 1992614991758919, 674268662140796, 1773370048077526, 674318359920189 #else @@ -6464,7 +6464,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1835401379538542, 173900035308392, 818247630716732, 1762100412152786, 1021506399448291 #else @@ -6473,7 +6473,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1506632088156630, 2127481795522179, 513812919490255, 140643715928370, 442476620300318 #else @@ -6482,7 +6482,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2056683376856736, 219094741662735, 2193541883188309, 1841182310235800, 556477468664293 #else @@ -6493,7 +6493,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1315019427910827, 1049075855992603, 2066573052986543, 266904467185534, 2040482348591520 #else @@ -6502,7 +6502,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 94096246544434, 922482381166992, 24517828745563, 2139430508542503, 2097139044231004 #else @@ -6511,7 +6511,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 537697207950515, 1399352016347350, 1563663552106345, 2148749520888918, 549922092988516 #else @@ -6522,7 +6522,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1747985413252434, 680511052635695, 1809559829982725, 594274250930054, 201673170745982 #else @@ -6531,7 +6531,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 323583936109569, 1973572998577657, 1192219029966558, 79354804385273, 1374043025560347 #else @@ -6540,7 +6540,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 213277331329947, 416202017849623, 1950535221091783, 1313441578103244, 2171386783823658 #else @@ -6551,7 +6551,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 189088804229831, 993969372859110, 895870121536987, 1547301535298256, 1477373024911350 #else @@ -6560,7 +6560,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1620578418245010, 541035331188469, 2235785724453865, 2154865809088198, 1974627268751826 #else @@ -6569,7 +6569,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1346805451740245, 1350981335690626, 942744349501813, 2155094562545502, 1012483751693409 #else @@ -6580,7 +6580,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2107080134091762, 1132567062788208, 1824935377687210, 769194804343737, 1857941799971888 #else @@ -6589,7 +6589,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1074666112436467, 249279386739593, 1174337926625354, 1559013532006480, 1472287775519121 #else @@ -6598,7 +6598,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1872620123779532, 1892932666768992, 1921559078394978, 1270573311796160, 1438913646755037 #else @@ -6609,7 +6609,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 837390187648199, 1012253300223599, 989780015893987, 1351393287739814, 328627746545550 #else @@ -6618,7 +6618,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1028328827183114, 1711043289969857, 1350832470374933, 1923164689604327, 1495656368846911 #else @@ -6627,7 +6627,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1900828492104143, 430212361082163, 687437570852799, 832514536673512, 1685641495940794 #else @@ -6638,7 +6638,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 842632847936398, 605670026766216, 290836444839585, 163210774892356, 2213815011799645 #else @@ -6647,7 +6647,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1176336383453996, 1725477294339771, 12700622672454, 678015708818208, 162724078519879 #else @@ -6656,7 +6656,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1448049969043497, 1789411762943521, 385587766217753, 90201620913498, 832999441066823 #else @@ -6667,7 +6667,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 516086333293313, 2240508292484616, 1351669528166508, 1223255565316488, 750235824427138 #else @@ -6676,7 +6676,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1263624896582495, 1102602401673328, 526302183714372, 2152015839128799, 1483839308490010 #else @@ -6685,7 +6685,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 442991718646863, 1599275157036458, 1925389027579192, 899514691371390, 350263251085160 #else @@ -6698,7 +6698,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1689713572022143, 593854559254373, 978095044791970, 1985127338729499, 1676069120347625 #else @@ -6707,7 +6707,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1557207018622683, 340631692799603, 1477725909476187, 614735951619419, 2033237123746766 #else @@ -6716,7 +6716,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 968764929340557, 1225534776710944, 662967304013036, 1155521416178595, 791142883466590 #else @@ -6727,7 +6727,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1487081286167458, 993039441814934, 1792378982844640, 698652444999874, 2153908693179754 #else @@ -6736,7 +6736,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1123181311102823, 685575944875442, 507605465509927, 1412590462117473, 568017325228626 #else @@ -6745,7 +6745,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 560258797465417, 2193971151466401, 1824086900849026, 579056363542056, 1690063960036441 #else @@ -6756,7 +6756,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1918407319222416, 353767553059963, 1930426334528099, 1564816146005724, 1861342381708096 #else @@ -6765,7 +6765,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2131325168777276, 1176636658428908, 1756922641512981, 1390243617176012, 1966325177038383 #else @@ -6774,7 +6774,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2063958120364491, 2140267332393533, 699896251574968, 273268351312140, 375580724713232 #else @@ -6785,7 +6785,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2024297515263178, 416959329722687, 1079014235017302, 171612225573183, 1031677520051053 #else @@ -6794,7 +6794,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2033900009388450, 1744902869870788, 2190580087917640, 1949474984254121, 231049754293748 #else @@ -6803,7 +6803,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 343868674606581, 550155864008088, 1450580864229630, 481603765195050, 896972360018042 #else @@ -6814,7 +6814,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2151139328380127, 314745882084928, 59756825775204, 1676664391494651, 2048348075599360 #else @@ -6823,7 +6823,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1528930066340597, 1605003907059576, 1055061081337675, 1458319101947665, 1234195845213142 #else @@ -6832,7 +6832,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 830430507734812, 1780282976102377, 1425386760709037, 362399353095425, 2168861579799910 #else @@ -6843,7 +6843,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1155762232730333, 980662895504006, 2053766700883521, 490966214077606, 510405877041357 #else @@ -6852,7 +6852,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1683750316716132, 652278688286128, 1221798761193539, 1897360681476669, 319658166027343 #else @@ -6861,7 +6861,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 618808732869972, 72755186759744, 2060379135624181, 1730731526741822, 48862757828238 #else @@ -6872,7 +6872,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1463171970593505, 1143040711767452, 614590986558883, 1409210575145591, 1882816996436803 #else @@ -6881,7 +6881,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2230133264691131, 563950955091024, 2042915975426398, 827314356293472, 672028980152815 #else @@ -6890,7 +6890,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 264204366029760, 1654686424479449, 2185050199932931, 2207056159091748, 506015669043634 #else @@ -6901,7 +6901,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1784446333136569, 1973746527984364, 334856327359575, 1156769775884610, 1023950124675478 #else @@ -6910,7 +6910,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2065270940578383, 31477096270353, 306421879113491, 181958643936686, 1907105536686083 #else @@ -6919,7 +6919,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1496516440779464, 1748485652986458, 872778352227340, 818358834654919, 97932669284220 #else @@ -6932,7 +6932,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 471636015770351, 672455402793577, 1804995246884103, 1842309243470804, 1501862504981682 #else @@ -6941,7 +6941,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1013216974933691, 538921919682598, 1915776722521558, 1742822441583877, 1886550687916656 #else @@ -6950,7 +6950,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2094270000643336, 303971879192276, 40801275554748, 649448917027930, 1818544418535447 #else @@ -6961,7 +6961,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2241737709499165, 549397817447461, 838180519319392, 1725686958520781, 1705639080897747 #else @@ -6970,7 +6970,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1216074541925116, 50120933933509, 1565829004133810, 721728156134580, 349206064666188 #else @@ -6979,7 +6979,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 948617110470858, 346222547451945, 1126511960599975, 1759386906004538, 493053284802266 #else @@ -6990,7 +6990,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1454933046815146, 874696014266362, 1467170975468588, 1432316382418897, 2111710746366763 #else @@ -6999,7 +6999,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2105387117364450, 1996463405126433, 1303008614294500, 851908115948209, 1353742049788635 #else @@ -7008,7 +7008,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 750300956351719, 1487736556065813, 15158817002104, 1511998221598392, 971739901354129 #else @@ -7019,7 +7019,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1874648163531693, 2124487685930551, 1810030029384882, 918400043048335, 586348627300650 #else @@ -7028,7 +7028,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1235084464747900, 1166111146432082, 1745394857881591, 1405516473883040, 4463504151617 #else @@ -7037,7 +7037,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1663810156463827, 327797390285791, 1341846161759410, 1964121122800605, 1747470312055380 #else @@ -7048,7 +7048,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 660005247548233, 2071860029952887, 1358748199950107, 911703252219107, 1014379923023831 #else @@ -7057,7 +7057,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2206641276178231, 1690587809721504, 1600173622825126, 2156096097634421, 1106822408548216 #else @@ -7066,7 +7066,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1344788193552206, 1949552134239140, 1735915881729557, 675891104100469, 1834220014427292 #else @@ -7077,7 +7077,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1920949492387964, 158885288387530, 70308263664033, 626038464897817, 1468081726101009 #else @@ -7086,7 +7086,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 622221042073383, 1210146474039168, 1742246422343683, 1403839361379025, 417189490895736 #else @@ -7095,7 +7095,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 22727256592983, 168471543384997, 1324340989803650, 1839310709638189, 504999476432775 #else @@ -7106,7 +7106,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1313240518756327, 1721896294296942, 52263574587266, 2065069734239232, 804910473424630 #else @@ -7115,7 +7115,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1337466662091884, 1287645354669772, 2018019646776184, 652181229374245, 898011753211715 #else @@ -7124,7 +7124,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1969792547910734, 779969968247557, 2011350094423418, 1823964252907487, 1058949448296945 #else @@ -7135,7 +7135,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 207343737062002, 1118176942430253, 758894594548164, 806764629546266, 1157700123092949 #else @@ -7144,7 +7144,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1273565321399022, 1638509681964574, 759235866488935, 666015124346707, 897983460943405 #else @@ -7153,7 +7153,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1717263794012298, 1059601762860786, 1837819172257618, 1054130665797229, 680893204263559 #else @@ -7166,7 +7166,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2237039662793603, 2249022333361206, 2058613546633703, 149454094845279, 2215176649164582 #else @@ -7175,7 +7175,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 79472182719605, 1851130257050174, 1825744808933107, 821667333481068, 781795293511946 #else @@ -7184,7 +7184,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 755822026485370, 152464789723500, 1178207602290608, 410307889503239, 156581253571278 #else @@ -7195,7 +7195,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1418185496130297, 484520167728613, 1646737281442950, 1401487684670265, 1349185550126961 #else @@ -7204,7 +7204,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1495380034400429, 325049476417173, 46346894893933, 1553408840354856, 828980101835683 #else @@ -7213,7 +7213,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1280337889310282, 2070832742866672, 1640940617225222, 2098284908289951, 450929509534434 #else @@ -7224,7 +7224,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 407703353998781, 126572141483652, 286039827513621, 1999255076709338, 2030511179441770 #else @@ -7233,7 +7233,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1254958221100483, 1153235960999843, 942907704968834, 637105404087392, 1149293270147267 #else @@ -7242,7 +7242,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 894249020470196, 400291701616810, 406878712230981, 1599128793487393, 1145868722604026 #else @@ -7253,7 +7253,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1497955250203334, 110116344653260, 1128535642171976, 1900106496009660, 129792717460909 #else @@ -7262,7 +7262,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 452487513298665, 1352120549024569, 1173495883910956, 1999111705922009, 367328130454226 #else @@ -7271,7 +7271,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1717539401269642, 1475188995688487, 891921989653942, 836824441505699, 1885988485608364 #else @@ -7282,7 +7282,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1241784121422547, 187337051947583, 1118481812236193, 428747751936362, 30358898927325 #else @@ -7291,7 +7291,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2022432361201842, 1088816090685051, 1977843398539868, 1854834215890724, 564238862029357 #else @@ -7300,7 +7300,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 938868489100585, 1100285072929025, 1017806255688848, 1957262154788833, 152787950560442 #else @@ -7311,7 +7311,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 867319417678923, 620471962942542, 226032203305716, 342001443957629, 1761675818237336 #else @@ -7320,7 +7320,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1295072362439987, 931227904689414, 1355731432641687, 922235735834035, 892227229410209 #else @@ -7329,7 +7329,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1680989767906154, 535362787031440, 2136691276706570, 1942228485381244, 1267350086882274 #else @@ -7340,7 +7340,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 366018233770527, 432660629755596, 126409707644535, 1973842949591662, 645627343442376 #else @@ -7349,7 +7349,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 535509430575217, 546885533737322, 1524675609547799, 2138095752851703, 1260738089896827 #else @@ -7358,7 +7358,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1159906385590467, 2198530004321610, 714559485023225, 81880727882151, 1484020820037082 #else @@ -7369,7 +7369,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1377485731340769, 2046328105512000, 1802058637158797, 62146136768173, 1356993908853901 #else @@ -7378,7 +7378,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2013612215646735, 1830770575920375, 536135310219832, 609272325580394, 270684344495013 #else @@ -7387,7 +7387,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1237542585982777, 2228682050256790, 1385281931622824, 593183794882890, 493654978552689 #else @@ -7400,7 +7400,7 @@ static const ge_precomp k25519Precomp[32][8] = { { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 47341488007760, 1891414891220257, 983894663308928, 176161768286818, 1126261115179708 #else @@ -7409,7 +7409,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1694030170963455, 502038567066200, 1691160065225467, 949628319562187, 275110186693066 #else @@ -7418,7 +7418,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1124515748676336, 1661673816593408, 1499640319059718, 1584929449166988, 558148594103306 #else @@ -7429,7 +7429,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1784525599998356, 1619698033617383, 2097300287550715, 258265458103756, 1905684794832758 #else @@ -7438,7 +7438,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1288941072872766, 931787902039402, 190731008859042, 2006859954667190, 1005931482221702 #else @@ -7447,7 +7447,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1465551264822703, 152905080555927, 680334307368453, 173227184634745, 666407097159852 #else @@ -7458,7 +7458,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2111017076203943, 1378760485794347, 1248583954016456, 1352289194864422, 1895180776543896 #else @@ -7467,7 +7467,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 171348223915638, 662766099800389, 462338943760497, 466917763340314, 656911292869115 #else @@ -7476,7 +7476,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 488623681976577, 866497561541722, 1708105560937768, 1673781214218839, 1506146329818807 #else @@ -7487,7 +7487,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 160425464456957, 950394373239689, 430497123340934, 711676555398832, 320964687779005 #else @@ -7496,7 +7496,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 988979367990485, 1359729327576302, 1301834257246029, 294141160829308, 29348272277475 #else @@ -7505,7 +7505,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1434382743317910, 100082049942065, 221102347892623, 186982837860588, 1305765053501834 #else @@ -7516,7 +7516,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2205916462268190, 499863829790820, 961960554686616, 158062762756985, 1841471168298305 #else @@ -7525,7 +7525,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1191737341426592, 1847042034978363, 1382213545049056, 1039952395710448, 788812858896859 #else @@ -7534,7 +7534,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1346965964571152, 1291881610839830, 2142916164336056, 786821641205979, 1571709146321039 #else @@ -7545,7 +7545,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 787164375951248, 202869205373189, 1356590421032140, 1431233331032510, 786341368775957 #else @@ -7554,7 +7554,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 492448143532951, 304105152670757, 1761767168301056, 233782684697790, 1981295323106089 #else @@ -7563,7 +7563,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 665807507761866, 1343384868355425, 895831046139653, 439338948736892, 1986828765695105 #else @@ -7574,7 +7574,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 756096210874553, 1721699973539149, 258765301727885, 1390588532210645, 1212530909934781 #else @@ -7583,7 +7583,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 852891097972275, 1816988871354562, 1543772755726524, 1174710635522444, 202129090724628 #else @@ -7592,7 +7592,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1205281565824323, 22430498399418, 992947814485516, 1392458699738672, 688441466734558 #else @@ -7603,7 +7603,7 @@ static const ge_precomp k25519Precomp[32][8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1050627428414972, 1955849529137135, 2171162376368357, 91745868298214, 447733118757826 #else @@ -7612,7 +7612,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1287181461435438, 622722465530711, 880952150571872, 741035693459198, 311565274989772 #else @@ -7621,7 +7621,7 @@ static const ge_precomp k25519Precomp[32][8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1003649078149734, 545233927396469, 1849786171789880, 1318943684880434, 280345687170552 #else @@ -7639,7 +7639,7 @@ static const ge_precomp k25519Precomp[32][8] = { static const ge_precomp Bi[8] = { { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1288382639258501, 245678601348599, 269427782077623, 1462984067271730, 137412439391563 #else @@ -7648,7 +7648,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 62697248952638, 204681361388450, 631292143396476, 338455783676468, 1213667448819585 #else @@ -7657,7 +7657,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 301289933810280, 1259582250014073, 1422107436869536, 796239922652654, 1953934009299142 #else @@ -7668,7 +7668,7 @@ static const ge_precomp Bi[8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1601611775252272, 1720807796594148, 1132070835939856, 1260455018889551, 2147779492816911 #else @@ -7677,7 +7677,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 316559037616741, 2177824224946892, 1459442586438991, 1461528397712656, 751590696113597 #else @@ -7686,7 +7686,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1850748884277385, 1200145853858453, 1068094770532492, 672251375690438, 1586055907191707 #else @@ -7697,7 +7697,7 @@ static const ge_precomp Bi[8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 769950342298419, 132954430919746, 844085933195555, 974092374476333, 726076285546016 #else @@ -7706,7 +7706,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 425251763115706, 608463272472562, 442562545713235, 837766094556764, 374555092627893 #else @@ -7715,7 +7715,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1086255230780037, 274979815921559, 1960002765731872, 929474102396301, 1190409889297339 #else @@ -7726,7 +7726,7 @@ static const ge_precomp Bi[8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 665000864555967, 2065379846933859, 370231110385876, 350988370788628, 1233371373142985 #else @@ -7735,7 +7735,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2019367628972465, 676711900706637, 110710997811333, 1108646842542025, 517791959672113 #else @@ -7744,7 +7744,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 965130719900578, 247011430587952, 526356006571389, 91986625355052, 2157223321444601 #else @@ -7755,7 +7755,7 @@ static const ge_precomp Bi[8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1802695059465007, 1664899123557221, 593559490740857, 2160434469266659, 927570450755031 #else @@ -7764,7 +7764,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1725674970513508, 1933645953859181, 1542344539275782, 1767788773573747, 1297447965928905 #else @@ -7773,7 +7773,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1381809363726107, 1430341051343062, 2061843536018959, 1551778050872521, 2036394857967624 #else @@ -7784,7 +7784,7 @@ static const ge_precomp Bi[8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1970894096313054, 528066325833207, 1619374932191227, 2207306624415883, 1169170329061080 #else @@ -7793,7 +7793,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 2070390218572616, 1458919061857835, 624171843017421, 1055332792707765, 433987520732508 #else @@ -7802,7 +7802,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 893653801273833, 1168026499324677, 1242553501121234, 1306366254304474, 1086752658510815 #else @@ -7813,7 +7813,7 @@ static const ge_precomp Bi[8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 213454002618221, 939771523987438, 1159882208056014, 317388369627517, 621213314200687 #else @@ -7822,7 +7822,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1971678598905747, 338026507889165, 762398079972271, 655096486107477, 42299032696322 #else @@ -7831,7 +7831,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 177130678690680, 1754759263300204, 1864311296286618, 1180675631479880, 1292726903152791 #else @@ -7842,7 +7842,7 @@ static const ge_precomp Bi[8] = { }, { {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1913163449625248, 460779200291993, 2193883288642314, 1008900146920800, 1721983679009502 #else @@ -7851,7 +7851,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 1070401523076875, 1272492007800961, 1910153608563310, 2075579521696771, 1191169788841221 #else @@ -7860,7 +7860,7 @@ static const ge_precomp Bi[8] = { #endif }}, {{ -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) 692896803108118, 500174642072499, 2068223309439677, 1162190621851337, 1426986007309901 #else diff --git a/third_party/boringssl/src/crypto/curve25519/internal.h b/third_party/boringssl/src/crypto/curve25519/internal.h index 76ff78faf416..1420601bb739 100644 --- a/third_party/boringssl/src/crypto/curve25519/internal.h +++ b/third_party/boringssl/src/crypto/curve25519/internal.h @@ -32,11 +32,7 @@ void x25519_NEON(uint8_t out[32], const uint8_t scalar[32], const uint8_t point[32]); #endif -#if defined(BORINGSSL_HAS_UINT128) -#define BORINGSSL_CURVE25519_64BIT -#endif - -#if defined(BORINGSSL_CURVE25519_64BIT) +#if defined(OPENSSL_64_BIT) // fe means field element. Here the field is \Z/(2^255-19). An element t, // entries t[0]...t[4], represents the integer t[0]+2^51 t[1]+2^102 t[2]+2^153 // t[3]+2^204 t[4]. diff --git a/third_party/boringssl/src/crypto/curve25519/make_curve25519_tables.py b/third_party/boringssl/src/crypto/curve25519/make_curve25519_tables.py index 50dee2a98a1b..c3cf12ab09e7 100755 --- a/third_party/boringssl/src/crypto/curve25519/make_curve25519_tables.py +++ b/third_party/boringssl/src/crypto/curve25519/make_curve25519_tables.py @@ -110,7 +110,7 @@ def to_base_51(x): return ret def to_literal(x): - ret = "{{\n#if defined(BORINGSSL_CURVE25519_64BIT)\n" + ret = "{{\n#if defined(OPENSSL_64_BIT)\n" ret += ", ".join(map(str, to_base_51(x))) ret += "\n#else\n" ret += ", ".join(map(str, to_base_25_5(x))) diff --git a/third_party/boringssl/src/crypto/des/des.c b/third_party/boringssl/src/crypto/des/des.c index 95c430cac00a..a608accda454 100644 --- a/third_party/boringssl/src/crypto/des/des.c +++ b/third_party/boringssl/src/crypto/des/des.c @@ -63,231 +63,231 @@ static const uint32_t des_skb[8][64] = { { // for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 - 0x00000000L, 0x00000010L, 0x20000000L, 0x20000010L, 0x00010000L, - 0x00010010L, 0x20010000L, 0x20010010L, 0x00000800L, 0x00000810L, - 0x20000800L, 0x20000810L, 0x00010800L, 0x00010810L, 0x20010800L, - 0x20010810L, 0x00000020L, 0x00000030L, 0x20000020L, 0x20000030L, - 0x00010020L, 0x00010030L, 0x20010020L, 0x20010030L, 0x00000820L, - 0x00000830L, 0x20000820L, 0x20000830L, 0x00010820L, 0x00010830L, - 0x20010820L, 0x20010830L, 0x00080000L, 0x00080010L, 0x20080000L, - 0x20080010L, 0x00090000L, 0x00090010L, 0x20090000L, 0x20090010L, - 0x00080800L, 0x00080810L, 0x20080800L, 0x20080810L, 0x00090800L, - 0x00090810L, 0x20090800L, 0x20090810L, 0x00080020L, 0x00080030L, - 0x20080020L, 0x20080030L, 0x00090020L, 0x00090030L, 0x20090020L, - 0x20090030L, 0x00080820L, 0x00080830L, 0x20080820L, 0x20080830L, - 0x00090820L, 0x00090830L, 0x20090820L, 0x20090830L, }, + 0x00000000, 0x00000010, 0x20000000, 0x20000010, 0x00010000, + 0x00010010, 0x20010000, 0x20010010, 0x00000800, 0x00000810, + 0x20000800, 0x20000810, 0x00010800, 0x00010810, 0x20010800, + 0x20010810, 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, 0x00000820, + 0x00000830, 0x20000820, 0x20000830, 0x00010820, 0x00010830, + 0x20010820, 0x20010830, 0x00080000, 0x00080010, 0x20080000, + 0x20080010, 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, 0x00090800, + 0x00090810, 0x20090800, 0x20090810, 0x00080020, 0x00080030, + 0x20080020, 0x20080030, 0x00090020, 0x00090030, 0x20090020, + 0x20090030, 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, }, { // for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 - 0x00000000L, 0x02000000L, 0x00002000L, 0x02002000L, 0x00200000L, - 0x02200000L, 0x00202000L, 0x02202000L, 0x00000004L, 0x02000004L, - 0x00002004L, 0x02002004L, 0x00200004L, 0x02200004L, 0x00202004L, - 0x02202004L, 0x00000400L, 0x02000400L, 0x00002400L, 0x02002400L, - 0x00200400L, 0x02200400L, 0x00202400L, 0x02202400L, 0x00000404L, - 0x02000404L, 0x00002404L, 0x02002404L, 0x00200404L, 0x02200404L, - 0x00202404L, 0x02202404L, 0x10000000L, 0x12000000L, 0x10002000L, - 0x12002000L, 0x10200000L, 0x12200000L, 0x10202000L, 0x12202000L, - 0x10000004L, 0x12000004L, 0x10002004L, 0x12002004L, 0x10200004L, - 0x12200004L, 0x10202004L, 0x12202004L, 0x10000400L, 0x12000400L, - 0x10002400L, 0x12002400L, 0x10200400L, 0x12200400L, 0x10202400L, - 0x12202400L, 0x10000404L, 0x12000404L, 0x10002404L, 0x12002404L, - 0x10200404L, 0x12200404L, 0x10202404L, 0x12202404L, }, + 0x00000000, 0x02000000, 0x00002000, 0x02002000, 0x00200000, + 0x02200000, 0x00202000, 0x02202000, 0x00000004, 0x02000004, + 0x00002004, 0x02002004, 0x00200004, 0x02200004, 0x00202004, + 0x02202004, 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, 0x00000404, + 0x02000404, 0x00002404, 0x02002404, 0x00200404, 0x02200404, + 0x00202404, 0x02202404, 0x10000000, 0x12000000, 0x10002000, + 0x12002000, 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, 0x10200004, + 0x12200004, 0x10202004, 0x12202004, 0x10000400, 0x12000400, + 0x10002400, 0x12002400, 0x10200400, 0x12200400, 0x10202400, + 0x12202400, 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, }, { // for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 - 0x00000000L, 0x00000001L, 0x00040000L, 0x00040001L, 0x01000000L, - 0x01000001L, 0x01040000L, 0x01040001L, 0x00000002L, 0x00000003L, - 0x00040002L, 0x00040003L, 0x01000002L, 0x01000003L, 0x01040002L, - 0x01040003L, 0x00000200L, 0x00000201L, 0x00040200L, 0x00040201L, - 0x01000200L, 0x01000201L, 0x01040200L, 0x01040201L, 0x00000202L, - 0x00000203L, 0x00040202L, 0x00040203L, 0x01000202L, 0x01000203L, - 0x01040202L, 0x01040203L, 0x08000000L, 0x08000001L, 0x08040000L, - 0x08040001L, 0x09000000L, 0x09000001L, 0x09040000L, 0x09040001L, - 0x08000002L, 0x08000003L, 0x08040002L, 0x08040003L, 0x09000002L, - 0x09000003L, 0x09040002L, 0x09040003L, 0x08000200L, 0x08000201L, - 0x08040200L, 0x08040201L, 0x09000200L, 0x09000201L, 0x09040200L, - 0x09040201L, 0x08000202L, 0x08000203L, 0x08040202L, 0x08040203L, - 0x09000202L, 0x09000203L, 0x09040202L, 0x09040203L, }, + 0x00000000, 0x00000001, 0x00040000, 0x00040001, 0x01000000, + 0x01000001, 0x01040000, 0x01040001, 0x00000002, 0x00000003, + 0x00040002, 0x00040003, 0x01000002, 0x01000003, 0x01040002, + 0x01040003, 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, 0x00000202, + 0x00000203, 0x00040202, 0x00040203, 0x01000202, 0x01000203, + 0x01040202, 0x01040203, 0x08000000, 0x08000001, 0x08040000, + 0x08040001, 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, 0x09000002, + 0x09000003, 0x09040002, 0x09040003, 0x08000200, 0x08000201, + 0x08040200, 0x08040201, 0x09000200, 0x09000201, 0x09040200, + 0x09040201, 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, }, { // for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 - 0x00000000L, 0x00100000L, 0x00000100L, 0x00100100L, 0x00000008L, - 0x00100008L, 0x00000108L, 0x00100108L, 0x00001000L, 0x00101000L, - 0x00001100L, 0x00101100L, 0x00001008L, 0x00101008L, 0x00001108L, - 0x00101108L, 0x04000000L, 0x04100000L, 0x04000100L, 0x04100100L, - 0x04000008L, 0x04100008L, 0x04000108L, 0x04100108L, 0x04001000L, - 0x04101000L, 0x04001100L, 0x04101100L, 0x04001008L, 0x04101008L, - 0x04001108L, 0x04101108L, 0x00020000L, 0x00120000L, 0x00020100L, - 0x00120100L, 0x00020008L, 0x00120008L, 0x00020108L, 0x00120108L, - 0x00021000L, 0x00121000L, 0x00021100L, 0x00121100L, 0x00021008L, - 0x00121008L, 0x00021108L, 0x00121108L, 0x04020000L, 0x04120000L, - 0x04020100L, 0x04120100L, 0x04020008L, 0x04120008L, 0x04020108L, - 0x04120108L, 0x04021000L, 0x04121000L, 0x04021100L, 0x04121100L, - 0x04021008L, 0x04121008L, 0x04021108L, 0x04121108L, }, + 0x00000000, 0x00100000, 0x00000100, 0x00100100, 0x00000008, + 0x00100008, 0x00000108, 0x00100108, 0x00001000, 0x00101000, + 0x00001100, 0x00101100, 0x00001008, 0x00101008, 0x00001108, + 0x00101108, 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, 0x04001000, + 0x04101000, 0x04001100, 0x04101100, 0x04001008, 0x04101008, + 0x04001108, 0x04101108, 0x00020000, 0x00120000, 0x00020100, + 0x00120100, 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, 0x00021008, + 0x00121008, 0x00021108, 0x00121108, 0x04020000, 0x04120000, + 0x04020100, 0x04120100, 0x04020008, 0x04120008, 0x04020108, + 0x04120108, 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, }, { // for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 - 0x00000000L, 0x10000000L, 0x00010000L, 0x10010000L, 0x00000004L, - 0x10000004L, 0x00010004L, 0x10010004L, 0x20000000L, 0x30000000L, - 0x20010000L, 0x30010000L, 0x20000004L, 0x30000004L, 0x20010004L, - 0x30010004L, 0x00100000L, 0x10100000L, 0x00110000L, 0x10110000L, - 0x00100004L, 0x10100004L, 0x00110004L, 0x10110004L, 0x20100000L, - 0x30100000L, 0x20110000L, 0x30110000L, 0x20100004L, 0x30100004L, - 0x20110004L, 0x30110004L, 0x00001000L, 0x10001000L, 0x00011000L, - 0x10011000L, 0x00001004L, 0x10001004L, 0x00011004L, 0x10011004L, - 0x20001000L, 0x30001000L, 0x20011000L, 0x30011000L, 0x20001004L, - 0x30001004L, 0x20011004L, 0x30011004L, 0x00101000L, 0x10101000L, - 0x00111000L, 0x10111000L, 0x00101004L, 0x10101004L, 0x00111004L, - 0x10111004L, 0x20101000L, 0x30101000L, 0x20111000L, 0x30111000L, - 0x20101004L, 0x30101004L, 0x20111004L, 0x30111004L, }, + 0x00000000, 0x10000000, 0x00010000, 0x10010000, 0x00000004, + 0x10000004, 0x00010004, 0x10010004, 0x20000000, 0x30000000, + 0x20010000, 0x30010000, 0x20000004, 0x30000004, 0x20010004, + 0x30010004, 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, 0x20100000, + 0x30100000, 0x20110000, 0x30110000, 0x20100004, 0x30100004, + 0x20110004, 0x30110004, 0x00001000, 0x10001000, 0x00011000, + 0x10011000, 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, 0x20001004, + 0x30001004, 0x20011004, 0x30011004, 0x00101000, 0x10101000, + 0x00111000, 0x10111000, 0x00101004, 0x10101004, 0x00111004, + 0x10111004, 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, }, { // for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 - 0x00000000L, 0x08000000L, 0x00000008L, 0x08000008L, 0x00000400L, - 0x08000400L, 0x00000408L, 0x08000408L, 0x00020000L, 0x08020000L, - 0x00020008L, 0x08020008L, 0x00020400L, 0x08020400L, 0x00020408L, - 0x08020408L, 0x00000001L, 0x08000001L, 0x00000009L, 0x08000009L, - 0x00000401L, 0x08000401L, 0x00000409L, 0x08000409L, 0x00020001L, - 0x08020001L, 0x00020009L, 0x08020009L, 0x00020401L, 0x08020401L, - 0x00020409L, 0x08020409L, 0x02000000L, 0x0A000000L, 0x02000008L, - 0x0A000008L, 0x02000400L, 0x0A000400L, 0x02000408L, 0x0A000408L, - 0x02020000L, 0x0A020000L, 0x02020008L, 0x0A020008L, 0x02020400L, - 0x0A020400L, 0x02020408L, 0x0A020408L, 0x02000001L, 0x0A000001L, - 0x02000009L, 0x0A000009L, 0x02000401L, 0x0A000401L, 0x02000409L, - 0x0A000409L, 0x02020001L, 0x0A020001L, 0x02020009L, 0x0A020009L, - 0x02020401L, 0x0A020401L, 0x02020409L, 0x0A020409L, }, + 0x00000000, 0x08000000, 0x00000008, 0x08000008, 0x00000400, + 0x08000400, 0x00000408, 0x08000408, 0x00020000, 0x08020000, + 0x00020008, 0x08020008, 0x00020400, 0x08020400, 0x00020408, + 0x08020408, 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, 0x00020001, + 0x08020001, 0x00020009, 0x08020009, 0x00020401, 0x08020401, + 0x00020409, 0x08020409, 0x02000000, 0x0A000000, 0x02000008, + 0x0A000008, 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, 0x02020400, + 0x0A020400, 0x02020408, 0x0A020408, 0x02000001, 0x0A000001, + 0x02000009, 0x0A000009, 0x02000401, 0x0A000401, 0x02000409, + 0x0A000409, 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, }, { // for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 - 0x00000000L, 0x00000100L, 0x00080000L, 0x00080100L, 0x01000000L, - 0x01000100L, 0x01080000L, 0x01080100L, 0x00000010L, 0x00000110L, - 0x00080010L, 0x00080110L, 0x01000010L, 0x01000110L, 0x01080010L, - 0x01080110L, 0x00200000L, 0x00200100L, 0x00280000L, 0x00280100L, - 0x01200000L, 0x01200100L, 0x01280000L, 0x01280100L, 0x00200010L, - 0x00200110L, 0x00280010L, 0x00280110L, 0x01200010L, 0x01200110L, - 0x01280010L, 0x01280110L, 0x00000200L, 0x00000300L, 0x00080200L, - 0x00080300L, 0x01000200L, 0x01000300L, 0x01080200L, 0x01080300L, - 0x00000210L, 0x00000310L, 0x00080210L, 0x00080310L, 0x01000210L, - 0x01000310L, 0x01080210L, 0x01080310L, 0x00200200L, 0x00200300L, - 0x00280200L, 0x00280300L, 0x01200200L, 0x01200300L, 0x01280200L, - 0x01280300L, 0x00200210L, 0x00200310L, 0x00280210L, 0x00280310L, - 0x01200210L, 0x01200310L, 0x01280210L, 0x01280310L, }, + 0x00000000, 0x00000100, 0x00080000, 0x00080100, 0x01000000, + 0x01000100, 0x01080000, 0x01080100, 0x00000010, 0x00000110, + 0x00080010, 0x00080110, 0x01000010, 0x01000110, 0x01080010, + 0x01080110, 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, 0x00200010, + 0x00200110, 0x00280010, 0x00280110, 0x01200010, 0x01200110, + 0x01280010, 0x01280110, 0x00000200, 0x00000300, 0x00080200, + 0x00080300, 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, 0x01000210, + 0x01000310, 0x01080210, 0x01080310, 0x00200200, 0x00200300, + 0x00280200, 0x00280300, 0x01200200, 0x01200300, 0x01280200, + 0x01280300, 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, }, { // for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 - 0x00000000L, 0x04000000L, 0x00040000L, 0x04040000L, 0x00000002L, - 0x04000002L, 0x00040002L, 0x04040002L, 0x00002000L, 0x04002000L, - 0x00042000L, 0x04042000L, 0x00002002L, 0x04002002L, 0x00042002L, - 0x04042002L, 0x00000020L, 0x04000020L, 0x00040020L, 0x04040020L, - 0x00000022L, 0x04000022L, 0x00040022L, 0x04040022L, 0x00002020L, - 0x04002020L, 0x00042020L, 0x04042020L, 0x00002022L, 0x04002022L, - 0x00042022L, 0x04042022L, 0x00000800L, 0x04000800L, 0x00040800L, - 0x04040800L, 0x00000802L, 0x04000802L, 0x00040802L, 0x04040802L, - 0x00002800L, 0x04002800L, 0x00042800L, 0x04042800L, 0x00002802L, - 0x04002802L, 0x00042802L, 0x04042802L, 0x00000820L, 0x04000820L, - 0x00040820L, 0x04040820L, 0x00000822L, 0x04000822L, 0x00040822L, - 0x04040822L, 0x00002820L, 0x04002820L, 0x00042820L, 0x04042820L, - 0x00002822L, 0x04002822L, 0x00042822L, 0x04042822L, }}; + 0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000002, + 0x04000002, 0x00040002, 0x04040002, 0x00002000, 0x04002000, + 0x00042000, 0x04042000, 0x00002002, 0x04002002, 0x00042002, + 0x04042002, 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, 0x00002020, + 0x04002020, 0x00042020, 0x04042020, 0x00002022, 0x04002022, + 0x00042022, 0x04042022, 0x00000800, 0x04000800, 0x00040800, + 0x04040800, 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, 0x00002802, + 0x04002802, 0x00042802, 0x04042802, 0x00000820, 0x04000820, + 0x00040820, 0x04040820, 0x00000822, 0x04000822, 0x00040822, + 0x04040822, 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822, }}; static const uint32_t DES_SPtrans[8][64] = { { // nibble 0 - 0x02080800L, 0x00080000L, 0x02000002L, 0x02080802L, 0x02000000L, - 0x00080802L, 0x00080002L, 0x02000002L, 0x00080802L, 0x02080800L, - 0x02080000L, 0x00000802L, 0x02000802L, 0x02000000L, 0x00000000L, - 0x00080002L, 0x00080000L, 0x00000002L, 0x02000800L, 0x00080800L, - 0x02080802L, 0x02080000L, 0x00000802L, 0x02000800L, 0x00000002L, - 0x00000800L, 0x00080800L, 0x02080002L, 0x00000800L, 0x02000802L, - 0x02080002L, 0x00000000L, 0x00000000L, 0x02080802L, 0x02000800L, - 0x00080002L, 0x02080800L, 0x00080000L, 0x00000802L, 0x02000800L, - 0x02080002L, 0x00000800L, 0x00080800L, 0x02000002L, 0x00080802L, - 0x00000002L, 0x02000002L, 0x02080000L, 0x02080802L, 0x00080800L, - 0x02080000L, 0x02000802L, 0x02000000L, 0x00000802L, 0x00080002L, - 0x00000000L, 0x00080000L, 0x02000000L, 0x02000802L, 0x02080800L, - 0x00000002L, 0x02080002L, 0x00000800L, 0x00080802L, }, + 0x02080800, 0x00080000, 0x02000002, 0x02080802, 0x02000000, + 0x00080802, 0x00080002, 0x02000002, 0x00080802, 0x02080800, + 0x02080000, 0x00000802, 0x02000802, 0x02000000, 0x00000000, + 0x00080002, 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, 0x00000002, + 0x00000800, 0x00080800, 0x02080002, 0x00000800, 0x02000802, + 0x02080002, 0x00000000, 0x00000000, 0x02080802, 0x02000800, + 0x00080002, 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, 0x00080802, + 0x00000002, 0x02000002, 0x02080000, 0x02080802, 0x00080800, + 0x02080000, 0x02000802, 0x02000000, 0x00000802, 0x00080002, + 0x00000000, 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, }, { // nibble 1 - 0x40108010L, 0x00000000L, 0x00108000L, 0x40100000L, 0x40000010L, - 0x00008010L, 0x40008000L, 0x00108000L, 0x00008000L, 0x40100010L, - 0x00000010L, 0x40008000L, 0x00100010L, 0x40108000L, 0x40100000L, - 0x00000010L, 0x00100000L, 0x40008010L, 0x40100010L, 0x00008000L, - 0x00108010L, 0x40000000L, 0x00000000L, 0x00100010L, 0x40008010L, - 0x00108010L, 0x40108000L, 0x40000010L, 0x40000000L, 0x00100000L, - 0x00008010L, 0x40108010L, 0x00100010L, 0x40108000L, 0x40008000L, - 0x00108010L, 0x40108010L, 0x00100010L, 0x40000010L, 0x00000000L, - 0x40000000L, 0x00008010L, 0x00100000L, 0x40100010L, 0x00008000L, - 0x40000000L, 0x00108010L, 0x40008010L, 0x40108000L, 0x00008000L, - 0x00000000L, 0x40000010L, 0x00000010L, 0x40108010L, 0x00108000L, - 0x40100000L, 0x40100010L, 0x00100000L, 0x00008010L, 0x40008000L, - 0x40008010L, 0x00000010L, 0x40100000L, 0x00108000L, }, + 0x40108010, 0x00000000, 0x00108000, 0x40100000, 0x40000010, + 0x00008010, 0x40008000, 0x00108000, 0x00008000, 0x40100010, + 0x00000010, 0x40008000, 0x00100010, 0x40108000, 0x40100000, + 0x00000010, 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, 0x40008010, + 0x00108010, 0x40108000, 0x40000010, 0x40000000, 0x00100000, + 0x00008010, 0x40108010, 0x00100010, 0x40108000, 0x40008000, + 0x00108010, 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, 0x00008000, + 0x40000000, 0x00108010, 0x40008010, 0x40108000, 0x00008000, + 0x00000000, 0x40000010, 0x00000010, 0x40108010, 0x00108000, + 0x40100000, 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, }, { // nibble 2 - 0x04000001L, 0x04040100L, 0x00000100L, 0x04000101L, 0x00040001L, - 0x04000000L, 0x04000101L, 0x00040100L, 0x04000100L, 0x00040000L, - 0x04040000L, 0x00000001L, 0x04040101L, 0x00000101L, 0x00000001L, - 0x04040001L, 0x00000000L, 0x00040001L, 0x04040100L, 0x00000100L, - 0x00000101L, 0x04040101L, 0x00040000L, 0x04000001L, 0x04040001L, - 0x04000100L, 0x00040101L, 0x04040000L, 0x00040100L, 0x00000000L, - 0x04000000L, 0x00040101L, 0x04040100L, 0x00000100L, 0x00000001L, - 0x00040000L, 0x00000101L, 0x00040001L, 0x04040000L, 0x04000101L, - 0x00000000L, 0x04040100L, 0x00040100L, 0x04040001L, 0x00040001L, - 0x04000000L, 0x04040101L, 0x00000001L, 0x00040101L, 0x04000001L, - 0x04000000L, 0x04040101L, 0x00040000L, 0x04000100L, 0x04000101L, - 0x00040100L, 0x04000100L, 0x00000000L, 0x04040001L, 0x00000101L, - 0x04000001L, 0x00040101L, 0x00000100L, 0x04040000L, }, + 0x04000001, 0x04040100, 0x00000100, 0x04000101, 0x00040001, + 0x04000000, 0x04000101, 0x00040100, 0x04000100, 0x00040000, + 0x04040000, 0x00000001, 0x04040101, 0x00000101, 0x00000001, + 0x04040001, 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, 0x04040001, + 0x04000100, 0x00040101, 0x04040000, 0x00040100, 0x00000000, + 0x04000000, 0x00040101, 0x04040100, 0x00000100, 0x00000001, + 0x00040000, 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, 0x00040001, + 0x04000000, 0x04040101, 0x00000001, 0x00040101, 0x04000001, + 0x04000000, 0x04040101, 0x00040000, 0x04000100, 0x04000101, + 0x00040100, 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, }, { // nibble 3 - 0x00401008L, 0x10001000L, 0x00000008L, 0x10401008L, 0x00000000L, - 0x10400000L, 0x10001008L, 0x00400008L, 0x10401000L, 0x10000008L, - 0x10000000L, 0x00001008L, 0x10000008L, 0x00401008L, 0x00400000L, - 0x10000000L, 0x10400008L, 0x00401000L, 0x00001000L, 0x00000008L, - 0x00401000L, 0x10001008L, 0x10400000L, 0x00001000L, 0x00001008L, - 0x00000000L, 0x00400008L, 0x10401000L, 0x10001000L, 0x10400008L, - 0x10401008L, 0x00400000L, 0x10400008L, 0x00001008L, 0x00400000L, - 0x10000008L, 0x00401000L, 0x10001000L, 0x00000008L, 0x10400000L, - 0x10001008L, 0x00000000L, 0x00001000L, 0x00400008L, 0x00000000L, - 0x10400008L, 0x10401000L, 0x00001000L, 0x10000000L, 0x10401008L, - 0x00401008L, 0x00400000L, 0x10401008L, 0x00000008L, 0x10001000L, - 0x00401008L, 0x00400008L, 0x00401000L, 0x10400000L, 0x10001008L, - 0x00001008L, 0x10000000L, 0x10000008L, 0x10401000L, }, + 0x00401008, 0x10001000, 0x00000008, 0x10401008, 0x00000000, + 0x10400000, 0x10001008, 0x00400008, 0x10401000, 0x10000008, + 0x10000000, 0x00001008, 0x10000008, 0x00401008, 0x00400000, + 0x10000000, 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, 0x00001008, + 0x00000000, 0x00400008, 0x10401000, 0x10001000, 0x10400008, + 0x10401008, 0x00400000, 0x10400008, 0x00001008, 0x00400000, + 0x10000008, 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, 0x00000000, + 0x10400008, 0x10401000, 0x00001000, 0x10000000, 0x10401008, + 0x00401008, 0x00400000, 0x10401008, 0x00000008, 0x10001000, + 0x00401008, 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, }, { // nibble 4 - 0x08000000L, 0x00010000L, 0x00000400L, 0x08010420L, 0x08010020L, - 0x08000400L, 0x00010420L, 0x08010000L, 0x00010000L, 0x00000020L, - 0x08000020L, 0x00010400L, 0x08000420L, 0x08010020L, 0x08010400L, - 0x00000000L, 0x00010400L, 0x08000000L, 0x00010020L, 0x00000420L, - 0x08000400L, 0x00010420L, 0x00000000L, 0x08000020L, 0x00000020L, - 0x08000420L, 0x08010420L, 0x00010020L, 0x08010000L, 0x00000400L, - 0x00000420L, 0x08010400L, 0x08010400L, 0x08000420L, 0x00010020L, - 0x08010000L, 0x00010000L, 0x00000020L, 0x08000020L, 0x08000400L, - 0x08000000L, 0x00010400L, 0x08010420L, 0x00000000L, 0x00010420L, - 0x08000000L, 0x00000400L, 0x00010020L, 0x08000420L, 0x00000400L, - 0x00000000L, 0x08010420L, 0x08010020L, 0x08010400L, 0x00000420L, - 0x00010000L, 0x00010400L, 0x08010020L, 0x08000400L, 0x00000420L, - 0x00000020L, 0x00010420L, 0x08010000L, 0x08000020L, }, + 0x08000000, 0x00010000, 0x00000400, 0x08010420, 0x08010020, + 0x08000400, 0x00010420, 0x08010000, 0x00010000, 0x00000020, + 0x08000020, 0x00010400, 0x08000420, 0x08010020, 0x08010400, + 0x00000000, 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, 0x00000020, + 0x08000420, 0x08010420, 0x00010020, 0x08010000, 0x00000400, + 0x00000420, 0x08010400, 0x08010400, 0x08000420, 0x00010020, + 0x08010000, 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, 0x00010420, + 0x08000000, 0x00000400, 0x00010020, 0x08000420, 0x00000400, + 0x00000000, 0x08010420, 0x08010020, 0x08010400, 0x00000420, + 0x00010000, 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, }, { // nibble 5 - 0x80000040L, 0x00200040L, 0x00000000L, 0x80202000L, 0x00200040L, - 0x00002000L, 0x80002040L, 0x00200000L, 0x00002040L, 0x80202040L, - 0x00202000L, 0x80000000L, 0x80002000L, 0x80000040L, 0x80200000L, - 0x00202040L, 0x00200000L, 0x80002040L, 0x80200040L, 0x00000000L, - 0x00002000L, 0x00000040L, 0x80202000L, 0x80200040L, 0x80202040L, - 0x80200000L, 0x80000000L, 0x00002040L, 0x00000040L, 0x00202000L, - 0x00202040L, 0x80002000L, 0x00002040L, 0x80000000L, 0x80002000L, - 0x00202040L, 0x80202000L, 0x00200040L, 0x00000000L, 0x80002000L, - 0x80000000L, 0x00002000L, 0x80200040L, 0x00200000L, 0x00200040L, - 0x80202040L, 0x00202000L, 0x00000040L, 0x80202040L, 0x00202000L, - 0x00200000L, 0x80002040L, 0x80000040L, 0x80200000L, 0x00202040L, - 0x00000000L, 0x00002000L, 0x80000040L, 0x80002040L, 0x80202000L, - 0x80200000L, 0x00002040L, 0x00000040L, 0x80200040L, }, + 0x80000040, 0x00200040, 0x00000000, 0x80202000, 0x00200040, + 0x00002000, 0x80002040, 0x00200000, 0x00002040, 0x80202040, + 0x00202000, 0x80000000, 0x80002000, 0x80000040, 0x80200000, + 0x00202040, 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, 0x80202040, + 0x80200000, 0x80000000, 0x00002040, 0x00000040, 0x00202000, + 0x00202040, 0x80002000, 0x00002040, 0x80000000, 0x80002000, + 0x00202040, 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, 0x00200040, + 0x80202040, 0x00202000, 0x00000040, 0x80202040, 0x00202000, + 0x00200000, 0x80002040, 0x80000040, 0x80200000, 0x00202040, + 0x00000000, 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, }, { // nibble 6 - 0x00004000L, 0x00000200L, 0x01000200L, 0x01000004L, 0x01004204L, - 0x00004004L, 0x00004200L, 0x00000000L, 0x01000000L, 0x01000204L, - 0x00000204L, 0x01004000L, 0x00000004L, 0x01004200L, 0x01004000L, - 0x00000204L, 0x01000204L, 0x00004000L, 0x00004004L, 0x01004204L, - 0x00000000L, 0x01000200L, 0x01000004L, 0x00004200L, 0x01004004L, - 0x00004204L, 0x01004200L, 0x00000004L, 0x00004204L, 0x01004004L, - 0x00000200L, 0x01000000L, 0x00004204L, 0x01004000L, 0x01004004L, - 0x00000204L, 0x00004000L, 0x00000200L, 0x01000000L, 0x01004004L, - 0x01000204L, 0x00004204L, 0x00004200L, 0x00000000L, 0x00000200L, - 0x01000004L, 0x00000004L, 0x01000200L, 0x00000000L, 0x01000204L, - 0x01000200L, 0x00004200L, 0x00000204L, 0x00004000L, 0x01004204L, - 0x01000000L, 0x01004200L, 0x00000004L, 0x00004004L, 0x01004204L, - 0x01000004L, 0x01004200L, 0x01004000L, 0x00004004L, }, + 0x00004000, 0x00000200, 0x01000200, 0x01000004, 0x01004204, + 0x00004004, 0x00004200, 0x00000000, 0x01000000, 0x01000204, + 0x00000204, 0x01004000, 0x00000004, 0x01004200, 0x01004000, + 0x00000204, 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, 0x01004004, + 0x00004204, 0x01004200, 0x00000004, 0x00004204, 0x01004004, + 0x00000200, 0x01000000, 0x00004204, 0x01004000, 0x01004004, + 0x00000204, 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, 0x00000200, + 0x01000004, 0x00000004, 0x01000200, 0x00000000, 0x01000204, + 0x01000200, 0x00004200, 0x00000204, 0x00004000, 0x01004204, + 0x01000000, 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, }, { // nibble 7 - 0x20800080L, 0x20820000L, 0x00020080L, 0x00000000L, 0x20020000L, - 0x00800080L, 0x20800000L, 0x20820080L, 0x00000080L, 0x20000000L, - 0x00820000L, 0x00020080L, 0x00820080L, 0x20020080L, 0x20000080L, - 0x20800000L, 0x00020000L, 0x00820080L, 0x00800080L, 0x20020000L, - 0x20820080L, 0x20000080L, 0x00000000L, 0x00820000L, 0x20000000L, - 0x00800000L, 0x20020080L, 0x20800080L, 0x00800000L, 0x00020000L, - 0x20820000L, 0x00000080L, 0x00800000L, 0x00020000L, 0x20000080L, - 0x20820080L, 0x00020080L, 0x20000000L, 0x00000000L, 0x00820000L, - 0x20800080L, 0x20020080L, 0x20020000L, 0x00800080L, 0x20820000L, - 0x00000080L, 0x00800080L, 0x20020000L, 0x20820080L, 0x00800000L, - 0x20800000L, 0x20000080L, 0x00820000L, 0x00020080L, 0x20020080L, - 0x20800000L, 0x00000080L, 0x20820000L, 0x00820080L, 0x00000000L, - 0x20000000L, 0x20800080L, 0x00020000L, 0x00820080L, }}; + 0x20800080, 0x20820000, 0x00020080, 0x00000000, 0x20020000, + 0x00800080, 0x20800000, 0x20820080, 0x00000080, 0x20000000, + 0x00820000, 0x00020080, 0x00820080, 0x20020080, 0x20000080, + 0x20800000, 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, 0x20000000, + 0x00800000, 0x20020080, 0x20800080, 0x00800000, 0x00020000, + 0x20820000, 0x00000080, 0x00800000, 0x00020000, 0x20000080, + 0x20820080, 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, 0x20820000, + 0x00000080, 0x00800080, 0x20020000, 0x20820080, 0x00800000, + 0x20800000, 0x20000080, 0x00820000, 0x00020080, 0x20020080, + 0x20800000, 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, }}; #define HPERM_OP(a, t, n, m) \ ((t) = ((((a) << (16 - (n))) ^ (a)) & (m)), \ @@ -308,43 +308,43 @@ void DES_set_key(const DES_cblock *key, DES_key_schedule *schedule) { // do PC1 in 47 simple operations :-) // Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov) // for the inspiration. :-) - PERM_OP(d, c, t, 4, 0x0f0f0f0fL); - HPERM_OP(c, t, -2, 0xcccc0000L); - HPERM_OP(d, t, -2, 0xcccc0000L); - PERM_OP(d, c, t, 1, 0x55555555L); - PERM_OP(c, d, t, 8, 0x00ff00ffL); - PERM_OP(d, c, t, 1, 0x55555555L); - d = (((d & 0x000000ffL) << 16L) | (d & 0x0000ff00L) | - ((d & 0x00ff0000L) >> 16L) | ((c & 0xf0000000L) >> 4L)); - c &= 0x0fffffffL; + PERM_OP(d, c, t, 4, 0x0f0f0f0f); + HPERM_OP(c, t, -2, 0xcccc0000); + HPERM_OP(d, t, -2, 0xcccc0000); + PERM_OP(d, c, t, 1, 0x55555555); + PERM_OP(c, d, t, 8, 0x00ff00ff); + PERM_OP(d, c, t, 1, 0x55555555); + d = (((d & 0x000000ff) << 16) | (d & 0x0000ff00) | + ((d & 0x00ff0000) >> 16) | ((c & 0xf0000000) >> 4)); + c &= 0x0fffffff; for (i = 0; i < ITERATIONS; i++) { if (shifts2[i]) { - c = ((c >> 2L) | (c << 26L)); - d = ((d >> 2L) | (d << 26L)); + c = ((c >> 2) | (c << 26)); + d = ((d >> 2) | (d << 26)); } else { - c = ((c >> 1L) | (c << 27L)); - d = ((d >> 1L) | (d << 27L)); + c = ((c >> 1) | (c << 27)); + d = ((d >> 1) | (d << 27)); } - c &= 0x0fffffffL; - d &= 0x0fffffffL; + c &= 0x0fffffff; + d &= 0x0fffffff; // could be a few less shifts but I am to lazy at this // point in time to investigate s = des_skb[0][(c) & 0x3f] | - des_skb[1][((c >> 6L) & 0x03) | ((c >> 7L) & 0x3c)] | - des_skb[2][((c >> 13L) & 0x0f) | ((c >> 14L) & 0x30)] | - des_skb[3][((c >> 20L) & 0x01) | ((c >> 21L) & 0x06) | - ((c >> 22L) & 0x38)]; + des_skb[1][((c >> 6) & 0x03) | ((c >> 7) & 0x3c)] | + des_skb[2][((c >> 13) & 0x0f) | ((c >> 14) & 0x30)] | + des_skb[3][((c >> 20) & 0x01) | ((c >> 21) & 0x06) | + ((c >> 22) & 0x38)]; t = des_skb[4][(d) & 0x3f] | - des_skb[5][((d >> 7L) & 0x03) | ((d >> 8L) & 0x3c)] | - des_skb[6][(d >> 15L) & 0x3f] | - des_skb[7][((d >> 21L) & 0x0f) | ((d >> 22L) & 0x30)]; + des_skb[5][((d >> 7) & 0x03) | ((d >> 8) & 0x3c)] | + des_skb[6][(d >> 15) & 0x3f] | + des_skb[7][((d >> 21) & 0x0f) | ((d >> 22) & 0x30)]; // table contained 0213 4657 - t2 = ((t << 16L) | (s & 0x0000ffffL)) & 0xffffffffL; + t2 = ((t << 16) | (s & 0x0000ffff)) & 0xffffffff; schedule->subkeys[i][0] = CRYPTO_rotr_u32(t2, 30); - t2 = ((s >> 16L) | (t & 0xffff0000L)); + t2 = ((s >> 16) | (t & 0xffff0000)); schedule->subkeys[i][1] = CRYPTO_rotr_u32(t2, 26); } } diff --git a/third_party/boringssl/src/crypto/dh_extra/dh_test.cc b/third_party/boringssl/src/crypto/dh_extra/dh_test.cc index b88702bcc4e2..7a1707027652 100644 --- a/third_party/boringssl/src/crypto/dh_extra/dh_test.cc +++ b/third_party/boringssl/src/crypto/dh_extra/dh_test.cc @@ -75,126 +75,41 @@ #include "../test/test_util.h" -static bool RunBasicTests(); -static bool TestBadY(); -static bool TestASN1(); -static bool TestRFC3526(); - -// TODO(davidben): Convert this file to GTest properly. -TEST(DHTest, AllTests) { - if (!RunBasicTests() || - !TestBadY() || - !TestASN1() || - !TestRFC3526()) { - ADD_FAILURE() << "Tests failed."; - } -} - -static int GenerateCallback(int p, int n, BN_GENCB *arg) { - char c = '*'; - - if (p == 0) { - c = '.'; - } else if (p == 1) { - c = '+'; - } else if (p == 2) { - c = '*'; - } else if (p == 3) { - c = '\n'; - } - FILE *out = reinterpret_cast(arg->arg); - fputc(c, out); - fflush(out); - - return 1; -} - -static bool RunBasicTests() { - BN_GENCB cb; - BN_GENCB_set(&cb, &GenerateCallback, stdout); +TEST(DHTest, Basic) { bssl::UniquePtr a(DH_new()); - if (!a || !DH_generate_parameters_ex(a.get(), 64, DH_GENERATOR_5, &cb)) { - return false; - } + ASSERT_TRUE(a); + ASSERT_TRUE(DH_generate_parameters_ex(a.get(), 64, DH_GENERATOR_5, nullptr)); int check_result; - if (!DH_check(a.get(), &check_result)) { - return false; - } - if (check_result & DH_CHECK_P_NOT_PRIME) { - printf("p value is not prime\n"); - } - if (check_result & DH_CHECK_P_NOT_SAFE_PRIME) { - printf("p value is not a safe prime\n"); - } - if (check_result & DH_CHECK_UNABLE_TO_CHECK_GENERATOR) { - printf("unable to check the generator value\n"); - } - if (check_result & DH_CHECK_NOT_SUITABLE_GENERATOR) { - printf("the g value is not a generator\n"); - } - - printf("\np = "); - BN_print_fp(stdout, DH_get0_p(a.get())); - printf("\ng = "); - BN_print_fp(stdout, DH_get0_g(a.get())); - printf("\n"); + ASSERT_TRUE(DH_check(a.get(), &check_result)); + EXPECT_FALSE(check_result & DH_CHECK_P_NOT_PRIME); + EXPECT_FALSE(check_result & DH_CHECK_P_NOT_SAFE_PRIME); + EXPECT_FALSE(check_result & DH_CHECK_UNABLE_TO_CHECK_GENERATOR); + EXPECT_FALSE(check_result & DH_CHECK_NOT_SUITABLE_GENERATOR); bssl::UniquePtr b(DHparams_dup(a.get())); - if (!b) { - return false; - } - - if (!DH_generate_key(a.get())) { - return false; - } - printf("pri1 = "); - BN_print_fp(stdout, DH_get0_priv_key(a.get())); - printf("\npub1 = "); - BN_print_fp(stdout, DH_get0_pub_key(a.get())); - printf("\n"); + ASSERT_TRUE(b); - if (!DH_generate_key(b.get())) { - return false; - } - printf("pri2 = "); - BN_print_fp(stdout, DH_get0_priv_key(b.get())); - printf("\npub2 = "); - BN_print_fp(stdout, DH_get0_pub_key(b.get())); - printf("\n"); + ASSERT_TRUE(DH_generate_key(a.get())); + ASSERT_TRUE(DH_generate_key(b.get())); std::vector key1(DH_size(a.get())); int ret = DH_compute_key(key1.data(), DH_get0_pub_key(b.get()), a.get()); - if (ret < 0) { - return false; - } + ASSERT_GE(ret, 0); key1.resize(ret); - printf("key1 = "); - for (size_t i = 0; i < key1.size(); i++) { - printf("%02x", key1[i]); - } - printf("\n"); - std::vector key2(DH_size(b.get())); ret = DH_compute_key(key2.data(), DH_get0_pub_key(a.get()), b.get()); - if (ret < 0) { - return false; - } + ASSERT_GE(ret, 0); key2.resize(ret); - printf("key2 = "); - for (size_t i = 0; i < key2.size(); i++) { - printf("%02x", key2[i]); - } - printf("\n"); - - if (key1.size() < 4 || key1 != key2) { - fprintf(stderr, "Error in DH routines\n"); - return false; - } + EXPECT_EQ(Bytes(key1), Bytes(key2)); - return true; + // |DH_compute_key|, unlike |DH_compute_key_padded|, removes leading zeros + // from the output, so the key will not have a fixed length. This test uses a + // small, 64-bit prime, so check for at least 32 bits of output after removing + // leading zeros. + EXPECT_GE(key1.size(), 4u); } // The following parameters are taken from RFC 5114, section 2.2. This is not a @@ -280,38 +195,30 @@ static const uint8_t kRFC5114_2048_224BadY[] = { 0x93, 0x74, 0x89, 0x59, }; -static bool TestBadY() { +TEST(DHTest, BadY) { bssl::UniquePtr dh(DH_new()); + ASSERT_TRUE(dh); dh->p = BN_bin2bn(kRFC5114_2048_224P, sizeof(kRFC5114_2048_224P), nullptr); dh->g = BN_bin2bn(kRFC5114_2048_224G, sizeof(kRFC5114_2048_224G), nullptr); dh->q = BN_bin2bn(kRFC5114_2048_224Q, sizeof(kRFC5114_2048_224Q), nullptr); - if (!dh->p || !dh->g || !dh->q) { - return false; - } + ASSERT_TRUE(dh->p); + ASSERT_TRUE(dh->g); + ASSERT_TRUE(dh->q); bssl::UniquePtr pub_key( BN_bin2bn(kRFC5114_2048_224BadY, sizeof(kRFC5114_2048_224BadY), nullptr)); - if (!dh || !pub_key || !DH_generate_key(dh.get())) { - return false; - } + ASSERT_TRUE(pub_key); + ASSERT_TRUE(DH_generate_key(dh.get())); int flags; - if (!DH_check_pub_key(dh.get(), pub_key.get(), &flags)) { - return false; - } - if (!(flags & DH_CHECK_PUBKEY_INVALID)) { - fprintf(stderr, "DH_check_pub_key did not reject the key.\n"); - return false; - } + ASSERT_TRUE(DH_check_pub_key(dh.get(), pub_key.get(), &flags)); + EXPECT_TRUE(flags & DH_CHECK_PUBKEY_INVALID) + << "DH_check_pub_key did not reject the key"; std::vector result(DH_size(dh.get())); - if (DH_compute_key(result.data(), pub_key.get(), dh.get()) >= 0) { - fprintf(stderr, "DH_compute_key unexpectedly succeeded.\n"); - return false; - } + EXPECT_LT(DH_compute_key(result.data(), pub_key.get(), dh.get()), 0) + << "DH_compute_key unexpectedly succeeded"; ERR_clear_error(); - - return true; } static bool BIGNUMEqualsHex(const BIGNUM *bn, const char *hex) { @@ -323,7 +230,7 @@ static bool BIGNUMEqualsHex(const BIGNUM *bn, const char *hex) { return BN_cmp(bn, hex_bn) == 0; } -static bool TestASN1() { +TEST(DHTest, ASN1) { // kParams are a set of Diffie-Hellman parameters generated with // openssl dhparam 256 static const uint8_t kParams[] = { @@ -336,27 +243,22 @@ static bool TestASN1() { CBS cbs; CBS_init(&cbs, kParams, sizeof(kParams)); bssl::UniquePtr dh(DH_parse_parameters(&cbs)); - if (!dh || CBS_len(&cbs) != 0 || - !BIGNUMEqualsHex( - DH_get0_p(dh.get()), - "d72034a3274fdfbf04fd246825b656d8ab2a412d740a52087c40714ed2579313") || - !BIGNUMEqualsHex(DH_get0_g(dh.get()), "2") || dh->priv_length != 0) { - return false; - } + ASSERT_TRUE(dh); + EXPECT_EQ(CBS_len(&cbs), 0u); + EXPECT_TRUE(BIGNUMEqualsHex( + DH_get0_p(dh.get()), + "d72034a3274fdfbf04fd246825b656d8ab2a412d740a52087c40714ed2579313")); + EXPECT_TRUE(BIGNUMEqualsHex(DH_get0_g(dh.get()), "2")); + EXPECT_EQ(dh->priv_length, 0u); bssl::ScopedCBB cbb; uint8_t *der; size_t der_len; - if (!CBB_init(cbb.get(), 0) || - !DH_marshal_parameters(cbb.get(), dh.get()) || - !CBB_finish(cbb.get(), &der, &der_len)) { - return false; - } + ASSERT_TRUE(CBB_init(cbb.get(), 0)); + ASSERT_TRUE(DH_marshal_parameters(cbb.get(), dh.get())); + ASSERT_TRUE(CBB_finish(cbb.get(), &der, &der_len)); bssl::UniquePtr free_der(der); - if (der_len != sizeof(kParams) || - OPENSSL_memcmp(der, kParams, der_len) != 0) { - return false; - } + EXPECT_EQ(Bytes(kParams), Bytes(der, der_len)); // kParamsDSA are a set of Diffie-Hellman parameters generated with // openssl dhparam 256 -dsaparam @@ -377,38 +279,30 @@ static bool TestASN1() { CBS_init(&cbs, kParamsDSA, sizeof(kParamsDSA)); dh.reset(DH_parse_parameters(&cbs)); - if (!dh || CBS_len(&cbs) != 0 || - !BIGNUMEqualsHex(DH_get0_p(dh.get()), - "93f3c11801e662b6d1469a2c72ea31d91810302863e2347d80caee8" - "22b193c19bb42830270dddb8c03abe99cc4004d705f5203312ca467" - "3451952aac11e26a55") || - !BIGNUMEqualsHex(DH_get0_g(dh.get()), - "44c8105344323163d8d18c75c898533b5b4a2a0a09e7d03c5372a86" - "b70419c267144fc7f0875e102ab7441e82a3d3c263309e48bb441ec" - "a6a8ba1a078a77f55f") || - dh->priv_length != 160) { - return false; - } - - if (!CBB_init(cbb.get(), 0) || - !DH_marshal_parameters(cbb.get(), dh.get()) || - !CBB_finish(cbb.get(), &der, &der_len)) { - return false; - } + ASSERT_TRUE(dh); + EXPECT_EQ(CBS_len(&cbs), 0u); + EXPECT_TRUE( + BIGNUMEqualsHex(DH_get0_p(dh.get()), + "93f3c11801e662b6d1469a2c72ea31d91810302863e2347d80caee8" + "22b193c19bb42830270dddb8c03abe99cc4004d705f5203312ca467" + "3451952aac11e26a55")); + EXPECT_TRUE( + BIGNUMEqualsHex(DH_get0_g(dh.get()), + "44c8105344323163d8d18c75c898533b5b4a2a0a09e7d03c5372a86" + "b70419c267144fc7f0875e102ab7441e82a3d3c263309e48bb441ec" + "a6a8ba1a078a77f55f")); + EXPECT_EQ(dh->priv_length, 160u); + + ASSERT_TRUE(CBB_init(cbb.get(), 0)); + ASSERT_TRUE(DH_marshal_parameters(cbb.get(), dh.get())); + ASSERT_TRUE(CBB_finish(cbb.get(), &der, &der_len)); bssl::UniquePtr free_der2(der); - if (der_len != sizeof(kParamsDSA) || - OPENSSL_memcmp(der, kParamsDSA, der_len) != 0) { - return false; - } - - return true; + EXPECT_EQ(Bytes(kParamsDSA), Bytes(der, der_len)); } -static bool TestRFC3526() { +TEST(DHTest, RFC3526) { bssl::UniquePtr bn(BN_get_rfc3526_prime_1536(nullptr)); - if (!bn) { - return false; - } + ASSERT_TRUE(bn); static const uint8_t kPrime1536[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x0f, 0xda, 0xa2, @@ -430,14 +324,9 @@ static bool TestRFC3526() { }; uint8_t buffer[sizeof(kPrime1536)]; - if (BN_num_bytes(bn.get()) != sizeof(kPrime1536) || - BN_bn2bin(bn.get(), buffer) != sizeof(kPrime1536) || - OPENSSL_memcmp(buffer, kPrime1536, sizeof(kPrime1536)) != 0) { - fprintf(stderr, "1536-bit MODP prime did not match.\n"); - return false; - } - - return true; + ASSERT_EQ(BN_num_bytes(bn.get()), sizeof(kPrime1536)); + ASSERT_EQ(BN_bn2bin(bn.get(), buffer), sizeof(kPrime1536)); + EXPECT_EQ(Bytes(buffer), Bytes(kPrime1536)); } TEST(DHTest, LeadingZeros) { diff --git a/third_party/boringssl/src/crypto/digest_extra/digest_extra.c b/third_party/boringssl/src/crypto/digest_extra/digest_extra.c index 8cbb28e3afde..08ed671a8095 100644 --- a/third_party/boringssl/src/crypto/digest_extra/digest_extra.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/dsa/dsa.c b/third_party/boringssl/src/crypto/dsa/dsa.c index f1fc02fa95a8..8be01b9f618c 100644 --- a/third_party/boringssl/src/crypto/dsa/dsa.c +++ b/third_party/boringssl/src/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; } @@ -217,16 +216,14 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, BIGNUM *g = NULL, *q = NULL, *p = NULL; BN_MONT_CTX *mont = NULL; int k, n = 0, m = 0; - unsigned i; int counter = 0; int r = 0; BN_CTX *ctx = NULL; unsigned int h = 2; - unsigned qsize; const EVP_MD *evpmd; evpmd = (bits >= 2048) ? EVP_sha256() : EVP_sha1(); - qsize = EVP_MD_size(evpmd); + size_t qsize = EVP_MD_size(evpmd); if (bits < 512) { bits = 512; @@ -235,10 +232,10 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, bits = (bits + 63) / 64 * 64; if (seed_in != NULL) { - if (seed_len < (size_t)qsize) { + if (seed_len < qsize) { return 0; } - if (seed_len > (size_t)qsize) { + if (seed_len > qsize) { // Only consume as much seed as is expected. seed_len = qsize; } @@ -284,7 +281,7 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, OPENSSL_memcpy(buf, seed, qsize); OPENSSL_memcpy(buf2, seed, qsize); // precompute "SEED + 1" for step 7: - for (i = qsize - 1; i < qsize; i--) { + for (size_t i = qsize - 1; i < qsize; i--) { buf[i]++; if (buf[i] != 0) { break; @@ -296,7 +293,7 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, !EVP_Digest(buf, qsize, buf2, NULL, evpmd, NULL)) { goto err; } - for (i = 0; i < qsize; i++) { + for (size_t i = 0; i < qsize; i++) { md[i] ^= buf2[i]; } @@ -340,7 +337,7 @@ int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in, // now 'buf' contains "SEED + offset - 1" for (k = 0; k <= n; k++) { // obtain "SEED + offset + k" by incrementing: - for (i = qsize - 1; i < qsize; i--) { + for (size_t i = qsize - 1; i < qsize; i--) { buf[i]++; if (buf[i] != 0) { break; @@ -591,7 +588,12 @@ 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; + } + + if (dsa->priv_key == NULL) { + OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS); return NULL; } @@ -612,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; @@ -651,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; @@ -686,7 +702,12 @@ 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; + } + + if (dsa->pub_key == NULL) { + OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS); return 0; } @@ -845,6 +866,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. @@ -867,11 +892,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/third_party/boringssl/src/crypto/dsa/dsa_asn1.c b/third_party/boringssl/src/crypto/dsa/dsa_asn1.c index 3f3bd48866cb..1985bb4f6fd3 100644 --- a/third_party/boringssl/src/crypto/dsa/dsa_asn1.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/dsa/dsa_test.cc b/third_party/boringssl/src/crypto/dsa/dsa_test.cc index cee783d6c23c..cc02782a3654 100644 --- a/third_party/boringssl/src/crypto/dsa/dsa_test.cc +++ b/third_party/boringssl/src/crypto/dsa/dsa_test.cc @@ -69,8 +69,10 @@ #include #include #include +#include +#include -#include "../internal.h" +#include "../test/test_util.h" // The following values are taken from the updated Appendix 5 to FIPS PUB 186 @@ -168,154 +170,88 @@ static const uint8_t fips_sig_bad_r[] = { 0xdc, 0xd8, 0xc8, }; -static bssl::UniquePtr GetFIPSDSA(void) { - bssl::UniquePtr dsa(DSA_new()); +static bssl::UniquePtr GetFIPSDSAGroup(void) { + bssl::UniquePtr dsa(DSA_new()); if (!dsa) { return nullptr; } - dsa->p = BN_bin2bn(fips_p, sizeof(fips_p), nullptr); - dsa->q = BN_bin2bn(fips_q, sizeof(fips_q), nullptr); - dsa->g = BN_bin2bn(fips_g, sizeof(fips_g), nullptr); - dsa->pub_key = BN_bin2bn(fips_y, sizeof(fips_y), nullptr); - dsa->priv_key = BN_bin2bn(fips_x, sizeof(fips_x), nullptr); - if (dsa->p == nullptr || dsa->q == nullptr || dsa->g == nullptr || - dsa->pub_key == nullptr || dsa->priv_key == nullptr) { + bssl::UniquePtr p(BN_bin2bn(fips_p, sizeof(fips_p), nullptr)); + bssl::UniquePtr q(BN_bin2bn(fips_q, sizeof(fips_q), nullptr)); + bssl::UniquePtr g(BN_bin2bn(fips_g, sizeof(fips_g), nullptr)); + if (!p || !q || !g || !DSA_set0_pqg(dsa.get(), p.get(), q.get(), g.get())) { return nullptr; } + // |DSA_set0_pqg| takes ownership. + p.release(); + q.release(); + g.release(); return dsa; } -struct GenerateContext { - FILE *out = nullptr; - int ok = 0; - int num = 0; -}; - -static int GenerateCallback(int p, int n, BN_GENCB *arg) { - GenerateContext *ctx = reinterpret_cast(arg->arg); - char c = '*'; - switch (p) { - case 0: - c = '.'; - ctx->num++; - break; - case 1: - c = '+'; - break; - case 2: - c = '*'; - ctx->ok++; - break; - case 3: - c = '\n'; +static bssl::UniquePtr GetFIPSDSA(void) { + bssl::UniquePtr dsa = GetFIPSDSAGroup(); + if (!dsa) { + return nullptr; } - fputc(c, ctx->out); - fflush(ctx->out); - if (!ctx->ok && p == 0 && ctx->num > 1) { - fprintf(stderr, "error in dsatest\n"); - return 0; + 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 || + !DSA_set0_key(dsa.get(), pub_key.get(), priv_key.get())) { + return nullptr; } - return 1; + // |DSA_set0_key| takes ownership. + pub_key.release(); + priv_key.release(); + return dsa; } -static int TestGenerate(FILE *out) { - BN_GENCB cb; - int counter, i, j; - uint8_t buf[256]; - unsigned long h; - uint8_t sig[256]; - unsigned int siglen; - - fprintf(out, "test generation of DSA parameters\n"); - - GenerateContext ctx; - ctx.out = out; - BN_GENCB_set(&cb, GenerateCallback, &ctx); +TEST(DSATest, Generate) { bssl::UniquePtr dsa(DSA_new()); - if (!dsa || - !DSA_generate_parameters_ex(dsa.get(), 512, seed, 20, &counter, &h, - &cb)) { - return false; - } - - fprintf(out, "seed\n"); - for (i = 0; i < 20; i += 4) { - fprintf(out, "%02X%02X%02X%02X ", seed[i], seed[i + 1], seed[i + 2], - seed[i + 3]); - } - fprintf(out, "\ncounter=%d h=%lu\n", counter, h); - - if (counter != 105) { - fprintf(stderr, "counter should be 105\n"); - return false; - } - if (h != 2) { - fprintf(stderr, "h should be 2\n"); - return false; - } - - i = BN_bn2bin(dsa->q, buf); - j = sizeof(fips_q); - if (i != j || OPENSSL_memcmp(buf, fips_q, i) != 0) { - fprintf(stderr, "q value is wrong\n"); - return false; - } - - i = BN_bn2bin(dsa->p, buf); - j = sizeof(fips_p); - if (i != j || OPENSSL_memcmp(buf, fips_p, i) != 0) { - fprintf(stderr, "p value is wrong\n"); - return false; - } - - i = BN_bn2bin(dsa->g, buf); - j = sizeof(fips_g); - if (i != j || OPENSSL_memcmp(buf, fips_g, i) != 0) { - fprintf(stderr, "g value is wrong\n"); - return false; - } + ASSERT_TRUE(dsa); + int counter; + unsigned long h; + ASSERT_TRUE(DSA_generate_parameters_ex(dsa.get(), 512, seed, 20, &counter, &h, + nullptr)); + EXPECT_EQ(counter, 105); + EXPECT_EQ(h, 2u); + + auto expect_bn_bytes = [](const char *msg, const BIGNUM *bn, + bssl::Span bytes) { + std::vector buf(BN_num_bytes(bn)); + BN_bn2bin(bn, buf.data()); + EXPECT_EQ(Bytes(buf), Bytes(bytes)) << msg; + }; + expect_bn_bytes("q value is wrong", DSA_get0_q(dsa.get()), fips_q); + expect_bn_bytes("p value is wrong", DSA_get0_p(dsa.get()), fips_p); + expect_bn_bytes("g value is wrong", DSA_get0_g(dsa.get()), fips_g); + + ASSERT_TRUE(DSA_generate_key(dsa.get())); - if (!DSA_generate_key(dsa.get()) || - !DSA_sign(0, fips_digest, sizeof(fips_digest), sig, &siglen, dsa.get())) { - return false; - } - if (DSA_verify(0, fips_digest, sizeof(fips_digest), sig, siglen, dsa.get()) != - 1) { - fprintf(stderr, "verification failure\n"); - return false; - } + std::vector sig(DSA_size(dsa.get())); + unsigned sig_len; + ASSERT_TRUE(DSA_sign(0, fips_digest, sizeof(fips_digest), sig.data(), + &sig_len, dsa.get())); - return true; + EXPECT_EQ(1, DSA_verify(0, fips_digest, sizeof(fips_digest), sig.data(), + sig_len, dsa.get())); } -static bool TestVerify(const uint8_t *sig, size_t sig_len, int expect) { +TEST(DSATest, Verify) { bssl::UniquePtr dsa = GetFIPSDSA(); - if (!dsa) { - return false; - } - - int ret = - DSA_verify(0, fips_digest, sizeof(fips_digest), sig, sig_len, dsa.get()); - if (ret != expect) { - fprintf(stderr, "DSA_verify returned %d, want %d\n", ret, expect); - return false; - } + ASSERT_TRUE(dsa); - // Clear any errors from a test with expected failure. - ERR_clear_error(); - return true; -} - -// TODO(davidben): Convert this file to GTest properly. -TEST(DSATest, AllTests) { - if (!TestGenerate(stdout) || - !TestVerify(fips_sig, sizeof(fips_sig), 1) || - !TestVerify(fips_sig_negative, sizeof(fips_sig_negative), -1) || - !TestVerify(fips_sig_extra, sizeof(fips_sig_extra), -1) || - !TestVerify(fips_sig_bad_length, sizeof(fips_sig_bad_length), -1) || - !TestVerify(fips_sig_bad_r, sizeof(fips_sig_bad_r), 0)) { - ADD_FAILURE() << "Tests failed"; - } + EXPECT_EQ(1, DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig, + sizeof(fips_sig), dsa.get())); + EXPECT_EQ(-1, + DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig_negative, + sizeof(fips_sig_negative), dsa.get())); + EXPECT_EQ(-1, DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig_extra, + sizeof(fips_sig_extra), dsa.get())); + EXPECT_EQ(-1, + DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig_bad_length, + sizeof(fips_sig_bad_length), dsa.get())); + EXPECT_EQ(0, DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig_bad_r, + sizeof(fips_sig_bad_r), dsa.get())); } TEST(DSATest, InvalidGroup) { @@ -332,3 +268,71 @@ 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())); +} + +// 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())); +} + +// 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/third_party/boringssl/src/crypto/dsa/internal.h b/third_party/boringssl/src/crypto/dsa/internal.h index 2d86edb2dcb7..560ae7f3332f 100644 --- a/third_party/boringssl/src/crypto/dsa/internal.h +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/ec_extra/ec_asn1.c b/third_party/boringssl/src/crypto/ec_extra/ec_asn1.c index 56cbbed160e1..5c0dab1a4f65 100644 --- a/third_party/boringssl/src/crypto/ec_extra/ec_asn1.c +++ b/third_party/boringssl/src/crypto/ec_extra/ec_asn1.c @@ -67,9 +67,9 @@ #include "../internal.h" -static const unsigned kParametersTag = +static const CBS_ASN1_TAG kParametersTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 0; -static const unsigned kPublicKeyTag = +static const CBS_ASN1_TAG kPublicKeyTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1; EC_KEY *EC_KEY_parse_private_key(CBS *cbs, const EC_GROUP *group) { @@ -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)) { @@ -518,42 +517,18 @@ EC_KEY *o2i_ECPublicKey(EC_KEY **keyp, const uint8_t **inp, long len) { } int i2o_ECPublicKey(const EC_KEY *key, uint8_t **outp) { - size_t buf_len = 0; - int new_buffer = 0; - if (key == NULL) { OPENSSL_PUT_ERROR(EC, ERR_R_PASSED_NULL_PARAMETER); return 0; } - - buf_len = EC_POINT_point2oct(key->group, key->pub_key, key->conv_form, NULL, - 0, NULL); - - if (outp == NULL || buf_len == 0) { - // out == NULL => just return the length of the octet string - return buf_len; - } - - if (*outp == NULL) { - *outp = OPENSSL_malloc(buf_len); - if (*outp == NULL) { - OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE); - return 0; - } - new_buffer = 1; - } - if (!EC_POINT_point2oct(key->group, key->pub_key, key->conv_form, *outp, - buf_len, NULL)) { - OPENSSL_PUT_ERROR(EC, ERR_R_EC_LIB); - if (new_buffer) { - OPENSSL_free(*outp); - *outp = NULL; - } - return 0; - } - - if (!new_buffer) { - *outp += buf_len; + CBB cbb; + if (!CBB_init(&cbb, 0) || // + !EC_POINT_point2cbb(&cbb, key->group, key->pub_key, key->conv_form, + NULL)) { + CBB_cleanup(&cbb); + return -1; } - return buf_len; + int ret = CBB_finish_i2d(&cbb, outp); + // Historically, this function used the wrong return value on error. + return ret > 0 ? ret : 0; } diff --git a/third_party/boringssl/src/crypto/ec_extra/hash_to_curve.c b/third_party/boringssl/src/crypto/ec_extra/hash_to_curve.c index fa7ff59097d9..6c9abf937a17 100644 --- a/third_party/boringssl/src/crypto/ec_extra/hash_to_curve.c +++ b/third_party/boringssl/src/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,109 @@ 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: +// +// 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_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_scalar_p384_xmd_sha384( + const EC_GROUP *group, EC_SCALAR *out, const uint8_t *dst, size_t dst_len, + const uint8_t *msg, size_t msg_len) { + if (EC_GROUP_get_curve_name(group) != NID_secp384r1) { + OPENSSL_PUT_ERROR(EC, EC_R_GROUP_MISMATCH); + return 0; + } + + return hash_to_scalar(group, EVP_sha384(), out, dst, dst_len, /*k=*/192, 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) { @@ -344,25 +487,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/third_party/boringssl/src/crypto/ec_extra/internal.h b/third_party/boringssl/src/crypto/ec_extra/internal.h index 55314ac73067..cf6ff2fa1289 100644 --- a/third_party/boringssl/src/crypto/ec_extra/internal.h +++ b/third_party/boringssl/src/crypto/ec_extra/internal.h @@ -26,16 +26,38 @@ 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_scalar_p384_xmd_sha384 hashes |msg| to a scalar on |group| +// and writes the result to |out|, using the hash_to_field operation from the +// P384_XMD:SHA-384_SSWU_RO_ suite from draft-irtf-cfrg-hash-to-curve-16, but +// generating a value modulo the group order rather than a field element. +OPENSSL_EXPORT int ec_hash_to_scalar_p384_xmd_sha384( + const EC_GROUP *group, EC_SCALAR *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 // 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 +66,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/third_party/boringssl/src/crypto/ecdh_extra/ecdh_test.cc b/third_party/boringssl/src/crypto/ecdh_extra/ecdh_test.cc index 4b88754fd304..39485259d855 100644 --- a/third_party/boringssl/src/crypto/ecdh_extra/ecdh_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/ecdsa_extra/ecdsa_asn1.c b/third_party/boringssl/src/crypto/ecdsa_extra/ecdsa_asn1.c index e6212cc359e0..8ddfb3b4d4ad 100644 --- a/third_party/boringssl/src/crypto/ecdsa_extra/ecdsa_asn1.c +++ b/third_party/boringssl/src/crypto/ecdsa_extra/ecdsa_asn1.c @@ -81,13 +81,11 @@ int ECDSA_sign(int type, const uint8_t *digest, size_t digest_len, uint8_t *sig, } CBB cbb; - CBB_zero(&cbb); + CBB_init_fixed(&cbb, sig, ECDSA_size(eckey)); size_t len; - if (!CBB_init_fixed(&cbb, sig, ECDSA_size(eckey)) || - !ECDSA_SIG_marshal(&cbb, s) || + if (!ECDSA_SIG_marshal(&cbb, s) || !CBB_finish(&cbb, NULL, &len)) { OPENSSL_PUT_ERROR(ECDSA, ECDSA_R_ENCODE_ERROR); - CBB_cleanup(&cbb); *sig_len = 0; goto err; } diff --git a/third_party/boringssl/src/crypto/err/dsa.errordata b/third_party/boringssl/src/crypto/err/dsa.errordata index 1cf5206d86ef..4a4b5862df87 100644 --- a/third_party/boringssl/src/crypto/err/dsa.errordata +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/err/ecdsa.errordata b/third_party/boringssl/src/crypto/err/ecdsa.errordata index 58ba591fabc7..b1c60d4505c2 100644 --- a/third_party/boringssl/src/crypto/err/ecdsa.errordata +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/err/err.c b/third_party/boringssl/src/crypto/err/err.c index ffa785eb3171..3f4f183ec613 100644 --- a/third_party/boringssl/src/crypto/err/err.c +++ b/third_party/boringssl/src/crypto/err/err.c @@ -106,6 +106,8 @@ * (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 @@ -115,6 +117,8 @@ #include #endif // defined(OPENSSL_SYS_STARBOARD #include +#include +#include #include #if defined(OPENSSL_WINDOWS) @@ -133,8 +137,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; @@ -166,7 +170,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)); } @@ -174,12 +178,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; @@ -198,15 +209,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; } @@ -262,7 +273,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 @@ -271,7 +285,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; @@ -339,7 +353,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; @@ -645,13 +659,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; } @@ -692,48 +706,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); } @@ -745,21 +753,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); @@ -771,13 +771,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); } } @@ -839,8 +846,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) { @@ -849,7 +856,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; } @@ -859,9 +866,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/third_party/boringssl/src/crypto/err/err_data_generate.go b/third_party/boringssl/src/crypto/err/err_data_generate.go index 963964c666b2..d4a7c28a8fe0 100644 --- a/third_party/boringssl/src/crypto/err/err_data_generate.go +++ b/third_party/boringssl/src/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 @@ -115,23 +117,8 @@ func (st *stringList) Add(key uint32, value string) error { return nil } -// keySlice is a type that implements sorting of entries values. -type keySlice []uint32 - -func (ks keySlice) Len() int { - return len(ks) -} - -func (ks keySlice) Less(i, j int) bool { - return (ks[i] >> 15) < (ks[j] >> 15) -} - -func (ks keySlice) Swap(i, j int) { - ks[i], ks[j] = ks[j], ks[i] -} - func (st *stringList) buildList() []uint32 { - sort.Sort(keySlice(st.entries)) + sort.Slice(st.entries, func(i, j int) bool { return (st.entries[i] >> 15) < (st.entries[j] >> 15) }) return st.entries } diff --git a/third_party/boringssl/src/crypto/err/err_test.cc b/third_party/boringssl/src/crypto/err/err_test.cc index 5dbe77654b44..8e9f03c62b05 100644 --- a/third_party/boringssl/src/crypto/err/err_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/err/x509.errordata b/third_party/boringssl/src/crypto/err/x509.errordata index 65181bfe6772..e30d667bd729 100644 --- a/third_party/boringssl/src/crypto/err/x509.errordata +++ b/third_party/boringssl/src/crypto/err/x509.errordata @@ -13,6 +13,7 @@ X509,110,INVALID_DIRECTORY X509,139,INVALID_FIELD_FOR_VERSION X509,111,INVALID_FIELD_NAME X509,136,INVALID_PARAMETER +X509,144,INVALID_POLICY_EXTENSION X509,112,INVALID_PSS_PARAMETERS X509,113,INVALID_TRUST X509,140,INVALID_VERSION diff --git a/third_party/boringssl/src/crypto/evp/evp.c b/third_party/boringssl/src/crypto/evp/evp.c index bb316450fbe3..8383d2e0a982 100644 --- a/third_party/boringssl/src/crypto/evp/evp.c +++ b/third_party/boringssl/src/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; } @@ -99,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; } } @@ -153,21 +152,35 @@ int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { } int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) { - if (to->type != from->type) { + if (to->type == EVP_PKEY_NONE) { + if (!EVP_PKEY_set_type(to, from->type)) { + return 0; + } + } else if (to->type != from->type) { OPENSSL_PUT_ERROR(EVP, EVP_R_DIFFERENT_KEY_TYPES); - goto err; + return 0; } if (EVP_PKEY_missing_parameters(from)) { OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS); - goto err; + return 0; + } + + // Once set, parameters may not change. + if (!EVP_PKEY_missing_parameters(to)) { + if (EVP_PKEY_cmp_parameters(to, from) == 1) { + return 1; + } + OPENSSL_PUT_ERROR(EVP, EVP_R_DIFFERENT_PARAMETERS); + return 0; } if (from->ameth && from->ameth->param_copy) { return from->ameth->param_copy(to, from); } -err: + // TODO(https://crbug.com/boringssl/536): If the algorithm takes no + // parameters, copying them should vacuously succeed. return 0; } @@ -241,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) { @@ -269,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) { @@ -297,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) { @@ -315,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); } @@ -416,6 +429,8 @@ int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) { if (a->ameth && a->ameth->param_cmp) { return a->ameth->param_cmp(a, b); } + // TODO(https://crbug.com/boringssl/536): If the algorithm doesn't use + // parameters, they should compare as vacuously equal. return -2; } @@ -432,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; @@ -448,6 +463,25 @@ void OpenSSL_add_all_digests(void) {} void EVP_cleanup(void) {} +int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, + size_t len) { + if (pkey->ameth->set1_tls_encodedpoint == NULL) { + OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); + return 0; + } + + return pkey->ameth->set1_tls_encodedpoint(pkey, in, len); +} + +size_t EVP_PKEY_get1_tls_encodedpoint(const EVP_PKEY *pkey, uint8_t **out_ptr) { + if (pkey->ameth->get1_tls_encodedpoint == NULL) { + OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); + return 0; + } + + return pkey->ameth->get1_tls_encodedpoint(pkey, out_ptr); +} + int EVP_PKEY_base_id(const EVP_PKEY *pkey) { // OpenSSL has two notions of key type because it supports multiple OIDs for // the same algorithm: NID_rsa vs NID_rsaEncryption and five distinct spelling diff --git a/third_party/boringssl/src/crypto/evp/evp_asn1.c b/third_party/boringssl/src/crypto/evp/evp_asn1.c index da0998168f42..f270c3e77308 100644 --- a/third_party/boringssl/src/crypto/evp/evp_asn1.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/evp/evp_ctx.c b/third_party/boringssl/src/crypto/evp/evp_ctx.c index 5f31ddb398a2..771f13f0039f 100644 --- a/third_party/boringssl/src/crypto/evp/evp_ctx.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/evp/evp_extra_test.cc b/third_party/boringssl/src/crypto/evp/evp_extra_test.cc index f520598879a8..948bfb5baebf 100644 --- a/third_party/boringssl/src/crypto/evp/evp_extra_test.cc +++ b/third_party/boringssl/src/crypto/evp/evp_extra_test.cc @@ -478,6 +478,319 @@ TEST(EVPExtraTest, d2i_AutoPrivateKey) { ERR_clear_error(); } +static bssl::UniquePtr ParsePrivateKey(int type, const uint8_t *in, + size_t len) { + const uint8_t *ptr = in; + bssl::UniquePtr pkey(d2i_PrivateKey(type, nullptr, &ptr, len)); + if (!pkey) { + return nullptr; + } + + EXPECT_EQ(in + len, ptr); + return pkey; +} + +static std::string PrintToString(const EVP_PKEY *pkey, int indent, + int (*print_func)(BIO *out, + const EVP_PKEY *pkey, + int indent, + ASN1_PCTX *pctx)) { + bssl::UniquePtr bio(BIO_new(BIO_s_mem())); + const uint8_t *data; + size_t len; + if (!bio || !print_func(bio.get(), pkey, indent, nullptr) || + !BIO_mem_contents(bio.get(), &data, &len)) { + ADD_FAILURE() << "Error printing."; + return ""; + } + return std::string(data, data + len); +} + +TEST(EVPExtraTest, Print) { + bssl::UniquePtr rsa = ParsePrivateKey( + EVP_PKEY_RSA, kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER)); + ASSERT_TRUE(rsa); + EXPECT_EQ(PrintToString(rsa.get(), /*indent=*/2, &EVP_PKEY_print_params), + " Parameters algorithm unsupported\n"); + EXPECT_EQ(PrintToString(rsa.get(), /*indent=*/2, &EVP_PKEY_print_public), + R"( Public-Key: (1024 bit) + Modulus: + 00:f8:b8:6c:83:b4:bc:d9:a8:57:c0:a5:b4:59:76: + 8c:54:1d:79:eb:22:52:04:7e:d3:37:eb:41:fd:83: + f9:f0:a6:85:15:34:75:71:5a:84:a8:3c:d2:ef:5a: + 4e:d3:de:97:8a:dd:ff:bb:cf:0a:aa:86:92:be:b8: + 50:e4:cd:6f:80:33:30:76:13:8f:ca:7b:dc:ec:5a: + ca:63:c7:03:25:ef:a8:8a:83:58:76:20:fa:16:77: + d7:79:92:63:01:48:1a:d8:7b:67:f1:52:55:49:4e: + d6:6e:4a:5c:d7:7a:37:36:0c:de:dd:8f:44:e8:c2: + a7:2c:2b:b5:af:64:4b:61:07 + Exponent: 65537 (0x10001) +)"); + EXPECT_EQ(PrintToString(rsa.get(), /*indent=*/2, &EVP_PKEY_print_private), + R"( Private-Key: (1024 bit) + modulus: + 00:f8:b8:6c:83:b4:bc:d9:a8:57:c0:a5:b4:59:76: + 8c:54:1d:79:eb:22:52:04:7e:d3:37:eb:41:fd:83: + f9:f0:a6:85:15:34:75:71:5a:84:a8:3c:d2:ef:5a: + 4e:d3:de:97:8a:dd:ff:bb:cf:0a:aa:86:92:be:b8: + 50:e4:cd:6f:80:33:30:76:13:8f:ca:7b:dc:ec:5a: + ca:63:c7:03:25:ef:a8:8a:83:58:76:20:fa:16:77: + d7:79:92:63:01:48:1a:d8:7b:67:f1:52:55:49:4e: + d6:6e:4a:5c:d7:7a:37:36:0c:de:dd:8f:44:e8:c2: + a7:2c:2b:b5:af:64:4b:61:07 + publicExponent: 65537 (0x10001) + privateExponent: + 74:88:64:3f:69:45:3a:6d:c7:7f:b9:a3:c0:6e:ec: + dc:d4:5a:b5:32:85:5f:19:d4:f8:d4:3f:3c:fa:c2: + f6:5f:ee:e6:ba:87:74:2e:c7:0c:d4:42:b8:66:85: + 9c:7b:24:61:aa:16:11:f6:b5:b6:a4:0a:c9:55:2e: + 81:a5:47:61:cb:25:8f:c2:15:7b:0e:7c:36:9f:3a: + da:58:86:1c:5b:83:79:e6:2b:cc:e6:fa:2c:61:f2: + 78:80:1b:e2:f3:9d:39:2b:65:57:91:3d:71:99:73: + a5:c2:79:20:8c:07:4f:e5:b4:60:1f:99:a2:b1:4f: + 0c:ef:bc:59:53:00:7d:b1 + prime1: + 00:fc:7e:23:65:70:f8:ce:d3:40:41:80:6a:1d:01: + d6:01:ff:b6:1b:3d:3d:59:09:33:79:c0:4f:de:96: + 27:4b:18:c6:d9:78:f1:f4:35:46:e9:7c:42:7a:5d: + 9f:ef:54:b8:f7:9f:c4:33:6c:f3:8c:32:46:87:67: + 30:7b:a7:ac:e3 + prime2: + 00:fc:2c:df:0c:0d:88:f5:b1:92:a8:93:47:63:55: + f5:ca:58:43:ba:1c:e5:9e:b6:95:05:cd:b5:82:df: + eb:04:53:9d:bd:c2:38:16:b3:62:dd:a1:46:db:6d: + 97:93:9f:8a:c3:9b:64:7e:42:e3:32:57:19:1b:d5: + 6e:85:fa:b8:8d + exponent1: + 00:bc:3d:de:6d:d6:97:e8:ba:9e:81:37:17:e5:a0: + 64:c9:00:b7:e7:fe:f4:29:d9:2e:43:6b:19:20:bd: + 99:75:e7:76:f8:d3:ae:af:7e:b8:eb:81:f4:9d:fe: + 07:2b:0b:63:0b:5a:55:90:71:7d:f1:db:d9:b1:41: + 41:68:2f:4e:39 + exponent2: + 5a:34:66:d8:f5:e2:7f:18:b5:00:6e:26:84:27:14: + 93:fb:fc:c6:0f:5e:27:e6:e1:e9:c0:8a:e4:34:da: + e9:a2:4b:73:bc:8c:b9:ba:13:6c:7a:2b:51:84:a3: + 4a:e0:30:10:06:7e:ed:17:5a:14:00:c9:ef:85:ea: + 52:2c:bc:65 + coefficient: + 51:e3:f2:83:19:9b:c4:1e:2f:50:3d:df:5a:a2:18: + ca:5f:2e:49:af:6f:cc:fa:65:77:94:b5:a1:0a:a9: + d1:8a:39:37:f4:0b:a0:d7:82:27:5e:ae:17:17:a1: + 1e:54:34:bf:6e:c4:8e:99:5d:08:f1:2d:86:9d:a5: + 20:1b:e5:df +)"); + + bssl::UniquePtr dsa = ParsePrivateKey( + EVP_PKEY_DSA, kExampleDSAKeyDER, sizeof(kExampleDSAKeyDER)); + ASSERT_TRUE(dsa); + EXPECT_EQ(PrintToString(dsa.get(), /*indent=*/2, &EVP_PKEY_print_params), + R"( DSA-Parameters: (2048 bit) + P: + 00:9e:12:fa:b3:de:12:21:35:01:dd:82:aa:10:ca: + 2d:10:1d:2d:4e:bf:ef:4d:2a:3f:8d:aa:0f:e0:ce: + da:d8:d6:af:85:61:6a:a2:f3:25:2c:0a:2b:5a:6d: + b0:9e:6f:14:90:0e:0d:db:83:11:87:6d:d8:f9:66: + 95:25:f9:9e:d6:59:49:e1:84:d5:06:47:93:27:11: + 69:a2:28:68:0b:95:ec:12:f5:9a:8e:20:b2:1f:2b: + 58:eb:2a:20:12:d3:5b:de:2e:e3:51:82:2f:e8:f3: + 2d:0a:33:05:65:dc:ce:5c:67:2b:72:59:c1:4b:24: + 33:d0:b5:b2:ca:2b:2d:b0:ab:62:6e:8f:13:f4:7f: + e0:34:5d:90:4e:72:94:bb:03:8e:9c:e2:1a:9e:58: + 0b:83:35:62:78:70:6c:fe:76:84:36:c6:9d:e1:49: + cc:ff:98:b4:aa:b8:cb:4f:63:85:c9:f1:02:ce:59: + 34:6e:ae:ef:27:e0:ad:22:2d:53:d6:e8:9c:c8:cd: + e5:77:6d:d0:00:57:b0:3f:2d:88:ab:3c:ed:ba:fd: + 7b:58:5f:0b:7f:78:35:e1:7a:37:28:bb:f2:5e:a6: + 25:72:f2:45:dc:11:1f:3c:e3:9c:b6:ff:ac:c3:1b: + 0a:27:90:e7:bd:e9:02:24:ea:9b:09:31:53:62:af: + 3d:2b + Q: + 00:f3:81:dc:f5:3e:bf:72:4f:8b:2e:5c:a8:2c:01: + 0f:b4:b5:ed:a9:35:8d:0f:d8:8e:d2:78:58:94:88: + b5:4f:c3 + G: + 0c:40:2a:72:5d:cc:3a:62:e0:2b:f4:cf:43:cd:17: + f4:a4:93:59:12:20:22:36:69:cf:41:93:ed:ab:42: + 3a:d0:8d:fb:55:2e:30:8a:6a:57:a5:ff:bc:7c:d0: + fb:20:87:f8:1f:8d:f0:cb:08:ab:21:33:28:7d:2b: + 69:68:71:4a:94:f6:33:c9:40:84:5a:48:a3:e1:67: + 08:dd:e7:61:cc:6a:8e:ab:2d:84:db:21:b6:ea:5b: + 07:68:14:93:cc:9c:31:fb:c3:68:b2:43:f6:dd:f8: + c9:32:a8:b4:03:8f:44:e7:b1:5c:a8:76:34:4a:14: + 78:59:f2:b4:3b:39:45:86:68:ad:5e:0a:1a:9a:66: + 95:46:dd:28:12:e3:b3:61:7a:0a:ef:99:d5:8e:3b: + b4:cc:87:fd:94:22:5e:01:d2:dc:c4:69:a7:72:68: + 14:6c:51:91:8f:18:e8:b4:d7:0a:a1:f0:c7:62:3b: + cc:52:cf:37:31:d3:86:41:b2:d2:83:0b:7e:ec:b2: + f0:95:52:ff:13:7d:04:6e:49:4e:7f:33:c3:59:00: + 02:b1:6d:1b:97:d9:36:fd:a2:8f:90:c3:ed:3c:a3: + 53:38:16:8a:c1:6f:77:c3:c5:7a:dc:2e:8f:7c:6c: + 22:56:e4:1a:5f:65:45:05:90:db:b5:bc:f0:6d:66: + 61 +)"); + EXPECT_EQ(PrintToString(dsa.get(), /*indent=*/2, &EVP_PKEY_print_public), + R"( Public-Key: (2048 bit) + pub: + 31:97:31:a1:4e:38:56:88:db:94:1d:bf:65:5c:da: + 4b:c2:10:de:74:20:03:ce:13:60:f2:25:1d:55:7c: + 5d:94:82:54:08:53:db:85:95:bf:dd:5e:50:d5:96: + e0:79:51:1b:bf:4d:4e:b9:3a:c5:ee:c4:5e:98:75: + 7b:be:ff:30:e6:d0:7b:a6:f1:bc:29:ea:df:ec:f3: + 8b:fa:83:11:9f:3f:f0:5d:06:51:32:aa:21:fc:26: + 17:e7:50:c2:16:ba:fa:54:b7:7e:1d:2c:a6:a3:41: + 66:33:94:83:b9:bf:a0:4f:bd:a6:fd:2c:81:58:35: + 33:39:c0:6d:33:40:56:64:12:5a:cd:35:53:21:78: + 8f:27:24:37:66:8a:df:5e:5f:63:fc:8b:2d:ef:57: + db:40:25:d5:17:53:0b:e4:a5:ae:54:bf:46:4f:a6: + 79:c3:74:fa:1f:85:34:64:6d:c5:03:eb:72:98:80: + 7b:c0:8f:35:11:a7:09:eb:51:e0:b0:ac:92:14:f2: + ad:37:95:5a:ba:8c:c4:db:ed:c4:4e:8b:8f:84:33: + 64:f8:57:12:d7:08:7e:90:66:df:91:50:23:f2:73: + c0:6b:b1:15:dd:64:d7:c9:75:17:73:72:da:33:c4: + 6f:a5:47:a1:cc:d1:c6:62:e5:ca:ab:5f:2a:8f:6b: + cc + P: + 00:9e:12:fa:b3:de:12:21:35:01:dd:82:aa:10:ca: + 2d:10:1d:2d:4e:bf:ef:4d:2a:3f:8d:aa:0f:e0:ce: + da:d8:d6:af:85:61:6a:a2:f3:25:2c:0a:2b:5a:6d: + b0:9e:6f:14:90:0e:0d:db:83:11:87:6d:d8:f9:66: + 95:25:f9:9e:d6:59:49:e1:84:d5:06:47:93:27:11: + 69:a2:28:68:0b:95:ec:12:f5:9a:8e:20:b2:1f:2b: + 58:eb:2a:20:12:d3:5b:de:2e:e3:51:82:2f:e8:f3: + 2d:0a:33:05:65:dc:ce:5c:67:2b:72:59:c1:4b:24: + 33:d0:b5:b2:ca:2b:2d:b0:ab:62:6e:8f:13:f4:7f: + e0:34:5d:90:4e:72:94:bb:03:8e:9c:e2:1a:9e:58: + 0b:83:35:62:78:70:6c:fe:76:84:36:c6:9d:e1:49: + cc:ff:98:b4:aa:b8:cb:4f:63:85:c9:f1:02:ce:59: + 34:6e:ae:ef:27:e0:ad:22:2d:53:d6:e8:9c:c8:cd: + e5:77:6d:d0:00:57:b0:3f:2d:88:ab:3c:ed:ba:fd: + 7b:58:5f:0b:7f:78:35:e1:7a:37:28:bb:f2:5e:a6: + 25:72:f2:45:dc:11:1f:3c:e3:9c:b6:ff:ac:c3:1b: + 0a:27:90:e7:bd:e9:02:24:ea:9b:09:31:53:62:af: + 3d:2b + Q: + 00:f3:81:dc:f5:3e:bf:72:4f:8b:2e:5c:a8:2c:01: + 0f:b4:b5:ed:a9:35:8d:0f:d8:8e:d2:78:58:94:88: + b5:4f:c3 + G: + 0c:40:2a:72:5d:cc:3a:62:e0:2b:f4:cf:43:cd:17: + f4:a4:93:59:12:20:22:36:69:cf:41:93:ed:ab:42: + 3a:d0:8d:fb:55:2e:30:8a:6a:57:a5:ff:bc:7c:d0: + fb:20:87:f8:1f:8d:f0:cb:08:ab:21:33:28:7d:2b: + 69:68:71:4a:94:f6:33:c9:40:84:5a:48:a3:e1:67: + 08:dd:e7:61:cc:6a:8e:ab:2d:84:db:21:b6:ea:5b: + 07:68:14:93:cc:9c:31:fb:c3:68:b2:43:f6:dd:f8: + c9:32:a8:b4:03:8f:44:e7:b1:5c:a8:76:34:4a:14: + 78:59:f2:b4:3b:39:45:86:68:ad:5e:0a:1a:9a:66: + 95:46:dd:28:12:e3:b3:61:7a:0a:ef:99:d5:8e:3b: + b4:cc:87:fd:94:22:5e:01:d2:dc:c4:69:a7:72:68: + 14:6c:51:91:8f:18:e8:b4:d7:0a:a1:f0:c7:62:3b: + cc:52:cf:37:31:d3:86:41:b2:d2:83:0b:7e:ec:b2: + f0:95:52:ff:13:7d:04:6e:49:4e:7f:33:c3:59:00: + 02:b1:6d:1b:97:d9:36:fd:a2:8f:90:c3:ed:3c:a3: + 53:38:16:8a:c1:6f:77:c3:c5:7a:dc:2e:8f:7c:6c: + 22:56:e4:1a:5f:65:45:05:90:db:b5:bc:f0:6d:66: + 61 +)"); + EXPECT_EQ(PrintToString(dsa.get(), /*indent=*/2, &EVP_PKEY_print_private), + R"( Private-Key: (2048 bit) + priv: + 00:b0:c7:68:70:27:43:bc:51:24:29:93:a9:71:a5: + 28:89:79:54:44:f7:c6:45:22:03:d0:ce:84:fe:61: + 17:d4:6e + pub: + 31:97:31:a1:4e:38:56:88:db:94:1d:bf:65:5c:da: + 4b:c2:10:de:74:20:03:ce:13:60:f2:25:1d:55:7c: + 5d:94:82:54:08:53:db:85:95:bf:dd:5e:50:d5:96: + e0:79:51:1b:bf:4d:4e:b9:3a:c5:ee:c4:5e:98:75: + 7b:be:ff:30:e6:d0:7b:a6:f1:bc:29:ea:df:ec:f3: + 8b:fa:83:11:9f:3f:f0:5d:06:51:32:aa:21:fc:26: + 17:e7:50:c2:16:ba:fa:54:b7:7e:1d:2c:a6:a3:41: + 66:33:94:83:b9:bf:a0:4f:bd:a6:fd:2c:81:58:35: + 33:39:c0:6d:33:40:56:64:12:5a:cd:35:53:21:78: + 8f:27:24:37:66:8a:df:5e:5f:63:fc:8b:2d:ef:57: + db:40:25:d5:17:53:0b:e4:a5:ae:54:bf:46:4f:a6: + 79:c3:74:fa:1f:85:34:64:6d:c5:03:eb:72:98:80: + 7b:c0:8f:35:11:a7:09:eb:51:e0:b0:ac:92:14:f2: + ad:37:95:5a:ba:8c:c4:db:ed:c4:4e:8b:8f:84:33: + 64:f8:57:12:d7:08:7e:90:66:df:91:50:23:f2:73: + c0:6b:b1:15:dd:64:d7:c9:75:17:73:72:da:33:c4: + 6f:a5:47:a1:cc:d1:c6:62:e5:ca:ab:5f:2a:8f:6b: + cc + P: + 00:9e:12:fa:b3:de:12:21:35:01:dd:82:aa:10:ca: + 2d:10:1d:2d:4e:bf:ef:4d:2a:3f:8d:aa:0f:e0:ce: + da:d8:d6:af:85:61:6a:a2:f3:25:2c:0a:2b:5a:6d: + b0:9e:6f:14:90:0e:0d:db:83:11:87:6d:d8:f9:66: + 95:25:f9:9e:d6:59:49:e1:84:d5:06:47:93:27:11: + 69:a2:28:68:0b:95:ec:12:f5:9a:8e:20:b2:1f:2b: + 58:eb:2a:20:12:d3:5b:de:2e:e3:51:82:2f:e8:f3: + 2d:0a:33:05:65:dc:ce:5c:67:2b:72:59:c1:4b:24: + 33:d0:b5:b2:ca:2b:2d:b0:ab:62:6e:8f:13:f4:7f: + e0:34:5d:90:4e:72:94:bb:03:8e:9c:e2:1a:9e:58: + 0b:83:35:62:78:70:6c:fe:76:84:36:c6:9d:e1:49: + cc:ff:98:b4:aa:b8:cb:4f:63:85:c9:f1:02:ce:59: + 34:6e:ae:ef:27:e0:ad:22:2d:53:d6:e8:9c:c8:cd: + e5:77:6d:d0:00:57:b0:3f:2d:88:ab:3c:ed:ba:fd: + 7b:58:5f:0b:7f:78:35:e1:7a:37:28:bb:f2:5e:a6: + 25:72:f2:45:dc:11:1f:3c:e3:9c:b6:ff:ac:c3:1b: + 0a:27:90:e7:bd:e9:02:24:ea:9b:09:31:53:62:af: + 3d:2b + Q: + 00:f3:81:dc:f5:3e:bf:72:4f:8b:2e:5c:a8:2c:01: + 0f:b4:b5:ed:a9:35:8d:0f:d8:8e:d2:78:58:94:88: + b5:4f:c3 + G: + 0c:40:2a:72:5d:cc:3a:62:e0:2b:f4:cf:43:cd:17: + f4:a4:93:59:12:20:22:36:69:cf:41:93:ed:ab:42: + 3a:d0:8d:fb:55:2e:30:8a:6a:57:a5:ff:bc:7c:d0: + fb:20:87:f8:1f:8d:f0:cb:08:ab:21:33:28:7d:2b: + 69:68:71:4a:94:f6:33:c9:40:84:5a:48:a3:e1:67: + 08:dd:e7:61:cc:6a:8e:ab:2d:84:db:21:b6:ea:5b: + 07:68:14:93:cc:9c:31:fb:c3:68:b2:43:f6:dd:f8: + c9:32:a8:b4:03:8f:44:e7:b1:5c:a8:76:34:4a:14: + 78:59:f2:b4:3b:39:45:86:68:ad:5e:0a:1a:9a:66: + 95:46:dd:28:12:e3:b3:61:7a:0a:ef:99:d5:8e:3b: + b4:cc:87:fd:94:22:5e:01:d2:dc:c4:69:a7:72:68: + 14:6c:51:91:8f:18:e8:b4:d7:0a:a1:f0:c7:62:3b: + cc:52:cf:37:31:d3:86:41:b2:d2:83:0b:7e:ec:b2: + f0:95:52:ff:13:7d:04:6e:49:4e:7f:33:c3:59:00: + 02:b1:6d:1b:97:d9:36:fd:a2:8f:90:c3:ed:3c:a3: + 53:38:16:8a:c1:6f:77:c3:c5:7a:dc:2e:8f:7c:6c: + 22:56:e4:1a:5f:65:45:05:90:db:b5:bc:f0:6d:66: + 61 +)"); + + bssl::UniquePtr ec = + ParsePrivateKey(EVP_PKEY_EC, kExampleECKeyDER, sizeof(kExampleECKeyDER)); + ASSERT_TRUE(ec); + EXPECT_EQ(PrintToString(ec.get(), /*indent=*/2, &EVP_PKEY_print_params), + " ECDSA-Parameters: (P-256)\n"); + EXPECT_EQ(PrintToString(ec.get(), /*indent=*/2, &EVP_PKEY_print_public), + R"( Public-Key: (P-256) + pub: + 04:e6:2b:69:e2:bf:65:9f:97:be:2f:1e:0d:94:8a: + 4c:d5:97:6b:b7:a9:1e:0d:46:fb:dd:a9:a9:1e:9d: + dc:ba:5a:01:e7:d6:97:a8:0a:18:f9:c3:c4:a3:1e: + 56:e2:7c:83:48:db:16:1a:1c:f5:1d:7e:f1:94:2d: + 4b:cf:72:22:c1 +)"); + EXPECT_EQ(PrintToString(ec.get(), /*indent=*/2, &EVP_PKEY_print_private), + R"( Private-Key: (P-256) + priv: + 07:0f:08:72:7a:d4:a0:4a:9c:dd:59:c9:4d:89:68: + 77:08:b5:6f:c9:5d:30:77:0e:e8:d1:c9:ce:0a:8b: + b4:6a + pub: + 04:e6:2b:69:e2:bf:65:9f:97:be:2f:1e:0d:94:8a: + 4c:d5:97:6b:b7:a9:1e:0d:46:fb:dd:a9:a9:1e:9d: + dc:ba:5a:01:e7:d6:97:a8:0a:18:f9:c3:c4:a3:1e: + 56:e2:7c:83:48:db:16:1a:1c:f5:1d:7e:f1:94:2d: + 4b:cf:72:22:c1 +)"); +} + // Tests loading a bad key in PKCS8 format. TEST(EVPExtraTest, BadECKey) { const uint8_t *derp = kExampleBadECKeyDER; @@ -502,18 +815,6 @@ TEST(EVPExtraTest, MarshalEmptyPublicKey) { EXPECT_EQ(EVP_R_UNSUPPORTED_ALGORITHM, ERR_GET_REASON(ERR_peek_last_error())); } -static bssl::UniquePtr ParsePrivateKey(int type, const uint8_t *in, - size_t len) { - const uint8_t *ptr = in; - bssl::UniquePtr pkey(d2i_PrivateKey(type, nullptr, &ptr, len)); - if (!pkey) { - return nullptr; - } - - EXPECT_EQ(in + len, ptr); - return pkey; -} - TEST(EVPExtraTest, d2i_PrivateKey) { EXPECT_TRUE(ParsePrivateKey(EVP_PKEY_RSA, kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER))); @@ -782,3 +1083,140 @@ TEST(EVPExtraTest, Ed25519Keygen) { ASSERT_TRUE(EVP_DigestVerify(ctx.get(), sig, len, reinterpret_cast("hello"), 5)); } + +// Test that OpenSSL's legacy TLS-specific APIs in EVP work correctly. When we +// target OpenSSL 3.0, these should be renamed to +// |EVP_PKEY_get1_encoded_public_key|. +TEST(EVPExtraTest, TLSEncodedPoint) { + const struct { + int pkey_type; + std::vector spki; + std::vector encoded_point; + } kTests[] = { + {EVP_PKEY_EC, + {0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, + 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, + 0x42, 0x00, 0x04, 0x2c, 0x15, 0x0f, 0x42, 0x9c, 0xe7, 0x0f, 0x21, 0x6c, + 0x25, 0x2c, 0xf5, 0xe0, 0x62, 0xce, 0x1f, 0x63, 0x9c, 0xd5, 0xd1, 0x65, + 0xc7, 0xf8, 0x94, 0x24, 0x07, 0x2c, 0x27, 0x19, 0x7d, 0x78, 0xb3, 0x3b, + 0x92, 0x0e, 0x95, 0xcd, 0xb6, 0x64, 0xe9, 0x90, 0xdc, 0xf0, 0xcf, 0xea, + 0x0d, 0x94, 0xe2, 0xa8, 0xe6, 0xaf, 0x9d, 0x0e, 0x58, 0x05, 0x6e, 0x65, + 0x31, 0x04, 0x92, 0x5b, 0x9f, 0xe6, 0xc9}, + {0x04, 0x2c, 0x15, 0x0f, 0x42, 0x9c, 0xe7, 0x0f, 0x21, 0x6c, 0x25, + 0x2c, 0xf5, 0xe0, 0x62, 0xce, 0x1f, 0x63, 0x9c, 0xd5, 0xd1, 0x65, + 0xc7, 0xf8, 0x94, 0x24, 0x07, 0x2c, 0x27, 0x19, 0x7d, 0x78, 0xb3, + 0x3b, 0x92, 0x0e, 0x95, 0xcd, 0xb6, 0x64, 0xe9, 0x90, 0xdc, 0xf0, + 0xcf, 0xea, 0x0d, 0x94, 0xe2, 0xa8, 0xe6, 0xaf, 0x9d, 0x0e, 0x58, + 0x05, 0x6e, 0x65, 0x31, 0x04, 0x92, 0x5b, 0x9f, 0xe6, 0xc9}}, + {EVP_PKEY_X25519, + {0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x6e, 0x03, 0x21, + 0x00, 0xe6, 0xdb, 0x68, 0x67, 0x58, 0x30, 0x30, 0xdb, 0x35, 0x94, + 0xc1, 0xa4, 0x24, 0xb1, 0x5f, 0x7c, 0x72, 0x66, 0x24, 0xec, 0x26, + 0xb3, 0x35, 0x3b, 0x10, 0xa9, 0x03, 0xa6, 0xd0, 0xab, 0x1c, 0x4c}, + {0xe6, 0xdb, 0x68, 0x67, 0x58, 0x30, 0x30, 0xdb, 0x35, 0x94, 0xc1, + 0xa4, 0x24, 0xb1, 0x5f, 0x7c, 0x72, 0x66, 0x24, 0xec, 0x26, 0xb3, + 0x35, 0x3b, 0x10, 0xa9, 0x03, 0xa6, 0xd0, 0xab, 0x1c, 0x4c}}}; + for (const auto& test : kTests) { + SCOPED_TRACE(test.pkey_type); + SCOPED_TRACE(Bytes(test.spki)); + CBS spki; + CBS_init(&spki, test.spki.data(), test.spki.size()); + bssl::UniquePtr from_spki(EVP_parse_public_key(&spki)); + ASSERT_TRUE(from_spki); + + uint8_t *data; + size_t len = EVP_PKEY_get1_tls_encodedpoint(from_spki.get(), &data); + ASSERT_GT(len, 0u); + EXPECT_EQ(Bytes(data, len), Bytes(test.encoded_point)); + OPENSSL_free(data); + + bssl::UniquePtr from_encoded_point(EVP_PKEY_new()); + ASSERT_TRUE(from_encoded_point); + if (test.pkey_type == EVP_PKEY_EC) { + // |EVP_PKEY_EC| should have been |EVP_PKEY_EC_P256|, etc., but instead + // part of the type is buried inside parameters. + ASSERT_TRUE( + EVP_PKEY_copy_parameters(from_encoded_point.get(), from_spki.get())); + } else { + ASSERT_TRUE(EVP_PKEY_set_type(from_encoded_point.get(), test.pkey_type)); + } + ASSERT_TRUE(EVP_PKEY_set1_tls_encodedpoint(from_encoded_point.get(), + test.encoded_point.data(), + test.encoded_point.size())); + + bssl::ScopedCBB cbb; + ASSERT_TRUE(CBB_init(cbb.get(), test.spki.size())); + ASSERT_TRUE(EVP_marshal_public_key(cbb.get(), from_encoded_point.get())); + EXPECT_EQ(Bytes(CBB_data(cbb.get()), CBB_len(cbb.get())), Bytes(test.spki)); + } +} + +TEST(EVPExtraTest, Parameters) { + auto new_pkey_with_type = [](int type) -> bssl::UniquePtr { + bssl::UniquePtr pkey(EVP_PKEY_new()); + if (!pkey || // + !EVP_PKEY_set_type(pkey.get(), type)) { + return nullptr; + } + return pkey; + }; + + auto new_pkey_with_curve = [](int curve_nid) -> bssl::UniquePtr { + bssl::UniquePtr ctx( + EVP_PKEY_CTX_new_id(EVP_PKEY_EC, nullptr)); + EVP_PKEY *pkey = nullptr; + if (!ctx || // + !EVP_PKEY_paramgen_init(ctx.get()) || + !EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx.get(), curve_nid) || + !EVP_PKEY_paramgen(ctx.get(), &pkey)) { + return nullptr; + } + return bssl::UniquePtr(pkey); + }; + + // RSA keys have no parameters. + bssl::UniquePtr rsa = new_pkey_with_type(EVP_PKEY_RSA); + ASSERT_TRUE(rsa); + EXPECT_FALSE(EVP_PKEY_missing_parameters(rsa.get())); + + // EC keys have parameters. + bssl::UniquePtr ec_no_params = new_pkey_with_type(EVP_PKEY_EC); + ASSERT_TRUE(ec_no_params); + EXPECT_TRUE(EVP_PKEY_missing_parameters(ec_no_params.get())); + + bssl::UniquePtr p256 = new_pkey_with_curve(NID_X9_62_prime256v1); + ASSERT_TRUE(p256); + EXPECT_FALSE(EVP_PKEY_missing_parameters(p256.get())); + + bssl::UniquePtr p256_2 = new_pkey_with_curve(NID_X9_62_prime256v1); + ASSERT_TRUE(p256_2); + EXPECT_FALSE(EVP_PKEY_missing_parameters(p256_2.get())); + + bssl::UniquePtr p384 = new_pkey_with_curve(NID_secp384r1); + ASSERT_TRUE(p384); + EXPECT_FALSE(EVP_PKEY_missing_parameters(p384.get())); + + EXPECT_EQ(1, EVP_PKEY_cmp_parameters(p256.get(), p256_2.get())); + EXPECT_EQ(0, EVP_PKEY_cmp_parameters(p256.get(), p384.get())); + + // Copying parameters onto a curve-less EC key works. + ASSERT_TRUE(EVP_PKEY_copy_parameters(ec_no_params.get(), p256.get())); + EXPECT_EQ(1, EVP_PKEY_cmp_parameters(p256.get(), ec_no_params.get())); + + // No-op copies silently succeed. + ASSERT_TRUE(EVP_PKEY_copy_parameters(ec_no_params.get(), p256.get())); + EXPECT_EQ(1, EVP_PKEY_cmp_parameters(p256.get(), ec_no_params.get())); + + // Copying parameters onto a type-less key works. + bssl::UniquePtr pkey(EVP_PKEY_new()); + ASSERT_TRUE(pkey); + ASSERT_TRUE(EVP_PKEY_copy_parameters(pkey.get(), p256.get())); + EXPECT_EQ(EVP_PKEY_EC, EVP_PKEY_id(pkey.get())); + EXPECT_EQ(1, EVP_PKEY_cmp_parameters(p256.get(), pkey.get())); + + // |EVP_PKEY_copy_parameters| cannot change a key's type or curve. + EXPECT_FALSE(EVP_PKEY_copy_parameters(rsa.get(), p256.get())); + EXPECT_EQ(EVP_PKEY_RSA, EVP_PKEY_id(rsa.get())); + EXPECT_FALSE(EVP_PKEY_copy_parameters(rsa.get(), p256.get())); + EXPECT_EQ(EVP_PKEY_RSA, EVP_PKEY_id(rsa.get())); +} diff --git a/third_party/boringssl/src/crypto/evp/evp_tests.txt b/third_party/boringssl/src/crypto/evp/evp_tests.txt index 0c890fd63c11..238a602eb135 100644 --- a/third_party/boringssl/src/crypto/evp/evp_tests.txt +++ b/third_party/boringssl/src/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 @@ -99,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 @@ -123,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/third_party/boringssl/src/crypto/evp/internal.h b/third_party/boringssl/src/crypto/evp/internal.h index 0037de8251b1..6678c41de7b9 100644 --- a/third_party/boringssl/src/crypto/evp/internal.h +++ b/third_party/boringssl/src/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]; @@ -103,6 +106,17 @@ struct evp_pkey_asn1_method_st { int (*get_priv_raw)(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len); int (*get_pub_raw)(const EVP_PKEY *pkey, uint8_t *out, size_t *out_len); + // TODO(davidben): Can these be merged with the functions above? OpenSSL does + // not implement |EVP_PKEY_get_raw_public_key|, etc., for |EVP_PKEY_EC|, but + // the distinction seems unimportant. OpenSSL 3.0 has since renamed + // |EVP_PKEY_get1_tls_encodedpoint| to |EVP_PKEY_get1_encoded_public_key|, and + // what is the difference between "raw" and an "encoded" public key. + // + // One nuisance is the notion of "raw" is slightly ambiguous for EC keys. Is + // it a DER ECPrivateKey or just the scalar? + int (*set1_tls_encodedpoint)(EVP_PKEY *pkey, const uint8_t *in, size_t len); + size_t (*get1_tls_encodedpoint)(const EVP_PKEY *pkey, uint8_t **out_ptr); + // pkey_opaque returns 1 if the |pk| is opaque. Opaque keys are backed by // custom implementations which do not expose key material and parameters. int (*pkey_opaque)(const EVP_PKEY *pk); @@ -117,6 +131,20 @@ 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 + // the type of |pkey|. + int type; + + // 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. + const EVP_PKEY_ASN1_METHOD *ameth; +} /* EVP_PKEY */; #define EVP_PKEY_OP_UNDEFINED 0 #define EVP_PKEY_OP_KEYGEN (1 << 2) diff --git a/third_party/boringssl/src/crypto/evp/p_dsa_asn1.c b/third_party/boringssl/src/crypto/evp/p_dsa_asn1.c index 98615b738600..fe0421081d11 100644 --- a/third_party/boringssl/src/crypto/evp/p_dsa_asn1.c +++ b/third_party/boringssl/src/crypto/evp/p_dsa_asn1.c @@ -61,6 +61,7 @@ #include #include +#include "../dsa/internal.h" #include "internal.h" @@ -102,7 +103,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. @@ -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; @@ -171,7 +174,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 +199,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 +231,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,46 +243,56 @@ 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, - // 1.2.840.10040.4.1 - {0x2a, 0x86, 0x48, 0xce, 0x38, 0x04, 0x01}, 7, + EVP_PKEY_DSA, + // 1.2.840.10040.4.1 + {0x2a, 0x86, 0x48, 0xce, 0x38, 0x04, 0x01}, + 7, - NULL /* pkey_method */, + /*pkey_method=*/NULL, - dsa_pub_decode, - dsa_pub_encode, - dsa_pub_cmp, + dsa_pub_decode, + dsa_pub_encode, + dsa_pub_cmp, - dsa_priv_decode, - dsa_priv_encode, + dsa_priv_decode, + dsa_priv_encode, - NULL /* set_priv_raw */, - NULL /* set_pub_raw */, - NULL /* get_priv_raw */, - NULL /* get_pub_raw */, + /*set_priv_raw=*/NULL, + /*set_pub_raw=*/NULL, + /*get_priv_raw=*/NULL, + /*get_pub_raw=*/NULL, + /*set1_tls_encodedpoint=*/NULL, + /*get1_tls_encodedpoint=*/NULL, - NULL /* pkey_opaque */, + /*pkey_opaque=*/NULL, - int_dsa_size, - dsa_bits, + int_dsa_size, + dsa_bits, - dsa_missing_parameters, - dsa_copy_parameters, - dsa_cmp_parameters, + dsa_missing_parameters, + dsa_copy_parameters, + dsa_cmp_parameters, - int_dsa_free, + int_dsa_free, }; int EVP_PKEY_CTX_set_dsa_paramgen_bits(EVP_PKEY_CTX *ctx, int nbits) { diff --git a/third_party/boringssl/src/crypto/evp/p_ec.c b/third_party/boringssl/src/crypto/evp/p_ec.c index ddb64a421570..c9f26cb00ce6 100644 --- a/third_party/boringssl/src/crypto/evp/p_ec.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/evp/p_ec_asn1.c b/third_party/boringssl/src/crypto/evp/p_ec_asn1.c index dd421217c7ff..2659100f2e87 100644 --- a/third_party/boringssl/src/crypto/evp/p_ec_asn1.c +++ b/third_party/boringssl/src/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); @@ -93,7 +93,6 @@ static int eckey_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { // See RFC 5480, section 2. // The parameters are a named curve. - EC_POINT *point = NULL; EC_KEY *eckey = NULL; EC_GROUP *group = EC_KEY_parse_curve_name(params); if (group == NULL || CBS_len(params) != 0) { @@ -102,35 +101,29 @@ static int eckey_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { } eckey = EC_KEY_new(); - if (eckey == NULL || !EC_KEY_set_group(eckey, group)) { - goto err; - } - - point = EC_POINT_new(group); - if (point == NULL || - !EC_POINT_oct2point(group, point, CBS_data(key), CBS_len(key), NULL) || - !EC_KEY_set_public_key(eckey, point)) { + if (eckey == NULL || // + !EC_KEY_set_group(eckey, group) || + !EC_KEY_oct2key(eckey, CBS_data(key), CBS_len(key), NULL)) { goto err; } EC_GROUP_free(group); - EC_POINT_free(point); EVP_PKEY_assign_EC_KEY(out, eckey); return 1; err: EC_GROUP_free(group); - EC_POINT_free(point); EC_KEY_free(eckey); return 0; } 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) { @@ -162,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 @@ -188,12 +181,36 @@ static int eckey_priv_encode(CBB *out, const EVP_PKEY *key) { return 1; } +static int eckey_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, + size_t len) { + EC_KEY *ec_key = pkey->pkey; + if (ec_key == NULL) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); + return 0; + } + + return EC_KEY_oct2key(ec_key, in, len, NULL); +} + +static size_t eckey_get1_tls_encodedpoint(const EVP_PKEY *pkey, + uint8_t **out_ptr) { + const EC_KEY *ec_key = pkey->pkey; + if (ec_key == NULL) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); + return 0; + } + + return EC_KEY_key2buf(ec_key, POINT_CONVERSION_UNCOMPRESSED, out_ptr, NULL); +} + 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; @@ -202,16 +219,41 @@ static int ec_bits(const EVP_PKEY *pkey) { } static int ec_missing_parameters(const EVP_PKEY *pkey) { - return 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) { - return EC_KEY_set_group(to->pkey.ec, EC_KEY_get0_group(from->pkey.ec)); + 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_key); + if (group == NULL) { + OPENSSL_PUT_ERROR(EVP, EVP_R_MISSING_PARAMETERS); + return 0; + } + if (to->pkey == NULL) { + to->pkey = EC_KEY_new(); + if (to->pkey == NULL) { + return 0; + } + } + return EC_KEY_set_group(to->pkey, group); } static int ec_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) { - const EC_GROUP *group_a = EC_KEY_get0_group(a->pkey.ec), - *group_b = EC_KEY_get0_group(b->pkey.ec); + 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_ec), + *group_b = EC_KEY_get0_group(b_ec); + if (group_a == NULL || group_b == NULL) { + return -2; + } if (EC_GROUP_cmp(group_a, group_b, NULL) != 0) { // mismatch return 0; @@ -219,39 +261,46 @@ 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 = { - EVP_PKEY_EC, - // 1.2.840.10045.2.1 - {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01}, 7, + EVP_PKEY_EC, + // 1.2.840.10045.2.1 + {0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01}, + 7, - &ec_pkey_meth, + &ec_pkey_meth, - eckey_pub_decode, - eckey_pub_encode, - eckey_pub_cmp, + eckey_pub_decode, + eckey_pub_encode, + eckey_pub_cmp, - eckey_priv_decode, - eckey_priv_encode, + eckey_priv_decode, + eckey_priv_encode, - NULL /* set_priv_raw */, - NULL /* set_pub_raw */, - NULL /* get_priv_raw */, - NULL /* get_pub_raw */, + /*set_priv_raw=*/NULL, + /*set_pub_raw=*/NULL, + /*get_priv_raw=*/NULL, + /*get_pub_raw=*/NULL, + eckey_set1_tls_encodedpoint, + eckey_get1_tls_encodedpoint, - eckey_opaque, + eckey_opaque, - int_ec_size, - ec_bits, + int_ec_size, + ec_bits, - ec_missing_parameters, - ec_copy_parameters, - ec_cmp_parameters, + ec_missing_parameters, + ec_copy_parameters, + ec_cmp_parameters, - int_ec_free, + int_ec_free, }; diff --git a/third_party/boringssl/src/crypto/evp/p_ed25519.c b/third_party/boringssl/src/crypto/evp/p_ed25519.c index b3d8cc985804..647ea05e603e 100644 --- a/third_party/boringssl/src/crypto/evp/p_ed25519.c +++ b/third_party/boringssl/src/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; } @@ -40,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; @@ -75,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/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.c b/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.c index f823c0dbb5e2..3b8f27fd65e5 100644 --- a/third_party/boringssl/src/crypto/evp/p_ed25519_asn1.c +++ b/third_party/boringssl/src/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) { @@ -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; } @@ -47,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; } @@ -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; } @@ -67,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; @@ -97,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; @@ -126,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; @@ -147,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; } @@ -170,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; @@ -214,11 +212,13 @@ const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth = { ed25519_set_pub_raw, ed25519_get_priv_raw, ed25519_get_pub_raw, - NULL /* pkey_opaque */, + /*set1_tls_encodedpoint=*/NULL, + /*get1_tls_encodedpoint=*/NULL, + /*pkey_opaque=*/NULL, ed25519_size, ed25519_bits, - NULL /* param_missing */, - NULL /* param_copy */, - NULL /* param_cmp */, + /*param_missing=*/NULL, + /*param_copy=*/NULL, + /*param_cmp=*/NULL, ed25519_free, }; diff --git a/third_party/boringssl/src/crypto/evp/p_hkdf.c b/third_party/boringssl/src/crypto/evp/p_hkdf.c index 932372dfddfc..0d7ede82c2cf 100644 --- a/third_party/boringssl/src/crypto/evp/p_hkdf.c +++ b/third_party/boringssl/src/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; } @@ -64,8 +62,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) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); + if (hctx_dst->key == NULL) { return 0; } hctx_dst->key_len = hctx_src->key_len; @@ -73,8 +70,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) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); + if (hctx_dst->salt == NULL) { 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/third_party/boringssl/src/crypto/evp/p_rsa.c b/third_party/boringssl/src/crypto/evp/p_rsa.c index 7872a922cb82..15eb1efbd470 100644 --- a/third_party/boringssl/src/crypto/evp/p_rsa.c +++ b/third_party/boringssl/src/crypto/evp/p_rsa.c @@ -67,7 +67,7 @@ #include #include "../internal.h" -#include "../fipsmodule/rsa/internal.h" +#include "../rsa_extra/internal.h" #include "internal.h" @@ -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/third_party/boringssl/src/crypto/evp/p_rsa_asn1.c b/third_party/boringssl/src/crypto/evp/p_rsa_asn1.c index 2e4942a1222f..dd64731be4c6 100644 --- a/third_party/boringssl/src/crypto/evp/p_rsa_asn1.c +++ b/third_party/boringssl/src/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,44 +157,55 @@ 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, - // 1.2.840.113549.1.1.1 - {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01}, 9, + EVP_PKEY_RSA, + // 1.2.840.113549.1.1.1 + {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01}, + 9, - &rsa_pkey_meth, + &rsa_pkey_meth, - rsa_pub_decode, - rsa_pub_encode, - rsa_pub_cmp, + rsa_pub_decode, + rsa_pub_encode, + rsa_pub_cmp, - rsa_priv_decode, - rsa_priv_encode, + rsa_priv_decode, + rsa_priv_encode, - NULL /* set_priv_raw */, - NULL /* set_pub_raw */, - NULL /* get_priv_raw */, - NULL /* get_pub_raw */, + /*set_priv_raw=*/NULL, + /*set_pub_raw=*/NULL, + /*get_priv_raw=*/NULL, + /*get_pub_raw=*/NULL, + /*set1_tls_encodedpoint=*/NULL, + /*get1_tls_encodedpoint=*/NULL, - rsa_opaque, + rsa_opaque, - int_rsa_size, - rsa_bits, + int_rsa_size, + rsa_bits, - 0,0,0, + 0, + 0, + 0, - int_rsa_free, + int_rsa_free, }; diff --git a/third_party/boringssl/src/crypto/evp/p_x25519.c b/third_party/boringssl/src/crypto/evp/p_x25519.c index ed7df39a9813..6218943e0fe6 100644 --- a/third_party/boringssl/src/crypto/evp/p_x25519.c +++ b/third_party/boringssl/src/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; } @@ -39,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; } @@ -51,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/third_party/boringssl/src/crypto/evp/p_x25519_asn1.c b/third_party/boringssl/src/crypto/evp/p_x25519_asn1.c index 182f6a2d9902..bf98427c7851 100644 --- a/third_party/boringssl/src/crypto/evp/p_x25519_asn1.c +++ b/third_party/boringssl/src/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) { @@ -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; } @@ -45,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; } @@ -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; } @@ -65,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; @@ -94,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; @@ -110,6 +108,23 @@ static int x25519_get_pub_raw(const EVP_PKEY *pkey, uint8_t *out, return 1; } +static int x25519_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, + size_t len) { + return x25519_set_pub_raw(pkey, in, len); +} + +static size_t x25519_get1_tls_encodedpoint(const EVP_PKEY *pkey, + uint8_t **out_ptr) { + const X25519_KEY *key = pkey->pkey; + if (key == NULL) { + OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); + return 0; + } + + *out_ptr = OPENSSL_memdup(key->pub, 32); + return *out_ptr == NULL ? 0 : 32; +} + static int x25519_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) { // See RFC 8410, section 4. @@ -123,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; @@ -143,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; } @@ -165,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; @@ -209,41 +224,13 @@ const EVP_PKEY_ASN1_METHOD x25519_asn1_meth = { x25519_set_pub_raw, x25519_get_priv_raw, x25519_get_pub_raw, - NULL /* pkey_opaque */, + x25519_set1_tls_encodedpoint, + x25519_get1_tls_encodedpoint, + /*pkey_opaque=*/NULL, x25519_size, x25519_bits, - NULL /* param_missing */, - NULL /* param_copy */, - NULL /* param_cmp */, + /*param_missing=*/NULL, + /*param_copy=*/NULL, + /*param_cmp=*/NULL, x25519_free, }; - -int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, - size_t len) { - // TODO(davidben): In OpenSSL, this function also works for |EVP_PKEY_EC| - // keys. Add support if it ever comes up. - if (pkey->type != EVP_PKEY_X25519) { - OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_PUBLIC_KEY_TYPE); - return 0; - } - - return x25519_set_pub_raw(pkey, in, len); -} - -size_t EVP_PKEY_get1_tls_encodedpoint(const EVP_PKEY *pkey, uint8_t **out_ptr) { - // TODO(davidben): In OpenSSL, this function also works for |EVP_PKEY_EC| - // keys. Add support if it ever comes up. - if (pkey->type != EVP_PKEY_X25519) { - OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_PUBLIC_KEY_TYPE); - return 0; - } - - const X25519_KEY *key = pkey->pkey.ptr; - if (key == NULL) { - OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); - return 0; - } - - *out_ptr = OPENSSL_memdup(key->pub, 32); - return *out_ptr == NULL ? 0 : 32; -} diff --git a/third_party/boringssl/src/crypto/evp/print.c b/third_party/boringssl/src/crypto/evp/print.c index 0f4b65ea182d..925074e5ae92 100644 --- a/third_party/boringssl/src/crypto/evp/print.c +++ b/third_party/boringssl/src/crypto/evp/print.c @@ -64,8 +64,25 @@ #include "../fipsmodule/rsa/internal.h" -static int bn_print(BIO *bp, const char *number, const BIGNUM *num, - uint8_t *buf, int off) { +static int print_hex(BIO *bp, const uint8_t *data, size_t len, int off) { + for (size_t i = 0; i < len; i++) { + if ((i % 15) == 0) { + if (BIO_puts(bp, "\n") <= 0 || // + !BIO_indent(bp, off + 4, 128)) { + return 0; + } + } + if (BIO_printf(bp, "%02x%s", data[i], (i + 1 == len) ? "" : ":") <= 0) { + return 0; + } + } + if (BIO_write(bp, "\n", 1) <= 0) { + return 0; + } + return 1; +} + +static int bn_print(BIO *bp, const char *name, const BIGNUM *num, int off) { if (num == NULL) { return 1; } @@ -74,287 +91,162 @@ static int bn_print(BIO *bp, const char *number, const BIGNUM *num, return 0; } if (BN_is_zero(num)) { - if (BIO_printf(bp, "%s 0\n", number) <= 0) { + if (BIO_printf(bp, "%s 0\n", name) <= 0) { return 0; } return 1; } - if (BN_num_bytes(num) <= sizeof(long)) { + uint64_t u64; + if (BN_get_u64(num, &u64)) { const char *neg = BN_is_negative(num) ? "-" : ""; - if (BIO_printf(bp, "%s %s%lu (%s0x%lx)\n", number, neg, - (unsigned long)num->d[0], neg, - (unsigned long)num->d[0]) <= 0) { - return 0; - } - } else { - buf[0] = 0; - if (BIO_printf(bp, "%s%s", number, - (BN_is_negative(num)) ? " (Negative)" : "") <= 0) { - return 0; - } - int n = BN_bn2bin(num, &buf[1]); - - if (buf[1] & 0x80) { - n++; - } else { - buf++; - } + return BIO_printf(bp, "%s %s%" PRIu64 " (%s0x%" PRIx64 ")\n", name, neg, + u64, neg, u64) > 0; + } - int i; - for (i = 0; i < n; i++) { - if ((i % 15) == 0) { - if (BIO_puts(bp, "\n") <= 0 || - !BIO_indent(bp, off + 4, 128)) { - return 0; - } - } - if (BIO_printf(bp, "%02x%s", buf[i], ((i + 1) == n) ? "" : ":") <= 0) { - return 0; - } - } - if (BIO_write(bp, "\n", 1) <= 0) { - return 0; - } + if (BIO_printf(bp, "%s%s", name, + (BN_is_negative(num)) ? " (Negative)" : "") <= 0) { + return 0; } - return 1; -} -static void update_buflen(const BIGNUM *b, size_t *pbuflen) { - if (!b) { - return; + // Print |num| in hex, adding a leading zero, as in ASN.1, if the high bit + // is set. + // + // TODO(davidben): Do we need to do this? We already print "(Negative)" above + // and negative values are never valid in keys anyway. + size_t len = BN_num_bytes(num); + uint8_t *buf = OPENSSL_malloc(len + 1); + if (buf == NULL) { + return 0; } - size_t len = BN_num_bytes(b); - if (*pbuflen < len) { - *pbuflen = len; + buf[0] = 0; + BN_bn2bin(num, buf + 1); + int ret; + if (len > 0 && (buf[1] & 0x80) != 0) { + // Print the whole buffer. + ret = print_hex(bp, buf, len + 1, off); + } else { + // Skip the leading zero. + ret = print_hex(bp, buf + 1, len, off); } + OPENSSL_free(buf); + return ret; } // RSA keys. static int do_rsa_print(BIO *out, const RSA *rsa, int off, int include_private) { - const char *s, *str; - uint8_t *m = NULL; - int ret = 0, mod_len = 0; - size_t buf_len = 0; - - update_buflen(rsa->n, &buf_len); - update_buflen(rsa->e, &buf_len); - - if (include_private) { - update_buflen(rsa->d, &buf_len); - update_buflen(rsa->p, &buf_len); - update_buflen(rsa->q, &buf_len); - update_buflen(rsa->dmp1, &buf_len); - update_buflen(rsa->dmq1, &buf_len); - update_buflen(rsa->iqmp, &buf_len); - } - - m = (uint8_t *)OPENSSL_malloc(buf_len + 10); - if (m == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); - goto err; - } - + int mod_len = 0; if (rsa->n != NULL) { mod_len = BN_num_bits(rsa->n); } if (!BIO_indent(out, off, 128)) { - goto err; + return 0; } + const char *s, *str; if (include_private && rsa->d) { if (BIO_printf(out, "Private-Key: (%d bit)\n", mod_len) <= 0) { - goto err; + return 0; } str = "modulus:"; s = "publicExponent:"; } else { if (BIO_printf(out, "Public-Key: (%d bit)\n", mod_len) <= 0) { - goto err; + return 0; } str = "Modulus:"; s = "Exponent:"; } - if (!bn_print(out, str, rsa->n, m, off) || - !bn_print(out, s, rsa->e, m, off)) { - goto err; + if (!bn_print(out, str, rsa->n, off) || + !bn_print(out, s, rsa->e, off)) { + return 0; } if (include_private) { - if (!bn_print(out, "privateExponent:", rsa->d, m, off) || - !bn_print(out, "prime1:", rsa->p, m, off) || - !bn_print(out, "prime2:", rsa->q, m, off) || - !bn_print(out, "exponent1:", rsa->dmp1, m, off) || - !bn_print(out, "exponent2:", rsa->dmq1, m, off) || - !bn_print(out, "coefficient:", rsa->iqmp, m, off)) { - goto err; + if (!bn_print(out, "privateExponent:", rsa->d, off) || + !bn_print(out, "prime1:", rsa->p, off) || + !bn_print(out, "prime2:", rsa->q, off) || + !bn_print(out, "exponent1:", rsa->dmp1, off) || + !bn_print(out, "exponent2:", rsa->dmq1, off) || + !bn_print(out, "coefficient:", rsa->iqmp, off)) { + return 0; } } - ret = 1; -err: - OPENSSL_free(m); - return ret; + return 1; } -static int rsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent, - ASN1_PCTX *ctx) { - return do_rsa_print(bp, pkey->pkey.rsa, indent, 0); +static int rsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent) { + 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, - ASN1_PCTX *ctx) { - return do_rsa_print(bp, pkey->pkey.rsa, indent, 1); +static int rsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent) { + return do_rsa_print(bp, EVP_PKEY_get0_RSA(pkey), indent, 1); } // DSA keys. static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype) { - uint8_t *m = NULL; - int ret = 0; - size_t buf_len = 0; - const char *ktype = NULL; - - const BIGNUM *priv_key, *pub_key; - - priv_key = NULL; + const BIGNUM *priv_key = NULL; if (ptype == 2) { priv_key = x->priv_key; } - pub_key = NULL; + const BIGNUM *pub_key = NULL; if (ptype > 0) { pub_key = x->pub_key; } - ktype = "DSA-Parameters"; + const char *ktype = "DSA-Parameters"; if (ptype == 2) { ktype = "Private-Key"; } else if (ptype == 1) { ktype = "Public-Key"; } - update_buflen(x->p, &buf_len); - update_buflen(x->q, &buf_len); - update_buflen(x->g, &buf_len); - update_buflen(priv_key, &buf_len); - update_buflen(pub_key, &buf_len); - - m = (uint8_t *)OPENSSL_malloc(buf_len + 10); - if (m == NULL) { - OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); - goto err; - } - - if (priv_key) { - if (!BIO_indent(bp, off, 128) || - BIO_printf(bp, "%s: (%u bit)\n", ktype, BN_num_bits(x->p)) <= 0) { - goto err; - } - } - - if (!bn_print(bp, "priv:", priv_key, m, off) || - !bn_print(bp, "pub: ", pub_key, m, off) || - !bn_print(bp, "P: ", x->p, m, off) || - !bn_print(bp, "Q: ", x->q, m, off) || - !bn_print(bp, "G: ", x->g, m, off)) { - goto err; + if (!BIO_indent(bp, off, 128) || + BIO_printf(bp, "%s: (%u bit)\n", ktype, BN_num_bits(x->p)) <= 0 || + // |priv_key| and |pub_key| may be NULL, in which case |bn_print| will + // silently skip them. + !bn_print(bp, "priv:", priv_key, off) || + !bn_print(bp, "pub:", pub_key, off) || + !bn_print(bp, "P:", x->p, off) || + !bn_print(bp, "Q:", x->q, off) || + !bn_print(bp, "G:", x->g, off)) { + return 0; } - ret = 1; -err: - OPENSSL_free(m); - return ret; + return 1; } -static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent, - ASN1_PCTX *ctx) { - return do_dsa_print(bp, pkey->pkey.dsa, indent, 0); +static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent) { + 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, - ASN1_PCTX *ctx) { - return do_dsa_print(bp, pkey->pkey.dsa, indent, 1); +static int dsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent) { + 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, - ASN1_PCTX *ctx) { - return do_dsa_print(bp, pkey->pkey.dsa, indent, 2); +static int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent) { + return do_dsa_print(bp, EVP_PKEY_get0_DSA(pkey), indent, 2); } // EC keys. static int do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype) { - uint8_t *buffer = NULL; - const char *ecstr; - size_t buf_len = 0, i; - int ret = 0, reason = ERR_R_BIO_LIB; - BIGNUM *order = NULL; - BN_CTX *ctx = NULL; const EC_GROUP *group; - const EC_POINT *public_key; - const BIGNUM *priv_key; - uint8_t *pub_key_bytes = NULL; - size_t pub_key_bytes_len = 0; - if (x == NULL || (group = EC_KEY_get0_group(x)) == NULL) { - reason = ERR_R_PASSED_NULL_PARAMETER; - goto err; - } - - ctx = BN_CTX_new(); - if (ctx == NULL) { - reason = ERR_R_MALLOC_FAILURE; - goto err; - } - - if (ktype > 0) { - public_key = EC_KEY_get0_public_key(x); - if (public_key != NULL) { - pub_key_bytes_len = EC_POINT_point2oct( - group, public_key, EC_KEY_get_conv_form(x), NULL, 0, ctx); - if (pub_key_bytes_len == 0) { - reason = ERR_R_MALLOC_FAILURE; - goto err; - } - pub_key_bytes = OPENSSL_malloc(pub_key_bytes_len); - if (pub_key_bytes == NULL) { - reason = ERR_R_MALLOC_FAILURE; - goto err; - } - pub_key_bytes_len = - EC_POINT_point2oct(group, public_key, EC_KEY_get_conv_form(x), - pub_key_bytes, pub_key_bytes_len, ctx); - if (pub_key_bytes_len == 0) { - reason = ERR_R_MALLOC_FAILURE; - goto err; - } - buf_len = pub_key_bytes_len; - } - } - - if (ktype == 2) { - priv_key = EC_KEY_get0_private_key(x); - if (priv_key && (i = (size_t)BN_num_bytes(priv_key)) > buf_len) { - buf_len = i; - } - } else { - priv_key = NULL; + OPENSSL_PUT_ERROR(EVP, ERR_R_PASSED_NULL_PARAMETER); + return 0; } - if (ktype > 0) { - buf_len += 10; - if ((buffer = OPENSSL_malloc(buf_len)) == NULL) { - reason = ERR_R_MALLOC_FAILURE; - goto err; - } - } + const char *ecstr; if (ktype == 2) { ecstr = "Private-Key"; } else if (ktype == 1) { @@ -364,62 +256,61 @@ static int do_EC_KEY_print(BIO *bp, const EC_KEY *x, int off, int ktype) { } if (!BIO_indent(bp, off, 128)) { - goto err; + return 0; } - order = BN_new(); - if (order == NULL || !EC_GROUP_get_order(group, order, NULL) || - BIO_printf(bp, "%s: (%u bit)\n", ecstr, BN_num_bits(order)) <= 0) { - goto err; + int curve_name = EC_GROUP_get_curve_name(group); + if (BIO_printf(bp, "%s: (%s)\n", ecstr, + curve_name == NID_undef + ? "unknown curve" + : EC_curve_nid2nist(curve_name)) <= 0) { + return 0; } - if ((priv_key != NULL) && - !bn_print(bp, "priv:", priv_key, buffer, off)) { - goto err; - } - if (pub_key_bytes != NULL) { - BIO_hexdump(bp, pub_key_bytes, pub_key_bytes_len, off); + if (ktype == 2) { + const BIGNUM *priv_key = EC_KEY_get0_private_key(x); + if (priv_key != NULL && // + !bn_print(bp, "priv:", priv_key, off)) { + return 0; + } } - // TODO(fork): implement - /* - if (!ECPKParameters_print(bp, group, off)) - goto err; */ - ret = 1; - -err: - if (!ret) { - OPENSSL_PUT_ERROR(EVP, reason); + + if (ktype > 0 && EC_KEY_get0_public_key(x) != NULL) { + uint8_t *pub = NULL; + size_t pub_len = EC_KEY_key2buf(x, EC_KEY_get_conv_form(x), &pub, NULL); + if (pub_len == 0) { + return 0; + } + int ret = BIO_indent(bp, off, 128) && // + BIO_puts(bp, "pub:") > 0 && // + print_hex(bp, pub, pub_len, off); + OPENSSL_free(pub); + if (!ret) { + return 0; + } } - OPENSSL_free(pub_key_bytes); - BN_free(order); - BN_CTX_free(ctx); - OPENSSL_free(buffer); - return ret; + + return 1; } -static int eckey_param_print(BIO *bp, const EVP_PKEY *pkey, int indent, - ASN1_PCTX *ctx) { - return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 0); +static int eckey_param_print(BIO *bp, const EVP_PKEY *pkey, int indent) { + 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, - ASN1_PCTX *ctx) { - return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 1); +static int eckey_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent) { + 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, - ASN1_PCTX *ctx) { - return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 2); +static int eckey_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent) { + return do_EC_KEY_print(bp, EVP_PKEY_get0_EC_KEY(pkey), indent, 2); } typedef struct { int type; - int (*pub_print)(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx); - int (*priv_print)(BIO *out, const EVP_PKEY *pkey, int indent, - ASN1_PCTX *pctx); - int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent, - ASN1_PCTX *pctx); + int (*pub_print)(BIO *out, const EVP_PKEY *pkey, int indent); + int (*priv_print)(BIO *out, const EVP_PKEY *pkey, int indent); + int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent); } EVP_PKEY_PRINT_METHOD; static EVP_PKEY_PRINT_METHOD kPrintMethods[] = { @@ -463,27 +354,27 @@ 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, pctx); + return method->pub_print(out, pkey, indent); } return print_unsupported(out, pkey, indent, "Public Key"); } 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, pctx); + return method->priv_print(out, pkey, indent); } return print_unsupported(out, pkey, indent, "Private Key"); } 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, pctx); + return method->param_print(out, pkey, indent); } return print_unsupported(out, pkey, indent, "Parameters"); } diff --git a/third_party/boringssl/src/crypto/evp/scrypt.c b/third_party/boringssl/src/crypto/evp/scrypt.c index 14a5e02c9863..8212cd15ee07 100644 --- a/third_party/boringssl/src/crypto/evp/scrypt.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/evp/sign.c b/third_party/boringssl/src/crypto/evp/sign.c index ced86bdf4b5d..e126704f2d08 100644 --- a/third_party/boringssl/src/crypto/evp/sign.c +++ b/third_party/boringssl/src/crypto/evp/sign.c @@ -56,6 +56,8 @@ #include +#include + #include #include @@ -74,15 +76,20 @@ int EVP_SignUpdate(EVP_MD_CTX *ctx, const void *data, size_t len) { return EVP_DigestUpdate(ctx, data, len); } -int EVP_SignFinal(const EVP_MD_CTX *ctx, uint8_t *sig, - unsigned int *out_sig_len, EVP_PKEY *pkey) { +int EVP_SignFinal(const EVP_MD_CTX *ctx, uint8_t *sig, unsigned *out_sig_len, + EVP_PKEY *pkey) { uint8_t m[EVP_MAX_MD_SIZE]; - unsigned int m_len; + unsigned m_len; int ret = 0; EVP_MD_CTX tmp_ctx; EVP_PKEY_CTX *pkctx = NULL; size_t sig_len = EVP_PKEY_size(pkey); + // Ensure the final result will fit in |unsigned|. + if (sig_len > UINT_MAX) { + sig_len = UINT_MAX; + } + *out_sig_len = 0; EVP_MD_CTX_init(&tmp_ctx); if (!EVP_MD_CTX_copy_ex(&tmp_ctx, ctx) || @@ -92,19 +99,17 @@ int EVP_SignFinal(const EVP_MD_CTX *ctx, uint8_t *sig, EVP_MD_CTX_cleanup(&tmp_ctx); pkctx = EVP_PKEY_CTX_new(pkey, NULL); - if (!pkctx || !EVP_PKEY_sign_init(pkctx) || + if (!pkctx || // + !EVP_PKEY_sign_init(pkctx) || !EVP_PKEY_CTX_set_signature_md(pkctx, ctx->digest) || !EVP_PKEY_sign(pkctx, sig, &sig_len, m, m_len)) { goto out; } - *out_sig_len = sig_len; + *out_sig_len = (unsigned)sig_len; ret = 1; out: - if (pkctx) { - EVP_PKEY_CTX_free(pkctx); - } - + EVP_PKEY_CTX_free(pkctx); return ret; } @@ -123,7 +128,7 @@ int EVP_VerifyUpdate(EVP_MD_CTX *ctx, const void *data, size_t len) { int EVP_VerifyFinal(EVP_MD_CTX *ctx, const uint8_t *sig, size_t sig_len, EVP_PKEY *pkey) { uint8_t m[EVP_MAX_MD_SIZE]; - unsigned int m_len; + unsigned m_len; int ret = 0; EVP_MD_CTX tmp_ctx; EVP_PKEY_CTX *pkctx = NULL; diff --git a/third_party/boringssl/src/crypto/ex_data.c b/third_party/boringssl/src/crypto/ex_data.c index 71d60a52801e..867ced3c9435 100644 --- a/third_party/boringssl/src/crypto/ex_data.c +++ b/third_party/boringssl/src/crypto/ex_data.c @@ -109,6 +109,8 @@ #include #include +#include +#include #include #include @@ -135,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; } @@ -149,44 +150,55 @@ int CRYPTO_get_ex_new_index(CRYPTO_EX_DATA_CLASS *ex_data_class, int *out_index, ex_data_class->meth = sk_CRYPTO_EX_DATA_FUNCS_new_null(); } - if (ex_data_class->meth == NULL || - !sk_CRYPTO_EX_DATA_FUNCS_push(ex_data_class->meth, funcs)) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); - OPENSSL_free(funcs); + if (ex_data_class->meth == NULL) { goto err; } - *out_index = sk_CRYPTO_EX_DATA_FUNCS_num(ex_data_class->meth) - 1 + + // The index must fit in |int|. + if (sk_CRYPTO_EX_DATA_FUNCS_num(ex_data_class->meth) > + (size_t)(INT_MAX - ex_data_class->num_reserved)) { + OPENSSL_PUT_ERROR(CRYPTO, ERR_R_OVERFLOW); + goto err; + } + + if (!sk_CRYPTO_EX_DATA_FUNCS_push(ex_data_class->meth, funcs)) { + goto err; + } + funcs = NULL; // |sk_CRYPTO_EX_DATA_FUNCS_push| takes ownership. + + *out_index = (int)sk_CRYPTO_EX_DATA_FUNCS_num(ex_data_class->meth) - 1 + ex_data_class->num_reserved; ret = 1; err: CRYPTO_STATIC_MUTEX_unlock_write(&ex_data_class->lock); + OPENSSL_free(funcs); return ret; } int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int index, void *val) { - int n, i; + if (index < 0) { + // A caller that can accidentally pass in an invalid index into this + // function will hit an memory error if |index| happened to be valid, and + // expected |val| to be of a different type. + abort(); + } if (ad->sk == NULL) { ad->sk = sk_void_new_null(); if (ad->sk == NULL) { - OPENSSL_PUT_ERROR(CRYPTO, ERR_R_MALLOC_FAILURE); return 0; } } - n = sk_void_num(ad->sk); - // Add NULL values until the stack is long enough. - for (i = n; i <= index; i++) { + 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; } } - sk_void_set(ad->sk, index, val); + sk_void_set(ad->sk, (size_t)index, val); return 1; } @@ -218,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; } @@ -242,7 +253,10 @@ void CRYPTO_free_ex_data(CRYPTO_EX_DATA_CLASS *ex_data_class, void *obj, return; } - for (size_t i = 0; i < sk_CRYPTO_EX_DATA_FUNCS_num(func_pointers); i++) { + // |CRYPTO_get_ex_new_index| will not allocate indices beyond |INT_MAX|. + assert(sk_CRYPTO_EX_DATA_FUNCS_num(func_pointers) <= + (size_t)(INT_MAX - ex_data_class->num_reserved)); + for (int i = 0; i < (int)sk_CRYPTO_EX_DATA_FUNCS_num(func_pointers); i++) { CRYPTO_EX_DATA_FUNCS *func_pointer = sk_CRYPTO_EX_DATA_FUNCS_value(func_pointers, i); if (func_pointer->free_func) { diff --git a/third_party/boringssl/src/crypto/fipsmodule/CMakeLists.txt b/third_party/boringssl/src/crypto/fipsmodule/CMakeLists.txt index a04ef6aa3b36..3858e8b1b3de 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/CMakeLists.txt +++ b/third_party/boringssl/src/crypto/fipsmodule/CMakeLists.txt @@ -1,161 +1,63 @@ -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} - ) +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) +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 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 "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} - 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} - ) +if(OPENSSL_NASM) + list(APPEND BCM_SOURCES_ASM_USED ${BCM_SOURCES_NASM}) endif() -if(ARCH STREQUAL "ppc64le") - set( - BCM_ASM_SOURCES - - aesp8-ppc.${ASM_EXT} - ghashp8-ppc.${ASM_EXT} - ) -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(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) - -function(cpreprocess dest src) - set(TARGET "") - if(CMAKE_ASM_COMPILER_TARGET) - set(TARGET "--target=${CMAKE_ASM_COMPILER_TARGET}") - endif() - - add_custom_command( - OUTPUT ${dest} - COMMAND ${CMAKE_ASM_COMPILER} ${TARGET} $CMAKE_ASM_FLAGS -E ${src} -I${PROJECT_SOURCE_DIR}/include > ${dest} - DEPENDS - ${src} - ${PROJECT_SOURCE_DIR}/include/openssl/arm_arch.h - WORKING_DIRECTORY . - ) -endfunction() - 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 @@ -163,29 +65,32 @@ if(FIPS_DELOCATE) bcm.c ) - - if(ARCH STREQUAL "aarch64") - # Perlasm output on Aarch64 needs to pass through the C preprocessor before - # it can be parsed by delocate. - foreach(asm ${BCM_ASM_SOURCES}) - cpreprocess(${asm}.s ${asm}) - list(APPEND BCM_ASM_PROCESSED_SOURCES "${asm}.s") - endforeach() - else() - # No preprocessing is required on other platforms. - set(BCM_ASM_PROCESSED_SOURCES ${BCM_ASM_SOURCES}) - endif() - - 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) + set(TARGET "") + if(CMAKE_ASM_COMPILER_TARGET) + set(TARGET "--target=${CMAKE_ASM_COMPILER_TARGET}") + endif() + go_executable(delocate boringssl.googlesource.com/boringssl/util/fipstools/delocate) add_custom_command( OUTPUT bcm-delocated.S - COMMAND ./delocate -a $ -o bcm-delocated.S ${BCM_ASM_PROCESSED_SOURCES} - DEPENDS bcm_c_generated_asm delocate ${BCM_ASM_PROCESSED_SOURCES} + COMMAND + ./delocate + -a $ + -o bcm-delocated.S + -cc ${CMAKE_ASM_COMPILER} + -cc-flags "${TARGET} $CMAKE_ASM_FLAGS" + ${PROJECT_SOURCE_DIR}/include/openssl/arm_arch.h + ${BCM_SOURCES_ASM_USED} + DEPENDS + bcm_c_generated_asm + delocate + ${BCM_SOURCES_ASM_USED} + ${PROJECT_SOURCE_DIR}/include/openssl/arm_arch.h WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) @@ -196,9 +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) @@ -223,9 +125,8 @@ 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) if(NOT BUILD_SHARED_LIBS) @@ -239,8 +140,8 @@ 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( bcm_library @@ -248,11 +149,10 @@ elseif(FIPS_SHARED) STATIC bcm.c - - ${BCM_ASM_SOURCES} + ${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( OUTPUT bcm.o @@ -270,9 +170,8 @@ else() bcm.c fips_shared_support.c - - ${BCM_ASM_SOURCES} + ${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/third_party/boringssl/src/crypto/fipsmodule/FIPS.md b/third_party/boringssl/src/crypto/fipsmodule/FIPS.md index bc5708fb064a..92eebabb95ac 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/FIPS.md +++ b/third_party/boringssl/src/crypto/fipsmodule/FIPS.md @@ -13,6 +13,7 @@ BoringCrypto has undergone the following validations: 1. 2019-08-08: certificate [#3678](https://csrc.nist.gov/Projects/Cryptographic-Module-Validation-Program/Certificate/3678), [security policy](/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20190808.docx) (in docx format). 1. 2019-10-20: certificate [#3753](https://csrc.nist.gov/Projects/Cryptographic-Module-Validation-Program/Certificate/3753), [security policy](/crypto/fipsmodule/policydocs/BoringCrypto-Android-Security-Policy-20191020.docx) (in docx format). 1. 2021-01-28: certificate [#4156](https://csrc.nist.gov/Projects/Cryptographic-Module-Validation-Program/Certificate/4156), [security policy](/crypto/fipsmodule/policydocs/BoringCrypto-Android-Security-Policy-20210319.docx) (in docx format). +1. 2021-04-29: certificate [#4407](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4407). ## Running ACVP tests diff --git a/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl b/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl index 2abc8d03b430..9a90946b84d2 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl +++ b/third_party/boringssl/src/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 -___ } }} ######################################################################## @@ -4727,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 @@ -4749,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/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesp8-ppc.pl b/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesp8-ppc.pl deleted file mode 100644 index 983cbbe6d342..000000000000 --- a/third_party/boringssl/src/crypto/fipsmodule/aes/asm/aesp8-ppc.pl +++ /dev/null @@ -1,3807 +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; - -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 STDOUT,"| $^X \"$xlate\" $flavour ".shift || die "can't call $xlate: $!"; - -$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/third_party/boringssl/src/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl b/third_party/boringssl/src/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl index f6f67eaa9a48..37e93d7a4806 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/aes/internal.h b/third_party/boringssl/src/crypto/fipsmodule/aes/internal.h index 0685bc41deec..98b2a14d8285 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/aes/internal.h +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/bcm.c b/third_party/boringssl/src/crypto/fipsmodule/bcm.c index 17921347eaac..8231eee6307c 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bcm.c +++ b/third_party/boringssl/src/crypto/fipsmodule/bcm.c @@ -80,6 +80,7 @@ #include "ec/simple_mul.c" #include "ec/util.c" #include "ec/wnaf.c" +#include "hkdf/hkdf.c" #include "hmac/hmac.c" #include "md4/md4.c" #include "md5/md5.c" @@ -101,7 +102,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/third_party/boringssl/src/crypto/fipsmodule/bn/asm/bn-armv8.pl b/third_party/boringssl/src/crypto/fipsmodule/bn/asm/bn-armv8.pl new file mode 100755 index 000000000000..5aed8df15f41 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/bn/asm/rsaz-avx2.pl b/third_party/boringssl/src/crypto/fipsmodule/bn/asm/rsaz-avx2.pl index 65b0062a749a..9be0b140588d 100755 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/asm/rsaz-avx2.pl +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/bn/asm/x86_64-mont5.pl b/third_party/boringssl/src/crypto/fipsmodule/bn/asm/x86_64-mont5.pl index 012e7aa509a3..67ffc4a21e06 100755 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/asm/x86_64-mont5.pl +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/asm/x86_64-mont5.pl @@ -158,8 +158,12 @@ movdqa %xmm1,%xmm2 ___ ######################################################################## -# calculate mask by comparing 0..31 to index and save result to stack +# Calculate masks by comparing 0..31 to $idx and save result to stack. # +# We compute sixteen 16-byte masks and store them on the stack. Mask i is stored +# in `16*i - 128`(%rax) and contains the comparisons for idx == 2*i and +# idx == 2*i + 1 in its lower and upper halves, respectively. Mask calculations +# are scheduled in groups of four. $code.=<<___; paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 # compare to 1,0 @@ -228,7 +232,8 @@ } $code.=<<___; por %xmm1,%xmm0 - pshufd \$0x4e,%xmm0,%xmm1 + # Combine the upper and lower halves of %xmm0. + pshufd \$0x4e,%xmm0,%xmm1 # Swap upper and lower halves. por %xmm1,%xmm0 lea $STRIDE($bp),$bp movq %xmm0,$m0 # m0=bp[0] @@ -321,7 +326,8 @@ } $code.=<<___; por %xmm5,%xmm4 - pshufd \$0x4e,%xmm4,%xmm0 + # Combine the upper and lower halves of %xmm4 as %xmm0. + pshufd \$0x4e,%xmm4,%xmm0 # Swap upper and lower halves. por %xmm4,%xmm0 lea $STRIDE($bp),$bp @@ -575,7 +581,6 @@ ___ $bp="%r12"; $STRIDE=2**5*8; # 5 is "window size" - $N=$STRIDE/4; # should match cache line size $tp=$i; $code.=<<___; movdqa 0(%rax),%xmm0 # 00000001000000010000000000000000 @@ -589,8 +594,12 @@ movdqa %xmm1,%xmm2 ___ ######################################################################## -# calculate mask by comparing 0..31 to index and save result to stack +# Calculate masks by comparing 0..31 to $idx and save result to stack. # +# We compute sixteen 16-byte masks and store them on the stack. Mask i is stored +# in `16*i - 128`(%rax) and contains the comparisons for idx == 2*i and +# idx == 2*i + 1 in its lower and upper halves, respectively. Mask calculations +# are scheduled in groups of four. $code.=<<___; paddd %xmm0,%xmm1 pcmpeqd %xmm5,%xmm0 # compare to 1,0 @@ -659,7 +668,8 @@ } $code.=<<___; por %xmm1,%xmm0 - pshufd \$0x4e,%xmm0,%xmm1 + # Combine the upper and lower halves of %xmm0. + pshufd \$0x4e,%xmm0,%xmm1 # Swap upper and lower halves. por %xmm1,%xmm0 lea $STRIDE($bp),$bp movq %xmm0,$m0 # m0=bp[0] @@ -836,7 +846,8 @@ } $code.=<<___; por %xmm5,%xmm4 - pshufd \$0x4e,%xmm4,%xmm0 + # Combine the upper and lower halves of %xmm4 as %xmm0. + pshufd \$0x4e,%xmm4,%xmm0 # Swap upper and lower halves. por %xmm4,%xmm0 lea $STRIDE($bp),$bp movq %xmm0,$m0 # m0=bp[i] @@ -2227,7 +2238,6 @@ ("%rsi","%rdi","%rcx","%rbx","%r8","%r9","%rbp","%rax"); my $rptr=$bptr; my $STRIDE=2**5*8; # 5 is "window size" -my $N=$STRIDE/4; # should match cache line size $code.=<<___; movdqa 0(%rax),%xmm0 # 00000001000000010000000000000000 movdqa 16(%rax),%xmm1 # 00000002000000020000000200000002 @@ -2240,8 +2250,12 @@ movdqa %xmm1,%xmm2 ___ ######################################################################## -# calculate mask by comparing 0..31 to index and save result to stack +# Calculate masks by comparing 0..31 to $idx and save result to stack. # +# We compute sixteen 16-byte masks and store them on the stack. Mask i is stored +# in `16*i - 128`(%rax) and contains the comparisons for idx == 2*i and +# idx == 2*i + 1 in its lower and upper halves, respectively. Mask calculations +# are scheduled in groups of four. $code.=<<___; .byte 0x67 paddd %xmm0,%xmm1 @@ -2310,7 +2324,8 @@ } $code.=<<___; pxor %xmm1,%xmm0 - pshufd \$0x4e,%xmm0,%xmm1 + # Combine the upper and lower halves of %xmm0. + pshufd \$0x4e,%xmm0,%xmm1 # Swap upper and lower halves. por %xmm1,%xmm0 lea $STRIDE($bptr),$bptr movq %xmm0,%rdx # bp[0] @@ -2430,7 +2445,8 @@ } $code.=<<___; por %xmm5,%xmm4 - pshufd \$0x4e,%xmm4,%xmm0 + # Combine the upper and lower halves of %xmm4 as %xmm0. + pshufd \$0x4e,%xmm4,%xmm0 # Swap upper and lower halves. por %xmm4,%xmm0 lea $STRIDE($bptr),$bptr movq %xmm0,%rdx # m0=bp[i] @@ -3434,6 +3450,15 @@ .cfi_startproc cmp \$0, $num jz .Lscatter_epilogue + + # $tbl stores 32 entries, t0 through t31. Each entry has $num words. + # They are interleaved in memory as follows: + # + # t0[0] t1[0] t2[0] ... t31[0] + # t0[1] t1[1] t2[1] ... t31[1] + # ... + # t0[$num-1] t1[$num-1] t2[$num-1] ... t31[$num-1] + lea ($tbl,$idx,8),$tbl .Lscatter: mov ($inp),%rax @@ -3471,8 +3496,12 @@ movdqa %xmm1,%xmm2 ___ ######################################################################## -# calculate mask by comparing 0..31 to $idx and save result to stack +# Calculate masks by comparing 0..31 to $idx and save result to stack. # +# We compute sixteen 16-byte masks and store them on the stack. Mask i is stored +# in `16*i - 128`(%rax) and contains the comparisons for idx == 2*i and +# idx == 2*i + 1 in its lower and upper halves, respectively. Mask calculations +# are scheduled in groups of four. for($i=0;$i<$STRIDE/16;$i+=4) { $code.=<<___; paddd %xmm0,%xmm1 @@ -3510,6 +3539,8 @@ pxor %xmm5,%xmm5 ___ for($i=0;$i<$STRIDE/16;$i+=4) { +# Combine the masks with the corresponding table entries to select the correct +# entry. $code.=<<___; movdqa `16*($i+0)-128`(%r11),%xmm0 movdqa `16*($i+1)-128`(%r11),%xmm1 @@ -3528,7 +3559,8 @@ $code.=<<___; por %xmm5,%xmm4 lea $STRIDE(%r11),%r11 - pshufd \$0x4e,%xmm4,%xmm0 + # Combine the upper and lower halves of %xmm0. + pshufd \$0x4e,%xmm4,%xmm0 # Swap upper and lower halves. por %xmm4,%xmm0 movq %xmm0,($out) # m0=bp[0] lea 8($out),$out @@ -3544,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/third_party/boringssl/src/crypto/fipsmodule/bn/bn.c b/third_party/boringssl/src/crypto/fipsmodule/bn/bn.c index f3fbb7a68038..d7d86263d2ef 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/bn.c +++ b/third_party/boringssl/src/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; } @@ -386,23 +384,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/third_party/boringssl/src/crypto/fipsmodule/bn/bn_test.cc b/third_party/boringssl/src/crypto/fipsmodule/bn/bn_test.cc index 3bcdd630ada8..01dcfbb16327 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/bn_test.cc +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/bn_test.cc @@ -978,7 +978,7 @@ class BNTest : public testing::Test { bssl::UniquePtr ctx_; }; -TEST_F(BNTest, TestVectors) { +static void RunBNFileTest(FileTest *t, BN_CTX *ctx) { static const struct { const char *name; void (*func)(BIGNUMFileTest *t, BN_CTX *ctx); @@ -999,37 +999,84 @@ TEST_F(BNTest, TestVectors) { {"ModInv", TestModInv}, {"GCD", TestGCD}, }; - - FileTestGTest("crypto/fipsmodule/bn/bn_tests.txt", [&](FileTest *t) { - void (*func)(BIGNUMFileTest *t, BN_CTX *ctx) = nullptr; - for (const auto &test : kTests) { - if (t->GetType() == test.name) { - func = test.func; - break; - } - } - if (!func) { - FAIL() << "Unknown test type: " << t->GetType(); - return; + void (*func)(BIGNUMFileTest * t, BN_CTX * ctx) = nullptr; + for (const auto &test : kTests) { + if (t->GetType() == test.name) { + func = test.func; + break; } + } + if (!func) { + FAIL() << "Unknown test type: " << t->GetType(); + return; + } - // Run the test with normalize-sized |BIGNUM|s. - BIGNUMFileTest bn_test(t, 0); - BN_CTX_start(ctx()); - func(&bn_test, ctx()); - BN_CTX_end(ctx()); - unsigned num_bignums = bn_test.num_bignums(); - - // Repeat the test with all combinations of large and small |BIGNUM|s. - for (unsigned large_mask = 1; large_mask < (1u << num_bignums); - large_mask++) { - SCOPED_TRACE(large_mask); - BIGNUMFileTest bn_test2(t, large_mask); - BN_CTX_start(ctx()); - func(&bn_test2, ctx()); - BN_CTX_end(ctx()); - } - }); + // Run the test with normalize-sized |BIGNUM|s. + BIGNUMFileTest bn_test(t, 0); + BN_CTX_start(ctx); + func(&bn_test, ctx); + BN_CTX_end(ctx); + unsigned num_bignums = bn_test.num_bignums(); + + // Repeat the test with all combinations of large and small |BIGNUM|s. + for (unsigned large_mask = 1; large_mask < (1u << num_bignums); + large_mask++) { + SCOPED_TRACE(large_mask); + BIGNUMFileTest bn_test2(t, large_mask); + BN_CTX_start(ctx); + func(&bn_test2, ctx); + BN_CTX_end(ctx); + } +} + +TEST_F(BNTest, ExpTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/exp_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); +} + +TEST_F(BNTest, GCDTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/gcd_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); +} + +TEST_F(BNTest, ModExpTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/mod_exp_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); +} + +TEST_F(BNTest, ModInvTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/mod_inv_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); +} + +TEST_F(BNTest, ModMulTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/mod_mul_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); +} + +TEST_F(BNTest, ModSqrtTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/mod_sqrt_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); +} + +TEST_F(BNTest, ProductTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/product_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); +} + +TEST_F(BNTest, QuotientTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/quotient_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); +} + +TEST_F(BNTest, ShiftTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/shift_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); +} + +TEST_F(BNTest, SumTestVectors) { + FileTestGTest("crypto/fipsmodule/bn/test/sum_tests.txt", + [&](FileTest *t) { RunBNFileTest(t, ctx()); }); } TEST_F(BNTest, BN2BinPadded) { @@ -2324,7 +2371,7 @@ TEST_F(BNTest, PrimeChecking) { TEST_F(BNTest, MillerRabinIteration) { FileTestGTest( - "crypto/fipsmodule/bn/miller_rabin_tests.txt", [&](FileTest *t) { + "crypto/fipsmodule/bn/test/miller_rabin_tests.txt", [&](FileTest *t) { BIGNUMFileTest bn_test(t, /*large_mask=*/0); bssl::UniquePtr w = bn_test.GetBIGNUM("W"); @@ -2728,6 +2775,62 @@ TEST_F(BNTest, ModSqrtInvalid) { BN_free(BN_mod_sqrt(nullptr, bn2140142.get(), bn4588033.get(), ctx())); } +// Test that constructing Montgomery contexts for large bignums is not possible. +// Our Montgomery reduction implementation stack-allocates temporaries, so we +// cap how large of moduli we accept. +TEST_F(BNTest, MontgomeryLarge) { + std::vector large_bignum_bytes(16 * 1024, 0xff); + bssl::UniquePtr large_bignum( + BN_bin2bn(large_bignum_bytes.data(), large_bignum_bytes.size(), nullptr)); + ASSERT_TRUE(large_bignum); + bssl::UniquePtr mont( + BN_MONT_CTX_new_for_modulus(large_bignum.get(), ctx())); + EXPECT_FALSE(mont); + + // The same limit should apply when |BN_mod_exp_mont_consttime| internally + // constructs a |BN_MONT_CTX|. + bssl::UniquePtr r(BN_new()); + ASSERT_TRUE(r); + EXPECT_FALSE(BN_mod_exp_mont_consttime(r.get(), BN_value_one(), + large_bignum.get(), large_bignum.get(), + 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}) { diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/bn_test_to_fuzzer.go b/third_party/boringssl/src/crypto/fipsmodule/bn/bn_test_to_fuzzer.go index d1ee734c3b01..2915db5f9d82 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/bn_test_to_fuzzer.go +++ b/third_party/boringssl/src/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 ( @@ -21,7 +23,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math/big" "os" "path/filepath" @@ -139,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 { @@ -221,8 +222,8 @@ func main() { if len(fuzzer) != 0 { hash := sha1.Sum(b) - path := filepath.Join(fuzzerDir, fuzzer + "_corpus", hex.EncodeToString(hash[:])) - if err := ioutil.WriteFile(path, b, 0666); err != nil { + path := filepath.Join(fuzzerDir, fuzzer+"_corpus", hex.EncodeToString(hash[:])) + if err := os.WriteFile(path, b, 0666); err != nil { fmt.Fprintf(os.Stderr, "Error writing to %s: %s.\n", path, err) os.Exit(1) } diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/bn_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/bn_tests.txt deleted file mode 100644 index 9a1a5db9291a..000000000000 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/bn_tests.txt +++ /dev/null @@ -1,11630 +0,0 @@ -# Sum tests. -# -# These test vectors satisfy A + B = Sum. - -Sum = 0 -A = 0 -B = 0 - -Sum = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d -A = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d -B = 0 - -Sum = -c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d -A = -c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d -B = 0 - -Sum = 0 -A = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d -B = -c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d - -Sum = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 23f85668bf4d0fa273d8c7f63c5fee57811062a674111e295a73a58e08dd0fd58eda1f473960559d5b96d1862164e96efded31f756df3f57c - -Sum = c590e57ee64fceccd54e0bdc52476a756d32e794922dca0acc780d2c6af8852351102b40dfb97009f95e019a5bf38e5d127aa78bc34425edf96f763084a8b09f -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -4b5b16252ba2355e0b87f01baa721783c403607a4c1b5652c09a68e96926c8e314fa580bf0ad3f8f59bd70f14df86a4676661899b54c79a62 - -Sum = -c590e57ee64fcec882fef3ffd015a3fd9024d8f5f6d53eb537d6abdb0ff5e76a8fb08d5feed113fc9e74745d957adf32704a08339ba42efd5746c5d478e3f57b -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 908007a2f3c551c58958d1059427a0391d4d768f61cb802e4cb062c778354ea3eaa8f0dfbd14ca8203e07ae6d07269b58088a39f7608c5586 - -Sum = -c590e57ee64fceeb242f8a0893eaa0d2ccc3dc57ec40fe917cfde66618fba678ce0c8fffc566d4e8c7944d6443def8014fe8ee410a1b8dfd06cb0b436619e0dd -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1999301bd9877fe07ca711f308b2f1bc4a704fd194ec4dbc297355d6285340d6ad7e90cb0add1770aea19737a06750c3a7a6fa0b778ca995dc - -Sum = c590e57ee64fcef321395bba088ca0a867e1e85a1ea77478f8783e6a6cf8f3e582bff83cb2d7d9fd549fcbb40dea22ac140351007030059500bdca81413600e9 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 219639ed8afc21e052422fff0ae5583231ebca2999404b099628093e6540b1dbc20b9c495aa7229b5965b19a5fcd653b3fa0eccab567c5b5e8 - -Sum = c590e57ee64fce834a00cc6282cb0eef49eac7a8d5b51988cb49253ed85ae261c76f2327a691fc63eceab02614807048b2816cdb9b89ca66a17b6ed1abdab580 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -4e40fea1cc899fb166dbc721a6639a28be4164ef92545307ed934796afcb9401d75c18d23352471709fbd049c50740ffeebe5590fa2d959581 - -Sum = -c590e57ee64fce1a17609c61ce02f1020c6eb6e241e3fdd01546ce7247725589de32db95f36718d410f9ce9a94fecc8fb205e876fde75ce83f4d01e1bd5d818d -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = b7739ed1cd3e67cf541943326cf76b4476f767465ee53b94c57c83de417ebee5673809b3bed1c8bac2fc4bce29a4e36d6d2083fdea1c12c974 - -Sum = -c590e57ee64fd03e2d08c3d8e5110d08e3d36557d82e0e49b408337a8c9d4298802ae5f0145a9587531a70d2f8af932b8262245428b5c549817d333f2dfaeeec -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -16ca20955a9d8a64cb2be217c089edecc02a75a1ea95fef584925742c18a234974c0a16ee7991e80bd8d4106db385eafaf421ac3373548aa3eb - -Sum = c590e57ee64fd1bcac71b5b055e5934ba15dd7f56370063369c36e57a6b753269e085d0f4d38bfb711d5579dd1d89d07f266e727b232a497d5b0d9bfbc02d8a5 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 2eb21724781497ad2f57babeea62a20c3ec5d1559867a0968d74351a337db12c17bc8d1d5446b1115b5441530870f67da4275dfd9f3e2928da4 - -Sum = c590e57ee64fc7860b0be6ce861bc2f099db7fb623912b7b0729c019a8183c669c73efe02b195483a4cd2c78244cd59678ac4d62f6887fe686a3eed37ed460ff -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -74b7ff38760864efd658bd6699915be16cc058454b78495ade8be42c9f7470ca9b7a43655e1427ab1bc35a5693dac424a6ed92d10f85a9bea02 - -Sum = -c590e57ee64fc3126776e79d9fca06233bd2ef5570a65e4521183627bdbdbc555e9118508cf63f519bc0caedbffd5b1a913ee8c3603804820a9ce54b1207bdef -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = bbf238886916ca0ba32e9def9f9c8a8e401eb95dea96ef02df9fc25a186e52fbee9ad42b76ba6ca2c381d12cddd4292c5d355341a80c7688d12 - -Sum = -c590e57ee64fe6dfd728dfbe45aee52380b5a00cf1e05e9f09ac582e2714bb589caf2ad038111c5b1b5573a45706ab1f6fd5d5a1ee7ef4a9bf186dca8a9ede12 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -180e4c29718f394424cd5b03b6bdb8911c57fcfe435cfa66d10941f870f8c5eb1e1fd251f14af03f23ccc1841f014bb42a545f476dfeb12e9311 - -Sum = c590e57ee65004b3e18a5820de4a6d25e7c3d310003e0b8716bbfd51d5f0f3e87fdf8e00599d713397255281e66ef419a9d9bb228e8f052764f5f861ccca656f -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 35e2568ae9f1d1dfaccfc211e9c0c6eec9400a0de880a94309992528d428e77772f84e21d0287fa76cc6fb880481ebc43ad20524f895f35a1a6e - -Sum = c590e57ee64f84896a5f11f575d34b6001f27d4b4d6e7cd9485260629f8f7f1c6ca6f6115b98d776774295dde4d59cdbbceccad097a0a054b501bfb47d81e85c -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -4a4820a05c39969774f623bf6c03ebe0c56dc45bb46e8d1e6b32ee0fc3c6168d26c4d1c0ec7b81f1ea76f164ebd00b2a2a00aacf40175bee62a5 - -Sum = -c590e57ee64edf1b2b57b4cbb92d778ea6b9d9878a0374d4ea81691b09811b105bb6dbf23a57d89264f0e6c83f8d00fe00681644feed56e15fc81103ab9b7dd6 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = efb65fa7b963533d48c77ef80fc7af4bcd72222cabb6232ccf3efeffdde537ce25a8e4129b91273a8654ade9a05ba3dd73740008eec82dd4cd2b - -Sum = -c590e57ee650e25da7b60146e014f472bfff9809aa8f519db7943f69d9ad09ee75a3427c6127cce7bd27f224b9dec03111fb066956b4903f9f9740cce1aa4ba7 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1138c1cb69317d3aa341c9a4daeba71400f56aae62a98acff1f9f1aec88a4ef01ceac74246fcb531738de63a94fc8b3e9c5ea3fc64101083a00a6 - -Sum = c590e57ee653af8752322840ed720f628f9674c81073b58372e49ef26d4a2a9d46a0391bc170336614b27849de98709a4b321da4ddfb978e9f10df29154edb9f -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 3e0b5c732ba11e1074f0c69e48b78d724733c66368a21409c404debe97f444f4a352acbaef5f077d0e9479ce067043b30cd393f3fdf5d3bde909e - -Sum = c590e57ee64bc13634cbd149aae35ee47bde6ea3663f74ff300cfdb2d845f902f017586c6d4f83f08c3b4f0c035055d13fc9d340b7b9ed164432aed44e8f4d7c -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -40d9b56339ce561876171a9d37aabd30fcd47dca1171e5467f14c6a9f616b04d67a4abcc8334d637731816e87e35feb10dd3f1b9e50f78ae0fd85 - -Sum = -c590e57ee6477eb692705f8da1357e71591336907a5e0a6e39715088d53b2610882765357563fd101bcf05ca545a0c718f52879fdf4f80cb9a12cf108eca60ed -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 8501af88f0ea16b3541e4cc9eb2bebef137d8d33cc4485772c43ed28f54a1fcc2012b2d347c8f126d7ae11eff2f00c37b4989c5be30bb4aa5ea14 - -Sum = -c590e57ee669b662e37f5abf13d00d2f0c1c9a8b99ec546361aad255f375bc2742a3487c351c5ba00efef09c77331577460a47c57125c620b643e9eaf36a146b -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -19e791587fec9007654cd8e66ab13c609d121c54fcbd84c6c7d1d7e7ec8ea4c2f65d64c5fb6e43106b8e2497b89124ce5afbcb5672ea1f19f9c96a - -Sum = c590e57ee681dcbf1554f22c0b1ffead917dd414299cb37ce6967ffec9c333931e70358729843c8130ac95aba47fa1fa5da74000eff25eecae176f093a4effca -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 320ded8a5583fcfeb53e576bcbeac4f04d7135d9e86b2d9d154943c3b97bafb75e3e45e7a913523db81aa7af5589604d2794974e466f3d60deb4c9 - -Sum = c590e57ee5e505ae4a2e1f25a1ae9b7b4d17dd2cccc09f2416d964e55af6d0d31fe259c160f87646a72e6732d5110256b3b35425225d622b81418435c9dd8cc4 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -6ac92340d14f096abc24dad89a0c226c8ea322f5d4afebd1b7197c3ad46016112d87f4a1d51b2691b684fbfa9e627b806d6829de8f7b960f92be3d - -Sum = -c590e57ee58c3ef1582bf7a516e36f92b60f5a587e2c8cb071d1d52ff215854e52de1519fd5204fa52292dfdc397d8d76b78005941358b63a3e6ca41b0eb09b7 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = c38fe032d37689f58750c36fa28ef6bb22b5969adc3fa13a98650107d8a4bd74d3f940f6da545ba32fae7b42d9b64761953ef1bbea358a2885414a - -Sum = -c590e57ee80262967da4038a143f8ff2e78646108f25ff7183444ba507d76f9b05a34c8310e682c05495d0863ceff264964dbfa7c064adf6d26d2dca6e22ab13 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1b293c4f2a4955b07d4cf9cc1d45cc155d6bd2a769636d3db29854baaec92ab9ec084850b924e2cd6286b11e7fc09071d99e3a1729c2dfe94b26012 - -Sum = c590e57ee85427f08e8c89ffebfcc05c73370ad4cb77696c2b2f3878e6f6df341d4d931b5097aba49f14ac0312e7da1c843d6fd08119822e75e6e7a8c7bcb7b0 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 204591f038d1bd0df9200064d852185922827251e8123a7ba48f4e4c296d943de71ad69561129a9ac2052c9d5ebb92fde4eb7d91615e7dcee4c6caf - -Sum = c590e57ee051ca1a363c47a4cc016c3de7f7e17985009b545528289e9fbc9086f4b42a73826eca0c278b0d1b4ef6d74b9a0bfcb7855d40fdb201fbad1074b927 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -5fe04b754c3268a406954183dba07d5b44ea6f2b785ec328cf159c866028f63efb7342f2178753e17d0b0071445b9e91d6d8957adcf041ec8fb91da - -Sum = -c590e57edcd6e9ef06fe33f3817ba3d0c50c8122b77615c4b8fa50c5514f113d7ba53ce057d487bcbc373c4384d07b29a527b7ef785ca609474879b42a9a4c3a -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 978e4e284013a3b8aef1c8560a5682c81d92c8253b3c40bdb5ed911df117cf71a51767e8ccc4615e1f70c290929feb12a6e244c18888617aed5fec7 - -Sum = -c590e57f0436bdceb586a093522eb1630e0fc08f8790957aba1875a42b7676f9ca936e8f6f3478d6ef5cd590bf6ded0700440dcd769496822af8015f0a6ba2b6 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1de6eefd2a87326445c3f10ce85dd7404e415333ad6a60d2fec88caa6fdcb4b7fd0e7a9ba659533758a665b451f2572cd3c9cc2ccb27019330fb57b5 - -Sum = c590e57f1df3f004d5e49f49fa28603b26659f1fd35e0d8d7a2753591dbc12c51e6b588427dbe3faba2f0c1f2f0a2aea9ba1fcb2fe71c6ff40555058d23c8661 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 37a421334ae5311aedbd9fe500b3b5d09a0ecb466d793e87f10e2875c3b49eacb5b5e5bf712b89c5c842a397ed5046125ba6fca9e084508cf8cc3b60 - -Sum = c590e57e9a4abf4572fa7c4c9f73e9d3fd1227646fd6d15b51924bd7a5d417b01fe6b4273eaa6ece387422b81c8116f29702d7d66d2f6e8c3454807b3b7d413c -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -4c050f8c1804f1e26cf6d682289fc1eac97870ebbb1bc8f986d9d29f3ad005b0337b8f6d108f5fa14a467060174edeca359b5bc92b7c7f509df309c5 - -Sum = -c590e57e64216c306f17017ac9dd7085113e16c83168664dbb77c7ad3ddfc79b09f9ea0c474a0b497ca15e7fb258eed9666fd009f691a3b2d691c2c6b22ba3b3 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 822e62a11be86cb4428d4fd11473d28707e6dbf951364d23eece22b450bccfcb2adbf2f1cc6223d9b46e987947e1e696ac3926a2893f3d052744a74e - -Sum = -c590e5806ab4d09773c4f94a4aac09f6ed7609eec1d0bafecb09e30f032f706e9adadc191ff9e6d7dccc821f7a8666a590e521749d24912c5a5ffeff246f7c85 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1846501c5e8c58b1b3e4149a0c7c4209f888178b7be5bce3dd681861f40242241add3e89c93c8ffc613bedf52e2936ad3fa59c6d6fa8eff334aff3184 - -Sum = c590e58248cbf5dd61ec57994fc862ab479dc6cda51cc17356c45cef66bbfdd12f5cc421940a561581c123fb17483beb7a1cce2596fa9ca76e722a6f4621eae9 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 3627c270bd6ece96a435da25521ebdd7e6bcd7f2c4a16481e3a0e1381d4a60a4a21e457da38bda1a1b080b498cbcb1784f42fd2520ea12aa36cb19fe8 - -Sum = c590e5771a85bdb1f26c0386ce837bec4b0af5656496efdf4f134d875f066dd6d477ca8f87ffb275da07da4dd1bed4232849a526836b47f2d69f2d53b6b3e2f1 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -7cbca111f98936aa83de74469daa6f3e9d4b85267bd9ac749cda77c78863eef47ea264bc56efba80b9508b32f8608117a1f5f82628931d27822bc6810 - -Sum = -c590e571c76afad23439f904e8a80fc28dcabb6cb732e361ed3eef471be6fa755e3fe746edbfe448c1f289ffed7dfc01fe9066d780564f57f93abbca9b9a995a -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = d1ee4d3ff56c5752a23c2b09397e72de2821c5ee51f6f258a10c6efd9fc76d290846619f28710f85979498b50afc14fc922747afd669644013dd5b1a7 - -Sum = -c590e598cd5d4a59ff5d6c97c6370fb517f1d492a7776f90063b0ddd6702e37c60fc78bb12857911cea37b7263584d7dc815676de6b8880200acea154b59b08b -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -19e70d7b88745dfe68b9cc4f5ef23feb436e282d48f98cf90c3a54f92d0645bee3a05f7ad6859ff918fc90c62b19c3b0cd43edbdaca0dbea4971e9658a - -Sum = c590e5b5829e6fceb77830fbe999a98127b50302fd0f6a86ea4aea27b846747a07e6fcf5457676e6446137d6bdd8ff4fb7ca747b650b066d65d7dc1e172488e7 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 369c4ea0fd2c78c2ccdd2ee92b020319b3c3c0283fdd9cd5568b988a2aad30431dd35078aafb5db57d571177fd0978bddac2403c180606dc523db43de6 - -Sum = c590e52a3ab5d5c458634254e2f672a322000750741e969d2f6cd12d172480ad1455300e3a0575b068b85d50b58f9737be13073188d0f03b71494bd0fd2fea16 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -54ab99f90d329c2bda29744db303b1e1fec530aba9dd4143a4158969a2466189c93820888ae04b2508b137f01af03eaf6f19f9da19ee87b3fadc4060eb - -Sum = -c590e4880579ef7241bde94e8c7847badc705f53828751f9975f0e66371d2ddff8740b143f32e88be8e686e2bf5a3ce03d864d7699a813b1777b9239af242c7d -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = f6e0d5df5f494184e07ff2789b494189fbb6c7f04d754f066af590bc6f6242aec332f315af601cfb76a76d4a7270cb692a0922b6a3e8556d922a4c1e84 - -Sum = -c590e6dbe54098694155509e38c61d503ab7e5237d2cdfc2b87fb57e3a8420fe37fe50a0dad4f0eae3d38fad6198e4ecaeae183a12078f53d09ac8099c715242 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -15cfef0c997b655e26f2c5b5cfa1505fbd443dd9d7babd1a0ad0dd636aedd4796c968aef2af9ad00d53fad15d9a005c61996f3cc4fe70c9c83dc3010741 - -Sum = c590e906254d013be2021ad591e76e26706a6815b8c484b6528fec65416e1066957002713e1183f1005f565983aad7aa031e549e6fc57094ca3e4383e7fdbc15 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 3873efd326a5702aca6857cadd04ab87ec67f75426f45e1d79414c026173ab94899cbeb85b5b75bd4001ce3505754cc9dfdccfaa63f6a6d43b80e8d7114 - -Sum = c590e0e0079190d7afd80acd6326fe93cc00903318608df31ee4493d11271dac7291bd142cca0e5dd7dda59dabd460a69b7855d9c2acb5f062de76665e07cbd7 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -49edebe3df9db276361a943c1c259b1591c20eeb453edc9cb941b86cca2e824fcc3455befdd7125dcbbbaf326ac12d960c6e01e1464fcf289657b687f2a - -Sum = -c590d9ae456d66c1b132d844eb223867ba4560b36f53c42a616cf8cc657e6d252f813847fb9fc50127227684e5c0f5cd890eceb341d21e788e42f843e9b64080 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = bd0a0e2680fd9cc95ea214887ee6b6c889bc9fb7e1cab411c04c72f7d2a2b35818f7686393a21e10bd4810691852542e7ed60f8abdcd18e0787efba0a81 - -Sum = -c5910498291472fe1d0047d5bdd9e46deb3f26000e943fce8d83d700d9ae233ab3a28849bbb346803da142db6a471e9f79cd49571f40dbc46f7b727a4bb3016a -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1f1942c4a42c9200d9a6b16f2417c58d3cb0d544fd8780d5c22fad0038eb58ebce72498d4844f49dc082037f974ccb7b92b67c76116f0faa72ae7242b669 - -Sum = c59112d841ea109440e78563d9eefef201c81e86ae967083f8b7db80d1eaf58551d30519ca6dd79164fe69a29cf1ba22446cb2999f73292241005bf17b37528e -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 2d595b9a41c2b5e81734cd843e9bdc16353775472e3cec09c6afa53d0b35f71c4b425847d9561bfae749362a32cf961afbf8fca85ecce12f5c25a1c7078d - -Sum = c590671f890ca06c74ac6d2c4d75aabeaaa55312e85a5e1ea9cef0e08e154e2b090eaba869e9f6e4a47ae10b9c1eb0f6ae4fb3ef12b3121d96066c6c8e592b6e -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -7e5f5d432e6516530102bef515977b0c963c50f4e42862df23f09e989c2451a80e2f083c0756a488a14dcaa8d65c000202b19017b837c9ca935f4b171f93 - -Sum = -c58ff0ae92ab03072154949a7143d45278ef77a0ba71a785d5a370e0d30a9b4b4f7e96a395d13e6afeebbd717365d471ee56ba11c472a63c0532558104bedfc5 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = f4d053a4cbca69aad9949b26ec03acc271ae7edd9ac1370aa3f059a34f040b382333dc54bfd04a17c4e7f361b2e0bffafc8ede5824195a9eaa4ad4b16b3c - -Sum = -c5927a5fcc3b31abeca3998ad99c07626112288a6ad95b24929fed581040757fdce73881c48b02daf09986ea436a3f5ceb6833c31fa2e1691567601a26c7a6c9 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -194e0e5eb62da61a42b5bcd31470c3b603f3b318a18dd85f1d886e3928b3082307eaa5265049fa7960490dca2b80a3d167d227cd81713b596604e4d575bc8 - -Sum = c59395e94d495451e3fea153f3e4361a088004a7d5426c1b94aec44108ad6f5cecc3a80dda0cea9f51b882747258137e171bf021b4fc59f4dcf0106d4ba952fa -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 2b06a66f9858058ff3324e77975c3e2ce1b589bf329d48800af6fdbff850d920cee3667e6ec6408b5001b0b908c2b68ca398112318f9f7d1f10a1723907f9 - -Sum = c58bdb26c0fd6766f3affea389cbe7db25c06d5d56356d3d945347775bddf479ffc9e279e7d1ee88eddb239906749815ae4502fbbc6fe978a001ccdafd89cb10 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -50a582552676a974f6f8b829ed87afff17bf1e319d509785acd59d0cff5d55aecd75d8a540fb25b285ec06052ef3d000cb3a4e65ae0dcbfcf32f0dbe67ff1 - -Sum = -c581afe9b7ae86d4b7053f19649beea6cb935799a553f035f9b9a7fba6d5559e4ecdcd1637c73c8052c6cc52ee1c28d1e5aed9db7261b7356afd6e3dbc213684 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = f35952ea147fcd3fa2f15a7ced1af5a1e91b593fb521112f46cd585d894b10be8ecc13a5ec1baf63cb60678ab5e80c8a2dcc53069131ff4d3918e1d4f147d - -Sum = -c5a19f36a65a6a8d52a53a63f99a1b957d6e376b7010ad14695d78d67b0d7c86881006188bd27bbf205c8c9c200dc8f5c08ab6b97dcd512f6cb93ed9a361ff9f -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -10b9b7c00a9bbbc7a5cc34ed2f5b3f57bc4e1c36c16acd5caf64054e5f92372d594c4119ac7d83d7590a42b94641a312390018db0286da0ce83f0dc9f1b49e - -Sum = c5cd0e5da24b67a894402b0eee5dd586ab70e5beb0693e263a54995193663a9b770141379c1f097a49d1a889bbf0c348c6f40ed50bd7bdc11a7869c6106c6d80 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 3c28debbfb98d70940bcdfe1f3153085befc6f7719fbdf2da6848066b8504c1c4a876029f90b3f00ce263055293bf618a25834690cf36bbaa769fa36fc227f - -Sum = c54e2c560a00226701b76cf03d5de27a8c69b38a6b85dad9f7c903d2e87f9a7d247522e72491460f6a529e5ca2aaaf690cb238b873ffb49d9fb0ecacfedd4e90 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -42b928dc4fac6a8948013ecf0cdddb994835c4cdc9676d14e510fe442e4fd2364196f04d94b82bdeb0e3fcc41cd7e9a19f7de82ecb15b7c020131eda92fc71 - -Sum = -c4bfb037f6e6e861efb090ee610c33e7568790259f747dc6e55d442aadd68c0cc93c7617f83980e8813c0fb7dd28c8aaca6ad8fdde5d2bfec9ae096faa9ef54e -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = d13546ef68e66f9b4edd40ab5e8c6ecf2a592999dac4802750d0a67ed75e42917a43bf79ec7d52c7c772a1899ebea7e3e6dda2c46d9e569622f65c2ed155b3 - -Sum = -c6aa2af8c9ae8be4aada83f66b7f31a8bce5e92c67d8938424a1405903e5502bffc4ee1e333da4bcfd0cb383b19a566372f877a8344b66dbceabc9786dd0e4f2 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1194579e35ebd131fdb15c75f1471529733ffdd2e89513d17f32b87d73765dca50e3446c117a681b409312a4ad2cf10c4a6c10791809c866edac9ac946099f1 - -Sum = c8aff66c9bdaa49eafac0f65d3ddff223b7a5471f7400431ca3a54615d600fc4a163f8fb648bddb5fd6915db1991611805040e0f86f152c8fd3333ef70d632e4 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 31f10edb58ad5cd24aca136c7733ecc15c86b22bdf0c1eabd8c3f9030b2257546ad3f23f265df7ab4659381b2c9d9c556b2576ee42688739d6234239765e7e3 - -Sum = be1b6eb768e2cef388eebe31f9b21e51b38b351cc8175eba06d49eef04c2936f32167174dcb82297fd4180d0afb5da2c455d158c7a5bf01bdef8c295a4f20390 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -77576c77d6cffde0210affd12b8a2047226b4327137e38d05d975e227eb56e028a04862956ddba34bc20188b711ad2668f4a114286eda3980d83d36347e4771 - -Sum = -ba32fca1d5cc5f31ecaf5407f376d3aef9f4abc04fd4c6893721d3e50e9141abf356eb2ff6f7a4f9b42983148670d2918e1dff7aa7ae33a6e9dadcb708b4f9dc -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = b5de8dd10836f9f9e501a2718f3eca72bbd3d8ee97a7bbdd58c40ec1e1ca8a3675fcea77b2e594194d9ff44e056b4c12033b725fb1c96ae75f62314d0bb5125 - -Sum = -e388afbf17c495f86aa7298a45f848eb57e5baaee42b1f7de8c2311bfbb8f74549712c05fd3bd11ab8874fb55abb22a37ba3512e733ecd5c472842e8e6f7b179 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1df7ca403174c726dfa7bb5b398d88953233d15faadbdd36dc141c4acf0b0cf5eeba722e8b15d2df6f83cd5bf3f39b50cd519a8dd0740306e757431d0d876678 - -Sum = e891babe65ee02c02e7e876c0df3dc3bb37491008f3642ca7affe2d623fa82a6d5a9e5400944a374ab70fbb8f952dad0c8b27c77475b0dfec7b0694051dcd1f4 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 2300d53f7f9e33eea37f193d01891be58dc2a7b155e700836e51ce04f74c98577af32b68971ea539626d795f928b537e1a60c5d6a49043a967df6974786c86f3 - -Sum = 4dfc2f63d60f83fb1d397d2406b02a3b25c1a57c09c2fe02c76696b7c956e44facdef11470074d8fd8220c7bf8e647ba873fe9c3f9e77d6aae7b5fb64f1cf566 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -7794b61b10404ad66dc5f10b05ba961afff043d32f8c444445477e19635705ffadd7c8c3021eb0ab70e175dd6de13f982711ccdca8e34ceab155a0158a53559b - -Sum = -3c19bedc60e7d7dc3daaa36795e453d810c952dd5185fcdc857e2be806e520068dbedb91c4a1131b9eb6dcdfd500045209514e3e9f6e6df41d2ec67fba20e10a -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 897726a28567f6f54d54cac776866c7e14e89671e7c9456a872fe8e925c8ca48ccf7de45ad84eb1faa4ca57991c78300a5006862035c5c6142a2394c1f4f69f7 - -Sum = -28c2bddfeffbdbdb1ec6f06aa310d1bb6f0c4b88d0106a1b381ae6fe8f65c18bd9895fcba6931ecf06d9dab6c7a3ac9e00361bf165f16bd16af25230d040cd842 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1c69af880196deee0616f987b24a25b60cb12cf3dc7b75f6c75005b17c9ae2e6e3ddf42e2f70beeb5249a29131373428d55100875bc4bf2c14f5423412a9c8d41 - -Sum = 372ea360832e30b16a3c30a2157c8bddc4408ce0428169deb09bf68113e4b8482d887de1a7cfc80272e597c3f3f104e6825a1fd2a68b41cbc307caaae17d453e6 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 2ad5950894c933c4518c39bf24b5dfd861e56e4b4eec75ba3fd115340119d9a337dd124430ad681ebe555f9e5d848c71577504689c5e95266d0abaae23e6408e5 - -Sum = -5b29f4991cad86845a50949f25ad6cd7c883d71ceec9795cc528f58a4a4aef9dc139e8e87cb82071e112b2d256181eaad0a98fa36b25b67dc673608939b48e08a -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -678302f10b12837173008b82167418dd2adef5b1e25e6d8135f3d6d75d15ce42b6e55485f3da805595a2eaf7ec84971ffb8eab0d755263231c707085f74b92b8b - -Sum = 98b37ecc0b42a15f52c8fc8bc2aba294031bc2dfa37dcba0fdf1f5f5da00b8b3daece033b47bf254e8b5e201bae24995034673800d53213f6ee0796be1ca93845 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = a50c8d23f9a79e4c6b78f36eb3724e996576e1749712bfc56ebcd742eccb9758d0984bd12b9e52389d461a27514ec20a2e2b8eea177fcde4c4dd89689f6198346 - -Sum = -1c15985f3ee941d7ab6bedad88143cf497681424e7456fe30eafbdedfcdf1e927db124c775b87f36cefff17a35972ac40d498c4be818883bfc206f44c5e5eec23b -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1b500779c002f208d9e0ee3f5907d2344142623b980c20a0c7a30fd92bb270a82e566e0d9e46593893b6edf7dc30633cba9b3a954775bd71a6c09e44fa0c7e773a - -Sum = 34ab71257e63b234258027e26bd35dfa5e07f67385b6772c5ed445438478bef5a835e87c9de413e23839849a71f5af99a67427098b682bfb6becb66d20eaecb2e7 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 33e5e03fff7d626553f528743cc6f33a07e2448a367d27ea17c7972eb34c110b58db31c2c671ede3fcf08118188ee81253c5d552eac56131168ce56d55117c67e6 - -Sum = -44f9508e3430f93d4e2c8be1b856f46c01d6940e1bfda8515c747a1a95239547322999e500e718ec98ed211ae04ffc76b0e6f2364ce9d913ffb80397f24ee8d64e -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -45bee173b317490c1fb78b4fe7635f2c57fc45f76b36f793a381282f665043318184509ed8593eead436249d39b6c3fe039543eced8ca3de5517d497be2859214f - -Sum = bea59d2cb0bf556876d4f8a248339af69644a12d3dc1d9a3d83929929b8db5aa26289bd06e2488a96820ea8f59168cc82f19b5dfaab20d245495d6e24bfb260a3a -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = bf6b2e122fa5a537485ff810774005b6ec6a53168cfb28e61f45d7a76cba63947583528a4596aea7a369ee11b27d544f81c807964b54d7eea9f5a7e217d496553b - -Sum = -166abef6a1682bef78d4c5905a833b81a03c0bf0f3735973bf7f02181a8ce5c7f125f41fcbb10c7f5905e492fc3f6b172f23d041620f8a7ac6f76e0c8a53d3cb5e8 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -165e65e84979c6f28bbc1599779274d59ad9b0d25e7fc47f9b0e3736cd7a1ae94c3048b42e39ea1f7551545ad6a8fe9eb9f8eb25f8055dce21a170fc8d963cc6ae7 - -Sum = 3245e002843eb7116b987b5cf9160e6891a74a6843039f8517fbda68b0e6ad87fd0aa836a2b6aacabcd67d45d327e6cab43ef569f488354e22f4553eed09e83d601 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 323986f42c5052147e7fcb66162547bc8c44ef49ae100a90f38b0f8763d3e2a95814fccb053f886ad921ed0dad917a523f14104e8a7e08a17d9e582ef04c5138b00 - -Sum = -464684d68716498baaa3744d20c112a854e148e6d004e4142c79f4e25a36c0acbff72c047925377f377ad690c63fd21a3f05911d11fb8bb79bec4ea68fef9f1d575 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -4652dde4df04ae8897bc244403b1d9545a43a40564f8790850eabfc3a7498b8b64ecd770169c59df1b2f66c8ebd63e92b43076387c05b86441424bb68cad3622076 - -Sum = bb90e9e393538df233d499955020b8f3c9789b1f18fd5ba31cdcca6afe24842166e6cbf1985f7f9e002335be46de06ce11ffbf6dbfe743642cdeefca1a856219fe4 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = bb9d42f1eb41f2ef20ed498c33117f9fcedaf63dadf0f097414d954c4b374f000bdc775d35d6a1fde3d7c5f66c747346872aa48929f17010d234ecda1742f91eae5 - -Sum = -1804d154182f4b71cab3529447ced41ac310a1d14121847816c74171759998b707db0f1f3a9d6f6e01a2de48ec83a45e5dc7d0ac9133c8e00ec41814e3d2818834f4 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -18040bc332b06521fbe1c794d99fc7b002ba7c1f57d24b28d48034c360c86c091d8bb46880c5fd48036795456a2a3d96d675225ada932615446eb843e406a817e9f3 - -Sum = 3b75f0b892eb00075eb21961cc018a2d297764bf560cede3290cab6682a56931b831380b72a9afc3dff88f042ed5bd5d8468d8a1e267b36e508c09ccac2a565936e0 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 3b752b27ad6c19b78fe08e625dd27dc269213f0d6cbdb493e6c59eb86dd43c83cde1dd54b8d23d9de1bd4600ac7c5695fd162a502bc710a38636a9fbac5e7ce8ebdf - -Sum = -4b4bf674436c9b1079c2b24cdda19247d0db44061c562ab6f5300eac53556fbe758151824b6bc6bb63a958895fd7c4205cde5484a9fcbbe787fe38c3d36f4549dc23 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -4b4cbc0528eb816048943d4c4bd09eb2913169b805a5640637771b5a68269c6c5fd0ac39054338e161e4a18ce2312ae7e43102d6609d5eb252539894d33b1eba2724 - -Sum = dd8af6a278a84889cab2d444efb282a7259a608117db26583287f051bca1b70c21f8c3d95b2f4e0b7d25b6966771a5c41414c386bf4491ef7b055b07455c12b5d8d5 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = dd8bbc335e272ed999845f445de18f11e5f08633012a5fa774cefcffd172e3ba0c481e901506c0317b60ff99e9cb0c8b9b6771d875e534ba455abad84527ec2623d6 - -Sum = -16cac44109b24fd5d47dfb5994caecbbd534ee11178aaea4a100d9e63bb2c5ecdcafce1e2080eafdda00d26c29e01980166d8db67800e33027f5260d154efe1a98973 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -16cab7e7fb5a6170d790e2a99de7fbf5292f8bb5f8f5bb0facdc691b5a65b321fe0ad872b4e373db7a1d1ddbf1ba83139df862d15c96d9037b4fd0100552408393e72 - -Sum = 22db04aa783edd3e1a55d263262805f2892c013f78ebb86239f2e5981090158f57bdf3bb171c2e0c1c7bf9bc88ab62683581f8b02c5bec8f631bb24ade9be235108bb -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 22daf85169e6eed91d68b9b32f45152bdd269ee45a56c4cd45ce74cd2f4302c47918fe0fab7eb6e9bc98452c5085cbfbbd0ccdcb10f1e262b6765c4dce9f249e0bdba - -Sum = -4c8c0b74eb7a79a12ecaecf885b9672ac717b1c8db5ad251f1551ce80af89acf3a495066c85a96e6430be8e5888ab1ef3edd5e76645b5914ab55d221c34d07f8d5ce0 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -4c8c17cdf9d268062bb805a87c9c57f1731d1423f9efc5e6e5798db2ec45ad9a18ee461233f80e08a2ef9d75c0b0485bb752895b7fc5634157fb281ed349c58fda7e1 - -Sum = e3718adf0c2546c8cceb0e8c7d909deaa50b50f51d7b80f8040763eafbf581c017e7e12325b258503fe651ffa4c3d3ff9200515d816dfa3ba372dc937480d121ef056 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = e37197381a7d352dc9d8273c74738eb15110b3503c10748cf82bd4b5dd42948af68cd6ce914fcf729fca068fdce96a6c0a757c429cd8046850183290847d8eb8f3b57 - -Sum = -18dd84a4e54a29c1b3106ef2f2d92be21ba64d2e26b3f4c2ea68685557d01a07f9229365c6d109205fa116fee59cf385cdd61b7fa5de8de751f02f1dc0eeb304babb4e -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -18dd83df5464aadb63419d67f36afcd5b0e5f70874caa5899b262148a9bb48db4b38440b101731ae39a2dbb5e21a9a1f064ec8d15427ed448725d9bdefeee72b4a704d - -Sum = 3ce64e7953aff0e057cdd6c17499461666f5bf8dc3a929ba7ba919486c1631c25c0e142584470d3f759157c045f9f488502a76024b6b7b2bf84c0adcce8dd7c6d6898f -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 3ce64db3c2ca71fa07ff0536752b1709fc35696811bfda812c66d23bbe016095ae23c4cacd8d35cd4f931c7742779b2188a32353f9b4da892d81b57cfd8e0bed663e8e - -Sum = -6a392e555c2ae89dd73f86e11fd98d1d59ed03072a0dd61add633b317d5638d67984a55e51f01a2db94ad6eb6488fa80cf4f25a32d436886599c33b5287a9525f41a4a -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -6a392f1aed106784270e586c1f47bc29c4ad592cdbf725542ca5823e2b6b0a03276ef4b908a9f19fdf491234680b53e796d678517efa092924668914f97a60ff64654b - -Sum = 8202089b883a5e77457036254c2a73aaf32f03eb1e61fae428926028b499b7d0a4f4e5256094f34bc2478f0595aa01aa79b5d36d7f30136d3af2be93b70552fc6e988e -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 82020961191fdd5d953f07b04b98a2b75def5a10d04b4a1d77d4a73562ae88fd52df3480174ecabde845ca4e992c5b11413d261bd0e6b41005bd13f388051ed5dee38f - -Sum = -13a2e13d675e3fa89489c870cda617ae92ccb7d2f6b6405eafcad9c89a682b63364c333476adf0322febffad973f3dbddb7cbaa41a64b1ea24dcb2bc2196a0af42eac3f -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -13a2e1310e4fe7ba2f8cdb581daf34bdcc20b2709b97ab6b1ad6b557cf86de506b6d8e3ecb4252bb0d8c1bf9070718276f044579354947dff8300d662486a3f1abe613e - -Sum = 2bf9f45c817a8f5c589a208c57c30b52866e75a9b6ee0fb7c3f0c7ec3761f2c114858241a189e331aa9ab440132dc8f5ab7dac0891a69d5573dbe42fda019d30610f07b -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 2bf9f450286c376df39d3373a7cc2861bfc270475bcf7ac42efca37b6c80a5ae49a6dd4bf61e45ba883ad08b82f5a35f3f0536ddac8b334b472f3ed9dcf1a072ca0a57a - -Sum = -40557025ab86f90705fc86e3ab3d8494255bee490822e27c5551037f36f9ca834fd33c11a1a162357cb21eb83254c4da56b9f8f54aca29b95283ac03732a849258e7c41 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -40557032049550f56af973fc5b346784ec07f3ab6341776fea4527f001db17961ab1e1074d0cffac9f12026cc28cea70c3326e202fe593c37f305159703a814fefec742 - -Sum = d2985750cb9579d3f5dc3db7d2229f06e2a0d57d195819b3646f84c08eafc093def93748aaedf1f430eedb90c1694d894339caa4141ef5f07708e1a3607c5793df599b5 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = d298575d24a3d1c25ad92ad0821981f7a94cdadf7476aea6f963a93159910da6a9d7dc3e56598f6b534ebf4551a1731fafb23fcef93a5ffaa3b586f95d8c5451765e4b6 - -Sum = -13a024fb88eba47aea55fb69680479058efda97b81fb1e6e7cfe520e8dd8ad12deffb69662852f9a94f3b029a37befc620d792a8589660e2ebc7d6e1bc8c0c8f35ac1216 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -13a024fac35abefc04062c97dd050ad68292e9255c49351f43af0fc7812a9841b251cc4707ce75c322cdb1ee5a786d6cba100b55aa44aa4248fd0c8c5cbb0cc35c3bc715 - -Sum = 22701a8dfb82a2ddc8a5485b05362205a549bcdd24bbd660f2041a6672732824bbcac4ff58605ccf1d8ee066204a4a639828c41b722fb4a1e6c9bc3f82a89d85fd042f85 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 22701a8d35f1bd5ee25579897a36b3d698defc86ff09ed11b8b4d81f65c513538f1cdaaffda9a2f7ab68e22ad746c80a31613cc8c3ddfe0143fef1ea22d79dba2393e484 - -Sum = -4f73fdc6540686b350c859bdbe8f22340786ddb04b7ddb8858d33ce8931bcf660269129607f77dbc1db38d8186d8bae7ebb4ec8716c6eb26342ec8290d8d8988b1f5fb0d -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -4f73fdc719976c323718288f498e906313f19e06712fc4d792227f2f9fc9e4372f16fce562ae37938fd98bbccfdc3d41527c73d9c518a1c6d6f9927e6d5e89548b66460e - -Sum = dcbcb3df6508052fd0d1cfb0a6088fe978227066c58317cc359f508bce9f45987ce3152022e19ef068b0381ce7d781ae3e7c04243541744c9f374a3f28dbd746acd3b9fa -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = dcbcb3e02a98eaaeb7219e823107fe18848d30bceb35011b6eee92d2db4d5a69a990ff6f7d9858c7dad6365830db0407a5438b76e3932aed4202149488acd712864404fb - -Sum = -163f4ba6595207387ef0956796ac29e3c6862b5344abdce3db4ff7e960b7727fa0a2870dbbe17bd8c446000b3074c1145368d4b84b39029110f915b61916fc29555d7d800 -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -163f4ba64cf8f8e0908b987a7dfc3300d5bf7f4de250be4ee7bb03c4efec91328dd7a868c636103b4d23a0277be488eebcfc5c432053e72706cc6910c319ec2c97c678cff - -Sum = 3588d982604f471ff0ff784942bd43d85cad820864e0b9ee80cc9a9e3807d2739eb58d447830f73fc8cadc88d864f98577e43adf5150b2eb104e75939caa7de02419b6575 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 3588d98253f638c8029a7b5c2a0d4cf56be6d60302859b598d37a679c73cf1268beaae9f82858ba251a87ca523d4c15fe177c26a266b97810621c8ee46ad6de36682b1a74 - -Sum = -4d51ba5f184e5d20b30f8e41d663d14dbe4f692f1a0749789c02290af4c889268c319fad8b9b7c9cc71e8d9878039931447fd6ede967c5c82c1915631f3237aaacf4a1763 -A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -4d51ba5f24a76b78a1748b2eef13c830af1615347c62680d8f971d2f65936a739efc7e528146e83a3e40ed7c2c93d156daec4f63144ce1323645c208752f47a76a8ba6264 - -Sum = 9d7a5610dcfc50699e6bc065584fed73fddbd58dfbefe377eaacc024e33e6b4fd361fac0844489fdf13efd8dca7fae0747603f4b26bb2a9bab9de5241a3af4a935ac940aa -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = 9d7a5610e9555ec18cd0bd5270ffe456eea281935e4b020cde41b44954094c9ce62cd96579eff59b68615d717f0fe62cddccb7c051a04605b5ca91c9703804a5f34398bab - -Sum = -1258b397182002c966f064c2cdadb06910e2042d0f51b4af494338c12b6efff052fe564a00e581c5aac0ea79fd8a1ff68ed92b7f74baabb03a51337d4b9b01a2f64ac803cd -A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 -B = -1258b397175a71e3e80a14f3fc22b0fae1d5996cb92c02c5fa09e97ee46251db81d1a85fb18acb0bd34ec47bc2411c74357263f8220c59f999ae68b2f63b30a32a7157b8cc - -Sum = a1eea50170df6807aef40929a52c097081e1755b575a49548ee5868281973a141920234cd0176d64f84a5874dc417cdc8a5c338cb54bca390538e1014d638b51 -A = a1eea50170df6807aef40929a52c097081e1755b575a49548ee5868281973a141920234cd0176d64f84a5874dc417cdc8a5c338cb54bca390538e1014d638b50 -B = 1 - -Sum = c7c26d68246f16d9d9996fe67616d2fd48809916e8121a5ef95b17bb9b8333d84e2416bf2a5eb3b686c936b9722e0a92a376f357aea7719610e864d9e2a5a677 -A = c7c26d68246f16d9d9996fe67616d2fd48809916e8121a5ef95b17bb9b8333d84e2416bf2a5eb3b686c936b9722e0a92a376f357aea7719610e864d9e2a5a676 -B = 1 - -Sum = 80d5de21acc1eb10fff4e534d23b5cd39e1eebc3d7f03aea438bb6e5237ced9955bf86898e93c74565c9a197e3ed2ff8edd3acc41ecef97c4fcfd52e1cdbb07e -A = 80d5de21acc1eb10fff4e534d23b5cd39e1eebc3d7f03aea438bb6e5237ced9955bf86898e93c74565c9a197e3ed2ff8edd3acc41ecef97c4fcfd52e1cdbb07c -B = 2 - -Sum = e020b9bd8d194468f8b563c8f586f6959533be8507bd4d3d7e494ef3733007c062caaa65da5c51b52f18cec4894966352f948517ee92d5f9b5ed00f020b1d1dd -A = e020b9bd8d194468f8b563c8f586f6959533be8507bd4d3d7e494ef3733007c062caaa65da5c51b52f18cec4894966352f948517ee92d5f9b5ed00f020b1d1d8 -B = 5 - -Sum = dad6af803cf2f40e75cbb564e8229c0d25465930d2ceea73715682c26d582148a943c1c767ac5167c0425975ff75a66eec5ad418ded078569dea2f77359c1cf8 -A = dad6af803cf2f40e75cbb564e8229c0d25465930d2ceea73715682c26d582148a943c1c767ac5167c0425975ff75a66eec5ad418ded078569dea2f77359c1cfc -B = -4 - -Sum = de90e3172430754f80e116cc8c848bee88c8e31810c6ef0ded5b05bbef6d5b81f9bf6593622ebfcb2b41be2e87d62ab7fd566763b74428275a16d1da482e5f76 -A = de90e3172430754f80e116cc8c848bee88c8e31810c6ef0ded5b05bbef6d5b81f9bf6593622ebfcb2b41be2e87d62ab7fd566763b74428275a16d1da482e5f7b -B = -5 - -Sum = c153ce69e35411c7f1e52809773ce03ce8d2af10b5c7aa3f4c9354de5ca044b7ef25089f1e96bd14d6c62c88b3c39951df19c73751ba25dc758534adba7faddc -A = c153ce69e35411c7f1e52809773ce03ce8d2af10b5c7aa3f4c9354de5ca044b7ef25089f1e96bd14d6c62c88b3c39951df19c73751ba25dc758534adba7fade2 -B = -6 - -Sum = f0c843f86e227571d67cfc34ac00d0e6f87f4cbd3273af68562657ae5ca82ddf5fd63476d56d5cccf62dd93f8320c0ba88658493dde282abc22bd09a01f6f2be -A = f0c843f86e227571d67cfc34ac00d0e6f87f4cbd3273af68562657ae5ca82ddf5fd63476d56d5cccf62dd93f8320c0ba88658493dde282abc22bd09a01f6f2c5 -B = -7 - -Sum = c5ba28844b8947aa0c2933f06aa88f0b34e0e10ca9baf1cc3bd5ff2dc0590e3ac5a2f2d3a1408009e1b35e08426bdda001adf93e872b03f4f6df28d34a3355e5 -A = c5ba28844b8947aa0c2933f06aa88f0b34e0e10ca9baf1cc3bd5ff2dc0590e3ac5a2f2d3a1408009e1b35e08426bdda001adf93e872b03f4f6df28d34a3355ed -B = -8 - -Sum = 84da246c2485e335d1f3b7e31c2408365f2afe7bff7b596440281c1618bbc8bf7a3896ece480fac4a29070539a95f1d718c151ffbfafbb82629bef9d2afbaaf7 -A = 84da246c2485e335d1f3b7e31c2408365f2afe7bff7b596440281c1618bbc8bf7a3896ece480fac4a29070539a95f1d718c151ffbfafbb82629bef9d2afba900 -B = 1f7 - -Sum = 9673d93165b5be256689ba4e750243537f85bc28daac7f65338074081f114b3a83871683c89fae3c87d44da053557aa16dd074b1bdc16c02a74c5b495f875449 -A = 9673d93165b5be256689ba4e750243537f85bc28daac7f65338074081f114b3a83871683c89fae3c87d44da053557aa16dd074b1bdc16c02a74c5b495f875453 -B = -a - -Sum = fce022b2dd492a96f8b095712803f318a45a9a8f00a48dec06accaf793e54e59daa14c56c2fce011e30e6394937f7bd6fa6afa1b6dc3b5359ec7bb4f757c5d89 -A = fce022b2dd492a96f8b095712803f318a45a9a8f00a48dec06accaf793e54e59daa14c56c2fce011e30e6394937f7bd6fa6afa1b6dc3b5359ec7bb4f757c5594 -B = 7f5 - -Sum = f04028fafffb1aee499812d12f9fcbb23e6a872b3f69fe7a7a246d8f98ba2aa954f78506b39c023397855ead87854412c881fdd16267c07ee12f085b055c7c71 -A = f04028fafffb1aee499812d12f9fcbb23e6a872b3f69fe7a7a246d8f98ba2aa954f78506b39c023397855ead87854412c881fdd16267c07ee12f085b055c6c7d -B = ff4 - -Sum = 9c008016815a6580728b3f690eddc7695fed44171557df8a4a6e8c0d5e7c3296832b4ba9ee4a4cd7e6a8ef23cf8c64fcd0518664289c4e72105b404cd6c0ab6d -A = 9c008016815a6580728b3f690eddc7695fed44171557df8a4a6e8c0d5e7c3296832b4ba9ee4a4cd7e6a8ef23cf8c64fcd0518664289c4e72105b404cd6c0ab7a -B = -d - -Sum = c12bf7e503d2c5845c60886ad5ef87d24e002498003b44922e462f36592a52c878123a6d1037896ce9fb7d2c680d008e80009da72c8e1415e957b2fefb52c34b -A = c12bf7e503d2c5845c60886ad5ef87d24e002498003b44922e462f36592a52c878123a6d1037896ce9fb7d2c680d008e80009da72c8e1415e957b2fefb52c359 -B = -e - -Sum = febba964e2548ed1474dac7c1eb9b1cd169ac913530b7fb358d67197517266707e5a176a814ec82cf8945214b30c36ca7ac0b1ade1848573e72d408dbede8f53 -A = febba964e2548ed1474dac7c1eb9b1cd169ac913530b7fb358d67197517266707e5a176a814ec82cf8945214b30c36ca7ac0b1ade1848573e72d408dbede8f62 -B = -f - -Sum = 8a3f9eeb76e96f13446c593fe2cabd4215e0debc54025df7791d924d8afc08dc8f607b82a3d07d75897bfeee0c42b9a32e0e77a098c1cce9c001aabe0481996d -A = 8a3f9eeb76e96f13446c593fe2cabd4215e0debc54025df7791d924d8afc08dc8f607b82a3d07d75897bfeee0c42b9a32e0e77a098c1cce9c001aabe0481997d -B = -10 - -Sum = be825a00c3c6b192d04863b0719ee1e687dbbf2cfc0c331c00b8b947c17fecb7700c9e534bbc49bd61978754ffae1e57d80aab34f5fd23a267e10a4b5a13a9d8 -A = be825a00c3c6b192d04863b0719ee1e687dbbf2cfc0c331c00b8b947c17fecb7700c9e534bbc49bd61978754ffae1e57d80aab34f5fd23a267e10a4b5a11a9e9 -B = 1ffef - -Sum = d1c861822ba0e93be81fc78a2628756480146225c79b4a389588a9c3bff9a7500660e99c28807d9ae7bf8c1e89e81d4f9ff2f72d35ea6b34d09df053d46dd294 -A = d1c861822ba0e93be81fc78a2628756480146225c79b4a389588a9c3bff9a7500660e99c28807d9ae7bf8c1e89e81d4f9ff2f72d35ea6b34d09df053d469d2a6 -B = 3ffee - -Sum = 98ac65b4c06400baeb40ed137ecdd930a3607423caecbe1f1a936a8210c28fd84b53324e5bb73b7e4b71209b1a4d106796d57a4a23fad2c23abc0c039539080d -A = 98ac65b4c06400baeb40ed137ecdd930a3607423caecbe1f1a936a8210c28fd84b53324e5bb73b7e4b71209b1a4d106796d57a4a23fad2c23abc0c0395390820 -B = -13 - -Sum = da02949862a4b26a4fb4bff43b21c2cdd048189199612616303d3ab34dc6f201be256f5889e368867a0da200a0b03e904048d6ba5caee1dafa16f4fdb1f00029 -A = da02949862a4b26a4fb4bff43b21c2cdd048189199612616303d3ab34dc6f201be256f5889e368867a0da200a0b03e904048d6ba5caee1dafa16f4fdb1e0003d -B = fffec - -Sum = ea9523fdde49d481c9f449969fd8e191e118058e0593f2a27ef0ade666ff478c50acb274a6c77d9ec4ca628ab0d7f3dc18708327423de28616235187acb197f8 -A = ea9523fdde49d481c9f449969fd8e191e118058e0593f2a27ef0ade666ff478c50acb274a6c77d9ec4ca628ab0d7f3dc18708327423de28616235187acb1980d -B = -15 - -Sum = dab5613ae3756d29f22bc30213363900e3fdced153a3c20852d51c71cbb9af41aba6a16d0b72926192ef48f25e8975881ca7973a69590dc6f0224395e6f3684d -A = dab5613ae3756d29f22bc30213363900e3fdced153a3c20852d51c71cbb9af41aba6a16d0b72926192ef48f25e8975881ca7973a69590dc6f0224395e6f36863 -B = -16 - -Sum = c442f3e574310f78e0ac187af96550d4999b79da9c9d6ffa9eb9437a2ac01479003d8e795ce68dfc0f87a4fd9b00b6c172c72c7f580a32af015a3a3375b85285 -A = c442f3e574310f78e0ac187af96550d4999b79da9c9d6ffa9eb9437a2ac01479003d8e795ce68dfc0f87a4fd9b00b6c172c72c7f580a32af015a3a3375b8529c -B = -17 - -Sum = b9ac1e23fbfe179d9d3ff99b2ad8399754ea5531e6fce5dad997e2c961110d49d0e3d9c2ec03289edeb39e5a6b4744dd4b3cdd6c43f4e8f4c8e91617772e7fd0 -A = b9ac1e23fbfe179d9d3ff99b2ad8399754ea5531e6fce5dad997e2c961110d49d0e3d9c2ec03289edeb39e5a6b4744dd4b3cdd6c43f4e8f4c8e91617762e7fe8 -B = ffffe8 - -Sum = e087174c20cba6c4e1e8ffc2ecfeeee770898916454724c24b56d8619c27db123078d406d6b7b836b0dd3092b34b736c472f1afd983971230f1e2b729b00acd4 -A = e087174c20cba6c4e1e8ffc2ecfeeee770898916454724c24b56d8619c27db123078d406d6b7b836b0dd3092b34b736c472f1afd983971230f1e2b729900aced -B = 1ffffe7 - -Sum = ba66837e8e8bdefa4c3df73ba5ee65d1ab45a68f51072bf2997446b13b6c73b29c26d15ddff186c9621e156bd3b650caa267dffa54abb782734c443bf502b276 -A = ba66837e8e8bdefa4c3df73ba5ee65d1ab45a68f51072bf2997446b13b6c73b29c26d15ddff186c9621e156bd3b650caa267dffa54abb782734c443bf102b290 -B = 3ffffe6 - -Sum = fc461dea452aaf0e2c1df10b7cb4293fbc498d40caa7a917a741c6d3534914fc039bb7a62d14cc3e9ea6cc8d2b41228628ad56687d18858c3867c75ae83a3216 -A = fc461dea452aaf0e2c1df10b7cb4293fbc498d40caa7a917a741c6d3534914fc039bb7a62d14cc3e9ea6cc8d2b41228628ad56687d18858c3867c75ae03a3231 -B = 7ffffe5 - -Sum = d109e7982ffd500ed77702054ccbfa49bb47b5cdb2220988ef58af3cbe0ac90bb3b2ac8a2c558fe744231bf227bf35343e12ecb312242ce50a85fe461e73b601 -A = d109e7982ffd500ed77702054ccbfa49bb47b5cdb2220988ef58af3cbe0ac90bb3b2ac8a2c558fe744231bf227bf35343e12ecb312242ce50a85fe461e73b61d -B = -1c - -Sum = babcba83c01843f6448fc3f91c006a673e514c9626c6399d43c016c31a8fd1a9fc58d1c63ba5b9565dd7320c4a04fe4331fbb79de1e03d68db331bbe2b4b9036 -A = babcba83c01843f6448fc3f91c006a673e514c9626c6399d43c016c31a8fd1a9fc58d1c63ba5b9565dd7320c4a04fe4331fbb79de1e03d68db331bbe0b4b9053 -B = 1fffffe3 - -Sum = c52e7fb27c4f670109b32cb6d3f705e1685e2cb7474a90d3815e486de77dd2584a0b65d22040059ae5279450682a189eb1b0f847e0d3fe022628a73eeb99c54c -A = c52e7fb27c4f670109b32cb6d3f705e1685e2cb7474a90d3815e486de77dd2584a0b65d22040059ae5279450682a189eb1b0f847e0d3fe022628a73eab99c56a -B = 3fffffe2 - -Sum = b5f074f655dbe68df022b0093534b609b23c17eefcfdc9b1b150c8cfdafe1d320fff7452c147c7d9f9cbe16be25970a23e6499bc90e689497c8bf2d38219e4f4 -A = b5f074f655dbe68df022b0093534b609b23c17eefcfdc9b1b150c8cfdafe1d320fff7452c147c7d9f9cbe16be25970a23e6499bc90e689497c8bf2d38219e513 -B = -1f - -Sum = a1a41b6638409305ab9ffa22bb3cb9434f587d4ce6f6da47c0ad6f8f720f397c37cd61254f35fc9f0cda36476ca6d95f233604b9ae5ea2f1a1207caf15682e81 -A = a1a41b6638409305ab9ffa22bb3cb9434f587d4ce6f6da47c0ad6f8f720f397c37cd61254f35fc9f0cda36476ca6d95f233604b9ae5ea2f1a1207cae15682ea1 -B = ffffffe0 - -Sum = f187feee94925d57f65f9b1200193d8e9359340d670bab27c022d6d63a54635e4573593790e6c6b779becb9e5ea81c9b075baa2d3bc95493b0c5a2da1fccebbd -A = f187feee94925d57f65f9b1200193d8e9359340d670bab27c022d6d63a54635e4573593790e6c6b779becb9e5ea81c9b075baa2d3bc95493b0c5a2d81fccebde -B = 1ffffffdf - -Sum = dc9c51e1313cb655969b4a069f2e8edd850d4fbc5bbc36f05df42a526f4e5b3ed18886263d86231193442b3ac3e7a71e5a6377021e71ad07dd9411953dbeedc5 -A = dc9c51e1313cb655969b4a069f2e8edd850d4fbc5bbc36f05df42a526f4e5b3ed18886263d86231193442b3ac3e7a71e5a6377021e71ad07dd9411913dbeede7 -B = 3ffffffde - -Sum = f2b5e665a6a2e7009bff8b2750b5fb11576bfd49dee5dd7f32b02c46430923b0ec95c3fcee0006b0c2591cbf1fb18dde331d8fb119d92f3196a7dfd8178be33e -A = f2b5e665a6a2e7009bff8b2750b5fb11576bfd49dee5dd7f32b02c46430923b0ec95c3fcee0006b0c2591cbf1fb18dde331d8fb119d92f3196a7dfd0178be361 -B = 7ffffffdd - -Sum = fb0f545b752979151bc6004b3db33bad63230c26d060ba00f5b82e7bee7e2c854b09b2a7c6b4186776c6b3cc45afbc50ef35df7abad11fec62523a12be1cb7a1 -A = fb0f545b752979151bc6004b3db33bad63230c26d060ba00f5b82e7bee7e2c854b09b2a7c6b4186776c6b3cc45afbc50ef35df7abad11fec62523a02be1cb7c5 -B = fffffffdc - -Sum = fc197e83249b069fb34552188cd6d06a7e0b42c6a6a9869ede485328a0fabd0c0ec2f79b81747129ccd70ee5c0f9efea62c36d1a4e1fb2b80393fe636469c25a -A = fc197e83249b069fb34552188cd6d06a7e0b42c6a6a9869ede485328a0fabd0c0ec2f79b81747129ccd70ee5c0f9efea62c36d1a4e1fb2b80393fe636469c27f -B = -25 - -Sum = aaf9a8ecbbfee9c3092d9887ec35118a9614a9fa84fc50b79b11d03a4967066c361f67cbf7a8e5beb620c7da55f4bc7dc50ad44b22c9128994781c7816a439af -A = aaf9a8ecbbfee9c3092d9887ec35118a9614a9fa84fc50b79b11d03a4967066c361f67cbf7a8e5beb620c7da55f4bc7dc50ad44b22c9128994781c7816a439d5 -B = -26 - -Sum = e74e32fc45d099ed147bcf7d798bd3aef9b046291038d98431698e90d22cf944a92bdcd8a5cf378e9a3aa0001150cf6e4dc37fa4e54a25e13c75099c64b9350f -A = e74e32fc45d099ed147bcf7d798bd3aef9b046291038d98431698e90d22cf944a92bdcd8a5cf378e9a3aa0001150cf6e4dc37fa4e54a25e13c75099c64b93536 -B = -27 - -Sum = a3486d022ef4d0a0c72170f05300cee78df844db19c63754c2d631d3d9ae20a0205cfe0fe947f8f4d2f9fa34e2081f448a938a446e8764ac2141157cab01dfa0 -A = a3486d022ef4d0a0c72170f05300cee78df844db19c63754c2d631d3d9ae20a0205cfe0fe947f8f4d2f9fa34e2081f448a938a446e8764ac2141147cab01dfc8 -B = ffffffffd8 - -Sum = 8952cb3f70b1344facdd7fe79747773f9c101bc2a083fa8fdef0679c24ba93218d14d4d7e848d293ce431119d1542833e9a0624b812f0b31b2b9f7ed9455e8b9 -A = 8952cb3f70b1344facdd7fe79747773f9c101bc2a083fa8fdef0679c24ba93218d14d4d7e848d293ce431119d1542833e9a0624b812f0b31b2b9f5ed9455e8e2 -B = 1ffffffffd7 - -Sum = de9cb4d4cdd1d58572fa1052edf72bb9241555bdb967bd8cefb26cb12c6622d6147385dc3f72e110b17afbdebc5feb959cb6c320a2ba01f36585b53fb1c5f07f -A = de9cb4d4cdd1d58572fa1052edf72bb9241555bdb967bd8cefb26cb12c6622d6147385dc3f72e110b17afbdebc5feb959cb6c320a2ba01f36585b13fb1c5f0a9 -B = 3ffffffffd6 - -Sum = d37f2e1638c0b3bd624104d244d9770ae05bf37f7a6ec32db552af413c0006fdcfc312cf281190eb6738370f3a8c4655beddb6b39b342f0a67cc9af92a2c7fdc -A = d37f2e1638c0b3bd624104d244d9770ae05bf37f7a6ec32db552af413c0006fdcfc312cf281190eb6738370f3a8c4655beddb6b39b342f0a67cc92f92a2c8007 -B = 7ffffffffd5 - -Sum = 831aca9ef43bea89f048250aab79b06207458647ce347c68f91013695299c80d610c6e49e2dcd46eb02dd56573d31720efc277469e573f6ecfb71b12886653ac -A = 831aca9ef43bea89f048250aab79b06207458647ce347c68f91013695299c80d610c6e49e2dcd46eb02dd56573d31720efc277469e573f6ecfb70b12886653d8 -B = fffffffffd4 - -Sum = da95fd2d2438a79843bdf92c1cadd0e9165d002d22dcacbe4118cc3cf7d5de2fd2106aaefc790aa1559b28b641f83e4e5aa0f8446b57fde5c3663c13efbc04fb -A = da95fd2d2438a79843bdf92c1cadd0e9165d002d22dcacbe4118cc3cf7d5de2fd2106aaefc790aa1559b28b641f83e4e5aa0f8446b57fde5c3661c13efbc0528 -B = 1fffffffffd3 - -Sum = bf9e3169dd4b6d336848e744231d1ca85678aa3d1d62d42eac0b16500ef527e028757da54a456b3d684199f3bb3c866a002ee3885c86d2a79180487f4e8a45f1 -A = bf9e3169dd4b6d336848e744231d1ca85678aa3d1d62d42eac0b16500ef527e028757da54a456b3d684199f3bb3c866a002ee3885c86d2a79180087f4e8a461f -B = 3fffffffffd2 - -Sum = b5880868d947554eeb536246c312c9765ca8c96888817f3ffdc16cdbafb41fe8f7c151cb316da27562d3b82b2d45abf7c9304f488538386e84c6a23e3dc375fa -A = b5880868d947554eeb536246c312c9765ca8c96888817f3ffdc16cdbafb41fe8f7c151cb316da27562d3b82b2d45abf7c9304f488538386e84c6223e3dc37629 -B = 7fffffffffd1 - -Sum = 84b1e4079d09df569a1623b990d917871b1197723b30b19fcf3c063b0e84c9cef1c3ffed16f33aa9bede08b4831bb3ecdadae1622c93e1f86b474a4989496fa4 -A = 84b1e4079d09df569a1623b990d917871b1197723b30b19fcf3c063b0e84c9cef1c3ffed16f33aa9bede08b4831bb3ecdadae1622c93e1f86b464a4989496fd4 -B = ffffffffffd0 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30c6365e1eeb044 -B = 1ffffffffffcf - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 80695b879bb74400c107619981f3bcb3c9987c76d545f6485ed128082377799534508a83112fbde2ee5558c246332c656455 -B = f6446ca2883d7e27209eeaa01fdec632d4027113b81bb47dacc8f10eadc3b3ffc26d84135d91e70deb8aec84c7820332e8cf786e2af9b4217a4c1d32b5894bbe - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1b510bc480138145e2a142fce8330ee5f4030dccaf6017a1dd85bc5bbe9b2fee4f9d8fb484661a839dc9613652bcca11a00eb -B = f6446ca2883d7e27209eeaa01fe0fbacebd20e03107a9f993e30f63358d6bdc91baf4f5acdf81e3ad94ef9af3ffc315c6e9acfff91167f0ce6738f328308b0fe - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 219f59352ebda4cfb785a18834ec1c99145a6647265baf5d8f3b405f29a746785a5e70777d528ff1526688c01b9eee288e6cd -B = -f6446ca2883d7e27209eeaa01fe16091c2dcf8a54917eddf26e5c1c43408c33ea356bf1449b339931985aa70a89cdd6a7aca5ec6e7f1c8df5f101d54c47796e0 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -7e5a2ec59519143f7bda2829cfee4ae75cc8038f31303ff9bbb1e2cbfe93c46a1367c9d6a2a3d9cb40f1a6930c18c78f85724 -B = -f6446ca2883d7e27209eeaa01fd760f94330bb39b824b7e28bc5741dbc01b11805f14655543e8ac0e6d326bffa760106d5e85f604c28935c69dda1d968f658ef - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 9f580ff614b449cf9c46c91256c20983f5c70200739de72b917344db81c1aa1bf3927c38c22d026d6ce38ac746ada2948e538 -B = f6446ca2883d7e27209eeaa01fd5511b3028c1865f22b1187d3d06e1d23821281edd1f7ae1212eaac5daf3e19f57fe5bafc666cdc205d43e2699f88bb8a5cadb - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -15773d29ba363a15a0cb31ac4a60c0c228967e857d7d11c1ebb0a8db855c0d0797c0e409899a50e1b1c989a7dcea6f26238d27 -B = f6446ca2883d7e27209eeaa01ff4bdd95944430511bd40b6baacd3c32ca01416c461d66b15c5f687ef186c0948aef8677cdc23eeca8e6c007aeb4dd508123d3a - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 2f90f72f59dd7738f5572e31d41b91599ed500d59537bf5c21a1bedad709303cba0d5bf1b5e4eaac1a85c261ce94c45b64646e -B = -f6446ca2883d7e27209eeaa0200ed7935ee3ea423511ccb340368e93c416529914799118affbe79dee6a192c7dd144df65086e8894f7283934dcf82a3d531481 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -73978eee2b2a4ac8ef12b3042dd5e1ae8724a0a676d0a52035e801d741a61b92c638a3b0cece6a81bfd2703e3c502ad1fa784c -B = -f6446ca2883d7e27209eeaa01f6baf0d415ee280332d62d20a349d20bbf058f7986d88b433a45ddd3c5169e0ae50fedfc283bb33671cd00694d2133b0ff437c7 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = a462699ec5214f0d7860974a669d1728b4983a1c3c440213d12b2da58bba9dd1caf1d5ed391a3ebd80aa6e9ef0396e62260a1f -B = f6446ca2883d7e27209eeaa01f3ae43290c4eb7beea414edc3fbd5eb41c2e55e22a8155740091ab16e07555e6f4c45ad86196f5f2b5bf808341e29f77fc8a5f4 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -130f7a12825a6c5b6b109b91e2506505a261c9f7c1a62fdfbe252275d3f6844dda2aca2d0ff6d8406ac5c679c80ab6d29817b4d -B = f6446ca2883d7e27209eeaa021103e3d57afb390b2cd7f3e2c877952c49d9a37bafebc574fbc980670d278411eb9e4264451f721ef88fede6f8f0ed30b702b60 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 2863fa82289aff06fb16bd1b866da9ac0ae0f411a8d8c2c084cf78b81d6713a9a4700248ef61d5e52ca7470f1f251380368df10 -B = -f6446ca2883d7e27209eeaa0226586445213bcbb6bcde156c6c94d9d2b258cd95971e5855c273d6a95698136db5e37a80248a6fc3ba716e7c500b49de5578f23 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -6176f648b54dc4e2d11ba7e32d2d9d3f400fbafa489fbe7f126daf1f929ef8f219c78ff1063dd27650d4751c63b6e7ad7d9a588 -B = -f6446ca2883d7e27209eeaa019c7d737a435307ccf0abb06db8f992e767681e89a5a5d7162b36aed1a69206d1f7abe8462eeac7683cf5b250cd2f4eb0a150a8b - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = ccff1ed8726e309c4e0f2e166c497cd718a8eac347674ca57b6f317ea491b743a89d25f87c37f379f6239b13d848eee1ffa9328 -B = f6446ca2883d7e27209eeaa0130f54aea86329c1373b82a3a79ddb34f8eceeec0a6de48efc2352c72949f488068d6523eb8f0a66497a68c59589d477c1f41ceb - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -13d1c041415fbc18179c970fe989ad9e1f10e4ff658c1bc550e93f6ab9f9cc9832fd49cf6f2e75af72a71dbd7b121111ee0d4098 -B = f6446ca2883d7e27209eeaa033b106dd70e9c8e313b90c94f7ec20a089886297a470751ea4c38549cd8cdc9474148152e280ff4d5b83c0344e207477cffbf0ab - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 27ede3a23479dcc5447bc3b64df32c121761de88086204484cea0782b8d63d72b57192f2b20dd3dff395e937c91e21cdbd13b68b -B = -f6446ca2883d7e27209eeaa047cd2a3e6403e9904098393b5c559f1481d95c2047465da1a0c44d61cc694d6ef688ca7625605d7ddc728bae9c2c85339f02669e - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -4ad10e7f5637cc48b04d4b250e4ca00a0d102c91caaaf6291f1248b7a1cec979f87b7251c50db8e5e49206bebb30b7f3f25c8577 -B = -f6446ca2883d7e27209eea9fd50e381cd95240824bcf2a600015d2f85d6751067439633034c7fd2771c44682489bc531ae44d0b8044a9bb817ddab71ef922a9c - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = c6b77c2c932d9d5ec6175def706d6e9c411216fe12ac52043c617761d3a37804487f158de60a9c18e7a19646c455804a65bd80f2 -B = f6446ca2883d7e27209eea9f5927ca6f9c5c6f6c360517959df504662965669a2c3807551778ce7d3fef97f7f89821f58d47ed85013b0c300eb8e31b7c312f21 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -187976849837d4ad4cfc9764fd0e3f865fa9d1d9f20d98ccd52a6b3652277100bcfff85fb8414c2967dacd26f269502d3c2caff12 -B = f6446ca2883d7e27209eeaa1a776aee5b307579fcbe5ebd4df466b6865149b375fbde626a680f944360a20081116bd7ef7674c34668974e5f9a36639a4b9af25 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 33913efb99088ab80c706ee229e7a6ea6b274097f6ed3734452dabe0865eb86fcf20c9c6ae0e613b72dbfb8b126383e7d10e8bbb4 -B = -f6446ca2883d7e27209eeaa358f33655c012b84bc32363a7acdce1a91ceb8717adb7cc9da6b503e7797e96f93323d3ee54389d55169c5b27f946a1e2f2d76bc7 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -5d84033a924ff84666d3ee1a1342ac118224264c439bc658213b9762586e8dbdef141024d757175f30bec23a960ab145832dee9af -B = -f6446ca2883d7e27209eea9a479f12f30a8a88648edd93e3da37b1ea483518d40527f3d74020cfb98caa341d4fd63535fde113aadcf07ecd72634f0daf0fc664 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = a2aeba6a0d6142f527358ffd4c9139c390c9dfab07947c902085d1f3c367035db0f22f249295b974b1d9ebe7add3dfac7ec237f72 -B = f6446ca2883d7e27209eea95f4f39ffb5975dd7888c375b0454ed6c95dd982e7c59c90574b7d26a2dd22da2131f4453a49f6f252cb3de3fbf5d0689df5cb30a1 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1e545f433c1bda45a7900793d2cd18ba630fcb11d4a2c88bc7a0fb392d270088a1ad126743b80342bcfcfa9e939c9ccdccb7f4f198 -B = f6446ca2883d7e27209eeabe743e89d84b6452728c240957db7b2d657a428f6ce1ace520f4d57f0c3a93989dee299ec72b55cc5ae5d7410a6fab313299e3a1ab - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 244bf1eb701c53bc7847a644269277f53b58dc23b55a2f996faaceff22666eece40fe14644aaa2ab0197a5a915fefa394a5c357db4 -B = -f6446ca2883d7e27209eeac46bd1320c4bddc94343c2b9aba0da683dc353a14d9913f2c8fea945017a01fce050f87dc81df5349f80824b8cd2089cb03e242dc7 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -7e3419b44f3596c6486e095c3fc9a84b5599868abd292354278a2520f54929d5bc325dc3d095e84431960265dcae84f0815ef5beb9 -B = -f6446ca2883d7e27209eea21ebc5924cf9f346828e13194544ba27acd0f0f2db15c10531c9b524e9ca693a400eb973b2dd6a456c52da3c9a248972e482f8f15a - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 81fae0f8555d46ede9e74a93b8a7c6273c9bee0eef0f51b4575aad5cbdc0e10a3d03d53cf2a42e6a3625074c812cd0ae41d94d34ee -B = f6446ca2883d7e27209eea1e24fe4e46d2431ee114d1e1cc669c4bc5ce896ea92f92a501f92ce92152b205bf3d41fa90cf241f67c3d555f5a63db52408a17b25 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1558c919b3dcd4cc2eacfee2ae98a3b4286bdb6aa67db97ce35df3ac72f6c6418df10444ce791109a9a71250896f20d4dbf19d559f0 -B = f6446ca2883d7e27209eebf5ac70e1d9fcd6cfb5cc0aa06e989db589282e28001a7c278f33150d0e7ff728db515b846b046324385a01ab0dc51bb124fbc40a03 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 3a9c8b150408b2449466b8328ccb0a5334f2340479203cb790780e71b6609f7999c691ba19f947d8cac4329a4e45377fd6bf226fed2 -B = -f6446ca2883d7e27209eee49e89096dcbaae5611679f9e51bf07a6518db7c52a42afd260d4c161451d8aa998aa32d92307d0164a2c06475b268660d1d415aee5 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -450c41a9cca23287b6448a0b248d24075ed20bec41c600279fd86869b1a51e1842cb7f4d59144436edc1c052f44428965b3b2d98757 -B = -f6446ca2883d7e27209ee64f5bc4a9d20c619166b37bc33c3c21fd1549b8b97bdee1df5bcd53aac4c1b18bcf892261f22f0f1ac1ccd773329084fdb22f1528bc - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 9d48745690ee5aa8fc448371f9236153c584466583aa30d999461a3defac314356230a763c204c2595794db93fcd3917f25b83d1b85 -B = f6446ca2883d7e27209ee0cb9899dd8d49df7d06b3e555f2d84d36aa2611255d9bd6bfc4f23666e4507eda9a106fd3c16e90304654010e79ff7ce44029b1948e - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1a3f8af71d423da8c007022421f09a53034c6e9d7d23572b8b4b273b091a6f024ea4216ebbca25daa4e9e83fb46a1d9e65fea344bcd4 -B = f6446ca2883d7e27209f04dfaad663de6d32ccd1fe409775a8b5764ed914fabb960fe4a47b154ef982955ea06285f34d992d2e87d11c56e0f0acc96485336ce7 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 3cd13ae384718065169d7e6b600ea1d1a514832649029f92f1d2b5bebbf83454fcde0133f3bb4716cf452a3f930d28f30e7f22f21982 -B = -f6446ca2883d7e27209f27715ac2cb0dafef23687a87d593b0341816ed9dc69ade774b2c099901d747e80cda424b2b3eba6958e3131c3583fc0171e504e0c995 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -5849ade77039ed0b15524c08929a4553a6c0825178f6522915592ffa9638a8143fe8426df9757e8c06aabc97a2ef87b4a58869d1df4d -B = -f6446ca2883d7e27209e925671f7d662427ef778b013e2eac90ecc41e82604a1ecbb440023dfafa66b7ed013fea93e0df4c682f32c44ff874b59bddd781cd0c6 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 9c4b4b4800fe2f11e1897ee8c8e147b143a252847548145e77d9a9d3e4e3a79283f833e760bdc69d5f75fc1d0356615b0c10b1e34f9f -B = f6446ca2883d7e27209e4e54d497459e00782b417d33aca3c6b12f6017f308502a85e17faa0660fb6c008c040d2fd6c5acb52a27ecbf9f2071b35755300b6074 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1bbe5a805b857ccd9dae7cba6f3dab95d22f7d2e1621a2ab382898bfb2b4efccb263929f752397da4ad030e6d5c8773dde8fe04c42f97 -B = f6446ca2883d7e2720a0a685c7e4fef3fc63e7b2c7c3695fc7bf95fa3d58dfb26997dbe2dfd5712e105e36356b0e89bcf0f736a0f749fefe46ec4c63e6b2dfaa - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 255c9a10ee08acfe197fecdc7b6cbae27f8dd38887f135cc5adb1b9276c94ccce420887a7476b2d17c2708c84b7e9a8b4160f676f8d1e -B = -f6446ca2883d7e2720a14069c0ee2726ff6ba4c9c9e42c50bc8a6bdfa2fffcab9baa070b0d01b273e0615204c8be7eeea06a4c0e75615a607bc27975495e3d31 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -4bb5296b4ce3e960ecadc3f15de0a3a0dacf12d34f690cafaa8f2e31b0e9e69d42a3b16bce84361c81b7584be32210daaddefd7184659 -B = -f6446ca2883d7e27209a2f4d892a785d997b41eebd06977ad454c6113d42870773e9b06670bf3740a9bee5c12a5a4f40118a6e28641e7055c56385760ad669ba - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = efb45966d1f6d79c9b4c72c3a584e26e7b7136295fb79a911433a10ef649b47b14b8d76cc42e54852176ef7da7d08b86186cbe6e98b23 -B = f6446ca2883d7e27208fef5a8972272eb5c05803cfe21d36e77abbef07e1821e95d3161f42eae143cbe1c46eca4af49e2b00722ef102256e1aacdc99fb0524f0 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1e30bf701cd589fa3d2adff0217e8f748d1a254b771d77d342fffe3e3138aa3d4a75ca8c1e6636919636d4d96d8b04d583af4dc208b51b -B = f6446ca2883d7e2720bd1b5f8ffc1c2629c737aaec3df41482ef8d27b5ee9b1012275957920b7e8950dd85c6cd359dba04e8c072c24a2d7ba89212b3a3f7652e - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 320eee30dae44f272fc9606477927bac85b677c3333fa55f4c5b5c7e71bc02266a906d8838a096551a8b5b94980cd819ac721a6ca70a71 -B = -f6446ca2883d7e2720d0f98e50ba2aeb56b9d62b60940800bae8297a2daabd3d9e30b4b5d24c01e139fda069c94fd819c86d14f97d74af4eecbad5804e95ba84 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -5819f4921a515433459006c62df3be1c4e642a52340381b5954df3f9dd0ed5f73f8dc9a17e536b88090ae8d5fbc411f16eeca2449ffb96 -B = -f6446ca2883d7e272046d0ab8dc4f547fc447cc435ee81c6f2140ed818437a16894f0b6559fd37091c5382329f98e417eb497eb512e0de64e19f76c39d4eb47d - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = f238bbcd9701966bc4482fb8df8ca395ad15e2b83c014e59898e33a36623580e9c91faa3873eb26a0e97c4d29ff209e22c4faa0a1295a0 -B = f6446ca2883d7e271facb1e452484505c3c5c49b433ce8e178b55d1fb23b7c49e55acb25b074228704f67e019d8ff8d10943f1d9163cb06cf0e213bbd7dc1a73 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1e00b3b3bab1081231e0f1a2029b146f8391869dad416f6c8443c124ea7c908ee402f6b6fe06d883c2d232713512ed5d8636a07898523f3 -B = f6446ca2883d7e27227ef5db5b8a571d52a81be51c4626cc069b8b6c454b948f0728956ba2820ee801d33f67b0f7a50baf7facc4fc2dd14cab71cd6d6b73d406 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 2030dfab0a9e0af1764f416171c8eee2d0b87bd5b80e6cddee4ee2a7509a301956050b6e3bb067f827d13c33abf31693d4101951d4a0b96 -B = -f6446ca2883d7e2722a1f89ad089274b46ef00e1133904733b6dfabfc5f864661dc94783c8e3e8e0a8f360b324d23e02f5cf9d61239bd3e0104f64faff38bba9 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -7427bfdba61a57b644fdd11b2a3ea1d3507cdf4ea1389436bade3fbaf751724000774127923658c7b090f182d1d7e320aeaeb1e3dc0b30a -B = -f6446ca2883d7e27195c6ea2657da120cb3a2fb949788b67d95aa50d8063f454d336755da4652ebb138b9be9c7f3d1f6f8497a85bbbf2444c8237847a42dfd09 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = d23891ab621e6ee43b3b250d66ab139cc97db21429da33e01910635969af402b6792f6d741292a0e1bb6bc30b2a7b32fcce9f5e8c2e48bd -B = f6446ca2883d7e27137b618569bd5fadebd65a7a25b1c44b41ca97e127d9da5a3d535323bd3f51dc5d19e08ecd04a4e291971ddaddb22743d63fc40755c06756 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1d6d78b7e83cedb64f0afa17c56360a58eb5ccc4e647bd3c594feb6695531f9434adb169ce314d4c93b4efc260fc92b268ca22143fb7e994 -B = f6446ca2883d7e273e0c6358081c34527e9506e2c17fd62a9d183fc750bf3ad4983444bfe92d65734840c1660f4884d00707796049d935293bd8857a21a699a7 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 255261901144afcf37c28015f4ec493bfc06cbabf851997d06cdc2fa742a97e234085ce67dcd867451a19d3427acc5ac2fb5b919f1514e06 -B = -f6446ca2883d7e2745f14c303123f66b674c8ce0f108bec10a693eae62c9171545b21c53c804ddc1479b6ce2bee4bdf7c4f426d21089682302c41c7fd33ffe19 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -4c222346b39b4b87631fb26dd9b3a8942374f10ec577d0aced5cada7bb0fb34d9c85bd06b6d52a4229ec662ca5605aff7896f7d74483fe99 -B = -f6446ca2883d7e26d47cc7596c43fb14cc6a5a5d2268ccf0eaed81f3a4ffaceb5187abb198ca9291770d52f58a420d4149662371437c47775a776b8e9d6ab17a - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = b832106ab8bf5c27886927f67c5bb95d81280a5b4a3a044c39c816dfa5c5a4c6e8058d34c3e44bab649194932e42c197b40d16213f6565e4 -B = f6446ca2883d7e26686cda35671fea74a720e4d47fc0bc278d3a68a7203d794c051c4279ae14a1182b8d82c77d32ebd80ec0f50aba99e0df1f014d44a2894a2f - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1e4bd432a98b6d68d35627f4a46b56f04b378a535b50c7287ec949008e8ace3ed04a128043cbac7a49c6c1cb98dc27b684c4f971d69b51268 -B = f6446ca2883d7e29055c2dcab8961d2964ec8c1542d1e489c1db18381f83f0202b78e9623c8729cc183438007dd1ff280fbea657769f1ddf1f5dfa834ba3c27b - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 2af2a9aa0364d970115f35b6ab676f4baf1f4ed52d07cd808dcc7fc7bcdf2268f917a7e4476e429200a37b246e786e85a2b62d6b52de13135 -B = -f6446ca2883d7e29cfc98540562cdd9d457d6835b2936a40005760553af455a11bac55d521cc6c6ea50d8e40b7fb60a37d8a3be4d0638ad0fe713a1b0fcfe148 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -5dcc7b06c24160a67934f3adf5f5a468f10b0bfe1b82e133c797674c941c9480bb1e71ceddd1151f88244bebc63c2da41557670132848e482 -B = -f6446ca2883d7e2143d73a33fbc93c349c3ad1eb9cc22ef5fdb1b320b2496a5bc56de4901210fdd361abf30e6405e58af10dcae18519c8357d97f352b9a5cb91 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = fe6a6b7e6ee19b5e4e2a4cef85f637a5b0a76007bf1080fcdc86c952a49adce824573dbb3c0d3f94d519698968594e0b840b6c91ec9153aa8 -B = f6446ca2883d7e1739f832b931c590b74ce53dd29cb8fb2a03ec7286796f6dca7677c42f0a2c775cce1f344880433e3621bbf1076347c1be92579a4718d9756b - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1f219dbf1e789d4d74f10ff27fb947bf6cc94bf1e742ba203caf33810589005f8326704b8414819d90698fe08d9b3c16bd261beb922a9af9a5 -B = f6446ca2883d7e46423ca9be987c94112099ff4ab56434f1d7ae64e9ad319dd4ee17da5edcdaa5623a035b805598d513dce26a2b8418b933f92a4ef80c89a9b8 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 25bbd6ed7646662f6dd8481ac4c4a531174bcd05123889d4cf904d12d8d2bcad5425074d9c7fa1ba70ac5c8a3723fe6b20e064fb4a9999e716 -B = -f6446ca2883d7e4cdc75d8166645760a07d2278fc0c1a69c5a2f7814a3015267cf316c322696f333389a5d98c0b8f1f41faf13d50cdb0d97b3735eb07b889729 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -74af822547dd8aa99da2b3b60b1aa5d45c33cbbdca0d2876531b31a25cec244482832671c861b749effc1cf5e150aeb9d8e88583953aacd577 -B = -f6446ca2883d7db2711cc55842549cfe8cd656bfe176a128da96b5385d4f074523b2b6fc67b6015c906c9e33df5fed93773593bc982de89dea88dfd0a741da9c - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = d35d55e21fdf90fb0abaea71ae6d7f44401f615e7dc6761713ec45650b94c02f85e7bca8c2f43ada8975617eb7ae6fa41f4eadedaeb544654f -B = f6446ca2883d7d53c3490880404e4b91749f9b1c8e9d3144ef011484a4016684529ef44dbf1a16592bd667394cdc5cf9fdf10ae63a6cfe57846075b72caa4ac4 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -14872666f07cb43b47b4b82ef6df5b7696c2ff49a88ec9308e27d27736df05f79d452957297271756ca1afbc47ad011f1b77f32bbff831bb941 -B = f6446ca2883d7f6f930559a7eb22fb177b0cfc38f1d3def13e570d8b570a867abc0bccc74439bfb366288293682e8e4d8e4e4e18b8ee942e52411f65650a6954 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 2d2316a87167a23eff9da00b857c9423e44feb69620852e9e8d87ac70d96367a8947729b57804ab1d54022442f5504d23ea42a6cb0eddad04c3 -B = -f6446ca2883d80f9520971b69a033696098ac522c55eb3ca0d190922efa61c25c690ca32b741ee738abcc57445c254d77576cc933929c66115b52e74bf9bb4d6 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -4a296521345e531b059bd7bedbdee650280008947bb0de4012c11281d92be141b2d29b92812a4843eafc296fa69c55a697b4e9620a79fa8fd6d -B = -f6446ca2883d79848a4cd75a3aad9642720e1f0d0db773050dd92b475c937c6c2dbc3bc695c62ab1e9d9e7e99c92f8d3b0bb8f34238238fb847842be4245b2a6 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = a29d4661e53bde02d72f6e0e3d19ccbd85d8c0a0392d7153ed330ff11e6f75c9880dd1f77a89be8c4e48b10bc7b43b46fbffb592a9a2f23b932 -B = f6446ca2883d73fd4c38cc4c61ff192938a928f95f509d2782586f6f93623ec50de547725c7dad5e36739853a52e729ee841cd22a52832b6d7b538cbb2caf6e1 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1c7a1c6185b0a2d7c02f3a7884e5a11513785520f1a27e8c29cc30707300edbaaef99509e9c4f578d086b2a8c593d0a04d32682c7c71f6a3d025 -B = f6446ca2883d9aa13d007050c2b706cb6a0291b09d3188fd638364a4e903a7646f54cc5a4194f4d8a89cf9c13690080a25fb4f31b97cefa93b3adfd7d8928038 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 21eaee9881dff114d10dad6acbb6e712c6d1acc6b878ec60253c44ad7e9272bb5ab0e2ceb2023fa9f427a23ebb464b2c8c411bd86032c6873ef9 -B = -f6446ca2883da0120f376c8010f417a9dcf4d881e32f3c56bb292b7b56d7a2d48391d7ebc695a08ff661c1fe80c12bab159144e434092eb7eee6c398a875ef0c - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -46f16fa8b7a3b6ecf476f8cdf5f77ea3a7c9be958ced5db6c6a9e11e6bcf3a156b3fb60bd5ff862c80d7c3e3f23c15df57a8fd7822d4c7d9738a -B = -f6446ca2883d3735b0f632fc68f2522536bc16d37d78cdbb4fcce6150cc0b6ee5dc5ed8a19c4da9f5d8739fcbaeab6abaf6e9761d2fd4acdd59640911a153c89 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = bdd97dea2fd68c602862b0fdcbbe47d5e2e23ec1a10925cf34e9773d09d90caf70b5beed3ae1509392289be0ee66b649d45b3dc880ce4f48bb4c -B = f6446ca2883cc04da2b4bac9937f1e397e8c410cb44692a2cfa0d1f944a848aec7a74f80472ad52954a5d51af083a55ad7719b373292ce1b9545e29792a5f4c7 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -145dd43715b37e7df4b56e5afa79caff8668de6fe4c2f725866d0f84522682f38694a26bea588a576900862dee9c9498df909fe788d72db324f6f -B = f6446ca2883ec404641045d807be91f31539b467ac14dc12f560bf31dccfe46937297bc18312af293a51b584e68dc78bd6317367326a9b80d186f0d8bd20ff82 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 35094bde0256df169828d23a250e3a10f35f1fe30f168d463ccd8389197b8aaeb326ca86fd09b3d8a29769ac3c6ed856c34f10cb0d993e38252d5 -B = -f6446ca28840cebbde7f100e1148c929532c5dae9d2bab770c93646b3edb4a707775f111fec5784bbc02e0977ea160fa0e16508b6e48d767dfbf3cf9c57102e8 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -578294d2b3d43ffd19b79a65778710da245eb96fda50d50a3aa6ae3295dc50d8f7da1f5c8b98f4a9905ee840dcd139a62697eb45678259d7639ff -B = -f6446ca2883805fdd373ad5c200dab2289329459ee7a2f997764cdf519d3d32d5bbafb94464ac83d1dca566cf67e3194ef44bc8a4e7a38f81eb7eb4044787614 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = ab192cde88b1cb3e6b094409c1e81ff84715d64ddb7413f6fc5dc1182abfcaca481c8035d16e0d698476d7094f2bf7cb3de1b1210ba68701168a3 -B = f6446ca28832cc9452b65f836bf89607eeedee48fc980427a984bbc12b07b7bc2d61ad5ca735c4171035f91b6a7ef01602bd96de6c28c45bc0fda8fd71dd4770 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -19a7abdefad11d1c9b6c4e0c4c1ff1194c490f63086ede1e4c43d964555a2f5e561a9bf5dc3a670b7ddfe8894271197747860c78949e6c9e357460 -B = f6446ca2885725d2ff99bbbd3c7ab2ea3bd62cbc1568be94716ae1e088c3c171a339b388b230607b096f4a634c95176bfc94fab7602428834ba301d280242473 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 275ce169251250a596ac64ac6e23ae05f8785db63b9cb83a9dec067472d059ea3aef07cf9fc20b846b3292899a8d3fe1aed5b92f21a89c1d924bbd -B = -f6446ca28864db0889c3fcf0c575f300dbf830790214ede2c49e0fbaa515699eb35729b33e1534e6e332d207c5826a15fced16ddca8b783002300c01ff80fbd0 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -61039a571c78308b819da54c1849d8d6169a82e25f61f26e30ab16b545080417f2008ef89116e002660f95863c47ac02bc161bbb7aa8817457eade -B = -f6446ca287dc7a8cc982726f945da8f6e371c2f22605db022c03110ffc46d281899f51553be845501b01f91c3eb127eded1641f1e6208c5b1793bae46d96c535 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = fca0b32bf9e248320b8c10128ff4368a766dd34fbfbf77e66cb2298fa3833bbf24451f508a50afd0131ad49c9ac8e851d4fb53f2fe33675f5e6b34 -B = f6446ca28740dd73f4a50857edd3ba8c1cfa189471a607b1bea2b38a840acb6eaf40d61d94b600bfc308bf4c71041caed6b7c0b59707a722e0102ffe829044df - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1c6f81990e54d6894188d5b872009c3eb5b2f10137bf7a27999d918790b587594afab3950330296979c354851164f95938d1df77995f6c0a9a3edef -B = f6446ca28a047640b1843808b3f7d3f7b6aa168ee777a49521de6aa4e41156b0b7efb1cee889f11863c61292d8b36ccbc468d9337c69c06e4ca45a268b929e02 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 310b6086b85bf12c7e391184e070f623c9cfe07a8e495010fc13d584d748098f070ac4b7c31cbd28acd32ab6270e2a98f48d8d31525ada808858785 -B = -f6446ca28b4e342f8c24a9b2e7c2d7b47d911c2d38b9738cb74708037a38baf08c58d9f2444af22a8fc4dbcecbe46a2ed5c36c4778257b49e834110dea743798 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -4a51109cf8c033e683b1bff229f081d71cd5cafde15dc2d5f8ad0457e79b9b2e015659ee564de59f27204c685ef58977e13e19fe36a2d017fe6860b -B = -f6446ca283986d1d5112e761b7a42a9d0ceb04ad8a4f18d5304c96d50aecad52c06a9fa673c4e0402e2e31a24ea532bced6331066ac8c0d6efa4366462082a08 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = f3e425af6aa16899624f20b49c4e9115034aa4d06ce9db9aa742a6e60d59d6ce0a067f5645b8e7f896c8561315ef1f7151e073d115f8e38df274438 -B = f6446ca278ff3bcc29f4d41689ba5490e5c523b9abe7cb380793d548c0035329de0ebbec7339dde9af37817cb7aab22241f397a6d3be9b39c1aed52d02c76bdb - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -18b2de417fc4bef91b5dd82b0e93315b306bf3a7f7bf0a486a567e9cd1370587b7e47adcb9accba03a8dfda5871b0bb1bdb569a90c079f7a9a4e87d2 -B = f6446ca2a0f05c68a063a9993b3d1ec73e1d3e262c88692d06217d4ad4cdfc35101b5ee10bbec0bbcd3fdb9c7ba53528fa6d954fa6920c1fdf1602e07c3d37e5 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 26b556807e84a9bf7cdf2697050cbd7145a42b8ef6fe10666da7a2e69827ad04880bb97ab3108a27da5fcc29a041bd6aebbaf00ab25a841674ff9f1e -B = -f6446ca2aef2d4a79f23945f9cbe6d333496ca3c41c0a11405608368d81f207ed70c065ddbe5ff59c6a39a241b7703ad13944708d49792818568e77c56ee4f31 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -40b258c2211cc2cb9e2614ab4b23cb9eadb1ddcae903c93646e9f5e5afcaf912a2fdef26c864d83dcdd6f434ca2b0aa7f8ea7a21e790a9e4601de110 -B = -f6446ca2478b2564ff8227d481b931f0e466412c4e6a97ba255ea9cc238d87b28f196046b0dc56b84b2e37be7340434ea9277ef5eff22854eb7db98181d0cf03 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 97631efbd149bb0fdecce09d14aedf2efe30407c01c68e000be9c7be954999375e1f7720e8e5f1edfc48b92f9a063f6b2b378996459bffeae3d362e3 -B = f6446ca1f0da5f2b4f552f90411265ff1adb2d9bfdec35090c9be5025e8db5d9a99ac021f5bacebe2aad1e0e44ce7e53d94c4a32bda518e08d72637afe1b4d30 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -15f4c3634bbbd1ce04fdf96a69b2b8263290e188ca83956b74c6d190e7b877dbd176657a19ea125dfe9c95d2764002ca5d98e28315cb391779d56fcb2 -B = f6446ca3e789b45bdc5c07806fbedd42cab58f2e252a8e11b69bc9b9b6e496a6ba6bd7166b409d80b23435dc2ae094aad752b643c26acaa82fc1f4dd7f45acc5 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 39ecc3b285eb99a2ac91329da615e581f791eaebd477d87c7739dd961a2c5c6cf86a34c73856efcf3b812909d830186c910f8f053192cac9fca8ab7a3 -B = -f6446ca62709b94f7f5884cae8f2707690e864ea753b244255dffac9de1556f9e1aa2028da7d925299020ceff929c820f6541066f9d592c9ec3b1005ac7967b6 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -707e64f8bee7a679d9b72bd04b231cda716f5dc1b7a404f8c0679770c46fc944470ee2a221d1e3d166619ba6a430d0349e7e75c0ee021ed027dab5d74 -B = -f6446c9b80572e9b32248302846c89977d583f23e52699699422237663fe068bf7e7c514e2ec1bbcf674d2e5dafd7d193045865400f54667f2ec76636443529f - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 9ca2c37f4b1a392c34551f570ff06a74c5f027170815454c5ed3535d5232df54fb1f65f2304e32b4995bb77ccd4ece69db98452f182dbeda98d525a19 -B = f6446c98be1146326efb57dcda8d512b3083657e9d1a04148d0e1e3c7d4247c31bb66409a1e3e6bc0eafe4b2ab5bbfb69e65a3002f584f85503275bc549c55fa - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1190fea35b9a1ba1c280d57888664aa7db5f9d6d4325b35a6276bf61291d67e6e14e3001f5af1753faff61fa53861ab8ed15d15965e0dcb05718bdecc6 -B = f6446cb4193c2182baba8c62a0b4bf2495d4b4a65bb9e2c83415cd64e136dec15c4c403aa20a47d4c2aa63f7407931d6f96d428afeadfbdcb3eb13bcfaac9cd9 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 209797b717f068e5f808dd2b4e12576fa056879da881bfcc1819228e4f9dc6f84347edbdbe273657d533d7c928e51b68a82c59d93dfb038514c104c1bc -B = -f6446cc31fd5353f1107d09828bc71ea41e17c6b52a4132d90223f1a839a0be7dcab519c9bc8039d3ac967d174ef00ac586df24615367bb4ce11e87aa2f371cf - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -7198b6aa26be42e97cad682aaa63d68d51952dae52d4cfe5f9a6acef93f35b6d7b7be87a1f2a944cf7fa9483cd6c3df7599d44c5b56e5ff38cd43d23c0 -B = -f6446c30ef86d400625c012372771bf1cbb37f7966eec73239928d08c3ca8e044b88ebddd7f1cbbfe8fec3044682b3b6071492444b97dcc164ae6fd90db18c53 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = cb788549eee4fa559118f0bd66b68d94845bdb7d07b2042d53a64921f3e3df76a2b143e9e9ad39dacaf405cec5fed9fd59050c5d27322142e4e11d4ede -B = f6446bd70fb834383ba4950f06ee893578fc7846a040f87d5c5e45aec42e5ba45b04e2b6a2965bf5665935314d1168bd74788c44e3d0454fa0ed208100d16135 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1122c39c2c252ec96e9274bdf713bfa8200e35ed9f18dd087fedd2005e5898b6f8ed37e1cd7e1f7b0c5be137a71a27b7e4e4669b1f412e154e6ad2ad567 -B = f6446db4b47740e9738b8189472b260d6b848ecbdf7b4f769c32fb014797837dc86fc8e8275862b6f58ac0c1ff2ab1f515ce07ec2f46546ae5efb84c8f19857a - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 2d57e15c8039f8367d2e0198d9fc27616e53efdc9cb0adc0b0199362d08f5698af1f07499cd2b72005f1c09900c71b677e57cd62094743a9b3ae541e74d -B = -f6446f780653462ac0225272fff8d43bf20023b03b1a3f50193e7e0403adaaa1344de44b444edfac3f05105b5d20c78fe509018365b2c30b4748fea0c7309760 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -539b4413477ef77c15fd53e202d8e5d183eb1c91fecf5b89959bb8d60d3f7907e95c5dd045d698a6a17f0150861b43bfeb2e5d40bdc970839b0712ee17f -B = -f6446768d3fc49af312729404aa1266ea12cf48c4a53559818a9d9a8aeea1cc44753dac38dfd4181aa08a5e451022f21bf168aeb0308969a3c0629b570bfce94 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = fe46dc4f55346ee27d6ced0256b0ec64f82d5150c3b49d4cc7d56a60ae5d10bb649a57f4c97acc146388a6a9d25d3c3c7e42372e46bb4f8a72171ea5979 -B = f6445cbe1a7888d3d9b0c2c9510f213120c3bd4827076949c48da68513d172b26dd8a30fae5af94766d1c9c3b6ac9a5d9f8ec1b9c569be0b1e15bc447004569a - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1fbd702bd26d37bb1fa554ad261f1e7161ea438f49b41aab950884c5c87eb1e0b9a3a69807b759a1440ef9e5683c1a13b9d610fd87fb131619cb63997891 -B = f6448c5ff8695094585a0a45748c6cbb4dfb6eb53fabbf39290e080aef3d4616f0c512fcfa724d966d34540b3afc9fbf8d664373f9da2a71e6247d31458828a4 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 260abc8cb124b3c17698ee342bdbe4b1513a085effb4f79aca252c98c8799ad203dccc9c305cdccd2edc16159d0e2c7a125c50f8abff9e12dbe8d93c655d -B = -f64492ad44ca2f4bd46061390e137278143b5e05047b753a05fd3d2797104611d9b65d362076763bf0603ed8572cd4919fcc9bfa39d54e7671213f4ebb2b1570 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -6f961198d2039a92d24c53bfcafd73251b575d5e06565db36666545d5994e511c4c3905cc0b93586f05916c08b8f51a0e0fe1b6253fcfa41bfec25196482 -B = -f643fd0c76a4ac23860c1853cc1f7b9ebc64f1739ebe6f2eb0af0c9c161a240359d29495c37d8525de0c1fa32a56abf421b1a89fcd7a4e79d8cca379bcd54b91 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = ed86313f32aabf2f7487dd9f587431e17b9a46e1a78fe89b0ebe81c737a73c2a8fef92c0963fc36e9808309d00c3bd14612fdf4fb236e06add8fe9329252 -B = f6437f1c56fe4b7c616f7618423fee27fda89130b53acdf525c76443e8b045f102b9c969c119af9f502477f4107a36bfb63e286e098cf03ff2a385d5f8bc1dc1 - -Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -1741bce7ae27a7b3effa5b08b39f9d03d69efe7b0716cc57dc106aac17925a2d77c18386f7398db17f813c9c6f2dfcc9347e9f55de76b11475fcf77bbedb1 -B = f645e0be56b860a19bddea45d06a8095ffc776bae3cce6f1d3e034091538f6bde1bbd5718c49b977eeab08100ade2a633fe5d187de3a89e1e455c33559aa9dc4 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = 20bd41a0d6d691e8554ee8b90a775e04f086f318b7afdc7b5d6d7c3b7ab6b955aa286809856e1bd195dace84b18b2d0365edc8e066d2e8db9ae8325d00843 -B = -f6467876a24aeb903f243f8eab6fee120fd9153a2da7f082d61849da2e2f2903d43efbdfd4729cc0d0ac6da9296250364388e87a76e30fa560c811e907beb856 - -Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 -A = -685147a1e74dab824bc6cb7fb30a773fbe5e380f46189574038d2d2f3983ced8777a080af6b06e9bb3c2d134a3302fa099b4bc78a4f01a4c157424ee3c773 -B = -f63de78e0e1f094c687a2e3367e415f4bb8e26e77b2813fbb7223a2f9783e55b515ce1b8d32adad829d7d3cf2dcd04807948ee52215253752e4d0c23930ae8a0 - -Sum = 1 -A = 0 -B = 1 - -Sum = 2 -A = 1 -B = 1 - -Sum = 4 -A = 3 -B = 1 - -Sum = 8 -A = 7 -B = 1 - -Sum = 10 -A = f -B = 1 - -Sum = 20 -A = 1f -B = 1 - -Sum = 40 -A = 3f -B = 1 - -Sum = 80 -A = 7f -B = 1 - -Sum = 100 -A = ff -B = 1 - -Sum = 200 -A = 1ff -B = 1 - -Sum = 400 -A = 3ff -B = 1 - -Sum = 800 -A = 7ff -B = 1 - -Sum = 1000 -A = fff -B = 1 - -Sum = 2000 -A = 1fff -B = 1 - -Sum = 4000 -A = 3fff -B = 1 - -Sum = 8000 -A = 7fff -B = 1 - -Sum = 10000 -A = ffff -B = 1 - -Sum = 20000 -A = 1ffff -B = 1 - -Sum = 40000 -A = 3ffff -B = 1 - -Sum = 80000 -A = 7ffff -B = 1 - -Sum = 100000 -A = fffff -B = 1 - -Sum = 200000 -A = 1fffff -B = 1 - -Sum = 400000 -A = 3fffff -B = 1 - -Sum = 800000 -A = 7fffff -B = 1 - -Sum = 1000000 -A = ffffff -B = 1 - -Sum = 2000000 -A = 1ffffff -B = 1 - -Sum = 4000000 -A = 3ffffff -B = 1 - -Sum = 8000000 -A = 7ffffff -B = 1 - -Sum = 10000000 -A = fffffff -B = 1 - -Sum = 20000000 -A = 1fffffff -B = 1 - -Sum = 40000000 -A = 3fffffff -B = 1 - -Sum = 80000000 -A = 7fffffff -B = 1 - -Sum = 100000000 -A = ffffffff -B = 1 - -Sum = 200000000 -A = 1ffffffff -B = 1 - -Sum = 400000000 -A = 3ffffffff -B = 1 - -Sum = 800000000 -A = 7ffffffff -B = 1 - -Sum = 1000000000 -A = fffffffff -B = 1 - -Sum = 2000000000 -A = 1fffffffff -B = 1 - -Sum = 4000000000 -A = 3fffffffff -B = 1 - -Sum = 8000000000 -A = 7fffffffff -B = 1 - -Sum = 10000000000 -A = ffffffffff -B = 1 - -Sum = 20000000000 -A = 1ffffffffff -B = 1 - -Sum = 40000000000 -A = 3ffffffffff -B = 1 - -Sum = 80000000000 -A = 7ffffffffff -B = 1 - -Sum = 100000000000 -A = fffffffffff -B = 1 - -Sum = 200000000000 -A = 1fffffffffff -B = 1 - -Sum = 400000000000 -A = 3fffffffffff -B = 1 - -Sum = 800000000000 -A = 7fffffffffff -B = 1 - -Sum = 1000000000000 -A = ffffffffffff -B = 1 - -Sum = 2000000000000 -A = 1ffffffffffff -B = 1 - -Sum = 4000000000000 -A = 3ffffffffffff -B = 1 - -Sum = 8000000000000 -A = 7ffffffffffff -B = 1 - -Sum = 10000000000000 -A = fffffffffffff -B = 1 - -Sum = 20000000000000 -A = 1fffffffffffff -B = 1 - -Sum = 40000000000000 -A = 3fffffffffffff -B = 1 - -Sum = 80000000000000 -A = 7fffffffffffff -B = 1 - -Sum = 100000000000000 -A = ffffffffffffff -B = 1 - -Sum = 200000000000000 -A = 1ffffffffffffff -B = 1 - -Sum = 400000000000000 -A = 3ffffffffffffff -B = 1 - -Sum = 800000000000000 -A = 7ffffffffffffff -B = 1 - -Sum = 1000000000000000 -A = fffffffffffffff -B = 1 - -Sum = 2000000000000000 -A = 1fffffffffffffff -B = 1 - -Sum = 4000000000000000 -A = 3fffffffffffffff -B = 1 - -Sum = 8000000000000000 -A = 7fffffffffffffff -B = 1 - -Sum = 10000000000000000 -A = ffffffffffffffff -B = 1 - -Sum = 20000000000000000 -A = 1ffffffffffffffff -B = 1 - -Sum = 40000000000000000 -A = 3ffffffffffffffff -B = 1 - -Sum = 80000000000000000 -A = 7ffffffffffffffff -B = 1 - -Sum = 100000000000000000 -A = fffffffffffffffff -B = 1 - -Sum = 200000000000000000 -A = 1fffffffffffffffff -B = 1 - -Sum = 400000000000000000 -A = 3fffffffffffffffff -B = 1 - -Sum = 800000000000000000 -A = 7fffffffffffffffff -B = 1 - -Sum = 1000000000000000000 -A = ffffffffffffffffff -B = 1 - -Sum = 2000000000000000000 -A = 1ffffffffffffffffff -B = 1 - -Sum = 4000000000000000000 -A = 3ffffffffffffffffff -B = 1 - -Sum = 8000000000000000000 -A = 7ffffffffffffffffff -B = 1 - -Sum = 10000000000000000000 -A = fffffffffffffffffff -B = 1 - -Sum = 20000000000000000000 -A = 1fffffffffffffffffff -B = 1 - -Sum = 40000000000000000000 -A = 3fffffffffffffffffff -B = 1 - -Sum = 80000000000000000000 -A = 7fffffffffffffffffff -B = 1 - -Sum = 100000000000000000000 -A = ffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000 -A = 1ffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000 -A = 3ffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000 -A = 7ffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000 -A = fffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000 -A = 1fffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000 -A = 3fffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000 -A = 7fffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000 -A = ffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000 -A = 1ffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000 -A = 3ffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000 -A = 7ffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000 -A = fffffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000000 -A = 1fffffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000000 -A = 3fffffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000000 -A = 7fffffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000000 -A = ffffffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000000 -A = 1ffffffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000000 -A = 3ffffffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000000 -A = 7ffffffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000000 -A = fffffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000000 -A = 1fffffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000000 -A = 3fffffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000000 -A = 7fffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000 -A = ffffffffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000000000 -A = 1ffffffffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000000000 -A = 3ffffffffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000000000 -A = 7ffffffffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000000000 -A = fffffffffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000000000 -A = 1fffffffffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000000000 -A = 3fffffffffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000000000 -A = 7fffffffffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000000000 -A = ffffffffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000000000 -A = 1ffffffffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000000000 -A = 3ffffffffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000000000 -A = 7ffffffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000000 -A = fffffffffffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000000000000 -A = 1fffffffffffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000000000000 -A = 3fffffffffffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000000000000 -A = 7fffffffffffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000000000000 -A = ffffffffffffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000000000000 -A = fffffffffffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 200000000000000000000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 400000000000000000000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 800000000000000000000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 1000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 2000000000000000000000000000000000000000000000000 -A = 1ffffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 4000000000000000000000000000000000000000000000000 -A = 3ffffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 8000000000000000000000000000000000000000000000000 -A = 7ffffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 10000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 20000000000000000000000000000000000000000000000000 -A = 1fffffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 40000000000000000000000000000000000000000000000000 -A = 3fffffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 80000000000000000000000000000000000000000000000000 -A = 7fffffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffffffff -B = 1 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffffffe -B = 2 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffffffc -B = 4 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffffff8 -B = 8 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffffff0 -B = 10 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffffffe0 -B = 20 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffffffc0 -B = 40 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffffff80 -B = 80 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffffff00 -B = 100 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffffe00 -B = 200 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffffc00 -B = 400 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffff800 -B = 800 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffff000 -B = 1000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffffe000 -B = 2000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffffc000 -B = 4000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffff8000 -B = 8000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffff0000 -B = 10000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffe0000 -B = 20000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffffc0000 -B = 40000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffff80000 -B = 80000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffff00000 -B = 100000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffe00000 -B = 200000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffffc00000 -B = 400000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffff800000 -B = 800000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffff000000 -B = 1000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffe000000 -B = 2000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffffc000000 -B = 4000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffff8000000 -B = 8000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffff0000000 -B = 10000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffe0000000 -B = 20000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffffc0000000 -B = 40000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffff80000000 -B = 80000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffff00000000 -B = 100000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffe00000000 -B = 200000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffffc00000000 -B = 400000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffff800000000 -B = 800000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffff000000000 -B = 1000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffe000000000 -B = 2000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffffc000000000 -B = 4000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffff8000000000 -B = 8000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffff0000000000 -B = 10000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffe0000000000 -B = 20000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffffc0000000000 -B = 40000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffff80000000000 -B = 80000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffff00000000000 -B = 100000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffe00000000000 -B = 200000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffffc00000000000 -B = 400000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffff800000000000 -B = 800000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffff000000000000 -B = 1000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffe000000000000 -B = 2000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffffc000000000000 -B = 4000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffff8000000000000 -B = 8000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffff0000000000000 -B = 10000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffe0000000000000 -B = 20000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffffc0000000000000 -B = 40000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffff80000000000000 -B = 80000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffff00000000000000 -B = 100000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffe00000000000000 -B = 200000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffffc00000000000000 -B = 400000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffff800000000000000 -B = 800000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffff000000000000000 -B = 1000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffe000000000000000 -B = 2000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffffc000000000000000 -B = 4000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffff8000000000000000 -B = 8000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffff0000000000000000 -B = 10000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffe0000000000000000 -B = 20000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffffc0000000000000000 -B = 40000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffff80000000000000000 -B = 80000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffff00000000000000000 -B = 100000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffe00000000000000000 -B = 200000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffffc00000000000000000 -B = 400000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffff800000000000000000 -B = 800000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffff000000000000000000 -B = 1000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffe000000000000000000 -B = 2000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffffc000000000000000000 -B = 4000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffff8000000000000000000 -B = 8000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffff0000000000000000000 -B = 10000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffe0000000000000000000 -B = 20000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffffc0000000000000000000 -B = 40000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffff80000000000000000000 -B = 80000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffff00000000000000000000 -B = 100000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffe00000000000000000000 -B = 200000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffffc00000000000000000000 -B = 400000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffff800000000000000000000 -B = 800000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffff000000000000000000000 -B = 1000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffe000000000000000000000 -B = 2000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffffc000000000000000000000 -B = 4000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffff8000000000000000000000 -B = 8000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffff0000000000000000000000 -B = 10000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffe0000000000000000000000 -B = 20000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffffc0000000000000000000000 -B = 40000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffff80000000000000000000000 -B = 80000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffff00000000000000000000000 -B = 100000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffe00000000000000000000000 -B = 200000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffffc00000000000000000000000 -B = 400000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffff800000000000000000000000 -B = 800000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffff000000000000000000000000 -B = 1000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffe000000000000000000000000 -B = 2000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffffc000000000000000000000000 -B = 4000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffff8000000000000000000000000 -B = 8000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffff0000000000000000000000000 -B = 10000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffe0000000000000000000000000 -B = 20000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffffc0000000000000000000000000 -B = 40000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffff80000000000000000000000000 -B = 80000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffff00000000000000000000000000 -B = 100000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffe00000000000000000000000000 -B = 200000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffffc00000000000000000000000000 -B = 400000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffff800000000000000000000000000 -B = 800000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffff000000000000000000000000000 -B = 1000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffe000000000000000000000000000 -B = 2000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffffc000000000000000000000000000 -B = 4000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffff8000000000000000000000000000 -B = 8000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffff0000000000000000000000000000 -B = 10000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffe0000000000000000000000000000 -B = 20000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffffc0000000000000000000000000000 -B = 40000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffff80000000000000000000000000000 -B = 80000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffff00000000000000000000000000000 -B = 100000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffe00000000000000000000000000000 -B = 200000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffffc00000000000000000000000000000 -B = 400000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffff800000000000000000000000000000 -B = 800000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffff000000000000000000000000000000 -B = 1000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffe000000000000000000000000000000 -B = 2000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffffc000000000000000000000000000000 -B = 4000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffff8000000000000000000000000000000 -B = 8000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffff0000000000000000000000000000000 -B = 10000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffe0000000000000000000000000000000 -B = 20000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffffc0000000000000000000000000000000 -B = 40000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffff80000000000000000000000000000000 -B = 80000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffff00000000000000000000000000000000 -B = 100000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffe00000000000000000000000000000000 -B = 200000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffffc00000000000000000000000000000000 -B = 400000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffff800000000000000000000000000000000 -B = 800000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffff000000000000000000000000000000000 -B = 1000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffe000000000000000000000000000000000 -B = 2000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffffc000000000000000000000000000000000 -B = 4000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffff8000000000000000000000000000000000 -B = 8000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffff0000000000000000000000000000000000 -B = 10000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffe0000000000000000000000000000000000 -B = 20000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffffc0000000000000000000000000000000000 -B = 40000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffff80000000000000000000000000000000000 -B = 80000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffff00000000000000000000000000000000000 -B = 100000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffe00000000000000000000000000000000000 -B = 200000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffffc00000000000000000000000000000000000 -B = 400000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffff800000000000000000000000000000000000 -B = 800000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffff000000000000000000000000000000000000 -B = 1000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffe000000000000000000000000000000000000 -B = 2000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffffc000000000000000000000000000000000000 -B = 4000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffff8000000000000000000000000000000000000 -B = 8000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffff0000000000000000000000000000000000000 -B = 10000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffe0000000000000000000000000000000000000 -B = 20000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffffc0000000000000000000000000000000000000 -B = 40000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffff80000000000000000000000000000000000000 -B = 80000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffff00000000000000000000000000000000000000 -B = 100000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffe00000000000000000000000000000000000000 -B = 200000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffffc00000000000000000000000000000000000000 -B = 400000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffff800000000000000000000000000000000000000 -B = 800000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffff000000000000000000000000000000000000000 -B = 1000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffe000000000000000000000000000000000000000 -B = 2000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffffc000000000000000000000000000000000000000 -B = 4000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffff8000000000000000000000000000000000000000 -B = 8000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffff0000000000000000000000000000000000000000 -B = 10000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffe0000000000000000000000000000000000000000 -B = 20000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffffc0000000000000000000000000000000000000000 -B = 40000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffff80000000000000000000000000000000000000000 -B = 80000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffff00000000000000000000000000000000000000000 -B = 100000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffe00000000000000000000000000000000000000000 -B = 200000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffffc00000000000000000000000000000000000000000 -B = 400000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffff800000000000000000000000000000000000000000 -B = 800000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffff000000000000000000000000000000000000000000 -B = 1000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffe000000000000000000000000000000000000000000 -B = 2000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffffc000000000000000000000000000000000000000000 -B = 4000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffff8000000000000000000000000000000000000000000 -B = 8000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffff0000000000000000000000000000000000000000000 -B = 10000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffe0000000000000000000000000000000000000000000 -B = 20000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffffc0000000000000000000000000000000000000000000 -B = 40000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffff80000000000000000000000000000000000000000000 -B = 80000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffff00000000000000000000000000000000000000000000 -B = 100000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffe00000000000000000000000000000000000000000000 -B = 200000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffffc00000000000000000000000000000000000000000000 -B = 400000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffff800000000000000000000000000000000000000000000 -B = 800000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffff000000000000000000000000000000000000000000000 -B = 1000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffe000000000000000000000000000000000000000000000 -B = 2000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffffc000000000000000000000000000000000000000000000 -B = 4000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffff8000000000000000000000000000000000000000000000 -B = 8000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffff0000000000000000000000000000000000000000000000 -B = 10000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffe0000000000000000000000000000000000000000000000 -B = 20000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fffc0000000000000000000000000000000000000000000000 -B = 40000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fff80000000000000000000000000000000000000000000000 -B = 80000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fff00000000000000000000000000000000000000000000000 -B = 100000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffe00000000000000000000000000000000000000000000000 -B = 200000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ffc00000000000000000000000000000000000000000000000 -B = 400000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ff800000000000000000000000000000000000000000000000 -B = 800000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = ff000000000000000000000000000000000000000000000000 -B = 1000000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fe000000000000000000000000000000000000000000000000 -B = 2000000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = fc000000000000000000000000000000000000000000000000 -B = 4000000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = f8000000000000000000000000000000000000000000000000 -B = 8000000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = f0000000000000000000000000000000000000000000000000 -B = 10000000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = e0000000000000000000000000000000000000000000000000 -B = 20000000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = c0000000000000000000000000000000000000000000000000 -B = 40000000000000000000000000000000000000000000000000 - -Sum = 100000000000000000000000000000000000000000000000000 -A = 80000000000000000000000000000000000000000000000000 -B = 80000000000000000000000000000000000000000000000000 - - -# LShift1 tests. -# -# These test vectors satisfy A * 2 = LShift1 - -LShift1 = 0 -A = 0 - -LShift1 = 13116120bca5df64e13f314254 -A = 988b0905e52efb2709f98a12a - -LShift1 = -13116120bca5df64e13f314254 -A = -988b0905e52efb2709f98a12a - -LShift1 = 2622c241794bbec9c27e6284a8 -A = 13116120bca5df64e13f314254 - -LShift1 = -2622c241794bbec9c27e6284a8 -A = -13116120bca5df64e13f314254 - -LShift1 = 4c458482f2977d9384fcc50950 -A = 2622c241794bbec9c27e6284a8 - -LShift1 = -4c458482f2977d9384fcc50950 -A = -2622c241794bbec9c27e6284a8 - -LShift1 = 988b0905e52efb2709f98a12a2 -A = 4c458482f2977d9384fcc50951 - -LShift1 = -988b0905e52efb2709f98a12a2 -A = -4c458482f2977d9384fcc50951 - -LShift1 = 13116120bca5df64e13f3142544 -A = 988b0905e52efb2709f98a12a2 - -LShift1 = -13116120bca5df64e13f3142544 -A = -988b0905e52efb2709f98a12a2 - -LShift1 = 2622c241794bbec9c27e6284a8a -A = 13116120bca5df64e13f3142545 - -LShift1 = -2622c241794bbec9c27e6284a8a -A = -13116120bca5df64e13f3142545 - -LShift1 = 4c458482f2977d9384fcc509514 -A = 2622c241794bbec9c27e6284a8a - -LShift1 = -4c458482f2977d9384fcc509514 -A = -2622c241794bbec9c27e6284a8a - -LShift1 = 988b0905e52efb2709f98a12a28 -A = 4c458482f2977d9384fcc509514 - -LShift1 = -988b0905e52efb2709f98a12a28 -A = -4c458482f2977d9384fcc509514 - -LShift1 = 13116120bca5df64e13f31425450 -A = 988b0905e52efb2709f98a12a28 - -LShift1 = -13116120bca5df64e13f31425450 -A = -988b0905e52efb2709f98a12a28 - -LShift1 = 2622c241794bbec9c27e6284a8a0 -A = 13116120bca5df64e13f31425450 - -LShift1 = -2622c241794bbec9c27e6284a8a0 -A = -13116120bca5df64e13f31425450 - -LShift1 = 4c458482f2977d9384fcc5095142 -A = 2622c241794bbec9c27e6284a8a1 - -LShift1 = -4c458482f2977d9384fcc5095142 -A = -2622c241794bbec9c27e6284a8a1 - -LShift1 = 988b0905e52efb2709f98a12a286 -A = 4c458482f2977d9384fcc5095143 - -LShift1 = -988b0905e52efb2709f98a12a286 -A = -4c458482f2977d9384fcc5095143 - -LShift1 = 13116120bca5df64e13f31425450c -A = 988b0905e52efb2709f98a12a286 - -LShift1 = -13116120bca5df64e13f31425450c -A = -988b0905e52efb2709f98a12a286 - -LShift1 = 2622c241794bbec9c27e6284a8a18 -A = 13116120bca5df64e13f31425450c - -LShift1 = -2622c241794bbec9c27e6284a8a18 -A = -13116120bca5df64e13f31425450c - -LShift1 = 4c458482f2977d9384fcc50951430 -A = 2622c241794bbec9c27e6284a8a18 - -LShift1 = -4c458482f2977d9384fcc50951430 -A = -2622c241794bbec9c27e6284a8a18 - -LShift1 = 988b0905e52efb2709f98a12a2862 -A = 4c458482f2977d9384fcc50951431 - -LShift1 = -988b0905e52efb2709f98a12a2862 -A = -4c458482f2977d9384fcc50951431 - -LShift1 = 13116120bca5df64e13f31425450c6 -A = 988b0905e52efb2709f98a12a2863 - -LShift1 = -13116120bca5df64e13f31425450c6 -A = -988b0905e52efb2709f98a12a2863 - -LShift1 = 2622c241794bbec9c27e6284a8a18e -A = 13116120bca5df64e13f31425450c7 - -LShift1 = -2622c241794bbec9c27e6284a8a18e -A = -13116120bca5df64e13f31425450c7 - -LShift1 = 4c458482f2977d9384fcc50951431e -A = 2622c241794bbec9c27e6284a8a18f - -LShift1 = -4c458482f2977d9384fcc50951431e -A = -2622c241794bbec9c27e6284a8a18f - -LShift1 = 988b0905e52efb2709f98a12a2863c -A = 4c458482f2977d9384fcc50951431e - -LShift1 = -988b0905e52efb2709f98a12a2863c -A = -4c458482f2977d9384fcc50951431e - -LShift1 = 13116120bca5df64e13f31425450c7a -A = 988b0905e52efb2709f98a12a2863d - -LShift1 = -13116120bca5df64e13f31425450c7a -A = -988b0905e52efb2709f98a12a2863d - -LShift1 = 2622c241794bbec9c27e6284a8a18f4 -A = 13116120bca5df64e13f31425450c7a - -LShift1 = -2622c241794bbec9c27e6284a8a18f4 -A = -13116120bca5df64e13f31425450c7a - -LShift1 = 4c458482f2977d9384fcc50951431e8 -A = 2622c241794bbec9c27e6284a8a18f4 - -LShift1 = -4c458482f2977d9384fcc50951431e8 -A = -2622c241794bbec9c27e6284a8a18f4 - -LShift1 = 988b0905e52efb2709f98a12a2863d2 -A = 4c458482f2977d9384fcc50951431e9 - -LShift1 = -988b0905e52efb2709f98a12a2863d2 -A = -4c458482f2977d9384fcc50951431e9 - -LShift1 = 13116120bca5df64e13f31425450c7a4 -A = 988b0905e52efb2709f98a12a2863d2 - -LShift1 = -13116120bca5df64e13f31425450c7a4 -A = -988b0905e52efb2709f98a12a2863d2 - -LShift1 = 2622c241794bbec9c27e6284a8a18f4a -A = 13116120bca5df64e13f31425450c7a5 - -LShift1 = -2622c241794bbec9c27e6284a8a18f4a -A = -13116120bca5df64e13f31425450c7a5 - -LShift1 = 4c458482f2977d9384fcc50951431e94 -A = 2622c241794bbec9c27e6284a8a18f4a - -LShift1 = -4c458482f2977d9384fcc50951431e94 -A = -2622c241794bbec9c27e6284a8a18f4a - -LShift1 = 988b0905e52efb2709f98a12a2863d2a -A = 4c458482f2977d9384fcc50951431e95 - -LShift1 = -988b0905e52efb2709f98a12a2863d2a -A = -4c458482f2977d9384fcc50951431e95 - -LShift1 = 13116120bca5df64e13f31425450c7a56 -A = 988b0905e52efb2709f98a12a2863d2b - -LShift1 = -13116120bca5df64e13f31425450c7a56 -A = -988b0905e52efb2709f98a12a2863d2b - -LShift1 = 2622c241794bbec9c27e6284a8a18f4ae -A = 13116120bca5df64e13f31425450c7a57 - -LShift1 = -2622c241794bbec9c27e6284a8a18f4ae -A = -13116120bca5df64e13f31425450c7a57 - -LShift1 = 4c458482f2977d9384fcc50951431e95c -A = 2622c241794bbec9c27e6284a8a18f4ae - -LShift1 = -4c458482f2977d9384fcc50951431e95c -A = -2622c241794bbec9c27e6284a8a18f4ae - -LShift1 = 988b0905e52efb2709f98a12a2863d2ba -A = 4c458482f2977d9384fcc50951431e95d - -LShift1 = -988b0905e52efb2709f98a12a2863d2ba -A = -4c458482f2977d9384fcc50951431e95d - -LShift1 = 13116120bca5df64e13f31425450c7a576 -A = 988b0905e52efb2709f98a12a2863d2bb - -LShift1 = -13116120bca5df64e13f31425450c7a576 -A = -988b0905e52efb2709f98a12a2863d2bb - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aee -A = 13116120bca5df64e13f31425450c7a577 - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aee -A = -13116120bca5df64e13f31425450c7a577 - -LShift1 = 4c458482f2977d9384fcc50951431e95de -A = 2622c241794bbec9c27e6284a8a18f4aef - -LShift1 = -4c458482f2977d9384fcc50951431e95de -A = -2622c241794bbec9c27e6284a8a18f4aef - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbc -A = 4c458482f2977d9384fcc50951431e95de - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbc -A = -4c458482f2977d9384fcc50951431e95de - -LShift1 = 13116120bca5df64e13f31425450c7a577a -A = 988b0905e52efb2709f98a12a2863d2bbd - -LShift1 = -13116120bca5df64e13f31425450c7a577a -A = -988b0905e52efb2709f98a12a2863d2bbd - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef4 -A = 13116120bca5df64e13f31425450c7a577a - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef4 -A = -13116120bca5df64e13f31425450c7a577a - -LShift1 = 4c458482f2977d9384fcc50951431e95dea -A = 2622c241794bbec9c27e6284a8a18f4aef5 - -LShift1 = -4c458482f2977d9384fcc50951431e95dea -A = -2622c241794bbec9c27e6284a8a18f4aef5 - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6 -A = 4c458482f2977d9384fcc50951431e95deb - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6 -A = -4c458482f2977d9384fcc50951431e95deb - -LShift1 = 13116120bca5df64e13f31425450c7a577ac -A = 988b0905e52efb2709f98a12a2863d2bbd6 - -LShift1 = -13116120bca5df64e13f31425450c7a577ac -A = -988b0905e52efb2709f98a12a2863d2bbd6 - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5a -A = 13116120bca5df64e13f31425450c7a577ad - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5a -A = -13116120bca5df64e13f31425450c7a577ad - -LShift1 = 4c458482f2977d9384fcc50951431e95deb4 -A = 2622c241794bbec9c27e6284a8a18f4aef5a - -LShift1 = -4c458482f2977d9384fcc50951431e95deb4 -A = -2622c241794bbec9c27e6284a8a18f4aef5a - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6a -A = 4c458482f2977d9384fcc50951431e95deb5 - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6a -A = -4c458482f2977d9384fcc50951431e95deb5 - -LShift1 = 13116120bca5df64e13f31425450c7a577ad6 -A = 988b0905e52efb2709f98a12a2863d2bbd6b - -LShift1 = -13116120bca5df64e13f31425450c7a577ad6 -A = -988b0905e52efb2709f98a12a2863d2bbd6b - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5ae -A = 13116120bca5df64e13f31425450c7a577ad7 - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5ae -A = -13116120bca5df64e13f31425450c7a577ad7 - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5e -A = 2622c241794bbec9c27e6284a8a18f4aef5af - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5e -A = -2622c241794bbec9c27e6284a8a18f4aef5af - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6be -A = 4c458482f2977d9384fcc50951431e95deb5f - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6be -A = -4c458482f2977d9384fcc50951431e95deb5f - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7e -A = 988b0905e52efb2709f98a12a2863d2bbd6bf - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7e -A = -988b0905e52efb2709f98a12a2863d2bbd6bf - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5afe -A = 13116120bca5df64e13f31425450c7a577ad7f - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5afe -A = -13116120bca5df64e13f31425450c7a577ad7f - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5fe -A = 2622c241794bbec9c27e6284a8a18f4aef5aff - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5fe -A = -2622c241794bbec9c27e6284a8a18f4aef5aff - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bfe -A = 4c458482f2977d9384fcc50951431e95deb5ff - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bfe -A = -4c458482f2977d9384fcc50951431e95deb5ff - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe -A = 988b0905e52efb2709f98a12a2863d2bbd6bff - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe -A = -988b0905e52efb2709f98a12a2863d2bbd6bff - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc -A = 13116120bca5df64e13f31425450c7a577ad7fe - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc -A = -13116120bca5df64e13f31425450c7a577ad7fe - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff8 -A = 2622c241794bbec9c27e6284a8a18f4aef5affc - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff8 -A = -2622c241794bbec9c27e6284a8a18f4aef5affc - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff0 -A = 4c458482f2977d9384fcc50951431e95deb5ff8 - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff0 -A = -4c458482f2977d9384fcc50951431e95deb5ff8 - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0 -A = 988b0905e52efb2709f98a12a2863d2bbd6bff0 - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0 -A = -988b0905e52efb2709f98a12a2863d2bbd6bff0 - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc0 -A = 13116120bca5df64e13f31425450c7a577ad7fe0 - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc0 -A = -13116120bca5df64e13f31425450c7a577ad7fe0 - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff82 -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1 - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff82 -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1 - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06 -A = 4c458482f2977d9384fcc50951431e95deb5ff83 - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06 -A = -4c458482f2977d9384fcc50951431e95deb5ff83 - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0c -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06 - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0c -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06 - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1a -A = 13116120bca5df64e13f31425450c7a577ad7fe0d - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1a -A = -13116120bca5df64e13f31425450c7a577ad7fe0d - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836 -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836 -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06c -A = 4c458482f2977d9384fcc50951431e95deb5ff836 - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06c -A = -4c458482f2977d9384fcc50951431e95deb5ff836 - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0da -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06d - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0da -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06d - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b6 -A = 13116120bca5df64e13f31425450c7a577ad7fe0db - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b6 -A = -13116120bca5df64e13f31425450c7a577ad7fe0db - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836e -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7 - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836e -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7 - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06de -A = 4c458482f2977d9384fcc50951431e95deb5ff836f - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06de -A = -4c458482f2977d9384fcc50951431e95deb5ff836f - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbe -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbe -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7c -A = 13116120bca5df64e13f31425450c7a577ad7fe0dbe - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7c -A = -13116120bca5df64e13f31425450c7a577ad7fe0dbe - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fa -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7d - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fa -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7d - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6 -A = 4c458482f2977d9384fcc50951431e95deb5ff836fb - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6 -A = -4c458482f2977d9384fcc50951431e95deb5ff836fb - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbec -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6 - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbec -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6 - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7da -A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7da -A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb6 -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb6 -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c -A = 4c458482f2977d9384fcc50951431e95deb5ff836fb6 - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c -A = -4c458482f2977d9384fcc50951431e95deb5ff836fb6 - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed8 -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed8 -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db0 -A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed8 - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db0 -A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed8 - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60 -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db0 - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60 -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db0 - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c0 -A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60 - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c0 -A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60 - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed82 -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c1 - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed82 -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c1 - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db06 -A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed83 - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db06 -A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed83 - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60c -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db06 - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60c -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db06 - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c18 -A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60c - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c18 -A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60c - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed832 -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19 - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed832 -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19 - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db066 -A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833 - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db066 -A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833 - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60ce -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067 - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60ce -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067 - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19e -A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cf - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19e -A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cf - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833e -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833e -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067c -A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833e - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067c -A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833e - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfa -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067d - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfa -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067d - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f6 -A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfb - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f6 -A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfb - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833ee -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7 - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833ee -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7 - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067de -A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833ef - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067de -A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833ef - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbe -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067df - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbe -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067df - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7e -A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7e -A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf - -LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833efe -A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7f - -LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833efe -A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7f - -LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067dfc -A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833efe - -LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067dfc -A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833efe - -LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf8 -A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067dfc - -LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf8 -A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067dfc - -LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7f0 -A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf8 - -LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7f0 -A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf8 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000000 - -LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000000 -A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000000 - -LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000000 -A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000000 - -LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000000 -A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000000 - -LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000000 -A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000000 - -LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000000 -A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000000 - -LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000000 -A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000000 - -LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000000 -A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000000 - -LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000000 -A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000000 - - -# LShift tests -# -# These test vectors satisfy A * 2^N = LShift. - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 1 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 2 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 3 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 4 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 5 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 6 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 7 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 8 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 9 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = a - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = b - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = c - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = d - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = e - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = f - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 10 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 11 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 12 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 13 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 14 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 15 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 16 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 17 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 18 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 19 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 1a - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 1b - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 1c - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 1d - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 1e - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 1f - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 20 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 21 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 22 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 23 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 24 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 25 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 26 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 27 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 28 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 29 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 2a - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 2b - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 2c - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 2d - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 2e - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 2f - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 30 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 31 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 32 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 33 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 34 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 35 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 36 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 37 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 38 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 39 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 3a - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 3b - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 3c - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 3d - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 3e - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 3f - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 40 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 41 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 42 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 43 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 44 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 45 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 46 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 47 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 48 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 49 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 4a - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 4b - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 4c - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 4d - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 4e - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 4f - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 50 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 51 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 52 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 53 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 54 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 55 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 56 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 57 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 58 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 59 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 5a - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 5b - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 5c - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 5d - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 5e - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 5f - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 60 - -LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 61 - -LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 62 - -LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 63 - -LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000000000000000 -A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 -N = 64 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 1 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 2 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 3 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 4 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 5 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 6 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 7 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 8 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 9 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = a - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = b - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = c - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = d - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = e - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = f - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 10 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 11 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 12 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 13 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 14 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 15 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 16 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 17 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 18 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 19 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 1a - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 1b - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 1c - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 1d - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 1e - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 1f - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 20 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 21 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 22 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 23 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 24 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 25 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 26 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 27 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 28 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 29 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 2a - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 2b - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 2c - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 2d - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 2e - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 2f - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 30 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 31 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 32 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 33 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 34 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 35 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 36 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 37 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 38 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 39 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 3a - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 3b - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 3c - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 3d - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 3e - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 3f - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 40 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 41 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 42 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 43 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 44 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 45 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 46 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 47 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 48 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 49 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 4a - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 4b - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 4c - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 4d - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 4e - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 4f - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 50 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 51 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 52 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 53 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 54 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 55 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 56 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 57 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 58 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 59 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 5a - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 5b - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 5c - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 5d - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 5e - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 5f - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 60 - -LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 61 - -LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 62 - -LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 63 - -LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000000000000000 -A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e -N = 64 - - -# RShift tests -# -# These test vectors satisfy A / 2^N = RShift, rounding towards zero. - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b36380 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 1 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9b1c0 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 2 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ecd8e0 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 3 - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c70 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 4 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b3638 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 5 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9b1c -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 6 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ecd8e -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 7 - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c7 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 8 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b363 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 9 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9b1 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = a - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ecd8 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = b - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = c - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b36 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = d - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9b -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = e - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ecd -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = f - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 10 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b3 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 11 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 12 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ec -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 13 - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f6 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 14 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 15 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 16 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365e -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 17 - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 18 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 19 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cb -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 1a - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 1b - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 1c - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd9 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 1d - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66c -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 1e - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b36 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 1f - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 20 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 21 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 22 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b3 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 23 - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 24 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596c -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 25 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb6 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 26 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 27 - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 28 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 29 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 2a - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 2b - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 2c - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d59 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 2d - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806ac -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 2e - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa5740356 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 2f - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 30 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d5 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 31 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806a -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 32 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa574035 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 33 - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01a -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 34 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00d -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 35 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae806 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 36 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 37 - -RShift = d9ce8dff4f2f39c216ea39a461080552ba01 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 38 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d00 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 39 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae80 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 3a - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa5740 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 3b - -RShift = d9ce8dff4f2f39c216ea39a461080552ba0 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 3c - -RShift = 6ce746ffa7979ce10b751cd2308402a95d0 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 3d - -RShift = 3673a37fd3cbce7085ba8e6918420154ae8 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 3e - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa574 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 3f - -RShift = d9ce8dff4f2f39c216ea39a461080552ba -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 40 - -RShift = 6ce746ffa7979ce10b751cd2308402a95d -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 41 - -RShift = 3673a37fd3cbce7085ba8e6918420154ae -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 42 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa57 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 43 - -RShift = d9ce8dff4f2f39c216ea39a461080552b -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 44 - -RShift = 6ce746ffa7979ce10b751cd2308402a95 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 45 - -RShift = 3673a37fd3cbce7085ba8e6918420154a -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 46 - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa5 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 47 - -RShift = d9ce8dff4f2f39c216ea39a461080552 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 48 - -RShift = 6ce746ffa7979ce10b751cd2308402a9 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 49 - -RShift = 3673a37fd3cbce7085ba8e6918420154 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 4a - -RShift = 1b39d1bfe9e5e73842dd47348c2100aa -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 4b - -RShift = d9ce8dff4f2f39c216ea39a46108055 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 4c - -RShift = 6ce746ffa7979ce10b751cd2308402a -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 4d - -RShift = 3673a37fd3cbce7085ba8e691842015 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 4e - -RShift = 1b39d1bfe9e5e73842dd47348c2100a -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 4f - -RShift = d9ce8dff4f2f39c216ea39a4610805 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 50 - -RShift = 6ce746ffa7979ce10b751cd2308402 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 51 - -RShift = 3673a37fd3cbce7085ba8e69184201 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 52 - -RShift = 1b39d1bfe9e5e73842dd47348c2100 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 53 - -RShift = d9ce8dff4f2f39c216ea39a461080 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 54 - -RShift = 6ce746ffa7979ce10b751cd230840 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 55 - -RShift = 3673a37fd3cbce7085ba8e6918420 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 56 - -RShift = 1b39d1bfe9e5e73842dd47348c210 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 57 - -RShift = d9ce8dff4f2f39c216ea39a46108 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 58 - -RShift = 6ce746ffa7979ce10b751cd23084 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 59 - -RShift = 3673a37fd3cbce7085ba8e691842 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 5a - -RShift = 1b39d1bfe9e5e73842dd47348c21 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 5b - -RShift = d9ce8dff4f2f39c216ea39a4610 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 5c - -RShift = 6ce746ffa7979ce10b751cd2308 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 5d - -RShift = 3673a37fd3cbce7085ba8e69184 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 5e - -RShift = 1b39d1bfe9e5e73842dd47348c2 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 5f - -RShift = d9ce8dff4f2f39c216ea39a461 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 60 - -RShift = 6ce746ffa7979ce10b751cd230 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 61 - -RShift = 3673a37fd3cbce7085ba8e6918 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 62 - -RShift = 1b39d1bfe9e5e73842dd47348c -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 63 - -RShift = d9ce8dff4f2f39c216ea39a46 -A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 -N = 64 - - -# Square tests. -# -# These test vectors satisfy A^2 = Square. - -# Regression test for a BN_sqr overflow bug. -Square = 4000000000000000800000000000000240000000000000000000000000000001fffffffffffffff8000000000000000400000000000000000000000000000000 -A = 80000000000000008000000000000001fffffffffffffffe0000000000000000 - -# Regression test for a BN_sqr overflow bug. -Square = 40000000000000000000000080000001fffffffe000000004000000200000001fffffff800000004000000000000000000000000000000000000000000000000 -A = 80000000000000000000000080000001fffffffe000000000000000000000000 - -Square = c2fa18e1d110a4639781 -A = -df6a253c3f - -Square = 4805f01d379f4ce8dc86ed269 -A = 21f253ddb5a6d - -Square = 57def107babc1c2bffeff858947e69 -A = -95fbaee5a09c86d - -Square = f3b01f7941961b3f5cc3361e3ac82423690 -A = -3e71292dd4ad3ed3b4 - -Square = 5e2d9c36d498ad1e8b6113f442ac513eaca74601 -A = 9b45cf6c7a43d910dcff - -Square = 7b7c2eb3fe55615e422b41c6f725341527626398cdee4 -A = 2c7314e72a2ffeef170de2a - -Square = af57c0ed328886642ed5d631b375fc89c03a99f1b427c6bbd1 -A = d3de077f8286a04daa9c497c9 - -Square = 4d9eac3058e6cbc0d12e639ced961c02ec1870afed62fdd44c67ce4 -A = -233da7e87ea4421ee8fe7e00c856 - -Square = 83c292d277fae28cfede74e8e80eba11dc132e16f78cdf64595c12c7dee4 -A = -b7a8aa7452678abd45d2ae6c349e2a - -Square = c80e07dd01f9d19a5cf7f3c328ccf4de70fdd113de69382701294dd29674b9a90 -A = 389387eead58fef2c76b5cf920f35c5cc - -Square = b9f69ca47ac855830fd7ed39c81822c520880c51c3ea60d3ccc106db37fc2b04c47831 -A = -da307c28ea67ca8d3117364ba93f0731bf9 - -Square = 81bbe3a13a22a73778233294ba0c132d9dddec111f768300f177468c204f8eab69b98e62d99 -A = -2d8f715bb32d410b4f475c4d000d56fec7cfc5 - -Square = f815ce34e9bc2e31e36e75cf49b2d15306d438a2a713b2a85b3ea156ba60c867c28cc65aa58fdf11 -A = fc02f2e1a26cd69f6a0e54cca4bbced739b43597 - -Square = 5f968707f58ea15c492ec9677be09c309d91164aafa754ab16ca47a411b5b2249858fb6f96135992e8a04 -A = 271b8eae3e96cc4900d4413d6c00b73736a5d89ed7e - -Square = 4aa616aabcdc7ad48dcfd40d71e00a3789bbf549ff39b3e2ebb52017cb56014941961a5a6d52d7a9980fc99b49 -A = 8a3d3f15e6d7d2130aebd8cb99767defbe4c7704e3c1d - -Square = 845e46db8c40f3f6f6f4928b5748618f021f9064c6522bcf2df004f8d2105e90cd354785c15a6cc32fcc77da2ea3001 -A = -2e0543ac8b8255ce30253cf2047a0ff353dea55a58551801 - -Square = 5dc5706dde9b326feb79941f08bd296ec3b6fb67270516b70fad9921438b9175f395310fb756b60d72d8e73e84ee8673cc40 -A = -9aefd7dfa709dec9e721f5c22867229435b2d6366462d0e438 - -Square = 63dc6565adba27974a66bdcc626596e16cf399541d679f754d9063ceeb320649bec09a940309dd1eae5fbba0b558939afae9689c9 -A = 27f8e071f70b0053d70eca9c6d1e28303b8da2d3c58083c2cc45d - -Square = cf2176449bb8b215fc37288b904ca27d5d410780fd054d2a190a94b405f6aa41970b41ba3cc43eaabb97c2248e1e21457949070ec0f6a4 -A = -e645c7edc27512d4b3170d3c5430d0712a25c13afcc09c9b30bb11a - -Square = 43194e5f12e828db6735824c194985108269ddec12c49a14658be3c2b7d298c2846da1aa3ecb7064e73c317af595601de59035faab6dc0fd911 -A = -20c3fb73a03217893fd4a9db6e53a3d83a8414d900213d0460dc91bf69 - -Square = fcee79e598f061157ca9416491f2eb069bb95a4d78a1d0538dab5c8008653db71b90ce3139e693ba284846be7b75d6b7aa80228420fe75599c12f090 -A = fe760dd61798c8f78e52b328fa27cfbe41b898de6e6bb4f4a684f038b5f4 - -Square = 4f0db9f9e6eff9fe7fc938f6d6f5e4fb017ffea0cea0f7c57f4fc1e5b2bdc00a1cb9c1e6c865e53309b6b73c4339b0bd485860ca9edde3019804902da6b61 -A = 23909968dd5d139994fe9baa0a7bbfa009b013df3859ff294c5872366eb7ecf - -Square = 4441ff36d785d18208481470a5b8ba8cd65a45436c39190dde0b8a2b7d00bf67b185d98ab5c4a7853423778d6333abf6b115dc9567a9f9c71916d3f9db3af82c41 -A = 84307277f79cfdf33d83d7093f1fd8aeb94499a7075ca32733b68fcf88e819421 - -Square = 50ee0dba369b0fb61d75706652487ca08043eee712ebb51399122353f77f13745ce2ef0d8f0ea7b3fd94e928b0b2b42c2c9141b5697b13b6d1f3d66c6a9186625b87e40 -A = -23fc02d45c820c3a4250124cc457fa3886beabb41d3c1e26f711309604eb253c6da8 - -Square = da11876b316d4891a2d650692ca776f77afd32a1db08f591c9579fd1053a4a46cf78b4e4cf417eb99eb067ff701dbe3483dff22e7878d2ef2b234244cf7a29d93f62d6d6b611 -A = -ec463653389de3689fe1881679b83ca65134a1498a3543168dd4833a51b23edd3fb617 - -Square = b342b4aff7e5bad38f7f532f0f32a3672f7ea6521d23652fa09ef7aeffcffe52f056ab1b54a0f3a2147f43330fd199d1f290988c866f61360dc4928c84b3dcde8f395120008472100 -A = 358e27805e2a56195fab2ccbe3f931a4bd14023ee56c8a191697926f387c40decc578cef0 - -Square = bf4045fd680caa514e9c410fb4404e5e3a381abee023d5b509d6dc0b97386421f55090af8bab5ac08e9b2eb8a36a64c55960be9179d564c5429f4ec595d03d12111defafb7359b418902b1 -A = -dd450a0fa0914f0d65a1b555baaaf9380eaf8d58b272bf9d95435bad53b01337ac8de562cc7 - -Square = 86abcdf183ca059257c2f6bb91efc9853f4ab42801d3cde88df72d4c904be184e93d6bd1af6fc21a6836c93c4e0a1f728b3722d568572f7ade418274ef2e6ac3463c5cc50990f1017e01cfb91a9 -A = -2e6b4d9eeede7a72b8d0fcf6429c7e30cf291352e1bb43e92c14236716aadc02c02f75c7e6aa8d - -Square = d5f37112733b097cab2bb11daa3d9481255060abd7bce42b752a7641a98e140922c375fcb68bf13d4326b374eabe3b01de0f8f6324b7b3e4142051c02d2f18ae2e748cf3c4bcc3fe157bc94227631d21 -A = ea087236372fbb01b80e57b1ae4edeeaa776355457e18165a5dc60ef4b6ddc0b127ef494dc44ae11 - -Square = 9e4db7885fa5f928ef236f99df3e7c8d17a5a21983ff882032817edd5658575f443eb9c5c97d95ee798a3809cda76d7a0ab9fde757a310e2f5cbb299ab88e92a5771027ab9f26816c02d0c97894da5976ec90 -A = 3253d712d4ada4c12dab41036fcf79b02e80d1a632ff6ccc44d3c1d08467a019cd6221507459b231c8c - -Square = cf9c50ee8773ba94c9e943989a35513fc370adc3622beb125252bb92ff9b258b81a497700e3bb15bcb23a5b3082c095f7a5d6eef20433d689c20a5427b661d43fb0f9b7d1b16d1b73b8fd59ed319a26c5eb92fce90 -A = e68a0812d2de2a922f24c4e63b4c33e62f93943b7673e900d12405dedd0bc2a906daf8b4bc336bdeb52b4 - -Square = f3aa49c906844692d3bc0cf101adcba80351c2e744be01762a8c24804a9d8d5a4cc3c113ccf529eb79cb3304aefa74178afa53f235c5211192d4cd8610c3b42e246621acb3e5d1f9d86ff39a20a7fa9c568356de5b86919 -A = -3e7069ce11472563b0dbeb9a936884df66db83273a690c40e5d3b5f8926fb502d3988591abfaea7b7bd76a85 - -Square = 7c9a5057ca8095cdfa289b2d60eec80548f9ab2f3a996137ff9be403b529c4672e003d1eb074c76c0086e3d875cfbc90a40ccb61b799cc0401ba160d8d6b6ee46b2f14ed31c83de54cdf83458dcfc01e3234d9717b5f2c7e5079 -A = -b299da84ef84095d8191fd1cfe847b960729a3d1857082f05b2fa30ac45e90d2fdc778013b023f38db2c8e780b - -Square = 488294b528e2c2da0145217ec69de2d021ca27f145f7321f06c03316fcc14bd4a9a900bd6a144086acad6d5ad32a6245f5a655e007742aa336430c6bfbe174278884d19fd93916ef57215069268ade899cb92dfed29628327b84d8240 -A = 220fa6eaae0238e78a91e43fd8c2fbd5db0c8501cb96d66265c8edcbd376814c39e4a6f21ec9a6472c6abe8c04818 - -Square = ebd685edd991dd5180706b72ce20ec4f6c5d9ce038cc8768f2ae2d0e676bd549d6d3f97f6c26f6e36bb664e8a7e6102192bccb354c024670085711db30159c6b7badab7c7c0b91925675ece3e23126ea6feaa28e977598a890e4e476ead100 -A = -f5b657cc38fd11ad2f1b188c61721b5ec6c9762c09dcbfac3edc1f07e675bc058e77eacd01a2b4139b1b00c40a6cb70 - -Square = d1b3ac1d7042c0200f80a989e053dee31cdddc835889a57482a0988afd82b0fe8d3667270a72967401c3e8d80dae349ccd4063f11cb24dd7f9a5aeaaa7c0bd7bf7991367b0d7b4d374dc9c5017da81ba39fadfc3b760f68da95ae1eaa2eea3fb040 -A = -39eca1bf5e4807fd6a9ccc9e3138a6fb390b10a330f0027f0ba9868beb77c93160b623de58054a4522183fb3e4e2d86b08 - -Square = 41c5e4bc851d48673e0a16336f0decbcb59dad36959b310cd1a042d24de00c587db47058c2d91d7f9982bdbf470c73f86e591a122b3fda71796e465513e10e3cdbd5e6bf035595644d588c091e23a57cc47b5173743b0dca965902918d61875f88735a59 -A = 81c2caee75e98f1822c854448302243feec55a5247bba948647f12d7e0bcde4b1dd6af63eb1ef948eec22a87d2f3213de75b - -Square = e712c3705ef2779ec997c430f1f8b7689d7edbf2daa733dca89612bcb298180b882cdfe8e5cc1104b9f5d6d8f0978b46eef4f297dcc83fce4c39821ed3205e399328d69ad484d8b3189e207193203ef79b763f5e11778dc24839b4feaab291a0464cc66edbe10 -A = 3ccdebe5106ff5642b4ac0751bb799c27454f904fb72863d1055d1412b2359120ad196b768f6137dce4cb85cd29a990838a95c4 - -Square = b5063c05ac122d0d4b1e0d15c913f70f1309933ba737fccbc02d13a6c712e7b75fa757ac0e4fbe65977f17bbefde31c8fcf51f867a698233bf25bbdb1f03c104dcdbf1173886a48eb5a8b4d27cd841196de0b53466a3f1d28500fb4dbcee8d3458662443eb2aaa5de9 -A = d745c04ed95d4090ed66784339202f9d0e57bdc1a6f6b6ca09337153f0236cdf99b61db85604791b3a373885210f6aade8530c8d3 - -Square = 974463573c968f1734741dde2a800761fa749b553dd6499b920d3af9bab73a87f40c9cad39c51cfabcfa0895f1970281af063d80f89f4103624a75bcb0d23f5ef6c1cd9a10930118e1459ee8732728ceb7961f7d83cd2344a51e6229fe708bda46382e142706137facf7161 -A = -31323f98f0f73fb66e541471774ce0e0fff53d69b2b726480b9ec7b0775b345ec4ec57c4334ab8ff4b388f4c7fbdfa3beeba0f3e0bcf - -Square = 673a62011d769ff0333f69f10f00b28781fece47ddeed25fb0bf4f8d95dde4efff60690076aa520ebaa3ba63e6d445541b9586241141ecc37cd75b178389265224533055ec82a393e5dd61640d3f442adaab917c8fee1f8fc0ff8ca8d577e1d2d976c2a8b873f699aa92c272c164 -A = -a28fdafefdd393f993a8fc1ae321e420451dd0c5071410367d5a911b2a3a668bcae4452e134159e0b1974505f99865cd97cdb020bab0b6 - -Square = c4f34585a29667b582a3ee69b1a5f6c04746d105a57bc92763958c5add45c64b5c1cfeb1a321fc5194aab818c92ede5408afae0a2a74ed4c7757dae0bcc602169a805d525c5a63ca97391a9a7987a3eaf04bc44c89547c5d312f7193fc571851b1a8f8f091849f649ae91e15a050f5799 -A = 3822b607fccfbf0c5be97d4358bc682784e6453c71781fd3eef9d247485211c55d742279a35bf35e64ba8ec8cfe20dc0889688e2bc81fe0c5 - -Square = cfdf0eb68dc27d60840b8afa8daf96bf831002dadb2801c5d6f7ca558256bf3c7c5372fa00f2b3e300287745f8664dcf8e679fa35adfcac93839cec53b349553f31058a4db05af40b047bb367234dd78717aaeb80334f0deabb09d2d4d90394ec28cc3589b0aa78cf227ce8678b8bb5cd775e9 -A = -e6af13779d5a5eedfecb7c4d34009affee1f0bb65934ea9656ed6eae02271ac8a29104439000650a3a8cd7fecb171a7154c0e2bb2b1cb908cd3 - -Square = 6ec1b1333481c37be059ed7e088c862f869bb559b34360781f7263eeb206a210b90321aca198aa41c2a79e3a8d7df4336c75c87ba2ed4b02052a07b234afd9d2cb55413d4296645cd0dc8f987120acbc82fbfb089190f50e55eb1f509c86734dc14b2e8ae42ce880023dc7a014b02727b53d0e5f779 -A = -2a18acca3306bf06fd90da4ec2cbce995fb08beaec6d1cf4b30694d682c83e04b39f9a569eec52782b9eda7db0680165c77a1b0f54a1b995f8bd75 - -Square = 5382be4ee86b9d80dc2d4ec58606ac538ba7074d57e2011346f0dfb9a9d6677fe015e4015ed607906e9068a3c5601f0bb77186a9d147416ac68e344318cbae5c70c437c5e1dfc2d6c3c8725198937ac2d8e796f749bfe95c7fe6d0e460a633be2d86462d48290a2f8b344ebcda2f6ad353d6fd5f3355d819 -A = 9236f7ad22da9cdd8c187082c630098bf3a558b04856e876433c570a63d39863416c9890dd089f7665d6ba073b2ce90f88e7d04af96f1c82287903fb - -Square = d68e15e8a46e001e47022daf63d2b33fee0f9d3dfefe9d204b0de6daea31dca4b287a60827bda9de2860c433b77186aca10bf3ac1d02a204ddf8bf070c3c20ea69d9638a865c8843e8e63211951e10a844f8527345c5bb5417e3301a19c929e6fc48902f0e0be8e393ecb3fe0e9de6188a72d102fbae846d05dc1 -A = 3a973dd50d4239f05d86ba25ee6ca8f8ef46424951a8bb89e7d1d6e066d6fcbabb3758ad9e1647a440e51976c0ce628d78b59a4d9e42fab0c723182b31f - -Square = f03a448bc7405d2d54c0ea1a9016d8757d4af893024e542df80fcce448491d07a4b451d67c9e7d9a6c7c5a6155bf156d3cdf8103162d8e0265111655fc0ae46f4be944fdf275221b217274357977abf64316615dafb6ec84c5466f617c4e8d9ad4739f3e5050e583892db75366a4a7d2c4558436ed036a79084c7f9100 -A = f7fd0a9634d14d540daea21c7b804d37de49b7c13bde85c045859ddae1dd3142994e385f455becb7ee30576d55d4dc2f3d9d82e86032e170da1730b2c8a90 - -Square = af945dc2241029744548517dfd7858d42097076b06427419e74ab08071a23aaaa1f5daa6290287ce8e832a0524ba5581d64abf054408ecf6ed21a4f8289c1e4c7a8087384d268a1ccf7ed40e74922a619b5c1f2c08d810065710046190b7cfff33d4f67e58927477500eec54ba4f63a57532ed10c6b861fca9d46bfc3d32640 -A = -3500a8b6d244f1a21e10de7cfbeeb75d57ffa62e9dfbbdba8fe93d17488c56dc89787f13e660d0d7c7755242f8412d00988bfc7d3f6704782324c48691e7ca28 - -Square = a466e34dc7875aaf945c088bac23f3347a41f7cd039b0c9120c2517ada94b96bdd72d7c9bb55539af12931a3a39f6e09a4cd4311fba57dbfcc51bd17b03905e2560275c8bb3d786defeb131a634e86ecb793867355b048dbaf2db8b654a4d50aace6bc9d60de6934ce25ab58381f6ddbd1c063652e283c30a2dcd61d9d776d60e209 -A = -cd26a0c3d84e83d9f14dbe95cc39e3ed2e8861b76f4bf55ab120ea636d8f9efb0b6198986eb52075108d0a5c6ae0ee762f834f3db802c3f20bedf938f47b8bfb03 - -Square = 9f3f4d5110ea1bad21fae923825ba869a9982b753284f1946edea19f22cf0a49485b9336a2af7df8bf2641cb2083f4dce82202162d85a5779a4394213bf3bb3e47356bfc1150e66ddb6cd945092c9af14eeefd2d08b76c5e4a585ed8ef39202c42dbbceb25697f22f9508e7d954d3c1da103818aa6f63121f895e2c26d3d7463aea7ca749 -A = 327a2f6607c41ce920c14e9c9e8a059a931d71aeebc3e05e93107265a2810ec286819a4b2af9d2b70b754bdab6022b10ee6b81b32a7382cee99fb2bbcf6fe85af05e3 - -Square = 50ac4c46f2014a7a382b0d5ec9db4a67f34ffe9fd5410995810d3ea8d7d87d47442d0253c7eceb1799272bb5f5e7bd63174959f9844e5b4b65b6a4920166d83d01a5c2638b4d3b6db7fed99e28b9128dcb7c10be539114c5887842f8e5a7fb743298ec9642e50bd0979156cc6aea9ce802a0c1b14a2a1b7afe28dba534c9933209f14474b6e484 -A = -8fb585e01a0c62367dfa8a1953e553476b1564e843bdc2c5d964864ab2da56e0bfa7f5ce5b7850398451619a061de02ffbe0c336ecbeae818d32dcd40355fd11a7a3822 - -Square = 9214e31bb62f62a7f92d6c7f1453bc4430595a1765b7223a1e50ec30f934908c19fe82d7bb8ef1174bb6787aba9df1a38a84203630ae9f62e08fb4ac55ed329282315937d193992e9e12adec9727ef91df5a065cc5858062c765f34bd2630fd3f654a8f8421b75dc384477744efef3d6f0d15820c9328bf43a43409f6527dce48a92c3e1ef145b5e284 -A = -30587ef092cb9456caa844be9629d77ef1bfe21d2ffd5625ea353beb1f294e38a7fdddd5bf77cffe5caffaf609b8976756c9eb4908ca77b1630ac0d706503c46177c5d905e - -Square = 54bf52644a244276ad3dac90661a1e21468f23a117a1fcc904c66119d86ce98a0b90fd4096708bcefa7a9df87c6bb85149305f193cf5505802172ef9ec343f662a4c895a9d19edeeed5d91e20abc894948fe59c1869928616392f3694d82aabee325b651e1170006ca1fc355212308442a5ec8a8fda4f5f90b7fef2aa731f3fe0f028143ead04490d78b2151 -A = 934b16f56700b455d5791ee8c119b5921976a829bb5d1fedb201e63c9ebb82afe4e29aaf0ae27148e4d34269c48dfa42131cc8b3b78e23ac3e7292eb0d715247a345c800f377 - -Square = 63b7884fbb6d5521c38f7deea5cc131ec6bea15a362322a8e27c762880836cffb69a069a168663908707bee9d83aad41c045bc84dadc6cd927ad62140f8c2fd001d34f0a7462bc939cc8996e17ebabafda95a73483c70191311a6fb7c670c76c9e2ed7e589e464617888d30cb7793e91672d7de9b3b4b1811b2c009dd1c690d44710bbab832d91f16f9b3564a0c49 -A = 27f17f0865513350381ea1aa1545439fde427ccc64385979bc787cfc4c7e6b624b2c77140da2c4176c55dbe43c506fac14b4cd7815e87f3120330dd3003bee087a371f85d6f4e9d - -Square = 9d1c4239accb286c3c7868ad3b4dd97b93774fd0c65e04ca8dd405c0298ec6d1f52d60be6ddb5f8f0389cde756b49b23dd2f0de568a432fb99dbbd40db798261d1dd39bf5017e6dc74cb9ca91f8b2f892c7eaa28485c04a96add206c7c38943912de065be17b65292db5a144f82427016b5e0eb4ded2e4d0b7d12b01cb0b2b61e5e1bf22dcf1567a8b149cc0ef5299a8b1 -A = c88cc5a46bc1cffedad4f45e66fb55dc4347eb2a24a09878358d40fbdb03e738ca1d54a1d26a777915248fd730daffb0d3b5305684709db0f258f581fde06b11a33a3f76b3fa53e39 - -Square = 789545f15fded8fbf0b4275cec30c3ac65eb42ab8cc75670fbb2ab0b4cd90ed41a1290383b5f14bf87a88c67ff1e04d0f478fb11fefa64e86eae5777855ddeae451e166e23ec30227fb4021d51ec7cfe4ce531c78ba1bf6c797dc73f093b0a5a5aa59ad8de3234808e776d690007c8c332b3f03331dbdbb8645b91552091afc36c28c3229220b1a7966c7cf13db6bdbd4673440 -A = -2bec94112014c1a506417e659157192dca1df58f933510d7a8d6f6feda5031d799a66d2746c09f827199ad9fcbf11f323a636feff5806c9fecb2ac684c2870d60c8a72358562c4eaddb8 - -Square = caa64c9f6bd66f76c99604d1f2b8a29a9a10c0d6a41cf32b5bc40edd7a1d97b295c63aa62c30498f15d70e427d5612ec3f6a2c1f2997fa9283f48018435fa6092269dc2e4ad524cc6da9689302f5c398d79e2b2d19470ea8240db9df0bc0bdc911c4d53f4f24a7ce44ec76378794d16d367434b4f8b6184c7651db77fcbebb8fcc5d3a51ee9739922cf20d4a8888139fe4669a164400 -A = -e3c4a10a64b7e67d786aeb81bb7ea14655637ce963f46cce59bc0cb6b5a9cb9c92afec3d527119db97bd2605d315cf28198992b4b2206e5616d3c560bc8163f56cb1f5626a7ac6d8427520 - -Square = 429e4283af7f895fe732ee88e4904348ed01bf579a93cffb7aa8e135d41cb9be218f8b9a9cb4f556124105cf042de51f34c8162fdc7a981de88e005a014149c955068e87214c174daa40fbc618c536a6e507ebd313763fba197059d68c69bd39933d614b2c32f235cc955e335c4a37b9e98cd7f98c7f26ea2da932c7f82ffd95be22a7741da423123f8908cb188abc26afaf4ba6d47b56e11 -A = 20a5e2a911627544219a1639c3321bbcd6192a32129b248cf62351f85b7a719cb275a4e44368a74f4d1a307ffd27ea2cae4d8584a57070609a30fb4e365564908f3d501b53c1a54f0e37745e9 - -Square = 9bcc8d423c3fdfaaaabe24a910e6ac3619eaa15e23b9f317c844d39d164c952fdf5c4bd270a83f3902e54d3817fd78c96018a706c1f652025dde0b98afe35597e0d8782deaeed23337ef6b3edc9317d54e3c8a57e4e7e2695f9d2681bf82927bab193ca1f135bd0e542696772f08520faab61fb4ea6ff0d15bb91f21e68bd7f084a6b8f24a47ecc30a779ee86610387b29a1de94de517f81318001 -A = -c7b60f4c355f2ca3937ba3c124eea2cd8d3536226a44afcaa3d17abe931c09ccaabf25a1986b172fcf46fb02a0fc36f2c163b6e42cee047c54ab05e9d30f03f6943b9fbab83aa6da12d7898c001 - -Square = 45df25540de94883dbc182009c29fec43627d3e5758e6a07cf40064e0befa0df184528a84757b445dd079c2b0feded48b651ab18b4bede2a81796be45caad0125c3692560d19cd9a6c8c0de8383fea0bc1ab46f6aca4e9c36b26575cff88fdf1eb1e13182308295457374968fe3a9ca34c6acd24c753fb84d41246614789dfe154faf34fc684cd15035dc9c1c6b0ea171e089e0f3236840e355bd123ac4 -A = -216f8a9a3e54d4afadf368c2693743efd3eaa4cbda7a87cd07f5b1a713eefd2548343e7f091ee4d9d6ed1d4343c06a0597db0eb5194b91bf2c858210557a8288c1aa7b0e0607a24dcff9de04146d8e - -Square = 5cc707d97eb107c5c40c0f19fd432cbac9855f280082802dbe4deb45bfd193ac7a9149fd12c4ae6e9282411e2f1f2ca92135424f215b800634092ed4ff2859d16ab9fb8619ece41b50f8888d3e13773d38789e19158e18396096dd57fa5470f50b391c22378d980e59b4585f013e6db52c1e24c14ad83262fd37d42f52323896f7d4cb3e38868abea8a07e7ad3f90512eea001c5147645bf00396cb0e7a553f1 -A = 9a1d1b0beea76e7f32bde9f4f2c8bcff9094db2d32c04fb7ff43624b61033646e482aa0fadb9f8b4225b47121070b4ee5d6818d3606ed775aa631e0ed42da68c2a09dab26b6a4d09ac226cc09321fed9 - -Square = a32fd053eb90c365e77ff47573a24add3b25b4c301f4c662dfc1fa635af8e18e7947381989b37a9c9de2713ca438b9f85890b7b160fe251933aa7dad1c3839d502debb42ddc927fa0e9b40c80dc3d408889be567699a856b1c9cf3a393b3b818432e95feea825c17d0981b942236b3779f2acaaccaf9a5817ca47bd03045fc4de454d8f1d4377e218c5f7ece369aacc35369ab57a71652dd42621491834119afbe729 -A = 33190b787a2c3327b122d1f5823bdee5c93b19b586ce1bf79d801a19b2558aafc8f6274d0908bb7a8362f7f71d3fb52b8ffc87d458249caba7af3a516ce868e8a620e3126ad43d6aeffee11866fe77677b3 - -Square = 74215d33fa398e21c34034af6f9c7af6a3e01982320ec8cf23074a938f1a31543f80e6aece01de247668fe67f276cb4411db27666e1dc8fb2bfa4eb68cfd3563167d1ac4efa3361f920d8dd0fbb7f06362167f5ab5ecfb72956c20db934f67ff1c75aabb594c853fa61f43d219a3f5d0d45274005e3b167cfff5493b0f26d15f85d8e906a0a6e7645eac1f40c6dc637e6d1e061e5b9071a1227469cfb2c0f17ff983684100 -A = ac6c0b9c69785f35dbe244dc85a54313ef836ac67c853531ef5db45b28835ffe61dd258c5528b0acea50f5aa5c0f5d08dcb8d82ee19bc432fa8a45badadb50693fedc1cc79a17d63aa73fe9597f1d4ce8ddf0 - -Square = dce5cac967c47b8a58ed6f1bb1d1e6185e849400228afa2bfa05b9c2dd327b04a86f2a4da2d02ea102868ea0c4da0f3e5a40bd02c87a08aaa5cd8d9358b3a5ebd8c9fc2dbb1268c261f46d6717b0307b993deff0adc8190d32b4f2bf695eb2cc74a6a9a712c5a621c673219ff8a24ded0997508f8f9eb1ea872008c46e71fa97f55b839950e63130c38b49c0ce3ce724a0e8faa9738d2e28ce6e7fc7eab62b3561d2981f314f751 -A = -3b735400064b15fad81b08362b8557f8318c20656839ffb4d2513512015036ab0039442032f1cf515f8c10c9933afe4206a2f309e933d1561b06bc665af2f04f4d064e073eed2280053f56cbeb137a9482c0a077 - -Square = 6b619bcaf632f0d8b1d715e8850c0cbbd29ac6373a9a5e93dd1bbd2b82744a8a50a7446b48c6e215911ffafcda9ed7becaf5d26b7d6df7dc8798d53239f62a482f974bdb654750def1c941c49a24fcdfcfe73881b556a7b528d88daeeaea8d62b357211a1946c81cbf0819ad8d0188f60aaaab4ea2dfef7e9012ade7abeaaa4a23d7403c1248c36aa26b43b8e7de8a5aea639a0449f50359e9b4c1b125a548383af33703f8dfbc2528e4 -A = -a5ccc69663a8712c15f96e6fc746252af89a8c2a6317caef905dd2d8a6d4fe878ac7aa66cdb3c3721ba7dd36da310753dde9801b31d759339ac919a464ab52541bb2e0dc938752bf0f1ff7a9524eb98340d62576aa - -Square = 77ea5b715823045afe13d10416dfd46a511141a7d1279ebd624f1de428cc04a4f246246e65c3f84344cebfa32864de9264b2e54d4b3010c4de9d3e6a27aae8f5f9e9d8e49fe26b73ac7e65bb216aa6a42db36ac03d749b5dc04192df819631593202a58264714628686507fc5655f169483b0ffecf45995cbc12faa105895564d287a9f4b220947d6c93786c85b2ee84a0a29183483f7c241d6a67fd0b1c38c7f74421355a14c6d9ed5720e24 -A = 2bcd67e6bde3f54c4ce0ea428418fc5c97272217c6c7de90549238ee322810dcc1bb9385967673aa3f9f5a5c05d987c6445135cf1efc26b3c17e55b93cc052761a77c9dcb5c22927b09e90a92e053ec1bc799bbe7597a - -Square = 40d113460ca3e70545bf3613c2ba5de5d8485641ebf531a43b6b8bb76884ff4f348727ac6606e026981d2116ef1e60d4b37b44ed7e2003410d7d636b58aed2f92e962003f28342aa5f059d23b3d58a1ddfb47833ffe1d1deee0a7e78b8f7d9d6487f22376664f1ed9ddb5ee3d17f43afda296bead11680fd17576a122c2599fa9802ddd84a2115f9fda03aba898f66e303895f452077c920a322b6aaa0965f51fbb36f01b1d412c6ccf390da050d24 -A = -80d0699a46619db033461aa6060983def7deeb976d1a71f5c6ddb85e8b46dc70b7ddb1d254971d38ca87c7ee3905e63506c6db105dd683375f4239523cbf1874069266c2c0f4b37edcdd261c51088081d25813758bdbfc6 - -Square = ace99f98cba0d1dc1c758dc7211aa4078a2aeb6d3fff19bdfa6981ded0982b15bac792e6b542ae48a86f9b40c6de937e402e230fcfc390b10c3e60202dee1337ab39da7a342999487b8d8b0e494f2809cd1bfdb39209da5daa590f78ded211b6bbd3fca9013300b951d8906c9ce8d1c0dd9554d5d1d352f9784f822c928dd9700ef8a5fecf3771966abb1dc6a70b301461eb6b6087d6ab80a4b624205489584224cf6578f75acd8091fd621d02306504389 -A = -349936d60c9d77a0974dc8985930d8674976db6b3cbaa067554ca6b30b1de33f2d4e1c9564ce102ac6387755aabf42916f63632a375d995913f9d45ebda54bee3fdb7cedee46ebb5c8ae7764e4de323c17c797d3b529230cbd - -Square = db6c73be2a59bdd35dd312240aef18dde4231c72aa28551bb370a87dded587accec2279bea24c930236f06f24d537fcf242497aafcbf72f085fd3ecf030cd750fb382efea0f82ad9d3195680324d73fa99d48802d085c150164aec0d29fdcc3262264bbe72311f89989cc71a4afdac6ab103ab4fbb6e973a42a1f8711bee463d198f727dc7bad848ff8fa77cd3b2f612d142ba46e95bd79a86a1fe4c2b8f9181be84825d05989695842113828a83b826e7d2c8c1 -A = ed01dd49d2e5d51fd30e9c578259cf107771b4ded6bf21f8b9b632fd360e34da740e0b1af6b5a67789fda5a44025af0f1547271ca8accc7a975d98ea7ec3d41c9697018d84ffb5d49b88d884ccdb011f715a199ddc44a4109261 - -Square = d6e38250ab89ffe11abaf8c5d07ba11e9053f1924ee1228f834111af16ed282389d04330cb0f47dbb186dee577aed82878ecb065b759312eaf167c4698eab5ed03a8657341bf5fb14a8e28e3b443a6b657c1f4379ff2549498a33922ea84f1fb19d10866fb0ad07ce1cc44c93cd4d9ec6bbb0e61c797750c6b5d7e8d55499655dde112f4747798f0e985fc2b937a44da9b04c2dc4b0816cfc57da1f80179db653c1ce287e786ed7eff7ad6d1383fc6de8c941d4af7bd1 -A = 3aa2e696ee570160b2a869c3f21c3f223959a185cda2274feea1c829af2234c70a504c959bcc49fe0313f4f5ffd27448e28aa0fc6ce24f36943d334c626459d7e6017339e787ab074879ebf697a93ad93835d69ab09294d007a0837 - -Square = fc39360cc0fe040b6f8340e0728c650e5e74cf1664f7b301e79986fe066f36e8df34d38d1a06b74a1bdc76867baeb3f39a9161acd200bc7532fa4aa0ea829377659646f073db82ee044279ae5fd797edd37d3261970819589853cb320887a085c4011c23d0da9b6d6f1b5911bb3399146c2912a967ab3b3f611f0bd52e00f418e6a6f0297fcf5c4a1f71c6bb8cc8e1c76694bb7301502d1d00c8b6c05bfabbf5d350590561abf3e2b1a82e98b56583e2e4e25cf707320a0e40 -A = fe1acf3d7b54e718c901c53f365894c22c8bb4182fee8a4c2558731e01e1519bfd1bf6e353483b8c4219453fa66f06063c6c99050068c15cd13cd1648ffc42b5badfc70f6fd4a0a5552fe637e54c4f92ca45c60cf9a0163978ac08d58 - -Square = 9abf1324ef65c726330f64643a024c466fad37604f4dd3dfc404d31c2a430fcfaa0c78283666c15a094d494b96d3c12de6e29a34d2c99f4f8cae8217bcd2a989d59807ac68c46d60600238a86155de499eeb35642d0f581045481b40e4f0a76905f9b6bc5b9585f77f8410b99333f7ea983c3f29f3fe66ca7b793b784a5a6a4f74512aa4385dd1e996832b1f41bb3af965be58c4ac5e867cdf8dc6a4f9d20a6f1e16e153fcbb45ae5fe8a798cb06a4ffe467d6b6aca2b31f335a344 -A = -31c243593ea611dffecc65d1439db345b2e89941113f9792c91a76b4890db6e4dbaf1482ee812e295d27956e48d07a14de38357f15b5931c5cc08d1d248df7bfee1cae5b5ce98984c5043a3e1a2b449ba1671bf1cfef91011e12bab94b6e - -Square = 66aee3e4f43c672e0478c76e2092bef33e7c60afee5d4c7defbcc5c0c86d8fe956c90a740cebe604224cc3f518463b1208699b8ea2316315474991d0f120ae905a67028492cf46fff2ae244869db2a02d06aac6ac6eb054fb3c14c756d8a3e7ca64f06586e3e86e4477f185ed527a8aea6a3c741f3fd4b64a2ee77ff140190260c431cc53f411fb227377c02f85d0258a75bf6d44dccbb8bd04ebdafa115dd55b176b6eff5567e5b1bedcae15110826574053681fe25a695ac4540186e90 -A = -a221dfee30286adc076673cbcebd24a41a438a0a7a6a547c75d33149cb1a094a8425feaa5a23cc234a722db4cca8d5912fe1dfb6db4e92bd87c12f0d06b6d954fdb9b172955412b2eb5c9fa3b4df2933390384fd1f929a2b1a8dac479ec94c - -Square = e880f8655b51739e34393c3e6d69d63e0256b1a887f7e69f40c78d21133b17e92277a136f5e37da2533ed599efad189975d22ad0340005ef58db0b471651d749dfbd48b3f7b3b8a42d4677048a855e99dae6c729d8bd7eef86911feca9f5490dd216b06d9e8d1ab695c1081e72449baad28dfe113744853382901e6bdab5413c67c52d6cbbb2e0bea711edbb3a219a4046e8739c04729cf8c8210028dbc4087737bc6c1d7e0c15ecf16774690168342b1372d3646d4d8696384bc932144c98529 -A = 3cfe075d4525a3c780d6d05f7bb708b2fdf7277a0f9967e0a209fee9d42136a0bbf98660d8ee8cb4720a8042da09f6271c45ad13db24eaac465f8207f78629e9085c1c890675f441c78efa38e5022b1b80afde5e3fd08e55648f2817631eb6cb3 - -Square = 8d6cf4eaf58099b1323fc598b7554b371f4afef5ab501dd162ab8429333d46916fe15dfc4ed6a99ca7fa7fc1aaa0cec3533b41e291fb7f69b560259507226eca87aabd07b1ae2eb93bb53f98fec508f051cc04db4a172901e06b74229c4fa3f550a81626c7a63fa99d41e46c2cf792287a5cf7bb68946971bd43c7c0356312cdc25e524665dd39a24b6464bbbe64fe8e87ee313b860639728a9143c3a6118bc8b150dde6c10a13bea637fa8873c393e6338319c506aec6ee973b4b52a272a74bb62084 -A = -be46a8072aa44b3bff0f90c81474dd576756fca624c15f55a17e1d0bd2842467ae000b04f79f561690c93ca7118ce17ecf830a8da3678c15436876d2a74324d9714dc8ad8181904be657d7f1da3313b78448cc06e32299a09ed59bfc1961e8bd722 - -Square = fbaa4fcf9800673fbd3a132305ed3e14f4889518fb56ab82aa5e9b3529b74d7f9a467626d68f4709a2030264aaebcf05c0a0edb511e81f357d85b79d925a24605f1bcd4645915bb75d363654b676266329df532cdb39152fb360df1b9500e0c296014289650ff77faa78a604397a82b34d16484e94a8de123fe720e514c88f11ec276725111563db91477480c3245542ec6bd0bb2f4aaec02c6c4eb1769030a31b05da3798c224c9117f7c38d3e98a343fca03ab584ec2d7e6db60fdc4273c3d8e23cc1ce09 -A = -3f74b25f2a9c4d8d977e69a4e067f9fcec281136a508e365b282e5fc3b1d097bc6a0f59f7827fb90d4890b08840a0a1919032c67448f8f1a771f785a0f125a4aa4137c154fdb489dc1099d57bfcfc75f4ca5e69f93f2bb87ed09cc0dc620d3e76ecd03 - -Square = 5135becca97d93dd4b16a5a1105ba3a3e3fe02bd6a7c3cd182186fc63ed4351641182a2727ab6715e9672458dfbc31aded4781fa345054eb4c317872e2af6d4ed64b2ca7e8c25e1e664b5349df937118632a64e4ce439ffc625a5ad3358270dc83fdfa73c7afba03406094fa36d87517e5e2e1fee5526fd2dc00d9210a0f6c3745b3d4bceee5f8b03d976d696c57a09d1e08e4ce780972eca4f2ed6500c23bf5782c31f13059e48246180fd09db693d2fb5d48d51846ece8beee45cef7efc87c003b44d7b137a900 -A = 902fbe2127354a7df5cb7fd057f3d080a7bebbdb83c86a50560b8c287a37a841bb9c8421c63d359078d2948b6b57559f98fad8f8014f93c912cb70a6701c4dc4fc5e88aa413fcfb685c32975a8b72424742eeff8262d28cebad00c5fcf88baeafe8f6730 - -Square = b5976cf6a6560412aefa6704b126e0d987dfcedbb4da436c08ce17b1bf1b6e0bab9f934abb5c4186a5415fa38724fb8fa341d381319e7d768209ab108c8debd99075d31deb3e03ff7d23957d4f3204d543b7d9079cf337be3037b1cb4908fd8c104d92e52f041b4cb27c045a741f4d64009980e8d27af75d9493920ed98c7234777592d6577f2d1b3a0eec645ab4cee2f28d9e4efd3e4514db6796487ba68a462fa0e316e1420d6604db2b901de46553546cab42976fd0d459afd81196275cd88ec4dd448ff331bb35499 -A = 35e700e034950bdd7318d5b3c17e90a4772ecdacdb055b9391b31538eb823fc8a4599f029e78e4fe5299ba1a423a449dc257a431d189dd5dca275c02cc1f12417e111c73b731631d8a1741b907dd8f24de226ddf9e3044cf4064e8e51ebd55be774be7ad2bb - -Square = b7de0f73397893a97928e266bc56299cc8d43b16a251992662646072b58fa578ca80f7be1e12619012b130e9514be803dc166b12ddfd26f558d36c2053ee6209b01458379e49469753300ef20f6b3dcd5383b121861c76ab25debb28c448ec33a81250d05f7eff80a5a4133d522d270fab29f739b607395a77278609aa5e1a55ef58d1d48492b71ee30a24a6505aab1a3ac22b9d143c9d6781fae14bbb980fe3a99dfa9a1a406611d7d0304493342f53faf5fd79f9c96b9583a219a1b22aad02dd58f32ee98146b3a8cf054bf9 -A = d8f4d3bcfc7eebd7068b851858c3668ce062a834927e165679b49132d4f780ca682876c65c7cf2e7ce34ed10e43696477da6301d13f92abb8c76e2424c4bc28a6565f15e59563d607b852dc946652b68fbfda1c3200ecc2976400ce7296b96e75fb059a4c8eb5 - -Square = 5ec02661f49fb9807bb73debc3c6eccdac1df1735e0d61fa7e0eee07471068a5809796a2af490c46a77d61f618b44a3168dde67aae1cf9e530382411056958d55bd18f0e76fe2c31c98b00f87fcb7f5691ed5b65424f82204156dc361ef6dec5d44cf690582599b3994ee47ef42850d5d2370a4169c5f73942657f85422ca24f66943877f73af493c865fbeb29574cc1cc730e9bbb097b598574f6b90257748e950bff867bcc01bf62f8df67d7aee1b6dc1d5db88826e86a3f9fcd8663e09cf8393ee71a09c43d0d38ba6ef643f4ab1 -A = -26ef9b6708a80d00f4d01e0f0a5546ed217085ff23519819ee89af430580ea1f086beb0eb51982682c6d3b922a2c92752dce63657836223a9d94964bd584bc8e37c6e30fdcaffbdb128344d51a92705e1c9f94205ca36452c15a08f7e62e0e02479ecd48085de8c7 - -Square = f6364409467a829abc2b13c93979dec84984caa12154b7cda2f4c8d91bf24ad7c45a968ffaac8d6722cc26e6aaf52dd29ea2f09370ba46d79684b7a06faedcd17136f35a58e5b550f3a2caef7b195d8409914fedd3c3154101bd735155098e8b10fbbb1b2e13555d2ab5d5b52b203d4efb27e498b240f37178f2e89b413f94859b0e8b2ec10b926c8c0b6f2937ee2d0355445364841c7e0539f7073b88c7d568edf1b253f3c10627e22c2ed731b7d4d199449cb0b5e7a66109932fe2c9cd741d75170deb9f98469049549c10a7a622bf6e91 -A = -fb0eec3246e99212879e51b17ea6615275818ecc5ea3058b13dbaba2576ef90e1519e3629b09fdaeb02661091c395c862b848f6326b9f536f7af45718c4412f09f19261b537bca36742d3ec66f964343516aae2ac27e249a15beb545b447e37b4062180f6c82809429 - -Square = bc4193ecb5dac900191e02be06297106155c6840c4908fbf6e41e9aae137d53c3d4ffb87f334f49837dc4ab7a66299994e4f5c9bf6ea03e7db663bdef066e94c610580a8896a9ae9c8f6587eb83d789683f5d6391bbac3a1dc1de60b4108428e6f5fdeaed6cd3e74fa01f85c6368023b61a413b69b14276b66f22653491e4f25790985053d075387cb13c79dcf963b6d880d01174314921afe1cc700c02efd2979dcbc59c417a6316db9ac45a2d60d2a036571bfbd75f9f5e42048ca086cfb4b818a9beca4a6e0ed51afa320ef3549151fb39e100 -A = 36e1f16043b4c9b4a304496c39dd63459d6521d2ac92916d348daca3f972835973fc8d21b07b09d8f5e3197b39a8f3fd0011168b815d67c48143c413e169ffe0f56ff2cf8b6596bd0a3b5b7a6b9a14ffb797f350b7e6aa7020d84d1d1b8006850139795abe2c74f03b8f0 - -Square = 4cbb5bc1dd7112326e2c94581f19efc8fb25339a299fa9c007114c3a22b395e9d39a8ffe21134e97ad1b87b97e667ba48b2a40af61afc81fb1e20e8e38c7ba666b146016af4dff3faf5de306591e5ce6eddc1173fdda6fe241a9f2fc6e054c41e56d296f8954377df0d140096b9e9d6a5a23a231db4dfab0cabfb11190c7a0d1c55ae35203836d433da96ca7339682bac0a7edb8b5b4dc267c6e83ac9b67a0d0d564717ee3c20aaf52c0a750f3aad94a12537c6971ee009d0f82ff576e984b06c7f7b357f5c049454e31326b952af17aa62104780e9ca1 -A = -8c279ebe466de3115b8740f3ff9c1f605b4eaa75512d82fdc8ca5ce84e11a68688154fd603ae1d607807dbfcbb822a8dc259098842c6a7b7ec350be29a3daa20fd5b093a56692e9d42e7a389c4ad2122a74205f835e268c9742d09ad36238c34e143f6e2ec69c0f490d29d1 - -Square = 4f771ade09cbd1a033d2bfc6036fe46ae6c12acc6f2b9bd52e7781693fa6358cf93089f23d1f0ee6fca476a43093b9b52446f3a7abd72ed0ce9b562dc438822ffd84bcd898ef9d092f1b0b7ff89c4fdb33d8715dd4a0d68ec49ad41338fbb62ca87867d847a4d99310641a37ea78b04c85606069d0c0950484ddbeedac8ec6f95124e7fd83da4e942d40103bc14474f5cb125fa0b06cf167f076979948003dd8dc3711923f5af5beb5f56c0a48ac0c5240b62738c1cdb06b87ac3dfa17befbe938ddc7281f6c248c41a1c7b99b93f69fac83a46eb298a9fd8b9 -A = -23a845bf2007ba8480e3ece0a1bbaf8bfccba6bf061e3fe1d8bcbcd6c761e650891c0958bac68618a1f55b27d2bc6e1e1b50afc29f58e2e034bdda8405e5378cb5bff0d84efcb458c5428fc607597d89d589d85d90f3da4b89a64c9d1623b98b10518a6f2e7d2295c37527026b - -Square = ab45d12a4e15a294830741f4b9d4a14cc7dbed1c3454612047f890211c749d92ae0418f11cd44acbf1585b1f7323b33ac9a4b13c44e1a7e31b0dcc1c6dd4eaa12a655b5de08f3b948270a152db7d9e04dc54677075797bfad6a9a0e3958458d40e3df5e15028954bae99518de4dd3adfb2ec4b38897a8a4e4807849e1416aa4040c95a0e49a8d2889f6fb0537875f87516c3723e8d3b46da8da855929c67c0eb83daad62ceced52b4f52d2bf1c4e34f26bf16aa7da3afe0f5df76c0858ed98f21e1fc3d01e1572715b774bd5c2faabec5fa3fa59a7a1f32565a4f1f9 -A = d164d875e1f766b4567e9228241213e69d6b6c58620600166fac56938c5d9643932d01f1f4a2263dca4b9ad26dca1548e4b5b7e27581a63375d0e624f4e4c99b7fb9aeb25307c61142760bc4771e48c7ce38f5eb2408def632096fe40b80d488fe17a455d80edfc1c23c429775b5 - -Square = 5ae4e7dc5727543af39ed3d5e9ac086d1a2220421231b82f6f41caee7b9815b4049aea0d43ff499c6c9e1f226f8641351d03f37731c64686d9a9ce68e9234d6a762efcffdecd42f81044111599963d9b6873cc20bf4c8284fae03d2e4f238a14a74df4388fdc80fad0375a5d0d974da7854ede5896ed2ab25d2b49a3c39093600f73120e4fd2faf75381854f6ae80f81b977f62fc72f1fd01c278d183544052b77bd753dd88ffdf5c01745521fb8474b5c23b0b7dc709bafeb91cee0863a0c23ad7192c43cf15fc181d629853cb9b8334082c915dd3d04e3a0a81511d2e84 -A = 2622a7bf45ccd3cd567c757f4c5796b5a0fbca555bd0ac2759c24083172d82d6a887dcf93d9788fde052cb20a8963cb6db22bf5eee6151600f9d1896a7606b11a1b100cbc0925bce037bcea57e361efcc560a9abc495d7f7f45831c6429ac8f979dedc08c304f4da9c0d4d687376d5e - -Square = 473cc933f5a650a4ae358c7f486d325c0e20c83b54838fc08b6ac3ff010f7c4b6a609bdf472974dfc5abda0c6b33c5ec7dc4628d85cb4276108e2b0bc4e19cba135533b3d7bb6a94332aea3165dccb230860d2353166b9905635e606185b014730e9dcf2c433e18cba83859fb2eac4aabef68c8314ef86dec2d534a184ebc4cb193643add0897341690cbe18bc2e775327fd7d71ffc7ebc49bad83cd68394eb276b2e615ec430180303010a454ef73b6a8f02bc48a1fc8a32f8150ef1b733f07da752b8e808000329f4924976bc8b8573927f18ca7c88c210845de6dcd0dee2904 -A = 870b2c4b054076d0d02877b19fe1210a8fad3422b00905a6db748239b8e807716ed9fee0d8c25496593717917edceb5db57f9960bddc1956b6652868d6ace82827bbbada5ae8c15efa26fda22657126c6300906f90e8fabfd58ddf312ce0eee760e0090fac44f00378c676115cd0639be - -Square = b151124402d2f04b0e6599222d380dcf67b9716ef50d2d9ded0b21521b34a7294171f71b41762511b7cca93d9f50e9e30083ef19144882928011dbb143807d1b88c55eea6b19f0c4180023be6da63a59b6bc027aff3f5abe2f65c73b2de1e71c5f4b248bc4547040764e83a860cb3f882bb8b5f7821f92802808fa37c50f2f94d8f56daca841f42d3362762ba843aedbd03d3cdda887f75ba92423965ab4256eb842ad755aa7a2af331b488186f891065b07f5a299c807dc24fc176e085a8024bbbf12f386ef49ccc91bd4ada0936b6de78088cf5952ae6c04f6916799378bc0ede0da4 -A = -35439da9e361700152a35ebdea253378a1febec5f288e5b2bb0bdf25b84751b47e4da5aad7453b70cfd6640d5832237d2115575c738482ac6036c5fc21a981c0a7f979c8d621a92c02166b777475618aa6362a0e225dd6138ead3b2766ed9785ee01e4950a863d2fa0b7f5cb4c9a108bb626 - -Square = 4ed7263ae5beb0069f24318b38afe951a5a058a2e960e67f086c9680d0cc6d713f943812070bf94152f7926bdab9e5908941261244542b832f458f05ed5dc048c8b9eb84c2a85efe717e257796b4ca816948a6c8ea209c0675efb2fb5af4622b44e36066593db01b17f4dee21d7c1337ff41436cd0e5a8d01e4030dcd3d49839e59996fbbf1d39bd205343a424f2395b4d3eacdeb9ed3235d8df0dd00a2573260af63db3116a7c65d1dc69684a05caebff34e3d2cba9d4869a953a7b1fce10ebd008cba021008ac3187bba846abd7b39a1b97c9c07d8080549e313dd58b716022de3c1920329 -A = -8e1141dcebae61d5c4d81697f001d792ee2e847c589816f923f0ed42bb4de0d8f911b8ca47ffe77f80b9da6896a9b42f0030a3276218868bbe1a3fa64fb0a577704339af5dd82e66780da6f58900da3f1d75ebfcc302f78ed66ea3c7a737898a29b1f2500686b43bae1e6571addd2842cdce4d - -Square = b09f5e9472cbb75070a67d025957fd5ac3be89c41e4acbcd5f75780ca459562461082c3f19c5a4a416a668b0a55f31f74cf2ec44555ddc43fde64da0ba781adfac4520dd0f78d04d9d2fd33d8b49c72663a6bc845015523e2e4e7ccc69e5b748b8b891e4089420bf0a3f6032602824c7230b5ff95f85a688dcdcfc890af3384710a9fe32ecf9ad7c6cc5761f13079b19d7b2906c7e63c14b64fc88c6f4bd7c41c0356c777d35c3626d49db8cb2d1e89ce682c7fccc3a459b08c20c4e5fc3a8eced9b37d01bed5af6ce9baff0d2b435e6e62871fcb20cf9ec10d1897a5c76e73a441e07fbcc2d9f4e4 -A = 3528e6581de547de385c93ccf1086a17614f23356a918b25bc6d73656a2302b318963bb679c9a93357f4a4f614e74f2e5e88e9c8aed8a6fdd8434630f664ed15ebb6095cbff1593f188a12f4dd6087a85b202f6c24df68ac3b137406c88c5098faf47d1eeec0743b35baaec7dae29b5a44eb09daa - -Square = 5d5dc40783411475a4aac7c1a1eb760f76fcc6ec68dfebb754251cf499870654cd309422935ec841e6be4f5a15078356235c2b8cbe1ae755cd6d814e811072bdb76156b83c7d2064a202ff90af1e0f88f5889e5729a3cffa9faf33c463b74d0ad21fbb4473d4d3ebfa8a52e9c209ded5ce5131b12b69747c365146fa17ee5810e0dbab992f9da28b6c323062484d62472232721d608cdb9b5a341a677e2d7a6e5a983247d9a4001e16687b489b10b18bbf205f982b7ceee27cc3e9c6641827ab7952373f15d36e5f177b82d7eebb3f5054e12cec82c5f520a2675afdec6cbf6235d358c2fe73344002e400 -A = -9a9a19fcdf11bba84b0395088c5d187d84d69b68b77bc6418f63c88bbd8dbbccfe02917d814f9e2241fa0709817a0c85bd554fe887babae7439d96248514c12d71587c906247b3e965e954cdd57f1e51f1979f73c3237509863169efdf281c1359488daad3d9eb990a50ecf4d3fd25d4820077832a0 - -Square = a4d69ed4c4c9c08116ec5cc49ad458f0fb2ca00f356aeb148f18037bc49621e14820f325af39f3954bddc9cf01de7ba1e443088545883a94c04ff41a7ed5f65676109c5b711b4115775489667e00aa1b77f6dee5ac5c1789bc71c9fc797abf41c7c5ae3e2c1cf82d5b49b6c0da25190dfa9360b99b2f63444d21ec6114038b8284bf598eed24a2ab2b9802d6edd5b0fdb52f60621a87a14612844ffc71ca98180ff0915cf75f47432f73d28dfd7a932a125095655f07f50722b1673df2cc4f7566a1c6035792ff3f02356b9b9d25e905121df768dc6a1884cf5483eeb813c1c009fe4ed043febd61800ba978a40 -A = -335b12e40bfe0b847ed6ec143490df33d2e64ef4363869cb78dec008cb5cd66ea671dba964a53e48267da288ef4040e06371e1209691b81df02f2c86a79cac85fdcbb6732a1e5309fbbdbcd899fdfed18518d47258c9e63ff7f116ef4a8f5c4867aedd907ccc7d222cf8087afebc108f2a0f197c717198 - -Square = 74dcdacc1a4f02a99e3642f54f9d917b117d2ae8d9c392f8b6dee53fac66ebe1680c8e8cc29f5330e0eed3f63d10980060799bc37b34c93dd7b384d4ba30a5b5d42a145acc412ae838d7b9b7137637546d1118f7cf3eadf88b785f0aa01da8638f027c56faa16aba8591b64b45dae6138c9a40309b2ad29c5029a867465f9c6de8fbc5fc4b0442c8a8946272667c7622454ed6f2a236103bed7697dba20db84b5154ff3fbc6b4b9eb67ee43bcaae741d87ee2093ee67defb8eebc4a4a22d97a4e2aa7d4c31a1c88abf4a440ba4e2a5e40c4d903ba5ee4d80b4e8dffb8864bcb9806e015c1ce16490068df87282393111 -A = acf70350e554732c1972903cce269b215e985ecb8d6eeaa67fd5398d0a1b57c0db63368c0f8c2288c3a0466e2b3db081106b90920c46462faf00b5bd654f7140a689b78ef656a26b82af8dd1988f166ea04e9aa777a094d892bc7da4bc7bcf0618526f496cddea6d67df7bb0de9e99a35a0b1b210ff07497 - -Square = 9668b9e40a8bdde3c93943a918ca71fa0009cb05a1f592b2bb2c6c6172b2950719bfd80cddaf45d044cbb6aa99715046088f40ec6812945885679231c07f4200023548ead086b834abd8c8f8294db28b203329553242fd2f778ef5cc5ed0b48c7356d8c2d782a01809ccdb6b012896617f11d963300e7bd38ff512829514d94343476818ddf9d712bc70cffe7f767a9fc75a5630e6250ed45e6831b4660eb49d47dd1b8b6a0dddf3fb3ff0e12834337f145f741f70a2aa43769af50f099e004269ac47fab79e060800dc74da88141adbc46c15c7330931e3a2bed9b958f78b30214f81a64d121f96fbcebf7569fec0cdc6b11 -A = 310e7a40667d9d5dc29744b123cdf6a663a1b995f62fa9d4d853cbae0dd23669f4778bb2040317ebf6a06ac6299b21067aece5c5c1afbe6e789d656745ad66464991cada0eb237c6ffe991cac4670bfc90eed5f8c75073f4f846ea244bca0e9502ff56f8e9bc9b6caf275aaef38e26566fef35329ca45392069 - -Square = 49e677c8b052b7db97542948542449af47e14248021f8d3d3f92b9af41c803072f71050f16dd848aebb270affc47e85427a7c73f227f0d63f140d0d293157af0d972eb5b38de494fbc78ad3a4c3d1ab40197bc4427752b6102d1ced6d6cbc9d7caa0d1bcc57e708535822180055ecc9d9667e0590274b778480a3720823e931ff6daef358b1a1a9092f1f05fbb5b10ad5707a124e8be63bc696f083eb74e5b4f0e3110de8f297ecd30dfd2bcb010dcad4e387520d3d00365fc51c2a3dfe064b1ac77a9295f66beffbe5dd4333e5cd823b0f36b0b94d66507b1d9381060980f62f38a62e38e5a75203233bb8d64089bfd100f3205f1 -A = 898b5f3655de74cec3b0fde2ab03fd18cdbcfc3eeea48ba39317d26917130c2b78e05237cb0454ece268f091cab699fbcd51ce341b53d6ec0cda5d0d5388bac25c6517214a39d03450ef8502e1675bfe8e57bb6086f10ce4cf8ce65eadc865b5bd8a00dc26394f3adb2ace609149e3582cf44246184b2adc0ffd9 - -Square = ad00f10fed55175159b2409dc80899f9113ba7c8099d0402ec0f520ab4aeeb46d36369494a4e6fa23675adb38148fd2efa082df5094c0acfb77a9ab6ba7a299298d69b04b58011c35325f46b765e580b5c05eca721904f1fcc355dbe39faa92af5c9a6dbc4ab80e62b815b45983d9506ebd52b9efa7a6b9da352d1e4fd6ffa81d3b4596a0c14fb825297da361461ff2240e4378340d2ae529932d78f3d9f6b3c6d65d717e66122e5f590c50ce0a5d81ad8e0f24e104c0913cd8d0eb2de4c8cf62a7535bab5502df3fba08bb4dfe73d89c8b00edaa7d5f3274be9959e7ab6b6dde54f2491728a1dc11fa8e1c6a95e67eb7617e9b7471ee40 -A = -349cc2a5658fdbe9ba5c350d3b25baa38b1ede01926694bd550d36883e53d8758e8f1ebe83e2f4560605510413a7d880929e2d9cbc2730b1736dc2689cf7bbcdc68a342b6398e547a9bd67cabe298796d76b98ed4c1dd9c22e36145892e8fcf2258529aed24252a70b6ca8fd2aad8a84becf7e1bf98b1e9bb024b8a8 - -Square = daa3835d3189ec9ade592e6076e76d441838077a9431273bdec02379b3a6ac38aecbbd57c3755ea58ddef8105ac28f2ecc8598ec0c4bfc9c1c80222fffc776722eb0621cdd8a0d55f08767fc2922282a76e529d81e4d6e21a2542b8c9a403709ed1132e3b52786b81e684591438fdddb5df2f0b72e6b39cd2db6c0cc55c759c2dc1b6ccc20a5cfd10c6fd345fc766035c7478570d4ac534db3fdb718e2bdad3d096b137bfc09a562043800957e2afe4fdcfe292881f6189edfce52370c0438c2822ce3b14d73b3eff32f7e5ca97e989326b4e3a8fa35544193f8590bbb0ddb1f914894ab87998090771a0be1fd23917cd792be86ea0b98e6eb24 -A = -ec953f1b7ba7d561edaaa23076987daf86f50e9a66c36f0993290549a9006dd9d424885c0fa77295cfe34fc81c5edce9e2371b3039ea18d8f998d1956196284e6d81eb1c62ecaa8cf3fcaca28ca7e64342803c8dc3c139080bdd4a1ff30d7288b085a579d9e90903bd363b48f2072bb6fbfbd9ba2cab30a8a63784d246 - -Square = b33f4f3ae453058f4e865ec78f0844bab7af66a97dc2f265ca73ae2232777474bfdda39e10652d7386c16f145272192af728893c3d8a8e92c60d77722b924c30269ff5a399a2449ce15e50320c528c22655ad06227ac4efe5a993179ec61c2fc9115f89d75b53961fd16f7797657f6fbf55662b019608a1d30f64a2c0838e0018b7526921fdd34fd462bfcb2462b7065e2bc7abd57d71371e45dfd8fcfcc00a71f7e45430820747c9a060b72e4f6d2919cbffd00beb0c31a2bdc32afe2cc540b38dd04a2b73ae5ba481a6e535f37a757bbd6aaa972986213afadfa47cb7a15a6f1d443f93cb0ed824a10b4b7d82cae524a096b65ccb39be3c37c07f59 -A = 358da59ef65f62f633675764e292e5a68879df24a4727eca1fc4d232b3a6d936976c92eeb11456b5e8c11319838c145c6529d2f3acc828e55b8274bfe9afb5db241b102715f8e8164e454ef39f13ff1b37cf367a5a66c4f743c750896b7c3c29026e448bb36c6c06b0d9a3d048086ef0c3cd922a02e794223f388b5d646db - -Square = cd4246489f6f221f920acbd8bdcdd17f47d2b77268f72254de4190685c123e8c5eab8517fded1852e8316c9e549d3fa355142d91b2921a3c94aafd8862cd2235429340da38a2af131b8d002f17662354f5805f6a7af7afb6dbd2f641036600614cea42bd8b24d86a5109eed29c0865a5f30c5291b1d1ef3223f9b9826dee773d98ce972da92daa19e843f84ca5f1cd77925a3c1117242ab0fb509b94a83f8de4fc8d21f856f37a4d025b3024bd0dbb6d8acfda4ab2993fd6eb7a7448d4f66ec725d37f0eb14eb242c0ff3f0c4572ba6b98a4ce905fe1b7ca3daca56c225171428c56af938fb66b37e99e54139157bbf41f536989ef813af738837afcd62290 -A = -e53ad05c88568f09f616797f0b7f2756fb543d691ec2a5b645c1e5892a247302826419a35b1348cfd2c1c569c23c31b4c46d6c57d4a488c29ab5beb77904d4adfcd0a01ea0a26bb0cc8790441cc2c8c900f030d7315b4319f1a3cf5685a140e03abe6b94730ad79e8de1f4a0cded86a3d6cfe2db267fa7dc9b2bb32872a90cc - -Square = eea8028b26e0df090504d54da714a6f5f2695202e53cff479c78aedd47a8dc676243ec586740fde53b3eca9ca02b91031ce766242184109503fbe25b1b6d318e3cd5970fabd16dfa22984dd2e9f1e0f14c189170fc69c031d66663703e6235a942d51a4545bd7b0769d01d302ce2b00b83f01568a1e378f61fd0ca6201b0490330580cd9de85719e174a71915d7efbf65cd73d8f4e66f27e0dd3144d58ec09ed0f7ed7d1238ee596922807100fb7a11127944ddcdec6a9ca3bbf6df7301e354f3f049bfb7c275b43c3d8cda5907a932fba507c9145ea3166081c1b48fcc710ee32cd931f936c796b14f8a78a592e67753a7c9e428a01719c8ba82652f3a89fae110 -A = -3dcb44be1e54c5a5d7db48055ca9afa1ebe2ae648aa6e16ac497502a7deee09ffa124720fad0ab163ce8b3ea6a90f110ea52b67dbc424d0cf1e8c9726dfd9e45bebcefaa5cd5706edeed27896525f31c6bbea3d67ee97badefabf3e2532470b66e3ae3100f66ddf50cf02fc3a8e3f44c304251d3b6a7ca3a6e4bd5d16a41bd97a4 - -Square = 0 -A = 0 - -Square = 1 -A = 1 - -# See https://github.com/openssl/openssl/commit/e9e726506cd2a3fd9c0f12daf8cc1fe934c7dddb -# Test vectors from commit message. - -Square = 15c72e32605a3061d11b10123c1874836df96999bd0c22bad3e7d4374724a82f912c5e616a187efe8f7c47fcf6945fe575be8e3d97ed17d47950b4653cb32899 -A = 4aaac91962056c84fba7334e1a6be678022181bafd3aa878899b2346ee210f45 - -Square = 48a699fe82f8b62bd2ed18878133575be8e3d97ed17d47950b4653cb32899 -A = 22181bafd3aa878899b2346ee210f45 - -Square = 15c72e32272c4471392debf018c679c8b85496496bf8254cd0204f36611e2be10cdb3db8f3c081d8c94ba0e1bacc5061191b83d47ff929f65be0aebfc13ae68d3eea7a7fdf2f575842f7ec656cab3cb56a28095be34756f264f24687bf37de062822309cd1d292f96fa698c972372f09771e97d3a868cda0dc421e8a00000001 -A = 4aaac9190000000062056c8400000000fba7334e000000001a6be67800000000022181ba00000000fd3aa87800000000899b234635dad283ee210f4500000001 - - -# Product tests. -# -# These test vectors satisfy A * B = Product. - -Product = 5befab3320f8f90542f3120235abd926aac3805a19e343f690 -A = b057af553afb120db6b7764f8 -B = 857734c4c27a1d17f7cf59dee - -Product = -ab1ce167f4b2945c55ae3f87df50ad07d4be87cf9f8aa07b0c -A = ae7a6a87ea8981a567d0b3ecc -B = -fb0fed5f8c737bcacef4d6cb1 - -Product = -c2606cd48e6b075c8da79eb4668e7157f1f175c2860fd4c475 -A = -c28dc31984d4583e9d45424c3 -B = ffc4581a5c3f885cf42767e67 - -Product = aa6805b5408aff7f914472756da07830dcad902834dbdd6944 -A = -ffa07ff9f503511954e5dd3f9 -B = -aaa7af472ad8957763f5a7c64 - -Product = 58ca2569173389df29b5ce4b784086055dee821a7243db7210 -A = af417d936f4690008811a1ae8 -B = 81b26b80b43aa65aa55ded52a - -Product = -a043d31dfce8bd01724d31c863d0a64f1bf013509d77737c42 -A = fb5fae5edefb6997d44a1ecd6 -B = -a336e50c6f7845a1686cc88a3 - -Product = -b5d6a45ffce851b201239d938ba551bab7dcb59fc11fc35fce -A = -f918faa58bb57a2ffb8b01f05 -B = bae08c3006fade695029a1df6 - -Product = 6f2fde7d1a18625d727c6345ed85e597d546d9228bf7f0564a -A = -8d108d7a16f0696d4ceb24445 -B = -c9c764cae465207097ef8d2c2 - -Product = 93808b1140841dc9735cd61c6f855ddbbb83066689b0d7e1a0 -A = b386d08daf3fa2154e9c768d6 -B = d2557dceb2d02d04d9c578670 - -Product = -ad04212ca8cadb1f7861c5130ba3a747046a2a7e4a0c72b69a -A = e4e5f7d1311e0c5f2e404d55b -B = -c18057a328d8c7375afdfd4ee - -Product = -685e75c232f2b4a0e455fe5ee8aea52f292ad8b8178320e692 -A = -a683312f132b2320632e74ef6 -B = a0758f12791453b4af354730b - -Product = 6f588c53185c503dc5b0dc3002d3817ca2e7eb2370b3e9a647 -A = -d70c9b93170261091f0c53f27 -B = -848c86c51a186ac4c9080d3e1 - -Product = 5e3bc5a04e054a9a244bf7c86cae215072fdb70e9199989427 -A = 898b64ef09d7cf63966e1a3b5 -B = af638b12f26aa5d12e97439eb - -Product = -8d8372b235b16108285203c03a8aef6fdd3c0e1a9fd31d4f68 -A = f6003dc83818c14fbe36c9998 -B = -9343f6cbcc81fa4c9399dce5f - -Product = -5ee6509abeeb7af7fc5caef40d1822ad3150c8d74f522dc7c8 -A = -875ff6f56ca72cbdf614bb9ca -B = b375a68a21dfb1f159c22fa14 - -Product = ada25be404a17385af5a330da799e5909da81bfa0715baa6f4 -A = -c9b8df392e76abc3eb7d5ce04 -B = -dc5ab818c70594dd917b4243d - -Product = bb24422ee4656ddfcd50ec38201b15baf679d3b75e5cb878ca -A = f8e12cf4defe388b78510f687 -B = c07ee817b4ae95c2915b88966 - -Product = -93da296ba164c7220a17330647aef0980c94eddd2cfa2a3b2d -A = bc5dc74ddf7a1363d1c2b1f25 -B = -c8f069bad7f93cbfe6df51169 - -Product = -6b2e1d132c4e0b0dc9b7e7de7d424fda5180480cb5ff47c755 -A = -a8048acb66a8bb88df39266e7 -B = a34e0b265d71435ae8c92a463 - -Product = 6ccb2cd93783576a8602ae43f41c786008b6623a4cca0a010a -A = -b071f1f54790c951c1dd2a1cf -B = -9dd89bb4d9b546207e282e2d6 - -Product = 5c742ba47d0d64bd97509927ce957deedb855766cc24c60016 -A = b44f3f252c368096fa62747f2 -B = 83439b97dbac579fa4f7b7d23 - -Product = -7347ba65691c913286c2fb55e45b177f031c1d86ae0e9f654f -A = 937cf0643ffa53cdea24d642f -B = -c81881f78243dd5737a7d28e1 - -Product = -9bc0649a703674e59f83ff9b8a560e5cbf51f65ca310f80f95 -A = -b536f8d9769be6f62da941ae5 -B = dc0746fb101881ae0cacde6f1 - -Product = bf4992fc3a124de350f9fb90ea825cf663b1fa051282ef22e2 -A = -ff7eacc7de1bb01d668c693aa -B = -bfaa6627f9fc7ba68ae41bb2d - -Product = 7c8992d34cc0b63f1c953f68d4e12a99d3f3a34d16bd76caa9 -A = 9e0d5a850d078890a983c0ec9 -B = c9b72c118b3e1f1023a696ce1 - -Product = -a75840c95082b9a0ae0d6e0a4eb5e09288e4e2a66e9697d9cd -A = b2b042a21045a74ef1a5091d9 -B = -efbf8b120b384e869692a1b15 - -Product = -a510b333bdb4ed7479c142e8fbe2b12f7671a42acbe16c0998 -A = -e7fd5e0bb5496b9d876c27f65 -B = b6262653b2be44501af1d85b8 - -Product = a1c1e90afc4684754155526e307fc6ed798746f347bae2c880 -A = -b84674832b26ded0a690a8ff0 -B = -e0b7bdf2fd05a038ed3640b78 - -Product = 5588e0c33bffbefcc5695ca0615abd383343f21a8a0d22b222 -A = 80cad81ad9a66ab6a1c2e5669 -B = aa0453a77c8af1584f54750d2 - -Product = -6460c2fcd6cf3304ab163ea883ac48e2031cd10f2e9014c0ab -A = c49ad3d7c8848d4fbf913b10b -B = -82b3dedbe3cc7cd532ad632e1 - -Product = -a18717330b711669e85abde8c4dce426529aa621ba3da2a477 -A = -cab4a9c0a331a5a5e826dda1f -B = cbfee5041c13075dfe3399aa9 - -Product = 8ab6282ee892b53c083d319a9dcab48af97a1ac8493c0bfcad -A = -f7d13e47f9aaac8c25f9bf75b -B = -8f4aa95231c1e2336aa092297 - -Product = 8f2d1c23c78777ed371f13155445ca3c88cbc0a9b299bdf9d3 -A = 9d8248d00defce1ad081337c3 -B = e8b479295ecd9cef7301f24b1 - -Product = -86d5e0c5b581fe59819730b4b71e33d1f85f9ab504c7dbe2d6 -A = b21b45e88acff48562a19729a -B = -c1cdfebccc763beeac394b997 - -Product = -484ca05aefa113bdfcb1bc623f730c9f9555b462a8ab4c9606 -A = -8c12b406c02c4417163c0956b -B = 8422b15c80c1c087b17eedd92 - -Product = 614c3c91f60050c785fd229a3ad74674577a90cacb654e0a5c -A = -93d45bce155a23a397506d96a -B = -a87e339c3fd5aebede5fb1b36 - -Product = 9683285f194a7e4feeab196a36bdfc4f828035fd184b9cc692 -A = f196d8fe760fdcae7eb60e2f7 -B = 9f7d88a2163ad818bf3a6377e - -Product = -988a64599c19cc64f3cadc1a83fea6550185f6cc3ab82af822 -A = d0584b2a306671e4d2c9d0c7b -B = -bb6e7559df199c68d6df3a3c6 - -Product = -68456814cb0edd951196d04c853172afdd5787a5bd69a57876 -A = -cefce1b0a1fb22862418bb597 -B = 80f614139947aea5e76cd55fa - -Product = b4b1cbf5d6566e7a57aee0cc5c9c8ec4ad885e8766aa7662a4 -A = -d68ed1bea046c6cad057e21db -B = -d7988b9be54f6e332d019032c - -Product = 6b09212675ff5257a1384371e17b37dcc268bbb141577902e4 -A = a8208053adc20a609d5d01404 -B = a2fa927c5458c4fe662d7a3b9 - -Product = -8361bc26f9bcf55f677e047d822d3004027da0d0455b244d10 -A = e82b6410b29020c2d6810a977 -B = -90ddfe0e7f0d6b9cdc0815f70 - -Product = -f1b6da00923fd513a83e32040a515649fbd362f69ebc016d9f -A = -f9b697d9ec774a8d1ee5ea905 -B = f7ccb46a8869cb028492bed53 - -Product = d06206963f2e150bacdb32c823c3a47f013d5a267c3c0d0c88 -A = -ea8e63afa99c719897ad7f2ab -B = -e36f11f55b6148d1b4f46e598 - -Product = af774a5eae6084df5ca499ef005642730adabf6a4f9533e2fd -A = e4c7af7eea3ec9cc2443b7319 -B = c457bc264c8461789931baf85 - -Product = -76350f428bfbb95e6c253ec0f457aa84cebe8c7cb1af2a2120 -A = 8fd1ff97465775d44dee58ae0 -B = -d268a7d328f44baf80e35119f - -Product = -787ae3f114f9a8dd4d249d5d3f3b0897b02564b9469416cefe -A = -bc0b398bd0ec045b0cf147b7e -B = a4050955c234e473257d0c641 - -Product = 9d6320b3d4aabac097a079b9bd2aca7f1898bcab0f23409fd0 -A = -9d7a4ebac630cc0662b816fb5 -B = -ffda517d3eb3214986b04e290 - -Product = 80bab8bd800ac8c9dc3bb57dca306f10af6fd88c5d8314833c -A = 834bc50140d6c6ab938dc58b6 -B = fafee47793cbc533b3c66af3a - -Product = -b08920f5922226b1dec87151ae087d8a7e5c1aea8c9be148b6 -A = bfd5b1ad323c79428cb2db36a -B = -eb956a10edebdd658e6810fcf - -Product = -6d428e08e8350bb4b0fae3b662c82df2aef7beadaa17430dbb -A = -a57da276998c548101f514e9f -B = a9040c1909712e1149d295765 - -Product = a57da276998c548101f514e9f -A = -a57da276998c548101f514e9f -B = -1 - -Product = 14afb44ed3318a90203ea29d3e -A = a57da276998c548101f514e9f -B = 2 - -Product = -295f689da6631520407d453a7c -A = a57da276998c548101f514e9f -B = -4 - -Product = -867614005cc204a8d19720fe13 -A = -a57da276998c548101f514e9f -B = d - -Product = 12bf3b676f64e5929d38c35e803 -A = -a57da276998c548101f514e9f -B = -1d - -Product = 24d8f92c68303ed0b96f91a8167 -A = a57da276998c548101f514e9f -B = 39 - -Product = -49b1f258d0607da172df23502ce -A = a57da276998c548101f514e9f -B = -72 - -Product = -6fd5e6ca25c3d51b2e529f22173 -A = -a57da276998c548101f514e9f -B = ad - -Product = 1276d4705b81b82da4c7e82559d7 -A = -a57da276998c548101f514e9f -B = -1c9 - -Product = 1ddb9abfc5d4017f068a67b5f4fd -A = a57da276998c548101f514e9f -B = 2e3 - -Product = -3a8b41c914b1b4a4e341433601f7 -A = a57da276998c548101f514e9f -B = -5a9 - -Product = -97c0f4ba414d6e7d4c8b7ced84d4 -A = -a57da276998c548101f514e9f -B = eac - -Product = 1198739e0c23639c176d46d13f7c8 -A = -a57da276998c548101f514e9f -B = -1b38 - -Product = 159150954ee0dedf541e4dbac0ec3 -A = a57da276998c548101f514e9f -B = 215d - -Product = -441d4bc44c86f02ff12c3d91a1562 -A = a57da276998c548101f514e9f -B = -695e - -Product = -64726b76005ebee27592237ba5dde -A = -a57da276998c548101f514e9f -B = 9b62 - -Product = bbe4ec7cf7c5bbd198e0ea86bb658 -A = -a57da276998c548101f514e9f -B = -122a8 - -Product = 21f717d05681fd2eb1796776a69ef7 -A = a57da276998c548101f514e9f -B = 348a9 - -Product = -396ac788a1748bc6955f99be4d2c64 -A = a57da276998c548101f514e9f -B = -58d1c - -Product = -54a213eb083aed1a04f3d1b2da62e7 -A = -a57da276998c548101f514e9f -B = 82eb9 - -Product = 1366fb9c20fb14b8b9a9be4b3e3dde1 -A = -a57da276998c548101f514e9f -B = -1e037f - -Product = 238d65fd26da4733e5d93ab2485d40b -A = a57da276998c548101f514e9f -B = 36ff15 - -Product = -38272a99be154d531e922be405aee9a -A = a57da276998c548101f514e9f -B = -56dd26 - -Product = -64651b62b6a454c08951632c7f2c398 -A = -a57da276998c548101f514e9f -B = 9b4d68 - -Product = fb272e3597b816144f8b945ae6130e0 -A = -a57da276998c548101f514e9f -B = -1848320 - -Product = 280d9f5ed7243712ecb9a7c6358bcb8b -A = a57da276998c548101f514e9f -B = 3df5795 - -Product = -2fbb6bb8e1ba78cefc47fbbc20e188ee -A = a57da276998c548101f514e9f -B = -49d6652 - -Product = -57f29c13691ffa1642d2860dab9d288e -A = -a57da276998c548101f514e9f -B = 880c2b2 - -Product = 139c19d7668e6aabf2d7206cb0723ed34 -A = -a57da276998c548101f514e9f -B = -1e55aa4c - -Product = 2950ce04bf0cf836d4fe94b88fb757d0a -A = a57da276998c548101f514e9f -B = 3fe968b6 - -Product = -5175239488dad05a58414251496d2a06c -A = a57da276998c548101f514e9f -B = -7e020414 - -Product = -945ff0ed38bc6020cf679cbd3e0758c6d -A = -a57da276998c548101f514e9f -B = e585e573 - -Product = 11c69ae98f6b27e95477986f796bc67c8c -A = -a57da276998c548101f514e9f -B = -1b7f653f4 - -Product = 209afe75e8fb5ac76d13c06b545f5d4d73 -A = a57da276998c548101f514e9f -B = 3270154ad - -Product = -386d64b215e41506514f4988ed237e4da2 -A = a57da276998c548101f514e9f -B = -5749c891e - -Product = -6c13cccdb1d140d0babd52707ea72fa278 -A = -a57da276998c548101f514e9f -B = a72fb6288 - -Product = 136228a8a45540372b9b3cd7f82021f6546 -A = -a57da276998c548101f514e9f -B = -1dfc08a2fa - -Product = 1f0ad3babf9d132eaa08cf5cdb8f19dbf01 -A = a57da276998c548101f514e9f -B = 30050f2e5f - -Product = -50d615ce183258e95af77319b766fac81e2 -A = a57da276998c548101f514e9f -B = -7d0bf92cde - -Product = -817d358293b86a56a4e881e50257c549471 -A = -a57da276998c548101f514e9f -B = c84efb12ef - -Product = f09b9e80be251de474d726b16e25a6865fc -A = -a57da276998c548101f514e9f -B = -1743322a484 - -Product = 22996cb0f9c60e35dce49f3825f8a479db26 -A = a57da276998c548101f514e9f -B = 3585acec11a - -Product = -2b307a37c91791a61c0691858f5f783e4678 -A = a57da276998c548101f514e9f -B = -42cf6be3e88 - -Product = -8826698fcba6c30d755fc523de1cc25301ae -A = -a57da276998c548101f514e9f -B = d29cc8af592 - -Product = ae37fc99fd419809310782714530d7428d77 -A = -a57da276998c548101f514e9f -B = -10d8059d4a29 - -Product = 1d544a20f9bc7d95ab67d1f65743979f23bba -A = a57da276998c548101f514e9f -B = 2d5eadef1c06 - -Product = -367897184e9929a0294d320f10278889fbeb7 -A = a57da276998c548101f514e9f -B = -54431582d0e9 - -Product = -943a509076a00060a2e7fa1cddb7468d734a1 -A = -a57da276998c548101f514e9f -B = e54bb102f4bf - -Product = fcce6e42879af5ad13545c0bcaab85b690cea -A = -a57da276998c548101f514e9f -B = -18711db522cd6 - -Product = 258c49f86d0cbb14ae9edbd3456be8cede2022 -A = a57da276998c548101f514e9f -B = 3a1562c7c269e - -Product = -4a8bbce59ad7daa51136d557f7fa16e9a2faad -A = a57da276998c548101f514e9f -B = -7350e780b0f33 - -Product = -82f53ec9333275d5cc271876a7db936db49280 -A = -a57da276998c548101f514e9f -B = ca94ad312dd80 - -Product = 11daee4fcc713db5b2806e47fa5dff3b5b770eb -A = -a57da276998c548101f514e9f -B = -1b9ed6758f9635 - -Product = 17038cac4f0c94dc24985ea108ae6682e175752 -A = a57da276998c548101f514e9f -B = 2399b8a9b1116e - -Product = -37e5f14394bf347a3ed061769fe8e6424af4348 -A = a57da276998c548101f514e9f -B = -567840a7569fb8 - -Product = -9253d4a32a88d8f725984514d969012ead7cc9a -A = -a57da276998c548101f514e9f -B = e25b246f733f26 - -Product = ace3648371c16a931d29004e79f5b9678391da5 -A = -a57da276998c548101f514e9f -B = -10b717b27b6a13b - -Product = 1faa5b45d04c143c339b09d3aad94d39b94ef960 -A = a57da276998c548101f514e9f -B = 30fbd672e106aa0 - -Product = -3fdfe246d27aae0d08d63b2bc501461d2bff3b8d -A = a57da276998c548101f514e9f -B = -62cef5f078a8253 - -Product = -5b792bfaeff04ee3d948cb343a249d49eb344f57 -A = -a57da276998c548101f514e9f -B = 8d805ac65649c49 - -Product = c5f824406161eec321da5a58e3e00d393b55abe9 -A = -a57da276998c548101f514e9f -B = -1323dd41d2e1e077 - -Product = 2226dec8a57be8e84e42559007e2d101ccbe67f8d -A = a57da276998c548101f514e9f -B = 34d47842b5d0be53 - -Product = -340f50f812c7420b502000940788a700f6769788a -A = a57da276998c548101f514e9f -B = -508836d8e1193d36 - -Product = -a00f1d96e19c590479625c5329a87774b5964cc78 -A = -a57da276998c548101f514e9f -B = f798fc858657f888 - -Product = cb94f830cba8997331912a6a31c34f1bef826d121 -A = -a57da276998c548101f514e9f -B = -13aec7a5c52a0883f - -Product = 16b45140b048d6dc0b9fc811df7ce7dd88357fff04 -A = a57da276998c548101f514e9f -B = 231f27f3e347bd67c - -Product = -2aa94179351b4e87de5849ab619d94f47450640199 -A = a57da276998c548101f514e9f -B = -41fe3ec2189599cc7 - -Product = -5489401d3da93158d4284e557d74016c0a7cfd935a -A = -a57da276998c548101f514e9f -B = 82c5281df41bfc066 - -Product = ae04d5b212ecfc9a6d7df07794d565df52991fb70e -A = -a57da276998c548101f514e9f -B = -10d3139229f5d02432 - -Product = 27821bc811f45d63089790b41d307be978d4b19564c -A = a57da276998c548101f514e9f -B = 3d1da85cc012b3e234 - -Product = -3de3c9e9d7fa3020a578706339314890dccf63096c2 -A = a57da276998c548101f514e9f -B = -5fbcfb28bfc9044bfe - -Product = -627dcb299a6720044abcf11469bdfd3f951edbb5bf7 -A = -a57da276998c548101f514e9f -B = 985b930517b78e6ba9 - -Product = cc0622441497a37fddf1856d5e2c99df52b99ea4573 -A = -a57da276998c548101f514e9f -B = -13b9b88948fb7e95cad - -Product = 1a5168e1a492210591ad1ed660adde9110390e4caf32 -A = a57da276998c548101f514e9f -B = 28b631c6e04b6ab0d8e - -Product = -4d8ec27b7460ce616421b9f5cae708c2ac241daa59b4 -A = a57da276998c548101f514e9f -B = -77f99bdf1eb09da6dcc - -Product = -55afd796db7bce822a00073fc8926d3bd0c79772f036 -A = -a57da276998c548101f514e9f -B = 848cdd6212b9bb3620a - -Product = dc494b0d73e8ec07cd2bb6dd8191d2b4d48e7700cc34 -A = -a57da276998c548101f514e9f -B = -154c39567bd8be5f6b4c - -Product = 240e9301b4345b914ecd91a49a0e651524dcecb6fdc6c -A = a57da276998c548101f514e9f -B = 37c6e7ee89cf87674814 - -Product = -39002ecfd6d96661b336157ccef6536756ad2e9219be3 -A = a57da276998c548101f514e9f -B = -582cdab09915a652203d - -Product = -695f49fc891d53f396f0593efae3973082b76d4f9e944 -A = -a57da276998c548101f514e9f -B = a30074dbce2246af043c - -Product = bba2b7b45b97cb0d7fb30fed95089870742ad69e7aed7 -A = -a57da276998c548101f514e9f -B = -1224195afc7b394ae8cc9 - -Product = 1910edc278515ab7d4cc09b496dc3c06c32c75bc7368af -A = a57da276998c548101f514e9f -B = 26c6701c39334169e7bf1 - -Product = -3670b7f9b661aba35ce50984d83173c84c8fa60e04d100 -A = a57da276998c548101f514e9f -B = -5436e84b4a29858a68f00 - -Product = -7fa0d3e0082b37475342b7e22e5dbad7b8d4cb5d64f871 -A = -a57da276998c548101f514e9f -B = c56e0f44fc63bca242eef - -Product = da7fe3367ce640fa5941c033ac1874312f10ba5950da75 -A = -a57da276998c548101f514e9f -B = -15200043166ff309f0426b - -Product = 1871d72481f66b1d413100edd6b339cbbaa67b3b2b3cd57 -A = a57da276998c548101f514e9f -B = 25d057879db26fa29a5e49 - -Product = -3cf1dd1e2df3456757d72f35353c3c7a659b2ef844ad857 -A = a57da276998c548101f514e9f -B = -5e46be70de21949df67349 - -Product = -5e861cbe47aefab2a7ea59292aab1258932b9a322f66e63 -A = -a57da276998c548101f514e9f -B = 9238670897685a6c9cbdbd - -Product = f623344788efb857db55c924e95a437effa4dc8bb2bcd24 -A = -a57da276998c548101f514e9f -B = -17cc0ec84c228225a7cf45c - -Product = 15514c916b0ae7cde6add16c629d3e19ba52a101d75dff72 -A = a57da276998c548101f514e9f -B = 20f9f925b3ed307edbb154e - -Product = -460cf5b14f9d0b547c3084bf44207bf881745c409b08d07f -A = a57da276998c548101f514e9f -B = -6c5cbfd29f3dae1dce99221 - -Product = -5ddf7fb91d765af97dfda5333d8779e80837c2b51cfb4f43 -A = -a57da276998c548101f514e9f -B = 9136aa79080defd1bcf90dd - -Product = 12c1a0edfb6ab6a0caae2553fb3743827e1470a8954e0a3fd -A = -a57da276998c548101f514e9f -B = -1d03b512470dc3052779f3e3 - -Product = 28388a244214abf046488a8d95308d95f021eae4b994a5a52 -A = a57da276998c548101f514e9f -B = 3e37dce784274962ff862e6e - -Product = -4da476e76119deef291c0f56934a912a0877278a19a561ee0 -A = a57da276998c548101f514e9f -B = -781b2f2dc40094a7f8fed520 - -Product = -5792496d33dd45e225f9dfca17419a04e075ffc0c90b37b82 -A = -a57da276998c548101f514e9f -B = 87772a4fb582acafd3e4ef3e - -Product = dd3a3506a7d748de16fb43d666928a87de0354d8e8a1bcaaa -A = -a57da276998c548101f514e9f -B = -1563841bf7851ff158a395716 - -Product = 24e8fb09a9ab0808ff643122479dea5ed41060c6c5b74e8752 -A = a57da276998c548101f514e9f -B = 3918c30b5568318a58e9be16e - -Product = -366c125f96b38b58d01c939c27c4100af3377eabb792b5491a -A = a57da276998c548101f514e9f -B = -542fb814f45924aa09a16f2a6 - -Product = 0 -A = 0 -B = 542fb814f45924aa09a16f2a6 - -Product = 0 -A = 542fb814f45924aa09a16f2a6 -B = 0 - -Product = 542fb814f45924aa09a16f2a6 -A = 1 -B = 542fb814f45924aa09a16f2a6 - -Product = 542fb814f45924aa09a16f2a6 -A = 542fb814f45924aa09a16f2a6 -B = 1 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899f571f257fa81c36a868d80e7fa2bcbda68a72ca3e31db8892b94d073e006433dd7128b7bf677d2b411532e5662cdff66d657673d58e03d4a338bae1a5513296f91d4d2b5b680527a2e12318e422ec2b7f05ea4fd3ef4780576488211dad5733685a8f0e5d2ecda549a15eebb235495e70d26b194c994cf16d98d356218d08a34d1593d90bc0d3572df0e84bdb1705c6c5e64ea4895599bb21bf219abdd4329813ecc198e708cee199c22f749bdeb0c206690e8420883f6c0661e47b29969986a7a72996ef63234c31aa39b7be37995d2898063ef5c3b672c43afbc1a065dec2671ae87e17639cfcd3148145a8323e1e9dc4f9c9daf981dd6aba4e8be01344c2eda185b87 -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899aa73af54a4e1825aa6714016da99d9e3d0c02eb139716db437705cd9efabf0123b0831689735f4e488f226e577d4688d30914dd50ed368939452af0a7a094c065c6718bd54f53a808585fc1728c3bd1e7c968d76c6dca32f95a8323bacad31cdd4aae544d4208262c40bcf726c2f26cf1e60341c3e1e0c8ed4542555b9bf00488680b737a245cc9b7817231f1f6f1e614cdf43ea281fb850ebbb9305b1aa441a45dfdaa1e98b9d79d9ca511be070bfa94d8cd3cc750607c93e1b451a14e32356bd48d77860b37fd2e714827e770a5648ce8579a00ba5cae034502a8b03ba754994d9e002130cfdee6bfdf078dc8f6767b927c964197664c8e32bd3d31bd461ce -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a80dbb5a46feff82a92989bca577998c68ee619d9ea9972c6f139e97f5bdde635152830bedf302873508d2ed73badb82f9e32e1f4d12ea8c8b1059aa6d15f8e17d649bf41467903ab40d220d50570b5a263f637c0fcebc0ca29f8a81e2a01bf39bcb60cb9229dfd40618f706b941836bc5c291dec45ee9193e74d3a4cc5f73054ca56fd774a359f17a687268587393b76204a37cd48dcb09d3daed57a7e6d7d93a0ca3d6de8557fc4ddbfe9cb163fd10b7fe5f270dc57aa2fb88cdca2a3795015a17fd352d85fb688a38fa54883d0cab67aab08dbabd58d307c601f0f810014d78b101ff0bddb6d550b2480782406a905b9201e70ef6c1cb9765e91c10c8f5d240c -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6788e14a9e3812764dd3ebb7489e6e66058ca6ccf9c007f8c049eda369b2889cc411bca78d4f5b0e3a9e80243e87e112072b01922b595afdef4dd562e58ce917f11e69c8fe050de54fdb2d607d05f09afd6dd140e9d195b91d85269610a1e5d5036e8c9fea2d4fa693d80ecdc819b201c0aed27dfe0b92b4b3b9ecabb3b9548f0d27dc917ffb14308c4f970863e163f375852fcd9fb115640dc40534f8f51a7b903599117dca6c80924fa9a1aeb43cf5a9a3f67ae818b484feed51d7ef60b3656720891b13a983c02c281c8a0954f13b7bfaca844d2cb66de5c11ff507e39cf774c7c93b38e296a44f04e5ecf2819b57943fb0509774ddbcfeb -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899c7bedb01951b0f4fdb2c0fb64ad74707fda20027f4cee25da9b59be288d404cbd348f27600b87015d28f03cdf411f0e8c22deb9de5b3e0094f7820d78d59c90017cbd426297f8a32fb4b55b09362cf7cfb5910085acb24dbf618752b8b74c7e87f9cac44cb3b7486c43aa9b19a64d40a74eaf1de8b5f168b43d5750236aef753278c11294efd1adaddb6addb846f45fa55d7391898e8ec1c82bcf0008d9850c4c096571e8872e975dc8af1ba01bfbe8c8c27dc30cdaddd198936e4496579741a3a20e1b8e17241fe4abe5e98794e469180b742b2e1904940381f703f512885bda0340fe74e997ab269be00a3ca29bb937db2e06d8054e26dc13a5014ba51b175 -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d88997cc097fe3f7ace3ffb0fcee52b45551165bb02354b229788b59128489879b1a0373e9862a17692464a2dfc5d09185a0f1c67d2359ba70b52b03f21c7b24feb96e25e1a2dc7f4723952bf203979f7c9e38790f881e2b35006157825555d4c867fce9ea0a3cc6f1c94ee308a68e33f64f286247465ffe854033e9c64f5d79d6d66dcb38ad03535b20376bf4c3cf26e07ef445192ba2baf08bb5286695a61ff6b5dc7aa1832017198d61a324b8c244572157323c7bb3a2fee226133e1b0e0f2ff067cf71fc24bf38d0e172f459b0cdf0707c5bc586390faacf428bfdeb04e850ee0c35f6807eb6ca8d3a473dcc2239541115a8b0d33ea33295ff8c13b2a -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a80dbb5a46fc245133c3335163cce37555d36c555182e6d9a754b9aa9305c070083d0fe806d2c5eda4a976f749d6ef40515c425e6531a7f4d11926e49907b7a8a938205e0d6fefaacb145200cbe3deec686476bcdc1f6bb3535147ecb00818f2cd666ac0dd497f0fbc087bf05c6425b7752a02e2a695655d4310f04943a6178946a74dbe4688bd1eb3f1a166aef37e39f3e1d36b6d6d422ec0db264cae8d44869f57a92952bd74a026dd7cfc672803905f029c723487d4123a7520688fc9c68b2384be32e881f64d0ed7ae555bf00e5799740dd8c6accc40f3fe573f194f4848bb05aea8a5509f2dd10fce023093f1ef20267244a990d7ffd462f4e85a4 -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6788e14a9e353744d86d954c06f3b84ef271b184ac9957a5f88b08b606fa6aa97afc4983a62f1e74aa3f242e14a3f4cf5ea415d1437818663556a29d117ea7df1cf1ee32f70d6d5566e25d53f892c42d3f92e481b622455fce36e400de09e2d435099695354ceee249c793b76b3c544d70164381e0420ef8b85609502afff9130729ba7851e0775dc5d8c606ba614e7607625fbc38908c88fac43e29ff9b8728f5809e63f20289246b5128016478437550a833c60edb0df43dd9a47654f2e4ef308d4a18cea57ea4b0c6d08add07f2e7adc427cf591c29dbd1f975432922e3f2b71c75e4d2557efccf626be7a0d522b658d420ae321 -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a8126efa5e7be8e75d54e5ba9405f671d624eaf8d7a115d0479f6fb773b940525fd46b69bc43c815b6bb1798813ca95790bc68032f0b9e73fc964a9922507d8aac25f859745939b828ef5ed326b226b555e5088f13531be16272a89ad41ae82c940935b5d8fe75dc520a230cc279a887bce01bae0a79356f044af13c6f4a5e53c00b2d03cfcbb0f93b26202441a207ec91576410ac1750e257906d945bfe9204b73fc417600bd191edcf2e3eb79acbf4f84dda372405b5e98397abe85c1593543cd7a5b17cb90e299f422f0ce107d86b56474e435dbbcbb5314fb579cd68d54777aa2d0ff9b6b96de62b4676edea5b09589698ed829cad22a52aaec732b79edf6af -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a8126efa5e7739032d1f8bb68307f4adc912f1d9b83797606874d4f2c669fe0b263565c4898a07701585237aa444234719adb869c17142126611a9cbd6e689fabb2847bb9dc5e2dc89694621a7179df1fe7371deb9bbdf5fea0b271d86bcde2796a65331c27365fb97fa3647435c47e5c854a95718fa49072cc239d046ca0ac2bf453beb31070370d59483adb42b9876776e43fccb663887f1a999f625eb8e9c4cdd0a89099c42cdff06be29ad9ea66a957002925c9425a83c3e74096ca31324134f5d4a2b7d3b8d7fd8d72192049f79c670874f65201c068c5aac2008a7df4e5eba02d88be8ec23683513a9cffe06671a7c2fa5da7a7aa571914caba1e -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a808857c1bdb914ae0fec75b02d527263093a9d9b8a42289ec74dc73e0e46568a9e8ee117659597434048308c9b66fa7a539694285b1238a13d1163fbac33db147e5431af1c7aca5b1a118db4f6650ec6340491ef7a2d203b53e43d536639f980eb6e92a37bffb2149c5eb45d6718a9496f0784370674c1d29732b944a3c3885b68f0fd2a121f556dc82d1b942e7aabba780f087b9df359d86e2055248c3aabc568e93bba67d3ccca2c4240c876506d63bb05aad6fc4c77dfafff1731a46c6711bc60c4d23976268928bc63e1d133add0633c737bb508c81fa1ff3b452b49b992ebac930432d555ab8c62ae17357b1186e80689672f5a9f472c -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6783ab6c7314a43e85a92955a5fbfbffcd31ef0913ba93563dab2b7f54d90fa21ca827ad15b5b1fb399a303f94837536b2813cb563f793fb780e91f8333a2de7bb9f10efdb652a504d6f242e7c15362d3a6eb6e3d1a5abb03023dfe964656979765a14fe8fc36af3d785030ce549b92a91dcb8e2aa13f5b89eb8449b31961a0f77117c8cac79af95ee69f6594e557af7bb017cd885027ff7c0cb1d2f99d1ed5eacb788f645c25150e737cf1184b546bb2d55f2014a18015ffe647580df6fe4d528ce983309baeac0347ae8739e2b1f6d1a83e12e4dbfea1cd81b11b8628837432ad1906c70323529b718c8c6e398e1dfa73 -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c374bc58f225bca564b7e6561b56e0edbb3a7f5934f382b916ab38423221d656357ce0e9bf1e9b04c0678b9c555e8365a0f977c95bd8dca1fb2ad2268193531ca36cbe7f40da8e1afe097e451dc2931b323ce731c03cc027a92ed8ae105c5e9c1bd385e238d989fadbf3aa54c097a8666df8a66b7e2d016e65a2a632603f2c84290ccd7346ada28dff79dd06c7f7989689aca4f494b977f984650f91327ab9936cb92675932440f135e54e4abeecf255d7061482b4c8d91769e02fc94b8acc43325d69541903c3ef7a7a8a5bd19bf886506d42bcf0efcb6197a8d178d6a60516a5aa771ae238a342dc61df8c18c6ba1ed952d4e0c3409c14639 -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c374bc58f2210cc134828c520a58df29ae28863a158a044937809d7d84d2940efbdddb448c64da5f1f31977e7865fd5529eac82fee3e804064a6315936295f8cb26f0de16a47373f5e8365939e280a57dacb508166a583a630c75730c2fe54971e70a35e224e7a1a21e3bd8f417a47c4796d34148cae15068e19eec637bed8f32846dc5aa7e8f50599e840903a8129206fc384e0b4085f9f1e7e3bf2fc67b62b02566ce73cb4b22d471cde35b4f0cccb74283cdded5748d62286f7ea5c184c1308d520ecc7c7f1535b1132708298bf94c0967bc8f8541bb2f2b3c81f11e50f1d8cba4ce3746ad5f85e6bacbefada657c9b386b991b2 -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c36ad2daaf856508e861c7f68a2611a215a93e3a15f68f72bb80a4fe9f4cfb6c7f91639179342c633db0f70c9dd849b5b5767908b27e61b812659dcd1a0613433f2c0940be49010886bb384d4676bd523f9827c1a48c7649fbfa73e872a5160796813956979b0f3fd3af728dd48f8a7348090300e41b181c8acae08a3b3106b61f90b0421803e6eba0d68e9bc93d3b659fd6316ba2815cb4b3b6a74f1f3fd24b0c07f619d995ac2beada44188eb72d371a6894f90087eaabe148755409bbff60114bcfefbfe2182e6dc4218d0da75af80059bbb14e848c2e60790fb35bf1cb685cbb133b2baf3f2faefcc3f69e34102def4 -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954 - -Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef9518c8ddd2bbd782e5f8cb06be77fc8d0c29f12d4ce67bb2478369710d003f0cb6f40a1341a5a5f2509d2d189084ea4346a44368a54f44c2be4c7b90c4d22976a31985927d0379b2e5d715a7e67eb3228943a07325a29316c695867e8f4ff676e00ffca0a6dfe8fe24652aef9e7f12616e8a54e367b90942f543a01dc7c1b8000ff991228ae83fe0131cfc235ba12ab2bdb33bd4ab0ba1b356bdbc6da4a70eed9fbf2c704e14ed6230eb5478dac0b02f4def1d8c076d1c0c0e2c4cdadb248de4acf961cee51dc41e545bd5a605a0860fb343c28ebf3f8814a9d5a7e0f3e9c93e742db76bc5671258d1da7758b41efead5 -A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9 -B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad - - -# Quotient tests. -# -# These test vectors satisfy Quotient = A / B, rounded towards zero, and -# Remainder = A - B * Quotient. - -Quotient = 1 -Remainder = 0 -A = 8cdaaa7c422f3c2bb0ace2da7d7ff151e5bdefb23e6426cf3e6b21491e6e80e977bfa6c65931a8dee31fc7992c0c801d5d7c -B = 8cdaaa7c422f3c2bb0ace2da7d7ff151e5bdefb23e6426cf3e6b21491e6e80e977bfa6c65931a8dee31fc7992c0c801d5d7c - -Quotient = -2 -Remainder = 1 -A = 107f0e6cebfe22ac11294a06fed2b994d01c9b3610d50bdd254adafd08c93be8ebdd1e85e1286fe9c9e682a90cbbd6351681b -B = -83f873675ff11560894a5037f695cca680e4d9b086a85ee92a56d7e84649df475ee8f42f09437f4e4f34154865deb1a8b40d - -Quotient = -4 -Remainder = -2 -A = -3d8746ae2123c2d3f1d35910b42af1f86f5e81f8e98986cea20b2a1bdb8af6cf111f1258f112c837accdf4868463fe9eba536 -B = f61d1ab8848f0b4fc74d6442d0abc7e1bd7a07e3a6261b3a882ca86f6e2bdb3c447c4963c44b20deb337d21a118ffa7ae94d - -Quotient = 8 -Remainder = -3 -A = -5645d65662eaac73050de06f8f982a9b2ae680467712284be3e2b0e58ef4bf4d72b5be5e12ee1fd803b47f161759662ff5c4b -B = -ac8bacacc5d558e60a1bc0df1f30553655cd008cee245097c7c561cb1de97e9ae56b7cbc25dc3fb00768fe2c2eb2cc5feb89 - -Quotient = 10 -Remainder = 4 -A = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b4 -B = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b - -Quotient = -20 -Remainder = 5 -A = 12805392c55ffa0e27e85e15f2b339872793664e9ed3074cd2600aa52459a57197130d1ea46775ef43115c9413248cc7b34805 -B = -94029c962affd0713f42f0af9599cc393c9b3274f6983a669300552922cd2b8cb89868f5233baf7a188ae4a09924663d9a40 - -Quotient = -40 -Remainder = -6 -A = -3579fc4d6083394c691b060cf9e20318fe17da0487337f76710bd11512578830ba94ac7b587a2d5ab7cb4afe611e349cdcfb86 -B = d5e7f135820ce531a46c1833e7880c63f85f68121ccdfdd9c42f4454495e20c2ea52b1ed61e8b56adf2d2bf98478d27373ee - -Quotient = 80 -Remainder = -7 -A = -74ebad4b39ebaaff82cd91082408c979527907c363d8f0f75db410523f8477c074c45ff85851b6275b1ebc5279029818e78d87 -B = -e9d75a9673d755ff059b2210481192f2a4f20f86c7b1e1eebb6820a47f08ef80e988bff0b0a36c4eb63d78a4f2053031cf1b - -Quotient = 100 -Remainder = 8 -A = d2d8a4419fb3b1c22bfca04ca08c2ee066ccbc9fce2f41861b5eef91efd3c13eeb7eae5abea0ef1849662cfdfef7bbff892c08 -B = d2d8a4419fb3b1c22bfca04ca08c2ee066ccbc9fce2f41861b5eef91efd3c13eeb7eae5abea0ef1849662cfdfef7bbff892c - -Quotient = -200 -Remainder = 9 -A = 1bf534da2f4365c96fc5dd4928e73ac24b157b5136ead90cf6596033ec387a2c14bca828000ae1725f3a5ace8ad67a8c07a0a09 -B = -dfa9a6d17a1b2e4b7e2eea494739d61258abda89b756c867b2cb019f61c3d160a5e5414000570b92f9d2d67456b3d4603d05 - -Quotient = -400 -Remainder = -a -A = -3a172cc9483774544311a1366659d9e61cc9fac7dc11c68e36aa991ef4d5e96becf5bac3e0967c904d926617ea11bb9551b980a -B = e85cb32520ddd1510c4684d9996767987327eb1f70471a38daaa647bd357a5afb3d6eb0f8259f2413649985fa846ee5546e6 - -Quotient = 800 -Remainder = -b -A = -5ecff3a3e47fa615b6e3ce2dedfdeefbfe1d437c394631820968a9650b59dc3a2dd1c9a0b06537e4e5c408a59e580921503580b -B = -bd9fe747c8ff4c2b6dc79c5bdbfbddf7fc3a86f8728c630412d152ca16b3b8745ba3934160ca6fc9cb88114b3cb01242a06b - -Quotient = 1000 -Remainder = c -A = d3ef80fca0ab3ac3432b22e2b485131d816810c39d02a9c82dcc05ec5e6406bc216026de3abe53ab103ea3b2ddbc2ea377ae00c -B = d3ef80fca0ab3ac3432b22e2b485131d816810c39d02a9c82dcc05ec5e6406bc216026de3abe53ab103ea3b2ddbc2ea377ae - -Quotient = -2000 -Remainder = d -A = 163956bc32325f28f48d41d32bb08d2a9c4ccbb0d818368fb13941e82b27da21d04094f7e897ce79c2d0ff8470505f1ef63fc00d -B = -b1cab5e19192f947a46a0e995d846954e2665d86c0c1b47d89ca0f41593ed10e8204a7bf44be73ce1687fc238282f8f7b1fe - -Quotient = -4000 -Remainder = -e -A = -3763f8e43bd05e6ffeec6d509bbe6ff9a9022ced8cb191c9abaf5fd0e0b75a53e2ad581455e3af09e702a77b164ed3fb54ae000e -B = dd8fe390ef4179bffbb1b5426ef9bfe6a408b3b632c64726aebd7f4382dd694f8ab56051578ebc279c0a9dec593b4fed52b8 - -Quotient = 8000 -Remainder = -f -A = -531dd44dfa9e79a5aec8fa7c84bd3b753c146770d22d2c14a6d2125f7ab95e9b320e84c31cf3e0d883e1295a220f2a546550800f -B = -a63ba89bf53cf34b5d91f4f9097a76ea7828cee1a45a58294da424bef572bd36641d098639e7c1b107c252b4441e54a8caa1 - -Quotient = 10000 -Remainder = 10 -A = 900996b61f58713f0755e68bbdfa4e0bb47f034bb0304f77829847923d14715def1771f43b526c41b9667438b434d2b966c20010 -B = 900996b61f58713f0755e68bbdfa4e0bb47f034bb0304f77829847923d14715def1771f43b526c41b9667438b434d2b966c2 - -Quotient = -20000 -Remainder = 11 -A = 179d7ede3db0c105525286551331d5b9e1f97a7883f0c13cf250afe9765bb5aaa527af7945c19cdd4596565cbc8532a3cfa5c0011 -B = -bcebf6f1ed86082a929432a8998eadcf0fcbd3c41f8609e792857f4bb2ddad55293d7bca2e0ce6ea2cb2b2e5e429951e7d2e - -Quotient = -40000 -Remainder = -12 -A = -293dc443c294c6a6c53dd49e84f58305d59a432afb6c7ea2039cd02a513231239571ae07f29b5427e869b9faa485511ca45980012 -B = a4f7110f0a531a9b14f7527a13d60c1756690cabedb1fa880e7340a944c8c48e55c6b81fca6d509fa1a6e7ea921544729166 - -Quotient = 80000 -Remainder = -13 -A = -5b637eb8aa51ef15a18d9b144031c9756527fc0fb96c84b6df03700e5079ae1b3e96940a2c1e07f3b47ad8a9b2b8ca99171a00013 -B = -b6c6fd7154a3de2b431b3628806392eaca4ff81f72d9096dbe06e01ca0f35c367d2d2814583c0fe768f5b153657195322e34 - -Quotient = 100000 -Remainder = 14 -A = 87c846f5469d4c5819aed0c7e77797209b2c1b83a7a0e2be70280b9f30946b5db9bd0f25a06cf4bdba1c7183a1b9eb75c19400014 -B = 87c846f5469d4c5819aed0c7e77797209b2c1b83a7a0e2be70280b9f30946b5db9bd0f25a06cf4bdba1c7183a1b9eb75c194 - -Quotient = -200000 -Remainder = 15 -A = 11c2a4509f419aa977c3d37fa446fcf21b4b3b9f983fbaddeba4f51c285ac4032200711a54cc6edf24297b1f3d46ad020131a00015 -B = -8e152284fa0cd54bbe1e9bfd2237e790da59dcfcc1fdd6ef5d27a8e142d62019100388d2a66376f9214bd8f9ea356810098d - -Quotient = -400000 -Remainder = -16 -A = -39e37ae0edd92b957e84682358039f5e432c42492a44f3de01cdf74d643760260f2837946608663e12291e9b0695449c1153800016 -B = e78deb83b764ae55fa11a08d600e7d790cb10924a913cf780737dd3590dd80983ca0de51982198f848a47a6c1a551270454e - -Quotient = 800000 -Remainder = -17 -A = -72f725edd5a3dd6f20b5e9ca7da08a99f8ec9214c80588182c0d42e03bcff34b488b28c03cdf41813a6193c10672a8ee68f6000017 -B = -e5ee4bdbab47bade416bd394fb411533f1d92429900b1030581a85c0779fe6969116518079be830274c327820ce551dcd1ec - -Quotient = 1000000 -Remainder = 18 -A = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd000018 -B = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd - -Quotient = -2000000 -Remainder = 19 -A = 190790727c1514b4ef83a1c6aa07493c0af7087fbc8a675bfd9a1e97b8ef80ef684219d6c6f1a5fb5b919f105fd7717cdd5aa000019 -B = -c83c8393e0a8a5a77c1d0e35503a49e057b843fde4533adfecd0f4bdc77c077b4210ceb6378d2fdadc8cf882febb8be6ead5 - -Quotient = -4000000 -Remainder = -1a -A = -22d115ab02f8663d8c009960086a0275d301d358cd3b250bb9e7c16cc6ebed4a8fbe43bbced856d93be64a17377d95f5f9c8800001a -B = 8b4456ac0be198f63002658021a809d74c074d6334ec942ee79f05b31bafb52a3ef90eef3b615b64ef99285cddf657d7e722 - -Quotient = 8000000 -Remainder = -1b -A = -41f2e708ba47494a13607223b08e6d99c0b4247436632961d873804e83446dc97139ffaef3e25969950bd4b5bb4ff73b1a25000001b -B = -83e5ce11748e929426c0e447611cdb33816848e86cc652c3b0e7009d0688db92e273ff5de7c4b2d32a17a96b769fee76344a - -Quotient = 10000000 -Remainder = 1c -A = e4b52f78179039499c2f6b500840f41103fbd60eac0d7082297236f25189c18a8301a92f533945047fbb83427dcade334336000001c -B = e4b52f78179039499c2f6b500840f41103fbd60eac0d7082297236f25189c18a8301a92f533945047fbb83427dcade334336 - -Quotient = -20000000 -Remainder = 1d -A = 10888959278661bc36089519a215bda60f9ce24ff7c0ac1f543b6e652f94dbff1f32aa40cad2b4b4d676f16948551501c29f2000001d -B = -84444ac93c330de1b044a8cd10aded307ce7127fbe0560faa1db73297ca6dff8f99552065695a5a6b3b78b4a42a8a80e14f9 - -Quotient = -40000000 -Remainder = -1e -A = -3ada453530a180fda58533ab8c62beb4f693a134f512e4d23e487dac3b575e5390c0a90992400e402bb47aac93d46ded55f54000001e -B = eb6914d4c28603f69614ceae318afad3da4e84d3d44b9348f921f6b0ed5d794e4302a42649003900aed1eab24f51b7b557d5 - -Quotient = 80000000 -Remainder = -1f -A = -57879eb5d92d565daac3ac5173639bfe44b6ecc69ff770af57bd79c9b93841c5677042cb362b794f3d8b24b0d3b73ed1cba58000001f -B = -af0f3d6bb25aacbb558758a2e6c737fc896dd98d3feee15eaf7af3937270838acee085966c56f29e7b164961a76e7da3974b - -Quotient = 100000000 -Remainder = 20 -A = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d00000020 -B = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d - -Quotient = -200000000 -Remainder = 21 -A = 1c267719338a4562e934bc57fabe6da86ca534a34244bd38c15032f01f47c2fd498c83f644b345c5c661ada0e586a096bb63000000021 -B = -e133b8c99c522b1749a5e2bfd5f36d436529a51a1225e9c60a819780fa3e17ea4c641fb2259a2e2e330d6d072c3504b5db18 - -Quotient = -400000000 -Remainder = -22 -A = -250249f2185d4b428fa9534f03ef3cbed535bd31c56c0b273e6c3d35e0266f7777a6e59a99da5738b8e3af8ac60061d6716ac00000022 -B = 940927c861752d0a3ea54d3c0fbcf2fb54d6f4c715b02c9cf9b0f4d78099bdddde9b966a67695ce2e38ebe2b18018759c5ab - -Quotient = 800000000 -Remainder = -23 -A = -710b30c23c3c4e646ba90da33d2ce35af2ff181c40b02e3ffa607966730c6b6e274dd4c3c78e578e0b10f431f2d832274bf6800000023 -B = -e216618478789cc8d7521b467a59c6b5e5fe303881605c7ff4c0f2cce618d6dc4e9ba9878f1caf1c1621e863e5b0644e97ed - -Quotient = 1000000000 -Remainder = 24 -A = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719000000024 -B = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719 - -Quotient = -2000000000 -Remainder = 25 -A = 1ed1b7d9e4cf3d44ee98ef69850e61a39f54cc407c6795c07c887374441fd9ec258c21193f8a8c55802fb8f8c579cf94cb0ce000000025 -B = -f68dbecf2679ea2774c77b4c28730d1cfaa66203e33cae03e4439ba220fecf612c6108c9fc5462ac017dc7c62bce7ca65867 - -Quotient = -4000000000 -Remainder = -26 -A = -35d324ba37d2000f960ca1c9e1ab96e341a2ae6a5ea5cef014c73a39dde000d8ad9606b817ad67e4e4593cc5894d354854898000000026 -B = d74c92e8df48003e5832872786ae5b8d068ab9a97a973bc0531ce8e777800362b6581ae05eb59f939164f3162534d5215226 - -Quotient = 8000000000 -Remainder = -27 -A = -7039477c3e0a6f415e25e9f9b1dab1edcd8a23f984e7e3bc149c206a3b756b1be001450af4049cd4535e4243d7032afcf6790000000027 -B = -e0728ef87c14de82bc4bd3f363b563db9b1447f309cfc778293840d476ead637c0028a15e80939a8a6bc8487ae0655f9ecf2 - -Quotient = 10000000000 -Remainder = 28 -A = d6c59dd07409da98f7bbc7ee471b6e06c4d9e832e9f4d04ed9da63564d37d3072a950564cf549bb5d6e7dc85565d3cc8ba340000000028 -B = d6c59dd07409da98f7bbc7ee471b6e06c4d9e832e9f4d04ed9da63564d37d3072a950564cf549bb5d6e7dc85565d3cc8ba34 - -Quotient = -20000000000 -Remainder = 29 -A = 14d27a16a9cf2fdbc85b88a604dd8f0e57b5b34a27089d75d805e05fbb367dfa61c085aa98b896e3e53b85ef774a3fa52417a0000000029 -B = -a693d0b54e797ede42dc453026ec7872bdad9a513844ebaec02f02fdd9b3efd30e042d54c5c4b71f29dc2f7bba51fd2920bd - -Quotient = -40000000000 -Remainder = -2a -A = -3bd0119619fbb5b260c44050d61e6b1925a49713d754ceb06bafb1d730a93f199df654b153c40e75096ebbaf5a6ce3c801820000000002a -B = ef40465867eed6c9831101435879ac6496925c4f5d533ac1aebec75cc2a4fc6677d952c54f1039d425baeebd69b38f200608 - -Quotient = 80000000000 -Remainder = -2b -A = -61a283fe41d965ee770704bb453f689cb82a81089422d6d904a91776a06d32857220286e6ef6327807b724062dda143b46890000000002b -B = -c34507fc83b2cbdcee0e09768a7ed139705502112845adb209522eed40da650ae44050dcddec64f00f6e480c5bb428768d12 - -Quotient = 100000000000 -Remainder = 2c -A = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe10000000002c -B = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe1 - -Quotient = -200000000000 -Remainder = 2d -A = 1eb7cfb197d19f56ad994eca52d1af6466fd09da07d68d63067602046b2d42d3063ef5eda6b58afd69fd92b0b727a0ecde1420000000002d -B = -f5be7d8cbe8cfab56cca7652968d7b2337e84ed03eb46b1833b01023596a169831f7af6d35ac57eb4fec9585b93d0766f0a1 - -Quotient = -400000000000 -Remainder = -2e -A = -3ab858b3329e5bd0469118be52a867b2febbe2894d962cedeb3a5be1738db1cea106cd0710c9f6937348c2c63b109ae623d500000000002e -B = eae162ccca796f411a4462f94aa19ecbfaef8a253658b3b7ace96f85ce36c73a841b341c4327da4dcd230b18ec426b988f54 - -Quotient = 800000000000 -Remainder = -2f -A = -6137bae6cf7573afcbb6fd5c066ba37648cba8db0ecafe9dbc66959b19deabf42f3083719a2268b7602bafa2140a1ee8ce7d80000000002f -B = -c26f75cd9eeae75f976dfab80cd746ec919751b61d95fd3b78cd2b3633bd57e85e6106e33444d16ec0575f4428143dd19cfb - -Quotient = 1000000000000 -Remainder = 30 -A = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7000000000030 -B = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7 - -Quotient = -2000000000000 -Remainder = 31 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -940693131e2ba7b2af531803794983337dd526f0d84d08d58723edf002a388d55c8502d88c2a2a6e78233a2a1b1c8d339a13 - -Quotient = -611b743a0e2acb1043bb33de50a59eaa0405b37bf6b622075dd69291fe5b53305dbfcc377d1f3082319c153d0c1ffb3b3346 -Remainder = -16e346b6a4297 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 30c77f3380ccf - -Quotient = b9e34073d5e6e5b9e5d2d7250150f8ad86870faeb88d5aed5029fb25c176de216e2388e0f5d33f7c3b56102873eb40b06f2 -Remainder = -16ebc86eb88339 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -197b6f6ad5b75c - -Quotient = 141bc8752e846cd63743e6fce4a22efc3eb5f0ce46ba81b8f578c94c516288ec3610fc9923f45d4af2b94c0b0a20b48ed0a -Remainder = 9bab19f12d81c3 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = eb90162ecae18b - -Quotient = -381bd85c951e1dd775b0d7fab344aadf06b1b592c643b5852fa44aa55159eedf3b3e47fe0d9f399ad92da85ab2bfd18240 -Remainder = 1e4f817a2f52b71 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -546c109fa8a9d7b - -Quotient = -5e385a83b56830626cf8306acc232f955178080e86384bbcf92eec3a8961360223c4cfc1d8d118022972e61866cbfc46b -Remainder = -292e149300fdd1ad -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 3246242094394c8c - -Quotient = 9af0246f4b49316df43f61ae3795a764fe9b1d071ce227982ebda7988a7a7a98129c94a76635c6913cb15e4f75ea1608 -Remainder = -dd3b3e32ddc79cb9 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1e928618913898b2f - -Quotient = 1fe40099811c648aa4e84e4fbb8cbc19706774a11391fc03a9667d8dc72dd0b26c4a46d0bae56ba90fe4bfac1517d241 -Remainder = 16e021603d30dde2 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 948887c1634f4b08f - -Quotient = -3f4fa4c179dab02ad461bbea8f890292c934496db560f72878323a4463d77ae261363f4dc8f53eab145fcc3815d3253 -Remainder = 407ccb4f0b814dc5c5 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -4ad17434071e1ce664 - -Quotient = -4d17d19f7f6861189a520776339a1e425876808111c303e391118714370111151ef4ad2e6e84250f59b0fe09ab3293 -Remainder = -36f745b0f421d16db7 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 3d71635bcc25183cdde - -Quotient = b976d544af44e711351c6618106d3a002c42ebbe22fe939a2457d24e8dcc35c95dde5c7c77af6b4545344a198be82 -Remainder = -107334ab98e5099fec5f -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -198a54e35fa0cfa328a9 - -Quotient = 1307bb8e89aaff7466bc238d32672fbbde7be19d15423bcfa14f9a23fe85af9739b72807fd4bc420ad0b0fac37a42 -Remainder = 170ebe9b83d4c43b79ab -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = f8e923a8bbc0242eafe3 - -Quotient = -3925a167c1c4d2fae265f277302b989466e309a7211e0b7173031cbbb91ab7fac8dfe43c9d832764e222e9d8581d -Remainder = 4d404e93edb435dbd60af -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -52e36cee22274556059ea - -Quotient = -4d5a6ef346a872142b999ff9a5429198b3c2a97e968f55aa2c01583efe30e9687c57e2bca2372db4d3d443052b6 -Remainder = -3a2ea5f9d204dc31f21833 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 3d3c79a115d9071b573d2d - -Quotient = a49dee54430f1737a04543d5f549efafab25f0f28f5e304f1bbca191f99521c2c4be1b9927bde19e1ec2060bb2 -Remainder = -17d02758f8fcadca911a95f -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1cc65a75211f2826c9d0811 - -Quotient = 1808ab7c0ccac2ff8f7cb61248bf4624fb60352a356fdd1408904f8c6fb0cc52b7642ec59183bcaf5dd89ca0ac -Remainder = 5c95323f3b8861261dc31ed -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = c516e6e3fa6e3dc52cf5933 - -Quotient = -437e04d7076794850aada0cb4ca7a1055df103e74e00766be6a2fdb2631bf294cdbf2695d0a2f8f9eb5587aa5 -Remainder = 1fc63797594c56160536faa9 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -462ee529b488d1db2b6c60e8 - -Quotient = -5dde5497accc4575a412e7232ce75bdf7905936e09e382d5c9f133faf82a05ad9dcc94ad858aed34cc14c714 -Remainder = -15e79293d5e055f906381a899 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 32765b0a34c88864d39bedaae - -Quotient = 11ac52a9287472e1d3b8577b3d50c95076e190714796761322b3ce869d96b44387e190e824849ee345d0a22b -Remainder = -a158ccc7c055d64e7df3fbcf0 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -10c061a37f6cbd11bf0c327643 - -Quotient = 1ff5cda1551867577c5ca72c86516a82fb8fc5f59ce967b73c6bcc1b85168389872c9a747ddf044d6dba174 -Remainder = 21e766a0020ba429b330a325d5 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 9435cd2dc2a92c950bb9e69b83 - -Quotient = -2719c892fa3f4dbc9951b2095056a16159adaf32dff902e20a800a0cc2e858ccae408f2161aae25d3e1f6d -Remainder = cafbe9caa1f83fd0dd3d5a6881 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -7924e4dcf8f96da61f54bf83870 - -Quotient = -5080dc99dba295f4a2d9a474c2ddfa3b232a82fe629fe62177514988983eff8195b37d3fee3afa343b497 -Remainder = -94ae72f78982ac1ff83f300cfe8 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 3ad70d4b6b9b5f5b2eb65da67e1f - -Quotient = e475eebcfc53d49ffad2e0c2a4ba48fe7ce02c42ff107e01ab3fe5b26eee45c83c4f58c181d77c259155 -Remainder = -c83ac7582a02b47ee734e0f24dc5 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -14bbcff5423a260b21895327b18bc - -Quotient = 201308a421b85291d23465d648ad2a8d6f3393efc16fb675a42ea7bbca635ddd8c2449b1b34e5db30a03 -Remainder = 8e07efb8ae4c9df39533042362081 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 93aebb72a81ba68e8881fd1a56a90 - -Quotient = -2584cc534f88f091fe471c652ac66a695906a7cde1fc1cde9be3ee09026b690c1a899378ff31f6acb90 -Remainder = 794801d9d5770a60e312b99d6b9f91 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -7e408caf387a0ce9bbf4309c80755a - -Quotient = -63f7bfc0fe5a5421bc0a19fa6c87713a72eeb2a33e5eadee8c2f32c20d14f403ab8bdc424b9e8e0c68 -Remainder = -24227c242afedee2473c1a66a5cc29 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 2f622c665af7f8126eabfd90df8e9c5 - -Quotient = e557e6d2180aeeee5d2cef453fbdf38e84cc148f4608ade8836045498be2d318520ffadcea6319432 -Remainder = -dd290149e0e159f9ba6bb9f5a4b003d -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -14a7623d1d9dfc177e913d3119d0d30a - -Quotient = 1651d852316d472b41ba0460566e43fabb9257861859ad0fb6ea5a6433a4164299e078f4d50c58afb -Remainder = fb60aff5fdd2a2b794b0d973ac4d92a -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = d439da27b5e70342aa5cb365ece15665 - -Quotient = -3ae357761a8ff43d3b1bc53eb336260342a39d22f8fac44eeeac96c2f6de32580dd6a688faa9c515 -Remainder = 4fa6f7ee4faf2f6be99c5ce4b65cd642f -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -50700f9c0da59482165a47a3eda2bf07a - -Quotient = -543b4390e4e254226683aa0b83b2ca176ec27a373969fb88f766ac72adc9125ff83b2652e46afd3 -Remainder = -12ff398d9a7d9e97a7f63a0bb293c8fb0 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 383c5a4f1767e83fc382ad4f1c7c2b7ddb - -Quotient = ecb72c14c59d49287fb6b2cacdf04619ee617d5f3f0f1b2890fd4e79746a4fbd848613cf5eb437 -Remainder = -1035512a2717a89062d48f1bfd213333ed0 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1402b751a1e5f3fc46e22b43240d6ce9b27 - -Quotient = 1e800ddc5d5126f322298383f32fd593623eb88a91b2d68c5d9f56e20c16ffe2cefabe873570ab -Remainder = 72935d534bed5ba557b91ea023601f50b1d -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 9b4df766c608ff3efe5ea1f65cc850fa73c - -Quotient = -2c2dc2378abceb983904cdf6728f361d279b4c821710ae785724a7251c43fe4f705f023afa7e2 -Remainder = 249f6433af4e8e224eb570fd438197af62f3 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -6b382f812816c77d65c94c0c660b31a69b8f - -Quotient = -5f3ced1e42fbd3c6b2c6f1e16953e0c1bb6efb4e49566f974a968f69a1a66a3d7558f5a802a8 -Remainder = -317a7fb1af65982fe4641fbb1e5837e6ea3e1 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 31bc97372d17038fd842b72eaba2abb26df62 - -Quotient = af3fef8111c449b9e0858e7e53e1d00b764232f7a077d75043249c387ece30af351c8a40335 -Remainder = -a1493bcbf57a8480461d62796aa8f8541ece4 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1b076b2f7b78b4a0f0e24ba3a05d6c697efab9 - -Quotient = 196734cefb08f09cb32ffefc07da8d9545d3451d5a08736757184bad94c73be71311cf1e01c -Remainder = 273e33521f4d74840a96b3fffe169f79d32855 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = ba7746f4400f812919a3dc86b00642e1487691 - -Quotient = -3c5989cf33145057a9c8e904435d12939db519cc6b9ca1c0a11934399cb139a73613950f2f -Remainder = 456ebf56c636d54e37709b9e799e83b7a08cb93 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -4e7d4f389423f42e980eda55b4a6a45f6f4bdc2 - -Quotient = -8432cf3338bce1d12586f83025aea50cff3864af3eb2103a36bbb0aba10b0ba4831641633 -Remainder = -4f62c678137df301c4bef216e6aa910104e76ff -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 23d4c57b5a8162aae8d937be12efbcfd7b96ec06 - -Quotient = 9f94c4399eef16dfc65a1e015e0786c86470299865932c4d564b71c9b1551a9c0308af38 -Remainder = -168b74a6073b4a5b54fa14aacb5c3bb7897ed0fe1 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1daecf01ec633610373b79e04c22cd7499012bc66 - -Quotient = 1d5b838dce6c0324f157ad125adefde6e1045dce9ff97cf8d1d39b79bce02128e3433ffe -Remainder = 3aa816216d55fc3c910a030fd10fbda1e12f2ac2d -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = a1598a12a84e9cba42ea0e200e88d4599c9f615fe - -Quotient = -3edb182b53890ca8762f3039d2d71a8a27c36cc884d0879e0635e6326af0182bc47cad7 -Remainder = 4610b2b1305220bc0de584dd3f87d90109012a8077 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -4b5c2f1ba3a82047c9de61d47cbf1bec86b6ef90d6 - -Quotient = -7571ed4c509630886483f6ca0923859e644063acb38cfb338bf3a681fe449501262516 -Remainder = -21c579846594fc3e5efc53ab01576a7b32d69faf41f -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 28550e1f7c6492f4cb682c37b105f92b049c13fc03b - -Quotient = 9ed8fb31327a110ef4377258681c5287de8ef9dbe62aa4fe84a7f2a94bb69607cbdb2 -Remainder = -1b7bb759dd0ebc346cbe216e56be8063f063490c17c5 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1dd1e61caed1efc07d21ce05d889de1ad65808cae026 - -Quotient = 1aa716227d1ca6af68286062b2d6dafd7ade16abbd5d6fa4ada0365832fe18f73bf35 -Remainder = 32e714b0c4ecefb38735cb88cd5e07c21c81be858cae -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = b1b959a7b3262d7f4dff488315903aeaffd982b726d7 - -Quotient = -2a9979a530046939e0b43a25edfbea6775784eb5cf346a9fc3a2d22e1aad473cdada -Remainder = 4edeb91a2472e80068b1883cf2cc45d68ff9bbed1756b -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -6f31bbe097587a68fdf01d0bf93830bd03a23920ccc0f - -Quotient = -566ff76814e1c7d31ad53bfb9f3c0607ef1f7d1cf9bdee6e1cfb78b3ad7018f8bbd -Remainder = -1eac095d6d84021c33aa9b219d191bd0637f20b5920eed -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 36ccf5bdece624b4f54c729a8cde13325d8dd764f44894 - -Quotient = aee4f377611179d8b6315811dd94639aaaee63e99bddcfa8eee297ce1dc04daf8e -Remainder = -59cb3ba7efa1637c46b21795872e8deaff90f13402cfaf -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1b157ad838684b45065aa77ca3238a4d8c5427f719cdfb7 - -Quotient = 1c72d32cb83cf4a9043d3bb5002f61b03e29c34e44a9fc5cc4d613726f5e618546 -Remainder = 7312d11fb5828c7f1a0060a5152a7644fc1e6a59de28d03 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = a681444c4d47d829f7b629b561ffaa0c3be1232346c907d - -Quotient = -2702afc4095a0396215e3ca36e2a59725f743b30de0dd8d4ec4d943fef6c37162 -Remainder = 223dd3080ede3a64744b14df8742cedd71388b0df99073bd -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -796c9ea38ccf516a2054a1e584c18b64b996c9679960585a - -Quotient = -805585c6a7badc933bced6f8373ffdfe9796e963d3fc90e85b1a22c38f842062 -Remainder = -a6ebff3f651644915d5c466cc2915d104f0f85a44e08fd6f -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 24e8fb7a6a3057ddcafff92916c46f7e4038b98c3104ae831 - -Quotient = 10383ff8feeb180d4fde925b534be97ec3d5f1f1dab5d8cd9ab5d8ea646cfcdf -Remainder = -a7efdd0401c74a69cf74442fe3da907acf92e8edc51668828 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1240a71ed8d81e86fd9b16e1d64f438b35d6f8eff672494017 - -Quotient = 195d95a520fd22317492117dc756ff97806c48c1aac67a41ae56fe503a60cec -Remainder = 8b8692bee56f8a1ada9ffd8b3583eae33a0df9b73a7d8585f1 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = babe02063b61cb90634ac0493174073d2419e00728d46ad2b0 - -Quotient = -37791adae674b866e4791c107a697363847dee4a58a37806391426ea48b8c9 -Remainder = 33986fc6a5f5c4f4e31458fc7de55e08a4e9320509d90299b93 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -5563bb852e7338c65aa21c516eecf47f498e5788c608ed46cae - -Quotient = -68a30494eceff55e4f54a556dd9b30025ccfa22c0952fd746adfd13d31d00 -Remainder = -1b511d0ab81d528d00a1058850bef48df2e9ae9357e779bb9231 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 2d44e919fd27bb3fd2093062d11830c30fa77febafe0a2082cc6 - -Quotient = bd30999592dbeabb8871b76aa04cc1c6c3794a83f0178c2ad505d8189485 -Remainder = -b0dbce286df5faccf0bdb40ca60f508d436f9410c5e49c3f1360 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1909930e2d16fc877c15895a3ec8b2125858bfa1c5a1b8776bedd - -Quotient = 2171694ef4a9d57b83b09357a511d4e11cecbab5e9387928b480d686a0e9 -Remainder = 29abc8898d5ef85f87323c2a6fa36ab6e1bdbcc0ca742b1a2347e -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 8da37bc9c7c9bdc62f49cadcd40e156e776b7f4c8f7ad543f463b - -Quotient = -267d470f32911150d9944e684c14e1834734b15475bee968748dd5f6502 -Remainder = 53a2ffef61709bd7143c4c876e021f20a99ba481f2b11abcd45da3 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -7b117ddccee97816c2ca2f1a612cc0d94ac67f5a79ed41744c8fc7 - -Quotient = -5a21a3bdd3a3d4f1361a978706ba1cec409c296a5b3c369e91fc8317bb -Remainder = -2cdc818f1e445fb3772d2a56833aefb2f5565a5fca80662e6fc1845 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 348dfba3c793f0018d7d3a70c4060c3148b4a3163ba60af9d6f8b04 - -Quotient = b301b4050fdf4ede8f9c746b26d968110e1eb119ca42cd9c9bd8d4fab -Remainder = -17993daf81711fe59204ec82e363d2b91971129af9206ff9506d3cb1 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1a76328184b9bea8770c91cfccf8ab98e75b2224d666af58022aca80 - -Quotient = 19c401336dd43c221a61264f8b91791d250e6c99c61850efe6d1e3532 -Remainder = 6c9e547a77c98eaba1b021777dbd98ea88f7fd37c95a2b182f2b9067 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = b7d7b1f95f4fe2f267af88b81af88fbdf603e54ab6de73ccd000c32d - -Quotient = -38a77853de88a8db14612884b515e3cd7c673175779d4ab71ba58f83 -Remainder = 51851549cfa00dbfae388cc3b46fd4824268e00e12fba288acceab339 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -539c0171f48e4160e5c308ee9e74f35d8b6d032e946dbcf748b1335a8 - -Quotient = -79a7eab82e5b65f4f6734e8803fa7c30852ea3ae56e801c5dd11778 -Remainder = -f89592eedcbcc68d5df80663b3cdc638d9d779707d4ae5a552d97d009 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 26efac15401a945ffd37066bc5af23191292765164a0f1e4fd537fd64b - -Quotient = d33afb58753a21581c5b2351a74f3d220599ed56ebeacf1d43eeb2 -Remainder = -f699437f44af44b3ddc080f5b74f753d35f70baf3866040ba3c64b30f -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -166cc6a3c60facfa0d8d318f26c6514c7eb9113f6b625c1de804ad379f9 - -Quotient = 19e55bdaaa5a375c36e6869700f8677db563e5cf985be2a8d1b012 -Remainder = 7bccc3a653f29f3f45b52b8de2449c868c64d976666c01bff2dca03a8d -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = b6eae7a82b5dd1554795573cbf558d7cfed813eec270c326bf290adccc2 - -Quotient = -297530094c3e4270ab5cf67e60fa5af6a32eb41b18b050fa6d46d -Remainder = 62d8b502e172da7bce53fbb7c1ae376b6c21b3a3a47523aa0023406e353d -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -7241ae5f1aaee9340d437ad2dab94b70dd29fc6fff7fe31b100aa5001644 - -Quotient = -640f3c38230962c6d6fca459afe0e46137525e8d62dd9b84da73 -Remainder = -16fcadd5155910764ecf0b4bd0afc3707e2ce49cedcbd5414f1c7d860e95c -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 2f570d2da7a4e62097eb494ca43f7bde33e36525308dc864ffbaeb5d48f97 - -Quotient = b3895ebba13c8f383ac0482be02e1f5518511420cb4513426bb -Remainder = -21bc847fdfd48c7a4c36c778681ea20481081cbb7af6b281c8b8ebf2b2c3b -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1a6233954b3480af5f911a6bb8ad33967d5e0446c3e56f521e892c986b6b82 - -Quotient = 243f3fbefbf842c79c5e96162fc42fe4f177a59d27681c54b3a -Remainder = bbfaf15a90e744dc4a1caceda3cb339e5491e4507a1118613c5e9739f976b -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 82ae783b8a13e2e65d52dd3a6d6b057163347872f4d72245ff364dbf2421ff - -Quotient = -30f7cef2948c9ebed8fa3c5ea9a9bfa96ee4e9729c9b18e9d3 -Remainder = 1feb3fd887629cca60c664e385dddf538d9bf7fff2d34ca9e0e7614946d807f -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -60bba60d69093c0134fcb90aefdb9c190e7bf037ecc13dab3cc7915d7893046 - -Quotient = -6b6f0183c1f598a68683ba7435c05d700d74681fe472669a1 -Remainder = -1f4d58f81a8c18523918d31791a00ea9aafbbb87792d90a5392273ec4e405da2 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 2c17372a5128d7c403a3b94838072ecf9aff88d164764b12bfbf6261df957e2f - -Quotient = c4347fe42b2a7d9d5a650b72724369c5c1f59262a7be3fc2 -Remainder = -1103ec9c4a15373949cae4e34b7b42e242da41edbf5ad8362ce5e5426d3154a1b -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1824671758069b7660bad819f06c86fc76a9344ea38412058380363e5c5b4086b - -Quotient = 15e8c8d6847dfe974cefeef5fee93da9e58b74d640c6c413 -Remainder = 61dac240f2b39832903d5ecad9cfda5162bf8ebb0610545f259b75c3dc6ab8771 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = d83386fb9682576cc70cf84520c53169e391b414f5421cddca6e257bd77753c40 - -Quotient = -3572711bf994e6ad48535cc4d65ac323ef1ccff530b4337 -Remainder = b5899d4cb879e37022c539962959339d055900cca16153da09b54c658753cf50e -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -58a05faf5c61f85ac5a090b6bb045c851ea17332d9bfad4309ce2b7a79ad3cc575 - -Quotient = -6931ebfc6e34305e5d7cba5284829d088d1ec0abdde508 -Remainder = -1b09eafde481064bab3a5c7fd895edceca40b1e62a9cf953eae1061dfbe00936391 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 2d0769f392ca9ec629ef1bfbdf08cd8cc9219330ffe3c05343df792dd94b1147714 - -Quotient = 9a4800f0cb2bfbe8d234410deb510103b7da30cbac7d9 -Remainder = -971e4a529e439a1b96b942001631027ff2fbe40b8939e224adb7f2ed30faff64d1c -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1eb3d7971125a036c3a67d9f5ce580a4ef4c469a492be53a55bafd2eafd4032b5b9d - -Quotient = 23116704b7a1a86cfa2ee5707ee46268634db5d50dc0f -Remainder = 467c6b64c8121e4f250492191ea36a27119a0a6d19af519bf7ccdc2436c885c99d85 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 87134e98f73470e23a96c6a9139af3d4d21574de8aa9ea1d720df8940bcbda343694 - -Quotient = -3b7f72ecf4f55c02366c52f38a827f5773b7cdebb9ba -Remainder = 194b334b2046a66be3ddd7c6df01c88967fcb11e97b8206d000bcf6043c6e9ccb13f5 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -4f9d0341cadfb1f0bc38184d93503faa196fb8170f8ba2b5d3b512c09d39b7f79a5b6 - -Quotient = -6db1d69019dd4cb26fd65d5b88a31bb6413b30278a1 -Remainder = -2042a060391e181882dc0c8d91c3b03c1ea35e2eff01babb3ae876ba1e57a505d44856 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 2b2e8f445c0c3aaef0285945e4ca37a700310e003086f34d02c891b94b117f3d3032fb - -Quotient = c0e5b9a5853bb21b5e2e37f469764579d5cb2bf984 -Remainder = -154669d4bce7914cdc8d79f2b8d1faa43e8cc3b20fb0767e1c9a47c9e1daed4b665cfdd -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -188e619dbb719381e701363de874fe168529c10f30d3ff184e4356991fdec1649f72235 - -Quotient = 180054f8c36833d44cab9dd61e6d89d28605c564af -Remainder = 59192ec5c6fbd9773b8b7dd7d8ab1800dfecc8eb01c29997d15ad75b79575d9e26e1fc9 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = c55b5eb165c63ac2794bfac21980ebacadb93f1e059309fd2b855621572e8d9b3f29018 - -Quotient = -31412e97045c19ec38951b0e3884c66d1d7479437 -Remainder = 56f1425227bfc6eb1ecda7bfae0e5cb59e92a2cc5306b28465c8739e40893dc5c1e94cbc -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -602b8c25ded1ab3877f58cb048c733649c7dcadf87b2652e35c4e5544d2306107ebff7b3 - -Quotient = -8da1489ccf7203ecead94c67a5750884122b6e75 -Remainder = -15162026586a1e55dda72785f31c9e6140d166a1fd34c87a7d8c78f8d8f87bbdcf8f75b1e -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 2171ee4a6f7f67d5a33d0a08c367184d70ffe39da28562655e75f6b66c866b1c2ac93e467 - -Quotient = e635f8bdbf80e99723aa5718d3fade4e573be2c -Remainder = -ffbd73bfe05f95bc2b135f12682288c620215eac3d6d56503d93a90e06f236e597d1df975 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -149375d478a096e724b84faf795c589ef0d772c4623f5be38da99006cd833dc5b28363faed - -Quotient = 20f76f5c6d0c8284764a10f6936c22bfba5f851 -Remainder = 82e3fb3f7252dd87b5370d26d9e8b9e98c7d333701f0ce8a05c337054c7aeb343d04d7e342 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 8faf8c0a3ef94ab1069394998e5412a7d84f44aff97edf63abc46d96f897172c38faa0b13f - -Quotient = -382586dfe93872abbe3a504fc62a8973913f96 -Remainder = 4d407323ef56093eea2f3993334215950f4e1a85ba18cdcd77d819d92b8b292c3ec8edea425 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -545d81ed25602b158bc79aadf98a8f655fc399fb8652ae94333bf54c8c9ffaf8c6b3f2a9d52 - -Quotient = -7d179efc493eaceaf46572a1f3a62bdfc4a38 -Remainder = -3de3d817a9cf7d529b5229a503e8ebbbd2c53215ac3c584c010947f780198dee16ffbf47791 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 25dddb00f65d6a1ba8caf7815a8063c5da656d775eae9e0108c68ce11dc925183810888dd04c - -Quotient = a9f7e5f235bae0e3e29393ac5c99d510b009 -Remainder = -150478b4a0df3eb20dcd1be8da283a00636c021c5c6337e7732aae9c4b49853b95f6d2475ea7 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1bde6cae7f5ced9006c0b1a61fb50982a433e4e2050aa486298f456556d8e909e96933e2ba3ba - -Quotient = 16de125df5936181981b4c2d0051a8b4d211 -Remainder = 29ac7c8a11f9beb9ad649257994216146b663bf4f237c561bf315d95778fcdb1010283475ebf1 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = cf24735a60ff5906410be5c4d98e3c9247919b57e404aeabc7eaefbf07bd64762bc61b96c9040 - -Quotient = -268a52cd10ab4814268f66d9f44f71a98eb -Remainder = 20293699f12fbfef2e391963866fc082a7884cd13b1c9bd8d5d203558feed2b889720be936451a -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -7ae7d548212830013b7d653072c33f0dd54a6ebd8792bf75809d29a8c798dbc67c3edd99a69b85 - -Quotient = -8f051067ccb82b6a3dffedd0ff2ee97c46 -Remainder = -100dac0d3bf5aacc5fade281c071eb2399560a65349566567ce1c0c34e43f175a575ed1eeeb3b07 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 211ebb5dc59a051fdfa3b18ac491971e863f2086cdc099672c1215af4ec877e29950efa4f487be7 - -Quotient = 9b7ee4c499386f922432fcb1a453ee2ec -Remainder = -f410122a74386d724cdd45b2e548645ac5ee4a44cbfecb82aad34ae470526674da44ebbf557bb75 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -1e76750814dec1ecbb1af0fa2281ab3185e94e47fc16a77fed312f23f261ad7709ad7c9f85862c1d - -Quotient = 23efb26228d7bcf281cd45f54572e2b3a -Remainder = 65bf2ef1c2f8e94d98060aa305f85e6cb869c74eabad99877010d30654aa2e578ef6aa3c5f1122e3 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 83cfc25e90a61cf8686e3d5857b2f958674d478622c54cf8427275ca5e9312ed24e44ed4a1b5e413 - -Quotient = -2cfcae0e922f2d884bfa0a3346dc9812 -Remainder = 14de2725b11a9c6784d9608c52770d29b9fbf824ecd4890bf28f3ec0dc6c52e4df9be540332b8882d -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -694b057ff381badb37c7c15c81e74cbd6774e8d61c9e7d450811c36262ea834fc1287fa59708ee072 - -Quotient = -4c0238ff3c18d4d58e543f020002802 -Remainder = -2ddef796c50817e82ea6f64a02a8c6b30ab40070ff5401c2d39ca14b9c4d99de33834bfe566a0c2efb -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 3e51c9ab14f522b55e8f9d3ba995c0846a864dfa2d568ea211b0cac1463ce6a1da72d0a15746fdcc9b - -Quotient = d41f9102a7785ce64f76b7d7b870b0 -Remainder = -106eaafdd518c658bd371164ee43ccd915a01b513fc7d220900039ff840ba36450e16ce9987e08e7141 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -16549c5d57b531528dd4d781f03cf275b66cb94eba038b782b739c3ab30b8631c8706abac06004a942d - -Quotient = 1616b432b3277e774aad92b0cf544c -Remainder = 2c89373720b834d718ff3df985ae47c3a7cde0e0309f682f5fd48dc97a1ff3d69fa0dcaa1245e956445 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = d6721300e877a8145d05f4f3d8085697c2ca5f34a5357fed0bdb7169f83b6f8d855232eeea594846b79 - -Quotient = -320fd6a7375a42a3961362ae196d1 -Remainder = 5336711bf81237ea3449f4e9f4e6358dc250f8ebd86082cab92a8079f2c8f835bc783082efb0ed7e3f66 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -5e9e8e1d446fdd314d487cac1226088696e33161d923acb67d3c75e87e428bdbc193e02f53200610fcdb - -Quotient = -4bd06daed3f30345d269f51e4381 -Remainder = -1f3513bdefa40662f0f50a04b418a833aa2f85522dc6c399298b1b147662ef2164ddbfb7247ba9511b8ec -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = 3e7ab7ffe5f63a6c1e109b95b83af470ff820cdedbb3c90c398ec42e44a45e1ca894870a7fa51f17ad5c5 - -Quotient = d6fd01a0c5b55fbe36e58bbe77b -Remainder = -c51af3e8b430870388357cb366ea888bd7b4ccde09ad3a1d2ee1426af060245c6d6b5980ae87fb66c4642 -A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -16086df3dd5e665f2631a294563c68931faa19ee67d6a2153d262940a648ae71bb3c1745daca5ea977331d - -Quotient = 18bd9a8f5678d28cefd955cf99d -Remainder = e193f2fece67b7abe16373c3f84f18dfedcf654d951bf47585fccfaf67ee04f5037354d057c9f5eaa8eef -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = bf758acacd11f3f3e6665cd740517c9ab2384266f3c7ff9afd0888cdad2f6c9401c24d6c11fc3949aabbaa - -Quotient = -371239db55c79521206c9e60c0 -Remainder = 93773085af7582dd298b09d7098835787978d820289ea6850f27d0d77eecce8614785e32b228f46ca4b371 -A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -B = -56033fd85be464301f10177b58d895fbb6df6154da5c2a2a7cfc3a24d83a96f5295fb17a08148a4e51dde91 - -Quotient = 696d8e378d12221e2d970c53bf63a20ef381db8566701972c22fe067cdba99c57b68706a5c6e52f21bb3de861e49ed2141b3036f07d1fd0ee -Remainder = 9f0e50ca76031b -A = b2668f5fbcf4170820ed3fc9b12a61862acf8e3cb17175482efe23c5cfd3556e77634d407b6d1f98a73437a8d6066319a7a860afcab2338a1b1313037e30f4d9 -B = 1b1313037e30f4d9 - -Quotient = babe271ea266bc7bc16d193097903037819f82366c7e9ff8f2cb14157b40433c6ee327038d5dcc44140b070d823befaefbee5e13419f6f17 -Remainder = 93d7c547a9ba0a4a -A = 74b1a591f449377836f378e05d2902b29964df59c6926e5a9182cc09ce3111783cb7021a185340b4880d56635de268d6f3855c4d9997373b9ff8df899ee3b3f1 -B = 9ff8df899ee3b3f1 - -Quotient = 890139fef28aa3b77814e1122b9c7f26e746ee3c507e6082b508fcbe380de83b06a01f735239c6847c30eae44749fc8c5e3bd97eb40ba297 -Remainder = 6c97aace900389d0 -A = 7e89adea82b4cb6feb41297b6dc8d948e72c3d5554a987900e7fae48cfb38fb5282b13d9a1f5793cf7cbf1ef551865041c3ffe0e287714a6ec7123556af55a48 -B = ec7123556af55a48 - -Quotient = 1fdeead441e2d7a6ce3cce2389b2a22248ddca7970ae3f7e7d8453052fd08534ff7c46f6a4537fb6f28df6c5fc8a7d384336e679b74205315 -Remainder = 2903c7cc2651bfa8 -A = 9ca66de3d83f0a747fe986464522bde5e42aeac20e8ace1ea13fa6bc9514c58517479a4281d4128c6d775489b85dfd114ad184613f308f6c4ea484a22ab0ad1e -B = 4ea484a22ab0ad1e - -Quotient = 12f16c8f9f898a08853982e2ac5a906d784c5ab8d74007ba3ab311e861d7c1ac115efe694cab7583f75a4a59ceff2887dab53b2f1022aa452 -Remainder = 4bdaf1f352e87aa5 -A = 6e6a97b358b591b78db43772378dc084a11836ddc9dd4607f263ce620714e8fdf6bf67387c163b6f2999f84270802b4bd5c0f0377e949fbd5d42fe145e66ffeb -B = 5d42fe145e66ffeb - -Quotient = 14e0c06c8cff1f9f5dd8afb6fa6c340f0953a18ba7d2b26b22d8e7f946ef20fd5ac277ceb59cbd4ce3e8213803c3b5b0452ed449e22bf2c29 -Remainder = 55422f1caf4a9a00 -A = bc9c054ff568af73e301e0751bc1ee055e82826cdc53449f2d9f45feda2ba227bedd6df9b74fb58a85917d60b087bef04a156a571716e9bc908ae83784ee35c0 -B = 908ae83784ee35c0 - -Quotient = a457ea94da3237c0dd15ee30e9c13e7b4ca1dc90fcd67951b873787206babaed837a3eb17e298d74cae92d1059636f9aefe11aef9ffa31053 -Remainder = 124768541b600598 -A = ea6dc82b1906c277526ed867fe8b0fbe32feecfb935dbab860aef59a7d72799fd4e952e70b4c9304c7b2a06af8badcd6cfa12d0b6c9db38d16d2c4a24099ca14 -B = 16d2c4a24099ca14 - -Quotient = da0a37eece8972a0e2e8817c54e67c4d9f92373340488539d5051984bce0ae3300ef6ca9d0902daa4d485dec3b4db6c8b1ffd2c5d08b18ae -Remainder = 1ba15c46023500b9 -A = 36ca8763e20e6ebf07a55cdfdd83892bef0bab68ac092093bfdac1a49c1da015541196a24249bb2262e70f7ed53e0fbae61f02ebac4b61f740548136ce50f243 -B = 40548136ce50f243 - -Quotient = 3d8c433daedfbf681b528f88d610204d33bbe74d0b13978c34a617ae94177e07a757519b5a8f1a93a73d0751c7b5b72b4bdf475a9708fecac -Remainder = 4cdfd72349c6110 -A = e0dd7e73b2a64dc017da65992176e2535c43b6fc14f2f7b0a7d894d768bbc77507eac0112b2dc3ca83d70989a1b949ccf374be6a012d80a23a74bba39671fcd0 -B = 3a74bba39671fcd0 - -Quotient = 39d084b444e39c32f2883e9968301151802da15141f65893f37b8b834eb01c074aa1e1a978c5c99732c87ae106bf8db09e1728c8bf2aae88 -Remainder = 2950443357cd7477 -A = 16df31dc290559c3b6a3d192cf15d825cfe79f8dbd5c9848eac7fa90eea5d87f8b430cccf9baab3e8e4dc33467a4234d8551ff25e33af175654686ff1368e96f -B = 654686ff1368e96f - -Quotient = bbead8f70c8e61114f22d36e97861f16037efabe1347613e78c51d7f539065421a66c907faddaed13ad2a0f0b00f8fd594e917799cd937e5 -Remainder = 3013136f5f728b68 -A = ba5e688ab4f8ab5c25592bc4334b6dc2b7a06d491d0f919b716bf1cf109b62a30d9dd59dd4bdf870dd2687894edab303277a5f3e3a537cc8fde3ee3bb61767d6 -B = fde3ee3bb61767d6 - -Quotient = 42aefe467ff2a5614efef1edce25a1acba9c476b3abbcd680140a3aecf8f51c1ebaab8912de217451bfaca2842c0bae717b8a030b6318c0 -Remainder = 1f130dd2ead0d35e -A = 17bd50b5322c51ac883852ad2a4446c039dbc210ca3aa0313065fc88cce6819b324e93b036bd0c71be58586cd2b243d01a4a918c10ea0cc5b22f9d795df09de -B = 5b22f9d795df09de - -Quotient = 13de73dcd72a3638fe2a907fd7f6574bbb228698fa60e4ecffb082911c5f09c74bb4f50564d3d4035d07eedea38b634a3e3acc26c8e9aeff8 -Remainder = acb8702f0113e0c4 -A = e0327b2e59236a3f91ccf960490cc69b2afc854de9299ad2edff9618f9fe24251886afc65f5c581a9bc86013f356d599e98b8b10f5236a51b48a6b29025983a4 -B = b48a6b29025983a4 - -Quotient = 27d11481f00519b786eaee96220afd45bc51700f7366fb5e7da35bbc84891aac3d9d2b709dddae371a6b78439fef810c68eef586e1d68350d -Remainder = 3d1890c5e1555d74 -A = f3504d5d96c9e27a1527725ced337f1cd0a183531642051e166507432c01e8d44c4e8918701c2a05eb8a9d7e26bf04993f9adeef2826ae4e61c602477f849121 -B = 61c602477f849121 - -Quotient = 10bdeac209c67b023044186704735c7291423054bcddc24b731ad601b49372f4d5ce6e9d85002f8dddf0411efce943f81a5e42cee2d0c9fe5 -Remainder = a93a0c5bd51004e4 -A = fa29e37b0d0410d19fd180149b14f94ec2edccd347da65f6832850aa06a61b7b78c96faf64dcb347893c93c560b8043466419864a382c6f2ef1412873b2d8cbf -B = ef1412873b2d8cbf - -Quotient = 1c9b6cffe44241292320c0660b89f2f77aaadc8d36e33f5ac3da0f12b3c114a156870a92079f7192d237f8bf49aeee6282531c929cc56d75 -Remainder = 1ce3e5eb13ac7958 -A = 144325a641463ed6bddfcbd73e50620a44c606d71fac38efb1c9d2747b4903f7b51fdedacfb66db022aea09b43c7c2ad7b851035165ebe59b552d4f7eee617b2 -B = b552d4f7eee617b2 - -Quotient = 1b4ad18dc0e634053beb3cf840b53e35117ea06309ea8ca22e37123fd7e1d391c96c792e5125e322c27daa73301024080d73ba3491484b659 -Remainder = 3286bdce6dc3a828 -A = e3a2b90d3ef446f6bde30d3e726cf3e78212324054b40deb0b18fe00645568fb0a6234b6bded6240977373731bb30d1349e25cefd54b7a9985735e9b78002691 -B = 85735e9b78002691 - -Quotient = 28f5e8da6733240cc2f18e3cf4d42a50d92816062af33a9e1871fa89bdb39a0d905c49faf51cc1c1378741bea34d25ac2c8e522881a6f6087 -Remainder = 135784870eb40c68 -A = 593206f9367b72f9cc59b3e37d2eb23b2061422859162ee53656899c2471017474f500c6e23efe1f6b1e57852cd4229329dc182ba01a257122d76a26aaf9b844 -B = 22d76a26aaf9b844 - -Quotient = 1ab276448d16c533b6e90b5b5ca266e13ec27b5a58c80b7657df963ec2d1fe4eb1c1d24873eff6408bcb3d0cf97c31e85240eedf0efcc1e5a -Remainder = 27b105741264f875 -A = d84fde3d851b52ed3b2a1268e9b765ec6c09c5768bba709b3b799802fadac30a6c3184185e6d57249b1c34619f3c9d2b90bc0c348b22537281a39fcadf738083 -B = 81a39fcadf738083 - -Quotient = 84a87678485b3e60ee1cae3701ebdf0a29ee44115a492c34a0c8e84090e14070eb2ad0abfe2c339f26b5099327515104fe3d1c5546feea98ed -Remainder = 95f7434941f9d8 -A = f79a0643bcd9c28cc22cc7b4178b3340e4685dd2672792516d6fc08567d2de2d3e25d43f100a58826edb146ac94acac4213bb09bdf8a258001ddd0ab110b89fe -B = 1ddd0ab110b89fe - -Quotient = 516a2ac26e5b3afa502c7f3c6f15376f7a380e5842c229443343b5b74dc3de84db3ae99a0c57043e32a504ded19943c0310cababb3e92cf8 -Remainder = 327cf78eed336523 -A = 17c0d5814e1020d5d69674bdf6b9df193a16c0c8567a589d014e8eb7f6c9c36560791f7acbbbacee7c456eb51a4cdd7ca88011e9d8d9f2d64ab08ad74f7be5cb -B = 4ab08ad74f7be5cb - -Quotient = f0da0beebcfaa716f494cf3fc81fe65117c90adde3b3942e8e66986fe8050fd5c9ebe1c88c5db04cea4c4c14779555d70cafb53870671f95 -Remainder = 3b2f844440d7be00 -A = ebba8c393c2a22b094d824ed95b4acf6875719fc165f73ee6d359e1134949169fdacbb42d5deb8cea96e11e3aac985635b5bcc6c02a6778cfa8e03d9ce6fc680 -B = fa8e03d9ce6fc680 - -Quotient = 56527f07593774f0fa642241400985d0bb9b41d3dc9e025ca069130d93afc972d75e3fe0f798e127c3e1b4e925000459a3a5a83b15186e516 -Remainder = b620b7a3b752b78 -A = 5d6cad9e26267abb480b2b9ac5ea323bc4c3c53e0de8ce40c89c85accf0499aea5b11703a04296519047585ff12f8795f98da0546c20016a115100eddabfb468 -B = 115100eddabfb468 - -Quotient = 294dca3b56ce9529aed2c132a9bd6c0c61de7a58ac50582f396b4fadcf7873b502bb869f801a9ab1f12384631cefee72b3e6050a7f69eba4 -Remainder = 53a0fcf5486c7a6f -A = 24aa73803f270185d23310df2cf3ef67b18d7800bc41aad2ca13f372a27ef0a9217194f3f512e79f545a903895def195a5eb9a1a1b6b3f4de340e9da9b305d3b -B = e340e9da9b305d3b - -Quotient = 16bf4dab1c29bd284c9b6649de65a4ee58f21d6a8b51627ca133fa817872b1a4a9956662db0aead5898ed0eda08511be7c47449638f2fab95d -Remainder = e7751deb047d98 -A = 77b04d93272491322ed2fe651044e28cadb2ae7825f02b55aeb0f73b8b8a8b336802416fe08c718ab681581ac04d87116323f61f50bfd2180542fcd4a46dcff6 -B = 542fcd4a46dcff6 - -Quotient = 388ae1c243bc9111e663c0c80495c36e8767bafe188b532b7ac84b5160d902af1b638aec6e4c66955d16bd8ce94ce6027a7bf95910f705ad0 -Remainder = 7c667ea307017c2 -A = 52f357e9a57722a867d8199242e100f06e8df810ee913d6992bfd9dc03ed78bcf44d692aaa7be806df0c9e0802851d7ae8405f76114e6322177907198f85cb62 -B = 177907198f85cb62 - -Quotient = 33dc2fcceef7dce92e3a9df58566c6e28d03b58ff6ecbbb31e43936cda6380a56788285d37b5e8f11487afd78c39cb2150cc98d9d78a0c6cb -Remainder = 429a380c9f8eeeba -A = d99cf9a0bfc347c9631ae8c69defe1f1509c3ecaeeee5dbc61317bb73fa5cc6e704f64c865cf4d898f8a2f63214dbd511f61aa6e09856222432376698f8d2f67 -B = 432376698f8d2f67 - -Quotient = 18ecac9e5539a014cffd8310ceb1170577cb23aa9cb3c523d57ad83069d1609ff743cd3c275b67097a038b85afcd7105ad21672f9ecbbc7df -Remainder = 37924fea665f5c92 -A = f87aa8b6e62b09291e0e9b832ad71d8f85d60501a8d89d2638dccd4022e89bc4932c186a198557282527dfa86dfacc2f90fe0656695b61429f8220509f5106b9 -B = 9f8220509f5106b9 - -Quotient = 37c0649a53c8cab91a7458702870bf64cb1de9fc1c6b9a3b92444119d368501b62d3a5138af72bdb7752eab8af6bf4e3bdb9e3beb1805b88 -Remainder = de179463e3e91ad -A = 995c04c1f24c4efe88393bab7a7545e39193662d5db7c8e557d6c554ed4367f5af82c463d0ba6bc3148620481140add5677937989e03fb52c0323980d8841d5 -B = 2c0323980d8841d5 - -Quotient = a6d193cfe7d8983768ff29908ee6e07fee99927a4bc4ef41d01f63f3b4a2e7029630b7d925d0979458cdaa903771286af672253cd99593b3 -Remainder = 6bf69921db298b3e -A = 55c856daa8110599cc4fde0a44acbd69a68eb177e0438f7d843ba0fb74caab2a7e0c8a6f176f5555779e65c555e9157a16a1497edf36ccb583a458f0372a57c9 -B = 83a458f0372a57c9 - -Quotient = 63f379bef9866b59f8bfd6bb0120a75dc03506b0034e7440764afc8ec14d8d735aa6f03a568ea98d0a74ab9bbe9c6e11b288467e5f79a2539 -Remainder = 11c077beb8667d88 -A = ff1fc3ea60fb37ff23e2f2f4e207a86e055cca41eebcc5bd6376904b51fb3d233cb04666fdc92be33239b5ee552870e45717890e35fdbe3728d6ff55d5662419 -B = 28d6ff55d5662419 - -Quotient = 285ba8cdfbf00b112e496ce65cdba2271c82a273b3d30bed82ef2d360790c5deb97f3311bd5eb9876a61e33b3a37782d00c2d5ffbeec752ca -Remainder = 1672a8aa119c3a1d -A = d614352268930d301aa4046cd38e2eda4dcfcc52eac984943f2c863de5c4f8a44473a8ecebf12cb8f4da4722d305e5c9c3eddc0109d416e854df334dbfcfdd4b -B = 54df334dbfcfdd4b - -Quotient = 358178128648fa9ea28dcfe68b4cecc7071e129e3ce4d113f5d1e387f7e5a412e9d2dfe5ff16d9987a544004d213ade9c134cc240eeb6871 -Remainder = 44c3fdb374bc0c30 -A = 18b973dd011969e29a1f4a5b8f118313f715c2e31dfebd9fe0957cf23cf36eded89c38637a8d3512bb23324ff2a3627d5b942300200c823d764b7a6c12d1c91b -B = 764b7a6c12d1c91b - -Quotient = 19ea7212f6604d423b308fe3f2f4986f31aea9d6a117a3e207e38ce5bbd8d7a866285ac60433630de547fc84e364c451457fbf864a82c6613 -Remainder = 2718de2dd0796f08 -A = 83577f755a448d5586e19486b04de7836818223ea920465c4eee979a9ce5696ad8e2fd5253b5d5dcfdf355465e8c0819658ccc5580fd29b351169b54c62b779c -B = 51169b54c62b779c - -Quotient = 13e0c5b9905770b60a6f978d1c983cbc84dccfaed0f4222f534df80c7d3d129f5e8f74f19581332a7f6d383915424c71db4ca19bde2591fcd -Remainder = abf5f6c8ab6ed4f4 -A = e2bf43c91cdbb244790eb165cc13feafea36f5187cc9bf8aa8cf202042efd5441e3822a1164992da5be750aaac0bb11f09375bdfbd4a39e3b682c7ee6ab5f5f1 -B = b682c7ee6ab5f5f1 - -Quotient = 3919f31521e87f90df3a4463d0c83fa31e3f569449009d307962d26f07d854e8d3f0badbf55311c206bf34e6227949327a93b1a5ada7a930 -Remainder = 6c3802d44dd4668f -A = 2546880cc6f97fb379afbc4a2664115ba7909414f35a5bf88be2ed5187bd1a24afaf82eeceb0b438d4999ebf9b7ec752236669425bd3cce6a71d9ad67ff2ff5f -B = a71d9ad67ff2ff5f - -Quotient = 121d5ad4115c2768b962e51d09f426d61624e0f203ac6c923289b4e7964e165b34f3dc1ff938a7cf37478d407de251c64db71d3ee629c1035 -Remainder = 660a35e1c1245910 -A = a36d3250c123697adbbbdf489e6cb40be57febaff654ca951c9fa0b396b1714c55ed6e05e468153ac443dabca29de9b43cc0cc4e62cdf24690593662c86fb5ac -B = 90593662c86fb5ac - -Quotient = ad81debaa02f6e60da58b46e76ce041fc4da64138634ea7b3c165b8fbda027eb64b6b5339e70babbb83430d60383c2cfe22029e617fd03a7 -Remainder = 2e4aeafa2ad76832 -A = 8992cd131757ba5cbe54aa58be115723ea3438ddc782a4d1996980b7b312fa76e4483584df744b10340e5fc9e468690cef538920a732a8f0cafb4e30846cad1d -B = cafb4e30846cad1d - -Quotient = 67a71b9ebaec91121a8cf6bc2932b6be01af7954eca69c5202d771c2c2d13683cdf90ec942a3445771ccfe484f947f078de825ea88b3c05a -Remainder = 8395953f744cfb31 -A = 4f8ada84096198175174896167405b85cbc03fe0642f6b263a70f9a22f19ad6c9aef38da8ac036d409e6fd925023c95312cebe04eb653e0ec473dc8dfed98967 -B = c473dc8dfed98967 - -Quotient = 9416326e2347a541b777a0fa1b0c35d8fe76c940d24c6f6806d6ae8ac1e280c16e480786478bda3f780ee92f3f3c361574efc2ed5ca98e26 -Remainder = b8ff45f31bdb58d8 -A = 902f5e48b96b9b1fd16c3b21292ed495987ddac4e1d92b2ab10378f2966c4399d6a41eef622a4991ccd1f647531dcd145de4ac99b3036779f9414ed2f4ba7e08 -B = f9414ed2f4ba7e08 - -Quotient = 403c651b4e571e8301c4158fc185396554bf61d900708d2af5c2bdf495b3cb539b0b9b5acd0d71654b3aa68024961d5a7bc9e2788e6c822b6 -Remainder = 7856ec047cec8dc -A = bdd6d846983fbf140173a26d2b709b9f31b4fee1eac9d25fdf0ef3523be0e6afb372acab470cfe1806b36d84017ec99302eb9eb5eb2862222f4916d8b6201d14 -B = 2f4916d8b6201d14 - -Quotient = 1b6d967173f9777cb6194c8f69289b91da731456fe5a1515a49e4463cd906c84f97381cabdf9f358d97fad5d3cb140e3a3de397e7f9f683157 -Remainder = 83649246ade8bb4 -A = e3da80658acd53ada7c2dc57178e697f2907c5b0c64f4a87a794ca7521105a0568a32874207646df3768ee60964b7d1d2e29ea6bf7fbaa7e084eabd4ea553a72 -B = 84eabd4ea553a72 - -Quotient = 27b8f1e49e404455cc68217a20766590e749507976a3a6de25a7cf2c32593aaabb04d84deba1ec6bbe048a2959ffd747243c396dc53c9c811 -Remainder = 3daa032278ce53d0 -A = ff3ead7c7b27f607d16f1ef4ffa91b6cc28301b9256cfcb0c22b6818371ce648ae8812dc50a86e4bdc0d0b1e5b0d55c6ba07b240886a6d5766cfb3ed0937a543 -B = 66cfb3ed0937a543 - -Quotient = bf987f58700508356fb6274f64a9f78d455e4c436fc6fcc980ec0800287ab3789b91c29a8a72b16645ecfeec926b6f8242f3c7dc3adb40cd -Remainder = c007da44faa80584 -A = 971aa67c9af10f70977f600e10f9278b8e66d2471956da38e5f4b3fedce9a5fc7ff42b800bb4a78314c70bb59394d0880383f5182b6c1960c9e5b47ef8e63be5 -B = c9e5b47ef8e63be5 - -Quotient = 7332104442474715d7c4cdac15fc1731240f8b4dd0e6ff3284a15a62a8f9a071dedb87f2220efcc5839cb7e6933a8f65d767819db26e134dd -Remainder = ef65a7789f54174 -A = bcea2ae4b1edfebf905a5820f0481b6c58d76a69df9dbe84764add3f49496a5d7005d645eaee3754e0ed105c13a114e6a0eae5cc4efab6aa1a3d3a0050fa86f5 -B = 1a3d3a0050fa86f5 - -Quotient = 3f6182804a7ff12fe7ed3c8521b55564559b1a47a78e1fd56597b9470e7e0f6e7e48c58bc8841c9d118718ccd5e0c0bf9a08d8e244ae60da5 -Remainder = 398e30aff5bd284 -A = 2b877181a960c5e29ab1b2672ee22539256a82369e8f6cb5bcfb69e5e4a41f782e89b58fc0ef6ca336469ff929729f8492b44f12199f0e1c0afd12b2c999e787 -B = afd12b2c999e787 - -Quotient = 1a80a681d2c42edbcbde552323dac3a1c03b43251a99b5549da6cb39ec6947daa0d574f0df68512984fa8e269b0b27a5576b3aaccb76ebc23 -Remainder = 378e44fdc7a5ec4c -A = d37e62f44de27a1418f348139eac5ab9fcc1ada21ea6d7695273daf638b4d7eee6745f54b99a9678cf742d304736ee356f66d16d874f8cc67fae9be5dfd41a3a -B = 7fae9be5dfd41a3a - -Quotient = ee982a63816d56758c29d284c19b9b984908cf0a9ae3f1f926e162a2cae4f88703aa477c5c14042247635c103494d11593c2c3839baf4d93 -Remainder = 39afe3275c01aae6 -A = 9a0b0476cd33861d2fc3137df292728e1f636f6fcba5105f384533723231a3104e7c77df46f7f34a4bdc63d5c67b418cafcf106b26ad020ea547d34edac1d3a5 -B = a547d34edac1d3a5 - -Quotient = fb3f4a39a661e5c31228a6b7b4c27e6e52d1954e8ce262b98b61650efffd762cf2a1aec228bec5d5787683cad6b2e6e49a0de91c15c81874 -Remainder = 63e5ed36ff73a42 -A = 4453712f56467328401a69d4d749a0771732734a760a74094e50a62a030cb604e735bfe0bf0641754edff94ac0e0549e8c10941255f0f21f459e52a6cfe4d9ca -B = 459e52a6cfe4d9ca - -Quotient = 7af60a7c0f995178be76c070cf49eee311e6d1e3afaf50c8c93ff200c1b3fe742b23259b4fc0b9ed0947be4fc9a6c212d86de9a0f7dbb5279 -Remainder = 19657d8ce516a138 -A = c9c92a31ad0f3cfb56a294c42a26eaecb77edf33ed40a7e6797927a0c996a7c0a701b484741163df388bb082e3daebf4e1b7a99002632d6f1a41c1d517238557 -B = 1a41c1d517238557 - -Quotient = c890c55a8e2a3105b9bf9344a57a9b9fab5fa1fd57083d52431b695553bfbe7a44a9b6cd1f83958224f351f8511b14215d1648e88e938573 -Remainder = 1bab5b03c372daee -A = 88341550e470016c7ab600b9f6cb410071a77f907a58cb6da4ce3e955d1e859534c2c1098fcfd91b9fa66926e51896733c36a824c3a20844add94e27f30ca651 -B = add94e27f30ca651 - -Quotient = 34c240c42da400317f66f5151630493a2f200ee418d5ca3300cab10dfb429c2acd7280bf066fe19115f86db83d8f5b93cda714533b16abfdc -Remainder = 18cd326996ccebc1 -A = 7e96d7b90ff09b114dd4393e9bdfb13d8ff517681126c566e18dd6369d87d248734d94bd02a1f19cca90be7642822b636369c51dee441a9d2663ec896e1d6c6d -B = 2663ec896e1d6c6d - -Quotient = 10d18159e75efa8204e325e6be830b4ee8d2c07419e8276edeac6cc286488fc0c888300db3ebb5f935aa82654d3b932540f0093d1880e1d6d -Remainder = fe9b6b8ba7c30f8 -A = 731aa6e2fb2ad1e1f80d7668c7b0642203af24af382abd207a5ffb588209e8b5caf953e9a96b478f39ec03a397d1433998e3c95e382d93376d80cf0c957788e6 -B = 6d80cf0c957788e6 - -Quotient = 450d1f4a105ff8d1a3efbb12165ca98c67ae70404472e4862db479e03313b08783ecc42104780c9d57df0ddf19c5b4547ee9ba52ea82dd0c7 -Remainder = 169e15b4d5aa180a -A = 902bcb1904b80183656dcbd51879e2982e2b46a547c9ae3119ffc12c6a003e4321b519289b7f22fad19d16480182d1d797c3045b2d29dcc12167f9ce5e233d89 -B = 2167f9ce5e233d89 - -Quotient = a426f71cb3d75365cd076a6c35c10765bbc3f4bd317fb83a70083b0f7dc43a4e0b95508e60dc1dedb780e9b485f4f7a8870960de669b73af2 -Remainder = da381ae5c97a506 -A = bd59dcdefcbaecd9292c4c3685fb87d3a94c0f0ed01e43e63e1f36fb65d6c5eab3b584f3d1f76d31458c9f6b4c69869d96e943c61df102771274c5b4d821469a -B = 1274c5b4d821469a - -Quotient = 26ccd4b7be090af22221729b0ca51a5e66435c2d33f8d88f94405f6c0123ccbbbbc8080cd8448a977946019ccbf5d267ac3f151ebe686720 -Remainder = c41f9e7bf20b376c -A = 212dbeff03f14b5825f0d7cf8a7501db21b60581a01a26d522ee44e7fe69545cfcaaac64dbc76c7e3027ac39ddc2d80af6f3fca1824c6ff6dae90967d9ab48ec -B = dae90967d9ab48ec - -Quotient = 801df28f4fd987b4e980760f4f2625276a2a7191d453095c82aa98a2253324ad2873abae70cd98c28ef3ce102fdd53469b9f01889f3ba8b0 -Remainder = 8e435da582e59809 -A = 48341b28138dd04807e522e341f74ac46b0449fa45f96d7fc586997c056a21eb3c399752a6a6c023509f042cf9e879f397a34af9aa2ec2e8904674f2ea3ff739 -B = 904674f2ea3ff739 - -Quotient = d3857b72b70adff9b5dec3cbc63de7c90ccd7aab6595339b2de39bd6b9789045141d224aa4e6bf9a06e017aa3edd00e716a771b3f5b97771 -Remainder = 14135c686d2e9f70 -A = c1cea45dd46409d5e24fb7ed7d849dbb079247af2d312e01083754ed07f65f090e4dd50d23a973488702ef00936c5d78af603ec0fdf03dceea8f939c922b1e7f -B = ea8f939c922b1e7f - -Quotient = abe20c90896e261e7d31bf40e7f3136d36b0b78006d12225a4dbef6aaf2062b609379eefe7e5af5bcec17126286f196f1330da8477096763 -Remainder = 230307c44cd55896 -A = 19a637e4f3051be0f7c4d35513bca4a91ca9b8082fe3c73899b70b6805a7aa0458512495cb6ee1ade55ecd5851be1dba96d65202f06bc7122633a0d905017545 -B = 2633a0d905017545 - -Quotient = 5ed3765c4a777a903e182f7c9ce39d19c01460f389b904c3ce1d3525edf25ffe7dc0f4d9e24f0bc8b7e01bef19c83e74f17884bd7bfabb2c -Remainder = 40f5346f8775e20 -A = 546578393e914be30581e24508a33f6560a5805dfb1c675d1ff1d6f5eaa7ee638b9e0265f543413e04e3f1f3b0895dec271c9897a48d9ce9e3d7df32c15b75a0 -B = e3d7df32c15b75a0 - -Quotient = ed73a67932746985465fb0606fb0e81595514f1647c911c303d4d31eb0306e3b2aece07320f6fea57a7071d73150591ab2a82a7d53968a81 -Remainder = 2e495a881876da00 -A = 8976445bc318921f7e12c8d4e8e50596849a1503b5efb65e939c291de136597c05a1fd16137f0bbbd7197df943cd612118d1e55a50ee097c94331c1cfb1e941c -B = 94331c1cfb1e941c - -Quotient = 5dce24b7a16d847b0c43cf365ea20bee9679fa0e8732813e827cf6ef3c9bdb7fd8846b5689ce8b80a7dc0dd05721cb06d2700aeeb7ff04d6 -Remainder = d8ead1ae3126aded -A = 59b99e5d028e6771d27004bc19830a5fcb347f7ae04c0ba7c49130bfb198c5b16821e425c979e6d2dddc14889ae58475bb52c6cdefecf2a8f4dd6e462bbc8f47 -B = f4dd6e462bbc8f47 - -Quotient = 170e10b399a4c5fe354b536fe59d53602102f215d5107493680ab6e181f67d75ffd45bf49ffb23cf9269b856156b5ac6b1c5def4ab1abb18a -Remainder = 57131776937c5df9 -A = aeb35966e2a616762768b7f63ce3aee5e81561080617bbabd7846b3ca03fafaaef83dd05b8d16cef40db0a56f3b0ef6eca5e236681cb57c8793dc0907d9aa30f -B = 793dc0907d9aa30f - -Quotient = 1acdb88f047f9bf679c50ed67ba01dd24dca92103f8ea2677215b6142083b64f9fd2a365499dc8f2bc61e29fa176f7d76b55557fa58e34f9 -Remainder = 5065b726dc6b3758 -A = 15a6292c9fb66c6770a8dbc6fd431d2a4b57338581f78d0860fda90182cca563eb2272a79fb4f5a6fc72c90dc23e8a95713b65988b5b3f9bcec4f0466c1c47cb -B = cec4f0466c1c47cb - -Quotient = add8127c0a27c961203ea0351aed5b3c75aa816e9c2684574e55f55c7140adcbf69d2cff843e5f53c157bd60b43c45c8b6658de72062fbba -Remainder = 67f48d3584cf4fe5 -A = 4e8938c8cc46d34e3369c5d8536b18c963dbde56020678f77cebac5f8777e0afc62ca2ba4f533cf6cf7561bdce77b6f495bc1b05f1416d1173a6a288012c7c73 -B = 73a6a288012c7c73 - -Quotient = 688ddf883a0bcc1ff9bd582119c2fea7c059e19aded8c048390a1d8fd7d769666987418bbe0d4cf4b67009a342958928769375c1c0d558acf -Remainder = a5356d04b64ee12 -A = e0c9e32056977aeca72e229d83f0d320fbaf5cd8bf3e033289f46101c75ef59a854982f33bcbcfd200034e8ff439d669a03fa404e7dbfea822664967d67dd5f1 -B = 22664967d67dd5f1 - -Quotient = 39d4d94587fd1445f31457c275fd6294fcb69ba155e7da3e6cfef38ed1272d6c95755bca49007ca62cc101b038d264876f18594b8fd4c329 -Remainder = a34980d5046e2ed0 -A = 2efcb12fb55c923f5c6ca7ae076765059e15d9e75240a6e5fc3db92de184143fab1934c7450c3a380a9851846c9f43d67bc199a314e82e72cffee795d695f82e -B = cffee795d695f82e - -Quotient = 145ea82eff186b7db4b11fa1514674fb9d41c698efb33227eb1abbc4eb78bdb2a280c0c4c47adaf4e010a4336cbb5650becd1ef544e223e53 -Remainder = 36052bba2867f5f4 -A = f6a6c7e33fd4c664652d696c495df387b85b132cfdfe34bbd35759477b4a3c052f610df57e49e85720489e4bb8dc923696400a4a28dd000cc1bd491446a50b96 -B = c1bd491446a50b96 - -Quotient = 35d0c9d870348b113868282aaba22b21ec87cf421519a23b288b150604729356f924090ba038d7400c0ccd4932836c65902b4d3c46a202a0 -Remainder = dc8c7d087bf24b0 -A = 22228c8a5966ebdec64007704a373b0596ae702d62e29e468653b21a890ace2f02c27f26b043f48495687ce8c2ca8092ead21aa250ce0f6ca26129615a2432b0 -B = a26129615a2432b0 - -Quotient = 52fc995a486c4bfd17ed9722948e9ede1c4ac2fe80e6bd7482fc47944c4337a185a506a9ca473d49073e1b813ad742f19b13d57914888d5f -Remainder = 75c703f654ad630a -A = 3473041ae301dd2806da30dcf06b9c09600086d6873cf3ee9d5a0be638849afb56bce2664f797de4123f6f8fe3e12acd32e33a285bb7f493a1cc13a7108327f5 -B = a1cc13a7108327f5 - -Quotient = 1744946730b2789977620f2e7439641125dd338d1b31fc50813b34dea70b83d209330bd17fd527db9a402ad9752c26b8823082ec9971f4ae65 -Remainder = 453a3d59303ec3c -A = c0f592d83649bcafb7e2de1a8a71fa863c1f51b595bfa638c8fe30731c6fca36da975b6f19c657e3ca29efff6febfb311c003ec68189998c084afe4979b5bb19 -B = 84afe4979b5bb19 - -Quotient = 468f3eece20aa9d6473f3c559760793e702758a3d9cc19d7817216392c7cc7c3968778cf2fe0c3f0c1424d7512cee19ac0717952f18aa287 -Remainder = 5904e71034e3a02 -A = 1f0c99a128c757d76ae6dfcd01012f0453c8f89b00476ec46321ecb872f99a48b4da29a4abffd0bbff2b727dfa182652ca85350b4ce100fb70a6a40ab6c41d95 -B = 70a6a40ab6c41d95 - -Quotient = 12198913ef16c1cfc7c1be13f1cc5991a61ff74935e09f0c46d26456b7cf2825403b9851d07d27e0197c1fa2ac5e32e836979a184f14cd94a -Remainder = 33431c3df719f946 -A = fbfbf5494a9c5384c7ae3df6c02a5e1f9f32dc31cd7f437832696bba164bae1a9d95daefb8bc08e0e8e637436fb747084460697b5ef5ac9ddec06757dbe61aea -B = dec06757dbe61aea - -Quotient = 376c2f902566d83c21eb7c3aa3a6fa0482ed52c253f67f00d5b915d0183c2d9a2891c2ff837fcb426a4c990c48bda4f90e0bf69d13558696 -Remainder = 31540f5e05e8b4df -A = 2527f8cafaf7e8319ca53104229199188ab1ca5fe592bde8ecf605e17ca6446414e06898a85e177d6985b5cc6d4eeabd6b222b5f44b4fc1baba050665c090b5d -B = aba050665c090b5d - -Quotient = b8fdd5cd7b2d9295258bd99e2780921cb2ea70627a79088039fc3ab1c62bcfc6307e86db4a7803f18e5339f152063f9e41d370e97b1ba2f5 -Remainder = 4ed4f2d12e4f4ba0 -A = a25bd113c5a8c67ef65aa80f1512de43c9441fec0c41250048d29c406fbdae80912eb3970457d621c552e3af7ef2d6bc1b5448e7df5be724e0adf6f71df7eef8 -B = e0adf6f71df7eef8 - -Quotient = 5421daac8cdeb6acc2b8b0dd85b592f255ee4fedb3a9e90f2a5bedfb0f9f033d7c562c96958346bcdda4664c67848b9d9fa7d3892bc4e9af -Remainder = 7e5661558c345eea -A = 490aef65c81b32f5df76dd58decdec3e3f73bc1fcbdb6aee0c93cd98725056153b572509e75d2cc4b042bbeb0a77d27fbca1e39efbc765adde41a7dfc5c3576d -B = de41a7dfc5c3576d - -Quotient = 156a8a24e7804c5f576cd1757dba44cb4185bc13cb56603b54ee3b70fa35cd98db1992904d4f7d99a63b3a486e6fb31141a9d39cc0301f897 -Remainder = 29e9c1627537e5a4 -A = 5e4a10e772de8dd2c96acd714f7d3880ae8ab460095a01038f3aa9b8ac8165889403b42019a1e70e0e7f32e77fb388eae3579dbcb690729c4671868b0526aeca -B = 4671868b0526aeca - -Quotient = 1b0eff2ff0aeb2c02ee3cc9e0bff808f4d616eb290293b13a6b58a84127972bb417d55e1d001a9720ec72562ef3ea688e64c4f32c7e26cc87 -Remainder = 664d57c57d4952e -A = 806b8504abfbeec4d5923f83ddc071be88e11c4394168854448df96160b95adb1fd9c288852e2f3df3e36916ba5118815ca2e83a6a7d9e074bef9c961e2958e3 -B = 4bef9c961e2958e3 - -Quotient = 2e363b13b0457a0e9effc2d7e297df78f35e5d24d0f8ad4525b573fb2f66f374871291ee8a8ee3d15a823b560156d474c678f79ee480bbe4 -Remainder = 5ba8f49e0ca36ab4 -A = 2e1bb261d98ec405dbb068daac5efeb0a51f08149181864e9dd6bf6cfcb617b76d8facaee2ef468807e0403bc550d58e8ad9e5cc0f094b02ff6d0277fe642f44 -B = ff6d0277fe642f44 - -Quotient = 149a5b1a81b9e47ed36be76252055bb202dc25f8fe7beaa1ce59c279b32941cfbaf8fe4555867850b2fba43b10b74534db82398320f9786d25 -Remainder = 1ef621737e81780 -A = 63de892cf5df40c98de78c755c99e94e0e76cd5dc0b49b8856fe69dd0abcdc535bb1416f0d02b4eeb54e8a939cf7ad4edfb7de4dac87523e04d8ea8637e50920 -B = 4d8ea8637e50920 - -Quotient = dea8a9211974758752d89965eeeb93cc616f88ce757ec2809f829cbb8d99b4ffdc3f0f643779fc5e0bb53b5273a5b15965f4a364863592f -Remainder = 9ae7de3edb6c7edc -A = acd5cebd069f7febc38c318867ba3a562bbf8ea9b19a6b33538ba107e49439f8ac6e880c6267c29b39141dbe2273d93062464de307efdb7c6b738c0bb282c3e -B = c6b738c0bb282c3e - -Quotient = e9149b347cdea84d740be70060b239af000c4336ddf36fd5159083b795c4763588c87a959df0104212a04cc928baf60b0ea72e8cccc6d477 -Remainder = 3ef5c6ee67e6f5da -A = 6ccf1b8b406e6a106160e73ac4122a04c0814ef5a47708a6776eb52002d52772d3fce3fc05398172bba191390aba925bb23aa1eee626410877822f27d1e3cb09 -B = 77822f27d1e3cb09 - -Quotient = 1606c2fe44cd0b780ee474a9c7daf0b2bebf62db0ba8ef5a99fe22036019890a4c7dff73e678965bb0e2a6e61d00a74a1d33dc1106842115a -Remainder = 7cf920ba2897f714 -A = ef9a3983f26237576311a871e4a3df0538593dd0cfda58ab90b889fdb35c700f7d158abafad127605057ca0532e846992c41ec06902ce58cae0c1fe238c726cc -B = ae0c1fe238c726cc - -Quotient = 8ccf17de5068451fef1c2808c62e19997c7f920d5cc0fde1f5a247cc57c6d730df553cf33094b786597a343a0ce9e4bffef568247e904343 -Remainder = 2689c40a54df34bc -A = 8435babd279b7a3833d01988c58005d4557f7689ea9b7168ef42ce2b31a1a3c32a982aff654f271a651085335496dd826ee4b3bc27f58920f05dc6676e51c662 -B = f05dc6676e51c662 - -Quotient = a9e78c48c779140b1d15843089765ce9ece3855537ce88cad3eb7aa7bd6ec72df65adacba2bdf6c491066406bdc3dd3dd734a70e93eed958 -Remainder = 53da0b15ac079ccd -A = 78550cb7b58b58d6878b615dfa25a5b90a1ff631740e631c7f8829962446903c686c810c46a1551b6c1f7a89ae898435bb8e36d1bae24a80b54edbf4bbc9af85 -B = b54edbf4bbc9af85 - -Quotient = 1e3b41304ee07f6baf1ca061e0e28a3740991c6ca2749eba70d3ea1f9cba8adec45cb69a31cbff22784a9e056e884713c0812e8c7981e49328 -Remainder = 3d051148ec43a72 -A = 76b9453d315e7a9c592e1f2640f5b6b90a65e7f2ff8ac24b9b47e35abb76fa5d303be6d501b341a882bdd9d2a1c81a9280724673f87fbe9803ed5a2e7edaeec2 -B = 3ed5a2e7edaeec2 - -Quotient = 1921410e1a538a71d33d9c5de95593fada116200c399fa7590ebc374282570477f5f4abdd5166784ccee9671a1a23b96378df62168049f6b8 -Remainder = 1a1f4aeb882d7546 -A = e4aa84f782a65d376b10e7789a7d56695885aae274db6cb37e0a34414397a57b4a5f76dced11376af5fd11d31828203e685861a6dea239789196fe73d0e46116 -B = 9196fe73d0e46116 - -Quotient = ed2afbd2e63617a651911017d9d02224d521e99275ab642ad1a941827983b17ef0f2067b5405b20e8e97f2ae6099150a1989df94276aadee -Remainder = 4578107045b9cb81 -A = b547cd987638ff7e3c30fec9b728bc10c3b8cf16e7040bfe0fe9a26e44d2898c4c4d28ef525cde2b4007b2ffb3aa80fc4514a99b9aa2e112c3acc56b72ddbe9b -B = c3acc56b72ddbe9b - -Quotient = 56181509251931afca3bb9dca21eedd6ed4226be67497d8d1bd0ec052af146993e7358f132e842f9b6c4934cf1b4501f5d6c5912e65c8d3ce -Remainder = 1b9861df51429a6 -A = 32988a4e0769a5aca200f6f6f1498512e13b4904a9a311cd8a962fdd688de0c6e50b04f42cdd2cf8bf9b0a6922657f9ad195773e1250f85509672452618da9c2 -B = 9672452618da9c2 - -Quotient = 1fa45bb973dd1d2df0002772afba55284a1e41f6aa4b0d1a6c6a4beb8ae00b52e88a9889037b8bfa9b7ee38036c57b713b48af156c3f9e8d8 -Remainder = 2525d52ecdec8814 -A = bda657ddeabe24c82c883e85822941bf64448b7cbb368468078101289b6fca36680b3884e35edc1fce5a5cdbdfc11359a1ba8ac0785c09ba5fe5cdbd30726df4 -B = 5fe5cdbd30726df4 - -Quotient = 63e21f5568d07976aa81a2690b9e81b76fc3291cdeb010d1693d0e80191186815c7b2f83551a5f1b172640425d4733f06f4df1b2c8a7e6ed7 -Remainder = 14781a368471ecae -A = 9f3dad0b3b56de15ac46cde1d79aba6a2f3b34d685cc810e9fa3f2d865bea4afb480d58653630319a258e9e8ded9be93cda3bc52b80a9359198221221724cc3b -B = 198221221724cc3b - -Quotient = aae37878db016dd758003b85ef52acc7288b7b74c4723e3876a710baed4751d3be2ae49123b248f2b2c55a5be702c4428b1dba9b8a6ae8a9 -Remainder = 6c754d5c167e1228 -A = 4b93a98eb7b92cea0a4f5c2223e77abdfbd332b39f295b4ac40f71625d88e4add7e482adf3010082d8dd8854cf714a54fba0887de87946e97137cf7eabda038f -B = 7137cf7eabda038f - -Quotient = 9881f551c4b7e67611f37df29e77cbe4e2d9fd5e17b7da3d013d6f3d4312e53dd26dfe3a2a12525cfef1ef81e6ebeeb7ef8fb4f918bf15ee -Remainder = b14595005716bfe3 -A = 7737f8e7337160c14cfa8411236ca0354d8aeabf389b9fc4b14bb2ec3bb68286f3d82eb394dbd8062862b955e9fc8e86eb646317d1315d09c81ef51b30288cf1 -B = c81ef51b30288cf1 - -Quotient = 4c8519d4d85ccf845fc5b8f31c27c60f0893ffda29ba86e8a3fd5fe67de5d29cb29362679abde996039b8febda2ecf71f6b9e1c1874361464 -Remainder = 10fae644af084f8a -A = 900f7846e927760d9986894de6489e53cbbcdd59f7707917e7581422508f2ce79b77bd2c56d964a41e60baa927ca679faedcd9cd8102dde91e1f583ae834b092 -B = 1e1f583ae834b092 - -Quotient = 16ef17b40bb73063f3cd0929cfe2405ca0ff2d3d426ac05f8a8dfadc85659105f7f728e113baab59247c4c7936ab975c08d6f1c72c12c532 -Remainder = baff11e6961c72e3 -A = 130b212cb6f3d854e4f17524953fd8592f5e59dfe92fc7d955e2899d1dde1ae4aa20d749caa349ca8d1bda7eeec2310532a7af54660e2a1fd4929335a1623bad -B = d4929335a1623bad - -Quotient = 1cdd7ee2eff733b83beda5b862673177e2f2151ee0fd9ac0bf0ec5b7e05516f1d1b59ea754b0483d0e4bfb7668bb99117907a58a8ceb78028 -Remainder = 29e33e0c2a515780 -A = b0131ec2c1ffe9a523591a9453d2fc740bf885e7efc1a0158905da1e646745ef1bbf39b406564cb3da2f842bee307b36219bdee5991c969d6199279c25d4e380 -B = 6199279c25d4e380 - -Quotient = 20bfcd06f9c54c537ae563e33dab31047aa30a6bc4e7eb0902bfbab3bbb7e65df442c46625c39e08c88310116348e9ebca2450ab463727f90 -Remainder = 11d8f2f6d4c1f55c -A = cefafbaa2990eaa88184162ecb118d20e5999e5a8fdd25ae7f6248650ea74a8cfb92c58efecdd5d31eceb618f1596d7a6bfd31d092cf86da651f629975faf91c -B = 651f629975faf91c - -Quotient = 37204c5735e4ba5e47e845d8b652cfc2b1dc715abf21ea0ecf5b1c6c8b9e596591fd7a7f41787be1a028c147a721ebb891b0abe3bd079b589 -Remainder = 1ee700ffb0ea02d8 -A = ce22d36b3cb913b32bd0e25cc14c7270d3f7b8e600a9b6732377f846adafd7fbd8a09d12fb7011f2283d988fc29aa25948dd4a0f24512b4a3bd460ee19887d35 -B = 3bd460ee19887d35 - -Quotient = 191051194e4362bb201f5471d4bfaf92f79b6fbd119ca3dc1afffba334869ed9f8acd14fc42a2d8f616d652610a483ad90f5140e9a5ca4172 -Remainder = 74785b6874d8fa37 -A = f3c79f9a6af1c5bec72218d969620149afe8bf068cf7a7aceda977076665bb5a2c30729ac3aa976c9be379c6a5458f1501db8802652ef69d9b9f4f097027ddd9 -B = 9b9f4f097027ddd9 - -Quotient = 6c46c17fdb03d192f75d636e1e2ab4e858d55f0f205cffd75550c4347726b5cfe036c6c901782cbe5a04f1985d9fd1dd39d747d25a6a7a88 -Remainder = 9a836be71a24e72e -A = 4f6cf6e357b4985442a25b5c84e2cc0a5e685e2f5ff71ceba439b81f4123e16db2296dd4333fff23eea92bdbb812daf1d27c721412fa9847bbc9a0bf08879b1e -B = bbc9a0bf08879b1e - -Quotient = -4984390f93e11c9a77880cfbe157dc41d43fe901c8895ac5091c5367a77370b16d42e8cc260058adf4d3fc8ee8cc6c0099804f4c319f15561b0a2b1caa7d703db82a726c9eab569c -Remainder = -19374dcf21822188d720d6ec892bda2c084e8af84f38012da7029a3c3660c7e813fd4f7644ca80373575ff98ab6d743e939269c51bf62e04f -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 330af318ce0ffdaa92448777ed117de9c104e0f975651322c8e01b1c470f3cfb7a78b11f7daeea57614cec37d18b89155f19babeda0016171 - -Quotient = 1a56f7d6c06a316a9a466319cbd558a99f06843782673a54775d859768a61933de3fc410068d00d5f6ab13fafc9228fd40ad41434501f8827bd7461441140eb6977f18d102d446 -Remainder = -3c3d566cd48a909292be2ce30f88ebb68e9122a3359f52d1d7b0189c467b829a9f226c0b64845715020dee12d179913ddb7f17da2db86d854bd -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -8e770450768d07ce20ff8f5f6af464b1ee5f1d0e8faaf927a19d3ff801f6089378133e822b8e63cf29c4c9ed721adfc91d3355a3c7bbde77bdd - -Quotient = 42131cf8f52a6a3f189697ce402a8c9439bf05cb3dc1cf8bc49dc2f07cef15b3bf0102c941b5b3bde6440abc6eacfbf77ea8da06ce932fffb226b33dedf001e9657464b0f06 -Remainder = 4cd483574fce075404dd22072abe61200fc455c15b382c7f2962ffd82c38ec1e2c60f71267cbc35fcf77fe1f9301d6b5f884f1c416304aa9f4d4b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 38caa64e74b29a7e9bbf341edbab112a730b17103831a9ecb70ef077e9660b2dd1fbf71d7f6bb4cdae2ed7cdbe9070ec9fde996c91b9bca5b83450 - -Quotient = -11d6883fcd705ac97cae5bb7f8a2929d6f636f4f232ae9a4af9769183dfce9a9296fa0714c3f4fa1eea467a5c96a484a59d0cdd87496b9398e7a818daf89a58add3a39e80 -Remainder = a6b7984fd80d719ffe2e6eb756e4e3bd7ab51f6088e04ac8fecdc744b0385294dd23b5007910109abf40cfca814c10addcb5330e422b6f5eab6efa2b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -d25d50f53c694cddd56aadda2654ae5888603b39cdbace93d19c117af5505750aa24e615f95446862bd693f5b444e2a876eb2cf49f6c7acd007eae02 - -Quotient = -3fa898b02c621915f44b213ba4e80b8e85c7a2f4c78df2bda7d99494bbca3eb2d9354965d83e1c9001f10aad9b3f3ed837a630b329f5a4b28935158fbd9d291a120b08 -Remainder = -320d41a3875da2e83ea9a83947f5abb1a7026c84020e983381722bf7aa87d5987ab088cb2c37fc3781c82c81bef3263fec560023e236a747030618e9d2b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3af2721aad4b18db27842b5e539d8cada9dcd7ac4c5b885065dd2496a6f76fa73c8a51b239b5c068ea6feffda22d8ea806fb488ad5a94210264597edb40 - -Quotient = 179307c3e14de14a744d082825ed723b996a4e15f156ac473960583138c43f4275b4436c50ef8f21a7b450a969819b81c15bc355fbc5fb55cdd8e124d931d142851a -Remainder = -9c8eabd36a25e995c1811b79a2a0357f6aeef4477cac0ffdd130046cb2a647f928a34d91d9b489d394965719cd58604b957c693a93145328e5568d33d88a9 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -9f2d3da1da77914df66bc889a40847a0d705d4648a11f282e09173d170e96d84b5a45092d995318fe7a954b54b88b784423402519a38bb521e84a4f6c5485 - -Quotient = 6c0f316406afb4cc2aebe34f7948422de0b612a02dc47f4ae59419c579fc465ceae1980a3e524fdfdbdfad4862f168a9851664688c9ba01a8bc1ac156a6276643 -Remainder = bf52a2fb6493eac22fc8b334ccd8e8fa347620539d9189d535373f94503310a027c5423197c7279bb51ab8c459e27f548d57b55740320e80b753290d077aa7f -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 22b9e55639ad3ff4f071a49c8bba6bd9047e162fb31882421db8ec5ce46f28fbc35040bbc74ead5a948c47c43e9c7adc32fa52046b53f12b07b5224e0d8e93e4 - -Quotient = -1008fcb6894d8c411905136fb3e05b38ec5d8df35db06379fc2d6d3e3579bcb34fa6e021b98b899d9d082c111b1a6ac8e50418fcd5968ade6aff8828d8e4777 -Remainder = 3d7dca387b00c677d855fc4af4d86d86331fe4309929039e828765f0937990bffa964d3ffc5d4f2f4b8bea978329e7cedb847c7cc341ee52217f903ddcf9446ce4 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -ea045323f406bd7ce25b3ab4993b5f6dd92ca80e3a02607a862deb13470ccef229fad67ae958cd87fecf4f08d9609595077d0d1360d9fe48c4566e237aa877e7b1 - -Quotient = -42a50301031962754ebf9c4b1e125e6df3dd40ffbe09c044b1cf4b62ffb4f92d298b05933a450bcef65e86398da80740a610ba45928000a5c12d26e9f6a4 -Remainder = -c5485b82cfefb3f980e0fc7c6cd89b1345a8fb942299bdc36ed4ff8916016315a0da84ca0ee2824dce3c7e5ed49d517c45173c9c8e30b224940af6cf828c73db8db7 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 384e523d5a687bd1a90101e43334894b6a27e8c6809a8bf5bffabc34d558a8309997dd6f2a3b7c1a63100dcc0b6647b444ef7e5aa4a9c52c7caba1ebd096c3fae6f95 - -Quotient = 1054439945ccb5bc5461fed04e364c7a36d5dd2c0428872676debe07654b2ce31e435a90c81f2bac1032143acb0c49ad101398feee8426bf270bdc0229 -Remainder = -7bf919e14b2559ab82b3c1bf428d083a4c851a7a1fea44718377e9e945caa5cf48e0b1ad727e251bbb330292402a75ecd96a56db4ad07146533a3ab5a717d0a25a3a7c9 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -e5cd83a644ec86b94f5e33d4dc307a2f14ee8653288145dabb2b5f894560c164470197fb9e37749656f47df343c245258627aeea17965fea10a57336bdc6b4a47443492 - -Quotient = 62675274798218da426a54ed7158f8f737b7b3c328a9c351371f0cf61f41712f9b28741f187eb635ce45866762fb5fc5051776151d202e2556c5845 -Remainder = 1aeb5d1fde3c259917e430e6790b00484d0d9508391ba6ebab0f6299190d4b34f5f7d8ea2174974471a1e28ee2c15e05da645db971f699d5d0e80569b7eba7908ae579f5ed -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2622350611b486e6be7a7c1c073c230d604d782c2696038a3233ebcc3f01c6a711969094e47f49e294f2c5bcd04fb1b7c0934f19bf6e7aa519a8d4ec2c172ac59cc1a57b26 - -Quotient = -12970cdd96b92c37787971cd8dd166999ff241be881eb9543ff29165a9c1a3beeb38b1910a5724ffe2b73ab95ac1ca88d3989aa531374d4ec6122 -Remainder = 627455cb555398150e5b4c1c53ee16dac8d80d9616ed1ef40031424287f8028a9cad1a10bdd8430f6f65368cfd00390c8d4355aa5ecdbd1ff0266a1ade235f33cb5309446961 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -c9dac93cfb7abaa3fcde359e09a92ab0b5c06359bc09ae9bade3c6783064dba90b233b4c8d5c6236a13ef96c7a223e37bbdd931eae61e845e5a10088f75b3ff5f1158e833b15 - -Quotient = -6742b3871dece5986d4e219bf5f43c101da8896f247521fa286fde696e0b71ffeb3b6a3e4f33710c9ab150b7a1f747cee76839c5e7f2509f62 -Remainder = -203b2d6eec9d485f7b439fe9d4c640bb31170af38418faf4daad577c30e44ca06efda55ceea4fbd959b3809fa2002b6e2cb891decb09334ed89ac66ff05502036b2155ff62f8aeb -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2457088096865cd052e9cd9349c6e5e34e46c89d6e860a36f8e2a0bb1e5d983e07d05e6f6b31edc67e4793cb4d40979c029c80a13e654b66c8acf6b894f615a3ac800bbd09ce020 - -Quotient = 15eafc416460d757d0abbda8d094eb535262a71dd033c25e704a6df54265b6123247e5625da476e0c220ba88582a1ed94265135bf8bf1fb1 -Remainder = -64ccd9a0ae0b0abcb5507d51b2e6c8e52e67907474605c439796febda06eabd8a3185fdfc0bd088cc49fdf564b5b45890b07269c15b1aa2f993cd9872b97aa6cc37dea2f03444b3ed -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -ab34d3906d8a2b806b22c73d44948d703c1e05a9337f75cb0b5df5205c5e2d23f8a92d8381372f9398c9ac2f7b9302b83e48b26512ccd0b06e6b8ef1b930ec2678d71e2eddbf7349e - -Quotient = 3b22916d9fe3145fcc3b8872bebf5aee4e14235f618e0aed09199852c6bed80df39256d8407d334c06f4479f230913370b7d451fad99d -Remainder = 1b02a7b97f9ac1f6306aa00fff0e59f55fce463ffdc640364a950df29474e08b67cdfcec0628e973d42fa1e4f98e988ec4c47e4915651a1731b71d5e36a10a0d1b3420427dbb79ba7d52 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3f74cafe9ab0c1b307cd7571fd442665fa3205fb2f45b3811b92d1d38b096a2025b8170663a29c52ca84da102e62048e583fba96a594c0b23952fec587814857c25221ff2cd0533cba6d - -Quotient = -12ffa4b6fc369404968911c17358012b993c18c2ff34122e06f450d3d441926b5f5638b40efb012d76d8bcd3c0012d0a0ce5d55c596 -Remainder = 64548684fd5f6c816bd296234740a4eed772570bd4a48852462f9cddf14f1350ce7c7c6a58aee8f66ad7df87927458db09e3af08eb5376de08444f35e5171cfa0992fb27f70b81574f6e8f -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -c58383afca9e1c480ee75d3cb6b0b99ea42e827d39fc96bab6b0dddc97e3eaaaec02a74847f9f7d49937f5ade3580bfcd491990737d172d4079437067251ab403c36a9826e974b113e2d2a - -Quotient = -4964410c2b038573107b0151b36177cdd62495e0dbef536b59c8aacb8836bb45e7bb014e5022360621e8e82a273d0d462b8eb6fc -Remainder = -1250c42f8c9b129a5c477be446b86356edd1b19409d362c3a5fb5d59c30f1c3fdc1424a88a0d6ce20bae885905d98c8a5a6495931f73edf4c60112ed78834e3bff6de3ed54c867fbf16a1cd53 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 33212ef4a8e80daf1049ac6f639f8e1990142ac32f7ebc97675ec90f8eb1a2814dfdd295ae67317253d0187ad33f3932a3a7efb056d0a3c87d28e64e23e9f1de751ee6f0f61c6f39d08d72f0a - -Quotient = 17f77efddeed52ef2e423bc2c10d2ae15c97384b766f4108474964c2a44789e61249103d9f5fe00b4d612772dc6ea12a42e395 -Remainder = -1ec95323b7b95169d5ec0667f3cbf683e98c15dd0fe44df4ed9de9586e43f1f69337e41a6d11d889452665dc0b03cf8d9ef2effe0b350eeb9f6468751b8a2c42608ba2a33192b770cb62381a966 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -9c91fdf2dd1827ed103a102db254630c278bf8b47bb12a342a92f081acbdd8ae5f5476ae194e24b187011ac25b19fd09e6e690777f9d3efb6b3a32c8f5905e1478a27fe4b1adf17a70abb4e7571 - -Quotient = 4f5dec525ffc737094f40d27446ca0be5b7a2aff02d51d99609165c4cea0dbbc1d92bc0a8680782b616c149bbef7f5ca912 -Remainder = 1bc84ce56a9a0c74962681c02ac927051c81f3824d9f3f0f91465df333ecdb449473d9c26ae3abb9509add5795e89ba5eba6ec7c89b114c86e6991ca0c185b34d6e66925a14fd82809dbc4936d273 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2f47be01e6dc6a86097676fbd472c2af0c83a2f743fcaa885e44fda7e9f350e9fb7a8cd07fda59ccb7963f1e95e6a1236f5f94939decdc85afc0e523c711b24641c844cd3113c17fe35ca988ba407c - -Quotient = -163cafed5bcfdeda88555f30bd4cc2da2cefe2bcec9a7c19c36ccd04a45121a5a0dc28d0bf6ab7fa4b78933c47a5d5286 -Remainder = 93f856077f5b2907cefcddc4d767ffeb0acb7af64bb9dd8a15dcfdda6c244c24fb8404ff9ea2fe1dc337faa05930d33cac4f61e171d0236e222374cb3da76396ae1329a407fb4ac652fcbdc568d0fafb -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -a8bfcac452a5e48fee9132b73bc2fef771450143ab80aabd8690ce54c9b52c2b5a669076a7a35fa6d926268077bec6d90b722b5d074f28ce3843fb0147e567c45f4e91a11416c082762e71b5c6129c08 - -Quotient = -617dbaeb8c6f9d584e8eae923c872048f9f9bf039ec6b50cf8f09c061bf79acc3311b37c2502e560848c05ab316fe8 -Remainder = -1ab4613767c4f1f7d127e848f2bb7c72a3a9e1dd6173b63198b80d3bbebce6a31494f19b53ad9e3a77248e6f9b26fc59060e2759a20dcdbe785297bbd912da9a1819527fac550d64bfd20ed1f96450c30f3 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 267d9397138fd0374a7a58593d41627ba1203a646ec2c04997acf607e9d217b8f40183d2f9304447d6f7e727a476e636ded4697a5ff30a9ae3d249baf97969658209c1b32ddc0edf920b0b278e9b5464313 - -Quotient = 10ad85703fd51870306c5e36b51512341d6d39e0bac47a03732787b2f62e49c76666f7f49b2596de6cb5c5b2f31b -Remainder = -846b4479713bb19ebb8c1f1b75d2be0f39fc1095a3d2ca149b5565146bc19382b86e5ab0d098ab1fca1ce701d582400190fee34b602845c3c0c498925710f0b9e3af2412ed5ead1fe03d77e9b2b407ac83823 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -e0ffa4e120f2f46fd1430b6022fd03f71a22f9b120f8d40e901279be235b32d94760fb8c2403d23cdeb728ae73e2b16af7322d6ebd5f5673187668c99805e700f1e997423886bbcb851448dc1ed4cd66d6598 - -Quotient = 41567bbf616ab41da51108d7edcb5a8a4877c5a8663b3aed7559421b1fcf4b535a54989efedfcc935b3917fcd -Remainder = fc026e554a0821e0d36b796fe6a676fcd7383a55fd6158d78ace4edfc3d8aa87c65f0eb41baa2aafadc51218b0562ff4b5c9b17bbe84afc491d9e309217a5138ad48dd51e1b1a9aa51d69963b608ec47d63fcd3 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 396e9b45ce43d3f89386cfad8ddef4b483ecb5173234530c67447ab74629d246c18b9da09522c77f598957e3fd2a1c0c9417399912fd547fb1023ba6b90d63d223bcbf3e7ba155e51bba7e8635aa5c39d2b9dbb8 - -Quotient = -18f1f395347ce8df530d9330c61c0e30ac9531b50a0af2ae7809db1258285c15ba7a436121287990fcdbda2 -Remainder = 51417b9e9995de34316a66a2f70c146df8e36952fe64124819607bd8691a465f4fde98e590dcd56f0faeb95d1b67751081c2393626713c27ec2a2123aec2a4ec3761e5ace4aaeb612d46e52e16d72a186d2ec8a7ff -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -966dfc779cbf9c388a84e947d1128e2392399ff45d9491259c7cb19589154f82f41e852e0c6bb5a728f6e87ff4ff95abcb9b2b57af1b6b7fc125497775ecc1338e4bbcb5315f7afde4e283347184b908545211afb6 - -Quotient = -3fd962e88dc1d501fe9335fff8b6b2d50eea967c3035a3dcbcdc9599b81f9a445ed5a6ae7413b8865fd4 -Remainder = -97f06f6155f8d0ee6850728192e0b4fcf55fbd9ba982c5f1d598ddcbc4e1c4be0e209fefa6ab3b7eb2b4c645e4dc40217202285ab0a7270d085dd9d4fd24e5293faf6797b4c3c79bbf3ec63fd82942549f9e8f862297 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3ac566d6b2d18572360fbdc626ec488aa316a74f33d71a17a2d0e1d2bf26395623eb91dc4abebf2f944e9bc3d669fae2e4332088e9ff9d9f43927a7888b1390ef60f05efd6e63ec606ecb3e164ed6dbdc9d088586aa71 - -Quotient = fb5ce21bcf28490afb64e6746a1a81792c90eae17407c0b4c5ebf2464eeea43e516be2c615f84901d -Remainder = -3d255bf94c3d610c32266fd472d070c0f5e7dddb88d32723b2e1a20709aed2faf28701e0d0227c2b33ecfa9e708e5ac354a97be732b786210d86f1f05d191513386c580b1ad1f4ac6890f87fd0d4270f23cc5c2064502c6 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -eedb64a6e204ee3d6df508830704f1d5b2d2e627698d38a114c07458ea0befd593a80dfd2e08fcb1893adf57061ec4fbcd3130692de7c46f5ca51361e9b79bb7a91963618b8e5b7591392a5f0e3be954e8b9978c97f12e9 - -Quotient = 6933a3123d0b32693351a834751345300c49324b861a663e8700bdb3b70ad996747b284a8ea5c02 -Remainder = 13849ef93cbc77460c3c496e8f31f7e01a98c21cdfcd6877547161f9601680665b394933d3a0824f0d32854508c89f0e4a0873280c779c7ca636cd89cf6ee5d42a917b4f382be3b9654039f623c11b43164827f870fa0f0781 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 23ab6042240a7709d43de7ee17332a9710bd0d913c42b3591341527bf48d5bc30abb962482292d45a15cb03c9457cc8d78d1e00aaa63358427b000e59e4260bfe1e2cc603e175d7fcf02bd9f61fae3740cb8e10a510ea3d1d5 - -Quotient = -10e67cbb33dc6e24765893a047252766c2bfad8385150689dd4fec9ef495dff63ede1fdf78bb6 -Remainder = 9dabe2cbc734b910fa1bd25616daee5657d25b6e4dbc2cd93cf8549715c87974a8336fc5070d86c11f6b670d4b3bd5ee8ae3af2bb321fbb4f8fade3f5c6c2d6c366b4d800dd13ce897f13b0d3fb79f1d9ca525b4e7286c56ff29 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -de093dba98747499f2876c8b6b7a6b9587284835ae35f0716dd594c826cdf5b9179f2c6b08d800a77a6936602ff2b64ee0b7c94493bd5009633f5bbe423454b7f018ae96c21230510ab4bf5db394ff153b0e9eda3ef90eb4c253 - -Quotient = -521f5e35300b9ec2742ff472cf61235dfe2e449772afa638b1adb812cccf269afd164b7602 -Remainder = -2ad10e8758e1d358d4744ad344ce319617027107c0b8db195d1b58c6e6035450c9b377f026fdf9e5737750af5615cff2ac3ccee623c060d779373136d48a735b353d64bcc5f2e6ea1e46083fd799b5f57dd5ad0ff3e6df9764af977 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2db1990ba1e353a1a62de1b914ccb691380b6ea937c13621a29f0a40ecef460cea52cfbc77d98706fb3c9939ceaaf962fb8003b0cfb40535e0dee22e8e7d04b5648fce2e58803242c199421cc4b26cae776d3603f2ce410ddd1e0da - -Quotient = 1d45aa6fe6837a1b7ac95efd55d1690b66487202949a286fc85da7ac0b50b860215e44fb -Remainder = -7984639b596f1d4e6efea9d8b4719215588620ac959034b303584679a44fa84a4be0c89fd2e29f54e62959f9b7a858c06b0cc051176af82d4b85e7334555ba11c39e6cfa1829995c383ba81dbc220e527e90a1d440c1d069703cc1370 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -80316fdc405bb002990d3ef7d0e98defcd1f0e370d1e51db2d21ecbd96230baf69d00b168afcb7b8da9edc3ef7f6621ae5c5a0d7797e5c92283342e42468dba1036fcb2ffef1f493ff97826477364f6b5a41dc56d6389a01b83eee041 - -Quotient = 3c0c3f7a777e611d1bd0d17d669a1ef7920b72ea8de06d4b415a73b836e37d6cf0780 -Remainder = d8c77134a75584ecd5ab29e97a909ec139464901f9cfcb1d3d9e29a63d204615b6845d466c8710873980f107c40ab54eca9f8933ef6d726f9bd0f3e9e97eade5eb1a9bcaa7b01b6ad51ff3ecf67d6e4d345f128e990494a2db434fcd3ab -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3e7dd961be36c0c286eb9e78bf3b33e6f9bdf2c2137a0c660f1d21dea31ac9a044e526bf47ec8190e137a60f1f55e947046b9cd04a2485679e48cac80a1bb064a915208889289d63a6e338cf7069ad799861c31ec6eafe02a4ef2c2641c9 - -Quotient = -178d749de2dae3a2ea4898c59aaba98ad9f340762040f5aea13cad45a793f1256ef -Remainder = 6c5d9b19aed9f099255b6e3d251aa50d1e534e6c86d82eebe097dc8dd0748201e48ac62eec070a999c21f5c7684e5a700212e9079b5fb731321dd1e16ca82ce80c1f5c17fd1720f1353bb90997f47f5fce335a43a6f59facff0b3724423393 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -9f52ead13916f9807d0cf0c6699578af52c54816828f22de62328fbd7b4fd6c3740ffc82af4e24892092c7ecac44b5e775944445e6615fce25610984030a345731f944128f5734e6e315a0ea97aafd7563105695d026880d065761687b75e8 - -Quotient = -4fe43bfa9417839ee408b254603c3dd176653b6915a89de5b781b400162fbed6 -Remainder = -1c15816e03751a203ae23c48965c8541849b09996bc81d28e28d7871fa87d1c3b2d383c056d3084d7d01d853bebe270fe2c0839e71851e169d417c47caacab2aff8a8e05f65dfb20eb17ed8f67475702fa83087bd868246cbb885d52639797b85 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2ef8419306ebfd215d9079c7a2b959a53ca2f4553845e3cd32caab2635c0e77fee8c5c016c121e3cbedfac57f810c132486ba78df9e719a976e0112516893f14cf9b89f95a89aaabf31cce509ac8e7e62ec3833f0be4336afe6d7d73518141d39 - -Quotient = 127e8c06e12943017f9dd57ca24dca0ead230092811d307386c81b6efe009c -Remainder = -24f3431858d5aee412443feab243b465b849f5dc97e4de4db88c7adf774d9bdda65fa0a28cf6b18eac6078b00cbeed2ac406f8426aef868d4b59ab045825d4b0a18af6c9105e32abc72fadef55b221278d329ff6fb9019630411bec143c4156df7f -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -cae6399216401dec0f8ff5eaca884ab061469082ee3a18e49e0b4d5f9cfc98a598c373249a8ad2374e0b3de71370e93a98650684fbb931aa5d8b4482cb0be142492bb71743c251346df66896806f926a4a5dd4c16ca3294f01bb998835e6583d29d - -Quotient = 3f180694e59df85f48ac02b6d4faa26278af9641db18d79f198da5d802f -Remainder = 36cf82dcf8c7ec783b4de68e0627a4a4b2a508637c176de09feef62dcf382bfa5d8b88539b5ca2cab6cbbdbbd0e54c092f00ee13f4a352cb570034cb0a012cc0fbdb6ed32967f3b81d146f352139bd3d9a5c27789468b7d79b84d6a8f6085f859532f7 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3b7983bfaf565c5ca444367654a07b8bc2bf7fdc04ef12128c392bef2f6b67d9475b4d2f0ce1c380913aa98616fbe1d74dc5c9d64df15f5c9b87a8bfbcadf335a6e8f863c7a01ac175a7d79645ababa5f961fad7d1b9926f7284e254fed33765339e0c - -Quotient = -11f635baf7b7d613e84dc38978a21ade2f4cd741d0c4f6ae592d93af9 -Remainder = 4317c686dfd56216bc4865f8dcb6a3446e13d8b33861e74d6c4a3223c387ffb8caeea0141049898609ed1abfc2adbd21756cf64a72272aab6c0b8f2177419abcbf9086635dfbea80a7b884181f2f2ec9a402cb0505e8208909fe062d5e6dc7094d66af62 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -d0ea50558197566f22704e66a70328cacd6f4b7ca9b00c16b7c4b4e7dcbd47c9b2526b3858ebb4de7a571ac570872f3b44ba1fec655c0778a8a87ca24851f6072c5c0b7591b5e67a8cdaca78fa46f201e02379fcb9a8470e4a4971acde36cf501d369751 - -Quotient = -64a078497f85588d3402355bf3e83d25ca1f0ed2c24a395ef6de6b -Remainder = -87fc31ac66a24ebd629a26209ccac1b2c85e52dc83c5240269ae5a27333f33d31152c9470efd41472af034e8536bbe94b0a49e892b1d23db3c13fd84b7395d7e3f19d7d4cb4a4c07dd1860826696cf7202483446452aed2b4980388e7eda0ccac792d77a33 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 254a85bf512d9159b00a70678239902ee7e15ac2790ce5747c4a4743c6a0851e6a179b64c75acf312dd37a7b82a729246f79196b8a399ff476c48a05f89c29fb106bb06ef0300c4b330a7b2bcd4ea1e82584c7a96b99ec2131c885c5851343cfa6ae4d384e8 - -Quotient = 116a06b1d38067cef9f55875fee1254c8ce39b42c19fb232a287 -Remainder = -c15a797fed3810e4f536e9509564b2142ffbfc0c961ee5aa923d43a824765c05d2a99fef79bfcb6310c77a91d9bc6d0762bd687493865de270c99989e891fbf6da7ea5c7c7a1032449457eb73222a011bb755ff44e4bdce8e86f8aa9f687840c0832f7fd8ce48 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -d77c14100d19fbaff6334ca6aa504001a1d56f274632dc89d48e1d517935503c26b60c047cab9e186a55b72439761c884f63fdd2a38ca1acc653f6ccbb4b7262e6215e6d00c8829b448b7ac8716fe0bfdbf8088c8c61eee8f8db43b7b5551f6278081ac2eb1c5 - -Quotient = 6fc9533f6d0e6c55494cb1b319ec47bde8e621aa92d91155e -Remainder = a1a70f674cb141a896c4adace0dc58cdcbe2503fd0ad36ce348dc5b8afc96d0f2f8c65bbbadabf2920012798b7ccaedbe8d896dd2674082ad3cc75b54c5c190ad56ff34e8cb5dd29c031656497d48571295d6da396d5f4cdb652732d874a79a674d06a1d7b979f5 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 21917f48bb8e65646c618068fd9069c06e22ce8c679a845f9c4ec843849010abeee12e2d3c61fb963297abca30813c446f2ae82e909ca6ac7839fb58974fa65f3b5d91fb8b3f99d948519ed56653d50026d694060208cf48e3c757f64885b4ed4328c6f071e9f5d5 - -Quotient = -1abc689fd19523d2e295f260d248041bd00ad3009cc7581 -Remainder = 1ab5af1478fe7373d012befb319b53ff9e36899c1749ea763fb74f7d24624e70ee78faf3115c2a423629528f45295e4adec7b122b993b5c29260558be4831df06468bb1c63e8afcfb1b9b533ec6acf754563d2ae25e2adb4cfe5ee3024611e03a156484a130ee01f3c -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -8c5a7b6bc8ed6ac015ec24efff607b0446c1b736dc8b409e2f433e69d0ca015d70c64b4c924175d0e0102ebc3e1dd96dd4d5bb01cccad229e699f9d8f9ad0e04339d70cd113e93d50c10c03083a81264396f5db2d979d272798ed30efa15d52289d0c72f42582ea56f - -Quotient = -4aa210fbc0457fa7366a8aa9a3acb3f9fce812303ec9 -Remainder = -737bc4fdd3d5496fc7f936ccf14bfc3d93f5b7caf4718c444db7a3228b41015c67aed304fec7704ea8238ba6cccb1e94cac3bcf4764a44bafb49e5fcb0339ae44c0114cc304b9c4370363657cd2bec09bf962ccb21f6091b081e71d2bff8556600576e18d4f78fc68b12 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 324774e49bb429553c10156e8db122670d6dcaf6ef5291f515c517d7ffaee36ec5ec5ccb4d12dff71ae7a05bdfbb03ebaf4dc6c4e8bfdc165b77cae20153c27d53bf27d92ff25643b4888cb586e773955a1c02ecbf0fa6958a8ec0b832332eab2e449be6e72c48d2f1ad1 - -Quotient = 1c8631a18d189f1fb689f896005f2dd2098e0dae9e -Remainder = -1a1ac9612fc3354056a5378de5b315f12591ee71f0fa9d8a6b2ea2b1c4eca9947e5c4f5ed3d4b78e69ef7a1f5a9894b9c7d85f6e2244ae76881eb06584eaa98c78b60b46084b517f4882758691f91d9e2acfd580d5e901dae14ff4a4fd6b0d7c73450e4928fc6f02fb5463 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -838df2a27bbb033fa0e581073b879d6e8747fff38539801a1870f2e52d91bc84cf10f2560e93784650fba080304244dbfe9da679f207b6920be46b0214a1e490537e56d99beef3f58b30f311a12283501ad79a5407ff209d19a6efd0421aa144e0cd427380d89bfae5d1f5c - -Quotient = 4213d04b9f0b30026bd355404bee887b22b2cf9 -Remainder = c2bc097d1c20f050e88912f066b658446cacc7a4d510343a8d88ed007a8c0cfd5d44fe5f067a0e81536d121b39f2d0feb8dd053bb5632e3f9c04be5f6bf4091d646860cd38c96271cdba466ef8b7e2377a51d5669117e664269fe3c08a51b10e1e019ac063d670a3c7db12563 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 38ca0c2f03a5c56676a2f95cd7a69d4aa2085343af6b1d2a71e0d1c54157ec0e8f9125df2a499cdd484c04feb23b1e0042ca908db74744584036c79f21c25c40401d551a65afed0ef35f1ea000fa1a99cb29e6307f6ca0304145f7e483d008cf9efb028ebb654115a8c6b87a08 - -Quotient = -134e043b3b88b31f89ff4bc709cfa1bd2c1a8 -Remainder = 99c1c846cbce5e9a26c5afcc0186bb1e43b2501ab3205d13fdf01dccb9b1a935bc1cf8adf74d58f1c316381577366b6d126da49991a0d5e02acaa678085f335ff8b8e975e5bf2e52a05488ebfc21a3e0d0bc5bbe67442f77bfc3c1f0c03b7f7ce42bd0fedd8a498f018d8cbea47b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -c261a6c562fcdd56e67fbd2b91027f17c95da43175eaca6e4069c16d240ebbd240582dcde953eea739a4668fbfcdc6af8ff3ab58674c95de90fdb43f64a61108b030d644a44b0319b912bb563f61e520dca9c88f411b32e99c872cf00a01f5badad584636352913b7429b99ecfbe - -Quotient = -448c4922b7a7d5e1efec2c3f41d0264b76 -Remainder = -2599e928027d10d3a11056eb719768e5edb1a625fc0b8a1dd4439ebd30a82bfdf89e617ac7c71622058cc64ba32dc242d96fe3ecb856f1b146f831334af562cf88139a99410dcb869b9ad6ac4826563b400b59f55d8fff262dc920fe525b12b2fa167ec237028a098c9117cb77bc3f3 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 36be11eb72832f8ae7b6bdf689f794f62cc1c885e64706d14a77a11df9761c2e9cd81d8f6a0ad0cb1696c69afd80c8bb992cda5100cf1162d600515568b9dc9c81a518da9d240888d4984df65c129ac0b4c557b4e63ee5be79a27473ff5bca58e559cb04c4ac93b61545e7351bb6514 - -Quotient = 152474a1a76700598c18d9301866ec00 -Remainder = -274a2f9e2bc5f9d75f9897b28f840b71bb10a3e4e7a35ee1dc1150be61130b4e0e987e8742c5edb75a1ce3158eb8bdb7d657b8ba39436d7c88fbff160c7488ddff2f13b3b95ffe149a3d0d2d406b1737a7671f69c0e5d7074a151cb2776b2d13ca24bec261662f2967fd22339ed6c3f2b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -b17c79a31d5085b49793b6a6d628109a6047e3b1afc947e5212d0a9ae32b1955cfd6fed07fc60634ad15f32a9e402d7d5f750fb6d1ad958211f9e8ecda8990689e5212cf72b24e9b51bd07a6e0477dd4c02381d0ab6c0ad3cac1f620f723ab004880800736804751349f6bb19d3db48da - -Quotient = 5665f53d5a7405c83a5ff382ec376 -Remainder = 252d055186ec896cb3142c9e4e49c441e2ddad365b86ad21ae4ef1c522d3306c2834d6993a5e1f8c64a1ed582bad8ab746f7e773fc004b1c47814f73560db72f7237ef6e2f671d3b19a8777be2e4c662a76db87ea64f32c48ea371b1ffb15df26726854a417e18afcf49054c6d2e0e337e71 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2b6eb2caa3ca650be02fa199e9ea6c48646a76434e268713753a547e49571f9817ad396f2cb7b16d307801fc8892f0af3e7f93ce08f7955a8acfbc0b56add4b4c7ef7351f60e402b9a8ef7fe02ccdcb4b00b7ffe78c7009268dbcf1d606c3a1b5307d9a8ee6121c6a635a742b8bf36b56cc7 - -Quotient = -eeda035247bb13860f228d8f2c -Remainder = 3976edf710ab42bf069e5829de7e16962d1b765f6ae6ad0ffabe723e21ab01cb9f3f5f4edb1d8c13cafc0556c0aa93d72dbcff754ae9260abd294647b71785bb049bbb865a26bba22defc458a14af019a796e942e77d03484028aac2b3798fa730ae0193d89728bf80a8728715a0807b3c497b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -fb5e55f261aa96f54983869d58b3e9f0757d363b9c43aca5580b7c0380096f396ec79d1b30037702c19be5889fc6376793cad51975100f33ebf43e0897dfabcb9adf3adf8d845aa7589ba1f6d155b25f73dae3b2f835595ad6050401fd4e6392012d06194af415b810b0c10a53bc56350bfcc4 - -Quotient = -5b37eb0c3e3f8f8d9ac6f4e4 -Remainder = -28fde388257b9a11441c592580cd38caf2d69e2ba57d43151c77d26535226e05e08a9e6d8ed470d4354e9f46b7626e5f2b22b652a2d78f817bb51598c727a765941fba63510b58fb3dd5f30717f237da43b42d20bc260b06d488c9c912bfcea1e7808544c58960a3e1355c50c889cefe75d4d9937 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 29232a3fb059242cae6e0b419ff13c479048cfe46a9063188706c6a3842674b16a1aeaf771c5b0ef401d2dc8a57f6fb4fe1b3c7bb545c18ae763e39421e6a07c4469d234f9fc737ac21ca67a5553c7ed693eede4325dbd132dbd9889d815c02f426801eff1f46e7a52f72845234acc6c153f34065 - -Quotient = 1c7ac058af2e7bfbda9484 -Remainder = -54d7aa6dace87e61e24d87053b9d094bd160916b720d7cf4f740a4fc5a7f03909773d0456c530ea0204427146fd44d3ecec51d8627b5768de1494bf42081a8a4fa97163b0b93b59e70e533f3257723e441cafa4aab471ec4086601021c4462e1f74bebf298ef45fec98fa8e6ea97415f84c93c12633 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -83c2cdca7577b32c20e9e20fb498a2bceb7174ea9aca09d4dd2fc7a1d3b922797b4e9640c7eb9dbdb4d93c7fb9daadd680c1c7645d8102d77e9c877a9f65b13239f9a650dceefc1fd41ea9bd2b38a622bbec99cfddbc6e88f377cd51cc29fd17a27f3d0d970403a2aeeac6ff9fd69c3bbc5c2b0fe7e - -Quotient = 472df5f4393f33cc382 -Remainder = 16579a289cc776a47611353e158c43dadf0a78833396f8419fcbbe47d90c7e840e2c90e73e563e6c505bfcf691120ab0f1e9ef9c31db608cade70eb8e487b1113a46e2b5c7f4a172ad99b502eacdc0f91c295fe608389e61d030607a94d09d349fe1a0cc46d1e07c8db533cedebcb4a3b89afd8b924993 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 34b7f6780620246f5a0a92a768072185f02e57a52db1d865c21c952f4386ddb7e2dc1df076316cb4f2f394397cbcde1af0197fcf33e6428e6f5d42a9ccf623f75fae5940873097d4591d9b1a4cbd00074d134272700ab06d901742da695c3ca9d4f917a808113336f883e769fa8051cdcb0cad7cabd1cc - -Quotient = -12b4e74d76bd306d9 -Remainder = 8768fbe8ddbf60b548938d8b4a74c4a326ef335257e5f513e65a7d2cfbe9d456425ceb719407bde3cbc74c9c978970597b5663a0ec61962e77eb351adaee2d2d37f1fb55b5d2ceccf282ea3a0d398be1dd1b166d55dce04a39ef434fa392893618003adcfa61401276ce4e599051ad93152e3477ff524f0c -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -c898a753745f0fc178227a7004d917557cf3dcae2e85e95aee51e137b29c895755853ce2d61f214b80070174cad8ebc2795a7d070790acd335b383f9dc88c01227eeab85f1f29d76c1136ffcc7b9fdc073a3a03d8812c7c561b32d8e69754fff64acfd64994b7e9574d2a7cae6bfd5a6fd61dee7ee993bb7 - -Quotient = -548c97fd02eca7 -Remainder = -939e90e281f97a433eb1c6510668d0fc448f03d737d92693b6362c692167add7e4442105d60ff3db29c03ed06c3121aa4a53c4625906519a4092e4821c918d2264ed0cf088b7da43a222877f3ad9a9fe8ec06fc66b9cfbb44e0fdca1dbe4e461dda9b85231b5b9733e0c78852da83bae557755de3680ab61d4 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2c61dce04200e725ab0ecc5016f66044218391bdf650bc0bd31f3749ac06c24707e79526ee459ccfd4bc22834f8d23f391f2e99135f92b5abd0b04079ab75a263c0e98e46edfb440cd865269ed7872e8c1ada312df1bfd6a5fcd2ebf548d7b7d1d75bc36f62e5e9d15262bb8652a8041e5c8f4d673eecb777d1 - -Quotient = 14622572f311 -Remainder = -6d197a84d2ed486327790059adb5c073218c56345f48c15caf6892734fff0aa7af4782738bebf24d984bc8adb3056f67e57f9960001a67fa462afd8c57ac9d60ae6517d58ffb4773b637ebe6bf2473a5490511fcdc576a4c40ed03b3afcb2fd27c57b66a26f6d3f9b2bb101502b1117ba3ce7214c9db6302fe20b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -b818674faf69bc92085b7230d9335d7bead0413f2905539a54e8d1233843ef13f07cb5538e0787097cb24f152cf54a92e62ef143e31cfbbaf3c09650b14229a4f61a783eead26430949c88a87f1618788abab9728aa52dd8419f5d568e6a109f278b2afdea91cdedca43e562d4bb8fb7f1b7aef13992fa7edc320 - -Quotient = 5cdbb03ee -Remainder = 1cfa68d5da7a600a7ac598b9ca1a0759f972fd9a46ba62e5e96d8f6f00fbccd0ab26ca03d14470b43793411ea9803c9409908625fd74ef8f9b2d7c2064b2e3439adcb684e6f01432a1feb0f492fcdd2b8b5a6cdbd0bf460272218bcf763974be8784e5306c219ee535baf5541b8580952e3690b585fd99f77c46d69f -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2869338cd16322409d3efbd328b27e2ba53cbf71816ff5c093849b1d866b8cdecbd6bd8ffea0b7787251acb760f85c277ded21e56acef05d29bc728cf44f55be87cb4c8913408a01a1ad53461058a1cf94538f05ec14a6d3eba804264df957de7eb1a61b794a1141218966463dd42402c260c229241ec46afdb5a06a - -Quotient = -f16da1 -Remainder = d8b66b622b5a54963c2c84aa186bfde5b67a3562e07a23a5f6843bdb615a3c5d4f007ad8b275ad7e4c5b1436252efe35699cff2e0546e6dd8c7230d6ad560c51cd54db6d312be32ae4c708e9047c3a25c211e2566c58d6b9291de31612006d4e847c6916702be99b3f7ce40e1ac842908acb7f03dc120aa8998c60737 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -f8af8fb7002a9d2218dcd0f0c139b8e3dbbd48e25a5c910f6d0b6684bca224f62768b64955580306bac6bfd45b99ad77483563fc7dbe015edc06bee3ff93b0afa8f5866c23c7a7570b366550490c97ad84062c2495cff30717aaa965a8e15e270b504dbd4fa943be4f97a7fd1f3b589bc9fcf4f907a7690d99c978a374 - -Quotient = -71bc -Remainder = -13316e9b053a06520526f579718c326402d2a9686d51a340375cb53d7cebba99c8d1ae93388db0a41cf55d5753dd1174014ff3305fcdbd5b02de9e90c45ec0d2900ebf6ef847c2a045eab7f80f07f01c81b9fff093a779a280ae42239df79de8d2ec4bff6723788c86786fe276ae6a4dc1472442b552258e1e5b597305187 -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 20fe256859a2e4c4f77db6adef78b2aa4758b29ad0787ce7e277bc68391d5949bb4dd07a9b1a79fe890c8a760871d81adfd3858e27d1bd6de33fd31b8aa6131fef9130a50f995c3be1d615d1bfb9878804b7f6494237d8ad78ac219488f17335ae54b494532f03a3fc8e9576cab6facd90c662658878fec86db66bacda3a7 - -Quotient = 10 -Remainder = -23e09736f469c83f280052ff01071b1bdb52b7e2b061e8a1a8c6a4e091fcd7ca0b33ade885d928a11a3375599aedfe554d1c2289795daba08f07327a19a8adfc219592bcdf9fc5aee5961a48b3b1b5fc380eff5ed2ba7d7e564462397fb6c6187254ee41c74602b141d7adba99205d2e0b35da57efa96397b3a5d112751cf7b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -e849bc0bfd9560cb90e42c8e4e88df175133c14466e530716d89ad0326b660b0e617b4efe8df6b000f517d3cc24d9dd4cafa2773dafd4c6bace0aba54e43c17e8e3ff9497a97ed83e6408aa0aee0e6485dd1d89d52520d1acf4d587422b0c5cd2d5e7e81fdcf842d6331779e800f96628206e8be020ad4021789008a641f67b - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 22004040a65f9b6f120bb7243c638cf3a4cf6fc58c230da932c79568f68e31af7a7b8569aae77af671f8335ae68d6dc1698baa9d6ba9cd633a662101b45bde51d55098b50fabde8546f317ecc2ae7a39521bc075942e3751a349f51ca3c371f3b8a6cbbea3e11a334d677c07612bcdca767194c07fca78ea8a06cc3b0dc6dcb8ba - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -cad46f410062dc33ad4d712c3b743ae2b7613576b2bd7c346a8479ed679a08e3644c7ee4f23b95f1cc9111905714b170abc37ee1003956f64f0a7e876b38d524fbb2436ed56069479d8d2e4029770f7801a7278fff99b3dc76280f35c7d43ee594073f725554a92eaf4f785c18a7cf6669dce5adb0995233241f3294cfb5bd8f4741 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2fef69f9745646aa13e0c38d77951161a1f881a7ceef032698da3fce00764959f11140bec7d7f53d6777c3622453d4525fb068da48047609d18d463a8fbacde1d21035963b668ca11d5b9ae66db13de7a7a5b66a40608dfb56d9f9f0c8880426641083a05b5ff9e6ba0d6da3a04af1af01dc218e9b4f6ad7b1d3a4d1d26a5c906093b2c - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -c50a24e5ddafb768f64677233c5cf09da1b4f06894bd68e194b23feb5c5d6844320a12a02d13ad012f13b1438eedd6313bac9c1f9bb4548fcd314988d8fe0ce6458306735307afe08a96a0c2bcd9cf126f529e48b7ff4b8266caa28c40b5c3d2a473ab8805c860d27d7ee9c032423148d96fad019490ea019d40679de7a2a3323e80979f9 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3a8682d0e5a4efa985dfa8bbddc2c0d72a4400b8b070a8cf7450aa8f831d8a91c9ae3542641b7a4ad793e232a0d301b82664fe2c7f20bd9bf8275828a2a20027d6056b211638b9b0220fa4252d058bb485dd3c4622b1eac97d54b9634b558ff1bd5bd11085d4f3d288f7965af52beaa922b23ac0207d5763c24c085076128e0ef7370eeaa19d - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -f00fb238bc9383079c7ecad9b9f6efc622d58a76f2d5d40ec7cd7c3c083c459fbcf3d128df4d20ead5f585505515aab11c36584ca622d28e0cf037419a649d598346063a07e29c61b7a8e76d1949dbce3720d45576763aa0d391b39dd6b694c7cc60a1b4f4f107d87130402985695e1847e82cce39b8d0fb5c88bcf3b37d6dbb90baf5a8553c3a - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2b809f6baacecf61198856d9edbb768ca2df2abe9b7b8ce1669fd9259732c8569c0cafde2e32d253094480ed281a8db230f84e780c6e8bbf3657c0b0baaf19ea973fd8daa2870c9d79f3695d78e063f9130fe07ce806a088ca267fd2820f10dac34b5b32aebec20e4362dce26eee0c29d2fedc1e020d452bc2499234d07a2a6e54314e3fd6dd85fe5 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -90ed75629073df816ec1d6dfedd1cdbed9239661e362db706288dc4d774d806bfacfd4b32c3013ec67d8c2af133b46989f12f809fe202d33d5ba53659bd2a9a85d3fa542de4a5c656aacbbf8899aa66ba816b809f2629f37b0444cd3a6dfc99103bcf2a5ee87790b8401be806b5d7fb7064ff0a6fc8ec769d0ccbddbc3d35f7dc4d388d8d28021c95b6 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3f60052c9dfe0bac797a674ca7f11377a24c28a1396ffa0f46acab7909543086aee1995cf51852ea4a21ff4bbf6e7309cba9848a7b2e3b33dbe660bdc58d513d16bc709f1f2253648b46daa7aa037332552db1da81b4ab9850ac4ec66621648fc856a71eee3cedc6617071600ecbc5ac8636233f288ec249b7ae0bac942a5fd539d03990c4fb28a46653aa - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -c12fc156d9345cdfcff94bdd324429530ad8caf8afaaa1a82297eb3a8aecf2ac021384036749e489fae05e8776da0deca7e4325436bc8f383bed579c2d67a456c4e23871489780d760d63d0bc0d1d0ab41f06a091b44f602bcdc0bd4e817202e39ca6a934c0c9405adb5a14d24da895c58a81d1c7ce52734183e00d80a414ddd8869998822364e029b3f42cc - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 205dc6227dbd3adf8ee49dffd43f835882822b1c94f92cf38f5efc62f943075d80b33588973a0e0a8ff5e800ede21d394736ba98d4eedc53a9122f8c262cd09fe9e91cedfd0237003b0124d757797ee13cd03e7a3a257bd8df756940a4d22face9287edca00ca23e7d5e629966ef710b07e54241dbace041aa6d9f82687c3ecba818203adb376ec0b201894a500 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -82c30a9ef6a83d81b77825c71ddc563939b8508f1b7e44c725ae0f61006646ba9b86507ec9a4dfd3755ecd8bfb451c2d43a61599732b8aaeedff7a304ce0a9327e2333f75e9a010556ecbc3abaed02214f25e1c8373bfafc2c288ea36b8d5f848b76295a141d8f633609a6656c07f3d98177f5fa83833476dcd111aad179001f81d6013ca3a54cddcd8dc0ce7eb24 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 33aeafda3cfc20710f0b4a3d9ace4817eed80ca57ce6c82dc2e7946058a40983c9204ac95a1399fa633bc96cb10af3ddeee3ad2337c64391a42dc7794fca629e3e1e4e03a2ae24a000e7113b91c1b6230cce9592e45b6ee7984680b45aa0aabd7f56cab1a64ec310cefe5211821a75deef2e0c8e43eb467dea79dc8c03d2d523734498d079d5493c904a2ebfd8a3a9bd - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -b897bc87a40211ef8f93645b1f6c981fa00ab3b12e117a89375400ab5f4c64bfbba01d265c7bc6f5e3a8e26de5de9df3b8f70f4a39c0eba577db5e4b7a68f751b4a69ff4a38915983cbf70dd7e066779405d572f5bbe0719c978b6865ea1a72d90d3ec8a8c146f20d98595036b3de88a7500d7b476644913e4b63e85c4e2632048e9600d553e560759770a902cca680b17 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 20604e080549e1c503049ebf4a56cf9447d90fe699a9773915b0a65588890e15bd58f55ad7b52bd7b7992a8b24704f1dfd5fd07c70aae4ccba5646405ff8a9cbf542dc334cc0c27a790c05420b552539fbf0a155861bec0e4d9e3fbf045720ea3aed58307d5738b64252a963f3fd5ecd0587cb4d7e159b4980dcb112e26c9c34f10a192e090ade157eac1d7a6f970871eaa69 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -f11fc9682601cab97c25533b2599f50edb1ac65d46f1969bd9c3cb3717461627621c8cd401a0a0b91f3645b8804e095aecab31c1bab0c26df556adafdd7e7f4f0510e0bceefa3619e26b8c9a1bc613db03857f53e9eb5d4b8f75a8cd1429feb81edc705e5a779d5f95373d2243368ce17ef22da79a6a2672496bdf629171b7973fc4659c8eae9ae867cf38d6d7617029bf59d2e - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3cb0ffbd9ad21d0e86e4e4dab4d237e2a17d97356bdd305fda772fdd99acefcfb8309d813643c852f66e1c6c7fa41ffd44f8335ef7333b2b3e846139fa9be2c4ea762afba4e11263c0b5fab18c5efff2a18d83ee89844f5f4db2c1325f0f55e066a9e01030c07a85e2c9bbd37b5e767ebcc9b95f474ecff24df9ae52a19edeb66546a3a28980f616eb5a351cd399e5f8436f17faf6 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -b8aaffe779855c6ae51807f8cba780aa64bc22e8fa5e33f7f1dcb084fc476791565bc33eb37b4f791ef5cf46d64576f48b5fadc9f096f20c798355861ce5d24a7be1450bb871f9821099f98213d74a5e5cf83b895ae65e0e0fd096698463906a112e6e169a1cc0769df7a5ba6812300fdd33611761b6339385e1a70f8f8b2be7679ca216f5b183140e69586a27aaa9f2fac118118875 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2b7ee3ee34347dd89ba4a81415aa1269d0390346597b07444f0febb71d490a01b6fee174634bd88e8aa180409549b2726d044b4690353de2fb2294c8f69c612485aa066f68fdb89466760a85901cbc7312bfe5a6f656e67dfd2d4ee099ff97694b01d6d5b8626ab1650eac5267be53f5f3ced5dda1aa86bf42ae132a28fddb94902a515da40e0fd0586dc8b17a34af8eb03d06f70ab89df - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -bf8213944ba785e01b8d37a12de77b2ce1492f34bf6f67406cb51da89675b4f70f4d4f314f30ca8d65cbc48ee2fa1f0a3e4ac0de3a87d2c4c589b6812e850623d78ef2e46fbb555f6d3c69b211892c11a4a2dc3d8a9a19e96a07952602ed5ffc0232c140c3e828acf990e5425d8dd9ce0c1107ad1c6f96c8fbc90ffa457abab0d843094dca3c8a45ddad81b7850190625613a4851485f38fd - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3083421e375f0722b9397e156de47f77635d62ba1d51794469371b473b71c02e3722841bca2ca06b5d1cf1492bbacfa0abfe394dfdaa7bb8787550ddbd953540e9c97631d9a1efe0c8f8e14f395c82d20245cec6d8021f8564b4d66e7779c3245734c56fb74481172f4e349d9a113cd0ee5263c69ebf746c5285cd4c0fa91d9531f769fea3610c2972ccfe9a22c00aa62ebf52b3a4c6135f3069 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -d736bce537f47ae4797faad797af8cfeaf8a4fd42df1f7e61febf8ebf6e47dabc48252ff7948f3dbf8cc369b6952dc58f64cf09b4c53447d135c7a753c21b6052a9726a47a61e13628edf0f2bdb357f2e780ac1ae1f28f211296c8961c2955b773d7dc2904dfea96780b2877af133c9591a0dd54cb20884f014f363862478ee7ec45236bfdcf0321af0692e68f744af28fbcca827ebdc7b210da38 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2cf1708f1e675ba688c0d19eb61a05d2c8642528ea6b1512375faa732acc59ec04ea0aa55e0049144be09eae1292b6cba6db7a9823f1e912df6a5032bb9674f4f26c0c8244ea0dde7acfda566574956cdc33e4a27bcdea25fe255c19f218cc4316ae8428ea61d1bf865197a066b959c5fcbd7c9596207997d05fc38e32322aa189ea06cf5139522571661745c0d72b740dc6d842f1dd8481e318b5792 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -a9180e44a284b5bbe72fff46e55869f749b626ac33c8cb17be1fc260d7c6f460f24a89e1367112e00d0da4d213a821d09f103f35bc4eade5605bef23c5d048b1cfb45dace8b9c637af626a85fc773cf51e6602a7a5999a030030cf114ed6a4ed7583465b9303a72e7f60824c12329517c6763b0f64abd8ba2b9b26cebe882a51f05ef8076e527d53a213db910a5f42be5fb78729a3dcd08d69a709920a2 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2f26e156b3b1117f7cec542b20fcc06ca66cec03a19b6f5eeebf22b4c0fc265df5ff06fc9dcac569735135bdc142b526b295225711efb71577b10aacda2fa446f5208487c725407c2188b3185237740c813e4455a6f1dde4f62916237f23164a3471aac0fcfe24ad1ce1dd81a6144f5861ad0cf22dc337abe10fc4a88b36116dc4929602ab48eb971fdd7a5ff747d6b9e0b2bff75c59621550991966a0a19f - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -9fe18ae697576dd36ebdb621d14cac1cfdfd1f5cbb7cfa8962c5a7dace96f9f54fb4f4cf2e650dbec5d1ba89ba53d251ecef7dcc1cab8c2ff3d77903f5fb5f29a4e8e3a2a3c05c105d5733b5132f2f8d88f99d17de86ca1191c32ad8ed469bb649ef188306f69f183bd0fcc32759e4f855170f88c0a3f6745aa98f6225536821bfa056a42b37535a622f42b009859c974cabf2e14f75c749d0fe5a01fb3ab0c0 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 33ab185854b20a8126884eed85181b14e75d4ee452958cc1043b099bc16c24b9c2f3e0b792744f230013907844496e600389800e45fd55133fff0cf19c9c152b9d031039eb90da568f9c5212a3ba283f4d1353ff8ff9dd04d292c265bdcb77c3e411716f471930bccbb8ddb819ebb0e0036dc1a18457cd97f4f5909a725baabbd15e8ce33875895aa8dce77a4dbedeb0271a2a4a17f77f5920c3776caa4a75ac650 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -e7ca0c037bf8bad5f8d9c5a2737e044d9f7284c616156d142612a53eb217f57f4aa00b6daa424e6c0d9163939e1ad0510a1cd64fbd576f3e54c59d7aa6228fb3caaba7cdcc951e00ed141ac3a68abb9780bf46bf544fe0e347f677288e962fb69782741df49b27cbbe8720c6f8f2e769147d89df6e17e3c592bede2e696d384b9f01b99b31c505d67eb6193a8844f8c4cdadc9fe45dd446a0dc572c9da6e58ed303f2 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 22b76d6973e37aff4a09216e57662f186c0a0748c4375d6bed370ea61d1f6fac2d9bbe04487a629118b6b0b0c8cc4179fff7bedcf048cc529498bbd9cc81ef3a103d6cac49d58bc41c83f961b6df7f00c7171fb7d9359e03c76e4364cffae5f67321ce646e9b05f9c04aa16ea65389e940022eda6dc740ddc070bfc7e589b86fd1559dc320701c39de20d54d0483fdeef6c4fd012850630b982c2e243ac1ff918377ceb4 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -e6e4d69a82b83e26ef8ac0f4c3a211153ea6655b7ca12840e7b866510d114693049c5b8b22c3a097eac832bbd1986e60564298e54dba3316807ad64bd6c18903a0f22660c9e8d5dac180f57cbb90b176b842d5b58d6dd9f47499a037833a92a18f397238a8bcdc4afd129382fd6d200d3d267ca1e6bcc2cc65950831cb8e30bcc01665c8149b874c9f11168153c187341afdc43e4d8652ce4fbed9f9eac75db40d64344ade - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 319a81f052db21ee213c536db2cb8a71e0dcd0a9b2ce780a9588c38b717c5e487a337f82b5223f638fb552e92b826192e6a1c27771d1e86584bc6c7cbc5d9a6ce6edf2ea2ccf6939485959ccbf3183b40e410768c4665adf90a0ae2792fb4b5d8aaa06c6294e31893620decc3bc72fb4eb68f1e56b48e39c59abe869d07509b7564268d0b7f178ef09ef5dcde6e7dbd2a20fd1d4fcd707943dd63adf590a117ead1ad10ff85cb - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -eced809145e696ceaa0ee8f831eca67049509b31a1b15e7fc86cdd97a73a2ca05bfea5f4b283d287e49906463ef36f2f8ea23c2aa12d5534c08e9769055e04822be0f8ac85f404f5c025a6833b4115f78da9470451c852ba0f24062397d20385f58c5aca10f3f09072b2592e5672ffb989a390abf86cbce74268aef1f4ffde730b3b962df1088bf8745105a7462379ce142f819c2538d9bba99e094ffbc4478625bc54df16c5e1a - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2c1ffbbb30e71d5fa77b5473392f95297b489c85f83013262abbe948842473154e00c86b2e354278844083f960fd746a3b7cb9baecb9c66932774b3a28f678d50dd8fe52fbeead43d8c8adad7c0fcdbe5e02664b0feb0ce214c5fa007c5fa2d08c5fe96787b95639311cc4b7eb2a7217c9c38c6d93444fa60c1f52ddae9bb2ec1a49a593e210e47377d3623cd2c4994ad9343863443911062e12233176f4a65ec715b3c9731c4a0cec - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -c3bf056b905c0392a7b5fa57446ed350f325eb67d59f1784c744b04c7f4d8f5397db913407aa8a7f1dd0225c1a9673828db0d8bf3d4908ef53307131bf5b5c4c6068ad73b874aab98e8db33b0a758532172acd8b2c830d0679a8226537090166317b8eea91e8ee4a7282c0ab0ab6f2b7b63d728d22b534fdc88294c376a8d036ba9a644c2489bcc84f6aec83afbac08067a7b93f3897f8dadfb68c327b751841927a728faba47dc44ec4 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 23fcf9510caa531a304eee8d0b2d49050fca83abbf287b6b6dea06501c5afc6d87d2924df1d45b1bf6c4bf77b563a3013cfb4ad9094f8ee9892d33f6ee1c70131cd5721c5af804a9da7654510e8591aa185ee723f8caa78046d9e6fbb891e6024d2ec70110ae61c3969995e35941d2c7f3779d5bb71ce5b693bc9ce4b087068adbb554acc4ab23624e060f7cea169ab512a06ff3d2a36c2b6e3bd9a75f1a9ad30a6a16b0256c42eaff2c3f4 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -c32d5e643b12db6616554116299c1da672efff1eee394378c5e9e5f702ea4ad64f0dac8904bd2751d2cef91adcb283599f6c661967dbab27059e94dd50025489cf74c6897a22e95013669aa3063fcdd4b73aa6a9a1ba5cad3956bb26346e22df6741cd0ba1c0ab87fbe74035618a394383823216df47b910cae495b8fe7ac5feb3b2cf0d0ef6c75db477160b75324db8eeac48a0fce72b9abbd7079ce6f529a89025a03a3777cc7d1deaf3e4a - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2a8f2c530342bb6ce683a760540e956a1155c0fe065476e400caec59861ca97ca71e51a11b3213b2baea1a41a29449998778e0f533fcc181698d293f05e28bff2750ef4095170de98a19a36ddcf59a65f3789a3808ead51680245070262c9544e446f23652eba47065a2bc4701c55378bd49733619ed2c213f8ed12a4a317c465f37efe07ff2df8e88fc33d3eb42cde9408dda28215702bfa607030839285a8bbf89b5e8842fa7d7f50d83fd4ab5 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -bcd2b2362aa146cd120b729e81c98ae598804006d046a7ed0f9782baa10a85e37c7c22288dc61c24830a1b42b123d63779e88d7555028292fed5ada1793264b35e961b608bdd7398e421c5474c33a65059ef13787e0cedf4f8f032beac48c4b5e5a67417109142a43b198ab617d1de1a38d6fb4922c6ef70a5aad3faf6f8d5da3af9679c94cf61ee760ba792d2972376425e2ec9c4109e969e3d9c3dd90cdbaeaeb7382cb7bd024b75a1fd6d621c13 - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 3940430ace4b5b87bf4baa2673582db3d27307ca4cd8e55e976ea3e10da72b6deb7de932253bc9228c85cd4ae7766cd0264004c658a66d81e60bb9bf4dd66e2afe11057b7f7b53a1ec222510748be53a93970fb056e8082631b2b77413fccb6e61cdc6f224b7903d75345afed8a4f194b4bcedfee1f16dc256c2bb9f4a129fab6a9fe752895a93937a3d087ab7ca212991ff34f1bf1c55987a574674af43986312bbc3bad3280bbddf4ab0217440f851b - -Quotient = 0 -Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -f0dc20b88450f45381791e85d080e4f2cf38837391e16e608b8cb5e0ac0ca75e9f72cc04bf2f56f130d46aff31efbabc0ab14f0c0ad680d6899797297152be85ac012644c8d0927b5b6c70dc3e5a8d79ef92a0873ec22af3d9683bb5db1ffd5ebfb698c5ea64cbe2b6a8b9f14d4c18624be1b78b19eca14942ae9542012692cd0d5289ebf75fcf5486596f92659143e9f952af3622137e633376fb95e628055e0fb1ba3a37ccdf0af69a4c0d6b0793078e0 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = 2f2135850715f623909e41a745eaf7b37593567fa8be2d1ccf76d10b93a096e244b91d8700cca37a2ec1bff7c3d21cc3211ea8b03a3594921dec32faa185e7f3d9d17e98cbf8d881fd2abb944181659242ede21df7e5e8784f541cad678df1ef6ca4a5fa91f7856c62fe593c4d24436810cf4fbd11125bcb571f6975d82afeb81bd0c7700e053fc175fb5fc7b329c438479a863b8d5fbe6b4436b67355c51d0306e8847a27a30c9e61f0e08232673cdf0ba4e0 - -Quotient = 0 -Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -B = -cf429f101a2e19a65af1e238f6745215cf476ff2609c846f10289f1ef21b89af2aec53def3f4ec07ea42041f8b5862dc37fd03b2df12adaa8c9f1933cc69b526d47797b40f49545fd093b8ceddee3c55721d1fa19b336218de0cac56d410cc6cff4e620578cf820f5cdaadc367dc4d6372aab1e0ae3831a6d153c14920b1dcf09e7629b7442a06385420d79742e409677e3b82ec58bcbfa668ca072e981e20728a983d84a432605389c855a6668e0ee0d2b67449 - -Quotient = 6f949f45c70d69f65ace3e8d79071803fc6b8cbecc1ec1105ee6dd4e3a07577f1df5674853637faf6e5064ac86c3595627497311d749864c87ae8d6a0fcdbf258de637ac8db6cf079a230105582230644422186051875243269bdd6558b95eea7db6f16147554764d8a36d8faca89e8e7583576a0f9beb7142bf4d4d77d97c91 -Remainder = 0 -A = 6f949f45c70d69f65ace3e8d79071803fc6b8cbecc1ec1105ee6dd4e3a07577f1df5674853637faf6e5064ac86c3595627497311d749864c87ae8d6a0fcdbf258de637ac8db6cf079a230105582230644422186051875243269bdd6558b95eea7db6f16147554764d8a36d8faca89e8e7583576a0f9beb7142bf4d4d77d97c91 -B = 1 - -Quotient = 3b5c3007d9c49498ff8437b6f0014d146b63c20b6c5b91febee47211f42109f6081204b21a8af99e9ab2b5165d536344fec16bd691fb3883ee7335e12d69afc8bff57641ac7a4cee350209a08301553854873da153ccf056427a2415e3ce72972afb5883393806ec2388169b513674c0935f67ec79c89dfc4bdc6f9cf877a10f -Remainder = 1 -A = 76b8600fb3892931ff086f6de0029a28d6c78416d8b723fd7dc8e423e84213ec102409643515f33d35656a2cbaa6c689fd82d7ad23f67107dce66bc25ad35f917feaec8358f499dc6a0413410602aa70a90e7b42a799e0ac84f4482bc79ce52e55f6b10672700dd847102d36a26ce98126becfd8f3913bf897b8df39f0ef421f -B = 2 - -Quotient = 4f54d7e1ac8816945de169e9a2c497ff240e313c2b7d58612c8175e277f032cd4ee5dd640605028c59395a1eb4aa00772a8187a0568b93919aa5b95b0462e5bd31c1e507170039306e1b2f4f75f63ab0a3add0eb01217df61a74765fc37e941dedf10fe142ae317573a4f0c8ce408c213749a12f56add5d100d0973b019350a1 -Remainder = 0 -A = edfe87a5059843bd19a43dbce84dc7fd6c2a93b482780923858461a767d09867ecb1982c120f07a50bac0e5c1dfe01657f8496e103a2bab4cff12c110d28b1379545af154500ab914a518dee61e2b011eb0972c1036479e24f5d631f4a7bbc59c9d32fa3c80a94605aeed25a6ac1a463a5dce38e040981730271c5b104b9f1e3 -B = 3 - -Quotient = 2922aed641a12010a3099f3c03f708962e2791dd860e65440acf3b982a4041804dcbedf45deefdae5130df96902056f8b2942069fc17bfb29f46a096a36e842ecb30d0800da13b6572c5b3a095038baa3107ca28094063571b517f7cda3659b63099c57a40d7dd2893b92d60b1fe2fb4594fc3a19b7d7957921437556db0e353 -Remainder = 0 -A = a48abb59068480428c267cf00fdc2258b89e4776183995102b3cee60a9010601372fb7d177bbf6b944c37e5a40815be2ca5081a7f05efeca7d1a825a8dba10bb2cc342003684ed95cb16ce82540e2ea8c41f28a025018d5c6d45fdf368d966d8c26715e9035f74a24ee4b582c7f8bed1653f0e866df5e55e4850dd55b6c38d4c -B = 4 - -Quotient = 216236f9c82fe6f1c021853a21fde3e21e6de355cf193f16b403edf59a6a6ebeedb266d4c7a6683f5f6a434c7129f582d2a5a852269d66d2eda45a1e2f25286c665f6641ff8b55913603064cc7a157f755e515a426873e7bc6b9d699d1f316759c4505a67b7a025598f9d1af6ebff2ed0fe393db829f768178c1080ea004e4f4 -Remainder = 4 -A = a6eb12e0e8ef82b8c0a79a22a9f5736a982570ad0b7e3b718413a5cc041429baa47c0227e640093cdd13507e35d1cb8e1d3c499ac113021ea435c296ebb9ca1dffdcff49fdb8abd60e0f1f7fe626b7d4ad796c34c0a4386ae1a1310119bf704c0d591c4069620babfce1186d29bfbea14f71e3498d1d50875bc52849201878c8 -B = 5 - -Quotient = b9fbd48d54b9b70374425aabe16d6a8a819944a43185c2fd07073e20358510ac3de13cff33fe6220ba952d88b2e0f3f7eddb8daf27462b476b5e127e72ea60fd56cc54bf14d2d92765d5d21652d8e16aad4423cd9789515d59aaa02d42d3e957dde50ed1c9a69e2295144a643a8104660ccaafba250854e7f28a686935738 -Remainder = b6d -A = 8ec1cca67b888cfa26bcee98ee887c47507a253008032c2b37e50f2fb914a34c357f6351e368c2521f3781736d4dab43ce130640f1a55c3851e9b5320f34e772751fd70cab7bd7aebdaa9fc22297790661fecd7b4ed0e6f4275377f2bdcba89bf1d251e0074864618b6e1319eee807e054d193e2616ce52c09ab3d24c187332d -B = c48 - -Quotient = 5157f1bb35866dcaa3abb4abb73580d43d03536c3c7960aa95910db60f4d1ffada96c7d89dfcb290bd8c5bb154872e2dd6e50602fafb435193575a4cf253e4d22dbecf11f8f97408dcc83d6e591b1d5daa59825ed8cb08cf562fc50d62cd666b9720055dc11cd42278258e5bd8021aada0b39a340b6c5585bb6c9c84a9ff8 -Remainder = 3d2 -A = 469e999cc737f4d12c97d19a13ce331841f8232cb780602c18592e274ec8b503884566ffcf28a206288f1a9ab3a25bd74bd054781664a331922a96254d6155677836e7455a6690fcb1acd7550cdbca3e9124356ed7b644660092f8d2df06d22ae7f38ca8a4e7472aecce9ad73c47d3a93cc3ec9faeeacd3f59f70ae22c9614b2 -B = de4 - -Quotient = 3566586b9f864dac5ed132d95d4ac6d1fd5ef6a2c67fee39ece89d615b4c681284b4dd5e27b90c6270b85b150fa2a63440e470b0f937b0eb83432be03eaeb37a0927a9c76b07fe40e3509c93a7b660b77ebbec9bca235d387a9a80a6432c77ddd8190c0ae8ea1d72331d5f4985467755b27573bf23109a01c02975e07daf3 -Remainder = 2a2f -A = 9d68d0643f1d44b63aff6a83fca08c52bf800dc59260db9b7ff930eb1bc01a47966fa509abd7da21ad856f7cf536d32dc7c962afaca1c9e43bcde135e4c5b9cd9b3c8ad775e06fda06117f8cc03ffad8e5f4b456baba7eaa9c67af7a19c2f4d65120d51fa8d31d0cc1ec7502187cd784fd2d78514cbccff969123718de7cb30d -B = 2f2a - -Quotient = e36f2fbcfe134fdf3137539006d6d9c03b8774883211f759b0258bb09585440d6ff440e799ffc434a2fc529773a455db9abf72d8c55903d9ae5abd5b2b5e9ccf23c015882cab8565c654532d9407a188a40d0cb026fb3bfda428d4bdfc14bec72b5cbd59540c42598f1371e9e61a86e6b4c957ea331baca764b771212495 -Remainder = 6eeb -A = b669c646d1bbd7389fc642da6d2c440788fec53bd8409ee604222d08b1fc31b3d301e42a8168be0ac394e5f20eb51708b11e7b09d25043f19032310d6649d33eb6c9688506ebd56ebfd0d3f277511ad3caaba3642c53d27e8fb0eb991c75577f584c52b1ec44111b3a9bf5863c18d8a07b91d8ae0bdbbb3b05ec8d11380a9c3a -B = cd53 - -Quotient = a891f8a42093cd86d76cb11cf734a65dccd5b4d350328a7d2f2be76e2edb6b7dcf4c5e1915c65764c77ae73fd6e42eb8451253507e16f2e25ef80e5d1f27ea18dc976a9b12147ecb643b2ab060163307df818127b2e40dcea95a109d7841edc9288190587ac48ba9687ccd0d014d531bcf66ec401bbcbed777325fd1060c -Remainder = 6e66 -A = 9077614b809f4b22707cf965a7e79217e13ca2011cf9e069babe2b4d908e318608f91da095864403b168d750d904fbfe11c9ed80ba9f60d57a8dac2754647002a0848fefb7a5aa8e04fd28dcb9c8e669de4ef794eab2abc93d68dcbf4400d86de603d199a3ee93050638fca7063ea99a9465dfb60d0568b99dfa1ed79da41522 -B = db65 - -Quotient = 1b16f2e2ef7709fe285ede17beb7d9932caae2dd5fa0eebb541770ca1d53da4428820986cb7e79026eb8bc261eceb200b7696a4b90f675ea9af8389c60dde4d564c8adeba6b117edd05469d285670c0bc78afbc3ad047828cdc611fbcab403c0cb79665d6285b43fa04b77f0309bc7f74136778f8ec16899df040db34f4751 -Remainder = 68 -A = e91e7c26e2b562fe2568613656381d5581628e4705ede6660ca5b79b4a609748889707faf9295b57eecfbb1c0b1cb5cc2a5825b84878e8b9e3960f29b59580385a4af0aae375f8eb7fc66aa6a1fdc4a95e29048ce1e5760722c77cc1c95b1c4c16fdb3e59ed4961f8869711ff24c91ccbe2fb6e0617a5f242227e1e60b3ab673 -B = 89b - -Quotient = 37370826964cbd65a48598e73b519db77df6f520bcead8c0446f1288ac189403adb65603b2a68ab3cc232b667232f2e206b5bee0fd48fea8b3ff515f452b5ef0cac591b6ac8c8c509c59c6d3d4e3fa03e22578ff71f1c72ddad9d637ae0497ef0e2a4b261a72cb784f8283eb7e82b6a05aff0a2f61da4780e4e7cfcc4807 -Remainder = 3a29 -A = 16ad5614f9129c7952c5ee8057d8d12a70780144e616e3ed571b2e38a9ce482a52c436eb9ccb6e4f400321bf1f3ef4c8dc897cd91f868eb7018d084784c4840a1d078c8c6a75e950cb76cf2cd81b719ac04d2be5c9a830b1d1361f7ef6345af66a6d56c53234cd98f587b6762401674973df670addcc4a05ec0344d402453a25 -B = 6924 - -Quotient = 9bb00032a27651eac898b8a567e19ed6448669c8514b5659c4b1103069d9289c6c00b38b44160e0efb2c635b7a64c8296c1c1b5c2cdb285b749e614eb9247c6defa06f8dac077b1e1c26059847de56a1a5ddf7fb1254662624f2ffe6edc48f3b318ffdc7ba2a81ef2d963b934120f58afba2b107a215b58f324e2d923f75 -Remainder = c03 -A = 74524695d4dc11023ff202ed2d165551ace0c126f7a51ebb3ff21ecd7c058cd4a6bda2254c55ce6ef76fd11807f92e80dad31bfd254f9a2e1ca89949f65a1fab8f6a4978c488f2dfa61df46c1faa418ff45250d82958e8f5fdd9426c44a3bcd7c4eeca276abae466787a5ff0ec482514e03434ee68fce24fc620e31265c3718c -B = bf45 - -Quotient = cecbbc189fb1d44c5511f742b63207bcba9c78d09342cdcd12a1b1bc3a95466e7fdd8c59329a9b18f7c793c43f08d52339a8202dfa3a9fa86a2426bf5a94e006849b45cbe9a5dd74ca43e2acdf1051be23359624e8f146b203864d03651d98165b783398a59b446314c9b01f79b1139c30df348b14ffd25b22d9d90866b -Remainder = b265 -A = c3721776b9b5fea8608aa9d381d80ac603d27043089dac276832e7cde8d222ffe142f06c314e94c3b9f6148d029f260879b700e1d435b5f318c8c8caebe92236c9060c183783edec2845e6d4e816197196a0de3644544093b04ac6fb4c69d7446954fbabadcc5dc3309e9a3fcf70368ba7448455cec9c3dc78512a19ebb04f6 -B = f1f3 - -Quotient = 4090a2c78cf8711388347149926610d624543765c9667567ad86eef9f9777f53c0cc0f9a989d9195a5e0da875c03e5c74614f95b8752f9ab89fa61c264b8b5d3e02b043fd539d36dbc6782f45a555d1f36751603d5c3423c7f27b3b5dcb91ddc81bf1563dd3abb0970de6109d76da1f4f9d5208ade2b131fc407c5b169c -Remainder = 2a87 -A = 129d32cde3c648298f8e8e8123f2e8ee9cad3f909a5647ed09e91cb99549d177575f54a7a3ebbd4ed2b89940722927a8b9565ffbc13d8df6d2616d5b1925b87bbb6aa6d39f2b11d26d071fa30e63083ed5a5357ecf0ab1028cf0a43178486679e86fe4dcb071c49832c83c9de4599d672e5ecfc7c9190f1d7275f5a0abed80f -B = 49ce - -Quotient = 43340591e68e228fb03e44a5f2046afe41a3d7ca99ea9ff1a445d75f95f2ff7f55fb914791613b5db7369121d416a5f92f834b0b5e9280b49a9e66be4c682019881e6e8883d7a923d2a5d309b9d265b01d6b8a4ee07f7552934f2de002cf961fd93f33641aaaccc7c367fb6798436eecc9bb22357087a9c482131e1065eb -Remainder = 6332 -A = 42e75e3b8c23287044593d9fa4bc5df437a0f8e876d3105334a677b5ecebf653e8bd7e55dbbf6876005196e44980bc23df491949c59aa199cc9e0a111b58f954eaff2bd270214726e5c98de502ba71b42089fba51e8763f0c11f278faf4c61589ceb674d7c7c61f62f8d18ccd619c20243a508c26b934f06ddeec0421b372326 -B = fedc - -Quotient = 688c7120765f8ef7363f7ae1bb65bc568b16e32c59762f59f34a57f08839d19019313dfcc9e96d7415766bc0aa032b19ecea72c249bffa0538bb1ac06401657df2fbea5c46b18d8a79cee4029e5972d8361fb7e6c2c537673aecd727dbc758a3bca1a001765a216e9985eb7eea67ae979f3803f14587507ba0f8fa29957 -Remainder = 9970 -A = 688c0894053f1897a74844a2408400f0cec058157649d5e3c3f064a63049495647a124cb8beca38aa802564a3e428116c1d085d7d6fdb0453eb5e2054941017c8d7df7605c5546d8ec446a33ba56d47ec34781c70ade74a203859c3b049f7cdc63fde35fd658ab14781751f8fee8c42ff0a064b941960af4507d59309b50019 -B = ffff - - -# ModMul tests. -# -# These test vectors satisfy A * B = ModMul (mod M) and 0 <= ModMul < M. - -ModMul = ae2ca2ce7addaee2e2b7752e286b2bb6a58b51cfbed5c924f00398e59ec36fe6341cd83da43a33a12410f45f6228079c4aeb3912be87e2e81fa1799151bfa0fea29873097475b2c3efa312145d0bf7e51b2a7c9bc961a4f4dcf0c883ff90b919b87c21099fba40257645be31f95a3a277 -A = 6b18497fed9befdf22a01d988d34213f6687d8a96e86c188dea4172e7c6095a0d18d3c86c0f5a1af9c6e3aaeb6baac2a510930b3ed06ec78ec2e12b -B = 1a058d99397db0d209f01212dd4023ae01b15da04fe62d1f76f21622b2695558c67d706c535ca7f19b36f8ef2d508ffd6cf6fcf25e5 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = c462c7cdd79b7604246a0cd97b40ea5a9a77408f13cbb548b56ee713c690dac0507fd988bf28e77462832f4307b08564a51510d4a951c1ad7564316dbead2b53540090827a8ade8092a6133af0e5fac7310f787dc1472836178ed6992b9f71224da3e884bef8e8379a58e6d4be0fbaf59bc520f786631857213305e23fd5ca65 -A = 16c92f77c139706430f396f72ec7adb045745cd9f5899b0074d9955bd32de66f57c05c7929b575312a7f1c04f19e724d64744bff7b31ad0e6171437763 -B = -8734c4a2361fc530f60b28a5f1c7e93136c5ff6bfc7553965eaca54c61e6befb3c0f8cef4280e780cc5940d21a740debba31f863ded75 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = c462c7cdd79b76042469eb41a7a83115eb84103da4ba438c3e33227631dc185054ba4e607141d1e60990d8aad4e0bb0ceb645ce9ccdfe72d4738cbe1f6a73ed3e070194fa4feca6001c4a853940a227d15c1f1cc153d8c96e90e24805929fb11e0665e0c41c77d5a97fc5903a8b215360e26f6a19922d650f460f7056274ee92 -A = -6715098ab2ba3ea1e6341e89936e3ae913cdd450dc831c8534071f3c362841e47d88f2cd29c0d1239aa0949f3685f12f8519625bbf10b2c7a515e6d00942 -B = 536d4b3e4815ae5ed55bae6950f5a8a61d52439d2800ef1b5ba2285b85ed0f6ec4af9fa0e364a6b14f6f6b8bebce9200467804e787f9f3e9 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 309b3e30f74c58beca8b2c23f64fe1203830db8a7e306e1fa2e2022f0d6d422851da509d1b2936f088f0e35effe12a7463f47ca369bee2f2980bc48dd8e696b2d8c6f35cf55fb8baafc2e613b4c684de26129cf196741aab873f81e498b1e03018a539b5eadffeb5953029f31f8579df7ec0ff3f752491910 -A = -11fec955948e007b59fc50e729941ee9d43d552b9411510b73f6b4faafc0465f261f8381d96f647267f72175883172918b5c866cf1f1ffc43c55f3c96a60c01 -B = -2b3792f39499767e0a8b7a6a406e470a78f97ebb36765beab5fe52e95abf7582736db72a2ebfdb2405e3954c968b350a459ff84ef815dbc5910 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 9143ec3e9f74a8eec476cab17ad8636eaa7c60e108e89ae0702dbdb2b255a217ba2530c6fd52658cd931b962054a9c20c8713976ef3b7989c40611cd25b0a9ad0635d61f6dc95dba6e0c4a7d53ff539b623b97ba3d66344fa324f905abb861c6b1e830c4b0fd5f6a4b01f09c8e1408941291b2285c4625267a108c -A = 7713413d87f1e50840255927ff27bad79e5de5898725a876e4647913158cda9f5fa031dd7fc11d2e8130a0ba99e8706341c1a98d5fee3218763ceb1d131e9cdcc -B = 1384e60753dd4bc20cdabf398525e7c4aa40065255c5058cae0b2ec90a3821bea8de672a712431aef5864eab719ba621cbbd8b46fe86fb31286091 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = c462b3b4a0432890d141c0f46a28190a2e30ebb2e4ba90ed132169cd72316b290dbf5c261984d98e63eea6525fa890bf52185ad7f164cf49f67ca91c2f35511f3bef6eb7f3da31a602a78e4752e326d79dea729f4ca6438f2aa65eff44bc60979b42e44f6a301cb5de8fb42abb47bce5633c6ae9479d39c9e8b507d96161e0fc -A = 17d806d7c76aa8acb051fd9c0c782443f1b1b6387455f7cfb737c41658d0459bda5d13587055eafb87ad8d209bccac1fdc392aeca0774ea48799511c1fb9141cad2f -B = -d7c9b6574354e131de4b8643d766641e98554a03238ebfce1112c3da5f049d6c410a7f05758571aa2625f7190b936a214797570539317b32fb94cfd8 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 16c84ed15ec6352a8ce6d5c2bdc0d9f13b333072fc7041146e944a29391f83e346b8ac0bee6dde98a420ba4f8852801d7c5bea6f1177a6cbf799edf2146f8297013e0e796917cc967786788ff12d9c1d07d9ce4b897bd22a1b8a391d3b4ecaa5b5c85d0a03aea5145db6350c42a964a41ee5f83e7d35e14cf442e5d99ccd0ac8 -A = -6d84cdf18a2f53fe496248fafef183914d55c42267af3dd42a39515e80cf29211fd58454986f5fb6afb56170dd9865d3158249090270bb9af341c830522a4dcabfd494 -B = 6f6f3f74187b7d74dee92f79be864d0a2c56d4bca3283742e9cdf15112c8f4208e3ac8ecc98b44b4ad74b0671afa4aa9e48dc31d34224a1f66bb2b4658a -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 8fb782e4883ccf3aaa2d3e020b08993d580c69ec8fe66ecac152c5babc8aeffafe406736cea492450fe6adc25dfa2e12723a3f9baeb02fc0f785b3db760ed28048e1710a78a2ae0c96b67c109c5034375a512b6fc7906847253f66316baa0ef90facc9ab992235153684d49d6939ab9e91086529494d7386f604ed69aca2f53 -A = -1f745c8f0c8fe6ce3f893d77fb274c61b72b2d9f9c5a2eb2467bc00d1f496d0ad469d76bce318bd64ff1107ee5fcad4469f84d658586a5789c068b0cb9b866d8fdcbcac5f -B = -3a2347b491813252e8ebef1bd181534b074a368d076b8c80bde2e54ec3b4ec99001f43080c7857427e069d99b1b65cff998a141ca6963aa5fad1ee632986ad -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 7c0c1c05ae1d6420bd93596a01aa0153000ecce660a8a14d6fde7d4740719cc495fe6681a9a08163b2dfd51659b3ae7db0fbe09504370bfc695457d7b32665a4df53e879ac817bf715d5bd6ca0e242b1ebacb1ffd6698ec90c442910a92b35ec103b345f9a9e5c7b005f8028da4dde80f36f6f6e5675040d19e46aef06040eb3 -A = 4c09264420a9452c6f0b55baee42c076aae5a73697cc6bbb88b7c922f236ee4c18e477f88e2c40cee03f0bbe87d3ac8dffd75f635315f856a3881c6373e8b9a286c813325d3 -B = 10474ece7ddae5c53c4df5b594439124370932dd94aa5d5b4ddaa233b1a55634fb7d72e33bf1b02965fa9d1538f97e1cdb5ec0477cec8ebaf202aff8533211169 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 481543f1556df756ae2e422ffe35aae020c9bde9e9b1f760b43043a4654de363dc67f381c0df1c3c1b90edb4343c47ffb8345a1aaf5dae56f446fee08a0b9ee8c42fff57143e10846610a9925be96418c4c957b4e92af734b96fd6f21974877dba52a0db1fec4aa97640e357434f95ba74b6b8323cbe17118dc489552844602c -A = 11bccd165d9fa2d8b01a48c0ec549a6e600396cd2023f0240056193ad27e971c604eda8aaed6ff6be8be1001f3dbdc8655f1ae84eceb963938ae7bf428eb5c968f584798c1bd8b -B = -cfb6629ddfc98a242e3290959f4d0726c0b1770b52393bc7488a471a90f7f0951362c03e67f443c9ecf4987f5303a789bf65e0fd59cc5eeb9f5d4f40d3e4a14080c -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 2a770ccfbcb2bad207d0e2dfaeed04b6e7509daef00a1df88e57509451739a8a0f15106ce8b53d280a4b4e09900420714cb6961ebb0e00e88567c5df50d2f2908b4bf8e0a9a5a8b3c6120503c14f16a99297459543c467dcb67915e0a10e19f72ed5b6891a6121b66abaa602818801d3306630bb04ea57e6b31b2c05e368d398 -A = -442c80289bfbf00db06eafbf06109b55f99786a323fc2c6db5686f99094cc24aef50475841243ec3ade2a1e0ff28b4032fd8afb8bb5e28f3b2863bdb9fc8f033adbaeb5f2ab16fe9 -B = 6d43e3c46f4a55d49e78f40d34033a7f5fcbe50873930e7c5452b6b3b176534e6e70033868c85b4d63052964093214dfd0bda6a84e893b1aae3cc72aa83d039e51c014 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = ba0e8c91a86af1001b13deb115c77609a1e7a3736a6b807255aee898e3100f469ef6222be532dedb1b8d3db4b3b55aa4b5da5629c83e9b2bde76bf2f2a4119a5378b5cde000980b3e58595d988ff776f0388fe025625ccf368e20914fa90dc771c826e4a836b2890e82ac2274471d586b4de5dab3278f0e70207562ac6e6493b -A = -14be403d28c8451cac4dc83fbf895a9d2b74f730c39b0fcb33d7258f99211dde31a78f182ad1d27a559031d67d6f2f94a741f141bab80fc692afb452ee2d502099ebd5760ccec7f7ebf -B = -2742dfd02134594edc6d3025aba5ca4a34dfeb43821ad84164510b43be4fb95748f8d0eed7bbcbeca14efe843fb676882784bb36c889be29bdad9270e0956286552119561 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 20c691d6544912fadfd9894cbfd42745991f39a29cbe3a1cdd302bd0487bf70c0179b9579b77f8481bee13ddbe42f32d734b6118af92884c946ea8576f6dec867c1c251c73777cad7c7c76e90da00ae07f96c8d6a751e5b18157dac4468c05d32eb86e74e0e8312bef85905af8193a3f5c799c5875badbc9eb7ead1258e56d7c -A = 7ae9b4d5151b11bb7bd4d1569a6f4804f3b4d77948e0c6300e4f28d51c9a0afed2ae7503e53489edca5359e2b3d0c82a9cef316cd7e1c1275c31fc9c51a8c1e5fdf23935484e467d6460d -B = 1f46f88d39fbedffa8501fa1268bdf3460aa98e12b629da59676e61852a4d3f8c59f72a2fd717fe2faa09639bc651ba516cd39297e0cac67444ec57c0db47c2a4e250033d02c -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = bf21b3cd55c0df8d4d568d00f757b10ef3de782ae71b289cb2b59d36df1341382bdc1825ba13199f2cf279a72968b3bbf5f7e3d13ea9adeb96d81132788231fd988eef04828119dcca21ec1fe844998909cc95a8d01720e883df27f07ef4dc3f09081015dbbdf019b96707c18b0b1db6e689e8f86466a2afea4a9cafc576e10c -A = 1243b14aa3d16a55935f6f8ca49295e35e7f75b03de7192e1e8a479abc0a430e0d340acc05eb9a61a5dcbfe3ce3a4c5c940699f5043e924f282bd21e341edf8b7a6741c6ac72d7587a9e7a60 -B = -bcf08b2153e8ca911096189e35dbdb21b77ce89685484f574c89f1747612f39340bf1b204a23530abb36b2c5e195940b86ef1252d6729393c25d4c73dd434b6dbc3057b05d3f15 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 460539d96c07e72acba5b59c88fe904bf7f1e1648612908444b0b08172d05968b31b43456918b4287dbe01afc3cb4860d9c2fe549a580c989b6507094f6c241eadff910d2603f747f8e289e7a8176ca4a978bba89288a4cf875bf3e03939af966c54e77c28119a39d34a2b7055465f58ef2efe7c82ac547fb675653198e4b504 -A = -5a44cb669c055ba7c28d49f84bf8d12179aa30bbb9db2a48d7a6b09e44dc0e0f7471e3629cd2fb51e5a53346ae025fb49f9591ed1d71bc79daeb3f1254342d8a2b091ae07a758c1555efe59e78 -B = 646cc0f766346aaecbc5147a4488ce157a6d844045b80884eaee9d419087285fa71108b5ab4a05689aacc8d2e3dd0e6714c55eb8f77487a3fc5e56c3c2df0c4acf28a457051118560 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 79b536f4f30f9f7483f90e65e6456ef8072d9a7430405cf8c9377ceea2c676afc338837643436d55ac6af2326ebb362684bccc5092367209822581700d641cb8d331432b761e4c6e22639a27335f45a25ec019d180fc53dfb53d69216d7cfaeaa07db8288adc35b7bbccf2829631c1eebb821e4d3299015c3d462dc17aee5024 -A = -167529b1e8668938ec02a68bf4d76c22dd018c41e19be25e2f821f63c2046085d0af30d8b4212ea0f3f9943be1c14fb2d2a944551107cd2bbf8dda5bf258957325f06277036282977db4575b0deaa -B = -378e1be10a57e03b197bc2b1287d643ba6d89da4bf6a6170816691fb6529c602eced237863ee39659be3729825f032a57eb5de0a87b0894d1a1244523e85b6f50a3d9976dbb038490e46 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 658169197ddd0bfae101c10c3e6a2b10dbb456048e81160b47b197fef439b1e0ed710399cfc80ead8e436f1c0399064f92da50afc335847515686e055fc7bcc0ca721184435955b896b0af4f4d96672ebed2f154538d49fa507b945c0a6ae926793751231980274213c80046666c28ada213a2f87509d1466b8d1b2122e93f8 -A = 49136d37ae8f3da71a6114327833e8aaf3dc8b5a9a27e9d04c953988456e525263f86ba94397321c2093803b789f8db3ed7cdba19c4b796500b979e02952e1625246f8e977e01fccc133f94cb22832c -B = 1dca005663385fc00b4fd58c73adc7589d15ddbcb8cb2fba03a737a320c447a2b21e576ceda73811a31d8277883fd31e22f776bff3261a098ecf8f40f2855b0c723d1265eeafb43f85323e3 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = a49fc8084f3e780537b4038bb769b8db3653a3315298a99c2ede6739a1732a636e9787f2e8b09d0b9bea08fac43cccca71a315e6f4a7d6417d171b4693dbdbee8cd9f95be0847ffd40ff027267125d67b89737e1d0365bef6c4429504d13cd8ddc7810f456d6293c0c57c14a307b94010d79d5c13b92a907f923966fd3c5c8ea -A = 1e7d8de2061cca59d1cc19b356a8fcdf2ccf917e0d81598f014167c5a8de027ccfc8f2cb8c37c396ebaac83ba862c146bb2d551d10ce03de9528f97725804e8a6de57b9d9da811200604c2a032462b6ac1 -B = -e38592f3acd75b575f64ced439d5ef2377d21c61bc70625639b01bf755fa2c6de803ce155744993493debcd4de40860bbfcee86d0b117d7f8c3f8ace68b67cb6fe7a81a145535553896424f7a -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 5a99c8a6afaa97d8e7d84f4899803c7786b1bfd2ecabdbfbb3bbb92247ff91ac213a72f6d23c24699d60babe91a7d9cea751e686c027fa1c954474fa5680f0059118426c71299462b11de5f2817d190599cc4b352df4d2e80605f9ad1e32eb13712d3027a2b6a19d52151e37e7fa057d8fe59dfc8a943a42a1756a38f103a75c -A = -7df29221e6a102e32757c18f87927cdc90ecb012ab0557e0ab855daba832d76ddf595b9c5a62988ca968b64fd5bba2a147a5991810c17cae7edfde38bdbb7e13a1fe5206724c05a9fc9276c8d4e503a860c7 -B = 5c586d1aff7dafea3b8ee42e0e8854712c95385374b5bd1fc8ec41a72b296e070940c4160509a4a1699a678533ff3d12299338fc441b0f01e29a48677bfc5aebc644555285756e97c74e1af6aaa8 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 21fd2d881b6a52332dceea42664aeae1ca110512c13bb33e25ba4ec0f39f80eb73b1fa0834c998c23a2453dbff971eadb183c51a30ba78d593f23be9cb6b2b33a554ef31e4a36e0314fc2ec889f18debb956b89d1bf8172553271bd56d89ed0b30abb70e68abaa2c76f73cd5a3de93433747d09c845b5f8843f9fdf9f6c975c8 -A = -19fe3bdddcf08190a037768b77666de803ca4f7f0d7dbe6aaaf334a486dd0da7ca024d1b3df11e0406b0326595a171be30b04574c1a7d04f4d2ccd334663690fd20e4fd168386280510a00a70c1a11e99483048 -B = -33b2400173c057980b0e0cfabbda1a5cb5b83b7ae80708c199f28142237f04b071c6eeb63d42e80eec04b76152250c9e4d4c4f19a048cb9815dce6e66710fad1d27494db5c31d9af37d2aa779d12d7f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 1c45cfacf30682a876cfe253f05b393a2cd4dc065ce73126508ce897a99a723cf5145187643ee62d746f6edf70269ddce3c348a1432316286a648ee9ac31ef87feb14f25c42f2dfc2e84bb5bdb4ec0124e249c526c55ff2cd0ae938555c5f86d856eb181572ed01dc045f1ababa52d249e56aba0ecccda905d7d1e64bf89bfe8 -A = 6a40d948eac2fe5bf6db15d7f6b89fdc0712e32d39a881c21859e8f7722391ce05973efc7c40e2c0d7f56c217d8a986bfdb08bf87bc0435873cfe4d01967c46f7d39464bec411d0369f6f5d1d83f42596fa47451d -B = 12529775e8253ba220d890d4912fb95f91e4edb59610e889431208b6bb42b089cf2aaa12ff9ff98c2482e7f4cbf35b22d15fa28aa288217bf766e937a706fe1e600143087b0a67f668cb7b762c9b9f38c0 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 3b3b08e8eda8be3918bf648227eb0d569dd898729d9cd54deb32b1a1dc69cf7b2c4184c8ae9641f0f75950df263a5e236f428ca86244e617b14a04edd0f31c02bd4d84f25bacfcd4a2786825f0361251475eb6c7e99020dfee4298a1f1bc260d4e364a332bc6f651dde7ce5026dbeb0e5aa75ee98874da54c7930108ad28e3a0 -A = 149d36918fffa682cf90c4d3f3d48e6408e7ddcbeb44e78b9cc7fbb08108f65215761a61d79f37ec8f67cc51e0a9b4bcb3834b0ebcf6734985153f29a2778473b80147eddc813b4fbeb98843f5c1ae6cea68f88dbb4c -B = -ca87f66182e271a69c0964eda92a009d438078b584c3eede28ce1a501838c5f497186d305c09922f32ba858fb55f2a0dbfc9cd0f93b789c1f800cf092726d6d33db19e4f26c7dfca69b83925db14544ebfe2 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = b199655160d88b6b4157ada0e5675f82b33b5592408bb57c46e2f7d8791bfccaa51436dc3b772b83e907c20ce7edc2835ce96595b78c0647d244e9bad6f4184e0003eb0899e7a47ba0be888b9bf795eba95e5073a85c4d20416fcd4a8d4e1e16b403deb38845fb8bf9e9264d68807acf02d579e8cd104cf2bd555e6cf73d0450 -A = -70ccbb73e33a7cec30ef2071f3b1f2e008e70fd6d00fe8b7aa4b9146fc6d0549c57d984cd014c7e0a4ed6d33376998b7c2c9778fb9580d8ca4ba795c88612721c153c186740c58df3fa63b6cf7a4de76e049217218c05c -B = 6cf4168d44a8da8e8446b4420466fefbdeeaf9623a40e10b77547687b25f36916f2c18cf6060c03b3b40e0959479f6aad5e44dcff0ba799262ef53e280f4a7f667d262d472b2e573265774deb5ff8f25dc1822b -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 6ff91af444c61d2e2fe8ad73bdc5377d5becd55074eb60f0f98eca3d8f4be8c02f196b3afea12c36f78b78ae6a5ab677ffb7d9c0bd58987cca816affe468c7fb4b56055f5d2326532d6ed1c00ca2d052ecd103994e8929bce04e067082b4ded7e1973566f99c514b4e0d95b9a8a931ef4f6355066940990fead70208a63841f8 -A = -1c924bea12ad6f8b65abd1796e381fee2cfbec15138191bc22d57165928794bb080c83878fa5fd19a5d657b2fa91165459966f50aabf19440f7d75f027b32e999ff4d3f7a7ce878fe0f33a847d644d86ca19713ca9968d97c -B = -3abd4b281b8f25f5957d1f2fde904457d49a3a7eeceada26b454ceb4ae0e879135d376571f08b5038b7b3d73a9a9fecbe265b72375756a715a523ba66737085e5ef7a4ad988155adc93eadd5d95a0faea56914983b -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = b9076229b1a1241e8b4da3fe143ac31d060785be6ac1e841c2fa9683d2bacff2e2b5dbac33f58b0b1718ad2053c37ee55ea54a9d258ddd8930d2784852844d85db24e4721762839a5c73cfe588efedc8932ccfa585e1b5975083919be9e32a86dbdf5cef84d3d4b2ccaf7a006c0cadca1e35fff2da9da7d7e779494d8f85bf4c -A = 75eb0fe6c07559c2b0c7b2acd7d29b5798f6c4cda64a504ebabdf54bdc773ab28b218f0defc040016178958d5561796230b71edf49bbdcbd3f14494859843c8ca7a0f777cb05827f2839f3982832f4f3e3c5e50af17ecebbbc3 -B = 1b8aa718d61447003fdbaa748a9d86befdd2675a677cf34a1be7c81e4577f665d71135a8a243976a4f6ffa1636695567bde522f8fb1948033a7e0941f833d827e957781cb4349a08c6be418befc8959960fd5fc1b288c -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 9df82b7c34ca97a3a5d4efa28d5ed4f35484914dd73af9090c4bb31ea3496ece8ec650f4e7b07dc779c97e597e76e43cdadbfc6e72b61ea718c073be1cd204f8ad2bad0df1e530e75705f3d3dc285e9d793c8d42f04dc20773d3fcda8ef3ac1cb10d33d20a91add0358ab8658f49d2fe51d0d2d72684e31c0eef85e5695bb4b4 -A = 1fc2a171445ee6add5c2e4d29e50b91d83338f8d63c111e4d3e95f16d2a33be02bef24dcc3d6ce6bb8f1ef980dbf8fed409a0232c0566153014eef840aff58ed8c33e8d463d408f93e2f5381a26fdea63676c4e5397eba1d39f928 -B = -bdac7a177c77451104852bb99004ce8e617036906667258d85adcbe8cda21ab7d03aa7dcf62cb210a9db8fc750c7e1ad290b35473be0fd607fcdc686de0b78fd9f258f5b25e2ed43c2ad1a38859f882b9f6b293dc258659 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = bd9f3d2e8a1086b177698f87a9860e3a5f030e04a0bf4ee9436ac55e005bda01ff4ac662cb85d39e98a41c723ae542a83a936c3bd0280c6801ffda080ec0aa4230b45dcd0bc5eb41cfcf272028bce3572847637a92d1543bb2b8408e880f5b776e1cf14fa28d15cfb584f025596ff10c9f091c837a3aa622d9e5c856db8ac207 -A = -7fd5357cbee7c5e31fb62ad03bd47b705b574d915200fc7f1013d836b9cb683db020b152ae9464de6aeb8baf14999ac7025dde6173fae6ade325c60ec310eff6dc4130a8efffb15ddae90d760cb7f76a27d0368175d4a44a22f7f223 -B = 5894a0223e4aafe4efd4572752fbde4952c8b09cdfc35137e7e6ed650f8fdcfce9de673853dbf73730b159b2656047e69377d7c5025a6b346fb08831e64bc8bc34b75765012460d8135a4f7a0f41d768fb85abf17f5e2f5c3f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 2c61867bca70e8662c7e5435a5aec020faae86fb079b992bf49d8497fc5f96abbd38a6f04f6ca8510e0160e546b3f68b7baef4ef0f404e881771cc12ec5ed3e3787c2d2ad6bb957cc59f8d56f0afb4bea49cb671cb42f4e8a0ee1dfadb6fa14f84a5b3269dd33e20d658ea4cc39499c7a39a4b5650ad7018d32f97954610f676 -A = -1bf5ae15f24c7c14eb59605136a3f679f303cd5b81e4a27465281d17715afdc2c231d7ccbc59f80ad176f4e0326eb757b52e3695e27c6776d7936da47e3a8a904f735b151422029535045ef489e61ec93f02e6d588491c8dad1cc311f52 -B = -3238dcafb85ce557036d19e42e7e7e473de9f9da6f920e18845dd010546868d2652decc94596cd2c36bd16b02c02559892b9f573bf21ab18c3c75591413d046b385d08aa66d849ab8adc9fbf788e837b047a7ce2b9c63f7fbd263 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = c1d04b831b712d0619db462c3f3fb5973f5984e9a48493ff273a5abe17a548e185d751628899e2851e425a7d4b2c72d4d908dc813cd122b8f497e08e299dca9166f19752ff8cd9840a70155ed9e8c063a3840838b3679f96f1cd5f1cbf0e037d222029e02769dce7fdaea0bbb5417f85497d77c76a387c6b970eac15dcd128ba -A = 7aeb60c134e84f289e419b74f99a5ce5b4aed5fc630d5d591ac7643251ad32d6ca7f052fdf8857f67138262d221de644140e9018f7b84879d74883f8f251303f65e06bb52246ec6a912772cb698b47de41c1826ddd065359f6b9f1ccb0cdf -B = 17f81e53d9fa6201e4d3eeebb32267929cd5258d10f053e7c021c4afd17094f8ecf433b1ca752f8740f6d6bd84f801b1b9fd64bc4787b9ae5e5aba0b4318a63dfe27e92d5a3ade192af7563c74c9d6006ae7701240efdd6021a83cf6 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = aef89874854ed34deae1b77286f9cb0e3017e3ae77fe050bb244acf4f30dc03504c73c1a4d44b769709bdb53811a5d0f8a76a08e6a66fc2cc4e98537ad6a8049f02494305b89a49a55e71fcc3f5fc42d6b478456ada9b19ec0a03f5ccfac5538c0040092771660312be5e51996073ff1a506d7460c57d54e10dc2991c028606a -A = 18d3af14bbffbfcabdaabe44074b407d69abdd80a6eaa5954f0e45fac85af7ced1715c78da872f7a8fabaad3207e31f12b7195cdb25abef0a1e54d3b13349d997f207fe130d7985e2033cfec899a0af310c9827749cd22bd062eb0b1faa254de -B = -85a7d9f08a60031e689b0e611d7f7f46e1178eaa2e6459602e738990c77f4d3783ac43fc04d53504cf67fccbeb02f9846756f8e32fa4a9316b6d3b45f644254077bef096a72bcff17ffa17070a4355121cc5daa2f782fc0d0bb48101db -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 14a85edc6297763547702c212b1a8274b8f85d53ef35cd1b01ed51039bbe030d0a1b9626ae2f571a43f1224d723847a1c6708f2238f6f6fd75db6656e6c703a5acb57f69717efe8ed58a3713ba2720d8c001d026d83de0ce5e24b67c41daacedaadfe404aaa9b672f00562e6901fbd0710c4303fec41ee3338100beb36c9b1ed -A = -44414ec207060d105f599b9a66aafecc5b232b55214c1a5e1922f6b59439b3ff77cd3a327bce4f7406871196b90350e6dca9aae147ce03027dc4de7563c734f111d95171f489105de5ca80047cfa43f7e932917b816ba7d41fb95b4106745d700f -B = 45f2cea1b9b75880ac3ec206740cfe0ecceb488c9155cfacf5885a8cb49be78af8cf221ff8de2328f4880479c031f830a3c9eaebfd83f7de501b7c5cde03c4720c56a676d331b2a13c4689a2e34a43fc11f62825b8776e75d31225ca7ff65 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 7670c1e2e141d8f8f5466de8ae2e0ba2eb3eb7634699eab8415d3a37f8df291d00def88361e9fb64a2f116433dac3ac2764fd62f3201dce4e48a3b7019e5465f82241ffda29d5eb0462fde74dea3168f8993ccd4d090b9c31a5a6cd7e05f725bbc89479836b89379b422250ab049f31c860110df5ed69089716877fb0ad7b0dc -A = -15b4a2f808a85a5bd466a342c4853c04ac0ab73f8e53a4a0477f73dfeb8d7a911ab2eb5d3d192b9b084d0e38db491148947c66f838aa5f460c37341b129137614259efa531c0e6ffdf163ec6851737037a5299060418d96da035e6f583e6ba79d0414 -B = -3e94fdf22004384f7881875b1d8f58019ed8afb1b6a31f5d591e77b0998f3100b34174d6f3466da44b4c7fc8b92ccc5679c26c146b704198a65a88554d24291adcf897bd758a035361f671a82972b5962002c6a828792980f86a64547165327f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 35b49beccd8d2010a8d777c1ff69e28e01a1bb78c6466e717f0a934bb62f9bbcec5ed29f9cd2c14d240a6c33b28c986eb9c8912a4927605532483dcfd31a50876e1819f3d7a0f49bd276ced5c4110470244fca52d2611ed7e31cd8b73e749aa70743b39e92810b3b52320342a65cad3180f6e2966059d15f79e5574348f5f66c -A = 6fd078e3cbcda6a71a710e99204da640edc71a65974fc765999a74ab50a0e4b090d57ed0ee869c8da2cf694b6fab56e87c4af62fbe73eb8890bc066ec3460beba04dac3b8fae7e4f316e8f954c6e8d934e946dfdc9f4cde0f26bb3d40d5c444b03bfc65 -B = 14d8041a3b83468d2f44f150ad8d8d0a1a22035d630f2a17b70d5c3d557d3abc7e4d753e1ebfb3a3ba465520b84746073d211a67e079ec7f47c2cff9c06da69bb5cbafcb6cabe7e0018867c42e07931d6797d4499463e3cf786c6d5d6c8cbd600d8 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 2f6e0fed8a9720fbd83ce950d7545d2c6d5b271582194570424f90309227a51777cac974bca0ad3c1289ceb91cf75af73b0645cc20d71e7789144876b8c1bdd550328d9907accc316189e8ad81310848cddd2dbe362c9398d814a048f93f9368fdbec0f19ab87ad2a59d4066d738c3da3cb71d4716f2cd2336ad35ea1438276c -A = 14bda9e4aac85b0ab7abece728f61450b7779d3b5fb83be813758e742d2ad76597f132aed91e20a75c554f0d61ec4dd118eb733d04942b2548b1efdb4dd22fdb543d9bc1e4bf0574ae2cb2c46fb98cc4835b6a074d6df1a3bc5443beabdc784d542e3349ad -B = -efd765f8ffd72d041ac3244078b8dc4482233e9411b289cbc2cfc26fed2cf28e286835010438ddc9e7021ceb098b10c68bcc4732608ec1f4052df9362176ee14812bbf09ccf7c2882714ecbbf92bbff61c06e9dc35a368208a05dde949fa2cd091ce0 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 1f0c436379f6dff55a59093ff2a0626a9b959e3e3e59365afc33c7a7893f04bca863ec910c446957baa8de4e35a1f4e9c4a776ef41b053f03b775f327eb7e5fbe68bbb478aa4339ae703ee4b573d6931e47e09271d40239d527fe77098a7fbe519f5eda1f26dd6a7d0ee6833efe37187d8a85844690fecf9fdc3a4d80b921130 -A = -51eb34de29ba24d2b1fbeb0a1c324f4ebc69cda2dff971a315c0c2775d988b03ca29891ed0790f3dd507a1d26ead461dade9284613e45df338dd83aebfb66050465d8aee554970b43f7d4e0428e1512289fa1f9b23867b67095c455b66d536b91207b749189c -B = 55259a1122eb7eb611a69118d3d42c2f05dd228d71c0e1e42ae3a8d3d180a95b74150d844e916ac85105805126e4b995f2ed1cd3fcdf28e1fd241dbe3125dfb3e4d90556256eb513a2f7c9b596719c83b26931d92bfd3573560e8bf054138f5d6b9cde72 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = ac321a272d2206df4dcd6ed8ca194a1049c1e3a20bf325fa44809d302170f850721c077bb5d792f86f7ab03ca259567397cc2fa1429771190bb632ac2c92d3fccf6e05e13cd33149994cda5f9c57da155439663f6a13c66f9da553f5038fb92fdba186ed9ca04b8ec87cba4c5a68c8edeedb94e38a6dbe293340dee1a4ecc768 -A = -19ac99d7d51456b00a193b3b04693c7e5436e05763f0154768db078ea5111cfe9eda3451091af213b9c8cc649d341de66c12ab2803ea39655d3d7de182a77355ca444c5d2778f791d39952a7a11839e497f5dfd8a703df49ec4d7628bfc25a992e94a6477e6be39 -B = -286d1d436f113308be594f0f43d7a05120639152b7e2f93058cf602cbdbc016512bfd23f7aa937fb358b7b602d15998ecc150f2b9224c58527c0c1267739e065e24236771e2c683957871637468181e6e896b513569bd004b9845f0f0e4c26a5ca123365e1c -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 3466804a1b7d1af8b6060aa93a4c325d9cadb33ebcc8bd991f9e44cc2cca8918411efeed0f005790d649382ec40278c8cff903cf3db177d24466c58cf6a56ffc14e595c36bfefaa2327d37f616b1466eb702f5c49170598bc361d892e18051b8233dbc5b3fd6832befd9a995bcef3b0f3beda6efaf09f7306ec203172e78264f -A = 6710c19330d3f974fc377e28039e0c0ee0a558621fd67fe724c326537c18c66dc5eec60980e07d401ad5556a05688d2dbe7b271f9d5eda3032bf7cb7c420e7b5d65a195bc037090b6fe83064ac3731624ce2baaaa62a6eb07156ca12ee51d4321988026cff573ede9 -B = 137ca18f47a151363a3e8c52dcf024262ba525ec8852e8e406f460fffc2cf88f1999b17a5821849317fcd84d09c88ebb6eb0340120f113d7ca5fbd91c6a40cd790bce7b422552cc0cfd2a6417add2501db1667f2802e5d0f4df824adbd033a90a155cebfbe0b53 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 6f248a70b2cddd9627b32fbd130f05a604866799365f94d97f1eb582b28192959692a870be7c2614536a8de84cd8c1364a75a3927ef9dddbb8c6c87dbf526f2d3a7916384f2daed96002831173fa4a51863c28b4378f99b1b201010581d5eabd66ad1e328cc4e647bf5e0588bb775e130b4a4d029eeeeb5852c5742862ddbc3e -A = 1f014cdd87cb33ffee623cf454edf2c476e91df279b4f0879637eb6e8e5ccab305186de67585595d34ebc195fb150408c4620cf6c7a0b0d9695ba0e0e1d7552ca7d0be3dd678b1cce2beedd11939891a6804770f1c843e16dc2ea6aa8e4043940c37fd3d950caa122845 -B = -8d8d9dedc80994fc5db04d8c935301e47054250fea9020bde8d5fef01f2307cbf458d5afef5210a369c396287c5eb453637a2d721085af3de0d75a5dfb5dfd22fde3b229d438439af7b296b9e68ffc982efc6c825556c52a735f8be12a214a06c4270824d5268fb6 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = a35ff7e232f047e575b200b9fc4c9253de6ac04c612b8a82c275a951075eace5e7d6664fe8f78301d554cebe7b996c1f4ec3ca59d8d12d7196eb3909223de94c220f0445d24233534af1c93433b05c5924799d2c781fdb88c4537bb8d442e6bf76b2d966827bfb4f40378a3f135103513da056bc0d375b1339561700d15a0227 -A = -58346cc8a9a1e5b8babaed8e7f59415388e0db654ea7cd465d96781c57faae7a8af8e7578e46f3a8de7bd1027188e1cc32fd1c0d60be24fa3289a12cd822a6c9a77dcf8799624856c27ba88fbdb047473274e651760581b44457ed048cf76c166d38bb9b2afd3416ac7e45 -B = 61951a16dc6466a9fabae99df29b7229f1ab96b476092dca1e4f8fc8e7404e2fba56ee66486d1f27f89bb3f86f271307228d7d6cbcff943961e177300b6acec1eeb46af1c5725f745a2d2af0fd9642f57a09c9ce6742114be0aa6e939e638bd5c7a92a7c206b2d36e35 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 90b441d8277eb1ed454964acf567067925881b5db0b446a7d554dc61ae87ff979bfb0e58ca1706123453e62ce31284a5a2db1228d259e27abc7fb5cc5848dbeb9a6808fa1b4afa844ab39b652abc41423c2833e1209a1674db518b6df7ebae315dd7f416df54e73088762ef64cc2cd0a08b1cb01c49d9299d149cbe84145a55c -A = -1ebb693ea7d18e0ff4a9a51124ebb78bfa3a4635b75a6387e9fc745a2325409f927324d1289be8a4f5cf2d5c04adc7ead20564f97e453287f03e5ab59a6133584f970446652d05a131d7d382c47b7cb97580ef6710a532dd4f5a0369dd3db500ae5a3c5efb587cf0cd2638382 -B = -3916ebc4653e7d6e0a4f1e234d765d41e9e948b5acd7ebc73cb595559c1b20b037a3c8da0a7aebfa5fd327bdcc922551cdb8db3fb0a581fa0620ca2d2559ccde3ebc44542b4d80926d061e2a35c08c09547e0cd587c396ff2959ee93ea64b1e6b7e2b624cdf445988e1f42 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 3ac61c3a028f4a2df6645acbd36818a2f76a3229d229ce22471760807585a909727411e8b68bfa4e76adc459409a101a1ce83900d46918e8d0903a163de87c07bbafbd60c7f536a62c59370ea53b6cea4384345343146bbf529334b4201ebdc7585b6e5eee42696400c9be9f496406a4eb51d2fd1b40466224f1752b181774ad -A = 5a16d5fb9047949684b80805e5d962bdb939d0d0368b48517a2a826679c37ee0ded4fa83e657192d9ae84294e450f7e2f2773d1f13395169582cbf95860891b9fdf8f3240a16aadd1198e884f22b2718219d478e2410fd4bb98ea534a3626201959af099fa55488f5390791bcc7 -B = 1f67066dd06ed4a49cb556dc2fce22814754885a7cf6c13915d974b46b0e6269c0fafd688f45ed2deeb026a7cbb772c080dfd577d21ed2c81e50e7537a70dd550eb94fcdf626500040da88c43dabce13c82a93769a9e0ef66a471661292dfd3b3af07169e2dc909e43678400b -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 7087dd62eed6ccffc7e1370cca9444dccc4ff160458941aa9f49dec1a2e9ecce4cf50ac2daf06994c5010cf225cc92238cd60e1aed9edb2befb0fb354ffdde94ef5e8ad0415bc95851d59095a5c4850ec52a74c78eab58309f395d3078dc481feb9d30bcd9f113af7a01611b94d085e32193dec738a64c5fe9bdfbf5dbc98cda -A = 13596eeefbf06e9ead8d883113d8ae6cc3da8b6fa13ab66681db5a9c083ef9e49d905ec19c39b149cc09452eea0446b29cc92d4e865e6f681827336945282fa6b276ef552363229a976c503b822e6e4a9862d3fb30dd0c3627ccb97a7046a6a679050a39166388a9daad5ec5555dbf -B = -a4e574363f2e5982cc087b38110d257019962fc166c2d6e6d396220bb308a8a0dc7d90c5cb2ab85faa19b07ed7dc11eae9bf2abde0a5fed279e77a717b43d35e70fec4e18445e37741262d0b0c20dc4375371d87d839d39934f1dc41122e815f3f37352d04d0cf514738b351f02 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 8495eeee238164082240ae1db1e3c1e36fb6621e6b714c9de914f9de8a587d7106b8dc5214f7c60c0ee231d7441e03cc26462e71adf8e29772ac95d0395722d2756f9f64daa8ed41d7ce824a572d7f9fd419112ae823b5b48b8aaae09fe093e9ed05918c4ec88ab159890910837ad0691849b44be95993682b2da2b124de39ec -A = -403f21e1a7911806747bb78a4f20c4e6572d49c6c4ce071db0c8c91ee985e68a16e60093e4628414b2673d25c9f13c4c43600633af95017e3846512197c9515aaf9953570ce5861620716b3d80eae7de0f033772fba82652484cb3ce7cc189d1fafb14e044e07a88da302547f2e623d8 -B = 689d1b4a968b7c00082ae3a29c8571f826c4630c947a7767fe4a71af43a5de84db9b5baec0980eafd0019e09de1b5c56173ede68c9a6acf260bef3d9a03f4c83a33106c94ca7e1a8615b3553088d1d05a62ddab0f1e5a126df5d960f67e3b92981022e1f0358c7970bb2fd5dce7a7c -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 397df584bcd3b2e1ec7ed89de624e9d104bd6812901e38c5740755ce91bd54155c0b624c590ded199590be5d98bd1ad4acee56a62d05d6b5fdd1ade12f7db8e3eb08c4a5996450cc1204be7ba61b768af0efd563ea478033324731e24fedada1ad6e564238c891494e85ded4feb2165fda22f75bf120856034a9206511885fd5 -A = -19cc480d1e07523bac502872a971d78bb26955c5453386f5d51767150e229daad3ab2dc85e0fa0cf6e72389391fe627fd2d9f263f105508642eae5a095ec4d88545dc9d0a2c436907460e1ea7db174673000eb2e0b60d57163ced261bd0f6cd8ce54133cfa10591f1fd27996353110060cf -B = -39c45512fc7c9620194fb7ad22abea8f6dbff4a137dc4523115ad7e262934143cf1f320892f8c097a400d4099e787ea7041d0d69b6269d191fcdc8ea28340ecacab71058cb39a9c7362c848826b35ab560c27113fe53c497ca452397891c81365b6e7f07f916d47961e50b8c7c5cab38f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 263ab04c98efac12210beb66b13fec7c260c5b1cbc20cd732a511fb3786b917a617d6622847f4eed70f25982ef5d0b0d13848c62dcf447e3a1d491f4c80e69cec03cd318f6f93134d582210bfa81c1790562053a71091333348c6624d4d793fd6ef971d284a4ebf0be0771efad302015abfaf3edba017907f10ea14a46d9fdc4 -A = 7a354753e39b9ad1c0ad6b65575fc7247487f3ea320fa82d1d333ba8dd5d0ff925331994a6961c9c603be5775ef1842159551f0bfb34920b93d90ca60e6abd514650f77ee8ffff2bac0eecd0fe8ea0fffc6ed0285c9f3c3cfaacf338043975457d62f9c8dda8cce1e99f34529435016fe2ed4 -B = 1a4384f9620567c698ced05870b4dae983d8f0df6aec888353f9dd6ac8ad54340c3ba8346bfa47bac38897f3963fce972f6d55f3407ae03f5c7637be1a34e483e50dcc27148b76ef079f117104162beb191d146ec828ad5c5bde5ee1683a031d554c276d837bf1f2f622cd11baabce10212e -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 91cf4d1899e170bf75dda0d51a6481f79eb94c333b876382c9d04681073e949191223926523f6531f0a45765d7f382221eaa080d7bd05a3c19220ebe18802b15d8009714e8e4e9872223049622ca02040eb041707c7e525f698cc361847c66fe3673a72e4d701466bc374f55fa5437216eb59375c0e2c4f7020149d0118ea72a -A = 12f35c48024e8271e8f9a60a48b5a214bfb6595a837c041b230e6ac87a4c1d4b3f93a2d3a193c750c9857c8627d0f7c454d6c4f224dbf14a865eb83e990b1d9b8bfb729b8d3dedbbe9c95032e4d60676c2baa2aabafa698392590add3b83b521a7a5e7d6f8af207e44ebecd735374acd01ef5822 -B = -8fc18f92c0613d085cf3ee6f586b39b99ecca864bcbe60fffc63c585e5613df68f3534ad46e244916b1f9188507a3692526c9e403b8e93480b0a5a6297f65215f1a5d8e20631a9d559fa1acc15a98c9397761ce18903f393b10444ba51bc92ac44df90d4cf0852da9d75902230c6de6f26dfdb -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 9af562a7b61c6c84c91bf979f32ba5d246d2ee2050f07ec2dd5cb3f9496bd37c3922ecb2b5b17085a13e93ab2dac6022077cc18c621cce3a2d2247e5e89de8692a36f596e5dc7a6969a4f3ff0d1580eed380e6550c6218c1938caa2b7ab401ae6f520063c811088504d60a19da3b5018d640ab8d340f35d1337a2ede8bc64bf0 -A = -63bc10b8fbcb391dea305fe61b404d3bebd035514a812d0e1d38daa3d67f9f1bb8f02d2979270cb9147aa51d66ca73d4b5787e472456a13fbe0d568e92b622439d33ad3c357a56dd26806ebda7b3bb592385ca5dba7e5eb5d85eed0a1746441e8d56e22decdbf8f4296e30d222da5af17c427e832b -B = 57a602bbdefcdd00f42ed1e2cbde2ba858d171804da56b0ac87081424ad1569df1308fee7c9ed349eb496d5409c4c46921f09ff0830bc9f57e920e17df16523598fd90314141955ddb84a1522ff3ebfa812cfeb6670525123476a739f64ebe6a5f1fc805a880f8e5a71b908c483a121b38d05cc2c -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = b395c9f264172a3653af6637e72c4c8e564d1ce68032a5d761bf546e0c4b51b33cb026bb4256fa639ae98e54e5ff7d8921ae411497272b53d97c2c44b5b9ecc5aba43dde201f64f1d033056f19ceb0cbd04decb486a1d07ab1c64fd213d7eb6db9cd11efd743462e137f368acc4ca0b49a7f85587bbb5ede4be1616889e2699d -A = -1e71df5f04001f6468c3a192086bda948aedd19c5da9a5286856f30524238d95b0ae71940f2af123315ab5d2fc61964d3e970d5858b7c1a78d0f2cfd10cba7ba4830a8c19a09b59794ca5d7da32cd8376b5ab06079b51cd9819c0021ea41a9e43aee147befdbb17a92cac7c7767705fdd908bcd291fbb -B = -394c187308320ba1b14d91d75b8ff993dfd57f9c84e8185f12bf9924e046629ffcd7174879f9925bb643988259cbe9dc9277fa83a25012f91159b012f1964aefddd5a94ac6c2a55a22bbae93085dee079f84cea1d53dc4771901db9a3db5a14eb17c25aaf5377e2beaff6276cbce7cee97a9b8f32737 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 6602ce0fb5002eca37e85b60cc871b7b2eed13d38c20a37a6e0886ee4814f3ce2515f8714c67ad81e8c3abf6a00464e6a51b15e55b6c11296ada43cf459e15915026d3260cce8fb796241fc2b0bdd2b65ec04bee3b7ab6626e10597f3b13b43d16c34afd5b43a219917626c88b24c6f8392bde1b2e65a50b7f1a8dc5eb096702 -A = 4855ce75a3d7dbb72a257f6291e9f6ccc158647aeb2f8beb3e8fb32f6f59af1a46617b77440798562d6f58bfe826d3ea7dd28daee8f5162d7d24ae6c24c2deb2669b15898689ca789e2005903f3a94e991e7d3c8f3ae6181029d959bb15e71d7ba94d2dfd3ddd10f6fc49a65798b5f6ffd64682c78b5d91 -B = 15b3e9992aa3f042fd58ff97a8c04aaebf46b75fdc38caa9224394a1805cc26e4311bfb498d5a04d19396e98d11c8810620979362df82b23a115fc1711b57c7a56b8408e2682a2edca36cf9311addfedd2d0889a78cc1ab170d1379245de6f1f6f4db815fea9130463dfe5283f195e6e81486a1d39634aa -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 6a81ccd82f00d829bac186fb38b85097d52afa3ca83a026856bb83f94d6af6f6c6f3141d433f8fc159d11397df8d2f44c769f255cf8148249d8e9fc4f59ec3bc8e804d7d5189e71e20b8d0e540b59a2854ddd7feeebda5a95f17605e8bd5f311a63cc2e4ce23a51229d0a49ca04982c1bff79c201de6cc6150b690c98106a39c -A = 1f1589c9b5ad9d878631cb03c23ea7e94680220856285668838452a63b726e01709588b38e578da8a4845aa5cc2e4723beafa4f81a1a2e463f67d9a3e432de7064ba8bfcb943cd9efb0e5a136649cdcf5e85a667917075804991b997f318752304f4946d69abf161625ed0c03bf9abeb4ef28034f818e2a643 -B = -909dc7fcbd27d0bf7d6a3d0e2937ce725b5cca0acf78c103d633206cb431e2e2c785aea4bfe2042df32417143de76b71d21587112f36d067f878e556b94ef63d59a07d19647593efdba7f3f5324d64c55f93a283a0dafe080167f6576053f9beb326994f4a1d53e18e3f3e770e69450bb70f276d128e48ecc -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 69139f2e10726f83300505d15dcbad5b5f284d1c06789181683b7b8caf35dff063dfa4968c35facf32a3628dcfc19b3fa4c30ba0e030b06773832a2631529fe0c0c402e05a0c4e9446a8b6c22754c70ef540f90d903d83a2e3592169ce6b5edf939ac5ff25b8bd48aa2425321602a9571661a1109e275a3b3039ff0c2f430b18 -A = -5d02cf3969bff8789850ac898c00fcb3ff1fc49a22cb243ad18703bb8fae25f83502bcdd885417fe46e8237fd0b444712c4fdb8f4972dbf9278a83eb305efc7a8210ce55167c069d1c4136a9b66d0c4dfadbf036c079d12aa082fbb42bfb0098006136a61f3da43aba3d3bcf2f5ac2d7884caddd0cfc28681d33 -B = 50b369234d993721288662d83298d99b9052a0a66336a5a31b76dfb20ec2b5be3aa76f78b2c17c63d78402a15aacb585be5c8d2e7083145e316e71e111fd34f5c79363c4591c247b1a94b20ee042d840c42a3001d6c8dc7cc1e1348e0e3ea8c6551f9d24af2dc2d0c38a54ef065ff048b148ce4f11ed2b549c50 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 87de406a6c957e85c759f8ff684023a0f98e93ad4ffcbc6fb0038c7a7ceed2486f15f36555d286338aab3283aef677118f7cc3f88a7ff0ac9fed31da6786ce895c3c08d3edb652bbc9ac2b44c4cd24ad281ca3a8e8e6e4d730f4f0c25487cfc1b2afe222934eca8b1e1572780dcc149422a88eeb1bf31065c929685a0a97ac3a -A = -1878e0497aa1c2942a2e6956957c876dac73c4bdbf42bc92498f29a006bc92f788c24a4624b87324a7c8aedc6b2c0c8a1a442aa91557aed9bf2c02b6664979e8a9a21330dd839f4ba8f84515fa6f7db9287f7c20f31732b98fc09ee7796dc524870dc35851814bc57e1a8ac49d8935fea04bb08b8760df33a98149b -B = -32f4e94bd073cf3f70810d9af7a873996a0510109bc6fdebb855f27dcd012c59507491152d30849d75f95dd868992c6fbbf29b1d899cfd401e9e7f4e0436732cb4cc9e6a6d6b0cb63fb0bee21e422b7f7b7b14dc5d2b6d10447fc4add390fd3c8e7b06f1d9b181adfa8d04459ed051bbdc9666623b00e3871e597be -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = b456ccf9d066dcf4247a21c7f3820e324ac9cf004cecf8dd1f6c3aa40c2a33e24c423e97190fc71bb9fec21d36c5a687065a7877237a2a05e64cabfb3b20bfff0b1f5ef2e9adb7edcd7140d1047b0919a2c770579ab44a08e5ad9f63a06f90ec7d5885b91de5e524b2e187937609b4b81d40a0b33e31a48d7b9868add75286a6 -A = 6c484e3c6b530dcd3644b19fee66c41c7c2c1dbcde574d87ee13cabef9dccbe5b41e25c32c6a56df23f2e87176afd28249e5fcb918723707fca94d7e2c9623a3493d395db802a1b49d550f52c29666f785652fe81afcab00a60a5b50cbf523cd13dfa06d5a5b0809c68ff7264a2cb35b8d52284172c62ee658e8417e6 -B = 1b4fc753d0530bd07094bae09a02b1ea684fb4e8519086b1e2ed9d59af011f61d1b94ffca6f354a5b428417b328bb1e8af3f6c7ac9121dae58de9f1dcbaa9c73a357f408b870e62b0c7db1a72c4c440f2e6fe90b199b9dab29fc23927190d3f2bf8a7ee926a152e64474283695614ad696c85ea547f5f51d02d1b823e3 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 5e7c63276f350f04816a6ed9f98507a78314f1d99081fcd906affa3b8395fb58d029ec657af82e77ef45611bc988095bba9c26f25f8fd404432fecd02398e69635f3315a824d6a98b33eaf6a91f12957a5e80cb48d5b086c795eb3b1e04da5432a7e8be3d683addc586a44b6243ffbb7a979bf9664cc7ec41e75f267d58a7127 -A = 18efe267d4c62576294f4ba44c67a058cdc0bb44c48f4035682b2d6b8a63106081af43d99098ce133f8d7f9cd04d4dd7414f704e32871d43d6e5d73fa9f447873168b43b32d6ad19378d74a967f92ec7629a690d29a62a5a6e734e9ccf5b84857a00d97b9db846b057004b03d88b827dde717fc30e6a5246c752d65dd625 -B = -ebaa580d3eef5361547c692e107439c8391ac0a2d1cec0cd275d0be69133eba8a94bd186ff9a129af3f5a015d5ebd30215643554d7064635dc11ec7a8ed2200fd637b099e534237f0495d2b629abd4c8f84aa1d925d53e98490d02f9fe51bdda08b043f67f0903c0195fcb886c04397d3612e4501ab8c7b7db69f781e169 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 76fcb39f94dd2756e8266c025cebe8e801524a757b976e35ed45e3da3db720061cee9037fdb34776c704ad2059ad8920e400bfbf10eca9bb157eca7750cc31fda06473bd22d4def80189c47ba32e2824c721425f225563df2a2ea1edd090e01c0bf980677db5a5dcad37d21a68e2832d1012586f506480e929b2fd9bb4aaddf0 -A = -75f903ed9bb0b6db8e3be16e797258f6c18f6cb7b16f835f04e3045f7e4974d7a86a63f2ec351c88fadc0635b6dc83a797cdcb5cce1a1674f89e44190991e0930575b19e2aa1512bbbf2ef6f8c3e707b17516756fadb635d8c6bf9caddeba14834b5950a4d1e98bca79a4d15e5fa5fa3c1727d7a49b33d481d32fb14ae4164 -B = 4ccc582c8460f7def2d26167b68788a681c41bdf6dc805dca83127a18bff6f5ebea6db75cd959beb859637b200ccb5c7644d571f436e46a357d027edc9769da226278f7ab947963f7caed1e7e70e572980e960e9764a40c6db67bb526694b084976142471270b2331da563a10427cbbb38e76203d7da5d67487eff701d75188 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 5adef30c67aefea4da3884b8a1d0ce6724492bc76b477f1053621e7d19f3cac15448e9401d34e05ac4b508b9d1db9a8d323cf43722e0af6e3c3b6d463c6007449c3bc3236d156cdf988dfc308a1b4911554ecace52938a7b10f463d14f917ec3d9fddcf6d33081745009c59b58aa22bcd7dd8c3bbd489997d4e0bff5473ab9d5 -A = -174e8e057a1d66e22eff88de26f43fde1c8efe5611f6ba4f318f027f5a5818df02ec3f014dfedcdfc8c143c5005c3c5098d409710967c93474f5854c1113fe4030e6682bd56d389ca8b9a4587b8b9262d146bc92fcd81d75c3bfa4281898f394f45d5dd11cd4c7344ee7a933ee346bdaeb6f5188967c388b919a0ce6730c0bbdb -B = -22702bcc4f9d5bc6f803af6af8072780ff7de7a346d6b9293ca751d6ee3a81493fa86738c44cf2b7be4bf14a55a4f8179c35c09dcb1485f4c08ec5e9f9b1efa91f4b5f15a31a46e1ed71cd934ba6bd271bb22bb5703aa468d297f360ecbb48f9fd6c572683e83ebc3d432203347dc62e19fa06f93e087283347950829d4256bf5f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 5c2f67b1607776c10fe2c30b112e541c4d8229f5f99f615fa02cf715d3f20556a28eff5c233c58994e9c6c1fcc37b3416b0875b9a62fa5a09a4b8f9e216487203b387ff97fad1f39f674ab19c5e34cb2f162e6b0b0b0084f0618e64928423b73b189c744e3de9fa50d66f45975f68b14866cc16c8c6c722a54420adf027880aa -A = 67056e93b69e8a7b789f1f8b835d9c6ecb7762f844d656b26df9844a60bfbe0d55684f61debeed31a24ef4246485e8a1d43d49eaf97ed9e7b9f2d2916a8d85b8c9e8ad5575cf5a3fea42392e5d1dfb23f7ad41a7b56a4f21e2828aab38a602d560c99783a4f807120292ceae366b1fbfb4be8e5d4561bc8944e7f17ebbcb0fb6296 -B = 1f874f244ed6cff9f910ba9a58db0dc0a7435e8d99ba6412e976b8f64d4106d3c5c57ba079384fced1c261aaa538e131734451fe84fd3cc5cc8b3ab46b2031f888d95084cd3a35a61092672a9118eee4ed1a0df0409e3613b3ef45a8b16b71ec892755dc3f83c5492b67fb9a143ee6102d053078f4875636b20b536d5cf851768cf73 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 7850019c6712f18eab877faa8489daba23cf34b512a3193852508185b13cd5a2e9f503fe8d61b74b5d3930021a5b8c38322aae9b9b1b4814fa4c2c5bc409b58f11fc8fd7854b17baa94a6bff5f234832f9468d90d148fa2bfed774ac03f2dab6a506a70db4ce363f932adcae202f04fdcae968f632dd674416c23d4e21345ef2 -A = 1e378a0f27e6259763890d29e112e3d8d2bdeb9994c49fb67ab680b6e71a52fa0a7db886d3baf52f36d943b5430ae8bcd82e229f4197239c35678eed254c5816722b995e9c311be942f8124e2f80c1e59658433a57f346adfcdb83202e55457308161d2f928b60efc39538a6469f90f1a868cf6077568c8241623896ddc2705cf04e4f -B = -f4ee37e39d4cadb692bab5483ceaf0258b068f2c0354c540438803780c983469ea28324ce7e209c3bf55b91f0a2f4544bf318585e4514333eafb9b8c2f02170c620e9b5280a828ce1d8dfc64ae9c28577e15071825a85a59656c5b47d9a382af6b78a5b3dab1078dd647e0b473174b8415d401543d30a4018cc3eddbfa546d0fad9cbb2 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 4c8f8b671443a3af5ef5749885ce5de8e2afeadef9051bc49c0d7e72922d049b1accdb79d82288e472b07578e8b6d2176d6cbdd7f0caab593dc0fd9224a94920235410501fddd6001b62a7f7d8eceaa7a8e4c0de52029fae68656e8120972b5cc1c2e909c2742e836f2fecfa51e12e4f8a2ec7e69eab061c81785374ac607fbe -A = -5769eae759dd6bf94468eae94189d3396886d4569b0ce264c22d39b623be3abb01bd5008b9fc86701a3373f7764118becadcc69481cbb134c20f669cefeb376dfc489dd4ee91cb333d06afa391dd322abe2b3b715d11ee372666473a473e29dd90fcc97e939049b455be52b3f288db306999019c1177ab5820d94859a9d2f050b7ee1d4a -B = 44adcaf1e2afbfddae19b23cfc0f0ba1f940d32945d0b541db23f3a0a9d06fb1f67ade9a8e620bd96f4005ced99430c7a55eb7e93a701c829fd5b9e55dbb4d3833afbcaa0d9c946916b1a86af4a6393b1155c6439b8b82260e09ccf0ce5d1c4856f4d524983e4b0fa123267694a1c6118beb8be26113a02721a02d7b0ccb01ec6e9c0f9e19 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 51e25767b8d4d7b2b0c2652d9ca6bfdbfea06acba543b1bc8d3d25b2fe5f2998febe1a6e742abc3f482b4267854c2223a5918a9b5c84e0864278283bcb5bace0c046db1d0240443404fb62d70ebff3ccc655e5f5977958df4c878d9859a69731744f3d33978ac31551487270bb4fb56ccbf59402ef9fee42cbc329420180de08 -A = -1966812979042198f70b3f1238c93ac5c6e5749f1108c2bba869b1dac7680f910e56318c9b59be9212e713a348767ba6e75917fb599e929ea2144880d18d4fbda4f4663c7abb49b02245169f385e09098a4e01b56dadfca8c803acb7cc244f3c98bc17440ab2afce318476b80e1d0b4ed9a8d6f2a0be64633f8faad5eb48de2681a38a633ec -B = -2e4f5eb92fc34c753c61dcc826abab6fc4f427c6ac7e73ffdf65b1037464b2a9a0b0290e713d81ab57c0e1dc30e76fdf96046fe10a34cc4511398319ee34bcaf73763a9042fcacf59a100c43d3333ffb3743048e8df0dc61fd0da3f935fadf882ffdfa9f0f42980c1af6edfdf161c4b16087e2b14277f655abe54582de79c51193e13169b55e6 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 33539b5f38a9943b15801d449adabe02da6e21651d96acd9aa40e866bf65015fa40178399254e8af6bb082d021e2a05da0f45b699d193b70112e114f0d25287476dc0c733c5cf9df57667ad0d3ffc4ea2f85b43cd10459cdca9465b0974e578c00a6e275e0b97ef2a4c9886aab7b5947b78a88f84a3f1d8c5f26bd07bcc59886 -A = 531b891fe9e8db322cec59a2115574c7a304c423e6b11516906b840542b2c608785e2c18033262ab9cf68f63edb40ad4f073ce8841db602cf8fae0a6771d741c6392976c9b333ecfcd0c8e9997da40616ae2a9e0c6be93fdc7af0dc0668ded1e42a9f729c70f74500ee76a91d3d993c075c2f645b35792a20edf17c157459e35c0a48da6c4c6f -B = 1a6fdbfed1054a0c5758f92f72db7e5737b0740c4d8c3ae4713366ef6709b21eaecb6b74c92541a9a0c99ae18ac6ef7de79d4c84ce39ad59cea9c203734a99bbb895916275e8778cfcf7fbb7b7d081a677769e4ab96bc7bcf23303100e629fa8e07f5b8fc2e39c7b5724c72907eaad09d3088783b3118e57c9c8ad1799b43a13f73864c5602c478a -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 2eab6018361f557ab06725ad90f6886d4b468ab1a193f8fdcfb4ad15fff781c8681329a27aeb5f03a81d7c404b8017b12fe23165e941ea767c733513a07e921aedf20596763f6f977316e37bed70f6a617e5c2757c229c59b3d7b1fe8755b5f65f7f407f13634aca7c8a267e661ae2f77fc5a95f56cd6c8458119df587478b1b -A = 1cc779145b2b7bf9ef4c9692845e162329940f96eb43e04db8728bfe736698082aae6b6a1b3c32867c293b08547a0941cf4059d2d567840ab6ea526e3724ad59e715a3782ca656cbb739dfdf0c113a18f0dd62423d4edb60057fcaedbb852178d38f1b5a232842b4fc645cbfd97a8cac0b094b870064302dcdf23df2c9e9f736d93409cbb8ce9ab3 -B = -cbba16086b51bd83d3460e51cf193ebc79b826e4f30978274eac3b2dcb04e9d7b56a1449b7cb128bbfeff5c4720bae45271fcc64085d3ee501f0f21fe73cb7db5f275d88be55c339f9180ea21a8cf3755a875331931b75d23f57c2030c89c6f9c1ead431cb4dbd4480564c83f8470610e5673c7eb6c0fe7351ffd7ee460df5db7872c67041aff0227f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 96fd93535728b961b4167be8b304e570cc34e787c12a9a5d76e099b336ed6b837cfc246c5bceb04b0f4744c5da7071fc01d70e342509473e5bd7c60d6046c9b4f21c5ee71c4e678447f837db3a7694fc3936ca733efdb7d387f0f6e263b3ac0b89054a826da9716691c9d580ad38d701d08ca090b6c59be466e1b9833e75d820 -A = -6791fd686f46c3773fc8d7f4753d178a93f6fa4941f4305d9689c2a305bc67840bbef80ff05c7bc6de3a595f73846609327d28540cd705f5aa94a3ae5915ef55304c37c4c43a4b46906889331ee16585629bb303673d439de9c0236f708fd19a977e6e1032e0576a921853f7dd328979ad1f1aa945905dae93a82b3af9451a541f544c18ed2546b66e -B = 6ae062b39c77bebc2fef05743e6d35e14a31c6fe1fdc42d8de2db94ce70a6d60d66263c7414b1081ef2fa6ab511b361b8baa9c71ec628dba5bfd772c440baefc2fbed68d40897878232d9715c4b7e7c9bdd41cfe7b6986d825f68be8cc16d04afb0cf593f3028f3dcd91bc94923f3d7211aa5f0f12d3270e8df8bc191808f0e266c4fce2af97ac7ce06b0 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 949ea5f645ffe5d0d03359d51a663c7dd6e6013812a47be309575e036503126f48677c68c4ef6e7b3f72d76657fa282ad5881263e649b5297da82e24298300d032af3f5e8309ac7eb597b16e257a6f7af3476a264415aa7783433e83be57ffb3fdb404a9ddc3527d6a9c297f8cb7b6674961b3af837ebb65f218147a46c39cba -A = -10f59ba073126d92a201529a5374500612bc59a9e66322c6706b422d35a4f82d97e668b268f5527b4641c6099c80bcea504234f3c1e3fd29eba0f161da97c50aea542becba499f29d4ba5571873d4dd9eb3f48cb26fa6c929a704fe8e49791b2ca3293c2428d9cb453263935c9c90a4a2b39d23a0baa12535845f907d42b729033a0a1e74d18da30a88ed -B = -34fdf9ae6760d4f434d09ce2a7760ca2dda14bc256015809745524dc49d841b07102aefe5a1d0182e3e09d4d45b415e46f653185742b9b8ea6960160752080e5c9577a12182ccf1a293407b534ea8ddd33ad16cd19ba537d8db5b542f86a2a292423d452bf18d82361240a7efa831518184572c5a8b73b108a81d5036b3b530d98bd47c7fb2123418f12e05e -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 9ab739ddae55a0d71b39974628d4601122ba6c5035c3ad0439691317f23dc33c0014f3e870a105e4dc1432ec79693bac658433b21cfc218ed411e003990b94ebfa87767f3614ec19f5bc30704adcaf85a9d3d15ea764c8f0bbd52ff388659637746d39859398c79016ace8c6f97d3a5616711a235b85f334fb889b9280ccbea1 -A = 76b15a0aa0f59ec804a5e9a627e1fed524320b29120b6789f8e71b1ac4e00a9a8c826919035b84f87d291e2f35460bee181342136dd9eaeb99ed00c6328b8e44c49ede3921d6275f6e7f03de179fb2374ae2fa6c58852fbb2649e214691daef945ead6c8bd5a53ad2b130e9eab6ad046ddd6b80874ca6515322bc171ee32749333669de0d9c883058423579 -B = 1fe2171056ed4585a143b6b2bb5f44047664f64d710dfc05c18be5840ef9426ef05b6e92e4ecb5544ee4622e9030153dd9827f2f01ef38e62b88ecd6c46b4457d16644ef6d863c226acfd6928a40de614a5853137124fe69127a7f05463eaa49bc742d8f7be300d06b302dfb0ba86801119bcdc01b516afa360aa8b22b7c6c1839cff859ca1bf26e3f7e030512d -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 5631048ffdb2767aa04d59d8a5750016b38b983a2d53743ba4de5d93bcfc8ec30183a84bb1e290ef9c72c7ad357728acecfc613a6f9b3d712456d545ed54a337930937f4589fe41e66ee930db3dc10a4fe41481008c69eced65b9d1c46b8574c5ac8f7d94025d8fff00ced17a5e17508527681bf94c2dedd51502a2c4652538c -A = 1aca12b1933f25ea081e12ff4a4f6f9ce379f96d976da2ff7b8eb8ad791fabe31c1148fdec22dfd67828e540c955a1e13f40c5b125e1c7e6bd839bfa84e5bfb58bfed76058c6db77af7a34ffd25fabd60e19f65e1faeeea6371d7785f2e5bddc8650a7492e06691d61f997483661eeff54a30656f1daacf31182486bc40647975151fc05d2f64b50e632f5d5c4 -B = -88ed894287043e7e5cd2eda3c1e5c97f85809f7a246b0c20891fa9a024f3aba4ec1f3d112580fe6ba6b0bdcaa1325ac7ec9508aa88c187af08e4f37631eb6cc97e4481b18f747ce6d35ff355e425a4833834ffb8d34a818bdb015fb818ac9f58feb87020234243aff912da5590ea3f6cba74f1a9fc3ffa2b4aeea25479c55a3b572621e75d86d8c8f6ee4f587e0f5 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 6ce341aa4a571cd5bc110dd436acaa09f409661967de0bd096c77c60db58b2b0ec95cda50acd7fa20ea4266b2c579eeb6ac214a75d40abbb70845db74c4d6c93f8c545add269d45fb15d985e7e630d0425565d06dad4a3ff9835411e51fdd9780c24f466dbf29244cd1b8c3445af181d0928db399bbc8632f7ebcb9d48c0b754 -A = -52c53999b02a92d6254557203cb31a21dcb896495d1f29f3277d19129ee43e521ab9d5a297204a844a9537d63b74686eceba72ea2e7b98ee8895513395cf7c44c99348f5c4eb657874a8115f0027d6a416b8a04a1ec0e6809b7701ee7d41e99996e307bee9c295ab3df1faf674e0067d0ab3bec4da998580203e33760870ae472a3045bbd66e352b8f4d284efc00 -B = 4329d110504caeb71ce0453b0706ff675f646e70a6bd9575791a38f672eff226f4958f8b1fe4123c0001d8f8595d8030d0e9798232942725a9b9d654ecf50546adfba7103fed796b455ffbb4c153e70f941bef7953c8a210d6f2f4ddf5d9a79d9938503ae8f24d69d5d7df1c988630ed960e12dd877bb80a1ab0bcf6db67e0c0578fc0c40408f72b19052534da8d31ed -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 4b9fc1e0eb4be199427c48bbe1b53948d0135bc1965b8aa5421a4ec704b13cf934c650405ba02ad611b0f29d46d82d4a1fc5a84651a29364524e37be2fc7001cbd3c792aa477802999841ff19620cf66dd2453c9b05aac349b9094d43b40e358f32805d87cea3cfa98e05240ff95ec57d88e0a12917628ebd34946eb1ad6799a -A = -15a223b691d8b3696306b0ccdb52c1d62c7c2d1ac71e5f07cd8fba960417b42fb5ebed5eb9469be67f231b5254bb0fcfadf5ac5d2906769e8bf8292f0442986cabd88805a162c0c1f60f9ff0bcc2029ce33452d05f754375c0bd147fba745bf8a0008792d4f90d0e0f2cf391f2d7865705544f4a220ded44732321473c0ae7870394d4e625df11bd0923340cb70b995 -B = -340e5ccd644849d982bdd455ddb3b9a23ca14e168bb87256bcc370ffb6b7fe78fd062b3bcc1ad3c8c3b8cb549f2baaf1b7f0f6522aba02fd35b651f7de52b3aa2e0e40352bfd6ed0f84a2bbc3b3a396dc8512ca1db01cc69611925f1037794c82a418f10e0d994f458d1f19051e8bea32b90ce744d46718f42e711c094ad0a1ee96c88920188078f1b044ccf307e4cad7de -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 31c090e5160faff9a136a7a482b42a43ae3c7d00c215cbdad28804be0e7b12b0b3af820c1350b1622a22c8875f24d48ff16231c826d1a946c66f70aef92d4e6582e3ce9213d907267251ac74fa3cca9f1c8fd53fe9898aec19936a2b797fc345d68f0791cc740199be39c05053d5591d874b415e62653b04a3f41e263d00f230 -A = 5419e87e50b28b6d24927934b541d8de548a8f4ec7e9b00aadb6d23f2d33406177d3fc72d29ad2c2e141ab2916adfd30ec4791c626af61d8d192276d632aaf3b54e2ffe83b44f6f1ac441e6823b6b58cc08fd7a0af945a02eabb5aebb2c7ff0622a17b38077cd0cba906ce23e71ac7f4da40ef6066565b4cb3a62ebda28f3629eaa251dbd9979b123a5447ea20331723e -B = 184782ba4daf429cbd13ac13fe93fe5833f09915cbbc707feca3293e505ce9cf0b4b12ffc8b178e0a4617f809be53d4895a4182e7a8a65043361e654befe8b01429ba4b7420193d1d7d90930ee19cee0316f33a5795335f5fa517e1ffbc99b95101b0f936353afd3bcfec34851ebff1ef02fea991a01b587d28640c935ec91496d1aa3ab8d38a6ac75b3a4198ed27b9019bb3e -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 5eb9f3ca660de481968a3c7321281f22fb9273b16fc10d8eff1fe34842364dabcfaee4993c1c8ddb7c8d6e509a8d2afc005075d5fd3c4471f0622753c7797aea900e785ceef905e2606f64f34e47239c40b74f07e2ca70bd5a18cb0a88780489f3e98232221f65ac9c5ce703a256b7b75eb1dd38778d8bc05a37ac9ad8d36b35 -A = 1c73d8e3d5db127a81477a5c4c6d61ac62af446981773ca15a9a01fd5175a2826a8763f91d68df28ee606e8ffc203305875a238d2095345556f12f3b5e10c5bb6ce3f90342ac74b9ac057195c863c4b9d28ca1d958a98649c7f8897bc6abbc39becae963f61b33bab4fd20d9d0e5464f21c2cdf06d00f597dfde45dc5919f5124f26888b12d72cbd2f57de3f2de7c014f891 -B = -e406fb60e35f0abdd313b8431f4cc89fbb034daf71fae0cc727e9a93cdfde53566fc74e48f4cc2111fad158c63293bca0b21b98416381b81d2443d0e91647679481cd6b6869b37112d3b6e575eea7fbb5bdea422558d817b49ac36a829926553202cf9dcef09423c085d26176a89be741ae20a434ea461def090dbffaf2e2ef97bbd4ec779041ed69ec07d125c7b85a2d215bb0f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = acf9d363fc9b76ecf7e61c33270031340e66595e559dd1c9dd4d2243819b660183521a4124558fd4b216dcf5c52c4127fe517c48cef428b9ee0f1bebabab487c968a80b9815e82c12e807c096974ea3893a8d5597f745365c352a6bc6ce92479176092f02907538c5e784bf26dcde7672338f402753b08de8aa21b9480df6955 -A = -7c03ba6e3939ebbeabd35cca277eecaec31f326ab75f1a29e05af50c4e62e0175d4d6a57acab87cf1fa3a51791e9a2b2d4d5db570ec3941263902b0c74544c323c106557cd5139d2a25f3c3ef81ca009d4e3c16f1abf6e2b5196df1b30def46d61eccdcb3741a6dfc8e8c5e6db68ec29c82b0adf6e35ce7aacef8da806b3b58bfa489d319869b20768f8eebb604a9624d048f9 -B = 4e021959da96ebeaad17f9896ed53010d80ed3fd4c3a826a266e82b80ad81b3032303e7c0e58034a652b8aac00c08d42a530039de60d74ad349438f5ecca1256342ded6f30e3bd2aad5bf2b49124cb27f45f697e157550dbbb37f5aef0f04839aaf1ba43bf1e77a1529818d0fa91d940904eda6b748e5c86cd1b37592542c43b7b4afe2b8926fef6dc01784fa431d43900edef27f8b -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 24124c69aaabec7a7b4e7a82245f6cb14b199852a8b314a7b8d9049cb66096d5ac93ac75eb58a2004de8b0fc8375638c0878fb6a45be8bfbcc292e3571df1bb8d6e346d5595fa395fef983a365e4e868154fb3e337d47771419e7f1dd5e4220900c564d7cbe8e7792ab288f99d265aeb296c5ebfdaf08b88d9b30ac660cc3ff8 -A = -167c959417e9566c93e7e05d2a410f4850e3a313e516ec958c3d2fbdecbf58072d05691c68981e176a867d7467091dfeca11f695f750c8c44ebc4d08e39e679d96c4791ceb1ea3b89fa3ce26f7ef214c5368c03ba694f7ae592bcd8ae53a66cb3eb1e0cd3c105faae6eb7e7a8fbc88248be722406f2d35e46c751b5ceabd992091eeba15191ccf6dd61a7ee0c624d43b188c42b6a -B = -343940f3b2a5f73a51d6f609e8af306f44ce7b5c2e79edf6f4dfc07866dc5c4b2e0ba48099b5503af87762a44ae451d166f8914ba25b3cc41a766583bf73d27e40784064582fd9fe952fc00e9aa2d4e4f1ef35818978e725e69c1bcf267fda4d635d1d292d54d3ad10bae9763dc5d7f7226f371184465695f2d384d749fe07967a1bb64df22f294ed88b13600c7068d881f713cb8e3ce6 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 50cac148215963e58cf6d2ebc36fa518c63a0ab8fb136ab84c9657fee459043ee9f42aafec89e8ba5fd1cc5c4495a41e80590ce197e12c087ff7e6ea88ed798735f55a1634562b82f8514488ada526e5dc10700058980885000e266cad55948d1e080f6343f84b12a3698d9ad5427fad4017d931df77ed2e45e2fb8380b7fa39 -A = 6a9833d768a22ea46aab1a1619f30283a1ec254a2de5652981d73146aabe31041ed04d271c6f2e5e2d090cd615518a06563a94ee2b12cf9f142de3f15599998a712974d0ce9b122a2aa65bf8750f54c6324f12e321a888154330f0f9e1e5b7999acd70d4e6da95c2df1da2d19544b7abd2bd3041e3228c7cdba44f7d1cbfbcf968f8fe87fab523eede0485efaf5cc9e56095cec8983 -B = 11e782e2b3f469b1e3d14ccd1b8301ffcde7e371f6e9afc99af5809110c6d70e1cca5c0bbfeb95fc3ef8352581c11ba75c0f8c445ce2aea903769a24289581c95ae5ebd9553fee61a30d155bf6011278807833eb2ce7ee2a98fececa23fabaaa259409e88e3c4f4eb1e04176d44878ad3f6961e0615ade2fe86b6eb02adeaa7c9019d63231a28f84b7dcc8bb0e71e2a717db09301e1dca20f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 7cd49d72bcf5ff4fa2c686f21e1f0146c4f24b9ad2e900dca1c0a5d2fac5047509064e65ac582946b251a3f04850c9abd8b80c92af0fb11ac13debdae8b94927f1de0e4bb217e78f5d04897c6a0762667d3d883cb754dc610442c9dbd44228a7ae4f14fca145550d813655befe3bfeb52f1c76f989ea8a1dd9c10fbc7e9d6574 -A = 109fe33568598972063279b71ba0efdc2e03f770cdec331428fb8ca084c9b20d0fdb5cf9ad7ce90c8cb8f0fef10d219d7dfcc6b4599440db8cff9971da7852880bf004266886eced8763b3569720df3a1fb0dde2717ce0183f2250034871146628430f206c12f5fd87574c206b203d90c0f2c705cad3484c73da8bf4e9f7e1bd433a6f7fd27df63079d30c490aed7161bc594eefad4bc0 -B = -b95da952cabdebe0194b7fba519768e1b56149353cd12023b97397b59e0d7f4dd1d27b65b833948f58e66d3f6928cc3140cced835dbd612cc82a7e9fae1621986f71ddb6707ad57926b03e87e165d30fb145795a70627975bbf9d9ac9bce07492de5227c666663cc28b3e70b19dbaba7f16849535ce5fd61e91cd2875e0a534a10c60d21f919d566a3469d108a35ec3f023210efd5d318c7210 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 98a89cb3c9602fe503c32c44609bd4487b6c8323737b3376dafacc3eff96efcce7a31f1b61ee6799dc9561e77ac058fe5195cc013e72a2864f7e492d9f35244b321d46270a582f6f14f15fa8203d392e81b183a1d64d48b51d70e38d49c93869ffb9d7509f15ccde547d2d9c4dccd50eba49190b6e831a9f4f9000a95dc83f3c -A = -67d7fc8f1766c40bd476cdb65d4dd161c3d4c2c5860a0c559f0e87ada213c9ed33308c36bb1c7d615fa69ec53656bbae6b57181a0134af23ea2a75f8fed3290a2f483392a3745fb57adf2121738c84f6d34325121a702c8ccac0090ea27fe9a5ebb6ba9d4f397e4a7e3151850b3d7d25643398bd3e4c1da081471389799245d986cab825a2e6ca72b38ff978a2753c835299ab4597bc65fc -B = 676ddc4d18960817ff8fd2adffaa68c87d234d62d445d6ba3847ded849356d929d9e4ff01f517d7b1c0778bf90f475923517d855956f17ece1e032e2fd474d2133d6b8a591995454d8b587cb4f6fdd0fa29305f146d340cbe6b6efd28a926c73735621be0c5decb792083b3f063a43dd9f635e03f78c1bb56389a5cc993c8f36134d755a324d4fccc2ac3bafa270df67db0a4ee6ea4497aa33b5a8 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 76c31404854006a7d55554762094df6e11e0393f5b0451d85de2e5b104432df72023a35f44da10dbde01cebf77b8f9d3ad582373c5d32232564729af0d03c5450e439045d96a2f0a38871c922af2bd38c545d219adce0ec80fccd121d6a733bac09253604a8a0b1ecf0f24e44b818ab9e9974181cef10e9eb17684c57d72257c -A = -134e8784878a8f3cf49ccb952075f9f9bcd24a20f8883955f262867045c11a9c566abee00638927e5de924872fb98f6376e321ebf3f567db6cfeede62e04f839617d78b7c9d3487b60a0d3897b3fa49b14c12511d04854bde4a9dbe5f31424a3d05cb75d23b46f6c0819536020880afa5a2c173f6881754b56f82a2864c99c820156f96b5cc4665d603597331d98d90a52f4a30c6215ee5eaa2 -B = -3c5c0d35de5fb21c84d2db228829f43b31132b582556b92b495f59df502a6d00584bb5bacd9b8c1a8c7eab91db0ea24b40f07e62a712842d5c2e1d208a6412a068cd5c6394d715260b67fbc03e3ae7eb4862f74f4d7484f747774fff03830c65fe022d579adb6737f6dfe297db750e6a58d1004e7e2716838befc2ea97179ecd53b7f36e3540e1c3a0f3e044bfe2d0efa9b89d2d308cbd0bd88ab3706 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 5b704b3181e5d0494937b4d6aa8172eea82919fd1d884493197a6a85ff047a7bcd5dcf072bdcef0287be20d4ac49918d1df550d184f86d7220f0a84fc4da3ad05e131c443fb529df01fec9fe4fa6fa2f36e791f9e16b4092759016d2f9b1ae7c3d071c57edf26386aaead767a3109c12a5004c7b9fa595e6d592daaa2dd1df04 -A = 48a0ccd2d14e14e2aa862d306501efe5de239e8ef36ff6251c861a0aee9f739411f402491bd99aebacdc26c4f30306f9137ffe4579c2f13efa81b979ddfffcd23675ac6307c0aa3ba8ee77a2e3a3c8e241bd2ade6484e6ead32ce8d752fb3584d14688f223758c5cb8705cea9c56136b219d87f9904bb56be2ea1c9a035df33455206e6b7972cba32ca4c3db41991117d88da3521780fe65c4023 -B = 160120a35ae3edac3edbede9ff1c6f317d95481227d87785b7ee46cfb80fac9973e418244884caca3211a3f6cd3bb419cf70fbc22d82ba5ab98ad80e1f6c2cda753aaf7be78613ef25577107a47ad1ee3c3645db85c4d29bd77900e99e1f439cb23c6c68662c05322f94feffcd9e37d8665cde984387093a043447de590e7874e6acfa37ed302040df4d5c3dcdf9fed91b3d17ab5c141d4494d0f301b508 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 448c3a64958b82ccaaed3c74706ce0a48c5e059c3610cc03a6b5a03a7de5d4f1d1e4b08a31478fa8edd58401f0171697f0662146ce2b371e335d695f9e4a671255f29fc0b9b7d1b2eca4cc7f8357aa0920b5942e31bcfae84e909828fbe5d02251ddf10dbe4c15351f675e96e2eae6d044da1f0858ce8ba9b7aa146850b85d93 -A = 1b2a52aefe44170376df29d17ae2dc1501c9c296f72f271c21f53db71247e72c3eb2b780190c45343bcc8f548507559ced3bd4a6fb13f9174dbddf965b9c4a56c3d88727736d78be9db2268cd02382e50c6fa28ddaf8eab9f44ad45d5882a5100b3027c150a7f3bb36f29d24a76e40f3820ba116d645800459f06c20679321cf5be72450879462f0eac99ab6ff8d26b464cd0e6d78621c9263394c15 -B = -b7d9bd08d7d8e0e9596851b7e03c78973a502afcc7b5fe5b0db6034ebb8a11df1ef7ed0ae1371eb4111cefd61c61935d768be3e3755e481daced219874cdf0d07a76e7144be626cf1fc21c8a0e9db4389ee213193775e95d4d86741d8d8fc820c239b7a90937000dc3e89b2fcd61b44e1c38c655bb3d31aa7e422b4406c9e4a88e6a2c18ec7c048f4a6b5b270c90d9fb378f64be3b5b351621db48a6c18625 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 2192157490ae044a26c23eea6da51d3a3dd08c7fb67a9beb76d37ee24ac0089863aa7f00849b81bab8259f3a0e1bc744d841e07aa413c286e4bef2ff3356bdbecee756026915894584b4fcef7e49da4012cd9fcb5dbe3f3b867cb6a7ee959a328b0fd56a9eac1f4e40a22bf0a30073cd2d48f99245ac03c373810c54eaf3306c -A = -598eef47b40d1fa1ce260edc561bd1c1ab286a7e068af412ec2baaecd07c5b9cd596505ea1bf0370ea961c4ceeb9be76baec74e6952cb846f20e5da406bd01368b85d59569b403b7a305cd7448f331f10a34def43c738fd633df9a3eb194c32d53aeb567889927271d71d3929d43fb9338248b64f7d23cd1b053239e09cc2ccf5fe9c9ce240f1a10fb151a8583e4b4cbc70ec3082dd20a9962d564544e -B = 559fc917de34bd7dd7a23a432142ed79e3ac4a6caa357eea21e423eb9af7fd94f1eca735d2588ec4c2ff013520c3a0e209627217cc69bd5a07ca46a43ec1f1bdbee5f09ceb1b2c18bd388d3852e51070943f16152a73da624be680c671057677356c6f281a4ba1f7c60609125d7fd9086c907ca5c191820d80e483886b70c1074e2963c49996ee92577334881edafd88270bb967da795aa4fefb739e4367390ae -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 3488bf00f67b852592922fbae64fa56d2e4e7081678e789bbb3b4f48df62576d537da2e99c9bdd721c725b9a828194662bbd51ee20ba73d4ed5562482540880686d9fb1e8ae62d08e39fdbbab1d18e399ebf07b3a6559dda8b043fc25a8152858d39b10ff64776e00a839950e7a9ed5ea95b594b6e9e9d4348ceae08071ec5d9 -A = -1b135d8cec9969561be396323e2f8be0c60903ca59b6c418cb19876e9e3cdcb9ce4f5251eadea11fd6e785476c70822aebdc94617063d161ebe55584a8a774ab230b8228a2b65bd5a6c873bb6b261429eefdc7d0c64c7e78133e739efe57f835ad03ef8f84601e1a2310659db5e0ee706f23e3c5c38c9f8c36e5b15b654d1cc528f1dd392f1b08921af8be6fe4e4e6db774392441883ef867bc729338943b -B = -34fb63435c90018e5843098e379c76ef3ba0615b6b500854b3dda3e77fc5646228fcf3a6e1cd87a506e4959ab05e24474990ad98ad0865942737734c03dc289307f1b1f424b9a8c2264350943449b3d2b0f71f989039131e23095d122ae98c0089a184dc530669e804140134e5b602861a5e61c030fc3d3b3eef0a59f8c0579fc9b0afceaf16698de3fa07c43231312254c04ab11ad7a29efc4597780c2cd1b64b43 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 8ea5fcf7fd41803606c95729d2d910941e43b222f9b0c93a1a803b197fababbd653a92ee34e805906fde29b307a962a294aa4dabebf0d181c046653ad0fe6da1295eef817f3289dcc6579cee8869198c39a9f79992cf6894162d35d812df327a64470c935994aca4985d0e6a783b853ad762338dabd575ca71034e29d768d014 -A = 6858d029a62b0f75e4c59f3ec067e3990b2304c90a097daccaf554abec49a9d297ca14648471dba08f22ebbf8e238c89ea06f188203599aba56611eb3d4df09ea795a7e28f91f4a9a582c6b949c6ffc584a076de653446aff9b24e87202037974aede37aa9a121b5b70a3e9b5ca376c9056c2c91f5d5484baebb64cccb6a09b4f40529afad1ed64b4cc4aca586892693fb5f92edb6b4d5f678f7a2441e51410 -B = 197d6deff7adc30b025e7e418cca0a641e1a1b35f78fb56b9d8847f0690313475e6fbc6f73c3a718b10bf37434dd9fb1eca33a99bbba674195b20d35e3b34ba9d7c8438eede24ebb48e6d39eecd93fcd7dac44235ad32f208919f57b261da70ca378f9b03ae5e5a733f97f0b3f4102d971272015bf50b6f3e50c7b36cdaa14a8a580366c9cb0118ceec6e627827b0b8f614656292675ddb66e1c55355d5a1d78e69ed31 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = a25db977e7a8fa4578fc530995335411432ced67e131fee2cd7ff56970df64a6f0f4a7d225d2f4ccec8e98273ec9a0f1aef01dc0b866e425d64e09cafb9ebe3f80bc0ad71c769f1ecd5efdb4a990ebd3a94303f52f4a97e3a1d615918f8b2df5321c4aa9339b4453d7a710a803106dd0ab49c6cd9aea431f97fea9fcae0bbd90 -A = 13f97ba15ce46ae32147a0aa4c1639b6b555f4d8a1af15ede4f1103f7a0b06b4625bf456d667720adca0c4e26e858f008b012fae63cd89322b33fe51e87714519e7dc3cceea27d968b46ebc04024d063b17901a7ae978591ca6ca41afffd81769f04b714134cfaa6700cf23bfda6ce67313988bba5fd3782bc62f76cf551d140c978dc002a779ae37400d34cbea013a5d1338b203ff267861edd88ab8ee1e4c4d8 -B = -88d8a4c8c680fb01f493f73753c70ee753951d4734627da14962e36449db5490b8c575729fafbd203a125b500b96364e6799d9cfcf0efb4ec877e86865eea5e99e2fe5e7655c1ee0eac641e73b71c66d7a72c2934d1ccfefcf59781035b2c7b89e5de3f7d1e9128cac57947d22e7577832ba374492a2f53be37e17733d8bc625fa77fa5cf093975049a5c477f792fe75e85da26cceec820c8b255df0292824b4c3a8ed455 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = c1f2165a402fe9becea284dae60453965ce327f540bb8969562485fd1bb60372b8689d9c9c97c91bcfd699dc370117ea8b704f06cae3d972dc6e5eaac971597c69d4dc24a68b256f97229e643706aa6d2d844078a5fee2d08270820055ea58155d7bc754f09d0c6f804e55ebe53e3ec418747d4130cec68533f6f0c2f8fd2409 -A = -626a1580e52ba52a877cdcd62b34cbc7f949148671d4a61201e03e98985d704b2975b9a2d9c4557deae065becd662ce8448171ac582894bfa2c59d4ed20c6d0471fcad1d0fed1291df5e4556aba72f3645486580c8bfd0e3c8f6cb34fe17ccdd75fad4d4a2db4e00bb8c2a23ed17a31e95631320590f40416c153efdaf897e3b278a1faf1917554d9292f90c4edd5992748b58492289eecde1af34976ea8ff507fb9 -B = 44c336d7739118340048939d6c198f73f90e13030b69be286ef920902391d87a58df3632091d0ef25340eab395203e8dcf3389e95debb7432165147e145735d2e3226637b4b8cb7d85d68308be07f217f57fe439b31fddf3fd469869a20f1f852e1645b0d4903432ecd1fb6397db4c11f6b6b9c0fd25778b0ff00bab9ff576b16538a6b7da40f01fa7b987af8ead41ecb66b8940c0e8a1208d0026773e711153d99348e92303 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 98eaf476f11168bb63fddf7dbf3347e619f9b580ea6804ab893214e94ebc089cb652e307f1f37ea7ab9052a352e260ff7d1e8c17461bae68c52a8a8f1a57a84c79b2c8fcc2d504ac4f553d2534f2a776ca129ec1942d83c8ae24c772f6a8429bd61949ca1aa714cc3881ed731497b84415c88ad4b9be34197a549737edcfeac8 -A = -15897a5a986641fc2cda42d185d72aa1552eb92f788bb71cc74c0e424bd038e02c620d0686ff88ebdf0bc1632093c0d89e724e7d5b526b0ddc4c7e145aa90b36be0d8574901fdf286df84a6b52674a78cf21ae4865618b4347bd905461d878537b33cc41710ddb290964c48e44d4d2ce2ed82847de75938d23ed418bb9ff1caa03b5c1ac5d65692dd1defbc6013b3270c4314a45dc67883762fda5509b915e8277c1924 -B = -3a7141f54a0bcef68cbc3006166f7e15a5c2394892a428fa417a485981316a537cb3ec757d4a2473fdec2cd61010a9ff865852af8f43afc79a97d394bb6c58643858e2b4dc5cb958c33781b5c35aced7882e8b8d7b4e4249c2b82150adfb0c8f2bbb1cff3d2ea27ed24eae030ef468ae4d6b7462f0b072cd2a2f02426b3290b87b14d14b34e91a94c5bd69e9eda53335cdfa7df90a57f97f3d023ff85537fe0a8bc5d8fd7901722 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 34464b7a50713d17b01b5940b5acfaa7006aa6b9b083bc17e0535b08783761391eaca8703af2edbe13dd0fe9036d38aecfd9faae08c0861042ea1a25b41fa8a15b7721909783de3aca127e955e177987518dd010306a795bb66466fccd55bd9e2bde17470cbd36b1e8f8b63805229754387a5fb40f3ee9a8afb2e51e25c8bea -A = 701ae8c5bafab7f41c999e492f04a7626b2b1054e6dce1b83002b2d3de46717225b018733b0fa8fe3f973202da8a090ae3fd14f48b27097513ecd4ceb1b9729e7783c17fee9be5221fce4ed3860275b3b36b7416594d2b65e198ff564e82301cae23756c878494e57b5ea8fd22ad800a582cae32fbc985d122cbc6e0eac77c1000d3ede45ae7aa087534adfdea8e9f924efa1b19c43dfd3b7bc83d7c40df7c6578a320a19 -B = 18e0256543619a750384d30b6a7afbbcbdcd9a2ce644dbfc97a8ff699e118032558f706502c9b956695cb25a46d7526596b3d0b67b69611009265838bec533a9488d24583e7d7f2284e23c3cc4ccc5920fc57e24f60da0d479d41f5b9c6ad9152903a4f37842176c6257fb1e3e0681d6d583e704c1d1b24cf616fe638106638fe9d79a0c74f0df67cb2df9d99185324ebb037d01ba0066ba947d5345cd3201b19769d438c43292f572 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = bc57cbb3e1051d3a3035f77c2e375c7e3221dd472edb1a5ccaa7521849fc0ccc7568238aea9335a733d839e89ace6f2b66ef238267e0050c065c3d9553cf50cc5cd93d34fb43c3ea1c31b8ebf0b751f595a7e5e3e860b366229de4286b9d3f0267f78c6888ab3f208c55d9292079116ea0eb9f4ec2934c97149aa132c03336ea -A = 1ffb0aac11f6d1d257ef7aa997a030e2a12b0615fb11ff04f344f6ecd550e8e77e9883c246e009af33a51204e4066ed4249950e022a61337848dae17c88317e15ade5b5499c0d7597a69a02b6c18db0f975c19c16d2167c583571e947676ae9c15be60e69d76e78329aed5fa57dc5e616795b5487f3d52bfe74b54bbf93ceda093c2e14104a6d2f017f0d200a9fc89deaa283e04b0bd9015ec67598425312868eeefeae9c996 -B = -9de2d82e25b449b8ca4b02b2d2fc0a023fc5804ea553aa84674a815bd74193a2e549070e2cfa0b90a53070646875282fdf855940905f834f5a07f073093c658cd1813fc5cd7092af592092d789ab5481bfb14b6683139646cff8eb1c5dcdb6a33113d1c97d4b587f15f972c06046730b7e712a8e3dd5f4bfd07cfae289047de31776f222d11510ab6b70a200ceeb6802d6c33f913c509b31b96e2b8dba9e25b0d2250c3b102d814683f1 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 9f7f4e010370ec1d76fa83f73c80825c3b71521855fca5db06d7ed830c910d0430375bf319671f6a83bf6b57d9d53cfaaed5bc5d615c5690df0067b18791c33cb9f0ac9fa5f0473e4f4eb7840b0b660962097606b3de5744089ffb37d9c0df1123a91a5896d4deeab8aebec469b099a3a9a4f6d822030ec2fc4d11636706fd0d -A = -7f56093243ec2399548ed95df79363e6ff09de211dfffc314b7cee526535def0f9a8eb9aa6f1736528ee7aae8be55c06645708d576111766ea33e0564c12103edd61ede3128a7a642f968eefd0d7f3768b1325c2dd910d459b15e54145a234225fd29932234e59d3ff5099ec4d5b5c6075f56382ade1101115c7b94e1e2a7bf075dec210fdaf2357c735416dd5d616335002d1cde6056bf7c478f810b78c661a3dbe6e54084bc9 -B = 4df1a6296428d06f51f31a1b0f66d0b77a04db3bb8e1b80d64da649899a1a55d4041bf0bb47d3e3936ee0f3740e1e8c2b235e1b8944d28c7d617d1f968abcde9dce10d6e3c27b2e3607d8df815f5a39da9b5569e95eee1fe5532c0a80011e7415800d8a9ec175fb1d13dad959becf04964b70dabde6d37072dc9f6d914309b850cda33a565515dd6c0181fc48bc7033b314ae0bd5872480e02ffc08dac4e3030d83b33488cf149e19b0021b -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 6da5fcea305cc6eb47fb17190889e6a39c339da1bea2d7c95e997fc538b4aeec8b0edf7c109faad7fb6c656420f4afa104ada7a0d3d14d3ef0fc6774b59aa2687c0b4efe7c3fc83194a89c832f7168346cadc2b1fa6fa9a23a67c91ad731b4cfb9943738c7f9951945b2eabb3743473d9c0444ade756291f53fc7641501597a2 -A = -19dfb98f9f7d20fd331ea749d2019d8367935fb75ecde45d6dabc815ab9e593e51178a72816f85aa678304e6ff3a2c24079a59aca253d76c4ac633fea1070753ce770765bce47428f8f5ae40c26a3ac91ddb551b3d575bad9a3b6fc7954acc93aad2131b78fd212fb0db7cca4195b41651a5311bbd4d8c64f1c93e6520eef8e6308e98caa1cd0d3c9b4041182cbfa131c4948257f1200b1c5351bee77ac8bc8e44680ce64ed0648f3 -B = -2736d5038c60553927f389c0650bb1355b0ce745a7dc5f52c9909039465344af910a5f6a9cc4ec130b9877c1cbb52fc08b20d672e42b853d26a02bc07eabb9e3f91399db8465b6a8b1c9f4a4b9eeeec6e9b6180f1a770c139c8f29ceced61cc7ba182884ae01d14dd85bc924391333e8ef039b586b6a0ae18db3570aa560c2b0226d5e23e7e753873637c25aeb19e74997da4f5d0755571785bebbc7dade57446e0df4cdb8df23c1003533f60a -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = c0265805aa8ab52da5aec06ef7cad2026fa0b18edb27b4903e3c068ca6464465e34d3f3bdb4bcc10a19441040deaf5569645f7e09b36c56631b3a6144d6206d39c9bcac53b54210db6d484cd6a2780bc68c07272de03a9bba7e51c9d86cc8883cd2e1864a2ed711d505930143c883c57545e9c40851c6df8b3314a8c9a0d201c -A = 5622f906b077d243521325be82a43fce321412bdab1f15e4ff0c11a7066a288b7939afc01d30243c8a4150e74286611ac1ca4daf457aa23508a7af869d2d55f54f2746afaec477cd7df0d5711dd636802ae7f673b3f730236ac3899330f89cb71d48c2838322fe856d9d8b4053d9c1e66acdb5e43614ecff954dbe37c5269d7ffe00b34e682c0be3d7cf653ef212daa3d55dff92b329126636e440b0bab55f4810a2849f77c39ebb93e -B = 1ebe0d1800b1fcfb67d7d54568e45dc604450c1dbe103ee21d48dda300c1d9b9415dcd9f5a56cf12c2ede3c862e895efb83621435377387b29b882b2acac78386895c7daa90810092bd3062a3a4867f92d54622d7f0b89b40fabc4709fd507d4002ca80de231596630c234fa418611ede0ae4a9616d570232c1b03329bad02220ef64e455c164aadc16190ce35b78060a6b117b4b0641fa64dd8e8cddb5914e7657573804e63dc7b216b1a9aa175c -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 606d2b6f756548568013bdaba6e811dbae88fb01f5f36d30d15dc1e099d86bdca9fc1eb3a785034ea14cb7f4776586327d57ca5a52ea1b30f26e2a76140bbb0e930c7780673770fe22c5ed443c349510e1494ebe402f2621b1e6bde39b8691edbe5c7242efaa6634553e6af146dd40666edf4a3db5d1e7f9347fa1189c1e5168 -A = 14ea5e6fd612945c71fdb17ec44d95015773edc908a85a6645a8eb823d11226545d05b81791401cefc81ce9765eacea7a619cb482f29d38988d355ce731bc9009969b7487a3acca2d2065c1faadc5d6dd8ca1dcd3f3d4ff61d0a75ef75272e62193618f6b802f70795041de26d6ce367ba996dfb91167cb1fa16c8977f982e1718de7d60275a7f66e4ad72ee55ea06267cc4e8b08f488579825cc674b0bdfd34a01bed08b62004fda15b7c -B = -8a542280f6c8bf4d9fbc96d5bfa6ee0d16a09dffdcbfeaa2dfa1097a760dec7bc540a0b5b2020bab1eaa594117a40a9bb99c3f16fc340c262b29909608740b8e77fe4706a88dc0fc3bcd47998e88fa02f617062393978ac1bfe14235d43f3d5edbdfb9f140412f4fc2dfc05a700f47b1f0f90da7ae07ae781d9ccdbb951f19a8b8a9a7dd8a65942842cf207f3baed3a0b2f08a06ad0d9ab7ad0110346293d51ec53ff8165b925c0e7906be8b7303252 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 512220042f151479a6a8b7c743ba83366cb7733caf37164e9c823422ccbf78b0b83f426a7230f559d50bb0ed3d9486c6a6e25f4cf96c4fdcb2c861566c6a73215b6d08995a14569710cf9e54abded1d77fc7722d06fda4557a3a99862e5ce963e1be25336fb42a4629391cde3aacd47ea5f5426e7185c5df27d9136a6df26f54 -A = -4d108217b778694931088bc255d1f69cf8f5a14252156163f948ae58d58f2ed54f518177d668e795474952c930052c1bcfcae11bcd15af168ec2e881e6ddc8de257d0cff90ff3ad409bb3a080d30fdfda99078cc3ad8302a4bdd77de66ac082b40fddb3cb36c75a86bacaf60984a74a0fd575d751ed2830650d85844aba9e3f781b2dc6b515bdb8d9459b083e1aa653ef177de76282e86c99e97dae9c0b050c9e6456a051e7d99adad7be4e4 -B = 7b9079504c635655a588ac360955fceb10cdea5f3de548ca2db681da38c17a70df5798f72cf18691d14a5f400ac69fbb47e64115cf071466c54bc7077a228249209542683ba57791352ef3409f6a947865d8f234ea9d39491b5c001685487b32130bce9aeade97d9537afe3f2f87e8f3315619ef7f215a73cb724f1adca99b90912aeecdc81485c0d00a74387ea99c965118fc6a9af1163e60d1ee6a1eeb12d7c2bb9a54f747a415beb5873d616fa0eafa -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = e36899d83a143c82e19e11494ba18478c0a9497fc89fd83df38adcb6b33918645a416626409a156899c6583ab9a4426438d9c32cac54b78df579cb7b6b1feb3f39ca4a6183743a4b823082896a89f9f1722be842cb2d2ceb605f84a9f9b61cdc7e184593fc2f9ff2994fe6cc4860d255809d04ab47e154eaec9ecc807ceb298 -A = -1422272d9e91a14b38b3e81cbd9411a0cafca23addf4f33c94a1bca70603db879dd8a9c0b95f5986bcb447731219c4f9b32a1e3253b027b7963ce40279dbf4008e526adc0bd7bcb2b533392a105c6e8e1bddfdd2bde7dfa0d2e3b1c6ffa07fea07ecdb9fc828283e93b0ce4861945562478b1a56de32251b7d31f9a2309488f7cbdcc38cd6b1c951570675ef0d61e1df69fed78979dc755f160d93ab5a3e65dc2944d3333cb85aaf87a153a90fa -B = -2424fc1e71286ce3be684a10dd885e4891b52e9009c3021d90ebcaf68b6db81130bdbb74869cbf142e0f44ae72684fc12c85abb5157987428c7812889beecfd7bb43fcac2eb6298ebf1dbcd2e70e4274841c2703b8685df18f6e5bbaa1422004797defc6ba843e77f891bbb46699a863bc1d77c5e3cab809c247e2975e8170da00fd9c8b232abc3fc6b16951ac4e6c96f9503c1ff2d6832ff9c35b2c8aa408645849c577d2b8599ef520da57fe2a9eccfcba6 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 4e8a59476d47ee2cd0217bae2981cf25a2c38e5f5d5c30c2d8bf95856a6e8f42429e565f1836365e550d85207246514624e7ed932d6f5802a50ff9f15d500dd84b27729c1717a3df0f2d6dfd40f0094208445193ba6500ba03fa3f4bdeaf9251aace8729b32ec3215bcfa170575e26265fe523cf44a071470e3b1547901e9227 -A = 452cfc78cb9597e67aacd4ec83e5b473ab8b7a1dcb6097fab37e25d5a6e25c69c73a6c20de0e2a744375bbfe7f612036e69c7a503255d9e17c6ec1dc6cc6f634d4c79bed4764496e5c7c026fdf9408242d3b234195e67a5681e7d7b861f58eb631ddb9aeeb0e5b3ff7a7657a7fde5975b8a9e1f643893bac47debf7918c7ef8f6d7439320dccaf63b80ec9761559078baa8e35d98fb9dc242ba83536eef7ba9901395ef02b19990d8312203df7dc1 -B = 1dc222e7a737e6d97a703fa232defc6c0a4fb2bafd247c8e547b9c474421cacb7692ec98f94be19a5e40269e1f5713d06a6d081a943dbc667bc867e481b99c55e437061cd44c4482649faf870d9347e0252ba9dbe116fb4992dc2c2a0583c1351e9e01e71e9324f5fa942322485bca93c2d95cf304028e68224fed446966073ec7326c93ae326a7a533a36e053437910418bf1761abd9c4c5ab7e6f538e9bf963903e6c80f21a0a38a683e8166e4626a8d8b743f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = a4d5e9fb7f0d75ce41ffecacd2ee1e4d15f82dfd4decf5ab1bee75fb97792d0d574fee60a30b15af80bd38e6a25b1821e61628dbe456e39fea3f8a9ee6ef3d2332412be1500fada0c1728a1457656eb3e9d94c64fb2d0ac89f10f2b9ff57d73207274ae7e8c7538936cb7241615b830cc9011d4363ef88f51c7b3ed503c25179 -A = 13eeef030b3110451fcb1a258434aeb51d3dc805b38c72ef7c79d4b0e18d600e5dd28b552b59f3dda1898367ec7da5dc6d9089a585cf52002eaf8f9ec64b8d3ec50d0bef7dc3faf203c48583ec89757cfeaf888ec4a91470a6b8ec9f26a6b07f3311b4fe972cac2f2ffe47f5c11d2dca87c62680e2229120cba4de9cfce9f7f5c33af8398c07ffabac1675de1845e05a32536329647214e54e5d9216fc0cbf2730898eae19e425688bf184d16bd1d655 -B = -ea324da99252edb03f40100e528d9a5080c43be97fe4b7e03d9563ba48040d328e57d0defd4b7ffa9bef3ca0d2682aefd2a0ffca8566e755b11f2e3c6c1b707f1b9465592aba6181e583babd5c70588e7123361a8ae77d8c398e33f894ee288babea1d7eb63e2f3de469e502b5048417043c5a9a9a3eb921cea1533162e3ce9c79e6caf62bbe7e17b180b72c59b9ef5fe1a001b733d909a8278029fb4a63077ef9b3545f1159ad73dd75030aad599ea4884677e01f -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 2f096fb8fe2156c41ab695956f13f0fd9a084f87ea5f5b1acb6b60c62617b8d7079f4b072223ba18cde474af3942599fe070ddb0ac1a99f42b9506a2648e1b8f6106015aba0bf7a824842403bd3f4ac8b6fc4a9861bf0e8ac59be0322f0495e4b515fd579dfef273160ddf96e453f4ab663e703609c709fb1f016ca919fb26c -A = -4212bf679cc00adb2ca502604b71dd5dab99cdfaf55ae92aee6bcf8b3b6354a384656c09eec6175a95c8cb4591ce118e783d6344525c25e5b356e45802ea3ce1fe764833132e6b7bec434e4481c9cc2986904988bd8da7dc2e31cdc481fd0e359674bbff524124bab1ba4379885a6cfc1b73d953e6d1aa1b938129d74fac9dc597c31383f2f7e02fd995f7065290a9812ba8e205316ad5bac6fc65c6c7310f1a6b033503ebfe85bf6d3851bea1b65b9c15 -B = 7ad83f97f40d5be508cb394c128764532f0aee9a108eb02840ca1c635860b6d751d5f676e8670e2f61466397e1bc68f97ea52d64b335d07aed22f20bb1ed19e3e42e4205d650e6d37714c2f80d39b111577725e3bc7ce75bd7ed5e44f8377d5fc2b97f05c3c1ed5ca1ec90ba3ff7935a25a8acbcb15fe1fc7aeaa1e444cc2f06c1e6711721d24b8969d465e4958cb87924b3e0fe99ccb371009b5b15747bf6dd5d0fb73b8fdf58d955c8773a55424a34c741406f6f904 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 909626a69c803e9acdca97c56781eb672d6fb31430a53b853f467ca26d4ae96c182d71c0212894b776c88e773acbe9602e3ca56584c39b5947724290def7dbf04c6853a108c1282def95dbd5bdc015b68daeea0ee959b35bc5af98a4ae4cc7486e627bc9432bd009b21ee9af3085f074a3ae1bca879e321018e991e7898f2897 -A = -14eb8e28dd04a159c576eb10578c24fad9eedd3d8b7560b681002a54a4bce2167de05cd061338f63c50b86327a79595a2dbfc1d3f4e76aabaf88cfedb69faf5148c61f8cfb2130511a3bf4a17d846ededd4c08f3b635182dff1854e8c4c48007af028e06f01235fc2becdb32adcb9e2058dcf8f8655624bed9915faa06be972282cfbf8530bc0cf2de5b2057df32e4a6cbc3c772feea0a511cfe3408a6dab0e2714fc4cf15602ba0da03bf0016f1f3f5ddfe1 -B = -388da160568aef9f82fc16f48a22e8d7aeac99121cfac9b748c815e5d3a823b673ddcd20c1168f98ba204df5e52535f61b224fc0374092f8c834321949fa0a812b5e65c492fd9fe8246b74143a943bcdbeba16024e311d673357a3dd3eaef9ae3a72bb06e03e34e091cbe5b6a9eb9fa3d7f36c03baa5c3e242f2c186b58db5dddbd73f6aa54aae027529b8f8f0a536b9b283ab08247b9977a2ac2d0d9f162ad03a2fe247d2c589b1a2d14b5f90d5b9c0a95918ea956e261b -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 128e8844a2f04704a4a60cd33e85cb7ad373ff683abd167894a35a1daf947f504c0abd7a614e293ce10797a5330147c88c4d5e1dad1bdbeaf74095e3f5a515f2af68b7bc11ee1f53b493133905b654318dcfe73118ef1931eac47deb6c4958406b704ce027d9b027803eb8e639b52d5983094b8ff4b54e86a7dc6ea169ff1af4 -A = 75e6b045aa44dd9b8f4b434dd4bb1346fcf558a5e96b00fef9b6cfaca72fe8b1672edc2a64beee8b959683b1861138b297629b44a0caec6bad2ac05665728379cffaf66a129f0ba40aab7c6b1c3fbdabaabc87ed3dd580ba80ec7ee765e9a8fbe845c0d207eee7a1a3a0c39650c75ccb6bcdae2e0d5149991dc3bf899ae9b7626a2baa17b168b260d82fba84a12f10e09234035e08b730cfc230f0d2651c03e34d4952fca6409b5c6ea5d8791c90466bdc4adf2 -B = 102fc193633b0e60a48dcc17aa76f3e52cbbd1012f179736a0ba7a102f8dfadaf434063b0ed1b1528a018b349eaf192fe62f868b538cddd7e8e6fd98b93147727d58561517b2836e4a373bb31fc8d5e42d16126ed80b880c1a37940c138fc1f7255ee0b7fd39b1b799c34e5178580cdc076ef3fbff65fdff7497398fb1cac75e5c09cc7df1168a20f88a16e7b3ac78091a90f1169bccd48c0d06b4707ab79b741a168deae5ced5d48bb5f5dd3f465e43c82b9db7edab24569b2 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 9aa9699d1e5d2c6acb21e31890c1899f30a925b834adb5b8bc8cce83a1718944a2c90faa71b34379a21340457478c0c43121dbd65d62e290eda2ba6230bce4e6f18555a1380c7c95c1700793157f7c1cbabeb09460ca28dc596bb17851ab2ba6dc6bf311ea69bdb7fa8eb78df74adf171d4677a154b8536f8104d919bdd58648 -A = 157fb9e1b38f288db78a1a0e22fdd9f48a59779487a9ada2774a094d34536b85993e7b9ab6e24f081c4cdfb64a82271100a054169e4f1c24e3957ae9aa8300e85eb2a45a6d5987eed4f0fba6fe8557cbf6128e018c5f9df028131bbba6c544b2c6312aeddc71405f0e4ce648fbab9e5d51685949408e4ccbe06fe501a36fc13ee65c31f062313135054b7679eef45964c77f5a1556ac09b11c496d0ba8c6057e283bdaebb4e6d9e5c557d975745f9f98a288d5bbe4 -B = -82cb6334479bd997c771e894cac1ead87dcbaf8f5006be5c70ad48ef94303137bdc45f261af91a201b276a17d884a56ff27af7dc06cc5b7b9c94f7c4d4a36f68f8d309c477b4969a6e7cd1b2afab9deec06555cb753d8a0eb00965359ef865a84bfa87b815a42b2050e1635d5ae5e3743c007bd79e820aa37a968702a960fafbddecebe63f022553cadd7a4d4fb27b4dcb981e8b490e80bbbf13af8c4412d158775db71f5fbc9986e7b8a8f9299574abf7bdf9ce7544e8c4e85bc -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 46e401989fbcde9d830dc6e3c42768999f153d44d270d4805c5beefb470bc1e82706aa7173b359763c5e15d146eca91a32a36f0a80802871933cc7f2ed15a5472988849a2d2f57543345b531538db57ab9bcbfbe787efb0a82e61baa505aad628df5f9e881dababb35bc2decff267eaed3d3671757ae1764ec5163b792b4db3a -A = -590c16ea2cf7fa7f63b5cf74804333f22fd2d0e1da7d226da8425abad2b39a4672fcebcf5cc15d220b0ecfeec09665e682fff0140f16889f7a6ade9ec11aae3fa3a369b3fc133babe52e42b7a8bb9a24777521f4d9e0efe7d7977dced9e40784c24d2c6056b3b668ada7856da71af73d2dd33d2e481ddf40999d86a6e236d0d73f31a67c52cc8b38203bb2840c0b92c2612ffe5fdb6be87f9a787d70b3dd506f9a63d144db3417495f0a48523c812d14a89710d95bc6 -B = 5a2865cf2254710a1a51ee3056b0c1f6c5f77d22d7aa8f939e6f48ecec529a169e630c554bbe682a8c4de9ce4daca77a278d7e752cb678141ddefa75ba42e661885a82ab55d699414ffeb75802cb8f4e7583bec8a7ab58803b378bb60fd46f476ea490c9aaba568ec17f3a6afdd6f20ec54a512f7aaf62d2f941e35b4b72dea77095e863dcb38bcaf8777707c1dd437ef2ac6b6a8b2b832f80ad2a6d6f279c053d02058b1a657a1cf5b6b269e15d29087b0cfc0c2d4c3fbf32a167a3 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 1c9649f4540556ae82ffd71b2c71ea8588aeb845c50dab595db9f8faa01a26c809d30d8433b6c0add465e164cda2b6723c942ee87241eb7baf9944cae08babd8e22a0eaf35c09e9efdfb9f8bfa65d53ee6eb23fcbe1d12a66ae05e7592ed788b231b000f895d098a24febcfa4372d249575926a5faf966072f29a62a401ec51c -A = -1bc9ae5fc2f6a3f1274584bac1e145f02c5e8c4779f4df15e98dd34344c988c1437ee4428485a09090d81b18606a6ea5c1b9136872ab5b37373fbffbb5b3fa8fbeca1e112b9f1643658c2f38b9548cd8f0f271779ce0acad403177057ea0a2af2e7435109879941fbf463488a2522b831b95c1cff21d2d816d70c25156369dbcf04a0e28e1d746afb8a77713703fefa512816fe73e203bb4c3428efe09b946b750199bd7a03d30feb90230c219a103ad4528cbe0de1e5f6 -B = -39cae179d955049f830867d4115d3bae25127c945b1fa0c16fa850e8fd77c1b3b9b7916b9983c1659b7cee77b7dc72abfff1c56681b7931c5e58cfe4f1bf0168ae32df0df8f652223885717a98f858a497b1a4be62a2215c39316c34451b0d957791f49139921d9ac8041899b8fdd5d3d443547a26ddf5748147e4c3e93f5043ede42f38a9baa628df65d3d6148ac2ce182056700f0f94029be05d3ea3a218b40f65a87b4baf097fce107c080de24880259f1046175db1297016af76d94 -M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 - -ModMul = 9fcf6a47addfa336557749821a88ccd2573a5ce2c3094a17d9a29b33e043bea165499e89fd2c939f17a670694aff05e9af46836b62c96e597c83681092d63ab9d6e22751aa8fd4b9ea94a90a373876ef0f6514304a495edb5ca1795c9ade7965c70f9aa92f8ea460ccb670e9a62c81e9c -A = 71b93fbad39b1c2755f2051ff7d532d59c985756410d58aed3947d6ae737ace5aadc35e7e0d29c684b9d4bec9c0fa277996bb30230f70431cb7b905 -B = 167be8381a3392dd4df62e150025e13b388bf366922ba8632614928922cc290772135857d1b5234d51c27862cb1a055c1b86260b6ec -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8e2ba940fc5165c6c5f7f4cb55cd89d1d5f59e90e78730bd66fb120a814514784879dc43ad4f355030ddb3486a59bc34b601474978a94ddbceafdc0ee23cb18708bdbd824d37cc32577802ac6057fef29a71f168e816309fc80cc46f251e7289c6a57fd222d5868263360af63dd73e7c8b1dd6b3f3b6939849580b9231940a4d -A = 1220ac4bde4feca135268550ddc79d8b05ff72f483b39f77436f348c4f5360c22c598f7dfb76697bf6d2ae86c68e90748b8b729b25f932b2e5fd33f3b5 -B = -bfee56cd412318cd62e7b6cc49217345d3a94e7fbf6fa19053fa685efbc0f8b320b7e43883189396781c49371dffe7d126c032d1ae4b6 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8e2ba940fc5165c6c5f7bcac0e449b64801e75134a390f120acc58cbee43888f50d07f7aa6dc2b33643c025cf745434d20eb1aeda8fcee5fa3fa5baf10d67c21390297857aa50bbcc4a29a6b10885f97fea60f1b88fc72512c111b938142ee8d67545efe386622162e8fd50418b09769b8c22efe54fdacd652580d609f0528bf -A = -7bc53f6f2e78628678ebc8e35ae4905caeec61acca5c64fdf595689cf005bde2265cd43172802fc133dafd933d7b48def44256868d202727a4aa6c0cde66 -B = 74147c93e729707111d0d531b1c135453f3e59f63a7e082b43dceb8b16cc5debdb6d7c0ce0c00ec9b5ca51e7673e411c3cab34938124db6a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 43c47d7e319c32a758360dd726a1d91e2cf5c57f73cdf9ad2040e61a9c282a2962d96d300e04288461eb1ed37df19e6b88f104a250f9885898740f6487b081515314e0a217df2d4345d3cf81eabb2bfb346b634b9c251624748f6e9407cb677aff4c53fcf42cc027de267e6ec011e14bc7f3bc6666f693d21 -A = -1e6ce0b44105047d0da0eca7b936980267db41d41319dd5315889fe8fa2329023d7cf54f71ee179b5bfedf442cdad1920d311966f7175cbb953bb42ee105393 -B = -23a330c7e06cdef4b6b121d15a9c0bc774eb5e432e72d04c5f03a0c588e55e010b61f57c03c51edb1211685d8dfd2a35393091fd0e3ad2304fb -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 768293c84c431b9c8dc6e538ca3f856c60ae5e1aaf42325865418b7bed16c7fc2589968319cf41cb370657c8edc7b969de10e0566b64ec796470b630e22477e7aafb38e99b6012f100c9d23d5517d486e3cab1fc60c1568c0228c9b55d2d77d23b1351fe37ad4fbf9c07f29330a539de4a32709d043dfc9e21aa1a -A = 6bbaeec78b6a41818b7eec42fa3be7d639dfd86fbace2bc14e0369dba6dd3f04ede8b808743d809f43f70f1146dfdb1d649546441919e27f1f7a9760da4a3b152 -B = 1199dc2f52868a0cf440f6666b576541c7aec1e9cee14c1d22010ab0f53fe8bbf3029c639ff78d89dce82de85fd8eda4e67395d435df60158623c5 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8e2b90afbdafa02ce68d537ae807b4e7f3e05a66b20b84cff309941fc3150f99d083841ddaf6f19f5a76886ad5d853c73051a0457e95eeb0fe3776a084a027ee77d14f3825713a59622ea163a679cff904db33bf6ab23b06eb4b31f4e34fb122c8c170321164439db783e7bec1c265eed33f33bd9cb6d1611c00aa18a9b4b90d -A = 1c4821515167f7073d4b7cfa318ead1da1131499c12497447846caa84176a9d4af576fe549fd8b0f77bf8dbebf6c395f84dffd40400101bf28b1dda0bbdcc5da255e -B = -de60cd639044e863c6a49c73213dbc2ca84e4225aefa5f880e829f2d9cb48ae92e3f2680c462ac697dc34da38f65fcdc1b4d8c3c99e8cbe29660b539 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 33e8e8e193b4b99d8bb382c29c1fc5403190d7654f43cd77e28d1bf77bc3a728dde9de9a89c6522ebc7222d25f46833fd1753a44275b04485c77b675d816090280b3541ca61bfa33921a79f7286830131d6eba13acc46cc2c449b3a359f1cb49d67a4d0cc1245f3f8b59b1684aa0c3ff1c928b8e880a3375ed811dffc991fd1d -A = -50ff3e00feeb2efc6df6387d6409a622b7a8297a717b8d94d0dc41c6ec6f29a8455c3580019349660b31dea1e4f66b74147de93535e671c853b604ba06a9b62d34646c -B = 49ff858c7081392defc3ba12ea8869fd61188ff15d9339be72657b00530b851de53b1fcbe16034816e73251fe1ec97bcecd8bccc470373974287ca328af -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2c88dc40414969e8b614bf8db05fbc38fb2b7ce144d7e707f9f8eca40ae2309c1fc67e713a8da5fbb20e808ad20aeb369cb72a77fd285e38a7895ec0fc795ade4ef1f1680f3a3b3cee4569cc9d5e699984daab3385815d2e515ba5d67d21dd1defc12ca81bc8ea645f8f8d103b4a0a9cdc92eb50690c07a037df274bbd5217e4 -A = -167ee0fa8e5d8b569d7848b068df06f6baed80f6fa6a442f9d11d9712622b512249b92c7ccb821ac751fe4ec0a7a47e04ea5571c7cb45a7985749ecdd87f0c0faea01d232 -B = -2207fd8dbf2b8e9a5e3cc515479cde241dd3671803f9fbf7859459ac66705be055fa759c85631ed2a61139657eee7eb08fd963b49e33666e60b7e75dd26b5d -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 674885ca3ef617a53eaedb9564cf96bcde131760ac541a81f4b25c174a6fe1444c2c206f7171e343e1bb43f81610162994c497419e75aaa25b664c122ed2b27640b45bf646fc5da1703fbf1cc66e10a3c306eb69ae5f937081a1a18dfc8db376ea18f4c1c499109b0cf8806eb32cb1f28985da790047bd7b32c1f67bffb9761 -A = 413cbcbbb5851a4ae12555801f7f80ccd888bb82ef1b5c31b99e1901d7e0ab91ee489c84044bc21fa2010f11aac21d0531fac09feb482fda579cb9f224c3149dd6249b0225a -B = 1b6bfea70f1d80350eeb45f9a5cebda954d72cf5cd27a299ef5a42e1ed0b50a541d1657b70e50b0cab69b22e31d0944fd735957b1ff764865d9385af302bb802b -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8d74ba5fdc67733ced4d468f6eb6ec4c1ebd79c97682c1d4daa06105788ed9c5144992e555d903804d7ed0dd9b29ef2648568ab7ff462a03e0bceb5482485afc3b91448fcfeba435dc587db6f3a022428d37fa0e85392d0e48e7d4ed6b21253084e653da8175587b3b709e28426cddfec8d9dc582d4ac2f3d540305c0fe17327 -A = 17c0b7f0e2cdf316e4d32f040e26d41dbde1e6689d98f0652da1c380daf5dfeb6a511b72d82f1b32d3852e9aa2f594be10776a8fc89a8a35c160e8e41b42a06a342fa1c309fd82 -B = -d7b7701340c5a358455ca5fa314ad83860d9f765978ff652d7f542de2e123bb976930b8fe84b9608648324450d8ed2bac4e44f2fc71711ae813cd8793af8d3796e8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 57e60f79b4e156ccec4c253e70df8d86e4aef326150d612a5ac4dc285761e88ede412d28d9dfa5a6f5c073d3c91a65ba9c86067d81f296935f0d0ebd2af82e7f6b5b336422429cc3b8427fd8d3f5a6fe936f4208362632093bdd3cec1aa8f4b176d260f605caf4a12cc011f3d1b76135ac2507346674e41673eb16c0f55d8010 -A = -4f1568c207a9ec970b5c26f068f3cc8019e8cb483525d251cd2919b368d072ac8f40017a19fc7437cf88e927c9e7d6f539ee84865f0af24be0d6d98fb33d74e3e0d28020c00bcd61 -B = 723db98a78f42aa45496f31cf78695583526d25e167da48ec310e447ad3540be2636813a2c2f7b8c622795ac451992e91bb8e43e5737f0dd95623282e729d815b08ed8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 237eb5726e2c628a515104bafd44348dbf099569815784eca5d6a415d3c12421c8c70fee23d6d82f7b5b136b70ffed3b6d9e98cb47854e79239d96c26f2ec955e4ea8dabc29a1b0765c9b7af6ef09ca673d1ee21c680e4b8cfebf47bbc74c993d017ead6cb6f3319ce4de9e9765cdb3ed8fcc57a1b153327e1a6a965e5dfa89 -A = -1fd1f634685eb1470dd9080529a891253a28a0b31e15c662733e20d43fc4cd71f4cfe83c3774adf8293a0fc3bd806d0b31b61c6ed0b4414ccdb91e2994e22797e5771c63defcc0887f1 -B = -3ec0478afdf54c949a097ca411be41f931acb750ef4f0ce97d0f0fc77cf15970cfbe24b170aa332de04836b7a0e6c5d456814182d27c8310d5fb662a818bc421587d95fc5 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2f1d500443fc4f4b86e7ec93e4d0dfd3faabda35a6dd31445021928373be14c37fec369ce80ebcb77aff2151b7ea94d21592da1823ebfa0af196f286d7a69ea54799573bdcd4d09ca4f33b8a3a93b35de5ff7f65099d59367914f1c79440b471ced6773b0802bd8ca99cf531b62892eb1e78d67f8210592208859b0aa1754b14 -A = 572de2984fe2ed0d5ebb5bc3f62b197fd592795d91cb16b48a0c898991ee3e884e5870b92405f248036ef9b3898c5ee6100a09ede5a48bf7edf3a067e4fc77e7e6bf6a6e3d4f538e3d66f -B = 12c379402b18a34dc8b80c0dcd25be16c99d6f76d5d64b6050b90910cce594bc022794640735710c7ded857ebd44fe5b2e51574a2296f7d7a61b59c0123051bf2ba4a168cf8f -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4001c734e1391a88640007893f167eb79ef61e4717d5eb14b8d80c25ed59c753be63fc8e54bdaded22c9c7d3e49753eb49efa010439807dba0d90ec4f9b498aa97f109af542bb41922936223213ddedac4d0fad8f1446498f4228b758aafdf1d9692f59029c76ca2832125ba50e811cb95f2b982a7a4d87b4726e6dd8b1963fe -A = 16792909716b581a936287d0a8550a1f3e840935f0f3ddca75aa32e3489269b078fd19a16f8d6b2326eebaf46da76e90890c0ead3b35689bfda8c1ead17a4f672588f982cfd3da2c2b9bdad9 -B = -95ab2c47f85001aa852d6999f29644a6a55f9e4e12bf905f911f90d29cd1e4fa4fc9d1a2aa6c215bcb5c5643561499aab8f2678fdc5fa9c6ec138aeb2d62f635c45f239e46b0fa -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 1bfad44b58d3f8bc987116d4cc7ac98f89f838a8712d81d726189e9e1469cf46fe04675dc0b82e6e556b02c350ef4e30ec6203c7f1df937ea80f435af7c10f48538fe7755ba78993f304e64ca0d783b0f46f61bd14fd3fd30768f233c59018ce911a94b495f58eb96438e416ca3c7eba5b1bca9dea5a770c1d2d9f2f62f821e5 -A = -78a6a6ef40e443c52036e75f0b35938d632bd45aebf45a1fff5c2e1b6f601a57382b9a82c3e8b2984e643eb1570cd83f3a6be6daac567ddf9f37bd96785662bc3cfee6f47503d239c77781a8df -B = 4920f870cf9f371050e64a419ebe07ac92dd3525b41e8ecf6939a267e1ba853d54862dfc95dd21b3526eb0a0a7a7f8fb67df2e9472dbec81e15cb13266257177c5f2b92fced4cea5d -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6b0b84505907a5ca37abeff9a5ba169975792c69b5751d9845c0f09dea833fb679c8dfbf3895bc470529e0cc736c9b4a0d08b75d709a1d04525ae583c5ba082d3bca1355055c7bb674aa1b92689cfdec4dbac84a96e81c855280e417f60e7e4931ef4f428420c0b85d2cd11c1030a47788d6ee6af0a76b5364fcf23b270e9d4f -A = -143d843e3b12431fa0d873815a757a214cf731c298db61ab13cb87fe78b0a6184bd1fdcfec0c7661b10775b4ee2c815dede0ed497977c9ec5154f7b24a8a786501ddb8dd257bea51b9fd9401ff760 -B = -25d4da7b64f439987eacbde66abadf0da7c1653c1c1c6d9b2092351fbc714a20d2d7ad8093209da371150b69b3602480595533ecc1f3c5005a8ead10732272246d8cdfbab87c49e65223 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6bce40524278ce242b0b5292d27751a3dc414f962d9c1cacb45fa3ee693ac6890d2ff1647abe578c40ea8d4b326a2e0e2fa7cdec28fe2da089338b5fed91c4277cc5be37537eec2f17edbf48a45fbe38f15c58c3e733d408d001262dbd40c9d246c323e7978df4fb7207aa9270a12921743cee2a483e7e71b221b09a6b2c667a -A = 402671b0cfe14655bc650bd35dd0c36ce7f65de274a0cc4b708c6f6c3e84c2125ab2430e702421904950b29aa8a03b049910305127890457cd0cc97a3e05df67f29d28b0452969986959df02f59d207 -B = 1648c29205f19fe4c646eb62e8ae9b65260c2cb8424a526423c6bc04ed55870cefef9b8ba808f8ed2e1ab170e2e411f68b934abb1a22776969f79f9420f8bcbef28417582942e26646af60a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 40db38dcdc201648da555f1062bbbb92c632c29b66902eabf90d98dec69ab3f3b28e60cad1571e7246f4c9e6aa62ad26a6d0bc08598c7a8571fa830cae4c2875c5c95a59f3295f998681edba7749b7e38cbece8887a7823b4752165e1a897e638836d408f439f009d0fb6c196e83e83ca3289d2bd0f0eb36b721331e4f9f80fd -A = 14361ace8ec5223bf0165b78913b77ef921b7089bb5e28891d120bd3db6513ddc90404a4e6cd027f9b51fbc02e80d376d59e1f2b043954199ef8218bf26cacdc5e749f668ad3b4ab35cd796f94c06307e6 -B = -851a39d8b0101fdb22ea9e367286e572dd132b8a77a6a14dd0e995131467aee898230f37dc6224e35bed2eaf459aae579181a161450bd7ebe6b62ea7154a8a0ab590ca4a6c2f05531c4e24650 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4b085796665458b798f824d1c1a88c23ecca456fb88713b433228ca8735141a616633ccec4bc53ea4f6e0c74e4aab6fece2e4cc4c4efb479638cf54caf55d4addf75908076f5fb487ed00d540e5b984acb8f81cae3ef51db926a06382a288092b352793de721c23c371fd0ce7a789486b2e8b867d35f47b5daac2d339d22dbde -A = -511565611538828ff7dbc45c273fe46f4f5105d41ccf5dd343b41e9dc579429e56a9cefc54657ef0422960d1375b72411a5cc93ffa323455e006e242580358d6cfb641f46b9c36fa777a613b17dd4a187454 -B = 4f22597947638b9a9e9b9b7c2a8d37f77259f1bb1c7db65003b6e1a1c807469c84c89a75b80bbe0324fc3aeefaedc6ad9c0d9e470dac9c30bc48f6abbbdce9547ad7624f0ce9ff3cb6be23e47bc7 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2b90a57349ea94ea818207fe15c164f9d3530c7cdffcae178557274552f79c4ab56acd78033a570bd6c3e45789704ef0b0ef586594fe4cae3ccfbf9ceef46e769589b084adcee3ef8345375b7103232465b991273df724964248737d5eccbac558e35e4190112571d3e7c291baa7aa8b1800121bd573b8419f627c0091e1bba8 -A = -170cc62ad57094d307ce1b317ae5e825c2f2e317ad6060437afa105501caea00dc9a86af8729e2f3c3a854387dc3ba368c0a84aab1a527ab34fe27b0a69bc71c728cca87be728457c65eea7d7538ef3aa282615 -B = -3d9da1377a88f647de57ade46dc7caf71b4f42bbfaa5e77f16cfcc90f00b5d3e9e9d82355104c7cd0db4c1dac0496be3aa35706cfc0a30a1329755faa439694e8e9b41fba8f1ebb46140818c7008e27 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4cd4da762c7576d582572d3427abc4b4297f740705fc14a32b46347541b152d0d1e3a11f27213badcea1e2009e34a63350c7a59e4d43654b28298d2757d6b54c4d82f580e98de4230cd119ba350416452cd4b8adff29b9f35ae0c533f666cfed716838e2b91941dfbea8d6a978a369d5f27554ef411f15e5a89850655d7f3f5a -A = 4f4a28af27b926d8ac347503d6ac0bfec388a6c0b38a577501c3ca4aa709c69601824ddeb5eba4d9e437a97f3e4477e1487d5ce7b4a35b90fb863657a5b2d901bb8c3c838db40b89b495ee9875e8eee607d7b8013 -B = 13ca192603bc8b2da29dae67159e4f8d32f351a503434ed9e4e24f74abb5908ef7da80781c71b1a5ce64fefd13a16cc1eab05a370bfba2a97e6cf90cfe98d3a487ba72dde0762c36c10e1da175f1c1b5fc -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3812e9e835ae355fdf328b29ed8b86dc3f6895e379b8b5d65a5de41eab5fb20ad3e2290c8ca69f9500248ff883d9715f59d0db6257d13c5cd612211bb1fb99867161daffc77968bdffc1fe48bcde0fcce02ca93975b3cd9e93b56974ab4beb59582c3d0ef2a65957f701549f8bf858de0c5bc98af3e5722f1450de391876a2d9 -A = 14ca6101af00d67139b985ac9f149accc260336237dd2dee802b5cc6e506e217b74c1a007ec10c20012f071ddad34e7407012669109ec1f385566ff04cf1a1ab7562353c0af1ba1be0baaef920a188c60db27970f64d -B = -94b683326e9de19e414f653aeb2cb4bd7b17e76a23de6a4d91c43d717a35e08f2155b444a9549dfd01a8aec4dc901ea9f629f16bafd2c84828b12d2f63dc154323eb2d54938895ec4c9efbcaaede274fd4ab -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 5ad7411cef0581b2e675d03b0ecb9969102a283eba5e779bdcbb7646d94e843083a07269c932d18b973b57abe54eaaad0aa76cf7b61f30505a263bc95aa063efb264ae829eb1d1d5f7d380a0b4db59839de9ae6230ba51901e71b3e3d59e8c34a79678e751c8b7ab139123bdb2f04d90a18ed81d2046ae86da1a73c8dae4fc4f -A = -469f61cbff01f0e4124ba69a860ec6dbc75cd758dd8ac7cbfed97645b16488a329adee62d1a66e90ee4212569d56d58b61676262f49dcb68296bbe5d8e23853e3fefe8a304710cea568ca65c183531a992ec5b4d82e226 -B = 4a0d48e31cb8c24a3b2c9c95fd19edbe46823032ef4c97fe65d0a30d5c2cad7a4fbbe89e0ebc9940ed9f9ccb8ab18bac269759a9740a7985809d0f38259e680f0703febe7fa012d1ded47f0cace4a133f59a721 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2b2953981db406ebc544c39dfeb08a8b089064533221536c7fa2bf2a7a0d3a1192859b7dc0ea5036eeab5aa371e3e0070c3980433adb3e3a5202ff257bb546bcb9550423201a35501fd717ed4c0016eb3a675ed399340bac7f058a04e69c1774590fe747ffb9c27e78ba50fcee30ce533a1659fc49dc080a60f21357a6265d24 -A = -122621d97f42b65b060c84df3f0c0da097b5e240731b77a37bb9471e7e398b242db6f1b5e25062a9bed702860ccf6aaf386c1d6fcf60fc31b8c190d3486949c5772b9e621b863a7cbf29449ddd68b7e0c21e669492e58e94a -B = -33978406dd30ec2b192c416e422428683deac210017cac9e4355e8446d6969295b0fbaa8cabc92c1fc0068da70efa047f938a419bac160ed6f794a9f69f53a88648c9725610d5f309b652f5462bd3011cf68ea859b -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2104dfef151526e072c09a4a277eb981a035379de3b1a55a88cb060681706f26131c388f5572c5646826b119c85ed450207f32733487e3c4e1e9d701a65058c4b4ef0cd1db090495643038229ed177b54695ac32110619038f1c1cece14faa693d88476e3d70329b0084d0ba5d547bbaa5b59ba1ce1fad5aa2f1c11a75bc7c0 -A = 7b79e6f1330fefffaf8521089c3348593e40ab7e8d4da3d4346571b43b12740958336580afd13619be3dc2d42eefd9e30599405da3e32e7f3a5655ece8b77a367059668021aa092460de75e627526da08e6206b0f8f539ef40e -B = 156e234931907c0c0970c1fe6bd4b24225ed94d5f5b1be4693c8e141e9a6032425b4a47b6eac6265afbeb9d796eb230efa707d5ac4a73808225181cf814b319142e9d175ac461c75e6d479bb6bea53954bb981062eb16 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2a392c5fc96c29df2f5ae9eaf76e7d981dc1e2f3b47b43a98eaf556a9465ae8727c622188123c64658053ec50c25e54ac5c6c8bc279b134d326e911f14c873357647866eccb4f9038ed0cef5082c2058ebd71e1619f7c8f8f2fb80871ebbca3fbfb7845bd855d307d2efd853f1bfd467fbe030862f165e53a9cfa633d0d3fa23 -A = 1e0430e7cf15173d00592037e83e717c90d7dab4f54a5b2f0f5772762fb5f56bc0b2a53ec1bc3b960afc35e7b043f9d85d0af6c29288486af3e186e52bae6300b58917647231b40a12648cc8c020a797683a9bd7ff34eb6d41b928 -B = -e08372fc766eba6e0ef55a9149d700b503e2e3f978c8a397912e2735d5bcff69c461561ac0822c44160c7c1bbf722df421b74beada57462ac54a9bdcdb42d6a27b86413036ed2282abf62800fb2518a32a4a135bc948053 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2608f68632ef14dc3979725c8cf1a0db10a1651f17d91247edfae9935b53f6364d233b030eb99871a87b7bd876ab2cfd5a643387a7af9d337e81770db04a14f4f8dbda2cff604838c9af9a31e8dccf9277d453176589ba33abf77855b9501e63370b2e6cd22831e1e70ff1815302c0a026c70042957d08e74dfaff940a91a7b9 -A = -5d3568858c05a15bc9777af949eb01d33dfdba58439fb3f7af2ba792efe8e78b16d7fbc2a303a4c4c4be7c9d43f57405e88be54d6ab55268a4739945ef582921d2877019659dadbc76e0939f4b2cfbc91e5356ba2ed531526ed5b9b3 -B = 47f81f65ea1af04f702757c02a175a299b23cd8ad551fdb67020c50cbb4110b5371dc5790b12484e9ce647eeb24c0220a5e62aaec3461a9dcdaf1a22814b6f22d66372cc5ee31944bef33469f905458c172ec7871d9dc9c301 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 5735109bd21d31b5f54e9221bbed78c54cf387e39c13d31557e8173e173f786b2d2f1acf3966c3bf4552fe9bc802d0868a5a7632404cb91609a7a45fe0fb83fea8d83b0319666c1b0ac520169c15be708343359447f2fd37960c1e96d32799ac9394e839b391f59dd347acfb79bcc4e34e76490880d163ac97ee69e3a0a6e68f -A = -175011349a0a1ceba11756bd528f2bd631c106e709aab223032d08d52d7d6724e8c5b055b6f97b48261f4860eae297badc1214cdae9b2500a7a47b4b777dd7b8f1006757754ff1143b637d2a3adc555f38eafbd5478cde0b04e5f46d3f0 -B = -2aa7f75d6801b04ea9f690aa0c5448906595fd28b53775059c01efe54b463f1d87c9fb4b39cb038e770f99bb995a2118b86ff8d004bd964e958c2af82becf362fb0b927c671cc3bd7185990419d26a827a2d81bbc0126e1029556 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3b4ad19b75e1301d19b57ba9b68e0666c28c7c5c99df1d5fbbe0685dc1d3489ff39c919222719c5d8b7ce2d7ff967730d776a02b36a86064ed66a02011bab82eb575390f85f0104715f6e4954a1bb28518450182a8ef58af35d00e2fe417f07ba25dd9c85e00c3451082becd22e3aa0c9bcedaa96e6423c7df6c375b4c799c65 -A = 58e1ce4a9b512eb0632b02cf1207936d6707b802140540fbcbbdd712e5ac1426b4f36e74a9a9ddc812e572855d4fe4fca8a0de6644226f5698fb46a5f2a479dfc8b588aa8e02ddb15acdc79ed3d17143e290f1317274f425b869df54a4807 -B = 14e341cbb5f5a7f3b4dd864172b82ceed2887fcf20aae7d0598b3d8afafd2f10c27bc7456c1488abb570be3df04f43d892dc6a8dbe7621f55bccb0ee3acb1ade989a510b4e0cbe29b6b93968f323f0016d87944c908824d249769f8b -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7fe0bbbccad6032069b1a335b3f2dac16089051cd9321f903181fad23be6853e2d209958e8c48e008be94a62c6206b34b4e994ca08b8f24a2df0e6394ea65b3b7aadb3bc43d04dc9d35a77e673c4476dedefd4568b4ade5d16f9d89486f3d5ed0566b1eb428cb0b688f10fe3901037744f278385754fca481f937cb630f60308 -A = 1cc0e3ed58090db55063c9ba11401636f89262d6ec096d361f448496e05181c5f7f2604333f26d511c13534618e90637adc807d622097f7eabfc03266135cb626e1bad20997e72da71bf2b3f65a4973dc27d2a594b1fd96b7bf7ec14b9e4b983 -B = -87871b2058d33cb67d83b6a56ab27839c6a6c771bd94e55f200a1257f2c737e39c4a0403fa410ea64e8f442d300df1c19c2f03d07fb74d94f86d26814fca23d4cd2cd3718252cf0cd8a0e36726f6e68827a1dab6bbb1d23b884381c702 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 35d7ac5cbc7e6c262ffa41be168b02a3bde9e112c512d1f68421d705ea34461ce3e0dafde67f44d44cf31d91b38d4d5f2fbf8c6c6a44ec3ed0298dd58f3d45c04346c11e57229dc3d2cdfea02c802732d9a811d7be5e81094d72172cd04caaa3c9d55a951c09f454f42add6e89e2d8a98e124aac86379df377606e7af9bc6baa -A = -4ee01518f6581c560a186fa05c6f4bc26809c4822cc74a0bb74d5a6b0a368aa9bd0108f26113443422b8c589084ad49f919a9e7821d99127bb210670e732b7cdf610e464e300a39d3dfa7c82f90cf00ce329bc6763d7b1d4224a020095112fefa7 -B = 72dc8973f7af7122a05c90df190bbf1e39abca908c197590dc7ac41fd0712f48f838ca62a72a177a293ee6b2afa7a10c21e7993347c3df4f161a5641ff62ba123999bf1eabef29ec0d33ed0919818f4b7c35b5f41e654759fc9abdc0f80e7 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 5d83a9b34631dd6c63c05a0c012adf97b4d0f20f61907e1c2145330211e9a7e38128517b058e0a85e993c385068d1cec768deb814bea1323dbd333de091ad2cad72431f20c1e70ff7e1b119768ba44e14292c38b88dae7e55ac9e10ff98e9bcd5f0ac05af499196b4be0c6222d1a63227ee895fa6a8221a4a182a1323183cd7f -A = -17b3e0c9288be15fda58c8fd228216bc466731d631218a7ddf1d2c9cc858c0219cb0757d3b680bca1b1964eb15031b5b9d761a8bcbd160db89be339067a2ea35e1ac3cfed701912a17ef9ea03999d92e3592e893183ddc05cbb98a656983b54590c72 -B = -269f96a4634eb37cf8a6608408128587ba45958405a29827d0d03d34816fcb1a2297f1319485439d3e8594532545086efbe4d21d31d30e2daf09b74fa8cb27df54e8f9f993630cd9a292c977eee70887158bd3fa3cfef321ef900a0598ac8cea -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7fc1c65eade94d9de7440eb8dfaecf1004905135efd4f98257c3295b1e76ccf1e2ab6808d158d360b7419c6210c50efe960610973d9ae855c72ec0e81d423e5863c80b542ad455700d2d0dee5fc403dc01eab460c24687401cf6a3179642e59f2a30268df95fa80dcdac230702352bbf6b60acb9ff5d45c5b09a3403b954d173 -A = 7906bd8d3bebb1303c1df1fea0b2503b0abe9c69b4f4f5bd01eec9e314788cb7d44b93428adbcef570477e8ecac2a64822e481bdf520fc381e1bb0b2cdae2fe94e484cef5236dd524e4dc364b72f4c06d57f29dd3c5079e532b1ab1e71dd6a65b3362df -B = 1479ef2807b9c23c094d0416f513894cc92e023b134f44a5333360dbbe98b8161ab899302f4fa11b470b97dca0c4e8ab7ae47e5fd0962834e6cc1763618193f4ee027f667368da580c623080de137b5869c3081128e6081b9d5e2dbafd791773242 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 730c04094b1ce944588e8291f7e6cf763c70b79cf362dc8a1bc63bb8790cd4cfe4eb51cf15a45a8464d69ddc3e1b9383cfbfd643f317108cd9ca6a6eaaea177c5c8b6747bbf40108cbc0437eb8f11bd2a0939da59b70c0c6129e2c249823897f2ee536b0427bc45035f121d2cbe7441c175899b97c490e6c3ca01539bcd05848 -A = 102cf23cc3b81785c73ac3613c816de47fd585c7d5f175185818dbb4bf0bd47d0dda9702bce97b29d66e48bfaae0fd07b47b40be2b48ed702ef21c54b10bb927f9d6b43604bec4f4b2796b44aa6b4e83f8bcd00f2fa3871dd901570e1a32888d8691454c40 -B = -cc5349a9c5280a933e87ca38ce458a711c71ffebb40bb1f7612b42b4684afc495e99c4a5f32eef1c9564c2b7612ea4cda7a0f5df6b3ec9026447dc565ca08563d46aec7ced9fc4cc5645960210d44cdc3944149051d569c9295dc50862f8f6d1f6cd1 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 1cfe1842a53d00e4619265e2fce7cb566ffbd912c9213925d01408a956af304eacb85e29fb6edb812a95e90769bf1c3d62b0cf6cd5bb8f8992391d2ad70f38a14fb9d1d1eb522aa7b7fd9f1b52790beebfc887193882377b7ce567d317d8432e1d9a908d6ccfe8d2de7de497d77b023b3959cc042ae30aefcc0229617fd2a146 -A = -5c3d24fdb193ed83f5f6a825c1716f98e3cde6b32e09659f253ca3fd2a39402b5bc3a6497ed7bc908838e93422559a13cf59156254bd3fe1e3b8600b2a777943cdb39b9d42c58043f1d587424425d3ef5f5538ea157112970ce3e09a87fbb5f7c96f1b5e65fa -B = 675d9d2a05288b438ddcb330acbd59e4639375f3f14ac2d0e9e8b72de6ffc1d217ce62f997577f7eaddbe4603541b132cd41f2f2740363d9c331ef22df92029d143fc8495ed0152b918aed7ff22f564c7cd94fd3fe4178c90365ace43def8fe30ab05c0e -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 83ed1948276d689bb7fde814e67fcea72c4e3509c48873c3e7349a8fa1c08ae11ea4d814d8deb1021eb8b8ceec342cba5002a2ca45d5f340ae1aa500af4c7db120d0402c6cc8a840404be7221bbc46ffa10236043e5ce4415d3ef1355bde26d2d26eb7127326d4b8d671bb96a08e38a2c1dcc281830ac77202903a5e4777ff02 -A = -1be86e7c87827922d2e8a06e3cd6b64ac9a280c525749bcdbfac4856916321a964c9346d17465378251e6eada42dadf38bc9d7d87367bec94ebdc21af6b1302e520db08a64ba6b39920683725ef02b011a3e4ba46ef0eefadb98582cb911d0cbeae9c231b5e432c -B = -352059faf97b433089a688c702b97adefd0c91d51a0395647f822c6762fee3287693e302fc5a5584a12c048dea1a320cb96fa70b5daff7c2ea21d249467d14c6bbee15a1e94c030e908342a939fbe8ae0de58cb6d6eae7758485e392ff6d5d64465b701692c -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 402525e19b6b68942253d1a51fd9b2ca36fc84cf938d80b3d52fd4302de142b9d93d1663e89340fff10c2b5efc8cd47fc3b5cc5ccd49a6ea3038ead6454bf190b7f88f52c56bcf00c6ad5b0f5dfb7615915ee8af137dd99cd3d21172ab772f36d291a6856a8e7912750139c09aa024b930a0a6b9eccc83c2c5c0ee2473ea32c -A = 65e5db532ecae639bd56dd63045bca39b33b4d70b2db82ca3d0ee8ca436e671828cde80217b48eae7487fe110830589ab1be889f1e1463f3b0757d529b2f0cdd2ac92c35e8ec141885bbefb6040a3b5e00e64a541913a38fe05824a929f8c5a2c46568c61989c3ca7 -B = 1d9c73eef8373cbb1e8393feb26d55c33a245c33d7031c234abffb2f06a1601f7f3a79ef1e8664c51ce5dba5f5aaf3b9a9e42470d381219b4616ae93c7f6e64792d23bae523b6a224c1f714ebc82a11f9be42618922b8d2eb7b55e4d45572e68a19fb0ba72228b -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7a9cdb5dcdfb6e04351057d731fddb9e85f41eb432f01c0d980673d294d05ba9b0180133a89930e74cfce78ed54991b494a19e7f80f310b85904784cebc5639bbc631e80751807868e7fe16719e8ffcd1f2cbd1b9f303c3ed488b647670be3080668b5fa0e53b6342c33c87f0ca1efe1ddb1c877bfe2556aeb61805b06f41343 -A = 1e412c3d66aea2c503f3aa5dbad368a61d969a2951c0094f9da32d2794e47f3bf4c481ae23636baabdebdcf0753d431426b1865e62de8eae7238a9245d62820ad7f17b5380d701f5db776cd4e1ddbdfd542901731ffcea5bcdc247fa9c83f7e08a9389e5a76d38be21bd -B = -afd61df72361260484fade8b432713eb740df83a401d73492883a5139c918d5c911ff5dc00140637da1c6acfbab4b0bc8fc1f337243d90beeb1c2a083ad8069494c73a99372bd38712a5b5393c779ec1915e878600e0b48157bea44ca8e97c6099c4ab07fbda57d1 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 712580a1ffde78c8cf98ba71843c8130e835fee3afbb45e372d04c04cc388e403c9efac742611d7974bbae982c3aadfd1893f5da280afe0c1db1d81a9ed73b6ed9b7f05a20ce828316103259112d7754560d66733041e9470ae0d4dc95fd0484bfd56d66739f38ead7efa4051187ea41f7bea8fe5d958a29af41328246e2bc35 -A = -47c5755ca61ca8b7ea927f6fbe347f1362915548ab38c40f0418f4c9ba4ad520c3b2469d9ba3976669dec0b278461bae80eda53e9d11447512963e797f45460f74678acdd69fb9efe3897913b6568f8e03a6d90b4cb5bfb06af132bf118574b70e6bd2f6d6cb4d0089379d -B = 5bda68c0a64218d3609d75eb4832d5468298f19498507d7d515f4c410f04dee535947571a5e75f1af7f94a5b3b05fb742fde23e7cf3f8b3dbee0a569e5a36d7a3d31a26c4a48a299044fd72339d2cee1a68966c851e76b93ae34130b75f4abe4f2260207d2254d23f56 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4a1a514aa4d1ada84fa841d0b668930c904783fac521377a7d622201867d773ad23dbb667e0d4181616358f3cb088cd157c8e72bcd03db64647b37aa1813f870cbb0318ae0a3667f8e6c19f6e0706217646ce633f0cc8bf4e8f0f4d7329a8647252ca6d376416d545e73cb9a3cba40f8f9465d85d57c2481b84b6d95dd42d50a -A = -1d68bddd8c3e6b78daa0acfc63a6f39e97f19527a43f6cdec47568d57b47f4e4b7ee88e4a28d683b569e406ecd2510351dba25f10b9f7c82d6da16d848bb970cedf7675e67937921bd334eec4bc8fde83d67aca57eec804ce22bb342167602fbff452d5f0f2a7f38b576e1e50 -B = -34d219765916a4c8ec843ebee9a7aa1162974d41cb4d6b60532513608452da9993749455d9701af6b7b6c7454d7f2fd5c344cc938baa5259301d4b56ae8d25b6f6510ae6bca114cae6791fa5a9551e8a405f5b1c0bbfc27138563b2d64f9a4d7a8f42a23bfacc3f1ec9393 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3fe24e66e381eca525b24cf767215837019f44ed4fac6ab118d02cdbd658066505ee5b0feb7af51859992ecb97d727121e38873f748a61d70201cc43228a7732156a80dbe399e05764be19e37dc1b93222bcdcbc45b1a4817460f7021dcf1d70e632bc6a306628790201222bb522f4cc80adcc907463a539b02f74004d42adff -A = 773454a43f495959dd55b8a064d70b1b1ffe45c084f5f9553582e24fb402b564de68e5379a8d9d02af101594e717a6c6db2e7173e557a64d2f28fd45c4e06041deda040705d99acacf8086830af19c7ab5e27f91738ffbd937dc27e5b7869bb6caa12c2d7930366ff75eadc570a -B = 13d884a2396268f1a8186748a15722156a172a56dd3d8c77b9cb7001b6ee06720653507eba9bb9918f2f699cb37f3b5ae514f5180108a704647f19b0fc075826153edda66dc1105c1008ea8ec6f8c10057f8e8e479e1a1274edfed9ef719b30827a30f26da78820c3696d01aa -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 715bab8708e53f76d2ef2afbb845bdaaf978b54ce25f84dbbf9074f16d30a18733a02a4ba5d7b092fa6c25d3b9b0d8243c743910f1b7b785d9cb02343fc6d59eb0817bcff05646030ce4fbb2b9ff76781cb1af66b46553d365d02c61e677ae97defe92d057d4378dadf8cba9824b0022c086e0d78b5442bf3d3263ba22c643f7 -A = 168186208c734383d472374fbedc2d5d430e85690a4881b740008623120a4f7f83b2cdf85dc28bfaae5870abcd7ff1bc782ef11c78a75c99d41f8aacb52fceeb5f10266dc65eb00b0868937340146d8850887686d54218badb97647a6d82c0c6650ca1f9078d73fc6222aab95c2967 -B = -9711e5b3965654bd9427f79c89a0b3f3cdec1c857f4451eec236c1f221bb6773e5dcc30e7381a18a813ac2b03ff4a4ba679aad41e0e5d7181d4627f682ca2dc8af9a8b4f878771446fb225a979ef9c7e641cac819c307c8dc50d9c1ebadf912ec7c844e416f95b546cf09391f9f -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2714b99dcde70d6c3be8b671d78abc155793f13105fd4b7c5d760a4c68ae89987311dabf2a9238d18299f983b8aca69a9ce398fdf2c9775d90b11b3dba17bcd8edf661efb6e9c50b4e37553cbecb54eb214fed1d0847287732810e550a4c86b51d4e5da1cb7722ce4317e69644620ad806d6d1c94e1e3fb4d87de6178a997453 -A = -75231ed37f1dfa4487c9fc79a6f7b36929fdca086e42ed41f79430b2dff521919236fe415ccce590e1d3b986e16dda866f3f0d29ac1adcf55d87fa5cb67dbf4693293188516e360bac513303769c42181483fbef7abcbc4fea1310c916396d29f37d9058a62aead94511aded7c4b8de8 -B = 5aadfe65df0e5b877fe45d42d7ca02882cb6c686d486374da5ece6f87771675153c84d74b6f40df1db567b7e1e3c60c41d21816f958f5576fd2ce2f84a8c3be4749dfc7e5561266b7c9698c7581292d0d813cb77955458d63bf94ce87472924c4ca79504d1ae9d5f025c7a2504156f -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6613b1c8ccac0cb8fe2f59e76fef4dd05acf1f1b2bfc20aa3f193622ce3e9d4c7824ad544477553bc68f05f0b546e7c1ee87301e111af7929d1f40525291b88e211db7175f4e5c0953141914fcb4fb951dbf77442e7cb28fde495704f1b5141de1e50fbd0e359d0d86ad709c8f564c84dac81c7602717c269219ab1cf12e809c -A = -1bc03897b02d1edb633e2c019e40c20c1d89a210b0733412aab675563fae8bd75dd7e65988cd8df4d9b343586e27f548becdde274f62dd421679554ed9eb127e527a69d69fa8b17aac0424dfa2a7692d1e63617ea45564b55f01a70325bca050862d583cdad96c4a2e123d0ed827348a745 -B = -3d5239dbe7bb3dcfd8027204eccf5e9444e68d322a0b0c535a203a1d0c054e7dc1e588bacb891388241462a5d2b43e6cce34ce46a23e6ef29670603d31001374dfa347dfcc794988e58945d0d2d17da6565cfea559203dec119fc357d396f65b296deb07686b0ad2d25a13fd4fad88d2c -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3a7fc5680aae875b9241200b9f4112a82cd624ffd9044138ae3cd65200631ee9d7b918fbffadcad7e598791a9f0bef3e23005d6bc0048ba92461283492df3bce74c66e417b082ee052fd8f808d71f3ab18f9ffc40f8fb51ebbb936d09c26a3514bf868141f7cf238c1abb3d88e5d50dfc188902254f07d63fb8cb611ef8e4149 -A = 4a30f32d467b29dc83b40bca2fc4ccee5f08a64069cb87f20e63387b2219b12aa312400c4ca59608f50a71d2535cde40a6d248290793fe01693ca40b93a5cded2dcfbc9aeb36e187c9d650782d12bea917daadbc6525f266e074037803e4b2f300778ca8dcb304658cdb502c93c94a16c6261 -B = 1ca5e5218dade077fecb81d579e1c9290431b34df5ec84aefaaf233d68f17dcf60ee010db26320685af13a821b6daa9d73d8f3a30826c3ae7b2bc5e219cadcff826283cd7dddd04cea7a5e0585d6e7c9f23b27f14ff815fe53bcd75fe700b1b91671bddaba737fb43bfecd2a77e5b752a206 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 768d312175ce7d2601f30bb38339f046e4c2ba5c19ae5f7ca5a562cc2462c579fce9985e9e8afe2578db542c8d9e7693e0c74ba161334b249ce720d568e9c18f09c87cd701e6f2080b752362f2fe6252a1d0caaaf1fa18199776e4c6078d89d520b9c63db159d5fba7e0838811e68794b1413c248f3f7173ef29eff28f15b656 -A = 149353e91bdb70cdca8f06648388508511a64d05221305cad7187ea40d9ccef91fe17ceb1e79667bf66e8e6b7a57faa90a83bad119c02984a8f860bc1f23ffd33d4ad84896610301cd2e8e80a5ca7e8d3ee63e7dfa459793c9dbaef3569eb4f8a021c6a3d032a9c94d3f6b8278274d0088a98228 -B = -a7cbbb6a434e4b022d312ecd4a45fc7fc4d3aaca038cca0fc56e529fe7119ccdddc8e76d51a2fb862ad3d27a16ec8a51e5f66b9c7fdfbddcd05a0ddea14172339cee340c8c651eb653c6aab6551c99ae94f26116e15dc62f2c2e63305bbf84590fba1327ee721150d46464d7e22d45d53ffd44 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 763912f4b16549e6ccd60eaf7a0a1f64d9c3bc83e4a9b87e209a3959ba3cf609cf47183bc543f08e346b6e12b8bdd5d1c07c603f74b286ad432d58d7001299ec7a4dcdb56ca875dfc7ee5c75bcfe2aaba14959bf3facaebf8df92bc12937cfd4a4865b3dd74b243ff62ba256d110b01b4089730cf48efdc66fe272f9241014e -A = -4df3899b40d51c83dacb442fb143835bcdb550136921df78800f0515a6cee77fe3236dadd2a0800b79ebdaaf8cf4aba5ebb60cdff3e4b4531ecd0903c1674a4559339123e9f09158080fc53c4c6ae72c961c8da2f357b7c05368157b4956e592c41b25642457651abfecb4fed5d9fc1fc3825b772d -B = 450eff382e73f2f38bc3a4abecd5f8de478f80a6b99fb6252173c90d7099629afe859442bb1f796855ee9a2940f21d1f9dc44f462edd74b479e1f2926ff6faefeb55adbc6152b5c97967b1dc8c44dfb85b5e02e870d2920b75422c8a427e99e35e2a4be92cb0ddc04cb7f4044f716be97b36f045a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 56ef57d56c6d1b94cf0fcdedd3611a8ee444c2e25522b9ad175587619598da341916b183be03b1e73be300f9969120d8f3a23750cd8c4ffdb87124a2139e8ff2c15d8dc944bc3c3a066aa16dbe6dba4a74925e16acdb2b2e83cd7fd5cedade6a7f7409a509c00dadc182b2860609cc9a375cb8bbdcc350bcb2c0df9b3bff882e -A = -143caf995b7783b1316b5551978727f06512fe114b419c735b3381ec351275fb7fbd6ca88b848c3e8c9faedebd6d084cb8a231636f68f6803d14bafd90534609d4a4ac0fb953417be7fee4e4cfefa452c5ee5d1e1b97ee75f83cca8691a0efeaa8bcc1f1e0f18c0c5d6c7684c9da6c9495d31a32f40a5 -B = -3025fa05c55826c40089b12741b7d406f748cabf692bb0227519a124653160142633700e3c0676000943556f97551171d231c1a35f7b7d8f96b0366eb74942466ceb4660f09aecb2fb2ac050ef699eb05bd8834a2ba959ac71550b5c026b9093c8cbbb7c5fb9390a7818db682b7c11e58996c9d0add5 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 42f363c34c20c443c1ea7a1c54f98c6977b6671164a80308000533b2404a7f280adb1f3b98101cba25249131288f7ac68b0ae2572c7777e7381c1f4d05fd82188c4b1ed5636652e0bfca4d096bbf4189a9358b79f6b6333b99e5c4b7a940c2f7d1413bf9f47a2ef66b620b5e220b2c3dd7267452eb1b9d8d9cfb17bbfcdb6abb -A = 499d05de867bda3118a8cb82b80ac91fc505e0fbc6c7dac5fb61713cb6e715f56a31ae8af4b400461d7ad1687a2631faecd90d7829f67d1b9e36ed7d55704b3f2aea65eac061172d698384daea710ed92cf1140cd4da427174bebd173c2ff1675b2407a84649b0a318602f33105006fe4d5ed8d0e015b99 -B = 17a426a12a0175bb46bf7a7e727eb5238af383cee6f4d5e2bd82b0d29b9fed35f3d8ec95cfdfcac49bee47b25d3b5f375a3340fa83f8dd9330a593a974d208debb7e567e59dbb7251b54e42dab2cd50fc63aab050a41bd88282373f8195c94c35f61bb48aa921f574cb4ff0984ccedc070efea8c46e5cf8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2f03374e9596cb56cbbd89794090ca7a4b437f4c05fa38a09db60e5ca900b208fb85b52f71c29fd35e62c9f9529d7ffe46fcc54607ccb07f6f8e13fdd4ff1185033ba4fcefb1ed4bfc42c3ea9f05276767d8dc9b7b4aea4c8bc0ce84951d1f590cec0751f73667db19060e2bff64da30fc048a1f5700fe3f489920675cc3540a -A = 1073531f678877ba854fd1e7f857659614c526847ffbe8ed131dc9f2ccf69e1f1e917bb44a7b905f7ff758f61c06dd59ee09567d9f0df2550fcb98b776ed1381ce052988aa08fc5153e31c621c6a51ca61b386e3a9163a5cd69608b3e200476a8ada35d906c41d044bafe71ef5c6f732935f15b53bf36f7ef8 -B = -de3563925474e5408e245184b57f328e265b6cb62eedcaba809d8f257eccc0a457eeb82c451f93af93ce9f36dd1aab386e7c02b356f31c2d170169dbe15e70cf5bb9073b35fe0e7c7fd7faa91c5b2b0740734f12eb741a9d9ac6dcf7cff59f6e16324ea39e1e07dc5b9daea27ac674dfe5d0a5790abaebde9 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 1aa22f9013bc1cdebbdfecedf710c1bcaa41c696a3d7dfc1c8c601fcfcc1c85c8cc24be7df2cf3c7311b3b17a4ef2dbce545dc467d2a92d371e02a196a9977cb9042b236acf99d8c0d34a1c4dd8792d3497cffbc87c397ccee5d01fc2c89ef051324a7061e423720d0a3821a36739797393bdf7a45b5fc600824a17043312bc -A = -4fb2e3fde2a0c653104c077cc6459c9234f86cc2d7b317329b68289826d3e2b975f1a69bed1a53418a0dd86e1b2723f4c4c5a29d003161e667c2315ec24a36f8bb5f2eb0a94f261e791bb829db685cd0ec9e1e301dc140ea57cac1da228124ae029e2b8ab1fa3ab99c55a9ca94dc7b767162c0a24af851fbb984 -B = 63702537a07971e399aa9a1a0795db052d6c8185c79107216babe11d6d8d472b61e604cecf9eaa6d44a2fcdd1ef0b6b52226ea0c6902d929b09e16576e6d1a6921765b2134c5d23c69ed61f36ea9a5552e5819350366240693558fac7a9d09ecd3702076c8c758a4bf6843fa843dfd688bef3f73515db31bfc26 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6acb23ea695d4b60cce53079390da3cb3a4bc3a6486c238c421f3bf6c93c027a0475f656c3e5435f0211e90458ae81772aa956ef284093020f7b58ccd9373f3fdd39fdf4adb8dd64590f4a7fc05238ba20017bdad07f5f9a6f076b71554a7741bdd8c98ec68f8fee88396cb1f47c64d6da4c228caa3dfc7a9a1c032a9ba4fedc -A = -1b2496ef929bc673042996ae80f27c6bbd33fa7c20580240ef8fba985d1a6117d6e746989924e34f281e7d2509175d0773dd999bde16662e88fcef52978d19cc45fbae3997fa580a66171d398f4f0e7605d9f4aa4f728902cb886e6b6dc9f0161e7cf1ebac05a09c5a1bd69a92273280758173fd2c14550ec221275 -B = -28399206ae2820d26a5aa0bddc4903776611d08fc4cb34a22a8bdc2a19e9f8cdab94217f346a8070a4145f989e1dfb49cfd100267635af0e062872cc879c534ff138fca603b5d45a6860ea85b6de37cfca000c81fcda3d14ffe81da919b2a25214209b085bab9cb511889665fc845acbcd038711533da171d8308aa -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = c012c4d17ea4c95a360218adfc3363f6d89f5aa524aec70049ef94c2c05e59a66ce01e25588e164bf2412f9517b7740de53d037e71ec3a1d426f05b18b128c41a878da75421e8c8ef3ebd5effd40735c00818eeb1ec63182b44e817403c9f1f6c1a0155334be63a3a15109be6d45ac0d1b1ef5cc99e9b284b00c487d91e5472 -A = 796fba6276fb7129eef2d1572b305f63d7b8c49371cfb3b2c67b141071e66ccdb5e321fa2c1bcf624c77317e2aa135e1137dfa46a34c3ffefa2fa3e316be81f45614d422bf86fe4518c2fdb7e416bec199de033cb5fef7f193a80c0f0e6ee924a12c8f705f5ed3793ab770914924b45cf2578bdd09c701169f0a881e6 -B = 12cf934763127284e642ddc232b1c889cd86617307b6ad72a9fe0d48befd7c5c5370a0062dfbde2add256dc0af850813b22320ceeaeed347eb9319bf22320b2fcadeb51c4bb26a160f7459fc172c27a91d367d5a232d00cf7bb778fba83afb744177bf1ddf45446baa035fcd0065f9b493d92eda37e9138f4fecf3ec55 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3de123bbd50c35805b943e76e97b7e664eb9feb99860750bf97e275029e836217375cc1910c13269ffbd0bd72bb82ca445ccc4b693742a96d19d3dc23f78e5ccbba46d9ff5975f239551c36403ad5fe86997536456c4a5ce54807c24e3b5317b1c7b2a1661aad85b63859d427f0703b460cf72b9acd3f87e2e69d7f8f15e972d -A = 1d0433d84f1de082d2058475e0168ceb369013a67aa9417f066c29c28272a0b3f8be5ac7190ab78591ae72a1dc8ce628c683281a9ad563e134387b9258b9c96d2df288fc118a8cff068ee49d635343772c2fcc252facdfc93112358414e1734d6948b909b53e46263e9a0cbffa141ef77bc98e7fae8ae2bd85bd875aa7c1 -B = -a31a574d105305e47f4fc00ccea0cdf854556886b524901c22e6f3b59a42915932ab209a8d5da29ab70d1472dd5378d9c79a7447d17665f9d1f1edc1e545e417cb65415cb8a368075c16264f42555d26e83adc704b5c126c6129318a8f394af8bdbb32c8114470d11b2acfe806acdc7b96e1e348a32ff96a988de76d4623 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 770f0c3104c0f3395fabeb75ddfa2c21a111d23438463941239f7c63e4b6e6832b84508ebf3cde1d90cff0a2801beee05cd5118f9a726a987eb58def6780be899b473ea71c697557ff63a4c6db894e9438595acdd98abfb529d75bdf3c1d619d6165a9edb6aaab8ada50b61a3a84de654706a9aedb7321b0523558e8f18116fd -A = -5fafbd498d610e9f29c38a5c6c262b71672fe9e9c84f0f071b549390353e4fd0101a059b7c547007e27df97761767302458f1936395142ce5776b0959fc5ea039429d64ac5d50c2ae0ee45d60c0c50b7ceb4ff9853d57c6e883f588017ffcaddf5a1aa3e23ab068877a114d9a2cf742f01f5f5d611424c8ec0d082f5c165b1 -B = 552155ef110c126afcb87dd20251220c7a43bd0215ecd22249a21c93583e120ba6f046c6fe03086ef3c97311c4d520110a450470a473d8633e3560d2cb44c25559af07516aff50d6d176e8782c06cd9aadd3354cc695c4ea8dbf85e01dad479c8e8438154351fd5fcc6fc7e9d2162ce2f0179247f756f0b9b34b54be74821c5 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2e9ed66317734668c4c354d720a011fc65bb67439b2ac9203dca65a8f567682be40cbad4f55a83e836f1fc135596b624e4327acb085a61b6398237fef5a6e6560b488d4a673b5ae7d734b896d9647d71087621cc81e94d58e01fc2cc2dc775f9ab1b6031840a672fb715b77bd636e3d87b4949ec7bd60721bec8f9907b7c072f -A = -1a6b046d691830d33eecf2c53953676ed3f6fdd20c2252f6e915052ec28ad1fbf7a5f264acf87ef8ecd515ed921ce6b85017f3d8a8f1d14f269f31e3307c6f935ad468cf012a912b0650a15106fb949cbae7b36c9cd496538bb0646a7a28989dfadc719424519bfa43cd8833d3a748c758f813881d83c98f7cb2a63c2a4d06b8e -B = -34f87db0f839af6e4c4bf146789db36b3d0bcebb9bad81db690ccc3a35070d8830c9745b2fe730a1f3a252612e7026bf9889169b57b8984a5479cc4cdd6844ee3e150a2e7bf7680eebbef30e0591c895cc8b2ca488d489554f2339e2f55598717ddd8ce444a060cc95cad9eb478491ee8d3b8358c3762a970224abdc1068af0bde -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6455ff7c12bf3bc37120fe3f1302a9916a6ffdae6ee6a37fc23ca2f3a7ad910dc0e1027d4dc304a8eb4eccbcf3c87cf52a13dde472c07e2df2420c1d36bdd5e88c3d76e774ccd2ecaf6a0ef55b8c60231b1348a738f812a4fd9d0c158fd5a9fb19cc7cf9f000860d4cb6509271c8e43ae4193843324db02a029beb58ec2955ad -A = 54ec203e2ababdb0348135c0679eca2a8e778ed46e53f195331a48d3828e5e40da804ecf95eed819ecefaeb9c5377cc1afb1fb220175990d347981353e7d90637adf8cbb16812af8a3783dd312d967a490f8efe3f23746929cf2a5a8df58e0b878367f6c5e4d3c086f947fc2bf70bfc3a0008a8bb1d7d83f002930640b6ed94c334 -B = 1311b88a05224e15f1465c8da26784dbaeae84f818e029301ea39a982f714c64312f9f02d094c401abb6a89e8537d64c178637364bd261f4a27beeaaa901cc7b3d4e36ebcd9453cda33d47a53c6dd1d121dfb83a222cfd16158eac23482c8abbfaca59e765f6c1fe871d884d281793eb19f6409dd6bbe4083bf762ef24c24f0127613 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 64104f6c06e563ec66de4442d35d88117f2535edf9e012897f44daab5a1b8a8696f84db7a68d64ae24a394debb993bf6734c9df542c7e473b2e497396ce39a064789d5d7b339b65766b002a18096e7fb9f312ea5997c2a85463fbd6fc18f25769ac2a2123ccb0e72f14b0608c4c22add72bda138b83f986e78d5c9da31b15b9d -A = 145f580c2ebc6c0354ebdfdbb1d3d7fa17f0b55493b0b9a11b71001c840a967dc77f0206c3dde161b5a773a6b5fd9471fa08b205cb6f728e3afba440b55268d6a9542e234ec313d53583c580a391d8da5943f4a900b279ec9d8933f2cfbb260b74ab714a8b9a1af3190d914b6e42212df84f933a237728a5fd5473ce2e272eb82bc83e -B = -c67f9b9295dd5844307b8fe3cb9c1875257258e4be6229ab097e148c0175ecd0de4d84fe03c8da6e27153c709c2526092b1abc73b5fb40f1d4da9e0f3d8d2fd5f8a4e6f3c30befd80e189b73fbd77e8547b34010d2aa57072db0f00537cf3ced95eb517b23e0c854b4becce128a575a31037c3a9e106a476d8b0277d26dcee435cebedc -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 11913c40d577f70a5346ff1cfdca492ff52b640eaf257510d311872c8df7ba9756973da5b9206c6e5254bcbbb4bcfdad5fc4594e41ee44e77f168e2d20a4b228480a9908b102dafddd039ba7f7619eed7057e8af3a72ee491a61dd049bd947e5b09a94ef94d5f336945f47104fddb8493ef22fb648ff5376b68e96c0555d74ca -A = -5537630b7cfb8daf76d14e617f7b69f7b75b472801a9a818179d83ef2984d0abc8ea4214ed3d3d2bd785060e9c2819e861d0df760fc1daca8340e8a2c997c9ad201d6d2f12a82ae3883cf9f5c51ff1c25277c28175859a7b8e5b6cdec7cb3875071cbe415bb698b85cb19f617162587516f93c728ba8b2cfc19f238e2cfda115b8ec0431 -B = 597296cb27080f33a24241c1e98fdec32f7a4013a7340d367e4cf2a521cd462a2803109c27fcec353a30dd20053a1f744394fed75829e8396f8de434399bafd6cdb6e0ee81343f0cb99ef3087a7c69bd43bd722745a46cdff0c2c837fd87543c3c63df3896ac101a145b478dc224644996fc72460a89beb5741b91a42f2fbaf0d62c099b32 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 42f420adf5c6b32ce53fe23af4e392517e37013b8c3a7d035a93f6ff45142b0b0bd5525cde85f9b7bd9ce219bd3514617e89ef4d9279cb9a3e89e44f1994d72febd23ffbdb0a4f19cb76448199b31c5cc6d7ec1e46fdb67be1211c0ccd93c123d56ac0d9cd2ad11f0c58c713165003495b75b60665047ef80f6a393474cb727f -A = -1c6ac9565d1950ae6c55025f76e0a040eed0462218e97aea87208ba879acedf413ffd5e63a92dd8658cf5f49d633ce7b126091a55701168ee4932db004dfe8c35c939887fae3a892b0b04d8eb74191bf8fdcf5566b4d3796a5d2596b1e750f64201057ae60aa705edd58aba4b48f6a2e511bf5007a6c44a27e3efd5bf2708f7046c1fff7864 -B = -244f2a90a57e5d066fe22f4d52f91b44882b8ef76d1dafc3387abcb224eda4a2100239e729bbc745237f8129d457e98eafb2ede2f3afb81e63520493da2a5730f1170b31fcac21259e90c894f8bc488c5e5dab2c2635bc7b1ff56c3685607f6fead73a09f83a7a168c4245729ce5b06e482d7d3d72eff33d14cfe2f32f72175484ffa292a9af6 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2239459025b257fd0b6659f54b8874f93f07f4d6240f8ad761c9da288cf1537d8bd001eced284bddf78edd611c7f28f1393c6fb879aab6e7df8eefd347d63628b1ae086148f488b01272f67ca19db71a2b284eb17e17aaf1e3e8f23ea253595de474d5cf47c16aecfae360eab7855868b8af361491f6ad96f893f9d3eb66d07d -A = 558613de283911aea1ee21d6b926f531f778c5226e978ce329860682b5375fe5e5328ae27b00f504f2a2d24470d16c1edcb8e76b4d1a740e55538e79ac7da4b45c5299993513ec3bba7e7395dc829a00d4e228618dd348fbf838eaf0bd50f6c70253fb1c1c734a07d0813915be25d3163df13511f3675022cb85af7646c14ba5d13f615ded8e5 -B = 1f3c3c468146c29408d9207e15b25186d3b06b3fbf9556eff7ed7ef7788032d87ae1a4d2a0983902d4c70936c615d8c9ee26c89af8b58d60231ede54e859763237d5ac59af686300a3e92f456484ce77700557ddc0f93bb40e5d2e5117f2356ac7ffca26dcafb3ce7a5573e07ee97515b6b082fe75fcc9dccd76b4fd416e69a247fab2b30965d9be -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7650985e7c6e5461268867dfa9782cd8154bd6a4bb5857d6555e9d9746ee79b37e44638940bf8d5e974911327f0e53bbcfda0739056bae2248015c35839f35e7e359e93d3a339e7af38c0cb43eac5b41e1406e34cdd4afd458a5d126f70b5d683415b490e0ad61269ffe7ea8972eda6addd447d97e60891e5099ee920e18f233 -A = 184845d3762ad1a9c925c51fabc7b9e15570a84a06ecef994910845d56869264273d75fbb84a31c97c27eb9779e8b39f6829638a78b266326b60546507f65128caaaf36d4e7f85939b75cfb3145e2b1bd8372531cda579f59efa0da9c95a8efc72faf326d35c660b4444627d328bedf50a919029dd164de051a4c0c924103e365cd640b9637d8244 -B = -977390f52af784b52c1d54e82131b072a1c308406e9b82587102e67c6f7145f0020952231a5f0ce9d130677bb5a7a37d5a06dc570a13a29673c8a9068f06242ac438806c37ec46136e7c1c1487ca2d330fc1f3c1f42ea51ba2805b74c44a61fb2fac109710dc3dae78a07057a753898d4e849b910f035bfd807178f0108812778345b256c7b59f8883 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 35d48c3e43070a10dac0e256afb83b219aacc0036f554bd998b9092ce3bf87bb5d3b00947f2c86fd4e7ab830502d15fb2d4e47ead087f5c779a9ba56e272ea86116e2c81345d379dda6b581e9c8f4df8ea56c78f04d4f7412d245e00ac645847af6ae97d5d2ab27e48cc878d8b510c2dc753f6ceb1b9e7bdd923e0e065a6c11e -A = -76e575cc79d7f0c313a489b255e85d114f3933383cdfe75cfef649f639921eefb9b3b3184351fd0ad252c6e477e153ee586a0ff6da1e1b2bfd7e953e6dd778c849843fa5cc355b31f5529ca45aec81ba67a1e364d5a74a4656d266f7decdd47b2fc2d81d6c298afa2d1c39b5e8eed519a9997a14513537cdcddde0b5b41314476264d59b7d3f0e9a65 -B = 6b7faa437b4e8db8fba56c62eddb8a81e9090d1b6655a2185d656b2db0e85225992297381d653e707aa15f3017880b0f07abf3dc455cb09c4e551b3df3516c6db4ead79b88339fc33dda96bba76ff7c388363c36b67fd5dd0ee63f92f67549dd77e37e9902ae51cb58057579f03286fc48e3b7fba763fc5844c222e6a1eed9e1634d0bd034cff222bf147 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 445039f359b55eec647296fbff4f22beac09cad32cae79c13d591e314fafc2b77839816aa4f641250938865b0a2c30a10e23da71a6dff5985ebf3df4429fe64c327557b12d987ad9e9971f7c7b1e4ad01c94e1e5322dbcbc4707a959a401624619029558fd6f5b14564469b13146f9a2555916491e4d77caa70f51716b299135 -A = -18ddf976fec2090f7d1f4d41b8f875e56c813c04338f595d6e591b3eabf9e105be792f45354ee9beff997e6c0e8ec3fdc714c07b3466ad1a949b9d30da0115f5484c3b9e00c7cf0c117db57c3c6cd7434371c6d9ac7a5da1a0e2d705bacfc22f62785222d59bb5bcd3e3bf2df8e845953c6ddf1b546cb75b1698dc8e20bc611294ff288056723f1e46ec9 -B = -2cbaff39103570df7d85a5673b50fb8818434bbc19ab4e33bcc8289a4047d85de1b7029a5cda3976ab12e1d891b7efe3d5576bcb3713c597771f93532853290068761bea04200fcaf9b05d8553b960ef5e28064de89d9e5097d12b26af0b64beb40b33ff82a55af7c5838b44282917fd4342e2065942c724f3cca515d9142fb8e46652242e8f0ee5ae07b6cb -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6727c0d0ecb4a375d0fd1bc52146da1242099d445ed9e87b1fad4daf8369fbeeec49027d88bd98efb425c1e3f73e412fb327680068ae57d4a53992f3759af0ac1b96a92f56c2cf552e6682d1fa90c3910bbc5c0b1754862ee13c5ebd62d5b98bfe8dbbf9bf53bf9ed0b967f3c9da24d4334b9f3f75314b429b05b8e27142623c -A = 5cb6c49efc6767cf956885690ef740337aa71b90c1d4b9b0a9e4734de0c0c50f2358fd45aeedaca6e1dd0fb510bf097bf46513ee09f3343bbd1c11f507eb61d51ada40c5d6b730561756480063f60caf05141bec9a769c241d367cb92fa8e229ba2e471fc73f48812a25bfc7553c395ca77b80443ccaa82fbb7198f8c35c3b5a2fff977d8b2a29cf9358ee1 -B = 16ff229a0e67a410555dbd4b687f1470ec854ef67db73a902f2d19953c55071c4a26dc320baa8571586f1fd54fa490b0d87dc83e5bf20b78956084275518b307ce69aa4ca1079e3aa753d97fa1cff62e0b5f3b99d96a24e411fc3a3e375ea21b7b35a578a72df68d28286fd9a324c06930905f696424780083715f77961532bad061f3901ed276a9eb6e81ad4b4 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6e9947beae4d934253e481d27e854a59c4047eeee4fdc7df7e174a8f045776109c148ba3721685195b8fb59263def88891c5953b5a0ae85fcdbf02abc76f4d3c0f5d9496327d063ce8b3ba875b4f119dcd8beefb3ac884c25955af61c35a69d0670c3c349564e5b84f7df4252d6d3b29d9a75f09e9ef79f0fa9f797bf75b8ccb -A = 188785951a3befcab56128cb6fb9576bee2412e6cdd7dd1bf5643babae83c8011af99aada405e119c3be33653862440005be994bf37d3802cb6c73cc312824c56841004c8e871ffb560e93a1d222c93d63684e90a91394b9c8ba8cac27b414bf818ee0de7217bc2faf099783800485ce2e93612ce39fc7e2f1db708bf9bb032d92b66159073fecdb2e0257058f -B = -8dddf094f30284c213577ceb7f1b2efb1e4213a548e6aa840f801cd6382fb6d4995908b7827078dc3f46fccdb9e071bb8531ea8971de0ddbb714d678bb71ba9d961e58cdd5f41b8472146ff9b814a5d1d6368bd94812f8d38f235f39aeb2421a57499fe7102c1ab167df7d33b32a6dc7c8eb8f4babdd6b6c929d1ebd9bf4774aa40cefbf136feda7b6e10ba4dbef1 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3f4a8d90017dbe8e77205e65fa7a0875a1ace6f3f215c2974e47dbac779804143da3dbce92db391c2614c078997c7d1a15439ffb51a5787f5bbaf98a4dcef576a6317b9b92dd8141a8fadc05d3be7c150630668e620a4e07b4b00519f34e422610a160de112f1ab8adf09a9169ba95b60242c89196ac6e155021dd84b3054511 -A = -65ff4322f8e46e03aa6c1fd10a207a5e51db6991bdca232c0dbc9d73ba77fc485d881868be7b14c25b05bb59b7f5bb6c4b2a7d53f35d2d7af282a0423285c5de656429ab7d3af7d92837e41ca701f527845e98c2bfcb51647512e6abc6675cec2a7d34ce55ea4dcfe9e7a8397d45a7a3e73bdff06e303a8f04ab6285eeb1bb78b1455931cae203078eaae826a6e5 -B = 4d936b603eba3aeec3d3f1f9acff02a0ecc28a8ec64b6bfd9b153b1bbacf4f1e186d3deda8c1c81e759237921cec53251250e3e838f5063c4a1eb6cc93637f35aca10b965533d18b713617a312e74c446d63eccee93cc97e3723ab27357ae9b3cbfcb3e2bfc589a1bd582480e776198df047c3ad85f611ca6fa480c70aeb98af02f57d56dc9659b2a6bee222dc3e0566 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8a7f3cde3230af1f1fc25e0c0e9ebeb69161d3864fa5a03e5d7f8c82d9940ded285df35c008f61cc151b4578e2677b2f2cff3236935de5bb1d113597eee448496fe29bb18343687f6e9f1c783863e949a0954de2993d47a03607423b458bfd18c844ab57e9e2a43930df159ce8564edb5a2a37a06425626502e3ff9363b73c79 -A = -100f2984dc1451fd7b71e5d290e4b7de2d26175a47b9bed524fae02bd5abf96faba06e955107329559bff3805689633a4a57275732bc42183acdc792cbf7b6b24dbdc8921b73c0308d0c0ce5d8aad75f7eb16352e67116e859b323deccfe5d9ffdd1f0265297bc9eede073146a06acc3c330458b07b8fd0bb652c7325cafdcfa165f69cd0de8b145d49ddd576fdde15 -B = -21ac4953e54347a56800d75f6feb6ad660b0442174cf3c5dcbcf6528e2b5da95a614d3a8399da14507df4b8eacaddcddd627b10ec2dc5fb8c43d96a38e6dff37189ba275afb9484df800587f4953e327af71dbd58780bd5885b4cdab15ea0f2864f961bbfa9bba6b2d9448443af87c0cf178990254c1ae6e19003b1621f3240a6e5d0a3be2deb5dd253f5e1f88dbb60b522 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 76f8b44df8d8547f8b3d8537393d2805c699eb37d19bd115bd5539adb6b6a00d004def3b7793d5c71e0ccd2b7e9fb87103c1a5f56a8f18ede1bfe1607a346297166596aa78dc584c7c32832e11b72fb4f2d40ae1591f341919bc0157080ee8febb7fee5461a918d2178fa407c37a8243e24206ce2c19c3addcc2b7c3c1912b6e -A = 56f4d397530f5c90203df1ec799f82a0096888fd370d543e33b5a2c8042108bb75a86265204c40fa5a9a44965ad2fb41896b134ea56c79699a230f38c0e3fa4e5d346cda70e0253b9993c9da5642f4e645a0d96cb732f8f04c99a83d1f1360a385c6e1a972b89915489245ce58830788ce23b9e62d6b48a7ff9a486614d6979033f7914a0735d201c6f29e512374088db -B = 10fe818f6af7a95cfefb0ea0726f9a3e0e7c30dc9785b1fdf6e2b810515448386c7efc656479794d389e109ef3efe37fa6124c5a7db3164268da0d98538606c57bd2f7df9482860e81f272a27c727d7d81a66fc1a9bc8c385cf02b7ca6bc7ec2d8d6ba1dc992caa216d02c9bf0fba8ee754af77567c6e275ac1b6b1b36b065760761300d156e40da8445712b8fb206c0df346a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = f580f9d2438b22700c3ebb23d1dc296f3d33deae2d32dea51c7ed3a0ce7b06af11046bc1cc279bb744bc31e7f822c17ffcc5dcbbdabe213bf97bb85c7e19ee71a513bf59b25b3b5787e42e9f3ef6aa1acb8705d69924a107b4f88e0cf9276c2c7c47fa4bf56c4900b557aa5587418f0ddd899630ad3ff678b5b907c07247b2b -A = 1017a4fdce8bf41ce804b7c9c836d85ff6ee899807e1736bf0357b015b701b9675297e5ebf588ac6c295feed3c6a367987e192be0d89523ac7d64b0b9576f311b5b2705c5398276a52f06085027480c2ca72884ad7be34967bcc6c8cb4ec4fb761e88c16866a2e284b40180eb14536810eeeb180ab701ec47ece62af65a0753f95ca657e7d04ebf3c3a7db02993da9089840 -B = -aeb03379fcd4e87cfd18957a72fce42e016951a72b673a9e81f666b3cb20d2bba81400ecc2b38601bc3270eac46a633a1a6b55c50f00e9d7fc8a20176b93e971cfaa4f41573b17b8ccc498f8a3230825afd0d7f102daee347a9d59cc0914ac8689c1d8b39ccef1f3def44054307a7cb7706535f0cf4007231ba21696424c3d5b42c8e85c278f7c2e8b7d1787effa601ad357eeff -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = be05efeee19cc91e30a9277a6551aaea63aa3861b63f6061efbb0b92296e09f4709529eb849d9f40406fc59c526a4697144cef9661b556040458940ffd6a87ed56cb073d2ee0e6d1f05936fddd1b9a8974a3088577847ddde6bbdfb3d69158d5b3899c13ec78fb5cb6aa7204efe308bbe0b52f18381fe838536707a8a27ba0d -A = -669660e75eae9930dcbdb99c477c980869417ec9c0e8c4053f0bd8ae62d496daf7539f37af96fd1cfcf3149bc02b8182a46b413e3397b49d4b4d204491440eea65505cf5d33a8e797af08f3da41f5a0804214846bd95d730260c6545d51126278181719ddd396c55f119e84da71f0683eb6db8393b098b3a0c5999862644e073b4918b5c8aff17efe860744d85bc94b582d45c -B = 6045f903a750b69b709cfd6a1c8ec9fc0d7da9c53a9d26fdb0ce9a17c6a0ed5ba633d6fc01f004f4a48cf247d61f7df609008ca5bdc8eafe06dcfa06bb67efa6a584b5a2f02768718a908978edd475a2d2926af2a6e523549a5cbecedc78323c5c295bc0b8d3e14053078492e82e339ea2c6301412a5dd7efc20da0aad0577a37d853eed820776e672bc6d23dc821b5855eabcceb18 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 705bf20b7d92e68a69019cfd721b27373c7ff22f911066907f556321371fba70dbcb9774d3a26ca43e44ab20c586a3c1546fc3152ce011be66e04a59c6631bc8bde18efb7bf1743b9ed75a7a6c5bf5a4117368b81b112a3cd4e1c44a621f534a11c426451ea5fde880939ee5bb28d9843730e284520a976cd9f60c94751050ec -A = -17c1dbc1ad1d2d33dfe1af7b4cdc7b69fefec5a92656957e111aac292e44719c7c752ace33dc74a6568be38b576a5ba174bcba77a034af5fe101699c99ca39f8a3b0a20679e6d0180868a232fd8fc775089e185e5eb81585403f32619a2f4d857bb091a824a89de2e84529e5b0702b45771a5816c5a823d81ddc89f8a70cc3d3a0c6bd6d85e9d72b69d2713b61c46161f7f4700bf -B = -2252b54c602456c5deb86a0f249f3982c3836b70a946f636b22fe00c6e3b91b94e19200a33087fe734ce9a3f92a6099ad03a95ca523b7edb9e1ed3464d38fb96c470464e1c54790cd48769677efc5e1d22f5be4c15288bc5ea1dc184a05fddd5e576b3b4962f37437b4f9709dcec374377db44c8ba1d8611c0c3ec35f9bba213eac59a047e78195ebbbeff941c7f862e8c80eafb72b1e8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7306e3172929c00c29ca1db360eb4ce82066f237e9cf6aae368d1f531620e9b61eb64f5b3e2b735a3b565587d7e955d052df94a20e4aaabe493dba2c18e85fcfb65df166cc48733632d165129b112598bf5e4c58dff662e558e5f71b25f36708d3ab6536b1cbdb5aa2ee56d9e019a9c3629185b188af909831629ffceab634fc -A = 6b31ef80767a7693e7d0a9ecce54beaf5848120f036923d80b7a0245aa6a46135e32314f3b227268e0bfa1f45b4dce83bea890526c7ac3efdc8e485189ce2c51597c2864c2d3664584be23559c03670622a53edc2c17b3f1a92640078ec35189dd7953e55e4da0290ff1e2996d164d69f1bbe6f5285ae89209d611a7d760e413e23285066eab8e126c320bb6130a91d67ef26d4dabd -B = 183f06828033287497322b05ac08f62dcc5fa67b7a10c6c5a319c9a1e642754230c6d9809dcfd2de4bb9e360d6e6e1180f6ec6e0d4c6185e34ed299b6171e653521d0f7b8975ed5e7d2c51d27f9784a4b6f9b5e97379fcdb42e4df981462cd5bb9d0501f93f217d954f6baf70343ec710065eacbd2b778430ddc36a7ef0515f29d5fe78d8708d8ffb6c3391c6f632cb1bacb4ec52972ce0a5 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 361ce44d153f4d251952c0b90681a19b7d2d8df7a6c5d459691a80c06107b2e818f93f30f8dad352d2dd87b01530d51fd1c67cede9b1a6167697098e41bdc5dc5e7a3c310116aed0c7b5fd99dfcdb3517c13daaba6ad10879f600eab846cdc110d392d9bdc0e8ab34b317840a725a7a12ceb48c75e8dfeffe2947aa85b2a5158 -A = 1e1f2e44bc7c79a00afc3b2570d5cd27ad5ec9f45aa94f63f2ec3fa6b69077480212a1cbde25ded7ab1c6cb1ec26d5905948e5c1d6d109bd5047b1e038666054606b42e880b609f6f00a219dcfb504d481d6fe709f4362940f6c4b6f2e05d243722cb32bee5508ec94eeebb53b5befa551d3ab5dff9cba3daebdbc97179e56cb778aefdda6a0c24265728ff9e59ca3c2d615398d97e66d -B = -e018708df037aa2918850fabcad82731487fb812213b1c067d0688462a4d518e5ec7c4c84f2cb2017aa6bc960e2faabbe361ad8f66355366cae869d366f06d7cc32ea08dc51631e7f36a4c775611095d8aed06a0086d0a471749246d7157947a1eb5d5503f207723a7062382b3e45bb84c6f555e48f6d63aaa1c04fe13c0108507c0ced669a5296bcc16debf18e03c32eefd177bbc1dd2f19cd -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3aeb3ff6e797d271fd2271499a740a91569f300d7392a7b5898084012a3c5ad379a57d5169e43089cd58fc7210314758d5368dabca2f0ec5cf6786801bc99b45cd60403c732d9f98936aed76da724bd3e7d4b622dc690778f11fb0310fd4cd980b220627f7a864e107f93a6259081c6581e5dddba4890508af8057c1af29a745 -A = -75e06b47f60edd23148c3736c9c125a617beea7c8fd47e662c9d9be883ae925b7801a0030df3f4bdd3c9fc386f18c4e002e5daf4a6f7fa27b2f71252c83d5f1695e50d62a10b99e1900987b342290decf681a064f789e11bc3fd75d64e2e78ace56e7491fbe0eddd6f9958a5f95775c920ad6c051ebe7750fa76891ab00f42c910550a42bbc1c1e5aea0ae13b7e6f916a5d228bd57e854f7 -B = 434c8e4767d0d7df2125def75a978bb1509a26bf8305cd03df748c6c12b6dc580a2c1ca9a4526eaf3936fbc4ec797d0733217a54ffc9e1d7c6ca04fb39679859d5bd3fa64cd0a09cf1a056094b9c20ddf1f00e134533ba9892c2ca7346ac8d0655250eb45df9f0b7983bbf71102c6f1a2d9497e7a45eea7b3095cac037b7aa755beeea8a6191da268780179a652d94a732a2a5c7b626c0de3145f4 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 734a429c91f5b0f06fd47725ded06222c0193dd407e9daf136696f203e153c9bf6df59016849284cef93fbd35edef2cd31c9b956fbe562d2a22100f177254144718ac7d22c99783fd523b642984794bd7beb0d0b363e28d3f3469ee332ee364faaafef25c1d4a11b5e517e44a412ba717a113ea9e1e8f2d6db8fad6f10d06950 -A = -18dcd213e9938fe4b6a64abee3b9867f65e47e5b0365d45a8dee14ddf787f34072ce32f38d4d48ccad236005a23c5fcdc02b72cf27001495663fc56f428072d3f1bf5e33ab2c5f9dd9facf122f7225ea03c2f67321530a642803f65a2e9428f32d0d974e68a25f705e4f8140568f7e4b132942b49f9ff53f04f241feaa29aa353925fcade33a0cc192fee2628c2111da1e652cace9d304d0f1d -B = -2e5397658a5e6db9d30f09e93e67a30dc84b1e17c25786e041fca48ab710e1d0497ce615264f1abcb23d5aae8412b58430bd801775acdce06cd362438898697940712062b611c92ae6ad10da31784207c5e7b9362b20d7254da0df8caafe0736002dd466d76b1a03e91a8dbe8a71107abd5f07b00fcdca2017391c7c3263881a3d02a89b0e16a2a765a32d24ae6584cf44a88975c539402db9a301dca -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 427609751f28edb62c717bd98ddf999cfcf65128b652be1b5aac0dfe1bc0f7687c580ec70c8290455a9448c69dcb550c0cfdd109af561ece2ec8707c1d02e8097e780f32ddd932e706f81f68711acda0e7610f4dd0fd55f6ac7ca3a3184f655b0b29d2d62974739b43ded96b413b9e3f0033ca1edace24b6bb610bf06b5d940a -A = 6576c31d48daaf7d6bc3658952c4ba18095f1a0d73726f6fe59381af45a2a6b592adc79fbc3b597e1eea711ab295cd991441fb5fc4ce5f047e571a7d949c709e0d31156184be4b8a6a49691ef93d7d3b120193f6ee82246aeb896b8b7b4c74c27c02cb39fe0335883a3f088a71ab42b947a0cd59dd2155c65a0274ec0836bb8c2fe394500724ef84d869bee40291363389e7012d672b1eab6696b -B = 1ba2888f30be283b588cddf00eb3ae3c641e35fc0bb3a9fc85d7fac1e81052129f499afd3e8458d4cf893d51fe4a2bcddf70f28c8edef16c7bbfb791daedf1a8248faebe36953560498af652d1f1c7aa0e9a5a667d9c94f7d9525cbd5a82147d58b738dfbba5aa162858c2c66d0dd7d8db38d41a2261e6efc7d0c8b2dd2d6962be0fc796705cec8e87a13092e4a3febdda3d4dbed9d11a1d5f92d7dafcd6 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 533d6d8d7384e6e65569ba0daae0a8cffbec1d20e417a6edb42d401a59de0a91a7e6854db081ce33b76faa63f6d866993c245e69ddbe6c86d339f7107a4807856cbca23cee2bf5496388ae8fd8d7c78767d0775acd7bd6202dd75451b424034e2766185969b5663b638d539f718e50a9f752f406c224c000bf1ae1fdd60a2a82 -A = 111940235b144a42a13201a41a3f9e4ff02948f8e9127d9a3007906988a50b36d7622d1221155f2516812074a7888b1d8334a01c02ee33b3164d761d02b36729c299ce2455a462bf18471fca42e5b01615d53723c3fefa5aaf4a039a6caad35c348a0a4dd3f0204f084f35c0b93ab233c4066dc50c5fd3897a769a7c5bf309f7a9c30e905466c8394d509b79d62a69b58c73d8d3f1665ecd9a8a4dd5 -B = -e2633e43c38c0b4b8713c20bf4e2b8ccba680ecfc1139954fc42724277beadea438596942fea1094091671c2060dfccd0351b2fba8cbed35dc963cc18f8e8835052da884799d88ec1887712000a0726b17cbc4302421011d5be8d234440eecc363f09e2c04bc9cded3cbbac9a5bdf0b6d418822fdd90dead20e5bbbb3566ca94ab85f3a00d32842eee6521edd18b9aa6872340b2f47deb961f58bf231e01f9 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 33960d7ceac73f342d46275e04fed56563decf2fa4c0e9307c90288e911ac8782f8e1354fb051a9da8e2db83d7c710b5d2b611495e72ed42259ce783a7e7a8f601c07061ec749481d39a082f29dda1f9c7f444a33ae1c1055d37a677b848af371cd3bd41c851d31a07e144d7add66df39576b8200a8b918201630b3da8e664c3 -A = -402034484e499a8efd610200790d443c5d3be35d19d8808da85954d42dca3f24177de48f55fa2efd7e4f7f624d806a8d461c3bbe0b626fa1f3cad2145746464108b367b13f3537ff395262256bfccce5f0414e1f98b59ed29940171d46ebc4bfa1a27802cc30d9221cfbceeb92abdfa6e84ab4a54965568aa10ea631e82067ae358a1a93a3a3fe3a5ed5636a0c4cb373b4d49f46f8fbbaa665a19200b7 -B = 78ec7dbfa2b28e268619ba6db34a23adab25e7f8690aa9464a7d8fb7c6b87d5dd9d33d4c023bb665f2d96febf2638fc087ed30796fe7517fd58e4120c0d319688e67a32bbeaf62a987a9764be75384bd499b0e00a850f27e303f615031299c631844d10abc571f9f2a0f742cc0e8df2fe3c244bd825bf1d9134b2f1059e2a1b61985ae8daf9bfbd9eb24ba268ca58553891945ff1a314a78fdebb5444677ac081 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3a1ea3fccd6f336e6d444d68af1753b83145131954c20f1e3c433a89eeb7e267425a34d91f67fd65191dce85769ece2fc7ab12d032f3e30f8509095ecc05148e47a85391b21a18257c338a6a3ca9816987abc8143fe443342b34afd8a52fff00dda2e42b1b39322bd38c6a1f711051f791d6cad2a47ebd423a9b933485fd5861 -A = -1869c53f86755aa350115a9f49d6248cedd42a339506b8ff59cb878b7745956f142fc4387322c41f369773ed375b72665026771d4ed1b9ece08f84e4782d4c3b0177853cf9ac3a55f7e52f39c1b82aa42b30628a4fa6a838754ec6ff9809308f675e455bca6f44e298394888d85fee29d8a0c8e9cdb9aa08d68cd70e13a243b5804a3ec199f52ccd462ba6594d856602cf1d5efa509047633923d31f78da3 -B = -2023c544b6cdd8d971bbb345300f7a101f6dd44dede6bfb5f4e6b4eafb7a40728a3063f6d4bdd0f606ddecf062828cf889b2f632d0c9254c28f36dd974aef116b73cabeb2bba98635841c2b4d2aea833e35eb1db9fa9a9d33bf7b51c49a14907dbc6036b027a039192b47406bcc56bccf375fbdf40b82ac4b3c660a43d5a6eb656868d383cebd099d2a73506f675cf29649617fe06097a46de93c13d1e590ef2cc71 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4331f18a94c169cf0253136bc4eb7480c9fa4401c18db1194371dd53e5f7b75f07ec2e1e1c4116a5d2a8b2cded4b22925b67a88af9b8479c6e821d58cec7ed9f780a4c41e729982cb33f69b87d01c11cb9a8f7952db1920b6eb2124fd5d820555a99327117d7e8e26d18e748fea3ebc17e1d07161fda57a21a70c7f4e251612c -A = 5e7d4ef7d6ace6cb106e38d96085d3f3505983fd952498af3c1d9b2af61e4ba10e14961b339c6e64e11ac758d5fa18c3222138290866970d67d0a4f4e19f453503eb8dfb85b44d1050c86943e7c5d6faf7851bedf7d0cb6b13d2acee25372243591d37dd230907457fb440f83b62395f80f59a2d02b87134887406a78efd77614f3193e517f234434ab3be084f1484d3f2c1f68c67c0d6e863585a8a5ddd0be -B = 114b6e6726433ea88a2ba965f0881beb3ff4d377526e4e099741f069abfaf29e129a1f5fd243c6599f725a389728f755f9cad767ca1d6ae5c8b3a32102e47af211e86d67574bddfa42b2cb466d968f38b47333b1b55211fd9a315acd5ef62cfd3e83c13ee9d3fa20a06b2292177961dddc7dc39abad9ea31ead1fedd3d699f651b656edceebb0bace11bebd0cfa581dad577b8b42f0a844bcd8c8227880876dd7b0aad1 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2468cdb1a26eaee34db3d2724e37f023c8a1788526b3dca99321b574685cc8303c609c85401a58fe6da181daf4111fe8c6d4b7428b1cd301cdb9bf8cb6f33140756c8b490d3b2e538ff294fd6471c4d17b9d9e4adeae0df088cb9daee18e825a368be57af4a096056b9e76b94c8d3b911b6a074ed41082926773a585007752ce -A = 1e6a59efe0b14fa017c32ffd0962700fa9752242b06ffd0b604b9bfd125114d4e0909534ede704cdf1c9e88a6567f4a2989df752510d087d7b7afb515ad594627ece54b8a8e539074386121c9a3e1c12eb2641ded8719e56d42ef50e2f3b5d7d59f8a6f897174cc00a7449d2b91f33e9df07902a95479731a44fc4ebe8048c449bd515ef6cffed70ae78c832cd43491203a247fcfe0a403862266777947fc2542a -B = -8a9d3646831dcc852fecc8e2335549e8baa2e2d82fcb90846ee82bcc715c716d4a9f62be29d5e1531db73c2186a4d2f118266de33d966b78f989600d772ffc55b1364117d6750cef67f4bae851e7e3f8fbdae7b79de7eab54cc1fee56e25d0632b2929e352c882ce78fd64dd0a1473e80b6572f0d4eb67f6bd6e45c7617314219d6f7de5e505a9b395096cd36650d23e8d57d6abfa9faaf0ddbff90d32865bf5ddddcaf28 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2909d3aef7a21244efc9b5b16626e260907ac11f3d00647f2170ba37197e47b9767030195c2f6d5eda717a83a152141bffed2e26777417ecd8e27aed8666698c2e85a414dddd52b07b52b0da7e08b3217fa6a331f84820d21086a4424974e1e8cfed3501eb054242a9f8bf0803a94981b7b81776eca6d07cd50c050dddf81d68 -A = -73ecc8a6a1507fb5dad40677dc6ec75f0d130ea704d1e87b00d2bd56a6be21714bb30202739170b8dd3605f0553ff57439051efea2a97def70a6d2cc3fa2b9ec27a00c1338bbd588513f0f320272b8933fdf6635e585d1e79203efb5c95a454fcd7f33aa2aeac08902107e9bfb29587ce8610d50cdb7f2033c5b726742fa9f7f20b4780cf9244e6abf6b812171a64b870c3ca4c9e898d4c15e9f5b0194ae736c3783 -B = 4049ae926bb52e862606842bbcb4a5148bd1063b6a56f331cf10000c524b4aaa80b3bd914cd697ebc98d68bd3c2bd5c87fac4ec68606c264c56e25b19d118dc9f2eca19bebca07269714f2955e107b3fbf85530b1fe99c42d33031958280b8e8abea5a918a41cc7e6980149ad68fbf1c0041798d2046d7f88a395348b295858c61c2f33d8512b6fe75aa8fbad62e2f9b0b7876ef95af8a7b7338a2d6b25ec6355c276fc6ce23 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 22407e4fe280ff5a10eaf46d8e1f5a1e77a07410cba4106466d703b11764c60124fa355733b47327e952a12869476306926cabbd797fc80b4a6dedfbec0b7718ee754d447825cc405a98b85f1e09ebb9294c4a4636aebfc61af4545b921cbe759d3f389beece3f29c2c7c07691a4c46a1a72ce418a239fdec80df48732627866 -A = -1e165ca7e1eabd2ad1264d5ed9c3d2b687f2db5b507a0e4d21d9e042cd46e93c2444c6aea8491b5caba2d8146bac656b7754b7b1ae0f6216029c7167fd3b1c3ba2e20469d386d8566ebbc05cb51bf1f1eb2cad9dc4fa454b07cc1bcdb9b8f5a43e354c4e0f4e62d52798f667080a0e0a15414391269fe8c92f06da74f6209a3b215adafa1eb6866f8b3e419468e2e5b4db0d0ada80514249320cecf034477977bcceb91 -B = -3f314681eaa4cb41a3feae8467f7d76b8b05939731fdfc943235aa4d67bdca30e64de541d17a8971e829bc0159384643672bdffbc93b3eaded7844d824604f46aa58b1f1b9d788106aff53438954af015a0387268266a6ba262e2fe7a4c51b5af6ff7f918674b7407ce8282f66e84fd2582edd809b465e4401c67e5faaa9e5748c06e3bb8ddb23fa649ccaf9657dbf79b937eb8959aae8d5bd9513c1e601c0e536cf60c4fc3802d -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 385ba217033463cd9cb882fe30373c2d8e8475dee54aba1ca9713a709f40844905c2544ad792784cc8eafbb412dd68de6f98522dfca1c3de8e3bf4cbd09bee4656c4341153b17c98f9ac09411d16ec9880835cae772bdd8eee51eaba7c02ca6a1034c2c5d2d48e7ae3eb0e22f59bf69537ab6f1e49e58a71c64b8934113eb069 -A = 5137226623f4ce4dc9b80a783777ef4e53ad3c2ec648264db472c517a96383ba1173e52c2659a97ce36341a11e832f4ad293b89696f91a051c35bb1db6182260d4a276d1a9b4be848c206899f87a361d318d38b4073a7470c5743b816cbbc3bc1b20dfd7971b11ad4e20d947e352d42760104a5a3cc590b985ee3b5e98c779e38d2581413a2208d31873f9644ec979602671c9da72fa6f66c603c1bb6d8e690dba8bf4933 -B = 13b45d4105e3f5e8e0ba36c812faeafccea2f1a30e2ce8ffad57ffe0dadeae3a23e813758f270423ecda3da083b42432eead7f04842db8865f9f1e2226a3d298ec1895ae69adc55d1d338c3fb787f0676664564eefe46ca95206e81678cf1a2f173c52d809b1e06641a9b467f191ea09fcdc597271eb43da1a9a856784972ce0eeedd49ad363dee882438f09863ba5af063925871c525c6c0ffdca428054e039e149a424c6d1b5b2b4 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7865f718cb30026837ca006f5cd997c5b917726ac6d9bd8c3fb9eabda0854d528d6cfc10e4cd3f93f6848582690c6a83955072daefc6959d33192fcf42a111650e50776ba9ae43d3d26e0ef2c6b60c3871aec33eda8c56353903e7ae96592fbf350b88d2f56e03f7f327022a2aa9b7c484a000135b85bbaba6f8836cbfc81901 -A = 16978c06a03276fa2e0bea45740a98d55fccc9d27321fd0a5b8522298a2a90d391c06c5c59e7eca85efeb9b4c91d4a1e9178adf816d597311f004ef98d209b59a2d4b901fa14c57b7297861ee58b89c9b2e931e4ce5818dd4006f3c40168bb4d3dbbd059c1f1cc24ecdc64d37df16b8e8d0529247c06f905ca88a5d283ca1b9e6856fbe8115a326061905b369791772a47900974339722d19b3aac16a0bedd93e1e4e4289bb8 -B = -de6dad276dcc0a9e271ad523620ec570fe6e3b350b934932ebbe36dd571edcde968b6590be14326e0f6394c0a2172052ff8dbc3ff15d94fb6e36a098286333768a84fd0404dfa354173d01f98484fb20897c439c48952b7f1791209fed94e9e72bfb3df5f368d420d587ae8bf036db6700f77b130459e9de2a541ed885c69c5641defa9436a4f7a69d2848d0e5d1074f77fa688b6dcc4d4c7de25a3b1b040546ef7f418112127cff173b -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2d3dfd14e7ec60f842d1db83e29a0f6b052990fe8900887dc44476ed3948870c57e72e91e1941c476baa6aa86f76dd8ab6e6ea41707242c46d39b54215bebdb1f28e59d719fde18bea9994610214ea68ad9f2da24e1ad8a06f8bc698f8e76379ff332a2745af472d52a4b8e57d60280e19f93d5be669e0832824321e9ad8e76b -A = -5144d5ca834f7bbb35d3fb95818c1f89ebe08efdffd35993a7691c05aa1b67f6a28e219b27fdcb66e516097c9ef5f00e4257c561b1f94c52c577471cfcd7a55314d3b0fa308b59449a36adc884c48ef5f34753bea746bd6fab2f20b86814c9fe50e8abaab742916313a50e3c390c67fda8e3729ee3329dc5e4b7d3107083aa3a07daf7952ebbcfea15fae7338cd0b114e9ab2f81dc2e80f90abff7a7ac59e3aecf76fab87633ec -B = 48b927a46dbc4e23d714b256084fdc7cb9d4c96a988a71c956e0bf98785ebc9bf22b9d5c6ba0c419e60afbef7b96cc0c4a13e397aa2d2dd7995875d2ccb127169423455d138131199a263151f28d232ff4ae24e316907ace1fedd02a02cb5ff9c831de33e6702010fee2232bbe3c1c193ce792eadcad0c81e7d7c17e49168377b68690bc61f22dfddb17d82a3b993804726037cfac8aabe8548befc52a3c6c6baaec89a392133cd9c45b1b5 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3f66970f600a9d09d73fd1ff813e977f539d69fe1784b8a2f99506d868418e4b47338ee0cbceed555f88824f98ffed39befb69e8907a5822ef7cd2a9950a070aec8fe4db9d68e1c0620f9eab4ab529c7e69466e325fe1c6c011bf7ab62bfd1a136597d7d5c47e8eb161ea048477bedc88fa30e4f7ddab2cfeec3fd0bb3fb61a3 -A = -1343c391be3f2b72c4b79d8d6091389c9602e97774b18eabeaae81fc0539336cd8c899341cf75fa758421c7f32eba9df474c934642003408b32db66cfa92e6e414b42b1d49c7e655ffb4c80f5bbff8d2774ee4f7198839680175e1ffec0428939653c6697eb3681d0f92634cab1cabc63f423d5a71d65fc7150aaeea74f9e0153923a1c65dee4a165e6a01a88655fbecd2db7697f4d2b49fca2508e2b8f84129785d36d88bcf59f4e -B = -225a0a4afdde6f6450f28736c3ef6e67d67ec6206a63b11763bc6e69b03f1494b275ac504868caa6d56d684a12dc1098ab0d030583e73a2f45a42b8607c0f19031b9c5f07fb71919868911806d210d43aaaced5894e844881e89bab85a203af9ec3adb105e50b4250343ca50c26df14c46d73a22c2e4804d26d44ff0bbcc13d0dc7e326c9e4eb441f493c9743ae0eea0de045e05d19ac32d2379196a165e63ba640ca42e4861caa24c29cbfabc -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 54e95e86e87bc220c8f53f8485402327885be34e34063a1b81e52a23fc3056758cea1c039ac4e513f70ed9d394f5806fb771dca8e342368184e674e6296b9a705c6380bdaf11550cffc73f9f55b9385c85fb648f105f11138a3e1f9dc0a39a0f9755f8328701484d45784e3e4b2ebddb32c9d9132867c6513201116428b791cf -A = 5f1239e0b5dbfefaba906bfd9003336489ffdf634333cec2484c582dbc19b66782ba40942d047c3749597ec4d89ef61b7803d33a9842f0c903461be37c679ca213aea894d36c1e12bbcaa1c679599d2adda9bd23e712dd0d0bd3f91d146e7a04f3e7ddec8b0db7e12377ab32ba241ed1e01da070c1f3ec85efd8387a7b9421453969ecba8cbdeeeaae6ddb098084bcd250601af780960c32f0a1ad7d7e61fb19f40dff1060c5f332830 -B = 1113f145de014bb6dd6ca05de159b97e9736c45bd3bbd8477f739daf79615fe329ce948cab9787838d7daf797218af5ba7925685ea341b802690bc9588ba3e916145cd3ae9d0c4a149637b890cf50fdfa8f89a62e508eec68f9332787733aacdd57ec1f359ff7fde76138d5b33d32e64cf7d252f2bcff14be3adb1afd8da9dc930f5261e6d715ac75752b29f083bb1de7b0b89ddba633b8137f3fd299a7f77abf79781a10d897e7bf2c958a097227 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6e0160eaac8e1c31cd3cb6c5fb91ba086d033b4b69e41dfffce7569e61770f6629f23e12f0074c47c46653bbba94701ca798e1a242f7c4e25708d3acb5af6ea307b95cfa220f8879cb4cfff96b843d6eeed2b15c8f1bb21bb2b511cefbad0618d49d9ba33cade6da6ab3b846a6a24e35fb36d41201d3b85be831522b9bf509e0 -A = 14f4e24627c773527ed2243c0d1947395aba5c9cf95ae62a48827ffc1477614ad9c7aaea4b4fdd97e3272d3e220601565aebf87928c301656e9edb08d6e680de845615bb3a81c61ed043adb9d708ec1447f057087211673fa6ad8977166a2b4a8079a4f29d48e7fdd6875ccad05d2c219922b814589996cd9642ea2b798197407acd274da30d3ca008fefb40a25b38cb6042a581393283d6448cc69df9a5dc2b0777052566a8608a1010d7 -B = -b4188ebc5bf3ba31cf7c5e100e79806e92ff6f863c3d68a66aeb3ae8385f596dabe6f627f3812d0f2baea319d93ae00de41ab65e42eae7d396cc8fd0a2dfd35f303117fde4db5e8438df0c2b3b680dca538b42a7c844a9bf0d3697fc89ad0a73594627578dabdc214e0f4aa06b40987aed473e7f42d318bebf7392d9c898b4b8d73a94726aef65807b2ff746d4a9aa76303ed7b4fefbab34f5c87c2df82d20457f68289f7b96dbeab581294974e322c -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8dd91f390c1f85f153f332de17e5de82979755d835398cdf3dbda1ee73c68f8e7565a964ae33fd5b1f1060572bb3af67eec79c4c3e2eb4de118d471f74351b80a5dcafc682bc3cfde642e611ac1d5bc2c49b308c30985b1161c4d78cf7621b503e2dfaceed886befc004f3a729b4a9bcbb8f13791d973bf38fb8101d6b7a4d4d -A = -70e99398673324ee83495aa0aadfffd7bb9c94ee5251fff365124fabc50175d794fa84509f034c2b86d83607789338b0eebdbbf709a129a0ed0afd21c130d94b279c56f1c7c1eacfc6cd13f724a9352b2b37412242a47b23ec61ef0040a8855371aaf238003c45ab9d18a66cc7dab9653b93c323815e5404762d3f964d4654a6995af507bb2db2149eea59acd72af4d034217eaec0be5ba1d23890081a6a234e125572e3bcf68a6ea52d9437 -B = 661d8832671a4974b493e5d71e547cd46b36730f4017e50c5d1a7520fbb75f0314cbc2ac948744dd494d566ba580a2108106b120a797cfeb1fbfdefdab6bd6b2e073f90c77e814cafd0b7f79afeecd59778b1dfee3446fb32139b2311011576674f96f151f896b477c631237995e11e61e715dd8dd38e802af93124c66eee735c472972000cb4788b26752a630ba63b45e8ebbd979f0a4da5b359abd2905f0b7f3a21b1d381cd02ac08e284218ce41c907 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2b591d2c57f6a5484b43cd7ca247c48a1b38319e843257331c8807d499c7763de4eefed529e70d4c144e5e843ac00ee8d106d0d82163cfb7afe528a7daad8e7ed105942d1128a67e38d59325cffc0c3dab9185247e0082e3ccca82a900d917c9bd0f892d4b518a752f8e9d38eab2acaf3b3b59f15b0fe4cb9a3dabe6e0191493 -A = -1896f67485a740720e23e1642ef02742ce5f10a92e51af19e112cc99c0fbddb60d7190086c942d293d076b474d056e74ec9f0c42055d745a57ba370c51ab2b761d889b766cec909811e2b2fd11d6916b753ae00622f038a4bc55b813a5d06e6ac136e81689407de721ee852cd21ea989ea7c8cbd00b64614caf0974a62097b2eb865f46fdb0c1a2e4f2d839066b797e51392e5ebd14dd92630c070acb546dc7438631fef01594878643a4cf77f6 -B = -3a8e2f3b8378a2605f5affa21c4fadcc655f2f8357a3427d2cec0118e55fc2bbc25931259e294d91bde8dcbacd39e6cbc125683da7d0dcbbc67d7c5866f08e7c4732cd4384d9366868370ea40a75beb23b81306303da4a3e26ad357c5c743d0a4ae775a472afddf8f21cb4a1a3350bb6aa71037607c334a0c79468668d3e727cf1d0610e49f27780901c68aecf1d145953e45f5b090855be714cb39aba2efb0f7db2786b331dd9bb8843de8c73c95ab13b6b1 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2f53bdd643b5b22445e2af3667a93de52f8bc7bc151e196c0ab0bf3b4e4dc0e5dae9e507508711a9e3de52e2aeece6aff7fc8a1db65588de3272839390a35a847e29204d3b9b70e10352c88a10c86cd33e067fb530d20a3a5ffe67938c5a7a9218f1164f36a73324adef64da64d5fa5540d29a76a87ce010fb7d73a59b109280 -A = 75e31ab221c08b3bd73bed03f878bf7742f9b36a89bbfa7e90f9b05ec11edeb0140dcff6e9ad1d62cd7af34bb4284b3a52bf1b48a40f744b561d9ece056a9405ab15f508700b14914e4f427ea1df3093497410a0108066e9b259c1a26ea72082b3cf0e3a99ad054804da7bfa0200d93d65354b75e605b47a4e1e17ef851a37c59a95e1b5172801e6ecabf70f1e6e382740998fcfd8a297aaaba7d04b668e3d6eed40358247767323a8393ec359628 -B = 107aca18938a9cb244ad646a37a212859b3dda7518a5827aa2146b47bfb3bd08d772eb7a866e1f674aab7a1c74cfdc2bc6e9ad1a365686213655b2c7b1977855bcd42ccecb804bc01d92bd7d2667069d853f18a0f0661f028955e39f71ee82b9ce6a81dfb2951b33b123e71264e819bba4d0a8c53a1d99964ad9ffb58b7cb5cfcd3e30b1baf5aa5b3cbd20a0df7ec37563e2b32b4cba91bbf3bb6fd1cbfb2fe0f84d720efdf36e9645c7e9ec70442ea5174528bb -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 32d16f7ae2632b5cec2e90c34d191599acd9a1b5f97845595988c1d0d4ceb9acfafbc4aeee9924ce55e109ec88c57610fddc664316e0f9a5e3ed56ea447111c0383ecdf117ab42351b80e72720a4b1d98d4c73f5235507c5b4f7849d5e9b527d054858c0436ac3d2de2704c4bc25de4cc702f5880d5ae34094766938bee555c8 -A = 133a439cf006c753c132a8559ea13c64f598c5f8bd5043b89d04d7ecbf0ec58b225551c8df8dcb341198fb0b487774867e5b68f9058f58b3cc98168fbed0d0ffa86bf74b4fb0d4235976fa86d52b8dc7e82df176d70892954223cc484ae58b6a60459a9a0803ab856ff9699789172b163615e322e193bd758016f634c83cf50403e416ae241d9b1e44add17c2a663771ac88cf8b9dd94622d80d879ae41f0f4e7a1a32a1ab164f981900fc159aa85d82 -B = -fef33e21c07dc26a47d692c3094205bf4efae6af32f1c0f46ee579c1a22746a3663d66f2919f46f973fe558c61264157d531e66bb9ea10b4b49d9f6ad3ad8762a6ea8169a9cfe01d3dd65518c2e6e58e8c88d1b2f42d207399d7326752560cd45d0ff571309301683770793fe3765c1337d14021d39ea6980934c5fefadb93047ef07c807d0ea5625ae0cefd098988d6eb7af993c062ba313e23176e7abdebcc6e566304a5f9e03da05bc1cc58dfbbc898a67a5941 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 20877c7f53fca97f8e484ba31f23dcf51ac0f4fe4c5121eec576e043c6ec5492725f1b9f9ecfa64195f71909500a69fab2e591377cc2120bd5f60d3fb3812f9e80b2f6c787e0081c1439dbea76b819ab44bf6bffe87dffd771a870e4f5502609249c5260f91175fb217a9eece4166540be877d564049389306e0d6b313706297 -A = -534042b0811c9afca04d20d83898e7653f91a73de1e4b516f3228c6d6d9b963c7f8f4c36e05383da90f4edd072a7eda382c47b84b46b4dfa16f269c2d9ad0fc53ed2ce51cd31e4e32d0c1ee21604d3c7eed2deb35cf8df6fe1c0740a1515e4c702a2074ad6c0fcd403603b4a4e2195d19b265958ae854ccb0b41cf22480389a053f71544cf594f6833f3e4d91fd3d9091df0978d04d3922ed72a4fa3579c5fff50eee812dfb2a334148227a0f5739f8ac6 -B = 6935a3444434b0b03d27545721e253e4281884da027246e46ddefb01fa7cf7a9a030581dfe618431a68ef6d79b03b34f3ed598e7c8ac030e2b4cc887dd31664604fb8afe4e71fbc3135d6d3b4e596044d6b615de7184ebf8dae8fd58506286ae4d3b797aea911eb59ada39dac756d0e9eb6a6c767ab77b9348929a00f8e311f639d19ed88c86eb91f0d4cfddd34e98130eb520fcd2b77507c24b6804d3d65d1b21e6f6d55d1f6e92bba0544829687a096be79eaad7d88 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 24823628d4fe9540103ce5f611f8a6ccf18788120280179a40c2636f30a13e5076503e8a4b6b6ffca21da5b0f9f0d85feb2ce10b51292ed069f35289ebf5130972d720d20dfb8e6ee80c3ac598570d38e57ba33dbd75f1b03eab7847d865c3e8e471ccaf302461a6136dd13b8d31c9f163799a3c24c7284b8826608a9543816d -A = -1d476cc98529efe5b926aba3160b261723b009e9b880bdea04e9b5b03f173040ffafd1627b38be8e00840e85d7acd3abbae2f7a60b305256b920c2b25a8a4373ebbf1a0c69f6e74792cb0d849872500519b6d1c190da30c572e26b44590b7ffdb464a900fc38db013feecf909b43bea549e05f1b7e70d6ad879c613293cf61f0cecdba1a6565eff1bfcdf740bf553ffd5bb7d74f7e9537897184c527b990dea20387bab0dec3e32727786bb14975b23ff09f8 -B = -2b6e12c87ad91a2fa878b9245875209cbfef400e637b557c868ccbd6e94dae65f1ef8caab61f292d739b139e384137a747210c09ee6f3b2ceb6dd212e14525852b8c54215191e116b7097f6729f6426a8bebdff86cdc16effa08d932ab512d7265cc0f57303aa5e6fd2afe0a45180557935c230558d02c3030b38ca88de5fc75c1240d25a22fe32c4e5096aad0078d50989812d7dd0cbb02c736fa563efd32d14109c44297cdb3d4fa3b93a2e15bbb6eb678e93e943979c2 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2c4bc23d0b4b1f79141be9149ee20cc9f1b58ee0a76d5f4205e0862492c18daa20171285d6ff0b600c358be487e78cb5450d151efcff8d53004eece94c5a37f49a15fb2b5f62a79568382cf0a4232407b139e1ec5a9595bee8435b4f138dd72fdc2946b03817e49864812b7b61f179bdd8389791178a95bb6311df0a5c60db2 -A = 5b0a181f07068af6e1e4b715d92c1b8391949a1e3cf0fe0aa49f3333c826f5582615d39ec28b1367804c1ef54f15fb83b3c578ef3ae957fc89ef22a343175df3ef2fd425f724ec1c3363aa000ef624d64c6d678a4cbd90b41cf7d69a7e03dd60c5d3470dbb75228b34d35469847772ff3d74b1a89a2c492c082d3ddb45ba4df6e3f228de6c64913b79679cbbbc36a2924e722c2c640d0c5a0e90ae86b5364dfbfae80df3d75823aa58ac6c1da78e988a11831bf -B = 19567bbcf615b777b35fa7030db7da18126cd695ca7dda67f5146c97beeb20df24ba0fda4a4f03523a0d9b9f85d9acbdb5793ecf9c1f4ceac81299a1aa34417779175a4bddc0e95ac68309da51e4f115dad6fec33a75d0c5520692a38df64e8d684c9304f9e2e6ac6a66d2e16a03c19a30efcac712aed2b9ee774ea28af4f37c45609464289de3f9be379c733d711875216bc223f2f468a0c9b4a8277bfe49c590ebce2e027102537bddbf2856c3b6e9389c4d1f5390cb0f346 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 36e1e0b44e5afc35d1e19e88e75f030569eb99d326721ced9bd7416ea7367a98305354eeafd204f1f8a652a8442eb0823d2e6644e6320933ac481a3709777381dce8a7c165b23aebf31b2ea2745ce5b352acdf0707234c824da9e1af98bbedf80e940fba00c229539f310838bd625f1fc103f267265ac1243855622c5df72c17 -A = 1dba8bd9d1e6cdc117a5a01b5046353084946fdddf2696f831a942d9db4637a5ee76b84d4ba63156b8cbc72e40559a2fe9b8e2682d8ba1db0cea042bb86f8ed71f6609df52526c42e7494f6114bb62263d36784dd55d396018b8fa47fa49ca6e5c76ebb0b00e6c764e36cb3ec75e3af6a2c14dee01fab78070239638521743d04f184dae79d49a2bf209ddeb4cc72e0c94a93a47c107f5369070ad95ffce034c554fe2a8391e67f817c6cab5b88ae9748072da5c9c -B = -849602ea3b79b33af2bd3ef9d1250c507d332e759d428902dbee054fdbcdcdc0a357a51d00aaafdacd696a15a64cbbdb7e1fdb347be5ddb1f609a4390a6f29f79ccdb51bd1f0547d0d9a2780517f8753a906428fd236f8ee1b433e57f2810d0ad51846304a5729f53a871d8b0e14355d24d3f092e50de4f044e2b8aa14cd8a51fbb2ff36b0b37defa7be768c56fbd4f5169d9d4698fb9072cbb0a037c219552728587d7c35f27456c02020f5f9374b6c53bcf8eeaa14be51899d3 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 77eb3cb5277ced02b72368e41f04a35796c2c6cc1273f109336fdfa745aba7c755b6ff3833e9b124d9c78584f6bfda1c94273522f020371107870c288592b7c23964320729d2308bac8813586e72078119852e1d7706d8e15c195486b8d94358736869b15d59c037ba4dc8032ceaa31eac3a9e3dc51ee17706a6956cff8537b8 -A = -6a0753edddef8b74f762bf802d7fe9b38638923ee2d81bfdda354d40df4422e6ac43724de1715c4088da2e68b63c10c90b236d7dcab39b9a0ecbce57628f4c2950c79cc88a89daa20d7a8679232c8ce5fa30525c56011570107697222e0eaee6871adced52ba01a3aea0ccc9901cb3a09eb4db2f93aba0083180bb41f3f9eaae00fb458381213dad01997e9b88f21b0a79ada1ec3837ac2b63611455fab6839363b796b105c3be6106ff284544bda2a32352bbce6ef8 -B = 542c5fde65111ec8a38d76d8c5735cee17329dc41cfd0f13bf47e6d0e0093a129f3449db380ee9a70ec1e44640839ff18b950c8fd89346cb4701ef753e6ef49dfd9bd27d9987e572bf8e68df399cf945813582fa1d33e07be938a7729efd9a5e7d730bf61c537770a0727f6bb9ea6add5aac9267bf910eac1b7d92ab4184734ef8b1d184c292b2b4295ec1bfd17b8a2a2e4d315a8b37b8ff9bf6a1e94a4772267195c5a7ea6f0a0c267337fb97a023f1b50ad697ea31451192cebcbb -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 660a1f378a23fc3b47f693a347d90640fef43add9729d74546933f4b78a26968cc9a70ad6fe8d85bf28164881bf7a99e8b96683c6f4fb54162c144f99a27e3feb736f0d382d7e5b934cfa835c723191e5692b7672cf6918c4a7a93b24af00b1beaf1b80320b14cf2d1539e3376779872542406a5df961f765e59f3480e1cd40b -A = -1cd74c052e62ee8156ba5d97f28aada75211979b1c5925ed015ea75f693a04c4dd0a705f6a723ae7b79958884c96fc07f81fca064ce2affc70768923bfbca6049952eea3ae048425b7c6ad1611ed4b8b77f7605629b9d198a77a27f25eff2f82867845cc868edee4ae31afc5d022b2ffbf43c14fa01bef8d7cd9d0e58362a0ff9abbf250e43ea5065512cd707791ea4868e95d8fd2357b3b3aec1a06888ae940751ceab01cf9e49015d42371fac30d48ef5853b6894ca83 -B = -2ac904d3632e25a4d536097d80a157791a6aca6eb10246ea21f4cae07aafe907c6e4c726694e14ce12e376c02d326f4bfc02ed539a5b4615a3cf5c838ffa52124f9b843598a3821cf9f1fe94e7206d6a525fad1ef77e7e77162e8c6d3d860d4f568e8f81153dc47f167860cd52c1ca59b15f1eaac6b9023c8b375bb63b6adf6972af8ca62b39f044378b11c4a969f3939d9fed5cbe18c06749956c7acbf963f640a1e1ceab73fc4c77463ee8d1575d018f49bf0f08161ce4f88aaab5a70 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = cbbeda9c467ca801ec66fce801c6765a20148787dc6becb199a15c58fae8d20c1d391a1d9d57e1c74bb412e1b8f271dc2cc53c3355c83f3e2f00f15eaf0df735160a48e2273fd1bd75533cf94c5175ce67e79fa6c1422996fae36ba288a658a7a5422a59d39dd81ddea50979e933efc02 -A = 7ea551efeccda23622a1a5029e5525f46d5ccb83c28ec9adb7a3e97c2b7d936238c483a4a9bc92fe0e21208d5703611e2795b91fd5019272d255eeb -B = 19bd92c534f56dc4235dfb7efff6d941112d66acf81b079382c86fb10dc5473bb8adebfa53ea3fe6e4df8412e7807aed029694ca786 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = b18a9cd6a0a89578ea773fbfbf642e05935a995a38bbd54480ea3ecea1751370ef95ff5ad0e3203613f0ef6833237d549676a95b720848c5e9897cda82642a2f373951d5746b559bae2d98ac00fae26e5957c61ac1de95318b1b1aa6d5c64a6ceb6575f1b807060f9e2a241e378e6ebd72ade7d2df18d5353db7737caf52f888 -A = 13c68e450e9e091ae45863f6c1faed25906dcd90a43620b1a40e7a506e7a954256bab0225f3678e7ce6c4ba6e3a83c8f04a3491d9bf097adbd98fa6e78 -B = -ddef76382342178fa6636e62887fce6e19590065c766b047073329ea15fbba96f2cf088fa5a989f6ee3f6a513fbf66f621c6ea6ef2fe8 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = b18a9cd6a0a89578ea772021f58ce74cbdd8c44a09b3937b198adbd8e95e8e35541eca26438351bfdcd8600b4f9b71616e1f16cee707c712d40da9a440681f8c8647bc90ba4c68b08ce4cbca458bebd5110222f06b2ca980a2e9419e71064324e8c36289eff9c67f6d5d011e6db8538a54aeff8c20800b0949fa42c38fbabfa1 -A = -6d7e88715e9854b435876fc9bb2d25218a1451efb73ad9cc5f52b2bee929530e6618a858000b3f24fa5f47b5f461c84eca971e38cda6e1f475f6612ec32f -B = 49eb76e4614ac7b0ed3f534811a4ea6da5ea24be925ffeaa38bb228fa117ed56ae976b590d6c9d9a7a8546d8a6ebe4bba771d6587ac44f09 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 44f8596fc06afdb72a6e4f876b70b8d5d734589f41089c510b0da60ade642fd79cf8e705f09910912624fa1f646da596c137f124ec1a327beccba62a44f228f3c0977fda2af631e249b2a4de17d170df07bd812c233a96d17e1e93910267682d24c5c485f99aeeddceb658a7db258a2fdf73eb0266d26b92e -A = -122231b14c249820f0dae625342415f0c6e7f93787b4206b79e9ecaeb09623636730810c7936e17a1eece68edc7c97218efb17c069bc59bdb9681a79c910c4a -B = -3cdaed858523fd55553ef85d018c1097d7b88f6c30060d1e77b84821ca20b5625723c7d4331ccad1a70371eacc7f7aa11220f83f1bf3595650b -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 6de7efcfbc1e8d2cb14cbe4465c4ef71f0d1d7e80a1d80d9ac2d0b161d45fc9d915c54e33131591e8daeaa11ce02404c9b8494added1bd83e344ad4de7c04f626315caa56fcc5ca2ddd4e1ff064a2957afeb5d280477bf1f1195c7294d89049024fe821dceb53c7d270a8b4653e2fc0a4d8a3863a854bc3794753a -A = 47423c4fec1eb6779fd23e3d4070d0a7bf9a946f5610eb469876797a39c58577242daef8c34926f6974089fc595508d9c573d0a275cbeaf37172f10b8c849a493 -B = 18ad789cf09e9ea182eaf43b28b4f2540e533f0fccad325430b73101c00e440bb64b70ce0f2680184aa8caea2f6f6517e9b80285fea8b61887a41e -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = b18a906994d3247bf8a00f20e4b349a500159d086aa863772e71a68f91af9d19e4c021843f8bb6eeed1df708d55047dc8faf219e00d559517632dbd1cbf4bda61651b9644481d052903be1970f04bb4ee8faab9adbbf858324e6cf5aa9384ceba655a1a107210a9497552ba8a56d5e0e70b0c757baa71d1613683707357827f0 -A = 122773509ee608cd9ab3ff6763629a18eae41be64bcfb05122e0b3e112db48c64d2a5a515d96a042850c1c848ae5fd5f0ccc57b273d25bd8d68568cb00bb17b1589c -B = -af398208c01ec9700e332f3e694894c7cc412a73bde8a79e08764ded92f0d58db8056883972c79a0c9e0ce810786cdaa3629baeb9e5c370a5a59d3ba -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 64ef5e7063a1d95226569a27218e35e93d870a19a43fba9889a2ca98ca5c573fa56ebd77f1403b3bcad17c1351803a809c245a97bbe32b45e21768f28c5b11ad542f5e687a17f7811df6c8735e1778e94d9313c19fa32a6703af7ccbd88b489c96632d10eebb580cde3b905f6345a2a2b86a871b4fab36fa4b0dab9a6c1c5096 -A = -7dbdc37a51b601417efdda2516aba15827a40ffc304c523a47c544d5c0bba6c1367a20d8a6268a5c3f723b1b68de57eceabbb00d44185ec4ba7ecdce5d80456f8cfe7e -B = 641cf85fcb5fbacd6214be4b7b06fda1b80f4683c21c1d08311f6e23a15434b42d30a51912898a1c46b46c00aef7ab7663ecba683897825a4b07d2b7dd7 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 370f20360ac844bf4275f78b7fe71ba5db6f0bbabfbac3384c04b256eddaf04725d2d57b31afa48f047aade156c34441b4a41c0b2146790a2e15d13b584021ad55965588c6e55ed3b5cf5c36b780a27c5dfb72678d57528ab17ca2ac696aed3d9abb0ca448d9d5789fe37e632fa9709f3bb924c4ce34244d239a940dcddd9c77 -A = -1a0cc5b07271098a23f01b3c0d47cab8b294794b74a8b162ff3b313fcf85ea81fc99433cdf4450970311e1d5ff81e9ba27eb867073ed250aaa7795e44ba8d4000e879bf31 -B = -308f93984acb78c5dac2426d9bccc2e3ac361143807c7d34c24ef8f8db5e68a904ac8bfed1edf3cc90d21c87ae4d224b8c46fa42eea77797f94aa848160fef -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 4c8f466d1d9829aaca1a22fb6ca5bdba885606b9264933ac2b4c18e3afc0c406aa71ee7ff490fcaa804f457096e44576ff8096fb1d2b3c68450a8bc36d1a2797ab8b621ddc91d75e7d6ba01d86e959171fa428a5bb1f26766f94a553c94f6dcc2e0af90d7776ed3d9fb67e842e88f7d7342afd86e2f5d159db7304ae4d204a3f -A = 57e894e37159cf3c161be9c97a946454e43bf09a7ae8e1437570a86c6b06f84005c1463d27d726afd2e25aebb1657eb78957a9a12c8749049d12007a81d766dbe008aad6d83 -B = 16dba5cf077403ff4af47438f5840f65fa4e058c5cab3cb730154ae0fcc982ea097c6d0e75bbd635e97314f33ec7e31f0e41cf285ecfafaf36382b33d5e83cd55 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 29d13ec304f26247a45ab6869720720fe019d6cf370b9e2df9a65828214aeb4f8b17969b8dd54339d08eb99bbc66720ed78ef79033fdce6da33501fa8588af86ec18be4c4ecfe01781f9d1379865100dbbc020b892e77027d1f04f8171ca51fb73129dd9a96568904eb44e19f56f842b223724a9ffe28826803185e4208f0ff0 -A = 135ebb133a0beb909101da896e3aad7e26ea72b23e60802e54cc6c58a07b1205e2ba1fef6eb86c420f011b70e3f725aaf9fd1873b6e1c1cc7005c7c09e55550414875cfe846357 -B = -e8cbf3feb7be7fd12b01d5bd024e47538f434b496613320ad71f48a8972f687992f97e4b69b5842d2d6a4176a5701327c40325e98b27e4c0f8fee5a457d92181e40 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 4309b728306535bafa6787dd79e58324b3f86eb5409d772018cce2159f75832b87909a672b8b4b14342b352e76ec5a6dd66737cb0a20b81c5ce222133bfddfea878b132b6f9fd557133973a0b44aa41a01d54ab565d6b9c62da67378a4058255047a95923daf5f0f7adff2a3f06074ab1facd986d7d26cb475ee818199a390b6 -A = -7a63e108bc9790ab687e0fb8a1cbe1e9ff876e7b5eccfbc136ba05fed93412dbc2ffb1ec49518e9fb867429cea1d7f82e2b159b75bd40eb8370e8a54bf0e0ac0ff24aa3662774bae -B = 51ee025b2ee8abf9dc5ebf1a4600131c00ae4b6bff966dae5c49ab5b9017e6b1abd6434736df6daabb2bde254022783764c94e66743dc752c9040563df7016a1581fe7 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = b9ddcb9ab858d2229cbfab87d87236e8206cf5e1a042eb5ddde201d56e2695a3d0b2a42bda6a284fbd2a5b2c2b80446ce88c024137780c277ec80bfa6e9d15397cc5bac98e58c9130756ed0fde58d475a033fd94b1fe0ecc6fd91a8b42177abf3f77e87c0847a4244b9fd4980f3b42c7c955836bc994f2babfdf9c5b43315ca -A = -1f971ee9a7c966d1e82166503681afc280fab255665b850645321f67da8934baba1226e9efb59e0ac4483c8724f63556a213f2224b993e4e082eefff0056f7aa8a3cf5b655e0f72ddd6 -B = -39309313b04bda1103ca6f56514026538b4a29ae258a2a66424abe2c652b959f5c1dc4755ea37ebbfe404839505c2807ebe069c9abb9150205fe35bc286ca12b64ac46133 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 47555924c31f040619681d4a12064790e981db2c7853efa17e4d20f741f33c56d80862caf86bfe0730870b6c0afa9caf66e15047e60256fec29469d1760d5e9b77d79a84fcf7a1dcd0168a59f870f1635eb033e0ae0ac17bdb73da803206d48cfc1da48507cb812bea540daa2393321ccb0d88b57abdbf3a3bb765692a2c2ebe -A = 754d78d5608fe8c7ed8e26a174fa27833a24c48d23f0e702454b7eb578cb107da537dda11027dd6b41daad329e036794de562d7623bed8d9b0e909cb3fa38d4d21a95c5f4246e0b030a32 -B = 1839baa8b8fb6575832136f1d4632f72f36cdbbdcbd00f197fff3cdb88b851cbd74910ef6d43cfae9d3248e9c85662d7fb596ae45a460feaf308823f06345bc5fae8823230af -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 9b2f026b11d0674e9ec060fdb24b45fceade3070db4405b363d53df1219a02a664882819fe602f430636fc0bda935b14c55c8a0bbcc9b6683417e3ffe7f5d58fae229122ac6e42e76899254295dc5a08ed43c79120a5e5e4124b8fa6048ee90836bd2de51bbd2c6b9b53212e913cde871f11bf32f91b3a78575a006da36627f0 -A = 11402b3b1a45d67cde9730062e38aafe1d04fb1f8bb1975f25cd9098813efa2727cb229adf9490267bd437220d9ffa05bb993e45d2f889f140faed3ac3c7b53216455a830d6edceb02e8db92 -B = -d8e011f18bde068badedce8106f6602429fbcac4766334a0101b57fe94603203a4a8975fa499d8a68198aefd9e68f28e68914f920eea1083e37c67d59476bca9819a8bd628b89c -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 3a74066e7eebd9b63a1dd28548be60573c95f29816f3b3ceef68a5f6bb797d7eb0b0f4ee612dca794ff82f5d7461d995b9dcc09649e2587639ea017865328bb5deef17b5283691724e8aa331d75c635d5e19ebfd268fe5471714aaca8b48aeb846f241c1675e18d35f029b132f81128f19028b0a471b3f75a530321135e35fbc -A = -6c5dca3fb7b85573d1c8899868940794e428171e207b5f9f89fce4b7159236c0755e2959d870754e902e9c40dc1fddeeff6364f898ec0dd669283e6d26a612d9af3c3ab04468707bb8a7827756 -B = 5446269bbeb613e69286f1012ff62ea767965533624542f3b5c866cfb569d6193aa603061701992cb4873ea8b766606da1b57d7b37cf52f52bf85b58309387200b0ed36164f30d52e -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 2a4e727ac67451ca9dcba648050a085196460e4aa4836c5652de863c3e2a76213e0f590de3aee8639304c54a9dcd5f7d5d3592f647e3d07d322708e1e26329f4a31d66c7f2e9d482f22cd9823074dd57d14040a4f00ac2af9677a2c98d58ee1e094b1a8c40092e77eae454638bc3655e77441d4f218c637f95c147776f5bdac1 -A = -19fa688008a12cae228c6ac4982ecbc88da248d7ec785bf2289dc9103bfa3a91eb1e5fd6afe9e0cc035d3312e9ba64028fa6a229db6d0eaf8af43d8c410be7c689c3e557137ebd60d3fa04edb60cf -B = -3e8c87fba4a41c3a84874c987acee9f560b9f027338b584a775c1fcabb766700f758c4d451077a9427257334a569037b0bd006375f71223add62eca19b1e26b86dde0cc251e48d3b60ef -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 52e4a3f6892b425b935c6f9d1396d2034eb0331cbc5241e1d745a9619fa0cf0fc521585cb9d6b1034c5fbbbbecdc81c757f768c7a82f6ca291cf5afc98500c579f82ccf0be233066730f738c205c3c188f94b878c11268871ba42a5d950dc8a399887997cef2b6b68badec1ca641b88d1455e6d97a2841da49df7eeb766b7be6 -A = 67df01e34a26e8239c8edc7ddfccc3850f39864ed237d4dd67588efbeaaed1f884105508f69e20ff6a5cfae1516f6179ae6fb515a66ef0a7d633ba4218c30875287ecd0cfeb5bafafc492619942f97a -B = 19f5076405b3c81519c0863d0c963d545b2834343e42bb3c779788cbb46d89be3f775b62f4114268a0ca0e6af6c0dd659607d40071dfe7f1ad0df9a5c53b741c04612158de396e9c96f7523 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 8ac1d96abd2cbcaa8f7e3267b716f675aebd23694d24c112d202653979636d4d47e27cc36f850355cfc5ca16b78cd1848944f8759fbf6b03fbb7eb347536a9328a5cbb778a6bcd983081374a3f543b1380add14a9468358009ec2baa7ecdf13e7260968eea74083459406e8889936b2fb98c8b9a3597e5f9ca10b76e1dd0337f -A = 1c9ab23ea37f324544280d176cc02762db7a39935f1ede9695b53a3ee2db49d0485c6a3742a3b5cfb51f3c21711bf89ed05afd0886bbf61cbd57b23439a8a165484ee8e4c0e1c0ca2b6478776aa2897d87 -B = -e30d28dd01655b7a419d939e3e7530258a667420fc759bad585802c63fe5efbb309cb502babdad0afb208aff5ce5830071c5a974604c69ee47f76fd87e2460a5b03a57ef0185881502625886f -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 5df0700adbd880a5730d8c0637a362a9d42c64503c3b9784046b946c2459a619b5bf804a41c92ed6370bba730c7d39fb2e01558f7ec38511b0449d6e9db8df2cece4ed348782ff1582396ca8b3196474e7e5817f8c197c44d771923b6e286e41e7e23c33fcd8765e06793169999544a310f2e080ffe13640b85f21a18fa11928 -A = -5c01fc52e86f3a344180bac284d2376d1bd693f20a46479c77fa57077df62f83b1e81c94e577d1d6733d276f9cf70555b20e3afcb97534e4e0108a6cce87e9292d78b2d7367ff15fb33d2c3289d2a2913b58 -B = 6bbc39283be06382ea91ad6b1630b38f32385ec90019d2ded7ca6fdaa39defbe22585be0df9c0cf613f6f146c71f901adf525336f6573f7f43e661c44b7097f110d4551e8c75449da8fd39201ca0 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 2a01005f1f387c4d8d24a365708e2506b044f86dfc011262d3577f7313a8f51ab943037361bed1858e021f8a46491a5c73284c666eb65cea1392a780219f13d7188721d7d4b975272293a5eef63480f30cc9618aa74bc51f4175246301a46fdbd34a6ec72d5974aa920be5f321a97b8f19c0ec56ba10eaf2e61f2b45f134b304 -A = -108bbd8824e8c16b81dfdd4dfee691e012e578cb9cc80cf050c0ec4cebf71a968732da36552979ffaccce6667e46c29144dab75132cb087681d5549dc5508f3719e129553fdc97f545d7ddb7d3a4fc575ea67c5 -B = -2ad4d4078c47a3c8f5f9b48e10d52d72349ecf0f54abc60bad63bbbf4d8efb185de90e5e1a686859e1c429e30977fca492aedbf084019e9ceb4490aa471776ed2e8a09151b37c5caed9ede66922b7ec -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = a1b1b2d33cb610f1b398e03f274ef39a583d13af14b79e6766859b9ca748237b481a3cfd5d490a073e82e3c53d3ff5cb6219b2b2f71927f27ab6f567547a22dd35fb5919e1ed2b6dfae4d536d6d44fa6216d94d26b33f52db06c4ecb29702588b73ebce87569639f786df4fcf569bb07d5379bf8b83743327248c2d71b5dec6a -A = 5bc53b3895cff2bf7bf10e24fbdc43d17d277a982d5d92f17b9b5a2b9ed8b6104229292ef3997591e2e6a116fca21ad5d061ce438f33b7f7110293770f8313077152c7546cd522ef4054147edbe1878072b1043e6 -B = 1599b541c9809779df3ef40971e7a83f21564bd5d6596d51a3d96defa4dff41e83ca6247969a3dd9a746ab72ce21137f2d7ea015ac6b2ffa8a32997e8b821064d35afde3435b23e47cccafa74d5192535b -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 4fe8897417446c493725521c0ea5b2110f91a1b5ba236cbb6ff3f52b0036a49fc82274ca949ac2b592fa4bcc792114bf2f2a78a2cb44cb22c6fe7e4bee7981604de47f6da2ed1fc6a8eb32cd9b8aaca0f2feec76a2438126ae6f409645d897769a6d340308f82dbc6a98ac059fca6f903c5aecd668fa838b67300c654d4013e3 -A = 1717c6503d069103f10bb4b36427fbdd2371b30793e492e4161fe185b2e27469fef6a25566d6b46f6a7f97446315a22d1f1f662f912b17e71feb2c82411ed7eebb84d4f594deffee14934b75a845d83761f36141ecb7 -B = -8808f540521c20eefaa037fc5da782c891fdfc668b955eaa2e4edb592e027a964b4cfbc94c548d785d92992abe282d90dd137c4d76419926740ce138d567da7350d89f2e56772d8f5bcc9ca8d7076540fab3 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 8b9311808bef497d8a5d14f7d851567a196a051610246964917a1f9d4f4449357d2411ba9fd93983f6edd76b8a8e1501146b08b6e1fcdd97b6a41cf637b6ff0cff7a2d6351aa1ded93f8fc1cedc81879eef751bebfbd1559d5d0320595c79e3eb1db0951d7c67c663bc57a672faed9e14c7da6be6b0c6bcab3d4d515e51a0b5d -A = -511312fce1849c3d177d42088e55d534f9f7096282916e16b041f66ea90e2cccddab5cec0ba8ebf0b047ccce72da349f420cc28ab19bc156c1cccdcf5216f19ea922698127f090e97444751dd58fe7a2c90197a9ab3d35 -B = 6a5cab5e322d5f651f798aebf43a62af772fa2cc379905e72d253c49be8193a07ae6164f21cf08baff906ef800e361e1cdf1604f454483e10c8b2bfdcce77c12b0320dea63f9ac0afbb86115b656d0198aa883f -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 665e16ba6cba87c646637a233ae04805a302ef4a10d79c5b65b146cbab8c9ccd491faa32937d0ee955dff7dd0ea3f79fa43c133021c8680490b91d9c1d8a8102ab709ada7508bd59042940b2bd3a4f8c195f781313e45fa8d3abda1f8e13b35811b638b2ab101d1caaa92188d2b75b2b10d596ab159583135b0d4d15fcd3d882 -A = -1375af024e9974cf8170801f4a709b4e5862ab7d18464077727bfc2581e557cada991e9484a1acf80182458158c44871e67e783f7573f214ee4ea1f1821a65068f2bbbed7575f03a4bba36b0fa8cb6dc58c73b100a6c4a6ce -B = -2d64b6bd987d496a3c121e89f4b0c88b6ebc6e30fa9d47981b52862551f3b7251a3fc376db0f2d6daab6e6fc5ea8fa10b040d0dce334ee91d8cfa6db9648df907b199bb11b2b5c41c67d72b760c404b0451f70fccf -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 49e9709810d9f3fef159e5cb45211453e7a94878dfdece19af839b89c0e43b226d7cfd46859963c7ccc753350e74c2501131474e3b8e0edcda18583b0392ee15f1dedcb7144000fc7fa7eabcbc83d12983d2ade477b4687d75b723c1a98a951d21b2e8ed95735aaec77e00de288d16422fd259c665a08a34331cb99299ac11e2 -A = 4e550ba2fc2a44452f068860ce2a59230738a7a15f5de0aeb4d15bda8c61ee3003568dc5971e48343d402112d7a86860a7f08f5cdc0de21fb1aa064ee5df26fa23839b5ff6adaf64a4a18c07efb3582c2fc9612d2208fe99f8a -B = 16f31365545772f276d8ac952506bf4033a884edf1ce583a63d8d9f6809e29d9cce3b3d227f839e6c09b459951465ab4570d2d36127c0f677fc0a63975801896f2fd17887ca16ff7f265e2e7adab1516ce56ee1ee9de1 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 89ca20a3fa109a65b9449edcc729fe97ed45a9bd69eeb31d4a566ec1787b24cb7a2c25b3f89b36fef1cb3645b17c69ac8ae243cdba35e17f5738b35278478bcc391add0b5ec42db9ec1eeffa63a3ecd2ac0338db57cde9d2eb9ca4bb1df84f1a62245c4e585c4f20f26c98fa1957df34409a99a18bb442ac14f0bd309266a35a -A = 1fd8a096be30e4435ce8cc604ded337a3d9d2fbc9666d1893c38546c4e155315b536d1bc323c1e7be162bb0fcd58440915b053ca0d0896e99265241f2afd46605a2a7486e1394a07b23f3382cd190e943e596c747b6529b04bdb13 -B = -a3960a51af5ecaaa70146ce55d639005e9b6b9b58592441d5876fa71470ade6d1e2cdde17bb80532551bee0dbbb71a0cb24dc8a129c1f6e28920055d87e9c66be27fc4b425737f36add7d72e39bc83aabee5534637e2e22 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 654d9c55d4a62976670a5ecac3a6165734a65f1edcc1ca81a8c444dbc98c3409ac8c4f6fbb92f122045fef8b7971a276c7dc4eaba21f7be7495394053d4f9bb14b63fc02c8a55ad8fa9bb9aa26aca5c47968ea1b7646ec606f53606d5529ded83639984683b8a020e8ded4b2d9f668ceadeaa8160245b36a819db14e58cf2bf1 -A = -67abdbc70db183b8c25b0664805ada269922556bf15aa80a47d31f215e216673b8d59edfa10a74f3f09d066055c3b9abd5434ce95eba91dd51576adcfbc7e2556df95fd6642a3b7e0486a635ed5699eb7fb285589c887c8659a2b7db -B = 6ad3e854ea57aafb8980f1e99ab9cda24f183dbbc513e1fc92d4e239077816843f47927bac28e41d3f31c9ef134b72c09dcf14e2e9677a430d43002ae70c577d9958341243030fe58a800a068d6b01fd377e61844f0d434dfd -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 74bb23f7b0cde7924ee52e58bc0680f151e6898cc1bd4a2eaaa05faf218b419a19ebf85b0219f924a26002f9251b83506684af659e5b680e05138432ba227977f38a479ad9d1f3cf68a86ea214645fc4bd1a032f995307e9c9ee432e816fd852655ef20214e24522c17799ef41d1eebc6e097b9792757f7fc43124c609ef9696 -A = -19d3e6fd6de9092cbea55d65154208a0c93ae409c3ee35569cf774b8c8b7b1c9dfdd52e9f408e14ea3153073ed8d92746474e524a903a45a882fe46af92b033f2c41eacdd7e3c1ff661dcc5349ed6bd1aa845eb1762f27593708aa185c7 -B = -3d466d29e8c0008ee6f402551e3d62fe044787bc9f243db9252ea97da9bb75f5be416def97f13cbb008fee77f2eeda672bccce1f36fbcd26e1f1299619535da0a3fa3ffa0c6fee82a494efd7407cc770cf46ed1b8b143f42790a2 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 197eaeb8221b431d5fed3d701a175abc146a9fedf8060e8e611a54f8da2fb27d2fee4539ddce1f3481e6a64435f09a2d5012540d6069900a332461471b22192fb87b63221c7822d3f2fcc35cc38feb6b3e49b5b0fceb52b0ccbdb4e1fd7b0f3eef3d582a6ae194c249ebc52f215b568712b3e50bb8e01c64b114955ebac2da48 -A = 7bd216d0acd4ee392258a7341cd56bfb0968492fe75da0c9d935713a6ac883525a4a520b5b7940b05e3f5e0c40372cb11b7ca193e93f0d3883fe5840e66346aff0f38829322bbc1f0a0e63ce5e528ba5b13596ad7ca19d20b2a7c9bea4214 -B = 1ed4805e53630b886cd733e5281f6d2699b3c79da615f4056120165cc63858ed2ddfcfd0af0c5fc54662aad90f26c55dcf70a30d04ce05bdf61028730b900587716e690dc0c6e02419622ab8c115078b92315e7c7a5ffe38c4a404a2 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 40f69f2d1660eeb6e1840164817621dc95eb930875333bc3f62a644ca5910c1080505de0d54fc9fb6404a61bb2c03b3981e558abf9e86f2047c3928599b529ef3d91c7ccd13c1d69431fb9ea3f02b001427cf519d9fd8182219ad904f47b3785fa05ed24cb0ceafd537311633a2e26c27e61be92eefb28a49d7f583cb6e072c2 -A = 155fb75044fc54a6ba6c46972e2f97531861b8d6afbc358db456bac33a44bb0545deea2fc83023c08b7be473eb68accf5b65b3c5d6af88bc6d8ce722c80d5d1527e475905226b01ab9d7b5a6557250cf8be935339db330df2dff92f2e88e80da -B = -8c6016966a2cdea4b2d8625aa367e1d079638870f1b61e6b3c3a1e6281ece41018d2ce93684d1f0088d021107fb595390664c11435c6c0a7b93c2c6895217a89c469a37d3250dfa457b928ba6119b5c9ca5f2d47b36e60e4325bcb4383 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 9b9e6e1727326fea099eeb008a36539f3d47e3882b77d6089032b99c6cd36ad79fa75b7c19d1509b3ff022ef781b6a8c16fa6881f9ee2c4e00a4dbc93a49829622f4ce6ba9c55639656102d81167ab8a5e1fcf14d71caa60be732f1fbc71250256520c7c5a4579c3fdafc39356a2bbf2c7ecc526dacc0293c7578424c939ab6e -A = -54cc11ea9806ef27911ba721f19e2ccb111045711d301863792f0cfac798758f0a29111e3a0f84d294a79721067f50858767abf507cc10ec9ea3eb27a91f06e7f6b7b4be7001b548cb7fb734166bad6739935081bdf6d35d58ef56180d377e5fda -B = 7263e8b9a6f5387f44c55af64b64160efe97ec8a8159e723ca8977bc17c861e22041ea227c9c9bb467faaacfe352b03cc620eceecabb6db2db108b49c69752bd0cc61a5e998ac2f404ad052a51286ccbcfaa214ea8ec14cd9a2a6db56c3d9 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = a18a7498ac9194f600cea3d66615595c27a3efa7ea196ba12a80b5f608f85fa72afc366d23f5ca98452dd190b8f86031a9dc097f94a217b29fa676a6042a3aed2355cc8e767d464a8adb888491c8cb82dbec8f117f57c4a07b41e7e6f6cbd7dc25418603b1d1d865dd2140a649c9d52019ef39dbb6809d1b28b3c1ae64fc6813 -A = -1b663403c73e4a9003467ed12766f16354f79073ce89b66066857d19f3b42791eb360004d23e02874254bc6db54662717739eced153944c4776f334576746c5c4145b21a23caa2b2a137498554c7b749efcaf3393c5457b2bb87ee2ca3bef5f191107 -B = -21d12aad97a5c6e639a2ea0a82b1292aebd418567718014465a22b9ac5c8c927963a2a4530c41d5a7a6c14805e56a7092c8716e4767b54a393d8552c5d3c366b39fb3b8667c60e6075e9293bc938e407c53afdd1174843b76aed187f56bb4be5 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 1983576ed73d4d87d8b94cd3f70c149c0273e966176b85fbbbb7b3202e2c843bf1f8f4546ad7a4916ea4c731a22bd337b6177fcd2da8bd301f3af9bdcad800449b57986e7cbcbc7eb313d6512b2894c0cbb6cd753a870860a49d6a682c20b5e883b8c4839b3321aede51bfc42bca163a924191feaf05e196d8dcb7fdd9941a60 -A = 576759af0f02406e8dafa330babe9473d9d970bf371ceab30d2f98f4470f669e042e1708e2677d52cb9f99deb9b53f30727d16c389bb63e71e923475314b615762c7612269b5ad7bcb5108068bb5159cb8dbb8d08de2bd4fa4d9db6cf6e3f5997b9b416 -B = 1a4e34794747cf4aa626e964b839ac497b1357090ff63088f9fd4399312df894e41b395d17b8ca1806baec6115b1476912ca9c4309f00a46d5f7a52c8f640075422af06d6d6d796359132f4955072ce90e61b40c992a155b2bc31c262e753aa7d00 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 3448648ff9f7425937b6faa54551ce14dd15566e5d41b2bdb1a8db62037459235a5b9546d289cc2295b0ed584fab2e1a798bc25a0c114238f61ad3381a5b441cb67f92cbf66007c980db3351adb9cfd2cfc769b5b9b0bd1701425ce1ee8d4b9f438ce1207fa850aaa1d3d1f970aef874c2b2499a150d29c2ceb7bac375009b77 -A = 1fb54cec882c274b98913e76342a9b8e631bf1d381fd8a4f7e0eaef475642ab3f5da70ca2e38741bd0182a959e5e985f1e0e7d737beb8c725c9b5ea22f7ec25b6e564809601e8405a5b1362e7792791f55ab64a57c03a99a8518d7f65feb0e21be619a6a95 -B = -8180d172d3afe00e0423245f47591d5f750f20d2cedd8ba6ab6f9aa24f74498a96c9001a0124c4f98dbd402b63e71eaa3a7af8b0d2fa417fb1d45f64e10030232b9155169153496aa202745a432e547002954eedda7cc9c1ca76811bd902b192f1a1d -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = ae0fd585408a99643271eef575285a6261a4c4a92c1956b1ab436d3cacc8d4cffc07044e57b357ffa43bfa9aaea57824319579c5c3e2fe4dd48bc818178beb5fc1ed60afa08828657d00bb88894c975378b1dfb452a5b88fc3c1d81099644a998a47a497c8a2b12c444fd2a088f47576b7f4fa40f34a208fbc3348ce33e59150 -A = -7dc7dfb753c0bc3ab4d07d5aa78664a7f57d64be4d4780ea81e3efc967fbf1bd1390248bbe259da32108ad96bd8b39f2c9f118bfdc96bd06147f812af831288bb687e4e1742dcd1dbf2b7adc41afa28d07dfb8df8bb2da5359e66330f5c65964096a96b31dd8 -B = 756f3e407a3ae698f103fa37759e90554f38378a9b8eb38581e0970ec8f9c00f8392612c61aca5fd37d1063b78c19e3109f35c0684ce523c634190b3164ef06959cc42e2b77e1bb2fd50eb59c3dccdb6090beb809ecb0ca30457a5c5948328eb218e219d -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = a2aa4550e855623a8ed488bb63db8fa4ac374c1ae953781aac590f78a364fc33380ca2806445fca5bb9ca2fc7ec4db5819dcd5769e3b746286c49a7c80149e7fe276d095929e2cac6ae57e8102f7d4c96261ca44cb6f1601f429528495b6c3169e15f9babc5be696074d45559d5abdac42393094c450d6a4a45bbf60ed7847da -A = -16d0aea9c752b2e6e4e13f7ab1f0a2c1776874967b0dfeeef7e00f8d9edd1e11d2aa702be45fffc284c47811c51dcee184a134b8f6d1874026eb51e2ec80c94837af4602cac3efde556ebfff578fcc56c00de99a43638ab68387ec087ee269ca64233eb5b1762ae -B = -3c6b60b0ce4b13a5d6d9ccd67c76ec6b71b94ea7205e408eea099c7ced2f3a462954741d353d0af850b10ffede8ce0bf80b6893288413674504829793d7ae0cba53b163e3f26cd99beb0a9ad540f6d2cd5097beac604b1694a9a2f4c48b28338f9d6a63e75b -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 8a1a8fcb68c53846b3edae33ec070ef5cdcc1346ab3a98a116344e6d2810e2e3f60f0fe435fe7ff257c7ef4c122b3c34c776f4912a9621b6949308e2cfe2e0827536c7464371ce804bd7cac1d76c5bf8b4a6fd4ed56b65434c3fcf0ac7be543fe2d09ac01c564d7b9b463740dcdfa9068d4d8e33f29297ab452e6ec55c263de -A = 7c4878334ccd9e20cb11a643b206626ea5d0b20973f18535cd8f0fc2f0325a67d3558e4cc9cceed0d88c6d2215c220b8d0ce230fd701502b02081e3f6548e58e02bc2e79e4991f8ef188a84b0a367758b4e534b72cd87de7f82a26de14fafd162a50b359574812cda -B = 117d8b1d2a3e2049e6edbb9494c68a97145ac3e658aeaa05e8ecec4b090d5f467cde34e05fa7f5fbfa32f1d9dad70955f22130c358468eb371555fdf57a40e1df398c166a22a9df2e1f4e18590b00856b4f880f6629f1a4296056dc66a29b6f0f25490c6a8209b -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 2cd3de06953acb87b773b8bb28172b24adb283d6adada676f5f4548990827635c51506c85670767828dc5b4b91b45a7ab89a700d70bdba4e0355da32b52c173305767721d18dd2cb6c55f890611e7abc854277a453c7500efc4cd4fb8e6c9bb7a73fe5c77045e715fd35d415b3496f7463ec902cbdc18f9f6f67c33fd78c3210 -A = 1a20ad042f46330df937b879c72ef00dcf39fb85b59186b8e7a9d40723288677ff6ab2b9bce95f34f2de37887c8a9cdcaf231254bd00c7e25b6042695d7dfc05a11765120d1dbce29dc74f35aa1492ba0c5ee65114d9a246b57dcc2eb2ea4a310be98383fb934121db20 -B = -f8ec67323cff9d53499ceb3afd44b28f0538c39dae8c965ea27d645b430c2f8a4965eadc8ed864f2549eb636ec558419be71f986f4c5783d0dd5253738b876d9034735bd13b18fc670438387f84848308d9357ec2aa4f6a453bdd36ff08d54a6800bb41df416b17d -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 1aebe2bc35eb2e449bda63513b1bfb55988cc8e6ec8b3c8fed5ce4dcf53b95f1b438c41e3b2348412b35e1f734edba30273935b03d16efaede429960442a01849c352349e23b4af88de4d01e9ddb53ae900418d49a84b7fadd2669261a574557c4fbd782f8e8f400895f6a6c9679b72983ce01bcfdb641f5067c94694e9eb80 -A = -5f97994c39265b5389526e3847876a10aa3699e3c3762a127d1a9f892180cce68ca6139a6f71b235da26c287bd3e1aaa1436746d983c23c3105c33ed2e06baa1e880f1744d81a80b98ee1f16220940d721a92118a9b949d4da7d1477db8f5b357b3ceb7df34eb5f62078cf -B = 4bb4f8f4f4c8e63238e8774ed61a7eeafb3fe9a6e19cffa648defe82f4846e3378c892d223957564fcce79596151658a726031a6921cdca0adf0f5325d858c048a6b94312ebfd19b803eefcb93bbfaaddef120ec3b8c366b6d978524d5c74218da77e4c3b5ebbc66cf8 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 5d64678a32c163874d1c81824d628a1051bce3b55c37055acc47a8630d3fee648df5d319e50b4c56f465bbf696433409b89c07e442425d3018a059ec757d77b3a40d516ca3148010036b003721ec9c999665915a3c442d95ec3c01c232feb201be08c88fa3c6b0769e3da30f1d73b66f98e31f4306bf4e23de78e74743b224ab -A = -178d81e419f0473c426e24428caf25d61b648bbf963f7fb753ae15e5ea3706b53b00bfc8fe917ac9fd6c7096518584566ff71e6d35197f9aa25107a235678cf9ff8ae1501c1d5a15d2a27d39d066e169745e1e8c808209bcede0d732423d0c9cfbea322ba3201ebefc5315c0d -B = -27ed464895b65d9518923fde5caaac0c72aad0d1b38fcb7827d6ad4e0c8dc09e119b8b98183f0ef8d5d1133f3f108e951caee035bed0d48bbeee6d1ddbff5864bc192b84eb8a500cefd223972ed51c7f720d1736646825f95f2f10ce6ad47a267bdd8c80f65d644df158d7 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 52dfb6bcbbc5cff46942d76ba45301cbff76e9b894703a6a7fd1af29d615336372d147c3932589affe5c6533f28d3e6a57ce2d3cd7448bbd81e09a13266ea31630cf044f654b87ec3fa3294eb65873964110fd42d86e78d128bead5f117cac98145051552cc3a86c193d738b973f866d068a8994a49df3fc7c7314fbd9805e80 -A = 797c67ebdc083f3c8b3ddf9847b7f3c2a39e35ce2119f746ec87fd5d86671d8fcf2b4f6d440c43e93f45019032e629879799eb58adea729d43d2e40ede6485143bd35979609a12faae7e4393879c40c0511c886c66a24454e4f9912bea944eaa417c9942f09ddfb227feb14e4b4 -B = 1a599d1cd0ab3614f50b71b93c999942bd3d4cbfe7900122d5083151c71d9e0c299bd927095c5c3291418424a7c12947389bd4e0a3c2fdf67b3f512094ec0ce5b52695e527de2b3804dca2edaeb1ea4b487911053272ea926cf2fb3386dc4b1dc268b808bbcf4eaedd21168ca -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 99bb9082e4537426c61f3b813f8c97675c44ba9ca418960ca6e2464cf61ad4eabb01ba00798463567ed3d829d3f14201c740f19fca623b1e9b57b534a65df0f070a2130489afae89b91003cee432fab11426c4d13b7721e6f9db1bbaf0adc0064b33e4b9f4b795511a0744b52f93e3db7bc9c0a991e4e122c463ff344fe14cba -A = 187a8144a0045a92dcad94f0bae7285309ec8fac7dc864b08914e5a4dc3b1a6bb9212161a18c22682ace16a4bf3c03dbaef088b09844902a3255fd6adc0b7c6397dda86d6ab67204d8061c36ca20fd4bb348202037b249f6c110c31580148db46dc5b1bfffa38a683a27054c35326b -B = -e93ff16817b725016279a32dac247961ae9bb00af890fb49c4fd8cf5e815cf98b58cfa1e3735095e6034c9a2f2b5d8030ab30e2271abb45b347d755cd9ab5ab5ce37950380cb306bbec42b6b8056793a0955bcaeb23e2d6a9548684030566eca2d34c458f224c8e337cb8e3c252 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 631f53d02c031f592b3dfaeed106160488c08e0672083ff195b22a2c0b006f11165a245acad6f35dfb15a871a9a2b45c544111f71f86c920b42fdb6551e56c55199e6173c00e27c9f47256349a80236bcfd3acd1730f823031ff9ef594725cb9429ea183a7fb2e03124ebdd98d435313e43819d995c4fe81fdd4ba718aeade94 -A = -72e20f1aa2b5f2c4218fb9e11ced3f45a218f4c83a2017d97d0cfbbf227c9082cd43f939c8909e52c8795cfaa75d80392d3649dd85ddc35bf1cc54ba389bed9e9dcf867da1c05eda080274beb6b868b54fc85e12ae127dcbfffeb043f9d59333d0ab3374c24971e1bc7269450b418c8b -B = 61cb021a3a957703d14061c21d3b0fc19598e19a17df9d6f2418c76d4d37b3f62bd4037aeeb1eda37f83df44c440f5e49924cc72ec5b153856c6b621350ec89d98859d9d1ec7ac4f0c418c6599674322e7d618c5ca588d5a873d5af356d4771c6cd375f5dbbbc69f50b982b8c4d1ec -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 4654a62d9491f28599a976288cd2068d8e3228da12f645413a92f482efc66d1737495cd4a4c733f147eb5414a2ef6266a116ce264491a3463c9df1b030d83b315f76f3bef8cbccb5c538478a65092547b91e991e6be91ce4549c3a6e34aa7b466e63eb3b88054f6714083695c616a078ed54e1ae46e00f3593af845fcd0ff51a -A = -1a342c154aad619e567fd32e7053aef8d98335a4fa0e35bf06acd7998c43d821de1076dc1fb67dfa1156d7ff30203ec736384a9aa7f5f08cfb302eb3a2a7179b2664094c2cc0df73fa05bf2af24a62b8e394fc76014dd83b434df26f8a67a624884a0b9b4f08f33e9828ae64f5d0c8cdc2b -B = -2c57e15889c3dc9c94361c17585d506933a72fa954ce44dda9f5e33408552ebf49cae87bd0be35197f887fc6c7deca1452a4345eb67d19bd2e7d3dcf651667a8900388e4d5ec71e9433e3b01d2b3d91bb94d0fc3c51c70793f978e4b5ef93a9c6356c0b2f7accb9e4eb457a2174b50dc6 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 6124d9ce4de2880ae3811836235d6d89a1a4b710f1d5a517153ed7729dfb5b56b0ac10a4bbc811db9b26465f03cda355701f9f28c5257fe288743cc0789cc54a8661f46e36eec357580b00a84f1d4c8e3d689bbc18242f1cac30a87cb7a47ea06f80d7c5633cde4c8cd8a1a7e27acdc3a2aacd608cce9e2efe7864d41a56ceb8 -A = 7b48a9663d914e0225d7275e965d866ee6649d7267474d5336d28d54027ffe8572f4aa26230dc7abe9957d211e6c2c8f3185cae962b878cfdfaaf6cfe32058c299247f372ae170a1f7cf71380787f6e90995da9ca5a4be8ab1ddfa8e6e5dc65b6f168b9b8e29e0257e0eec853a6e1911b1afa -B = 1fc4dc77f4a18d4406a4ba536e500aff68d133c6e7725717ae6537b527c6f40f93202a2292522fe7d04e0ef804d1a7013b04cd3d88462fba31534770b56d2e5672e8a6ec7a723186024c40b4717defd1433b9967bd692ef81d5d4e39ba10a3223d250ab6e71d5d253dd0a732ed386ad57e54 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 6443de73e1c826c90aa36fd7ec5d0c3324c42058b1c35d3adeda1685470d363732d23cceb08c3f973034c24fe65506bd33dc45d7d617a53048dcc103d3d1b4fd0534586c2fb7489ff5ffb98303bb068fc14b1bb6bb43f763dca2c891095e613bb7b6920163aa6cbce8cd93d9d39f4512b6e0b28d361ae11cf76037eab4cbc819 -A = 13f739846ed2c3aa0a1923168cbb46f4f0a2f3942ba57bfa5c426cb4d4b3d80d9530405a31bda329a1814c560d54defa3e03fc4f808606a598607783d539dbb1338d5bc0c2e272a7ff6ee6f93e1665d6f5a0ade30308fa047db086646c763106cb875e014e2c18ff8837e4d4d86861b85a5b7197 -B = -ba019333046f76325fa9f258006a7c10d27e89f6d482b95c79296c07a65b8e3bff4a9c9fa7e5d0038da129390ac851f8c0651dcf655a3d4164a731cd20a701895c12a906c732906038a8e459aaeb293fda21346964a6d53fa3e370ebf43c7ec8f66229405095c6a509d0fa15dcf45de8d0e901 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = d3a6fdf4a26993edd175de9a0f012e1eb15a5a1c4dd2741dfc6d0f9177cd5645508b8ab09c7fb34066ba893c38144c7f2ecadfc2b0d15728b407e5db4fcbbaf1871580426400433f14dceac43d28f03376e791b7ad01a112981f29ff4b66102305f0ecc4fd134c2cdc79a5e9d9f085bfcb7e6c187980e68b6c7639c12e8d200 -A = -464cb16fdd395e32fdc613c63ab4768f8cf72a5b74a0a5b0cc581ee4aad1972cd97db7966d3124e30c9a1c80d85c46da2d36eecd7c3bba5866f9eab4d0fa55b2d440a311654466432c681372a80a7896c9163c12314ac51f652aad68fd9012dc63fae6c7673c5da8faafcfa1b4ed5550f2baede5cc -B = 40389ba4d2f5fc152308c9e8a8c36258c770fb2d03e6189b96c4f8dee97ccbe426cc14595c8482e9e22486b61fc570f0e7aeddad2f4e3a480d4b75d14294a3b912928da5692043bd98ab88ece87a9bbd973ec82f990c0ae6091245318c2810187d69c38fa80e835300ed06c0723fe475f3fb22de6 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 8a0f9eff3a210912828fd7b5f2d72479cc9ccdcfd3e8d21739e301de02dd5c257c7ce4bee2def06c9d0c90d5a86bc45fa9f31e456d353775916b3d5684759e4500f99ca1f91f6767a5e2f4b735ae4b756d56c358a06447fa2c2ccf0ce667be4ed143e9e1dc627a561d92ae53a62477270a7944482cbf671138bd2a85fce92b08 -A = -1da555639228fc6ead68049d836d60a4927ee77472fa0ffd3c787d55b6067012560f5b1c2ef8bbf6119345dc6419444c675c1c9cd50602a93ba3718a5b3e1a30bc108d796998b24474cdad19bc2960b295fee97e03f2ca7589a3daf35bd28eb37a67b5d2cb35a30998d5f8622bd7e6b7d3fddd1ae9670 -B = -291fea1ae6dd1c66c62ae3a3d22904f4b4adb2a48cb795d50074095345d661a033f67b20c5d7231236dab871892deaa9458c235c342bc81457cca3f014a75f5124ff4da005dcc1108e75527528e5cc9c051a97fc6cd202bb9166f9e72e366bdd77c965a70592e5684fcaaf2e03421a2025ca190fe158 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 50f4d25875150bab63e4162265a632109d6b4743f9d6b55306858034732a4895ffb3720286acceff287c38320ee9945dcd0a1bbe5ae1456b7f36337cb7d22b679a6821a450765471257d52b6ab7d59a763e75e9e64581a93aa54761f6a760866d6baf186cdf4ad2b1a6af26a3e76cdc261d1f07b0a7122c8ffdef595812e7208 -A = 78a1609a7f08c93c9bf9090ca7c93459aef815719b5dde5f217567a9f68ceca05594f6ab17a4666ce1c0c4434e0f4f38ca1f33e501d6958a10da47211cc011da219d4373d2bec4b7c6477b1ab3b00b6c45279212db39bcc11d1e7ba49916c4271adca7eea531adad509ae119348f374ef1203c5af8bc019 -B = 152b46095d3f8db5e6e1a9e3f35c085da00e52764b261c3aa775ecfcd38572d2e86bab2f4bf29c2de4fd2fb6f35f66e8685714634e1be980773526bdbf9c43b1335c5d59f4dffe1a1fe2495ff9b7a3fae3e53e7c3208968e1ad1dd1dc8cf2e2415cc76dfe5df9e2e1eb63f7c7687d539706502d56247728 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 5a3ad8d6f1b0763b77f5d40169ff0013de638b459e401f50f4cfb505565c8a4465e28ca1bf988071701dbf52ac456e01e170788ebd2b7cccb50dbfe1a65a89a8aee18b3c11986c9d6e6571f964f376f322e10a1ddd9310bbb40f14b0680385c40975aba43153970237c535c6b0e2cbf6bec918a8fa26cb2f69e98d77215c23a6 -A = 1d5c14b0b51cf31e9d97b7c49cd26097d40454978663f8a74095fcbf9c63e533708befb1a467f94cf599a41220ce13493a273fc30c49275412c5205db712d5e1832b39e65c150c3a4b251e2aab853e4ecb4f00ee5ce6982ef9215775a33565bde3ddbd932665aae506941d3ee31b3f9e4ffc0651f1fb4a5c6d -B = -93cae5dd84584a2a3d88028d6d4cec4146cc5e350b4d92c52ba2393ab69fc1dba96e244f98e2f93f31230904169641aff30dfbdd3dc5fb1f3489d63aae1efd29335345a79ded546e42f2ee4a70ed932699fad17a771ba65fe6e689664bdd1135219aaa905c962d39531eba3e82c3425c24041e17858cbbcf2 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 61211c706730a1b98c628b3c8cb070a42e2ccf9fc6302bb1c2960fb165087f210e9d93416ad9fa21634a05dd0723cc23b8d2a846ab7c3bc402999138433725e737102094db5792249b4b5b1514a416b80c804ecfb04653c5ab18b0a34d8777f6c2955ac66fef62c9ec2819f0e3c075920f951f86b32e02bc43239d9218580067 -A = -46c8c68f492d8f7ac7834f89bc76098146432c59b3301d4eb70d9861a6e24c7c9073f910108c7b35538a79de10640291b54e5755359baf47482b97af56475211573576e9412ee017dcf961a090a6ffb5cd995992ab68e3fe60b6186f7595bd9b8acf8695c4f7359cb2ac709f032fb993d16a74822b4935536453 -B = 46953f424d988fd20700ea08880e7e09ac22d60cfc294bd4aefe637408a3cacfcd0ea6822a679b68b665d6bebed3506d25edc83cc7154b83e22953f9d91157cebd219cd5177fede28c63a15710d0f92bd9e542a7586855bbe57a94c520408fc920b3f8d65b194af2b2a580c90db1cdb27ec26ba929de4573c6eb -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 50a063fff02f2cdc68edccc23976f4b3db99641073c85709626292b9475b9a988fb8509a6223f0a517dbae0cf7cd39dcf1e8ae75196d9f5008c661d8b5153cbdb9520c71068e4719820bffda4c393032edabacf99339e0cbafddb6042ef887b8c498e87e16b62417934015172e63e7457242b864a47aa10e203f47320f03c0e5 -A = -1740e8be7b4775725516d37ba643fc64203f3a61e6b0164d112af56666ad97afb0059c2c4981fa81d72264f8669db4e50e11865907655b1f669c88f5935cacf1b12c1db63cc84507af12cf0210f990994055d04d93f148f213e3d4fdcfe9dc42117c059897697914e3e3fa8fdbf0eebbbb9c3b9fdaa7efa0c9d5c93 -B = -226308f8fbb35b5f9d129c0f6a2bd3e5c272a408bf32020905acc6d02d7e506191e76a3a2ac47cf7a63e6306b256f489ca5cdf76c7c3eede175ee4a7acedf922955e92599647b69d463cc14f2b178b88cd471b8a1c1512caa66b6d5fd8840b98b8d070e6593136e98cce9643e006b714388768920a79944be36624f -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 747cba0d1cde75dfcc0b2af9072c5027986b3e3917845870c73c452858ba21d6d1615eb71ae1b5a03ca44e22845d5432b368541b52a4bb02498668e8b99dfa2eb90ec1948d90564e6ebc388ee9816e329e1d8da0d3e2b12d901d47e22e8a1fabc37408be0f89e7a4ab0f30a03f7e2ed817006809e69c21104d0efe548165f64c -A = 5fa76e37aaf0eb3d34d4f4c590e02b6c63fc62b1d4c9e172cb0dd82409df87ecb43a1680a2764f62d13a5e919db2db08feaf98d5cb92a859dd42bca1047ff57b8fe5974fb3ac11ba2c0d8e2203750f30650db4b2cbd31d07fe18c4df84a0dfdb30f9e528932c097e89d8f8be6ff029dd970a7d2c2551529455b9131e7 -B = 111199f91b3749f8cecfe90e9b9b6951472cb701beb39d63068c064cbb2a1e1d30736026f781836a52ad0d828be6c20303c6c0bd03ad664dbf6044a5bfb67fc20a049fd37c62ab0795d836487b883768ef7c8f427eb98e5ab6621fece77b4955822f8efd190c417ced398c221215b50e9532a869eceeb605fa1c936554 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 646cdb3ed472a7b4599f02329054846a8da173000eee7533240ade4dba82ee3d7a6a92baa3783c19dbd3f76fce6b5bdd83f1f229b1c71a6faa18602e368f1b0b9f8c62bd8c854844af85c2081924c9a153e27853b2a48147950fb614028e090e2198e613631c95e565c2b9b64a43237fd4052089f9d1dd2c00525dd35fa946ca -A = 1c8438247c0ca376f508ccef7933724df512f9e0877596f7f4ea73dcd824809bbc472749833b537eec01ab23656e9758da22ab8a4aaca1aab3fe8d2cffa6672ca0c44ac029c2ca6c3e71780c28c31b5f154c8dee782f6ba009a69d83b1a3a03a2d6275bb8bc3932a1170470fb7e405ae081f4770b535edf49f73a12ba589 -B = -e365c8edbca8dcc4cc11986a5a901e4ed0adbe89b0ab70a53aaf5821862432a1320cf1850b515177b630e12692cb025e3aa43e9acee0d8ad5e48bb15e9a3f34cbfd39d285127b52dde58751f572ae68ad98692899ab12d35e33652c4426ec60c5029e51f7e32ec3d2031032aa7b6b2b63f84fb0023c81d031773f3652cd6 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 7a3e22f4a3f7ae7512ed73a07abb5ce291bc90bad507a5ccc0c17185804b9d231b0ae2e72bf270dbd60170f34b240f716529a449abea0b3d98ea2890a4ce3d9e2214819aefd070e00201e9f271de925c4ba59651e55174c97a13a30197e46997c6c2b152548111aa98df120a617c54b71f8eb8b0c8b4dbd5251f5509fdb8a1a8 -A = -78a99d206b4f095847e9a21de273aa6c47034c9afd4c081a8e93c2d75f4ae5b090921ff5108c863785c413e2f7b4a361506fb66b7561b8b1c5cd537e90274bddaa4e91ce74ad81c6dfbfe1a34a631dbe455d74ed9d041a9183da3bc469bdb214d2ffe893f89c3ae30f8ab99c3aac4d2fe864b891fbf4f537745fddcc60504e -B = 5c41274e9590c1ea44c113ce505931758f2cef80ba3b10440941ec9aa2ac984b29868bece2922eaa225555dde84a8334f1caede99091165151a39538e5b7390e81df757f521236314239c213e9b874e396a022f04629c09bfaf929a0e9fe0b0c7386b0541446f6a2570491067f64e662d8611c4fd6d1c78a9f3ae69f34d14fc -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 7fd27b6549494c9bc860146a3e8ceee785ca03faa94b0ce0a964844e7871e813414cf3f111da49fed1ede5e71e5539f34173d41f9a17ed129016bb9b04c86487f5def9fe350fd4dffc67b6e181e3cb26378ea15ff9b9ebdf1fc86c072c82ecd8bcdc241301daf1b774af5f90f37e45e6126c5da7dd3753a1e5b366038af6ae31 -A = -1930548d105661dc25a5ee303b61b559c4bc1f2e28b2c40cf3e25f98dfe01a7dcca0f3dead6463b55a5b2e0440a651cc9e08e125535e081c742bb3b2f8955ae897909cfca683a4822896d8a4a7073c29a80571445c6a0d53d2efe4a30a79d2fb5d08c0f95b735a1cab17ba40d71b054c9270ba6bc870e58591fb1bf9dc9b7ee8f -B = -3e2a4c1509494f94406e3843c9446edaf0a6060144637234c6d9ce84d70fac54ed163d77d210bf557bbea0404922c8aebec67a0475a3c7b74bfa2f226403ce987c705c712bb8eb0934c2b390a173c3836378fe71a6939e48d187b27cc7236ac115309fbeabd9ffd0396fb7fcd6d46a1dc683606c757ddc3212f5d2ff3f2e450fc7 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 2078bb5c82a394c30a287aedcfdc5271eb3246be05954181ae4f86ad2880ce674640ecd55c2ee3f4e89e2762139586516a28558481303e3071cc9ccb9a538f887553bf5726f3849fc41ab027fb1c680ce7dee3982587ec71b3760e5da6956d6894ad8c4526d8de953c0e681ecd44883a21f0abef1544fe601743efd3e5eadb8e -A = 40b4ba1e977825b7accb941fe0c0a49936a8a47429dfff53502fc0680d705b9fa0efe003eea3ff0b649998fdbae8d0831bea7f34159aa4c7add6bc7cd56fea97d25fb9a6a10f4572c26d792b76c18ada19b0ba06b6142c420dbb40d66be669b7c51d8cd2a5022fe1a8aef7b60965c0176eee69c32ca5023782c5410adc1b15dbdc7 -B = 1bb2f18d7c8d306bf80ae1901115c8dc3d286baf537b812ce06d6872b61e5bd44f3c53d7f31ca8461b3628b255f85338cc325856fda5a6248b7c476532c1bcdf9713dff9932a50e52a9441aff96092d3fb0fd76046a8d88288d0cd55741083a1bdb20fc6e9c20e82490273354bd826bfe001322dde9a15763f2c0e6ffd2cf60019aea -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = ef21dcee9eadceaeab13287d6e3c9741811f6ea9d5bd111799ae05260b1de2ffbc192818fa45dd7befc3baf6840e3b9d24cecbcb2cb1c3d653c4aec6531b941d926fb6692f548cf81526acd0b6b0289d70dd11ba50ca8de6e174f502eddf47e57440142c7f74f594a9abcb48ce1873df057b132ccce8b364de3edf411089d28 -A = 19d0109e0c47ad45f57b8bb8519265a4390534d2ea07f969d84ad33556518b6234d40d1631be3c3cce6d59b7be14750aed114008458f50a6a84ff75b4ee7e4b826ddcb2d2293842ed29e4e484260a92199c5c66367c402bdff0f1a8057127c6ffe452498bb352802e0005e6cb084663bcfa82783a3d72f3a2a341b8075983892e86756 -B = -81fce71491eda139ed996f6a289dde8635a3a257ad6756e844c768e66746011fd797658184fb44b0e3f3c5600c56238ac7687b5be42529d5c9b97c3ce10f3219e1e451bb2dfbbb44cae0828ef894eff3b52b8dba4c115c3b471984441045f2c2db426cf5f86949d5bb7662cd40bb3b3172a19ca3fb6858315d688f13c17550e700cd5dc -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 8a5f90344071790373044193cc4fd92116248aacf05ce639b6aac4461ec3ccb0805ff9876ef44fa71088c295db14fc820f7ae2c0aeeffca055f8f7238c6c90db706d02f2cc43b4960abe3ca4b6dec8bba55327b958e75c60c5d1f43fcf9136f12481c267481a725eecc403a16aa6221346df680560ff316a63ec8b51dc37aad6 -A = -7a54e7ca04b9a22e2b986e72e634317ffa20f6f4ee90353d559db3f3c1bc6b3b92ac6b364f6c5929090373962b49b59cb5d87554387761164982955470cb45dd00c4a8982dbaae3a1ffe700e8903a4a8e4a21eff9d00fa496d475e0e1a205be267499dacecd31551f8a9d437f37dacfdf5a2754f0876a3e02509b78674e7ea2169c43f29 -B = 652001f073d63ddd526abc957bbb48ca74154c8f9698b988178b3313dcde9acbb19ea11a935184fcbcc31e0117d8d2ec695ac56b5a71614a12cf90f21c8882187428755b6a5f11c314ac8b952ced0f65db0987f0f87e20b82a811599f4160e65c7418af7f33604e7b8952b70581e3e02dafa025cecda970d04383ee552abc620dfb9c5df9a -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 67f903e0e5623258826b681506f3e94cc0b086e262bafaa1395294aefc9f6b6323410a44427010d5e8d8288993973ad9939199b85cf02ae0a09dfb69801536a3fa6af5ac373add7efd25ba5fee6d8f040e97056f9f6fbb45795c0bac94c51ffeaf496710b00bc9ddd8e445261d976168771060c9bd9d83838a84ee9428f59d6f -A = -19c695ee3a4ada840a7e3626e61047c5081867b15843ee9a6506ce45540d23ad25ff23b72f988bf26ab8b98363d9a2997773604f43fa732f59a4b16ddf3a45acdbc7976a1fce01b3dd55559c20acfbb7501730f794bc45fc09b1f035d60413bbcf32a83fd3c41599049a674f165ac5283c42aef213d777ae47eea960f7727f5758146efe5bf -B = -210697d47beb73f45207340a183a729a1e78d84bdde1c7d8f80bc84559c4aa4572ab0e6927ea175acc7a268d05616201cb235e610d1012500c8ba9351a37bd68b4ec42227bea55cef5ba7d12ffb180873ab9d33d09e6e969df99fca728dc12dda6903169acbad38388fa9b001edb09056a2ee2aecfab0468822bca14a4bcdd3a4122290ec5ce1 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 5fbaff0ffcfb2330283fe59611ef51cf045bc2690e31f2ad3265046fedaa990b5d5060b3c38f17bbe8b2696e527fd77ead8650d329c2e0c1f3b2f5bec4dd85641022f3e0ae6f66ce98cde1a785bb52eca796ae45c33142e8264621ab447cafe988de926544e1a7036710128c42fe8b574f7ad69d830894237d95a55d1bc7f5ec -A = 482db04e35f9fc1d87b42bc5efe25a049ed924f816e1b0f9c8ebe34bc771e67e26d6057563fd5d5320681e1207c0b0f4b7df547cd6d5be6a2e0f2bfb088f990b0303d0ef263cf45681e0e9a1147c29f2ca5251faa633ca53f6e0b109ba69bbe20c58a76a22789243d1acf128dcc936602e832a20a2bfbfedf963bc1027650f483814d7f5e6905 -B = 105aaf563d4c1d436c6a4552770a527776f40bbb844b7701313c5ada95180160e7cd4b7175ddb943e5a22c910585dfc184b52935f06b12c84b6431395f28af2eb9ccfa66b2ee8f40fd44d753c6a83d67a6f3fe3658fecc7fb2f4a8f357c5d244422e48a33d0e2971059695a59d0d39b235d5194e919facbae7623ffc92d771532b6b0cf771912c24 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = a9d204c1a497f350fa1300cbaf682c947eaeba8b3aa0450c1db9120852a2edd2a0249dedef3b3746298ee42834d869e9f765ce987a2aa4712a1f35ed10d0f7ba9cdef938b073c3a526e5bf45f3510c94ff1fb84bc77b08e2aa50f5cc75e2f4da37a8a711f8aed5e92f7e486877229cb4ff2a4d0755029972323c0b51a14fd1e5 -A = 13fd3d7cc9d6d6821d2f2b1c40c8e070bfa85b994ee8f3e0baab544dc71328a1a57b7ee57392ab6d24bd85f9ea0f2a312148fc4f4b22c589e9a265d97e73c7a5b420bee180409ec179c438a67abf37eba61ac76197f3c9ea5edf2d4b8aab91e9bb1a432ef1f214c043664a51ceed1f2854880dd458ca253f09d6f6acafafec310774a672d07147b1 -B = -8c90ecd56d6c7cb129d1c9c26e94cf919c5747450542cab52281d11d8fbfcf9ea797b29588340d146cc40e77dce007b68c0c24356d4b75513b75eccbef6e22a5b88417cb6c516578d17d871e7d0957c09795f9a0f19b811db75d61c27e1827fa2773846857fec020f98444e307d3e52af501114b962ea705cb0cdf815109054abd00810dcc270d7bd3 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 57aef35a3f5388c810f576dbc30d4e4e5a39248b319b7766311157179d8bc1d7ef019cdd8c2c0175a8424abe7b33565afc0128724fa38f0900140b6f96bda2e78d7c803124cec8c2f2d6649afde4030c76cd33394fb386342d1ce97a4ecd180872134fd4e22667a687915bb4fda21f7e0bc9100ed8cd3a6668ed3a235d7b15a8 -A = -673bb11795d9d20a1e4ce8ae71d041705990463964505befce5949f895fa31c92d53f91fbc110df4e789b3f3f01f184c55df92927b8b680cc92864466ce5590ed2e98901cfb78b32ea79bf68b57a14cddb53209e08a7f430fee23f4a1475fd2640a515f8b609e98c760b4301747ecb61f1e6209b07455f1c8a7bb4e20c269e17937f39c6a2fb7b2990 -B = 46beea6005cf96a2acb16f37e357bc8975f4dad502fc3aefb4666344dde456c0ee7ea43ec493b6aecbc7aecc7d4cd107aa09e874ff564f5d59d7e12047b048c1da1faea36a7e2d02d0567bc4db41b54a75110626d13597db698fffd577a5810286ea8bf50625296ee8070419345fa269a354ca2eb47fa3108387f6a4b2c0ea3e779908a14469106eefc14 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 5cdb7c451b2950c9d87638857407276959142958b06241b2010a9f93625f9106f065798f79ce5c534b9e5a31fbcbfc63cd200fc1cf10217096aa0194acb9043ccf7ced30d9f0bf66e0dfe27ee2ecc40bcd8de66fe2ed6f8cb0d874ff7b5fe71951412731fe4e19c34bee64c9312577b9e7b2ac08ed15aea753a6cd3e286192ec -A = -1eee9d5d3854db52f9b43698e05d6a0f1d1f8df5f32884a775b25110309c46ec5c7e112eb64b2d7f948868bb9670068779b0a78bfc7e17860ee02692ec6790222b4384b9bd7db5abf29c46261c10d95f503b821a4694c45553e0dbaaa977892b916cb8990ac9ec29ab5c3d63ed77138fa1e95f395b3b233d039ab5daecb0296203166e9386d1071c61cb1 -B = -34587c2bf3473a2c5d7f3399d5ba2bb09be8105a0b9f3d8737d67b03d8b91b1c869f4e223d6246abd36d99d84052ae5894e58288a614a0da8d69f1aa57428632c2b059ba99315ea2f68ee210e65a741e94125ee4a723a7828bcc410aa2dae06ea8ed6cd23f66ccca7e85d2e071055787f230ee405e50d1519377cfe0cab4e5f97b6cb893b01134813a7c2c6c -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 95d0b209654de56bd7d6f74afaabed2cbb3247f449d80511d2d3c689f84c9b79587d78abdf0eb37f1b89f1f8dc8a83f7f9fac2c8cda1fd3fd64e16f5597b7f0a1df6da6db9e828ce7be0e876012bd52f5a74ca73ff8ca4611dd9f342bf77b485305ac28a1f8ac7538169f2bf3e4ff4dc5fdb9dedb97fa743fd8ac8791b8e288a -A = 7821d4b65d529c30b8747e184e450cefb11b5ac5dc77905e6fcd3df64336661c82ea68d588ba616d23df485ff0658fb3376d5276027a40b392f47219edc5ecbf510cf0c5b431b02c65e5f432092f941d32ac5f71ce3496e403c7637f63a23b91e3326d01d2d32e99e0ab265108dc5e7919d3983839b3c7541848dbcd420a594e850e587f1846951852ed76d -B = 1adf5c428f2a95c27a943637758d5dcd7ca36592fcb9d52ac0b7d27adddad5804e3edef257aa51c716801ad0c731e13c5dd000f11b5ff1b69c198f236695c1b2f99c0afffb5d084f80fdc534de3b0df4597404b50c7e784c3c55dfc9753c414d145eb0ca4d07e2f65b63f3eef8d391250a5500ef64d9bf963d7250d6906694e7670f92e3d5a7930f0f85964a21a -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 46914b197b84fa99addeaf55dd803182083a7ae34d6d4d3a55d6272af40a600563cc8d9f6b48110d0521b8b99751235bd5a340b1743497ef1cc459dccf5d6da970c4c3103c978ad2d513298f1fb3e68b24a9c7b0795f47d8f7f6ca9caaab9a9d80f15982599d764f8738217f9158517806fded5f3552fef8b7dcd2e725ee04d5 -A = 1c9f5f2a0d72806dcca92dac1450a50cba05b5dd571c2b3b988d33528d90ecc83444e3ea8df80802c30fbd5a6ec2ad9969be73aba6dd27e0dd2c842b95371d7547768916c0cb036964d041284cd323c8073095b2a8cb8797add5cd80f03595de9d18af8df7dee0d250ea7048faa47ae0131ba3f350d82864dc95e5829b88eeaf2681433dd4d58b2c6f70426af3 -B = -aa1e1b3cfd5ca0facc75e46d872584d55144620f849ab05931210b4e1526f12679bbd9cf00efdbd8863970e2abe8fc9fa7bbd21afa9e364e3c9e32f51fe66844fea4bab7f3b1bd278fd803f6bdbd0d296321e67751a0b894da338ab431871adf1514269ba05e0cea5558cd5691920fbc18237914f3dbe4b253f774e5dc1dc57023c080a3b90a004b809d237658ca1 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = ada55d93c533716ebd8c16e23603071950aa714deb942ebbf77206753d2676a7aaf61673c03a4db69d67faf6273828594d85e3c8cbf38460fa2af603fe9c1b6ce104854e7281757b26589f079da80685aec153fc5fd1a223004cdf30247f8398b8e92899857dd199d5d5c32412bedbf9d55f20e52895fc1dbd04c84cabfe1264 -A = -7d22392a8da1966e6cc5ef50d7409c614f8c8f8e5791778f68a00b4a056d0002707933043d05e48347bbd4d0dc1b6ca32a1aa4bab9992e7e620263283eb68d97af13b90a29c1b7dce39ec0b8a63878e8d65aebfb3bff4e67129e3b3725f999f1ec9ae92007911f2cdf738499661c5b6c9bf27712d0f29e871b17318e95c3d14b2e472cf9e466bea91fb71a493b2d -B = 40279eefe59f954aa8c51c9c214fa07707b1d095f697ca40edb820401a45c472d1d7bb413eeddb64c14ce6144b4863fe9337ae4ae8698db92facacd6a56f3b33129c5b608eafa29e9d92dea620113051b926b80b75f320d7ca3d2ab597168c68774e68c47670458f5ef2ffd4604f20bffcc7817eb09c9057fd9989a6786a7e067ebe6724a89e7d1580f94ee4ed502cd4 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 4dcae9def5467526b0ff071003e56f5537852cc0bde9d86eaed2c15e36e6429c68c061e12d321bad12e29626b5013c28f118ee59624ae2f35d2c53bfd89e6afdb6db79f0321ad5c55cab03e6a1a97ff7bd58c760d0e9fd7507de987ed2f94f9c79569fe7f03652cd53c67ebc6bd3c9e6c5672891a9d2ee11b300ed3b19753c0f -A = -127f5ca6924851faa2340c4c8f425b1dcf41b313c5c2910e5eff8ef2faaeaa43305de2b3a65a75fe54c00fb30c0ce3e8007db1ea222521190ff1de6d0cf2e777ed61ce8211dc167bf115a77890d0bd1ca786e967a04f077c89939ce484bbb1c560f669aacf7756a4338d97cbd7f09a376d2dfd4d632bb451f52c03c05762f050ebbf112f8dc5acdd9b631292fd7073b -B = -3bc5e9c352c46449a9155b7ce5478c771293599cd2dda58a962010f1f21d094aa6bee03f9311545e8dc6213f6aa73c08b55bcdf4d1d84fecb9eda35c83eae5fedee75b2d15a003f8a82b2b788ea19f7460fdd8f447d973c950b3b250a3022c19ff312ccdc86b6ab50c4ba627b15968c8a66d306bbdae8e88fe28c1853fdfb3fde92353f46b5bc448ae42306a4c91202f03d -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 62a812e35f46e04b3afa7d26c8fd4eb168b6b64cdc839ebd0a46bf2a3a712af8e97380cdf0bfa8a274f7b73e887bb4cc73c6104a176d425aaf5352f14ee51ba549a6926bd8d059b8e3826b174385d4635b0c36df75a4e7da44c34e51eb82322b34ae00e8c712eb75b3882822bce5a2f2f5fd74355319ebe1973284c690bed2af -A = 71c57b08127a956f0c17fd3c639bd1923ba19bfdb83c0cb9dd78e62b8fe4b7e0019cd0a6b73a334c622118f96fd6d91c1e06d4dcef8a3d0d6bf8f5beb6389226c50d14d3947ce9f24f7e0e6a7befad2e4e92dc9ed8fbb9811d908c03ac074b2a5c67b67831a350c4d548ac70810bb5617d261a045e53cdc48117b9fe86d35950d0a181b73c8cfd35edd31af031178523b -B = 1cda2a51a707f8c4d2cbff6337c3f63519705614c26a489b545b1faf366b705af1d953701b568a684856fd3186c035f878788f7e5dbea16b5e7b6e767cf611452a4272abf2a9c5e72b7251a1ebea5098c60cc5bf649cb70980b97d48580967ffe2913309b6b78cc12d91025ae403928851902dcdaaa60f5b323a1302a5ce114cbe174e3eb3c2fb5eafc44076396c23d53b028d -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = a9213cd809d41b6bbfc2123bb84860788ce22d5b91f8e24fb616efc286a218ae9652b42912a58bf8ce596a1b48e4c72f27e52c36be1940f7d2138eb895ee36bbb917a59f73e0b6c3266bf4759ffe2ffaee3f6179492658e0778bb43c4df4bfa1a46300c9da496033142ae2c1e33333fd7e82c5a14686b255e224c51aecc2a590 -A = 1cf4e2d5924510a5fd06ff4eeb94a740e430613277149993004b8de1a2b96ada54b05365f305e896df5fdffd3d7bcb54f9a9dba9689e5ad498012f7a684d083c31d7017aaaee720bbd42382e526a35d2add21d9369f7faa41dbcfe3dae426948a402635771a977e19d5c353ec7c1abd279975f2effc0b7bc19990154b723f2f8c29e606581ab9d3966702f68d8bb8065e9d8 -B = -cdab60f9b8e1add4c54427b638ec5f76b30654d3649b500f833b2943bf6cd5d8647549657a8ff999eaffe413ed87e06267b97bfc1b77637b57f29039235548a7569fe6d4bb16ae9c6cfd38c0b8c73aa60797d0d69b03d5a98314f7f7ee25df8b896ecdfc782cf8057f038b6c3e79c99df52f839fd4eff302ddd1256e51eb31cee24585782a0439da3db2eee79a58f889d8847fe2 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 4dde3d63aeeee47441a7e733bcccbd4f2e495ca3c746468e9855177f7672d5d82e51da8e268ac24e8971d802e25d842a16a6b8d76b8e46a7724108c02d38a4830453408ca5ced7093676a1db4bf4c94b9b7a9531ab7c26f8de520bafe4431a55a5f5d8c7576427a0f5bf2081b998b82da2e8e959f2ec4d5141b55e40bf6ddeef -A = -5770ea0a75ff451fc2c86d428f2569884b2c88cb6d9d407cc22b191849d389f57a5765b83adcea21c350b37bc6d750d4859f547da22ea8a3698a5cb6154b946331ae2ca18e7eaace951dcd49405bf8d8a716f7762eb242b8bf5e4c53a662c906c3be89e53ddf7a706ee2406c7d0ac17b54ff259c1bd5a092325938832763ac4caf0232e80a016cd1994441808d8db7e546de3f -B = 7e4246ad4af268695a51912053ab6628969af4fcaf7f1e97dd977984a1604e8c9fe6b920f39a764c27d89f75986a4bbc122f92ccd1860f24677cf346474fd9441f572f769daf834e6a00cbc027e15d6aa7ec2030becad41e1068740cde82abed768de7e2cfd325848f6063e2186faa76982b9ca73ef22434a28bd2e3a5ac477af50f258140bff938d3fa02fb904a8ee0ef3c1f6fed7 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 3d8bde8d0625fc46dec46fc657c49c8ab12a988cec4ec1c24e6f4d8ff94514c8d8fee4a08399c6bd23fb6464a38bb5f249591456c283325e343cc289c85df0ff2c1707a6e407ff7a24383b66ab603b75e2dc3835ffe9274eafea148f20764b8ca30cbe483c1cefd51f82dfb93d7793b3ec19a57f2ba03d884f345bcc3188fe28 -A = -1680dd51d8be6069c86ae157922d55df3b58ee6f53738677bcf7332d6e7ef304ecc7ff7c5a5e1f525459d77202f3e815c68f17f9a6bf358654a92f9f9acb252ed8e9e6a849da7491f26d0e33900541ab67ce966d042607258b4382b8108729a703b429babc34496528f198a7e0f814db80fad4900fbccdfb64908febf5e09805d3a3049c0f164f0bcdaaa9bbb06df8f05309be83c -B = -2c6c6b3c89f6e1d1cdd9abd1a9706e4f642a25738aebbc97cbd60e1f4ad79b419dd54bd14f2bd147b1d8e9bfcf92faccee61a43dbd1a2c084bf06a2ca476b3d169fa2c99794fc827b7f4dd010c0534e7cdd03d00456033ae0203b78a7ed229afcec2d1cb96892eb18898bf53584dde56b4316b3bc5186d97e3a9edcd059d7fe14561eefe4881beb8519c1cb7c3ba22cd2e13d874aab77e -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 5b4fbf0445807c8feec7efa3c2bf8dd86b1070638f3c87f1e173ee980412a28847b263a266506e70381aae919ae05d306d3a67a6c1e72c8ccf1c27d6296526e87f0f436c98fd1391f83440b58fadd4fb1905a484bfe8f516661e7176a268660387fe6a7266ef02e5fad91ffa69247bb11cfc1b5c3a88c76b7923a26f8a31ece4 -A = 65fe4d55bfcbba2bbfbdae831aef3dc8c8746e1d04cea174c1d336974d81d026f562225b4a297b1c3b044ccc5dc9c830a805a399bf26c0369b52ab0dd2c0ad19e723fcf9f5de2990ebe5a1266653195a2aefd9a392fd3da8c22c523a362f195babbbf5329018e3b454221b3e77cd0dee79f612f86332b1d104aeae7d8d84ad06b107715bb76bce20220d1340ecfc666b2bfce812814 -B = 12f775dbabf1c112523feab443f6e95d773e8220d66fd87bb7fc702588136a048e17ab6845a9c784dca275cfa445d007e8d8383740b156df7048650f89c5ef1a84148488fc405898f9e326cb8052f626c8881abeb70f3a0f52dd83e3ae0cb82d178cbfe8c393449caa2a87e7c8e2901a87e276b49b6d012f3cbb65641add3694fed3e3177777e78fe375f3a3b378091bb8d2998286562faef -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 4f0af7cb0c4e82d0e6589b24b55528818bf2164d41f58505a2b302a8f677df146f8077945dad3790c323e19b37e3379eb95de8abdadfbe4417f8bf8da643768a622ad4898513fdbc72d3b1d2791ec9ff40634678faf0e17d6e0851f08c39405907db85b74937ac403a9a3a1004013c7bd95a585728010689fcaf63b2031bc8c0 -A = 156dcadeca94985ea8bc0d1378daf1e85ecc4c7f8b6d6c7a5cb9f9ac368a97c07e381004023bc575691c082b5e9e13a02fe813a55e76196e4ad4b0f9b1e089bb71a0d5c94254b66e3e645fea25d69bbc5af266e730482a60105306d664f0ddecbd76d54e7235979aa2d806b809b3468078b5d90aa22cbd2c441198d4a52f6259972cf3d02003dc39dafdf3581638e56d08c5181d36e9e4 -B = -9a54586072d093939ad86df11fcd3337ad7e9e478dcbefb2b89d7555883fe8565abcd5b0a9c88ab135ce5327b2a326db645bc7c0e3ce24f902544675ff9d946abf30302f123aeed0f4e28edc72758ffa760277caaf4817a3ae8615784c81896d2404e2cf47c06b09085cd0ad1ec46cfc1f04d0272eac29e774b30f19939d08c036b185983c93ba15d1d27aebe4a357b9f6a298acca3940d2730 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 7c3ac09486a6fb518b98a9bc8a8b382bf2293e2c1154470ff7961212430fe2dd28697e49256b1ad8add082ee27b6ecc016b120e971665be801b720069d30c0a8c6ea4795613017e8883e5c0d0e68f982c328379d7a0afb7825c553e087b33e9d78f90e0b95a6597076b8ec2c1d375e2143bb778c318ca0680a64072cf9a4fc08 -A = -71d8e7ef13d63b4f417c01ec1241020a8ff4c9b2db531500984fd3e45d22b2bd581894c8a248ed7cc345e70a5698407df8f0e4ac71ed2c0d42122a4f92279346f463aed899253206786928a0eb7c37f2e51e1cde7f97cf9288d85c3ed7f49e62af0bf9abf062d2c6544d83b9d3438b3881e0d07b1fa0f2a4446fd43ab3b4f81fa2cdaff199c87965e298943c68cc15f2f3f3225efad68b73 -B = 64d52de221f102af62ab1e9526935b005c81658f8fefa019bc58e641023fa785798ed0dff8f7f999dbcc2ecfa47d5314ac6676c82170d6f2b18122c17c1e1ec1b9b54e333a184a46ad35b2150c8165f0de19a24b98327715e5a641c1b6d3ff9d247c89c8749e775e6fcf5f967c6eb5e73523d4f1ec12db7321b14398f26201a364e1371f0ac922781ee252c6d2b3c657ef259ab73cb7992a370598 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = cd08b388ffd41d0aa29a3dbde74106c57b18d325be8f446a2d9ae95fa4144037dbd41eccd50fa34096984cb11bce555c117c5568d76a8f79d308ce11043fe2413d37d6aa60c366af6c1da93d525e4b2d79fc82c0a53ed62fbf72c919db8a3ae11f5ff8057d7501f5f6dfc9ae461c308d21919d0de9e31b759d1d8e3526fee58 -A = -12e58708c30c93383cfe6e99ee3c5caf1900a7e610605706e77d8f428fd59db2884f5021d7a382cb18b75ed22528961cf43be1c700c581ceac3877e83eabd860583e6e94f3f2989c179ee5047c82b53d37054c9cb7ae08be60a91b10d49510e9f0b90ddf89f93790c3e18cccad5a9d223c605a6c567550e2b4950e184fd97dd68bf30681d3f9c585365de2cadf36a43f5a5305dae555396dd50 -B = -26ea5079ba7ed137a14d00d413d6f818e911cc183c88764de4d91d7a9b4cc7af3fad703142dc7905992eb8bf489f6d8231bdb25603ddf3c31fda8bd9bc4d78835f9ddc1e6445037f05125cb1ccd92eea2e927297e5eb915d5d965a25e5d58feb8d79a890e6036c80ee91e7469d9eb672d7a8db68905d06f5981fc40bf486575a067d35cf14ceee3ccb79b72871bf8f52b92e4910ab17e5e59ab3ae6f9 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 34714506322dccb91308c403c267f1ec75f80faf3cc4272dff4a84c13eb1e6133af6681387006c61e7e087046b64e7ae74eea8a3c0564a7c1f381e1c940d92b2c766fffdaa7318d07dbeb877943a73b50517b49e5117778b8a60212284fb92f29a9f5304f8f537e88acf8afaf01fdf64773f988cfa9551d6884baa70587ab76a -A = 638b7c549ed14256956bad532945ef9e11a50313172965386635a2fc7db79deb0cb5c157e9854117c17f1509d505d01a0e138d2e510dfcca45b4f7ec968b5214a6699b61b8ac68adf64d5394f50d577a154c013612090e2045462160d1f552592197d7da78e03491ae284dc9faf643805f2674af8652bae93ff230fc3eaa833dc62781e5f74d0f0b90290d51d481b0a94ae6e972197c6e84ad7ae -B = 141f62297ee88ad527fd1e0e09d9ab5dd80e17b32f34a674a27b00d719839701664ccca1b00da2613396cf633b0bdc4482ad3a0c3e209eaea7c22f33706ae44155f527c9ca4e341e651760d1c39f65d5e99e649d013730d2502b6b65adb8a73e6bc734b7d879b430798dcd53fa6c0badd57896cb566d9f1e0a7b3a9161e9808e762ca819330ce9319dbe7f49bd663a9f57ac53d65c6851dc7bc4ee66e08f -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 7adf54c77eaea2a1743bc5011ace45b7651846e77f90402297f117d8b1c0377f93f49e92a2457f3d3debec3022a96c74c166d01b2279553ef518ec0e612bd7b382529184640c55b89255b2679da9cf370913351592de39f804f1724de36db90c045fa644e8ff20627f67d6afd4546f00d7af093f668629f9a06c07fab5654ac8 -A = 19c491d5b55aa25f2e18cfb7fda18ed4b020e3f63244eb9f6c4dfa86eb8a70875cc898e305a7acdd3eee081300edb3e4c837940bbc1927f5ed9f651e46581639e133515457464e9c451390828e5e7e00a688daaea74620363706cb69e02717489ba9ad05774c424c18e295278caf4df4ced80b4cbd20cd631df43f2e16ec0334564d9dc03dfbc7111e4252504fb449d5a25cb13630b7c0c565a82ea9 -B = -c3f765349639beb80f888d9c8b7b335ab46b55064ce2a88180c80ad280c6b7314df52b7e73095dfd82896e24604854a48121353aa1de663eff07882771803010005905896357cd5a56a59f0db0045f1aa2c0b5626e132c169abc64b9893f95932f54c1d8cc25f215a9ef6e4cfdd6dba85f6faefeca81793b2258ae1d1427e81e458482aab87f6563abf435be69a05b195d1eda90146a8cc92748ca6f798b10 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 32ba5fc81a7747c3d812cf036bc0edc49f08824d53b91a65a6d41edfb1651d99c11ccb4c074d7f04e652276ae3fdc8d6eedb72c6e46cbb1f7f4070dc9d179ce3e21a3826f7dd2c27943a8d26b192d7f5c4aee9ba0647e406133e3e89c262d37cf468aa3ab8c5dd1b8900dd06cd600abc6d372d9408497d9e20c86a9a6a4ad9d1 -A = -73958019a5a52357b9c1d954c9b14f51ddaced32a4d7b7c95730697cf90029564118ea168d23a54381f7bbd6718a6b662e4c87410e48ac53b7767148582b0bd6a3d35f488e7fcf2b128e0a58b5d468dedabde4d624f4a82e808dd7b175af0d3658c6df1ac0da6495bc9a8dc012f8de55c2003da9b2d478e1a089fab776d99026684026968fc309dae46a6ef2412039a8207c3084f96b4e38e4fa01d131 -B = 4330fdf00bc6d13ffc267073b68aea7419ebef257d63f8f244accb9ee46edd04fe5481292de69d377ba6b6304804ba7ec0a063b42339e6e37867261b9945ec705d3a0029c6f499420e02a773476546993b3c5e1efc2417f51afcec7145a9c2625496865c11636e285d4c8b053ffe66887333c51a712fe9c8ea57606103fd689dc88f1fe37dbc33ae4e92067c5bf51b53e2f8205164c800e5abd677c73949b00ef -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 69b850a99b471003a56931f7856da357a2254ac50ed81dfae019c9b722b95af16047a0d5422cf7ab66ccd898e85caf0e03e74cc8a5a413661e5da483b3f0363e63a7031bb30626c8f73d6e99e290071094b7fe5bbaf4d303192e59acb5e53fc7cdee78576b51595d9f7a25ccf3c7f8889de68b9deec167778ca27ac9d4c71c3e -A = -1976b3bbbf92acbfddbc05b5d9e7b62a7666b239c1e6270db7ec6dc2929bad1024e745b897840853d14cd815aabb01aed580e1cc66ce37f9d1cc4c9bef8ddd35d28285faa29f2003d2a4623ead7d73302ea9f380f16b3fc06b7c2b8bb4ce4c8b03bfb6056a61c620e4decc6048cdda5e2d3ed8a13b779b8829e2bbab91e9f6b0304b1c08bf8fd85e0f3cd7ee72255e5342e077ababdbb545d7f809bdf8145 -B = -2cab554f7a5d21c499a1025f61e6c81ab0fc68a874bf60470cfac57425a451365be62c380ddd31f6e202f29769e2b6106868da7c81522e03fa6f0704522a5f8bfadbd007bac65595e149f6c585d7fc022db016bab32819049e7547bf85d4232a7fe19084907c528e7eb0434f2e5a375ad9b7d463821bef2f6a721a635252576c176ba42519bfa5d97d0e47facb4426aea0d755507dac81ccf1537b1003ddbb0727f6 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 2ce33adf34f2249f8a2d2e073976cb4c78b71414e027657fcefd56fceb022a06c1969dfafd519eb9e2542662c7647102f5c528734dd005fca666be57b46234123bc3db286cfce07bcbb399eb6764daf2b9aafbc2898a5ff43ddfae849c7549289640edc4ab7c4b9fcf5e159623e5497f509ad6f0270a41fd864c9437302ce380 -A = 509f5d5b160e923b4fdd72f4d522a713d780daa4bfd10ddbd62b26497a2e7925c495afc2abf0ecfcb7980e588f96c4078bde51c7b2c19d86d15bbdad5de72fec2e0a284dd693ce0902b40e54af87ac5a5df38ae6d1d882ea6299fbe6910121ebfebd06b454ec5f855bf3e7cd544a4b0d9a764428662e824e2a6185723534f5e6ad829734347d240c48c2c0f8bd6be6ae8a495a9e383fbc7402a4096b8c2c214 -B = 1a3b7f55307031609afc974857a6cc75821e73a1a9535bd6b8e141437c3fd4a6871c904e22c5d9289df7525ac69a0341d3620bcfc5f04b38ae540e26beadbce0002a8a8bfd0f6a270007e4c52aec2fab11fb2a831b9886997256e4b7e7ad3b0ec64c0f31fb0d637869143712291f5073a5756466d7c82c31e08e09683478229bccdedc2cabb7e426af9025185d8dd5124e08afa4e981236180e0a390004adb7918de6ba -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = a81fcf9a18ce476a839c896cc5d9b639fb1d74610e2f618c25310147b57cd77806c2aab90be7be4ed10f0122baf9b862b141ee8e4be5e0c23ea776267f14c31e50b119bdd33f2b41f6a4c43d35bf6f095864593e0d8c0f1fd4656d8371af844d197308bbff14e5a28b7181eb6e6a2b31ead7361e287f3b4550ab0484bf7baaac -A = 19f1ce60ca50bfdf8e02313f1c9a45496720a2ce467f1e8bdedbb32525d762878b61476989c7f6ae8dd29c983ea596e521bd4cbf74dba4d505dd9ea5df423474fa9725d5b65f1575d26ead95725e2a59a6c8a5397ebd6b54123e42bca44781b84c014b8e5d2c1a86cf34d764b242baaad5be285cec72ba8ace808058a0226c04f95eb2b53a828d0ac41e6b40e5a4c4092788d9f7e988752f175f075d545f421205 -B = -b115a1101d97664759538d22154de4b000c008e551e2ab10ad05f12274b10a4cbfee762d232df5188fa1161f37ba61d146e8b95fa715d98e016da8beb0600de65216cecf8b8816f6e7e73e2a2bfa7d0bac74b517b906bbc43357fca69de9cb5507bd95205515b97b3a4d6842f3d7b09606cce1c7436c462f49dd05e915d04ab6fe2748ccaf025bd5d19749cc468d228ba43452ccc479c146ac6d781717bb9966bf3835dec -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 1473f092540ae30de595666beb33e430cbec42d7a28d4f7982e62f58025cdb617cfc33f1e5ab93d2ebefd7345561b81271bdc50bfbb0db6381dc0ea023ff7c72605da26dc7da2b5664d2ad7967426ca97b3745f82528964bb68e70087e14dcf2d71d30fa0d1f7b3f10b19b357e7053fdf22bccc5188c6919eff1e5c402b750a4 -A = -68f280cecc512d51ae534f30aa198cf7b170c346c1159fa9cf158d0127d43e50a8d4704ec54b8b4295dd7f51c6771cb5767fe0c975414cbe6d2bb58ae66a095e8832d5f443498b1ade1f5bf249da58595ebd878677b34e3b4c99ba6124e2b71d86a8d99727a16746469de51b0a61d9d981459a6cebe206cd36a09f00ffce7f532e2c31999847ba000b9e01a4b84f454544b6362a5c093b9abe9d583716f4534f2de4 -B = 5b79684387f18d7de6eec3a63d737490dc2a46c0616ec16388dca2be60adcda11ae13063ede3fec177171a51dbef430f8c4b3f6d297b9d6c020fc44e3ffab891d0d751d033fda813861bc067c181118dc613335ce89c5960f952e5fd28bc72c41b7b6e374ec29b837f1e00271cab646c794579d315260921dbc3b984b86d98b8f8816aca4f16de50657e4102f34d9e29ec3a03e0da06e70f69952339bf2ec4a7e74daca82239 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 5e4b3f4aea7115d592bde9bf7c6594fee77372ffb19f7745b4de878a4024f81e8290c77d2915424df20004a7abb64c214104a3123e7c8f230c159ccb99bd937521b433dcfb065b186a685fc40f9166bad9380a02e297ffd6a307ce8d2c8f2f1330447a9c06c327b74f3cfc2e98f3351a8b385bae855941228969d1c29e9da3e4 -A = -11c1d396693139df5bd91825c119d1241c3f57b7ce95b46472dd82081738cdeb0868d18eb7c8ee7808016b3311f982adebd5a2e5f4e201ec4a34f3037d260fe580e771222de5a1a67947a4552cc03c5c59f9e60e25063a702ad3c3aa43f061a22567f938a91f1dd697c3e3978fa11ab1d65030bf327f8049bda745658bdd4ba8f3e34b060c6a2c6c5a8be54c7cb5f6b106f54a37d2be9f674f7747744d4350b3acdf373 -B = -25a65b6acda692ba3330d70dbc3ea4dfe208c0df358c50b7872245a909c5ac19ec568b1a1340e1a094f5b8e7d1e3b7e04bb4df002558aefd4540135d62d75bd5ce959128c1300b9d98429d7369610866d98b22c345e531f2beb80b042b6ad48da077043401a82e223e9e529e7407bfa466dd2680973006d047d837c26a60cabc36a7ef538f603ba19f8e923f168ebfc3834df8f77a559c9e0342e33df245f551bb242e5a66e5904 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 47872b544fa0425981ae17bb450ea346135e6ed7a9de0572ae14a6e85e8319f27cfab778cdd8cb5f93b417d9c66ae0fb7bcc6652620f7f3f74acc2bc9f2c090129fa8315aeec9ca7adc5356484474ee803883ba4695d7bc47c87eec508d16a15150cf3f757c4713de71366e958d6af045b2d282b6ce96976692c80b1e0b6f846 -A = 7e8f55c040862f12d8cc6e506608eeca65ce38e9e8ab18ef7007e3cf0f1c9a0696795bd10f8e1e1f55bb4f4f3a35c2e0ad18289e250571ccc26a961f730346efb1e29fb143ed97cf72deaab19834fa2e98e9c12ae4cd23b9c5ecef4a04c439f7d42e110b30caedc4334372ca24cfe4171ef1430528f7b57bbc823fd606fbd30915c5817e6c57c967c4c404a0847b1455da17effeebbec3f9357358e00001239aae209228f -B = 1cc00b95f6bd3abfa697400c98110725a7e109aa9b8cbbe9ae16327c4fc8e5bc93afc7a94da32e98e85e4fd5eb545192c73007d97a4e84ba64fe187ef61d17f0941e165c9fe64c7b8054e24dad30f92b50d1f526b4bb031e6b1b9058be24884b170a145212273c51692b71bc57ee53176d8702b975bb6ba96284b462da2ce38e12d86b342c7f4d3cd489fbce88a309c7df1121d7bbbaab6814cd1e54953e5cc46813ead98f02360372 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 5d193b085e57c3f1e825cf3b36c8bdc936c603136bb782a244b04a79fa713dc7b08436b85ca3b483d2e100a012d6430679b30c8e4101c8f08ca0f9010dc0f27fb37be842054dfdd99362e03a7f55ae58db7b47f694bd35d91a58975ae1f255c41617e773f91c2640f768bc702a213f073682dc761e056b34c57edd85585fe04 -A = 1bb1c759ea94b61a1721ef5680f42af30fa31444b27591a03b7c9bf5b90845ab965339f463a78bddedcd62fa21197c32d6850c61bae195f86e1c7a23e7a20dc618c59ce3a1c6ea6306c0b01b11a36d0fadf8214c36a133d689438021ce7c78b20c85256ec607360cce14f139513d9f3ea6eab067b1ffd0935d7c43419b93ecfadf2c5a902b7c39a69bdc023173bdad574adc77706c1a666d66f69578a5bffdc7cd6eee28ad8a -B = -e8072c49cea603d48f20276df188fd2fb28f8721d578220cef7db1e56379c04a6b372e56a047cbe59ea84ad026adc5d0aa930011db63bf4959f15781e060e0240dfac0e2a2c26be12a21e5650d12140bb49a2a8e0f6a86e4b1eb79d9b8aab3202bfd339096529170cfe3e0c18263128686bd9305e92a3c43e1523f97d8a6a2707773e3d441da162a79089c9ea1e094cd5a23474121188013c8c287965a5e77599f6a7d64174b06cc165e -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = aa79c899c2b9518857c9e4f96523a44607c3f6a97d1f40d6474ec79deb2feadd955fe92d789df4d362c828084559fab56b5e33a971abc5449208d31671c7e220c5945886e33ed1d804c059a8e439a92524a785076f9730732bc5a152aeffb5b9ecf3a7e4b55983016355c4c29827496fd4d7e6532c270cb9ef263573e4c63074 -A = -41b326c2b86e7ac14a2050bff67bb5bf9697f02594789c4a2b3e8455df4522546278d0620f28a680f6a88ab545de5829305485422f4e70a5ebf0ad15508dfe3f16ac556436d8fe8a8cde83ead549d88e0bb24dee52ebbb49159ae71589d918d3fac8011cfc3afad613ea09173856b7b79b55a2e43e0f7cd21eb9122d5f6a1fc5408414f5aafcff863b870c67b740256d317a0c58af9a81d8025a086a1f3d79f7408d4bfa06b9dc -B = 4730f03c389f9bdd92fd864177e06140c9dcc02d01fe7d37b51d44de140696f116d11bb67adf7db797edeb7c304386a7f5e37bfac46a5462a6d4c49b1bc034c2e0dfa56f14bbd2a4bfaf86bbad4f6d0dfa13c782fe680847d4b43373d7137f5c2ebe4ad58c695a7d4c407bfd888ce04abaaec60a3fd33db10eaba6b6acf0e16cb61d1beb9212c2b07921bfb5595ef1eb389200b356eafe8b5288d8f0e2cf252b38301de65190d56bfadf57f -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 23f9850dccd2af799f18268c3a2918a69019513c55268faf2477c50677fce277d8ce58a0cc06dfe389170faf5f0ae13ffc4954c746eebae66efc14eaef2c2ac9001f3c7ef7e32fdc31dd725b6a8093e33daa6d19808908e0c2d3e7c1c58e0fe9ed92f4d7cf3cc222393ca4f95feab5d34fe29116410a1882dff7cd92acb87590 -A = -10a75953e5fb9903411869a2949f8f04144d6e2d61f95704ff55a02f40c4f283add405353a68bf7d6acc1b8cce738f0c6f9271a538b4c688dbeface58eef0a0a1d491a9e66958750db97bd01466edfd245cef03bb6a3acb81acc63c38538e7f15deefd15afc422a8641c357c31a069258dc0ebb63f06094ed8fe7d4d420246b40302361967c81f0a9ca542fd1de01967514ff2565de7ae3b4a200d63feaa22fb99a251cad66624df4 -B = -351242b6e6d0122f7120deb8357c3bcf25d221a15f83579883bfb4dc2e6099e6b7b95fd08f6e573d93354b0676f7bc9fad563d6eb0f3567ef43efe3d874b9c7733e4fe1ef491043e1f80aab6094cc9b9c236570972233ea74e8779a6eecda23a65d08d878850cab6005159265893dc0f66920a12c26dfb421ec326a1ac09e9ab8085825c31aba488af02cd51f96b205c50e692dbf2d844ff0a989c3ba9f1c2bc7f2e7dd9458a72d310eb28d490 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 69c7fa326630d7de69249807cd8bc55c9315acac26fed3caa3c8a9c6b51ee96a7dd0b3bacd5cc13c15f199e268c5eb91d1ec36c085f83b437b9906caa6e39ed7bf09778610b621426cc8d36d96f541d0bfcc7693525d33e0c2ecd77ccfe80289a11155b37c7ea7791b5c2be3f9b954e230c19d746575afe9a1a3a9677d23c5bb -A = 7cb78ca8e5d903096630744c85975719c16333e2e44931956d8c45b001d35ed4e184dec88c9e2167d2f338fe6f25540a144cc419590a4ac7caedea3bbbc565365d3357baa62fdccef2c5ea616614e0bff60e81916eb4abde0c9725b1bf6869e8b1e11f6d0d08fd712bc68003e55ed462ad4946f7f982e663f65d45c07c659d9620d5139d2b3332a68d33aec36e21716a3b75f44272a19f860e6ab3864f06def9a5ddeed340ac0733353 -B = 16d5b074e008fdd30e73ea95cb5fb87de806319388b3a44f33c94d38be0e6f1a92103dbdfb3d23b6e1d19bdb29ac14833003e9482cb7524d0d7b4c377f4911e3372f2cea6f84c938d84e3994e80f0d68e7e385ca29e02f70294c921dce7cd3829c5854ce51d1f4fcf7dba910b51b48a3f53cb1f187182435f21f6981cf8440f9c8287a9749c92c0304cc2bc91eef32d8e6526be802de8aa16684e8854cb0b67d9f7ea00f6f0145d14e3c251f70881 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 72192604b2f3f68b9ed3e261120ea52b06a05869f6abd21828ce8abadb3a71c360a14947bc738e5d1d530b9636d796f785bb44508477eefa80c4b77d4e8e35463e15ea2a48c682d3288c5abeb66181e4bed7d5b4e0db20fdf5ed68513aa5ae7e0978ec1c4646368f206636ec90e808817bd1d03acf9adb9ba57dc153873fec11 -A = 1112d291463b28ef45e879412e6607a3e20d50dba5044e71883bb3cdfe9bc694a577fd7d896dfb836a171f3a4d8fd025d3a979b43e41baafaf7b535d9050e47f4880828640e952435648960bbb74a3c25dd90bccb3fedd254dfc0f031d0e8a468e93bb69f771ed35f1653cffea1a763491fdf6efa21aefc287cb611f5ea0085f64cc3705c784f87ce00846901833d01a3c45ce047d822ba390b538f0a24720155409f60ca0d90e13991aa1 -B = -d553fa2dff0265cd9d083ad097af87a99af3d8d93a9f4c07440a28a427082004ae5c81d22bda1dd2429f540de8df175c1b4d0d50f0227489ba570b28baa35055df951d05b584ae6b051a135d7eb2a501b2441f82c135a8ec0eb81d379b96ef8f2fd526ee62293bcb934c76ef8083727a4b28bbfc9f515ebcc2bb7ed9594a106e137ce94e9105b2e2f4776aa9c6abdf426a181181fece3251c3ef4f8eecb634e6bd47c5878663fd51c74a66b92713fb7 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 459e19faf105ab17ff794927aff86196b3cc3461e69cada53ab8c8c81e2b1820408421ea1af6ae10257e8cd9dc16386906410761fed62cf9ddcf0da2a92800d99563fbb9cb1ab0ba46a17cb9dee3f2b68992c2b832a5932e4533fbd5c4487d870f3fb5d7a1c358f4aef02993360915a9e9cfde234df5f51c761d84568400b618 -A = -7a964c62e38e4124cd2bad727138dd12a086a2bf01c095b078ce2f81288d3c8435ccce0c8e00229184091130989434bcd107a3a0787a2f5f4b0e8c23b1cee9a8f39ea279fb6081efb6c3df1704fae9e87d63ac6eac4c6687b3551ab7ddac5ca0541e12047d04c2fc760fda0916cd2b585a90d25880fcc1bde8f0a1a413969938d42e8b3b5f73118798e85b901c2e15860e29e2ee8b1c95336b97dc10a21f5300e0352adb60b40a8a99333380 -B = 743ff4d91ea3e0f9c4f72e5daecb4fb00b15b86e30bacebbe4384324523d14e22abe29b00573733f594d652a88d98c987f8db08b27b4dc68577784fde02dd410ebdbfaad9e9afc6a22a8cbb13a780222bd212fc61e38faf409e940fba35ed909e6938e83b0fdf5b5e3ce138604823e788efc3aa0df924554fb70fd2faf8249e17a827c5d85942005b328bed97e5ea1f1810219d77f2fe121ce66518e37c84d64aebda3c397684212384deebd520a776b95 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 183950095d9424b0ed09985aafbbd2e5d64bf541a56b68b42ea8cf9b2c051615ee7bb6c0687ca6fb0036888fbc927cb7aeb303750871442ff2c0087a95f4efad568f48b03bd2b9a9ac26af8c259a3fa97cd2af7e3d8f36148c26785489cda6c00a21e7eca219d1f41b2e82ba8e2c1cd752eb08a2fd50c6f9077f3096e2eba05e -A = -1d2fc778cf44c6992d1f3a056860eeb12f969358cadb087dcaebf5f96bec42bc0aa98672260adf1732da057e9e0d22081e33f5fa71f248cf89dd361036ad58692637cdfff584a191279f178242ec0ad397efc52e99462f496caa0f3133c4238aaa877fa7094662f080eb284c4cbeb992a368c2d157ac5c8c9160c167716406190fa39ce0abcdac52c8020969b87a4f84bc09a51f7b2ca288c93b1aac64e19623a7d9e69976a31074f637e4c82aa -B = -2f188f1245b75cd21d052ec76edeb5881944a143fee31c67370fab0420a748f3f1957bb8332ffefdeabd0ca806169629f130c86c99bab490a9668fd8200f4a9b1704c589e75b5c8c855f133d50b2ce06191875e2872b36c78438d6032d53004c047f49e4cb81e19fa84da16d053e6cbc7c8eec0b9129a8831eba690e0542ca3fefd204258624e92844c8b7bcdccab986475a47c8b22e89079ea6580ef8f496099cc24dc2911dcb1921d1451e2163b55bbb7db -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = a02c38d5df9ff7055ff84122342ccdf6ed7f7d54fe8227af091371f5ae62844645586adaae99c11f4ccd828103a81471bac72dc20625962e41d603e760591bb3569a21f45bf062b86b5fd1c617a4769a4d767a0ee14d104084c12ae875316a8f2be7adec0104381dc02c20b5851efdf7d4bef0d68076975e0ada3e58e101e8b4 -A = 5daf37d616da184acb278a75fda4e4fa49e544eadcf373c054b203a309ba198233f2285a1b55dc92e05d0213b26c82e261d8383a845813077b2e1b5f4553400f09410987c8dd21d4383e0f05747d0482d1a89f160a5220b22c78393873564fc5b1e4d5627ef3d4a05612709f301381df35606e99560fba07a917d7ea7413110fb5a8290e114d5200cfecb00b6c53b2ee29911bcb2fb2930eadba0ab9dfaf46443370307d9c3b61a329f0b8b8cbe7d -B = 1d9539fdb1afabeb9be6e774dc7c7cc4bb4fd63af7abb557a5fc80a3fd23a4600de3c7fae89b91f3d441b61d3e24b2fd3d7803cd71620e7313917b4afb89ef5171a3d8a68c3c74aa3dfc8058d555eac429dfb6db40a9e0c25aacd2050418d6f32bf21cbb76981269dcd5883178d4b69a931a0338b93022a2ed0f78f3d8877989cc406f19d6d082ea344309318c56be7946412ea0867c78418ec32b9fa3a61017c10939c9345021133116933a3d1eb86a3ef16424 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 5fca287abf1f487e0ec18c230860eed4a2e550228b1500b1e33bcd6675646b5afe505b55073129f22352dc2b113c584ea1b98808214b6916933e90e036b129b61657cdea9026e1fa087ee300e055ae8f94ffca933a2d70453ed220468a5a3cf1a65d81eca11cf570d7d038722397f487af60531f24a5f069671354882c8bd2c1 -A = 1d9fe15171dce97475f4ad329fc8fb5469fb2b8086e4b01eddb6ceffe5324cfbd28d791705848569739b6758ca7e7d7d49adf0c11d891b0a5879ca870d1ca5ff475513322ff218cd26024f97623bb8a53084594e1fd64154e1db702522883fcf4c0d677a7fe90096fc76dc3800816996308d8f0be2dbf3b879f8a000c0ac534511437e2ce2d7ebcf42fd1698a829eb846b3afa581c24d5bf97abc6e247f110f4e872a2474e3acca6c8c0d518104c3375 -B = -dc0da8f7adb8e9f7b0e3f293cf623528dc8e9668317910417e52301c50c62e7d30e77ec7e38d6817d1f5a93e851f8560f642f23a0b9f836812d27b1b41c0867088a3108332b8711047560052ea30c8840f03a25c65b227a175d8f340095823788adb5bdf2b7ebb801e20f6b6435e154f78d17b8fc4373aecee56ec7b8f5686a7d22c8571797fde85cec884d45ddc4b1f2cc47ebf56a879bf286f349a0edfb531168b733d43de3b86b49eacb10b06a432c96c63440b -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 6222c1a14c6390d73944cead58eae5e7a6c19d19e4563c36cf624f5b61d99991bed7dbf6a0723abc56469eedfb1f7982987c2c7af6191178cf0933ed5f191b8117c9d726cdfa8b82a2fb25ca5436023f5860aff5fd482c611f134569ae87395dd99e5e9d400b5ab1e3064210ded096411654518110ea45899f4be2516e35a229 -A = -7f6766be6c6ca9bd1fd7ea1f80bfe68693f7ee4b5ba2946846839060d6028eabbb9079a165c1a07eb6a01239f3f14095225b8617753a1cc3d9c1e69b516d8705cfda396f4f0d05b0944a0f08b478d261e968c06918914ba87c8e7b7adef5cc2a875917d00585571542af219bd726e502b7f3f0bdf0cb1dfc6796be2e22e8ffb5b8bfac7e15e991022974e75d3a5eba214ab8a1aab2fcfcdbc6ded2abf834d1899d2e3ff94bad9c696aece045212531773f -B = 49c6f869745983cae44d33cb7ba141234905441ca53172abd1a2dd8bfeeac4b236605cd2dc5b04ff9aa13de84872145b935b85479136065d2d57fd15fbd97480c25c6354636c17ffbca33c9319d65e82523e39fab49321380a130fc160857a451a69b1d0509d5718a9cff8b49c2d677c1f66bf77333d2511f58d3eb2fb47b3c162cc9be8b012d8df70278f0e21123a69724a1f126369a236d54da026ebe222c513f24b577707b5ab4b90ab0e22b4e38ceb4181d4ca101 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 9e9cc8c5342dc6d6daf55fc9aa9f79ec18592e8b9724a66881c379245c91f06a7df50a6ba0964603a6dac97e77a55d06efff17c93d5faf107fe65788d0f56483915f6ea0f1ccbda7656eb58fc032b5771600beafdc12c2076110a9b9670bd0754ff6a72c5d6e1a9e4e42c688e1cc96d7aecd815bdf5dcb16fcd1be1275ce7282 -A = -11635fe16dafce21efb1c599305e9a16eb5651187cbf054cd9d911c13e8eafbb738013e212f9c2b3662ea15ac9bd82b5751d43a38e4475d2310945a812262309094ae9cf59e0e9f3d02c92d8ab01f5733a20f051054a240bcbe3a7b6bb3f7c434229f631c4af239d33bd3ce30a372a480fdb49b2716091d26071aef372b8bd8ee8eb7f2965a372a836000b3737d2a833a39230e721e4844e16031ad69cd45ced60a64510c1248fd776611934d8d2a913d965e -B = -3bb2cde9d3fda96fd7e6b24645f8e00b43affb223f2b5c3f4b7cfee905ddd6703a9d6c01f1f099ad1174da215a645ca4707d8156e762e2a253d7cfddd05ca19823ada9d33924013f677cfe4d86bde025391e0aaf91c6b776a9cf8a09dcad7cea59ee7aea1cf5f5bfe67c9d4456332d1f98e5310db9a0230381e1867a8f75b8757283f911f1a5e0d4afe5d544afa8d86637f9c9d87428fdcf8b4eb8f477e617960948253b24565b2f23081c47e211cd3c788a92732a49077f -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 30dc89bad4b449d1df9ea9b8f9d40b323c71d7e1133bc44d33bdb87c38cddedf83bb849e83436e4c92a06546fcf3e24ce6cc89d2e97a48aff2c7e3703da1b167a112f662a89742355e11e131e41052f1b379753cfa32cb0efa3a07465a258c585cd68c86bc9a473f5262c86c50992aeccbb9725b69ea8b3a7ebd2b6a24db52dc -A = 60463fae1e9354559160d55a453c12d75775a53d1606d1fd16bef7e4ad1c78f9568954112f9280c46781180951534c5372dd5aaff3f33ac9c2e0ce4934d7009aad2ab5d6a5e5a141a36846e8925c7a28d116c68fb78aa9a687ec9bef173c1b69e0d7261f96eacacf237e1fe5874e5d553985b0fe7692ce8f2a5feab9ad9a2ad9c4bbf050b73b8030ebc36b94af8c6ecb67f8c94607d80cf600efd4ce4aa006f9b1832da8a1fdf8a564be0b4369149e8639e1714 -B = 15bfc50290b771ad147695a4c6701c47f2e8aec0657a4ef999eb45685200981b0ab5f8abc143d64878b85e9548651a1afd0913e3b14d11d3a26ab9793596801662a67b0062fdc8888feb029266f71d170518b6a4a040f59996bd4f257f221e830d0faaa9688aaa6afbc1f9b40d25097eab9d71d80aabc085f3a07e48bcfb37119aa00de60be55fd07d5b1281adf7b98bb589cdf2026252edf2f075ee176e23afa6b1f924c9fcf3c34c76752e833278a2e6b62017b88b77eece5 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 8b506c9bfb75ab7ab420ae6c9b371ef035fab512188d9df76f0b31831573b44cb08266186a04d20cc761d61b6df3e33ecb86c269205c2c79ae6aa4d3ebacac8ec71d9bce1d7ab146530b131c9038041c6ce8152a6f1c09b9bec8eea4462dda0f08d75edf296eacbcefd62a0c197ed30f799343268bf6edfee4995958db7e0420 -A = 11c16713fbf8bc9696782cb5a88174cddbe68a04e8fe93dd074aab33dcd85f92baa178b2f3b8817be0cecb802cfd3ebb06734c9d399a1f090e3a8a2110aebbba0e920427bcda74bf11700b945985bd532286d44a1a615cf7c501412e454edd647f8371cb8149474557a0d47cbb782f460de7a3cc28991491ea0fc510286711b882987b09341c079565414f2c930e7c3c3a3e3e0f1d786260a7f45c70e0fa20dfc63849906af61707cfdf5a9b7a4291a1c1586d16b8 -B = -cf5638af39c6da3757a09a92e0bd54f852742682dc91c71dcdc6e72f7825a0979a1ead2e158479ce5565d22472dc3853e6bf7ba43296a5e0e0a355f0703cecc02ec79da83e3e9de10a6eccb858dedf7d4c400c27486a5b8cb34d787cde6a5fd271e83a6cf66057838fe30db1f30663cdfc22ef5d002b0b5a05831228ea200f95382a58d0d8aba36523d9b5cb7506f193131916f3ab66ac9552c26cd0c2ab1c449eaeb8fde752f4f3c3f9b060cc1f8a1e37c4fe5ec306674b66158 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 347706abeb168205cef9b0b8c6b9d6449ac501af7dfbdfbd41a20a6a47872cbd7d4cd32f7b0805ecf1573d534418b7cce98181e079d5061b02639fdf0161cea5314dbbb2ef39ec841f695281f3c7de45f33664e0dd1658f645adc1dd225f781a3fb1634517c556403587b2aecd56dceca9ec19b930cead2b1d303aa056d28bc7 -A = -5e1c869e5dbcc684c245d5c69093bfeaadf388cbf928d33a8ae2148a2b5145937e4f654c5f6a36de1124bad1de8bcc9067fe1f9a44fc6ffe55ce7ed5cd0dbb6337b0e1e96bac1eb2a3606dd97b0bdb975ea59448be50191cc7ea36481ca9fc85c1c3e1c97378dbcd6b355622046888df2ab3d18d805f4d31d464f62a8e630e955beeeb5e00c70242b8f8df708705abbeb95dea3561756298b5f3f7fe16e965294eeeea4546f5e8bacf9d6b4f2136d2e206a87dad1f47 -B = 70225f0cadd328be36ece2172c836405db3fe80ef99ec74fca25406b73a537adf5073f2b550abfc4c0fcc2c2850dace0da9a266768cb4d5ff7fc6c1c248ad74f47592101b61ef96c1302924381abbd96cf49f50c44bf7e0551721a8ae85abdf9925548d13b8c5d1a27be8a40d0f43eec3136bc3035057b75aea779b4262cc66e6bc68da93c218f1920979291105d4b02117d66deb92c3e511aa588b27130202acc9f69521957f79c7e731bbd5461552b9b6b24240dd71ac449be9777 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = a2cb238f326d47f95869e2dcb295eba819a443dcc7c2785461389b58327742702f4c86e47af129f1fd4611cda93631f9333c358a29121d58286333083d13e66f30a9533b77ba3e26089e7eff7baf19bef8054af4e24735525908864ea9c4756b42a69c897003cab7b63cfd9a5927ed562e29845308eb2a55e7f8f03c87a5b7ce -A = -1aa7ae6f56c38b654b281525b9da953ef366c2b9cffd3042105ed428dc7e5f2f2d53ef90b468bb471753606cc7a3775d86bcd2f4d5119cdde3c487cd39bf31752c5ba297e529c1b8121487e0e1de702156d0166ccaf51888a24fe7b48624eefaec855e2200929c21858676ec9bf4ceed0a832b69efd5065af544e49a3d209b85a77b0953652cbf0aa897527c52c9a98de9ae4c827f762e251478c88d410123625ea52b3478b52f6b9987d42009ae427763357ab53195772 -B = -226630b6fcdb5e274a25066ae2ca2c803549dbb935a97c0d7f6ab2c971d74cf6acd265c9d6815a6b2dd23dcb3c23b390fe8b1bed92b8c64c76c0ce62d5e7ddd7ce445bab0ca905dcfd0f128e5f4ffe966f3903d7ff1c61fe174e373cfe35a6d83249ec40b4a354d46fa1c90682efe468e895ea3da710838c262e8a47752dc6e7a79fe20051f51180173b58e0aa37b22eb8efee5b6dc264459ce4d135f430cb15afbf8c53f0de894bd2aca1f7ea32b4209a22a075f7b3b18e86f778a9e47 -M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 - -ModMul = 9ea62ef634 -A = 55cc58c9d8 -B = 6b49179821 -M = f753311ac9 - -ModMul = e9ab3a2aa60edd30108 -A = 5134a36c2bad180dd5bf -B = 2ba6485656d041690666 -M = 9b9cc4409e86c8b0fbbf - -ModMul = 621f9b797e866028b7bd1ff828bf29 -A = a202338dffe171c99434d84f3 -B = fb71eee7045b3e3ab5dd809dd -M = b3e6e8d53b7249df670e3c59c55d33 - -ModMul = 808d463d06b7b7f98e3cb2783e2196c349d62672 -A = c669426a92d3cb5b316e2b5b9 -B = ccaea3874008dcc92450d8b2f -M = b04dd2bb325baed1940cd000e8cb2d786009ccd5 - -ModMul = 872164b92b9426b237858c4cdafe1694f96b0e0e4c19e894a0 -A = c3255cb24a813e27c3dc410f0 -B = b144f39e7c2d33605ba7bee16 -M = f3639f4dfb782f3107eb402fabb5fc878903acb5e02e129077 - -ModMul = 6124d7d171 -A = 235b938139 -B = 3a56a22a28 -M = 83eb4af4e5 - -ModMul = 9c006f56095d442ba98c -A = 207e14237c42e3764e5e -B = 8a495a26872432fa8e33 -M = d0cf2b8ae5c67d6736b9 - -ModMul = 97387cfaef652932a230c82de59cac -A = 82ae0fc5e943af5bb8c4adebb -B = db1279be12d59ba3a9c036a61 -M = aa36dc1d13390169cd54d711eb511b - -ModMul = 32ee73c98da657464c6fed4274df20b099689e00 -A = 9baf08248ee24bcb17714e420 -B = a7f0428147bfe098666180749 -M = ce0bc198331c9ed1d21f0d498326e8185d3d602d - -ModMul = a8b3fc0b53df3b92753edecd6fbcc5f4840dad3a44da704e34 -A = b36249e259b303e453757721c -B = f0c1db50670d92abd93bdc84b -M = b05cf978bf2dc7e093d7d164e46d547219c480382df32b33d9 - -ModMul = 2663b741ff -A = 58c8e7f7f6 -B = c84681fc87 -M = e0a50dcb45 - -ModMul = 21af3c0b42328f41b81e -A = 1f79f5b5bf78c9700d -B = 5bd1734ba0f0e59c2a25 -M = 9ff3fdfb5c089244f327 - -ModMul = cbc280b5106c2c36cb31ad7e7c986c -A = cadf6482b769e83ce7f7277dd -B = f9862a06da1a9c89547b76c61 -M = cc36144c88139ce921d2fd1740bc4b - -ModMul = 3813f2fabe016e19fd8e70687ff473651a5fbb4b -A = 9c51a5bacb5d9f055a9ac2962 -B = bfed5625b21b4e82d1f105a0b -M = a47977acad7c5deeb683ccd265cb30cb193f22a9 - -ModMul = 76ff291a02715fc87ebfb3e99153c04e53358dbd7beae43478 -A = 997c4a7b537d9500d73a205a4 -B = c679ce666af284a459ae5a26e -M = d0d0fd4922953941acad8beb65c00603b19eb44fb8ca51e3c9 - -ModMul = 1a90c92fdb -A = 94fa7bb475 -B = 564b0a3339 -M = a1501bdc75 - -ModMul = 5e7ae5470686bad7996a -A = c725797912c6c5f30d94 -B = 3a7f4c99ee3f5fa9582c -M = cc50c8b7408f09a74973 - -ModMul = 72a15b13bcd1b63747342a6be8f0f2 -A = c33357af48a2df569e3c11ce6 -B = a4b4c5c14d7796adab54b6cae -M = e22a0fdca62a37f4c8a61c96a429b9 - -ModMul = 31e179bfbf65b0695dde36a4fb72d131830dcdd6 -A = ce8d3adab8cbf15c332c0b289 -B = 9333f94eeb7d7a86b82becc51 -M = a532a76bd5cff409b580d54d12ef75ad8179b381 - -ModMul = 8f4b8a585415adff3a7bc35fa88891ba31e4a82672c664fb14 -A = 9a2b56a54bd0727ab4be57ff2 -B = edf1781b4296567990773005a -M = c5a7c3b97ba00d6f174a019c6d37eda52036c528f351bef0f1 - -ModMul = 917bcdb402 -A = 55c7dbd314 -B = 997b29ef79 -M = af5b4cbd0f - -ModMul = 660c4bb2b771f523a4fd -A = 43fe52461d5139620a11 -B = 1f8ec4b67de1db54ddda -M = d0458e215b7e6903d96f - -ModMul = 7aeff02c143e4426fcbcf32bd1277b -A = a2671586369a990dde7829f36 -B = c7ff67937c900daccc0ab1d8c -M = 8ad9c1d4d3cce681d1ae27c27982df - -ModMul = 4b153d57433f0f7276674d3484e9bd0d25227d07 -A = aea36cf51dd2ce06c66b7a407 -B = 80c9fe5bb0afd2bf8b3644f96 -M = 8cc22a67ed7e5a7a2322aaa09ec2be94998494f9 - -ModMul = 7f8447dd983b113f04c6288f9539e53a2e9cddbca8b2fefcc0 -A = f67636b03821c8f13f21217a5 -B = 8473a29f4ae33f36a0d2c6dc0 -M = b829af37b557c3ddbb5257c8b19144b90708a45a274d6655f5 - -ModMul = 17fe4644a2 -A = 912611576f -B = 7a10d36b80 -M = c5fa605133 - -ModMul = 8159b23d4fd697b4fd35 -A = be2d646e76494439e60 -B = 60fa770d05ebc69772b2 -M = a6e7c940cd749925a85b - -ModMul = 7c412dad5c9fff91357bf181caf2bf -A = 80f476ed5acae75b34ed54c52 -B = fb818e2bdab3b5f4bd84db3d0 -M = d0339f7ee41337d8462d1a9c207d1d - -ModMul = 70432c749da4ade2c38237545ebfe6c4c6a92f6b -A = ee9c92de52210e61adaa6eb4a -B = 8ab55a85b1abab62d33e75fe3 -M = cd3faa6de4cb62fece4c3f94492d457834a6a041 - -ModMul = 9fef1c18778a8691c5e71c0b5208e82778e9bfb632da0b7e28 -A = bd162c90bed25e84dd5b6b77c -B = d887ee03020c5df356f091db6 -M = a2c2d45fe9decd93a0ca3edab8fee46d27ba23fad9b5294d5f - -ModMul = 958951bd0f -A = 12bd0d3375 -B = 668bb65b4e -M = 9c617dfaad - -ModMul = 8a109ebc9cbf86613e43 -A = a3e7019f1bbc35689a77 -B = 3189ecd3fd4ffd0229ef -M = ddadc50600dff2abc1af - -ModMul = 2b4d9f85a398c852b3a0cc82524619 -A = c244fd157267f707319ba6c6d -B = 8a07018a748992429bbdbf326 -M = bf3813fb54f749ea5627f59ce30e07 - -ModMul = 28cab7d574e6dc56a6a622f8a7523cbb8dcc5e0f -A = c9909dcfd3a59a3cfa538b267 -B = 8bbf89cd5a4e24adc2d8c646b -M = c8f02682b9d480ea98faaca53b747ced33ed0419 - -ModMul = 69b2dfb3f1d8dbb13e9e479f38edcc427d5968acb7751a226a -A = 8019266c548982a520ab48eff -B = d33c3e3b13576dcdb3ffaa796 -M = e6255103732475604df7c6f7ef7e6b49a8ef9e2b0c717925a1 - -ModMul = 3eaa4c99fd -A = 6fc42faa85 -B = dd0b4e318e -M = fd7f22301b - -ModMul = 56b6b811ced3433755cb -A = 145573d17cb0c996c69 -B = 9d3297d5ccc184896822 -M = dcfb3b383506239e83e1 - -ModMul = 34315b6bc6d3690c28060485ae331f -A = b963a26973894cfb42fcb2d22 -B = e8523304bbcdff1a0ed4141bb -M = d7a379aeac7d8cf94f19e7924d35d1 - -ModMul = 2ec9466e8b3357496f07e37ba24d36a237883846 -A = a75f3904e564997695b6707eb -B = f9f47bd779834dc1f5fba0654 -M = b3ae5abed45d09c4dc5abcadc3ac9abebe1949ed - -ModMul = 88b4d86b2c1e1bd780e8d2499c2221e05fab4f9b7047c2a044 -A = a38eceb9c551f0e69a544072c -B = d5f8e7c2d534b2b8985bfd213 -M = ff81809b84fb8eed3508ad891d3d8208249d8a902a12d6acf7 - -ModMul = 172f2e2e22 -A = 1584ff1055 -B = 2e0aee014d -M = b904cb0bc9 - -ModMul = 122c10d3200270b9eaa1 -A = 86fd189e62a6dc1e4ba0 -B = 5235635f7b0336f5f235 -M = c93da97d0e95fb63dc4d - -ModMul = 3e461e10ac4eb749512097fbf76616 -A = cf4ce10cbca07164f3812f89c -B = b7e4639c233fbb0f923fb5104 -M = 949647857e1406871593fad5c30101 - -ModMul = 88117b59d9fed79dd6aaf083ee938215a995a221 -A = 94c888795567d434123d441a7 -B = c60ca79e61a352e34e0f78bee -M = d2553a7c5dccd639a3927697a2e1af03845f2f25 - -ModMul = bc5f0076a8c2f6cc8f4e61540d2d6f6d6b13b775b363dcd71c -A = c170eaddca5295d6ec6272dc2 -B = f94a5685ced7661df2efbd34e -M = fa6bc46aa05033af72aa42793e9174af2e3ba38992f33572fd - -ModMul = 1110cdbe5b -A = 5db02b38f3 -B = 3369537903 -M = a8863f7979 - -ModMul = 90fcc5f3a346d3d4ea4c -A = b93373680ea0feeb31d8 -B = 37f9dfaf0e180be64bd5 -M = d595cc29237d1c19e2db - -ModMul = 8623a9997e514cf3c1d06c33c14053 -A = b396f5ede6212f1fdfc7e7b77 -B = 81a1ddc18306f2d2e84030148 -M = a6be32a91b34857842255ef8b1aafd - -ModMul = 63f8f0254df06356f5cab8941b77619ad58025ed -A = 806b2627b08d987438f920bae -B = 83297039f4aa8efc1a185fea3 -M = bb8a7e7c19be02c25cf5682a0eee655fcd5b69a5 - -ModMul = 697238dbe3d395e81f20c9fcc8db30c234a1f75f3b2bc27438 -A = 930b04224bc097ac1d8bae8be -B = b79496a80e45212c4663e5b64 -M = 8ff7e19d967d317c255380411898d73e3786269f09079f19f1 - -ModMul = cd93b5b8b1 -A = 47a51b2d5a -B = 86d6ba5155 -M = efb0ad3643 - -ModMul = 2037821ea789118bde0a -A = a92215dcae19be637ff -B = 93b9a3664a406737958f -M = 9df360b69ed26f610253 - -ModMul = 3bf11785d28ceb668dc55b870faf7b -A = bc8758854dc48e057cb6210de -B = f03ca689620a77ecd8a6f0de3 -M = f3ff0747d6e5f34a0ba4200f579259 - -ModMul = 7b30b44f75ed12f54136858ce4fe77d00e0952cf -A = 993cd09f3e46423a8ba2053df -B = feabee384158032dd013dc08d -M = cd0b21388cb2033b1e792ec4078334df70b6c8f9 - -ModMul = 8ce1e17972f1a9d2e9437d0c5219354728a5f31337808d7650 -A = 90e5d18b017118177ffb080da -B = f8e7e09032574f6c66e623ec8 -M = da795e6ef63ff7dc4baef5c327022ccf65d44e3c4e24823f11 - -ModMul = 8fcd412054 -A = 2e7f9b1a -B = 6283de2c9a -M = 9bff560ae7 - -ModMul = 57d0d3b79f1e2f3632fc -A = 2f8cc403de5af54cfa39 -B = 3b798c3ead52878dfb2f -M = 805e6cbde400d4b4bc9b - -ModMul = 23331614e88633af879201f568c359 -A = f21f19da4b20980979a645dac -B = ea752050b79883dcd69222536 -M = aed3faf4c88f7c4afe257c5ed90599 - -ModMul = 56dcf9ae1c787e773774df3c8762babb4675a212 -A = 9accf901fa599da05fa6ab5ff -B = f7f6b9b1d7bae06237532e39f -M = b5bcd776bb2eb0805ade3c8b47e883962d3cbdf5 - -ModMul = 61d0ee0786963906a028a1df01f836841ab6d39d88ca2717c0 -A = 8e57680f213d088ff1a1e7db3 -B = afebecc9943b0093f87022940 -M = b6201f68a45265d7e9183c3255feb4c110c05dadbcb13881bb - -ModMul = 143ae78a29 -A = 334abb952a -B = 74203e7a50 -M = c9535a9505 - -ModMul = 897a2b57e69f5a1469ea -A = 1ec8ca0ea4fed52bdbbf -B = 3a6273cab05e478a57b8 -M = dcb33163a8ea42c1ae6d - -ModMul = 4a2c10e90e2d37111db79a44d3e31b -A = a90e7bbd63fc4af6de83029ee -B = cf09c3dd50b41afc7045e057b -M = 8ab85d47e4270116a64f97dc4f0f15 - -ModMul = 70f94276c9d85fd3f71edfaad6051456f754da85 -A = fa3e9ff6e1aa1fb78e51711cb -B = b115ed197c50b7ec4040ca255 -M = ad63f69ef1346e7549ba71c13b24b279f53bc9bd - -ModMul = 861e7ef401866f815b983ba18a612913ecc20a67016d79cfac -A = fc41a9ce06e882942f751be7a -B = 881c05a51d1ba8134d126a48e -M = b12200b39526c33b70e8aa23ebc400dea0d4d8fe42be103d5f - -ModMul = 4e0051898a -A = 2a06523f70 -B = 651b5044f0 -M = 9da4eb09b5 - -ModMul = cc8274c88d6affc3742f -A = 9ccf0133f9628532f4f6 -B = c1d80907057be7a67b01 -M = d6e76e362da831f32685 - -ModMul = 568f15bed5c4405be9dd04673a9c46 -A = dd6029c3196feb6da7f0f4a48 -B = a5f6745f2cb64913d1d3236d8 -M = f62f02c9b9ca8993e3be9a02b444bf - -ModMul = a629452d5ed19df040eca26eaca37d82c0fb1d8f -A = 963c51a9415b03e85ccb09f25 -B = b1cffe333afe44311cb968ffe -M = ab2128698d498e8d75455033cfbbf4487535773f - -ModMul = 814030123025d287aaa8b826792999d72f2d589e0c7f7f3dbf -A = c3b33f391e78bee97ceddf313 -B = a9136f3af450fdeb245eff425 -M = b6aa9c517eaecb70781e597b907583bbb569e970d229235a35 - -ModMul = 8735bd486d -A = 563e15c52a -B = 31293264e1 -M = 92f4b193df - -ModMul = a541f69ca163b288dd0e -A = a608b48c1dcaa18424b2 -B = 891b0b296e911068b00c -M = d4140921f4b2c84f1eb1 - -ModMul = adc1b7cf65967b013d046866b4ed9d -A = e97941448f65060cf63ecd486 -B = ca68936f76cb87a8fbdd37311 -M = ebbca2482fb82eeca2866057cf1179 - -ModMul = 44aa9f0dd58d4510a7364e130698b34eda23a632 -A = c11f83f01bb964ffac93a2e30 -B = e05ee40eea39f4538d735193d -M = b5e8b511738979dc740a6a1f7291cf4561787be7 - -ModMul = 8b16b82f064f471983c7154abc9f9ba355111bacb90400372a -A = acff8da571e1c96810bf95707 -B = cdd23e5504cc26d0c34a62b06 -M = f38902a99190ae0b5ef26849a6e943d651925666fea271fee7 - -ModMul = 193f453197 -A = 8cb3078675 -B = a8fb003a87 -M = b60ff22f4b - -ModMul = 849c26c8cf5cae426a80 -A = 5d1e3d2b4d038a0a34be -B = 34f70325565bf0523314 -M = cbc189f9a732cad8f425 - -ModMul = 9a4e64ff530c53a4c6c5b6b5021920 -A = f53b81723cf74f520a61e614e -B = 9d8ac2e6b839143fdd079a2ff -M = a115375435151798f3644bede9d863 - -ModMul = aac303a4623e80158af1cb3331965cc8e3184edd -A = cce0a88606ff962fdc37e72c9 -B = 9840a500a2051625c517104db -M = b99dafdbd91ec3c05791031df5e193c03d6a441d - -ModMul = a31401dfa761bbe82b66b5f094151865b18a4ba75bb9b3dedf -A = e6f48c027284856aaf3b96425 -B = b4c326f72a6a22fd4b93ba5b3 -M = e57d9608ac6e5b129b2c014958bfc59137f63838b1ba88a4ab - -ModMul = 8b0929adbf -A = 61fdf77ac0 -B = 8892f05400 -M = f12b3766eb - -ModMul = 91b57f353307b173679d -A = 33f8e73752072b4b5cfa -B = b4c730f79f4f2c07945d -M = d41be1d8d2e5753e3ae9 - -ModMul = af04c564adfeb120bc4770bc8c650c -A = af151333b3d4cd1d29fd801db -B = 9ccaac44ff91be11b30bdcdd0 -M = e0bd6e70d5f5ce08fbbfd48d43101f - -ModMul = 1b8d623796a5065d9e993a53a9587a0fdbea1bbd -A = a2fd08df2d4eab0cd6d29e213 -B = 92c9d26ae7c215b52199ee28b -M = cd529f4cfa46f3bd3e7fadf167fdc02f6f881da3 - -ModMul = 4a8573dd8dc50a4fa39f3579d3869745eb8c1153ca508deefd -A = 855f941d085305725da617f5d -B = 8f09b7d2c36e0340523da5421 -M = fd8caa05edeaa81beefa01957eed97a981ab34bdeb6d8c704b - -ModMul = 2d278e089 -A = 59d20a1716 -B = 8e2a58bc75 -M = b3d61ef699 - -ModMul = 2f937ce359d0f6cedd1 -A = 1019d11d26040ffd5b1d -B = 7cdb6252087423d43e08 -M = e8f537323004447e669f - -ModMul = 6567332e25af83089f7458786ab0ca -A = bf9565e9f8a098894447b58fb -B = fc867626f268c24cc0ab7bf8b -M = 930f39183353363dcd822933a438ef - -ModMul = 3692e73ad1d91ddc19cad3808eba2c5fc88e2bf9 -A = d0a42ce512629f0ffd233a9aa -B = 97f6d3c4c655c7353a62d6ac4 -M = eac2ea84851f880214b8f40f881a2e56a6ba6f2d - -ModMul = 81df390c9e51b30bd639db15adb464c7cb1d011cb5e260be58 -A = c237eb242c40960861c938c08 -B = ab2f481f0d768eebd90d2574b -M = 8697d7a28a5f42c9a7b31949b8b568f861142f44fe66c6cd3f - -ModMul = c952f9aef -A = 81973bbcb3 -B = 28ddee3bf7 -M = c4a40993c9 - -ModMul = 241dd53d93f7bdbbb2ee -A = 2136eda4495c45c9f96c -B = e74c4baa8ca3f6b7cd5b -M = fff4594e7a5f0a1d3e15 - -ModMul = 5f861ed8b0aa835761613e6c869cfd -A = bfc5c1572086079f5f5d18d1b -B = 95902e14923c8010b7e905178 -M = a819c6c109d623f9b845aa23712c9b - -ModMul = 5b8ab089c4e4c6804e48a2bc1d218718b3a32598 -A = fbe65d3852224a812c432672a -B = d57a3f38da966d2471d70a048 -M = b9e6a626d3ad026d14248fc90c882bedd64a1f13 - -ModMul = 761438baf5b02dc095b7040e082da7b167c2b9ace956284ed -A = fd91701ed2151f8e994bf4ee1 -B = 88b66e735b76972bccd9db182 -M = 8008b2d1274456aa68dc627b1ec3e1762c6ed2d660c64a1a55 - -ModMul = cb743c97a1 -A = 9c69ca9b60 -B = 7488f48f5 -M = d67040ed0d - -ModMul = 931b2bee1bc30725a31 -A = 650f567b544ce02303d4 -B = 5858da30dd1fae88a675 -M = 91ce30234bb29fb9e833 - -ModMul = 5b4f262cec958a20390b5e568ccdaf -A = f7e240e8a077e8e87506db2f1 -B = f8653fe64e3bd414782f51634 -M = fdb8225eefc1620648737d31dfe1f7 - -ModMul = 4c011d1ddfa30c901793cc6ce74db47584cebbd1 -A = eda8e9a9ea3cdae17bd50b1b4 -B = 992e8ef4a45593e4ceff67876 -M = 95e2f120cfcefbada1058af6c8853cbebedd5763 - -ModMul = 6e99aa5b8107399848cf24fbd88ed6350efb68d737e505b466 -A = ca6c51ba2f410d09bf71d60fe -B = 8bdfa8fe5ef3b2ad02bc63c4d -M = 84daecf412b8c50ad6dfdb546c3eb783dcc6f32003eda914bb - -ModMul = 536175913582e73c1002083cb0cfce5471d4193a5b717881e60abfe927c829d -A = 9b474b6f7d7f11dfbeb7a0724694f2daf9ccbaf2ec13269b5ae3329e8df95f7833baa68324509dcddfb5afa1d14f2dafc55e2c225475f16fb396beecc7a66dee -B = d74a5081f00af2361c3537642c06cd47aae7e366741c9b4785e185af8b328acf3e2ed71e3b9a4b6fd49d956eef76740b3c6ec5850a90e7e444dfeaa7214c5eca -M = 5efaeebe212752b28b5441a5d0b2600190504467c6359e9ab26320ee72cffcb - -ModMul = 6161cceee2b74e7965a926fdf5344ddf8cc41994d72154a8b6014c18cf71634 -A = e7d6b74a1af0834aaf93e09a6488340b661449ba2bbc73d775e7d828163813ddbcd82719351879a6d67ab6b518011e1db43a3d620d1f24403917691d15ed6f90 -B = 3ecc8fd3103fe52a7e73ec4be4e60b69584bd886a030f017b482bde9d4b0b964ba8471cb32b3e9bd49864d9028a22d6b6b46be0451bb4222c3987b74a509f8fc -M = 7c3e3b8b1a6110da82674aaf88c288cef4cfddf22e7c9b75640fd67fa5fad59 - -ModMul = 2acd55bdcccd55882eff0bb262bb62f78bff8e932aefc9d32f54d5d4e9b8bd76 -A = c221d1f0d1b7efe7e078dd01bed773f8876fa324b3fe91985d47d343e7f3878b457dae2f9ae68971245278a1d23cb541c56b94dd9ac43a9fbe28a46efc627651 -B = 49f94c19ff7ce990637c3d2019ed66f7e6dbb1442b04a4593cc480521b991cb1b878f8c31903240f89e34336d9e6785433617e729b71adcbef622a683357e035 -M = 43760c71742e9cf22cae6fc262c008b7f1b97a78c8063957b74aa4cd370c1eeb - -ModMul = 504c11e38284a30e3647c1ddfaed94503d833bcecdff05e749422ad1d9442540 -A = 3fbabe2d65f443e7db0a6f332330ecc4d1d40e14fcb510499552020405cafcf10a50a5ee47cf60fd8c22a22b3f753b4167c213851f32109babe4b5c298d6c4cf -B = 62e5b0f887dcb1f1794bae7dad46a066f810cf5f82a1eea99207b5f0fb0ae9084c5e62cc97b2672b1cf4cc1400a19bdcb093c97404876b584a6482931e7ba9b7 -M = d79fab3eb31189268b2a0689cafdaa0826f07d432591e8aa8bd3c7cdce1470a7 - -ModMul = 13a6431c57ddf0ed3979412ba8454a0dd9a2694a0dd76453aae63366c46e41db -A = 7e1fd0bd9ab0aa75b264475604aea09f24239f94847ce2549d43b71890c0549938d167adebc7890d3c492b5874da7bf18d895ccaf1803b9776820598928b407c -B = 5e54e5185bc86f16177f1354a57d36ac2980def141b389e4bfda134fae7c158009ccc61ef66281905128b6297f876662104ead2315024f129c56eaa387f80b4d -M = 182572149b860615dd853f37f7d51a35e85f5e4a4249a60fde58dc68e0dd7401 - -ModMul = 145a44566bd75103083b7556a822ea6008ed3a6a1bf135b68fcf87a294c09b4 -A = a195e4315caa8cc0707063c7359c28139d4dfffb57eb726156336e13227ad9766ea1fc99152893ebb194fecfc153d47cb927a633217328f05e4d8782aeb89d04 -B = a97ae97dc7e9a224cab94ecedc08d0cbf7a012dc5209b1e1e8b5b843fcf61e65db3457d6085545a633be47b742e8237cc716357ff5bce9b00e23671ec1d049a8 -M = 29b060ee2aef7e43e02163d279ce49259127198adf462d13aa195c7dccf573a1 - -ModMul = b00740cef7791692d45f5a7110f3eeb260638f19f87c9245436fc0422de90658 -A = e6b97c11ad44fd451d168d65d1691d2220db8c3b6c8436d59f4c1366aac52558d0d6b61f5d6966460a4a31085fac711e5a09af5563d938963555d4730982eb0 -B = 6805eab5a4da534f07def6d2c320a6cbdfe4831fc2163dfcef740607b3181d8647bfae8f8c16237c1c1c5d14b9e3417132f81b3a7db4b7fc11927aab30dca590 -M = f975a94fa62b4c0e68df5c3ac5917d18927c0a6d9cf39c26f6ed97a81cedf227 - -ModMul = dc04b6ba2eb1e34ea8942a50d1d0c5479dd22109895796ffdc9cd32b53d4764 -A = 7fd3310af09a67e0684dcd8e3b4b651c7c13c2f6a0a47b59a7f5cd8bd80854d1d4fe02eaa61843d6bb2b87f99d8ec4842864681eaf056538ffff610c231e1d -B = 15f1661c59ee9f93400073e18a91503a93d47537d2da5cf5e4bc69ccc87b07bed171a95f1c5eaa9c7d7ab207ab3f1f7634c5d16e706969e869364207f61d84bf -M = 22e2856f4c2b6c01448d4aef74aaaee3a14e9660b5b277200f2e67464ecadfab - -ModMul = 19299c9e960ce15087e9fbd66f95cafe82546431b92d70db1de87c3425c1bef2 -A = 8e3abb1f24e1f91496db99be9409f57f67cfb6e0e33d603a2a31e1309f1d0bbdc413c3e4fbb5e3d923f683afa9942b9b9fad6a6e558b2297889fff47ccef7d23 -B = dbdf5940dcd68127d476badbd5a2f3018aa4d8db79f81337ddfcb108637110b934e946d3284ec09d5255605ad72424f1894238ee4f7964dffc27fad838532321 -M = ab6b4e3d3909512f5d1d62a30c1ab8dd5e584cadbce9dffd12fe203f8936ee93 - -ModMul = 4f88ad4e30e6e8e38cba0452d98d4a3547c680f16308692e33e5577772658764 -A = 5137697bf48982edd869e4a42f3cb858bf65ad5b25d1c0e8b75d054460d0944ecb5a6924721c5728964d84231c7ae808f556837aefb23fe3ad36aec9f5f60f20 -B = c79554304620f8116b9a8bb56f6a23620e9fd504f7163f732e1e6367d25c6ff98cb01d16faf3e018dec6a067d1204a6aa95470598ce757bcfbc3ab4f5d8ec88 -M = 9ba20dd78923d8ef82897ac46a509cf22c9b7986a4facf42e5416bfe3576a735 - -ModMul = 985a4d2a7431e09fcad03e6a3f926582dbc0aedc588f17aa5db40c2d3566233 -A = 908bff40440aaeee6c90b6312dc017c3bdae884a9074e02b26f01be1f018390e01f0d111f99a06c16e20538df8000d4066cd4bb3628da88a3a5cc240cfac719f -B = 6ebfe9fe53909876784f9d6e5dcca4cfa9463fbd8426c5bb8890ae84c2fad119615fe1e1f2ee5fa544a5ac713ed1da8c1e04f282f1f1b9fba4b4c4bd9db20538 -M = c66842e0a11ed6ad1e8f192ea97f5f244536cfc5234c7fdae1ff905123c72793 - -ModMul = 133d7b31537b627da2c042217cd28625437c28c3e06258427d9a4384046a1f4 -A = afb695e3e40347f60a500e01fba4df1c1f2fd4ed79e3f65913d82369f79d80db6b3978e6351c70c148f572b9c0c2b1efeefa605251b3156d9b66d240467e550f -B = 8855046dcf50f80f278227d5260b9be53ca2e4a1cfe1afce4d35b11d0fa17a36a8bee8126e13bbb318d476becad5a935e9d160fa481e1437b292bdc169dc7d45 -M = 3eae4f0d6c7e1fb9de1a4c160404a8767783c7f839fe27a543f5c389c679d47 - -ModMul = 7f4576a315bad5c7fbb1616e8b26c5b34ca6f701b9b1adf0485fec181c41dee9 -A = bc2baf0153a4598f6b5f488c43b2546cadfaca2c1931b919f98ba71835a8fe78886da1fea25b194e60ed6f9e0ad23c988b64af9278155c1722dcf4983a1566c2 -B = d8374d91fd3c523ecdd6bdd265c9a8958dd222f9f0e25454fd683bd86d7900a273b56f1f47e033c46527e32c721094ce6bc927d25fac05d7fa6db4d7a6773c94 -M = 9975d8e7f2a4d9d1ff8d442b93ff269a83fee43a18bbfa8c2ccd7ca5fac3a8d3 - -ModMul = 57ebfb39605d4fa6ef5fd03bd8e4fd685664297c29b7ad75a40b133e15fc5ae9 -A = efed8e442154b1eb6c75775cc23e01fa65c9c361e222da123d07daad3039f305e7102edff23b65c333f0caae4f7929857c3169f4ae47c9f0fd920c38eb42bf2f -B = db05415ea90269a74b0919ff772c148c0eeb2ff9dea76a6e73e82eb86bc76fb42308b55ef83a769a91d23b7840d5d2f5129f15279dfab7cd8d63778acf202f26 -M = 7704390c4b1da86d51ff817003e5451d601a5352296e339e5da219ec5a330479 - -ModMul = 40b6b0d44cf8a5ca7f4fd03dd6e1e2a11f74f3911dcd8727e57db8d65cd490d -A = 6500f3cf686eec4e1f243616ac0ea8e8d11ddbade490b86baf231e7b2fd55968ee14b6bb7badf8c898874099831976af46bcbfbfaea10d49aa803c6e51238e2 -B = 1fac744fa1e26e789639e049679d0e2eb57336279f09555e10210e7143199a3df5fbf5294edc386ac762fa3a3b0b4bc28945adf21a8af747a29018bf76d3710a -M = 5c0781a87b84ecb4362b09c623d511de53c085671dd4f08e9a551685b55ddfd1 - -ModMul = 6b778ae9822221e6a8376379e0032d7edb14d7b5e32a7310897b54d1d5626113 -A = c4a5737a9496129a136753f8c2e52bbd2660f2d3fafe4ed702900b01c14e506d13e3bbeab19b357e5ba9fce8a4fc3dcc469406a16248d6fb53862781fd9d55e4 -B = 444e5a673eeb37fd3b4f6b6f5133b0f46c2ea532e1953da4a0e144407a8e2534c5ff40cc9af7756e5aff9df57d938fcedaffb868dcf4e458b36f506ed7fe0ce5 -M = 7f5978c0c066132a9bdcb00727bb802b72777b9e8e4265f76b80cfdc3a788817 - -ModMul = 5c717e5dd25abe60f761d6f9326ed056416add4c1384682d87b7ff12e112f855 -A = 4351965a421c75c5b4c251861e53316a300ed7983e27e17f9308420f0d2cb11e9c476294fcd9042a525bc1a044bb442d1d9f853c9e07245170e0e2711010cd1c -B = 4e1046647c362c8f9c414be54075b4e9d151c6fa0c3da40d90e6042625947ca2c9f20cfbcfdab8666dac5a15f6cda9d47b09f654131fc5addc07e382c9639323 -M = a6c789884c66c7f028099e0367b3ed86871277bf070c541ee12fc02fcb6181d7 - -ModMul = 4452688244f542125168853f1d444f96ab0f82903bb12a97e59f0db633edfd6 -A = 9fd1cc81981bff977244c044146918057ad06d3cc26edfb8fb4118ee02b959d45555f9507ffeb23c3688e29ccdfe5f583fa3761f6727573542bee8ab5f5b600d -B = 856e6a03b5c93fc19deea51b3bfe42c810c5bcf9ffbd08e2625eb209baf6a4e24943a3c090d89c1f70aea9f0128e511fe92e03715d917168c1e1ca77a3a8731f -M = 2c245d407a78903ef2b279ddbe32106e6333b6f44cabf87b8641b047c79ea06b - -ModMul = 375f8474ee47df6b9a038512002e56cddd374d69c69719d8d369232c64a839e2 -A = add40f1dd6d4a2414b17f0c628eed9a8f082f3ad1f34ec41935fa86b34d4505b22ea80c062386a9ed63f95c67e55c686f837bddf8f4da791f98b08c02f32d4b2 -B = dab1caaa11d5a208b7a6b7a1d6482a4859daaba5e3a77b1b1020e8ae62a664953dfddd0b47d40526e7a3c6a5363c6d41dd9f529fd8b58d5d31bb67e745cb71b3 -M = 4f506313a4f49873a405f2e5a6e9cfae9cd5e9f67b5ef900153366570e28a955 - -ModMul = 36fb0733a26902f0f8f11625305a3c94fcdfffe294eb6ccba110aa628a314df -A = 52ee1498bd6a1677db801ae2eab4951345a1fcf8fe7d38e3f28dbc27fae508d87c9958e02a375ff4891b88ee916b96331e7cc082615faa028f6d541b5ce37876 -B = 9343cfa074f50c20e8472f8f7c4a7d330aa30ee417ed8027a4c956e84cc5cb31d5411c14796d9325fceef79a51b5d8a4c89182ca273ab633e6a7b22a27352300 -M = 9d7c334aa33634f9f313b71b42476a3b627a6c5bb8ac1d07a8d732d5c087bd9 - -ModMul = 4a377267508eb045e00cea66a417112dac07545304bbeac6315625275b7cbfad -A = 19616a82b75b08499d4b1f869df2db8f71398672f3f97ffc6177a4a5aa913605ce8a6ab5f778cac508f0b3f2aa680b01ccdc57c0fdd6cd678a2ff2dcd7f01f3c -B = a5643a9a9fe3be4134082daae4ee7dfd85d9452beee856fd939d3be9788b6bebcf3571c67ec481ff9b20f70d23e82e2171b1d0ddf0a9435b40115d32aedb6811 -M = ea0477e7f1a02cb6c21171066f3dab69d4e24429043b0f049de660fc80e51937 - -ModMul = 7952dfdb91252658430e365adeefd9093740de92cfc9dd3d92294f2dab6ca0b6 -A = 8e6cd7639b7c134b53e6ae6ac5f51268da83ed09e8e96d65e4bb130dcdbbab9e48226ddba6efe93faa510bde8ee92f2a641774c4272b5a2f88024b77a2cfa110 -B = fe4e8109a49b16b96871e384564cc096277dad4e1bbca8e5feb33f140a4fb800c8f3096b1bc7042bccf249aede88e6055c0db609f94e214b1251eda494be724b -M = aa46853682af960824140c35d145a6dcff6283b2c59994b30ecf9b8def41a025 - -ModMul = 1aacec7f7e66b0cf4eb2dfda9d8d3fbf4eb8e928cbbc967d13e3e38612f0346d -A = b0fd7a936b0908ba6fa797e4b855d673ff85d665ef3a345e560e2c0049becf5c25b6c0068dd617ab47a8fd151939ea0631f86806ddd40e557933c0e880fcdd0b -B = 105c87fe2b1bf0be5405ca0d530beda1780f0045e892d7810f8a8abbe890f0a19de66497cba55bf38e190c52992467c22a320c38a4bd167f774ed812f1271d5a -M = ac4f0a2b22df691331ded955a5d0e7d1910d7920a59d4a87636b2635397b7335 - -ModMul = 2c25d180156fa7d2fc20c9bd6d9ff0b111c9ad76ada0784e2f8fa0bd06413f66 -A = 2aa4a0a73df11f4e60956619d0b35eaef45730d619f9b920298e6d369b9861f6411de28a34af038f288d7a3d6a35b10c8082b8ad0fb275a8f67c6832ac46ba9 -B = fae1d50b72feb25da2581829409391bf289cd9f730c99d265b5b2d63889381cde4adbf85c3998c2478f2866526b8f64605d75765edd09b78ea45337207d173 -M = 65c9d79a09a820adbc9beb152bef387c1439147ed50cef872d36a69f1c7d5fe1 - -ModMul = 56ec8624fc199e7b4e68358f88f1a99f1d4d02577b8c6f7e28e4ccfdd981f995 -A = b0a0f9d05d144d2ef257c1e63a7127a3b8e0d8b64ff8f6447618560593574b5c5da6258b274efc28da0defd988bef1efca0f481f809665a78954b36741d668bd -B = 10901b9dbf0016cbcc671da75a75b7a6ec6a66dd17b53a97344864b08f037098537380bfb0137b6becfc36a75206686d16bc4eb8fd54299494374e3f383d9b10 -M = 73882376ca850c125ce9f20c291e550ee48f0eb0d571109ab08c22d6719496e9 - -ModMul = acceebe131aa34ff21b3235f045bccc8a8f762dca20c1dd1ef6eb461ea971c6c -A = a7714b249eb0f0cbe3e6fa0b04e895fcf14c404876197defafc6b57026ae7e5e993fc47c1819581adc03860ce07f2b7877a3f6d0912c0cbc659f5f6170a1cb2b -B = b7278ecd154ef5243ad973ead291ea186acb63e09977e644a6a9fde195d1a33993fc47c1819581adc03860ce07f2b7877a3f6d0912c0cbc659f5f6170a1cb2b -M = c52ae49e1a4b21ec392b76844ad559653b7b9f67a58b3bba6c2ce250017eab09 - -ModMul = 62b5b04dc84bb4ee04934c03ef361bc6e59b42144dc117b9f7771525c67c3688 -A = 2b65f491caf0b5cd9c66c859fbcadaec7213e6b848884638791b1620d6e4bc9dde087af0e7329d3b15a45df2d43ebde61b053ad7f63917aa922d58b4f3222620 -B = c1bfcdb34b0766be980540dc3256b9ee4158310fad2c43cf24bfafca08ee185647043f5842a9d9eda224449259341b7c50998086434528d47661bf5762a7ab5f -M = f73398c32191b436d14a0b76c6069b1d61395568753c832dd0c707780a232dc9 - -ModMul = 5613c8fb0721bd3f605089def48fb2c38a4862bb387886c1edc1bc37d10f0e15 -A = a3d8b12a2c8f4021ca045a4e4903687dea63ee7e88893b1911aea77efbff00f8f5c7884cbafc71f59fa2636195c2ebee61edbf642923f34d87ba5eb49b06a7ee -B = 3231829c81b26dcac432b502ce22e126ab564922b1e9818cd3da46edc5ce7df026d0e515809c97bcfdb9666581efbfd364437ba9959dfad099f90472f97c69ec -M = df8344fa848d1066afe4f8d985cff65441751677dcf3a4e99b40365fc3c978e9 - -ModMul = 30325f7ccbc2c69e11d739ad7132a947c53377aa902ec70b152f3a75e050c244 -A = e4ba620125f58a63fe12fbd3eccdea477d56b120c76d5d1421bebd74e8686b4093f8169070453ccc04b63b173568385313a1d9c841a4aa82a61cb84d4286a941 -B = e87aaa990307855f8e5f2e5509d2ce31dd4b13bb7199cf5fa0593e350326e222efc33a26c69245565d6ebb5a484cfef7d2558f22dea8054d07831d536803d0dd -M = 43d57108eb0ab9bebaa8ce137628ea825951c6accb9acb7f1e991c93b8563897 - -ModMul = 1975db7b72434ad32c9aee412645f6670b7f4af1f8a424a5031c559d3e18dce6 -A = bd64b1db27fa7da4c92a4ee092f58a2a53ed0f12d009fe13b36d5fd585defe778fafea4a60e8fe567d03e9ba3b72b189e22504ae8ca6aad7c2ac0f44abca2f6 -B = b487d8116198560d6c5b08c7ce63b0acc0c98e6f2a8d709cf4e3a409edd55f64d72fc27a70dc341e280ff5a1b09fe131773d466cb31991d2db23a2a86d225c80 -M = 39d57af763eabe569dac1a103e169e6e3b4375168e41e5c3b961b6e743915923 - -ModMul = 3bbb5bde9e3e240694326571360090e1fc0a4ea7b2311c1e0bd3961f6c159385 -A = 4181ee3bf9a98bcd49eaea243a179cddbf160981efc720685c7be1dfeb5aa552685a2cd46f340e1e1da893b3b460692fa2eaf6c100f24a14f239e45123242d53 -B = 77cd04d86dd5da322af78be54246dd6b7af490d903db1db03cbccde535570b81c6053a84110c07f097540ffe7510320024b7bafb77e9e239761def76092e1d59 -M = f3b9833a303eb540cf8b6cbc3cf16394b1634ef517be57684e42d364d8bec3e5 - -ModMul = 2d8174211f0367233b3a8df7c5bf0066d6aa792be7cdc5e850a477454d5c829f -A = 1c08cec52d96136fbd9078b7b8db36ab63b86e19dd3dba7b2e3190ff566180e89dfee9423fa4e99be2187eda6aedfa86b9a45eb1e4655257315ae6a280f0a6ee -B = a8b4bc9647d8df9b7c76cc6d0f2248cdbc41f5da9c061f9864aa8415c9557582cada456cf23cc32d47d1fc1caf19d36b398019aac4734e10f55ce3cad419e5e7 -M = 7eacffe21f88413af94155a2a8e37f70a431a59653738afda04a1bec72d0d9ed - -# Regression tests for CVE-2016-7055. - -ModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9 -A = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 -B = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81 -M = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf - -ModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9 -A = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81 -B = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 -M = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf - - -# ModSquare tests. -# -# These test vectors satisfy A * A = ModSquare (mod M) and 0 <= ModSquare < M. - -# Regression test for CVE-2017-3732. -ModSquare = fffffffdfffffd01000009000002f6fffdf403000312000402f3fff5f602fe080a0005fdfafffa00010001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000002000002fefffff7fffffd07000109fdfffef3fffdfd06000405ff00fdfbfffe00010001 -A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff00000000 -M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff - -# Regression test for CVE-2017-3736. -ModSquare = fe06fe0b06160c09 -A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff00fcfdfc -# A in Montgomery form is fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ffeadbcfc4dae7fff908e92820306b9544d954000000006c000000000000000000000000000000000000000000000000000000000000000000ff030202fffff8ffebdbcfc4dae7fff908e92820306b9544d954000000006c000000ff0302030000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01fc00ff02ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fcfdfcffffffffff000000000000000000ff0302030000000000ffffffffffffffffff00fcfdfdff030202ff00000000ffffffffffffffffff00fcfdfcffffffffff -M = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff - - -# ModExp tests. -# -# These test vectors satisfy A ^ E = ModExp (mod M) and 0 <= ModExp < M. - -ModExp = 00 -A = -01 -E = 01 -M = 01 - -ModExp = 01 -A = -02 -E = 01 -M = 03 - -ModExp = 01 -A = -01 -E = 02 -M = 03 - -ModExp = 01 -A = -02 -E = 02 -M = 03 - -ModExp = 00 -A = -03 -E = 02 -M = 03 - -ModExp = 02 -A = -04 -E = 01 -M = 03 - -ModExp = 01 -A = -04 -E = 02 -M = 03 - -# Regression test for carry propagation bug in sqr8x_reduction. -ModExp = 19324b647d967d644b3219 -A = 050505050505 -E = 02 -M = 414141414141414141414127414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 - -# Cover the E = 0 case for small numbers. -ModExp = 01 -A = 86b49 -E = 00 -M = 30d26ecb - -ModExp = 00 -A = 00 -E = 00 -M = 01 - -ModExp = 208f8aa0 -A = 86b49 -E = 2 -M = 30d26ecb - -ModExp = 27308229 -A = 17591bb -E = 6 -M = 30d26ecb - -ModExp = 2bdf498f -A = 21292626 -E = d -M = 30d26ecb - -ModExp = 11317167 -A = 4a655df24 -E = 10 -M = 30d26ecb - -ModExp = 2e1b88e -A = da6b761a86 -E = 35 -M = 30d26ecb - -ModExp = 20a12ec3 -A = ea811 -E = 2 -M = 23bc042f - -ModExp = c42ced -A = 1011a6a -E = 4 -M = 23bc042f - -ModExp = 4637d79 -A = 28d9a601 -E = 8 -M = 23bc042f - -ModExp = 20e5669b -A = 72fe6bc20 -E = 11 -M = 23bc042f - -ModExp = 142ab9e3 -A = 9a07b9363c -E = 29 -M = 23bc042f - -ModExp = 14c64646 -A = 822df -E = 3 -M = 30915765 - -ModExp = 160e35a2 -A = 15ea542 -E = 5 -M = 30915765 - -ModExp = 2f23a488 -A = 34d2e02e -E = e -M = 30915765 - -ModExp = 28e67f93 -A = 636a32703 -E = 14 -M = 30915765 - -ModExp = 29bfeaa5 -A = c8646998e6 -E = 2c -M = 30915765 - -ModExp = 30959e22 -A = 81dad -E = 3 -M = 326dd68d - -ModExp = 1a1da4fa -A = 116adb9 -E = 5 -M = 326dd68d - -ModExp = 272bf0d8 -A = 2d21ef08 -E = 8 -M = 326dd68d - -ModExp = 29f5054b -A = 76989850a -E = 16 -M = 326dd68d - -ModExp = e6c7b77 -A = b88ee70d2a -E = 3e -M = 326dd68d - -ModExp = 369605e1 -A = cf26f -E = 2 -M = 3ce082eb - -ModExp = 168a3c5d -A = 1f82caf -E = 5 -M = 3ce082eb - -ModExp = 125c4bb8 -A = 2e9c4c07 -E = 9 -M = 3ce082eb - -ModExp = 1c5fe761 -A = 523ab37f1 -E = 14 -M = 3ce082eb - -ModExp = 21703009 -A = dc832165e8 -E = 20 -M = 3ce082eb - -ModExp = 1228d1e -A = a5555 -E = 3 -M = 24665b27 - -ModExp = 5226af4 -A = 1077bd6 -E = 4 -M = 24665b27 - -ModExp = 1b14eac1 -A = 2db3a834 -E = f -M = 24665b27 - -ModExp = 161727bc -A = 6bd962cb6 -E = 19 -M = 24665b27 - -ModExp = 10d61d0d -A = c10caed407 -E = 28 -M = 24665b27 - -ModExp = 233da406 -A = b125f -E = 3 -M = 33509981 - -ModExp = 24032799 -A = 1656b7c -E = 6 -M = 33509981 - -ModExp = 129ecebe -A = 2e671504 -E = a -M = 33509981 - -ModExp = 20c20bac -A = 4d7a2de44 -E = 1f -M = 33509981 - -ModExp = 2e3ce9d3 -A = c53b3def4d -E = 31 -M = 33509981 - -ModExp = 12fadfd6 -A = b4cf8 -E = 2 -M = 36e9d4ae - -ModExp = 457ac85 -A = 1b1c7e9 -E = 7 -M = 36e9d4ae - -ModExp = 31debef4 -A = 3a973028 -E = d -M = 36e9d4ae - -ModExp = 2333ad93 -A = 552b97c45 -E = 11 -M = 36e9d4ae - -ModExp = 99ba1fb -A = 8bfb949cbb -E = 28 -M = 36e9d4ae - -ModExp = 27b691de -A = 93492 -E = 3 -M = 298fdb16 - -ModExp = 3c2b70f -A = 14e7b0d -E = 4 -M = 298fdb16 - -ModExp = 1486cda7 -A = 29acff81 -E = c -M = 298fdb16 - -ModExp = 11725275 -A = 507489205 -E = 13 -M = 298fdb16 - -ModExp = 24d14627 -A = e71c55606d -E = 35 -M = 298fdb16 - -ModExp = 222b8d14 -A = 9b1a0 -E = 3 -M = 3db59d12 - -ModExp = 3b8bd47d -A = 13f4e8d -E = 7 -M = 3db59d12 - -ModExp = 17e72356 -A = 334774ce -E = a -M = 3db59d12 - -ModExp = 306447ca -A = 47079ddd2 -E = 12 -M = 3db59d12 - -ModExp = 90bef3b -A = a75d62616d -E = 37 -M = 3db59d12 - -ModExp = 1 -A = cddd44f47e84b3276cc36a5c0d742cc703e61c4756168601fbb1b6eb598c161019562344dd56ab6f603d920a12c360b285e6496a3605a2f8d691c3598233ee9366b5f2692554893bdeb67b7bdaf35ab7273ac593145e26bed82c70ba5793bf4bc5cac4c80b01785d1496beede493806e4f4aa89fd8d41de80dd6d0a3e2742678 -E = 0 -M = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb - -ModExp = 0 -A = 0 -E = 8de689aef79eba6b20d7debb8d146541348df2f259dff6c3bfabf5517c8caf0473866a03ddbd03fc354bb00beda35e67f342d684896bf8dbb79238a6929692b1a87f58a2dcba596fe1a0514e3019baffe1b580fc810bd9774c00ab0f37af78619b30f273e3bfb95daac34e74566f84bb8809be7650dec75a20be61b4f904ed4e -M = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb - -ModExp = 5150fb769d5c5d341aaf56639a7bcc77c415fe46439938a2190283409692f29cd080bfe3433005d98d24718a03a3553c8560c5e9c8ed0f53b8945eb18290e1c1a83d919302510f66dd89b58acc2de79ad54b8a30d3e1019d4d222556beefca0821b094ecf104b5e4cfce69d2d520d2abf54f3e393d25ed3d27e8c2e3ca2e5ff9 -A = ead8c5a451541c50cab74de530c89376d9a55c723e0cac3c84b25f0093c08a2961e49ab48966361c42c9f99111587252d98395b76788400d75c66ef208ea2767a28d6f8dc3a859f39c95765d57f139e7fc14f47c908c62df051e7216d379f52028843b4d82ef49133cce8fe671ae179423ac8da5be43b01caaf425cd969300cd -E = 8de689aef79eba6b20d7debb8d146541348df2f259dff6c3bfabf5517c8caf0473866a03ddbd03fc354bb00beda35e67f342d684896bf8dbb79238a6929692b1a87f58a2dcba596fe1a0514e3019baffe1b580fc810bd9774c00ab0f37af78619b30f273e3bfb95daac34e74566f84bb8809be7650dec75a20be61b4f904ed4e -M = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb - -ModExp = 1 -A = 935561297d1d90255aef891e2e30aa09935409de3d4a5abc340ac9a9b7dce33e9f5ce407f3a67ec30e0dc30481070823f8542463e46828d9cafb672a506d6753688cbad3d2761079f770c726c0b957071a30876c4d448e884b647833befbcd6b582787bf769d63cf55e68c7b869a0b86374f8920516cf5d528f348b6057450a1 -E = 0 -M = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061 - -ModExp = 0 -A = 0 -E = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d -M = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061 - -ModExp = bbad67352704a6321809f742826bf3d1c31c0ad057bf81432abeb30dc9913c896c03e69eb1cde6b78ffcb320c4625bd38ef23a08d6c64dc86aec951b72d74b097e209ce63092959894614e3865a6153ec0ff6fda639e44071a33763f6b18edc1c22094c3f844f04a86d414c4cb618e9812991c61289360c7ba60f190f75038d0 -A = 855144760f2be2f2038d8ff628f03a902ae2e07736f2695ec980f84a1781665ab65e2b4e53d31856f431a32fd58d8a7727acee54cc54a62161b035c0293714ca294e2161ea4a48660bf084b885f504ad23ea338030460310bd19186be9030ab5136f09fe6a9223962bce385aaaf9c39fe6ed6d005fa96163fe15cdfa08fc914d -E = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d -M = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061 - -ModExp = 1 -A = 9d92629c1ab181c50c31619e8acd0d235a1f5fc7a0bef4d4fd54b4f1968d45921f8522efe88e69c6c14c576c564592b9feb00d1554b88b038934eaf4a8ce81a2582732387490181ef158360c8b2d9ccb326ffe043f776a50cb8202837f08ca743b562eefa007150ab7012c341b16248478d4775c02ad71ea13d5e82b71e2d600 -E = 0 -M = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b - -ModExp = 0 -A = 0 -E = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b -M = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b - -ModExp = 24eaead5b57883c2f454928f8edd470a344bfe07a953194f7d635d705ef13ddfc64140c8ad6f363d4c828e7c7891a6b6d4df37335de4552c319dafd1c06d1f743240082a3535df4da1475d3eea3fead20e40815fd5a0876c881c162ab65a1eda494280c258901ca953d1d039a998bf0e9aa09273bbef4865f3054663b72d75ff -A = a31618b4532f53729ba22efb2221432fab1dbb70853d6a1159b42fd19fc949965c709b209de106a652aa422d88922ce51dae47f7f6deaf0055202e13db79ee84fc3d3c6f4c003ef96597c49d6895fa53c22ac9e4819f7048146b5272f6279424fdb389819a0b251c823c76f4bebf4f1246de455aafe82a0d34454f5039e90839 -E = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b -M = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b - -ModExp = 1 -A = a8558e7f455b27c0c46d7d0862eb409cdefbeca945e0284b5bf425b7ac0f3d316bc365594cc1639decffc621214d61479bc75135120d4ac09ea8b742ad7ec1822091b62b1c6f564fe5e2f4f5b7def92cbaaa9a898549207ab01b91c2324fbd306a87f7d6379b6fb6493c5fca76729767f136120da9c90bdc7d364f7d242d5acc -E = 0 -M = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f - -ModExp = 0 -A = 0 -E = a5524b41dfc6b570df1d8f6633ac7777c1131abe3a99c6166b0d29d3b8883c41b00a0c53cdd6f42820bf05c810b6ec53e77a8c1b9344ea0c91d4f410a2f204c369f3db33bf8c88217fc2cf802a9d9bce8119242d8e781875b85431be170076498c0963574ee423551aec9557e2fc672ab1ab5d0cbb1c400535df9481e7934d8f -M = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f - -ModExp = 292f0b39ca0f1c850b1a00cffd2d54924fcd5fc7e7504c9d593e6c0ff74760b1f4bdd81679fe06c50248336f3108c593fa111072ee87d0fcc89a63243a1dc89044503663eee9bc18f51c3e0193d9108303e12ac90ff78f6ec752a4386af09c42db524a7cbe9a3d4fcccd56c34d283bcc9debc17158b5fe8df0c1888a9841bf8f -A = b4fde2908745ff92cc5826a27dcfdda09e8fffee681844fa4c7f1354d946d5d84e0e0c7a4a4cb20943d9c73dd707ca47d796945d6f6b55933b615e2c522f5dfc33e0652917b4809bab86f4fa56b32b746c177764895492d0a6a699812b2827fe701d40ef7effd78ea8efe1cac15ff74a295a09614bf04cae1a5017872ba22efe -E = a5524b41dfc6b570df1d8f6633ac7777c1131abe3a99c6166b0d29d3b8883c41b00a0c53cdd6f42820bf05c810b6ec53e77a8c1b9344ea0c91d4f410a2f204c369f3db33bf8c88217fc2cf802a9d9bce8119242d8e781875b85431be170076498c0963574ee423551aec9557e2fc672ab1ab5d0cbb1c400535df9481e7934d8f -M = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f - -ModExp = 1 -A = e2845c572b46496ac158a731f612fd40ef626fa7134755c25b1b7614f4d7b29164e6142ddb7985e4c7ebc575855ff901e95927fe98a5aea2ad3a4720c75782323bea1518b2c57790f44efd9411be4e95b3896bad1e73c59658290b309e5a7eb5ef8be08125063e57336b80f17eacee88966d12bbaaa15a25929c82e027cf696f -E = 0 -M = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d - -ModExp = 0 -A = 0 -E = a55703a72ca3f6074b939ed3d748196a684a3c8e411c2b39a9beb98993b6eb7ea3fa16f41bc5b5c3710b91c0fc74a8072793052f872f61695db3a2df872eaa427a110f1a8d568c85d58bd350d0df8eced7a10be80f7567360c1a8047b9c44aa2967cd0d9dd2caea2c1492358c2db4f0214da343fdf2e34272865dc5c63be2ae4 -M = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d - -ModExp = c90e4c69df92e26549b016950b59080947f5403430698e128477782480dd70be96bed2b9042dd8c708eb432e02710555b97af11ce6fa9b53395022851c32d1f53f04237fb0763563b440ca6e81a50d909d907d9c26b7d3c420dbf88f7dadd488666848135f8cdc608dcfb0691989289fb54379c2e84c262f9765f68c012ca1b9 -A = 882ea1b9b6c79a3b1bdfd284658cb6227ad825e0178cab713c7413c2ec34f03cfaec470c4f5c521f5e9899a2123878ff0f5b36a4196c08ad1b04d03746c4bfb5d126f5eefbfe172627d6732710a8ac8890cedbd4fdef69a19f2b3253a5aa0e5dd5484f72d59b17bdd1dad3db209a3ab839368ed3975069685911d7b35e41a9e6 -E = a55703a72ca3f6074b939ed3d748196a684a3c8e411c2b39a9beb98993b6eb7ea3fa16f41bc5b5c3710b91c0fc74a8072793052f872f61695db3a2df872eaa427a110f1a8d568c85d58bd350d0df8eced7a10be80f7567360c1a8047b9c44aa2967cd0d9dd2caea2c1492358c2db4f0214da343fdf2e34272865dc5c63be2ae4 -M = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d - -ModExp = 1 -A = d7a99e65b8af86b1c51d851f0447e43cd4f343cb0ada7236283e69aa7ebd383826acc9809e5dbc4002d0f2430022cb026458189db3805ce2de1142a31ba71a6c064ab51f0059eb4b931b8bcbaef023c38d57aa5f3e14f5df77e547fc028702071b58bd57338be1e1e4f98d3553484e4de359cefa29c5f58d3fa5d823f389dbef -E = 0 -M = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d - -ModExp = 0 -A = 0 -E = 95793fe33696f53e37498b2b65aaf27079e27acf1da97dda2c3e0803e8a02139f574e04ee03f7d1ddd029f528e3f3644515ad6f10f0beac2767f23d9cd8a8b9b6c6e376e36b64a0ae2711d7d31a5a75011641935b503110edbefe9f0ff2da27b5c5f6bb8cc151fdc86f67191bb99160c6cacc86ca368d5bdfafd3f3ff5161b1e -M = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d - -ModExp = 186c50ae259aa0fd31859cbcfea534e626a254de33956d5d719334bb32e7cf37cf199a21f079a5b90497228994d05efe19ccd8c769cd81f896286e8ae557cacd1630a928c629ecdfece29ab3697794aa707734e007318fa7029b050bb09ebbe6986187c6ca843f55266d275620b3f0fec0ad5f847ce8b314d929d128b33a249e -A = 9d5e345793faddca9867f23eeddf6816c1e837f7a2cf96fa077212514acb6be87ac01a237d8f2f1d07d27a8ddd1b0ae0d97e1bda4f205a89435017284cdedea3e407b1b940d6f52112b6359b3e86e4c83074b17c210ae2c8856b42b169b4a7a6dfa65b368a7959496cf9bb1ee93d019dbd79101830e3f5ed08604ab90890b914 -E = 95793fe33696f53e37498b2b65aaf27079e27acf1da97dda2c3e0803e8a02139f574e04ee03f7d1ddd029f528e3f3644515ad6f10f0beac2767f23d9cd8a8b9b6c6e376e36b64a0ae2711d7d31a5a75011641935b503110edbefe9f0ff2da27b5c5f6bb8cc151fdc86f67191bb99160c6cacc86ca368d5bdfafd3f3ff5161b1e -M = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d - -ModExp = 1 -A = e6a079bdf7b0638d50b183475e9ddfd5cbdebfb29f5fae8e9be402a0bd36085737b556492ea7fb4b1000ae9ce59db66098129b757cfb29224275fdaa46b8b7eb18a93ca7d3e446dc38c734b683d7ba7927b008d993aab01f44239d3c76be76d1503908e9b5e73b36c43ae0771368b01f39c042693bd92c4fc50810f059e1b332 -E = 0 -M = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247 - -ModExp = 0 -A = 0 -E = f0460c5ca9b3a5c2d1b93c201d020dc43e1c81d1daba432e2cd310902da23eb81a5172b0b357484eb8fa2c04c270893b8198c8ad35453405dadaf05195b3aeb5ec0ccacecb4b6227ca43b27b97e240a4148a472670ed60f304302f757495fd4a91af0fe09800db0c3043a6ae213bee6703ad80523ca433d99ca0eab1e0b7c929 -M = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247 - -ModExp = 60719701a2dc0bcde281a93ce0b8421d1a718adee43c1b5d9fe9e697a48ab3db4f9f33c73cff305ab6b6c300c149b05c6b289dce4580860dc56bc59de81ac074ecebdc65aa3ca040b44e5b3c80ddba1658d78b9abbc4c77e5f171f5582e70ab4438a8e1e2f062d618c4ad09c70c73b5b5fbc9f8f0bbdf1d530a933b705f85af8 -A = e1b400cd3b1f2f1c6b437adfdb970d2c8108f1b39bdbb13582179552011c6c97cba6bff2c463212b7f62776aa3e3aff9f175990e79395e819c144350b0a23d61638d500ecc97726b098e1af334aece23a851c718612442c04eb7b3805a24cc8f5b90042145eb5e5d6a408092832b6bbeb8a621419a9282fb5c075f41c7f1fdc1 -E = f0460c5ca9b3a5c2d1b93c201d020dc43e1c81d1daba432e2cd310902da23eb81a5172b0b357484eb8fa2c04c270893b8198c8ad35453405dadaf05195b3aeb5ec0ccacecb4b6227ca43b27b97e240a4148a472670ed60f304302f757495fd4a91af0fe09800db0c3043a6ae213bee6703ad80523ca433d99ca0eab1e0b7c929 -M = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247 - -ModExp = 1 -A = 9dd1e6f2d3ff24096b54e0ebf0f10e283e484a1cbafc0431adda1296ed97692f3ba99440fd4f67c96dd8bab850e1123361c99362df9ea205ff8e90d1b329459f54730992d5a360e46fcc5f5a909e691abb9a06613d6991bd7c2aa609f0d7b441d7ded0c07b8c394327672d38a905efb2d76aa3be5bb14d0c002aa37e287aee79 -E = 0 -M = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f - -ModExp = 0 -A = 0 -E = 8622c37631e428402343dccf8ed09d47b3f4201e95058910289a62707c3ce0b7113c390056cc4796cc9893e471b12cb3f63f900f3356ffd25c8b2fed6f6a7fba2c684eb241ca706c76cecbf72473d8a58c02338e40714b5610465cc319f0a529a7aa3898d9e638b247abd1380c6e8f7fa210c9f1a1a2164db6db83a6bba79436 -M = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f - -ModExp = 86fb0b8dc161c41de2adb0f3ddcc8ad49c1efd729a52793a3ac987d4011c9c1dadb18657dca718df75c8ddcc49d60f152c46ab85ae9076ee7bfd405679a7da3a5195a1bbfd7d2b998c7b135ea91f8c445cbafe1276fa502c2a85477716829a2e0d24ba02623405a3654bed8f355bc7ccdb67c3f9a01e249e358b60d7699498a9 -A = 816610e6018ca47074d55750dd16a281019dbf95dc752605794cbb8ea8d75775317ce685737859728320b529fb3b4414b40bf3a93d08d8994a21ae54682cc1c357eb529837a7b0129a0843eebd9341c9bee3a8ae30475bdbff517e885a0c9f2b6a680643bd981efb53bf9dd49f3dc3cb757e117895fb34b1b4336d9bf8384558 -E = 8622c37631e428402343dccf8ed09d47b3f4201e95058910289a62707c3ce0b7113c390056cc4796cc9893e471b12cb3f63f900f3356ffd25c8b2fed6f6a7fba2c684eb241ca706c76cecbf72473d8a58c02338e40714b5610465cc319f0a529a7aa3898d9e638b247abd1380c6e8f7fa210c9f1a1a2164db6db83a6bba79436 -M = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f - -ModExp = 1 -A = 9edfce4691f46eadaa2043c7b1092b831ed50f3429f0bca02f985c0b77c686d951be84d772ae4b55f08935bed6e3206c8441574f215736b5c1c1b7595b3b789b55cf56db83741b10144d6767ba2b97b23a5e83504c60e06ab22834b0145655aa0463108317a379cbfc8a93de8a66925a999b8b02bf88dd85fb9898cefe9c95c8 -E = 0 -M = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745 - -ModExp = 0 -A = 0 -E = a3be10ef04535fca6784e5dbf3733d677dedd50fabbc3a860496628950b4747a328c2ce0d903cbe1e700f0af30f59fb917202257815097a2b516df5d0a82642faeffdfc3b7883766c78fc4be5901ebef891a9ca27f3bcf00960729e659bb3fddd54a19ce628e95ab86e4c7a168588bc9f67b05dd21a583acd8dc36e615945648 -M = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745 - -ModExp = 442866609915aa6f1bae9dfb59e721e1b63f42c0f75fbf0a88344120fbbd7aacf15208fb7c9d8bb8477d553cbd826d7e685ad764a8423e81c2131c040ee83a03cab8d5ce50866a941b48c78e9f1330794d908562d4141cfbf26e8c80c69551339eec41e37e2b37b54330f7bd75748f8d26d56ab9eb3b0c127540484c6445a7fa -A = 8ff65e2cbcbcd8697cc3ce9a26855d6422ac7eb4e66500648c08be697e005cc3c854a54cfab91d43489cd60be8b516a9b3c9688e5e009a1689c6b164a133859a5464ef422c86344fef42cc477c9df27768377c126a066d1b62f593b7f6d6e906feaee16addb7cfbfc043d741b7dc81a87c17f167b7b8ef1b1fb3dfd1eb14102d -E = a3be10ef04535fca6784e5dbf3733d677dedd50fabbc3a860496628950b4747a328c2ce0d903cbe1e700f0af30f59fb917202257815097a2b516df5d0a82642faeffdfc3b7883766c78fc4be5901ebef891a9ca27f3bcf00960729e659bb3fddd54a19ce628e95ab86e4c7a168588bc9f67b05dd21a583acd8dc36e615945648 -M = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745 - -ModExp = 1 -A = fe9f77f7d0475e00ec964c0effb9b8e079c32e376ce77a9c40ce4018c3df44a77b4f294d9565502b2b79accb30cb58dda6d15e1543b6d4a53296543ed11c7f51baab60283ef03fae37dfeacb431392487ec2839551a933895c4dbf18844f7b375d3e6f558d3c39993cea1bbf7fb743a6a07bd3753c03eb7298811476d7f3ff1d -E = 0 -M = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511 - -ModExp = 0 -A = 0 -E = a0bc148ed50a9b54036bb8fa1f214979052ebd47db8b347af3bb03b806bb457b468ba34781f8a25f289a7a90af4903dc14809a166df2f4c3527de2ea6911cb1afb9071a4afbb522a7d50634d66fd584c73f32d05217dc9f7f16394c68a692a953492ca85f89cc11da95fd8cac6231647923ced48a1b3b0ee68c010286d452836 -M = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511 - -ModExp = 91fd879d02f95a9f40fcd1037726f73892caf84e9b43b4aa4126d9062a0d22c464e7af2fbd91aa849612d99d9519b724a7fb1cb018fffdcff321d883ab2519953c9f174f09dd8f13ac87339887385966eb4a94842276637b2c36c0a5036b1d3bbea438bc6efd4b4851c7ec06879d60694df894717569bcd31c4b13d80df6cbca -A = cdec5edc1cb3ea974342b85aabc0f9385cf877ca328747d40dd4d297623ad69ab6582653faeed5aef225208305135cfbee32e066cb43e18afacea3a32acc8aabbc49617ac33e741651924ae56dd6aa044a12a1ea50fef573b5befb2f4b21b9cf83ab2aaa6fd153580a0761666ade8fb94f202a3c3dc4f33297eabb4564374168 -E = a0bc148ed50a9b54036bb8fa1f214979052ebd47db8b347af3bb03b806bb457b468ba34781f8a25f289a7a90af4903dc14809a166df2f4c3527de2ea6911cb1afb9071a4afbb522a7d50634d66fd584c73f32d05217dc9f7f16394c68a692a953492ca85f89cc11da95fd8cac6231647923ced48a1b3b0ee68c010286d452836 -M = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511 - -# Craft inputs whose Montgomery representation is 1, i.e., shorter than M, in -# order to test the const time precomputation scattering/gathering. - -ModExp = 9442d2eca2905ad796383947b14ddfcc341f5be8fec079135c36f6f0d9b8b2212f43e08bf29c46167ff0fe16b247cd365df4417d96cc31c94db1cf44b73b0ee3ebcc4920d9b0d003b68e49c1df91e61bc7758a8a1d2d6192ff4e1590b1a792f8be3a1b83db3ad9667d14398d873faf5d885ec3a2bef955026fae6dbf64daea2b -A = 3a4b4c57e62c5e9d1a9065191f8268fed9d5f6f424d071acef66f0662b8210f4c029ed991512e40c9c912043c816d2c4c5b53fa0e5c253e16808aad4225130dafbbb89fd4f30cdfc1c2f2179b636a7ddc4be579795820b4b9377637bd8a21a0ef5a90d0e0f865321eee23d9be2a3b7320b4012d02941b892df2c40bdc85c1898 -E = a2c56ea1362511cac0301918e15a9afe7d37edd438a5c3538d258ea01f0a6df758de07111e868b3ad8fc89b629b4955d78a1b3af902be1806410ddde25ccc6a196ba5949395c1ad5d8725b18815dc1cd5ac1c7dd17773f571e3f2e628255af14476e0494be23a4a4dfd18e23142f33d7a59c236fec61660e360d9676a747c69f -M = ede35a3a7afac817d413373a2032abbc067b1493f709ae6e1282ee5469743391d891b904938857168802b7872d3cd7ac18ab249a9e540a86f970b1d0f310a4cc29df1cc9d4063d98c554f1a32f4ca5eba3523cdfb142e0fc609907c7a92bb0187009d97ec471db3545f42dd5fd29c07b7816085d09477ba31fcf90084660116d - -ModExp = a7f5844fa9e7202d4b70ee252c9846e63d3d091b0387768ded872cec53458e19df0d9b4960226e269b8ca5dd4c4eda423a67b6dbb48235c08c12c6c7c78db47287756d3ed9cecb9232f7d18d5d80b9676cb68ba4a290c97e220beb1a069976b5e6022a4c1e5ddbeec86b62dda24ffea1deda37695c9f61a8817218e6370c0679 -A = 7d6d0cc947ceb949cdc4e9e1044f5deca5bb05a491041e0d85bc4b92a0944a57c72845fad91e59010c61ad1712bd2f612d53a846a044632262a9f2e3373b062fde2484e0c165ff947f2469f743ab6e2e5e13c640fc4029b1c9213eb8473c674e7f9e95a4a5c5636d4656c1e696962340d77b322daba47d6fc894f2a2cd9e0afc -E = b78012afe806e2344d004c739c97324256850980ac97d88c4ed9a838517639ca112e235978d21a176c33f5a68703aba0f2a05501bbe3fc8d49a000fbf530cdb431581dfaf8683cb15a2aee5e239cbc542827100da3b47babf4a16ca7c588aff9912e674abb449e0b767a15e415f4e7f2bbd6380d7131da3df8d49b13bfd35ce3 -M = b72d5c55bd2998472f1965e75a51be6155c1ba04656da8f66bcb34db36a7b1db66a89d1d05b1bde10206acf85be7b474ab689220faf1bb52ab39d8dc00512dd4e26df1179c11b973e1274db85a88c7cc2a17113abdffe58cb930ddc5f3ccc4d68b4e65c913730509f7ce5656e8bbaba9b1be177ab9f766678f018fea05da9cdf - -ModExp = 465ff295786a88496828fdc763e9292d557957544e9322b7996807b87fdbfa7a11614bffeec557ca831c4824c8e4ca3b1a1c7f3f4f95ec3fd6a86b73bb13d78b73af2b3c7e76954d0cc03bcb0cd606867ebb3765a8b3d0108cbe4f343a14016be9c33f6d200f0dc547e7d6b02bfab1e79dcdf9c9835a814cc6c855a12ebeb66d -A = 89ad02bea3e9ab839a6e23f20122409daba52c68e1e893034b30d321c0305434a6af940015e3fa5ca9c35230da34beeb1ed4fbce6c1da3a8bfe3f3ae172276c1d1723b47ee61e6f8fcfdafad102d6f7ee2a79f510c7edb93096205a40a6c9e665b88b18f39a979e2e61286d939952a6f02fe8148b7515bb25f4252337cb6e60d -E = cbd6ac628cc7afa3c61bee9c22a06a395087ec1811fe9681b55216700c435996c815e7cec8aaa90016dd2382d0306a5414630124e14f3d396a4ba02ee17851bf720f1607ff813e4bbddf01338983db12f59bd6371a738eee3eeb716f21051d6174d2d6c77602942b9edaac18d4b3a723096c0d00dd23a8a605c585022f311560 -M = fa7a3e40364c8a8d0f14f0213a3f3e035222ca0ea19d46d10ba41580e5dd2805c8a133f3856d7d5d97f922ea540e5eb0d10ad04dfdbb74f518f58da0099a6fc2b3f3def92985176e07fc78aff2faebccca10a429794e5f15ff92f75fe90f527c60ddea8093a9078c703c372ca09f7aeb27ade02f3595308c61dd9c44e62fd101 - -ModExp = cf08bf00261402102e9fe03f3074471dcf0e9b3c96d4d1503f099f24ec85e1901b023e9e048c1ad042244f5f70b38b25a99f4c0a7b57d5844bb0d0137367f45f4ce2cc7746105b77414768cb97648dc5721149aed2d4c682408cc0d50d26dd0bd77e848911f8625c727cac5f32e63bcb548f41a57d718d772f23983a42f603bd -A = a419646a6631c2c69b18f7aa65011825eb31692eecaee9d74f92d92203811b68e9764bda31a1585bdf69b6273fc6f9f508c395ac081336506525dad88473512f08a205621ac8b16e9864c7a7c5a4f17435de00d0b32badec6ce4897e3e1076c562b6d9523f63d0b2079eaa416cb090471657763f24931d955d1fa2720c80a9c9 -E = d5a6f4a1842aaee39805356dc8d0d678ee03b2c81277345beccb2742f899132feb43271f95968a01ae68aa8277201851992dc0aa7a71c90aae71b124d873ee264ea400fb131be0fc6c4ce8c04c45f6bdaca89ac743635caf6158983d257e21cef6800d7f990e912ba21bbfb8fb779afa4abd19e07e7e07eee9908493d1ca502c -M = e739689b6cc6def1d45fb1a2ab551643beeb303f4aaa4da47ee5e4948510f8445b4c40e99ae8354dede60b2ba6694e93bc4d573b7e8adf871b7a9a9636eb7d70f2e49328e2d7978143b177cee8374ef01bd1ee2d95862765883f5e7971668b53ef0ff41b6539faf63c397522b0bdce916388e72e26c8d3d2e58dadeb9eb5d479 - -ModExp = 827e6312ec3b14600203bb83f5b277ded197b2967363630ef673240df05edd3ba8ab2b11c86251a612206569c6c33952b31e264f129909bfe723bd0ee1624b36cfcfaa893a6ec8b5a1f7de79f83e79b459a3350f89f412ad1cfd6bc4c2a7a29272c783d6ecceeb1398fa17041835643f4debef9b5e87b098d104bb8912dddf7c -A = b8e49c637829021d32db3a39a0c1e58cdd4c6e4eda7e8e9293be379e9c2e2d184f929d278598a81ae231cfedcf69cce4a6e31cda3c8ac14d753a7311f2436e29795f0dfb60259a0f61a997918ff984aa2284b43a9d64c974059e9682adfffd018305835f74eda8c75fe4877d811c1620f654ec9f7f32d1af5ce59115e2f41785 -E = 80e0febf369d234bf1aaad4f82df2e2ff02882c3184781f6ccdf4f7cd93b6887af86830077c84dfb02109ada05b40970b1c65228b0c19030bd6361c3537fee22a8155c03b4e7007ca006c6daa3659518d05bb81ea0079456d0ef6116df248dffdb0c935f321f5a1034deefd5a9414a0652aa6548de33325b474b9e5a8507a082 -M = d5eb1d14af842a9973274f7463d90cf0ccff19c47d710edbae184478d4f29b02693ed7958bd487054327b9e6d8879e24c9af7730b92f323eeac05558da6c1b952e5dbf13de236050a77628bb5325fe0d14cc5773bf73338759d5ab43c212b414581280f1cee250007e53791b800b61c90de0328acd7bc43fbdda48158939392d - -ModExp = 4a1efd29c7e78549f5cd4deed1454b37462c7810ee6a8a2493b764dfa479be13b314cf9ff98259517d61865567ef499a511630c0038c97914625df181c6fe07892f329f98b344a78d751e9471483eebaa7977371bf97bb25187ae7e93a9227d6c124ccb4644423c961a11ae59c4354f89d5a95164c23d9aa256e289e9cc0858e -A = bd86c9211fa6a47a06e5016c46cb8a99e34a043a29e22f8c3196fa7197c26b38927b8d9bc0ddc11a5fa4bcc44deb69dbf37cbe7ebc9a2fad6c74e09ab5a9dd929fa04ab4319b6caad1035739be78ba631fb0748d9e53944836d37ccda6e6a62823c696d8f31139ccd7f2f86b22fa026ecf433cfb1271a3539ac4f1c83aaac059 -E = c40b9972006d28a84c2769a86e526a2b274f73afc7c5c6a2742166757f61b5f5fdbb228afa157af62af989ffe966f232bba9e6beef5403d1690ade31a6410f7f349a35bc4267a129afd647993df7d45cc0e1a1ba4678d7f1b6e8a344d8ff7037679e1f4db25a454e4246f6b55c416567fcfa188e8a3865115851d9edf0aa8902 -M = cf424d7af75ce7eef90cad75ae55ca8810cc7b4703fdb5bce701e7bac07e0c371cae06df2aa8facb55a0faa6793e4d2bd9d7969703743b9be170be82792aeea55e2bc0f7ab7617b276486bf474dee2f4556aab595ff3ef115139cfe5e21ccd4ee05c0e1cf901bd85df86cc17195a783b0be836d00bee82ce064077f9191188f9 - -ModExp = 3137a3049fd4ad2e26d870f5c998cf11bfe82101884a82e85e43facd0928cd7434a2e346ca124619769fa141bbe92ad6f36b99231032ddaec3b349a410f82b5ca36f45e56e5fb85dc63d32053dc90805d3f1854ab385281a71a57726bf97158494e7476057214ca7379ab8b70f5bdc15f70bdad3adf33c3a1f9cd1b6bbbad556 -A = 39a1dc6a4c3f14d9c350ee968d5ce139ef725952c967a2d1bedf48ace22091283525be03807e2e263d2640be77f0525247bcd07149bba50568cec5a082c87d72962cf9e43bcb5cdb1e7e9a650fb53e0ec2fad37f09a9f036c0d7dfa528fef846769f80a9a60854910ca1b4ee05dba82ed2ee018348d6b3e52a764b8ffae61e0 -E = deaee3a3f80c9f684ed7110c0653847ccc7be5ff6d982fd4b49f59b5dd35f7210b1077babbcedbc127df35cd469dc6e569a0f84e58149b5605c94b09fd7f0b098d02b4a04631328b3fae39e6c2fce25334225cab71829abdb9507cb903701559660f2c08c3b743336119d1260a0db27054cad3f28bc1b04b2289baa58fb33965 -M = 938388927d06ed3bb1286c0f06d3054cb0ee16dc7a0bbbf13a45293c09a5f40f1d611b2e1a1b0ec2ef109b508e27af4274954905cae52034f8740a744153b4d22059f0dd262ea51785522098ecacced6da07709ee6b5acc8c4e99331379a7c3de7f4e2d1431e43b19570140955b7bcba118dfbaa552cbfa2be531e8f781166ed - -ModExp = c15ae334455d9f4d1030cd33e734726a27c63624c2afc576238cce5e0498298a4a0c93090a0d19568b41290303c4b558f3d9dd74f9cde8798710f68569ea0d6fd971ce67ec5b54495031de3d8842b8b49288725bee5c9f72b99054d64986ccd4e18d70d5f33943f08cd694eff538f84438ea993ebaba0910c95b3a694f213510 -A = def633b955a917569df3ba8517455eef0655e7a35985edda27097a063e0d82c7c3a76dc36c5d8a71ba9d540790ddd0ea514aaed98925f9a1808eb288d387aaf9605a9ef8a333ebee7ad7057bca012efd619d5867f02266f65976ef4b16da17468426ac4f99b3e8921707e01b4de20f6f9a068e6a19d872079a27f3a44449db83 -E = a465c47b0d15d48e01bb8b1d8e3b3253e11515f6874dbed6c25818adf1a8fd927124d5593beb367f685c11e46f18415be73ccdf16fa2e93a600b728163d21d232849e5278c3749d903edad3f1c4535a2f55a2ab65e7ebc64888bd2a0527e876ecf38cec3ab1980d08138709fad8eb88ae65d960adc3f0f8e92f784fe96fcb693 -M = e43cb9ac1446154356cdc31ec771c79b0e461e22d95185bbe1a279c0945e3af07903a0cb54d553380716fcdcafb4b7cf5dc6da481dc74a8c583d75ff6c1f8e429182d200246ebc473bb56e173787987c1b7fb2dd23f5b2e438a97bc4a1df628bc044fdd1e80c0cf37030adb7b04784dab827d0dcd64f0dbf37c980612570ce11 - -ModExp = 75c3f79ab7c991b98e65505342a8a563cfb08b5d3ccf8664c7db1de50256b1d17ebf7096dc98c7bb5d7f027a894ae5cbb14dee04d5d445e775ad7e239acc82673b0ac2d819a69c83864f34e73d9a636f05de8279619a067b4c90ad038db5910447e03841d2034635018f08cbcd21efa00994247763a249082594128112f95232 -A = 34def7d76f6f158a359fd12759fb889cdf6af0a24830dc3e84283a1ab4e9b2647a6a36b86482f829b2cdf3e3d6028f9a884b1f64f7262315446bea8b0231828e2f3d990fb103c17f820b39e4b8427c85643ceeca8f5dc8f191d1255768300e859bd7d88c770319ef38269660d221cb3bc061389b6fc0783485ef042b1c7d6fef -E = c6c46453dd5aac6b37277a446b1d0c69cbe476eeff55b3ac35edb89ba97116b0e7783660f2c7b31b2a2d6c4709d0ab45d01a838100694b0777c9c9c14c959b07c437c73a5eabb7402f1001e802d797a2e7707285834fb6440a1c2f727f7bb84ddb2a49312d32fa0ce620c43872655cb5c394749c9e75d7fa25be00efe50d47d6 -M = fbbab6698a9142095c46b38a732592e4366c1838b84bf40f8c8fc7b630f73380a0d09765562365798f8c8030ed1b6728329d8bb06e882c35a1d59bfe84146a9db2afe42a414014e247390281c782fce806d62adb54778d2bcb49555459429d6ed446af5359657667f6aa19e8e3e0e24ab2bc312b2d90b5cb1ce6f2f15af15d9d - -ModExp = ba16d7f3f6e162ce248490d164a13c00e7720d8a667e2d3ebeb13f1663e15ef5408d5b56cbc7bc793a8ca787cc50f8e15e0e9d4ee764531d04a9114eea556bb3e206ed7d85267151a056b6e68fbf35e03f2cf829708ffe1de13e95ecfe365aff1eea36340ffcd3892dee659fb1ecbe50f5080e54737c10f9c1ba638b14ef537e -A = 9025e6183706105e948b1b0edf922f9011b9e11887d70adb00b26f272b9e76a38f3099084d9cccf12d04b1a99c0f654f8b9ed90c6dff9478c60bf05d58d734ab60eaefa14a22230ec60c90dc1f0704b61eef0bef345785ae0e6a9af7db069cf6bd2b4e0fe58a0ade83c7e46a04b9fe1d24cb9b65c6f80de713e61d70eae5b286 -E = d7e6df5d755284929b986cd9b61c9c2c8843f24c711fbdbae1a468edcae159400943725570726cdc92b3ea94f9f206729516fdda83e31d815b0c7720e7598a91d992273e3bd8ac413b441d8f1dfe5aa7c3bf3ef573adc38292676217467731e6cf440a59611b8110af88d3e62f60209b513b01fbb69a097458ad02096b5e38f0 -M = e4e784aa1fa88625a43ba0185a153a929663920be7fe674a4d33c943d3b898cff051482e7050a070cede53be5e89f31515772c7aea637576f99f82708f89d9e244f6ad3a24a02cbe5c0ff7bcf2dad5491f53db7c3f2698a7c41b44f086652f17bb05fe4c5c0a92433c34086b49d7e1825b28bab6c5a9bd0bc95b53d659afa0d7 - -# See https://github.com/openssl/openssl/commit/e9e726506cd2a3fd9c0f12daf8cc1fe934c7dddb. -# OpenSSL's test vectors do not include the expected value, so ModExp was -# computed with Python 3. -ModExp = ccb051a34f9e26e381e50445632cbbd4abe56bc912020f3edd2db144aedb470095c4c33e3342d1dc4bb4056ba3078366af4cee507e85bb1b2e499ef25a933810f14faa8b1a9ce5e8d58f2789e27c887a4ff87fa59ff682727a3912a99aae6db8b3b8947d76c8454cffc6fb3f2422dca106c3845b0db68a06e5e9d7b90e552506579d812e7d96bfc6324feec90ea0800463346148f120e7caf403788539f5d87ee45aa5b313c340e0a323029f3a0bdb675510aefec171c01e2a94960cd507e461214028c86ed4e9fce31e7dbdf1a75fd6f973e2aed4a039e53a60a7aa62be8ee1f80a113833ab402d07e17151021cec29fa5b2e628ef9f2d7aa4bc86b6eec8faf -A = 95564994a96c45954227b845a1e99cb939d5a1da99ee91acc962396ae999a9ee38603790448f2f7694c242a875f0cad0aae658eba085f312d2febbbd128dd2b58f7d1149f03724215d704344d0d62c587ae3c5939cba4b9b5f3dc5e8e911ef9a5ce1a5a749a4989d0d8368f6e1f8cdf3a362a6c97fb02047ff152b480a4ad9852d45efdf0770542992afca6a0590d52930434bba96017afbc9f99e112950a8b1a359473ec376f329bdae6a19f503be6d4be7393c4e43468831234e27e3838680b949390d2e416a3f9759e5349ab4c253f6f29f819a6fe4cbfd27ada34903300eda021f62839f5878a36f1bc3085375b00fd5fa3e68d316c0fdace87a97558465 -E = f95dc0f980fbd22e90caa5a387cc4a369f3f830d50dd321c40db8c09a7e1a241a536e096622d3280c0c1ba849c1f4a79bf490f60006d081e8cf69960189f0d312cd9e17073a3fba7881b21474a13b334116cb2f5dbf3189a6de3515d0840f053c776d3982d391b6d04d642dda5cc6d1640174c09875addb70595658f89efb439dc6fbd55f903aadd307982d3f659207f265e1ec6271b274521b7a5e28e8fd7a55df089292820477802a43cf5b6b94e999e8c9944ddebb0d0e95a60f88cb7e813ba110d20e1024774107dd02949031864923b3cb8c3f7250d6d1287b0a40db6a47bd5a469518eb65aa207ddc47d8c6e5fc8e0c105be8fc1d4b57b2e27540471d5 -M = fef15d5ce4625f1bccfbba49fc8439c72bf8202af039a2259678941b60bb4a8f2987e965d58fd8cf86a856674d519763d0e1211cc9f8596971050d56d9b35db3785866cfbca17cfdbed6060be3629d894f924a89fdc1efc624f80d41a22f19009503fcc3824ef62ccb9208430c26f2d8ceb2c63488ec4c07437aa4c96c43dd8b9289ed00a712ff66ee195dc71f5e4ead02172b63c543d69baf495f5fd63ba7bcc633bd309c016e37736da92129d0b053d4ab28d21ad7d8b6fab2a8bbdc8ee647d2fbcf2cf426cf892e6f5639e0252993965dfb73ccd277407014ea784aaa280cb7b03972bc8b0baa72360bdb44b82415b86b2f260f877791cd33ba8f2d65229b - -# The following inputs trigger an edge case between Montgomery reduction and the -# "almost" reduction variant from https://eprint.iacr.org/2011/239 - -ModExp = 00 -A = 19c7bc9b97c6083cd7b8d1cd001452c9b67983247169c6532047eb7fc8933014dbf69fee7a358769f1429802c8ea89d4f9ca6ba6f368fbdb1fa5717b4a00 -E = bbc7e09147408571050e8d0c634682c5863b7e8a573626648902cff12e590c74f5a23ecce39732266bc15b8afbd6c48a48c83fbdc33947515cc0b6e4fb98ae2cd730e58f951fec8be7e2e3c74f4506c7fd7e29bdb28675fe8a59789ab1148e931a2ebd2d36f78bc241682a3d8083d8ff538858cd240c5a693936e5a391dc9d77118062a3f868c058440a4192267faaaba91112f45eee5842060febbf9353a6d3e7f7996573209136a5506062ea23d74067f08c613f3ff74bade25f8c3368e6dba84eae672eac11be1137fc514924fcab8c82e46d092bd047dcbadaa48c67a096ec1a04f392a8511e6acbad9954949b703e71ff837337b594055ae6f3c0fc154447a687c9ac8a2cdfd64a2e680c6ff21254735af7f5eb6b43f0bce86bda55a04143a991711081435ed4f4a89b23fc3a588022b7a8543db4bf5c8ac93603367c750ff2191f59a716340fab49bb7544759c8d846465eec1438e76395f73e7b5e945f31f1b87fefa854a0d208846eaab5fa27144fd039911608bab0eaee80f1d3553dfa2d9ba95268479b97a059613660df5ad79796e0b272244aca90ccc13449ec15c206eeed7b60405a4c5cfdf5da5d136c27fa9385d810ad198dfe794ffce9955e10520efea1e2eb794e379401b9affd863b9566ce941c4726755574a1b1946acf0090bfb93f37dd55f524485bbba7fa84b53addfde01ae1de9c57fe50d4b708dd0fa45d02af398b3d05c6d17f84c11e9aacdbe0b146cad6ddbd877731e26a17f3ebed459560d12ed7a6abc2ea6fe922e69d2622ef11b6b245b9ba8f0940faaa671a4beb727be5393a94dafaeff7221b29183e7418f4c5bb95a6a586c93dbc8ce0236d9dbe26c40513611b4141fed66599adbfb20fc30e09a4815e4159f65a6708f34584a7a77b3843941cd61a6917dcc3d07a3dfb5a2cb108bacea7e782f2111b4d22ecaaeff469ecd0da371df1ac5e9bf6df6ccba2d3a9f393d597499eaca2c206bfb81c3426c5fe45bcf16e38aecd246a319a1f37041c638b75a4839517e43a6d01bee7d85eaeedbce13cd15699d3ee42c7414cfed576590e4fb6ddb6edd3e1957efaf039bfe8b9dc75869b1f93abff15cae8b234161070fa3542303c2ed35ca66083d0ac299b81182317a2a3985269602b1fa1e822fcbda48e686d80b273f06b0a702ca7f42cbbbd2fc2b3601422c8bff6302eda3c61b293049636002649b16f3c1f0be2b6599d66493a4497cd795b10a2ab8220fafad24fa90e1bfcf39ecce337e705695c7a224bf9f445a287d6aab221341659ca4be7861f6ac4c9d33dac811e6 -M = 519b6e57781d40d897ec0c1b648d195526726b295438c9a70928ac25979563d72db91c8c42298a33b572edecdf40904c68a23337aa5341b56e92b0da5041 - -# To fully exercise BN_mod_exp_mont_consttime codepaths, we generate inputs at -# different bitwidths. rsaz-avx2.pl only runs at 1024-bit moduli, and -# x86_64-mont5.pl unrolls 8 64-bit words at a time, so we want to capture both -# multiples of 512- and non-multiples. Also include moduli that are not quite a -# full word. - -# 512-bit -ModExp = 00 -A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -M = 8f42c9e9e351ba9b32ab0cf69da43f4acf7028d19cff6e5059ea0e3fcc97c97f36a31470044737d4c0c933ac441ecb29e32c81401523afdac7de9c3fd8493c97 - -# 1024-bit -ModExp = 00 -A = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -M = 9da8dc26fdf4d2e49833b240ee552beb7a6e251caa91bfb5d6cafaf8ed9461877fda8f6ac299036d35806bc1ae7872e54eaac1ec6bee6d02c6621a9cf8883b3abc33c49b3e601203e0e86ef8f0562412cc689ee2670704583909ca6d7774c9f9f9f4d77d37fedef9cb51d207cb629ec02fa03b526fd6594bfa8f2da71238a0b7 - -# 1025-bit -ModExp = 00 -A = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011 -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -M = 010223abfdda02e84e11cec8ee7fc784fa135733935f7b9054bb70f1f06d234d76dcf3beed55c7f39e955dc1fef2b65009240fd02f7a1b27a78fc2867144bf666efb929856db9f671c356c4c67a068a70fe83c52eebda03668872fd270d0794f0771d217fb6b93b12529a944f7f0496a9158757c55b8ee14f803f1d2d887e2f561 - -# 1088-bit -ModExp = 00 -A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -M = e91f6d748773cb212a23aa348125615123b1800c9ea222c9374c757702ae4140fa333790ed8f6bf60a1d7dda65c2767cc5f33e32e333d19fbfb5a2b85795757c9ca070268763a618e9d33873d28a89bf88acd209efbb15b80cd33b92a6b3a682e1c91782fc24fb86ddff4f809219c977b54b99359094bbcc51dfe17b992ab24b74a17950ad754281 - -# 1472-bit -ModExp = 00 -A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -M = a8770362f4bfe4fc1ab0e52705c11a9b6ba235d5a5f22197c2d68e27ed18426ede3316af706aa79bcf943dbd51459eb15ae1f9386216b3f3a847f94440a65b97659bc5ba2adb67173714ecaa886c0b926d7a64ea45576f9d2171784ce7e801724d5b0abfd93357d538ea7ad3ad89a74f4660bdb66dfb5f684dcf00402e3cdf0ab58afd867c943c8f47b80268a789456aa7c50a619dd2f9f5e3f74b5d810f0f8dadbf4ad5b917cdcb156c4c132611c8b3b035118a9e03551f - -# 1536-bit -ModExp = 00 -A = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -M = 878cd000778f927b2f1a4b8bac86efd282079a7ac0d25e09ffd2f72fbc282e65e233929d2457c7b1d63c56fb706cdfa04fb87e654c578c98d7cf59c2293dc5641086b68db4867105981daaf147a0ee91f6932ef064deae4142c19e58d50c0686f0eaf778be72450f89a98b4680bbc5ffab942195e44dd20616150fd1deca058068ca31ab2f861e99082588f17a2025bf5e536150142fca3187a259c791fc721430f24d7e338f8dc02e693a7e694d42775e80f7f7c03600b6ae86b4aba2b0e991 - -# 2048-bit -ModExp = 00 -A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -M = 9f40a7535c561208ecb38e17c9336d9bc8484d335901b2cd42759cf03689227f6992f10cb6b586d767fbcdf30e9d82a0eda60d2694ccd0194fa96b50b56e0cdeec1951ea9e58b07e334a7f108841a0ab28256917fecea561388807ed124a17386a7a7b501f9cbf3404247a76948d0561e48137d3f9669e36f175731796aeaf78851f7d866917f661422186a4814aa35c066b5a90b9cfc918af769a9f0bb30c12581027df64ac328a0f07dbd20adb704479f6d0f233a131828c71bab19c3c34795ea4fb68aa632c6f688e5b3b84413c9031d8dc251003a590dec0dd09bfa6109ed4570701439b6f265b84ac2170c317357b5fbe5535e2bbdd93c1aacfdaa28c85 - -# 3072-bit -ModExp = 00 -A = 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -M = c23dfd244a58a668d514498a705c8f8f548311b24f0f98b023d2d33632534c2ae948d6641d41fd7a29fbbd594bfc7fdd6e8162cbb3056af3075347b6fc8876458d33a9d0ffdbcdf482de0c73d1310fd8fa8f9f92dd0dbb0e2034e98a30f6c11b482f7476c5b593f673a322b1130daa4314e9074270dce1076436f0d56cf196afcbb235a9a7b3ac85b9062e85fc0e63a12c468c787019f6805f9faab64fc6a0babc80785d88740243f11366bffb40ccbe8b2bb7a99a2c8238a6f656bb0117d7b2602aa400f4d77de5f93c673f13264ca70de949454e3e3f261993c1aa427e8ef4f507af744f71f3b4aaf3c981d44cc1bfb1eb1151168762b242b740573df698e500d99612e17dc760f7b3bf7c235e39e81ad7edbe6c07dbb8b139745bb394d61cb799bcafec5de074932b0b2d74797e779ac8d81f63a2b2e9baa229dfaa7f90f34ffade1d2ad022a3407d35eb2d7477c6ae8ad100f6e95c05b4f947c1fabfb11a17add384e6b4cd3a02fd9b43f46805c6c74e366b74aa3b766be7a5fbbd67fa81 - -# 4096-bit -ModExp = 00 -A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -M = 8030411ecbddcb0fe4e76fd6b5bf542e8b015d1610cf96130ded12ba2cda0641bd9692080f218ea8b0d751845b519d95b843542ec8d2a07f1f93afe3189b69a4f35c983011c7f7928c3df458cc3eae85c36e6934a4b1bc0a67c8a521de336642c49e10a7ffa8d0af911aacc19e3900449161940f139220e099a150dcaf0ff96ffff6e726c1ac139969103cf6a828ac3adf0301506aa02787b4f570d5dde53a34acab8fec6fa94760abf16ee99954371ad65a6e899daab87b95811d069404991de9abe064ebbddf886e970f10d260c899dda940191a82d4c8bd36651363aff5493f4f59e700007dcadf37ebea7fcfd7600d16617ffea0d9ae659446d851d93c564e50e558f734c894d735fa273770703dab62844d9f01badf632f3d14a00f739c022c9be95f54e9cea46ec6da7cb11f4602e06962951c48204726b7f120ddbd0eb3566dc8d1e6f195a9196e96db33322d088b43aecffe9b4df182dd016aca0bd14f1c56cd1a18b89165c027029862b09ffd78e92ab614349c4fd67f49cb12cd33d0728930d0538bda57acef1365a73cc8fbac7d463b9e3c3bae0bb6224b080cdb8b5cd47d546d53111fdc22b7ff679bcfe27192920ee163b2be337d8cccc93b4de7d2d31934b9c0e97af291dcc1135b4a473bd37114eec3ba75c411887b57799d3188e7353f33a4d31735ebfc9fcfc044985148dd96da3876a5ab7ea7a404b411 - - -# RSAZ 512-bit. -# -# These are regression tests for code which historically reached the RSAZ-512 -# code. That has since been removed, but the test vectors remain. Note that the -# lengths of the inputs, especially the *bit* length of |M|, matter a lot. - -# Control: No relationship between A and M except that A < M and they're the same number of limbs. -ModExp = 7f34c1cd63377bc3abf2bb5b2d1bf5f06454e1e8040fe19a72245ce9731cbee1bf9e84532300776c8021ed4f3a8de508d85b4cf320bd82065a013754857b50c4 -A = 8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364 -E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# Same as above except A is negative. -ModExp = 71fa6a4c8ae75368eda8cc6282c26afa69e2af12a97fb9444f16b7dd6c99e0a5d6034cab4248cae4357346b211039f4a2bc4c5a20a297372094162417af703cd -A = -8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364 -E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A. -ModExp = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 -A = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 -E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# Same inputs as above except A is negative. Note that A mod M with a "correct top" isn't the right length for RSAZ. -ModExp = 1 -A = -f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 -E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# A == M, so A == 0 (mod M) so A ^ E (mod M) == 0. Note that A mod M with a "correct top" isn't the right length for RSAZ. -ModExp = 0 -A = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 -E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# A is negative, and A (mod M) is the right length for RSAZ. -ModExp = 8d76eb0f8c7bc3160cc8bb0e0c3590fbed26c5932f5f525b48045c0bd46dda287ba5483f97c851fb7c12c2e858ee7a4a4d1af745cbfb3eb311fa54bea12cde25 -A = -80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - - -# RSAZ 1024-bit. -# Note that the lengths of the inputs, especially the *bit* length of |M|, matter a lot. - -# Control: No relationship between A and M except that A < M and they're the same number of limbs. -ModExp = 8984f8c16044f9c0ad7bd72347af90f58e6e003acda92b76e3c7c4a56ea8e918409d8e9b34884d4c89d0b17cb40fe898f2627c084a0f1698e46beccbf6f48eecc281e11ea9e5135adba460ddae157f2c655b5f589ce29b254d43a960a71cede8a08dbb86be4dac22458da232fb1ec2470856827302ed772c9ddafa408c931aa7 -A = 21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8 -E = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575 -M = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7 - -# Same as above except A is negative. -ModExp = 75b54540dd6ec1e87c4e77bb93fd50477ea463fdadb5cab05119b34585d18f971617fc1194240ffa6bdfb53e4785f0a451e03f8c3c444aa6080a96af5906eaa508862a4de15b2c55c023b6f278cd04c1e24fd0711244afeda8e3444256e51261ed99fe66beedb52c43c825b4c7a1adc7d4b111e2208ecd495df91e175573ca10 -A = -21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8 -E = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575 -M = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7 - -# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A. -ModExp = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 -A = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 -E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 -M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 - -# Same inputs as above except A is negative. Note that A mod M with a "correct top" isn't the right length for RSAZ. -ModExp = 1 -A = -b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 -E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 -M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 - -# A == M, so A == 0 (mod M) so A ^ E (mod M) == 0. Note that A mod M with a "correct top" isn't the right length for RSAZ. -ModExp = 0 -A = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 -E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 -M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 - -# A is negative, and A (mod M) is the right length for RSAZ. -ModExp = 9cf810b9e89d5cbc4b79ae64e123ea06d92965e2bab077df97a1b906dc2e1ddcf96a9c4ed14e2cd96309b829ea9cc2a74a7d4b43c5f34d792a7c583201427754b8f78b783608070a84b61f18913e3ced7f7f530972de7764667c54e29d756eea38a93cd1703c676a4587231b0ebfeadddf908e2877a7a84b5bfc370ecf0d158d -A = -8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 -M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 - -# Regression test for CVE-2017-3738. -ModExp = d360792bd8210786607817c3dda64cc38c8d0f25569597cb1f363c7919a0c3587baff01a2283edaeb04fc288ac0ab3f279b2a89ffcb452d8bdf72422a9f9780f4aa702dc964cf033149d3a339883062cab8564aebdbfac0bf68985e522c6fe545b346044690c525ca85d3f4eb3e3c25cdf541545afc84a309e9b1d7807003461 -A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2020202020df -E = 2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020FF2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 -M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2020202020ff - -# Test vectors for CVE-2019-1551. (We do not carry the assembly file with the -# bug, but we use the test vectors anyway.) - -# Original test vectors by OSS-Fuzz. -ModExp = 9d675d188a07e9bd1b32638cc8cfd5002ef89bd1a9648f806567b87939140a67977dc8da17323b8e4c6bc53875cda8b656df8f54cc32e44fd9c21d122ea3c0d6 -A = dea9b3e0b44ae67b2ac9b7c2b18eeb4dab206b014981a46ac409f195eeb6896f132cf8497c87d1188008ee511054ebb426203355b7d515dce9501cb759ac1373 -E = b01ae745b101e9e45ec05dcff72e7f8fc04c79ffe324301fda0b4f7be81d85c4e875c73fc6c5cb40000000000000000000000000000000000 -M = ffffffff01ffffffffffffffffffffffffffe2000000000000000000000000000010fab8d960706cd4c21818115650cad61d4f10da325dffffffff00ffff00ff - -ModExp = 651f811b62ee8770e3598c340864dd6b0be9bb6376b6f933ab216fd55538e6ad1000cb2b3c64f54d554e004b6eec8138e6ecff00452d443a42041b72e6cd9ead -A = 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e -E = 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e09003e3e3e3e3e3e3e3e3e3e3e3e3e3e010900230a01230a2100ffffff0000adf300a58700000000ffffff00 -M = ffffff0b00000000000000000000000000ffffffff0000ffffffff00000a0000000a00000000000000000000ffffffff000000000000ffffffffffff000000ff - -# Test vectors for rsaz_512_sqr bug, with rcx/rbx=1 - -# between first and second iteration -ModExp = 1 -A = 624e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d973b6 -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between second and third iteration -ModExp = 1 -A = 11024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000f -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between third and fourth iteration -ModExp = 1 -A = 4171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d9736080000000000000000000000000000039 -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between fourth and fifth iteration -ModExp = 1 -A = 6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000000000000000000000000000000000006 -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between fifth and sixth iteration -ModExp = 1 -A = 44e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000000000000000000000000000000000000000000000000003c -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between sixth and seventh iteration -ModExp = 1 -A = 1024e6a171024e6a14ce297f2873536f959d8c3390d973608000000000000000000000000000000000000000000000000000000000000000000000000000000e -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between seventh and eighth iteration -ModExp = 1 -A = 626eee5e3c8653be47ed15e84b97cc7f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000187 -E = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f8 -M = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f9 - -# Test vectors for rsaz_512_srq bug, with rcx/rbx=2 - -# between first and second iteration -ModExp = 1 -A = 3c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf7c -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between second and third iteration -ModExp = 1 -A = 485c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf47800000000000003f -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between third and forth iteration -ModExp = 1 -A = 59a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf478000000000000000000000000000004e -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between forth and fifth iteration -ModExp = 1 -A = 2939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf47800000000000000000000000000000000000000000000024 -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between fifth and sixth iteration -ModExp = 1 -A = 640939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf478000000000000000000000000000000000000000000000000000000000000057 -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between sixth and seventh iteration -ModExp = 1 -A = 25c40939a85c4093995e8efdb195e8efd8caf477ed8caf4780000000000000000000000000000000000000000000000000000000000000000000000000000021 -E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e -M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f - -# between seventh and eighth iteration -ModExp = 1 -A = 7b4919849931b28a14fcace213f2b3884fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b6e67b66ce4d9c -E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000004c -M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000004d - - -# Exp tests. -# -# These test vectors satisfy A ^ E = Exp. - -Exp = aa6d7ac431 -A = d0e07 -E = 2 - -Exp = 12d416b110dbb4e467ff0c89a22122f4da8240 -A = 1a18cf6 -E = 6 - -Exp = 49a3b33e23d84f1ce0d5d83f5dcb651d50cf3920f0143da2310d0512a90a06cd8f38977df8a756c30883de38df092000 -A = 2a3acbd2 -E = d - -Exp = 5b4a0d5a956f885f275712b194459980f24708bfb6393d71bd37dce852ce455724f5ee5030775fb86b4295edc98afaafc097e4d82a97c0078ec0eac763db16549c5145c4cf2d3124f88cf9a5c71da0625afb99b26801786fe49a778415dc025954021753d08691947a208b613f0be5c1 -A = 54b3ae461 -E = 1a - -Exp = a0ea5f6a4de49beb8fb7f0dab280d6a32c5a3814c9a5153a7944cec0a9028497846a8a89044348721a0bb5f0c3ded3e980574ea321b0cdb0ead4f4e93841ea7478a7f15d9729b646a8165813a0750e8124f5465dda9b105e1bbeff18fd09c09a2e26610d9176d253b877c3a8908a6be521cbe1e472a7a1b7820e4e890f8f28aacd34609c686e76e15b01bd9324a71290812724ea564d11c874a6765b262c3e57d479da0287a76026a1e8fe53da0b02405da1d379eaa30fc65f -A = fccec0f6df -E = 25 - - -# ModSqrt tests. -# -# These test vectors satisfy ModSqrt * ModSqrt = A (mod P) with P a prime. -# ModSqrt is in [0, (P-1)/2]. - -ModSqrt = 1 -A = 1 -P = 2 - -ModSqrt = 1 -A = 1 -P = 2 - -ModSqrt = 1 -A = 1 -P = 2 - -ModSqrt = 1 -A = -1 -P = 2 - -ModSqrt = 1 -A = -1 -P = 2 - -ModSqrt = 0 -A = 0 -P = 3 - -ModSqrt = 0 -A = -3 -P = 3 - -ModSqrt = 0 -A = -3 -P = 3 - -ModSqrt = 0 -A = 0 -P = 3 - -ModSqrt = 0 -A = 0 -P = 3 - -ModSqrt = 0 -A = 0 -P = 5 - -ModSqrt = 1 -A = -4 -P = 5 - -ModSqrt = 0 -A = -5 -P = 5 - -ModSqrt = 2 -A = 4 -P = 5 - -ModSqrt = 0 -A = -5 -P = 5 - -ModSqrt = 3 -A = -5 -P = 7 - -ModSqrt = 0 -A = 0 -P = 7 - -ModSqrt = 0 -A = 0 -P = 7 - -ModSqrt = 2 -A = 4 -P = 7 - -ModSqrt = 3 -A = -5 -P = 7 - -ModSqrt = 4 -A = 10 -P = b - -ModSqrt = 0 -A = 0 -P = b - -ModSqrt = 3 -A = -2 -P = b - -ModSqrt = 3 -A = -2 -P = b - -ModSqrt = 2 -A = 4 -P = b - -ModSqrt = 2 -A = 1e -P = d - -ModSqrt = 2 -A = 1e -P = d - -ModSqrt = 0 -A = -d -P = d - -ModSqrt = 0 -A = -d -P = d - -ModSqrt = 3 -A = 9 -P = d - -ModSqrt = 8 -A = d -P = 11 - -ModSqrt = 6 -A = df -P = 11 - -ModSqrt = 4 -A = 10 -P = 11 - -ModSqrt = 5 -A = 90 -P = 11 - -ModSqrt = 3 -A = 80 -P = 11 - -ModSqrt = 9 -A = -e -P = 13 - -ModSqrt = 7 -A = 7d -P = 13 - -ModSqrt = 6 -A = 37 -P = 13 - -ModSqrt = 1 -A = 1 -P = 13 - -ModSqrt = 8 -A = 1a -P = 13 - -ModSqrt = 54d4cf0fafe265056a29016778cea6b712bc66a132fb5e6b6865e9b49e4c97ec -A = 599c10484b22d0b5a115268c7538ca99b3253a311a4ab1ca11c3665b0bec393a1167d1ad94fb84cb2c7ad7e2c933e8f613bdd08fe1f1aa4a9b0b9de0c8a7c9d4 -P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 - -ModSqrt = 38a7365a15365e911286c1be2a7afe76ef390234d76269e04dee17313f6ea54d -A = 1c4aabb4d8369710131c664ecf2849e963c1bc31d66e0b939bacf99a870c71f24ed71bdddcf566f3908271fee43fc1ebb51eac7e3153efae641b49d2e796a12a -P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 - -ModSqrt = 35ab18a560dece04725667f640ca61d1d59f14d191f94c79f58531acd097d444 -A = 685168ae855d60eba220d803f5296459b30a289580668db9ed51bca51cc2d453a937e13819ae34f7a9a143ac96d17420c53919167e46279b562b550be1cd9abc -P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 - -ModSqrt = 288370029e87024175e5bec0eab0929179f42e16995e7f6194eefc61061e54f4 -A = 2a14ab77c045bdc48220ba9c463e1a4b4049cb01edb53be0937767eb2ec19b7d719855052281250a36a0b76d9a5d967d0756e1ded7a052f7056191ad66bcfc9 -P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 - -ModSqrt = 32255cf01dc943577ec2bcb221b98491d7a1130d046d6c68e95fedff643ce3a4 -A = e26f6dd46a513a1dd3fb14b71be1d4c9e9d79eda1cde10ea4d1eb8abfd4d5857572205e247184dd0cbefa37b5c0bf680ba2bd28c5741f725cfe2aae37419baf -P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 - -ModSqrt = 5172345e801ada63fbc4782e32583cc3b4fea88b9e6dfd542f3542f8538ade66 -A = 40dafa8342b302bb04b1f3ddb3b9015a8fc1b597857c115b40631c7be9e22de89358fca23b331596ee5ff304dad7811e6d8e8822f7aa533c9e7c882634ea550 -P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 - -ModSqrt = 4dcf63c423bf0e39aca2293d57f6792d023db649d6719fe936446904b9f7e60d -A = 5bcdb514bbe84261e169203e8017909b60c9bb330400c766ee01b0189378e70e61867a164a12643ddc9e94b61e09e5b158cbe85be228a3cc48f95a552958b8f2 -P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 - -ModSqrt = cf77c5c2d12a500b75cbfb1f3e66ee75d886b9365cf4f8b4d1bd18a6be0f387 -A = 4652ddc2ea7b460d8ec3c9059b8f9b5dae6cac55b51f2ad86fcb336b25235737965cc515e2ff0b54835015b7ebeeda6fadd986471d8cb424d309fc353d1e269 -P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 - -ModSqrt = 1e0549e4c5a26023e9d24fd8c67419960746f82b1ecd113bdac66f570a475d87 -A = 5f4a6d450ab1390d96ab1deaa0ba18f897cb63daf0c9e1ef6c08e804c26b5e842f6c08f13db5d4a6e88f07af2a3cb04fa06fc3e59c410b9356f025ed81acc74 -P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 - -ModSqrt = 144481a781d831c1ca046ca9e322d79ad4d2c6dd9f780bea9d1ced9cd20b7b23 -A = 4c254fabca441017132b9eacd4ca40a336db3e5c09715773fa07af095989a91cc968ff07a9ff56ed06b0ce0c5269f7b2ab68564ecab9f4467a7e96b6cc6b21b7 -P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 - -ModSqrt = 216fecc7667f488a3d2d102a38b46b4860ab858300b8638af4f34e1103fd73ba -A = 17878f8048227573a9d70f53c0e76ff13fe9f56e9c984c92514d3d13dec23c816661f0618d21371b80dfd885cb59551bdf80046f65f22ea9b89c78645a6e455a -P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 - -ModSqrt = 458e5e789ccd2417174f7e30bb31914b9656bd8cf2b9f5a9752a8737a67707bc -A = 5c7d39a4bb04e69201aa519f80ee7e62ea14ca55e13656d1da3f45367e2fb2d061aa2940708d02ac67d35cd2ccf54a1bf95bcbc759779e692cfdcbb3aa1a05b -P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 - -ModSqrt = 543125a16c2bb8b8f8a2c39c497e5224ec77533602d7dbe24002e32dcbd2ef1a -A = 3413afae333b2ad9ff45c7f3c7e5934b3127e8b1a55225958ee6ccf42423e81559bf070ad3f3353b78c0ffd41475af49f59d268ef78bdae879f5155e8d1cc07 -P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 - -ModSqrt = 10e16859c67bdb2eaab52a7c847dbf37162eda258a9f6262ebacfe4cbbbc1080 -A = 21ce7905894faf220bdf4a82a2d855994ca2dc9feaecaa53c7f146e1f49934215695e9bb46ba370b7005a90c399674caa8969eb442e7914d90f749774d7fd194 -P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 - -ModSqrt = 32a00586adc6f6cc2b1a04e1be0ab569fde235e1436c38b6af92bc5ebd60bc1c -A = 350da4fd8cf03c12f7dd6ac6d3ab801a3413964083e374662aaf878d6838b97d4feb9e52cd307a25b113e101661a865463ee2480c626aa4e2ec437d72e7bae4c -P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 - -ModSqrt = 971f75bc7afa8b4b50f1d4b05e52deac7d4836a08d30546f29649bf1ca6a247 -A = 655ed4c5d8d0afb4f9360372ee1ef1303898d2423e585108a3303faedb55064d2ef25666ed4c4d71fe6063fea1f3142b435714b0e30b339dd791d347c884654 -P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 - -ModSqrt = 48fa882b7cb6a29de9e3769f72eb67f1efd4d2af56f0c7e410c610efcbce2065 -A = 14f3503f33b243800eac1defaab33e04c01e80163fb3efd03860970cc016832431ca4fc6d1b760f4f40166b0b8b3c40dbebc81460cc10890172243770338f090 -P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 - -ModSqrt = 236fd7e397ea7f8bc2a288eb7236ca41936fa702b7dccca56c8852e147511f7d -A = 1bbd0980feac854782813bcde4da85e8a054549a1b515e065da4236528035e756882e29e762cf60453e375cca9dc6ff637f9558bf86646e3b928f68f82af7efe -P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 - -ModSqrt = 693f0cbe8c81b0afde0cd2f83e53795dcae6b0cc4ba930ab5c752400d787f14 -A = 7b20f9664b23907e152ab8c9a907f72e8670c1c38ab4cd1411ea7c2159c09aa131afe068929b8e6ad1409b74c04975180d1cd0a9fa74e923c3fd451e8da2c34 -P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 - -ModSqrt = 4a086c50b0bad576501ddb6280743b2c9d247841eb7f14d90561432ff7dca6f0 -A = 4367431ec0cd0d7626538b93a090c30fe0c97c18ca03b97ddae304b619112b5b4d02bf0f041fa3fd673f9ef2ceb07eb2079d11c56dd903b1a87e8252a97b8079 -P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 - -ModSqrt = 18f8433fa468d8065157708f1f1e53b8e31d39c6011fbc2bad93de1b5548e19c -A = 739c032bb4139c199c40f548d37234298772e4ccb9d3ba28412b60ad23b4c465b0787e2382f1c5a4a87af2d20eb978b7dcbe73f2112249477d15c8a85e54a79 -P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 - -ModSqrt = 49e3c8eef5e067cabd51a7c01384ce05ab8f4342f655559d8a689eb7b20e0106 -A = 18400c2cc3e06b99b4e39c77b9af5ff0e9c683f1708321afa4cd5b6988d13b36b1d9eb4379b7902d9ceb40c03f814b2b6a01b90509bbb4532f13ab1571c4d04a -P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 - -ModSqrt = 35548c530745f440329325cc8a5fbd90c16a7f0788879a4869bc4d4f73acda0e -A = 181a3c5ab02566e7166c4d6d2f2bd4a8ecc25991a98d270bde80cf4332766a7068b14240bf5f5dcd45e90ef252596da3eb05b11d68b2063f7b3a825742593ca9 -P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 - -ModSqrt = 1ab7046e6af061ade5f9719008fa4d989007e2a579a134a5b9f19ec410984096 -A = 1008a03e211fab0d45856377079bc96b0776c2d4c0175661f3493246cea2ab0a02a706c85314fb707ad9906bedb2cfd577d62092ae08ff21d7b949373ea954c7 -P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 - -ModSqrt = 2be9e3e7515960d90f115b89f60dedc173a73ce163b4036e85b7b6a76fd90852 -A = 392053a9f0100540a8e1a0c353e922068a84dad3a4a8e8962fbc0bee2b6a06e20d08ade16eb1409a16acfcac3db5c43c421505e07035ca308b15c4a6db0864c0 -P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 - -ModSqrt = 5b301bb93bdcf050183107e36258b53b4805918114ea1c2227b0911d5b4dc077 -A = 55e55e5f94dc3d7aabc921f6469d85fa2e1e92a87347c57afad5872306ae69f9fb99297d1e3e793dd9e8632244208154de5da7114fd876383bf1422f7ece024 -P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb - -ModSqrt = 2df9609e2f5a5156c3260461b2ee52eacdef00bd8b091479813143a6c5283f71 -A = 2099325b7f12fe77353ddf3f2b2c5ef77b49671b150af954cf84e9675e3ecde3e057084641a633d19533b4712ab49924c8b5c31d591abcc88291f51253fa2a7 -P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb - -ModSqrt = dfab751710e9008e25e422d1199d6fbec4dc7fba35b4da9d225a746eb4126a0 -A = c006af53d4737fb293584df6ffe2e4cb3fd8dc77fb7c1f13b97bb9c249e3ee5fb9feff7488265b3093906c08a4946f142ac7b491937d24bfba6413366ce371d -P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb - -ModSqrt = 26bc030008d6c60a09fb0e16093a649fcb40c6c21a8e2da2353ba4b07c4f85d5 -A = 1eaabcfad2ed349ac9356e6f4da0b301266ddde811cb0f817aba8f5c10fb8b8ba9d0ef2dd386b668f16eac296118fdb8cb7afe1b865648c81c2fa3cf21f2711b -P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb - -ModSqrt = 35051b1482ec2578f3dc0000a422cb5111e43c37f1ac20b1844d3de2128c4556 -A = 315ff9de178681116f2a5fa78eebf4818e1d680435eacdfaf9d0e5c4fc01fc034b352c82fd52c81ca30d68864952dacc99d08269c9dd7ca99ccf22da98c3840 -P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb - -ModSqrt = a5474252885cacf004c460a7793ff0b0a2187bb1a9ed700ae3470199faef71f -A = 19856fc1351c4b02abf573bb2fc6ff92355fa369d62bb8f2260fa772fb1693f509a56cad661930abcac049dd70f4b16bed4a4c172e73e772504c9990ce7f92f -P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d - -ModSqrt = 12daf4722387ecf47de1b0b6b110a062dc5ea2685bc9dbde66b8d15622985029 -A = fb8479787069116abc42abfd7dc0c24d2ad04fe0c04b42a6dff714af715d17e0fd77855f950f264542b06d48e8818de813ddb7975798b7debefcdaa5ff86beb -P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d - -ModSqrt = 397996ed5c0ac6ad32e43c337e9de421b87774cc162bf7ac7bbedf4a9029255e -A = 5aa04353321bd2de92481be740357f979da464b53aa39111fdbb734cf7af6b3857d1baa08d3a126a3dd34a2fbae2bf2b84e900686c1d31505b390185acef5fe5 -P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d - -ModSqrt = 2cf4b844a54ba359dc592ef1b49f43fcfeae84d1087edfefdd0b9174b43c0a3c -A = 365a8650510bcfd8fa87432f167cf487234c215857403b9270b5eebeafa48cd6da47fd60dc311b94d1d72baad0447c31f0b212d755f46c256e16e5e015e6546e -P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d - -ModSqrt = 9277c73043ff767c3fa606f0cd66b9d854a600c8c18287f191ce277758c3f31 -A = 62cec3901626d03e8df66299a87c54b1f7a55cafc99f0b6bba1b5d51a3d2b7d2171c9135a9d8a5346d436e0136b12e515e703e3cd84ecfe154eb94c6772a6d72 -P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d - -ModSqrt = 4189e5a90c1b1abdc1c7c05b3587e6f362e06f927b6cf5f0d271aab3d6f90765 -A = 336b8d0f9dac842c696bc020f49c6aa023842c16f2052eb02f17959006554ca0012042c80c72590f21c6bf5a3714c9cb552aa69730e33db93a56a909b273f39 -P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f - -ModSqrt = 36ccd38cb5a6bd8a73bca55936a2227c503664422c2296faf7e2b1c6a375a43a -A = fecfd60a376befbe48d2c4f6d070d716d2f403cd5daefbce62b720df44deb605162c8f20f49fd7ec30d4f8e70d803d45b3a44b5d912baa3410d991165d7c507 -P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f - -ModSqrt = 198fc8569be172dc9b71023ed3d42d2ba94bae4099643f6517ab03f540527fdb -A = 65bebdb00a96fc814ec44b81f98b59fba3c30203928fa5214c51e0a97091645280c947b005847f239758482b9bfc45b066fde340d1fe32fc9c1bf02e1b2d0ec -P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f - -ModSqrt = 21b7f74c30ded681d6138cf8e6fd798f32a049e94138e982f1845df3dc9e686f -A = 9a30b791c1ba4f394b4e3dcd5837e474237f4fe8987b255c098a47b2c14c598ec69d2beae444dd4fe9c4ede8173d2b187677cc706a3c28f3b81627d8a5fb6fd -P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f - -ModSqrt = a1d52989f12f204d3d2167d9b1e6c8a6174c0c786a979a5952383b7b8bd186 -A = 2eee37cf06228a387788188e650bc6d8a2ff402931443f69156a29155eca07dcb45f3aac238d92943c0c25c896098716baa433f25bd696a142f5a69d5d937e81 -P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f - - -# NotModSquare tests. -# -# These test vectors are such that NotModSquare is not a square modulo P. - -NotModSquare = 03 -P = 07 - -NotModSquare = 05 -P = 07 - -NotModSquare = 06 -P = 07 - -NotModSquare = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951e -P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f - - -# ModInv tests. -# -# These test vectors satisfy ModInv * A = 1 (mod M) and 0 <= ModInv < M. - -ModInv = 00 -A = 00 -M = 01 - -ModInv = 00 -A = 01 -M = 01 - -ModInv = 00 -A = 02 -M = 01 - -ModInv = 00 -A = 03 -M = 01 - -ModInv = 64 -A = 54 -M = e3 - -ModInv = 13 -A = 2b -M = 30 - -ModInv = 2f -A = 30 -M = 37 - -ModInv = 4 -A = 13 -M = 4b - -ModInv = 1c47 -A = cd4 -M = 6a21 - -ModInv = 2b97 -A = 8e7 -M = 49c0 - -ModInv = 29b9 -A = fcb -M = 3092 - -ModInv = a83 -A = 14bf -M = 41ae - -ModInv = 18f15fe1 -A = 11b5d53e -M = 322e92a1 - -ModInv = 32f9453b -A = 8af6df6 -M = 33d45eb7 - -ModInv = d696369 -A = c5f89dd5 -M = fc09c17c - -ModInv = 622839d8 -A = 60c2526 -M = 74200493 - -ModInv = fb5a8aee7bbc4ef -A = 24ebd835a70be4e2 -M = 9c7256574e0c5e93 - -ModInv = 846bc225402419c -A = 23026003ab1fbdb -M = 1683cbe32779c59b - -ModInv = 5ff84f63a78982f9 -A = 4a2420dc733e1a0f -M = a73c6bfabefa09e6 - -ModInv = 133e74d28ef42b43 -A = 2e9511ae29cdd41 -M = 15234df99f19fcda - -ModInv = 46ae1fabe9521e4b99b198fc8439609023aa69be2247c0d1e27c2a0ea332f9c5 -A = 6331fec5f01014046788c919ed50dc86ac7a80c085f1b6f645dd179c0f0dc9cd -M = 8ef409de82318259a8655a39293b1e762fa2cc7e0aeb4c59713a1e1fff6af640 - -ModInv = 444ccea3a7b21677dd294d34de53cc8a5b51e69b37782310a00fc6bcc975709b -A = 679280bd880994c08322143a4ea8a0825d0466fda1bb6b3eb86fc8e90747512b -M = e4fecab84b365c63a0dab4244ce3f921a9c87ec64d69a2031939f55782e99a2e - -ModInv = 1ac7d7a03ceec5f690f567c9d61bf3469c078285bcc5cf00ac944596e887ca17 -A = 1593ef32d9c784f5091bdff952f5c5f592a3aed6ba8ea865efa6d7df87be1805 -M = 1e276882f90c95e0c1976eb079f97af075445b1361c02018d6bd7191162e67b2 - -ModInv = 639108b90dfe946f498be21303058413bbb0e59d0bd6a6115788705abd0666d6 -A = 9258d6238e4923d120b2d1033573ffcac691526ad0842a3b174dccdbb79887bd -M = ce62909c39371d463aaba3d4b72ea6da49cb9b529e39e1972ef3ccd9a66fe08f - -ModInv = aebde7654cb17833a106231c4b9e2f519140e85faee1bfb4192830f03f385e773c0f4767e93e874ffdc3b7a6b7e6a710e5619901c739ee8760a26128e8c91ef8cf761d0e505d8b28ae078d17e6071c372893bb7b72538e518ebc57efa70b7615e406756c49729b7c6e74f84aed7a316b6fa748ff4b9f143129d29dad1bff98bb -A = a29dacaf5487d354280fdd2745b9ace4cd50f2bde41d0ee529bf26a1913244f708085452ff32feab19a7418897990da46a0633f7c8375d583367319091bbbe069b0052c5e48a7daac9fb650db5af768cd2508ec3e2cda7456d4b9ce1c39459627a8b77e038b826cd7e326d0685b0cd0cb50f026f18300dae9f5fd42aa150ee8b -M = d686f9b86697313251685e995c09b9f1e337ddfaa050bd2df15bf4ca1dc46c5565021314765299c434ea1a6ec42bf92a29a7d1ffff599f4e50b79a82243fb24813060580c770d4c1140aeb2ab2685007e948b6f1f62e8001a0545619477d498132c907774479f6d95899e6251e7136f79ab6d3b7c82e4aca421e7d22fe7db19c - -ModInv = 1ec872f4f20439e203597ca4de9d1296743f95781b2fe85d5def808558bbadef02a46b8955f47c83e1625f8bb40228eab09cad2a35c9ad62ab77a30e3932872959c5898674162da244a0ec1f68c0ed89f4b0f3572bfdc658ad15bf1b1c6e1176b0784c9935bd3ff1f49bb43753eacee1d8ca1c0b652d39ec727da83984fe3a0f -A = 2e527b0a1dc32460b2dd94ec446c692989f7b3c7451a5cbeebf69fc0ea9c4871fbe78682d5dc5b66689f7ed889b52161cd9830b589a93d21ab26dbede6c33959f5a0f0d107169e2daaac78bac8cf2d41a1eb1369cb6dc9e865e73bb2e51b886f4e896082db199175e3dde0c4ed826468f238a77bd894245d0918efc9ca84f945 -M = b13133a9ebe0645f987d170c077eea2aa44e85c9ab10386d02867419a590cb182d9826a882306c212dbe75225adde23f80f5b37ca75ed09df20fc277cc7fbbfac8d9ef37a50f6b68ea158f5447283618e64e1426406d26ea85232afb22bf546c75018c1c55cb84c374d58d9d44c0a13ba88ac2e387765cb4c3269e3a983250fa - -ModInv = 30ffa1876313a69de1e4e6ee132ea1d3a3da32f3b56f5cfb11402b0ad517dce605cf8e91d69fa375dd887fa8507bd8a28b2d5ce745799126e86f416047709f93f07fbd88918a047f13100ea71b1d48f6fc6d12e5c917646df3041b302187af641eaedf4908abc36f12c204e1526a7d80e96e302fb0779c28d7da607243732f26 -A = 31157208bde6b85ebecaa63735947b3b36fa351b5c47e9e1c40c947339b78bf96066e5dbe21bb42629e6fcdb81f5f88db590bfdd5f4c0a6a0c3fc6377e5c1fd8235e46e291c688b6d6ecfb36604891c2a7c9cbcc58c26e44b43beecb9c5044b58bb58e35de3cf1128f3c116534fe4e421a33f83603c3df1ae36ec88092f67f2a -M = 53408b23d6cb733e6c9bc3d1e2ea2286a5c83cc4e3e7470f8af3a1d9f28727f5b1f8ae348c1678f5d1105dc3edf2de64e65b9c99545c47e64b770b17c8b4ef5cf194b43a0538053e87a6b95ade1439cebf3d34c6aa72a11c1497f58f76011e16c5be087936d88aba7a740113120e939e27bd3ddcb6580c2841aa406566e33c35 - -ModInv = 87355002f305c81ba0dc97ca2234a2bc02528cefde38b94ac5bd95efc7bf4c140899107fff47f0df9e3c6aa70017ebc90610a750f112cd4f475b9c76b204a953444b4e7196ccf17e93fdaed160b7345ca9b397eddf9446e8ea8ee3676102ce70eaafbe9038a34639789e6f2f1e3f352638f2e8a8f5fc56aaea7ec705ee068dd5 -A = 42a25d0bc96f71750f5ac8a51a1605a41b506cca51c9a7ecf80cad713e56f70f1b4b6fa51cbb101f55fd74f318adefb3af04e0c8a7e281055d5a40dd40913c0e1211767c5be915972c73886106dc49325df6c2df49e9eea4536f0343a8e7d332c6159e4f5bdb20d89f90e67597c4a2a632c31b2ef2534080a9ac61f52303990d -M = d3d3f95d50570351528a76ab1e806bae1968bd420899bdb3d87c823fac439a4354c31f6c888c939784f18fe10a95e6d203b1901caa18937ba6f8be033af10c35fc869cf3d16bef479f280f53b3499e645d0387554623207ca4989e5de00bfeaa5e9ab56474fc60dd4967b100e0832eaaf2fcb2ef82a181567057b880b3afef62 - - -# GCD tests. -# -# These test vectors satisfy gcd(A, B) = GCD and lcm(A, B) = LCM. - -GCD = 0 -A = 0 -B = 0 -# Just to appease the syntax-checker. -LCM = 0 - -GCD = 1 -A = 92ff140ac8a659b31dd904161f9213706a08a817ae845e522c3af0c9096699e059b47c8c2f16434b1c5766ebb384b79190f2b2a62c2378f45e116890e7bb407a -B = 2f532c9e5902b0d68cd2ed69b2083bc226e8b04c549212c425a5287bb171c6a47fcb926c70cc0d34b8d6201c617aee66af865d31fdc8a2eeb986c19da8bb0897 -LCM = 1b2c97003e520b0bdd59d8c35a180b4aa36bce14211590435b990ad8f4c034ce3c77899581cb4ee1a022874203459b6d53859ab1d99ff755efa253fc0e5d8487bb000c13c566e8937f0fe90b95b68bc278610d4f232770b08d1f31bee55a03da47f2d0ebb9e7861c4f16cc22168b68593e9efcde00f54104b4c3e1a0b294d7f6 - -GCD = a -A = faaffa431343074f5c5d6f5788500d7bc68b86eb37edf166f699b4d75b76dae2cb7c8f6eccae8f18f6d510ef72f0b9633d5740c0bebb934d3be796bd9a53808e -B = 2f48ec5aa5511283c2935b15725d30f62244185573203b48c7eb135b2e6db5c115c9446ac78b020574665b06a75eb287e0dbeb5da7c193294699b4c2129d2ac4 -LCM = 4a15f305e9622aa19bd8f39e968bfc16d527a47f7a5219d7b02c242c77ef8b608a4a6141f643ca97cedf07c0f1f3e8879d2568b056718aa15c0756899a08ccbe0a658bae67face96fa110edb91757bfa4828e8ff7c5d71b204f36238b12dd26f17be8ba9771f7068d63e41d423671f898f054b1187605754bc5546f2b02c5ac - -GCD = 16 -A = cf0b21bde98b41b479ac8071086687a6707e9efaacd4e5299668ce1be8b13290f27fd32ae68df87c292e8583a09d73ec8e8a04a65a487380dcd7dacca3b6e692 -B = 3be3f563f81d5ad5c1211db7eff430aa345e830ce07b4bde7d4d32dba3ac618d2034351e5435fd6c7f077971fb4a1e83a7396a74fdff7fce1267112851db2582 -LCM = 233a2188de2c017235024b182286f17562b2ee5ab9fdfe4efa2f61c4ff99fa44e1ead5bf6cde05bd7502ce78373c83e3f9dbab0c9bb8620a87c2640bce5d12c685af656df789bb3d0ba1edbaa98cf4f0166d422ab17aa6706f8132264d45b72827d6671a00a9186e723379e3a3bb7902d08865f357c74100059f83800241976 - -GCD = 1 -A = dd7b7597d7c1eb399b1cea9b3042c14bd6022d31b1d2642a8f82fc32de6eadaf012fbbf349eaec4922a8468740ca73c6090833d6a69a380ed947b39c2f9b0b76 -B = 8e0dc8654e70eec55496038a8d3fff3c2086bc6dbfc0e2dbdf5bd7de03c5aef01a3982556ac3fc34fd5f13368be6cdc252c82367b7462e210f940f847d382dd9 -LCM = 7ae667df4bd4dd35bbec28719a9f1b5e1f396a9ab386c086742a6ab3014a3386d39f35b50624d0c5b4e6b206c2635c7de5ea69e2faa85dd616a7e36622962a07632839857aa49332942feccff2aee1c962e2f4e8ccfd738a5da5bf528b4c5a2440409350f5a17a39d234403e8482ccf838e0d2758ccfb8018198a51dbb407506 - -GCD = 1 -A = 0 -B = 1 -LCM = 0 - -GCD = 1 -A = 1 -B = 0 -LCM = 0 - -GCD = 1 -A = 1 -B = 1 -LCM = 1 - -GCD = 2b2 -A = dfccaa3549c1b59ab3e114fe87dc5d187719abad58c51724e972741eb895ab79a49f385f61d531ec5c88dbb505ae375093fa848165f71a5ed65e7832a42ade191a -B = fa58a81f43088da45e659fc1117d0f1cd015aa096c8e5377cf1832191baf7cc28b5c24998b93b64f8900a0973faedb9babaaf1854345f011739da8f1175d9684c -LCM = 5132f7ab7a982b9dc55114bd96800b7637f9742cf8a7a00a0d69d5e4574fc85792c89a1c52bcfc74b9d7f3f6164819466c46b2d622e280ced7ad1211604084a15dc1fd1951a05c8ce37122c0ec15891d818a70d3763670ea3195098de9b1ca50ea89893a9753fb9ea801541058f44801f7f50967124abfc864a2b01c41f94193c - -GCD = 8e -A = 248d96a8a4cab0a1b194e08c1146868b094597cadbc35531f0ed2d77cba9f15cb5cc7c10e64ce054bf93396d25259d750b3de3aba65073db1fd2b852a6454ac1a -B = 4c7bad8e1844901fd6a2ce2edc82e698d28ec95d6672ca148d85b49ecc78dd0a8b870e202244210bc98592b99ff6abbd20630f9eee7d46b15ccfae8d08b86799de -LCM = 13b01f9d9c6c13e90c97e3d95bbce5a835c631b3de3bd4ff5df13ad850f5223dbdf71c53912275d0397df9335ef3a3ba8e4684c6b25962bb7b18bc74144cb5edf0196f79863a7ff032619a71646a92281f7baace7f223d254cb4d05ec19bf8d4c8ce4455a9d770daec89c0d3cf338cbdae39cf982b3c4568f5c9def4e1133d28a - -GCD = 3e55 -A = 2fa97382f46676b7a4cc2b8153f17b58792d24660e187d33ce55c81cc193ccb6e1e2b89feea1d5fd8faa36e13bf947fb48635e450a4d1488d0978324194a1f43c6 -B = ab08ad074139963bc18e5d87ba68db64ca6f4c279616c64039b02c55f2375b3bc04114e8e05e1ba92fb6470768f61d123845aea36774c18612736a220934561faf -LCM = 82c7c377ecda2cb9228604cd287df5eff94edd4a539c3eb3b3fdd4b4a79d2f4eaf2b22f8286272d3dad2e370cfcd9ea4d93ebb3f049c52b8fa23b68a5bf79af989822e2cfb978f68c6a5058f47319dffcb455b089b06ae6db9e5c8a2b6e951d6e118bd2b4cd08b6e5733476a446a57387d940d1289ec00e24315821ed3a5daf2 - -GCD = a7a -A = 923706dfed67834a1e7e6c8e8e9f93bfbc0b43ca1f324886cf1f1380fb9b77109275d4b50af1b7689802fe9b3623ac46c7ba0e17e908c20278127b07a5c12d86ec -B = 64473e878a29021fac1c1ce34a63eae1f4f83ee6851333b67213278b9a4a16f005cba0e8cdb410035bb580062f0e486c1a3a01f4a4edf782495f1dc3ebfa837d86 -LCM = 57785ca45b8873032f1709331436995525eed815c55140582ce57fd852116835deac7ca9d95ce9f280e246ea4d4f1b7140ab7e0dd6dc869de87f1b27372098b155ad0a1828fd387dff514acc92eae708609285edaab900583a786caf95153f71e6e6092c8c5ee727346567e6f58d60a5e01c2fa8ebcf86da9ea46876ecc58e914 - -GCD = 42 -A = 0 -B = 42 -LCM = 0 - -GCD = 42 -A = 42 -B = 0 -LCM = 0 - -GCD = 42 -A = 42 -B = 42 -LCM = 42 - -GCD = f60d -A = ef7886c3391407529d5cf2e75ed53e5c3f74439ad2e2dc48a79bc1a5322789b4ced2914b97f8ff4b9910d212243b54001eb8b375365b9a87bd022dd3772c78a9fd63 -B = d1d3ec32fa3103911830d4ec9f629c5f75af7039e307e05bc2977d01446cd2cbeeb8a8435b2170cf4d9197d83948c7b8999d901fe47d3ce7e4d30dc1b2de8af0c6e4 -LCM = cc376ed2dc362c38a45a719b2ed48201dab3e5506e3f1314e57af229dc7f3a6a0dad3d21cfb148c23a0bbb0092d667051aa0b35cff5b5cc61a7c52dec4ed72f6783edf181b3bf0500b79f87bb95abc66e4055f259791e4e5eb897d82de0e128ecf8a091119475351d65b7f320272db190898a02d33f45f03e27c36cb1c45208037dc - -GCD = 9370 -A = 1ee02fb1c02100d1937f9749f628c65384ff822e638fdb0f42e27b10ee36e380564d6e861fcad0518f4da0f8636c1b9f5124c0bc2beb3ca891004a14cd7b118ddfe0 -B = 67432fd1482d19c4a1c2a4997eab5dbf9c5421977d1de60b739af94c41a5ad384cd339ebfaa43e5ad6441d5b9aaed5a9f7485025f4b4d5014e1e406d5bd838a44e50 -LCM = 159ff177bdb0ffbd09e2aa7d86de266c5de910c12a48cbe61f6fa446f63a2151194777555cd59903d24cb30965973571fb1f89c26f2b760526f73ded7ee8a34ebcecd1a3374a7559bcdb9ac6e78be17a62b830d6bb3982afdf10cf83d61fd0d588eab17d6abef8e6a7a5763fcb766d9a4d86adf5bb904f2dd6b528b9faec603987a0 - -GCD = c5f -A = 5a3a2088b5c759420ed0fb9c4c7685da3725b659c132a710ef01e79435e63d009d2931ea0a9ed9432f3d6b8851730c323efb9db686486614332c6e6ba54d597cf98 -B = 1b1eb33b006a98178bb35bbcf09c5bebd92d9ace79fa34c1567efa8d6cf6361547807cd3f8e7b8cd3ddb6209dccbae4b4c16c8c1ec19741a3a57f61571882b7aed7 -LCM = c5cbbbe9532d30d2a7dd7c1c8a6e69fd4fa4828a844d6afb44f3747fef584f7f1f3b835b006f8747d84f7699e88f6267b634e7aef78d6c7584829537d79514eec7d11219721f91015f5cefdc296261d85dba388729438991a8027de4827cd9eb575622e2912b28c9ce26d441e97880d18db025812cef5de01adeaec1322a9c9858 - -GCD = e052 -A = 67429f79b2ec3847cfc7e662880ab1d94acdf04284260fcfffd67c2862d59704ed45bcc53700c88a5eea023bc09029e9fd114fc94c227fd47a1faa1a5ef117b09bd2 -B = 39faa7cbdeb78f9028c1d50ab34fbe6924c83a1262596f6b85865d4e19cc258b3c3af1ee2898e39e5bee5839e92eac6753bbbb0253bd576d1839a59748b778846a86 -LCM = 1ab071fb733ef142e94def10b26d69982128561669e58b20b80d39cf7c2759d26b4a65d73b7f940c6e8fc417180ef62d7e52ac24678137bd927cd8d004ad52b02affe176a1ecde903dbc26dcc705678f76dd8cd874c0c3fe737474309767507bbe70dd7fb671bbb3694cedf0dcdaa0c716250ddd6dfec525261572fa3e1387f7b906 - -GCD = 3523 -A = 0 -B = 3523 -LCM = 0 - -GCD = 3523 -A = 3523 -B = 0 -LCM = 0 - -GCD = 3523 -A = 3523 -B = 3523 -LCM = 3523 - -GCD = f035a941 -A = 16cd5745464dfc426726359312398f3c4486ed8aaeea6386a67598b10f744f336c89cdafcb18e643d55c3a62f4ab2c658a0d19ea3967ea1af3aee22e11f12c6df6e886f7 -B = 74df09f309541d26b4b39e0c01152b8ad05ad2dfe9dd2b6706240e9d9f0c530bfb9e4b1cad3d4a94342aab309e66dd42d9df01b47a45173b507e41826f24eb1e8bcc4459 -LCM = b181771d0e9d6b36fdfcbf01d349c7de6b7e305e1485ea2aa32938aa919a3eee9811e1c3c649068a7572f5d251b424308da31400d81ac4078463f9f71d7efd2e681f92b13a6ab3ca5c9063032dcbdf3d3a9940ce65e54786463bbc06544e1280f25bc7579d264f6f1590cf09d1badbf542ce435a14ab04d25d88ddbac7d22e8cae1c91f - -GCD = 33ad1b8f -A = 1af010429a74e1b612c2fc4d7127436f2a5dafda99015ad15385783bd3af8d81798a57d85038bcf09a2a9e99df713b4d6fc1e3926910fbbf1f006133cb27dc5ebb9cca85 -B = 92a4f45a90965a4ef454f1cdd883d20f0f3be34d43588b5914677c39d577a052d1b25a522be1a656860a540970f99cbc8a3adf3e2139770f664b4b7b9379e13daf7d26c -LCM = 4c715520ed920718c3b2f62821bc75e3ff9fd184f76c60faf2906ef68d28cd540d3d6c071fa8704edd519709c3b09dfaee12cb02ab01ad0f3af4f5923d5705ce6d18bcab705a97e21896bb5dd8acb36ee8ec98c254a4ddc744297827a33c241f09016a5f109248c83dd41e4cea73ce3eabb28d76678b7e15545b96d22da83c111b6b624 - -GCD = dc0429aa -A = ccb423cfb78d7150201a97114b6644e8e0bbbb33cadb0ef5da5d3c521a244ec96e6d1538c64c10c85b2089bdd702d74c505adce9235aa4195068c9077217c0d431de7f96 -B = 710786f3d9022fc3acbf47ac901f62debcfda684a39234644bac630ab2d211111df71c0844b02c969fc5b4c5a15b785c96efd1e403514235dc9356f7faf75a0888de5e5a -LCM = 6929af911850c55450e2f2c4c9a72adf284fe271cf26e41c66e1a2ee19e30d928ae824f13d4e2a6d7bb12d10411573e04011725d3b6089c28d87738749107d990162b485805f5eedc8f788345bcbb5963641f73c303b2d92f80529902d3c2d7899623958499c8a9133aae49a616c96a2c5482a37947f23af18c3247203ac2d0e760340e6 - -GCD = 743166058 -A = 16cd476e8031d4624716238a3f85badd97f274cdfd9d53e0bd74de2a6c46d1827cc83057f3889588b6b7ca0640e7d743ed4a6eaf6f9b8df130011ecc72f56ef0af79680 -B = 86eba1fc8d761f22e0f596a03fcb6fe53ad15a03f5b4e37999f60b20966f78ba3280f02d3853f9ace40438ccfaf8faed7ace2f2bf089b2cdd4713f3f293bf602666c39f8 -LCM = 1a7a1b38727324d6ba0290f259b8e2b89c339b2445cada38a5a00ded1468ab069f40678ce76f7f78c7c6f97783cc8a49ef7e2a0c73abbac3abc66d1ce99566ce7f874a8949ca3442051e71967695dc65361184748c1908e1b587dc02ed899a524b34eb30b6f8db302432cfa1a8fbf2c46591e0ab3db7fd32c01b1f86c39832ee9f0c80 - -GCD = 6612ba2c -A = 0 -B = 6612ba2c -LCM = 0 - -GCD = 6612ba2c -A = 6612ba2c -B = 0 -LCM = 0 - -GCD = 6612ba2c -A = 6612ba2c -B = 6612ba2c -LCM = 6612ba2c - -GCD = 2272525aa08ccb20 -A = 11b9e23001e7446f6483fc9977140d91c3d82568dabb1f043a5620544fc3dda233b51009274cdb004fdff3f5c4267d34181d543d913553b6bdb11ce2a9392365fec8f9a3797e1200 -B = 11295529342bfb795f0611d03afb873c70bd16322b2cf9483f357f723b5b19f796a6206cf3ae3982daaeafcd9a68f0ce3355a7eba3fe4e743683709a2dd4b2ff46158bd99ff4d5a0 -LCM = 8d4cbf00d02f6adbaa70484bcd42ea932000843dcb667c69b75142426255f79b6c3b6bf22572597100c06c3277e40bf60c14c1f4a6822d86167812038cf1eefec2b0b19981ad99ad3125ff4a455a4a8344cbc609e1b3a173533db432bd717c72be25e05ed488d3970e7ed17a46353c5e0d91c8428d2fec7a93210759589df042cab028f545e3a00 - -GCD = 3480bf145713d56f9 -A = 8cf8ef1d4f216c6bcec673208fd93b7561b0eb8303af57113edc5c6ff4e1eeae9ddc3112b943d947653ba2179b7f63505465126d88ad0a0a15b682f5c89aa4a2a51c768cd9fdeaa9 -B = a6fd114023e7d79017c552a9051ca827f3ffa9f31e2ee9d78f8408967064fcdc9466e95cc8fac9a4fa88248987caf7cf57af58400d27abd60d9b79d2fe03fad76b879eceb504d7f -LCM = 1c05eee73a4f0db210a9007f94a5af88c1cdd2cba456061fd41de1e746d836fa4e0e972812842e0f44f10a61505f5d55760c48ba0d06af78bb6bde7da8b0080b29f82b1161e9c0b5458e05ac090b00f4d78b1cc10cf065124ba610e3acab092a36fe408525e21c0ddc7c9696ed4e48bd2f70423deecfe62cecc865c6088f265da0e5961d3f3a84f - -GCD = 917e74ae941fcaae -A = 652f8a92d96cbf0a309629011d0fbaceb1266bc2e8243d9e494eead4cf7100c661b537a8bea93dec88cfc68597d88a976c125c3b4de19aba38d4ea9578202e59848d42652518348a -B = 32e07b71979d57e8344e97c39680a61e07d692d824ae26b682156890792d8a766ee29a4968f461aaced5bf049044fba2f4120b1c1f05985676f975d4582e9e82750d73c532cd07b2 -LCM = 23620c7b897dc26c7717e32f3517ac70bf09fbe08f7255ab010cf4cf946f4e96304c425043452c5d5a0e841d3a3cfd9c2d84d9256f3b5974fe3ebfa9255fe20a710d3e6511606c0d85970381101c7f4986d65ad6a73a71507f146b11f903043cfa805cc0b14d4f3072da98bf22282f7762040406c02d5b3ef9e7587f63bab8b29c61d8e30911aa96 - -GCD = 2b9adc82005b2697 -A = 19764a84f46045ef1bca571d3cbf49b4545998e64d2e564cc343a53bc7a0bcfbe0baa5383f2b346e224eb9ce1137d9a4f79e8e19f946a493ff08c9b423574d56cbe053155177c37 -B = 1bbd489ad2ab825885cdac571a95ab4924e7446ce06c0f77cf29666a1e20ed5d9bc65e4102e11131d824acad1592075e13024e11f12f8210d86ab52aa60deb250b3930aabd960e5a -LCM = 1032a0c5fffc0425e6478185db0e5985c645dd929c7ebfeb5c1ee12ee3d7b842cfab8c9aa7ff3131ac41d4988fb928c0073103cea6bb2cc39808f1b0ad79a6d080eac5a0fc6e3853d43f903729549e03dba0a4405500e0096b9c8e00510c1852982baec441ed94efb80a78ed28ed526d055ad34751b831b8749b7c19728bf229357cc5e17eb8e1a - -GCD = 8d9d4f30773c4edf -A = 0 -B = 8d9d4f30773c4edf -LCM = 0 - -GCD = 8d9d4f30773c4edf -A = 8d9d4f30773c4edf -B = 0 -LCM = 0 - -GCD = 8d9d4f30773c4edf -A = 8d9d4f30773c4edf -B = 8d9d4f30773c4edf -LCM = 8d9d4f30773c4edf - -GCD = 6ebd8eafb9a957a6c3d3d5016be604f9624b0debf04d19cdabccf3612bbd59e00 -A = 34dc66a0ffd5b8b5e0ffc858dfc4655753e59247c4f82a4d2543b1f7bb7be0e24d2bbf27bb0b2b7e56ee22b29bbde7baf0d7bfb96331e27ba029de9ffdff7bdb7dc4da836d0e58a0829367ec84ea256833fd4fe1456ad4dd920557a345e12000 -B = 1f3406a20e20ebf96ccb765f898889a19b7636608fd7dc7c212607b641399543f71111d60e42989de01eaa6ff19a86ea8fbde1a3d368c0d86dc899e8e250fc764090f337958ca493119cbb4ad70cbfae7097d06d4f90ec62fbdd3f0a4496e600 -LCM = ee502c50e3667946e9089d0a9a0382e7fd0b75a17db23b56a0eec997a112c4dbd56d188808f76fe90451e5605550c9559ef14a95014c6eb97e9c1c659b98515c41470142843de60f72fb4c235faa55b0a97d943221003d44e2c28928f0b84bf071256254897ed31a7fd8d174fc962bc1311f67900ac3abcad83a28e259812f1ee229511ab1d82d41f5add34693ba7519babd52eb4ec9de31581f5f2e40a000 - -GCD = ef7399b217fc6a62b90461e58a44b22e5280d480b148ec4e3b4d106583f8e428 -A = 7025e2fe5f00aec73d90f5ad80d99ca873f71997d58e59937423a5e6ddeb5e1925ed2fd2c36a5a9fc560c9023d6332c5d8a4b333d3315ed419d60b2f98ccf28bbf5bf539284fd070d2690aeaac747a3d6384ee6450903a64c3017de33c969c98 -B = df0ac41dbabce1deeb0bceb1b65b1079850052ecf6534d0cff84a5a7fb5e63baee028d240f4419925154b96eaa69e8fbb1aae5102db7916234f290aa60c5d7e69406f02aeea9fe9384afbff7d878c9ac87cd31f7c35dff243b1441e09baff478 -LCM = 687669343f5208a6b2bb2e2efcac41ec467a438fde288cc5ef7157d130139ba65db9eb53e86a30c870bd769c0e0ab15a50f656cd9626621ae68d85eaff491b98da3ea5812062e4145af11ea5e1da457084911961ef2cd2ac45715f885ba94b4082aa76ffd1f32461f47c845b229d350bf36514c5ce3a7c782418746be342eca2721346ade73a59475f178c4f2448e1326110f5d26a0fef1a7a0c9288489e4dc8 - -GCD = 84b917557acf24dff70cb282a07fc52548b6fbbe96ca8c46d0397c8e44d30573 -A = 81dbb771713342b33912b03f08649fb2506874b96125a1ac712bc94bfd09b679db7327a824f0a5837046f58af3a8365c89e06ff4d48784f60086a99816e0065a5f6f0f49066b0ff4c972a6b837b63373ca4bb04dcc21e5effb6dfe38271cb0fa -B = 1da91553c0a2217442f1c502a437bb14d8c385aa595db47b23a97b53927b4493dd19f1bc8baf145bc10052394243089a7b88d19b6f106e64a5ab34acad94538ab504d1c8ebf22ac42048bbd1d4b0294a2e12c09fe2a3bd92756ba7578cb34b39 -LCM = 1d0530f8142754d1ee0249b0c3968d0ae7570e37dadbe4824ab966d655abf04cd6de5eb700eba89d8352dec3ae51f2a10267c32fbd39b788c7c5047fe69da3d7ad505435a6212f44899ba7e983bb780f62bcdee6f94b7dba8af7070a4cc008f351ae8be4579bc4a2e5c659ce000ad9c8cdc83723b32c96aeb0f5f4127f6347353d05525f559a8543cd389ad0af6f9d08a75b8c0b32419c097e6efe8746aee92e - -GCD = 66091477ea3b37f115038095814605896e845b20259a772f09405a8818f644aa -A = cedac27069a68edfd49bd5a859173c8e318ba8be65673d9d2ba13c717568754ed9cbc10bb6c32da3b7238cff8c1352d6325668fd21b4e82620c2e75ee0c4b1aff6fb1e9b948bbdb1af83cecdf356299b50543b72f801b6a58444b176e4369e0 -B = 5f64ca1ba481f42c4c9cf1ffa0e515b52aa9d69ceb97c4a2897f2e9fa87f72bae56ee6c5227f354304994c6a5cc742d9f09b2c058521975f69ca5835bce898cf22b28457cd7e28870df14e663bb46c9be8f6662f4ff34d5c4ae17a888eba504e -LCM = c163cb28642e19a40aa77887c63180c2c49fc10cda98f6f929c8131752ea30b5283a814a81681b69b9d1762e6c1a9db85f480bc17f998d235fd7e64c1caa70ef170c9e816d3e80f516b29f2c80cfb68bf208b4d5082ef078da4314b3f20c7d6c54b0aeb378096b029a7b61c0a4cd14aeddc01004c53915a4f692d2291752e5af46b23d7fa6dd61f2d56c6f4bf8e6119688abac8fd7aba80e846a7764bb3fca0 - -GCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 -A = 0 -B = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 -LCM = 0 - -GCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 -A = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 -B = 0 -LCM = 0 - -GCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 -A = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 -B = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 -LCM = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 - -GCD = 120451d8307219aa0c96f328ad653ccd462e92423ca93ed8a3dde45bf5cb9b13cdaf9800e4d05dd71c4db6a129fb3280ee4ec96ec5297d881c1a8b5efccbd91fef21f5c5bf5fba42a4c8eaa358f620a074b7a17054527bdaa58d5acaa0dfdc48ecba1a10ebf4d57bb4215de406e6be13fed3fe493b1cd1e2d11a8d4ac03c47756 -A = 3f8179a8e1f0b342475a855c3e1bae402dd41424cf24a0b4d2e263c8efb08bde7d92eae8607fb5e88b1378f0f1bd0733f229a35be6b1383a48d32749d5d6b32427d26323b7ab05bb5781289e96bfbc21971439319b15f6c0fe93fdb35d0b67ec41443c59a081dd3cef047ac797fccb45bece84c0bb0bb7e1797259526d8ec9cc63ba4d32cfc692ccd3d243cb2b53ac216312f3a8e8c0daa09d21b6150d697639a5e52059414a417c607be8ec0eee2e708219cadbaf37a369c4485b01ed87bbc2 -B = 2c474e396a2dd9cd10b9d7313f69d3b4ca123e9fd853edd488339236d14c56453a1381958864a04d2624e81995dabcdd0ccf60db9917813f887de68da075d0ea4440001e18f470e43b38ee3440b49be651d709fbdef980e3e4149913f4ae2681124f54523f4881376ddb533b5219e804cc26f4c2e577be4e02613c4da80ba1215775b0a5178a965ad47bd2befb32493943ded1004ef66347b4983f8d1ba990d4a943505dfce6debcfb322842ed88106cd6dee9aa592ff0d2274bc727a6e1f14c -LCM = 9c129cf649555bfd2d3d9c64dc6d6f022295e53bca5d2f218adaa66aa60eb4694429b7e83bf81b6df4459c5104023ab9a33f006ffcd8114507baa17e2ef6fe23ebdd4740f66879033da2041f2cb7ba517ad3526ffe75614ea9432c085f71b2d65a736bac7ba42b639e330b82733372083843dcb78b6a273ab20e0d4b7c8998a14048aa15bb20a0a0bd997917107274c89b4cec175fb98043d52e6c555bd9e0036566d052a6d4e7e276d1e8835e1f06e3ca46d47747ba586e95fb1a790d992834b7c3e136141eb8a434e6c12067246ac3c0a81c69e03b1ed28aa0b3173d6eff83d278c2f461a47a416f3f9a5dae3bb410fd18817bd4115e7f1e84b936cc02364 - -GCD = 95aa569a2c76854300d7660847dd20fe0b8c445fdbcaa98465cee61aee76ad6a438e75a8c573198570ffb62bc07ec3a2be0ae0a1f631670fa88d6f75f3161e8b9a4d44b6801ffc884c7f469c5ed1f27b1edecce9f2977f9e92d1a3b230492fea7e6f2af739dc158a7fbd29856cbedb57b4119e64b27ab09eb1c2df01507d6e7fd -A = 4c653b5bfec44e9be100c064dffe5d8cd59b0cf4cc56b03eabb4ef87cfda6506c9a756b811907fe9d8b783eb7a0b9e129773bf1da365ddb488d27b16fb983e89345d1ccdb4f06a67a11925c3f266373be5d7b0075189c6f3c2157e2da197058fe0a7bcc50adc34e99e254a29abbe2d5948d3157e1b0c3fca3d641760f7b9862843b63abef0b3d83fd486f4526b30382fda355575da30e9a106718a3921774c4d69f5311f8d737fe618f5236b4763fe1b2ee7f13184db67367d3903c535ff6d7b -B = 2dcca83c99a28e9fd2f84e78973699baf2f04fd454094730948b22477834a0064817b86e0835e6d7b26e5b0b1dcf4ad91a07ac0780d6522df1fcac758cf5db6c2a5623d7c0f1afefd5718f7b6de639867d07a9ec525991304e9355d1635104bea837f74758d6aa2aab4e4afbb606af1d98de7417505e4710cd0589bdff9a0bf38a857cc59a5f1781043e694fc2337fd84bdeb28b13a222bb09328a81ec409ad586e74236393d27398cc24d412135e34247c589149e134b97f4bd538ac9a3424b -LCM = 1760c0b0066aa0695767099e87e9388729ea89b8e8c36bddcd04d257591e741613c07b0e69447c0a468c33a745084171e06523d987d8db40a1433bf435325e8a724a0876503b34495170ff3671d42117a2e4f3a75b1d9dd809a34fa0fb26fe50d84f80a9b02e40190e5efb927a5a61a03f13edbce2e666af6c3a2a9bcb84e47e3090008753ff27c4b8cf06480f471379a93f5230923623a83b286b71a555cd5e5347282f664ed90b14b2c4de84a70375e488211a7b3931119ef3bbe029b712389fe784818a0bf29d80733ce9cc940c547aa1eb3f06d492eb676bf37802283c82ce76156dfaab5c2d5107e08062681b5fa169f6eb68e1ab8bd9b2005e90bd4fd - -GCD = 244b9b1290cf5b4ba2f810574c050651489f2d3a2b03e702b76ebfaf4e33de9bbe5da24c919e68d3a72eadd35982b3a89c6b18b38ff7082ac65263e52b6ec75a5717b971c98257b194c828bff0216a99536603b41a396ea2fb50f5ea7cf3edf10bb0d039123e78593ae9ffcbbba02e51e038533e83b6bc73c70551d6467f39809 -A = 41a0b1310669500681cdf888836f6c556758750f562d743ac780dd4c0d161856380e44fdbb1f8a2786bf45be6b0e7f1cb2cd85f6b9e50acc72793d92383c7d7fb796fc74d32e8fac8225bdc19ae47546d9c9c75f5f06ca684f07daccaf89ccf2cddeb7ec255d530c7dd1e71daf44cafdc9d30fbcb1cbaefae3480585f79f4177e3834a5bc91845e2e8cd8aeb27f484e5e5b2c3c076dbb6c23e91303f0a0fdde83cd33a8ea6ed1549e727b4d766c1017c169710fd98e1585d60f66e121f9180b3 -B = 251f5aeaa60b3959285f49540cdaf8e21451110bbddb9933bbbcaea3112f4eb45e435a3ba37c52d2ab79ce997a8f6c829b3aa561f2852924b8effb52396d09d2bf257ebb4fb56c7aa25648f69b06d2cd01e876c9f9c0679de9e6fffa79eb7e603723e5af7de46ee405a5a079229577b5b6fffb8d43e391fe6f4eb89638e64d6eff8026249aaa355a91625eb0bfd14caa81e4c3586aaa2e94fde143a44f223a91e226661d12f55dfcdb4215e5a64e14e968005733be6a71c465de312ca109b34a -LCM = 431f918b274f3e43f446e4e85567883d6536a0332db662cef088f5a36b0f4b68372048174ba10fee94b9f8f1c2e189c974be2e6e8ae8e2ae108445326d40f63e38d8d4e2e46174589a3cbc9583e0036dc8146e79eee9e96f4436313b3f143dd0f5aceab05243def7f915169c360f55ef123977cf623c5ba432c3259c62fb5e37d5adab0f24b825aa4ada99ec4e83e9ca4698399e1ed633091ce5f9844c540a642cd264201116ed4168aa2105a5159f5df064f845830c469140f766c7319052ce59bd1ad7c3f2d8c30e54f147f6aeb5586c70c984302ba18d854a60aec01b394c7d66fa33fe18fe4a8cfb3238df219294e6e42190a30d28b10049a1b75853a4e - -GCD = 206695d52bc391a4db61bf8cb6ea96188333a9c78f477ee76976c2346dad682cf56ca6f176d86ef67d41ff5921b6162b0eca52359975872430dd14c45643eacdf028d830770714c033fd150669705851b2f02de932322d271d565d26768530c3f6cb84f0b3356f970b9070b26c050ead0417152c324c8ffe266d4e8b5b7bef3a -A = 1114eb9f1a9d5947eb1399e57f5c980833489685023ed2fe537fe1276c1e026b9a19e6fff55aa889d6c4e977b6e6f3111e2ad463138637b50f42cf32e57d83f282de9e72f813e5969195159a666d74dcd689bd527c60199ae327f7bd548ac36868fea5fdf6f35d19b921e7c10b6448ca480de6826478cd0642d72f05af3f8e65ce42409fbd49f56e81946e89c8e83962c4edc0ed54600600a305e52d081aed3c351e450e11f8fb0ce5754c92cf765b71393b2b7a89c95df79b9ea1b3cb600862 -B = 1d8f3179ca7b5cc7119360c10de939ffa57c9043da2f2b0ca3009c9bdad9f19ed16e3c2c197bef4b527fa1bf2bbab98b77e26c329911db68bd63d3d0fbfc727a977395b9ad067106de3094d68e097830858c5ccfa505fc25e972bdee6f347e7d1163efacd3d29a791ec2a94ffeed467884ae04896efc5e7e5f43d8d76c147e3c9951a1999173bc4e5767d51268b92cc68487ba1295372143b538711e0a62bf0ac111cc750ca4dd6c318c9cbe106d7fc492261404b86a1ba728e2d25b1976dc42 -LCM = f9570211f694141bfb096560551080cbe02a80271b4505591aaea9e3b99ea1d5ac1c1f2378fd72799e117ac2a73381b1ad26314e39972164d93971479ee3ba21a4d98cef0bd299d540ce5826995dcee0de420dff73d30b23cbf3188c625c7696df517535bc5675d71faa00807efbebdca547933f4a37849d1c014484a77da6df0670c4974bcc91eb5f5fe5faf9dd095ef195ec32ad9eeebf0e63288b4032ed9e70b888afc642f4ff96f0b4c0a68787301c12e4527fe79bdfe72dd3844ab5e094a9295df6616f24d1b9eeebc2116177dacf91969dda73667bc421ef3ccd8d5c23dddc283f5d36568d31f2654926be67f78e181075bdc148f2b39c630b141ae8a - -GCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 -A = 0 -B = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 -LCM = 0 - -GCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 -A = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 -B = 0 -LCM = 0 - -GCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 -A = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 -B = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 -LCM = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 - -GCD = 2 -A = 14e95a85e59ade9ef39e2f400c65db18702fa5fc485b9bba479a5282b2206129160e54f73ef4917983c17b4c5ebff7be112a886de069706eee29ba902515cb038 -B = ddcfff1d39c90c599f55495bf71c1e7597c6b08b7430707f360c6a6e5137bbc7b403c6d9e2c34f3d2f29d5d32b869346853c2de239cc35381bdfb4a01569211a -LCM = 90f38564ee72e55d362c04599e7d74f068c75f541b84e97abba2841f1a9f66b06b5c9009f6a4c2e319fced85270588de03ccebddbd9279aaecb13bdc1dbea7f42acaee751cb7da83779b8785cc86f41b94b13b54964208ca287d981634778d1096f20e76ca636c0717fd27e0800c43f599a5eded807421b502eaf9990a8c8ed8 - -GCD = 4 -A = 3c719c1c363cdeb7b57c2aabb71f425da4c3e6d3e447204d555e7cf0f3d372bdda906f36078045044978dafc20171767c8b1464d52dfdf3e2ba8a4906da033a8 -B = 30fe0ef151ac51404e128c064d836b191921769dc02d9b09889ed40eb68d15bfdd2edea33580a1a4d7dcee918fefd5c776cbe80ca6131aa080d3989b5e77e1b24 -LCM = 2e4526157bbd765b0486d90bcd4728f890bc6dbd9a855c67ca5cb2d6b48f8e74e1d99485999e04b193afca58dbf282610185d6c0272007744ff26e00dbdc813929b47940b137dc56ba974da07d54a1c50ec4a5c2b26e83f47cf17f4ccce8c3687e8d1e91d7c491a599f3d057c73473723ce9eee52c20fe8ae1595447552a7ee8 - -GCD = 10 -A = 44e04071d09119ea9783a53df35de4a989200133bb20280fdca6003d3ca63fdd9350ad1a1673d444d2f7c7be639824681643ec4f77535c626bd3ee8fa100e0bb0 -B = ca927a5a3124ce89accd6ac41a8441d352a5d42feb7f62687a5ebc0e181cc2679888ecc2d38516bdc3b3443550efccac81e53044ae9341ecace2598fe5ce67780 -LCM = 36805ba9b2412a0cb3fe4ed9bdabfa55515c9d615a3d0af268c45c5f6098d2de4a583f3791f1e3883c55d51ce23c5658fd0e8faa9a3709a1cfbd6a61dbab861690f27c86664f084c86cfd4a183b24aaadf59a6f8cbec04f1b0ded8a59b188cb46ae920052e3e099a570540dbc00f7d4a571eef08aa70d2d189a1804bf04e94a80 - -GCD = 100 -A = 73725032b214a677687c811031555b0c51c1703f10d59b97a4d732b7feaec5726cb3882193419d3f057583b2bc02b297d76bb689977936febaae92638fdfc46a00 -B = 979f4c10f4dc60ad15068cedd62ff0ab293aeaa1d6935763aed41fe3e445de2e366e8661eadf345201529310f4b805c5800b99f351fddab95d7f313e3bb429d900 -LCM = 4460439b4be72f533e9c7232f7e99c48328b457969364c951868ceab56cb2cbbeda8be2e8e3cae45c0758048468b841fdb246b2086d19b59d17b389333166ab82ed785860620d53c44f7aaaff4625ee70fb8072df10fb4d1acb142eadc02978ff2bb07cea9f434e35424b3323a7bda3a1a57aa60c75e49ebb2f59fb653aa77da00 - -GCD = 100000000 -A = f8b4f19e09f5862d79fb2931c4d616a1b8e0dd44781ca52902c8035166c8fca52d33a56ff484c365ec1257de7fa8ed2786163cfc051d5223b4aad859a049e8ba00000000 -B = 6e54cb41b454b080e68a2c3dd0fa79f516eb80239af2be8250ca9cd377ba501aabafc09146fad4402bdc7a49f2c3eec815e25f4c0a223f58e36709eefd92410500000000 -LCM = 6b3020a880ddeff9d17d3dc234da8771962de3322cd15ba7b1e4b1dd4a6a2a802a16c49653865c6fdf6c207cbe0940f8d81ef4cb0e159385fd709d515ee99d109ad9ad680031cbae4eab2ed62944babdade4e3036426b18920022f737897c7d751dce98d626cdda761fec48ad87a377fb70f97a0a15aa3d10d865785719cc5a200000000 diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/bytes.c b/third_party/boringssl/src/crypto/fipsmodule/bn/bytes.c index da27426c866e..331e08596239 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/bytes.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/bn/check_bn_tests.go b/third_party/boringssl/src/crypto/fipsmodule/bn/check_bn_tests.go index 26443b93d630..032b9e328d12 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/check_bn_tests.go +++ b/third_party/boringssl/src/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 ( @@ -135,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 { diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/ctx.c b/third_party/boringssl/src/crypto/fipsmodule/bn/ctx.c index f8c7ebfa62a0..007316110c06 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/ctx.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.c b/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.c index 9b609b3a7a8c..41c7233540cb 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.c +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/exponentiation.c @@ -109,6 +109,7 @@ #include #include +#include #include #include @@ -396,7 +397,7 @@ static int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, // // (with draws in between). Very small exponents are often selected // with low Hamming weight, so we use w = 1 for b <= 23. -static int BN_window_bits_for_exponent_size(int b) { +static int BN_window_bits_for_exponent_size(size_t b) { if (b > 671) { return 6; } @@ -443,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); @@ -450,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)) { @@ -593,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; } @@ -721,12 +723,14 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, void bn_mod_exp_mont_small(BN_ULONG *r, const BN_ULONG *a, size_t num, const BN_ULONG *p, size_t num_p, const BN_MONT_CTX *mont) { - if (num != (size_t)mont->N.width || num > BN_SMALL_MAX_WORDS) { + if (num != (size_t)mont->N.width || num > BN_SMALL_MAX_WORDS || + num_p > ((size_t)-1) / BN_BITS2) { abort(); } assert(BN_is_odd(&mont->N)); - // Count the number of bits in |p|. Note this function treats |p| as public. + // Count the number of bits in |p|, skipping leading zeros. Note this function + // treats |p| as public. while (num_p != 0 && p[num_p - 1] == 0) { num_p--; } @@ -734,7 +738,7 @@ void bn_mod_exp_mont_small(BN_ULONG *r, const BN_ULONG *a, size_t num, bn_from_montgomery_small(r, num, mont->RR.d, num, mont); return; } - unsigned bits = BN_num_bits_word(p[num_p - 1]) + (num_p - 1) * BN_BITS2; + size_t bits = BN_num_bits_word(p[num_p - 1]) + (num_p - 1) * BN_BITS2; assert(bits != 0); // We exponentiate by looking at sliding windows of the exponent and @@ -758,7 +762,7 @@ void bn_mod_exp_mont_small(BN_ULONG *r, const BN_ULONG *a, size_t num, // |p| is non-zero, so at least one window is non-zero. To save some // multiplications, defer initializing |r| until then. int r_is_one = 1; - unsigned wstart = bits - 1; // The top bit of the window. + size_t wstart = bits - 1; // The top bit of the window. for (;;) { if (!bn_is_bit_set_words(p, num_p, wstart)) { if (!r_is_one) { @@ -848,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; } @@ -858,40 +866,15 @@ static int copy_from_prebuf(BIGNUM *b, int top, const BN_ULONG *table, int idx, return 1; } -#define MOD_EXP_CTIME_MIN_CACHE_LINE_MASK \ - (MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH - 1) - // Window sizes optimized for fixed window size modular exponentiation // algorithm (BN_mod_exp_mont_consttime). // -// To achieve the security goals of BN_mode_exp_mont_consttime, the maximum -// size of the window must not exceed -// log_2(MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH). -// -// Window size thresholds are defined for cache line sizes of 32 and 64, cache -// line sizes where log_2(32)=5 and log_2(64)=6 respectively. A window size of -// 7 should only be used on processors that have a 128 byte or greater cache -// line size. -#if MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH == 64 - +// TODO(davidben): These window sizes were originally set for 64-byte cache +// lines with a cache-line-dependent constant-time mitigation. They can probably +// be revised now that our implementation is no longer cache-time-dependent. #define BN_window_bits_for_ctime_exponent_size(b) \ ((b) > 937 ? 6 : (b) > 306 ? 5 : (b) > 89 ? 4 : (b) > 22 ? 3 : 1) -#define BN_MAX_WINDOW_BITS_FOR_CTIME_EXPONENT_SIZE (6) - -#elif MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH == 32 - -#define BN_window_bits_for_ctime_exponent_size(b) \ - ((b) > 306 ? 5 : (b) > 89 ? 4 : (b) > 22 ? 3 : 1) -#define BN_MAX_WINDOW_BITS_FOR_CTIME_EXPONENT_SIZE (5) - -#endif - -// Given a pointer value, compute the next address that is a cache line -// multiple. -#define MOD_EXP_CTIME_ALIGN(x_) \ - ((unsigned char *)(x_) + \ - (MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH - \ - (((size_t)(x_)) & (MOD_EXP_CTIME_MIN_CACHE_LINE_MASK)))) +#define BN_MAX_MOD_EXP_CTIME_WINDOW (6) // This variant of |BN_mod_exp_mont| uses fixed windows and fixed memory access // patterns to protect secret exponents (cf. the hyper-threading timing attacks @@ -900,14 +883,12 @@ static int copy_from_prebuf(BIGNUM *b, int top, const BN_ULONG *table, int idx, int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, const BN_MONT_CTX *mont) { - int i, ret = 0, window, wvalue; + int i, ret = 0, wvalue; BN_MONT_CTX *new_mont = NULL; - int numPowers; - unsigned char *powerbufFree = NULL; - int powerbufLen = 0; + unsigned char *powerbuf_free = NULL; + size_t powerbuf_len = 0; BN_ULONG *powerbuf = NULL; - BIGNUM tmp, am; if (!BN_is_odd(m)) { OPENSSL_PUT_ERROR(BN, BN_R_CALLED_WITH_EVEN_MODULUS); @@ -953,8 +934,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, // paths. If we were to use separate static buffers for each then there is // some chance that both large buffers would be allocated on the stack, // causing the stack space requirement to be truly huge (~10KB). - alignas(MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH) BN_ULONG - storage[MOD_EXP_CTIME_STORAGE_LEN]; + alignas(MOD_EXP_CTIME_ALIGN) BN_ULONG storage[MOD_EXP_CTIME_STORAGE_LEN]; #endif #if defined(RSAZ_ENABLED) // If the size of the operands allow it, perform the optimized RSAZ @@ -975,41 +955,49 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, #endif // Get the window size to use with size of p. - window = BN_window_bits_for_ctime_exponent_size(bits); + int window = BN_window_bits_for_ctime_exponent_size(bits); + assert(window <= BN_MAX_MOD_EXP_CTIME_WINDOW); + + // Calculating |powerbuf_len| below cannot overflow because of the bound on + // Montgomery reduction. + assert((size_t)top <= BN_MONTGOMERY_MAX_WORDS); + static_assert( + BN_MONTGOMERY_MAX_WORDS <= + INT_MAX / sizeof(BN_ULONG) / ((1 << BN_MAX_MOD_EXP_CTIME_WINDOW) + 3), + "powerbuf_len may overflow"); + #if defined(OPENSSL_BN_ASM_MONT5) if (window >= 5) { window = 5; // ~5% improvement for RSA2048 sign, and even for RSA4096 // Reserve space for the |mont->N| copy. - powerbufLen += top * sizeof(mont->N.d[0]); + powerbuf_len += top * sizeof(mont->N.d[0]); } #endif // Allocate a buffer large enough to hold all of the pre-computed // powers of |am|, |am| itself, and |tmp|. - numPowers = 1 << window; - powerbufLen += - sizeof(m->d[0]) * - (top * numPowers + ((2 * top) > numPowers ? (2 * top) : numPowers)); + int num_powers = 1 << window; + powerbuf_len += sizeof(m->d[0]) * top * (num_powers + 2); #if defined(OPENSSL_BN_ASM_MONT5) - if ((size_t)powerbufLen <= sizeof(storage)) { + if (powerbuf_len <= sizeof(storage)) { powerbuf = storage; } // |storage| is more than large enough to handle 1024-bit inputs. assert(powerbuf != NULL || top * BN_BITS2 > 1024); #endif if (powerbuf == NULL) { - powerbufFree = - OPENSSL_malloc(powerbufLen + MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH); - if (powerbufFree == NULL) { + powerbuf_free = OPENSSL_malloc(powerbuf_len + MOD_EXP_CTIME_ALIGN); + if (powerbuf_free == NULL) { goto err; } - powerbuf = (BN_ULONG *)MOD_EXP_CTIME_ALIGN(powerbufFree); + powerbuf = align_pointer(powerbuf_free, MOD_EXP_CTIME_ALIGN); } - OPENSSL_memset(powerbuf, 0, powerbufLen); + OPENSSL_memset(powerbuf, 0, powerbuf_len); // Place |tmp| and |am| right after powers table. - tmp.d = powerbuf + top * numPowers; + BIGNUM tmp, am; + tmp.d = powerbuf + top * num_powers; am.d = tmp.d + top; tmp.width = am.width = 0; tmp.dmax = am.dmax = top; @@ -1158,7 +1146,7 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, copy_to_prebuf(&tmp, top, powerbuf, 2, window); - for (i = 3; i < numPowers; i++) { + for (i = 3; i < num_powers; i++) { // Calculate a^i = a^(i-1) * a if (!BN_mod_mul_montgomery(&tmp, &am, &tmp, mont, ctx)) { goto err; @@ -1213,11 +1201,11 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p, err: BN_MONT_CTX_free(new_mont); - if (powerbuf != NULL && powerbufFree == NULL) { - OPENSSL_cleanse(powerbuf, powerbufLen); + if (powerbuf != NULL && powerbuf_free == NULL) { + OPENSSL_cleanse(powerbuf, powerbuf_len); } - OPENSSL_free(powerbufFree); - return (ret); + OPENSSL_free(powerbuf_free); + return ret; } int BN_mod_exp_mont_word(BIGNUM *rr, BN_ULONG a, const BIGNUM *p, diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/gcd.c b/third_party/boringssl/src/crypto/fipsmodule/bn/gcd.c index bd0fa6f5de0a..e8cc764cf891 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/gcd.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/bn/generic.c b/third_party/boringssl/src/crypto/fipsmodule/bn/generic.c index ee80a3ce773f..e4f4518e9494 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/generic.c +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/generic.c @@ -61,11 +61,25 @@ #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(OPENSSL_NO_ASM) && defined(OPENSSL_AARCH64) +// See asm/bn-armv8.pl. +#define BN_ADD_ASM +#endif + +#if !defined(BN_MUL_ASM) #ifdef BN_ULLONG #define mul_add(r, a, w, c) \ @@ -201,157 +215,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) @@ -369,9 +232,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, (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) \ @@ -382,16 +243,12 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, (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) \ @@ -402,9 +259,7 @@ BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, (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) @@ -708,4 +563,93 @@ void bn_sqr_comba4(BN_ULONG r[8], const BN_ULONG a[4]) { #undef sqr_add_c #undef sqr_add_c2 +#endif // !BN_MUL_ASM + +#if !defined(BN_ADD_ASM) + +// 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 +} + +// 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) { + if (n == 0) { + return 0; + } + + BN_ULONG carry = 0; + while (n & ~3) { + 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) { + r[0] = bn_add_with_carry(a[0], b[0], carry, &carry); + a++; + b++; + r++; + n--; + } + return carry; +} + +BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, + size_t n) { + if (n == 0) { + return (BN_ULONG)0; + } + + BN_ULONG borrow = 0; + while (n & ~3) { + 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) { + r[0] = bn_sub_with_borrow(a[0], b[0], borrow, &borrow); + a++; + b++; + r++; + n--; + } + return borrow; +} + +#endif // !BN_ADD_ASM diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/internal.h b/third_party/boringssl/src/crypto/fipsmodule/bn/internal.h index f7c181e012ae..ca3e3e7905c4 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/internal.h +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/internal.h @@ -189,14 +189,20 @@ extern "C" { #define BN_CAN_USE_INLINE_ASM #endif -// |BN_mod_exp_mont_consttime| is based on the assumption that the L1 data -// cache line width of the target processor is at least the following value. -#define MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH 64 - -// The number of |BN_ULONG|s needed for the |BN_mod_exp_mont_consttime| stack- -// allocated storage buffer. The buffer is just the right size for the RSAZ -// and is about ~1KB larger than what's necessary (4480 bytes) for 1024-bit -// inputs. +// MOD_EXP_CTIME_ALIGN is the alignment needed for |BN_mod_exp_mont_consttime|'s +// tables. +// +// TODO(davidben): Historically, this alignment came from cache line +// assumptions, which we've since removed. Is 64-byte alignment still necessary +// or ideal? The true alignment requirement seems to now be 32 bytes, coming +// from RSAZ's use of VMOVDQA to a YMM register. Non-x86_64 has even fewer +// requirements. +#define MOD_EXP_CTIME_ALIGN 64 + +// MOD_EXP_CTIME_STORAGE_LEN is the number of |BN_ULONG|s needed for the +// |BN_mod_exp_mont_consttime| stack-allocated storage buffer. The buffer is +// just the right size for the RSAZ and is about ~1KB larger than what's +// necessary (4480 bytes) for 1024-bit inputs. #define MOD_EXP_CTIME_STORAGE_LEN \ (((320u * 3u) + (32u * 9u * 16u)) / sizeof(BN_ULONG)) @@ -211,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 @@ -228,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); @@ -257,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 @@ -344,6 +356,12 @@ int bn_rand_range_words(BN_ULONG *out, BN_ULONG min_inclusive, int bn_rand_secret_range(BIGNUM *r, int *out_is_uniform, BN_ULONG min_inclusive, const BIGNUM *max_exclusive); +// BN_MONTGOMERY_MAX_WORDS is the maximum numer of words allowed in a |BIGNUM| +// used with Montgomery reduction. Ideally this limit would be applied to all +// |BIGNUM|s, in |bn_wexpand|, but the exactfloat library needs to create 8 MiB +// values for other operations. +#define BN_MONTGOMERY_MAX_WORDS (8 * 1024 / sizeof(BN_ULONG)) + #if !defined(OPENSSL_NO_ASM) && \ (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \ defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) @@ -356,11 +374,13 @@ int bn_rand_secret_range(BIGNUM *r, int *out_is_uniform, BN_ULONG min_inclusive, // If at least one of |ap| or |bp| is fully reduced, |rp| will be fully reduced. // If neither is fully-reduced, the output may not be either. // +// This function allocates |num| words on the stack, so |num| should be at most +// |BN_MONTGOMERY_MAX_WORDS|. +// // TODO(davidben): The x86_64 implementation expects a 32-bit input and masks // off upper bits. The aarch64 implementation expects a 64-bit input and does // not. |size_t| is the safer option but not strictly correct for x86_64. But -// this function implicitly already has a bound on the size of |num| because it -// internally creates |num|-sized stack allocation. +// the |BN_MONTGOMERY_MAX_WORDS| bound makes this moot. // // See also discussion in |ToWord| in abi_test.h for notes on smaller-than-word // inputs. @@ -374,7 +394,8 @@ int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, // bn_mul_mont_gather5 multiples loads index |power| of |table|, multiplies it // by |ap| modulo |np|, and stores the result in |rp|. The values are |num| // words long and represented in Montgomery form. |n0| is a pointer to the -// corresponding field in |BN_MONT_CTX|. +// corresponding field in |BN_MONT_CTX|. |table| must be aligned to at least +// 16 bytes. |power| must be less than 32 and is treated as secret. // // WARNING: This function implements Almost Montgomery Multiplication from // https://eprint.iacr.org/2011/239. The inputs do not need to be fully reduced. @@ -384,20 +405,22 @@ void bn_mul_mont_gather5(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *n0, int num, int power); // bn_scatter5 stores |inp| to index |power| of |table|. |inp| and each entry of -// |table| are |num| words long. |power| must be less than 32. |table| must be -// 32*|num| words long. +// |table| are |num| words long. |power| must be less than 32 and is treated as +// public. |table| must be 32*|num| words long. |table| must be aligned to at +// least 16 bytes. void bn_scatter5(const BN_ULONG *inp, size_t num, BN_ULONG *table, size_t power); // bn_gather5 loads index |power| of |table| and stores it in |out|. |out| and -// each entry of |table| are |num| words long. |power| must be less than 32. +// each entry of |table| are |num| words long. |power| must be less than 32 and +// is treated as secret. |table| must be aligned to at least 16 bytes. void bn_gather5(BN_ULONG *out, size_t num, const BN_ULONG *table, size_t power); // bn_power5 squares |ap| five times and multiplies it by the value stored at // index |power| of |table|, modulo |np|. It stores the result in |rp|. The // values are |num| words long and represented in Montgomery form. |n0| is a // pointer to the corresponding field in |BN_MONT_CTX|. |num| must be divisible -// by 8. +// by 8. |power| must be less than 32 and is treated as secret. // // WARNING: This function implements Almost Montgomery Multiplication from // https://eprint.iacr.org/2011/239. The inputs do not need to be fully reduced. @@ -635,6 +658,15 @@ int bn_mod_inverse_prime(BIGNUM *out, const BIGNUM *a, const BIGNUM *p, int bn_mod_inverse_secret_prime(BIGNUM *out, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx, const BN_MONT_CTX *mont_p); +// BN_MONT_CTX_set_locked takes |lock| and checks whether |*pmont| is NULL. If +// so, it creates a new |BN_MONT_CTX| and sets the modulus for it to |mod|. It +// then stores it as |*pmont|. It returns one on success and zero on error. Note +// this function assumes |mod| is public. +// +// If |*pmont| is already non-NULL then it does nothing and returns one. +int BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, CRYPTO_MUTEX *lock, + const BIGNUM *mod, BN_CTX *bn_ctx); + // Low-level operations for small numbers. // @@ -690,9 +722,10 @@ void bn_mod_mul_montgomery_small(BN_ULONG *r, const BN_ULONG *a, // bn_mod_exp_mont_small sets |r| to |a|^|p| mod |mont->N|. It returns one on // success and zero on programmer or internal error. Both inputs and outputs are // in the Montgomery domain. |r| and |a| are |num| words long, which must be -// |mont->N.width| and at most |BN_SMALL_MAX_WORDS|. |a| must be fully-reduced. -// This function runs in time independent of |a|, but |p| and |mont->N| are -// public values. |a| must be fully-reduced and may alias with |r|. +// |mont->N.width| and at most |BN_SMALL_MAX_WORDS|. |num_p|, measured in bits, +// must fit in |size_t|. |a| must be fully-reduced. This function runs in time +// independent of |a|, but |p| and |mont->N| are public values. |a| must be +// fully-reduced and may alias with |r|. // // Note this function differs from |BN_mod_exp_mont| which uses Montgomery // reduction but takes input and output outside the Montgomery domain. Combine diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery.c b/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery.c index d04e91a13cdf..92bfa5e32714 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery.c +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/montgomery.c @@ -172,6 +172,10 @@ static int bn_mont_ctx_set_N_and_n0(BN_MONT_CTX *mont, const BIGNUM *mod) { OPENSSL_PUT_ERROR(BN, BN_R_NEGATIVE_NUMBER); return 0; } + if (!bn_fits_in_words(mod, BN_MONTGOMERY_MAX_WORDS)) { + OPENSSL_PUT_ERROR(BN, BN_R_BIGNUM_TOO_LONG); + return 0; + } // Save the modulus. if (!BN_copy(&mont->N, mod)) { @@ -428,6 +432,9 @@ int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, if (!bn_wexpand(r, num)) { return 0; } + // This bound is implied by |bn_mont_ctx_set_N_and_n0|. |bn_mul_mont| + // allocates |num| words on the stack, so |num| cannot be too large. + assert((size_t)num <= BN_MONTGOMERY_MAX_WORDS); if (!bn_mul_mont(r->d, a->d, b->d, mont->N.d, mont->n0, num)) { // The check above ensures this won't happen. assert(0); diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/prime.c b/third_party/boringssl/src/crypto/fipsmodule/bn/prime.c index 05785582967b..2d2ab6937f27 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/prime.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.c b/third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.c index 7b455b55f089..da25030658cd 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.c +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.c @@ -40,8 +40,8 @@ void RSAZ_1024_mod_exp_avx2(BN_ULONG result_norm[16], const BN_ULONG m_norm[16], const BN_ULONG RR[16], BN_ULONG k0, BN_ULONG storage[MOD_EXP_CTIME_STORAGE_LEN]) { - static_assert(MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH % 64 == 0, - "MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH is too small"); + static_assert(MOD_EXP_CTIME_ALIGN % 64 == 0, + "MOD_EXP_CTIME_ALIGN is too small"); assert((uintptr_t)storage % 64 == 0); BN_ULONG *a_inv, *m, *result, *table_s = storage + 40 * 3, *R2 = table_s; diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.h b/third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.h index bc7a439e75c6..22ca3ec461d3 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.h +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.h @@ -32,8 +32,7 @@ extern "C" { // modulo |m_norm|. |base_norm| must be fully-reduced and |exponent| must have // the high bit set (it is 1024 bits wide). |RR| and |k0| must be |RR| and |n0|, // respectively, extracted from |m_norm|'s |BN_MONT_CTX|. |storage_words| is a -// temporary buffer that must be aligned to |MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH| -// bytes. +// temporary buffer that must be aligned to |MOD_EXP_CTIME_ALIGN| bytes. void RSAZ_1024_mod_exp_avx2(BN_ULONG result[16], const BN_ULONG base_norm[16], const BN_ULONG exponent[16], const BN_ULONG m_norm[16], const BN_ULONG RR[16], @@ -79,13 +78,15 @@ void rsaz_1024_sqr_avx2(BN_ULONG ret[40], const BN_ULONG a[40], const BN_ULONG n[40], BN_ULONG k, int count); // rsaz_1024_scatter5_avx2 stores |val| at index |i| of |tbl|. |i| must be -// positive and at most 31. Note the table only uses 18 |BN_ULONG|s per entry -// instead of 40. It packs two 29-bit limbs into each |BN_ULONG| and only stores -// 36 limbs rather than the padded 40. +// positive and at most 31. It is treated as public. Note the table only uses 18 +// |BN_ULONG|s per entry instead of 40. It packs two 29-bit limbs into each +// |BN_ULONG| and only stores 36 limbs rather than the padded 40. void rsaz_1024_scatter5_avx2(BN_ULONG tbl[32 * 18], const BN_ULONG val[40], int i); -// rsaz_1024_gather5_avx2 loads index |i| of |tbl| and writes it to |val|. +// rsaz_1024_gather5_avx2 loads index |i| of |tbl| and writes it to |val|. |i| +// must be positive and at most 31. It is treated as secret. |tbl| must be +// aligned to 32 bytes. void rsaz_1024_gather5_avx2(BN_ULONG val[40], const BN_ULONG tbl[32 * 18], int i); diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/sqrt.c b/third_party/boringssl/src/crypto/fipsmodule/bn/sqrt.c index 9180d540203c..f97675308a97 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/bn/sqrt.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/bn/test/exp_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/exp_tests.txt new file mode 100644 index 000000000000..15982242f466 --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/exp_tests.txt @@ -0,0 +1,23 @@ +# Exp tests. +# +# These test vectors satisfy A ^ E = Exp. + +Exp = aa6d7ac431 +A = d0e07 +E = 2 + +Exp = 12d416b110dbb4e467ff0c89a22122f4da8240 +A = 1a18cf6 +E = 6 + +Exp = 49a3b33e23d84f1ce0d5d83f5dcb651d50cf3920f0143da2310d0512a90a06cd8f38977df8a756c30883de38df092000 +A = 2a3acbd2 +E = d + +Exp = 5b4a0d5a956f885f275712b194459980f24708bfb6393d71bd37dce852ce455724f5ee5030775fb86b4295edc98afaafc097e4d82a97c0078ec0eac763db16549c5145c4cf2d3124f88cf9a5c71da0625afb99b26801786fe49a778415dc025954021753d08691947a208b613f0be5c1 +A = 54b3ae461 +E = 1a + +Exp = a0ea5f6a4de49beb8fb7f0dab280d6a32c5a3814c9a5153a7944cec0a9028497846a8a89044348721a0bb5f0c3ded3e980574ea321b0cdb0ead4f4e93841ea7478a7f15d9729b646a8165813a0750e8124f5465dda9b105e1bbeff18fd09c09a2e26610d9176d253b877c3a8908a6be521cbe1e472a7a1b7820e4e890f8f28aacd34609c686e76e15b01bd9324a71290812724ea564d11c874a6765b262c3e57d479da0287a76026a1e8fe53da0b02405da1d379eaa30fc65f +A = fccec0f6df +E = 25 diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/test/gcd_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/gcd_tests.txt new file mode 100644 index 000000000000..b5a0c17ed2a2 --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/gcd_tests.txt @@ -0,0 +1,279 @@ +# GCD tests. +# +# These test vectors satisfy gcd(A, B) = GCD and lcm(A, B) = LCM. + +GCD = 0 +A = 0 +B = 0 +# Just to appease the syntax-checker. +LCM = 0 + +GCD = 1 +A = 92ff140ac8a659b31dd904161f9213706a08a817ae845e522c3af0c9096699e059b47c8c2f16434b1c5766ebb384b79190f2b2a62c2378f45e116890e7bb407a +B = 2f532c9e5902b0d68cd2ed69b2083bc226e8b04c549212c425a5287bb171c6a47fcb926c70cc0d34b8d6201c617aee66af865d31fdc8a2eeb986c19da8bb0897 +LCM = 1b2c97003e520b0bdd59d8c35a180b4aa36bce14211590435b990ad8f4c034ce3c77899581cb4ee1a022874203459b6d53859ab1d99ff755efa253fc0e5d8487bb000c13c566e8937f0fe90b95b68bc278610d4f232770b08d1f31bee55a03da47f2d0ebb9e7861c4f16cc22168b68593e9efcde00f54104b4c3e1a0b294d7f6 + +GCD = a +A = faaffa431343074f5c5d6f5788500d7bc68b86eb37edf166f699b4d75b76dae2cb7c8f6eccae8f18f6d510ef72f0b9633d5740c0bebb934d3be796bd9a53808e +B = 2f48ec5aa5511283c2935b15725d30f62244185573203b48c7eb135b2e6db5c115c9446ac78b020574665b06a75eb287e0dbeb5da7c193294699b4c2129d2ac4 +LCM = 4a15f305e9622aa19bd8f39e968bfc16d527a47f7a5219d7b02c242c77ef8b608a4a6141f643ca97cedf07c0f1f3e8879d2568b056718aa15c0756899a08ccbe0a658bae67face96fa110edb91757bfa4828e8ff7c5d71b204f36238b12dd26f17be8ba9771f7068d63e41d423671f898f054b1187605754bc5546f2b02c5ac + +GCD = 16 +A = cf0b21bde98b41b479ac8071086687a6707e9efaacd4e5299668ce1be8b13290f27fd32ae68df87c292e8583a09d73ec8e8a04a65a487380dcd7dacca3b6e692 +B = 3be3f563f81d5ad5c1211db7eff430aa345e830ce07b4bde7d4d32dba3ac618d2034351e5435fd6c7f077971fb4a1e83a7396a74fdff7fce1267112851db2582 +LCM = 233a2188de2c017235024b182286f17562b2ee5ab9fdfe4efa2f61c4ff99fa44e1ead5bf6cde05bd7502ce78373c83e3f9dbab0c9bb8620a87c2640bce5d12c685af656df789bb3d0ba1edbaa98cf4f0166d422ab17aa6706f8132264d45b72827d6671a00a9186e723379e3a3bb7902d08865f357c74100059f83800241976 + +GCD = 1 +A = dd7b7597d7c1eb399b1cea9b3042c14bd6022d31b1d2642a8f82fc32de6eadaf012fbbf349eaec4922a8468740ca73c6090833d6a69a380ed947b39c2f9b0b76 +B = 8e0dc8654e70eec55496038a8d3fff3c2086bc6dbfc0e2dbdf5bd7de03c5aef01a3982556ac3fc34fd5f13368be6cdc252c82367b7462e210f940f847d382dd9 +LCM = 7ae667df4bd4dd35bbec28719a9f1b5e1f396a9ab386c086742a6ab3014a3386d39f35b50624d0c5b4e6b206c2635c7de5ea69e2faa85dd616a7e36622962a07632839857aa49332942feccff2aee1c962e2f4e8ccfd738a5da5bf528b4c5a2440409350f5a17a39d234403e8482ccf838e0d2758ccfb8018198a51dbb407506 + +GCD = 1 +A = 0 +B = 1 +LCM = 0 + +GCD = 1 +A = 1 +B = 0 +LCM = 0 + +GCD = 1 +A = 1 +B = 1 +LCM = 1 + +GCD = 2b2 +A = dfccaa3549c1b59ab3e114fe87dc5d187719abad58c51724e972741eb895ab79a49f385f61d531ec5c88dbb505ae375093fa848165f71a5ed65e7832a42ade191a +B = fa58a81f43088da45e659fc1117d0f1cd015aa096c8e5377cf1832191baf7cc28b5c24998b93b64f8900a0973faedb9babaaf1854345f011739da8f1175d9684c +LCM = 5132f7ab7a982b9dc55114bd96800b7637f9742cf8a7a00a0d69d5e4574fc85792c89a1c52bcfc74b9d7f3f6164819466c46b2d622e280ced7ad1211604084a15dc1fd1951a05c8ce37122c0ec15891d818a70d3763670ea3195098de9b1ca50ea89893a9753fb9ea801541058f44801f7f50967124abfc864a2b01c41f94193c + +GCD = 8e +A = 248d96a8a4cab0a1b194e08c1146868b094597cadbc35531f0ed2d77cba9f15cb5cc7c10e64ce054bf93396d25259d750b3de3aba65073db1fd2b852a6454ac1a +B = 4c7bad8e1844901fd6a2ce2edc82e698d28ec95d6672ca148d85b49ecc78dd0a8b870e202244210bc98592b99ff6abbd20630f9eee7d46b15ccfae8d08b86799de +LCM = 13b01f9d9c6c13e90c97e3d95bbce5a835c631b3de3bd4ff5df13ad850f5223dbdf71c53912275d0397df9335ef3a3ba8e4684c6b25962bb7b18bc74144cb5edf0196f79863a7ff032619a71646a92281f7baace7f223d254cb4d05ec19bf8d4c8ce4455a9d770daec89c0d3cf338cbdae39cf982b3c4568f5c9def4e1133d28a + +GCD = 3e55 +A = 2fa97382f46676b7a4cc2b8153f17b58792d24660e187d33ce55c81cc193ccb6e1e2b89feea1d5fd8faa36e13bf947fb48635e450a4d1488d0978324194a1f43c6 +B = ab08ad074139963bc18e5d87ba68db64ca6f4c279616c64039b02c55f2375b3bc04114e8e05e1ba92fb6470768f61d123845aea36774c18612736a220934561faf +LCM = 82c7c377ecda2cb9228604cd287df5eff94edd4a539c3eb3b3fdd4b4a79d2f4eaf2b22f8286272d3dad2e370cfcd9ea4d93ebb3f049c52b8fa23b68a5bf79af989822e2cfb978f68c6a5058f47319dffcb455b089b06ae6db9e5c8a2b6e951d6e118bd2b4cd08b6e5733476a446a57387d940d1289ec00e24315821ed3a5daf2 + +GCD = a7a +A = 923706dfed67834a1e7e6c8e8e9f93bfbc0b43ca1f324886cf1f1380fb9b77109275d4b50af1b7689802fe9b3623ac46c7ba0e17e908c20278127b07a5c12d86ec +B = 64473e878a29021fac1c1ce34a63eae1f4f83ee6851333b67213278b9a4a16f005cba0e8cdb410035bb580062f0e486c1a3a01f4a4edf782495f1dc3ebfa837d86 +LCM = 57785ca45b8873032f1709331436995525eed815c55140582ce57fd852116835deac7ca9d95ce9f280e246ea4d4f1b7140ab7e0dd6dc869de87f1b27372098b155ad0a1828fd387dff514acc92eae708609285edaab900583a786caf95153f71e6e6092c8c5ee727346567e6f58d60a5e01c2fa8ebcf86da9ea46876ecc58e914 + +GCD = 42 +A = 0 +B = 42 +LCM = 0 + +GCD = 42 +A = 42 +B = 0 +LCM = 0 + +GCD = 42 +A = 42 +B = 42 +LCM = 42 + +GCD = f60d +A = ef7886c3391407529d5cf2e75ed53e5c3f74439ad2e2dc48a79bc1a5322789b4ced2914b97f8ff4b9910d212243b54001eb8b375365b9a87bd022dd3772c78a9fd63 +B = d1d3ec32fa3103911830d4ec9f629c5f75af7039e307e05bc2977d01446cd2cbeeb8a8435b2170cf4d9197d83948c7b8999d901fe47d3ce7e4d30dc1b2de8af0c6e4 +LCM = cc376ed2dc362c38a45a719b2ed48201dab3e5506e3f1314e57af229dc7f3a6a0dad3d21cfb148c23a0bbb0092d667051aa0b35cff5b5cc61a7c52dec4ed72f6783edf181b3bf0500b79f87bb95abc66e4055f259791e4e5eb897d82de0e128ecf8a091119475351d65b7f320272db190898a02d33f45f03e27c36cb1c45208037dc + +GCD = 9370 +A = 1ee02fb1c02100d1937f9749f628c65384ff822e638fdb0f42e27b10ee36e380564d6e861fcad0518f4da0f8636c1b9f5124c0bc2beb3ca891004a14cd7b118ddfe0 +B = 67432fd1482d19c4a1c2a4997eab5dbf9c5421977d1de60b739af94c41a5ad384cd339ebfaa43e5ad6441d5b9aaed5a9f7485025f4b4d5014e1e406d5bd838a44e50 +LCM = 159ff177bdb0ffbd09e2aa7d86de266c5de910c12a48cbe61f6fa446f63a2151194777555cd59903d24cb30965973571fb1f89c26f2b760526f73ded7ee8a34ebcecd1a3374a7559bcdb9ac6e78be17a62b830d6bb3982afdf10cf83d61fd0d588eab17d6abef8e6a7a5763fcb766d9a4d86adf5bb904f2dd6b528b9faec603987a0 + +GCD = c5f +A = 5a3a2088b5c759420ed0fb9c4c7685da3725b659c132a710ef01e79435e63d009d2931ea0a9ed9432f3d6b8851730c323efb9db686486614332c6e6ba54d597cf98 +B = 1b1eb33b006a98178bb35bbcf09c5bebd92d9ace79fa34c1567efa8d6cf6361547807cd3f8e7b8cd3ddb6209dccbae4b4c16c8c1ec19741a3a57f61571882b7aed7 +LCM = c5cbbbe9532d30d2a7dd7c1c8a6e69fd4fa4828a844d6afb44f3747fef584f7f1f3b835b006f8747d84f7699e88f6267b634e7aef78d6c7584829537d79514eec7d11219721f91015f5cefdc296261d85dba388729438991a8027de4827cd9eb575622e2912b28c9ce26d441e97880d18db025812cef5de01adeaec1322a9c9858 + +GCD = e052 +A = 67429f79b2ec3847cfc7e662880ab1d94acdf04284260fcfffd67c2862d59704ed45bcc53700c88a5eea023bc09029e9fd114fc94c227fd47a1faa1a5ef117b09bd2 +B = 39faa7cbdeb78f9028c1d50ab34fbe6924c83a1262596f6b85865d4e19cc258b3c3af1ee2898e39e5bee5839e92eac6753bbbb0253bd576d1839a59748b778846a86 +LCM = 1ab071fb733ef142e94def10b26d69982128561669e58b20b80d39cf7c2759d26b4a65d73b7f940c6e8fc417180ef62d7e52ac24678137bd927cd8d004ad52b02affe176a1ecde903dbc26dcc705678f76dd8cd874c0c3fe737474309767507bbe70dd7fb671bbb3694cedf0dcdaa0c716250ddd6dfec525261572fa3e1387f7b906 + +GCD = 3523 +A = 0 +B = 3523 +LCM = 0 + +GCD = 3523 +A = 3523 +B = 0 +LCM = 0 + +GCD = 3523 +A = 3523 +B = 3523 +LCM = 3523 + +GCD = f035a941 +A = 16cd5745464dfc426726359312398f3c4486ed8aaeea6386a67598b10f744f336c89cdafcb18e643d55c3a62f4ab2c658a0d19ea3967ea1af3aee22e11f12c6df6e886f7 +B = 74df09f309541d26b4b39e0c01152b8ad05ad2dfe9dd2b6706240e9d9f0c530bfb9e4b1cad3d4a94342aab309e66dd42d9df01b47a45173b507e41826f24eb1e8bcc4459 +LCM = b181771d0e9d6b36fdfcbf01d349c7de6b7e305e1485ea2aa32938aa919a3eee9811e1c3c649068a7572f5d251b424308da31400d81ac4078463f9f71d7efd2e681f92b13a6ab3ca5c9063032dcbdf3d3a9940ce65e54786463bbc06544e1280f25bc7579d264f6f1590cf09d1badbf542ce435a14ab04d25d88ddbac7d22e8cae1c91f + +GCD = 33ad1b8f +A = 1af010429a74e1b612c2fc4d7127436f2a5dafda99015ad15385783bd3af8d81798a57d85038bcf09a2a9e99df713b4d6fc1e3926910fbbf1f006133cb27dc5ebb9cca85 +B = 92a4f45a90965a4ef454f1cdd883d20f0f3be34d43588b5914677c39d577a052d1b25a522be1a656860a540970f99cbc8a3adf3e2139770f664b4b7b9379e13daf7d26c +LCM = 4c715520ed920718c3b2f62821bc75e3ff9fd184f76c60faf2906ef68d28cd540d3d6c071fa8704edd519709c3b09dfaee12cb02ab01ad0f3af4f5923d5705ce6d18bcab705a97e21896bb5dd8acb36ee8ec98c254a4ddc744297827a33c241f09016a5f109248c83dd41e4cea73ce3eabb28d76678b7e15545b96d22da83c111b6b624 + +GCD = dc0429aa +A = ccb423cfb78d7150201a97114b6644e8e0bbbb33cadb0ef5da5d3c521a244ec96e6d1538c64c10c85b2089bdd702d74c505adce9235aa4195068c9077217c0d431de7f96 +B = 710786f3d9022fc3acbf47ac901f62debcfda684a39234644bac630ab2d211111df71c0844b02c969fc5b4c5a15b785c96efd1e403514235dc9356f7faf75a0888de5e5a +LCM = 6929af911850c55450e2f2c4c9a72adf284fe271cf26e41c66e1a2ee19e30d928ae824f13d4e2a6d7bb12d10411573e04011725d3b6089c28d87738749107d990162b485805f5eedc8f788345bcbb5963641f73c303b2d92f80529902d3c2d7899623958499c8a9133aae49a616c96a2c5482a37947f23af18c3247203ac2d0e760340e6 + +GCD = 743166058 +A = 16cd476e8031d4624716238a3f85badd97f274cdfd9d53e0bd74de2a6c46d1827cc83057f3889588b6b7ca0640e7d743ed4a6eaf6f9b8df130011ecc72f56ef0af79680 +B = 86eba1fc8d761f22e0f596a03fcb6fe53ad15a03f5b4e37999f60b20966f78ba3280f02d3853f9ace40438ccfaf8faed7ace2f2bf089b2cdd4713f3f293bf602666c39f8 +LCM = 1a7a1b38727324d6ba0290f259b8e2b89c339b2445cada38a5a00ded1468ab069f40678ce76f7f78c7c6f97783cc8a49ef7e2a0c73abbac3abc66d1ce99566ce7f874a8949ca3442051e71967695dc65361184748c1908e1b587dc02ed899a524b34eb30b6f8db302432cfa1a8fbf2c46591e0ab3db7fd32c01b1f86c39832ee9f0c80 + +GCD = 6612ba2c +A = 0 +B = 6612ba2c +LCM = 0 + +GCD = 6612ba2c +A = 6612ba2c +B = 0 +LCM = 0 + +GCD = 6612ba2c +A = 6612ba2c +B = 6612ba2c +LCM = 6612ba2c + +GCD = 2272525aa08ccb20 +A = 11b9e23001e7446f6483fc9977140d91c3d82568dabb1f043a5620544fc3dda233b51009274cdb004fdff3f5c4267d34181d543d913553b6bdb11ce2a9392365fec8f9a3797e1200 +B = 11295529342bfb795f0611d03afb873c70bd16322b2cf9483f357f723b5b19f796a6206cf3ae3982daaeafcd9a68f0ce3355a7eba3fe4e743683709a2dd4b2ff46158bd99ff4d5a0 +LCM = 8d4cbf00d02f6adbaa70484bcd42ea932000843dcb667c69b75142426255f79b6c3b6bf22572597100c06c3277e40bf60c14c1f4a6822d86167812038cf1eefec2b0b19981ad99ad3125ff4a455a4a8344cbc609e1b3a173533db432bd717c72be25e05ed488d3970e7ed17a46353c5e0d91c8428d2fec7a93210759589df042cab028f545e3a00 + +GCD = 3480bf145713d56f9 +A = 8cf8ef1d4f216c6bcec673208fd93b7561b0eb8303af57113edc5c6ff4e1eeae9ddc3112b943d947653ba2179b7f63505465126d88ad0a0a15b682f5c89aa4a2a51c768cd9fdeaa9 +B = a6fd114023e7d79017c552a9051ca827f3ffa9f31e2ee9d78f8408967064fcdc9466e95cc8fac9a4fa88248987caf7cf57af58400d27abd60d9b79d2fe03fad76b879eceb504d7f +LCM = 1c05eee73a4f0db210a9007f94a5af88c1cdd2cba456061fd41de1e746d836fa4e0e972812842e0f44f10a61505f5d55760c48ba0d06af78bb6bde7da8b0080b29f82b1161e9c0b5458e05ac090b00f4d78b1cc10cf065124ba610e3acab092a36fe408525e21c0ddc7c9696ed4e48bd2f70423deecfe62cecc865c6088f265da0e5961d3f3a84f + +GCD = 917e74ae941fcaae +A = 652f8a92d96cbf0a309629011d0fbaceb1266bc2e8243d9e494eead4cf7100c661b537a8bea93dec88cfc68597d88a976c125c3b4de19aba38d4ea9578202e59848d42652518348a +B = 32e07b71979d57e8344e97c39680a61e07d692d824ae26b682156890792d8a766ee29a4968f461aaced5bf049044fba2f4120b1c1f05985676f975d4582e9e82750d73c532cd07b2 +LCM = 23620c7b897dc26c7717e32f3517ac70bf09fbe08f7255ab010cf4cf946f4e96304c425043452c5d5a0e841d3a3cfd9c2d84d9256f3b5974fe3ebfa9255fe20a710d3e6511606c0d85970381101c7f4986d65ad6a73a71507f146b11f903043cfa805cc0b14d4f3072da98bf22282f7762040406c02d5b3ef9e7587f63bab8b29c61d8e30911aa96 + +GCD = 2b9adc82005b2697 +A = 19764a84f46045ef1bca571d3cbf49b4545998e64d2e564cc343a53bc7a0bcfbe0baa5383f2b346e224eb9ce1137d9a4f79e8e19f946a493ff08c9b423574d56cbe053155177c37 +B = 1bbd489ad2ab825885cdac571a95ab4924e7446ce06c0f77cf29666a1e20ed5d9bc65e4102e11131d824acad1592075e13024e11f12f8210d86ab52aa60deb250b3930aabd960e5a +LCM = 1032a0c5fffc0425e6478185db0e5985c645dd929c7ebfeb5c1ee12ee3d7b842cfab8c9aa7ff3131ac41d4988fb928c0073103cea6bb2cc39808f1b0ad79a6d080eac5a0fc6e3853d43f903729549e03dba0a4405500e0096b9c8e00510c1852982baec441ed94efb80a78ed28ed526d055ad34751b831b8749b7c19728bf229357cc5e17eb8e1a + +GCD = 8d9d4f30773c4edf +A = 0 +B = 8d9d4f30773c4edf +LCM = 0 + +GCD = 8d9d4f30773c4edf +A = 8d9d4f30773c4edf +B = 0 +LCM = 0 + +GCD = 8d9d4f30773c4edf +A = 8d9d4f30773c4edf +B = 8d9d4f30773c4edf +LCM = 8d9d4f30773c4edf + +GCD = 6ebd8eafb9a957a6c3d3d5016be604f9624b0debf04d19cdabccf3612bbd59e00 +A = 34dc66a0ffd5b8b5e0ffc858dfc4655753e59247c4f82a4d2543b1f7bb7be0e24d2bbf27bb0b2b7e56ee22b29bbde7baf0d7bfb96331e27ba029de9ffdff7bdb7dc4da836d0e58a0829367ec84ea256833fd4fe1456ad4dd920557a345e12000 +B = 1f3406a20e20ebf96ccb765f898889a19b7636608fd7dc7c212607b641399543f71111d60e42989de01eaa6ff19a86ea8fbde1a3d368c0d86dc899e8e250fc764090f337958ca493119cbb4ad70cbfae7097d06d4f90ec62fbdd3f0a4496e600 +LCM = ee502c50e3667946e9089d0a9a0382e7fd0b75a17db23b56a0eec997a112c4dbd56d188808f76fe90451e5605550c9559ef14a95014c6eb97e9c1c659b98515c41470142843de60f72fb4c235faa55b0a97d943221003d44e2c28928f0b84bf071256254897ed31a7fd8d174fc962bc1311f67900ac3abcad83a28e259812f1ee229511ab1d82d41f5add34693ba7519babd52eb4ec9de31581f5f2e40a000 + +GCD = ef7399b217fc6a62b90461e58a44b22e5280d480b148ec4e3b4d106583f8e428 +A = 7025e2fe5f00aec73d90f5ad80d99ca873f71997d58e59937423a5e6ddeb5e1925ed2fd2c36a5a9fc560c9023d6332c5d8a4b333d3315ed419d60b2f98ccf28bbf5bf539284fd070d2690aeaac747a3d6384ee6450903a64c3017de33c969c98 +B = df0ac41dbabce1deeb0bceb1b65b1079850052ecf6534d0cff84a5a7fb5e63baee028d240f4419925154b96eaa69e8fbb1aae5102db7916234f290aa60c5d7e69406f02aeea9fe9384afbff7d878c9ac87cd31f7c35dff243b1441e09baff478 +LCM = 687669343f5208a6b2bb2e2efcac41ec467a438fde288cc5ef7157d130139ba65db9eb53e86a30c870bd769c0e0ab15a50f656cd9626621ae68d85eaff491b98da3ea5812062e4145af11ea5e1da457084911961ef2cd2ac45715f885ba94b4082aa76ffd1f32461f47c845b229d350bf36514c5ce3a7c782418746be342eca2721346ade73a59475f178c4f2448e1326110f5d26a0fef1a7a0c9288489e4dc8 + +GCD = 84b917557acf24dff70cb282a07fc52548b6fbbe96ca8c46d0397c8e44d30573 +A = 81dbb771713342b33912b03f08649fb2506874b96125a1ac712bc94bfd09b679db7327a824f0a5837046f58af3a8365c89e06ff4d48784f60086a99816e0065a5f6f0f49066b0ff4c972a6b837b63373ca4bb04dcc21e5effb6dfe38271cb0fa +B = 1da91553c0a2217442f1c502a437bb14d8c385aa595db47b23a97b53927b4493dd19f1bc8baf145bc10052394243089a7b88d19b6f106e64a5ab34acad94538ab504d1c8ebf22ac42048bbd1d4b0294a2e12c09fe2a3bd92756ba7578cb34b39 +LCM = 1d0530f8142754d1ee0249b0c3968d0ae7570e37dadbe4824ab966d655abf04cd6de5eb700eba89d8352dec3ae51f2a10267c32fbd39b788c7c5047fe69da3d7ad505435a6212f44899ba7e983bb780f62bcdee6f94b7dba8af7070a4cc008f351ae8be4579bc4a2e5c659ce000ad9c8cdc83723b32c96aeb0f5f4127f6347353d05525f559a8543cd389ad0af6f9d08a75b8c0b32419c097e6efe8746aee92e + +GCD = 66091477ea3b37f115038095814605896e845b20259a772f09405a8818f644aa +A = cedac27069a68edfd49bd5a859173c8e318ba8be65673d9d2ba13c717568754ed9cbc10bb6c32da3b7238cff8c1352d6325668fd21b4e82620c2e75ee0c4b1aff6fb1e9b948bbdb1af83cecdf356299b50543b72f801b6a58444b176e4369e0 +B = 5f64ca1ba481f42c4c9cf1ffa0e515b52aa9d69ceb97c4a2897f2e9fa87f72bae56ee6c5227f354304994c6a5cc742d9f09b2c058521975f69ca5835bce898cf22b28457cd7e28870df14e663bb46c9be8f6662f4ff34d5c4ae17a888eba504e +LCM = c163cb28642e19a40aa77887c63180c2c49fc10cda98f6f929c8131752ea30b5283a814a81681b69b9d1762e6c1a9db85f480bc17f998d235fd7e64c1caa70ef170c9e816d3e80f516b29f2c80cfb68bf208b4d5082ef078da4314b3f20c7d6c54b0aeb378096b029a7b61c0a4cd14aeddc01004c53915a4f692d2291752e5af46b23d7fa6dd61f2d56c6f4bf8e6119688abac8fd7aba80e846a7764bb3fca0 + +GCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 +A = 0 +B = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 +LCM = 0 + +GCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 +A = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 +B = 0 +LCM = 0 + +GCD = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 +A = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 +B = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 +LCM = bb80bf51757ba696c700fa4e4c0132b3151d2bf9ebff8382f808ded78be67182 + +GCD = 120451d8307219aa0c96f328ad653ccd462e92423ca93ed8a3dde45bf5cb9b13cdaf9800e4d05dd71c4db6a129fb3280ee4ec96ec5297d881c1a8b5efccbd91fef21f5c5bf5fba42a4c8eaa358f620a074b7a17054527bdaa58d5acaa0dfdc48ecba1a10ebf4d57bb4215de406e6be13fed3fe493b1cd1e2d11a8d4ac03c47756 +A = 3f8179a8e1f0b342475a855c3e1bae402dd41424cf24a0b4d2e263c8efb08bde7d92eae8607fb5e88b1378f0f1bd0733f229a35be6b1383a48d32749d5d6b32427d26323b7ab05bb5781289e96bfbc21971439319b15f6c0fe93fdb35d0b67ec41443c59a081dd3cef047ac797fccb45bece84c0bb0bb7e1797259526d8ec9cc63ba4d32cfc692ccd3d243cb2b53ac216312f3a8e8c0daa09d21b6150d697639a5e52059414a417c607be8ec0eee2e708219cadbaf37a369c4485b01ed87bbc2 +B = 2c474e396a2dd9cd10b9d7313f69d3b4ca123e9fd853edd488339236d14c56453a1381958864a04d2624e81995dabcdd0ccf60db9917813f887de68da075d0ea4440001e18f470e43b38ee3440b49be651d709fbdef980e3e4149913f4ae2681124f54523f4881376ddb533b5219e804cc26f4c2e577be4e02613c4da80ba1215775b0a5178a965ad47bd2befb32493943ded1004ef66347b4983f8d1ba990d4a943505dfce6debcfb322842ed88106cd6dee9aa592ff0d2274bc727a6e1f14c +LCM = 9c129cf649555bfd2d3d9c64dc6d6f022295e53bca5d2f218adaa66aa60eb4694429b7e83bf81b6df4459c5104023ab9a33f006ffcd8114507baa17e2ef6fe23ebdd4740f66879033da2041f2cb7ba517ad3526ffe75614ea9432c085f71b2d65a736bac7ba42b639e330b82733372083843dcb78b6a273ab20e0d4b7c8998a14048aa15bb20a0a0bd997917107274c89b4cec175fb98043d52e6c555bd9e0036566d052a6d4e7e276d1e8835e1f06e3ca46d47747ba586e95fb1a790d992834b7c3e136141eb8a434e6c12067246ac3c0a81c69e03b1ed28aa0b3173d6eff83d278c2f461a47a416f3f9a5dae3bb410fd18817bd4115e7f1e84b936cc02364 + +GCD = 95aa569a2c76854300d7660847dd20fe0b8c445fdbcaa98465cee61aee76ad6a438e75a8c573198570ffb62bc07ec3a2be0ae0a1f631670fa88d6f75f3161e8b9a4d44b6801ffc884c7f469c5ed1f27b1edecce9f2977f9e92d1a3b230492fea7e6f2af739dc158a7fbd29856cbedb57b4119e64b27ab09eb1c2df01507d6e7fd +A = 4c653b5bfec44e9be100c064dffe5d8cd59b0cf4cc56b03eabb4ef87cfda6506c9a756b811907fe9d8b783eb7a0b9e129773bf1da365ddb488d27b16fb983e89345d1ccdb4f06a67a11925c3f266373be5d7b0075189c6f3c2157e2da197058fe0a7bcc50adc34e99e254a29abbe2d5948d3157e1b0c3fca3d641760f7b9862843b63abef0b3d83fd486f4526b30382fda355575da30e9a106718a3921774c4d69f5311f8d737fe618f5236b4763fe1b2ee7f13184db67367d3903c535ff6d7b +B = 2dcca83c99a28e9fd2f84e78973699baf2f04fd454094730948b22477834a0064817b86e0835e6d7b26e5b0b1dcf4ad91a07ac0780d6522df1fcac758cf5db6c2a5623d7c0f1afefd5718f7b6de639867d07a9ec525991304e9355d1635104bea837f74758d6aa2aab4e4afbb606af1d98de7417505e4710cd0589bdff9a0bf38a857cc59a5f1781043e694fc2337fd84bdeb28b13a222bb09328a81ec409ad586e74236393d27398cc24d412135e34247c589149e134b97f4bd538ac9a3424b +LCM = 1760c0b0066aa0695767099e87e9388729ea89b8e8c36bddcd04d257591e741613c07b0e69447c0a468c33a745084171e06523d987d8db40a1433bf435325e8a724a0876503b34495170ff3671d42117a2e4f3a75b1d9dd809a34fa0fb26fe50d84f80a9b02e40190e5efb927a5a61a03f13edbce2e666af6c3a2a9bcb84e47e3090008753ff27c4b8cf06480f471379a93f5230923623a83b286b71a555cd5e5347282f664ed90b14b2c4de84a70375e488211a7b3931119ef3bbe029b712389fe784818a0bf29d80733ce9cc940c547aa1eb3f06d492eb676bf37802283c82ce76156dfaab5c2d5107e08062681b5fa169f6eb68e1ab8bd9b2005e90bd4fd + +GCD = 244b9b1290cf5b4ba2f810574c050651489f2d3a2b03e702b76ebfaf4e33de9bbe5da24c919e68d3a72eadd35982b3a89c6b18b38ff7082ac65263e52b6ec75a5717b971c98257b194c828bff0216a99536603b41a396ea2fb50f5ea7cf3edf10bb0d039123e78593ae9ffcbbba02e51e038533e83b6bc73c70551d6467f39809 +A = 41a0b1310669500681cdf888836f6c556758750f562d743ac780dd4c0d161856380e44fdbb1f8a2786bf45be6b0e7f1cb2cd85f6b9e50acc72793d92383c7d7fb796fc74d32e8fac8225bdc19ae47546d9c9c75f5f06ca684f07daccaf89ccf2cddeb7ec255d530c7dd1e71daf44cafdc9d30fbcb1cbaefae3480585f79f4177e3834a5bc91845e2e8cd8aeb27f484e5e5b2c3c076dbb6c23e91303f0a0fdde83cd33a8ea6ed1549e727b4d766c1017c169710fd98e1585d60f66e121f9180b3 +B = 251f5aeaa60b3959285f49540cdaf8e21451110bbddb9933bbbcaea3112f4eb45e435a3ba37c52d2ab79ce997a8f6c829b3aa561f2852924b8effb52396d09d2bf257ebb4fb56c7aa25648f69b06d2cd01e876c9f9c0679de9e6fffa79eb7e603723e5af7de46ee405a5a079229577b5b6fffb8d43e391fe6f4eb89638e64d6eff8026249aaa355a91625eb0bfd14caa81e4c3586aaa2e94fde143a44f223a91e226661d12f55dfcdb4215e5a64e14e968005733be6a71c465de312ca109b34a +LCM = 431f918b274f3e43f446e4e85567883d6536a0332db662cef088f5a36b0f4b68372048174ba10fee94b9f8f1c2e189c974be2e6e8ae8e2ae108445326d40f63e38d8d4e2e46174589a3cbc9583e0036dc8146e79eee9e96f4436313b3f143dd0f5aceab05243def7f915169c360f55ef123977cf623c5ba432c3259c62fb5e37d5adab0f24b825aa4ada99ec4e83e9ca4698399e1ed633091ce5f9844c540a642cd264201116ed4168aa2105a5159f5df064f845830c469140f766c7319052ce59bd1ad7c3f2d8c30e54f147f6aeb5586c70c984302ba18d854a60aec01b394c7d66fa33fe18fe4a8cfb3238df219294e6e42190a30d28b10049a1b75853a4e + +GCD = 206695d52bc391a4db61bf8cb6ea96188333a9c78f477ee76976c2346dad682cf56ca6f176d86ef67d41ff5921b6162b0eca52359975872430dd14c45643eacdf028d830770714c033fd150669705851b2f02de932322d271d565d26768530c3f6cb84f0b3356f970b9070b26c050ead0417152c324c8ffe266d4e8b5b7bef3a +A = 1114eb9f1a9d5947eb1399e57f5c980833489685023ed2fe537fe1276c1e026b9a19e6fff55aa889d6c4e977b6e6f3111e2ad463138637b50f42cf32e57d83f282de9e72f813e5969195159a666d74dcd689bd527c60199ae327f7bd548ac36868fea5fdf6f35d19b921e7c10b6448ca480de6826478cd0642d72f05af3f8e65ce42409fbd49f56e81946e89c8e83962c4edc0ed54600600a305e52d081aed3c351e450e11f8fb0ce5754c92cf765b71393b2b7a89c95df79b9ea1b3cb600862 +B = 1d8f3179ca7b5cc7119360c10de939ffa57c9043da2f2b0ca3009c9bdad9f19ed16e3c2c197bef4b527fa1bf2bbab98b77e26c329911db68bd63d3d0fbfc727a977395b9ad067106de3094d68e097830858c5ccfa505fc25e972bdee6f347e7d1163efacd3d29a791ec2a94ffeed467884ae04896efc5e7e5f43d8d76c147e3c9951a1999173bc4e5767d51268b92cc68487ba1295372143b538711e0a62bf0ac111cc750ca4dd6c318c9cbe106d7fc492261404b86a1ba728e2d25b1976dc42 +LCM = f9570211f694141bfb096560551080cbe02a80271b4505591aaea9e3b99ea1d5ac1c1f2378fd72799e117ac2a73381b1ad26314e39972164d93971479ee3ba21a4d98cef0bd299d540ce5826995dcee0de420dff73d30b23cbf3188c625c7696df517535bc5675d71faa00807efbebdca547933f4a37849d1c014484a77da6df0670c4974bcc91eb5f5fe5faf9dd095ef195ec32ad9eeebf0e63288b4032ed9e70b888afc642f4ff96f0b4c0a68787301c12e4527fe79bdfe72dd3844ab5e094a9295df6616f24d1b9eeebc2116177dacf91969dda73667bc421ef3ccd8d5c23dddc283f5d36568d31f2654926be67f78e181075bdc148f2b39c630b141ae8a + +GCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 +A = 0 +B = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 +LCM = 0 + +GCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 +A = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 +B = 0 +LCM = 0 + +GCD = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 +A = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 +B = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 +LCM = 3d319c42d872f21131ce5ff3ab8bec94339308e620316dda218e85fedcd511cd62f0b2f3448d5e58fd3520ae8118abd54ead9ad9e8ec3890365c6b2cca2172d4b8839b2d2c5ab02f65180826cb0cd5c9798f5d6261efe6e6ec31dea047da7c486b0590359e6f333557f67ceebf9ea9cd5dd986a999a8c88bdbd0ca21816b2423 + +GCD = 2 +A = 14e95a85e59ade9ef39e2f400c65db18702fa5fc485b9bba479a5282b2206129160e54f73ef4917983c17b4c5ebff7be112a886de069706eee29ba902515cb038 +B = ddcfff1d39c90c599f55495bf71c1e7597c6b08b7430707f360c6a6e5137bbc7b403c6d9e2c34f3d2f29d5d32b869346853c2de239cc35381bdfb4a01569211a +LCM = 90f38564ee72e55d362c04599e7d74f068c75f541b84e97abba2841f1a9f66b06b5c9009f6a4c2e319fced85270588de03ccebddbd9279aaecb13bdc1dbea7f42acaee751cb7da83779b8785cc86f41b94b13b54964208ca287d981634778d1096f20e76ca636c0717fd27e0800c43f599a5eded807421b502eaf9990a8c8ed8 + +GCD = 4 +A = 3c719c1c363cdeb7b57c2aabb71f425da4c3e6d3e447204d555e7cf0f3d372bdda906f36078045044978dafc20171767c8b1464d52dfdf3e2ba8a4906da033a8 +B = 30fe0ef151ac51404e128c064d836b191921769dc02d9b09889ed40eb68d15bfdd2edea33580a1a4d7dcee918fefd5c776cbe80ca6131aa080d3989b5e77e1b24 +LCM = 2e4526157bbd765b0486d90bcd4728f890bc6dbd9a855c67ca5cb2d6b48f8e74e1d99485999e04b193afca58dbf282610185d6c0272007744ff26e00dbdc813929b47940b137dc56ba974da07d54a1c50ec4a5c2b26e83f47cf17f4ccce8c3687e8d1e91d7c491a599f3d057c73473723ce9eee52c20fe8ae1595447552a7ee8 + +GCD = 10 +A = 44e04071d09119ea9783a53df35de4a989200133bb20280fdca6003d3ca63fdd9350ad1a1673d444d2f7c7be639824681643ec4f77535c626bd3ee8fa100e0bb0 +B = ca927a5a3124ce89accd6ac41a8441d352a5d42feb7f62687a5ebc0e181cc2679888ecc2d38516bdc3b3443550efccac81e53044ae9341ecace2598fe5ce67780 +LCM = 36805ba9b2412a0cb3fe4ed9bdabfa55515c9d615a3d0af268c45c5f6098d2de4a583f3791f1e3883c55d51ce23c5658fd0e8faa9a3709a1cfbd6a61dbab861690f27c86664f084c86cfd4a183b24aaadf59a6f8cbec04f1b0ded8a59b188cb46ae920052e3e099a570540dbc00f7d4a571eef08aa70d2d189a1804bf04e94a80 + +GCD = 100 +A = 73725032b214a677687c811031555b0c51c1703f10d59b97a4d732b7feaec5726cb3882193419d3f057583b2bc02b297d76bb689977936febaae92638fdfc46a00 +B = 979f4c10f4dc60ad15068cedd62ff0ab293aeaa1d6935763aed41fe3e445de2e366e8661eadf345201529310f4b805c5800b99f351fddab95d7f313e3bb429d900 +LCM = 4460439b4be72f533e9c7232f7e99c48328b457969364c951868ceab56cb2cbbeda8be2e8e3cae45c0758048468b841fdb246b2086d19b59d17b389333166ab82ed785860620d53c44f7aaaff4625ee70fb8072df10fb4d1acb142eadc02978ff2bb07cea9f434e35424b3323a7bda3a1a57aa60c75e49ebb2f59fb653aa77da00 + +GCD = 100000000 +A = f8b4f19e09f5862d79fb2931c4d616a1b8e0dd44781ca52902c8035166c8fca52d33a56ff484c365ec1257de7fa8ed2786163cfc051d5223b4aad859a049e8ba00000000 +B = 6e54cb41b454b080e68a2c3dd0fa79f516eb80239af2be8250ca9cd377ba501aabafc09146fad4402bdc7a49f2c3eec815e25f4c0a223f58e36709eefd92410500000000 +LCM = 6b3020a880ddeff9d17d3dc234da8771962de3322cd15ba7b1e4b1dd4a6a2a802a16c49653865c6fdf6c207cbe0940f8d81ef4cb0e159385fd709d515ee99d109ad9ad680031cbae4eab2ed62944babdade4e3036426b18920022f737897c7d751dce98d626cdda761fec48ad87a377fb70f97a0a15aa3d10d865785719cc5a200000000 diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/miller_rabin_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/miller_rabin_tests.txt similarity index 100% rename from third_party/boringssl/src/crypto/fipsmodule/bn/miller_rabin_tests.txt rename to third_party/boringssl/src/crypto/fipsmodule/bn/test/miller_rabin_tests.txt diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_exp_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_exp_tests.txt new file mode 100644 index 000000000000..a6cf6f4e64f3 --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_exp_tests.txt @@ -0,0 +1,775 @@ +# ModExp tests. +# +# These test vectors satisfy A ^ E = ModExp (mod M) and 0 <= ModExp < M. + +ModExp = 00 +A = -01 +E = 01 +M = 01 + +ModExp = 01 +A = -02 +E = 01 +M = 03 + +ModExp = 01 +A = -01 +E = 02 +M = 03 + +ModExp = 01 +A = -02 +E = 02 +M = 03 + +ModExp = 00 +A = -03 +E = 02 +M = 03 + +ModExp = 02 +A = -04 +E = 01 +M = 03 + +ModExp = 01 +A = -04 +E = 02 +M = 03 + +# Regression test for carry propagation bug in sqr8x_reduction. +ModExp = 19324b647d967d644b3219 +A = 050505050505 +E = 02 +M = 414141414141414141414127414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 + +# Cover the E = 0 case for small numbers. +ModExp = 01 +A = 86b49 +E = 00 +M = 30d26ecb + +ModExp = 00 +A = 00 +E = 00 +M = 01 + +ModExp = 208f8aa0 +A = 86b49 +E = 2 +M = 30d26ecb + +ModExp = 27308229 +A = 17591bb +E = 6 +M = 30d26ecb + +ModExp = 2bdf498f +A = 21292626 +E = d +M = 30d26ecb + +ModExp = 11317167 +A = 4a655df24 +E = 10 +M = 30d26ecb + +ModExp = 2e1b88e +A = da6b761a86 +E = 35 +M = 30d26ecb + +ModExp = 20a12ec3 +A = ea811 +E = 2 +M = 23bc042f + +ModExp = c42ced +A = 1011a6a +E = 4 +M = 23bc042f + +ModExp = 4637d79 +A = 28d9a601 +E = 8 +M = 23bc042f + +ModExp = 20e5669b +A = 72fe6bc20 +E = 11 +M = 23bc042f + +ModExp = 142ab9e3 +A = 9a07b9363c +E = 29 +M = 23bc042f + +ModExp = 14c64646 +A = 822df +E = 3 +M = 30915765 + +ModExp = 160e35a2 +A = 15ea542 +E = 5 +M = 30915765 + +ModExp = 2f23a488 +A = 34d2e02e +E = e +M = 30915765 + +ModExp = 28e67f93 +A = 636a32703 +E = 14 +M = 30915765 + +ModExp = 29bfeaa5 +A = c8646998e6 +E = 2c +M = 30915765 + +ModExp = 30959e22 +A = 81dad +E = 3 +M = 326dd68d + +ModExp = 1a1da4fa +A = 116adb9 +E = 5 +M = 326dd68d + +ModExp = 272bf0d8 +A = 2d21ef08 +E = 8 +M = 326dd68d + +ModExp = 29f5054b +A = 76989850a +E = 16 +M = 326dd68d + +ModExp = e6c7b77 +A = b88ee70d2a +E = 3e +M = 326dd68d + +ModExp = 369605e1 +A = cf26f +E = 2 +M = 3ce082eb + +ModExp = 168a3c5d +A = 1f82caf +E = 5 +M = 3ce082eb + +ModExp = 125c4bb8 +A = 2e9c4c07 +E = 9 +M = 3ce082eb + +ModExp = 1c5fe761 +A = 523ab37f1 +E = 14 +M = 3ce082eb + +ModExp = 21703009 +A = dc832165e8 +E = 20 +M = 3ce082eb + +ModExp = 1228d1e +A = a5555 +E = 3 +M = 24665b27 + +ModExp = 5226af4 +A = 1077bd6 +E = 4 +M = 24665b27 + +ModExp = 1b14eac1 +A = 2db3a834 +E = f +M = 24665b27 + +ModExp = 161727bc +A = 6bd962cb6 +E = 19 +M = 24665b27 + +ModExp = 10d61d0d +A = c10caed407 +E = 28 +M = 24665b27 + +ModExp = 233da406 +A = b125f +E = 3 +M = 33509981 + +ModExp = 24032799 +A = 1656b7c +E = 6 +M = 33509981 + +ModExp = 129ecebe +A = 2e671504 +E = a +M = 33509981 + +ModExp = 20c20bac +A = 4d7a2de44 +E = 1f +M = 33509981 + +ModExp = 2e3ce9d3 +A = c53b3def4d +E = 31 +M = 33509981 + +ModExp = 12fadfd6 +A = b4cf8 +E = 2 +M = 36e9d4ae + +ModExp = 457ac85 +A = 1b1c7e9 +E = 7 +M = 36e9d4ae + +ModExp = 31debef4 +A = 3a973028 +E = d +M = 36e9d4ae + +ModExp = 2333ad93 +A = 552b97c45 +E = 11 +M = 36e9d4ae + +ModExp = 99ba1fb +A = 8bfb949cbb +E = 28 +M = 36e9d4ae + +ModExp = 27b691de +A = 93492 +E = 3 +M = 298fdb16 + +ModExp = 3c2b70f +A = 14e7b0d +E = 4 +M = 298fdb16 + +ModExp = 1486cda7 +A = 29acff81 +E = c +M = 298fdb16 + +ModExp = 11725275 +A = 507489205 +E = 13 +M = 298fdb16 + +ModExp = 24d14627 +A = e71c55606d +E = 35 +M = 298fdb16 + +ModExp = 222b8d14 +A = 9b1a0 +E = 3 +M = 3db59d12 + +ModExp = 3b8bd47d +A = 13f4e8d +E = 7 +M = 3db59d12 + +ModExp = 17e72356 +A = 334774ce +E = a +M = 3db59d12 + +ModExp = 306447ca +A = 47079ddd2 +E = 12 +M = 3db59d12 + +ModExp = 90bef3b +A = a75d62616d +E = 37 +M = 3db59d12 + +ModExp = 1 +A = cddd44f47e84b3276cc36a5c0d742cc703e61c4756168601fbb1b6eb598c161019562344dd56ab6f603d920a12c360b285e6496a3605a2f8d691c3598233ee9366b5f2692554893bdeb67b7bdaf35ab7273ac593145e26bed82c70ba5793bf4bc5cac4c80b01785d1496beede493806e4f4aa89fd8d41de80dd6d0a3e2742678 +E = 0 +M = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb + +ModExp = 0 +A = 0 +E = 8de689aef79eba6b20d7debb8d146541348df2f259dff6c3bfabf5517c8caf0473866a03ddbd03fc354bb00beda35e67f342d684896bf8dbb79238a6929692b1a87f58a2dcba596fe1a0514e3019baffe1b580fc810bd9774c00ab0f37af78619b30f273e3bfb95daac34e74566f84bb8809be7650dec75a20be61b4f904ed4e +M = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb + +ModExp = 5150fb769d5c5d341aaf56639a7bcc77c415fe46439938a2190283409692f29cd080bfe3433005d98d24718a03a3553c8560c5e9c8ed0f53b8945eb18290e1c1a83d919302510f66dd89b58acc2de79ad54b8a30d3e1019d4d222556beefca0821b094ecf104b5e4cfce69d2d520d2abf54f3e393d25ed3d27e8c2e3ca2e5ff9 +A = ead8c5a451541c50cab74de530c89376d9a55c723e0cac3c84b25f0093c08a2961e49ab48966361c42c9f99111587252d98395b76788400d75c66ef208ea2767a28d6f8dc3a859f39c95765d57f139e7fc14f47c908c62df051e7216d379f52028843b4d82ef49133cce8fe671ae179423ac8da5be43b01caaf425cd969300cd +E = 8de689aef79eba6b20d7debb8d146541348df2f259dff6c3bfabf5517c8caf0473866a03ddbd03fc354bb00beda35e67f342d684896bf8dbb79238a6929692b1a87f58a2dcba596fe1a0514e3019baffe1b580fc810bd9774c00ab0f37af78619b30f273e3bfb95daac34e74566f84bb8809be7650dec75a20be61b4f904ed4e +M = c95943186c7567fe8cd1bb4f07e7c659475fd9f38217571af20dfe7e4666d86286bc5b2bb013197f9b1c452c69a95bb7e450cf6e45d46e452282d5d2826978e06c52c7ca204869e8d1b1fac4911e3aef92c7b2d7551ebd8c6fe0365fad49e275cc2949a124385cadc4ace24671c4fe86a849de07c6fafacb312f55e9f3c79dcb + +ModExp = 1 +A = 935561297d1d90255aef891e2e30aa09935409de3d4a5abc340ac9a9b7dce33e9f5ce407f3a67ec30e0dc30481070823f8542463e46828d9cafb672a506d6753688cbad3d2761079f770c726c0b957071a30876c4d448e884b647833befbcd6b582787bf769d63cf55e68c7b869a0b86374f8920516cf5d528f348b6057450a1 +E = 0 +M = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061 + +ModExp = 0 +A = 0 +E = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d +M = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061 + +ModExp = bbad67352704a6321809f742826bf3d1c31c0ad057bf81432abeb30dc9913c896c03e69eb1cde6b78ffcb320c4625bd38ef23a08d6c64dc86aec951b72d74b097e209ce63092959894614e3865a6153ec0ff6fda639e44071a33763f6b18edc1c22094c3f844f04a86d414c4cb618e9812991c61289360c7ba60f190f75038d0 +A = 855144760f2be2f2038d8ff628f03a902ae2e07736f2695ec980f84a1781665ab65e2b4e53d31856f431a32fd58d8a7727acee54cc54a62161b035c0293714ca294e2161ea4a48660bf084b885f504ad23ea338030460310bd19186be9030ab5136f09fe6a9223962bce385aaaf9c39fe6ed6d005fa96163fe15cdfa08fc914d +E = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d +M = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061 + +ModExp = 1 +A = 9d92629c1ab181c50c31619e8acd0d235a1f5fc7a0bef4d4fd54b4f1968d45921f8522efe88e69c6c14c576c564592b9feb00d1554b88b038934eaf4a8ce81a2582732387490181ef158360c8b2d9ccb326ffe043f776a50cb8202837f08ca743b562eefa007150ab7012c341b16248478d4775c02ad71ea13d5e82b71e2d600 +E = 0 +M = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b + +ModExp = 0 +A = 0 +E = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b +M = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b + +ModExp = 24eaead5b57883c2f454928f8edd470a344bfe07a953194f7d635d705ef13ddfc64140c8ad6f363d4c828e7c7891a6b6d4df37335de4552c319dafd1c06d1f743240082a3535df4da1475d3eea3fead20e40815fd5a0876c881c162ab65a1eda494280c258901ca953d1d039a998bf0e9aa09273bbef4865f3054663b72d75ff +A = a31618b4532f53729ba22efb2221432fab1dbb70853d6a1159b42fd19fc949965c709b209de106a652aa422d88922ce51dae47f7f6deaf0055202e13db79ee84fc3d3c6f4c003ef96597c49d6895fa53c22ac9e4819f7048146b5272f6279424fdb389819a0b251c823c76f4bebf4f1246de455aafe82a0d34454f5039e90839 +E = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b +M = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b + +ModExp = 1 +A = a8558e7f455b27c0c46d7d0862eb409cdefbeca945e0284b5bf425b7ac0f3d316bc365594cc1639decffc621214d61479bc75135120d4ac09ea8b742ad7ec1822091b62b1c6f564fe5e2f4f5b7def92cbaaa9a898549207ab01b91c2324fbd306a87f7d6379b6fb6493c5fca76729767f136120da9c90bdc7d364f7d242d5acc +E = 0 +M = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f + +ModExp = 0 +A = 0 +E = a5524b41dfc6b570df1d8f6633ac7777c1131abe3a99c6166b0d29d3b8883c41b00a0c53cdd6f42820bf05c810b6ec53e77a8c1b9344ea0c91d4f410a2f204c369f3db33bf8c88217fc2cf802a9d9bce8119242d8e781875b85431be170076498c0963574ee423551aec9557e2fc672ab1ab5d0cbb1c400535df9481e7934d8f +M = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f + +ModExp = 292f0b39ca0f1c850b1a00cffd2d54924fcd5fc7e7504c9d593e6c0ff74760b1f4bdd81679fe06c50248336f3108c593fa111072ee87d0fcc89a63243a1dc89044503663eee9bc18f51c3e0193d9108303e12ac90ff78f6ec752a4386af09c42db524a7cbe9a3d4fcccd56c34d283bcc9debc17158b5fe8df0c1888a9841bf8f +A = b4fde2908745ff92cc5826a27dcfdda09e8fffee681844fa4c7f1354d946d5d84e0e0c7a4a4cb20943d9c73dd707ca47d796945d6f6b55933b615e2c522f5dfc33e0652917b4809bab86f4fa56b32b746c177764895492d0a6a699812b2827fe701d40ef7effd78ea8efe1cac15ff74a295a09614bf04cae1a5017872ba22efe +E = a5524b41dfc6b570df1d8f6633ac7777c1131abe3a99c6166b0d29d3b8883c41b00a0c53cdd6f42820bf05c810b6ec53e77a8c1b9344ea0c91d4f410a2f204c369f3db33bf8c88217fc2cf802a9d9bce8119242d8e781875b85431be170076498c0963574ee423551aec9557e2fc672ab1ab5d0cbb1c400535df9481e7934d8f +M = 88f3c87ac5e3272a21b8a858da640d6939fb8113a95412c38663a0f352686d69a5d7927e60b484b9fcb8ef12978fe25ff2ebc9b61c5450e04222ef20ba3cbbdc5ec45581ce0f58e10be7bb9de7fa08752303a7a1db23b2ac9c6692ec63bf09ecd6639e06c5491ba568ea886620d71da32d329615f0e1443a75d09ae35b8a2d7f + +ModExp = 1 +A = e2845c572b46496ac158a731f612fd40ef626fa7134755c25b1b7614f4d7b29164e6142ddb7985e4c7ebc575855ff901e95927fe98a5aea2ad3a4720c75782323bea1518b2c57790f44efd9411be4e95b3896bad1e73c59658290b309e5a7eb5ef8be08125063e57336b80f17eacee88966d12bbaaa15a25929c82e027cf696f +E = 0 +M = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d + +ModExp = 0 +A = 0 +E = a55703a72ca3f6074b939ed3d748196a684a3c8e411c2b39a9beb98993b6eb7ea3fa16f41bc5b5c3710b91c0fc74a8072793052f872f61695db3a2df872eaa427a110f1a8d568c85d58bd350d0df8eced7a10be80f7567360c1a8047b9c44aa2967cd0d9dd2caea2c1492358c2db4f0214da343fdf2e34272865dc5c63be2ae4 +M = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d + +ModExp = c90e4c69df92e26549b016950b59080947f5403430698e128477782480dd70be96bed2b9042dd8c708eb432e02710555b97af11ce6fa9b53395022851c32d1f53f04237fb0763563b440ca6e81a50d909d907d9c26b7d3c420dbf88f7dadd488666848135f8cdc608dcfb0691989289fb54379c2e84c262f9765f68c012ca1b9 +A = 882ea1b9b6c79a3b1bdfd284658cb6227ad825e0178cab713c7413c2ec34f03cfaec470c4f5c521f5e9899a2123878ff0f5b36a4196c08ad1b04d03746c4bfb5d126f5eefbfe172627d6732710a8ac8890cedbd4fdef69a19f2b3253a5aa0e5dd5484f72d59b17bdd1dad3db209a3ab839368ed3975069685911d7b35e41a9e6 +E = a55703a72ca3f6074b939ed3d748196a684a3c8e411c2b39a9beb98993b6eb7ea3fa16f41bc5b5c3710b91c0fc74a8072793052f872f61695db3a2df872eaa427a110f1a8d568c85d58bd350d0df8eced7a10be80f7567360c1a8047b9c44aa2967cd0d9dd2caea2c1492358c2db4f0214da343fdf2e34272865dc5c63be2ae4 +M = cf0dee80177869a532f0c6c3a0bda3aad79bdb6b70b6c227b32d75c26e394a90c1f2a6c2bb841ba9f6556b15654a79d8b1dd0c90709a093497bf40be0807cdbb378a74de5893c25067224d3ea8d37387ed6c4a981138853cb89caa9ce6cd0f6a1e95de24d558e90960f93844db4d01e372650350d45a9d34a36042b4d4b9e78d + +ModExp = 1 +A = d7a99e65b8af86b1c51d851f0447e43cd4f343cb0ada7236283e69aa7ebd383826acc9809e5dbc4002d0f2430022cb026458189db3805ce2de1142a31ba71a6c064ab51f0059eb4b931b8bcbaef023c38d57aa5f3e14f5df77e547fc028702071b58bd57338be1e1e4f98d3553484e4de359cefa29c5f58d3fa5d823f389dbef +E = 0 +M = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d + +ModExp = 0 +A = 0 +E = 95793fe33696f53e37498b2b65aaf27079e27acf1da97dda2c3e0803e8a02139f574e04ee03f7d1ddd029f528e3f3644515ad6f10f0beac2767f23d9cd8a8b9b6c6e376e36b64a0ae2711d7d31a5a75011641935b503110edbefe9f0ff2da27b5c5f6bb8cc151fdc86f67191bb99160c6cacc86ca368d5bdfafd3f3ff5161b1e +M = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d + +ModExp = 186c50ae259aa0fd31859cbcfea534e626a254de33956d5d719334bb32e7cf37cf199a21f079a5b90497228994d05efe19ccd8c769cd81f896286e8ae557cacd1630a928c629ecdfece29ab3697794aa707734e007318fa7029b050bb09ebbe6986187c6ca843f55266d275620b3f0fec0ad5f847ce8b314d929d128b33a249e +A = 9d5e345793faddca9867f23eeddf6816c1e837f7a2cf96fa077212514acb6be87ac01a237d8f2f1d07d27a8ddd1b0ae0d97e1bda4f205a89435017284cdedea3e407b1b940d6f52112b6359b3e86e4c83074b17c210ae2c8856b42b169b4a7a6dfa65b368a7959496cf9bb1ee93d019dbd79101830e3f5ed08604ab90890b914 +E = 95793fe33696f53e37498b2b65aaf27079e27acf1da97dda2c3e0803e8a02139f574e04ee03f7d1ddd029f528e3f3644515ad6f10f0beac2767f23d9cd8a8b9b6c6e376e36b64a0ae2711d7d31a5a75011641935b503110edbefe9f0ff2da27b5c5f6bb8cc151fdc86f67191bb99160c6cacc86ca368d5bdfafd3f3ff5161b1e +M = 8315dacf124bd473c578946347e83d1b20c750a7d9533d6215591be40bc78bcca77821f8c8f95375bbd6372515ada63d22bed2fa49bd6fabb0040c538d08db25b09d2fda02a93ab086cd1c27df93c37ee9c6a0527d089179b8f92b5dc3acf5ef1c75906fb80b03f5c2442a7a4088640f66376575ecfa4c697c1a571397ee5a0d + +ModExp = 1 +A = e6a079bdf7b0638d50b183475e9ddfd5cbdebfb29f5fae8e9be402a0bd36085737b556492ea7fb4b1000ae9ce59db66098129b757cfb29224275fdaa46b8b7eb18a93ca7d3e446dc38c734b683d7ba7927b008d993aab01f44239d3c76be76d1503908e9b5e73b36c43ae0771368b01f39c042693bd92c4fc50810f059e1b332 +E = 0 +M = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247 + +ModExp = 0 +A = 0 +E = f0460c5ca9b3a5c2d1b93c201d020dc43e1c81d1daba432e2cd310902da23eb81a5172b0b357484eb8fa2c04c270893b8198c8ad35453405dadaf05195b3aeb5ec0ccacecb4b6227ca43b27b97e240a4148a472670ed60f304302f757495fd4a91af0fe09800db0c3043a6ae213bee6703ad80523ca433d99ca0eab1e0b7c929 +M = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247 + +ModExp = 60719701a2dc0bcde281a93ce0b8421d1a718adee43c1b5d9fe9e697a48ab3db4f9f33c73cff305ab6b6c300c149b05c6b289dce4580860dc56bc59de81ac074ecebdc65aa3ca040b44e5b3c80ddba1658d78b9abbc4c77e5f171f5582e70ab4438a8e1e2f062d618c4ad09c70c73b5b5fbc9f8f0bbdf1d530a933b705f85af8 +A = e1b400cd3b1f2f1c6b437adfdb970d2c8108f1b39bdbb13582179552011c6c97cba6bff2c463212b7f62776aa3e3aff9f175990e79395e819c144350b0a23d61638d500ecc97726b098e1af334aece23a851c718612442c04eb7b3805a24cc8f5b90042145eb5e5d6a408092832b6bbeb8a621419a9282fb5c075f41c7f1fdc1 +E = f0460c5ca9b3a5c2d1b93c201d020dc43e1c81d1daba432e2cd310902da23eb81a5172b0b357484eb8fa2c04c270893b8198c8ad35453405dadaf05195b3aeb5ec0ccacecb4b6227ca43b27b97e240a4148a472670ed60f304302f757495fd4a91af0fe09800db0c3043a6ae213bee6703ad80523ca433d99ca0eab1e0b7c929 +M = 81dd561d5d5327fc5ed7c9236b5fb21ef713c6d5e36264ba65ccc801b8eb107b714aad65bb503bb1f4721c0a6f97e5ab89300f049f42a4616ae43d29c089c286687484d18629c1be1b5befbdd0b3cfc86b1d28add89df4cc5e68dac3f56f2490a9068ca9c634ec258c030ec5023baa9133fd2af32fd1112895f9da549d410247 + +ModExp = 1 +A = 9dd1e6f2d3ff24096b54e0ebf0f10e283e484a1cbafc0431adda1296ed97692f3ba99440fd4f67c96dd8bab850e1123361c99362df9ea205ff8e90d1b329459f54730992d5a360e46fcc5f5a909e691abb9a06613d6991bd7c2aa609f0d7b441d7ded0c07b8c394327672d38a905efb2d76aa3be5bb14d0c002aa37e287aee79 +E = 0 +M = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f + +ModExp = 0 +A = 0 +E = 8622c37631e428402343dccf8ed09d47b3f4201e95058910289a62707c3ce0b7113c390056cc4796cc9893e471b12cb3f63f900f3356ffd25c8b2fed6f6a7fba2c684eb241ca706c76cecbf72473d8a58c02338e40714b5610465cc319f0a529a7aa3898d9e638b247abd1380c6e8f7fa210c9f1a1a2164db6db83a6bba79436 +M = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f + +ModExp = 86fb0b8dc161c41de2adb0f3ddcc8ad49c1efd729a52793a3ac987d4011c9c1dadb18657dca718df75c8ddcc49d60f152c46ab85ae9076ee7bfd405679a7da3a5195a1bbfd7d2b998c7b135ea91f8c445cbafe1276fa502c2a85477716829a2e0d24ba02623405a3654bed8f355bc7ccdb67c3f9a01e249e358b60d7699498a9 +A = 816610e6018ca47074d55750dd16a281019dbf95dc752605794cbb8ea8d75775317ce685737859728320b529fb3b4414b40bf3a93d08d8994a21ae54682cc1c357eb529837a7b0129a0843eebd9341c9bee3a8ae30475bdbff517e885a0c9f2b6a680643bd981efb53bf9dd49f3dc3cb757e117895fb34b1b4336d9bf8384558 +E = 8622c37631e428402343dccf8ed09d47b3f4201e95058910289a62707c3ce0b7113c390056cc4796cc9893e471b12cb3f63f900f3356ffd25c8b2fed6f6a7fba2c684eb241ca706c76cecbf72473d8a58c02338e40714b5610465cc319f0a529a7aa3898d9e638b247abd1380c6e8f7fa210c9f1a1a2164db6db83a6bba79436 +M = fda6f9d8588e3614f5a68ce867a5619f6ddbb8d64450ff402e1c4f1a08b518f79dca21e5983c207c5b7324c16895a1e9f1282fc6cf60b0645f6b02b652ed5b129e67c939e854ab492dec30ea878c3edde10a4b7d1d14c57100c6cbcc5fc085a0d7308715ed132fb917251919c727487fedb66500d5610b0014a43419acfbb92f + +ModExp = 1 +A = 9edfce4691f46eadaa2043c7b1092b831ed50f3429f0bca02f985c0b77c686d951be84d772ae4b55f08935bed6e3206c8441574f215736b5c1c1b7595b3b789b55cf56db83741b10144d6767ba2b97b23a5e83504c60e06ab22834b0145655aa0463108317a379cbfc8a93de8a66925a999b8b02bf88dd85fb9898cefe9c95c8 +E = 0 +M = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745 + +ModExp = 0 +A = 0 +E = a3be10ef04535fca6784e5dbf3733d677dedd50fabbc3a860496628950b4747a328c2ce0d903cbe1e700f0af30f59fb917202257815097a2b516df5d0a82642faeffdfc3b7883766c78fc4be5901ebef891a9ca27f3bcf00960729e659bb3fddd54a19ce628e95ab86e4c7a168588bc9f67b05dd21a583acd8dc36e615945648 +M = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745 + +ModExp = 442866609915aa6f1bae9dfb59e721e1b63f42c0f75fbf0a88344120fbbd7aacf15208fb7c9d8bb8477d553cbd826d7e685ad764a8423e81c2131c040ee83a03cab8d5ce50866a941b48c78e9f1330794d908562d4141cfbf26e8c80c69551339eec41e37e2b37b54330f7bd75748f8d26d56ab9eb3b0c127540484c6445a7fa +A = 8ff65e2cbcbcd8697cc3ce9a26855d6422ac7eb4e66500648c08be697e005cc3c854a54cfab91d43489cd60be8b516a9b3c9688e5e009a1689c6b164a133859a5464ef422c86344fef42cc477c9df27768377c126a066d1b62f593b7f6d6e906feaee16addb7cfbfc043d741b7dc81a87c17f167b7b8ef1b1fb3dfd1eb14102d +E = a3be10ef04535fca6784e5dbf3733d677dedd50fabbc3a860496628950b4747a328c2ce0d903cbe1e700f0af30f59fb917202257815097a2b516df5d0a82642faeffdfc3b7883766c78fc4be5901ebef891a9ca27f3bcf00960729e659bb3fddd54a19ce628e95ab86e4c7a168588bc9f67b05dd21a583acd8dc36e615945648 +M = dcb68f6aa530ae9b31d078e2e82670adcc98228e7cf1aa59f81e66426ef14b1591b833d889463564c75b5fd5551ea295a0da581dd80f62c7008ff0f26a1c9f4f756431d48198af157149be8698336b306b0a8b8635d3fc2c4c2194ecc4d2af31ca1892917cc2e621d702eaaeed0d9a0c3dca575451eb8bc5487e313988cae745 + +ModExp = 1 +A = fe9f77f7d0475e00ec964c0effb9b8e079c32e376ce77a9c40ce4018c3df44a77b4f294d9565502b2b79accb30cb58dda6d15e1543b6d4a53296543ed11c7f51baab60283ef03fae37dfeacb431392487ec2839551a933895c4dbf18844f7b375d3e6f558d3c39993cea1bbf7fb743a6a07bd3753c03eb7298811476d7f3ff1d +E = 0 +M = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511 + +ModExp = 0 +A = 0 +E = a0bc148ed50a9b54036bb8fa1f214979052ebd47db8b347af3bb03b806bb457b468ba34781f8a25f289a7a90af4903dc14809a166df2f4c3527de2ea6911cb1afb9071a4afbb522a7d50634d66fd584c73f32d05217dc9f7f16394c68a692a953492ca85f89cc11da95fd8cac6231647923ced48a1b3b0ee68c010286d452836 +M = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511 + +ModExp = 91fd879d02f95a9f40fcd1037726f73892caf84e9b43b4aa4126d9062a0d22c464e7af2fbd91aa849612d99d9519b724a7fb1cb018fffdcff321d883ab2519953c9f174f09dd8f13ac87339887385966eb4a94842276637b2c36c0a5036b1d3bbea438bc6efd4b4851c7ec06879d60694df894717569bcd31c4b13d80df6cbca +A = cdec5edc1cb3ea974342b85aabc0f9385cf877ca328747d40dd4d297623ad69ab6582653faeed5aef225208305135cfbee32e066cb43e18afacea3a32acc8aabbc49617ac33e741651924ae56dd6aa044a12a1ea50fef573b5befb2f4b21b9cf83ab2aaa6fd153580a0761666ade8fb94f202a3c3dc4f33297eabb4564374168 +E = a0bc148ed50a9b54036bb8fa1f214979052ebd47db8b347af3bb03b806bb457b468ba34781f8a25f289a7a90af4903dc14809a166df2f4c3527de2ea6911cb1afb9071a4afbb522a7d50634d66fd584c73f32d05217dc9f7f16394c68a692a953492ca85f89cc11da95fd8cac6231647923ced48a1b3b0ee68c010286d452836 +M = e7a96cf6fa930f73c8bdc2726bbba246001a9d27f39cc2b978c99dc6f15af0e8aaf26b565302f1112e607e2df4066948baba931b89cd9bbdea2072e05b9a4968fdf282c43d997987c3a3a0434e925a679ac81f316b7a7b724b79be3d6888b66f4512759bf66cfaaa88b9513dd27a44aaea75437268a014c4eb50ba2e50093511 + +# Craft inputs whose Montgomery representation is 1, i.e., shorter than M, in +# order to test the const time precomputation scattering/gathering. + +ModExp = 9442d2eca2905ad796383947b14ddfcc341f5be8fec079135c36f6f0d9b8b2212f43e08bf29c46167ff0fe16b247cd365df4417d96cc31c94db1cf44b73b0ee3ebcc4920d9b0d003b68e49c1df91e61bc7758a8a1d2d6192ff4e1590b1a792f8be3a1b83db3ad9667d14398d873faf5d885ec3a2bef955026fae6dbf64daea2b +A = 3a4b4c57e62c5e9d1a9065191f8268fed9d5f6f424d071acef66f0662b8210f4c029ed991512e40c9c912043c816d2c4c5b53fa0e5c253e16808aad4225130dafbbb89fd4f30cdfc1c2f2179b636a7ddc4be579795820b4b9377637bd8a21a0ef5a90d0e0f865321eee23d9be2a3b7320b4012d02941b892df2c40bdc85c1898 +E = a2c56ea1362511cac0301918e15a9afe7d37edd438a5c3538d258ea01f0a6df758de07111e868b3ad8fc89b629b4955d78a1b3af902be1806410ddde25ccc6a196ba5949395c1ad5d8725b18815dc1cd5ac1c7dd17773f571e3f2e628255af14476e0494be23a4a4dfd18e23142f33d7a59c236fec61660e360d9676a747c69f +M = ede35a3a7afac817d413373a2032abbc067b1493f709ae6e1282ee5469743391d891b904938857168802b7872d3cd7ac18ab249a9e540a86f970b1d0f310a4cc29df1cc9d4063d98c554f1a32f4ca5eba3523cdfb142e0fc609907c7a92bb0187009d97ec471db3545f42dd5fd29c07b7816085d09477ba31fcf90084660116d + +ModExp = a7f5844fa9e7202d4b70ee252c9846e63d3d091b0387768ded872cec53458e19df0d9b4960226e269b8ca5dd4c4eda423a67b6dbb48235c08c12c6c7c78db47287756d3ed9cecb9232f7d18d5d80b9676cb68ba4a290c97e220beb1a069976b5e6022a4c1e5ddbeec86b62dda24ffea1deda37695c9f61a8817218e6370c0679 +A = 7d6d0cc947ceb949cdc4e9e1044f5deca5bb05a491041e0d85bc4b92a0944a57c72845fad91e59010c61ad1712bd2f612d53a846a044632262a9f2e3373b062fde2484e0c165ff947f2469f743ab6e2e5e13c640fc4029b1c9213eb8473c674e7f9e95a4a5c5636d4656c1e696962340d77b322daba47d6fc894f2a2cd9e0afc +E = b78012afe806e2344d004c739c97324256850980ac97d88c4ed9a838517639ca112e235978d21a176c33f5a68703aba0f2a05501bbe3fc8d49a000fbf530cdb431581dfaf8683cb15a2aee5e239cbc542827100da3b47babf4a16ca7c588aff9912e674abb449e0b767a15e415f4e7f2bbd6380d7131da3df8d49b13bfd35ce3 +M = b72d5c55bd2998472f1965e75a51be6155c1ba04656da8f66bcb34db36a7b1db66a89d1d05b1bde10206acf85be7b474ab689220faf1bb52ab39d8dc00512dd4e26df1179c11b973e1274db85a88c7cc2a17113abdffe58cb930ddc5f3ccc4d68b4e65c913730509f7ce5656e8bbaba9b1be177ab9f766678f018fea05da9cdf + +ModExp = 465ff295786a88496828fdc763e9292d557957544e9322b7996807b87fdbfa7a11614bffeec557ca831c4824c8e4ca3b1a1c7f3f4f95ec3fd6a86b73bb13d78b73af2b3c7e76954d0cc03bcb0cd606867ebb3765a8b3d0108cbe4f343a14016be9c33f6d200f0dc547e7d6b02bfab1e79dcdf9c9835a814cc6c855a12ebeb66d +A = 89ad02bea3e9ab839a6e23f20122409daba52c68e1e893034b30d321c0305434a6af940015e3fa5ca9c35230da34beeb1ed4fbce6c1da3a8bfe3f3ae172276c1d1723b47ee61e6f8fcfdafad102d6f7ee2a79f510c7edb93096205a40a6c9e665b88b18f39a979e2e61286d939952a6f02fe8148b7515bb25f4252337cb6e60d +E = cbd6ac628cc7afa3c61bee9c22a06a395087ec1811fe9681b55216700c435996c815e7cec8aaa90016dd2382d0306a5414630124e14f3d396a4ba02ee17851bf720f1607ff813e4bbddf01338983db12f59bd6371a738eee3eeb716f21051d6174d2d6c77602942b9edaac18d4b3a723096c0d00dd23a8a605c585022f311560 +M = fa7a3e40364c8a8d0f14f0213a3f3e035222ca0ea19d46d10ba41580e5dd2805c8a133f3856d7d5d97f922ea540e5eb0d10ad04dfdbb74f518f58da0099a6fc2b3f3def92985176e07fc78aff2faebccca10a429794e5f15ff92f75fe90f527c60ddea8093a9078c703c372ca09f7aeb27ade02f3595308c61dd9c44e62fd101 + +ModExp = cf08bf00261402102e9fe03f3074471dcf0e9b3c96d4d1503f099f24ec85e1901b023e9e048c1ad042244f5f70b38b25a99f4c0a7b57d5844bb0d0137367f45f4ce2cc7746105b77414768cb97648dc5721149aed2d4c682408cc0d50d26dd0bd77e848911f8625c727cac5f32e63bcb548f41a57d718d772f23983a42f603bd +A = a419646a6631c2c69b18f7aa65011825eb31692eecaee9d74f92d92203811b68e9764bda31a1585bdf69b6273fc6f9f508c395ac081336506525dad88473512f08a205621ac8b16e9864c7a7c5a4f17435de00d0b32badec6ce4897e3e1076c562b6d9523f63d0b2079eaa416cb090471657763f24931d955d1fa2720c80a9c9 +E = d5a6f4a1842aaee39805356dc8d0d678ee03b2c81277345beccb2742f899132feb43271f95968a01ae68aa8277201851992dc0aa7a71c90aae71b124d873ee264ea400fb131be0fc6c4ce8c04c45f6bdaca89ac743635caf6158983d257e21cef6800d7f990e912ba21bbfb8fb779afa4abd19e07e7e07eee9908493d1ca502c +M = e739689b6cc6def1d45fb1a2ab551643beeb303f4aaa4da47ee5e4948510f8445b4c40e99ae8354dede60b2ba6694e93bc4d573b7e8adf871b7a9a9636eb7d70f2e49328e2d7978143b177cee8374ef01bd1ee2d95862765883f5e7971668b53ef0ff41b6539faf63c397522b0bdce916388e72e26c8d3d2e58dadeb9eb5d479 + +ModExp = 827e6312ec3b14600203bb83f5b277ded197b2967363630ef673240df05edd3ba8ab2b11c86251a612206569c6c33952b31e264f129909bfe723bd0ee1624b36cfcfaa893a6ec8b5a1f7de79f83e79b459a3350f89f412ad1cfd6bc4c2a7a29272c783d6ecceeb1398fa17041835643f4debef9b5e87b098d104bb8912dddf7c +A = b8e49c637829021d32db3a39a0c1e58cdd4c6e4eda7e8e9293be379e9c2e2d184f929d278598a81ae231cfedcf69cce4a6e31cda3c8ac14d753a7311f2436e29795f0dfb60259a0f61a997918ff984aa2284b43a9d64c974059e9682adfffd018305835f74eda8c75fe4877d811c1620f654ec9f7f32d1af5ce59115e2f41785 +E = 80e0febf369d234bf1aaad4f82df2e2ff02882c3184781f6ccdf4f7cd93b6887af86830077c84dfb02109ada05b40970b1c65228b0c19030bd6361c3537fee22a8155c03b4e7007ca006c6daa3659518d05bb81ea0079456d0ef6116df248dffdb0c935f321f5a1034deefd5a9414a0652aa6548de33325b474b9e5a8507a082 +M = d5eb1d14af842a9973274f7463d90cf0ccff19c47d710edbae184478d4f29b02693ed7958bd487054327b9e6d8879e24c9af7730b92f323eeac05558da6c1b952e5dbf13de236050a77628bb5325fe0d14cc5773bf73338759d5ab43c212b414581280f1cee250007e53791b800b61c90de0328acd7bc43fbdda48158939392d + +ModExp = 4a1efd29c7e78549f5cd4deed1454b37462c7810ee6a8a2493b764dfa479be13b314cf9ff98259517d61865567ef499a511630c0038c97914625df181c6fe07892f329f98b344a78d751e9471483eebaa7977371bf97bb25187ae7e93a9227d6c124ccb4644423c961a11ae59c4354f89d5a95164c23d9aa256e289e9cc0858e +A = bd86c9211fa6a47a06e5016c46cb8a99e34a043a29e22f8c3196fa7197c26b38927b8d9bc0ddc11a5fa4bcc44deb69dbf37cbe7ebc9a2fad6c74e09ab5a9dd929fa04ab4319b6caad1035739be78ba631fb0748d9e53944836d37ccda6e6a62823c696d8f31139ccd7f2f86b22fa026ecf433cfb1271a3539ac4f1c83aaac059 +E = c40b9972006d28a84c2769a86e526a2b274f73afc7c5c6a2742166757f61b5f5fdbb228afa157af62af989ffe966f232bba9e6beef5403d1690ade31a6410f7f349a35bc4267a129afd647993df7d45cc0e1a1ba4678d7f1b6e8a344d8ff7037679e1f4db25a454e4246f6b55c416567fcfa188e8a3865115851d9edf0aa8902 +M = cf424d7af75ce7eef90cad75ae55ca8810cc7b4703fdb5bce701e7bac07e0c371cae06df2aa8facb55a0faa6793e4d2bd9d7969703743b9be170be82792aeea55e2bc0f7ab7617b276486bf474dee2f4556aab595ff3ef115139cfe5e21ccd4ee05c0e1cf901bd85df86cc17195a783b0be836d00bee82ce064077f9191188f9 + +ModExp = 3137a3049fd4ad2e26d870f5c998cf11bfe82101884a82e85e43facd0928cd7434a2e346ca124619769fa141bbe92ad6f36b99231032ddaec3b349a410f82b5ca36f45e56e5fb85dc63d32053dc90805d3f1854ab385281a71a57726bf97158494e7476057214ca7379ab8b70f5bdc15f70bdad3adf33c3a1f9cd1b6bbbad556 +A = 39a1dc6a4c3f14d9c350ee968d5ce139ef725952c967a2d1bedf48ace22091283525be03807e2e263d2640be77f0525247bcd07149bba50568cec5a082c87d72962cf9e43bcb5cdb1e7e9a650fb53e0ec2fad37f09a9f036c0d7dfa528fef846769f80a9a60854910ca1b4ee05dba82ed2ee018348d6b3e52a764b8ffae61e0 +E = deaee3a3f80c9f684ed7110c0653847ccc7be5ff6d982fd4b49f59b5dd35f7210b1077babbcedbc127df35cd469dc6e569a0f84e58149b5605c94b09fd7f0b098d02b4a04631328b3fae39e6c2fce25334225cab71829abdb9507cb903701559660f2c08c3b743336119d1260a0db27054cad3f28bc1b04b2289baa58fb33965 +M = 938388927d06ed3bb1286c0f06d3054cb0ee16dc7a0bbbf13a45293c09a5f40f1d611b2e1a1b0ec2ef109b508e27af4274954905cae52034f8740a744153b4d22059f0dd262ea51785522098ecacced6da07709ee6b5acc8c4e99331379a7c3de7f4e2d1431e43b19570140955b7bcba118dfbaa552cbfa2be531e8f781166ed + +ModExp = c15ae334455d9f4d1030cd33e734726a27c63624c2afc576238cce5e0498298a4a0c93090a0d19568b41290303c4b558f3d9dd74f9cde8798710f68569ea0d6fd971ce67ec5b54495031de3d8842b8b49288725bee5c9f72b99054d64986ccd4e18d70d5f33943f08cd694eff538f84438ea993ebaba0910c95b3a694f213510 +A = def633b955a917569df3ba8517455eef0655e7a35985edda27097a063e0d82c7c3a76dc36c5d8a71ba9d540790ddd0ea514aaed98925f9a1808eb288d387aaf9605a9ef8a333ebee7ad7057bca012efd619d5867f02266f65976ef4b16da17468426ac4f99b3e8921707e01b4de20f6f9a068e6a19d872079a27f3a44449db83 +E = a465c47b0d15d48e01bb8b1d8e3b3253e11515f6874dbed6c25818adf1a8fd927124d5593beb367f685c11e46f18415be73ccdf16fa2e93a600b728163d21d232849e5278c3749d903edad3f1c4535a2f55a2ab65e7ebc64888bd2a0527e876ecf38cec3ab1980d08138709fad8eb88ae65d960adc3f0f8e92f784fe96fcb693 +M = e43cb9ac1446154356cdc31ec771c79b0e461e22d95185bbe1a279c0945e3af07903a0cb54d553380716fcdcafb4b7cf5dc6da481dc74a8c583d75ff6c1f8e429182d200246ebc473bb56e173787987c1b7fb2dd23f5b2e438a97bc4a1df628bc044fdd1e80c0cf37030adb7b04784dab827d0dcd64f0dbf37c980612570ce11 + +ModExp = 75c3f79ab7c991b98e65505342a8a563cfb08b5d3ccf8664c7db1de50256b1d17ebf7096dc98c7bb5d7f027a894ae5cbb14dee04d5d445e775ad7e239acc82673b0ac2d819a69c83864f34e73d9a636f05de8279619a067b4c90ad038db5910447e03841d2034635018f08cbcd21efa00994247763a249082594128112f95232 +A = 34def7d76f6f158a359fd12759fb889cdf6af0a24830dc3e84283a1ab4e9b2647a6a36b86482f829b2cdf3e3d6028f9a884b1f64f7262315446bea8b0231828e2f3d990fb103c17f820b39e4b8427c85643ceeca8f5dc8f191d1255768300e859bd7d88c770319ef38269660d221cb3bc061389b6fc0783485ef042b1c7d6fef +E = c6c46453dd5aac6b37277a446b1d0c69cbe476eeff55b3ac35edb89ba97116b0e7783660f2c7b31b2a2d6c4709d0ab45d01a838100694b0777c9c9c14c959b07c437c73a5eabb7402f1001e802d797a2e7707285834fb6440a1c2f727f7bb84ddb2a49312d32fa0ce620c43872655cb5c394749c9e75d7fa25be00efe50d47d6 +M = fbbab6698a9142095c46b38a732592e4366c1838b84bf40f8c8fc7b630f73380a0d09765562365798f8c8030ed1b6728329d8bb06e882c35a1d59bfe84146a9db2afe42a414014e247390281c782fce806d62adb54778d2bcb49555459429d6ed446af5359657667f6aa19e8e3e0e24ab2bc312b2d90b5cb1ce6f2f15af15d9d + +ModExp = ba16d7f3f6e162ce248490d164a13c00e7720d8a667e2d3ebeb13f1663e15ef5408d5b56cbc7bc793a8ca787cc50f8e15e0e9d4ee764531d04a9114eea556bb3e206ed7d85267151a056b6e68fbf35e03f2cf829708ffe1de13e95ecfe365aff1eea36340ffcd3892dee659fb1ecbe50f5080e54737c10f9c1ba638b14ef537e +A = 9025e6183706105e948b1b0edf922f9011b9e11887d70adb00b26f272b9e76a38f3099084d9cccf12d04b1a99c0f654f8b9ed90c6dff9478c60bf05d58d734ab60eaefa14a22230ec60c90dc1f0704b61eef0bef345785ae0e6a9af7db069cf6bd2b4e0fe58a0ade83c7e46a04b9fe1d24cb9b65c6f80de713e61d70eae5b286 +E = d7e6df5d755284929b986cd9b61c9c2c8843f24c711fbdbae1a468edcae159400943725570726cdc92b3ea94f9f206729516fdda83e31d815b0c7720e7598a91d992273e3bd8ac413b441d8f1dfe5aa7c3bf3ef573adc38292676217467731e6cf440a59611b8110af88d3e62f60209b513b01fbb69a097458ad02096b5e38f0 +M = e4e784aa1fa88625a43ba0185a153a929663920be7fe674a4d33c943d3b898cff051482e7050a070cede53be5e89f31515772c7aea637576f99f82708f89d9e244f6ad3a24a02cbe5c0ff7bcf2dad5491f53db7c3f2698a7c41b44f086652f17bb05fe4c5c0a92433c34086b49d7e1825b28bab6c5a9bd0bc95b53d659afa0d7 + +# See https://github.com/openssl/openssl/commit/e9e726506cd2a3fd9c0f12daf8cc1fe934c7dddb. +# OpenSSL's test vectors do not include the expected value, so ModExp was +# computed with Python 3. +ModExp = ccb051a34f9e26e381e50445632cbbd4abe56bc912020f3edd2db144aedb470095c4c33e3342d1dc4bb4056ba3078366af4cee507e85bb1b2e499ef25a933810f14faa8b1a9ce5e8d58f2789e27c887a4ff87fa59ff682727a3912a99aae6db8b3b8947d76c8454cffc6fb3f2422dca106c3845b0db68a06e5e9d7b90e552506579d812e7d96bfc6324feec90ea0800463346148f120e7caf403788539f5d87ee45aa5b313c340e0a323029f3a0bdb675510aefec171c01e2a94960cd507e461214028c86ed4e9fce31e7dbdf1a75fd6f973e2aed4a039e53a60a7aa62be8ee1f80a113833ab402d07e17151021cec29fa5b2e628ef9f2d7aa4bc86b6eec8faf +A = 95564994a96c45954227b845a1e99cb939d5a1da99ee91acc962396ae999a9ee38603790448f2f7694c242a875f0cad0aae658eba085f312d2febbbd128dd2b58f7d1149f03724215d704344d0d62c587ae3c5939cba4b9b5f3dc5e8e911ef9a5ce1a5a749a4989d0d8368f6e1f8cdf3a362a6c97fb02047ff152b480a4ad9852d45efdf0770542992afca6a0590d52930434bba96017afbc9f99e112950a8b1a359473ec376f329bdae6a19f503be6d4be7393c4e43468831234e27e3838680b949390d2e416a3f9759e5349ab4c253f6f29f819a6fe4cbfd27ada34903300eda021f62839f5878a36f1bc3085375b00fd5fa3e68d316c0fdace87a97558465 +E = f95dc0f980fbd22e90caa5a387cc4a369f3f830d50dd321c40db8c09a7e1a241a536e096622d3280c0c1ba849c1f4a79bf490f60006d081e8cf69960189f0d312cd9e17073a3fba7881b21474a13b334116cb2f5dbf3189a6de3515d0840f053c776d3982d391b6d04d642dda5cc6d1640174c09875addb70595658f89efb439dc6fbd55f903aadd307982d3f659207f265e1ec6271b274521b7a5e28e8fd7a55df089292820477802a43cf5b6b94e999e8c9944ddebb0d0e95a60f88cb7e813ba110d20e1024774107dd02949031864923b3cb8c3f7250d6d1287b0a40db6a47bd5a469518eb65aa207ddc47d8c6e5fc8e0c105be8fc1d4b57b2e27540471d5 +M = fef15d5ce4625f1bccfbba49fc8439c72bf8202af039a2259678941b60bb4a8f2987e965d58fd8cf86a856674d519763d0e1211cc9f8596971050d56d9b35db3785866cfbca17cfdbed6060be3629d894f924a89fdc1efc624f80d41a22f19009503fcc3824ef62ccb9208430c26f2d8ceb2c63488ec4c07437aa4c96c43dd8b9289ed00a712ff66ee195dc71f5e4ead02172b63c543d69baf495f5fd63ba7bcc633bd309c016e37736da92129d0b053d4ab28d21ad7d8b6fab2a8bbdc8ee647d2fbcf2cf426cf892e6f5639e0252993965dfb73ccd277407014ea784aaa280cb7b03972bc8b0baa72360bdb44b82415b86b2f260f877791cd33ba8f2d65229b + +# The following inputs trigger an edge case between Montgomery reduction and the +# "almost" reduction variant from https://eprint.iacr.org/2011/239 + +ModExp = 00 +A = 19c7bc9b97c6083cd7b8d1cd001452c9b67983247169c6532047eb7fc8933014dbf69fee7a358769f1429802c8ea89d4f9ca6ba6f368fbdb1fa5717b4a00 +E = bbc7e09147408571050e8d0c634682c5863b7e8a573626648902cff12e590c74f5a23ecce39732266bc15b8afbd6c48a48c83fbdc33947515cc0b6e4fb98ae2cd730e58f951fec8be7e2e3c74f4506c7fd7e29bdb28675fe8a59789ab1148e931a2ebd2d36f78bc241682a3d8083d8ff538858cd240c5a693936e5a391dc9d77118062a3f868c058440a4192267faaaba91112f45eee5842060febbf9353a6d3e7f7996573209136a5506062ea23d74067f08c613f3ff74bade25f8c3368e6dba84eae672eac11be1137fc514924fcab8c82e46d092bd047dcbadaa48c67a096ec1a04f392a8511e6acbad9954949b703e71ff837337b594055ae6f3c0fc154447a687c9ac8a2cdfd64a2e680c6ff21254735af7f5eb6b43f0bce86bda55a04143a991711081435ed4f4a89b23fc3a588022b7a8543db4bf5c8ac93603367c750ff2191f59a716340fab49bb7544759c8d846465eec1438e76395f73e7b5e945f31f1b87fefa854a0d208846eaab5fa27144fd039911608bab0eaee80f1d3553dfa2d9ba95268479b97a059613660df5ad79796e0b272244aca90ccc13449ec15c206eeed7b60405a4c5cfdf5da5d136c27fa9385d810ad198dfe794ffce9955e10520efea1e2eb794e379401b9affd863b9566ce941c4726755574a1b1946acf0090bfb93f37dd55f524485bbba7fa84b53addfde01ae1de9c57fe50d4b708dd0fa45d02af398b3d05c6d17f84c11e9aacdbe0b146cad6ddbd877731e26a17f3ebed459560d12ed7a6abc2ea6fe922e69d2622ef11b6b245b9ba8f0940faaa671a4beb727be5393a94dafaeff7221b29183e7418f4c5bb95a6a586c93dbc8ce0236d9dbe26c40513611b4141fed66599adbfb20fc30e09a4815e4159f65a6708f34584a7a77b3843941cd61a6917dcc3d07a3dfb5a2cb108bacea7e782f2111b4d22ecaaeff469ecd0da371df1ac5e9bf6df6ccba2d3a9f393d597499eaca2c206bfb81c3426c5fe45bcf16e38aecd246a319a1f37041c638b75a4839517e43a6d01bee7d85eaeedbce13cd15699d3ee42c7414cfed576590e4fb6ddb6edd3e1957efaf039bfe8b9dc75869b1f93abff15cae8b234161070fa3542303c2ed35ca66083d0ac299b81182317a2a3985269602b1fa1e822fcbda48e686d80b273f06b0a702ca7f42cbbbd2fc2b3601422c8bff6302eda3c61b293049636002649b16f3c1f0be2b6599d66493a4497cd795b10a2ab8220fafad24fa90e1bfcf39ecce337e705695c7a224bf9f445a287d6aab221341659ca4be7861f6ac4c9d33dac811e6 +M = 519b6e57781d40d897ec0c1b648d195526726b295438c9a70928ac25979563d72db91c8c42298a33b572edecdf40904c68a23337aa5341b56e92b0da5041 + +# To fully exercise BN_mod_exp_mont_consttime codepaths, we generate inputs at +# different bitwidths. rsaz-avx2.pl only runs at 1024-bit moduli, and +# x86_64-mont5.pl unrolls 8 64-bit words at a time, so we want to capture both +# multiples of 512- and non-multiples. Also include moduli that are not quite a +# full word. + +# 512-bit +ModExp = 00 +A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +M = 8f42c9e9e351ba9b32ab0cf69da43f4acf7028d19cff6e5059ea0e3fcc97c97f36a31470044737d4c0c933ac441ecb29e32c81401523afdac7de9c3fd8493c97 + +# 1024-bit +ModExp = 00 +A = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +M = 9da8dc26fdf4d2e49833b240ee552beb7a6e251caa91bfb5d6cafaf8ed9461877fda8f6ac299036d35806bc1ae7872e54eaac1ec6bee6d02c6621a9cf8883b3abc33c49b3e601203e0e86ef8f0562412cc689ee2670704583909ca6d7774c9f9f9f4d77d37fedef9cb51d207cb629ec02fa03b526fd6594bfa8f2da71238a0b7 + +# 1025-bit +ModExp = 00 +A = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011 +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +M = 010223abfdda02e84e11cec8ee7fc784fa135733935f7b9054bb70f1f06d234d76dcf3beed55c7f39e955dc1fef2b65009240fd02f7a1b27a78fc2867144bf666efb929856db9f671c356c4c67a068a70fe83c52eebda03668872fd270d0794f0771d217fb6b93b12529a944f7f0496a9158757c55b8ee14f803f1d2d887e2f561 + +# 1088-bit +ModExp = 00 +A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +M = e91f6d748773cb212a23aa348125615123b1800c9ea222c9374c757702ae4140fa333790ed8f6bf60a1d7dda65c2767cc5f33e32e333d19fbfb5a2b85795757c9ca070268763a618e9d33873d28a89bf88acd209efbb15b80cd33b92a6b3a682e1c91782fc24fb86ddff4f809219c977b54b99359094bbcc51dfe17b992ab24b74a17950ad754281 + +# 1472-bit +ModExp = 00 +A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +M = a8770362f4bfe4fc1ab0e52705c11a9b6ba235d5a5f22197c2d68e27ed18426ede3316af706aa79bcf943dbd51459eb15ae1f9386216b3f3a847f94440a65b97659bc5ba2adb67173714ecaa886c0b926d7a64ea45576f9d2171784ce7e801724d5b0abfd93357d538ea7ad3ad89a74f4660bdb66dfb5f684dcf00402e3cdf0ab58afd867c943c8f47b80268a789456aa7c50a619dd2f9f5e3f74b5d810f0f8dadbf4ad5b917cdcb156c4c132611c8b3b035118a9e03551f + +# 1536-bit +ModExp = 00 +A = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +M = 878cd000778f927b2f1a4b8bac86efd282079a7ac0d25e09ffd2f72fbc282e65e233929d2457c7b1d63c56fb706cdfa04fb87e654c578c98d7cf59c2293dc5641086b68db4867105981daaf147a0ee91f6932ef064deae4142c19e58d50c0686f0eaf778be72450f89a98b4680bbc5ffab942195e44dd20616150fd1deca058068ca31ab2f861e99082588f17a2025bf5e536150142fca3187a259c791fc721430f24d7e338f8dc02e693a7e694d42775e80f7f7c03600b6ae86b4aba2b0e991 + +# 2048-bit +ModExp = 00 +A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +M = 9f40a7535c561208ecb38e17c9336d9bc8484d335901b2cd42759cf03689227f6992f10cb6b586d767fbcdf30e9d82a0eda60d2694ccd0194fa96b50b56e0cdeec1951ea9e58b07e334a7f108841a0ab28256917fecea561388807ed124a17386a7a7b501f9cbf3404247a76948d0561e48137d3f9669e36f175731796aeaf78851f7d866917f661422186a4814aa35c066b5a90b9cfc918af769a9f0bb30c12581027df64ac328a0f07dbd20adb704479f6d0f233a131828c71bab19c3c34795ea4fb68aa632c6f688e5b3b84413c9031d8dc251003a590dec0dd09bfa6109ed4570701439b6f265b84ac2170c317357b5fbe5535e2bbdd93c1aacfdaa28c85 + +# 3072-bit +ModExp = 00 +A = 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +M = c23dfd244a58a668d514498a705c8f8f548311b24f0f98b023d2d33632534c2ae948d6641d41fd7a29fbbd594bfc7fdd6e8162cbb3056af3075347b6fc8876458d33a9d0ffdbcdf482de0c73d1310fd8fa8f9f92dd0dbb0e2034e98a30f6c11b482f7476c5b593f673a322b1130daa4314e9074270dce1076436f0d56cf196afcbb235a9a7b3ac85b9062e85fc0e63a12c468c787019f6805f9faab64fc6a0babc80785d88740243f11366bffb40ccbe8b2bb7a99a2c8238a6f656bb0117d7b2602aa400f4d77de5f93c673f13264ca70de949454e3e3f261993c1aa427e8ef4f507af744f71f3b4aaf3c981d44cc1bfb1eb1151168762b242b740573df698e500d99612e17dc760f7b3bf7c235e39e81ad7edbe6c07dbb8b139745bb394d61cb799bcafec5de074932b0b2d74797e779ac8d81f63a2b2e9baa229dfaa7f90f34ffade1d2ad022a3407d35eb2d7477c6ae8ad100f6e95c05b4f947c1fabfb11a17add384e6b4cd3a02fd9b43f46805c6c74e366b74aa3b766be7a5fbbd67fa81 + +# 4096-bit +ModExp = 00 +A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +M = 8030411ecbddcb0fe4e76fd6b5bf542e8b015d1610cf96130ded12ba2cda0641bd9692080f218ea8b0d751845b519d95b843542ec8d2a07f1f93afe3189b69a4f35c983011c7f7928c3df458cc3eae85c36e6934a4b1bc0a67c8a521de336642c49e10a7ffa8d0af911aacc19e3900449161940f139220e099a150dcaf0ff96ffff6e726c1ac139969103cf6a828ac3adf0301506aa02787b4f570d5dde53a34acab8fec6fa94760abf16ee99954371ad65a6e899daab87b95811d069404991de9abe064ebbddf886e970f10d260c899dda940191a82d4c8bd36651363aff5493f4f59e700007dcadf37ebea7fcfd7600d16617ffea0d9ae659446d851d93c564e50e558f734c894d735fa273770703dab62844d9f01badf632f3d14a00f739c022c9be95f54e9cea46ec6da7cb11f4602e06962951c48204726b7f120ddbd0eb3566dc8d1e6f195a9196e96db33322d088b43aecffe9b4df182dd016aca0bd14f1c56cd1a18b89165c027029862b09ffd78e92ab614349c4fd67f49cb12cd33d0728930d0538bda57acef1365a73cc8fbac7d463b9e3c3bae0bb6224b080cdb8b5cd47d546d53111fdc22b7ff679bcfe27192920ee163b2be337d8cccc93b4de7d2d31934b9c0e97af291dcc1135b4a473bd37114eec3ba75c411887b57799d3188e7353f33a4d31735ebfc9fcfc044985148dd96da3876a5ab7ea7a404b411 + + +# RSAZ 512-bit. +# +# These are regression tests for code which historically reached the RSAZ-512 +# code. That has since been removed, but the test vectors remain. Note that the +# lengths of the inputs, especially the *bit* length of |M|, matter a lot. + +# Control: No relationship between A and M except that A < M and they're the same number of limbs. +ModExp = 7f34c1cd63377bc3abf2bb5b2d1bf5f06454e1e8040fe19a72245ce9731cbee1bf9e84532300776c8021ed4f3a8de508d85b4cf320bd82065a013754857b50c4 +A = 8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364 +E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 +M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 + +# Same as above except A is negative. +ModExp = 71fa6a4c8ae75368eda8cc6282c26afa69e2af12a97fb9444f16b7dd6c99e0a5d6034cab4248cae4357346b211039f4a2bc4c5a20a297372094162417af703cd +A = -8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364 +E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 +M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 + +# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A. +ModExp = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 +A = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 +E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 +M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 + +# Same inputs as above except A is negative. Note that A mod M with a "correct top" isn't the right length for RSAZ. +ModExp = 1 +A = -f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 +E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 +M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 + +# A == M, so A == 0 (mod M) so A ^ E (mod M) == 0. Note that A mod M with a "correct top" isn't the right length for RSAZ. +ModExp = 0 +A = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 +E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 +M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 + +# A is negative, and A (mod M) is the right length for RSAZ. +ModExp = 8d76eb0f8c7bc3160cc8bb0e0c3590fbed26c5932f5f525b48045c0bd46dda287ba5483f97c851fb7c12c2e858ee7a4a4d1af745cbfb3eb311fa54bea12cde25 +A = -80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +E = be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 +M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 + + +# RSAZ 1024-bit. +# Note that the lengths of the inputs, especially the *bit* length of |M|, matter a lot. + +# Control: No relationship between A and M except that A < M and they're the same number of limbs. +ModExp = 8984f8c16044f9c0ad7bd72347af90f58e6e003acda92b76e3c7c4a56ea8e918409d8e9b34884d4c89d0b17cb40fe898f2627c084a0f1698e46beccbf6f48eecc281e11ea9e5135adba460ddae157f2c655b5f589ce29b254d43a960a71cede8a08dbb86be4dac22458da232fb1ec2470856827302ed772c9ddafa408c931aa7 +A = 21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8 +E = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575 +M = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7 + +# Same as above except A is negative. +ModExp = 75b54540dd6ec1e87c4e77bb93fd50477ea463fdadb5cab05119b34585d18f971617fc1194240ffa6bdfb53e4785f0a451e03f8c3c444aa6080a96af5906eaa508862a4de15b2c55c023b6f278cd04c1e24fd0711244afeda8e3444256e51261ed99fe66beedb52c43c825b4c7a1adc7d4b111e2208ecd495df91e175573ca10 +A = -21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8 +E = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575 +M = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7 + +# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A. +ModExp = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 +A = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 +E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 +M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 + +# Same inputs as above except A is negative. Note that A mod M with a "correct top" isn't the right length for RSAZ. +ModExp = 1 +A = -b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 +E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 +M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 + +# A == M, so A == 0 (mod M) so A ^ E (mod M) == 0. Note that A mod M with a "correct top" isn't the right length for RSAZ. +ModExp = 0 +A = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 +E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 +M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 + +# A is negative, and A (mod M) is the right length for RSAZ. +ModExp = 9cf810b9e89d5cbc4b79ae64e123ea06d92965e2bab077df97a1b906dc2e1ddcf96a9c4ed14e2cd96309b829ea9cc2a74a7d4b43c5f34d792a7c583201427754b8f78b783608070a84b61f18913e3ced7f7f530972de7764667c54e29d756eea38a93cd1703c676a4587231b0ebfeadddf908e2877a7a84b5bfc370ecf0d158d +A = -8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 +M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 + +# Regression test for CVE-2017-3738. +ModExp = d360792bd8210786607817c3dda64cc38c8d0f25569597cb1f363c7919a0c3587baff01a2283edaeb04fc288ac0ab3f279b2a89ffcb452d8bdf72422a9f9780f4aa702dc964cf033149d3a339883062cab8564aebdbfac0bf68985e522c6fe545b346044690c525ca85d3f4eb3e3c25cdf541545afc84a309e9b1d7807003461 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2020202020df +E = 2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020FF2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2020202020ff + +# Test vectors for CVE-2019-1551. (We do not carry the assembly file with the +# bug, but we use the test vectors anyway.) + +# Original test vectors by OSS-Fuzz. +ModExp = 9d675d188a07e9bd1b32638cc8cfd5002ef89bd1a9648f806567b87939140a67977dc8da17323b8e4c6bc53875cda8b656df8f54cc32e44fd9c21d122ea3c0d6 +A = dea9b3e0b44ae67b2ac9b7c2b18eeb4dab206b014981a46ac409f195eeb6896f132cf8497c87d1188008ee511054ebb426203355b7d515dce9501cb759ac1373 +E = b01ae745b101e9e45ec05dcff72e7f8fc04c79ffe324301fda0b4f7be81d85c4e875c73fc6c5cb40000000000000000000000000000000000 +M = ffffffff01ffffffffffffffffffffffffffe2000000000000000000000000000010fab8d960706cd4c21818115650cad61d4f10da325dffffffff00ffff00ff + +ModExp = 651f811b62ee8770e3598c340864dd6b0be9bb6376b6f933ab216fd55538e6ad1000cb2b3c64f54d554e004b6eec8138e6ecff00452d443a42041b72e6cd9ead +A = 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e +E = 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e09003e3e3e3e3e3e3e3e3e3e3e3e3e3e010900230a01230a2100ffffff0000adf300a58700000000ffffff00 +M = ffffff0b00000000000000000000000000ffffffff0000ffffffff00000a0000000a00000000000000000000ffffffff000000000000ffffffffffff000000ff + +# Test vectors for rsaz_512_sqr bug, with rcx/rbx=1 + +# between first and second iteration +ModExp = 1 +A = 624e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d973b6 +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between second and third iteration +ModExp = 1 +A = 11024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000f +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between third and fourth iteration +ModExp = 1 +A = 4171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d9736080000000000000000000000000000039 +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between fourth and fifth iteration +ModExp = 1 +A = 6a171024e6a171024e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000000000000000000000000000000000006 +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between fifth and sixth iteration +ModExp = 1 +A = 44e6a171024e6a171024e6a171024e6a14ce297f2873536f959d8c3390d97360800000000000000000000000000000000000000000000000000000000000003c +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between sixth and seventh iteration +ModExp = 1 +A = 1024e6a171024e6a14ce297f2873536f959d8c3390d973608000000000000000000000000000000000000000000000000000000000000000000000000000000e +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between seventh and eighth iteration +ModExp = 1 +A = 626eee5e3c8653be47ed15e84b97cc7f800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000187 +E = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f8 +M = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f9 + +# Test vectors for rsaz_512_srq bug, with rcx/rbx=2 + +# between first and second iteration +ModExp = 1 +A = 3c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf7c +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between second and third iteration +ModExp = 1 +A = 485c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf47800000000000003f +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between third and forth iteration +ModExp = 1 +A = 59a85c40939a85c40939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf478000000000000000000000000000004e +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between forth and fifth iteration +ModExp = 1 +A = 2939a85c40939a85c40939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf47800000000000000000000000000000000000000000000024 +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between fifth and sixth iteration +ModExp = 1 +A = 640939a85c40939a85c40939a85c4093995e8efdb195e8efd8caf477ed8caf478000000000000000000000000000000000000000000000000000000000000057 +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between sixth and seventh iteration +ModExp = 1 +A = 25c40939a85c4093995e8efdb195e8efd8caf477ed8caf4780000000000000000000000000000000000000000000000000000000000000000000000000000021 +E = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e +M = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f + +# between seventh and eighth iteration +ModExp = 1 +A = 7b4919849931b28a14fcace213f2b3884fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84b6e67b66ce4d9c +E = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000004c +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000004d diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_inv_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_inv_tests.txt new file mode 100644 index 000000000000..4ebc1966574b --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_inv_tests.txt @@ -0,0 +1,115 @@ +# ModInv tests. +# +# These test vectors satisfy ModInv * A = 1 (mod M) and 0 <= ModInv < M. + +ModInv = 00 +A = 00 +M = 01 + +ModInv = 00 +A = 01 +M = 01 + +ModInv = 00 +A = 02 +M = 01 + +ModInv = 00 +A = 03 +M = 01 + +ModInv = 64 +A = 54 +M = e3 + +ModInv = 13 +A = 2b +M = 30 + +ModInv = 2f +A = 30 +M = 37 + +ModInv = 4 +A = 13 +M = 4b + +ModInv = 1c47 +A = cd4 +M = 6a21 + +ModInv = 2b97 +A = 8e7 +M = 49c0 + +ModInv = 29b9 +A = fcb +M = 3092 + +ModInv = a83 +A = 14bf +M = 41ae + +ModInv = 18f15fe1 +A = 11b5d53e +M = 322e92a1 + +ModInv = 32f9453b +A = 8af6df6 +M = 33d45eb7 + +ModInv = d696369 +A = c5f89dd5 +M = fc09c17c + +ModInv = 622839d8 +A = 60c2526 +M = 74200493 + +ModInv = fb5a8aee7bbc4ef +A = 24ebd835a70be4e2 +M = 9c7256574e0c5e93 + +ModInv = 846bc225402419c +A = 23026003ab1fbdb +M = 1683cbe32779c59b + +ModInv = 5ff84f63a78982f9 +A = 4a2420dc733e1a0f +M = a73c6bfabefa09e6 + +ModInv = 133e74d28ef42b43 +A = 2e9511ae29cdd41 +M = 15234df99f19fcda + +ModInv = 46ae1fabe9521e4b99b198fc8439609023aa69be2247c0d1e27c2a0ea332f9c5 +A = 6331fec5f01014046788c919ed50dc86ac7a80c085f1b6f645dd179c0f0dc9cd +M = 8ef409de82318259a8655a39293b1e762fa2cc7e0aeb4c59713a1e1fff6af640 + +ModInv = 444ccea3a7b21677dd294d34de53cc8a5b51e69b37782310a00fc6bcc975709b +A = 679280bd880994c08322143a4ea8a0825d0466fda1bb6b3eb86fc8e90747512b +M = e4fecab84b365c63a0dab4244ce3f921a9c87ec64d69a2031939f55782e99a2e + +ModInv = 1ac7d7a03ceec5f690f567c9d61bf3469c078285bcc5cf00ac944596e887ca17 +A = 1593ef32d9c784f5091bdff952f5c5f592a3aed6ba8ea865efa6d7df87be1805 +M = 1e276882f90c95e0c1976eb079f97af075445b1361c02018d6bd7191162e67b2 + +ModInv = 639108b90dfe946f498be21303058413bbb0e59d0bd6a6115788705abd0666d6 +A = 9258d6238e4923d120b2d1033573ffcac691526ad0842a3b174dccdbb79887bd +M = ce62909c39371d463aaba3d4b72ea6da49cb9b529e39e1972ef3ccd9a66fe08f + +ModInv = aebde7654cb17833a106231c4b9e2f519140e85faee1bfb4192830f03f385e773c0f4767e93e874ffdc3b7a6b7e6a710e5619901c739ee8760a26128e8c91ef8cf761d0e505d8b28ae078d17e6071c372893bb7b72538e518ebc57efa70b7615e406756c49729b7c6e74f84aed7a316b6fa748ff4b9f143129d29dad1bff98bb +A = a29dacaf5487d354280fdd2745b9ace4cd50f2bde41d0ee529bf26a1913244f708085452ff32feab19a7418897990da46a0633f7c8375d583367319091bbbe069b0052c5e48a7daac9fb650db5af768cd2508ec3e2cda7456d4b9ce1c39459627a8b77e038b826cd7e326d0685b0cd0cb50f026f18300dae9f5fd42aa150ee8b +M = d686f9b86697313251685e995c09b9f1e337ddfaa050bd2df15bf4ca1dc46c5565021314765299c434ea1a6ec42bf92a29a7d1ffff599f4e50b79a82243fb24813060580c770d4c1140aeb2ab2685007e948b6f1f62e8001a0545619477d498132c907774479f6d95899e6251e7136f79ab6d3b7c82e4aca421e7d22fe7db19c + +ModInv = 1ec872f4f20439e203597ca4de9d1296743f95781b2fe85d5def808558bbadef02a46b8955f47c83e1625f8bb40228eab09cad2a35c9ad62ab77a30e3932872959c5898674162da244a0ec1f68c0ed89f4b0f3572bfdc658ad15bf1b1c6e1176b0784c9935bd3ff1f49bb43753eacee1d8ca1c0b652d39ec727da83984fe3a0f +A = 2e527b0a1dc32460b2dd94ec446c692989f7b3c7451a5cbeebf69fc0ea9c4871fbe78682d5dc5b66689f7ed889b52161cd9830b589a93d21ab26dbede6c33959f5a0f0d107169e2daaac78bac8cf2d41a1eb1369cb6dc9e865e73bb2e51b886f4e896082db199175e3dde0c4ed826468f238a77bd894245d0918efc9ca84f945 +M = b13133a9ebe0645f987d170c077eea2aa44e85c9ab10386d02867419a590cb182d9826a882306c212dbe75225adde23f80f5b37ca75ed09df20fc277cc7fbbfac8d9ef37a50f6b68ea158f5447283618e64e1426406d26ea85232afb22bf546c75018c1c55cb84c374d58d9d44c0a13ba88ac2e387765cb4c3269e3a983250fa + +ModInv = 30ffa1876313a69de1e4e6ee132ea1d3a3da32f3b56f5cfb11402b0ad517dce605cf8e91d69fa375dd887fa8507bd8a28b2d5ce745799126e86f416047709f93f07fbd88918a047f13100ea71b1d48f6fc6d12e5c917646df3041b302187af641eaedf4908abc36f12c204e1526a7d80e96e302fb0779c28d7da607243732f26 +A = 31157208bde6b85ebecaa63735947b3b36fa351b5c47e9e1c40c947339b78bf96066e5dbe21bb42629e6fcdb81f5f88db590bfdd5f4c0a6a0c3fc6377e5c1fd8235e46e291c688b6d6ecfb36604891c2a7c9cbcc58c26e44b43beecb9c5044b58bb58e35de3cf1128f3c116534fe4e421a33f83603c3df1ae36ec88092f67f2a +M = 53408b23d6cb733e6c9bc3d1e2ea2286a5c83cc4e3e7470f8af3a1d9f28727f5b1f8ae348c1678f5d1105dc3edf2de64e65b9c99545c47e64b770b17c8b4ef5cf194b43a0538053e87a6b95ade1439cebf3d34c6aa72a11c1497f58f76011e16c5be087936d88aba7a740113120e939e27bd3ddcb6580c2841aa406566e33c35 + +ModInv = 87355002f305c81ba0dc97ca2234a2bc02528cefde38b94ac5bd95efc7bf4c140899107fff47f0df9e3c6aa70017ebc90610a750f112cd4f475b9c76b204a953444b4e7196ccf17e93fdaed160b7345ca9b397eddf9446e8ea8ee3676102ce70eaafbe9038a34639789e6f2f1e3f352638f2e8a8f5fc56aaea7ec705ee068dd5 +A = 42a25d0bc96f71750f5ac8a51a1605a41b506cca51c9a7ecf80cad713e56f70f1b4b6fa51cbb101f55fd74f318adefb3af04e0c8a7e281055d5a40dd40913c0e1211767c5be915972c73886106dc49325df6c2df49e9eea4536f0343a8e7d332c6159e4f5bdb20d89f90e67597c4a2a632c31b2ef2534080a9ac61f52303990d +M = d3d3f95d50570351528a76ab1e806bae1968bd420899bdb3d87c823fac439a4354c31f6c888c939784f18fe10a95e6d203b1901caa18937ba6f8be033af10c35fc869cf3d16bef479f280f53b3499e645d0387554623207ca4989e5de00bfeaa5e9ab56474fc60dd4967b100e0832eaaf2fcb2ef82a181567057b880b3afef62 diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_mul_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_mul_tests.txt new file mode 100644 index 000000000000..00fec9d5bb5b --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_mul_tests.txt @@ -0,0 +1,2191 @@ +# ModMul tests. +# +# These test vectors satisfy A * B = ModMul (mod M) and 0 <= ModMul < M. + +ModMul = ae2ca2ce7addaee2e2b7752e286b2bb6a58b51cfbed5c924f00398e59ec36fe6341cd83da43a33a12410f45f6228079c4aeb3912be87e2e81fa1799151bfa0fea29873097475b2c3efa312145d0bf7e51b2a7c9bc961a4f4dcf0c883ff90b919b87c21099fba40257645be31f95a3a277 +A = 6b18497fed9befdf22a01d988d34213f6687d8a96e86c188dea4172e7c6095a0d18d3c86c0f5a1af9c6e3aaeb6baac2a510930b3ed06ec78ec2e12b +B = 1a058d99397db0d209f01212dd4023ae01b15da04fe62d1f76f21622b2695558c67d706c535ca7f19b36f8ef2d508ffd6cf6fcf25e5 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = c462c7cdd79b7604246a0cd97b40ea5a9a77408f13cbb548b56ee713c690dac0507fd988bf28e77462832f4307b08564a51510d4a951c1ad7564316dbead2b53540090827a8ade8092a6133af0e5fac7310f787dc1472836178ed6992b9f71224da3e884bef8e8379a58e6d4be0fbaf59bc520f786631857213305e23fd5ca65 +A = 16c92f77c139706430f396f72ec7adb045745cd9f5899b0074d9955bd32de66f57c05c7929b575312a7f1c04f19e724d64744bff7b31ad0e6171437763 +B = -8734c4a2361fc530f60b28a5f1c7e93136c5ff6bfc7553965eaca54c61e6befb3c0f8cef4280e780cc5940d21a740debba31f863ded75 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = c462c7cdd79b76042469eb41a7a83115eb84103da4ba438c3e33227631dc185054ba4e607141d1e60990d8aad4e0bb0ceb645ce9ccdfe72d4738cbe1f6a73ed3e070194fa4feca6001c4a853940a227d15c1f1cc153d8c96e90e24805929fb11e0665e0c41c77d5a97fc5903a8b215360e26f6a19922d650f460f7056274ee92 +A = -6715098ab2ba3ea1e6341e89936e3ae913cdd450dc831c8534071f3c362841e47d88f2cd29c0d1239aa0949f3685f12f8519625bbf10b2c7a515e6d00942 +B = 536d4b3e4815ae5ed55bae6950f5a8a61d52439d2800ef1b5ba2285b85ed0f6ec4af9fa0e364a6b14f6f6b8bebce9200467804e787f9f3e9 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 309b3e30f74c58beca8b2c23f64fe1203830db8a7e306e1fa2e2022f0d6d422851da509d1b2936f088f0e35effe12a7463f47ca369bee2f2980bc48dd8e696b2d8c6f35cf55fb8baafc2e613b4c684de26129cf196741aab873f81e498b1e03018a539b5eadffeb5953029f31f8579df7ec0ff3f752491910 +A = -11fec955948e007b59fc50e729941ee9d43d552b9411510b73f6b4faafc0465f261f8381d96f647267f72175883172918b5c866cf1f1ffc43c55f3c96a60c01 +B = -2b3792f39499767e0a8b7a6a406e470a78f97ebb36765beab5fe52e95abf7582736db72a2ebfdb2405e3954c968b350a459ff84ef815dbc5910 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 9143ec3e9f74a8eec476cab17ad8636eaa7c60e108e89ae0702dbdb2b255a217ba2530c6fd52658cd931b962054a9c20c8713976ef3b7989c40611cd25b0a9ad0635d61f6dc95dba6e0c4a7d53ff539b623b97ba3d66344fa324f905abb861c6b1e830c4b0fd5f6a4b01f09c8e1408941291b2285c4625267a108c +A = 7713413d87f1e50840255927ff27bad79e5de5898725a876e4647913158cda9f5fa031dd7fc11d2e8130a0ba99e8706341c1a98d5fee3218763ceb1d131e9cdcc +B = 1384e60753dd4bc20cdabf398525e7c4aa40065255c5058cae0b2ec90a3821bea8de672a712431aef5864eab719ba621cbbd8b46fe86fb31286091 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = c462b3b4a0432890d141c0f46a28190a2e30ebb2e4ba90ed132169cd72316b290dbf5c261984d98e63eea6525fa890bf52185ad7f164cf49f67ca91c2f35511f3bef6eb7f3da31a602a78e4752e326d79dea729f4ca6438f2aa65eff44bc60979b42e44f6a301cb5de8fb42abb47bce5633c6ae9479d39c9e8b507d96161e0fc +A = 17d806d7c76aa8acb051fd9c0c782443f1b1b6387455f7cfb737c41658d0459bda5d13587055eafb87ad8d209bccac1fdc392aeca0774ea48799511c1fb9141cad2f +B = -d7c9b6574354e131de4b8643d766641e98554a03238ebfce1112c3da5f049d6c410a7f05758571aa2625f7190b936a214797570539317b32fb94cfd8 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 16c84ed15ec6352a8ce6d5c2bdc0d9f13b333072fc7041146e944a29391f83e346b8ac0bee6dde98a420ba4f8852801d7c5bea6f1177a6cbf799edf2146f8297013e0e796917cc967786788ff12d9c1d07d9ce4b897bd22a1b8a391d3b4ecaa5b5c85d0a03aea5145db6350c42a964a41ee5f83e7d35e14cf442e5d99ccd0ac8 +A = -6d84cdf18a2f53fe496248fafef183914d55c42267af3dd42a39515e80cf29211fd58454986f5fb6afb56170dd9865d3158249090270bb9af341c830522a4dcabfd494 +B = 6f6f3f74187b7d74dee92f79be864d0a2c56d4bca3283742e9cdf15112c8f4208e3ac8ecc98b44b4ad74b0671afa4aa9e48dc31d34224a1f66bb2b4658a +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 8fb782e4883ccf3aaa2d3e020b08993d580c69ec8fe66ecac152c5babc8aeffafe406736cea492450fe6adc25dfa2e12723a3f9baeb02fc0f785b3db760ed28048e1710a78a2ae0c96b67c109c5034375a512b6fc7906847253f66316baa0ef90facc9ab992235153684d49d6939ab9e91086529494d7386f604ed69aca2f53 +A = -1f745c8f0c8fe6ce3f893d77fb274c61b72b2d9f9c5a2eb2467bc00d1f496d0ad469d76bce318bd64ff1107ee5fcad4469f84d658586a5789c068b0cb9b866d8fdcbcac5f +B = -3a2347b491813252e8ebef1bd181534b074a368d076b8c80bde2e54ec3b4ec99001f43080c7857427e069d99b1b65cff998a141ca6963aa5fad1ee632986ad +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 7c0c1c05ae1d6420bd93596a01aa0153000ecce660a8a14d6fde7d4740719cc495fe6681a9a08163b2dfd51659b3ae7db0fbe09504370bfc695457d7b32665a4df53e879ac817bf715d5bd6ca0e242b1ebacb1ffd6698ec90c442910a92b35ec103b345f9a9e5c7b005f8028da4dde80f36f6f6e5675040d19e46aef06040eb3 +A = 4c09264420a9452c6f0b55baee42c076aae5a73697cc6bbb88b7c922f236ee4c18e477f88e2c40cee03f0bbe87d3ac8dffd75f635315f856a3881c6373e8b9a286c813325d3 +B = 10474ece7ddae5c53c4df5b594439124370932dd94aa5d5b4ddaa233b1a55634fb7d72e33bf1b02965fa9d1538f97e1cdb5ec0477cec8ebaf202aff8533211169 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 481543f1556df756ae2e422ffe35aae020c9bde9e9b1f760b43043a4654de363dc67f381c0df1c3c1b90edb4343c47ffb8345a1aaf5dae56f446fee08a0b9ee8c42fff57143e10846610a9925be96418c4c957b4e92af734b96fd6f21974877dba52a0db1fec4aa97640e357434f95ba74b6b8323cbe17118dc489552844602c +A = 11bccd165d9fa2d8b01a48c0ec549a6e600396cd2023f0240056193ad27e971c604eda8aaed6ff6be8be1001f3dbdc8655f1ae84eceb963938ae7bf428eb5c968f584798c1bd8b +B = -cfb6629ddfc98a242e3290959f4d0726c0b1770b52393bc7488a471a90f7f0951362c03e67f443c9ecf4987f5303a789bf65e0fd59cc5eeb9f5d4f40d3e4a14080c +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 2a770ccfbcb2bad207d0e2dfaeed04b6e7509daef00a1df88e57509451739a8a0f15106ce8b53d280a4b4e09900420714cb6961ebb0e00e88567c5df50d2f2908b4bf8e0a9a5a8b3c6120503c14f16a99297459543c467dcb67915e0a10e19f72ed5b6891a6121b66abaa602818801d3306630bb04ea57e6b31b2c05e368d398 +A = -442c80289bfbf00db06eafbf06109b55f99786a323fc2c6db5686f99094cc24aef50475841243ec3ade2a1e0ff28b4032fd8afb8bb5e28f3b2863bdb9fc8f033adbaeb5f2ab16fe9 +B = 6d43e3c46f4a55d49e78f40d34033a7f5fcbe50873930e7c5452b6b3b176534e6e70033868c85b4d63052964093214dfd0bda6a84e893b1aae3cc72aa83d039e51c014 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = ba0e8c91a86af1001b13deb115c77609a1e7a3736a6b807255aee898e3100f469ef6222be532dedb1b8d3db4b3b55aa4b5da5629c83e9b2bde76bf2f2a4119a5378b5cde000980b3e58595d988ff776f0388fe025625ccf368e20914fa90dc771c826e4a836b2890e82ac2274471d586b4de5dab3278f0e70207562ac6e6493b +A = -14be403d28c8451cac4dc83fbf895a9d2b74f730c39b0fcb33d7258f99211dde31a78f182ad1d27a559031d67d6f2f94a741f141bab80fc692afb452ee2d502099ebd5760ccec7f7ebf +B = -2742dfd02134594edc6d3025aba5ca4a34dfeb43821ad84164510b43be4fb95748f8d0eed7bbcbeca14efe843fb676882784bb36c889be29bdad9270e0956286552119561 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 20c691d6544912fadfd9894cbfd42745991f39a29cbe3a1cdd302bd0487bf70c0179b9579b77f8481bee13ddbe42f32d734b6118af92884c946ea8576f6dec867c1c251c73777cad7c7c76e90da00ae07f96c8d6a751e5b18157dac4468c05d32eb86e74e0e8312bef85905af8193a3f5c799c5875badbc9eb7ead1258e56d7c +A = 7ae9b4d5151b11bb7bd4d1569a6f4804f3b4d77948e0c6300e4f28d51c9a0afed2ae7503e53489edca5359e2b3d0c82a9cef316cd7e1c1275c31fc9c51a8c1e5fdf23935484e467d6460d +B = 1f46f88d39fbedffa8501fa1268bdf3460aa98e12b629da59676e61852a4d3f8c59f72a2fd717fe2faa09639bc651ba516cd39297e0cac67444ec57c0db47c2a4e250033d02c +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = bf21b3cd55c0df8d4d568d00f757b10ef3de782ae71b289cb2b59d36df1341382bdc1825ba13199f2cf279a72968b3bbf5f7e3d13ea9adeb96d81132788231fd988eef04828119dcca21ec1fe844998909cc95a8d01720e883df27f07ef4dc3f09081015dbbdf019b96707c18b0b1db6e689e8f86466a2afea4a9cafc576e10c +A = 1243b14aa3d16a55935f6f8ca49295e35e7f75b03de7192e1e8a479abc0a430e0d340acc05eb9a61a5dcbfe3ce3a4c5c940699f5043e924f282bd21e341edf8b7a6741c6ac72d7587a9e7a60 +B = -bcf08b2153e8ca911096189e35dbdb21b77ce89685484f574c89f1747612f39340bf1b204a23530abb36b2c5e195940b86ef1252d6729393c25d4c73dd434b6dbc3057b05d3f15 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 460539d96c07e72acba5b59c88fe904bf7f1e1648612908444b0b08172d05968b31b43456918b4287dbe01afc3cb4860d9c2fe549a580c989b6507094f6c241eadff910d2603f747f8e289e7a8176ca4a978bba89288a4cf875bf3e03939af966c54e77c28119a39d34a2b7055465f58ef2efe7c82ac547fb675653198e4b504 +A = -5a44cb669c055ba7c28d49f84bf8d12179aa30bbb9db2a48d7a6b09e44dc0e0f7471e3629cd2fb51e5a53346ae025fb49f9591ed1d71bc79daeb3f1254342d8a2b091ae07a758c1555efe59e78 +B = 646cc0f766346aaecbc5147a4488ce157a6d844045b80884eaee9d419087285fa71108b5ab4a05689aacc8d2e3dd0e6714c55eb8f77487a3fc5e56c3c2df0c4acf28a457051118560 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 79b536f4f30f9f7483f90e65e6456ef8072d9a7430405cf8c9377ceea2c676afc338837643436d55ac6af2326ebb362684bccc5092367209822581700d641cb8d331432b761e4c6e22639a27335f45a25ec019d180fc53dfb53d69216d7cfaeaa07db8288adc35b7bbccf2829631c1eebb821e4d3299015c3d462dc17aee5024 +A = -167529b1e8668938ec02a68bf4d76c22dd018c41e19be25e2f821f63c2046085d0af30d8b4212ea0f3f9943be1c14fb2d2a944551107cd2bbf8dda5bf258957325f06277036282977db4575b0deaa +B = -378e1be10a57e03b197bc2b1287d643ba6d89da4bf6a6170816691fb6529c602eced237863ee39659be3729825f032a57eb5de0a87b0894d1a1244523e85b6f50a3d9976dbb038490e46 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 658169197ddd0bfae101c10c3e6a2b10dbb456048e81160b47b197fef439b1e0ed710399cfc80ead8e436f1c0399064f92da50afc335847515686e055fc7bcc0ca721184435955b896b0af4f4d96672ebed2f154538d49fa507b945c0a6ae926793751231980274213c80046666c28ada213a2f87509d1466b8d1b2122e93f8 +A = 49136d37ae8f3da71a6114327833e8aaf3dc8b5a9a27e9d04c953988456e525263f86ba94397321c2093803b789f8db3ed7cdba19c4b796500b979e02952e1625246f8e977e01fccc133f94cb22832c +B = 1dca005663385fc00b4fd58c73adc7589d15ddbcb8cb2fba03a737a320c447a2b21e576ceda73811a31d8277883fd31e22f776bff3261a098ecf8f40f2855b0c723d1265eeafb43f85323e3 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = a49fc8084f3e780537b4038bb769b8db3653a3315298a99c2ede6739a1732a636e9787f2e8b09d0b9bea08fac43cccca71a315e6f4a7d6417d171b4693dbdbee8cd9f95be0847ffd40ff027267125d67b89737e1d0365bef6c4429504d13cd8ddc7810f456d6293c0c57c14a307b94010d79d5c13b92a907f923966fd3c5c8ea +A = 1e7d8de2061cca59d1cc19b356a8fcdf2ccf917e0d81598f014167c5a8de027ccfc8f2cb8c37c396ebaac83ba862c146bb2d551d10ce03de9528f97725804e8a6de57b9d9da811200604c2a032462b6ac1 +B = -e38592f3acd75b575f64ced439d5ef2377d21c61bc70625639b01bf755fa2c6de803ce155744993493debcd4de40860bbfcee86d0b117d7f8c3f8ace68b67cb6fe7a81a145535553896424f7a +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 5a99c8a6afaa97d8e7d84f4899803c7786b1bfd2ecabdbfbb3bbb92247ff91ac213a72f6d23c24699d60babe91a7d9cea751e686c027fa1c954474fa5680f0059118426c71299462b11de5f2817d190599cc4b352df4d2e80605f9ad1e32eb13712d3027a2b6a19d52151e37e7fa057d8fe59dfc8a943a42a1756a38f103a75c +A = -7df29221e6a102e32757c18f87927cdc90ecb012ab0557e0ab855daba832d76ddf595b9c5a62988ca968b64fd5bba2a147a5991810c17cae7edfde38bdbb7e13a1fe5206724c05a9fc9276c8d4e503a860c7 +B = 5c586d1aff7dafea3b8ee42e0e8854712c95385374b5bd1fc8ec41a72b296e070940c4160509a4a1699a678533ff3d12299338fc441b0f01e29a48677bfc5aebc644555285756e97c74e1af6aaa8 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 21fd2d881b6a52332dceea42664aeae1ca110512c13bb33e25ba4ec0f39f80eb73b1fa0834c998c23a2453dbff971eadb183c51a30ba78d593f23be9cb6b2b33a554ef31e4a36e0314fc2ec889f18debb956b89d1bf8172553271bd56d89ed0b30abb70e68abaa2c76f73cd5a3de93433747d09c845b5f8843f9fdf9f6c975c8 +A = -19fe3bdddcf08190a037768b77666de803ca4f7f0d7dbe6aaaf334a486dd0da7ca024d1b3df11e0406b0326595a171be30b04574c1a7d04f4d2ccd334663690fd20e4fd168386280510a00a70c1a11e99483048 +B = -33b2400173c057980b0e0cfabbda1a5cb5b83b7ae80708c199f28142237f04b071c6eeb63d42e80eec04b76152250c9e4d4c4f19a048cb9815dce6e66710fad1d27494db5c31d9af37d2aa779d12d7f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 1c45cfacf30682a876cfe253f05b393a2cd4dc065ce73126508ce897a99a723cf5145187643ee62d746f6edf70269ddce3c348a1432316286a648ee9ac31ef87feb14f25c42f2dfc2e84bb5bdb4ec0124e249c526c55ff2cd0ae938555c5f86d856eb181572ed01dc045f1ababa52d249e56aba0ecccda905d7d1e64bf89bfe8 +A = 6a40d948eac2fe5bf6db15d7f6b89fdc0712e32d39a881c21859e8f7722391ce05973efc7c40e2c0d7f56c217d8a986bfdb08bf87bc0435873cfe4d01967c46f7d39464bec411d0369f6f5d1d83f42596fa47451d +B = 12529775e8253ba220d890d4912fb95f91e4edb59610e889431208b6bb42b089cf2aaa12ff9ff98c2482e7f4cbf35b22d15fa28aa288217bf766e937a706fe1e600143087b0a67f668cb7b762c9b9f38c0 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 3b3b08e8eda8be3918bf648227eb0d569dd898729d9cd54deb32b1a1dc69cf7b2c4184c8ae9641f0f75950df263a5e236f428ca86244e617b14a04edd0f31c02bd4d84f25bacfcd4a2786825f0361251475eb6c7e99020dfee4298a1f1bc260d4e364a332bc6f651dde7ce5026dbeb0e5aa75ee98874da54c7930108ad28e3a0 +A = 149d36918fffa682cf90c4d3f3d48e6408e7ddcbeb44e78b9cc7fbb08108f65215761a61d79f37ec8f67cc51e0a9b4bcb3834b0ebcf6734985153f29a2778473b80147eddc813b4fbeb98843f5c1ae6cea68f88dbb4c +B = -ca87f66182e271a69c0964eda92a009d438078b584c3eede28ce1a501838c5f497186d305c09922f32ba858fb55f2a0dbfc9cd0f93b789c1f800cf092726d6d33db19e4f26c7dfca69b83925db14544ebfe2 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = b199655160d88b6b4157ada0e5675f82b33b5592408bb57c46e2f7d8791bfccaa51436dc3b772b83e907c20ce7edc2835ce96595b78c0647d244e9bad6f4184e0003eb0899e7a47ba0be888b9bf795eba95e5073a85c4d20416fcd4a8d4e1e16b403deb38845fb8bf9e9264d68807acf02d579e8cd104cf2bd555e6cf73d0450 +A = -70ccbb73e33a7cec30ef2071f3b1f2e008e70fd6d00fe8b7aa4b9146fc6d0549c57d984cd014c7e0a4ed6d33376998b7c2c9778fb9580d8ca4ba795c88612721c153c186740c58df3fa63b6cf7a4de76e049217218c05c +B = 6cf4168d44a8da8e8446b4420466fefbdeeaf9623a40e10b77547687b25f36916f2c18cf6060c03b3b40e0959479f6aad5e44dcff0ba799262ef53e280f4a7f667d262d472b2e573265774deb5ff8f25dc1822b +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 6ff91af444c61d2e2fe8ad73bdc5377d5becd55074eb60f0f98eca3d8f4be8c02f196b3afea12c36f78b78ae6a5ab677ffb7d9c0bd58987cca816affe468c7fb4b56055f5d2326532d6ed1c00ca2d052ecd103994e8929bce04e067082b4ded7e1973566f99c514b4e0d95b9a8a931ef4f6355066940990fead70208a63841f8 +A = -1c924bea12ad6f8b65abd1796e381fee2cfbec15138191bc22d57165928794bb080c83878fa5fd19a5d657b2fa91165459966f50aabf19440f7d75f027b32e999ff4d3f7a7ce878fe0f33a847d644d86ca19713ca9968d97c +B = -3abd4b281b8f25f5957d1f2fde904457d49a3a7eeceada26b454ceb4ae0e879135d376571f08b5038b7b3d73a9a9fecbe265b72375756a715a523ba66737085e5ef7a4ad988155adc93eadd5d95a0faea56914983b +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = b9076229b1a1241e8b4da3fe143ac31d060785be6ac1e841c2fa9683d2bacff2e2b5dbac33f58b0b1718ad2053c37ee55ea54a9d258ddd8930d2784852844d85db24e4721762839a5c73cfe588efedc8932ccfa585e1b5975083919be9e32a86dbdf5cef84d3d4b2ccaf7a006c0cadca1e35fff2da9da7d7e779494d8f85bf4c +A = 75eb0fe6c07559c2b0c7b2acd7d29b5798f6c4cda64a504ebabdf54bdc773ab28b218f0defc040016178958d5561796230b71edf49bbdcbd3f14494859843c8ca7a0f777cb05827f2839f3982832f4f3e3c5e50af17ecebbbc3 +B = 1b8aa718d61447003fdbaa748a9d86befdd2675a677cf34a1be7c81e4577f665d71135a8a243976a4f6ffa1636695567bde522f8fb1948033a7e0941f833d827e957781cb4349a08c6be418befc8959960fd5fc1b288c +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 9df82b7c34ca97a3a5d4efa28d5ed4f35484914dd73af9090c4bb31ea3496ece8ec650f4e7b07dc779c97e597e76e43cdadbfc6e72b61ea718c073be1cd204f8ad2bad0df1e530e75705f3d3dc285e9d793c8d42f04dc20773d3fcda8ef3ac1cb10d33d20a91add0358ab8658f49d2fe51d0d2d72684e31c0eef85e5695bb4b4 +A = 1fc2a171445ee6add5c2e4d29e50b91d83338f8d63c111e4d3e95f16d2a33be02bef24dcc3d6ce6bb8f1ef980dbf8fed409a0232c0566153014eef840aff58ed8c33e8d463d408f93e2f5381a26fdea63676c4e5397eba1d39f928 +B = -bdac7a177c77451104852bb99004ce8e617036906667258d85adcbe8cda21ab7d03aa7dcf62cb210a9db8fc750c7e1ad290b35473be0fd607fcdc686de0b78fd9f258f5b25e2ed43c2ad1a38859f882b9f6b293dc258659 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = bd9f3d2e8a1086b177698f87a9860e3a5f030e04a0bf4ee9436ac55e005bda01ff4ac662cb85d39e98a41c723ae542a83a936c3bd0280c6801ffda080ec0aa4230b45dcd0bc5eb41cfcf272028bce3572847637a92d1543bb2b8408e880f5b776e1cf14fa28d15cfb584f025596ff10c9f091c837a3aa622d9e5c856db8ac207 +A = -7fd5357cbee7c5e31fb62ad03bd47b705b574d915200fc7f1013d836b9cb683db020b152ae9464de6aeb8baf14999ac7025dde6173fae6ade325c60ec310eff6dc4130a8efffb15ddae90d760cb7f76a27d0368175d4a44a22f7f223 +B = 5894a0223e4aafe4efd4572752fbde4952c8b09cdfc35137e7e6ed650f8fdcfce9de673853dbf73730b159b2656047e69377d7c5025a6b346fb08831e64bc8bc34b75765012460d8135a4f7a0f41d768fb85abf17f5e2f5c3f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 2c61867bca70e8662c7e5435a5aec020faae86fb079b992bf49d8497fc5f96abbd38a6f04f6ca8510e0160e546b3f68b7baef4ef0f404e881771cc12ec5ed3e3787c2d2ad6bb957cc59f8d56f0afb4bea49cb671cb42f4e8a0ee1dfadb6fa14f84a5b3269dd33e20d658ea4cc39499c7a39a4b5650ad7018d32f97954610f676 +A = -1bf5ae15f24c7c14eb59605136a3f679f303cd5b81e4a27465281d17715afdc2c231d7ccbc59f80ad176f4e0326eb757b52e3695e27c6776d7936da47e3a8a904f735b151422029535045ef489e61ec93f02e6d588491c8dad1cc311f52 +B = -3238dcafb85ce557036d19e42e7e7e473de9f9da6f920e18845dd010546868d2652decc94596cd2c36bd16b02c02559892b9f573bf21ab18c3c75591413d046b385d08aa66d849ab8adc9fbf788e837b047a7ce2b9c63f7fbd263 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = c1d04b831b712d0619db462c3f3fb5973f5984e9a48493ff273a5abe17a548e185d751628899e2851e425a7d4b2c72d4d908dc813cd122b8f497e08e299dca9166f19752ff8cd9840a70155ed9e8c063a3840838b3679f96f1cd5f1cbf0e037d222029e02769dce7fdaea0bbb5417f85497d77c76a387c6b970eac15dcd128ba +A = 7aeb60c134e84f289e419b74f99a5ce5b4aed5fc630d5d591ac7643251ad32d6ca7f052fdf8857f67138262d221de644140e9018f7b84879d74883f8f251303f65e06bb52246ec6a912772cb698b47de41c1826ddd065359f6b9f1ccb0cdf +B = 17f81e53d9fa6201e4d3eeebb32267929cd5258d10f053e7c021c4afd17094f8ecf433b1ca752f8740f6d6bd84f801b1b9fd64bc4787b9ae5e5aba0b4318a63dfe27e92d5a3ade192af7563c74c9d6006ae7701240efdd6021a83cf6 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = aef89874854ed34deae1b77286f9cb0e3017e3ae77fe050bb244acf4f30dc03504c73c1a4d44b769709bdb53811a5d0f8a76a08e6a66fc2cc4e98537ad6a8049f02494305b89a49a55e71fcc3f5fc42d6b478456ada9b19ec0a03f5ccfac5538c0040092771660312be5e51996073ff1a506d7460c57d54e10dc2991c028606a +A = 18d3af14bbffbfcabdaabe44074b407d69abdd80a6eaa5954f0e45fac85af7ced1715c78da872f7a8fabaad3207e31f12b7195cdb25abef0a1e54d3b13349d997f207fe130d7985e2033cfec899a0af310c9827749cd22bd062eb0b1faa254de +B = -85a7d9f08a60031e689b0e611d7f7f46e1178eaa2e6459602e738990c77f4d3783ac43fc04d53504cf67fccbeb02f9846756f8e32fa4a9316b6d3b45f644254077bef096a72bcff17ffa17070a4355121cc5daa2f782fc0d0bb48101db +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 14a85edc6297763547702c212b1a8274b8f85d53ef35cd1b01ed51039bbe030d0a1b9626ae2f571a43f1224d723847a1c6708f2238f6f6fd75db6656e6c703a5acb57f69717efe8ed58a3713ba2720d8c001d026d83de0ce5e24b67c41daacedaadfe404aaa9b672f00562e6901fbd0710c4303fec41ee3338100beb36c9b1ed +A = -44414ec207060d105f599b9a66aafecc5b232b55214c1a5e1922f6b59439b3ff77cd3a327bce4f7406871196b90350e6dca9aae147ce03027dc4de7563c734f111d95171f489105de5ca80047cfa43f7e932917b816ba7d41fb95b4106745d700f +B = 45f2cea1b9b75880ac3ec206740cfe0ecceb488c9155cfacf5885a8cb49be78af8cf221ff8de2328f4880479c031f830a3c9eaebfd83f7de501b7c5cde03c4720c56a676d331b2a13c4689a2e34a43fc11f62825b8776e75d31225ca7ff65 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 7670c1e2e141d8f8f5466de8ae2e0ba2eb3eb7634699eab8415d3a37f8df291d00def88361e9fb64a2f116433dac3ac2764fd62f3201dce4e48a3b7019e5465f82241ffda29d5eb0462fde74dea3168f8993ccd4d090b9c31a5a6cd7e05f725bbc89479836b89379b422250ab049f31c860110df5ed69089716877fb0ad7b0dc +A = -15b4a2f808a85a5bd466a342c4853c04ac0ab73f8e53a4a0477f73dfeb8d7a911ab2eb5d3d192b9b084d0e38db491148947c66f838aa5f460c37341b129137614259efa531c0e6ffdf163ec6851737037a5299060418d96da035e6f583e6ba79d0414 +B = -3e94fdf22004384f7881875b1d8f58019ed8afb1b6a31f5d591e77b0998f3100b34174d6f3466da44b4c7fc8b92ccc5679c26c146b704198a65a88554d24291adcf897bd758a035361f671a82972b5962002c6a828792980f86a64547165327f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 35b49beccd8d2010a8d777c1ff69e28e01a1bb78c6466e717f0a934bb62f9bbcec5ed29f9cd2c14d240a6c33b28c986eb9c8912a4927605532483dcfd31a50876e1819f3d7a0f49bd276ced5c4110470244fca52d2611ed7e31cd8b73e749aa70743b39e92810b3b52320342a65cad3180f6e2966059d15f79e5574348f5f66c +A = 6fd078e3cbcda6a71a710e99204da640edc71a65974fc765999a74ab50a0e4b090d57ed0ee869c8da2cf694b6fab56e87c4af62fbe73eb8890bc066ec3460beba04dac3b8fae7e4f316e8f954c6e8d934e946dfdc9f4cde0f26bb3d40d5c444b03bfc65 +B = 14d8041a3b83468d2f44f150ad8d8d0a1a22035d630f2a17b70d5c3d557d3abc7e4d753e1ebfb3a3ba465520b84746073d211a67e079ec7f47c2cff9c06da69bb5cbafcb6cabe7e0018867c42e07931d6797d4499463e3cf786c6d5d6c8cbd600d8 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 2f6e0fed8a9720fbd83ce950d7545d2c6d5b271582194570424f90309227a51777cac974bca0ad3c1289ceb91cf75af73b0645cc20d71e7789144876b8c1bdd550328d9907accc316189e8ad81310848cddd2dbe362c9398d814a048f93f9368fdbec0f19ab87ad2a59d4066d738c3da3cb71d4716f2cd2336ad35ea1438276c +A = 14bda9e4aac85b0ab7abece728f61450b7779d3b5fb83be813758e742d2ad76597f132aed91e20a75c554f0d61ec4dd118eb733d04942b2548b1efdb4dd22fdb543d9bc1e4bf0574ae2cb2c46fb98cc4835b6a074d6df1a3bc5443beabdc784d542e3349ad +B = -efd765f8ffd72d041ac3244078b8dc4482233e9411b289cbc2cfc26fed2cf28e286835010438ddc9e7021ceb098b10c68bcc4732608ec1f4052df9362176ee14812bbf09ccf7c2882714ecbbf92bbff61c06e9dc35a368208a05dde949fa2cd091ce0 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 1f0c436379f6dff55a59093ff2a0626a9b959e3e3e59365afc33c7a7893f04bca863ec910c446957baa8de4e35a1f4e9c4a776ef41b053f03b775f327eb7e5fbe68bbb478aa4339ae703ee4b573d6931e47e09271d40239d527fe77098a7fbe519f5eda1f26dd6a7d0ee6833efe37187d8a85844690fecf9fdc3a4d80b921130 +A = -51eb34de29ba24d2b1fbeb0a1c324f4ebc69cda2dff971a315c0c2775d988b03ca29891ed0790f3dd507a1d26ead461dade9284613e45df338dd83aebfb66050465d8aee554970b43f7d4e0428e1512289fa1f9b23867b67095c455b66d536b91207b749189c +B = 55259a1122eb7eb611a69118d3d42c2f05dd228d71c0e1e42ae3a8d3d180a95b74150d844e916ac85105805126e4b995f2ed1cd3fcdf28e1fd241dbe3125dfb3e4d90556256eb513a2f7c9b596719c83b26931d92bfd3573560e8bf054138f5d6b9cde72 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = ac321a272d2206df4dcd6ed8ca194a1049c1e3a20bf325fa44809d302170f850721c077bb5d792f86f7ab03ca259567397cc2fa1429771190bb632ac2c92d3fccf6e05e13cd33149994cda5f9c57da155439663f6a13c66f9da553f5038fb92fdba186ed9ca04b8ec87cba4c5a68c8edeedb94e38a6dbe293340dee1a4ecc768 +A = -19ac99d7d51456b00a193b3b04693c7e5436e05763f0154768db078ea5111cfe9eda3451091af213b9c8cc649d341de66c12ab2803ea39655d3d7de182a77355ca444c5d2778f791d39952a7a11839e497f5dfd8a703df49ec4d7628bfc25a992e94a6477e6be39 +B = -286d1d436f113308be594f0f43d7a05120639152b7e2f93058cf602cbdbc016512bfd23f7aa937fb358b7b602d15998ecc150f2b9224c58527c0c1267739e065e24236771e2c683957871637468181e6e896b513569bd004b9845f0f0e4c26a5ca123365e1c +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 3466804a1b7d1af8b6060aa93a4c325d9cadb33ebcc8bd991f9e44cc2cca8918411efeed0f005790d649382ec40278c8cff903cf3db177d24466c58cf6a56ffc14e595c36bfefaa2327d37f616b1466eb702f5c49170598bc361d892e18051b8233dbc5b3fd6832befd9a995bcef3b0f3beda6efaf09f7306ec203172e78264f +A = 6710c19330d3f974fc377e28039e0c0ee0a558621fd67fe724c326537c18c66dc5eec60980e07d401ad5556a05688d2dbe7b271f9d5eda3032bf7cb7c420e7b5d65a195bc037090b6fe83064ac3731624ce2baaaa62a6eb07156ca12ee51d4321988026cff573ede9 +B = 137ca18f47a151363a3e8c52dcf024262ba525ec8852e8e406f460fffc2cf88f1999b17a5821849317fcd84d09c88ebb6eb0340120f113d7ca5fbd91c6a40cd790bce7b422552cc0cfd2a6417add2501db1667f2802e5d0f4df824adbd033a90a155cebfbe0b53 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 6f248a70b2cddd9627b32fbd130f05a604866799365f94d97f1eb582b28192959692a870be7c2614536a8de84cd8c1364a75a3927ef9dddbb8c6c87dbf526f2d3a7916384f2daed96002831173fa4a51863c28b4378f99b1b201010581d5eabd66ad1e328cc4e647bf5e0588bb775e130b4a4d029eeeeb5852c5742862ddbc3e +A = 1f014cdd87cb33ffee623cf454edf2c476e91df279b4f0879637eb6e8e5ccab305186de67585595d34ebc195fb150408c4620cf6c7a0b0d9695ba0e0e1d7552ca7d0be3dd678b1cce2beedd11939891a6804770f1c843e16dc2ea6aa8e4043940c37fd3d950caa122845 +B = -8d8d9dedc80994fc5db04d8c935301e47054250fea9020bde8d5fef01f2307cbf458d5afef5210a369c396287c5eb453637a2d721085af3de0d75a5dfb5dfd22fde3b229d438439af7b296b9e68ffc982efc6c825556c52a735f8be12a214a06c4270824d5268fb6 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = a35ff7e232f047e575b200b9fc4c9253de6ac04c612b8a82c275a951075eace5e7d6664fe8f78301d554cebe7b996c1f4ec3ca59d8d12d7196eb3909223de94c220f0445d24233534af1c93433b05c5924799d2c781fdb88c4537bb8d442e6bf76b2d966827bfb4f40378a3f135103513da056bc0d375b1339561700d15a0227 +A = -58346cc8a9a1e5b8babaed8e7f59415388e0db654ea7cd465d96781c57faae7a8af8e7578e46f3a8de7bd1027188e1cc32fd1c0d60be24fa3289a12cd822a6c9a77dcf8799624856c27ba88fbdb047473274e651760581b44457ed048cf76c166d38bb9b2afd3416ac7e45 +B = 61951a16dc6466a9fabae99df29b7229f1ab96b476092dca1e4f8fc8e7404e2fba56ee66486d1f27f89bb3f86f271307228d7d6cbcff943961e177300b6acec1eeb46af1c5725f745a2d2af0fd9642f57a09c9ce6742114be0aa6e939e638bd5c7a92a7c206b2d36e35 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 90b441d8277eb1ed454964acf567067925881b5db0b446a7d554dc61ae87ff979bfb0e58ca1706123453e62ce31284a5a2db1228d259e27abc7fb5cc5848dbeb9a6808fa1b4afa844ab39b652abc41423c2833e1209a1674db518b6df7ebae315dd7f416df54e73088762ef64cc2cd0a08b1cb01c49d9299d149cbe84145a55c +A = -1ebb693ea7d18e0ff4a9a51124ebb78bfa3a4635b75a6387e9fc745a2325409f927324d1289be8a4f5cf2d5c04adc7ead20564f97e453287f03e5ab59a6133584f970446652d05a131d7d382c47b7cb97580ef6710a532dd4f5a0369dd3db500ae5a3c5efb587cf0cd2638382 +B = -3916ebc4653e7d6e0a4f1e234d765d41e9e948b5acd7ebc73cb595559c1b20b037a3c8da0a7aebfa5fd327bdcc922551cdb8db3fb0a581fa0620ca2d2559ccde3ebc44542b4d80926d061e2a35c08c09547e0cd587c396ff2959ee93ea64b1e6b7e2b624cdf445988e1f42 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 3ac61c3a028f4a2df6645acbd36818a2f76a3229d229ce22471760807585a909727411e8b68bfa4e76adc459409a101a1ce83900d46918e8d0903a163de87c07bbafbd60c7f536a62c59370ea53b6cea4384345343146bbf529334b4201ebdc7585b6e5eee42696400c9be9f496406a4eb51d2fd1b40466224f1752b181774ad +A = 5a16d5fb9047949684b80805e5d962bdb939d0d0368b48517a2a826679c37ee0ded4fa83e657192d9ae84294e450f7e2f2773d1f13395169582cbf95860891b9fdf8f3240a16aadd1198e884f22b2718219d478e2410fd4bb98ea534a3626201959af099fa55488f5390791bcc7 +B = 1f67066dd06ed4a49cb556dc2fce22814754885a7cf6c13915d974b46b0e6269c0fafd688f45ed2deeb026a7cbb772c080dfd577d21ed2c81e50e7537a70dd550eb94fcdf626500040da88c43dabce13c82a93769a9e0ef66a471661292dfd3b3af07169e2dc909e43678400b +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 7087dd62eed6ccffc7e1370cca9444dccc4ff160458941aa9f49dec1a2e9ecce4cf50ac2daf06994c5010cf225cc92238cd60e1aed9edb2befb0fb354ffdde94ef5e8ad0415bc95851d59095a5c4850ec52a74c78eab58309f395d3078dc481feb9d30bcd9f113af7a01611b94d085e32193dec738a64c5fe9bdfbf5dbc98cda +A = 13596eeefbf06e9ead8d883113d8ae6cc3da8b6fa13ab66681db5a9c083ef9e49d905ec19c39b149cc09452eea0446b29cc92d4e865e6f681827336945282fa6b276ef552363229a976c503b822e6e4a9862d3fb30dd0c3627ccb97a7046a6a679050a39166388a9daad5ec5555dbf +B = -a4e574363f2e5982cc087b38110d257019962fc166c2d6e6d396220bb308a8a0dc7d90c5cb2ab85faa19b07ed7dc11eae9bf2abde0a5fed279e77a717b43d35e70fec4e18445e37741262d0b0c20dc4375371d87d839d39934f1dc41122e815f3f37352d04d0cf514738b351f02 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 8495eeee238164082240ae1db1e3c1e36fb6621e6b714c9de914f9de8a587d7106b8dc5214f7c60c0ee231d7441e03cc26462e71adf8e29772ac95d0395722d2756f9f64daa8ed41d7ce824a572d7f9fd419112ae823b5b48b8aaae09fe093e9ed05918c4ec88ab159890910837ad0691849b44be95993682b2da2b124de39ec +A = -403f21e1a7911806747bb78a4f20c4e6572d49c6c4ce071db0c8c91ee985e68a16e60093e4628414b2673d25c9f13c4c43600633af95017e3846512197c9515aaf9953570ce5861620716b3d80eae7de0f033772fba82652484cb3ce7cc189d1fafb14e044e07a88da302547f2e623d8 +B = 689d1b4a968b7c00082ae3a29c8571f826c4630c947a7767fe4a71af43a5de84db9b5baec0980eafd0019e09de1b5c56173ede68c9a6acf260bef3d9a03f4c83a33106c94ca7e1a8615b3553088d1d05a62ddab0f1e5a126df5d960f67e3b92981022e1f0358c7970bb2fd5dce7a7c +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 397df584bcd3b2e1ec7ed89de624e9d104bd6812901e38c5740755ce91bd54155c0b624c590ded199590be5d98bd1ad4acee56a62d05d6b5fdd1ade12f7db8e3eb08c4a5996450cc1204be7ba61b768af0efd563ea478033324731e24fedada1ad6e564238c891494e85ded4feb2165fda22f75bf120856034a9206511885fd5 +A = -19cc480d1e07523bac502872a971d78bb26955c5453386f5d51767150e229daad3ab2dc85e0fa0cf6e72389391fe627fd2d9f263f105508642eae5a095ec4d88545dc9d0a2c436907460e1ea7db174673000eb2e0b60d57163ced261bd0f6cd8ce54133cfa10591f1fd27996353110060cf +B = -39c45512fc7c9620194fb7ad22abea8f6dbff4a137dc4523115ad7e262934143cf1f320892f8c097a400d4099e787ea7041d0d69b6269d191fcdc8ea28340ecacab71058cb39a9c7362c848826b35ab560c27113fe53c497ca452397891c81365b6e7f07f916d47961e50b8c7c5cab38f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 263ab04c98efac12210beb66b13fec7c260c5b1cbc20cd732a511fb3786b917a617d6622847f4eed70f25982ef5d0b0d13848c62dcf447e3a1d491f4c80e69cec03cd318f6f93134d582210bfa81c1790562053a71091333348c6624d4d793fd6ef971d284a4ebf0be0771efad302015abfaf3edba017907f10ea14a46d9fdc4 +A = 7a354753e39b9ad1c0ad6b65575fc7247487f3ea320fa82d1d333ba8dd5d0ff925331994a6961c9c603be5775ef1842159551f0bfb34920b93d90ca60e6abd514650f77ee8ffff2bac0eecd0fe8ea0fffc6ed0285c9f3c3cfaacf338043975457d62f9c8dda8cce1e99f34529435016fe2ed4 +B = 1a4384f9620567c698ced05870b4dae983d8f0df6aec888353f9dd6ac8ad54340c3ba8346bfa47bac38897f3963fce972f6d55f3407ae03f5c7637be1a34e483e50dcc27148b76ef079f117104162beb191d146ec828ad5c5bde5ee1683a031d554c276d837bf1f2f622cd11baabce10212e +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 91cf4d1899e170bf75dda0d51a6481f79eb94c333b876382c9d04681073e949191223926523f6531f0a45765d7f382221eaa080d7bd05a3c19220ebe18802b15d8009714e8e4e9872223049622ca02040eb041707c7e525f698cc361847c66fe3673a72e4d701466bc374f55fa5437216eb59375c0e2c4f7020149d0118ea72a +A = 12f35c48024e8271e8f9a60a48b5a214bfb6595a837c041b230e6ac87a4c1d4b3f93a2d3a193c750c9857c8627d0f7c454d6c4f224dbf14a865eb83e990b1d9b8bfb729b8d3dedbbe9c95032e4d60676c2baa2aabafa698392590add3b83b521a7a5e7d6f8af207e44ebecd735374acd01ef5822 +B = -8fc18f92c0613d085cf3ee6f586b39b99ecca864bcbe60fffc63c585e5613df68f3534ad46e244916b1f9188507a3692526c9e403b8e93480b0a5a6297f65215f1a5d8e20631a9d559fa1acc15a98c9397761ce18903f393b10444ba51bc92ac44df90d4cf0852da9d75902230c6de6f26dfdb +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 9af562a7b61c6c84c91bf979f32ba5d246d2ee2050f07ec2dd5cb3f9496bd37c3922ecb2b5b17085a13e93ab2dac6022077cc18c621cce3a2d2247e5e89de8692a36f596e5dc7a6969a4f3ff0d1580eed380e6550c6218c1938caa2b7ab401ae6f520063c811088504d60a19da3b5018d640ab8d340f35d1337a2ede8bc64bf0 +A = -63bc10b8fbcb391dea305fe61b404d3bebd035514a812d0e1d38daa3d67f9f1bb8f02d2979270cb9147aa51d66ca73d4b5787e472456a13fbe0d568e92b622439d33ad3c357a56dd26806ebda7b3bb592385ca5dba7e5eb5d85eed0a1746441e8d56e22decdbf8f4296e30d222da5af17c427e832b +B = 57a602bbdefcdd00f42ed1e2cbde2ba858d171804da56b0ac87081424ad1569df1308fee7c9ed349eb496d5409c4c46921f09ff0830bc9f57e920e17df16523598fd90314141955ddb84a1522ff3ebfa812cfeb6670525123476a739f64ebe6a5f1fc805a880f8e5a71b908c483a121b38d05cc2c +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = b395c9f264172a3653af6637e72c4c8e564d1ce68032a5d761bf546e0c4b51b33cb026bb4256fa639ae98e54e5ff7d8921ae411497272b53d97c2c44b5b9ecc5aba43dde201f64f1d033056f19ceb0cbd04decb486a1d07ab1c64fd213d7eb6db9cd11efd743462e137f368acc4ca0b49a7f85587bbb5ede4be1616889e2699d +A = -1e71df5f04001f6468c3a192086bda948aedd19c5da9a5286856f30524238d95b0ae71940f2af123315ab5d2fc61964d3e970d5858b7c1a78d0f2cfd10cba7ba4830a8c19a09b59794ca5d7da32cd8376b5ab06079b51cd9819c0021ea41a9e43aee147befdbb17a92cac7c7767705fdd908bcd291fbb +B = -394c187308320ba1b14d91d75b8ff993dfd57f9c84e8185f12bf9924e046629ffcd7174879f9925bb643988259cbe9dc9277fa83a25012f91159b012f1964aefddd5a94ac6c2a55a22bbae93085dee079f84cea1d53dc4771901db9a3db5a14eb17c25aaf5377e2beaff6276cbce7cee97a9b8f32737 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 6602ce0fb5002eca37e85b60cc871b7b2eed13d38c20a37a6e0886ee4814f3ce2515f8714c67ad81e8c3abf6a00464e6a51b15e55b6c11296ada43cf459e15915026d3260cce8fb796241fc2b0bdd2b65ec04bee3b7ab6626e10597f3b13b43d16c34afd5b43a219917626c88b24c6f8392bde1b2e65a50b7f1a8dc5eb096702 +A = 4855ce75a3d7dbb72a257f6291e9f6ccc158647aeb2f8beb3e8fb32f6f59af1a46617b77440798562d6f58bfe826d3ea7dd28daee8f5162d7d24ae6c24c2deb2669b15898689ca789e2005903f3a94e991e7d3c8f3ae6181029d959bb15e71d7ba94d2dfd3ddd10f6fc49a65798b5f6ffd64682c78b5d91 +B = 15b3e9992aa3f042fd58ff97a8c04aaebf46b75fdc38caa9224394a1805cc26e4311bfb498d5a04d19396e98d11c8810620979362df82b23a115fc1711b57c7a56b8408e2682a2edca36cf9311addfedd2d0889a78cc1ab170d1379245de6f1f6f4db815fea9130463dfe5283f195e6e81486a1d39634aa +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 6a81ccd82f00d829bac186fb38b85097d52afa3ca83a026856bb83f94d6af6f6c6f3141d433f8fc159d11397df8d2f44c769f255cf8148249d8e9fc4f59ec3bc8e804d7d5189e71e20b8d0e540b59a2854ddd7feeebda5a95f17605e8bd5f311a63cc2e4ce23a51229d0a49ca04982c1bff79c201de6cc6150b690c98106a39c +A = 1f1589c9b5ad9d878631cb03c23ea7e94680220856285668838452a63b726e01709588b38e578da8a4845aa5cc2e4723beafa4f81a1a2e463f67d9a3e432de7064ba8bfcb943cd9efb0e5a136649cdcf5e85a667917075804991b997f318752304f4946d69abf161625ed0c03bf9abeb4ef28034f818e2a643 +B = -909dc7fcbd27d0bf7d6a3d0e2937ce725b5cca0acf78c103d633206cb431e2e2c785aea4bfe2042df32417143de76b71d21587112f36d067f878e556b94ef63d59a07d19647593efdba7f3f5324d64c55f93a283a0dafe080167f6576053f9beb326994f4a1d53e18e3f3e770e69450bb70f276d128e48ecc +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 69139f2e10726f83300505d15dcbad5b5f284d1c06789181683b7b8caf35dff063dfa4968c35facf32a3628dcfc19b3fa4c30ba0e030b06773832a2631529fe0c0c402e05a0c4e9446a8b6c22754c70ef540f90d903d83a2e3592169ce6b5edf939ac5ff25b8bd48aa2425321602a9571661a1109e275a3b3039ff0c2f430b18 +A = -5d02cf3969bff8789850ac898c00fcb3ff1fc49a22cb243ad18703bb8fae25f83502bcdd885417fe46e8237fd0b444712c4fdb8f4972dbf9278a83eb305efc7a8210ce55167c069d1c4136a9b66d0c4dfadbf036c079d12aa082fbb42bfb0098006136a61f3da43aba3d3bcf2f5ac2d7884caddd0cfc28681d33 +B = 50b369234d993721288662d83298d99b9052a0a66336a5a31b76dfb20ec2b5be3aa76f78b2c17c63d78402a15aacb585be5c8d2e7083145e316e71e111fd34f5c79363c4591c247b1a94b20ee042d840c42a3001d6c8dc7cc1e1348e0e3ea8c6551f9d24af2dc2d0c38a54ef065ff048b148ce4f11ed2b549c50 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 87de406a6c957e85c759f8ff684023a0f98e93ad4ffcbc6fb0038c7a7ceed2486f15f36555d286338aab3283aef677118f7cc3f88a7ff0ac9fed31da6786ce895c3c08d3edb652bbc9ac2b44c4cd24ad281ca3a8e8e6e4d730f4f0c25487cfc1b2afe222934eca8b1e1572780dcc149422a88eeb1bf31065c929685a0a97ac3a +A = -1878e0497aa1c2942a2e6956957c876dac73c4bdbf42bc92498f29a006bc92f788c24a4624b87324a7c8aedc6b2c0c8a1a442aa91557aed9bf2c02b6664979e8a9a21330dd839f4ba8f84515fa6f7db9287f7c20f31732b98fc09ee7796dc524870dc35851814bc57e1a8ac49d8935fea04bb08b8760df33a98149b +B = -32f4e94bd073cf3f70810d9af7a873996a0510109bc6fdebb855f27dcd012c59507491152d30849d75f95dd868992c6fbbf29b1d899cfd401e9e7f4e0436732cb4cc9e6a6d6b0cb63fb0bee21e422b7f7b7b14dc5d2b6d10447fc4add390fd3c8e7b06f1d9b181adfa8d04459ed051bbdc9666623b00e3871e597be +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = b456ccf9d066dcf4247a21c7f3820e324ac9cf004cecf8dd1f6c3aa40c2a33e24c423e97190fc71bb9fec21d36c5a687065a7877237a2a05e64cabfb3b20bfff0b1f5ef2e9adb7edcd7140d1047b0919a2c770579ab44a08e5ad9f63a06f90ec7d5885b91de5e524b2e187937609b4b81d40a0b33e31a48d7b9868add75286a6 +A = 6c484e3c6b530dcd3644b19fee66c41c7c2c1dbcde574d87ee13cabef9dccbe5b41e25c32c6a56df23f2e87176afd28249e5fcb918723707fca94d7e2c9623a3493d395db802a1b49d550f52c29666f785652fe81afcab00a60a5b50cbf523cd13dfa06d5a5b0809c68ff7264a2cb35b8d52284172c62ee658e8417e6 +B = 1b4fc753d0530bd07094bae09a02b1ea684fb4e8519086b1e2ed9d59af011f61d1b94ffca6f354a5b428417b328bb1e8af3f6c7ac9121dae58de9f1dcbaa9c73a357f408b870e62b0c7db1a72c4c440f2e6fe90b199b9dab29fc23927190d3f2bf8a7ee926a152e64474283695614ad696c85ea547f5f51d02d1b823e3 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 5e7c63276f350f04816a6ed9f98507a78314f1d99081fcd906affa3b8395fb58d029ec657af82e77ef45611bc988095bba9c26f25f8fd404432fecd02398e69635f3315a824d6a98b33eaf6a91f12957a5e80cb48d5b086c795eb3b1e04da5432a7e8be3d683addc586a44b6243ffbb7a979bf9664cc7ec41e75f267d58a7127 +A = 18efe267d4c62576294f4ba44c67a058cdc0bb44c48f4035682b2d6b8a63106081af43d99098ce133f8d7f9cd04d4dd7414f704e32871d43d6e5d73fa9f447873168b43b32d6ad19378d74a967f92ec7629a690d29a62a5a6e734e9ccf5b84857a00d97b9db846b057004b03d88b827dde717fc30e6a5246c752d65dd625 +B = -ebaa580d3eef5361547c692e107439c8391ac0a2d1cec0cd275d0be69133eba8a94bd186ff9a129af3f5a015d5ebd30215643554d7064635dc11ec7a8ed2200fd637b099e534237f0495d2b629abd4c8f84aa1d925d53e98490d02f9fe51bdda08b043f67f0903c0195fcb886c04397d3612e4501ab8c7b7db69f781e169 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 76fcb39f94dd2756e8266c025cebe8e801524a757b976e35ed45e3da3db720061cee9037fdb34776c704ad2059ad8920e400bfbf10eca9bb157eca7750cc31fda06473bd22d4def80189c47ba32e2824c721425f225563df2a2ea1edd090e01c0bf980677db5a5dcad37d21a68e2832d1012586f506480e929b2fd9bb4aaddf0 +A = -75f903ed9bb0b6db8e3be16e797258f6c18f6cb7b16f835f04e3045f7e4974d7a86a63f2ec351c88fadc0635b6dc83a797cdcb5cce1a1674f89e44190991e0930575b19e2aa1512bbbf2ef6f8c3e707b17516756fadb635d8c6bf9caddeba14834b5950a4d1e98bca79a4d15e5fa5fa3c1727d7a49b33d481d32fb14ae4164 +B = 4ccc582c8460f7def2d26167b68788a681c41bdf6dc805dca83127a18bff6f5ebea6db75cd959beb859637b200ccb5c7644d571f436e46a357d027edc9769da226278f7ab947963f7caed1e7e70e572980e960e9764a40c6db67bb526694b084976142471270b2331da563a10427cbbb38e76203d7da5d67487eff701d75188 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 5adef30c67aefea4da3884b8a1d0ce6724492bc76b477f1053621e7d19f3cac15448e9401d34e05ac4b508b9d1db9a8d323cf43722e0af6e3c3b6d463c6007449c3bc3236d156cdf988dfc308a1b4911554ecace52938a7b10f463d14f917ec3d9fddcf6d33081745009c59b58aa22bcd7dd8c3bbd489997d4e0bff5473ab9d5 +A = -174e8e057a1d66e22eff88de26f43fde1c8efe5611f6ba4f318f027f5a5818df02ec3f014dfedcdfc8c143c5005c3c5098d409710967c93474f5854c1113fe4030e6682bd56d389ca8b9a4587b8b9262d146bc92fcd81d75c3bfa4281898f394f45d5dd11cd4c7344ee7a933ee346bdaeb6f5188967c388b919a0ce6730c0bbdb +B = -22702bcc4f9d5bc6f803af6af8072780ff7de7a346d6b9293ca751d6ee3a81493fa86738c44cf2b7be4bf14a55a4f8179c35c09dcb1485f4c08ec5e9f9b1efa91f4b5f15a31a46e1ed71cd934ba6bd271bb22bb5703aa468d297f360ecbb48f9fd6c572683e83ebc3d432203347dc62e19fa06f93e087283347950829d4256bf5f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 5c2f67b1607776c10fe2c30b112e541c4d8229f5f99f615fa02cf715d3f20556a28eff5c233c58994e9c6c1fcc37b3416b0875b9a62fa5a09a4b8f9e216487203b387ff97fad1f39f674ab19c5e34cb2f162e6b0b0b0084f0618e64928423b73b189c744e3de9fa50d66f45975f68b14866cc16c8c6c722a54420adf027880aa +A = 67056e93b69e8a7b789f1f8b835d9c6ecb7762f844d656b26df9844a60bfbe0d55684f61debeed31a24ef4246485e8a1d43d49eaf97ed9e7b9f2d2916a8d85b8c9e8ad5575cf5a3fea42392e5d1dfb23f7ad41a7b56a4f21e2828aab38a602d560c99783a4f807120292ceae366b1fbfb4be8e5d4561bc8944e7f17ebbcb0fb6296 +B = 1f874f244ed6cff9f910ba9a58db0dc0a7435e8d99ba6412e976b8f64d4106d3c5c57ba079384fced1c261aaa538e131734451fe84fd3cc5cc8b3ab46b2031f888d95084cd3a35a61092672a9118eee4ed1a0df0409e3613b3ef45a8b16b71ec892755dc3f83c5492b67fb9a143ee6102d053078f4875636b20b536d5cf851768cf73 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 7850019c6712f18eab877faa8489daba23cf34b512a3193852508185b13cd5a2e9f503fe8d61b74b5d3930021a5b8c38322aae9b9b1b4814fa4c2c5bc409b58f11fc8fd7854b17baa94a6bff5f234832f9468d90d148fa2bfed774ac03f2dab6a506a70db4ce363f932adcae202f04fdcae968f632dd674416c23d4e21345ef2 +A = 1e378a0f27e6259763890d29e112e3d8d2bdeb9994c49fb67ab680b6e71a52fa0a7db886d3baf52f36d943b5430ae8bcd82e229f4197239c35678eed254c5816722b995e9c311be942f8124e2f80c1e59658433a57f346adfcdb83202e55457308161d2f928b60efc39538a6469f90f1a868cf6077568c8241623896ddc2705cf04e4f +B = -f4ee37e39d4cadb692bab5483ceaf0258b068f2c0354c540438803780c983469ea28324ce7e209c3bf55b91f0a2f4544bf318585e4514333eafb9b8c2f02170c620e9b5280a828ce1d8dfc64ae9c28577e15071825a85a59656c5b47d9a382af6b78a5b3dab1078dd647e0b473174b8415d401543d30a4018cc3eddbfa546d0fad9cbb2 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 4c8f8b671443a3af5ef5749885ce5de8e2afeadef9051bc49c0d7e72922d049b1accdb79d82288e472b07578e8b6d2176d6cbdd7f0caab593dc0fd9224a94920235410501fddd6001b62a7f7d8eceaa7a8e4c0de52029fae68656e8120972b5cc1c2e909c2742e836f2fecfa51e12e4f8a2ec7e69eab061c81785374ac607fbe +A = -5769eae759dd6bf94468eae94189d3396886d4569b0ce264c22d39b623be3abb01bd5008b9fc86701a3373f7764118becadcc69481cbb134c20f669cefeb376dfc489dd4ee91cb333d06afa391dd322abe2b3b715d11ee372666473a473e29dd90fcc97e939049b455be52b3f288db306999019c1177ab5820d94859a9d2f050b7ee1d4a +B = 44adcaf1e2afbfddae19b23cfc0f0ba1f940d32945d0b541db23f3a0a9d06fb1f67ade9a8e620bd96f4005ced99430c7a55eb7e93a701c829fd5b9e55dbb4d3833afbcaa0d9c946916b1a86af4a6393b1155c6439b8b82260e09ccf0ce5d1c4856f4d524983e4b0fa123267694a1c6118beb8be26113a02721a02d7b0ccb01ec6e9c0f9e19 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 51e25767b8d4d7b2b0c2652d9ca6bfdbfea06acba543b1bc8d3d25b2fe5f2998febe1a6e742abc3f482b4267854c2223a5918a9b5c84e0864278283bcb5bace0c046db1d0240443404fb62d70ebff3ccc655e5f5977958df4c878d9859a69731744f3d33978ac31551487270bb4fb56ccbf59402ef9fee42cbc329420180de08 +A = -1966812979042198f70b3f1238c93ac5c6e5749f1108c2bba869b1dac7680f910e56318c9b59be9212e713a348767ba6e75917fb599e929ea2144880d18d4fbda4f4663c7abb49b02245169f385e09098a4e01b56dadfca8c803acb7cc244f3c98bc17440ab2afce318476b80e1d0b4ed9a8d6f2a0be64633f8faad5eb48de2681a38a633ec +B = -2e4f5eb92fc34c753c61dcc826abab6fc4f427c6ac7e73ffdf65b1037464b2a9a0b0290e713d81ab57c0e1dc30e76fdf96046fe10a34cc4511398319ee34bcaf73763a9042fcacf59a100c43d3333ffb3743048e8df0dc61fd0da3f935fadf882ffdfa9f0f42980c1af6edfdf161c4b16087e2b14277f655abe54582de79c51193e13169b55e6 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 33539b5f38a9943b15801d449adabe02da6e21651d96acd9aa40e866bf65015fa40178399254e8af6bb082d021e2a05da0f45b699d193b70112e114f0d25287476dc0c733c5cf9df57667ad0d3ffc4ea2f85b43cd10459cdca9465b0974e578c00a6e275e0b97ef2a4c9886aab7b5947b78a88f84a3f1d8c5f26bd07bcc59886 +A = 531b891fe9e8db322cec59a2115574c7a304c423e6b11516906b840542b2c608785e2c18033262ab9cf68f63edb40ad4f073ce8841db602cf8fae0a6771d741c6392976c9b333ecfcd0c8e9997da40616ae2a9e0c6be93fdc7af0dc0668ded1e42a9f729c70f74500ee76a91d3d993c075c2f645b35792a20edf17c157459e35c0a48da6c4c6f +B = 1a6fdbfed1054a0c5758f92f72db7e5737b0740c4d8c3ae4713366ef6709b21eaecb6b74c92541a9a0c99ae18ac6ef7de79d4c84ce39ad59cea9c203734a99bbb895916275e8778cfcf7fbb7b7d081a677769e4ab96bc7bcf23303100e629fa8e07f5b8fc2e39c7b5724c72907eaad09d3088783b3118e57c9c8ad1799b43a13f73864c5602c478a +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 2eab6018361f557ab06725ad90f6886d4b468ab1a193f8fdcfb4ad15fff781c8681329a27aeb5f03a81d7c404b8017b12fe23165e941ea767c733513a07e921aedf20596763f6f977316e37bed70f6a617e5c2757c229c59b3d7b1fe8755b5f65f7f407f13634aca7c8a267e661ae2f77fc5a95f56cd6c8458119df587478b1b +A = 1cc779145b2b7bf9ef4c9692845e162329940f96eb43e04db8728bfe736698082aae6b6a1b3c32867c293b08547a0941cf4059d2d567840ab6ea526e3724ad59e715a3782ca656cbb739dfdf0c113a18f0dd62423d4edb60057fcaedbb852178d38f1b5a232842b4fc645cbfd97a8cac0b094b870064302dcdf23df2c9e9f736d93409cbb8ce9ab3 +B = -cbba16086b51bd83d3460e51cf193ebc79b826e4f30978274eac3b2dcb04e9d7b56a1449b7cb128bbfeff5c4720bae45271fcc64085d3ee501f0f21fe73cb7db5f275d88be55c339f9180ea21a8cf3755a875331931b75d23f57c2030c89c6f9c1ead431cb4dbd4480564c83f8470610e5673c7eb6c0fe7351ffd7ee460df5db7872c67041aff0227f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 96fd93535728b961b4167be8b304e570cc34e787c12a9a5d76e099b336ed6b837cfc246c5bceb04b0f4744c5da7071fc01d70e342509473e5bd7c60d6046c9b4f21c5ee71c4e678447f837db3a7694fc3936ca733efdb7d387f0f6e263b3ac0b89054a826da9716691c9d580ad38d701d08ca090b6c59be466e1b9833e75d820 +A = -6791fd686f46c3773fc8d7f4753d178a93f6fa4941f4305d9689c2a305bc67840bbef80ff05c7bc6de3a595f73846609327d28540cd705f5aa94a3ae5915ef55304c37c4c43a4b46906889331ee16585629bb303673d439de9c0236f708fd19a977e6e1032e0576a921853f7dd328979ad1f1aa945905dae93a82b3af9451a541f544c18ed2546b66e +B = 6ae062b39c77bebc2fef05743e6d35e14a31c6fe1fdc42d8de2db94ce70a6d60d66263c7414b1081ef2fa6ab511b361b8baa9c71ec628dba5bfd772c440baefc2fbed68d40897878232d9715c4b7e7c9bdd41cfe7b6986d825f68be8cc16d04afb0cf593f3028f3dcd91bc94923f3d7211aa5f0f12d3270e8df8bc191808f0e266c4fce2af97ac7ce06b0 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 949ea5f645ffe5d0d03359d51a663c7dd6e6013812a47be309575e036503126f48677c68c4ef6e7b3f72d76657fa282ad5881263e649b5297da82e24298300d032af3f5e8309ac7eb597b16e257a6f7af3476a264415aa7783433e83be57ffb3fdb404a9ddc3527d6a9c297f8cb7b6674961b3af837ebb65f218147a46c39cba +A = -10f59ba073126d92a201529a5374500612bc59a9e66322c6706b422d35a4f82d97e668b268f5527b4641c6099c80bcea504234f3c1e3fd29eba0f161da97c50aea542becba499f29d4ba5571873d4dd9eb3f48cb26fa6c929a704fe8e49791b2ca3293c2428d9cb453263935c9c90a4a2b39d23a0baa12535845f907d42b729033a0a1e74d18da30a88ed +B = -34fdf9ae6760d4f434d09ce2a7760ca2dda14bc256015809745524dc49d841b07102aefe5a1d0182e3e09d4d45b415e46f653185742b9b8ea6960160752080e5c9577a12182ccf1a293407b534ea8ddd33ad16cd19ba537d8db5b542f86a2a292423d452bf18d82361240a7efa831518184572c5a8b73b108a81d5036b3b530d98bd47c7fb2123418f12e05e +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 9ab739ddae55a0d71b39974628d4601122ba6c5035c3ad0439691317f23dc33c0014f3e870a105e4dc1432ec79693bac658433b21cfc218ed411e003990b94ebfa87767f3614ec19f5bc30704adcaf85a9d3d15ea764c8f0bbd52ff388659637746d39859398c79016ace8c6f97d3a5616711a235b85f334fb889b9280ccbea1 +A = 76b15a0aa0f59ec804a5e9a627e1fed524320b29120b6789f8e71b1ac4e00a9a8c826919035b84f87d291e2f35460bee181342136dd9eaeb99ed00c6328b8e44c49ede3921d6275f6e7f03de179fb2374ae2fa6c58852fbb2649e214691daef945ead6c8bd5a53ad2b130e9eab6ad046ddd6b80874ca6515322bc171ee32749333669de0d9c883058423579 +B = 1fe2171056ed4585a143b6b2bb5f44047664f64d710dfc05c18be5840ef9426ef05b6e92e4ecb5544ee4622e9030153dd9827f2f01ef38e62b88ecd6c46b4457d16644ef6d863c226acfd6928a40de614a5853137124fe69127a7f05463eaa49bc742d8f7be300d06b302dfb0ba86801119bcdc01b516afa360aa8b22b7c6c1839cff859ca1bf26e3f7e030512d +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 5631048ffdb2767aa04d59d8a5750016b38b983a2d53743ba4de5d93bcfc8ec30183a84bb1e290ef9c72c7ad357728acecfc613a6f9b3d712456d545ed54a337930937f4589fe41e66ee930db3dc10a4fe41481008c69eced65b9d1c46b8574c5ac8f7d94025d8fff00ced17a5e17508527681bf94c2dedd51502a2c4652538c +A = 1aca12b1933f25ea081e12ff4a4f6f9ce379f96d976da2ff7b8eb8ad791fabe31c1148fdec22dfd67828e540c955a1e13f40c5b125e1c7e6bd839bfa84e5bfb58bfed76058c6db77af7a34ffd25fabd60e19f65e1faeeea6371d7785f2e5bddc8650a7492e06691d61f997483661eeff54a30656f1daacf31182486bc40647975151fc05d2f64b50e632f5d5c4 +B = -88ed894287043e7e5cd2eda3c1e5c97f85809f7a246b0c20891fa9a024f3aba4ec1f3d112580fe6ba6b0bdcaa1325ac7ec9508aa88c187af08e4f37631eb6cc97e4481b18f747ce6d35ff355e425a4833834ffb8d34a818bdb015fb818ac9f58feb87020234243aff912da5590ea3f6cba74f1a9fc3ffa2b4aeea25479c55a3b572621e75d86d8c8f6ee4f587e0f5 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 6ce341aa4a571cd5bc110dd436acaa09f409661967de0bd096c77c60db58b2b0ec95cda50acd7fa20ea4266b2c579eeb6ac214a75d40abbb70845db74c4d6c93f8c545add269d45fb15d985e7e630d0425565d06dad4a3ff9835411e51fdd9780c24f466dbf29244cd1b8c3445af181d0928db399bbc8632f7ebcb9d48c0b754 +A = -52c53999b02a92d6254557203cb31a21dcb896495d1f29f3277d19129ee43e521ab9d5a297204a844a9537d63b74686eceba72ea2e7b98ee8895513395cf7c44c99348f5c4eb657874a8115f0027d6a416b8a04a1ec0e6809b7701ee7d41e99996e307bee9c295ab3df1faf674e0067d0ab3bec4da998580203e33760870ae472a3045bbd66e352b8f4d284efc00 +B = 4329d110504caeb71ce0453b0706ff675f646e70a6bd9575791a38f672eff226f4958f8b1fe4123c0001d8f8595d8030d0e9798232942725a9b9d654ecf50546adfba7103fed796b455ffbb4c153e70f941bef7953c8a210d6f2f4ddf5d9a79d9938503ae8f24d69d5d7df1c988630ed960e12dd877bb80a1ab0bcf6db67e0c0578fc0c40408f72b19052534da8d31ed +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 4b9fc1e0eb4be199427c48bbe1b53948d0135bc1965b8aa5421a4ec704b13cf934c650405ba02ad611b0f29d46d82d4a1fc5a84651a29364524e37be2fc7001cbd3c792aa477802999841ff19620cf66dd2453c9b05aac349b9094d43b40e358f32805d87cea3cfa98e05240ff95ec57d88e0a12917628ebd34946eb1ad6799a +A = -15a223b691d8b3696306b0ccdb52c1d62c7c2d1ac71e5f07cd8fba960417b42fb5ebed5eb9469be67f231b5254bb0fcfadf5ac5d2906769e8bf8292f0442986cabd88805a162c0c1f60f9ff0bcc2029ce33452d05f754375c0bd147fba745bf8a0008792d4f90d0e0f2cf391f2d7865705544f4a220ded44732321473c0ae7870394d4e625df11bd0923340cb70b995 +B = -340e5ccd644849d982bdd455ddb3b9a23ca14e168bb87256bcc370ffb6b7fe78fd062b3bcc1ad3c8c3b8cb549f2baaf1b7f0f6522aba02fd35b651f7de52b3aa2e0e40352bfd6ed0f84a2bbc3b3a396dc8512ca1db01cc69611925f1037794c82a418f10e0d994f458d1f19051e8bea32b90ce744d46718f42e711c094ad0a1ee96c88920188078f1b044ccf307e4cad7de +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 31c090e5160faff9a136a7a482b42a43ae3c7d00c215cbdad28804be0e7b12b0b3af820c1350b1622a22c8875f24d48ff16231c826d1a946c66f70aef92d4e6582e3ce9213d907267251ac74fa3cca9f1c8fd53fe9898aec19936a2b797fc345d68f0791cc740199be39c05053d5591d874b415e62653b04a3f41e263d00f230 +A = 5419e87e50b28b6d24927934b541d8de548a8f4ec7e9b00aadb6d23f2d33406177d3fc72d29ad2c2e141ab2916adfd30ec4791c626af61d8d192276d632aaf3b54e2ffe83b44f6f1ac441e6823b6b58cc08fd7a0af945a02eabb5aebb2c7ff0622a17b38077cd0cba906ce23e71ac7f4da40ef6066565b4cb3a62ebda28f3629eaa251dbd9979b123a5447ea20331723e +B = 184782ba4daf429cbd13ac13fe93fe5833f09915cbbc707feca3293e505ce9cf0b4b12ffc8b178e0a4617f809be53d4895a4182e7a8a65043361e654befe8b01429ba4b7420193d1d7d90930ee19cee0316f33a5795335f5fa517e1ffbc99b95101b0f936353afd3bcfec34851ebff1ef02fea991a01b587d28640c935ec91496d1aa3ab8d38a6ac75b3a4198ed27b9019bb3e +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 5eb9f3ca660de481968a3c7321281f22fb9273b16fc10d8eff1fe34842364dabcfaee4993c1c8ddb7c8d6e509a8d2afc005075d5fd3c4471f0622753c7797aea900e785ceef905e2606f64f34e47239c40b74f07e2ca70bd5a18cb0a88780489f3e98232221f65ac9c5ce703a256b7b75eb1dd38778d8bc05a37ac9ad8d36b35 +A = 1c73d8e3d5db127a81477a5c4c6d61ac62af446981773ca15a9a01fd5175a2826a8763f91d68df28ee606e8ffc203305875a238d2095345556f12f3b5e10c5bb6ce3f90342ac74b9ac057195c863c4b9d28ca1d958a98649c7f8897bc6abbc39becae963f61b33bab4fd20d9d0e5464f21c2cdf06d00f597dfde45dc5919f5124f26888b12d72cbd2f57de3f2de7c014f891 +B = -e406fb60e35f0abdd313b8431f4cc89fbb034daf71fae0cc727e9a93cdfde53566fc74e48f4cc2111fad158c63293bca0b21b98416381b81d2443d0e91647679481cd6b6869b37112d3b6e575eea7fbb5bdea422558d817b49ac36a829926553202cf9dcef09423c085d26176a89be741ae20a434ea461def090dbffaf2e2ef97bbd4ec779041ed69ec07d125c7b85a2d215bb0f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = acf9d363fc9b76ecf7e61c33270031340e66595e559dd1c9dd4d2243819b660183521a4124558fd4b216dcf5c52c4127fe517c48cef428b9ee0f1bebabab487c968a80b9815e82c12e807c096974ea3893a8d5597f745365c352a6bc6ce92479176092f02907538c5e784bf26dcde7672338f402753b08de8aa21b9480df6955 +A = -7c03ba6e3939ebbeabd35cca277eecaec31f326ab75f1a29e05af50c4e62e0175d4d6a57acab87cf1fa3a51791e9a2b2d4d5db570ec3941263902b0c74544c323c106557cd5139d2a25f3c3ef81ca009d4e3c16f1abf6e2b5196df1b30def46d61eccdcb3741a6dfc8e8c5e6db68ec29c82b0adf6e35ce7aacef8da806b3b58bfa489d319869b20768f8eebb604a9624d048f9 +B = 4e021959da96ebeaad17f9896ed53010d80ed3fd4c3a826a266e82b80ad81b3032303e7c0e58034a652b8aac00c08d42a530039de60d74ad349438f5ecca1256342ded6f30e3bd2aad5bf2b49124cb27f45f697e157550dbbb37f5aef0f04839aaf1ba43bf1e77a1529818d0fa91d940904eda6b748e5c86cd1b37592542c43b7b4afe2b8926fef6dc01784fa431d43900edef27f8b +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 24124c69aaabec7a7b4e7a82245f6cb14b199852a8b314a7b8d9049cb66096d5ac93ac75eb58a2004de8b0fc8375638c0878fb6a45be8bfbcc292e3571df1bb8d6e346d5595fa395fef983a365e4e868154fb3e337d47771419e7f1dd5e4220900c564d7cbe8e7792ab288f99d265aeb296c5ebfdaf08b88d9b30ac660cc3ff8 +A = -167c959417e9566c93e7e05d2a410f4850e3a313e516ec958c3d2fbdecbf58072d05691c68981e176a867d7467091dfeca11f695f750c8c44ebc4d08e39e679d96c4791ceb1ea3b89fa3ce26f7ef214c5368c03ba694f7ae592bcd8ae53a66cb3eb1e0cd3c105faae6eb7e7a8fbc88248be722406f2d35e46c751b5ceabd992091eeba15191ccf6dd61a7ee0c624d43b188c42b6a +B = -343940f3b2a5f73a51d6f609e8af306f44ce7b5c2e79edf6f4dfc07866dc5c4b2e0ba48099b5503af87762a44ae451d166f8914ba25b3cc41a766583bf73d27e40784064582fd9fe952fc00e9aa2d4e4f1ef35818978e725e69c1bcf267fda4d635d1d292d54d3ad10bae9763dc5d7f7226f371184465695f2d384d749fe07967a1bb64df22f294ed88b13600c7068d881f713cb8e3ce6 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 50cac148215963e58cf6d2ebc36fa518c63a0ab8fb136ab84c9657fee459043ee9f42aafec89e8ba5fd1cc5c4495a41e80590ce197e12c087ff7e6ea88ed798735f55a1634562b82f8514488ada526e5dc10700058980885000e266cad55948d1e080f6343f84b12a3698d9ad5427fad4017d931df77ed2e45e2fb8380b7fa39 +A = 6a9833d768a22ea46aab1a1619f30283a1ec254a2de5652981d73146aabe31041ed04d271c6f2e5e2d090cd615518a06563a94ee2b12cf9f142de3f15599998a712974d0ce9b122a2aa65bf8750f54c6324f12e321a888154330f0f9e1e5b7999acd70d4e6da95c2df1da2d19544b7abd2bd3041e3228c7cdba44f7d1cbfbcf968f8fe87fab523eede0485efaf5cc9e56095cec8983 +B = 11e782e2b3f469b1e3d14ccd1b8301ffcde7e371f6e9afc99af5809110c6d70e1cca5c0bbfeb95fc3ef8352581c11ba75c0f8c445ce2aea903769a24289581c95ae5ebd9553fee61a30d155bf6011278807833eb2ce7ee2a98fececa23fabaaa259409e88e3c4f4eb1e04176d44878ad3f6961e0615ade2fe86b6eb02adeaa7c9019d63231a28f84b7dcc8bb0e71e2a717db09301e1dca20f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 7cd49d72bcf5ff4fa2c686f21e1f0146c4f24b9ad2e900dca1c0a5d2fac5047509064e65ac582946b251a3f04850c9abd8b80c92af0fb11ac13debdae8b94927f1de0e4bb217e78f5d04897c6a0762667d3d883cb754dc610442c9dbd44228a7ae4f14fca145550d813655befe3bfeb52f1c76f989ea8a1dd9c10fbc7e9d6574 +A = 109fe33568598972063279b71ba0efdc2e03f770cdec331428fb8ca084c9b20d0fdb5cf9ad7ce90c8cb8f0fef10d219d7dfcc6b4599440db8cff9971da7852880bf004266886eced8763b3569720df3a1fb0dde2717ce0183f2250034871146628430f206c12f5fd87574c206b203d90c0f2c705cad3484c73da8bf4e9f7e1bd433a6f7fd27df63079d30c490aed7161bc594eefad4bc0 +B = -b95da952cabdebe0194b7fba519768e1b56149353cd12023b97397b59e0d7f4dd1d27b65b833948f58e66d3f6928cc3140cced835dbd612cc82a7e9fae1621986f71ddb6707ad57926b03e87e165d30fb145795a70627975bbf9d9ac9bce07492de5227c666663cc28b3e70b19dbaba7f16849535ce5fd61e91cd2875e0a534a10c60d21f919d566a3469d108a35ec3f023210efd5d318c7210 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 98a89cb3c9602fe503c32c44609bd4487b6c8323737b3376dafacc3eff96efcce7a31f1b61ee6799dc9561e77ac058fe5195cc013e72a2864f7e492d9f35244b321d46270a582f6f14f15fa8203d392e81b183a1d64d48b51d70e38d49c93869ffb9d7509f15ccde547d2d9c4dccd50eba49190b6e831a9f4f9000a95dc83f3c +A = -67d7fc8f1766c40bd476cdb65d4dd161c3d4c2c5860a0c559f0e87ada213c9ed33308c36bb1c7d615fa69ec53656bbae6b57181a0134af23ea2a75f8fed3290a2f483392a3745fb57adf2121738c84f6d34325121a702c8ccac0090ea27fe9a5ebb6ba9d4f397e4a7e3151850b3d7d25643398bd3e4c1da081471389799245d986cab825a2e6ca72b38ff978a2753c835299ab4597bc65fc +B = 676ddc4d18960817ff8fd2adffaa68c87d234d62d445d6ba3847ded849356d929d9e4ff01f517d7b1c0778bf90f475923517d855956f17ece1e032e2fd474d2133d6b8a591995454d8b587cb4f6fdd0fa29305f146d340cbe6b6efd28a926c73735621be0c5decb792083b3f063a43dd9f635e03f78c1bb56389a5cc993c8f36134d755a324d4fccc2ac3bafa270df67db0a4ee6ea4497aa33b5a8 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 76c31404854006a7d55554762094df6e11e0393f5b0451d85de2e5b104432df72023a35f44da10dbde01cebf77b8f9d3ad582373c5d32232564729af0d03c5450e439045d96a2f0a38871c922af2bd38c545d219adce0ec80fccd121d6a733bac09253604a8a0b1ecf0f24e44b818ab9e9974181cef10e9eb17684c57d72257c +A = -134e8784878a8f3cf49ccb952075f9f9bcd24a20f8883955f262867045c11a9c566abee00638927e5de924872fb98f6376e321ebf3f567db6cfeede62e04f839617d78b7c9d3487b60a0d3897b3fa49b14c12511d04854bde4a9dbe5f31424a3d05cb75d23b46f6c0819536020880afa5a2c173f6881754b56f82a2864c99c820156f96b5cc4665d603597331d98d90a52f4a30c6215ee5eaa2 +B = -3c5c0d35de5fb21c84d2db228829f43b31132b582556b92b495f59df502a6d00584bb5bacd9b8c1a8c7eab91db0ea24b40f07e62a712842d5c2e1d208a6412a068cd5c6394d715260b67fbc03e3ae7eb4862f74f4d7484f747774fff03830c65fe022d579adb6737f6dfe297db750e6a58d1004e7e2716838befc2ea97179ecd53b7f36e3540e1c3a0f3e044bfe2d0efa9b89d2d308cbd0bd88ab3706 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 5b704b3181e5d0494937b4d6aa8172eea82919fd1d884493197a6a85ff047a7bcd5dcf072bdcef0287be20d4ac49918d1df550d184f86d7220f0a84fc4da3ad05e131c443fb529df01fec9fe4fa6fa2f36e791f9e16b4092759016d2f9b1ae7c3d071c57edf26386aaead767a3109c12a5004c7b9fa595e6d592daaa2dd1df04 +A = 48a0ccd2d14e14e2aa862d306501efe5de239e8ef36ff6251c861a0aee9f739411f402491bd99aebacdc26c4f30306f9137ffe4579c2f13efa81b979ddfffcd23675ac6307c0aa3ba8ee77a2e3a3c8e241bd2ade6484e6ead32ce8d752fb3584d14688f223758c5cb8705cea9c56136b219d87f9904bb56be2ea1c9a035df33455206e6b7972cba32ca4c3db41991117d88da3521780fe65c4023 +B = 160120a35ae3edac3edbede9ff1c6f317d95481227d87785b7ee46cfb80fac9973e418244884caca3211a3f6cd3bb419cf70fbc22d82ba5ab98ad80e1f6c2cda753aaf7be78613ef25577107a47ad1ee3c3645db85c4d29bd77900e99e1f439cb23c6c68662c05322f94feffcd9e37d8665cde984387093a043447de590e7874e6acfa37ed302040df4d5c3dcdf9fed91b3d17ab5c141d4494d0f301b508 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 448c3a64958b82ccaaed3c74706ce0a48c5e059c3610cc03a6b5a03a7de5d4f1d1e4b08a31478fa8edd58401f0171697f0662146ce2b371e335d695f9e4a671255f29fc0b9b7d1b2eca4cc7f8357aa0920b5942e31bcfae84e909828fbe5d02251ddf10dbe4c15351f675e96e2eae6d044da1f0858ce8ba9b7aa146850b85d93 +A = 1b2a52aefe44170376df29d17ae2dc1501c9c296f72f271c21f53db71247e72c3eb2b780190c45343bcc8f548507559ced3bd4a6fb13f9174dbddf965b9c4a56c3d88727736d78be9db2268cd02382e50c6fa28ddaf8eab9f44ad45d5882a5100b3027c150a7f3bb36f29d24a76e40f3820ba116d645800459f06c20679321cf5be72450879462f0eac99ab6ff8d26b464cd0e6d78621c9263394c15 +B = -b7d9bd08d7d8e0e9596851b7e03c78973a502afcc7b5fe5b0db6034ebb8a11df1ef7ed0ae1371eb4111cefd61c61935d768be3e3755e481daced219874cdf0d07a76e7144be626cf1fc21c8a0e9db4389ee213193775e95d4d86741d8d8fc820c239b7a90937000dc3e89b2fcd61b44e1c38c655bb3d31aa7e422b4406c9e4a88e6a2c18ec7c048f4a6b5b270c90d9fb378f64be3b5b351621db48a6c18625 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 2192157490ae044a26c23eea6da51d3a3dd08c7fb67a9beb76d37ee24ac0089863aa7f00849b81bab8259f3a0e1bc744d841e07aa413c286e4bef2ff3356bdbecee756026915894584b4fcef7e49da4012cd9fcb5dbe3f3b867cb6a7ee959a328b0fd56a9eac1f4e40a22bf0a30073cd2d48f99245ac03c373810c54eaf3306c +A = -598eef47b40d1fa1ce260edc561bd1c1ab286a7e068af412ec2baaecd07c5b9cd596505ea1bf0370ea961c4ceeb9be76baec74e6952cb846f20e5da406bd01368b85d59569b403b7a305cd7448f331f10a34def43c738fd633df9a3eb194c32d53aeb567889927271d71d3929d43fb9338248b64f7d23cd1b053239e09cc2ccf5fe9c9ce240f1a10fb151a8583e4b4cbc70ec3082dd20a9962d564544e +B = 559fc917de34bd7dd7a23a432142ed79e3ac4a6caa357eea21e423eb9af7fd94f1eca735d2588ec4c2ff013520c3a0e209627217cc69bd5a07ca46a43ec1f1bdbee5f09ceb1b2c18bd388d3852e51070943f16152a73da624be680c671057677356c6f281a4ba1f7c60609125d7fd9086c907ca5c191820d80e483886b70c1074e2963c49996ee92577334881edafd88270bb967da795aa4fefb739e4367390ae +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 3488bf00f67b852592922fbae64fa56d2e4e7081678e789bbb3b4f48df62576d537da2e99c9bdd721c725b9a828194662bbd51ee20ba73d4ed5562482540880686d9fb1e8ae62d08e39fdbbab1d18e399ebf07b3a6559dda8b043fc25a8152858d39b10ff64776e00a839950e7a9ed5ea95b594b6e9e9d4348ceae08071ec5d9 +A = -1b135d8cec9969561be396323e2f8be0c60903ca59b6c418cb19876e9e3cdcb9ce4f5251eadea11fd6e785476c70822aebdc94617063d161ebe55584a8a774ab230b8228a2b65bd5a6c873bb6b261429eefdc7d0c64c7e78133e739efe57f835ad03ef8f84601e1a2310659db5e0ee706f23e3c5c38c9f8c36e5b15b654d1cc528f1dd392f1b08921af8be6fe4e4e6db774392441883ef867bc729338943b +B = -34fb63435c90018e5843098e379c76ef3ba0615b6b500854b3dda3e77fc5646228fcf3a6e1cd87a506e4959ab05e24474990ad98ad0865942737734c03dc289307f1b1f424b9a8c2264350943449b3d2b0f71f989039131e23095d122ae98c0089a184dc530669e804140134e5b602861a5e61c030fc3d3b3eef0a59f8c0579fc9b0afceaf16698de3fa07c43231312254c04ab11ad7a29efc4597780c2cd1b64b43 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 8ea5fcf7fd41803606c95729d2d910941e43b222f9b0c93a1a803b197fababbd653a92ee34e805906fde29b307a962a294aa4dabebf0d181c046653ad0fe6da1295eef817f3289dcc6579cee8869198c39a9f79992cf6894162d35d812df327a64470c935994aca4985d0e6a783b853ad762338dabd575ca71034e29d768d014 +A = 6858d029a62b0f75e4c59f3ec067e3990b2304c90a097daccaf554abec49a9d297ca14648471dba08f22ebbf8e238c89ea06f188203599aba56611eb3d4df09ea795a7e28f91f4a9a582c6b949c6ffc584a076de653446aff9b24e87202037974aede37aa9a121b5b70a3e9b5ca376c9056c2c91f5d5484baebb64cccb6a09b4f40529afad1ed64b4cc4aca586892693fb5f92edb6b4d5f678f7a2441e51410 +B = 197d6deff7adc30b025e7e418cca0a641e1a1b35f78fb56b9d8847f0690313475e6fbc6f73c3a718b10bf37434dd9fb1eca33a99bbba674195b20d35e3b34ba9d7c8438eede24ebb48e6d39eecd93fcd7dac44235ad32f208919f57b261da70ca378f9b03ae5e5a733f97f0b3f4102d971272015bf50b6f3e50c7b36cdaa14a8a580366c9cb0118ceec6e627827b0b8f614656292675ddb66e1c55355d5a1d78e69ed31 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = a25db977e7a8fa4578fc530995335411432ced67e131fee2cd7ff56970df64a6f0f4a7d225d2f4ccec8e98273ec9a0f1aef01dc0b866e425d64e09cafb9ebe3f80bc0ad71c769f1ecd5efdb4a990ebd3a94303f52f4a97e3a1d615918f8b2df5321c4aa9339b4453d7a710a803106dd0ab49c6cd9aea431f97fea9fcae0bbd90 +A = 13f97ba15ce46ae32147a0aa4c1639b6b555f4d8a1af15ede4f1103f7a0b06b4625bf456d667720adca0c4e26e858f008b012fae63cd89322b33fe51e87714519e7dc3cceea27d968b46ebc04024d063b17901a7ae978591ca6ca41afffd81769f04b714134cfaa6700cf23bfda6ce67313988bba5fd3782bc62f76cf551d140c978dc002a779ae37400d34cbea013a5d1338b203ff267861edd88ab8ee1e4c4d8 +B = -88d8a4c8c680fb01f493f73753c70ee753951d4734627da14962e36449db5490b8c575729fafbd203a125b500b96364e6799d9cfcf0efb4ec877e86865eea5e99e2fe5e7655c1ee0eac641e73b71c66d7a72c2934d1ccfefcf59781035b2c7b89e5de3f7d1e9128cac57947d22e7577832ba374492a2f53be37e17733d8bc625fa77fa5cf093975049a5c477f792fe75e85da26cceec820c8b255df0292824b4c3a8ed455 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = c1f2165a402fe9becea284dae60453965ce327f540bb8969562485fd1bb60372b8689d9c9c97c91bcfd699dc370117ea8b704f06cae3d972dc6e5eaac971597c69d4dc24a68b256f97229e643706aa6d2d844078a5fee2d08270820055ea58155d7bc754f09d0c6f804e55ebe53e3ec418747d4130cec68533f6f0c2f8fd2409 +A = -626a1580e52ba52a877cdcd62b34cbc7f949148671d4a61201e03e98985d704b2975b9a2d9c4557deae065becd662ce8448171ac582894bfa2c59d4ed20c6d0471fcad1d0fed1291df5e4556aba72f3645486580c8bfd0e3c8f6cb34fe17ccdd75fad4d4a2db4e00bb8c2a23ed17a31e95631320590f40416c153efdaf897e3b278a1faf1917554d9292f90c4edd5992748b58492289eecde1af34976ea8ff507fb9 +B = 44c336d7739118340048939d6c198f73f90e13030b69be286ef920902391d87a58df3632091d0ef25340eab395203e8dcf3389e95debb7432165147e145735d2e3226637b4b8cb7d85d68308be07f217f57fe439b31fddf3fd469869a20f1f852e1645b0d4903432ecd1fb6397db4c11f6b6b9c0fd25778b0ff00bab9ff576b16538a6b7da40f01fa7b987af8ead41ecb66b8940c0e8a1208d0026773e711153d99348e92303 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 98eaf476f11168bb63fddf7dbf3347e619f9b580ea6804ab893214e94ebc089cb652e307f1f37ea7ab9052a352e260ff7d1e8c17461bae68c52a8a8f1a57a84c79b2c8fcc2d504ac4f553d2534f2a776ca129ec1942d83c8ae24c772f6a8429bd61949ca1aa714cc3881ed731497b84415c88ad4b9be34197a549737edcfeac8 +A = -15897a5a986641fc2cda42d185d72aa1552eb92f788bb71cc74c0e424bd038e02c620d0686ff88ebdf0bc1632093c0d89e724e7d5b526b0ddc4c7e145aa90b36be0d8574901fdf286df84a6b52674a78cf21ae4865618b4347bd905461d878537b33cc41710ddb290964c48e44d4d2ce2ed82847de75938d23ed418bb9ff1caa03b5c1ac5d65692dd1defbc6013b3270c4314a45dc67883762fda5509b915e8277c1924 +B = -3a7141f54a0bcef68cbc3006166f7e15a5c2394892a428fa417a485981316a537cb3ec757d4a2473fdec2cd61010a9ff865852af8f43afc79a97d394bb6c58643858e2b4dc5cb958c33781b5c35aced7882e8b8d7b4e4249c2b82150adfb0c8f2bbb1cff3d2ea27ed24eae030ef468ae4d6b7462f0b072cd2a2f02426b3290b87b14d14b34e91a94c5bd69e9eda53335cdfa7df90a57f97f3d023ff85537fe0a8bc5d8fd7901722 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 34464b7a50713d17b01b5940b5acfaa7006aa6b9b083bc17e0535b08783761391eaca8703af2edbe13dd0fe9036d38aecfd9faae08c0861042ea1a25b41fa8a15b7721909783de3aca127e955e177987518dd010306a795bb66466fccd55bd9e2bde17470cbd36b1e8f8b63805229754387a5fb40f3ee9a8afb2e51e25c8bea +A = 701ae8c5bafab7f41c999e492f04a7626b2b1054e6dce1b83002b2d3de46717225b018733b0fa8fe3f973202da8a090ae3fd14f48b27097513ecd4ceb1b9729e7783c17fee9be5221fce4ed3860275b3b36b7416594d2b65e198ff564e82301cae23756c878494e57b5ea8fd22ad800a582cae32fbc985d122cbc6e0eac77c1000d3ede45ae7aa087534adfdea8e9f924efa1b19c43dfd3b7bc83d7c40df7c6578a320a19 +B = 18e0256543619a750384d30b6a7afbbcbdcd9a2ce644dbfc97a8ff699e118032558f706502c9b956695cb25a46d7526596b3d0b67b69611009265838bec533a9488d24583e7d7f2284e23c3cc4ccc5920fc57e24f60da0d479d41f5b9c6ad9152903a4f37842176c6257fb1e3e0681d6d583e704c1d1b24cf616fe638106638fe9d79a0c74f0df67cb2df9d99185324ebb037d01ba0066ba947d5345cd3201b19769d438c43292f572 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = bc57cbb3e1051d3a3035f77c2e375c7e3221dd472edb1a5ccaa7521849fc0ccc7568238aea9335a733d839e89ace6f2b66ef238267e0050c065c3d9553cf50cc5cd93d34fb43c3ea1c31b8ebf0b751f595a7e5e3e860b366229de4286b9d3f0267f78c6888ab3f208c55d9292079116ea0eb9f4ec2934c97149aa132c03336ea +A = 1ffb0aac11f6d1d257ef7aa997a030e2a12b0615fb11ff04f344f6ecd550e8e77e9883c246e009af33a51204e4066ed4249950e022a61337848dae17c88317e15ade5b5499c0d7597a69a02b6c18db0f975c19c16d2167c583571e947676ae9c15be60e69d76e78329aed5fa57dc5e616795b5487f3d52bfe74b54bbf93ceda093c2e14104a6d2f017f0d200a9fc89deaa283e04b0bd9015ec67598425312868eeefeae9c996 +B = -9de2d82e25b449b8ca4b02b2d2fc0a023fc5804ea553aa84674a815bd74193a2e549070e2cfa0b90a53070646875282fdf855940905f834f5a07f073093c658cd1813fc5cd7092af592092d789ab5481bfb14b6683139646cff8eb1c5dcdb6a33113d1c97d4b587f15f972c06046730b7e712a8e3dd5f4bfd07cfae289047de31776f222d11510ab6b70a200ceeb6802d6c33f913c509b31b96e2b8dba9e25b0d2250c3b102d814683f1 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 9f7f4e010370ec1d76fa83f73c80825c3b71521855fca5db06d7ed830c910d0430375bf319671f6a83bf6b57d9d53cfaaed5bc5d615c5690df0067b18791c33cb9f0ac9fa5f0473e4f4eb7840b0b660962097606b3de5744089ffb37d9c0df1123a91a5896d4deeab8aebec469b099a3a9a4f6d822030ec2fc4d11636706fd0d +A = -7f56093243ec2399548ed95df79363e6ff09de211dfffc314b7cee526535def0f9a8eb9aa6f1736528ee7aae8be55c06645708d576111766ea33e0564c12103edd61ede3128a7a642f968eefd0d7f3768b1325c2dd910d459b15e54145a234225fd29932234e59d3ff5099ec4d5b5c6075f56382ade1101115c7b94e1e2a7bf075dec210fdaf2357c735416dd5d616335002d1cde6056bf7c478f810b78c661a3dbe6e54084bc9 +B = 4df1a6296428d06f51f31a1b0f66d0b77a04db3bb8e1b80d64da649899a1a55d4041bf0bb47d3e3936ee0f3740e1e8c2b235e1b8944d28c7d617d1f968abcde9dce10d6e3c27b2e3607d8df815f5a39da9b5569e95eee1fe5532c0a80011e7415800d8a9ec175fb1d13dad959becf04964b70dabde6d37072dc9f6d914309b850cda33a565515dd6c0181fc48bc7033b314ae0bd5872480e02ffc08dac4e3030d83b33488cf149e19b0021b +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 6da5fcea305cc6eb47fb17190889e6a39c339da1bea2d7c95e997fc538b4aeec8b0edf7c109faad7fb6c656420f4afa104ada7a0d3d14d3ef0fc6774b59aa2687c0b4efe7c3fc83194a89c832f7168346cadc2b1fa6fa9a23a67c91ad731b4cfb9943738c7f9951945b2eabb3743473d9c0444ade756291f53fc7641501597a2 +A = -19dfb98f9f7d20fd331ea749d2019d8367935fb75ecde45d6dabc815ab9e593e51178a72816f85aa678304e6ff3a2c24079a59aca253d76c4ac633fea1070753ce770765bce47428f8f5ae40c26a3ac91ddb551b3d575bad9a3b6fc7954acc93aad2131b78fd212fb0db7cca4195b41651a5311bbd4d8c64f1c93e6520eef8e6308e98caa1cd0d3c9b4041182cbfa131c4948257f1200b1c5351bee77ac8bc8e44680ce64ed0648f3 +B = -2736d5038c60553927f389c0650bb1355b0ce745a7dc5f52c9909039465344af910a5f6a9cc4ec130b9877c1cbb52fc08b20d672e42b853d26a02bc07eabb9e3f91399db8465b6a8b1c9f4a4b9eeeec6e9b6180f1a770c139c8f29ceced61cc7ba182884ae01d14dd85bc924391333e8ef039b586b6a0ae18db3570aa560c2b0226d5e23e7e753873637c25aeb19e74997da4f5d0755571785bebbc7dade57446e0df4cdb8df23c1003533f60a +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = c0265805aa8ab52da5aec06ef7cad2026fa0b18edb27b4903e3c068ca6464465e34d3f3bdb4bcc10a19441040deaf5569645f7e09b36c56631b3a6144d6206d39c9bcac53b54210db6d484cd6a2780bc68c07272de03a9bba7e51c9d86cc8883cd2e1864a2ed711d505930143c883c57545e9c40851c6df8b3314a8c9a0d201c +A = 5622f906b077d243521325be82a43fce321412bdab1f15e4ff0c11a7066a288b7939afc01d30243c8a4150e74286611ac1ca4daf457aa23508a7af869d2d55f54f2746afaec477cd7df0d5711dd636802ae7f673b3f730236ac3899330f89cb71d48c2838322fe856d9d8b4053d9c1e66acdb5e43614ecff954dbe37c5269d7ffe00b34e682c0be3d7cf653ef212daa3d55dff92b329126636e440b0bab55f4810a2849f77c39ebb93e +B = 1ebe0d1800b1fcfb67d7d54568e45dc604450c1dbe103ee21d48dda300c1d9b9415dcd9f5a56cf12c2ede3c862e895efb83621435377387b29b882b2acac78386895c7daa90810092bd3062a3a4867f92d54622d7f0b89b40fabc4709fd507d4002ca80de231596630c234fa418611ede0ae4a9616d570232c1b03329bad02220ef64e455c164aadc16190ce35b78060a6b117b4b0641fa64dd8e8cddb5914e7657573804e63dc7b216b1a9aa175c +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 606d2b6f756548568013bdaba6e811dbae88fb01f5f36d30d15dc1e099d86bdca9fc1eb3a785034ea14cb7f4776586327d57ca5a52ea1b30f26e2a76140bbb0e930c7780673770fe22c5ed443c349510e1494ebe402f2621b1e6bde39b8691edbe5c7242efaa6634553e6af146dd40666edf4a3db5d1e7f9347fa1189c1e5168 +A = 14ea5e6fd612945c71fdb17ec44d95015773edc908a85a6645a8eb823d11226545d05b81791401cefc81ce9765eacea7a619cb482f29d38988d355ce731bc9009969b7487a3acca2d2065c1faadc5d6dd8ca1dcd3f3d4ff61d0a75ef75272e62193618f6b802f70795041de26d6ce367ba996dfb91167cb1fa16c8977f982e1718de7d60275a7f66e4ad72ee55ea06267cc4e8b08f488579825cc674b0bdfd34a01bed08b62004fda15b7c +B = -8a542280f6c8bf4d9fbc96d5bfa6ee0d16a09dffdcbfeaa2dfa1097a760dec7bc540a0b5b2020bab1eaa594117a40a9bb99c3f16fc340c262b29909608740b8e77fe4706a88dc0fc3bcd47998e88fa02f617062393978ac1bfe14235d43f3d5edbdfb9f140412f4fc2dfc05a700f47b1f0f90da7ae07ae781d9ccdbb951f19a8b8a9a7dd8a65942842cf207f3baed3a0b2f08a06ad0d9ab7ad0110346293d51ec53ff8165b925c0e7906be8b7303252 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 512220042f151479a6a8b7c743ba83366cb7733caf37164e9c823422ccbf78b0b83f426a7230f559d50bb0ed3d9486c6a6e25f4cf96c4fdcb2c861566c6a73215b6d08995a14569710cf9e54abded1d77fc7722d06fda4557a3a99862e5ce963e1be25336fb42a4629391cde3aacd47ea5f5426e7185c5df27d9136a6df26f54 +A = -4d108217b778694931088bc255d1f69cf8f5a14252156163f948ae58d58f2ed54f518177d668e795474952c930052c1bcfcae11bcd15af168ec2e881e6ddc8de257d0cff90ff3ad409bb3a080d30fdfda99078cc3ad8302a4bdd77de66ac082b40fddb3cb36c75a86bacaf60984a74a0fd575d751ed2830650d85844aba9e3f781b2dc6b515bdb8d9459b083e1aa653ef177de76282e86c99e97dae9c0b050c9e6456a051e7d99adad7be4e4 +B = 7b9079504c635655a588ac360955fceb10cdea5f3de548ca2db681da38c17a70df5798f72cf18691d14a5f400ac69fbb47e64115cf071466c54bc7077a228249209542683ba57791352ef3409f6a947865d8f234ea9d39491b5c001685487b32130bce9aeade97d9537afe3f2f87e8f3315619ef7f215a73cb724f1adca99b90912aeecdc81485c0d00a74387ea99c965118fc6a9af1163e60d1ee6a1eeb12d7c2bb9a54f747a415beb5873d616fa0eafa +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = e36899d83a143c82e19e11494ba18478c0a9497fc89fd83df38adcb6b33918645a416626409a156899c6583ab9a4426438d9c32cac54b78df579cb7b6b1feb3f39ca4a6183743a4b823082896a89f9f1722be842cb2d2ceb605f84a9f9b61cdc7e184593fc2f9ff2994fe6cc4860d255809d04ab47e154eaec9ecc807ceb298 +A = -1422272d9e91a14b38b3e81cbd9411a0cafca23addf4f33c94a1bca70603db879dd8a9c0b95f5986bcb447731219c4f9b32a1e3253b027b7963ce40279dbf4008e526adc0bd7bcb2b533392a105c6e8e1bddfdd2bde7dfa0d2e3b1c6ffa07fea07ecdb9fc828283e93b0ce4861945562478b1a56de32251b7d31f9a2309488f7cbdcc38cd6b1c951570675ef0d61e1df69fed78979dc755f160d93ab5a3e65dc2944d3333cb85aaf87a153a90fa +B = -2424fc1e71286ce3be684a10dd885e4891b52e9009c3021d90ebcaf68b6db81130bdbb74869cbf142e0f44ae72684fc12c85abb5157987428c7812889beecfd7bb43fcac2eb6298ebf1dbcd2e70e4274841c2703b8685df18f6e5bbaa1422004797defc6ba843e77f891bbb46699a863bc1d77c5e3cab809c247e2975e8170da00fd9c8b232abc3fc6b16951ac4e6c96f9503c1ff2d6832ff9c35b2c8aa408645849c577d2b8599ef520da57fe2a9eccfcba6 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 4e8a59476d47ee2cd0217bae2981cf25a2c38e5f5d5c30c2d8bf95856a6e8f42429e565f1836365e550d85207246514624e7ed932d6f5802a50ff9f15d500dd84b27729c1717a3df0f2d6dfd40f0094208445193ba6500ba03fa3f4bdeaf9251aace8729b32ec3215bcfa170575e26265fe523cf44a071470e3b1547901e9227 +A = 452cfc78cb9597e67aacd4ec83e5b473ab8b7a1dcb6097fab37e25d5a6e25c69c73a6c20de0e2a744375bbfe7f612036e69c7a503255d9e17c6ec1dc6cc6f634d4c79bed4764496e5c7c026fdf9408242d3b234195e67a5681e7d7b861f58eb631ddb9aeeb0e5b3ff7a7657a7fde5975b8a9e1f643893bac47debf7918c7ef8f6d7439320dccaf63b80ec9761559078baa8e35d98fb9dc242ba83536eef7ba9901395ef02b19990d8312203df7dc1 +B = 1dc222e7a737e6d97a703fa232defc6c0a4fb2bafd247c8e547b9c474421cacb7692ec98f94be19a5e40269e1f5713d06a6d081a943dbc667bc867e481b99c55e437061cd44c4482649faf870d9347e0252ba9dbe116fb4992dc2c2a0583c1351e9e01e71e9324f5fa942322485bca93c2d95cf304028e68224fed446966073ec7326c93ae326a7a533a36e053437910418bf1761abd9c4c5ab7e6f538e9bf963903e6c80f21a0a38a683e8166e4626a8d8b743f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = a4d5e9fb7f0d75ce41ffecacd2ee1e4d15f82dfd4decf5ab1bee75fb97792d0d574fee60a30b15af80bd38e6a25b1821e61628dbe456e39fea3f8a9ee6ef3d2332412be1500fada0c1728a1457656eb3e9d94c64fb2d0ac89f10f2b9ff57d73207274ae7e8c7538936cb7241615b830cc9011d4363ef88f51c7b3ed503c25179 +A = 13eeef030b3110451fcb1a258434aeb51d3dc805b38c72ef7c79d4b0e18d600e5dd28b552b59f3dda1898367ec7da5dc6d9089a585cf52002eaf8f9ec64b8d3ec50d0bef7dc3faf203c48583ec89757cfeaf888ec4a91470a6b8ec9f26a6b07f3311b4fe972cac2f2ffe47f5c11d2dca87c62680e2229120cba4de9cfce9f7f5c33af8398c07ffabac1675de1845e05a32536329647214e54e5d9216fc0cbf2730898eae19e425688bf184d16bd1d655 +B = -ea324da99252edb03f40100e528d9a5080c43be97fe4b7e03d9563ba48040d328e57d0defd4b7ffa9bef3ca0d2682aefd2a0ffca8566e755b11f2e3c6c1b707f1b9465592aba6181e583babd5c70588e7123361a8ae77d8c398e33f894ee288babea1d7eb63e2f3de469e502b5048417043c5a9a9a3eb921cea1533162e3ce9c79e6caf62bbe7e17b180b72c59b9ef5fe1a001b733d909a8278029fb4a63077ef9b3545f1159ad73dd75030aad599ea4884677e01f +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 2f096fb8fe2156c41ab695956f13f0fd9a084f87ea5f5b1acb6b60c62617b8d7079f4b072223ba18cde474af3942599fe070ddb0ac1a99f42b9506a2648e1b8f6106015aba0bf7a824842403bd3f4ac8b6fc4a9861bf0e8ac59be0322f0495e4b515fd579dfef273160ddf96e453f4ab663e703609c709fb1f016ca919fb26c +A = -4212bf679cc00adb2ca502604b71dd5dab99cdfaf55ae92aee6bcf8b3b6354a384656c09eec6175a95c8cb4591ce118e783d6344525c25e5b356e45802ea3ce1fe764833132e6b7bec434e4481c9cc2986904988bd8da7dc2e31cdc481fd0e359674bbff524124bab1ba4379885a6cfc1b73d953e6d1aa1b938129d74fac9dc597c31383f2f7e02fd995f7065290a9812ba8e205316ad5bac6fc65c6c7310f1a6b033503ebfe85bf6d3851bea1b65b9c15 +B = 7ad83f97f40d5be508cb394c128764532f0aee9a108eb02840ca1c635860b6d751d5f676e8670e2f61466397e1bc68f97ea52d64b335d07aed22f20bb1ed19e3e42e4205d650e6d37714c2f80d39b111577725e3bc7ce75bd7ed5e44f8377d5fc2b97f05c3c1ed5ca1ec90ba3ff7935a25a8acbcb15fe1fc7aeaa1e444cc2f06c1e6711721d24b8969d465e4958cb87924b3e0fe99ccb371009b5b15747bf6dd5d0fb73b8fdf58d955c8773a55424a34c741406f6f904 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 909626a69c803e9acdca97c56781eb672d6fb31430a53b853f467ca26d4ae96c182d71c0212894b776c88e773acbe9602e3ca56584c39b5947724290def7dbf04c6853a108c1282def95dbd5bdc015b68daeea0ee959b35bc5af98a4ae4cc7486e627bc9432bd009b21ee9af3085f074a3ae1bca879e321018e991e7898f2897 +A = -14eb8e28dd04a159c576eb10578c24fad9eedd3d8b7560b681002a54a4bce2167de05cd061338f63c50b86327a79595a2dbfc1d3f4e76aabaf88cfedb69faf5148c61f8cfb2130511a3bf4a17d846ededd4c08f3b635182dff1854e8c4c48007af028e06f01235fc2becdb32adcb9e2058dcf8f8655624bed9915faa06be972282cfbf8530bc0cf2de5b2057df32e4a6cbc3c772feea0a511cfe3408a6dab0e2714fc4cf15602ba0da03bf0016f1f3f5ddfe1 +B = -388da160568aef9f82fc16f48a22e8d7aeac99121cfac9b748c815e5d3a823b673ddcd20c1168f98ba204df5e52535f61b224fc0374092f8c834321949fa0a812b5e65c492fd9fe8246b74143a943bcdbeba16024e311d673357a3dd3eaef9ae3a72bb06e03e34e091cbe5b6a9eb9fa3d7f36c03baa5c3e242f2c186b58db5dddbd73f6aa54aae027529b8f8f0a536b9b283ab08247b9977a2ac2d0d9f162ad03a2fe247d2c589b1a2d14b5f90d5b9c0a95918ea956e261b +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 128e8844a2f04704a4a60cd33e85cb7ad373ff683abd167894a35a1daf947f504c0abd7a614e293ce10797a5330147c88c4d5e1dad1bdbeaf74095e3f5a515f2af68b7bc11ee1f53b493133905b654318dcfe73118ef1931eac47deb6c4958406b704ce027d9b027803eb8e639b52d5983094b8ff4b54e86a7dc6ea169ff1af4 +A = 75e6b045aa44dd9b8f4b434dd4bb1346fcf558a5e96b00fef9b6cfaca72fe8b1672edc2a64beee8b959683b1861138b297629b44a0caec6bad2ac05665728379cffaf66a129f0ba40aab7c6b1c3fbdabaabc87ed3dd580ba80ec7ee765e9a8fbe845c0d207eee7a1a3a0c39650c75ccb6bcdae2e0d5149991dc3bf899ae9b7626a2baa17b168b260d82fba84a12f10e09234035e08b730cfc230f0d2651c03e34d4952fca6409b5c6ea5d8791c90466bdc4adf2 +B = 102fc193633b0e60a48dcc17aa76f3e52cbbd1012f179736a0ba7a102f8dfadaf434063b0ed1b1528a018b349eaf192fe62f868b538cddd7e8e6fd98b93147727d58561517b2836e4a373bb31fc8d5e42d16126ed80b880c1a37940c138fc1f7255ee0b7fd39b1b799c34e5178580cdc076ef3fbff65fdff7497398fb1cac75e5c09cc7df1168a20f88a16e7b3ac78091a90f1169bccd48c0d06b4707ab79b741a168deae5ced5d48bb5f5dd3f465e43c82b9db7edab24569b2 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 9aa9699d1e5d2c6acb21e31890c1899f30a925b834adb5b8bc8cce83a1718944a2c90faa71b34379a21340457478c0c43121dbd65d62e290eda2ba6230bce4e6f18555a1380c7c95c1700793157f7c1cbabeb09460ca28dc596bb17851ab2ba6dc6bf311ea69bdb7fa8eb78df74adf171d4677a154b8536f8104d919bdd58648 +A = 157fb9e1b38f288db78a1a0e22fdd9f48a59779487a9ada2774a094d34536b85993e7b9ab6e24f081c4cdfb64a82271100a054169e4f1c24e3957ae9aa8300e85eb2a45a6d5987eed4f0fba6fe8557cbf6128e018c5f9df028131bbba6c544b2c6312aeddc71405f0e4ce648fbab9e5d51685949408e4ccbe06fe501a36fc13ee65c31f062313135054b7679eef45964c77f5a1556ac09b11c496d0ba8c6057e283bdaebb4e6d9e5c557d975745f9f98a288d5bbe4 +B = -82cb6334479bd997c771e894cac1ead87dcbaf8f5006be5c70ad48ef94303137bdc45f261af91a201b276a17d884a56ff27af7dc06cc5b7b9c94f7c4d4a36f68f8d309c477b4969a6e7cd1b2afab9deec06555cb753d8a0eb00965359ef865a84bfa87b815a42b2050e1635d5ae5e3743c007bd79e820aa37a968702a960fafbddecebe63f022553cadd7a4d4fb27b4dcb981e8b490e80bbbf13af8c4412d158775db71f5fbc9986e7b8a8f9299574abf7bdf9ce7544e8c4e85bc +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 46e401989fbcde9d830dc6e3c42768999f153d44d270d4805c5beefb470bc1e82706aa7173b359763c5e15d146eca91a32a36f0a80802871933cc7f2ed15a5472988849a2d2f57543345b531538db57ab9bcbfbe787efb0a82e61baa505aad628df5f9e881dababb35bc2decff267eaed3d3671757ae1764ec5163b792b4db3a +A = -590c16ea2cf7fa7f63b5cf74804333f22fd2d0e1da7d226da8425abad2b39a4672fcebcf5cc15d220b0ecfeec09665e682fff0140f16889f7a6ade9ec11aae3fa3a369b3fc133babe52e42b7a8bb9a24777521f4d9e0efe7d7977dced9e40784c24d2c6056b3b668ada7856da71af73d2dd33d2e481ddf40999d86a6e236d0d73f31a67c52cc8b38203bb2840c0b92c2612ffe5fdb6be87f9a787d70b3dd506f9a63d144db3417495f0a48523c812d14a89710d95bc6 +B = 5a2865cf2254710a1a51ee3056b0c1f6c5f77d22d7aa8f939e6f48ecec529a169e630c554bbe682a8c4de9ce4daca77a278d7e752cb678141ddefa75ba42e661885a82ab55d699414ffeb75802cb8f4e7583bec8a7ab58803b378bb60fd46f476ea490c9aaba568ec17f3a6afdd6f20ec54a512f7aaf62d2f941e35b4b72dea77095e863dcb38bcaf8777707c1dd437ef2ac6b6a8b2b832f80ad2a6d6f279c053d02058b1a657a1cf5b6b269e15d29087b0cfc0c2d4c3fbf32a167a3 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 1c9649f4540556ae82ffd71b2c71ea8588aeb845c50dab595db9f8faa01a26c809d30d8433b6c0add465e164cda2b6723c942ee87241eb7baf9944cae08babd8e22a0eaf35c09e9efdfb9f8bfa65d53ee6eb23fcbe1d12a66ae05e7592ed788b231b000f895d098a24febcfa4372d249575926a5faf966072f29a62a401ec51c +A = -1bc9ae5fc2f6a3f1274584bac1e145f02c5e8c4779f4df15e98dd34344c988c1437ee4428485a09090d81b18606a6ea5c1b9136872ab5b37373fbffbb5b3fa8fbeca1e112b9f1643658c2f38b9548cd8f0f271779ce0acad403177057ea0a2af2e7435109879941fbf463488a2522b831b95c1cff21d2d816d70c25156369dbcf04a0e28e1d746afb8a77713703fefa512816fe73e203bb4c3428efe09b946b750199bd7a03d30feb90230c219a103ad4528cbe0de1e5f6 +B = -39cae179d955049f830867d4115d3bae25127c945b1fa0c16fa850e8fd77c1b3b9b7916b9983c1659b7cee77b7dc72abfff1c56681b7931c5e58cfe4f1bf0168ae32df0df8f652223885717a98f858a497b1a4be62a2215c39316c34451b0d957791f49139921d9ac8041899b8fdd5d3d443547a26ddf5748147e4c3e93f5043ede42f38a9baa628df65d3d6148ac2ce182056700f0f94029be05d3ea3a218b40f65a87b4baf097fce107c080de24880259f1046175db1297016af76d94 +M = c462c7cdd79b7604246a0cd97c017700feb25908656b4733353af8119ecfa0212e4bd24304edd566adb5c1e9daa40894290a9e2e20d523bfdb5a2603409b312cba43d567a27118c15d4bb2f3867a7ba7594e02859850b77b929823049d43573a881948d674e95c7427e2d04d4ed81b5f4de21e0d5904c8e0359c99d4bdc901a4 + +ModMul = 9fcf6a47addfa336557749821a88ccd2573a5ce2c3094a17d9a29b33e043bea165499e89fd2c939f17a670694aff05e9af46836b62c96e597c83681092d63ab9d6e22751aa8fd4b9ea94a90a373876ef0f6514304a495edb5ca1795c9ade7965c70f9aa92f8ea460ccb670e9a62c81e9c +A = 71b93fbad39b1c2755f2051ff7d532d59c985756410d58aed3947d6ae737ace5aadc35e7e0d29c684b9d4bec9c0fa277996bb30230f70431cb7b905 +B = 167be8381a3392dd4df62e150025e13b388bf366922ba8632614928922cc290772135857d1b5234d51c27862cb1a055c1b86260b6ec +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 8e2ba940fc5165c6c5f7f4cb55cd89d1d5f59e90e78730bd66fb120a814514784879dc43ad4f355030ddb3486a59bc34b601474978a94ddbceafdc0ee23cb18708bdbd824d37cc32577802ac6057fef29a71f168e816309fc80cc46f251e7289c6a57fd222d5868263360af63dd73e7c8b1dd6b3f3b6939849580b9231940a4d +A = 1220ac4bde4feca135268550ddc79d8b05ff72f483b39f77436f348c4f5360c22c598f7dfb76697bf6d2ae86c68e90748b8b729b25f932b2e5fd33f3b5 +B = -bfee56cd412318cd62e7b6cc49217345d3a94e7fbf6fa19053fa685efbc0f8b320b7e43883189396781c49371dffe7d126c032d1ae4b6 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 8e2ba940fc5165c6c5f7bcac0e449b64801e75134a390f120acc58cbee43888f50d07f7aa6dc2b33643c025cf745434d20eb1aeda8fcee5fa3fa5baf10d67c21390297857aa50bbcc4a29a6b10885f97fea60f1b88fc72512c111b938142ee8d67545efe386622162e8fd50418b09769b8c22efe54fdacd652580d609f0528bf +A = -7bc53f6f2e78628678ebc8e35ae4905caeec61acca5c64fdf595689cf005bde2265cd43172802fc133dafd933d7b48def44256868d202727a4aa6c0cde66 +B = 74147c93e729707111d0d531b1c135453f3e59f63a7e082b43dceb8b16cc5debdb6d7c0ce0c00ec9b5ca51e7673e411c3cab34938124db6a +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 43c47d7e319c32a758360dd726a1d91e2cf5c57f73cdf9ad2040e61a9c282a2962d96d300e04288461eb1ed37df19e6b88f104a250f9885898740f6487b081515314e0a217df2d4345d3cf81eabb2bfb346b634b9c251624748f6e9407cb677aff4c53fcf42cc027de267e6ec011e14bc7f3bc6666f693d21 +A = -1e6ce0b44105047d0da0eca7b936980267db41d41319dd5315889fe8fa2329023d7cf54f71ee179b5bfedf442cdad1920d311966f7175cbb953bb42ee105393 +B = -23a330c7e06cdef4b6b121d15a9c0bc774eb5e432e72d04c5f03a0c588e55e010b61f57c03c51edb1211685d8dfd2a35393091fd0e3ad2304fb +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 768293c84c431b9c8dc6e538ca3f856c60ae5e1aaf42325865418b7bed16c7fc2589968319cf41cb370657c8edc7b969de10e0566b64ec796470b630e22477e7aafb38e99b6012f100c9d23d5517d486e3cab1fc60c1568c0228c9b55d2d77d23b1351fe37ad4fbf9c07f29330a539de4a32709d043dfc9e21aa1a +A = 6bbaeec78b6a41818b7eec42fa3be7d639dfd86fbace2bc14e0369dba6dd3f04ede8b808743d809f43f70f1146dfdb1d649546441919e27f1f7a9760da4a3b152 +B = 1199dc2f52868a0cf440f6666b576541c7aec1e9cee14c1d22010ab0f53fe8bbf3029c639ff78d89dce82de85fd8eda4e67395d435df60158623c5 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 8e2b90afbdafa02ce68d537ae807b4e7f3e05a66b20b84cff309941fc3150f99d083841ddaf6f19f5a76886ad5d853c73051a0457e95eeb0fe3776a084a027ee77d14f3825713a59622ea163a679cff904db33bf6ab23b06eb4b31f4e34fb122c8c170321164439db783e7bec1c265eed33f33bd9cb6d1611c00aa18a9b4b90d +A = 1c4821515167f7073d4b7cfa318ead1da1131499c12497447846caa84176a9d4af576fe549fd8b0f77bf8dbebf6c395f84dffd40400101bf28b1dda0bbdcc5da255e +B = -de60cd639044e863c6a49c73213dbc2ca84e4225aefa5f880e829f2d9cb48ae92e3f2680c462ac697dc34da38f65fcdc1b4d8c3c99e8cbe29660b539 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 33e8e8e193b4b99d8bb382c29c1fc5403190d7654f43cd77e28d1bf77bc3a728dde9de9a89c6522ebc7222d25f46833fd1753a44275b04485c77b675d816090280b3541ca61bfa33921a79f7286830131d6eba13acc46cc2c449b3a359f1cb49d67a4d0cc1245f3f8b59b1684aa0c3ff1c928b8e880a3375ed811dffc991fd1d +A = -50ff3e00feeb2efc6df6387d6409a622b7a8297a717b8d94d0dc41c6ec6f29a8455c3580019349660b31dea1e4f66b74147de93535e671c853b604ba06a9b62d34646c +B = 49ff858c7081392defc3ba12ea8869fd61188ff15d9339be72657b00530b851de53b1fcbe16034816e73251fe1ec97bcecd8bccc470373974287ca328af +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2c88dc40414969e8b614bf8db05fbc38fb2b7ce144d7e707f9f8eca40ae2309c1fc67e713a8da5fbb20e808ad20aeb369cb72a77fd285e38a7895ec0fc795ade4ef1f1680f3a3b3cee4569cc9d5e699984daab3385815d2e515ba5d67d21dd1defc12ca81bc8ea645f8f8d103b4a0a9cdc92eb50690c07a037df274bbd5217e4 +A = -167ee0fa8e5d8b569d7848b068df06f6baed80f6fa6a442f9d11d9712622b512249b92c7ccb821ac751fe4ec0a7a47e04ea5571c7cb45a7985749ecdd87f0c0faea01d232 +B = -2207fd8dbf2b8e9a5e3cc515479cde241dd3671803f9fbf7859459ac66705be055fa759c85631ed2a61139657eee7eb08fd963b49e33666e60b7e75dd26b5d +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 674885ca3ef617a53eaedb9564cf96bcde131760ac541a81f4b25c174a6fe1444c2c206f7171e343e1bb43f81610162994c497419e75aaa25b664c122ed2b27640b45bf646fc5da1703fbf1cc66e10a3c306eb69ae5f937081a1a18dfc8db376ea18f4c1c499109b0cf8806eb32cb1f28985da790047bd7b32c1f67bffb9761 +A = 413cbcbbb5851a4ae12555801f7f80ccd888bb82ef1b5c31b99e1901d7e0ab91ee489c84044bc21fa2010f11aac21d0531fac09feb482fda579cb9f224c3149dd6249b0225a +B = 1b6bfea70f1d80350eeb45f9a5cebda954d72cf5cd27a299ef5a42e1ed0b50a541d1657b70e50b0cab69b22e31d0944fd735957b1ff764865d9385af302bb802b +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 8d74ba5fdc67733ced4d468f6eb6ec4c1ebd79c97682c1d4daa06105788ed9c5144992e555d903804d7ed0dd9b29ef2648568ab7ff462a03e0bceb5482485afc3b91448fcfeba435dc587db6f3a022428d37fa0e85392d0e48e7d4ed6b21253084e653da8175587b3b709e28426cddfec8d9dc582d4ac2f3d540305c0fe17327 +A = 17c0b7f0e2cdf316e4d32f040e26d41dbde1e6689d98f0652da1c380daf5dfeb6a511b72d82f1b32d3852e9aa2f594be10776a8fc89a8a35c160e8e41b42a06a342fa1c309fd82 +B = -d7b7701340c5a358455ca5fa314ad83860d9f765978ff652d7f542de2e123bb976930b8fe84b9608648324450d8ed2bac4e44f2fc71711ae813cd8793af8d3796e8 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 57e60f79b4e156ccec4c253e70df8d86e4aef326150d612a5ac4dc285761e88ede412d28d9dfa5a6f5c073d3c91a65ba9c86067d81f296935f0d0ebd2af82e7f6b5b336422429cc3b8427fd8d3f5a6fe936f4208362632093bdd3cec1aa8f4b176d260f605caf4a12cc011f3d1b76135ac2507346674e41673eb16c0f55d8010 +A = -4f1568c207a9ec970b5c26f068f3cc8019e8cb483525d251cd2919b368d072ac8f40017a19fc7437cf88e927c9e7d6f539ee84865f0af24be0d6d98fb33d74e3e0d28020c00bcd61 +B = 723db98a78f42aa45496f31cf78695583526d25e167da48ec310e447ad3540be2636813a2c2f7b8c622795ac451992e91bb8e43e5737f0dd95623282e729d815b08ed8 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 237eb5726e2c628a515104bafd44348dbf099569815784eca5d6a415d3c12421c8c70fee23d6d82f7b5b136b70ffed3b6d9e98cb47854e79239d96c26f2ec955e4ea8dabc29a1b0765c9b7af6ef09ca673d1ee21c680e4b8cfebf47bbc74c993d017ead6cb6f3319ce4de9e9765cdb3ed8fcc57a1b153327e1a6a965e5dfa89 +A = -1fd1f634685eb1470dd9080529a891253a28a0b31e15c662733e20d43fc4cd71f4cfe83c3774adf8293a0fc3bd806d0b31b61c6ed0b4414ccdb91e2994e22797e5771c63defcc0887f1 +B = -3ec0478afdf54c949a097ca411be41f931acb750ef4f0ce97d0f0fc77cf15970cfbe24b170aa332de04836b7a0e6c5d456814182d27c8310d5fb662a818bc421587d95fc5 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2f1d500443fc4f4b86e7ec93e4d0dfd3faabda35a6dd31445021928373be14c37fec369ce80ebcb77aff2151b7ea94d21592da1823ebfa0af196f286d7a69ea54799573bdcd4d09ca4f33b8a3a93b35de5ff7f65099d59367914f1c79440b471ced6773b0802bd8ca99cf531b62892eb1e78d67f8210592208859b0aa1754b14 +A = 572de2984fe2ed0d5ebb5bc3f62b197fd592795d91cb16b48a0c898991ee3e884e5870b92405f248036ef9b3898c5ee6100a09ede5a48bf7edf3a067e4fc77e7e6bf6a6e3d4f538e3d66f +B = 12c379402b18a34dc8b80c0dcd25be16c99d6f76d5d64b6050b90910cce594bc022794640735710c7ded857ebd44fe5b2e51574a2296f7d7a61b59c0123051bf2ba4a168cf8f +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 4001c734e1391a88640007893f167eb79ef61e4717d5eb14b8d80c25ed59c753be63fc8e54bdaded22c9c7d3e49753eb49efa010439807dba0d90ec4f9b498aa97f109af542bb41922936223213ddedac4d0fad8f1446498f4228b758aafdf1d9692f59029c76ca2832125ba50e811cb95f2b982a7a4d87b4726e6dd8b1963fe +A = 16792909716b581a936287d0a8550a1f3e840935f0f3ddca75aa32e3489269b078fd19a16f8d6b2326eebaf46da76e90890c0ead3b35689bfda8c1ead17a4f672588f982cfd3da2c2b9bdad9 +B = -95ab2c47f85001aa852d6999f29644a6a55f9e4e12bf905f911f90d29cd1e4fa4fc9d1a2aa6c215bcb5c5643561499aab8f2678fdc5fa9c6ec138aeb2d62f635c45f239e46b0fa +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 1bfad44b58d3f8bc987116d4cc7ac98f89f838a8712d81d726189e9e1469cf46fe04675dc0b82e6e556b02c350ef4e30ec6203c7f1df937ea80f435af7c10f48538fe7755ba78993f304e64ca0d783b0f46f61bd14fd3fd30768f233c59018ce911a94b495f58eb96438e416ca3c7eba5b1bca9dea5a770c1d2d9f2f62f821e5 +A = -78a6a6ef40e443c52036e75f0b35938d632bd45aebf45a1fff5c2e1b6f601a57382b9a82c3e8b2984e643eb1570cd83f3a6be6daac567ddf9f37bd96785662bc3cfee6f47503d239c77781a8df +B = 4920f870cf9f371050e64a419ebe07ac92dd3525b41e8ecf6939a267e1ba853d54862dfc95dd21b3526eb0a0a7a7f8fb67df2e9472dbec81e15cb13266257177c5f2b92fced4cea5d +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 6b0b84505907a5ca37abeff9a5ba169975792c69b5751d9845c0f09dea833fb679c8dfbf3895bc470529e0cc736c9b4a0d08b75d709a1d04525ae583c5ba082d3bca1355055c7bb674aa1b92689cfdec4dbac84a96e81c855280e417f60e7e4931ef4f428420c0b85d2cd11c1030a47788d6ee6af0a76b5364fcf23b270e9d4f +A = -143d843e3b12431fa0d873815a757a214cf731c298db61ab13cb87fe78b0a6184bd1fdcfec0c7661b10775b4ee2c815dede0ed497977c9ec5154f7b24a8a786501ddb8dd257bea51b9fd9401ff760 +B = -25d4da7b64f439987eacbde66abadf0da7c1653c1c1c6d9b2092351fbc714a20d2d7ad8093209da371150b69b3602480595533ecc1f3c5005a8ead10732272246d8cdfbab87c49e65223 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 6bce40524278ce242b0b5292d27751a3dc414f962d9c1cacb45fa3ee693ac6890d2ff1647abe578c40ea8d4b326a2e0e2fa7cdec28fe2da089338b5fed91c4277cc5be37537eec2f17edbf48a45fbe38f15c58c3e733d408d001262dbd40c9d246c323e7978df4fb7207aa9270a12921743cee2a483e7e71b221b09a6b2c667a +A = 402671b0cfe14655bc650bd35dd0c36ce7f65de274a0cc4b708c6f6c3e84c2125ab2430e702421904950b29aa8a03b049910305127890457cd0cc97a3e05df67f29d28b0452969986959df02f59d207 +B = 1648c29205f19fe4c646eb62e8ae9b65260c2cb8424a526423c6bc04ed55870cefef9b8ba808f8ed2e1ab170e2e411f68b934abb1a22776969f79f9420f8bcbef28417582942e26646af60a +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 40db38dcdc201648da555f1062bbbb92c632c29b66902eabf90d98dec69ab3f3b28e60cad1571e7246f4c9e6aa62ad26a6d0bc08598c7a8571fa830cae4c2875c5c95a59f3295f998681edba7749b7e38cbece8887a7823b4752165e1a897e638836d408f439f009d0fb6c196e83e83ca3289d2bd0f0eb36b721331e4f9f80fd +A = 14361ace8ec5223bf0165b78913b77ef921b7089bb5e28891d120bd3db6513ddc90404a4e6cd027f9b51fbc02e80d376d59e1f2b043954199ef8218bf26cacdc5e749f668ad3b4ab35cd796f94c06307e6 +B = -851a39d8b0101fdb22ea9e367286e572dd132b8a77a6a14dd0e995131467aee898230f37dc6224e35bed2eaf459aae579181a161450bd7ebe6b62ea7154a8a0ab590ca4a6c2f05531c4e24650 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 4b085796665458b798f824d1c1a88c23ecca456fb88713b433228ca8735141a616633ccec4bc53ea4f6e0c74e4aab6fece2e4cc4c4efb479638cf54caf55d4addf75908076f5fb487ed00d540e5b984acb8f81cae3ef51db926a06382a288092b352793de721c23c371fd0ce7a789486b2e8b867d35f47b5daac2d339d22dbde +A = -511565611538828ff7dbc45c273fe46f4f5105d41ccf5dd343b41e9dc579429e56a9cefc54657ef0422960d1375b72411a5cc93ffa323455e006e242580358d6cfb641f46b9c36fa777a613b17dd4a187454 +B = 4f22597947638b9a9e9b9b7c2a8d37f77259f1bb1c7db65003b6e1a1c807469c84c89a75b80bbe0324fc3aeefaedc6ad9c0d9e470dac9c30bc48f6abbbdce9547ad7624f0ce9ff3cb6be23e47bc7 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2b90a57349ea94ea818207fe15c164f9d3530c7cdffcae178557274552f79c4ab56acd78033a570bd6c3e45789704ef0b0ef586594fe4cae3ccfbf9ceef46e769589b084adcee3ef8345375b7103232465b991273df724964248737d5eccbac558e35e4190112571d3e7c291baa7aa8b1800121bd573b8419f627c0091e1bba8 +A = -170cc62ad57094d307ce1b317ae5e825c2f2e317ad6060437afa105501caea00dc9a86af8729e2f3c3a854387dc3ba368c0a84aab1a527ab34fe27b0a69bc71c728cca87be728457c65eea7d7538ef3aa282615 +B = -3d9da1377a88f647de57ade46dc7caf71b4f42bbfaa5e77f16cfcc90f00b5d3e9e9d82355104c7cd0db4c1dac0496be3aa35706cfc0a30a1329755faa439694e8e9b41fba8f1ebb46140818c7008e27 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 4cd4da762c7576d582572d3427abc4b4297f740705fc14a32b46347541b152d0d1e3a11f27213badcea1e2009e34a63350c7a59e4d43654b28298d2757d6b54c4d82f580e98de4230cd119ba350416452cd4b8adff29b9f35ae0c533f666cfed716838e2b91941dfbea8d6a978a369d5f27554ef411f15e5a89850655d7f3f5a +A = 4f4a28af27b926d8ac347503d6ac0bfec388a6c0b38a577501c3ca4aa709c69601824ddeb5eba4d9e437a97f3e4477e1487d5ce7b4a35b90fb863657a5b2d901bb8c3c838db40b89b495ee9875e8eee607d7b8013 +B = 13ca192603bc8b2da29dae67159e4f8d32f351a503434ed9e4e24f74abb5908ef7da80781c71b1a5ce64fefd13a16cc1eab05a370bfba2a97e6cf90cfe98d3a487ba72dde0762c36c10e1da175f1c1b5fc +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 3812e9e835ae355fdf328b29ed8b86dc3f6895e379b8b5d65a5de41eab5fb20ad3e2290c8ca69f9500248ff883d9715f59d0db6257d13c5cd612211bb1fb99867161daffc77968bdffc1fe48bcde0fcce02ca93975b3cd9e93b56974ab4beb59582c3d0ef2a65957f701549f8bf858de0c5bc98af3e5722f1450de391876a2d9 +A = 14ca6101af00d67139b985ac9f149accc260336237dd2dee802b5cc6e506e217b74c1a007ec10c20012f071ddad34e7407012669109ec1f385566ff04cf1a1ab7562353c0af1ba1be0baaef920a188c60db27970f64d +B = -94b683326e9de19e414f653aeb2cb4bd7b17e76a23de6a4d91c43d717a35e08f2155b444a9549dfd01a8aec4dc901ea9f629f16bafd2c84828b12d2f63dc154323eb2d54938895ec4c9efbcaaede274fd4ab +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 5ad7411cef0581b2e675d03b0ecb9969102a283eba5e779bdcbb7646d94e843083a07269c932d18b973b57abe54eaaad0aa76cf7b61f30505a263bc95aa063efb264ae829eb1d1d5f7d380a0b4db59839de9ae6230ba51901e71b3e3d59e8c34a79678e751c8b7ab139123bdb2f04d90a18ed81d2046ae86da1a73c8dae4fc4f +A = -469f61cbff01f0e4124ba69a860ec6dbc75cd758dd8ac7cbfed97645b16488a329adee62d1a66e90ee4212569d56d58b61676262f49dcb68296bbe5d8e23853e3fefe8a304710cea568ca65c183531a992ec5b4d82e226 +B = 4a0d48e31cb8c24a3b2c9c95fd19edbe46823032ef4c97fe65d0a30d5c2cad7a4fbbe89e0ebc9940ed9f9ccb8ab18bac269759a9740a7985809d0f38259e680f0703febe7fa012d1ded47f0cace4a133f59a721 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2b2953981db406ebc544c39dfeb08a8b089064533221536c7fa2bf2a7a0d3a1192859b7dc0ea5036eeab5aa371e3e0070c3980433adb3e3a5202ff257bb546bcb9550423201a35501fd717ed4c0016eb3a675ed399340bac7f058a04e69c1774590fe747ffb9c27e78ba50fcee30ce533a1659fc49dc080a60f21357a6265d24 +A = -122621d97f42b65b060c84df3f0c0da097b5e240731b77a37bb9471e7e398b242db6f1b5e25062a9bed702860ccf6aaf386c1d6fcf60fc31b8c190d3486949c5772b9e621b863a7cbf29449ddd68b7e0c21e669492e58e94a +B = -33978406dd30ec2b192c416e422428683deac210017cac9e4355e8446d6969295b0fbaa8cabc92c1fc0068da70efa047f938a419bac160ed6f794a9f69f53a88648c9725610d5f309b652f5462bd3011cf68ea859b +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2104dfef151526e072c09a4a277eb981a035379de3b1a55a88cb060681706f26131c388f5572c5646826b119c85ed450207f32733487e3c4e1e9d701a65058c4b4ef0cd1db090495643038229ed177b54695ac32110619038f1c1cece14faa693d88476e3d70329b0084d0ba5d547bbaa5b59ba1ce1fad5aa2f1c11a75bc7c0 +A = 7b79e6f1330fefffaf8521089c3348593e40ab7e8d4da3d4346571b43b12740958336580afd13619be3dc2d42eefd9e30599405da3e32e7f3a5655ece8b77a367059668021aa092460de75e627526da08e6206b0f8f539ef40e +B = 156e234931907c0c0970c1fe6bd4b24225ed94d5f5b1be4693c8e141e9a6032425b4a47b6eac6265afbeb9d796eb230efa707d5ac4a73808225181cf814b319142e9d175ac461c75e6d479bb6bea53954bb981062eb16 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2a392c5fc96c29df2f5ae9eaf76e7d981dc1e2f3b47b43a98eaf556a9465ae8727c622188123c64658053ec50c25e54ac5c6c8bc279b134d326e911f14c873357647866eccb4f9038ed0cef5082c2058ebd71e1619f7c8f8f2fb80871ebbca3fbfb7845bd855d307d2efd853f1bfd467fbe030862f165e53a9cfa633d0d3fa23 +A = 1e0430e7cf15173d00592037e83e717c90d7dab4f54a5b2f0f5772762fb5f56bc0b2a53ec1bc3b960afc35e7b043f9d85d0af6c29288486af3e186e52bae6300b58917647231b40a12648cc8c020a797683a9bd7ff34eb6d41b928 +B = -e08372fc766eba6e0ef55a9149d700b503e2e3f978c8a397912e2735d5bcff69c461561ac0822c44160c7c1bbf722df421b74beada57462ac54a9bdcdb42d6a27b86413036ed2282abf62800fb2518a32a4a135bc948053 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2608f68632ef14dc3979725c8cf1a0db10a1651f17d91247edfae9935b53f6364d233b030eb99871a87b7bd876ab2cfd5a643387a7af9d337e81770db04a14f4f8dbda2cff604838c9af9a31e8dccf9277d453176589ba33abf77855b9501e63370b2e6cd22831e1e70ff1815302c0a026c70042957d08e74dfaff940a91a7b9 +A = -5d3568858c05a15bc9777af949eb01d33dfdba58439fb3f7af2ba792efe8e78b16d7fbc2a303a4c4c4be7c9d43f57405e88be54d6ab55268a4739945ef582921d2877019659dadbc76e0939f4b2cfbc91e5356ba2ed531526ed5b9b3 +B = 47f81f65ea1af04f702757c02a175a299b23cd8ad551fdb67020c50cbb4110b5371dc5790b12484e9ce647eeb24c0220a5e62aaec3461a9dcdaf1a22814b6f22d66372cc5ee31944bef33469f905458c172ec7871d9dc9c301 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 5735109bd21d31b5f54e9221bbed78c54cf387e39c13d31557e8173e173f786b2d2f1acf3966c3bf4552fe9bc802d0868a5a7632404cb91609a7a45fe0fb83fea8d83b0319666c1b0ac520169c15be708343359447f2fd37960c1e96d32799ac9394e839b391f59dd347acfb79bcc4e34e76490880d163ac97ee69e3a0a6e68f +A = -175011349a0a1ceba11756bd528f2bd631c106e709aab223032d08d52d7d6724e8c5b055b6f97b48261f4860eae297badc1214cdae9b2500a7a47b4b777dd7b8f1006757754ff1143b637d2a3adc555f38eafbd5478cde0b04e5f46d3f0 +B = -2aa7f75d6801b04ea9f690aa0c5448906595fd28b53775059c01efe54b463f1d87c9fb4b39cb038e770f99bb995a2118b86ff8d004bd964e958c2af82becf362fb0b927c671cc3bd7185990419d26a827a2d81bbc0126e1029556 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 3b4ad19b75e1301d19b57ba9b68e0666c28c7c5c99df1d5fbbe0685dc1d3489ff39c919222719c5d8b7ce2d7ff967730d776a02b36a86064ed66a02011bab82eb575390f85f0104715f6e4954a1bb28518450182a8ef58af35d00e2fe417f07ba25dd9c85e00c3451082becd22e3aa0c9bcedaa96e6423c7df6c375b4c799c65 +A = 58e1ce4a9b512eb0632b02cf1207936d6707b802140540fbcbbdd712e5ac1426b4f36e74a9a9ddc812e572855d4fe4fca8a0de6644226f5698fb46a5f2a479dfc8b588aa8e02ddb15acdc79ed3d17143e290f1317274f425b869df54a4807 +B = 14e341cbb5f5a7f3b4dd864172b82ceed2887fcf20aae7d0598b3d8afafd2f10c27bc7456c1488abb570be3df04f43d892dc6a8dbe7621f55bccb0ee3acb1ade989a510b4e0cbe29b6b93968f323f0016d87944c908824d249769f8b +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 7fe0bbbccad6032069b1a335b3f2dac16089051cd9321f903181fad23be6853e2d209958e8c48e008be94a62c6206b34b4e994ca08b8f24a2df0e6394ea65b3b7aadb3bc43d04dc9d35a77e673c4476dedefd4568b4ade5d16f9d89486f3d5ed0566b1eb428cb0b688f10fe3901037744f278385754fca481f937cb630f60308 +A = 1cc0e3ed58090db55063c9ba11401636f89262d6ec096d361f448496e05181c5f7f2604333f26d511c13534618e90637adc807d622097f7eabfc03266135cb626e1bad20997e72da71bf2b3f65a4973dc27d2a594b1fd96b7bf7ec14b9e4b983 +B = -87871b2058d33cb67d83b6a56ab27839c6a6c771bd94e55f200a1257f2c737e39c4a0403fa410ea64e8f442d300df1c19c2f03d07fb74d94f86d26814fca23d4cd2cd3718252cf0cd8a0e36726f6e68827a1dab6bbb1d23b884381c702 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 35d7ac5cbc7e6c262ffa41be168b02a3bde9e112c512d1f68421d705ea34461ce3e0dafde67f44d44cf31d91b38d4d5f2fbf8c6c6a44ec3ed0298dd58f3d45c04346c11e57229dc3d2cdfea02c802732d9a811d7be5e81094d72172cd04caaa3c9d55a951c09f454f42add6e89e2d8a98e124aac86379df377606e7af9bc6baa +A = -4ee01518f6581c560a186fa05c6f4bc26809c4822cc74a0bb74d5a6b0a368aa9bd0108f26113443422b8c589084ad49f919a9e7821d99127bb210670e732b7cdf610e464e300a39d3dfa7c82f90cf00ce329bc6763d7b1d4224a020095112fefa7 +B = 72dc8973f7af7122a05c90df190bbf1e39abca908c197590dc7ac41fd0712f48f838ca62a72a177a293ee6b2afa7a10c21e7993347c3df4f161a5641ff62ba123999bf1eabef29ec0d33ed0919818f4b7c35b5f41e654759fc9abdc0f80e7 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 5d83a9b34631dd6c63c05a0c012adf97b4d0f20f61907e1c2145330211e9a7e38128517b058e0a85e993c385068d1cec768deb814bea1323dbd333de091ad2cad72431f20c1e70ff7e1b119768ba44e14292c38b88dae7e55ac9e10ff98e9bcd5f0ac05af499196b4be0c6222d1a63227ee895fa6a8221a4a182a1323183cd7f +A = -17b3e0c9288be15fda58c8fd228216bc466731d631218a7ddf1d2c9cc858c0219cb0757d3b680bca1b1964eb15031b5b9d761a8bcbd160db89be339067a2ea35e1ac3cfed701912a17ef9ea03999d92e3592e893183ddc05cbb98a656983b54590c72 +B = -269f96a4634eb37cf8a6608408128587ba45958405a29827d0d03d34816fcb1a2297f1319485439d3e8594532545086efbe4d21d31d30e2daf09b74fa8cb27df54e8f9f993630cd9a292c977eee70887158bd3fa3cfef321ef900a0598ac8cea +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 7fc1c65eade94d9de7440eb8dfaecf1004905135efd4f98257c3295b1e76ccf1e2ab6808d158d360b7419c6210c50efe960610973d9ae855c72ec0e81d423e5863c80b542ad455700d2d0dee5fc403dc01eab460c24687401cf6a3179642e59f2a30268df95fa80dcdac230702352bbf6b60acb9ff5d45c5b09a3403b954d173 +A = 7906bd8d3bebb1303c1df1fea0b2503b0abe9c69b4f4f5bd01eec9e314788cb7d44b93428adbcef570477e8ecac2a64822e481bdf520fc381e1bb0b2cdae2fe94e484cef5236dd524e4dc364b72f4c06d57f29dd3c5079e532b1ab1e71dd6a65b3362df +B = 1479ef2807b9c23c094d0416f513894cc92e023b134f44a5333360dbbe98b8161ab899302f4fa11b470b97dca0c4e8ab7ae47e5fd0962834e6cc1763618193f4ee027f667368da580c623080de137b5869c3081128e6081b9d5e2dbafd791773242 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 730c04094b1ce944588e8291f7e6cf763c70b79cf362dc8a1bc63bb8790cd4cfe4eb51cf15a45a8464d69ddc3e1b9383cfbfd643f317108cd9ca6a6eaaea177c5c8b6747bbf40108cbc0437eb8f11bd2a0939da59b70c0c6129e2c249823897f2ee536b0427bc45035f121d2cbe7441c175899b97c490e6c3ca01539bcd05848 +A = 102cf23cc3b81785c73ac3613c816de47fd585c7d5f175185818dbb4bf0bd47d0dda9702bce97b29d66e48bfaae0fd07b47b40be2b48ed702ef21c54b10bb927f9d6b43604bec4f4b2796b44aa6b4e83f8bcd00f2fa3871dd901570e1a32888d8691454c40 +B = -cc5349a9c5280a933e87ca38ce458a711c71ffebb40bb1f7612b42b4684afc495e99c4a5f32eef1c9564c2b7612ea4cda7a0f5df6b3ec9026447dc565ca08563d46aec7ced9fc4cc5645960210d44cdc3944149051d569c9295dc50862f8f6d1f6cd1 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 1cfe1842a53d00e4619265e2fce7cb566ffbd912c9213925d01408a956af304eacb85e29fb6edb812a95e90769bf1c3d62b0cf6cd5bb8f8992391d2ad70f38a14fb9d1d1eb522aa7b7fd9f1b52790beebfc887193882377b7ce567d317d8432e1d9a908d6ccfe8d2de7de497d77b023b3959cc042ae30aefcc0229617fd2a146 +A = -5c3d24fdb193ed83f5f6a825c1716f98e3cde6b32e09659f253ca3fd2a39402b5bc3a6497ed7bc908838e93422559a13cf59156254bd3fe1e3b8600b2a777943cdb39b9d42c58043f1d587424425d3ef5f5538ea157112970ce3e09a87fbb5f7c96f1b5e65fa +B = 675d9d2a05288b438ddcb330acbd59e4639375f3f14ac2d0e9e8b72de6ffc1d217ce62f997577f7eaddbe4603541b132cd41f2f2740363d9c331ef22df92029d143fc8495ed0152b918aed7ff22f564c7cd94fd3fe4178c90365ace43def8fe30ab05c0e +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 83ed1948276d689bb7fde814e67fcea72c4e3509c48873c3e7349a8fa1c08ae11ea4d814d8deb1021eb8b8ceec342cba5002a2ca45d5f340ae1aa500af4c7db120d0402c6cc8a840404be7221bbc46ffa10236043e5ce4415d3ef1355bde26d2d26eb7127326d4b8d671bb96a08e38a2c1dcc281830ac77202903a5e4777ff02 +A = -1be86e7c87827922d2e8a06e3cd6b64ac9a280c525749bcdbfac4856916321a964c9346d17465378251e6eada42dadf38bc9d7d87367bec94ebdc21af6b1302e520db08a64ba6b39920683725ef02b011a3e4ba46ef0eefadb98582cb911d0cbeae9c231b5e432c +B = -352059faf97b433089a688c702b97adefd0c91d51a0395647f822c6762fee3287693e302fc5a5584a12c048dea1a320cb96fa70b5daff7c2ea21d249467d14c6bbee15a1e94c030e908342a939fbe8ae0de58cb6d6eae7758485e392ff6d5d64465b701692c +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 402525e19b6b68942253d1a51fd9b2ca36fc84cf938d80b3d52fd4302de142b9d93d1663e89340fff10c2b5efc8cd47fc3b5cc5ccd49a6ea3038ead6454bf190b7f88f52c56bcf00c6ad5b0f5dfb7615915ee8af137dd99cd3d21172ab772f36d291a6856a8e7912750139c09aa024b930a0a6b9eccc83c2c5c0ee2473ea32c +A = 65e5db532ecae639bd56dd63045bca39b33b4d70b2db82ca3d0ee8ca436e671828cde80217b48eae7487fe110830589ab1be889f1e1463f3b0757d529b2f0cdd2ac92c35e8ec141885bbefb6040a3b5e00e64a541913a38fe05824a929f8c5a2c46568c61989c3ca7 +B = 1d9c73eef8373cbb1e8393feb26d55c33a245c33d7031c234abffb2f06a1601f7f3a79ef1e8664c51ce5dba5f5aaf3b9a9e42470d381219b4616ae93c7f6e64792d23bae523b6a224c1f714ebc82a11f9be42618922b8d2eb7b55e4d45572e68a19fb0ba72228b +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 7a9cdb5dcdfb6e04351057d731fddb9e85f41eb432f01c0d980673d294d05ba9b0180133a89930e74cfce78ed54991b494a19e7f80f310b85904784cebc5639bbc631e80751807868e7fe16719e8ffcd1f2cbd1b9f303c3ed488b647670be3080668b5fa0e53b6342c33c87f0ca1efe1ddb1c877bfe2556aeb61805b06f41343 +A = 1e412c3d66aea2c503f3aa5dbad368a61d969a2951c0094f9da32d2794e47f3bf4c481ae23636baabdebdcf0753d431426b1865e62de8eae7238a9245d62820ad7f17b5380d701f5db776cd4e1ddbdfd542901731ffcea5bcdc247fa9c83f7e08a9389e5a76d38be21bd +B = -afd61df72361260484fade8b432713eb740df83a401d73492883a5139c918d5c911ff5dc00140637da1c6acfbab4b0bc8fc1f337243d90beeb1c2a083ad8069494c73a99372bd38712a5b5393c779ec1915e878600e0b48157bea44ca8e97c6099c4ab07fbda57d1 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 712580a1ffde78c8cf98ba71843c8130e835fee3afbb45e372d04c04cc388e403c9efac742611d7974bbae982c3aadfd1893f5da280afe0c1db1d81a9ed73b6ed9b7f05a20ce828316103259112d7754560d66733041e9470ae0d4dc95fd0484bfd56d66739f38ead7efa4051187ea41f7bea8fe5d958a29af41328246e2bc35 +A = -47c5755ca61ca8b7ea927f6fbe347f1362915548ab38c40f0418f4c9ba4ad520c3b2469d9ba3976669dec0b278461bae80eda53e9d11447512963e797f45460f74678acdd69fb9efe3897913b6568f8e03a6d90b4cb5bfb06af132bf118574b70e6bd2f6d6cb4d0089379d +B = 5bda68c0a64218d3609d75eb4832d5468298f19498507d7d515f4c410f04dee535947571a5e75f1af7f94a5b3b05fb742fde23e7cf3f8b3dbee0a569e5a36d7a3d31a26c4a48a299044fd72339d2cee1a68966c851e76b93ae34130b75f4abe4f2260207d2254d23f56 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 4a1a514aa4d1ada84fa841d0b668930c904783fac521377a7d622201867d773ad23dbb667e0d4181616358f3cb088cd157c8e72bcd03db64647b37aa1813f870cbb0318ae0a3667f8e6c19f6e0706217646ce633f0cc8bf4e8f0f4d7329a8647252ca6d376416d545e73cb9a3cba40f8f9465d85d57c2481b84b6d95dd42d50a +A = -1d68bddd8c3e6b78daa0acfc63a6f39e97f19527a43f6cdec47568d57b47f4e4b7ee88e4a28d683b569e406ecd2510351dba25f10b9f7c82d6da16d848bb970cedf7675e67937921bd334eec4bc8fde83d67aca57eec804ce22bb342167602fbff452d5f0f2a7f38b576e1e50 +B = -34d219765916a4c8ec843ebee9a7aa1162974d41cb4d6b60532513608452da9993749455d9701af6b7b6c7454d7f2fd5c344cc938baa5259301d4b56ae8d25b6f6510ae6bca114cae6791fa5a9551e8a405f5b1c0bbfc27138563b2d64f9a4d7a8f42a23bfacc3f1ec9393 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 3fe24e66e381eca525b24cf767215837019f44ed4fac6ab118d02cdbd658066505ee5b0feb7af51859992ecb97d727121e38873f748a61d70201cc43228a7732156a80dbe399e05764be19e37dc1b93222bcdcbc45b1a4817460f7021dcf1d70e632bc6a306628790201222bb522f4cc80adcc907463a539b02f74004d42adff +A = 773454a43f495959dd55b8a064d70b1b1ffe45c084f5f9553582e24fb402b564de68e5379a8d9d02af101594e717a6c6db2e7173e557a64d2f28fd45c4e06041deda040705d99acacf8086830af19c7ab5e27f91738ffbd937dc27e5b7869bb6caa12c2d7930366ff75eadc570a +B = 13d884a2396268f1a8186748a15722156a172a56dd3d8c77b9cb7001b6ee06720653507eba9bb9918f2f699cb37f3b5ae514f5180108a704647f19b0fc075826153edda66dc1105c1008ea8ec6f8c10057f8e8e479e1a1274edfed9ef719b30827a30f26da78820c3696d01aa +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 715bab8708e53f76d2ef2afbb845bdaaf978b54ce25f84dbbf9074f16d30a18733a02a4ba5d7b092fa6c25d3b9b0d8243c743910f1b7b785d9cb02343fc6d59eb0817bcff05646030ce4fbb2b9ff76781cb1af66b46553d365d02c61e677ae97defe92d057d4378dadf8cba9824b0022c086e0d78b5442bf3d3263ba22c643f7 +A = 168186208c734383d472374fbedc2d5d430e85690a4881b740008623120a4f7f83b2cdf85dc28bfaae5870abcd7ff1bc782ef11c78a75c99d41f8aacb52fceeb5f10266dc65eb00b0868937340146d8850887686d54218badb97647a6d82c0c6650ca1f9078d73fc6222aab95c2967 +B = -9711e5b3965654bd9427f79c89a0b3f3cdec1c857f4451eec236c1f221bb6773e5dcc30e7381a18a813ac2b03ff4a4ba679aad41e0e5d7181d4627f682ca2dc8af9a8b4f878771446fb225a979ef9c7e641cac819c307c8dc50d9c1ebadf912ec7c844e416f95b546cf09391f9f +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2714b99dcde70d6c3be8b671d78abc155793f13105fd4b7c5d760a4c68ae89987311dabf2a9238d18299f983b8aca69a9ce398fdf2c9775d90b11b3dba17bcd8edf661efb6e9c50b4e37553cbecb54eb214fed1d0847287732810e550a4c86b51d4e5da1cb7722ce4317e69644620ad806d6d1c94e1e3fb4d87de6178a997453 +A = -75231ed37f1dfa4487c9fc79a6f7b36929fdca086e42ed41f79430b2dff521919236fe415ccce590e1d3b986e16dda866f3f0d29ac1adcf55d87fa5cb67dbf4693293188516e360bac513303769c42181483fbef7abcbc4fea1310c916396d29f37d9058a62aead94511aded7c4b8de8 +B = 5aadfe65df0e5b877fe45d42d7ca02882cb6c686d486374da5ece6f87771675153c84d74b6f40df1db567b7e1e3c60c41d21816f958f5576fd2ce2f84a8c3be4749dfc7e5561266b7c9698c7581292d0d813cb77955458d63bf94ce87472924c4ca79504d1ae9d5f025c7a2504156f +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 6613b1c8ccac0cb8fe2f59e76fef4dd05acf1f1b2bfc20aa3f193622ce3e9d4c7824ad544477553bc68f05f0b546e7c1ee87301e111af7929d1f40525291b88e211db7175f4e5c0953141914fcb4fb951dbf77442e7cb28fde495704f1b5141de1e50fbd0e359d0d86ad709c8f564c84dac81c7602717c269219ab1cf12e809c +A = -1bc03897b02d1edb633e2c019e40c20c1d89a210b0733412aab675563fae8bd75dd7e65988cd8df4d9b343586e27f548becdde274f62dd421679554ed9eb127e527a69d69fa8b17aac0424dfa2a7692d1e63617ea45564b55f01a70325bca050862d583cdad96c4a2e123d0ed827348a745 +B = -3d5239dbe7bb3dcfd8027204eccf5e9444e68d322a0b0c535a203a1d0c054e7dc1e588bacb891388241462a5d2b43e6cce34ce46a23e6ef29670603d31001374dfa347dfcc794988e58945d0d2d17da6565cfea559203dec119fc357d396f65b296deb07686b0ad2d25a13fd4fad88d2c +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 3a7fc5680aae875b9241200b9f4112a82cd624ffd9044138ae3cd65200631ee9d7b918fbffadcad7e598791a9f0bef3e23005d6bc0048ba92461283492df3bce74c66e417b082ee052fd8f808d71f3ab18f9ffc40f8fb51ebbb936d09c26a3514bf868141f7cf238c1abb3d88e5d50dfc188902254f07d63fb8cb611ef8e4149 +A = 4a30f32d467b29dc83b40bca2fc4ccee5f08a64069cb87f20e63387b2219b12aa312400c4ca59608f50a71d2535cde40a6d248290793fe01693ca40b93a5cded2dcfbc9aeb36e187c9d650782d12bea917daadbc6525f266e074037803e4b2f300778ca8dcb304658cdb502c93c94a16c6261 +B = 1ca5e5218dade077fecb81d579e1c9290431b34df5ec84aefaaf233d68f17dcf60ee010db26320685af13a821b6daa9d73d8f3a30826c3ae7b2bc5e219cadcff826283cd7dddd04cea7a5e0585d6e7c9f23b27f14ff815fe53bcd75fe700b1b91671bddaba737fb43bfecd2a77e5b752a206 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 768d312175ce7d2601f30bb38339f046e4c2ba5c19ae5f7ca5a562cc2462c579fce9985e9e8afe2578db542c8d9e7693e0c74ba161334b249ce720d568e9c18f09c87cd701e6f2080b752362f2fe6252a1d0caaaf1fa18199776e4c6078d89d520b9c63db159d5fba7e0838811e68794b1413c248f3f7173ef29eff28f15b656 +A = 149353e91bdb70cdca8f06648388508511a64d05221305cad7187ea40d9ccef91fe17ceb1e79667bf66e8e6b7a57faa90a83bad119c02984a8f860bc1f23ffd33d4ad84896610301cd2e8e80a5ca7e8d3ee63e7dfa459793c9dbaef3569eb4f8a021c6a3d032a9c94d3f6b8278274d0088a98228 +B = -a7cbbb6a434e4b022d312ecd4a45fc7fc4d3aaca038cca0fc56e529fe7119ccdddc8e76d51a2fb862ad3d27a16ec8a51e5f66b9c7fdfbddcd05a0ddea14172339cee340c8c651eb653c6aab6551c99ae94f26116e15dc62f2c2e63305bbf84590fba1327ee721150d46464d7e22d45d53ffd44 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 763912f4b16549e6ccd60eaf7a0a1f64d9c3bc83e4a9b87e209a3959ba3cf609cf47183bc543f08e346b6e12b8bdd5d1c07c603f74b286ad432d58d7001299ec7a4dcdb56ca875dfc7ee5c75bcfe2aaba14959bf3facaebf8df92bc12937cfd4a4865b3dd74b243ff62ba256d110b01b4089730cf48efdc66fe272f9241014e +A = -4df3899b40d51c83dacb442fb143835bcdb550136921df78800f0515a6cee77fe3236dadd2a0800b79ebdaaf8cf4aba5ebb60cdff3e4b4531ecd0903c1674a4559339123e9f09158080fc53c4c6ae72c961c8da2f357b7c05368157b4956e592c41b25642457651abfecb4fed5d9fc1fc3825b772d +B = 450eff382e73f2f38bc3a4abecd5f8de478f80a6b99fb6252173c90d7099629afe859442bb1f796855ee9a2940f21d1f9dc44f462edd74b479e1f2926ff6faefeb55adbc6152b5c97967b1dc8c44dfb85b5e02e870d2920b75422c8a427e99e35e2a4be92cb0ddc04cb7f4044f716be97b36f045a +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 56ef57d56c6d1b94cf0fcdedd3611a8ee444c2e25522b9ad175587619598da341916b183be03b1e73be300f9969120d8f3a23750cd8c4ffdb87124a2139e8ff2c15d8dc944bc3c3a066aa16dbe6dba4a74925e16acdb2b2e83cd7fd5cedade6a7f7409a509c00dadc182b2860609cc9a375cb8bbdcc350bcb2c0df9b3bff882e +A = -143caf995b7783b1316b5551978727f06512fe114b419c735b3381ec351275fb7fbd6ca88b848c3e8c9faedebd6d084cb8a231636f68f6803d14bafd90534609d4a4ac0fb953417be7fee4e4cfefa452c5ee5d1e1b97ee75f83cca8691a0efeaa8bcc1f1e0f18c0c5d6c7684c9da6c9495d31a32f40a5 +B = -3025fa05c55826c40089b12741b7d406f748cabf692bb0227519a124653160142633700e3c0676000943556f97551171d231c1a35f7b7d8f96b0366eb74942466ceb4660f09aecb2fb2ac050ef699eb05bd8834a2ba959ac71550b5c026b9093c8cbbb7c5fb9390a7818db682b7c11e58996c9d0add5 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 42f363c34c20c443c1ea7a1c54f98c6977b6671164a80308000533b2404a7f280adb1f3b98101cba25249131288f7ac68b0ae2572c7777e7381c1f4d05fd82188c4b1ed5636652e0bfca4d096bbf4189a9358b79f6b6333b99e5c4b7a940c2f7d1413bf9f47a2ef66b620b5e220b2c3dd7267452eb1b9d8d9cfb17bbfcdb6abb +A = 499d05de867bda3118a8cb82b80ac91fc505e0fbc6c7dac5fb61713cb6e715f56a31ae8af4b400461d7ad1687a2631faecd90d7829f67d1b9e36ed7d55704b3f2aea65eac061172d698384daea710ed92cf1140cd4da427174bebd173c2ff1675b2407a84649b0a318602f33105006fe4d5ed8d0e015b99 +B = 17a426a12a0175bb46bf7a7e727eb5238af383cee6f4d5e2bd82b0d29b9fed35f3d8ec95cfdfcac49bee47b25d3b5f375a3340fa83f8dd9330a593a974d208debb7e567e59dbb7251b54e42dab2cd50fc63aab050a41bd88282373f8195c94c35f61bb48aa921f574cb4ff0984ccedc070efea8c46e5cf8 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2f03374e9596cb56cbbd89794090ca7a4b437f4c05fa38a09db60e5ca900b208fb85b52f71c29fd35e62c9f9529d7ffe46fcc54607ccb07f6f8e13fdd4ff1185033ba4fcefb1ed4bfc42c3ea9f05276767d8dc9b7b4aea4c8bc0ce84951d1f590cec0751f73667db19060e2bff64da30fc048a1f5700fe3f489920675cc3540a +A = 1073531f678877ba854fd1e7f857659614c526847ffbe8ed131dc9f2ccf69e1f1e917bb44a7b905f7ff758f61c06dd59ee09567d9f0df2550fcb98b776ed1381ce052988aa08fc5153e31c621c6a51ca61b386e3a9163a5cd69608b3e200476a8ada35d906c41d044bafe71ef5c6f732935f15b53bf36f7ef8 +B = -de3563925474e5408e245184b57f328e265b6cb62eedcaba809d8f257eccc0a457eeb82c451f93af93ce9f36dd1aab386e7c02b356f31c2d170169dbe15e70cf5bb9073b35fe0e7c7fd7faa91c5b2b0740734f12eb741a9d9ac6dcf7cff59f6e16324ea39e1e07dc5b9daea27ac674dfe5d0a5790abaebde9 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 1aa22f9013bc1cdebbdfecedf710c1bcaa41c696a3d7dfc1c8c601fcfcc1c85c8cc24be7df2cf3c7311b3b17a4ef2dbce545dc467d2a92d371e02a196a9977cb9042b236acf99d8c0d34a1c4dd8792d3497cffbc87c397ccee5d01fc2c89ef051324a7061e423720d0a3821a36739797393bdf7a45b5fc600824a17043312bc +A = -4fb2e3fde2a0c653104c077cc6459c9234f86cc2d7b317329b68289826d3e2b975f1a69bed1a53418a0dd86e1b2723f4c4c5a29d003161e667c2315ec24a36f8bb5f2eb0a94f261e791bb829db685cd0ec9e1e301dc140ea57cac1da228124ae029e2b8ab1fa3ab99c55a9ca94dc7b767162c0a24af851fbb984 +B = 63702537a07971e399aa9a1a0795db052d6c8185c79107216babe11d6d8d472b61e604cecf9eaa6d44a2fcdd1ef0b6b52226ea0c6902d929b09e16576e6d1a6921765b2134c5d23c69ed61f36ea9a5552e5819350366240693558fac7a9d09ecd3702076c8c758a4bf6843fa843dfd688bef3f73515db31bfc26 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 6acb23ea695d4b60cce53079390da3cb3a4bc3a6486c238c421f3bf6c93c027a0475f656c3e5435f0211e90458ae81772aa956ef284093020f7b58ccd9373f3fdd39fdf4adb8dd64590f4a7fc05238ba20017bdad07f5f9a6f076b71554a7741bdd8c98ec68f8fee88396cb1f47c64d6da4c228caa3dfc7a9a1c032a9ba4fedc +A = -1b2496ef929bc673042996ae80f27c6bbd33fa7c20580240ef8fba985d1a6117d6e746989924e34f281e7d2509175d0773dd999bde16662e88fcef52978d19cc45fbae3997fa580a66171d398f4f0e7605d9f4aa4f728902cb886e6b6dc9f0161e7cf1ebac05a09c5a1bd69a92273280758173fd2c14550ec221275 +B = -28399206ae2820d26a5aa0bddc4903776611d08fc4cb34a22a8bdc2a19e9f8cdab94217f346a8070a4145f989e1dfb49cfd100267635af0e062872cc879c534ff138fca603b5d45a6860ea85b6de37cfca000c81fcda3d14ffe81da919b2a25214209b085bab9cb511889665fc845acbcd038711533da171d8308aa +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = c012c4d17ea4c95a360218adfc3363f6d89f5aa524aec70049ef94c2c05e59a66ce01e25588e164bf2412f9517b7740de53d037e71ec3a1d426f05b18b128c41a878da75421e8c8ef3ebd5effd40735c00818eeb1ec63182b44e817403c9f1f6c1a0155334be63a3a15109be6d45ac0d1b1ef5cc99e9b284b00c487d91e5472 +A = 796fba6276fb7129eef2d1572b305f63d7b8c49371cfb3b2c67b141071e66ccdb5e321fa2c1bcf624c77317e2aa135e1137dfa46a34c3ffefa2fa3e316be81f45614d422bf86fe4518c2fdb7e416bec199de033cb5fef7f193a80c0f0e6ee924a12c8f705f5ed3793ab770914924b45cf2578bdd09c701169f0a881e6 +B = 12cf934763127284e642ddc232b1c889cd86617307b6ad72a9fe0d48befd7c5c5370a0062dfbde2add256dc0af850813b22320ceeaeed347eb9319bf22320b2fcadeb51c4bb26a160f7459fc172c27a91d367d5a232d00cf7bb778fba83afb744177bf1ddf45446baa035fcd0065f9b493d92eda37e9138f4fecf3ec55 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 3de123bbd50c35805b943e76e97b7e664eb9feb99860750bf97e275029e836217375cc1910c13269ffbd0bd72bb82ca445ccc4b693742a96d19d3dc23f78e5ccbba46d9ff5975f239551c36403ad5fe86997536456c4a5ce54807c24e3b5317b1c7b2a1661aad85b63859d427f0703b460cf72b9acd3f87e2e69d7f8f15e972d +A = 1d0433d84f1de082d2058475e0168ceb369013a67aa9417f066c29c28272a0b3f8be5ac7190ab78591ae72a1dc8ce628c683281a9ad563e134387b9258b9c96d2df288fc118a8cff068ee49d635343772c2fcc252facdfc93112358414e1734d6948b909b53e46263e9a0cbffa141ef77bc98e7fae8ae2bd85bd875aa7c1 +B = -a31a574d105305e47f4fc00ccea0cdf854556886b524901c22e6f3b59a42915932ab209a8d5da29ab70d1472dd5378d9c79a7447d17665f9d1f1edc1e545e417cb65415cb8a368075c16264f42555d26e83adc704b5c126c6129318a8f394af8bdbb32c8114470d11b2acfe806acdc7b96e1e348a32ff96a988de76d4623 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 770f0c3104c0f3395fabeb75ddfa2c21a111d23438463941239f7c63e4b6e6832b84508ebf3cde1d90cff0a2801beee05cd5118f9a726a987eb58def6780be899b473ea71c697557ff63a4c6db894e9438595acdd98abfb529d75bdf3c1d619d6165a9edb6aaab8ada50b61a3a84de654706a9aedb7321b0523558e8f18116fd +A = -5fafbd498d610e9f29c38a5c6c262b71672fe9e9c84f0f071b549390353e4fd0101a059b7c547007e27df97761767302458f1936395142ce5776b0959fc5ea039429d64ac5d50c2ae0ee45d60c0c50b7ceb4ff9853d57c6e883f588017ffcaddf5a1aa3e23ab068877a114d9a2cf742f01f5f5d611424c8ec0d082f5c165b1 +B = 552155ef110c126afcb87dd20251220c7a43bd0215ecd22249a21c93583e120ba6f046c6fe03086ef3c97311c4d520110a450470a473d8633e3560d2cb44c25559af07516aff50d6d176e8782c06cd9aadd3354cc695c4ea8dbf85e01dad479c8e8438154351fd5fcc6fc7e9d2162ce2f0179247f756f0b9b34b54be74821c5 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2e9ed66317734668c4c354d720a011fc65bb67439b2ac9203dca65a8f567682be40cbad4f55a83e836f1fc135596b624e4327acb085a61b6398237fef5a6e6560b488d4a673b5ae7d734b896d9647d71087621cc81e94d58e01fc2cc2dc775f9ab1b6031840a672fb715b77bd636e3d87b4949ec7bd60721bec8f9907b7c072f +A = -1a6b046d691830d33eecf2c53953676ed3f6fdd20c2252f6e915052ec28ad1fbf7a5f264acf87ef8ecd515ed921ce6b85017f3d8a8f1d14f269f31e3307c6f935ad468cf012a912b0650a15106fb949cbae7b36c9cd496538bb0646a7a28989dfadc719424519bfa43cd8833d3a748c758f813881d83c98f7cb2a63c2a4d06b8e +B = -34f87db0f839af6e4c4bf146789db36b3d0bcebb9bad81db690ccc3a35070d8830c9745b2fe730a1f3a252612e7026bf9889169b57b8984a5479cc4cdd6844ee3e150a2e7bf7680eebbef30e0591c895cc8b2ca488d489554f2339e2f55598717ddd8ce444a060cc95cad9eb478491ee8d3b8358c3762a970224abdc1068af0bde +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 6455ff7c12bf3bc37120fe3f1302a9916a6ffdae6ee6a37fc23ca2f3a7ad910dc0e1027d4dc304a8eb4eccbcf3c87cf52a13dde472c07e2df2420c1d36bdd5e88c3d76e774ccd2ecaf6a0ef55b8c60231b1348a738f812a4fd9d0c158fd5a9fb19cc7cf9f000860d4cb6509271c8e43ae4193843324db02a029beb58ec2955ad +A = 54ec203e2ababdb0348135c0679eca2a8e778ed46e53f195331a48d3828e5e40da804ecf95eed819ecefaeb9c5377cc1afb1fb220175990d347981353e7d90637adf8cbb16812af8a3783dd312d967a490f8efe3f23746929cf2a5a8df58e0b878367f6c5e4d3c086f947fc2bf70bfc3a0008a8bb1d7d83f002930640b6ed94c334 +B = 1311b88a05224e15f1465c8da26784dbaeae84f818e029301ea39a982f714c64312f9f02d094c401abb6a89e8537d64c178637364bd261f4a27beeaaa901cc7b3d4e36ebcd9453cda33d47a53c6dd1d121dfb83a222cfd16158eac23482c8abbfaca59e765f6c1fe871d884d281793eb19f6409dd6bbe4083bf762ef24c24f0127613 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 64104f6c06e563ec66de4442d35d88117f2535edf9e012897f44daab5a1b8a8696f84db7a68d64ae24a394debb993bf6734c9df542c7e473b2e497396ce39a064789d5d7b339b65766b002a18096e7fb9f312ea5997c2a85463fbd6fc18f25769ac2a2123ccb0e72f14b0608c4c22add72bda138b83f986e78d5c9da31b15b9d +A = 145f580c2ebc6c0354ebdfdbb1d3d7fa17f0b55493b0b9a11b71001c840a967dc77f0206c3dde161b5a773a6b5fd9471fa08b205cb6f728e3afba440b55268d6a9542e234ec313d53583c580a391d8da5943f4a900b279ec9d8933f2cfbb260b74ab714a8b9a1af3190d914b6e42212df84f933a237728a5fd5473ce2e272eb82bc83e +B = -c67f9b9295dd5844307b8fe3cb9c1875257258e4be6229ab097e148c0175ecd0de4d84fe03c8da6e27153c709c2526092b1abc73b5fb40f1d4da9e0f3d8d2fd5f8a4e6f3c30befd80e189b73fbd77e8547b34010d2aa57072db0f00537cf3ced95eb517b23e0c854b4becce128a575a31037c3a9e106a476d8b0277d26dcee435cebedc +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 11913c40d577f70a5346ff1cfdca492ff52b640eaf257510d311872c8df7ba9756973da5b9206c6e5254bcbbb4bcfdad5fc4594e41ee44e77f168e2d20a4b228480a9908b102dafddd039ba7f7619eed7057e8af3a72ee491a61dd049bd947e5b09a94ef94d5f336945f47104fddb8493ef22fb648ff5376b68e96c0555d74ca +A = -5537630b7cfb8daf76d14e617f7b69f7b75b472801a9a818179d83ef2984d0abc8ea4214ed3d3d2bd785060e9c2819e861d0df760fc1daca8340e8a2c997c9ad201d6d2f12a82ae3883cf9f5c51ff1c25277c28175859a7b8e5b6cdec7cb3875071cbe415bb698b85cb19f617162587516f93c728ba8b2cfc19f238e2cfda115b8ec0431 +B = 597296cb27080f33a24241c1e98fdec32f7a4013a7340d367e4cf2a521cd462a2803109c27fcec353a30dd20053a1f744394fed75829e8396f8de434399bafd6cdb6e0ee81343f0cb99ef3087a7c69bd43bd722745a46cdff0c2c837fd87543c3c63df3896ac101a145b478dc224644996fc72460a89beb5741b91a42f2fbaf0d62c099b32 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 42f420adf5c6b32ce53fe23af4e392517e37013b8c3a7d035a93f6ff45142b0b0bd5525cde85f9b7bd9ce219bd3514617e89ef4d9279cb9a3e89e44f1994d72febd23ffbdb0a4f19cb76448199b31c5cc6d7ec1e46fdb67be1211c0ccd93c123d56ac0d9cd2ad11f0c58c713165003495b75b60665047ef80f6a393474cb727f +A = -1c6ac9565d1950ae6c55025f76e0a040eed0462218e97aea87208ba879acedf413ffd5e63a92dd8658cf5f49d633ce7b126091a55701168ee4932db004dfe8c35c939887fae3a892b0b04d8eb74191bf8fdcf5566b4d3796a5d2596b1e750f64201057ae60aa705edd58aba4b48f6a2e511bf5007a6c44a27e3efd5bf2708f7046c1fff7864 +B = -244f2a90a57e5d066fe22f4d52f91b44882b8ef76d1dafc3387abcb224eda4a2100239e729bbc745237f8129d457e98eafb2ede2f3afb81e63520493da2a5730f1170b31fcac21259e90c894f8bc488c5e5dab2c2635bc7b1ff56c3685607f6fead73a09f83a7a168c4245729ce5b06e482d7d3d72eff33d14cfe2f32f72175484ffa292a9af6 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2239459025b257fd0b6659f54b8874f93f07f4d6240f8ad761c9da288cf1537d8bd001eced284bddf78edd611c7f28f1393c6fb879aab6e7df8eefd347d63628b1ae086148f488b01272f67ca19db71a2b284eb17e17aaf1e3e8f23ea253595de474d5cf47c16aecfae360eab7855868b8af361491f6ad96f893f9d3eb66d07d +A = 558613de283911aea1ee21d6b926f531f778c5226e978ce329860682b5375fe5e5328ae27b00f504f2a2d24470d16c1edcb8e76b4d1a740e55538e79ac7da4b45c5299993513ec3bba7e7395dc829a00d4e228618dd348fbf838eaf0bd50f6c70253fb1c1c734a07d0813915be25d3163df13511f3675022cb85af7646c14ba5d13f615ded8e5 +B = 1f3c3c468146c29408d9207e15b25186d3b06b3fbf9556eff7ed7ef7788032d87ae1a4d2a0983902d4c70936c615d8c9ee26c89af8b58d60231ede54e859763237d5ac59af686300a3e92f456484ce77700557ddc0f93bb40e5d2e5117f2356ac7ffca26dcafb3ce7a5573e07ee97515b6b082fe75fcc9dccd76b4fd416e69a247fab2b30965d9be +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 7650985e7c6e5461268867dfa9782cd8154bd6a4bb5857d6555e9d9746ee79b37e44638940bf8d5e974911327f0e53bbcfda0739056bae2248015c35839f35e7e359e93d3a339e7af38c0cb43eac5b41e1406e34cdd4afd458a5d126f70b5d683415b490e0ad61269ffe7ea8972eda6addd447d97e60891e5099ee920e18f233 +A = 184845d3762ad1a9c925c51fabc7b9e15570a84a06ecef994910845d56869264273d75fbb84a31c97c27eb9779e8b39f6829638a78b266326b60546507f65128caaaf36d4e7f85939b75cfb3145e2b1bd8372531cda579f59efa0da9c95a8efc72faf326d35c660b4444627d328bedf50a919029dd164de051a4c0c924103e365cd640b9637d8244 +B = -977390f52af784b52c1d54e82131b072a1c308406e9b82587102e67c6f7145f0020952231a5f0ce9d130677bb5a7a37d5a06dc570a13a29673c8a9068f06242ac438806c37ec46136e7c1c1487ca2d330fc1f3c1f42ea51ba2805b74c44a61fb2fac109710dc3dae78a07057a753898d4e849b910f035bfd807178f0108812778345b256c7b59f8883 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 35d48c3e43070a10dac0e256afb83b219aacc0036f554bd998b9092ce3bf87bb5d3b00947f2c86fd4e7ab830502d15fb2d4e47ead087f5c779a9ba56e272ea86116e2c81345d379dda6b581e9c8f4df8ea56c78f04d4f7412d245e00ac645847af6ae97d5d2ab27e48cc878d8b510c2dc753f6ceb1b9e7bdd923e0e065a6c11e +A = -76e575cc79d7f0c313a489b255e85d114f3933383cdfe75cfef649f639921eefb9b3b3184351fd0ad252c6e477e153ee586a0ff6da1e1b2bfd7e953e6dd778c849843fa5cc355b31f5529ca45aec81ba67a1e364d5a74a4656d266f7decdd47b2fc2d81d6c298afa2d1c39b5e8eed519a9997a14513537cdcddde0b5b41314476264d59b7d3f0e9a65 +B = 6b7faa437b4e8db8fba56c62eddb8a81e9090d1b6655a2185d656b2db0e85225992297381d653e707aa15f3017880b0f07abf3dc455cb09c4e551b3df3516c6db4ead79b88339fc33dda96bba76ff7c388363c36b67fd5dd0ee63f92f67549dd77e37e9902ae51cb58057579f03286fc48e3b7fba763fc5844c222e6a1eed9e1634d0bd034cff222bf147 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 445039f359b55eec647296fbff4f22beac09cad32cae79c13d591e314fafc2b77839816aa4f641250938865b0a2c30a10e23da71a6dff5985ebf3df4429fe64c327557b12d987ad9e9971f7c7b1e4ad01c94e1e5322dbcbc4707a959a401624619029558fd6f5b14564469b13146f9a2555916491e4d77caa70f51716b299135 +A = -18ddf976fec2090f7d1f4d41b8f875e56c813c04338f595d6e591b3eabf9e105be792f45354ee9beff997e6c0e8ec3fdc714c07b3466ad1a949b9d30da0115f5484c3b9e00c7cf0c117db57c3c6cd7434371c6d9ac7a5da1a0e2d705bacfc22f62785222d59bb5bcd3e3bf2df8e845953c6ddf1b546cb75b1698dc8e20bc611294ff288056723f1e46ec9 +B = -2cbaff39103570df7d85a5673b50fb8818434bbc19ab4e33bcc8289a4047d85de1b7029a5cda3976ab12e1d891b7efe3d5576bcb3713c597771f93532853290068761bea04200fcaf9b05d8553b960ef5e28064de89d9e5097d12b26af0b64beb40b33ff82a55af7c5838b44282917fd4342e2065942c724f3cca515d9142fb8e46652242e8f0ee5ae07b6cb +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 6727c0d0ecb4a375d0fd1bc52146da1242099d445ed9e87b1fad4daf8369fbeeec49027d88bd98efb425c1e3f73e412fb327680068ae57d4a53992f3759af0ac1b96a92f56c2cf552e6682d1fa90c3910bbc5c0b1754862ee13c5ebd62d5b98bfe8dbbf9bf53bf9ed0b967f3c9da24d4334b9f3f75314b429b05b8e27142623c +A = 5cb6c49efc6767cf956885690ef740337aa71b90c1d4b9b0a9e4734de0c0c50f2358fd45aeedaca6e1dd0fb510bf097bf46513ee09f3343bbd1c11f507eb61d51ada40c5d6b730561756480063f60caf05141bec9a769c241d367cb92fa8e229ba2e471fc73f48812a25bfc7553c395ca77b80443ccaa82fbb7198f8c35c3b5a2fff977d8b2a29cf9358ee1 +B = 16ff229a0e67a410555dbd4b687f1470ec854ef67db73a902f2d19953c55071c4a26dc320baa8571586f1fd54fa490b0d87dc83e5bf20b78956084275518b307ce69aa4ca1079e3aa753d97fa1cff62e0b5f3b99d96a24e411fc3a3e375ea21b7b35a578a72df68d28286fd9a324c06930905f696424780083715f77961532bad061f3901ed276a9eb6e81ad4b4 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 6e9947beae4d934253e481d27e854a59c4047eeee4fdc7df7e174a8f045776109c148ba3721685195b8fb59263def88891c5953b5a0ae85fcdbf02abc76f4d3c0f5d9496327d063ce8b3ba875b4f119dcd8beefb3ac884c25955af61c35a69d0670c3c349564e5b84f7df4252d6d3b29d9a75f09e9ef79f0fa9f797bf75b8ccb +A = 188785951a3befcab56128cb6fb9576bee2412e6cdd7dd1bf5643babae83c8011af99aada405e119c3be33653862440005be994bf37d3802cb6c73cc312824c56841004c8e871ffb560e93a1d222c93d63684e90a91394b9c8ba8cac27b414bf818ee0de7217bc2faf099783800485ce2e93612ce39fc7e2f1db708bf9bb032d92b66159073fecdb2e0257058f +B = -8dddf094f30284c213577ceb7f1b2efb1e4213a548e6aa840f801cd6382fb6d4995908b7827078dc3f46fccdb9e071bb8531ea8971de0ddbb714d678bb71ba9d961e58cdd5f41b8472146ff9b814a5d1d6368bd94812f8d38f235f39aeb2421a57499fe7102c1ab167df7d33b32a6dc7c8eb8f4babdd6b6c929d1ebd9bf4774aa40cefbf136feda7b6e10ba4dbef1 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 3f4a8d90017dbe8e77205e65fa7a0875a1ace6f3f215c2974e47dbac779804143da3dbce92db391c2614c078997c7d1a15439ffb51a5787f5bbaf98a4dcef576a6317b9b92dd8141a8fadc05d3be7c150630668e620a4e07b4b00519f34e422610a160de112f1ab8adf09a9169ba95b60242c89196ac6e155021dd84b3054511 +A = -65ff4322f8e46e03aa6c1fd10a207a5e51db6991bdca232c0dbc9d73ba77fc485d881868be7b14c25b05bb59b7f5bb6c4b2a7d53f35d2d7af282a0423285c5de656429ab7d3af7d92837e41ca701f527845e98c2bfcb51647512e6abc6675cec2a7d34ce55ea4dcfe9e7a8397d45a7a3e73bdff06e303a8f04ab6285eeb1bb78b1455931cae203078eaae826a6e5 +B = 4d936b603eba3aeec3d3f1f9acff02a0ecc28a8ec64b6bfd9b153b1bbacf4f1e186d3deda8c1c81e759237921cec53251250e3e838f5063c4a1eb6cc93637f35aca10b965533d18b713617a312e74c446d63eccee93cc97e3723ab27357ae9b3cbfcb3e2bfc589a1bd582480e776198df047c3ad85f611ca6fa480c70aeb98af02f57d56dc9659b2a6bee222dc3e0566 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 8a7f3cde3230af1f1fc25e0c0e9ebeb69161d3864fa5a03e5d7f8c82d9940ded285df35c008f61cc151b4578e2677b2f2cff3236935de5bb1d113597eee448496fe29bb18343687f6e9f1c783863e949a0954de2993d47a03607423b458bfd18c844ab57e9e2a43930df159ce8564edb5a2a37a06425626502e3ff9363b73c79 +A = -100f2984dc1451fd7b71e5d290e4b7de2d26175a47b9bed524fae02bd5abf96faba06e955107329559bff3805689633a4a57275732bc42183acdc792cbf7b6b24dbdc8921b73c0308d0c0ce5d8aad75f7eb16352e67116e859b323deccfe5d9ffdd1f0265297bc9eede073146a06acc3c330458b07b8fd0bb652c7325cafdcfa165f69cd0de8b145d49ddd576fdde15 +B = -21ac4953e54347a56800d75f6feb6ad660b0442174cf3c5dcbcf6528e2b5da95a614d3a8399da14507df4b8eacaddcddd627b10ec2dc5fb8c43d96a38e6dff37189ba275afb9484df800587f4953e327af71dbd58780bd5885b4cdab15ea0f2864f961bbfa9bba6b2d9448443af87c0cf178990254c1ae6e19003b1621f3240a6e5d0a3be2deb5dd253f5e1f88dbb60b522 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 76f8b44df8d8547f8b3d8537393d2805c699eb37d19bd115bd5539adb6b6a00d004def3b7793d5c71e0ccd2b7e9fb87103c1a5f56a8f18ede1bfe1607a346297166596aa78dc584c7c32832e11b72fb4f2d40ae1591f341919bc0157080ee8febb7fee5461a918d2178fa407c37a8243e24206ce2c19c3addcc2b7c3c1912b6e +A = 56f4d397530f5c90203df1ec799f82a0096888fd370d543e33b5a2c8042108bb75a86265204c40fa5a9a44965ad2fb41896b134ea56c79699a230f38c0e3fa4e5d346cda70e0253b9993c9da5642f4e645a0d96cb732f8f04c99a83d1f1360a385c6e1a972b89915489245ce58830788ce23b9e62d6b48a7ff9a486614d6979033f7914a0735d201c6f29e512374088db +B = 10fe818f6af7a95cfefb0ea0726f9a3e0e7c30dc9785b1fdf6e2b810515448386c7efc656479794d389e109ef3efe37fa6124c5a7db3164268da0d98538606c57bd2f7df9482860e81f272a27c727d7d81a66fc1a9bc8c385cf02b7ca6bc7ec2d8d6ba1dc992caa216d02c9bf0fba8ee754af77567c6e275ac1b6b1b36b065760761300d156e40da8445712b8fb206c0df346a +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = f580f9d2438b22700c3ebb23d1dc296f3d33deae2d32dea51c7ed3a0ce7b06af11046bc1cc279bb744bc31e7f822c17ffcc5dcbbdabe213bf97bb85c7e19ee71a513bf59b25b3b5787e42e9f3ef6aa1acb8705d69924a107b4f88e0cf9276c2c7c47fa4bf56c4900b557aa5587418f0ddd899630ad3ff678b5b907c07247b2b +A = 1017a4fdce8bf41ce804b7c9c836d85ff6ee899807e1736bf0357b015b701b9675297e5ebf588ac6c295feed3c6a367987e192be0d89523ac7d64b0b9576f311b5b2705c5398276a52f06085027480c2ca72884ad7be34967bcc6c8cb4ec4fb761e88c16866a2e284b40180eb14536810eeeb180ab701ec47ece62af65a0753f95ca657e7d04ebf3c3a7db02993da9089840 +B = -aeb03379fcd4e87cfd18957a72fce42e016951a72b673a9e81f666b3cb20d2bba81400ecc2b38601bc3270eac46a633a1a6b55c50f00e9d7fc8a20176b93e971cfaa4f41573b17b8ccc498f8a3230825afd0d7f102daee347a9d59cc0914ac8689c1d8b39ccef1f3def44054307a7cb7706535f0cf4007231ba21696424c3d5b42c8e85c278f7c2e8b7d1787effa601ad357eeff +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = be05efeee19cc91e30a9277a6551aaea63aa3861b63f6061efbb0b92296e09f4709529eb849d9f40406fc59c526a4697144cef9661b556040458940ffd6a87ed56cb073d2ee0e6d1f05936fddd1b9a8974a3088577847ddde6bbdfb3d69158d5b3899c13ec78fb5cb6aa7204efe308bbe0b52f18381fe838536707a8a27ba0d +A = -669660e75eae9930dcbdb99c477c980869417ec9c0e8c4053f0bd8ae62d496daf7539f37af96fd1cfcf3149bc02b8182a46b413e3397b49d4b4d204491440eea65505cf5d33a8e797af08f3da41f5a0804214846bd95d730260c6545d51126278181719ddd396c55f119e84da71f0683eb6db8393b098b3a0c5999862644e073b4918b5c8aff17efe860744d85bc94b582d45c +B = 6045f903a750b69b709cfd6a1c8ec9fc0d7da9c53a9d26fdb0ce9a17c6a0ed5ba633d6fc01f004f4a48cf247d61f7df609008ca5bdc8eafe06dcfa06bb67efa6a584b5a2f02768718a908978edd475a2d2926af2a6e523549a5cbecedc78323c5c295bc0b8d3e14053078492e82e339ea2c6301412a5dd7efc20da0aad0577a37d853eed820776e672bc6d23dc821b5855eabcceb18 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 705bf20b7d92e68a69019cfd721b27373c7ff22f911066907f556321371fba70dbcb9774d3a26ca43e44ab20c586a3c1546fc3152ce011be66e04a59c6631bc8bde18efb7bf1743b9ed75a7a6c5bf5a4117368b81b112a3cd4e1c44a621f534a11c426451ea5fde880939ee5bb28d9843730e284520a976cd9f60c94751050ec +A = -17c1dbc1ad1d2d33dfe1af7b4cdc7b69fefec5a92656957e111aac292e44719c7c752ace33dc74a6568be38b576a5ba174bcba77a034af5fe101699c99ca39f8a3b0a20679e6d0180868a232fd8fc775089e185e5eb81585403f32619a2f4d857bb091a824a89de2e84529e5b0702b45771a5816c5a823d81ddc89f8a70cc3d3a0c6bd6d85e9d72b69d2713b61c46161f7f4700bf +B = -2252b54c602456c5deb86a0f249f3982c3836b70a946f636b22fe00c6e3b91b94e19200a33087fe734ce9a3f92a6099ad03a95ca523b7edb9e1ed3464d38fb96c470464e1c54790cd48769677efc5e1d22f5be4c15288bc5ea1dc184a05fddd5e576b3b4962f37437b4f9709dcec374377db44c8ba1d8611c0c3ec35f9bba213eac59a047e78195ebbbeff941c7f862e8c80eafb72b1e8 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 7306e3172929c00c29ca1db360eb4ce82066f237e9cf6aae368d1f531620e9b61eb64f5b3e2b735a3b565587d7e955d052df94a20e4aaabe493dba2c18e85fcfb65df166cc48733632d165129b112598bf5e4c58dff662e558e5f71b25f36708d3ab6536b1cbdb5aa2ee56d9e019a9c3629185b188af909831629ffceab634fc +A = 6b31ef80767a7693e7d0a9ecce54beaf5848120f036923d80b7a0245aa6a46135e32314f3b227268e0bfa1f45b4dce83bea890526c7ac3efdc8e485189ce2c51597c2864c2d3664584be23559c03670622a53edc2c17b3f1a92640078ec35189dd7953e55e4da0290ff1e2996d164d69f1bbe6f5285ae89209d611a7d760e413e23285066eab8e126c320bb6130a91d67ef26d4dabd +B = 183f06828033287497322b05ac08f62dcc5fa67b7a10c6c5a319c9a1e642754230c6d9809dcfd2de4bb9e360d6e6e1180f6ec6e0d4c6185e34ed299b6171e653521d0f7b8975ed5e7d2c51d27f9784a4b6f9b5e97379fcdb42e4df981462cd5bb9d0501f93f217d954f6baf70343ec710065eacbd2b778430ddc36a7ef0515f29d5fe78d8708d8ffb6c3391c6f632cb1bacb4ec52972ce0a5 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 361ce44d153f4d251952c0b90681a19b7d2d8df7a6c5d459691a80c06107b2e818f93f30f8dad352d2dd87b01530d51fd1c67cede9b1a6167697098e41bdc5dc5e7a3c310116aed0c7b5fd99dfcdb3517c13daaba6ad10879f600eab846cdc110d392d9bdc0e8ab34b317840a725a7a12ceb48c75e8dfeffe2947aa85b2a5158 +A = 1e1f2e44bc7c79a00afc3b2570d5cd27ad5ec9f45aa94f63f2ec3fa6b69077480212a1cbde25ded7ab1c6cb1ec26d5905948e5c1d6d109bd5047b1e038666054606b42e880b609f6f00a219dcfb504d481d6fe709f4362940f6c4b6f2e05d243722cb32bee5508ec94eeebb53b5befa551d3ab5dff9cba3daebdbc97179e56cb778aefdda6a0c24265728ff9e59ca3c2d615398d97e66d +B = -e018708df037aa2918850fabcad82731487fb812213b1c067d0688462a4d518e5ec7c4c84f2cb2017aa6bc960e2faabbe361ad8f66355366cae869d366f06d7cc32ea08dc51631e7f36a4c775611095d8aed06a0086d0a471749246d7157947a1eb5d5503f207723a7062382b3e45bb84c6f555e48f6d63aaa1c04fe13c0108507c0ced669a5296bcc16debf18e03c32eefd177bbc1dd2f19cd +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 3aeb3ff6e797d271fd2271499a740a91569f300d7392a7b5898084012a3c5ad379a57d5169e43089cd58fc7210314758d5368dabca2f0ec5cf6786801bc99b45cd60403c732d9f98936aed76da724bd3e7d4b622dc690778f11fb0310fd4cd980b220627f7a864e107f93a6259081c6581e5dddba4890508af8057c1af29a745 +A = -75e06b47f60edd23148c3736c9c125a617beea7c8fd47e662c9d9be883ae925b7801a0030df3f4bdd3c9fc386f18c4e002e5daf4a6f7fa27b2f71252c83d5f1695e50d62a10b99e1900987b342290decf681a064f789e11bc3fd75d64e2e78ace56e7491fbe0eddd6f9958a5f95775c920ad6c051ebe7750fa76891ab00f42c910550a42bbc1c1e5aea0ae13b7e6f916a5d228bd57e854f7 +B = 434c8e4767d0d7df2125def75a978bb1509a26bf8305cd03df748c6c12b6dc580a2c1ca9a4526eaf3936fbc4ec797d0733217a54ffc9e1d7c6ca04fb39679859d5bd3fa64cd0a09cf1a056094b9c20ddf1f00e134533ba9892c2ca7346ac8d0655250eb45df9f0b7983bbf71102c6f1a2d9497e7a45eea7b3095cac037b7aa755beeea8a6191da268780179a652d94a732a2a5c7b626c0de3145f4 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 734a429c91f5b0f06fd47725ded06222c0193dd407e9daf136696f203e153c9bf6df59016849284cef93fbd35edef2cd31c9b956fbe562d2a22100f177254144718ac7d22c99783fd523b642984794bd7beb0d0b363e28d3f3469ee332ee364faaafef25c1d4a11b5e517e44a412ba717a113ea9e1e8f2d6db8fad6f10d06950 +A = -18dcd213e9938fe4b6a64abee3b9867f65e47e5b0365d45a8dee14ddf787f34072ce32f38d4d48ccad236005a23c5fcdc02b72cf27001495663fc56f428072d3f1bf5e33ab2c5f9dd9facf122f7225ea03c2f67321530a642803f65a2e9428f32d0d974e68a25f705e4f8140568f7e4b132942b49f9ff53f04f241feaa29aa353925fcade33a0cc192fee2628c2111da1e652cace9d304d0f1d +B = -2e5397658a5e6db9d30f09e93e67a30dc84b1e17c25786e041fca48ab710e1d0497ce615264f1abcb23d5aae8412b58430bd801775acdce06cd362438898697940712062b611c92ae6ad10da31784207c5e7b9362b20d7254da0df8caafe0736002dd466d76b1a03e91a8dbe8a71107abd5f07b00fcdca2017391c7c3263881a3d02a89b0e16a2a765a32d24ae6584cf44a88975c539402db9a301dca +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 427609751f28edb62c717bd98ddf999cfcf65128b652be1b5aac0dfe1bc0f7687c580ec70c8290455a9448c69dcb550c0cfdd109af561ece2ec8707c1d02e8097e780f32ddd932e706f81f68711acda0e7610f4dd0fd55f6ac7ca3a3184f655b0b29d2d62974739b43ded96b413b9e3f0033ca1edace24b6bb610bf06b5d940a +A = 6576c31d48daaf7d6bc3658952c4ba18095f1a0d73726f6fe59381af45a2a6b592adc79fbc3b597e1eea711ab295cd991441fb5fc4ce5f047e571a7d949c709e0d31156184be4b8a6a49691ef93d7d3b120193f6ee82246aeb896b8b7b4c74c27c02cb39fe0335883a3f088a71ab42b947a0cd59dd2155c65a0274ec0836bb8c2fe394500724ef84d869bee40291363389e7012d672b1eab6696b +B = 1ba2888f30be283b588cddf00eb3ae3c641e35fc0bb3a9fc85d7fac1e81052129f499afd3e8458d4cf893d51fe4a2bcddf70f28c8edef16c7bbfb791daedf1a8248faebe36953560498af652d1f1c7aa0e9a5a667d9c94f7d9525cbd5a82147d58b738dfbba5aa162858c2c66d0dd7d8db38d41a2261e6efc7d0c8b2dd2d6962be0fc796705cec8e87a13092e4a3febdda3d4dbed9d11a1d5f92d7dafcd6 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 533d6d8d7384e6e65569ba0daae0a8cffbec1d20e417a6edb42d401a59de0a91a7e6854db081ce33b76faa63f6d866993c245e69ddbe6c86d339f7107a4807856cbca23cee2bf5496388ae8fd8d7c78767d0775acd7bd6202dd75451b424034e2766185969b5663b638d539f718e50a9f752f406c224c000bf1ae1fdd60a2a82 +A = 111940235b144a42a13201a41a3f9e4ff02948f8e9127d9a3007906988a50b36d7622d1221155f2516812074a7888b1d8334a01c02ee33b3164d761d02b36729c299ce2455a462bf18471fca42e5b01615d53723c3fefa5aaf4a039a6caad35c348a0a4dd3f0204f084f35c0b93ab233c4066dc50c5fd3897a769a7c5bf309f7a9c30e905466c8394d509b79d62a69b58c73d8d3f1665ecd9a8a4dd5 +B = -e2633e43c38c0b4b8713c20bf4e2b8ccba680ecfc1139954fc42724277beadea438596942fea1094091671c2060dfccd0351b2fba8cbed35dc963cc18f8e8835052da884799d88ec1887712000a0726b17cbc4302421011d5be8d234440eecc363f09e2c04bc9cded3cbbac9a5bdf0b6d418822fdd90dead20e5bbbb3566ca94ab85f3a00d32842eee6521edd18b9aa6872340b2f47deb961f58bf231e01f9 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 33960d7ceac73f342d46275e04fed56563decf2fa4c0e9307c90288e911ac8782f8e1354fb051a9da8e2db83d7c710b5d2b611495e72ed42259ce783a7e7a8f601c07061ec749481d39a082f29dda1f9c7f444a33ae1c1055d37a677b848af371cd3bd41c851d31a07e144d7add66df39576b8200a8b918201630b3da8e664c3 +A = -402034484e499a8efd610200790d443c5d3be35d19d8808da85954d42dca3f24177de48f55fa2efd7e4f7f624d806a8d461c3bbe0b626fa1f3cad2145746464108b367b13f3537ff395262256bfccce5f0414e1f98b59ed29940171d46ebc4bfa1a27802cc30d9221cfbceeb92abdfa6e84ab4a54965568aa10ea631e82067ae358a1a93a3a3fe3a5ed5636a0c4cb373b4d49f46f8fbbaa665a19200b7 +B = 78ec7dbfa2b28e268619ba6db34a23adab25e7f8690aa9464a7d8fb7c6b87d5dd9d33d4c023bb665f2d96febf2638fc087ed30796fe7517fd58e4120c0d319688e67a32bbeaf62a987a9764be75384bd499b0e00a850f27e303f615031299c631844d10abc571f9f2a0f742cc0e8df2fe3c244bd825bf1d9134b2f1059e2a1b61985ae8daf9bfbd9eb24ba268ca58553891945ff1a314a78fdebb5444677ac081 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 3a1ea3fccd6f336e6d444d68af1753b83145131954c20f1e3c433a89eeb7e267425a34d91f67fd65191dce85769ece2fc7ab12d032f3e30f8509095ecc05148e47a85391b21a18257c338a6a3ca9816987abc8143fe443342b34afd8a52fff00dda2e42b1b39322bd38c6a1f711051f791d6cad2a47ebd423a9b933485fd5861 +A = -1869c53f86755aa350115a9f49d6248cedd42a339506b8ff59cb878b7745956f142fc4387322c41f369773ed375b72665026771d4ed1b9ece08f84e4782d4c3b0177853cf9ac3a55f7e52f39c1b82aa42b30628a4fa6a838754ec6ff9809308f675e455bca6f44e298394888d85fee29d8a0c8e9cdb9aa08d68cd70e13a243b5804a3ec199f52ccd462ba6594d856602cf1d5efa509047633923d31f78da3 +B = -2023c544b6cdd8d971bbb345300f7a101f6dd44dede6bfb5f4e6b4eafb7a40728a3063f6d4bdd0f606ddecf062828cf889b2f632d0c9254c28f36dd974aef116b73cabeb2bba98635841c2b4d2aea833e35eb1db9fa9a9d33bf7b51c49a14907dbc6036b027a039192b47406bcc56bccf375fbdf40b82ac4b3c660a43d5a6eb656868d383cebd099d2a73506f675cf29649617fe06097a46de93c13d1e590ef2cc71 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 4331f18a94c169cf0253136bc4eb7480c9fa4401c18db1194371dd53e5f7b75f07ec2e1e1c4116a5d2a8b2cded4b22925b67a88af9b8479c6e821d58cec7ed9f780a4c41e729982cb33f69b87d01c11cb9a8f7952db1920b6eb2124fd5d820555a99327117d7e8e26d18e748fea3ebc17e1d07161fda57a21a70c7f4e251612c +A = 5e7d4ef7d6ace6cb106e38d96085d3f3505983fd952498af3c1d9b2af61e4ba10e14961b339c6e64e11ac758d5fa18c3222138290866970d67d0a4f4e19f453503eb8dfb85b44d1050c86943e7c5d6faf7851bedf7d0cb6b13d2acee25372243591d37dd230907457fb440f83b62395f80f59a2d02b87134887406a78efd77614f3193e517f234434ab3be084f1484d3f2c1f68c67c0d6e863585a8a5ddd0be +B = 114b6e6726433ea88a2ba965f0881beb3ff4d377526e4e099741f069abfaf29e129a1f5fd243c6599f725a389728f755f9cad767ca1d6ae5c8b3a32102e47af211e86d67574bddfa42b2cb466d968f38b47333b1b55211fd9a315acd5ef62cfd3e83c13ee9d3fa20a06b2292177961dddc7dc39abad9ea31ead1fedd3d699f651b656edceebb0bace11bebd0cfa581dad577b8b42f0a844bcd8c8227880876dd7b0aad1 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2468cdb1a26eaee34db3d2724e37f023c8a1788526b3dca99321b574685cc8303c609c85401a58fe6da181daf4111fe8c6d4b7428b1cd301cdb9bf8cb6f33140756c8b490d3b2e538ff294fd6471c4d17b9d9e4adeae0df088cb9daee18e825a368be57af4a096056b9e76b94c8d3b911b6a074ed41082926773a585007752ce +A = 1e6a59efe0b14fa017c32ffd0962700fa9752242b06ffd0b604b9bfd125114d4e0909534ede704cdf1c9e88a6567f4a2989df752510d087d7b7afb515ad594627ece54b8a8e539074386121c9a3e1c12eb2641ded8719e56d42ef50e2f3b5d7d59f8a6f897174cc00a7449d2b91f33e9df07902a95479731a44fc4ebe8048c449bd515ef6cffed70ae78c832cd43491203a247fcfe0a403862266777947fc2542a +B = -8a9d3646831dcc852fecc8e2335549e8baa2e2d82fcb90846ee82bcc715c716d4a9f62be29d5e1531db73c2186a4d2f118266de33d966b78f989600d772ffc55b1364117d6750cef67f4bae851e7e3f8fbdae7b79de7eab54cc1fee56e25d0632b2929e352c882ce78fd64dd0a1473e80b6572f0d4eb67f6bd6e45c7617314219d6f7de5e505a9b395096cd36650d23e8d57d6abfa9faaf0ddbff90d32865bf5ddddcaf28 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2909d3aef7a21244efc9b5b16626e260907ac11f3d00647f2170ba37197e47b9767030195c2f6d5eda717a83a152141bffed2e26777417ecd8e27aed8666698c2e85a414dddd52b07b52b0da7e08b3217fa6a331f84820d21086a4424974e1e8cfed3501eb054242a9f8bf0803a94981b7b81776eca6d07cd50c050dddf81d68 +A = -73ecc8a6a1507fb5dad40677dc6ec75f0d130ea704d1e87b00d2bd56a6be21714bb30202739170b8dd3605f0553ff57439051efea2a97def70a6d2cc3fa2b9ec27a00c1338bbd588513f0f320272b8933fdf6635e585d1e79203efb5c95a454fcd7f33aa2aeac08902107e9bfb29587ce8610d50cdb7f2033c5b726742fa9f7f20b4780cf9244e6abf6b812171a64b870c3ca4c9e898d4c15e9f5b0194ae736c3783 +B = 4049ae926bb52e862606842bbcb4a5148bd1063b6a56f331cf10000c524b4aaa80b3bd914cd697ebc98d68bd3c2bd5c87fac4ec68606c264c56e25b19d118dc9f2eca19bebca07269714f2955e107b3fbf85530b1fe99c42d33031958280b8e8abea5a918a41cc7e6980149ad68fbf1c0041798d2046d7f88a395348b295858c61c2f33d8512b6fe75aa8fbad62e2f9b0b7876ef95af8a7b7338a2d6b25ec6355c276fc6ce23 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 22407e4fe280ff5a10eaf46d8e1f5a1e77a07410cba4106466d703b11764c60124fa355733b47327e952a12869476306926cabbd797fc80b4a6dedfbec0b7718ee754d447825cc405a98b85f1e09ebb9294c4a4636aebfc61af4545b921cbe759d3f389beece3f29c2c7c07691a4c46a1a72ce418a239fdec80df48732627866 +A = -1e165ca7e1eabd2ad1264d5ed9c3d2b687f2db5b507a0e4d21d9e042cd46e93c2444c6aea8491b5caba2d8146bac656b7754b7b1ae0f6216029c7167fd3b1c3ba2e20469d386d8566ebbc05cb51bf1f1eb2cad9dc4fa454b07cc1bcdb9b8f5a43e354c4e0f4e62d52798f667080a0e0a15414391269fe8c92f06da74f6209a3b215adafa1eb6866f8b3e419468e2e5b4db0d0ada80514249320cecf034477977bcceb91 +B = -3f314681eaa4cb41a3feae8467f7d76b8b05939731fdfc943235aa4d67bdca30e64de541d17a8971e829bc0159384643672bdffbc93b3eaded7844d824604f46aa58b1f1b9d788106aff53438954af015a0387268266a6ba262e2fe7a4c51b5af6ff7f918674b7407ce8282f66e84fd2582edd809b465e4401c67e5faaa9e5748c06e3bb8ddb23fa649ccaf9657dbf79b937eb8959aae8d5bd9513c1e601c0e536cf60c4fc3802d +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 385ba217033463cd9cb882fe30373c2d8e8475dee54aba1ca9713a709f40844905c2544ad792784cc8eafbb412dd68de6f98522dfca1c3de8e3bf4cbd09bee4656c4341153b17c98f9ac09411d16ec9880835cae772bdd8eee51eaba7c02ca6a1034c2c5d2d48e7ae3eb0e22f59bf69537ab6f1e49e58a71c64b8934113eb069 +A = 5137226623f4ce4dc9b80a783777ef4e53ad3c2ec648264db472c517a96383ba1173e52c2659a97ce36341a11e832f4ad293b89696f91a051c35bb1db6182260d4a276d1a9b4be848c206899f87a361d318d38b4073a7470c5743b816cbbc3bc1b20dfd7971b11ad4e20d947e352d42760104a5a3cc590b985ee3b5e98c779e38d2581413a2208d31873f9644ec979602671c9da72fa6f66c603c1bb6d8e690dba8bf4933 +B = 13b45d4105e3f5e8e0ba36c812faeafccea2f1a30e2ce8ffad57ffe0dadeae3a23e813758f270423ecda3da083b42432eead7f04842db8865f9f1e2226a3d298ec1895ae69adc55d1d338c3fb787f0676664564eefe46ca95206e81678cf1a2f173c52d809b1e06641a9b467f191ea09fcdc597271eb43da1a9a856784972ce0eeedd49ad363dee882438f09863ba5af063925871c525c6c0ffdca428054e039e149a424c6d1b5b2b4 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 7865f718cb30026837ca006f5cd997c5b917726ac6d9bd8c3fb9eabda0854d528d6cfc10e4cd3f93f6848582690c6a83955072daefc6959d33192fcf42a111650e50776ba9ae43d3d26e0ef2c6b60c3871aec33eda8c56353903e7ae96592fbf350b88d2f56e03f7f327022a2aa9b7c484a000135b85bbaba6f8836cbfc81901 +A = 16978c06a03276fa2e0bea45740a98d55fccc9d27321fd0a5b8522298a2a90d391c06c5c59e7eca85efeb9b4c91d4a1e9178adf816d597311f004ef98d209b59a2d4b901fa14c57b7297861ee58b89c9b2e931e4ce5818dd4006f3c40168bb4d3dbbd059c1f1cc24ecdc64d37df16b8e8d0529247c06f905ca88a5d283ca1b9e6856fbe8115a326061905b369791772a47900974339722d19b3aac16a0bedd93e1e4e4289bb8 +B = -de6dad276dcc0a9e271ad523620ec570fe6e3b350b934932ebbe36dd571edcde968b6590be14326e0f6394c0a2172052ff8dbc3ff15d94fb6e36a098286333768a84fd0404dfa354173d01f98484fb20897c439c48952b7f1791209fed94e9e72bfb3df5f368d420d587ae8bf036db6700f77b130459e9de2a541ed885c69c5641defa9436a4f7a69d2848d0e5d1074f77fa688b6dcc4d4c7de25a3b1b040546ef7f418112127cff173b +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2d3dfd14e7ec60f842d1db83e29a0f6b052990fe8900887dc44476ed3948870c57e72e91e1941c476baa6aa86f76dd8ab6e6ea41707242c46d39b54215bebdb1f28e59d719fde18bea9994610214ea68ad9f2da24e1ad8a06f8bc698f8e76379ff332a2745af472d52a4b8e57d60280e19f93d5be669e0832824321e9ad8e76b +A = -5144d5ca834f7bbb35d3fb95818c1f89ebe08efdffd35993a7691c05aa1b67f6a28e219b27fdcb66e516097c9ef5f00e4257c561b1f94c52c577471cfcd7a55314d3b0fa308b59449a36adc884c48ef5f34753bea746bd6fab2f20b86814c9fe50e8abaab742916313a50e3c390c67fda8e3729ee3329dc5e4b7d3107083aa3a07daf7952ebbcfea15fae7338cd0b114e9ab2f81dc2e80f90abff7a7ac59e3aecf76fab87633ec +B = 48b927a46dbc4e23d714b256084fdc7cb9d4c96a988a71c956e0bf98785ebc9bf22b9d5c6ba0c419e60afbef7b96cc0c4a13e397aa2d2dd7995875d2ccb127169423455d138131199a263151f28d232ff4ae24e316907ace1fedd02a02cb5ff9c831de33e6702010fee2232bbe3c1c193ce792eadcad0c81e7d7c17e49168377b68690bc61f22dfddb17d82a3b993804726037cfac8aabe8548befc52a3c6c6baaec89a392133cd9c45b1b5 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 3f66970f600a9d09d73fd1ff813e977f539d69fe1784b8a2f99506d868418e4b47338ee0cbceed555f88824f98ffed39befb69e8907a5822ef7cd2a9950a070aec8fe4db9d68e1c0620f9eab4ab529c7e69466e325fe1c6c011bf7ab62bfd1a136597d7d5c47e8eb161ea048477bedc88fa30e4f7ddab2cfeec3fd0bb3fb61a3 +A = -1343c391be3f2b72c4b79d8d6091389c9602e97774b18eabeaae81fc0539336cd8c899341cf75fa758421c7f32eba9df474c934642003408b32db66cfa92e6e414b42b1d49c7e655ffb4c80f5bbff8d2774ee4f7198839680175e1ffec0428939653c6697eb3681d0f92634cab1cabc63f423d5a71d65fc7150aaeea74f9e0153923a1c65dee4a165e6a01a88655fbecd2db7697f4d2b49fca2508e2b8f84129785d36d88bcf59f4e +B = -225a0a4afdde6f6450f28736c3ef6e67d67ec6206a63b11763bc6e69b03f1494b275ac504868caa6d56d684a12dc1098ab0d030583e73a2f45a42b8607c0f19031b9c5f07fb71919868911806d210d43aaaced5894e844881e89bab85a203af9ec3adb105e50b4250343ca50c26df14c46d73a22c2e4804d26d44ff0bbcc13d0dc7e326c9e4eb441f493c9743ae0eea0de045e05d19ac32d2379196a165e63ba640ca42e4861caa24c29cbfabc +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 54e95e86e87bc220c8f53f8485402327885be34e34063a1b81e52a23fc3056758cea1c039ac4e513f70ed9d394f5806fb771dca8e342368184e674e6296b9a705c6380bdaf11550cffc73f9f55b9385c85fb648f105f11138a3e1f9dc0a39a0f9755f8328701484d45784e3e4b2ebddb32c9d9132867c6513201116428b791cf +A = 5f1239e0b5dbfefaba906bfd9003336489ffdf634333cec2484c582dbc19b66782ba40942d047c3749597ec4d89ef61b7803d33a9842f0c903461be37c679ca213aea894d36c1e12bbcaa1c679599d2adda9bd23e712dd0d0bd3f91d146e7a04f3e7ddec8b0db7e12377ab32ba241ed1e01da070c1f3ec85efd8387a7b9421453969ecba8cbdeeeaae6ddb098084bcd250601af780960c32f0a1ad7d7e61fb19f40dff1060c5f332830 +B = 1113f145de014bb6dd6ca05de159b97e9736c45bd3bbd8477f739daf79615fe329ce948cab9787838d7daf797218af5ba7925685ea341b802690bc9588ba3e916145cd3ae9d0c4a149637b890cf50fdfa8f89a62e508eec68f9332787733aacdd57ec1f359ff7fde76138d5b33d32e64cf7d252f2bcff14be3adb1afd8da9dc930f5261e6d715ac75752b29f083bb1de7b0b89ddba633b8137f3fd299a7f77abf79781a10d897e7bf2c958a097227 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 6e0160eaac8e1c31cd3cb6c5fb91ba086d033b4b69e41dfffce7569e61770f6629f23e12f0074c47c46653bbba94701ca798e1a242f7c4e25708d3acb5af6ea307b95cfa220f8879cb4cfff96b843d6eeed2b15c8f1bb21bb2b511cefbad0618d49d9ba33cade6da6ab3b846a6a24e35fb36d41201d3b85be831522b9bf509e0 +A = 14f4e24627c773527ed2243c0d1947395aba5c9cf95ae62a48827ffc1477614ad9c7aaea4b4fdd97e3272d3e220601565aebf87928c301656e9edb08d6e680de845615bb3a81c61ed043adb9d708ec1447f057087211673fa6ad8977166a2b4a8079a4f29d48e7fdd6875ccad05d2c219922b814589996cd9642ea2b798197407acd274da30d3ca008fefb40a25b38cb6042a581393283d6448cc69df9a5dc2b0777052566a8608a1010d7 +B = -b4188ebc5bf3ba31cf7c5e100e79806e92ff6f863c3d68a66aeb3ae8385f596dabe6f627f3812d0f2baea319d93ae00de41ab65e42eae7d396cc8fd0a2dfd35f303117fde4db5e8438df0c2b3b680dca538b42a7c844a9bf0d3697fc89ad0a73594627578dabdc214e0f4aa06b40987aed473e7f42d318bebf7392d9c898b4b8d73a94726aef65807b2ff746d4a9aa76303ed7b4fefbab34f5c87c2df82d20457f68289f7b96dbeab581294974e322c +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 8dd91f390c1f85f153f332de17e5de82979755d835398cdf3dbda1ee73c68f8e7565a964ae33fd5b1f1060572bb3af67eec79c4c3e2eb4de118d471f74351b80a5dcafc682bc3cfde642e611ac1d5bc2c49b308c30985b1161c4d78cf7621b503e2dfaceed886befc004f3a729b4a9bcbb8f13791d973bf38fb8101d6b7a4d4d +A = -70e99398673324ee83495aa0aadfffd7bb9c94ee5251fff365124fabc50175d794fa84509f034c2b86d83607789338b0eebdbbf709a129a0ed0afd21c130d94b279c56f1c7c1eacfc6cd13f724a9352b2b37412242a47b23ec61ef0040a8855371aaf238003c45ab9d18a66cc7dab9653b93c323815e5404762d3f964d4654a6995af507bb2db2149eea59acd72af4d034217eaec0be5ba1d23890081a6a234e125572e3bcf68a6ea52d9437 +B = 661d8832671a4974b493e5d71e547cd46b36730f4017e50c5d1a7520fbb75f0314cbc2ac948744dd494d566ba580a2108106b120a797cfeb1fbfdefdab6bd6b2e073f90c77e814cafd0b7f79afeecd59778b1dfee3446fb32139b2311011576674f96f151f896b477c631237995e11e61e715dd8dd38e802af93124c66eee735c472972000cb4788b26752a630ba63b45e8ebbd979f0a4da5b359abd2905f0b7f3a21b1d381cd02ac08e284218ce41c907 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2b591d2c57f6a5484b43cd7ca247c48a1b38319e843257331c8807d499c7763de4eefed529e70d4c144e5e843ac00ee8d106d0d82163cfb7afe528a7daad8e7ed105942d1128a67e38d59325cffc0c3dab9185247e0082e3ccca82a900d917c9bd0f892d4b518a752f8e9d38eab2acaf3b3b59f15b0fe4cb9a3dabe6e0191493 +A = -1896f67485a740720e23e1642ef02742ce5f10a92e51af19e112cc99c0fbddb60d7190086c942d293d076b474d056e74ec9f0c42055d745a57ba370c51ab2b761d889b766cec909811e2b2fd11d6916b753ae00622f038a4bc55b813a5d06e6ac136e81689407de721ee852cd21ea989ea7c8cbd00b64614caf0974a62097b2eb865f46fdb0c1a2e4f2d839066b797e51392e5ebd14dd92630c070acb546dc7438631fef01594878643a4cf77f6 +B = -3a8e2f3b8378a2605f5affa21c4fadcc655f2f8357a3427d2cec0118e55fc2bbc25931259e294d91bde8dcbacd39e6cbc125683da7d0dcbbc67d7c5866f08e7c4732cd4384d9366868370ea40a75beb23b81306303da4a3e26ad357c5c743d0a4ae775a472afddf8f21cb4a1a3350bb6aa71037607c334a0c79468668d3e727cf1d0610e49f27780901c68aecf1d145953e45f5b090855be714cb39aba2efb0f7db2786b331dd9bb8843de8c73c95ab13b6b1 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2f53bdd643b5b22445e2af3667a93de52f8bc7bc151e196c0ab0bf3b4e4dc0e5dae9e507508711a9e3de52e2aeece6aff7fc8a1db65588de3272839390a35a847e29204d3b9b70e10352c88a10c86cd33e067fb530d20a3a5ffe67938c5a7a9218f1164f36a73324adef64da64d5fa5540d29a76a87ce010fb7d73a59b109280 +A = 75e31ab221c08b3bd73bed03f878bf7742f9b36a89bbfa7e90f9b05ec11edeb0140dcff6e9ad1d62cd7af34bb4284b3a52bf1b48a40f744b561d9ece056a9405ab15f508700b14914e4f427ea1df3093497410a0108066e9b259c1a26ea72082b3cf0e3a99ad054804da7bfa0200d93d65354b75e605b47a4e1e17ef851a37c59a95e1b5172801e6ecabf70f1e6e382740998fcfd8a297aaaba7d04b668e3d6eed40358247767323a8393ec359628 +B = 107aca18938a9cb244ad646a37a212859b3dda7518a5827aa2146b47bfb3bd08d772eb7a866e1f674aab7a1c74cfdc2bc6e9ad1a365686213655b2c7b1977855bcd42ccecb804bc01d92bd7d2667069d853f18a0f0661f028955e39f71ee82b9ce6a81dfb2951b33b123e71264e819bba4d0a8c53a1d99964ad9ffb58b7cb5cfcd3e30b1baf5aa5b3cbd20a0df7ec37563e2b32b4cba91bbf3bb6fd1cbfb2fe0f84d720efdf36e9645c7e9ec70442ea5174528bb +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 32d16f7ae2632b5cec2e90c34d191599acd9a1b5f97845595988c1d0d4ceb9acfafbc4aeee9924ce55e109ec88c57610fddc664316e0f9a5e3ed56ea447111c0383ecdf117ab42351b80e72720a4b1d98d4c73f5235507c5b4f7849d5e9b527d054858c0436ac3d2de2704c4bc25de4cc702f5880d5ae34094766938bee555c8 +A = 133a439cf006c753c132a8559ea13c64f598c5f8bd5043b89d04d7ecbf0ec58b225551c8df8dcb341198fb0b487774867e5b68f9058f58b3cc98168fbed0d0ffa86bf74b4fb0d4235976fa86d52b8dc7e82df176d70892954223cc484ae58b6a60459a9a0803ab856ff9699789172b163615e322e193bd758016f634c83cf50403e416ae241d9b1e44add17c2a663771ac88cf8b9dd94622d80d879ae41f0f4e7a1a32a1ab164f981900fc159aa85d82 +B = -fef33e21c07dc26a47d692c3094205bf4efae6af32f1c0f46ee579c1a22746a3663d66f2919f46f973fe558c61264157d531e66bb9ea10b4b49d9f6ad3ad8762a6ea8169a9cfe01d3dd65518c2e6e58e8c88d1b2f42d207399d7326752560cd45d0ff571309301683770793fe3765c1337d14021d39ea6980934c5fefadb93047ef07c807d0ea5625ae0cefd098988d6eb7af993c062ba313e23176e7abdebcc6e566304a5f9e03da05bc1cc58dfbbc898a67a5941 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 20877c7f53fca97f8e484ba31f23dcf51ac0f4fe4c5121eec576e043c6ec5492725f1b9f9ecfa64195f71909500a69fab2e591377cc2120bd5f60d3fb3812f9e80b2f6c787e0081c1439dbea76b819ab44bf6bffe87dffd771a870e4f5502609249c5260f91175fb217a9eece4166540be877d564049389306e0d6b313706297 +A = -534042b0811c9afca04d20d83898e7653f91a73de1e4b516f3228c6d6d9b963c7f8f4c36e05383da90f4edd072a7eda382c47b84b46b4dfa16f269c2d9ad0fc53ed2ce51cd31e4e32d0c1ee21604d3c7eed2deb35cf8df6fe1c0740a1515e4c702a2074ad6c0fcd403603b4a4e2195d19b265958ae854ccb0b41cf22480389a053f71544cf594f6833f3e4d91fd3d9091df0978d04d3922ed72a4fa3579c5fff50eee812dfb2a334148227a0f5739f8ac6 +B = 6935a3444434b0b03d27545721e253e4281884da027246e46ddefb01fa7cf7a9a030581dfe618431a68ef6d79b03b34f3ed598e7c8ac030e2b4cc887dd31664604fb8afe4e71fbc3135d6d3b4e596044d6b615de7184ebf8dae8fd58506286ae4d3b797aea911eb59ada39dac756d0e9eb6a6c767ab77b9348929a00f8e311f639d19ed88c86eb91f0d4cfddd34e98130eb520fcd2b77507c24b6804d3d65d1b21e6f6d55d1f6e92bba0544829687a096be79eaad7d88 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 24823628d4fe9540103ce5f611f8a6ccf18788120280179a40c2636f30a13e5076503e8a4b6b6ffca21da5b0f9f0d85feb2ce10b51292ed069f35289ebf5130972d720d20dfb8e6ee80c3ac598570d38e57ba33dbd75f1b03eab7847d865c3e8e471ccaf302461a6136dd13b8d31c9f163799a3c24c7284b8826608a9543816d +A = -1d476cc98529efe5b926aba3160b261723b009e9b880bdea04e9b5b03f173040ffafd1627b38be8e00840e85d7acd3abbae2f7a60b305256b920c2b25a8a4373ebbf1a0c69f6e74792cb0d849872500519b6d1c190da30c572e26b44590b7ffdb464a900fc38db013feecf909b43bea549e05f1b7e70d6ad879c613293cf61f0cecdba1a6565eff1bfcdf740bf553ffd5bb7d74f7e9537897184c527b990dea20387bab0dec3e32727786bb14975b23ff09f8 +B = -2b6e12c87ad91a2fa878b9245875209cbfef400e637b557c868ccbd6e94dae65f1ef8caab61f292d739b139e384137a747210c09ee6f3b2ceb6dd212e14525852b8c54215191e116b7097f6729f6426a8bebdff86cdc16effa08d932ab512d7265cc0f57303aa5e6fd2afe0a45180557935c230558d02c3030b38ca88de5fc75c1240d25a22fe32c4e5096aad0078d50989812d7dd0cbb02c736fa563efd32d14109c44297cdb3d4fa3b93a2e15bbb6eb678e93e943979c2 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 2c4bc23d0b4b1f79141be9149ee20cc9f1b58ee0a76d5f4205e0862492c18daa20171285d6ff0b600c358be487e78cb5450d151efcff8d53004eece94c5a37f49a15fb2b5f62a79568382cf0a4232407b139e1ec5a9595bee8435b4f138dd72fdc2946b03817e49864812b7b61f179bdd8389791178a95bb6311df0a5c60db2 +A = 5b0a181f07068af6e1e4b715d92c1b8391949a1e3cf0fe0aa49f3333c826f5582615d39ec28b1367804c1ef54f15fb83b3c578ef3ae957fc89ef22a343175df3ef2fd425f724ec1c3363aa000ef624d64c6d678a4cbd90b41cf7d69a7e03dd60c5d3470dbb75228b34d35469847772ff3d74b1a89a2c492c082d3ddb45ba4df6e3f228de6c64913b79679cbbbc36a2924e722c2c640d0c5a0e90ae86b5364dfbfae80df3d75823aa58ac6c1da78e988a11831bf +B = 19567bbcf615b777b35fa7030db7da18126cd695ca7dda67f5146c97beeb20df24ba0fda4a4f03523a0d9b9f85d9acbdb5793ecf9c1f4ceac81299a1aa34417779175a4bddc0e95ac68309da51e4f115dad6fec33a75d0c5520692a38df64e8d684c9304f9e2e6ac6a66d2e16a03c19a30efcac712aed2b9ee774ea28af4f37c45609464289de3f9be379c733d711875216bc223f2f468a0c9b4a8277bfe49c590ebce2e027102537bddbf2856c3b6e9389c4d1f5390cb0f346 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 36e1e0b44e5afc35d1e19e88e75f030569eb99d326721ced9bd7416ea7367a98305354eeafd204f1f8a652a8442eb0823d2e6644e6320933ac481a3709777381dce8a7c165b23aebf31b2ea2745ce5b352acdf0707234c824da9e1af98bbedf80e940fba00c229539f310838bd625f1fc103f267265ac1243855622c5df72c17 +A = 1dba8bd9d1e6cdc117a5a01b5046353084946fdddf2696f831a942d9db4637a5ee76b84d4ba63156b8cbc72e40559a2fe9b8e2682d8ba1db0cea042bb86f8ed71f6609df52526c42e7494f6114bb62263d36784dd55d396018b8fa47fa49ca6e5c76ebb0b00e6c764e36cb3ec75e3af6a2c14dee01fab78070239638521743d04f184dae79d49a2bf209ddeb4cc72e0c94a93a47c107f5369070ad95ffce034c554fe2a8391e67f817c6cab5b88ae9748072da5c9c +B = -849602ea3b79b33af2bd3ef9d1250c507d332e759d428902dbee054fdbcdcdc0a357a51d00aaafdacd696a15a64cbbdb7e1fdb347be5ddb1f609a4390a6f29f79ccdb51bd1f0547d0d9a2780517f8753a906428fd236f8ee1b433e57f2810d0ad51846304a5729f53a871d8b0e14355d24d3f092e50de4f044e2b8aa14cd8a51fbb2ff36b0b37defa7be768c56fbd4f5169d9d4698fb9072cbb0a037c219552728587d7c35f27456c02020f5f9374b6c53bcf8eeaa14be51899d3 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 77eb3cb5277ced02b72368e41f04a35796c2c6cc1273f109336fdfa745aba7c755b6ff3833e9b124d9c78584f6bfda1c94273522f020371107870c288592b7c23964320729d2308bac8813586e72078119852e1d7706d8e15c195486b8d94358736869b15d59c037ba4dc8032ceaa31eac3a9e3dc51ee17706a6956cff8537b8 +A = -6a0753edddef8b74f762bf802d7fe9b38638923ee2d81bfdda354d40df4422e6ac43724de1715c4088da2e68b63c10c90b236d7dcab39b9a0ecbce57628f4c2950c79cc88a89daa20d7a8679232c8ce5fa30525c56011570107697222e0eaee6871adced52ba01a3aea0ccc9901cb3a09eb4db2f93aba0083180bb41f3f9eaae00fb458381213dad01997e9b88f21b0a79ada1ec3837ac2b63611455fab6839363b796b105c3be6106ff284544bda2a32352bbce6ef8 +B = 542c5fde65111ec8a38d76d8c5735cee17329dc41cfd0f13bf47e6d0e0093a129f3449db380ee9a70ec1e44640839ff18b950c8fd89346cb4701ef753e6ef49dfd9bd27d9987e572bf8e68df399cf945813582fa1d33e07be938a7729efd9a5e7d730bf61c537770a0727f6bb9ea6add5aac9267bf910eac1b7d92ab4184734ef8b1d184c292b2b4295ec1bfd17b8a2a2e4d315a8b37b8ff9bf6a1e94a4772267195c5a7ea6f0a0c267337fb97a023f1b50ad697ea31451192cebcbb +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = 660a1f378a23fc3b47f693a347d90640fef43add9729d74546933f4b78a26968cc9a70ad6fe8d85bf28164881bf7a99e8b96683c6f4fb54162c144f99a27e3feb736f0d382d7e5b934cfa835c723191e5692b7672cf6918c4a7a93b24af00b1beaf1b80320b14cf2d1539e3376779872542406a5df961f765e59f3480e1cd40b +A = -1cd74c052e62ee8156ba5d97f28aada75211979b1c5925ed015ea75f693a04c4dd0a705f6a723ae7b79958884c96fc07f81fca064ce2affc70768923bfbca6049952eea3ae048425b7c6ad1611ed4b8b77f7605629b9d198a77a27f25eff2f82867845cc868edee4ae31afc5d022b2ffbf43c14fa01bef8d7cd9d0e58362a0ff9abbf250e43ea5065512cd707791ea4868e95d8fd2357b3b3aec1a06888ae940751ceab01cf9e49015d42371fac30d48ef5853b6894ca83 +B = -2ac904d3632e25a4d536097d80a157791a6aca6eb10246ea21f4cae07aafe907c6e4c726694e14ce12e376c02d326f4bfc02ed539a5b4615a3cf5c838ffa52124f9b843598a3821cf9f1fe94e7206d6a525fad1ef77e7e77162e8c6d3d860d4f568e8f81153dc47f167860cd52c1ca59b15f1eaac6b9023c8b375bb63b6adf6972af8ca62b39f044378b11c4a969f3939d9fed5cbe18c06749956c7acbf963f640a1e1ceab73fc4c77463ee8d1575d018f49bf0f08161ce4f88aaab5a70 +M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb + +ModMul = cbbeda9c467ca801ec66fce801c6765a20148787dc6becb199a15c58fae8d20c1d391a1d9d57e1c74bb412e1b8f271dc2cc53c3355c83f3e2f00f15eaf0df735160a48e2273fd1bd75533cf94c5175ce67e79fa6c1422996fae36ba288a658a7a5422a59d39dd81ddea50979e933efc02 +A = 7ea551efeccda23622a1a5029e5525f46d5ccb83c28ec9adb7a3e97c2b7d936238c483a4a9bc92fe0e21208d5703611e2795b91fd5019272d255eeb +B = 19bd92c534f56dc4235dfb7efff6d941112d66acf81b079382c86fb10dc5473bb8adebfa53ea3fe6e4df8412e7807aed029694ca786 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = b18a9cd6a0a89578ea773fbfbf642e05935a995a38bbd54480ea3ecea1751370ef95ff5ad0e3203613f0ef6833237d549676a95b720848c5e9897cda82642a2f373951d5746b559bae2d98ac00fae26e5957c61ac1de95318b1b1aa6d5c64a6ceb6575f1b807060f9e2a241e378e6ebd72ade7d2df18d5353db7737caf52f888 +A = 13c68e450e9e091ae45863f6c1faed25906dcd90a43620b1a40e7a506e7a954256bab0225f3678e7ce6c4ba6e3a83c8f04a3491d9bf097adbd98fa6e78 +B = -ddef76382342178fa6636e62887fce6e19590065c766b047073329ea15fbba96f2cf088fa5a989f6ee3f6a513fbf66f621c6ea6ef2fe8 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = b18a9cd6a0a89578ea772021f58ce74cbdd8c44a09b3937b198adbd8e95e8e35541eca26438351bfdcd8600b4f9b71616e1f16cee707c712d40da9a440681f8c8647bc90ba4c68b08ce4cbca458bebd5110222f06b2ca980a2e9419e71064324e8c36289eff9c67f6d5d011e6db8538a54aeff8c20800b0949fa42c38fbabfa1 +A = -6d7e88715e9854b435876fc9bb2d25218a1451efb73ad9cc5f52b2bee929530e6618a858000b3f24fa5f47b5f461c84eca971e38cda6e1f475f6612ec32f +B = 49eb76e4614ac7b0ed3f534811a4ea6da5ea24be925ffeaa38bb228fa117ed56ae976b590d6c9d9a7a8546d8a6ebe4bba771d6587ac44f09 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 44f8596fc06afdb72a6e4f876b70b8d5d734589f41089c510b0da60ade642fd79cf8e705f09910912624fa1f646da596c137f124ec1a327beccba62a44f228f3c0977fda2af631e249b2a4de17d170df07bd812c233a96d17e1e93910267682d24c5c485f99aeeddceb658a7db258a2fdf73eb0266d26b92e +A = -122231b14c249820f0dae625342415f0c6e7f93787b4206b79e9ecaeb09623636730810c7936e17a1eece68edc7c97218efb17c069bc59bdb9681a79c910c4a +B = -3cdaed858523fd55553ef85d018c1097d7b88f6c30060d1e77b84821ca20b5625723c7d4331ccad1a70371eacc7f7aa11220f83f1bf3595650b +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 6de7efcfbc1e8d2cb14cbe4465c4ef71f0d1d7e80a1d80d9ac2d0b161d45fc9d915c54e33131591e8daeaa11ce02404c9b8494added1bd83e344ad4de7c04f626315caa56fcc5ca2ddd4e1ff064a2957afeb5d280477bf1f1195c7294d89049024fe821dceb53c7d270a8b4653e2fc0a4d8a3863a854bc3794753a +A = 47423c4fec1eb6779fd23e3d4070d0a7bf9a946f5610eb469876797a39c58577242daef8c34926f6974089fc595508d9c573d0a275cbeaf37172f10b8c849a493 +B = 18ad789cf09e9ea182eaf43b28b4f2540e533f0fccad325430b73101c00e440bb64b70ce0f2680184aa8caea2f6f6517e9b80285fea8b61887a41e +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = b18a906994d3247bf8a00f20e4b349a500159d086aa863772e71a68f91af9d19e4c021843f8bb6eeed1df708d55047dc8faf219e00d559517632dbd1cbf4bda61651b9644481d052903be1970f04bb4ee8faab9adbbf858324e6cf5aa9384ceba655a1a107210a9497552ba8a56d5e0e70b0c757baa71d1613683707357827f0 +A = 122773509ee608cd9ab3ff6763629a18eae41be64bcfb05122e0b3e112db48c64d2a5a515d96a042850c1c848ae5fd5f0ccc57b273d25bd8d68568cb00bb17b1589c +B = -af398208c01ec9700e332f3e694894c7cc412a73bde8a79e08764ded92f0d58db8056883972c79a0c9e0ce810786cdaa3629baeb9e5c370a5a59d3ba +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 64ef5e7063a1d95226569a27218e35e93d870a19a43fba9889a2ca98ca5c573fa56ebd77f1403b3bcad17c1351803a809c245a97bbe32b45e21768f28c5b11ad542f5e687a17f7811df6c8735e1778e94d9313c19fa32a6703af7ccbd88b489c96632d10eebb580cde3b905f6345a2a2b86a871b4fab36fa4b0dab9a6c1c5096 +A = -7dbdc37a51b601417efdda2516aba15827a40ffc304c523a47c544d5c0bba6c1367a20d8a6268a5c3f723b1b68de57eceabbb00d44185ec4ba7ecdce5d80456f8cfe7e +B = 641cf85fcb5fbacd6214be4b7b06fda1b80f4683c21c1d08311f6e23a15434b42d30a51912898a1c46b46c00aef7ab7663ecba683897825a4b07d2b7dd7 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 370f20360ac844bf4275f78b7fe71ba5db6f0bbabfbac3384c04b256eddaf04725d2d57b31afa48f047aade156c34441b4a41c0b2146790a2e15d13b584021ad55965588c6e55ed3b5cf5c36b780a27c5dfb72678d57528ab17ca2ac696aed3d9abb0ca448d9d5789fe37e632fa9709f3bb924c4ce34244d239a940dcddd9c77 +A = -1a0cc5b07271098a23f01b3c0d47cab8b294794b74a8b162ff3b313fcf85ea81fc99433cdf4450970311e1d5ff81e9ba27eb867073ed250aaa7795e44ba8d4000e879bf31 +B = -308f93984acb78c5dac2426d9bccc2e3ac361143807c7d34c24ef8f8db5e68a904ac8bfed1edf3cc90d21c87ae4d224b8c46fa42eea77797f94aa848160fef +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 4c8f466d1d9829aaca1a22fb6ca5bdba885606b9264933ac2b4c18e3afc0c406aa71ee7ff490fcaa804f457096e44576ff8096fb1d2b3c68450a8bc36d1a2797ab8b621ddc91d75e7d6ba01d86e959171fa428a5bb1f26766f94a553c94f6dcc2e0af90d7776ed3d9fb67e842e88f7d7342afd86e2f5d159db7304ae4d204a3f +A = 57e894e37159cf3c161be9c97a946454e43bf09a7ae8e1437570a86c6b06f84005c1463d27d726afd2e25aebb1657eb78957a9a12c8749049d12007a81d766dbe008aad6d83 +B = 16dba5cf077403ff4af47438f5840f65fa4e058c5cab3cb730154ae0fcc982ea097c6d0e75bbd635e97314f33ec7e31f0e41cf285ecfafaf36382b33d5e83cd55 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 29d13ec304f26247a45ab6869720720fe019d6cf370b9e2df9a65828214aeb4f8b17969b8dd54339d08eb99bbc66720ed78ef79033fdce6da33501fa8588af86ec18be4c4ecfe01781f9d1379865100dbbc020b892e77027d1f04f8171ca51fb73129dd9a96568904eb44e19f56f842b223724a9ffe28826803185e4208f0ff0 +A = 135ebb133a0beb909101da896e3aad7e26ea72b23e60802e54cc6c58a07b1205e2ba1fef6eb86c420f011b70e3f725aaf9fd1873b6e1c1cc7005c7c09e55550414875cfe846357 +B = -e8cbf3feb7be7fd12b01d5bd024e47538f434b496613320ad71f48a8972f687992f97e4b69b5842d2d6a4176a5701327c40325e98b27e4c0f8fee5a457d92181e40 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 4309b728306535bafa6787dd79e58324b3f86eb5409d772018cce2159f75832b87909a672b8b4b14342b352e76ec5a6dd66737cb0a20b81c5ce222133bfddfea878b132b6f9fd557133973a0b44aa41a01d54ab565d6b9c62da67378a4058255047a95923daf5f0f7adff2a3f06074ab1facd986d7d26cb475ee818199a390b6 +A = -7a63e108bc9790ab687e0fb8a1cbe1e9ff876e7b5eccfbc136ba05fed93412dbc2ffb1ec49518e9fb867429cea1d7f82e2b159b75bd40eb8370e8a54bf0e0ac0ff24aa3662774bae +B = 51ee025b2ee8abf9dc5ebf1a4600131c00ae4b6bff966dae5c49ab5b9017e6b1abd6434736df6daabb2bde254022783764c94e66743dc752c9040563df7016a1581fe7 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = b9ddcb9ab858d2229cbfab87d87236e8206cf5e1a042eb5ddde201d56e2695a3d0b2a42bda6a284fbd2a5b2c2b80446ce88c024137780c277ec80bfa6e9d15397cc5bac98e58c9130756ed0fde58d475a033fd94b1fe0ecc6fd91a8b42177abf3f77e87c0847a4244b9fd4980f3b42c7c955836bc994f2babfdf9c5b43315ca +A = -1f971ee9a7c966d1e82166503681afc280fab255665b850645321f67da8934baba1226e9efb59e0ac4483c8724f63556a213f2224b993e4e082eefff0056f7aa8a3cf5b655e0f72ddd6 +B = -39309313b04bda1103ca6f56514026538b4a29ae258a2a66424abe2c652b959f5c1dc4755ea37ebbfe404839505c2807ebe069c9abb9150205fe35bc286ca12b64ac46133 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 47555924c31f040619681d4a12064790e981db2c7853efa17e4d20f741f33c56d80862caf86bfe0730870b6c0afa9caf66e15047e60256fec29469d1760d5e9b77d79a84fcf7a1dcd0168a59f870f1635eb033e0ae0ac17bdb73da803206d48cfc1da48507cb812bea540daa2393321ccb0d88b57abdbf3a3bb765692a2c2ebe +A = 754d78d5608fe8c7ed8e26a174fa27833a24c48d23f0e702454b7eb578cb107da537dda11027dd6b41daad329e036794de562d7623bed8d9b0e909cb3fa38d4d21a95c5f4246e0b030a32 +B = 1839baa8b8fb6575832136f1d4632f72f36cdbbdcbd00f197fff3cdb88b851cbd74910ef6d43cfae9d3248e9c85662d7fb596ae45a460feaf308823f06345bc5fae8823230af +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 9b2f026b11d0674e9ec060fdb24b45fceade3070db4405b363d53df1219a02a664882819fe602f430636fc0bda935b14c55c8a0bbcc9b6683417e3ffe7f5d58fae229122ac6e42e76899254295dc5a08ed43c79120a5e5e4124b8fa6048ee90836bd2de51bbd2c6b9b53212e913cde871f11bf32f91b3a78575a006da36627f0 +A = 11402b3b1a45d67cde9730062e38aafe1d04fb1f8bb1975f25cd9098813efa2727cb229adf9490267bd437220d9ffa05bb993e45d2f889f140faed3ac3c7b53216455a830d6edceb02e8db92 +B = -d8e011f18bde068badedce8106f6602429fbcac4766334a0101b57fe94603203a4a8975fa499d8a68198aefd9e68f28e68914f920eea1083e37c67d59476bca9819a8bd628b89c +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 3a74066e7eebd9b63a1dd28548be60573c95f29816f3b3ceef68a5f6bb797d7eb0b0f4ee612dca794ff82f5d7461d995b9dcc09649e2587639ea017865328bb5deef17b5283691724e8aa331d75c635d5e19ebfd268fe5471714aaca8b48aeb846f241c1675e18d35f029b132f81128f19028b0a471b3f75a530321135e35fbc +A = -6c5dca3fb7b85573d1c8899868940794e428171e207b5f9f89fce4b7159236c0755e2959d870754e902e9c40dc1fddeeff6364f898ec0dd669283e6d26a612d9af3c3ab04468707bb8a7827756 +B = 5446269bbeb613e69286f1012ff62ea767965533624542f3b5c866cfb569d6193aa603061701992cb4873ea8b766606da1b57d7b37cf52f52bf85b58309387200b0ed36164f30d52e +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 2a4e727ac67451ca9dcba648050a085196460e4aa4836c5652de863c3e2a76213e0f590de3aee8639304c54a9dcd5f7d5d3592f647e3d07d322708e1e26329f4a31d66c7f2e9d482f22cd9823074dd57d14040a4f00ac2af9677a2c98d58ee1e094b1a8c40092e77eae454638bc3655e77441d4f218c637f95c147776f5bdac1 +A = -19fa688008a12cae228c6ac4982ecbc88da248d7ec785bf2289dc9103bfa3a91eb1e5fd6afe9e0cc035d3312e9ba64028fa6a229db6d0eaf8af43d8c410be7c689c3e557137ebd60d3fa04edb60cf +B = -3e8c87fba4a41c3a84874c987acee9f560b9f027338b584a775c1fcabb766700f758c4d451077a9427257334a569037b0bd006375f71223add62eca19b1e26b86dde0cc251e48d3b60ef +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 52e4a3f6892b425b935c6f9d1396d2034eb0331cbc5241e1d745a9619fa0cf0fc521585cb9d6b1034c5fbbbbecdc81c757f768c7a82f6ca291cf5afc98500c579f82ccf0be233066730f738c205c3c188f94b878c11268871ba42a5d950dc8a399887997cef2b6b68badec1ca641b88d1455e6d97a2841da49df7eeb766b7be6 +A = 67df01e34a26e8239c8edc7ddfccc3850f39864ed237d4dd67588efbeaaed1f884105508f69e20ff6a5cfae1516f6179ae6fb515a66ef0a7d633ba4218c30875287ecd0cfeb5bafafc492619942f97a +B = 19f5076405b3c81519c0863d0c963d545b2834343e42bb3c779788cbb46d89be3f775b62f4114268a0ca0e6af6c0dd659607d40071dfe7f1ad0df9a5c53b741c04612158de396e9c96f7523 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 8ac1d96abd2cbcaa8f7e3267b716f675aebd23694d24c112d202653979636d4d47e27cc36f850355cfc5ca16b78cd1848944f8759fbf6b03fbb7eb347536a9328a5cbb778a6bcd983081374a3f543b1380add14a9468358009ec2baa7ecdf13e7260968eea74083459406e8889936b2fb98c8b9a3597e5f9ca10b76e1dd0337f +A = 1c9ab23ea37f324544280d176cc02762db7a39935f1ede9695b53a3ee2db49d0485c6a3742a3b5cfb51f3c21711bf89ed05afd0886bbf61cbd57b23439a8a165484ee8e4c0e1c0ca2b6478776aa2897d87 +B = -e30d28dd01655b7a419d939e3e7530258a667420fc759bad585802c63fe5efbb309cb502babdad0afb208aff5ce5830071c5a974604c69ee47f76fd87e2460a5b03a57ef0185881502625886f +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 5df0700adbd880a5730d8c0637a362a9d42c64503c3b9784046b946c2459a619b5bf804a41c92ed6370bba730c7d39fb2e01558f7ec38511b0449d6e9db8df2cece4ed348782ff1582396ca8b3196474e7e5817f8c197c44d771923b6e286e41e7e23c33fcd8765e06793169999544a310f2e080ffe13640b85f21a18fa11928 +A = -5c01fc52e86f3a344180bac284d2376d1bd693f20a46479c77fa57077df62f83b1e81c94e577d1d6733d276f9cf70555b20e3afcb97534e4e0108a6cce87e9292d78b2d7367ff15fb33d2c3289d2a2913b58 +B = 6bbc39283be06382ea91ad6b1630b38f32385ec90019d2ded7ca6fdaa39defbe22585be0df9c0cf613f6f146c71f901adf525336f6573f7f43e661c44b7097f110d4551e8c75449da8fd39201ca0 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 2a01005f1f387c4d8d24a365708e2506b044f86dfc011262d3577f7313a8f51ab943037361bed1858e021f8a46491a5c73284c666eb65cea1392a780219f13d7188721d7d4b975272293a5eef63480f30cc9618aa74bc51f4175246301a46fdbd34a6ec72d5974aa920be5f321a97b8f19c0ec56ba10eaf2e61f2b45f134b304 +A = -108bbd8824e8c16b81dfdd4dfee691e012e578cb9cc80cf050c0ec4cebf71a968732da36552979ffaccce6667e46c29144dab75132cb087681d5549dc5508f3719e129553fdc97f545d7ddb7d3a4fc575ea67c5 +B = -2ad4d4078c47a3c8f5f9b48e10d52d72349ecf0f54abc60bad63bbbf4d8efb185de90e5e1a686859e1c429e30977fca492aedbf084019e9ceb4490aa471776ed2e8a09151b37c5caed9ede66922b7ec +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = a1b1b2d33cb610f1b398e03f274ef39a583d13af14b79e6766859b9ca748237b481a3cfd5d490a073e82e3c53d3ff5cb6219b2b2f71927f27ab6f567547a22dd35fb5919e1ed2b6dfae4d536d6d44fa6216d94d26b33f52db06c4ecb29702588b73ebce87569639f786df4fcf569bb07d5379bf8b83743327248c2d71b5dec6a +A = 5bc53b3895cff2bf7bf10e24fbdc43d17d277a982d5d92f17b9b5a2b9ed8b6104229292ef3997591e2e6a116fca21ad5d061ce438f33b7f7110293770f8313077152c7546cd522ef4054147edbe1878072b1043e6 +B = 1599b541c9809779df3ef40971e7a83f21564bd5d6596d51a3d96defa4dff41e83ca6247969a3dd9a746ab72ce21137f2d7ea015ac6b2ffa8a32997e8b821064d35afde3435b23e47cccafa74d5192535b +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 4fe8897417446c493725521c0ea5b2110f91a1b5ba236cbb6ff3f52b0036a49fc82274ca949ac2b592fa4bcc792114bf2f2a78a2cb44cb22c6fe7e4bee7981604de47f6da2ed1fc6a8eb32cd9b8aaca0f2feec76a2438126ae6f409645d897769a6d340308f82dbc6a98ac059fca6f903c5aecd668fa838b67300c654d4013e3 +A = 1717c6503d069103f10bb4b36427fbdd2371b30793e492e4161fe185b2e27469fef6a25566d6b46f6a7f97446315a22d1f1f662f912b17e71feb2c82411ed7eebb84d4f594deffee14934b75a845d83761f36141ecb7 +B = -8808f540521c20eefaa037fc5da782c891fdfc668b955eaa2e4edb592e027a964b4cfbc94c548d785d92992abe282d90dd137c4d76419926740ce138d567da7350d89f2e56772d8f5bcc9ca8d7076540fab3 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 8b9311808bef497d8a5d14f7d851567a196a051610246964917a1f9d4f4449357d2411ba9fd93983f6edd76b8a8e1501146b08b6e1fcdd97b6a41cf637b6ff0cff7a2d6351aa1ded93f8fc1cedc81879eef751bebfbd1559d5d0320595c79e3eb1db0951d7c67c663bc57a672faed9e14c7da6be6b0c6bcab3d4d515e51a0b5d +A = -511312fce1849c3d177d42088e55d534f9f7096282916e16b041f66ea90e2cccddab5cec0ba8ebf0b047ccce72da349f420cc28ab19bc156c1cccdcf5216f19ea922698127f090e97444751dd58fe7a2c90197a9ab3d35 +B = 6a5cab5e322d5f651f798aebf43a62af772fa2cc379905e72d253c49be8193a07ae6164f21cf08baff906ef800e361e1cdf1604f454483e10c8b2bfdcce77c12b0320dea63f9ac0afbb86115b656d0198aa883f +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 665e16ba6cba87c646637a233ae04805a302ef4a10d79c5b65b146cbab8c9ccd491faa32937d0ee955dff7dd0ea3f79fa43c133021c8680490b91d9c1d8a8102ab709ada7508bd59042940b2bd3a4f8c195f781313e45fa8d3abda1f8e13b35811b638b2ab101d1caaa92188d2b75b2b10d596ab159583135b0d4d15fcd3d882 +A = -1375af024e9974cf8170801f4a709b4e5862ab7d18464077727bfc2581e557cada991e9484a1acf80182458158c44871e67e783f7573f214ee4ea1f1821a65068f2bbbed7575f03a4bba36b0fa8cb6dc58c73b100a6c4a6ce +B = -2d64b6bd987d496a3c121e89f4b0c88b6ebc6e30fa9d47981b52862551f3b7251a3fc376db0f2d6daab6e6fc5ea8fa10b040d0dce334ee91d8cfa6db9648df907b199bb11b2b5c41c67d72b760c404b0451f70fccf +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 49e9709810d9f3fef159e5cb45211453e7a94878dfdece19af839b89c0e43b226d7cfd46859963c7ccc753350e74c2501131474e3b8e0edcda18583b0392ee15f1dedcb7144000fc7fa7eabcbc83d12983d2ade477b4687d75b723c1a98a951d21b2e8ed95735aaec77e00de288d16422fd259c665a08a34331cb99299ac11e2 +A = 4e550ba2fc2a44452f068860ce2a59230738a7a15f5de0aeb4d15bda8c61ee3003568dc5971e48343d402112d7a86860a7f08f5cdc0de21fb1aa064ee5df26fa23839b5ff6adaf64a4a18c07efb3582c2fc9612d2208fe99f8a +B = 16f31365545772f276d8ac952506bf4033a884edf1ce583a63d8d9f6809e29d9cce3b3d227f839e6c09b459951465ab4570d2d36127c0f677fc0a63975801896f2fd17887ca16ff7f265e2e7adab1516ce56ee1ee9de1 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 89ca20a3fa109a65b9449edcc729fe97ed45a9bd69eeb31d4a566ec1787b24cb7a2c25b3f89b36fef1cb3645b17c69ac8ae243cdba35e17f5738b35278478bcc391add0b5ec42db9ec1eeffa63a3ecd2ac0338db57cde9d2eb9ca4bb1df84f1a62245c4e585c4f20f26c98fa1957df34409a99a18bb442ac14f0bd309266a35a +A = 1fd8a096be30e4435ce8cc604ded337a3d9d2fbc9666d1893c38546c4e155315b536d1bc323c1e7be162bb0fcd58440915b053ca0d0896e99265241f2afd46605a2a7486e1394a07b23f3382cd190e943e596c747b6529b04bdb13 +B = -a3960a51af5ecaaa70146ce55d639005e9b6b9b58592441d5876fa71470ade6d1e2cdde17bb80532551bee0dbbb71a0cb24dc8a129c1f6e28920055d87e9c66be27fc4b425737f36add7d72e39bc83aabee5534637e2e22 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 654d9c55d4a62976670a5ecac3a6165734a65f1edcc1ca81a8c444dbc98c3409ac8c4f6fbb92f122045fef8b7971a276c7dc4eaba21f7be7495394053d4f9bb14b63fc02c8a55ad8fa9bb9aa26aca5c47968ea1b7646ec606f53606d5529ded83639984683b8a020e8ded4b2d9f668ceadeaa8160245b36a819db14e58cf2bf1 +A = -67abdbc70db183b8c25b0664805ada269922556bf15aa80a47d31f215e216673b8d59edfa10a74f3f09d066055c3b9abd5434ce95eba91dd51576adcfbc7e2556df95fd6642a3b7e0486a635ed5699eb7fb285589c887c8659a2b7db +B = 6ad3e854ea57aafb8980f1e99ab9cda24f183dbbc513e1fc92d4e239077816843f47927bac28e41d3f31c9ef134b72c09dcf14e2e9677a430d43002ae70c577d9958341243030fe58a800a068d6b01fd377e61844f0d434dfd +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 74bb23f7b0cde7924ee52e58bc0680f151e6898cc1bd4a2eaaa05faf218b419a19ebf85b0219f924a26002f9251b83506684af659e5b680e05138432ba227977f38a479ad9d1f3cf68a86ea214645fc4bd1a032f995307e9c9ee432e816fd852655ef20214e24522c17799ef41d1eebc6e097b9792757f7fc43124c609ef9696 +A = -19d3e6fd6de9092cbea55d65154208a0c93ae409c3ee35569cf774b8c8b7b1c9dfdd52e9f408e14ea3153073ed8d92746474e524a903a45a882fe46af92b033f2c41eacdd7e3c1ff661dcc5349ed6bd1aa845eb1762f27593708aa185c7 +B = -3d466d29e8c0008ee6f402551e3d62fe044787bc9f243db9252ea97da9bb75f5be416def97f13cbb008fee77f2eeda672bccce1f36fbcd26e1f1299619535da0a3fa3ffa0c6fee82a494efd7407cc770cf46ed1b8b143f42790a2 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 197eaeb8221b431d5fed3d701a175abc146a9fedf8060e8e611a54f8da2fb27d2fee4539ddce1f3481e6a64435f09a2d5012540d6069900a332461471b22192fb87b63221c7822d3f2fcc35cc38feb6b3e49b5b0fceb52b0ccbdb4e1fd7b0f3eef3d582a6ae194c249ebc52f215b568712b3e50bb8e01c64b114955ebac2da48 +A = 7bd216d0acd4ee392258a7341cd56bfb0968492fe75da0c9d935713a6ac883525a4a520b5b7940b05e3f5e0c40372cb11b7ca193e93f0d3883fe5840e66346aff0f38829322bbc1f0a0e63ce5e528ba5b13596ad7ca19d20b2a7c9bea4214 +B = 1ed4805e53630b886cd733e5281f6d2699b3c79da615f4056120165cc63858ed2ddfcfd0af0c5fc54662aad90f26c55dcf70a30d04ce05bdf61028730b900587716e690dc0c6e02419622ab8c115078b92315e7c7a5ffe38c4a404a2 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 40f69f2d1660eeb6e1840164817621dc95eb930875333bc3f62a644ca5910c1080505de0d54fc9fb6404a61bb2c03b3981e558abf9e86f2047c3928599b529ef3d91c7ccd13c1d69431fb9ea3f02b001427cf519d9fd8182219ad904f47b3785fa05ed24cb0ceafd537311633a2e26c27e61be92eefb28a49d7f583cb6e072c2 +A = 155fb75044fc54a6ba6c46972e2f97531861b8d6afbc358db456bac33a44bb0545deea2fc83023c08b7be473eb68accf5b65b3c5d6af88bc6d8ce722c80d5d1527e475905226b01ab9d7b5a6557250cf8be935339db330df2dff92f2e88e80da +B = -8c6016966a2cdea4b2d8625aa367e1d079638870f1b61e6b3c3a1e6281ece41018d2ce93684d1f0088d021107fb595390664c11435c6c0a7b93c2c6895217a89c469a37d3250dfa457b928ba6119b5c9ca5f2d47b36e60e4325bcb4383 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 9b9e6e1727326fea099eeb008a36539f3d47e3882b77d6089032b99c6cd36ad79fa75b7c19d1509b3ff022ef781b6a8c16fa6881f9ee2c4e00a4dbc93a49829622f4ce6ba9c55639656102d81167ab8a5e1fcf14d71caa60be732f1fbc71250256520c7c5a4579c3fdafc39356a2bbf2c7ecc526dacc0293c7578424c939ab6e +A = -54cc11ea9806ef27911ba721f19e2ccb111045711d301863792f0cfac798758f0a29111e3a0f84d294a79721067f50858767abf507cc10ec9ea3eb27a91f06e7f6b7b4be7001b548cb7fb734166bad6739935081bdf6d35d58ef56180d377e5fda +B = 7263e8b9a6f5387f44c55af64b64160efe97ec8a8159e723ca8977bc17c861e22041ea227c9c9bb467faaacfe352b03cc620eceecabb6db2db108b49c69752bd0cc61a5e998ac2f404ad052a51286ccbcfaa214ea8ec14cd9a2a6db56c3d9 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = a18a7498ac9194f600cea3d66615595c27a3efa7ea196ba12a80b5f608f85fa72afc366d23f5ca98452dd190b8f86031a9dc097f94a217b29fa676a6042a3aed2355cc8e767d464a8adb888491c8cb82dbec8f117f57c4a07b41e7e6f6cbd7dc25418603b1d1d865dd2140a649c9d52019ef39dbb6809d1b28b3c1ae64fc6813 +A = -1b663403c73e4a9003467ed12766f16354f79073ce89b66066857d19f3b42791eb360004d23e02874254bc6db54662717739eced153944c4776f334576746c5c4145b21a23caa2b2a137498554c7b749efcaf3393c5457b2bb87ee2ca3bef5f191107 +B = -21d12aad97a5c6e639a2ea0a82b1292aebd418567718014465a22b9ac5c8c927963a2a4530c41d5a7a6c14805e56a7092c8716e4767b54a393d8552c5d3c366b39fb3b8667c60e6075e9293bc938e407c53afdd1174843b76aed187f56bb4be5 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 1983576ed73d4d87d8b94cd3f70c149c0273e966176b85fbbbb7b3202e2c843bf1f8f4546ad7a4916ea4c731a22bd337b6177fcd2da8bd301f3af9bdcad800449b57986e7cbcbc7eb313d6512b2894c0cbb6cd753a870860a49d6a682c20b5e883b8c4839b3321aede51bfc42bca163a924191feaf05e196d8dcb7fdd9941a60 +A = 576759af0f02406e8dafa330babe9473d9d970bf371ceab30d2f98f4470f669e042e1708e2677d52cb9f99deb9b53f30727d16c389bb63e71e923475314b615762c7612269b5ad7bcb5108068bb5159cb8dbb8d08de2bd4fa4d9db6cf6e3f5997b9b416 +B = 1a4e34794747cf4aa626e964b839ac497b1357090ff63088f9fd4399312df894e41b395d17b8ca1806baec6115b1476912ca9c4309f00a46d5f7a52c8f640075422af06d6d6d796359132f4955072ce90e61b40c992a155b2bc31c262e753aa7d00 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 3448648ff9f7425937b6faa54551ce14dd15566e5d41b2bdb1a8db62037459235a5b9546d289cc2295b0ed584fab2e1a798bc25a0c114238f61ad3381a5b441cb67f92cbf66007c980db3351adb9cfd2cfc769b5b9b0bd1701425ce1ee8d4b9f438ce1207fa850aaa1d3d1f970aef874c2b2499a150d29c2ceb7bac375009b77 +A = 1fb54cec882c274b98913e76342a9b8e631bf1d381fd8a4f7e0eaef475642ab3f5da70ca2e38741bd0182a959e5e985f1e0e7d737beb8c725c9b5ea22f7ec25b6e564809601e8405a5b1362e7792791f55ab64a57c03a99a8518d7f65feb0e21be619a6a95 +B = -8180d172d3afe00e0423245f47591d5f750f20d2cedd8ba6ab6f9aa24f74498a96c9001a0124c4f98dbd402b63e71eaa3a7af8b0d2fa417fb1d45f64e10030232b9155169153496aa202745a432e547002954eedda7cc9c1ca76811bd902b192f1a1d +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = ae0fd585408a99643271eef575285a6261a4c4a92c1956b1ab436d3cacc8d4cffc07044e57b357ffa43bfa9aaea57824319579c5c3e2fe4dd48bc818178beb5fc1ed60afa08828657d00bb88894c975378b1dfb452a5b88fc3c1d81099644a998a47a497c8a2b12c444fd2a088f47576b7f4fa40f34a208fbc3348ce33e59150 +A = -7dc7dfb753c0bc3ab4d07d5aa78664a7f57d64be4d4780ea81e3efc967fbf1bd1390248bbe259da32108ad96bd8b39f2c9f118bfdc96bd06147f812af831288bb687e4e1742dcd1dbf2b7adc41afa28d07dfb8df8bb2da5359e66330f5c65964096a96b31dd8 +B = 756f3e407a3ae698f103fa37759e90554f38378a9b8eb38581e0970ec8f9c00f8392612c61aca5fd37d1063b78c19e3109f35c0684ce523c634190b3164ef06959cc42e2b77e1bb2fd50eb59c3dccdb6090beb809ecb0ca30457a5c5948328eb218e219d +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = a2aa4550e855623a8ed488bb63db8fa4ac374c1ae953781aac590f78a364fc33380ca2806445fca5bb9ca2fc7ec4db5819dcd5769e3b746286c49a7c80149e7fe276d095929e2cac6ae57e8102f7d4c96261ca44cb6f1601f429528495b6c3169e15f9babc5be696074d45559d5abdac42393094c450d6a4a45bbf60ed7847da +A = -16d0aea9c752b2e6e4e13f7ab1f0a2c1776874967b0dfeeef7e00f8d9edd1e11d2aa702be45fffc284c47811c51dcee184a134b8f6d1874026eb51e2ec80c94837af4602cac3efde556ebfff578fcc56c00de99a43638ab68387ec087ee269ca64233eb5b1762ae +B = -3c6b60b0ce4b13a5d6d9ccd67c76ec6b71b94ea7205e408eea099c7ced2f3a462954741d353d0af850b10ffede8ce0bf80b6893288413674504829793d7ae0cba53b163e3f26cd99beb0a9ad540f6d2cd5097beac604b1694a9a2f4c48b28338f9d6a63e75b +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 8a1a8fcb68c53846b3edae33ec070ef5cdcc1346ab3a98a116344e6d2810e2e3f60f0fe435fe7ff257c7ef4c122b3c34c776f4912a9621b6949308e2cfe2e0827536c7464371ce804bd7cac1d76c5bf8b4a6fd4ed56b65434c3fcf0ac7be543fe2d09ac01c564d7b9b463740dcdfa9068d4d8e33f29297ab452e6ec55c263de +A = 7c4878334ccd9e20cb11a643b206626ea5d0b20973f18535cd8f0fc2f0325a67d3558e4cc9cceed0d88c6d2215c220b8d0ce230fd701502b02081e3f6548e58e02bc2e79e4991f8ef188a84b0a367758b4e534b72cd87de7f82a26de14fafd162a50b359574812cda +B = 117d8b1d2a3e2049e6edbb9494c68a97145ac3e658aeaa05e8ecec4b090d5f467cde34e05fa7f5fbfa32f1d9dad70955f22130c358468eb371555fdf57a40e1df398c166a22a9df2e1f4e18590b00856b4f880f6629f1a4296056dc66a29b6f0f25490c6a8209b +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 2cd3de06953acb87b773b8bb28172b24adb283d6adada676f5f4548990827635c51506c85670767828dc5b4b91b45a7ab89a700d70bdba4e0355da32b52c173305767721d18dd2cb6c55f890611e7abc854277a453c7500efc4cd4fb8e6c9bb7a73fe5c77045e715fd35d415b3496f7463ec902cbdc18f9f6f67c33fd78c3210 +A = 1a20ad042f46330df937b879c72ef00dcf39fb85b59186b8e7a9d40723288677ff6ab2b9bce95f34f2de37887c8a9cdcaf231254bd00c7e25b6042695d7dfc05a11765120d1dbce29dc74f35aa1492ba0c5ee65114d9a246b57dcc2eb2ea4a310be98383fb934121db20 +B = -f8ec67323cff9d53499ceb3afd44b28f0538c39dae8c965ea27d645b430c2f8a4965eadc8ed864f2549eb636ec558419be71f986f4c5783d0dd5253738b876d9034735bd13b18fc670438387f84848308d9357ec2aa4f6a453bdd36ff08d54a6800bb41df416b17d +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 1aebe2bc35eb2e449bda63513b1bfb55988cc8e6ec8b3c8fed5ce4dcf53b95f1b438c41e3b2348412b35e1f734edba30273935b03d16efaede429960442a01849c352349e23b4af88de4d01e9ddb53ae900418d49a84b7fadd2669261a574557c4fbd782f8e8f400895f6a6c9679b72983ce01bcfdb641f5067c94694e9eb80 +A = -5f97994c39265b5389526e3847876a10aa3699e3c3762a127d1a9f892180cce68ca6139a6f71b235da26c287bd3e1aaa1436746d983c23c3105c33ed2e06baa1e880f1744d81a80b98ee1f16220940d721a92118a9b949d4da7d1477db8f5b357b3ceb7df34eb5f62078cf +B = 4bb4f8f4f4c8e63238e8774ed61a7eeafb3fe9a6e19cffa648defe82f4846e3378c892d223957564fcce79596151658a726031a6921cdca0adf0f5325d858c048a6b94312ebfd19b803eefcb93bbfaaddef120ec3b8c366b6d978524d5c74218da77e4c3b5ebbc66cf8 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 5d64678a32c163874d1c81824d628a1051bce3b55c37055acc47a8630d3fee648df5d319e50b4c56f465bbf696433409b89c07e442425d3018a059ec757d77b3a40d516ca3148010036b003721ec9c999665915a3c442d95ec3c01c232feb201be08c88fa3c6b0769e3da30f1d73b66f98e31f4306bf4e23de78e74743b224ab +A = -178d81e419f0473c426e24428caf25d61b648bbf963f7fb753ae15e5ea3706b53b00bfc8fe917ac9fd6c7096518584566ff71e6d35197f9aa25107a235678cf9ff8ae1501c1d5a15d2a27d39d066e169745e1e8c808209bcede0d732423d0c9cfbea322ba3201ebefc5315c0d +B = -27ed464895b65d9518923fde5caaac0c72aad0d1b38fcb7827d6ad4e0c8dc09e119b8b98183f0ef8d5d1133f3f108e951caee035bed0d48bbeee6d1ddbff5864bc192b84eb8a500cefd223972ed51c7f720d1736646825f95f2f10ce6ad47a267bdd8c80f65d644df158d7 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 52dfb6bcbbc5cff46942d76ba45301cbff76e9b894703a6a7fd1af29d615336372d147c3932589affe5c6533f28d3e6a57ce2d3cd7448bbd81e09a13266ea31630cf044f654b87ec3fa3294eb65873964110fd42d86e78d128bead5f117cac98145051552cc3a86c193d738b973f866d068a8994a49df3fc7c7314fbd9805e80 +A = 797c67ebdc083f3c8b3ddf9847b7f3c2a39e35ce2119f746ec87fd5d86671d8fcf2b4f6d440c43e93f45019032e629879799eb58adea729d43d2e40ede6485143bd35979609a12faae7e4393879c40c0511c886c66a24454e4f9912bea944eaa417c9942f09ddfb227feb14e4b4 +B = 1a599d1cd0ab3614f50b71b93c999942bd3d4cbfe7900122d5083151c71d9e0c299bd927095c5c3291418424a7c12947389bd4e0a3c2fdf67b3f512094ec0ce5b52695e527de2b3804dca2edaeb1ea4b487911053272ea926cf2fb3386dc4b1dc268b808bbcf4eaedd21168ca +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 99bb9082e4537426c61f3b813f8c97675c44ba9ca418960ca6e2464cf61ad4eabb01ba00798463567ed3d829d3f14201c740f19fca623b1e9b57b534a65df0f070a2130489afae89b91003cee432fab11426c4d13b7721e6f9db1bbaf0adc0064b33e4b9f4b795511a0744b52f93e3db7bc9c0a991e4e122c463ff344fe14cba +A = 187a8144a0045a92dcad94f0bae7285309ec8fac7dc864b08914e5a4dc3b1a6bb9212161a18c22682ace16a4bf3c03dbaef088b09844902a3255fd6adc0b7c6397dda86d6ab67204d8061c36ca20fd4bb348202037b249f6c110c31580148db46dc5b1bfffa38a683a27054c35326b +B = -e93ff16817b725016279a32dac247961ae9bb00af890fb49c4fd8cf5e815cf98b58cfa1e3735095e6034c9a2f2b5d8030ab30e2271abb45b347d755cd9ab5ab5ce37950380cb306bbec42b6b8056793a0955bcaeb23e2d6a9548684030566eca2d34c458f224c8e337cb8e3c252 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 631f53d02c031f592b3dfaeed106160488c08e0672083ff195b22a2c0b006f11165a245acad6f35dfb15a871a9a2b45c544111f71f86c920b42fdb6551e56c55199e6173c00e27c9f47256349a80236bcfd3acd1730f823031ff9ef594725cb9429ea183a7fb2e03124ebdd98d435313e43819d995c4fe81fdd4ba718aeade94 +A = -72e20f1aa2b5f2c4218fb9e11ced3f45a218f4c83a2017d97d0cfbbf227c9082cd43f939c8909e52c8795cfaa75d80392d3649dd85ddc35bf1cc54ba389bed9e9dcf867da1c05eda080274beb6b868b54fc85e12ae127dcbfffeb043f9d59333d0ab3374c24971e1bc7269450b418c8b +B = 61cb021a3a957703d14061c21d3b0fc19598e19a17df9d6f2418c76d4d37b3f62bd4037aeeb1eda37f83df44c440f5e49924cc72ec5b153856c6b621350ec89d98859d9d1ec7ac4f0c418c6599674322e7d618c5ca588d5a873d5af356d4771c6cd375f5dbbbc69f50b982b8c4d1ec +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 4654a62d9491f28599a976288cd2068d8e3228da12f645413a92f482efc66d1737495cd4a4c733f147eb5414a2ef6266a116ce264491a3463c9df1b030d83b315f76f3bef8cbccb5c538478a65092547b91e991e6be91ce4549c3a6e34aa7b466e63eb3b88054f6714083695c616a078ed54e1ae46e00f3593af845fcd0ff51a +A = -1a342c154aad619e567fd32e7053aef8d98335a4fa0e35bf06acd7998c43d821de1076dc1fb67dfa1156d7ff30203ec736384a9aa7f5f08cfb302eb3a2a7179b2664094c2cc0df73fa05bf2af24a62b8e394fc76014dd83b434df26f8a67a624884a0b9b4f08f33e9828ae64f5d0c8cdc2b +B = -2c57e15889c3dc9c94361c17585d506933a72fa954ce44dda9f5e33408552ebf49cae87bd0be35197f887fc6c7deca1452a4345eb67d19bd2e7d3dcf651667a8900388e4d5ec71e9433e3b01d2b3d91bb94d0fc3c51c70793f978e4b5ef93a9c6356c0b2f7accb9e4eb457a2174b50dc6 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 6124d9ce4de2880ae3811836235d6d89a1a4b710f1d5a517153ed7729dfb5b56b0ac10a4bbc811db9b26465f03cda355701f9f28c5257fe288743cc0789cc54a8661f46e36eec357580b00a84f1d4c8e3d689bbc18242f1cac30a87cb7a47ea06f80d7c5633cde4c8cd8a1a7e27acdc3a2aacd608cce9e2efe7864d41a56ceb8 +A = 7b48a9663d914e0225d7275e965d866ee6649d7267474d5336d28d54027ffe8572f4aa26230dc7abe9957d211e6c2c8f3185cae962b878cfdfaaf6cfe32058c299247f372ae170a1f7cf71380787f6e90995da9ca5a4be8ab1ddfa8e6e5dc65b6f168b9b8e29e0257e0eec853a6e1911b1afa +B = 1fc4dc77f4a18d4406a4ba536e500aff68d133c6e7725717ae6537b527c6f40f93202a2292522fe7d04e0ef804d1a7013b04cd3d88462fba31534770b56d2e5672e8a6ec7a723186024c40b4717defd1433b9967bd692ef81d5d4e39ba10a3223d250ab6e71d5d253dd0a732ed386ad57e54 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 6443de73e1c826c90aa36fd7ec5d0c3324c42058b1c35d3adeda1685470d363732d23cceb08c3f973034c24fe65506bd33dc45d7d617a53048dcc103d3d1b4fd0534586c2fb7489ff5ffb98303bb068fc14b1bb6bb43f763dca2c891095e613bb7b6920163aa6cbce8cd93d9d39f4512b6e0b28d361ae11cf76037eab4cbc819 +A = 13f739846ed2c3aa0a1923168cbb46f4f0a2f3942ba57bfa5c426cb4d4b3d80d9530405a31bda329a1814c560d54defa3e03fc4f808606a598607783d539dbb1338d5bc0c2e272a7ff6ee6f93e1665d6f5a0ade30308fa047db086646c763106cb875e014e2c18ff8837e4d4d86861b85a5b7197 +B = -ba019333046f76325fa9f258006a7c10d27e89f6d482b95c79296c07a65b8e3bff4a9c9fa7e5d0038da129390ac851f8c0651dcf655a3d4164a731cd20a701895c12a906c732906038a8e459aaeb293fda21346964a6d53fa3e370ebf43c7ec8f66229405095c6a509d0fa15dcf45de8d0e901 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = d3a6fdf4a26993edd175de9a0f012e1eb15a5a1c4dd2741dfc6d0f9177cd5645508b8ab09c7fb34066ba893c38144c7f2ecadfc2b0d15728b407e5db4fcbbaf1871580426400433f14dceac43d28f03376e791b7ad01a112981f29ff4b66102305f0ecc4fd134c2cdc79a5e9d9f085bfcb7e6c187980e68b6c7639c12e8d200 +A = -464cb16fdd395e32fdc613c63ab4768f8cf72a5b74a0a5b0cc581ee4aad1972cd97db7966d3124e30c9a1c80d85c46da2d36eecd7c3bba5866f9eab4d0fa55b2d440a311654466432c681372a80a7896c9163c12314ac51f652aad68fd9012dc63fae6c7673c5da8faafcfa1b4ed5550f2baede5cc +B = 40389ba4d2f5fc152308c9e8a8c36258c770fb2d03e6189b96c4f8dee97ccbe426cc14595c8482e9e22486b61fc570f0e7aeddad2f4e3a480d4b75d14294a3b912928da5692043bd98ab88ece87a9bbd973ec82f990c0ae6091245318c2810187d69c38fa80e835300ed06c0723fe475f3fb22de6 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 8a0f9eff3a210912828fd7b5f2d72479cc9ccdcfd3e8d21739e301de02dd5c257c7ce4bee2def06c9d0c90d5a86bc45fa9f31e456d353775916b3d5684759e4500f99ca1f91f6767a5e2f4b735ae4b756d56c358a06447fa2c2ccf0ce667be4ed143e9e1dc627a561d92ae53a62477270a7944482cbf671138bd2a85fce92b08 +A = -1da555639228fc6ead68049d836d60a4927ee77472fa0ffd3c787d55b6067012560f5b1c2ef8bbf6119345dc6419444c675c1c9cd50602a93ba3718a5b3e1a30bc108d796998b24474cdad19bc2960b295fee97e03f2ca7589a3daf35bd28eb37a67b5d2cb35a30998d5f8622bd7e6b7d3fddd1ae9670 +B = -291fea1ae6dd1c66c62ae3a3d22904f4b4adb2a48cb795d50074095345d661a033f67b20c5d7231236dab871892deaa9458c235c342bc81457cca3f014a75f5124ff4da005dcc1108e75527528e5cc9c051a97fc6cd202bb9166f9e72e366bdd77c965a70592e5684fcaaf2e03421a2025ca190fe158 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 50f4d25875150bab63e4162265a632109d6b4743f9d6b55306858034732a4895ffb3720286acceff287c38320ee9945dcd0a1bbe5ae1456b7f36337cb7d22b679a6821a450765471257d52b6ab7d59a763e75e9e64581a93aa54761f6a760866d6baf186cdf4ad2b1a6af26a3e76cdc261d1f07b0a7122c8ffdef595812e7208 +A = 78a1609a7f08c93c9bf9090ca7c93459aef815719b5dde5f217567a9f68ceca05594f6ab17a4666ce1c0c4434e0f4f38ca1f33e501d6958a10da47211cc011da219d4373d2bec4b7c6477b1ab3b00b6c45279212db39bcc11d1e7ba49916c4271adca7eea531adad509ae119348f374ef1203c5af8bc019 +B = 152b46095d3f8db5e6e1a9e3f35c085da00e52764b261c3aa775ecfcd38572d2e86bab2f4bf29c2de4fd2fb6f35f66e8685714634e1be980773526bdbf9c43b1335c5d59f4dffe1a1fe2495ff9b7a3fae3e53e7c3208968e1ad1dd1dc8cf2e2415cc76dfe5df9e2e1eb63f7c7687d539706502d56247728 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 5a3ad8d6f1b0763b77f5d40169ff0013de638b459e401f50f4cfb505565c8a4465e28ca1bf988071701dbf52ac456e01e170788ebd2b7cccb50dbfe1a65a89a8aee18b3c11986c9d6e6571f964f376f322e10a1ddd9310bbb40f14b0680385c40975aba43153970237c535c6b0e2cbf6bec918a8fa26cb2f69e98d77215c23a6 +A = 1d5c14b0b51cf31e9d97b7c49cd26097d40454978663f8a74095fcbf9c63e533708befb1a467f94cf599a41220ce13493a273fc30c49275412c5205db712d5e1832b39e65c150c3a4b251e2aab853e4ecb4f00ee5ce6982ef9215775a33565bde3ddbd932665aae506941d3ee31b3f9e4ffc0651f1fb4a5c6d +B = -93cae5dd84584a2a3d88028d6d4cec4146cc5e350b4d92c52ba2393ab69fc1dba96e244f98e2f93f31230904169641aff30dfbdd3dc5fb1f3489d63aae1efd29335345a79ded546e42f2ee4a70ed932699fad17a771ba65fe6e689664bdd1135219aaa905c962d39531eba3e82c3425c24041e17858cbbcf2 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 61211c706730a1b98c628b3c8cb070a42e2ccf9fc6302bb1c2960fb165087f210e9d93416ad9fa21634a05dd0723cc23b8d2a846ab7c3bc402999138433725e737102094db5792249b4b5b1514a416b80c804ecfb04653c5ab18b0a34d8777f6c2955ac66fef62c9ec2819f0e3c075920f951f86b32e02bc43239d9218580067 +A = -46c8c68f492d8f7ac7834f89bc76098146432c59b3301d4eb70d9861a6e24c7c9073f910108c7b35538a79de10640291b54e5755359baf47482b97af56475211573576e9412ee017dcf961a090a6ffb5cd995992ab68e3fe60b6186f7595bd9b8acf8695c4f7359cb2ac709f032fb993d16a74822b4935536453 +B = 46953f424d988fd20700ea08880e7e09ac22d60cfc294bd4aefe637408a3cacfcd0ea6822a679b68b665d6bebed3506d25edc83cc7154b83e22953f9d91157cebd219cd5177fede28c63a15710d0f92bd9e542a7586855bbe57a94c520408fc920b3f8d65b194af2b2a580c90db1cdb27ec26ba929de4573c6eb +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 50a063fff02f2cdc68edccc23976f4b3db99641073c85709626292b9475b9a988fb8509a6223f0a517dbae0cf7cd39dcf1e8ae75196d9f5008c661d8b5153cbdb9520c71068e4719820bffda4c393032edabacf99339e0cbafddb6042ef887b8c498e87e16b62417934015172e63e7457242b864a47aa10e203f47320f03c0e5 +A = -1740e8be7b4775725516d37ba643fc64203f3a61e6b0164d112af56666ad97afb0059c2c4981fa81d72264f8669db4e50e11865907655b1f669c88f5935cacf1b12c1db63cc84507af12cf0210f990994055d04d93f148f213e3d4fdcfe9dc42117c059897697914e3e3fa8fdbf0eebbbb9c3b9fdaa7efa0c9d5c93 +B = -226308f8fbb35b5f9d129c0f6a2bd3e5c272a408bf32020905acc6d02d7e506191e76a3a2ac47cf7a63e6306b256f489ca5cdf76c7c3eede175ee4a7acedf922955e92599647b69d463cc14f2b178b88cd471b8a1c1512caa66b6d5fd8840b98b8d070e6593136e98cce9643e006b714388768920a79944be36624f +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 747cba0d1cde75dfcc0b2af9072c5027986b3e3917845870c73c452858ba21d6d1615eb71ae1b5a03ca44e22845d5432b368541b52a4bb02498668e8b99dfa2eb90ec1948d90564e6ebc388ee9816e329e1d8da0d3e2b12d901d47e22e8a1fabc37408be0f89e7a4ab0f30a03f7e2ed817006809e69c21104d0efe548165f64c +A = 5fa76e37aaf0eb3d34d4f4c590e02b6c63fc62b1d4c9e172cb0dd82409df87ecb43a1680a2764f62d13a5e919db2db08feaf98d5cb92a859dd42bca1047ff57b8fe5974fb3ac11ba2c0d8e2203750f30650db4b2cbd31d07fe18c4df84a0dfdb30f9e528932c097e89d8f8be6ff029dd970a7d2c2551529455b9131e7 +B = 111199f91b3749f8cecfe90e9b9b6951472cb701beb39d63068c064cbb2a1e1d30736026f781836a52ad0d828be6c20303c6c0bd03ad664dbf6044a5bfb67fc20a049fd37c62ab0795d836487b883768ef7c8f427eb98e5ab6621fece77b4955822f8efd190c417ced398c221215b50e9532a869eceeb605fa1c936554 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 646cdb3ed472a7b4599f02329054846a8da173000eee7533240ade4dba82ee3d7a6a92baa3783c19dbd3f76fce6b5bdd83f1f229b1c71a6faa18602e368f1b0b9f8c62bd8c854844af85c2081924c9a153e27853b2a48147950fb614028e090e2198e613631c95e565c2b9b64a43237fd4052089f9d1dd2c00525dd35fa946ca +A = 1c8438247c0ca376f508ccef7933724df512f9e0877596f7f4ea73dcd824809bbc472749833b537eec01ab23656e9758da22ab8a4aaca1aab3fe8d2cffa6672ca0c44ac029c2ca6c3e71780c28c31b5f154c8dee782f6ba009a69d83b1a3a03a2d6275bb8bc3932a1170470fb7e405ae081f4770b535edf49f73a12ba589 +B = -e365c8edbca8dcc4cc11986a5a901e4ed0adbe89b0ab70a53aaf5821862432a1320cf1850b515177b630e12692cb025e3aa43e9acee0d8ad5e48bb15e9a3f34cbfd39d285127b52dde58751f572ae68ad98692899ab12d35e33652c4426ec60c5029e51f7e32ec3d2031032aa7b6b2b63f84fb0023c81d031773f3652cd6 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 7a3e22f4a3f7ae7512ed73a07abb5ce291bc90bad507a5ccc0c17185804b9d231b0ae2e72bf270dbd60170f34b240f716529a449abea0b3d98ea2890a4ce3d9e2214819aefd070e00201e9f271de925c4ba59651e55174c97a13a30197e46997c6c2b152548111aa98df120a617c54b71f8eb8b0c8b4dbd5251f5509fdb8a1a8 +A = -78a99d206b4f095847e9a21de273aa6c47034c9afd4c081a8e93c2d75f4ae5b090921ff5108c863785c413e2f7b4a361506fb66b7561b8b1c5cd537e90274bddaa4e91ce74ad81c6dfbfe1a34a631dbe455d74ed9d041a9183da3bc469bdb214d2ffe893f89c3ae30f8ab99c3aac4d2fe864b891fbf4f537745fddcc60504e +B = 5c41274e9590c1ea44c113ce505931758f2cef80ba3b10440941ec9aa2ac984b29868bece2922eaa225555dde84a8334f1caede99091165151a39538e5b7390e81df757f521236314239c213e9b874e396a022f04629c09bfaf929a0e9fe0b0c7386b0541446f6a2570491067f64e662d8611c4fd6d1c78a9f3ae69f34d14fc +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 7fd27b6549494c9bc860146a3e8ceee785ca03faa94b0ce0a964844e7871e813414cf3f111da49fed1ede5e71e5539f34173d41f9a17ed129016bb9b04c86487f5def9fe350fd4dffc67b6e181e3cb26378ea15ff9b9ebdf1fc86c072c82ecd8bcdc241301daf1b774af5f90f37e45e6126c5da7dd3753a1e5b366038af6ae31 +A = -1930548d105661dc25a5ee303b61b559c4bc1f2e28b2c40cf3e25f98dfe01a7dcca0f3dead6463b55a5b2e0440a651cc9e08e125535e081c742bb3b2f8955ae897909cfca683a4822896d8a4a7073c29a80571445c6a0d53d2efe4a30a79d2fb5d08c0f95b735a1cab17ba40d71b054c9270ba6bc870e58591fb1bf9dc9b7ee8f +B = -3e2a4c1509494f94406e3843c9446edaf0a6060144637234c6d9ce84d70fac54ed163d77d210bf557bbea0404922c8aebec67a0475a3c7b74bfa2f226403ce987c705c712bb8eb0934c2b390a173c3836378fe71a6939e48d187b27cc7236ac115309fbeabd9ffd0396fb7fcd6d46a1dc683606c757ddc3212f5d2ff3f2e450fc7 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 2078bb5c82a394c30a287aedcfdc5271eb3246be05954181ae4f86ad2880ce674640ecd55c2ee3f4e89e2762139586516a28558481303e3071cc9ccb9a538f887553bf5726f3849fc41ab027fb1c680ce7dee3982587ec71b3760e5da6956d6894ad8c4526d8de953c0e681ecd44883a21f0abef1544fe601743efd3e5eadb8e +A = 40b4ba1e977825b7accb941fe0c0a49936a8a47429dfff53502fc0680d705b9fa0efe003eea3ff0b649998fdbae8d0831bea7f34159aa4c7add6bc7cd56fea97d25fb9a6a10f4572c26d792b76c18ada19b0ba06b6142c420dbb40d66be669b7c51d8cd2a5022fe1a8aef7b60965c0176eee69c32ca5023782c5410adc1b15dbdc7 +B = 1bb2f18d7c8d306bf80ae1901115c8dc3d286baf537b812ce06d6872b61e5bd44f3c53d7f31ca8461b3628b255f85338cc325856fda5a6248b7c476532c1bcdf9713dff9932a50e52a9441aff96092d3fb0fd76046a8d88288d0cd55741083a1bdb20fc6e9c20e82490273354bd826bfe001322dde9a15763f2c0e6ffd2cf60019aea +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = ef21dcee9eadceaeab13287d6e3c9741811f6ea9d5bd111799ae05260b1de2ffbc192818fa45dd7befc3baf6840e3b9d24cecbcb2cb1c3d653c4aec6531b941d926fb6692f548cf81526acd0b6b0289d70dd11ba50ca8de6e174f502eddf47e57440142c7f74f594a9abcb48ce1873df057b132ccce8b364de3edf411089d28 +A = 19d0109e0c47ad45f57b8bb8519265a4390534d2ea07f969d84ad33556518b6234d40d1631be3c3cce6d59b7be14750aed114008458f50a6a84ff75b4ee7e4b826ddcb2d2293842ed29e4e484260a92199c5c66367c402bdff0f1a8057127c6ffe452498bb352802e0005e6cb084663bcfa82783a3d72f3a2a341b8075983892e86756 +B = -81fce71491eda139ed996f6a289dde8635a3a257ad6756e844c768e66746011fd797658184fb44b0e3f3c5600c56238ac7687b5be42529d5c9b97c3ce10f3219e1e451bb2dfbbb44cae0828ef894eff3b52b8dba4c115c3b471984441045f2c2db426cf5f86949d5bb7662cd40bb3b3172a19ca3fb6858315d688f13c17550e700cd5dc +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 8a5f90344071790373044193cc4fd92116248aacf05ce639b6aac4461ec3ccb0805ff9876ef44fa71088c295db14fc820f7ae2c0aeeffca055f8f7238c6c90db706d02f2cc43b4960abe3ca4b6dec8bba55327b958e75c60c5d1f43fcf9136f12481c267481a725eecc403a16aa6221346df680560ff316a63ec8b51dc37aad6 +A = -7a54e7ca04b9a22e2b986e72e634317ffa20f6f4ee90353d559db3f3c1bc6b3b92ac6b364f6c5929090373962b49b59cb5d87554387761164982955470cb45dd00c4a8982dbaae3a1ffe700e8903a4a8e4a21eff9d00fa496d475e0e1a205be267499dacecd31551f8a9d437f37dacfdf5a2754f0876a3e02509b78674e7ea2169c43f29 +B = 652001f073d63ddd526abc957bbb48ca74154c8f9698b988178b3313dcde9acbb19ea11a935184fcbcc31e0117d8d2ec695ac56b5a71614a12cf90f21c8882187428755b6a5f11c314ac8b952ced0f65db0987f0f87e20b82a811599f4160e65c7418af7f33604e7b8952b70581e3e02dafa025cecda970d04383ee552abc620dfb9c5df9a +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 67f903e0e5623258826b681506f3e94cc0b086e262bafaa1395294aefc9f6b6323410a44427010d5e8d8288993973ad9939199b85cf02ae0a09dfb69801536a3fa6af5ac373add7efd25ba5fee6d8f040e97056f9f6fbb45795c0bac94c51ffeaf496710b00bc9ddd8e445261d976168771060c9bd9d83838a84ee9428f59d6f +A = -19c695ee3a4ada840a7e3626e61047c5081867b15843ee9a6506ce45540d23ad25ff23b72f988bf26ab8b98363d9a2997773604f43fa732f59a4b16ddf3a45acdbc7976a1fce01b3dd55559c20acfbb7501730f794bc45fc09b1f035d60413bbcf32a83fd3c41599049a674f165ac5283c42aef213d777ae47eea960f7727f5758146efe5bf +B = -210697d47beb73f45207340a183a729a1e78d84bdde1c7d8f80bc84559c4aa4572ab0e6927ea175acc7a268d05616201cb235e610d1012500c8ba9351a37bd68b4ec42227bea55cef5ba7d12ffb180873ab9d33d09e6e969df99fca728dc12dda6903169acbad38388fa9b001edb09056a2ee2aecfab0468822bca14a4bcdd3a4122290ec5ce1 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 5fbaff0ffcfb2330283fe59611ef51cf045bc2690e31f2ad3265046fedaa990b5d5060b3c38f17bbe8b2696e527fd77ead8650d329c2e0c1f3b2f5bec4dd85641022f3e0ae6f66ce98cde1a785bb52eca796ae45c33142e8264621ab447cafe988de926544e1a7036710128c42fe8b574f7ad69d830894237d95a55d1bc7f5ec +A = 482db04e35f9fc1d87b42bc5efe25a049ed924f816e1b0f9c8ebe34bc771e67e26d6057563fd5d5320681e1207c0b0f4b7df547cd6d5be6a2e0f2bfb088f990b0303d0ef263cf45681e0e9a1147c29f2ca5251faa633ca53f6e0b109ba69bbe20c58a76a22789243d1acf128dcc936602e832a20a2bfbfedf963bc1027650f483814d7f5e6905 +B = 105aaf563d4c1d436c6a4552770a527776f40bbb844b7701313c5ada95180160e7cd4b7175ddb943e5a22c910585dfc184b52935f06b12c84b6431395f28af2eb9ccfa66b2ee8f40fd44d753c6a83d67a6f3fe3658fecc7fb2f4a8f357c5d244422e48a33d0e2971059695a59d0d39b235d5194e919facbae7623ffc92d771532b6b0cf771912c24 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = a9d204c1a497f350fa1300cbaf682c947eaeba8b3aa0450c1db9120852a2edd2a0249dedef3b3746298ee42834d869e9f765ce987a2aa4712a1f35ed10d0f7ba9cdef938b073c3a526e5bf45f3510c94ff1fb84bc77b08e2aa50f5cc75e2f4da37a8a711f8aed5e92f7e486877229cb4ff2a4d0755029972323c0b51a14fd1e5 +A = 13fd3d7cc9d6d6821d2f2b1c40c8e070bfa85b994ee8f3e0baab544dc71328a1a57b7ee57392ab6d24bd85f9ea0f2a312148fc4f4b22c589e9a265d97e73c7a5b420bee180409ec179c438a67abf37eba61ac76197f3c9ea5edf2d4b8aab91e9bb1a432ef1f214c043664a51ceed1f2854880dd458ca253f09d6f6acafafec310774a672d07147b1 +B = -8c90ecd56d6c7cb129d1c9c26e94cf919c5747450542cab52281d11d8fbfcf9ea797b29588340d146cc40e77dce007b68c0c24356d4b75513b75eccbef6e22a5b88417cb6c516578d17d871e7d0957c09795f9a0f19b811db75d61c27e1827fa2773846857fec020f98444e307d3e52af501114b962ea705cb0cdf815109054abd00810dcc270d7bd3 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 57aef35a3f5388c810f576dbc30d4e4e5a39248b319b7766311157179d8bc1d7ef019cdd8c2c0175a8424abe7b33565afc0128724fa38f0900140b6f96bda2e78d7c803124cec8c2f2d6649afde4030c76cd33394fb386342d1ce97a4ecd180872134fd4e22667a687915bb4fda21f7e0bc9100ed8cd3a6668ed3a235d7b15a8 +A = -673bb11795d9d20a1e4ce8ae71d041705990463964505befce5949f895fa31c92d53f91fbc110df4e789b3f3f01f184c55df92927b8b680cc92864466ce5590ed2e98901cfb78b32ea79bf68b57a14cddb53209e08a7f430fee23f4a1475fd2640a515f8b609e98c760b4301747ecb61f1e6209b07455f1c8a7bb4e20c269e17937f39c6a2fb7b2990 +B = 46beea6005cf96a2acb16f37e357bc8975f4dad502fc3aefb4666344dde456c0ee7ea43ec493b6aecbc7aecc7d4cd107aa09e874ff564f5d59d7e12047b048c1da1faea36a7e2d02d0567bc4db41b54a75110626d13597db698fffd577a5810286ea8bf50625296ee8070419345fa269a354ca2eb47fa3108387f6a4b2c0ea3e779908a14469106eefc14 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 5cdb7c451b2950c9d87638857407276959142958b06241b2010a9f93625f9106f065798f79ce5c534b9e5a31fbcbfc63cd200fc1cf10217096aa0194acb9043ccf7ced30d9f0bf66e0dfe27ee2ecc40bcd8de66fe2ed6f8cb0d874ff7b5fe71951412731fe4e19c34bee64c9312577b9e7b2ac08ed15aea753a6cd3e286192ec +A = -1eee9d5d3854db52f9b43698e05d6a0f1d1f8df5f32884a775b25110309c46ec5c7e112eb64b2d7f948868bb9670068779b0a78bfc7e17860ee02692ec6790222b4384b9bd7db5abf29c46261c10d95f503b821a4694c45553e0dbaaa977892b916cb8990ac9ec29ab5c3d63ed77138fa1e95f395b3b233d039ab5daecb0296203166e9386d1071c61cb1 +B = -34587c2bf3473a2c5d7f3399d5ba2bb09be8105a0b9f3d8737d67b03d8b91b1c869f4e223d6246abd36d99d84052ae5894e58288a614a0da8d69f1aa57428632c2b059ba99315ea2f68ee210e65a741e94125ee4a723a7828bcc410aa2dae06ea8ed6cd23f66ccca7e85d2e071055787f230ee405e50d1519377cfe0cab4e5f97b6cb893b01134813a7c2c6c +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 95d0b209654de56bd7d6f74afaabed2cbb3247f449d80511d2d3c689f84c9b79587d78abdf0eb37f1b89f1f8dc8a83f7f9fac2c8cda1fd3fd64e16f5597b7f0a1df6da6db9e828ce7be0e876012bd52f5a74ca73ff8ca4611dd9f342bf77b485305ac28a1f8ac7538169f2bf3e4ff4dc5fdb9dedb97fa743fd8ac8791b8e288a +A = 7821d4b65d529c30b8747e184e450cefb11b5ac5dc77905e6fcd3df64336661c82ea68d588ba616d23df485ff0658fb3376d5276027a40b392f47219edc5ecbf510cf0c5b431b02c65e5f432092f941d32ac5f71ce3496e403c7637f63a23b91e3326d01d2d32e99e0ab265108dc5e7919d3983839b3c7541848dbcd420a594e850e587f1846951852ed76d +B = 1adf5c428f2a95c27a943637758d5dcd7ca36592fcb9d52ac0b7d27adddad5804e3edef257aa51c716801ad0c731e13c5dd000f11b5ff1b69c198f236695c1b2f99c0afffb5d084f80fdc534de3b0df4597404b50c7e784c3c55dfc9753c414d145eb0ca4d07e2f65b63f3eef8d391250a5500ef64d9bf963d7250d6906694e7670f92e3d5a7930f0f85964a21a +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 46914b197b84fa99addeaf55dd803182083a7ae34d6d4d3a55d6272af40a600563cc8d9f6b48110d0521b8b99751235bd5a340b1743497ef1cc459dccf5d6da970c4c3103c978ad2d513298f1fb3e68b24a9c7b0795f47d8f7f6ca9caaab9a9d80f15982599d764f8738217f9158517806fded5f3552fef8b7dcd2e725ee04d5 +A = 1c9f5f2a0d72806dcca92dac1450a50cba05b5dd571c2b3b988d33528d90ecc83444e3ea8df80802c30fbd5a6ec2ad9969be73aba6dd27e0dd2c842b95371d7547768916c0cb036964d041284cd323c8073095b2a8cb8797add5cd80f03595de9d18af8df7dee0d250ea7048faa47ae0131ba3f350d82864dc95e5829b88eeaf2681433dd4d58b2c6f70426af3 +B = -aa1e1b3cfd5ca0facc75e46d872584d55144620f849ab05931210b4e1526f12679bbd9cf00efdbd8863970e2abe8fc9fa7bbd21afa9e364e3c9e32f51fe66844fea4bab7f3b1bd278fd803f6bdbd0d296321e67751a0b894da338ab431871adf1514269ba05e0cea5558cd5691920fbc18237914f3dbe4b253f774e5dc1dc57023c080a3b90a004b809d237658ca1 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = ada55d93c533716ebd8c16e23603071950aa714deb942ebbf77206753d2676a7aaf61673c03a4db69d67faf6273828594d85e3c8cbf38460fa2af603fe9c1b6ce104854e7281757b26589f079da80685aec153fc5fd1a223004cdf30247f8398b8e92899857dd199d5d5c32412bedbf9d55f20e52895fc1dbd04c84cabfe1264 +A = -7d22392a8da1966e6cc5ef50d7409c614f8c8f8e5791778f68a00b4a056d0002707933043d05e48347bbd4d0dc1b6ca32a1aa4bab9992e7e620263283eb68d97af13b90a29c1b7dce39ec0b8a63878e8d65aebfb3bff4e67129e3b3725f999f1ec9ae92007911f2cdf738499661c5b6c9bf27712d0f29e871b17318e95c3d14b2e472cf9e466bea91fb71a493b2d +B = 40279eefe59f954aa8c51c9c214fa07707b1d095f697ca40edb820401a45c472d1d7bb413eeddb64c14ce6144b4863fe9337ae4ae8698db92facacd6a56f3b33129c5b608eafa29e9d92dea620113051b926b80b75f320d7ca3d2ab597168c68774e68c47670458f5ef2ffd4604f20bffcc7817eb09c9057fd9989a6786a7e067ebe6724a89e7d1580f94ee4ed502cd4 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 4dcae9def5467526b0ff071003e56f5537852cc0bde9d86eaed2c15e36e6429c68c061e12d321bad12e29626b5013c28f118ee59624ae2f35d2c53bfd89e6afdb6db79f0321ad5c55cab03e6a1a97ff7bd58c760d0e9fd7507de987ed2f94f9c79569fe7f03652cd53c67ebc6bd3c9e6c5672891a9d2ee11b300ed3b19753c0f +A = -127f5ca6924851faa2340c4c8f425b1dcf41b313c5c2910e5eff8ef2faaeaa43305de2b3a65a75fe54c00fb30c0ce3e8007db1ea222521190ff1de6d0cf2e777ed61ce8211dc167bf115a77890d0bd1ca786e967a04f077c89939ce484bbb1c560f669aacf7756a4338d97cbd7f09a376d2dfd4d632bb451f52c03c05762f050ebbf112f8dc5acdd9b631292fd7073b +B = -3bc5e9c352c46449a9155b7ce5478c771293599cd2dda58a962010f1f21d094aa6bee03f9311545e8dc6213f6aa73c08b55bcdf4d1d84fecb9eda35c83eae5fedee75b2d15a003f8a82b2b788ea19f7460fdd8f447d973c950b3b250a3022c19ff312ccdc86b6ab50c4ba627b15968c8a66d306bbdae8e88fe28c1853fdfb3fde92353f46b5bc448ae42306a4c91202f03d +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 62a812e35f46e04b3afa7d26c8fd4eb168b6b64cdc839ebd0a46bf2a3a712af8e97380cdf0bfa8a274f7b73e887bb4cc73c6104a176d425aaf5352f14ee51ba549a6926bd8d059b8e3826b174385d4635b0c36df75a4e7da44c34e51eb82322b34ae00e8c712eb75b3882822bce5a2f2f5fd74355319ebe1973284c690bed2af +A = 71c57b08127a956f0c17fd3c639bd1923ba19bfdb83c0cb9dd78e62b8fe4b7e0019cd0a6b73a334c622118f96fd6d91c1e06d4dcef8a3d0d6bf8f5beb6389226c50d14d3947ce9f24f7e0e6a7befad2e4e92dc9ed8fbb9811d908c03ac074b2a5c67b67831a350c4d548ac70810bb5617d261a045e53cdc48117b9fe86d35950d0a181b73c8cfd35edd31af031178523b +B = 1cda2a51a707f8c4d2cbff6337c3f63519705614c26a489b545b1faf366b705af1d953701b568a684856fd3186c035f878788f7e5dbea16b5e7b6e767cf611452a4272abf2a9c5e72b7251a1ebea5098c60cc5bf649cb70980b97d48580967ffe2913309b6b78cc12d91025ae403928851902dcdaaa60f5b323a1302a5ce114cbe174e3eb3c2fb5eafc44076396c23d53b028d +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = a9213cd809d41b6bbfc2123bb84860788ce22d5b91f8e24fb616efc286a218ae9652b42912a58bf8ce596a1b48e4c72f27e52c36be1940f7d2138eb895ee36bbb917a59f73e0b6c3266bf4759ffe2ffaee3f6179492658e0778bb43c4df4bfa1a46300c9da496033142ae2c1e33333fd7e82c5a14686b255e224c51aecc2a590 +A = 1cf4e2d5924510a5fd06ff4eeb94a740e430613277149993004b8de1a2b96ada54b05365f305e896df5fdffd3d7bcb54f9a9dba9689e5ad498012f7a684d083c31d7017aaaee720bbd42382e526a35d2add21d9369f7faa41dbcfe3dae426948a402635771a977e19d5c353ec7c1abd279975f2effc0b7bc19990154b723f2f8c29e606581ab9d3966702f68d8bb8065e9d8 +B = -cdab60f9b8e1add4c54427b638ec5f76b30654d3649b500f833b2943bf6cd5d8647549657a8ff999eaffe413ed87e06267b97bfc1b77637b57f29039235548a7569fe6d4bb16ae9c6cfd38c0b8c73aa60797d0d69b03d5a98314f7f7ee25df8b896ecdfc782cf8057f038b6c3e79c99df52f839fd4eff302ddd1256e51eb31cee24585782a0439da3db2eee79a58f889d8847fe2 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 4dde3d63aeeee47441a7e733bcccbd4f2e495ca3c746468e9855177f7672d5d82e51da8e268ac24e8971d802e25d842a16a6b8d76b8e46a7724108c02d38a4830453408ca5ced7093676a1db4bf4c94b9b7a9531ab7c26f8de520bafe4431a55a5f5d8c7576427a0f5bf2081b998b82da2e8e959f2ec4d5141b55e40bf6ddeef +A = -5770ea0a75ff451fc2c86d428f2569884b2c88cb6d9d407cc22b191849d389f57a5765b83adcea21c350b37bc6d750d4859f547da22ea8a3698a5cb6154b946331ae2ca18e7eaace951dcd49405bf8d8a716f7762eb242b8bf5e4c53a662c906c3be89e53ddf7a706ee2406c7d0ac17b54ff259c1bd5a092325938832763ac4caf0232e80a016cd1994441808d8db7e546de3f +B = 7e4246ad4af268695a51912053ab6628969af4fcaf7f1e97dd977984a1604e8c9fe6b920f39a764c27d89f75986a4bbc122f92ccd1860f24677cf346474fd9441f572f769daf834e6a00cbc027e15d6aa7ec2030becad41e1068740cde82abed768de7e2cfd325848f6063e2186faa76982b9ca73ef22434a28bd2e3a5ac477af50f258140bff938d3fa02fb904a8ee0ef3c1f6fed7 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 3d8bde8d0625fc46dec46fc657c49c8ab12a988cec4ec1c24e6f4d8ff94514c8d8fee4a08399c6bd23fb6464a38bb5f249591456c283325e343cc289c85df0ff2c1707a6e407ff7a24383b66ab603b75e2dc3835ffe9274eafea148f20764b8ca30cbe483c1cefd51f82dfb93d7793b3ec19a57f2ba03d884f345bcc3188fe28 +A = -1680dd51d8be6069c86ae157922d55df3b58ee6f53738677bcf7332d6e7ef304ecc7ff7c5a5e1f525459d77202f3e815c68f17f9a6bf358654a92f9f9acb252ed8e9e6a849da7491f26d0e33900541ab67ce966d042607258b4382b8108729a703b429babc34496528f198a7e0f814db80fad4900fbccdfb64908febf5e09805d3a3049c0f164f0bcdaaa9bbb06df8f05309be83c +B = -2c6c6b3c89f6e1d1cdd9abd1a9706e4f642a25738aebbc97cbd60e1f4ad79b419dd54bd14f2bd147b1d8e9bfcf92faccee61a43dbd1a2c084bf06a2ca476b3d169fa2c99794fc827b7f4dd010c0534e7cdd03d00456033ae0203b78a7ed229afcec2d1cb96892eb18898bf53584dde56b4316b3bc5186d97e3a9edcd059d7fe14561eefe4881beb8519c1cb7c3ba22cd2e13d874aab77e +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 5b4fbf0445807c8feec7efa3c2bf8dd86b1070638f3c87f1e173ee980412a28847b263a266506e70381aae919ae05d306d3a67a6c1e72c8ccf1c27d6296526e87f0f436c98fd1391f83440b58fadd4fb1905a484bfe8f516661e7176a268660387fe6a7266ef02e5fad91ffa69247bb11cfc1b5c3a88c76b7923a26f8a31ece4 +A = 65fe4d55bfcbba2bbfbdae831aef3dc8c8746e1d04cea174c1d336974d81d026f562225b4a297b1c3b044ccc5dc9c830a805a399bf26c0369b52ab0dd2c0ad19e723fcf9f5de2990ebe5a1266653195a2aefd9a392fd3da8c22c523a362f195babbbf5329018e3b454221b3e77cd0dee79f612f86332b1d104aeae7d8d84ad06b107715bb76bce20220d1340ecfc666b2bfce812814 +B = 12f775dbabf1c112523feab443f6e95d773e8220d66fd87bb7fc702588136a048e17ab6845a9c784dca275cfa445d007e8d8383740b156df7048650f89c5ef1a84148488fc405898f9e326cb8052f626c8881abeb70f3a0f52dd83e3ae0cb82d178cbfe8c393449caa2a87e7c8e2901a87e276b49b6d012f3cbb65641add3694fed3e3177777e78fe375f3a3b378091bb8d2998286562faef +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 4f0af7cb0c4e82d0e6589b24b55528818bf2164d41f58505a2b302a8f677df146f8077945dad3790c323e19b37e3379eb95de8abdadfbe4417f8bf8da643768a622ad4898513fdbc72d3b1d2791ec9ff40634678faf0e17d6e0851f08c39405907db85b74937ac403a9a3a1004013c7bd95a585728010689fcaf63b2031bc8c0 +A = 156dcadeca94985ea8bc0d1378daf1e85ecc4c7f8b6d6c7a5cb9f9ac368a97c07e381004023bc575691c082b5e9e13a02fe813a55e76196e4ad4b0f9b1e089bb71a0d5c94254b66e3e645fea25d69bbc5af266e730482a60105306d664f0ddecbd76d54e7235979aa2d806b809b3468078b5d90aa22cbd2c441198d4a52f6259972cf3d02003dc39dafdf3581638e56d08c5181d36e9e4 +B = -9a54586072d093939ad86df11fcd3337ad7e9e478dcbefb2b89d7555883fe8565abcd5b0a9c88ab135ce5327b2a326db645bc7c0e3ce24f902544675ff9d946abf30302f123aeed0f4e28edc72758ffa760277caaf4817a3ae8615784c81896d2404e2cf47c06b09085cd0ad1ec46cfc1f04d0272eac29e774b30f19939d08c036b185983c93ba15d1d27aebe4a357b9f6a298acca3940d2730 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 7c3ac09486a6fb518b98a9bc8a8b382bf2293e2c1154470ff7961212430fe2dd28697e49256b1ad8add082ee27b6ecc016b120e971665be801b720069d30c0a8c6ea4795613017e8883e5c0d0e68f982c328379d7a0afb7825c553e087b33e9d78f90e0b95a6597076b8ec2c1d375e2143bb778c318ca0680a64072cf9a4fc08 +A = -71d8e7ef13d63b4f417c01ec1241020a8ff4c9b2db531500984fd3e45d22b2bd581894c8a248ed7cc345e70a5698407df8f0e4ac71ed2c0d42122a4f92279346f463aed899253206786928a0eb7c37f2e51e1cde7f97cf9288d85c3ed7f49e62af0bf9abf062d2c6544d83b9d3438b3881e0d07b1fa0f2a4446fd43ab3b4f81fa2cdaff199c87965e298943c68cc15f2f3f3225efad68b73 +B = 64d52de221f102af62ab1e9526935b005c81658f8fefa019bc58e641023fa785798ed0dff8f7f999dbcc2ecfa47d5314ac6676c82170d6f2b18122c17c1e1ec1b9b54e333a184a46ad35b2150c8165f0de19a24b98327715e5a641c1b6d3ff9d247c89c8749e775e6fcf5f967c6eb5e73523d4f1ec12db7321b14398f26201a364e1371f0ac922781ee252c6d2b3c657ef259ab73cb7992a370598 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = cd08b388ffd41d0aa29a3dbde74106c57b18d325be8f446a2d9ae95fa4144037dbd41eccd50fa34096984cb11bce555c117c5568d76a8f79d308ce11043fe2413d37d6aa60c366af6c1da93d525e4b2d79fc82c0a53ed62fbf72c919db8a3ae11f5ff8057d7501f5f6dfc9ae461c308d21919d0de9e31b759d1d8e3526fee58 +A = -12e58708c30c93383cfe6e99ee3c5caf1900a7e610605706e77d8f428fd59db2884f5021d7a382cb18b75ed22528961cf43be1c700c581ceac3877e83eabd860583e6e94f3f2989c179ee5047c82b53d37054c9cb7ae08be60a91b10d49510e9f0b90ddf89f93790c3e18cccad5a9d223c605a6c567550e2b4950e184fd97dd68bf30681d3f9c585365de2cadf36a43f5a5305dae555396dd50 +B = -26ea5079ba7ed137a14d00d413d6f818e911cc183c88764de4d91d7a9b4cc7af3fad703142dc7905992eb8bf489f6d8231bdb25603ddf3c31fda8bd9bc4d78835f9ddc1e6445037f05125cb1ccd92eea2e927297e5eb915d5d965a25e5d58feb8d79a890e6036c80ee91e7469d9eb672d7a8db68905d06f5981fc40bf486575a067d35cf14ceee3ccb79b72871bf8f52b92e4910ab17e5e59ab3ae6f9 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 34714506322dccb91308c403c267f1ec75f80faf3cc4272dff4a84c13eb1e6133af6681387006c61e7e087046b64e7ae74eea8a3c0564a7c1f381e1c940d92b2c766fffdaa7318d07dbeb877943a73b50517b49e5117778b8a60212284fb92f29a9f5304f8f537e88acf8afaf01fdf64773f988cfa9551d6884baa70587ab76a +A = 638b7c549ed14256956bad532945ef9e11a50313172965386635a2fc7db79deb0cb5c157e9854117c17f1509d505d01a0e138d2e510dfcca45b4f7ec968b5214a6699b61b8ac68adf64d5394f50d577a154c013612090e2045462160d1f552592197d7da78e03491ae284dc9faf643805f2674af8652bae93ff230fc3eaa833dc62781e5f74d0f0b90290d51d481b0a94ae6e972197c6e84ad7ae +B = 141f62297ee88ad527fd1e0e09d9ab5dd80e17b32f34a674a27b00d719839701664ccca1b00da2613396cf633b0bdc4482ad3a0c3e209eaea7c22f33706ae44155f527c9ca4e341e651760d1c39f65d5e99e649d013730d2502b6b65adb8a73e6bc734b7d879b430798dcd53fa6c0badd57896cb566d9f1e0a7b3a9161e9808e762ca819330ce9319dbe7f49bd663a9f57ac53d65c6851dc7bc4ee66e08f +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 7adf54c77eaea2a1743bc5011ace45b7651846e77f90402297f117d8b1c0377f93f49e92a2457f3d3debec3022a96c74c166d01b2279553ef518ec0e612bd7b382529184640c55b89255b2679da9cf370913351592de39f804f1724de36db90c045fa644e8ff20627f67d6afd4546f00d7af093f668629f9a06c07fab5654ac8 +A = 19c491d5b55aa25f2e18cfb7fda18ed4b020e3f63244eb9f6c4dfa86eb8a70875cc898e305a7acdd3eee081300edb3e4c837940bbc1927f5ed9f651e46581639e133515457464e9c451390828e5e7e00a688daaea74620363706cb69e02717489ba9ad05774c424c18e295278caf4df4ced80b4cbd20cd631df43f2e16ec0334564d9dc03dfbc7111e4252504fb449d5a25cb13630b7c0c565a82ea9 +B = -c3f765349639beb80f888d9c8b7b335ab46b55064ce2a88180c80ad280c6b7314df52b7e73095dfd82896e24604854a48121353aa1de663eff07882771803010005905896357cd5a56a59f0db0045f1aa2c0b5626e132c169abc64b9893f95932f54c1d8cc25f215a9ef6e4cfdd6dba85f6faefeca81793b2258ae1d1427e81e458482aab87f6563abf435be69a05b195d1eda90146a8cc92748ca6f798b10 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 32ba5fc81a7747c3d812cf036bc0edc49f08824d53b91a65a6d41edfb1651d99c11ccb4c074d7f04e652276ae3fdc8d6eedb72c6e46cbb1f7f4070dc9d179ce3e21a3826f7dd2c27943a8d26b192d7f5c4aee9ba0647e406133e3e89c262d37cf468aa3ab8c5dd1b8900dd06cd600abc6d372d9408497d9e20c86a9a6a4ad9d1 +A = -73958019a5a52357b9c1d954c9b14f51ddaced32a4d7b7c95730697cf90029564118ea168d23a54381f7bbd6718a6b662e4c87410e48ac53b7767148582b0bd6a3d35f488e7fcf2b128e0a58b5d468dedabde4d624f4a82e808dd7b175af0d3658c6df1ac0da6495bc9a8dc012f8de55c2003da9b2d478e1a089fab776d99026684026968fc309dae46a6ef2412039a8207c3084f96b4e38e4fa01d131 +B = 4330fdf00bc6d13ffc267073b68aea7419ebef257d63f8f244accb9ee46edd04fe5481292de69d377ba6b6304804ba7ec0a063b42339e6e37867261b9945ec705d3a0029c6f499420e02a773476546993b3c5e1efc2417f51afcec7145a9c2625496865c11636e285d4c8b053ffe66887333c51a712fe9c8ea57606103fd689dc88f1fe37dbc33ae4e92067c5bf51b53e2f8205164c800e5abd677c73949b00ef +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 69b850a99b471003a56931f7856da357a2254ac50ed81dfae019c9b722b95af16047a0d5422cf7ab66ccd898e85caf0e03e74cc8a5a413661e5da483b3f0363e63a7031bb30626c8f73d6e99e290071094b7fe5bbaf4d303192e59acb5e53fc7cdee78576b51595d9f7a25ccf3c7f8889de68b9deec167778ca27ac9d4c71c3e +A = -1976b3bbbf92acbfddbc05b5d9e7b62a7666b239c1e6270db7ec6dc2929bad1024e745b897840853d14cd815aabb01aed580e1cc66ce37f9d1cc4c9bef8ddd35d28285faa29f2003d2a4623ead7d73302ea9f380f16b3fc06b7c2b8bb4ce4c8b03bfb6056a61c620e4decc6048cdda5e2d3ed8a13b779b8829e2bbab91e9f6b0304b1c08bf8fd85e0f3cd7ee72255e5342e077ababdbb545d7f809bdf8145 +B = -2cab554f7a5d21c499a1025f61e6c81ab0fc68a874bf60470cfac57425a451365be62c380ddd31f6e202f29769e2b6106868da7c81522e03fa6f0704522a5f8bfadbd007bac65595e149f6c585d7fc022db016bab32819049e7547bf85d4232a7fe19084907c528e7eb0434f2e5a375ad9b7d463821bef2f6a721a635252576c176ba42519bfa5d97d0e47facb4426aea0d755507dac81ccf1537b1003ddbb0727f6 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 2ce33adf34f2249f8a2d2e073976cb4c78b71414e027657fcefd56fceb022a06c1969dfafd519eb9e2542662c7647102f5c528734dd005fca666be57b46234123bc3db286cfce07bcbb399eb6764daf2b9aafbc2898a5ff43ddfae849c7549289640edc4ab7c4b9fcf5e159623e5497f509ad6f0270a41fd864c9437302ce380 +A = 509f5d5b160e923b4fdd72f4d522a713d780daa4bfd10ddbd62b26497a2e7925c495afc2abf0ecfcb7980e588f96c4078bde51c7b2c19d86d15bbdad5de72fec2e0a284dd693ce0902b40e54af87ac5a5df38ae6d1d882ea6299fbe6910121ebfebd06b454ec5f855bf3e7cd544a4b0d9a764428662e824e2a6185723534f5e6ad829734347d240c48c2c0f8bd6be6ae8a495a9e383fbc7402a4096b8c2c214 +B = 1a3b7f55307031609afc974857a6cc75821e73a1a9535bd6b8e141437c3fd4a6871c904e22c5d9289df7525ac69a0341d3620bcfc5f04b38ae540e26beadbce0002a8a8bfd0f6a270007e4c52aec2fab11fb2a831b9886997256e4b7e7ad3b0ec64c0f31fb0d637869143712291f5073a5756466d7c82c31e08e09683478229bccdedc2cabb7e426af9025185d8dd5124e08afa4e981236180e0a390004adb7918de6ba +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = a81fcf9a18ce476a839c896cc5d9b639fb1d74610e2f618c25310147b57cd77806c2aab90be7be4ed10f0122baf9b862b141ee8e4be5e0c23ea776267f14c31e50b119bdd33f2b41f6a4c43d35bf6f095864593e0d8c0f1fd4656d8371af844d197308bbff14e5a28b7181eb6e6a2b31ead7361e287f3b4550ab0484bf7baaac +A = 19f1ce60ca50bfdf8e02313f1c9a45496720a2ce467f1e8bdedbb32525d762878b61476989c7f6ae8dd29c983ea596e521bd4cbf74dba4d505dd9ea5df423474fa9725d5b65f1575d26ead95725e2a59a6c8a5397ebd6b54123e42bca44781b84c014b8e5d2c1a86cf34d764b242baaad5be285cec72ba8ace808058a0226c04f95eb2b53a828d0ac41e6b40e5a4c4092788d9f7e988752f175f075d545f421205 +B = -b115a1101d97664759538d22154de4b000c008e551e2ab10ad05f12274b10a4cbfee762d232df5188fa1161f37ba61d146e8b95fa715d98e016da8beb0600de65216cecf8b8816f6e7e73e2a2bfa7d0bac74b517b906bbc43357fca69de9cb5507bd95205515b97b3a4d6842f3d7b09606cce1c7436c462f49dd05e915d04ab6fe2748ccaf025bd5d19749cc468d228ba43452ccc479c146ac6d781717bb9966bf3835dec +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 1473f092540ae30de595666beb33e430cbec42d7a28d4f7982e62f58025cdb617cfc33f1e5ab93d2ebefd7345561b81271bdc50bfbb0db6381dc0ea023ff7c72605da26dc7da2b5664d2ad7967426ca97b3745f82528964bb68e70087e14dcf2d71d30fa0d1f7b3f10b19b357e7053fdf22bccc5188c6919eff1e5c402b750a4 +A = -68f280cecc512d51ae534f30aa198cf7b170c346c1159fa9cf158d0127d43e50a8d4704ec54b8b4295dd7f51c6771cb5767fe0c975414cbe6d2bb58ae66a095e8832d5f443498b1ade1f5bf249da58595ebd878677b34e3b4c99ba6124e2b71d86a8d99727a16746469de51b0a61d9d981459a6cebe206cd36a09f00ffce7f532e2c31999847ba000b9e01a4b84f454544b6362a5c093b9abe9d583716f4534f2de4 +B = 5b79684387f18d7de6eec3a63d737490dc2a46c0616ec16388dca2be60adcda11ae13063ede3fec177171a51dbef430f8c4b3f6d297b9d6c020fc44e3ffab891d0d751d033fda813861bc067c181118dc613335ce89c5960f952e5fd28bc72c41b7b6e374ec29b837f1e00271cab646c794579d315260921dbc3b984b86d98b8f8816aca4f16de50657e4102f34d9e29ec3a03e0da06e70f69952339bf2ec4a7e74daca82239 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 5e4b3f4aea7115d592bde9bf7c6594fee77372ffb19f7745b4de878a4024f81e8290c77d2915424df20004a7abb64c214104a3123e7c8f230c159ccb99bd937521b433dcfb065b186a685fc40f9166bad9380a02e297ffd6a307ce8d2c8f2f1330447a9c06c327b74f3cfc2e98f3351a8b385bae855941228969d1c29e9da3e4 +A = -11c1d396693139df5bd91825c119d1241c3f57b7ce95b46472dd82081738cdeb0868d18eb7c8ee7808016b3311f982adebd5a2e5f4e201ec4a34f3037d260fe580e771222de5a1a67947a4552cc03c5c59f9e60e25063a702ad3c3aa43f061a22567f938a91f1dd697c3e3978fa11ab1d65030bf327f8049bda745658bdd4ba8f3e34b060c6a2c6c5a8be54c7cb5f6b106f54a37d2be9f674f7747744d4350b3acdf373 +B = -25a65b6acda692ba3330d70dbc3ea4dfe208c0df358c50b7872245a909c5ac19ec568b1a1340e1a094f5b8e7d1e3b7e04bb4df002558aefd4540135d62d75bd5ce959128c1300b9d98429d7369610866d98b22c345e531f2beb80b042b6ad48da077043401a82e223e9e529e7407bfa466dd2680973006d047d837c26a60cabc36a7ef538f603ba19f8e923f168ebfc3834df8f77a559c9e0342e33df245f551bb242e5a66e5904 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 47872b544fa0425981ae17bb450ea346135e6ed7a9de0572ae14a6e85e8319f27cfab778cdd8cb5f93b417d9c66ae0fb7bcc6652620f7f3f74acc2bc9f2c090129fa8315aeec9ca7adc5356484474ee803883ba4695d7bc47c87eec508d16a15150cf3f757c4713de71366e958d6af045b2d282b6ce96976692c80b1e0b6f846 +A = 7e8f55c040862f12d8cc6e506608eeca65ce38e9e8ab18ef7007e3cf0f1c9a0696795bd10f8e1e1f55bb4f4f3a35c2e0ad18289e250571ccc26a961f730346efb1e29fb143ed97cf72deaab19834fa2e98e9c12ae4cd23b9c5ecef4a04c439f7d42e110b30caedc4334372ca24cfe4171ef1430528f7b57bbc823fd606fbd30915c5817e6c57c967c4c404a0847b1455da17effeebbec3f9357358e00001239aae209228f +B = 1cc00b95f6bd3abfa697400c98110725a7e109aa9b8cbbe9ae16327c4fc8e5bc93afc7a94da32e98e85e4fd5eb545192c73007d97a4e84ba64fe187ef61d17f0941e165c9fe64c7b8054e24dad30f92b50d1f526b4bb031e6b1b9058be24884b170a145212273c51692b71bc57ee53176d8702b975bb6ba96284b462da2ce38e12d86b342c7f4d3cd489fbce88a309c7df1121d7bbbaab6814cd1e54953e5cc46813ead98f02360372 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 5d193b085e57c3f1e825cf3b36c8bdc936c603136bb782a244b04a79fa713dc7b08436b85ca3b483d2e100a012d6430679b30c8e4101c8f08ca0f9010dc0f27fb37be842054dfdd99362e03a7f55ae58db7b47f694bd35d91a58975ae1f255c41617e773f91c2640f768bc702a213f073682dc761e056b34c57edd85585fe04 +A = 1bb1c759ea94b61a1721ef5680f42af30fa31444b27591a03b7c9bf5b90845ab965339f463a78bddedcd62fa21197c32d6850c61bae195f86e1c7a23e7a20dc618c59ce3a1c6ea6306c0b01b11a36d0fadf8214c36a133d689438021ce7c78b20c85256ec607360cce14f139513d9f3ea6eab067b1ffd0935d7c43419b93ecfadf2c5a902b7c39a69bdc023173bdad574adc77706c1a666d66f69578a5bffdc7cd6eee28ad8a +B = -e8072c49cea603d48f20276df188fd2fb28f8721d578220cef7db1e56379c04a6b372e56a047cbe59ea84ad026adc5d0aa930011db63bf4959f15781e060e0240dfac0e2a2c26be12a21e5650d12140bb49a2a8e0f6a86e4b1eb79d9b8aab3202bfd339096529170cfe3e0c18263128686bd9305e92a3c43e1523f97d8a6a2707773e3d441da162a79089c9ea1e094cd5a23474121188013c8c287965a5e77599f6a7d64174b06cc165e +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = aa79c899c2b9518857c9e4f96523a44607c3f6a97d1f40d6474ec79deb2feadd955fe92d789df4d362c828084559fab56b5e33a971abc5449208d31671c7e220c5945886e33ed1d804c059a8e439a92524a785076f9730732bc5a152aeffb5b9ecf3a7e4b55983016355c4c29827496fd4d7e6532c270cb9ef263573e4c63074 +A = -41b326c2b86e7ac14a2050bff67bb5bf9697f02594789c4a2b3e8455df4522546278d0620f28a680f6a88ab545de5829305485422f4e70a5ebf0ad15508dfe3f16ac556436d8fe8a8cde83ead549d88e0bb24dee52ebbb49159ae71589d918d3fac8011cfc3afad613ea09173856b7b79b55a2e43e0f7cd21eb9122d5f6a1fc5408414f5aafcff863b870c67b740256d317a0c58af9a81d8025a086a1f3d79f7408d4bfa06b9dc +B = 4730f03c389f9bdd92fd864177e06140c9dcc02d01fe7d37b51d44de140696f116d11bb67adf7db797edeb7c304386a7f5e37bfac46a5462a6d4c49b1bc034c2e0dfa56f14bbd2a4bfaf86bbad4f6d0dfa13c782fe680847d4b43373d7137f5c2ebe4ad58c695a7d4c407bfd888ce04abaaec60a3fd33db10eaba6b6acf0e16cb61d1beb9212c2b07921bfb5595ef1eb389200b356eafe8b5288d8f0e2cf252b38301de65190d56bfadf57f +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 23f9850dccd2af799f18268c3a2918a69019513c55268faf2477c50677fce277d8ce58a0cc06dfe389170faf5f0ae13ffc4954c746eebae66efc14eaef2c2ac9001f3c7ef7e32fdc31dd725b6a8093e33daa6d19808908e0c2d3e7c1c58e0fe9ed92f4d7cf3cc222393ca4f95feab5d34fe29116410a1882dff7cd92acb87590 +A = -10a75953e5fb9903411869a2949f8f04144d6e2d61f95704ff55a02f40c4f283add405353a68bf7d6acc1b8cce738f0c6f9271a538b4c688dbeface58eef0a0a1d491a9e66958750db97bd01466edfd245cef03bb6a3acb81acc63c38538e7f15deefd15afc422a8641c357c31a069258dc0ebb63f06094ed8fe7d4d420246b40302361967c81f0a9ca542fd1de01967514ff2565de7ae3b4a200d63feaa22fb99a251cad66624df4 +B = -351242b6e6d0122f7120deb8357c3bcf25d221a15f83579883bfb4dc2e6099e6b7b95fd08f6e573d93354b0676f7bc9fad563d6eb0f3567ef43efe3d874b9c7733e4fe1ef491043e1f80aab6094cc9b9c236570972233ea74e8779a6eecda23a65d08d878850cab6005159265893dc0f66920a12c26dfb421ec326a1ac09e9ab8085825c31aba488af02cd51f96b205c50e692dbf2d844ff0a989c3ba9f1c2bc7f2e7dd9458a72d310eb28d490 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 69c7fa326630d7de69249807cd8bc55c9315acac26fed3caa3c8a9c6b51ee96a7dd0b3bacd5cc13c15f199e268c5eb91d1ec36c085f83b437b9906caa6e39ed7bf09778610b621426cc8d36d96f541d0bfcc7693525d33e0c2ecd77ccfe80289a11155b37c7ea7791b5c2be3f9b954e230c19d746575afe9a1a3a9677d23c5bb +A = 7cb78ca8e5d903096630744c85975719c16333e2e44931956d8c45b001d35ed4e184dec88c9e2167d2f338fe6f25540a144cc419590a4ac7caedea3bbbc565365d3357baa62fdccef2c5ea616614e0bff60e81916eb4abde0c9725b1bf6869e8b1e11f6d0d08fd712bc68003e55ed462ad4946f7f982e663f65d45c07c659d9620d5139d2b3332a68d33aec36e21716a3b75f44272a19f860e6ab3864f06def9a5ddeed340ac0733353 +B = 16d5b074e008fdd30e73ea95cb5fb87de806319388b3a44f33c94d38be0e6f1a92103dbdfb3d23b6e1d19bdb29ac14833003e9482cb7524d0d7b4c377f4911e3372f2cea6f84c938d84e3994e80f0d68e7e385ca29e02f70294c921dce7cd3829c5854ce51d1f4fcf7dba910b51b48a3f53cb1f187182435f21f6981cf8440f9c8287a9749c92c0304cc2bc91eef32d8e6526be802de8aa16684e8854cb0b67d9f7ea00f6f0145d14e3c251f70881 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 72192604b2f3f68b9ed3e261120ea52b06a05869f6abd21828ce8abadb3a71c360a14947bc738e5d1d530b9636d796f785bb44508477eefa80c4b77d4e8e35463e15ea2a48c682d3288c5abeb66181e4bed7d5b4e0db20fdf5ed68513aa5ae7e0978ec1c4646368f206636ec90e808817bd1d03acf9adb9ba57dc153873fec11 +A = 1112d291463b28ef45e879412e6607a3e20d50dba5044e71883bb3cdfe9bc694a577fd7d896dfb836a171f3a4d8fd025d3a979b43e41baafaf7b535d9050e47f4880828640e952435648960bbb74a3c25dd90bccb3fedd254dfc0f031d0e8a468e93bb69f771ed35f1653cffea1a763491fdf6efa21aefc287cb611f5ea0085f64cc3705c784f87ce00846901833d01a3c45ce047d822ba390b538f0a24720155409f60ca0d90e13991aa1 +B = -d553fa2dff0265cd9d083ad097af87a99af3d8d93a9f4c07440a28a427082004ae5c81d22bda1dd2429f540de8df175c1b4d0d50f0227489ba570b28baa35055df951d05b584ae6b051a135d7eb2a501b2441f82c135a8ec0eb81d379b96ef8f2fd526ee62293bcb934c76ef8083727a4b28bbfc9f515ebcc2bb7ed9594a106e137ce94e9105b2e2f4776aa9c6abdf426a181181fece3251c3ef4f8eecb634e6bd47c5878663fd51c74a66b92713fb7 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 459e19faf105ab17ff794927aff86196b3cc3461e69cada53ab8c8c81e2b1820408421ea1af6ae10257e8cd9dc16386906410761fed62cf9ddcf0da2a92800d99563fbb9cb1ab0ba46a17cb9dee3f2b68992c2b832a5932e4533fbd5c4487d870f3fb5d7a1c358f4aef02993360915a9e9cfde234df5f51c761d84568400b618 +A = -7a964c62e38e4124cd2bad727138dd12a086a2bf01c095b078ce2f81288d3c8435ccce0c8e00229184091130989434bcd107a3a0787a2f5f4b0e8c23b1cee9a8f39ea279fb6081efb6c3df1704fae9e87d63ac6eac4c6687b3551ab7ddac5ca0541e12047d04c2fc760fda0916cd2b585a90d25880fcc1bde8f0a1a413969938d42e8b3b5f73118798e85b901c2e15860e29e2ee8b1c95336b97dc10a21f5300e0352adb60b40a8a99333380 +B = 743ff4d91ea3e0f9c4f72e5daecb4fb00b15b86e30bacebbe4384324523d14e22abe29b00573733f594d652a88d98c987f8db08b27b4dc68577784fde02dd410ebdbfaad9e9afc6a22a8cbb13a780222bd212fc61e38faf409e940fba35ed909e6938e83b0fdf5b5e3ce138604823e788efc3aa0df924554fb70fd2faf8249e17a827c5d85942005b328bed97e5ea1f1810219d77f2fe121ce66518e37c84d64aebda3c397684212384deebd520a776b95 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 183950095d9424b0ed09985aafbbd2e5d64bf541a56b68b42ea8cf9b2c051615ee7bb6c0687ca6fb0036888fbc927cb7aeb303750871442ff2c0087a95f4efad568f48b03bd2b9a9ac26af8c259a3fa97cd2af7e3d8f36148c26785489cda6c00a21e7eca219d1f41b2e82ba8e2c1cd752eb08a2fd50c6f9077f3096e2eba05e +A = -1d2fc778cf44c6992d1f3a056860eeb12f969358cadb087dcaebf5f96bec42bc0aa98672260adf1732da057e9e0d22081e33f5fa71f248cf89dd361036ad58692637cdfff584a191279f178242ec0ad397efc52e99462f496caa0f3133c4238aaa877fa7094662f080eb284c4cbeb992a368c2d157ac5c8c9160c167716406190fa39ce0abcdac52c8020969b87a4f84bc09a51f7b2ca288c93b1aac64e19623a7d9e69976a31074f637e4c82aa +B = -2f188f1245b75cd21d052ec76edeb5881944a143fee31c67370fab0420a748f3f1957bb8332ffefdeabd0ca806169629f130c86c99bab490a9668fd8200f4a9b1704c589e75b5c8c855f133d50b2ce06191875e2872b36c78438d6032d53004c047f49e4cb81e19fa84da16d053e6cbc7c8eec0b9129a8831eba690e0542ca3fefd204258624e92844c8b7bcdccab986475a47c8b22e89079ea6580ef8f496099cc24dc2911dcb1921d1451e2163b55bbb7db +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = a02c38d5df9ff7055ff84122342ccdf6ed7f7d54fe8227af091371f5ae62844645586adaae99c11f4ccd828103a81471bac72dc20625962e41d603e760591bb3569a21f45bf062b86b5fd1c617a4769a4d767a0ee14d104084c12ae875316a8f2be7adec0104381dc02c20b5851efdf7d4bef0d68076975e0ada3e58e101e8b4 +A = 5daf37d616da184acb278a75fda4e4fa49e544eadcf373c054b203a309ba198233f2285a1b55dc92e05d0213b26c82e261d8383a845813077b2e1b5f4553400f09410987c8dd21d4383e0f05747d0482d1a89f160a5220b22c78393873564fc5b1e4d5627ef3d4a05612709f301381df35606e99560fba07a917d7ea7413110fb5a8290e114d5200cfecb00b6c53b2ee29911bcb2fb2930eadba0ab9dfaf46443370307d9c3b61a329f0b8b8cbe7d +B = 1d9539fdb1afabeb9be6e774dc7c7cc4bb4fd63af7abb557a5fc80a3fd23a4600de3c7fae89b91f3d441b61d3e24b2fd3d7803cd71620e7313917b4afb89ef5171a3d8a68c3c74aa3dfc8058d555eac429dfb6db40a9e0c25aacd2050418d6f32bf21cbb76981269dcd5883178d4b69a931a0338b93022a2ed0f78f3d8877989cc406f19d6d082ea344309318c56be7946412ea0867c78418ec32b9fa3a61017c10939c9345021133116933a3d1eb86a3ef16424 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 5fca287abf1f487e0ec18c230860eed4a2e550228b1500b1e33bcd6675646b5afe505b55073129f22352dc2b113c584ea1b98808214b6916933e90e036b129b61657cdea9026e1fa087ee300e055ae8f94ffca933a2d70453ed220468a5a3cf1a65d81eca11cf570d7d038722397f487af60531f24a5f069671354882c8bd2c1 +A = 1d9fe15171dce97475f4ad329fc8fb5469fb2b8086e4b01eddb6ceffe5324cfbd28d791705848569739b6758ca7e7d7d49adf0c11d891b0a5879ca870d1ca5ff475513322ff218cd26024f97623bb8a53084594e1fd64154e1db702522883fcf4c0d677a7fe90096fc76dc3800816996308d8f0be2dbf3b879f8a000c0ac534511437e2ce2d7ebcf42fd1698a829eb846b3afa581c24d5bf97abc6e247f110f4e872a2474e3acca6c8c0d518104c3375 +B = -dc0da8f7adb8e9f7b0e3f293cf623528dc8e9668317910417e52301c50c62e7d30e77ec7e38d6817d1f5a93e851f8560f642f23a0b9f836812d27b1b41c0867088a3108332b8711047560052ea30c8840f03a25c65b227a175d8f340095823788adb5bdf2b7ebb801e20f6b6435e154f78d17b8fc4373aecee56ec7b8f5686a7d22c8571797fde85cec884d45ddc4b1f2cc47ebf56a879bf286f349a0edfb531168b733d43de3b86b49eacb10b06a432c96c63440b +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 6222c1a14c6390d73944cead58eae5e7a6c19d19e4563c36cf624f5b61d99991bed7dbf6a0723abc56469eedfb1f7982987c2c7af6191178cf0933ed5f191b8117c9d726cdfa8b82a2fb25ca5436023f5860aff5fd482c611f134569ae87395dd99e5e9d400b5ab1e3064210ded096411654518110ea45899f4be2516e35a229 +A = -7f6766be6c6ca9bd1fd7ea1f80bfe68693f7ee4b5ba2946846839060d6028eabbb9079a165c1a07eb6a01239f3f14095225b8617753a1cc3d9c1e69b516d8705cfda396f4f0d05b0944a0f08b478d261e968c06918914ba87c8e7b7adef5cc2a875917d00585571542af219bd726e502b7f3f0bdf0cb1dfc6796be2e22e8ffb5b8bfac7e15e991022974e75d3a5eba214ab8a1aab2fcfcdbc6ded2abf834d1899d2e3ff94bad9c696aece045212531773f +B = 49c6f869745983cae44d33cb7ba141234905441ca53172abd1a2dd8bfeeac4b236605cd2dc5b04ff9aa13de84872145b935b85479136065d2d57fd15fbd97480c25c6354636c17ffbca33c9319d65e82523e39fab49321380a130fc160857a451a69b1d0509d5718a9cff8b49c2d677c1f66bf77333d2511f58d3eb2fb47b3c162cc9be8b012d8df70278f0e21123a69724a1f126369a236d54da026ebe222c513f24b577707b5ab4b90ab0e22b4e38ceb4181d4ca101 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 9e9cc8c5342dc6d6daf55fc9aa9f79ec18592e8b9724a66881c379245c91f06a7df50a6ba0964603a6dac97e77a55d06efff17c93d5faf107fe65788d0f56483915f6ea0f1ccbda7656eb58fc032b5771600beafdc12c2076110a9b9670bd0754ff6a72c5d6e1a9e4e42c688e1cc96d7aecd815bdf5dcb16fcd1be1275ce7282 +A = -11635fe16dafce21efb1c599305e9a16eb5651187cbf054cd9d911c13e8eafbb738013e212f9c2b3662ea15ac9bd82b5751d43a38e4475d2310945a812262309094ae9cf59e0e9f3d02c92d8ab01f5733a20f051054a240bcbe3a7b6bb3f7c434229f631c4af239d33bd3ce30a372a480fdb49b2716091d26071aef372b8bd8ee8eb7f2965a372a836000b3737d2a833a39230e721e4844e16031ad69cd45ced60a64510c1248fd776611934d8d2a913d965e +B = -3bb2cde9d3fda96fd7e6b24645f8e00b43affb223f2b5c3f4b7cfee905ddd6703a9d6c01f1f099ad1174da215a645ca4707d8156e762e2a253d7cfddd05ca19823ada9d33924013f677cfe4d86bde025391e0aaf91c6b776a9cf8a09dcad7cea59ee7aea1cf5f5bfe67c9d4456332d1f98e5310db9a0230381e1867a8f75b8757283f911f1a5e0d4afe5d544afa8d86637f9c9d87428fdcf8b4eb8f477e617960948253b24565b2f23081c47e211cd3c788a92732a49077f +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 30dc89bad4b449d1df9ea9b8f9d40b323c71d7e1133bc44d33bdb87c38cddedf83bb849e83436e4c92a06546fcf3e24ce6cc89d2e97a48aff2c7e3703da1b167a112f662a89742355e11e131e41052f1b379753cfa32cb0efa3a07465a258c585cd68c86bc9a473f5262c86c50992aeccbb9725b69ea8b3a7ebd2b6a24db52dc +A = 60463fae1e9354559160d55a453c12d75775a53d1606d1fd16bef7e4ad1c78f9568954112f9280c46781180951534c5372dd5aaff3f33ac9c2e0ce4934d7009aad2ab5d6a5e5a141a36846e8925c7a28d116c68fb78aa9a687ec9bef173c1b69e0d7261f96eacacf237e1fe5874e5d553985b0fe7692ce8f2a5feab9ad9a2ad9c4bbf050b73b8030ebc36b94af8c6ecb67f8c94607d80cf600efd4ce4aa006f9b1832da8a1fdf8a564be0b4369149e8639e1714 +B = 15bfc50290b771ad147695a4c6701c47f2e8aec0657a4ef999eb45685200981b0ab5f8abc143d64878b85e9548651a1afd0913e3b14d11d3a26ab9793596801662a67b0062fdc8888feb029266f71d170518b6a4a040f59996bd4f257f221e830d0faaa9688aaa6afbc1f9b40d25097eab9d71d80aabc085f3a07e48bcfb37119aa00de60be55fd07d5b1281adf7b98bb589cdf2026252edf2f075ee176e23afa6b1f924c9fcf3c34c76752e833278a2e6b62017b88b77eece5 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 8b506c9bfb75ab7ab420ae6c9b371ef035fab512188d9df76f0b31831573b44cb08266186a04d20cc761d61b6df3e33ecb86c269205c2c79ae6aa4d3ebacac8ec71d9bce1d7ab146530b131c9038041c6ce8152a6f1c09b9bec8eea4462dda0f08d75edf296eacbcefd62a0c197ed30f799343268bf6edfee4995958db7e0420 +A = 11c16713fbf8bc9696782cb5a88174cddbe68a04e8fe93dd074aab33dcd85f92baa178b2f3b8817be0cecb802cfd3ebb06734c9d399a1f090e3a8a2110aebbba0e920427bcda74bf11700b945985bd532286d44a1a615cf7c501412e454edd647f8371cb8149474557a0d47cbb782f460de7a3cc28991491ea0fc510286711b882987b09341c079565414f2c930e7c3c3a3e3e0f1d786260a7f45c70e0fa20dfc63849906af61707cfdf5a9b7a4291a1c1586d16b8 +B = -cf5638af39c6da3757a09a92e0bd54f852742682dc91c71dcdc6e72f7825a0979a1ead2e158479ce5565d22472dc3853e6bf7ba43296a5e0e0a355f0703cecc02ec79da83e3e9de10a6eccb858dedf7d4c400c27486a5b8cb34d787cde6a5fd271e83a6cf66057838fe30db1f30663cdfc22ef5d002b0b5a05831228ea200f95382a58d0d8aba36523d9b5cb7506f193131916f3ab66ac9552c26cd0c2ab1c449eaeb8fde752f4f3c3f9b060cc1f8a1e37c4fe5ec306674b66158 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 347706abeb168205cef9b0b8c6b9d6449ac501af7dfbdfbd41a20a6a47872cbd7d4cd32f7b0805ecf1573d534418b7cce98181e079d5061b02639fdf0161cea5314dbbb2ef39ec841f695281f3c7de45f33664e0dd1658f645adc1dd225f781a3fb1634517c556403587b2aecd56dceca9ec19b930cead2b1d303aa056d28bc7 +A = -5e1c869e5dbcc684c245d5c69093bfeaadf388cbf928d33a8ae2148a2b5145937e4f654c5f6a36de1124bad1de8bcc9067fe1f9a44fc6ffe55ce7ed5cd0dbb6337b0e1e96bac1eb2a3606dd97b0bdb975ea59448be50191cc7ea36481ca9fc85c1c3e1c97378dbcd6b355622046888df2ab3d18d805f4d31d464f62a8e630e955beeeb5e00c70242b8f8df708705abbeb95dea3561756298b5f3f7fe16e965294eeeea4546f5e8bacf9d6b4f2136d2e206a87dad1f47 +B = 70225f0cadd328be36ece2172c836405db3fe80ef99ec74fca25406b73a537adf5073f2b550abfc4c0fcc2c2850dace0da9a266768cb4d5ff7fc6c1c248ad74f47592101b61ef96c1302924381abbd96cf49f50c44bf7e0551721a8ae85abdf9925548d13b8c5d1a27be8a40d0f43eec3136bc3035057b75aea779b4262cc66e6bc68da93c218f1920979291105d4b02117d66deb92c3e511aa588b27130202acc9f69521957f79c7e731bbd5461552b9b6b24240dd71ac449be9777 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = a2cb238f326d47f95869e2dcb295eba819a443dcc7c2785461389b58327742702f4c86e47af129f1fd4611cda93631f9333c358a29121d58286333083d13e66f30a9533b77ba3e26089e7eff7baf19bef8054af4e24735525908864ea9c4756b42a69c897003cab7b63cfd9a5927ed562e29845308eb2a55e7f8f03c87a5b7ce +A = -1aa7ae6f56c38b654b281525b9da953ef366c2b9cffd3042105ed428dc7e5f2f2d53ef90b468bb471753606cc7a3775d86bcd2f4d5119cdde3c487cd39bf31752c5ba297e529c1b8121487e0e1de702156d0166ccaf51888a24fe7b48624eefaec855e2200929c21858676ec9bf4ceed0a832b69efd5065af544e49a3d209b85a77b0953652cbf0aa897527c52c9a98de9ae4c827f762e251478c88d410123625ea52b3478b52f6b9987d42009ae427763357ab53195772 +B = -226630b6fcdb5e274a25066ae2ca2c803549dbb935a97c0d7f6ab2c971d74cf6acd265c9d6815a6b2dd23dcb3c23b390fe8b1bed92b8c64c76c0ce62d5e7ddd7ce445bab0ca905dcfd0f128e5f4ffe966f3903d7ff1c61fe174e373cfe35a6d83249ec40b4a354d46fa1c90682efe468e895ea3da710838c262e8a47752dc6e7a79fe20051f51180173b58e0aa37b22eb8efee5b6dc264459ce4d135f430cb15afbf8c53f0de894bd2aca1f7ea32b4209a22a075f7b3b18e86f778a9e47 +M = b18a9cd6a0a89578ea773fbfc0767c8ab817cdd585c16afad3600540d056c323d83e7756b1b74e4c2a84df7edd562e011412a0e2eb6b64178a9e04f67550f3081797873f444dbd03d776835d696e464443a0a6f48d509228fe976c54cb82925e8a80ee65c01ad9a5f56784c54192112fbca30a76ce579d3eb6e783643e971d48 + +ModMul = 9ea62ef634 +A = 55cc58c9d8 +B = 6b49179821 +M = f753311ac9 + +ModMul = e9ab3a2aa60edd30108 +A = 5134a36c2bad180dd5bf +B = 2ba6485656d041690666 +M = 9b9cc4409e86c8b0fbbf + +ModMul = 621f9b797e866028b7bd1ff828bf29 +A = a202338dffe171c99434d84f3 +B = fb71eee7045b3e3ab5dd809dd +M = b3e6e8d53b7249df670e3c59c55d33 + +ModMul = 808d463d06b7b7f98e3cb2783e2196c349d62672 +A = c669426a92d3cb5b316e2b5b9 +B = ccaea3874008dcc92450d8b2f +M = b04dd2bb325baed1940cd000e8cb2d786009ccd5 + +ModMul = 872164b92b9426b237858c4cdafe1694f96b0e0e4c19e894a0 +A = c3255cb24a813e27c3dc410f0 +B = b144f39e7c2d33605ba7bee16 +M = f3639f4dfb782f3107eb402fabb5fc878903acb5e02e129077 + +ModMul = 6124d7d171 +A = 235b938139 +B = 3a56a22a28 +M = 83eb4af4e5 + +ModMul = 9c006f56095d442ba98c +A = 207e14237c42e3764e5e +B = 8a495a26872432fa8e33 +M = d0cf2b8ae5c67d6736b9 + +ModMul = 97387cfaef652932a230c82de59cac +A = 82ae0fc5e943af5bb8c4adebb +B = db1279be12d59ba3a9c036a61 +M = aa36dc1d13390169cd54d711eb511b + +ModMul = 32ee73c98da657464c6fed4274df20b099689e00 +A = 9baf08248ee24bcb17714e420 +B = a7f0428147bfe098666180749 +M = ce0bc198331c9ed1d21f0d498326e8185d3d602d + +ModMul = a8b3fc0b53df3b92753edecd6fbcc5f4840dad3a44da704e34 +A = b36249e259b303e453757721c +B = f0c1db50670d92abd93bdc84b +M = b05cf978bf2dc7e093d7d164e46d547219c480382df32b33d9 + +ModMul = 2663b741ff +A = 58c8e7f7f6 +B = c84681fc87 +M = e0a50dcb45 + +ModMul = 21af3c0b42328f41b81e +A = 1f79f5b5bf78c9700d +B = 5bd1734ba0f0e59c2a25 +M = 9ff3fdfb5c089244f327 + +ModMul = cbc280b5106c2c36cb31ad7e7c986c +A = cadf6482b769e83ce7f7277dd +B = f9862a06da1a9c89547b76c61 +M = cc36144c88139ce921d2fd1740bc4b + +ModMul = 3813f2fabe016e19fd8e70687ff473651a5fbb4b +A = 9c51a5bacb5d9f055a9ac2962 +B = bfed5625b21b4e82d1f105a0b +M = a47977acad7c5deeb683ccd265cb30cb193f22a9 + +ModMul = 76ff291a02715fc87ebfb3e99153c04e53358dbd7beae43478 +A = 997c4a7b537d9500d73a205a4 +B = c679ce666af284a459ae5a26e +M = d0d0fd4922953941acad8beb65c00603b19eb44fb8ca51e3c9 + +ModMul = 1a90c92fdb +A = 94fa7bb475 +B = 564b0a3339 +M = a1501bdc75 + +ModMul = 5e7ae5470686bad7996a +A = c725797912c6c5f30d94 +B = 3a7f4c99ee3f5fa9582c +M = cc50c8b7408f09a74973 + +ModMul = 72a15b13bcd1b63747342a6be8f0f2 +A = c33357af48a2df569e3c11ce6 +B = a4b4c5c14d7796adab54b6cae +M = e22a0fdca62a37f4c8a61c96a429b9 + +ModMul = 31e179bfbf65b0695dde36a4fb72d131830dcdd6 +A = ce8d3adab8cbf15c332c0b289 +B = 9333f94eeb7d7a86b82becc51 +M = a532a76bd5cff409b580d54d12ef75ad8179b381 + +ModMul = 8f4b8a585415adff3a7bc35fa88891ba31e4a82672c664fb14 +A = 9a2b56a54bd0727ab4be57ff2 +B = edf1781b4296567990773005a +M = c5a7c3b97ba00d6f174a019c6d37eda52036c528f351bef0f1 + +ModMul = 917bcdb402 +A = 55c7dbd314 +B = 997b29ef79 +M = af5b4cbd0f + +ModMul = 660c4bb2b771f523a4fd +A = 43fe52461d5139620a11 +B = 1f8ec4b67de1db54ddda +M = d0458e215b7e6903d96f + +ModMul = 7aeff02c143e4426fcbcf32bd1277b +A = a2671586369a990dde7829f36 +B = c7ff67937c900daccc0ab1d8c +M = 8ad9c1d4d3cce681d1ae27c27982df + +ModMul = 4b153d57433f0f7276674d3484e9bd0d25227d07 +A = aea36cf51dd2ce06c66b7a407 +B = 80c9fe5bb0afd2bf8b3644f96 +M = 8cc22a67ed7e5a7a2322aaa09ec2be94998494f9 + +ModMul = 7f8447dd983b113f04c6288f9539e53a2e9cddbca8b2fefcc0 +A = f67636b03821c8f13f21217a5 +B = 8473a29f4ae33f36a0d2c6dc0 +M = b829af37b557c3ddbb5257c8b19144b90708a45a274d6655f5 + +ModMul = 17fe4644a2 +A = 912611576f +B = 7a10d36b80 +M = c5fa605133 + +ModMul = 8159b23d4fd697b4fd35 +A = be2d646e76494439e60 +B = 60fa770d05ebc69772b2 +M = a6e7c940cd749925a85b + +ModMul = 7c412dad5c9fff91357bf181caf2bf +A = 80f476ed5acae75b34ed54c52 +B = fb818e2bdab3b5f4bd84db3d0 +M = d0339f7ee41337d8462d1a9c207d1d + +ModMul = 70432c749da4ade2c38237545ebfe6c4c6a92f6b +A = ee9c92de52210e61adaa6eb4a +B = 8ab55a85b1abab62d33e75fe3 +M = cd3faa6de4cb62fece4c3f94492d457834a6a041 + +ModMul = 9fef1c18778a8691c5e71c0b5208e82778e9bfb632da0b7e28 +A = bd162c90bed25e84dd5b6b77c +B = d887ee03020c5df356f091db6 +M = a2c2d45fe9decd93a0ca3edab8fee46d27ba23fad9b5294d5f + +ModMul = 958951bd0f +A = 12bd0d3375 +B = 668bb65b4e +M = 9c617dfaad + +ModMul = 8a109ebc9cbf86613e43 +A = a3e7019f1bbc35689a77 +B = 3189ecd3fd4ffd0229ef +M = ddadc50600dff2abc1af + +ModMul = 2b4d9f85a398c852b3a0cc82524619 +A = c244fd157267f707319ba6c6d +B = 8a07018a748992429bbdbf326 +M = bf3813fb54f749ea5627f59ce30e07 + +ModMul = 28cab7d574e6dc56a6a622f8a7523cbb8dcc5e0f +A = c9909dcfd3a59a3cfa538b267 +B = 8bbf89cd5a4e24adc2d8c646b +M = c8f02682b9d480ea98faaca53b747ced33ed0419 + +ModMul = 69b2dfb3f1d8dbb13e9e479f38edcc427d5968acb7751a226a +A = 8019266c548982a520ab48eff +B = d33c3e3b13576dcdb3ffaa796 +M = e6255103732475604df7c6f7ef7e6b49a8ef9e2b0c717925a1 + +ModMul = 3eaa4c99fd +A = 6fc42faa85 +B = dd0b4e318e +M = fd7f22301b + +ModMul = 56b6b811ced3433755cb +A = 145573d17cb0c996c69 +B = 9d3297d5ccc184896822 +M = dcfb3b383506239e83e1 + +ModMul = 34315b6bc6d3690c28060485ae331f +A = b963a26973894cfb42fcb2d22 +B = e8523304bbcdff1a0ed4141bb +M = d7a379aeac7d8cf94f19e7924d35d1 + +ModMul = 2ec9466e8b3357496f07e37ba24d36a237883846 +A = a75f3904e564997695b6707eb +B = f9f47bd779834dc1f5fba0654 +M = b3ae5abed45d09c4dc5abcadc3ac9abebe1949ed + +ModMul = 88b4d86b2c1e1bd780e8d2499c2221e05fab4f9b7047c2a044 +A = a38eceb9c551f0e69a544072c +B = d5f8e7c2d534b2b8985bfd213 +M = ff81809b84fb8eed3508ad891d3d8208249d8a902a12d6acf7 + +ModMul = 172f2e2e22 +A = 1584ff1055 +B = 2e0aee014d +M = b904cb0bc9 + +ModMul = 122c10d3200270b9eaa1 +A = 86fd189e62a6dc1e4ba0 +B = 5235635f7b0336f5f235 +M = c93da97d0e95fb63dc4d + +ModMul = 3e461e10ac4eb749512097fbf76616 +A = cf4ce10cbca07164f3812f89c +B = b7e4639c233fbb0f923fb5104 +M = 949647857e1406871593fad5c30101 + +ModMul = 88117b59d9fed79dd6aaf083ee938215a995a221 +A = 94c888795567d434123d441a7 +B = c60ca79e61a352e34e0f78bee +M = d2553a7c5dccd639a3927697a2e1af03845f2f25 + +ModMul = bc5f0076a8c2f6cc8f4e61540d2d6f6d6b13b775b363dcd71c +A = c170eaddca5295d6ec6272dc2 +B = f94a5685ced7661df2efbd34e +M = fa6bc46aa05033af72aa42793e9174af2e3ba38992f33572fd + +ModMul = 1110cdbe5b +A = 5db02b38f3 +B = 3369537903 +M = a8863f7979 + +ModMul = 90fcc5f3a346d3d4ea4c +A = b93373680ea0feeb31d8 +B = 37f9dfaf0e180be64bd5 +M = d595cc29237d1c19e2db + +ModMul = 8623a9997e514cf3c1d06c33c14053 +A = b396f5ede6212f1fdfc7e7b77 +B = 81a1ddc18306f2d2e84030148 +M = a6be32a91b34857842255ef8b1aafd + +ModMul = 63f8f0254df06356f5cab8941b77619ad58025ed +A = 806b2627b08d987438f920bae +B = 83297039f4aa8efc1a185fea3 +M = bb8a7e7c19be02c25cf5682a0eee655fcd5b69a5 + +ModMul = 697238dbe3d395e81f20c9fcc8db30c234a1f75f3b2bc27438 +A = 930b04224bc097ac1d8bae8be +B = b79496a80e45212c4663e5b64 +M = 8ff7e19d967d317c255380411898d73e3786269f09079f19f1 + +ModMul = cd93b5b8b1 +A = 47a51b2d5a +B = 86d6ba5155 +M = efb0ad3643 + +ModMul = 2037821ea789118bde0a +A = a92215dcae19be637ff +B = 93b9a3664a406737958f +M = 9df360b69ed26f610253 + +ModMul = 3bf11785d28ceb668dc55b870faf7b +A = bc8758854dc48e057cb6210de +B = f03ca689620a77ecd8a6f0de3 +M = f3ff0747d6e5f34a0ba4200f579259 + +ModMul = 7b30b44f75ed12f54136858ce4fe77d00e0952cf +A = 993cd09f3e46423a8ba2053df +B = feabee384158032dd013dc08d +M = cd0b21388cb2033b1e792ec4078334df70b6c8f9 + +ModMul = 8ce1e17972f1a9d2e9437d0c5219354728a5f31337808d7650 +A = 90e5d18b017118177ffb080da +B = f8e7e09032574f6c66e623ec8 +M = da795e6ef63ff7dc4baef5c327022ccf65d44e3c4e24823f11 + +ModMul = 8fcd412054 +A = 2e7f9b1a +B = 6283de2c9a +M = 9bff560ae7 + +ModMul = 57d0d3b79f1e2f3632fc +A = 2f8cc403de5af54cfa39 +B = 3b798c3ead52878dfb2f +M = 805e6cbde400d4b4bc9b + +ModMul = 23331614e88633af879201f568c359 +A = f21f19da4b20980979a645dac +B = ea752050b79883dcd69222536 +M = aed3faf4c88f7c4afe257c5ed90599 + +ModMul = 56dcf9ae1c787e773774df3c8762babb4675a212 +A = 9accf901fa599da05fa6ab5ff +B = f7f6b9b1d7bae06237532e39f +M = b5bcd776bb2eb0805ade3c8b47e883962d3cbdf5 + +ModMul = 61d0ee0786963906a028a1df01f836841ab6d39d88ca2717c0 +A = 8e57680f213d088ff1a1e7db3 +B = afebecc9943b0093f87022940 +M = b6201f68a45265d7e9183c3255feb4c110c05dadbcb13881bb + +ModMul = 143ae78a29 +A = 334abb952a +B = 74203e7a50 +M = c9535a9505 + +ModMul = 897a2b57e69f5a1469ea +A = 1ec8ca0ea4fed52bdbbf +B = 3a6273cab05e478a57b8 +M = dcb33163a8ea42c1ae6d + +ModMul = 4a2c10e90e2d37111db79a44d3e31b +A = a90e7bbd63fc4af6de83029ee +B = cf09c3dd50b41afc7045e057b +M = 8ab85d47e4270116a64f97dc4f0f15 + +ModMul = 70f94276c9d85fd3f71edfaad6051456f754da85 +A = fa3e9ff6e1aa1fb78e51711cb +B = b115ed197c50b7ec4040ca255 +M = ad63f69ef1346e7549ba71c13b24b279f53bc9bd + +ModMul = 861e7ef401866f815b983ba18a612913ecc20a67016d79cfac +A = fc41a9ce06e882942f751be7a +B = 881c05a51d1ba8134d126a48e +M = b12200b39526c33b70e8aa23ebc400dea0d4d8fe42be103d5f + +ModMul = 4e0051898a +A = 2a06523f70 +B = 651b5044f0 +M = 9da4eb09b5 + +ModMul = cc8274c88d6affc3742f +A = 9ccf0133f9628532f4f6 +B = c1d80907057be7a67b01 +M = d6e76e362da831f32685 + +ModMul = 568f15bed5c4405be9dd04673a9c46 +A = dd6029c3196feb6da7f0f4a48 +B = a5f6745f2cb64913d1d3236d8 +M = f62f02c9b9ca8993e3be9a02b444bf + +ModMul = a629452d5ed19df040eca26eaca37d82c0fb1d8f +A = 963c51a9415b03e85ccb09f25 +B = b1cffe333afe44311cb968ffe +M = ab2128698d498e8d75455033cfbbf4487535773f + +ModMul = 814030123025d287aaa8b826792999d72f2d589e0c7f7f3dbf +A = c3b33f391e78bee97ceddf313 +B = a9136f3af450fdeb245eff425 +M = b6aa9c517eaecb70781e597b907583bbb569e970d229235a35 + +ModMul = 8735bd486d +A = 563e15c52a +B = 31293264e1 +M = 92f4b193df + +ModMul = a541f69ca163b288dd0e +A = a608b48c1dcaa18424b2 +B = 891b0b296e911068b00c +M = d4140921f4b2c84f1eb1 + +ModMul = adc1b7cf65967b013d046866b4ed9d +A = e97941448f65060cf63ecd486 +B = ca68936f76cb87a8fbdd37311 +M = ebbca2482fb82eeca2866057cf1179 + +ModMul = 44aa9f0dd58d4510a7364e130698b34eda23a632 +A = c11f83f01bb964ffac93a2e30 +B = e05ee40eea39f4538d735193d +M = b5e8b511738979dc740a6a1f7291cf4561787be7 + +ModMul = 8b16b82f064f471983c7154abc9f9ba355111bacb90400372a +A = acff8da571e1c96810bf95707 +B = cdd23e5504cc26d0c34a62b06 +M = f38902a99190ae0b5ef26849a6e943d651925666fea271fee7 + +ModMul = 193f453197 +A = 8cb3078675 +B = a8fb003a87 +M = b60ff22f4b + +ModMul = 849c26c8cf5cae426a80 +A = 5d1e3d2b4d038a0a34be +B = 34f70325565bf0523314 +M = cbc189f9a732cad8f425 + +ModMul = 9a4e64ff530c53a4c6c5b6b5021920 +A = f53b81723cf74f520a61e614e +B = 9d8ac2e6b839143fdd079a2ff +M = a115375435151798f3644bede9d863 + +ModMul = aac303a4623e80158af1cb3331965cc8e3184edd +A = cce0a88606ff962fdc37e72c9 +B = 9840a500a2051625c517104db +M = b99dafdbd91ec3c05791031df5e193c03d6a441d + +ModMul = a31401dfa761bbe82b66b5f094151865b18a4ba75bb9b3dedf +A = e6f48c027284856aaf3b96425 +B = b4c326f72a6a22fd4b93ba5b3 +M = e57d9608ac6e5b129b2c014958bfc59137f63838b1ba88a4ab + +ModMul = 8b0929adbf +A = 61fdf77ac0 +B = 8892f05400 +M = f12b3766eb + +ModMul = 91b57f353307b173679d +A = 33f8e73752072b4b5cfa +B = b4c730f79f4f2c07945d +M = d41be1d8d2e5753e3ae9 + +ModMul = af04c564adfeb120bc4770bc8c650c +A = af151333b3d4cd1d29fd801db +B = 9ccaac44ff91be11b30bdcdd0 +M = e0bd6e70d5f5ce08fbbfd48d43101f + +ModMul = 1b8d623796a5065d9e993a53a9587a0fdbea1bbd +A = a2fd08df2d4eab0cd6d29e213 +B = 92c9d26ae7c215b52199ee28b +M = cd529f4cfa46f3bd3e7fadf167fdc02f6f881da3 + +ModMul = 4a8573dd8dc50a4fa39f3579d3869745eb8c1153ca508deefd +A = 855f941d085305725da617f5d +B = 8f09b7d2c36e0340523da5421 +M = fd8caa05edeaa81beefa01957eed97a981ab34bdeb6d8c704b + +ModMul = 2d278e089 +A = 59d20a1716 +B = 8e2a58bc75 +M = b3d61ef699 + +ModMul = 2f937ce359d0f6cedd1 +A = 1019d11d26040ffd5b1d +B = 7cdb6252087423d43e08 +M = e8f537323004447e669f + +ModMul = 6567332e25af83089f7458786ab0ca +A = bf9565e9f8a098894447b58fb +B = fc867626f268c24cc0ab7bf8b +M = 930f39183353363dcd822933a438ef + +ModMul = 3692e73ad1d91ddc19cad3808eba2c5fc88e2bf9 +A = d0a42ce512629f0ffd233a9aa +B = 97f6d3c4c655c7353a62d6ac4 +M = eac2ea84851f880214b8f40f881a2e56a6ba6f2d + +ModMul = 81df390c9e51b30bd639db15adb464c7cb1d011cb5e260be58 +A = c237eb242c40960861c938c08 +B = ab2f481f0d768eebd90d2574b +M = 8697d7a28a5f42c9a7b31949b8b568f861142f44fe66c6cd3f + +ModMul = c952f9aef +A = 81973bbcb3 +B = 28ddee3bf7 +M = c4a40993c9 + +ModMul = 241dd53d93f7bdbbb2ee +A = 2136eda4495c45c9f96c +B = e74c4baa8ca3f6b7cd5b +M = fff4594e7a5f0a1d3e15 + +ModMul = 5f861ed8b0aa835761613e6c869cfd +A = bfc5c1572086079f5f5d18d1b +B = 95902e14923c8010b7e905178 +M = a819c6c109d623f9b845aa23712c9b + +ModMul = 5b8ab089c4e4c6804e48a2bc1d218718b3a32598 +A = fbe65d3852224a812c432672a +B = d57a3f38da966d2471d70a048 +M = b9e6a626d3ad026d14248fc90c882bedd64a1f13 + +ModMul = 761438baf5b02dc095b7040e082da7b167c2b9ace956284ed +A = fd91701ed2151f8e994bf4ee1 +B = 88b66e735b76972bccd9db182 +M = 8008b2d1274456aa68dc627b1ec3e1762c6ed2d660c64a1a55 + +ModMul = cb743c97a1 +A = 9c69ca9b60 +B = 7488f48f5 +M = d67040ed0d + +ModMul = 931b2bee1bc30725a31 +A = 650f567b544ce02303d4 +B = 5858da30dd1fae88a675 +M = 91ce30234bb29fb9e833 + +ModMul = 5b4f262cec958a20390b5e568ccdaf +A = f7e240e8a077e8e87506db2f1 +B = f8653fe64e3bd414782f51634 +M = fdb8225eefc1620648737d31dfe1f7 + +ModMul = 4c011d1ddfa30c901793cc6ce74db47584cebbd1 +A = eda8e9a9ea3cdae17bd50b1b4 +B = 992e8ef4a45593e4ceff67876 +M = 95e2f120cfcefbada1058af6c8853cbebedd5763 + +ModMul = 6e99aa5b8107399848cf24fbd88ed6350efb68d737e505b466 +A = ca6c51ba2f410d09bf71d60fe +B = 8bdfa8fe5ef3b2ad02bc63c4d +M = 84daecf412b8c50ad6dfdb546c3eb783dcc6f32003eda914bb + +ModMul = 536175913582e73c1002083cb0cfce5471d4193a5b717881e60abfe927c829d +A = 9b474b6f7d7f11dfbeb7a0724694f2daf9ccbaf2ec13269b5ae3329e8df95f7833baa68324509dcddfb5afa1d14f2dafc55e2c225475f16fb396beecc7a66dee +B = d74a5081f00af2361c3537642c06cd47aae7e366741c9b4785e185af8b328acf3e2ed71e3b9a4b6fd49d956eef76740b3c6ec5850a90e7e444dfeaa7214c5eca +M = 5efaeebe212752b28b5441a5d0b2600190504467c6359e9ab26320ee72cffcb + +ModMul = 6161cceee2b74e7965a926fdf5344ddf8cc41994d72154a8b6014c18cf71634 +A = e7d6b74a1af0834aaf93e09a6488340b661449ba2bbc73d775e7d828163813ddbcd82719351879a6d67ab6b518011e1db43a3d620d1f24403917691d15ed6f90 +B = 3ecc8fd3103fe52a7e73ec4be4e60b69584bd886a030f017b482bde9d4b0b964ba8471cb32b3e9bd49864d9028a22d6b6b46be0451bb4222c3987b74a509f8fc +M = 7c3e3b8b1a6110da82674aaf88c288cef4cfddf22e7c9b75640fd67fa5fad59 + +ModMul = 2acd55bdcccd55882eff0bb262bb62f78bff8e932aefc9d32f54d5d4e9b8bd76 +A = c221d1f0d1b7efe7e078dd01bed773f8876fa324b3fe91985d47d343e7f3878b457dae2f9ae68971245278a1d23cb541c56b94dd9ac43a9fbe28a46efc627651 +B = 49f94c19ff7ce990637c3d2019ed66f7e6dbb1442b04a4593cc480521b991cb1b878f8c31903240f89e34336d9e6785433617e729b71adcbef622a683357e035 +M = 43760c71742e9cf22cae6fc262c008b7f1b97a78c8063957b74aa4cd370c1eeb + +ModMul = 504c11e38284a30e3647c1ddfaed94503d833bcecdff05e749422ad1d9442540 +A = 3fbabe2d65f443e7db0a6f332330ecc4d1d40e14fcb510499552020405cafcf10a50a5ee47cf60fd8c22a22b3f753b4167c213851f32109babe4b5c298d6c4cf +B = 62e5b0f887dcb1f1794bae7dad46a066f810cf5f82a1eea99207b5f0fb0ae9084c5e62cc97b2672b1cf4cc1400a19bdcb093c97404876b584a6482931e7ba9b7 +M = d79fab3eb31189268b2a0689cafdaa0826f07d432591e8aa8bd3c7cdce1470a7 + +ModMul = 13a6431c57ddf0ed3979412ba8454a0dd9a2694a0dd76453aae63366c46e41db +A = 7e1fd0bd9ab0aa75b264475604aea09f24239f94847ce2549d43b71890c0549938d167adebc7890d3c492b5874da7bf18d895ccaf1803b9776820598928b407c +B = 5e54e5185bc86f16177f1354a57d36ac2980def141b389e4bfda134fae7c158009ccc61ef66281905128b6297f876662104ead2315024f129c56eaa387f80b4d +M = 182572149b860615dd853f37f7d51a35e85f5e4a4249a60fde58dc68e0dd7401 + +ModMul = 145a44566bd75103083b7556a822ea6008ed3a6a1bf135b68fcf87a294c09b4 +A = a195e4315caa8cc0707063c7359c28139d4dfffb57eb726156336e13227ad9766ea1fc99152893ebb194fecfc153d47cb927a633217328f05e4d8782aeb89d04 +B = a97ae97dc7e9a224cab94ecedc08d0cbf7a012dc5209b1e1e8b5b843fcf61e65db3457d6085545a633be47b742e8237cc716357ff5bce9b00e23671ec1d049a8 +M = 29b060ee2aef7e43e02163d279ce49259127198adf462d13aa195c7dccf573a1 + +ModMul = b00740cef7791692d45f5a7110f3eeb260638f19f87c9245436fc0422de90658 +A = e6b97c11ad44fd451d168d65d1691d2220db8c3b6c8436d59f4c1366aac52558d0d6b61f5d6966460a4a31085fac711e5a09af5563d938963555d4730982eb0 +B = 6805eab5a4da534f07def6d2c320a6cbdfe4831fc2163dfcef740607b3181d8647bfae8f8c16237c1c1c5d14b9e3417132f81b3a7db4b7fc11927aab30dca590 +M = f975a94fa62b4c0e68df5c3ac5917d18927c0a6d9cf39c26f6ed97a81cedf227 + +ModMul = dc04b6ba2eb1e34ea8942a50d1d0c5479dd22109895796ffdc9cd32b53d4764 +A = 7fd3310af09a67e0684dcd8e3b4b651c7c13c2f6a0a47b59a7f5cd8bd80854d1d4fe02eaa61843d6bb2b87f99d8ec4842864681eaf056538ffff610c231e1d +B = 15f1661c59ee9f93400073e18a91503a93d47537d2da5cf5e4bc69ccc87b07bed171a95f1c5eaa9c7d7ab207ab3f1f7634c5d16e706969e869364207f61d84bf +M = 22e2856f4c2b6c01448d4aef74aaaee3a14e9660b5b277200f2e67464ecadfab + +ModMul = 19299c9e960ce15087e9fbd66f95cafe82546431b92d70db1de87c3425c1bef2 +A = 8e3abb1f24e1f91496db99be9409f57f67cfb6e0e33d603a2a31e1309f1d0bbdc413c3e4fbb5e3d923f683afa9942b9b9fad6a6e558b2297889fff47ccef7d23 +B = dbdf5940dcd68127d476badbd5a2f3018aa4d8db79f81337ddfcb108637110b934e946d3284ec09d5255605ad72424f1894238ee4f7964dffc27fad838532321 +M = ab6b4e3d3909512f5d1d62a30c1ab8dd5e584cadbce9dffd12fe203f8936ee93 + +ModMul = 4f88ad4e30e6e8e38cba0452d98d4a3547c680f16308692e33e5577772658764 +A = 5137697bf48982edd869e4a42f3cb858bf65ad5b25d1c0e8b75d054460d0944ecb5a6924721c5728964d84231c7ae808f556837aefb23fe3ad36aec9f5f60f20 +B = c79554304620f8116b9a8bb56f6a23620e9fd504f7163f732e1e6367d25c6ff98cb01d16faf3e018dec6a067d1204a6aa95470598ce757bcfbc3ab4f5d8ec88 +M = 9ba20dd78923d8ef82897ac46a509cf22c9b7986a4facf42e5416bfe3576a735 + +ModMul = 985a4d2a7431e09fcad03e6a3f926582dbc0aedc588f17aa5db40c2d3566233 +A = 908bff40440aaeee6c90b6312dc017c3bdae884a9074e02b26f01be1f018390e01f0d111f99a06c16e20538df8000d4066cd4bb3628da88a3a5cc240cfac719f +B = 6ebfe9fe53909876784f9d6e5dcca4cfa9463fbd8426c5bb8890ae84c2fad119615fe1e1f2ee5fa544a5ac713ed1da8c1e04f282f1f1b9fba4b4c4bd9db20538 +M = c66842e0a11ed6ad1e8f192ea97f5f244536cfc5234c7fdae1ff905123c72793 + +ModMul = 133d7b31537b627da2c042217cd28625437c28c3e06258427d9a4384046a1f4 +A = afb695e3e40347f60a500e01fba4df1c1f2fd4ed79e3f65913d82369f79d80db6b3978e6351c70c148f572b9c0c2b1efeefa605251b3156d9b66d240467e550f +B = 8855046dcf50f80f278227d5260b9be53ca2e4a1cfe1afce4d35b11d0fa17a36a8bee8126e13bbb318d476becad5a935e9d160fa481e1437b292bdc169dc7d45 +M = 3eae4f0d6c7e1fb9de1a4c160404a8767783c7f839fe27a543f5c389c679d47 + +ModMul = 7f4576a315bad5c7fbb1616e8b26c5b34ca6f701b9b1adf0485fec181c41dee9 +A = bc2baf0153a4598f6b5f488c43b2546cadfaca2c1931b919f98ba71835a8fe78886da1fea25b194e60ed6f9e0ad23c988b64af9278155c1722dcf4983a1566c2 +B = d8374d91fd3c523ecdd6bdd265c9a8958dd222f9f0e25454fd683bd86d7900a273b56f1f47e033c46527e32c721094ce6bc927d25fac05d7fa6db4d7a6773c94 +M = 9975d8e7f2a4d9d1ff8d442b93ff269a83fee43a18bbfa8c2ccd7ca5fac3a8d3 + +ModMul = 57ebfb39605d4fa6ef5fd03bd8e4fd685664297c29b7ad75a40b133e15fc5ae9 +A = efed8e442154b1eb6c75775cc23e01fa65c9c361e222da123d07daad3039f305e7102edff23b65c333f0caae4f7929857c3169f4ae47c9f0fd920c38eb42bf2f +B = db05415ea90269a74b0919ff772c148c0eeb2ff9dea76a6e73e82eb86bc76fb42308b55ef83a769a91d23b7840d5d2f5129f15279dfab7cd8d63778acf202f26 +M = 7704390c4b1da86d51ff817003e5451d601a5352296e339e5da219ec5a330479 + +ModMul = 40b6b0d44cf8a5ca7f4fd03dd6e1e2a11f74f3911dcd8727e57db8d65cd490d +A = 6500f3cf686eec4e1f243616ac0ea8e8d11ddbade490b86baf231e7b2fd55968ee14b6bb7badf8c898874099831976af46bcbfbfaea10d49aa803c6e51238e2 +B = 1fac744fa1e26e789639e049679d0e2eb57336279f09555e10210e7143199a3df5fbf5294edc386ac762fa3a3b0b4bc28945adf21a8af747a29018bf76d3710a +M = 5c0781a87b84ecb4362b09c623d511de53c085671dd4f08e9a551685b55ddfd1 + +ModMul = 6b778ae9822221e6a8376379e0032d7edb14d7b5e32a7310897b54d1d5626113 +A = c4a5737a9496129a136753f8c2e52bbd2660f2d3fafe4ed702900b01c14e506d13e3bbeab19b357e5ba9fce8a4fc3dcc469406a16248d6fb53862781fd9d55e4 +B = 444e5a673eeb37fd3b4f6b6f5133b0f46c2ea532e1953da4a0e144407a8e2534c5ff40cc9af7756e5aff9df57d938fcedaffb868dcf4e458b36f506ed7fe0ce5 +M = 7f5978c0c066132a9bdcb00727bb802b72777b9e8e4265f76b80cfdc3a788817 + +ModMul = 5c717e5dd25abe60f761d6f9326ed056416add4c1384682d87b7ff12e112f855 +A = 4351965a421c75c5b4c251861e53316a300ed7983e27e17f9308420f0d2cb11e9c476294fcd9042a525bc1a044bb442d1d9f853c9e07245170e0e2711010cd1c +B = 4e1046647c362c8f9c414be54075b4e9d151c6fa0c3da40d90e6042625947ca2c9f20cfbcfdab8666dac5a15f6cda9d47b09f654131fc5addc07e382c9639323 +M = a6c789884c66c7f028099e0367b3ed86871277bf070c541ee12fc02fcb6181d7 + +ModMul = 4452688244f542125168853f1d444f96ab0f82903bb12a97e59f0db633edfd6 +A = 9fd1cc81981bff977244c044146918057ad06d3cc26edfb8fb4118ee02b959d45555f9507ffeb23c3688e29ccdfe5f583fa3761f6727573542bee8ab5f5b600d +B = 856e6a03b5c93fc19deea51b3bfe42c810c5bcf9ffbd08e2625eb209baf6a4e24943a3c090d89c1f70aea9f0128e511fe92e03715d917168c1e1ca77a3a8731f +M = 2c245d407a78903ef2b279ddbe32106e6333b6f44cabf87b8641b047c79ea06b + +ModMul = 375f8474ee47df6b9a038512002e56cddd374d69c69719d8d369232c64a839e2 +A = add40f1dd6d4a2414b17f0c628eed9a8f082f3ad1f34ec41935fa86b34d4505b22ea80c062386a9ed63f95c67e55c686f837bddf8f4da791f98b08c02f32d4b2 +B = dab1caaa11d5a208b7a6b7a1d6482a4859daaba5e3a77b1b1020e8ae62a664953dfddd0b47d40526e7a3c6a5363c6d41dd9f529fd8b58d5d31bb67e745cb71b3 +M = 4f506313a4f49873a405f2e5a6e9cfae9cd5e9f67b5ef900153366570e28a955 + +ModMul = 36fb0733a26902f0f8f11625305a3c94fcdfffe294eb6ccba110aa628a314df +A = 52ee1498bd6a1677db801ae2eab4951345a1fcf8fe7d38e3f28dbc27fae508d87c9958e02a375ff4891b88ee916b96331e7cc082615faa028f6d541b5ce37876 +B = 9343cfa074f50c20e8472f8f7c4a7d330aa30ee417ed8027a4c956e84cc5cb31d5411c14796d9325fceef79a51b5d8a4c89182ca273ab633e6a7b22a27352300 +M = 9d7c334aa33634f9f313b71b42476a3b627a6c5bb8ac1d07a8d732d5c087bd9 + +ModMul = 4a377267508eb045e00cea66a417112dac07545304bbeac6315625275b7cbfad +A = 19616a82b75b08499d4b1f869df2db8f71398672f3f97ffc6177a4a5aa913605ce8a6ab5f778cac508f0b3f2aa680b01ccdc57c0fdd6cd678a2ff2dcd7f01f3c +B = a5643a9a9fe3be4134082daae4ee7dfd85d9452beee856fd939d3be9788b6bebcf3571c67ec481ff9b20f70d23e82e2171b1d0ddf0a9435b40115d32aedb6811 +M = ea0477e7f1a02cb6c21171066f3dab69d4e24429043b0f049de660fc80e51937 + +ModMul = 7952dfdb91252658430e365adeefd9093740de92cfc9dd3d92294f2dab6ca0b6 +A = 8e6cd7639b7c134b53e6ae6ac5f51268da83ed09e8e96d65e4bb130dcdbbab9e48226ddba6efe93faa510bde8ee92f2a641774c4272b5a2f88024b77a2cfa110 +B = fe4e8109a49b16b96871e384564cc096277dad4e1bbca8e5feb33f140a4fb800c8f3096b1bc7042bccf249aede88e6055c0db609f94e214b1251eda494be724b +M = aa46853682af960824140c35d145a6dcff6283b2c59994b30ecf9b8def41a025 + +ModMul = 1aacec7f7e66b0cf4eb2dfda9d8d3fbf4eb8e928cbbc967d13e3e38612f0346d +A = b0fd7a936b0908ba6fa797e4b855d673ff85d665ef3a345e560e2c0049becf5c25b6c0068dd617ab47a8fd151939ea0631f86806ddd40e557933c0e880fcdd0b +B = 105c87fe2b1bf0be5405ca0d530beda1780f0045e892d7810f8a8abbe890f0a19de66497cba55bf38e190c52992467c22a320c38a4bd167f774ed812f1271d5a +M = ac4f0a2b22df691331ded955a5d0e7d1910d7920a59d4a87636b2635397b7335 + +ModMul = 2c25d180156fa7d2fc20c9bd6d9ff0b111c9ad76ada0784e2f8fa0bd06413f66 +A = 2aa4a0a73df11f4e60956619d0b35eaef45730d619f9b920298e6d369b9861f6411de28a34af038f288d7a3d6a35b10c8082b8ad0fb275a8f67c6832ac46ba9 +B = fae1d50b72feb25da2581829409391bf289cd9f730c99d265b5b2d63889381cde4adbf85c3998c2478f2866526b8f64605d75765edd09b78ea45337207d173 +M = 65c9d79a09a820adbc9beb152bef387c1439147ed50cef872d36a69f1c7d5fe1 + +ModMul = 56ec8624fc199e7b4e68358f88f1a99f1d4d02577b8c6f7e28e4ccfdd981f995 +A = b0a0f9d05d144d2ef257c1e63a7127a3b8e0d8b64ff8f6447618560593574b5c5da6258b274efc28da0defd988bef1efca0f481f809665a78954b36741d668bd +B = 10901b9dbf0016cbcc671da75a75b7a6ec6a66dd17b53a97344864b08f037098537380bfb0137b6becfc36a75206686d16bc4eb8fd54299494374e3f383d9b10 +M = 73882376ca850c125ce9f20c291e550ee48f0eb0d571109ab08c22d6719496e9 + +ModMul = acceebe131aa34ff21b3235f045bccc8a8f762dca20c1dd1ef6eb461ea971c6c +A = a7714b249eb0f0cbe3e6fa0b04e895fcf14c404876197defafc6b57026ae7e5e993fc47c1819581adc03860ce07f2b7877a3f6d0912c0cbc659f5f6170a1cb2b +B = b7278ecd154ef5243ad973ead291ea186acb63e09977e644a6a9fde195d1a33993fc47c1819581adc03860ce07f2b7877a3f6d0912c0cbc659f5f6170a1cb2b +M = c52ae49e1a4b21ec392b76844ad559653b7b9f67a58b3bba6c2ce250017eab09 + +ModMul = 62b5b04dc84bb4ee04934c03ef361bc6e59b42144dc117b9f7771525c67c3688 +A = 2b65f491caf0b5cd9c66c859fbcadaec7213e6b848884638791b1620d6e4bc9dde087af0e7329d3b15a45df2d43ebde61b053ad7f63917aa922d58b4f3222620 +B = c1bfcdb34b0766be980540dc3256b9ee4158310fad2c43cf24bfafca08ee185647043f5842a9d9eda224449259341b7c50998086434528d47661bf5762a7ab5f +M = f73398c32191b436d14a0b76c6069b1d61395568753c832dd0c707780a232dc9 + +ModMul = 5613c8fb0721bd3f605089def48fb2c38a4862bb387886c1edc1bc37d10f0e15 +A = a3d8b12a2c8f4021ca045a4e4903687dea63ee7e88893b1911aea77efbff00f8f5c7884cbafc71f59fa2636195c2ebee61edbf642923f34d87ba5eb49b06a7ee +B = 3231829c81b26dcac432b502ce22e126ab564922b1e9818cd3da46edc5ce7df026d0e515809c97bcfdb9666581efbfd364437ba9959dfad099f90472f97c69ec +M = df8344fa848d1066afe4f8d985cff65441751677dcf3a4e99b40365fc3c978e9 + +ModMul = 30325f7ccbc2c69e11d739ad7132a947c53377aa902ec70b152f3a75e050c244 +A = e4ba620125f58a63fe12fbd3eccdea477d56b120c76d5d1421bebd74e8686b4093f8169070453ccc04b63b173568385313a1d9c841a4aa82a61cb84d4286a941 +B = e87aaa990307855f8e5f2e5509d2ce31dd4b13bb7199cf5fa0593e350326e222efc33a26c69245565d6ebb5a484cfef7d2558f22dea8054d07831d536803d0dd +M = 43d57108eb0ab9bebaa8ce137628ea825951c6accb9acb7f1e991c93b8563897 + +ModMul = 1975db7b72434ad32c9aee412645f6670b7f4af1f8a424a5031c559d3e18dce6 +A = bd64b1db27fa7da4c92a4ee092f58a2a53ed0f12d009fe13b36d5fd585defe778fafea4a60e8fe567d03e9ba3b72b189e22504ae8ca6aad7c2ac0f44abca2f6 +B = b487d8116198560d6c5b08c7ce63b0acc0c98e6f2a8d709cf4e3a409edd55f64d72fc27a70dc341e280ff5a1b09fe131773d466cb31991d2db23a2a86d225c80 +M = 39d57af763eabe569dac1a103e169e6e3b4375168e41e5c3b961b6e743915923 + +ModMul = 3bbb5bde9e3e240694326571360090e1fc0a4ea7b2311c1e0bd3961f6c159385 +A = 4181ee3bf9a98bcd49eaea243a179cddbf160981efc720685c7be1dfeb5aa552685a2cd46f340e1e1da893b3b460692fa2eaf6c100f24a14f239e45123242d53 +B = 77cd04d86dd5da322af78be54246dd6b7af490d903db1db03cbccde535570b81c6053a84110c07f097540ffe7510320024b7bafb77e9e239761def76092e1d59 +M = f3b9833a303eb540cf8b6cbc3cf16394b1634ef517be57684e42d364d8bec3e5 + +ModMul = 2d8174211f0367233b3a8df7c5bf0066d6aa792be7cdc5e850a477454d5c829f +A = 1c08cec52d96136fbd9078b7b8db36ab63b86e19dd3dba7b2e3190ff566180e89dfee9423fa4e99be2187eda6aedfa86b9a45eb1e4655257315ae6a280f0a6ee +B = a8b4bc9647d8df9b7c76cc6d0f2248cdbc41f5da9c061f9864aa8415c9557582cada456cf23cc32d47d1fc1caf19d36b398019aac4734e10f55ce3cad419e5e7 +M = 7eacffe21f88413af94155a2a8e37f70a431a59653738afda04a1bec72d0d9ed + +# Regression tests for CVE-2016-7055. + +ModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9 +A = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 +B = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81 +M = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf + +ModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9 +A = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81 +B = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 +M = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf + + +# ModSquare tests. +# +# These test vectors satisfy A * A = ModSquare (mod M) and 0 <= ModSquare < M. + +# Regression test for CVE-2017-3732. +ModSquare = fffffffdfffffd01000009000002f6fffdf403000312000402f3fff5f602fe080a0005fdfafffa00010001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000002000002fefffff7fffffd07000109fdfffef3fffdfd06000405ff00fdfbfffe00010001 +A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff00000000 +M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff + +# Regression test for CVE-2017-3736. +ModSquare = fe06fe0b06160c09 +A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff00fcfdfc +# A in Montgomery form is fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ffeadbcfc4dae7fff908e92820306b9544d954000000006c000000000000000000000000000000000000000000000000000000000000000000ff030202fffff8ffebdbcfc4dae7fff908e92820306b9544d954000000006c000000ff0302030000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01fc00ff02ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fcfdfcffffffffff000000000000000000ff0302030000000000ffffffffffffffffff00fcfdfdff030202ff00000000ffffffffffffffffff00fcfdfcffffffffff +M = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_sqrt_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_sqrt_tests.txt new file mode 100644 index 000000000000..64c752b9073c --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/mod_sqrt_tests.txt @@ -0,0 +1,341 @@ +# ModSqrt tests. +# +# These test vectors satisfy ModSqrt * ModSqrt = A (mod P) with P a prime. +# ModSqrt is in [0, (P-1)/2]. + +ModSqrt = 1 +A = 1 +P = 2 + +ModSqrt = 1 +A = 1 +P = 2 + +ModSqrt = 1 +A = 1 +P = 2 + +ModSqrt = 1 +A = -1 +P = 2 + +ModSqrt = 1 +A = -1 +P = 2 + +ModSqrt = 0 +A = 0 +P = 3 + +ModSqrt = 0 +A = -3 +P = 3 + +ModSqrt = 0 +A = -3 +P = 3 + +ModSqrt = 0 +A = 0 +P = 3 + +ModSqrt = 0 +A = 0 +P = 3 + +ModSqrt = 0 +A = 0 +P = 5 + +ModSqrt = 1 +A = -4 +P = 5 + +ModSqrt = 0 +A = -5 +P = 5 + +ModSqrt = 2 +A = 4 +P = 5 + +ModSqrt = 0 +A = -5 +P = 5 + +ModSqrt = 3 +A = -5 +P = 7 + +ModSqrt = 0 +A = 0 +P = 7 + +ModSqrt = 0 +A = 0 +P = 7 + +ModSqrt = 2 +A = 4 +P = 7 + +ModSqrt = 3 +A = -5 +P = 7 + +ModSqrt = 4 +A = 10 +P = b + +ModSqrt = 0 +A = 0 +P = b + +ModSqrt = 3 +A = -2 +P = b + +ModSqrt = 3 +A = -2 +P = b + +ModSqrt = 2 +A = 4 +P = b + +ModSqrt = 2 +A = 1e +P = d + +ModSqrt = 2 +A = 1e +P = d + +ModSqrt = 0 +A = -d +P = d + +ModSqrt = 0 +A = -d +P = d + +ModSqrt = 3 +A = 9 +P = d + +ModSqrt = 8 +A = d +P = 11 + +ModSqrt = 6 +A = df +P = 11 + +ModSqrt = 4 +A = 10 +P = 11 + +ModSqrt = 5 +A = 90 +P = 11 + +ModSqrt = 3 +A = 80 +P = 11 + +ModSqrt = 9 +A = -e +P = 13 + +ModSqrt = 7 +A = 7d +P = 13 + +ModSqrt = 6 +A = 37 +P = 13 + +ModSqrt = 1 +A = 1 +P = 13 + +ModSqrt = 8 +A = 1a +P = 13 + +ModSqrt = 54d4cf0fafe265056a29016778cea6b712bc66a132fb5e6b6865e9b49e4c97ec +A = 599c10484b22d0b5a115268c7538ca99b3253a311a4ab1ca11c3665b0bec393a1167d1ad94fb84cb2c7ad7e2c933e8f613bdd08fe1f1aa4a9b0b9de0c8a7c9d4 +P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 + +ModSqrt = 38a7365a15365e911286c1be2a7afe76ef390234d76269e04dee17313f6ea54d +A = 1c4aabb4d8369710131c664ecf2849e963c1bc31d66e0b939bacf99a870c71f24ed71bdddcf566f3908271fee43fc1ebb51eac7e3153efae641b49d2e796a12a +P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 + +ModSqrt = 35ab18a560dece04725667f640ca61d1d59f14d191f94c79f58531acd097d444 +A = 685168ae855d60eba220d803f5296459b30a289580668db9ed51bca51cc2d453a937e13819ae34f7a9a143ac96d17420c53919167e46279b562b550be1cd9abc +P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 + +ModSqrt = 288370029e87024175e5bec0eab0929179f42e16995e7f6194eefc61061e54f4 +A = 2a14ab77c045bdc48220ba9c463e1a4b4049cb01edb53be0937767eb2ec19b7d719855052281250a36a0b76d9a5d967d0756e1ded7a052f7056191ad66bcfc9 +P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 + +ModSqrt = 32255cf01dc943577ec2bcb221b98491d7a1130d046d6c68e95fedff643ce3a4 +A = e26f6dd46a513a1dd3fb14b71be1d4c9e9d79eda1cde10ea4d1eb8abfd4d5857572205e247184dd0cbefa37b5c0bf680ba2bd28c5741f725cfe2aae37419baf +P = cfc4ccae35458ab5be1a1bc0664188253301f8702af4f8fb19fed12de0c653b1 + +ModSqrt = 5172345e801ada63fbc4782e32583cc3b4fea88b9e6dfd542f3542f8538ade66 +A = 40dafa8342b302bb04b1f3ddb3b9015a8fc1b597857c115b40631c7be9e22de89358fca23b331596ee5ff304dad7811e6d8e8822f7aa533c9e7c882634ea550 +P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 + +ModSqrt = 4dcf63c423bf0e39aca2293d57f6792d023db649d6719fe936446904b9f7e60d +A = 5bcdb514bbe84261e169203e8017909b60c9bb330400c766ee01b0189378e70e61867a164a12643ddc9e94b61e09e5b158cbe85be228a3cc48f95a552958b8f2 +P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 + +ModSqrt = cf77c5c2d12a500b75cbfb1f3e66ee75d886b9365cf4f8b4d1bd18a6be0f387 +A = 4652ddc2ea7b460d8ec3c9059b8f9b5dae6cac55b51f2ad86fcb336b25235737965cc515e2ff0b54835015b7ebeeda6fadd986471d8cb424d309fc353d1e269 +P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 + +ModSqrt = 1e0549e4c5a26023e9d24fd8c67419960746f82b1ecd113bdac66f570a475d87 +A = 5f4a6d450ab1390d96ab1deaa0ba18f897cb63daf0c9e1ef6c08e804c26b5e842f6c08f13db5d4a6e88f07af2a3cb04fa06fc3e59c410b9356f025ed81acc74 +P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 + +ModSqrt = 144481a781d831c1ca046ca9e322d79ad4d2c6dd9f780bea9d1ced9cd20b7b23 +A = 4c254fabca441017132b9eacd4ca40a336db3e5c09715773fa07af095989a91cc968ff07a9ff56ed06b0ce0c5269f7b2ab68564ecab9f4467a7e96b6cc6b21b7 +P = a6813d316f9aca30f98b4f864b8b4b8f51493af930bd4d3a1b205a710e99add3 + +ModSqrt = 216fecc7667f488a3d2d102a38b46b4860ab858300b8638af4f34e1103fd73ba +A = 17878f8048227573a9d70f53c0e76ff13fe9f56e9c984c92514d3d13dec23c816661f0618d21371b80dfd885cb59551bdf80046f65f22ea9b89c78645a6e455a +P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 + +ModSqrt = 458e5e789ccd2417174f7e30bb31914b9656bd8cf2b9f5a9752a8737a67707bc +A = 5c7d39a4bb04e69201aa519f80ee7e62ea14ca55e13656d1da3f45367e2fb2d061aa2940708d02ac67d35cd2ccf54a1bf95bcbc759779e692cfdcbb3aa1a05b +P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 + +ModSqrt = 543125a16c2bb8b8f8a2c39c497e5224ec77533602d7dbe24002e32dcbd2ef1a +A = 3413afae333b2ad9ff45c7f3c7e5934b3127e8b1a55225958ee6ccf42423e81559bf070ad3f3353b78c0ffd41475af49f59d268ef78bdae879f5155e8d1cc07 +P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 + +ModSqrt = 10e16859c67bdb2eaab52a7c847dbf37162eda258a9f6262ebacfe4cbbbc1080 +A = 21ce7905894faf220bdf4a82a2d855994ca2dc9feaecaa53c7f146e1f49934215695e9bb46ba370b7005a90c399674caa8969eb442e7914d90f749774d7fd194 +P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 + +ModSqrt = 32a00586adc6f6cc2b1a04e1be0ab569fde235e1436c38b6af92bc5ebd60bc1c +A = 350da4fd8cf03c12f7dd6ac6d3ab801a3413964083e374662aaf878d6838b97d4feb9e52cd307a25b113e101661a865463ee2480c626aa4e2ec437d72e7bae4c +P = bd37c850cf7d702bac879f3c21a51a5a4df2b8eb0935861e0753a6eb62261a95 + +ModSqrt = 971f75bc7afa8b4b50f1d4b05e52deac7d4836a08d30546f29649bf1ca6a247 +A = 655ed4c5d8d0afb4f9360372ee1ef1303898d2423e585108a3303faedb55064d2ef25666ed4c4d71fe6063fea1f3142b435714b0e30b339dd791d347c884654 +P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 + +ModSqrt = 48fa882b7cb6a29de9e3769f72eb67f1efd4d2af56f0c7e410c610efcbce2065 +A = 14f3503f33b243800eac1defaab33e04c01e80163fb3efd03860970cc016832431ca4fc6d1b760f4f40166b0b8b3c40dbebc81460cc10890172243770338f090 +P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 + +ModSqrt = 236fd7e397ea7f8bc2a288eb7236ca41936fa702b7dccca56c8852e147511f7d +A = 1bbd0980feac854782813bcde4da85e8a054549a1b515e065da4236528035e756882e29e762cf60453e375cca9dc6ff637f9558bf86646e3b928f68f82af7efe +P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 + +ModSqrt = 693f0cbe8c81b0afde0cd2f83e53795dcae6b0cc4ba930ab5c752400d787f14 +A = 7b20f9664b23907e152ab8c9a907f72e8670c1c38ab4cd1411ea7c2159c09aa131afe068929b8e6ad1409b74c04975180d1cd0a9fa74e923c3fd451e8da2c34 +P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 + +ModSqrt = 4a086c50b0bad576501ddb6280743b2c9d247841eb7f14d90561432ff7dca6f0 +A = 4367431ec0cd0d7626538b93a090c30fe0c97c18ca03b97ddae304b619112b5b4d02bf0f041fa3fd673f9ef2ceb07eb2079d11c56dd903b1a87e8252a97b8079 +P = 9810151ad4bc9c5d68fc326395b509f2625bfebca1c3801ad4da7539fdbaa6f7 + +ModSqrt = 18f8433fa468d8065157708f1f1e53b8e31d39c6011fbc2bad93de1b5548e19c +A = 739c032bb4139c199c40f548d37234298772e4ccb9d3ba28412b60ad23b4c465b0787e2382f1c5a4a87af2d20eb978b7dcbe73f2112249477d15c8a85e54a79 +P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 + +ModSqrt = 49e3c8eef5e067cabd51a7c01384ce05ab8f4342f655559d8a689eb7b20e0106 +A = 18400c2cc3e06b99b4e39c77b9af5ff0e9c683f1708321afa4cd5b6988d13b36b1d9eb4379b7902d9ceb40c03f814b2b6a01b90509bbb4532f13ab1571c4d04a +P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 + +ModSqrt = 35548c530745f440329325cc8a5fbd90c16a7f0788879a4869bc4d4f73acda0e +A = 181a3c5ab02566e7166c4d6d2f2bd4a8ecc25991a98d270bde80cf4332766a7068b14240bf5f5dcd45e90ef252596da3eb05b11d68b2063f7b3a825742593ca9 +P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 + +ModSqrt = 1ab7046e6af061ade5f9719008fa4d989007e2a579a134a5b9f19ec410984096 +A = 1008a03e211fab0d45856377079bc96b0776c2d4c0175661f3493246cea2ab0a02a706c85314fb707ad9906bedb2cfd577d62092ae08ff21d7b949373ea954c7 +P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 + +ModSqrt = 2be9e3e7515960d90f115b89f60dedc173a73ce163b4036e85b7b6a76fd90852 +A = 392053a9f0100540a8e1a0c353e922068a84dad3a4a8e8962fbc0bee2b6a06e20d08ade16eb1409a16acfcac3db5c43c421505e07035ca308b15c4a6db0864c0 +P = adcd56924f73836ebe4dccfe006ad3b1e5076562cd11b161642cab7af2284659 + +ModSqrt = 5b301bb93bdcf050183107e36258b53b4805918114ea1c2227b0911d5b4dc077 +A = 55e55e5f94dc3d7aabc921f6469d85fa2e1e92a87347c57afad5872306ae69f9fb99297d1e3e793dd9e8632244208154de5da7114fd876383bf1422f7ece024 +P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb + +ModSqrt = 2df9609e2f5a5156c3260461b2ee52eacdef00bd8b091479813143a6c5283f71 +A = 2099325b7f12fe77353ddf3f2b2c5ef77b49671b150af954cf84e9675e3ecde3e057084641a633d19533b4712ab49924c8b5c31d591abcc88291f51253fa2a7 +P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb + +ModSqrt = dfab751710e9008e25e422d1199d6fbec4dc7fba35b4da9d225a746eb4126a0 +A = c006af53d4737fb293584df6ffe2e4cb3fd8dc77fb7c1f13b97bb9c249e3ee5fb9feff7488265b3093906c08a4946f142ac7b491937d24bfba6413366ce371d +P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb + +ModSqrt = 26bc030008d6c60a09fb0e16093a649fcb40c6c21a8e2da2353ba4b07c4f85d5 +A = 1eaabcfad2ed349ac9356e6f4da0b301266ddde811cb0f817aba8f5c10fb8b8ba9d0ef2dd386b668f16eac296118fdb8cb7afe1b865648c81c2fa3cf21f2711b +P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb + +ModSqrt = 35051b1482ec2578f3dc0000a422cb5111e43c37f1ac20b1844d3de2128c4556 +A = 315ff9de178681116f2a5fa78eebf4818e1d680435eacdfaf9d0e5c4fc01fc034b352c82fd52c81ca30d68864952dacc99d08269c9dd7ca99ccf22da98c3840 +P = d43280ac150f725f4a2a1dceb1c79bcac57855a4eba72ae93762d09bcb2444fb + +ModSqrt = a5474252885cacf004c460a7793ff0b0a2187bb1a9ed700ae3470199faef71f +A = 19856fc1351c4b02abf573bb2fc6ff92355fa369d62bb8f2260fa772fb1693f509a56cad661930abcac049dd70f4b16bed4a4c172e73e772504c9990ce7f92f +P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d + +ModSqrt = 12daf4722387ecf47de1b0b6b110a062dc5ea2685bc9dbde66b8d15622985029 +A = fb8479787069116abc42abfd7dc0c24d2ad04fe0c04b42a6dff714af715d17e0fd77855f950f264542b06d48e8818de813ddb7975798b7debefcdaa5ff86beb +P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d + +ModSqrt = 397996ed5c0ac6ad32e43c337e9de421b87774cc162bf7ac7bbedf4a9029255e +A = 5aa04353321bd2de92481be740357f979da464b53aa39111fdbb734cf7af6b3857d1baa08d3a126a3dd34a2fbae2bf2b84e900686c1d31505b390185acef5fe5 +P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d + +ModSqrt = 2cf4b844a54ba359dc592ef1b49f43fcfeae84d1087edfefdd0b9174b43c0a3c +A = 365a8650510bcfd8fa87432f167cf487234c215857403b9270b5eebeafa48cd6da47fd60dc311b94d1d72baad0447c31f0b212d755f46c256e16e5e015e6546e +P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d + +ModSqrt = 9277c73043ff767c3fa606f0cd66b9d854a600c8c18287f191ce277758c3f31 +A = 62cec3901626d03e8df66299a87c54b1f7a55cafc99f0b6bba1b5d51a3d2b7d2171c9135a9d8a5346d436e0136b12e515e703e3cd84ecfe154eb94c6772a6d72 +P = dc315fd52684fba79e577a204de9053b11a5d7a414263fec9eff6ff62188829d + +ModSqrt = 4189e5a90c1b1abdc1c7c05b3587e6f362e06f927b6cf5f0d271aab3d6f90765 +A = 336b8d0f9dac842c696bc020f49c6aa023842c16f2052eb02f17959006554ca0012042c80c72590f21c6bf5a3714c9cb552aa69730e33db93a56a909b273f39 +P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f + +ModSqrt = 36ccd38cb5a6bd8a73bca55936a2227c503664422c2296faf7e2b1c6a375a43a +A = fecfd60a376befbe48d2c4f6d070d716d2f403cd5daefbce62b720df44deb605162c8f20f49fd7ec30d4f8e70d803d45b3a44b5d912baa3410d991165d7c507 +P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f + +ModSqrt = 198fc8569be172dc9b71023ed3d42d2ba94bae4099643f6517ab03f540527fdb +A = 65bebdb00a96fc814ec44b81f98b59fba3c30203928fa5214c51e0a97091645280c947b005847f239758482b9bfc45b066fde340d1fe32fc9c1bf02e1b2d0ec +P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f + +ModSqrt = 21b7f74c30ded681d6138cf8e6fd798f32a049e94138e982f1845df3dc9e686f +A = 9a30b791c1ba4f394b4e3dcd5837e474237f4fe8987b255c098a47b2c14c598ec69d2beae444dd4fe9c4ede8173d2b187677cc706a3c28f3b81627d8a5fb6fd +P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f + +ModSqrt = a1d52989f12f204d3d2167d9b1e6c8a6174c0c786a979a5952383b7b8bd186 +A = 2eee37cf06228a387788188e650bc6d8a2ff402931443f69156a29155eca07dcb45f3aac238d92943c0c25c896098716baa433f25bd696a142f5a69d5d937e81 +P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f + + +# NotModSquare tests. +# +# These test vectors are such that NotModSquare is not a square modulo P. + +NotModSquare = 03 +P = 07 + +NotModSquare = 05 +P = 07 + +NotModSquare = 06 +P = 07 + +NotModSquare = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951e +P = 9df9d6cc20b8540411af4e5357ef2b0353cb1f2ab5ffc3e246b41c32f71e951f diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/test/product_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/product_tests.txt new file mode 100644 index 000000000000..8b5962960afe --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/product_tests.txt @@ -0,0 +1,1014 @@ +# Square tests. +# +# These test vectors satisfy A^2 = Square. + +# Regression test for a BN_sqr overflow bug. +Square = 4000000000000000800000000000000240000000000000000000000000000001fffffffffffffff8000000000000000400000000000000000000000000000000 +A = 80000000000000008000000000000001fffffffffffffffe0000000000000000 + +# Regression test for a BN_sqr overflow bug. +Square = 40000000000000000000000080000001fffffffe000000004000000200000001fffffff800000004000000000000000000000000000000000000000000000000 +A = 80000000000000000000000080000001fffffffe000000000000000000000000 + +Square = c2fa18e1d110a4639781 +A = -df6a253c3f + +Square = 4805f01d379f4ce8dc86ed269 +A = 21f253ddb5a6d + +Square = 57def107babc1c2bffeff858947e69 +A = -95fbaee5a09c86d + +Square = f3b01f7941961b3f5cc3361e3ac82423690 +A = -3e71292dd4ad3ed3b4 + +Square = 5e2d9c36d498ad1e8b6113f442ac513eaca74601 +A = 9b45cf6c7a43d910dcff + +Square = 7b7c2eb3fe55615e422b41c6f725341527626398cdee4 +A = 2c7314e72a2ffeef170de2a + +Square = af57c0ed328886642ed5d631b375fc89c03a99f1b427c6bbd1 +A = d3de077f8286a04daa9c497c9 + +Square = 4d9eac3058e6cbc0d12e639ced961c02ec1870afed62fdd44c67ce4 +A = -233da7e87ea4421ee8fe7e00c856 + +Square = 83c292d277fae28cfede74e8e80eba11dc132e16f78cdf64595c12c7dee4 +A = -b7a8aa7452678abd45d2ae6c349e2a + +Square = c80e07dd01f9d19a5cf7f3c328ccf4de70fdd113de69382701294dd29674b9a90 +A = 389387eead58fef2c76b5cf920f35c5cc + +Square = b9f69ca47ac855830fd7ed39c81822c520880c51c3ea60d3ccc106db37fc2b04c47831 +A = -da307c28ea67ca8d3117364ba93f0731bf9 + +Square = 81bbe3a13a22a73778233294ba0c132d9dddec111f768300f177468c204f8eab69b98e62d99 +A = -2d8f715bb32d410b4f475c4d000d56fec7cfc5 + +Square = f815ce34e9bc2e31e36e75cf49b2d15306d438a2a713b2a85b3ea156ba60c867c28cc65aa58fdf11 +A = fc02f2e1a26cd69f6a0e54cca4bbced739b43597 + +Square = 5f968707f58ea15c492ec9677be09c309d91164aafa754ab16ca47a411b5b2249858fb6f96135992e8a04 +A = 271b8eae3e96cc4900d4413d6c00b73736a5d89ed7e + +Square = 4aa616aabcdc7ad48dcfd40d71e00a3789bbf549ff39b3e2ebb52017cb56014941961a5a6d52d7a9980fc99b49 +A = 8a3d3f15e6d7d2130aebd8cb99767defbe4c7704e3c1d + +Square = 845e46db8c40f3f6f6f4928b5748618f021f9064c6522bcf2df004f8d2105e90cd354785c15a6cc32fcc77da2ea3001 +A = -2e0543ac8b8255ce30253cf2047a0ff353dea55a58551801 + +Square = 5dc5706dde9b326feb79941f08bd296ec3b6fb67270516b70fad9921438b9175f395310fb756b60d72d8e73e84ee8673cc40 +A = -9aefd7dfa709dec9e721f5c22867229435b2d6366462d0e438 + +Square = 63dc6565adba27974a66bdcc626596e16cf399541d679f754d9063ceeb320649bec09a940309dd1eae5fbba0b558939afae9689c9 +A = 27f8e071f70b0053d70eca9c6d1e28303b8da2d3c58083c2cc45d + +Square = cf2176449bb8b215fc37288b904ca27d5d410780fd054d2a190a94b405f6aa41970b41ba3cc43eaabb97c2248e1e21457949070ec0f6a4 +A = -e645c7edc27512d4b3170d3c5430d0712a25c13afcc09c9b30bb11a + +Square = 43194e5f12e828db6735824c194985108269ddec12c49a14658be3c2b7d298c2846da1aa3ecb7064e73c317af595601de59035faab6dc0fd911 +A = -20c3fb73a03217893fd4a9db6e53a3d83a8414d900213d0460dc91bf69 + +Square = fcee79e598f061157ca9416491f2eb069bb95a4d78a1d0538dab5c8008653db71b90ce3139e693ba284846be7b75d6b7aa80228420fe75599c12f090 +A = fe760dd61798c8f78e52b328fa27cfbe41b898de6e6bb4f4a684f038b5f4 + +Square = 4f0db9f9e6eff9fe7fc938f6d6f5e4fb017ffea0cea0f7c57f4fc1e5b2bdc00a1cb9c1e6c865e53309b6b73c4339b0bd485860ca9edde3019804902da6b61 +A = 23909968dd5d139994fe9baa0a7bbfa009b013df3859ff294c5872366eb7ecf + +Square = 4441ff36d785d18208481470a5b8ba8cd65a45436c39190dde0b8a2b7d00bf67b185d98ab5c4a7853423778d6333abf6b115dc9567a9f9c71916d3f9db3af82c41 +A = 84307277f79cfdf33d83d7093f1fd8aeb94499a7075ca32733b68fcf88e819421 + +Square = 50ee0dba369b0fb61d75706652487ca08043eee712ebb51399122353f77f13745ce2ef0d8f0ea7b3fd94e928b0b2b42c2c9141b5697b13b6d1f3d66c6a9186625b87e40 +A = -23fc02d45c820c3a4250124cc457fa3886beabb41d3c1e26f711309604eb253c6da8 + +Square = da11876b316d4891a2d650692ca776f77afd32a1db08f591c9579fd1053a4a46cf78b4e4cf417eb99eb067ff701dbe3483dff22e7878d2ef2b234244cf7a29d93f62d6d6b611 +A = -ec463653389de3689fe1881679b83ca65134a1498a3543168dd4833a51b23edd3fb617 + +Square = b342b4aff7e5bad38f7f532f0f32a3672f7ea6521d23652fa09ef7aeffcffe52f056ab1b54a0f3a2147f43330fd199d1f290988c866f61360dc4928c84b3dcde8f395120008472100 +A = 358e27805e2a56195fab2ccbe3f931a4bd14023ee56c8a191697926f387c40decc578cef0 + +Square = bf4045fd680caa514e9c410fb4404e5e3a381abee023d5b509d6dc0b97386421f55090af8bab5ac08e9b2eb8a36a64c55960be9179d564c5429f4ec595d03d12111defafb7359b418902b1 +A = -dd450a0fa0914f0d65a1b555baaaf9380eaf8d58b272bf9d95435bad53b01337ac8de562cc7 + +Square = 86abcdf183ca059257c2f6bb91efc9853f4ab42801d3cde88df72d4c904be184e93d6bd1af6fc21a6836c93c4e0a1f728b3722d568572f7ade418274ef2e6ac3463c5cc50990f1017e01cfb91a9 +A = -2e6b4d9eeede7a72b8d0fcf6429c7e30cf291352e1bb43e92c14236716aadc02c02f75c7e6aa8d + +Square = d5f37112733b097cab2bb11daa3d9481255060abd7bce42b752a7641a98e140922c375fcb68bf13d4326b374eabe3b01de0f8f6324b7b3e4142051c02d2f18ae2e748cf3c4bcc3fe157bc94227631d21 +A = ea087236372fbb01b80e57b1ae4edeeaa776355457e18165a5dc60ef4b6ddc0b127ef494dc44ae11 + +Square = 9e4db7885fa5f928ef236f99df3e7c8d17a5a21983ff882032817edd5658575f443eb9c5c97d95ee798a3809cda76d7a0ab9fde757a310e2f5cbb299ab88e92a5771027ab9f26816c02d0c97894da5976ec90 +A = 3253d712d4ada4c12dab41036fcf79b02e80d1a632ff6ccc44d3c1d08467a019cd6221507459b231c8c + +Square = cf9c50ee8773ba94c9e943989a35513fc370adc3622beb125252bb92ff9b258b81a497700e3bb15bcb23a5b3082c095f7a5d6eef20433d689c20a5427b661d43fb0f9b7d1b16d1b73b8fd59ed319a26c5eb92fce90 +A = e68a0812d2de2a922f24c4e63b4c33e62f93943b7673e900d12405dedd0bc2a906daf8b4bc336bdeb52b4 + +Square = f3aa49c906844692d3bc0cf101adcba80351c2e744be01762a8c24804a9d8d5a4cc3c113ccf529eb79cb3304aefa74178afa53f235c5211192d4cd8610c3b42e246621acb3e5d1f9d86ff39a20a7fa9c568356de5b86919 +A = -3e7069ce11472563b0dbeb9a936884df66db83273a690c40e5d3b5f8926fb502d3988591abfaea7b7bd76a85 + +Square = 7c9a5057ca8095cdfa289b2d60eec80548f9ab2f3a996137ff9be403b529c4672e003d1eb074c76c0086e3d875cfbc90a40ccb61b799cc0401ba160d8d6b6ee46b2f14ed31c83de54cdf83458dcfc01e3234d9717b5f2c7e5079 +A = -b299da84ef84095d8191fd1cfe847b960729a3d1857082f05b2fa30ac45e90d2fdc778013b023f38db2c8e780b + +Square = 488294b528e2c2da0145217ec69de2d021ca27f145f7321f06c03316fcc14bd4a9a900bd6a144086acad6d5ad32a6245f5a655e007742aa336430c6bfbe174278884d19fd93916ef57215069268ade899cb92dfed29628327b84d8240 +A = 220fa6eaae0238e78a91e43fd8c2fbd5db0c8501cb96d66265c8edcbd376814c39e4a6f21ec9a6472c6abe8c04818 + +Square = ebd685edd991dd5180706b72ce20ec4f6c5d9ce038cc8768f2ae2d0e676bd549d6d3f97f6c26f6e36bb664e8a7e6102192bccb354c024670085711db30159c6b7badab7c7c0b91925675ece3e23126ea6feaa28e977598a890e4e476ead100 +A = -f5b657cc38fd11ad2f1b188c61721b5ec6c9762c09dcbfac3edc1f07e675bc058e77eacd01a2b4139b1b00c40a6cb70 + +Square = d1b3ac1d7042c0200f80a989e053dee31cdddc835889a57482a0988afd82b0fe8d3667270a72967401c3e8d80dae349ccd4063f11cb24dd7f9a5aeaaa7c0bd7bf7991367b0d7b4d374dc9c5017da81ba39fadfc3b760f68da95ae1eaa2eea3fb040 +A = -39eca1bf5e4807fd6a9ccc9e3138a6fb390b10a330f0027f0ba9868beb77c93160b623de58054a4522183fb3e4e2d86b08 + +Square = 41c5e4bc851d48673e0a16336f0decbcb59dad36959b310cd1a042d24de00c587db47058c2d91d7f9982bdbf470c73f86e591a122b3fda71796e465513e10e3cdbd5e6bf035595644d588c091e23a57cc47b5173743b0dca965902918d61875f88735a59 +A = 81c2caee75e98f1822c854448302243feec55a5247bba948647f12d7e0bcde4b1dd6af63eb1ef948eec22a87d2f3213de75b + +Square = e712c3705ef2779ec997c430f1f8b7689d7edbf2daa733dca89612bcb298180b882cdfe8e5cc1104b9f5d6d8f0978b46eef4f297dcc83fce4c39821ed3205e399328d69ad484d8b3189e207193203ef79b763f5e11778dc24839b4feaab291a0464cc66edbe10 +A = 3ccdebe5106ff5642b4ac0751bb799c27454f904fb72863d1055d1412b2359120ad196b768f6137dce4cb85cd29a990838a95c4 + +Square = b5063c05ac122d0d4b1e0d15c913f70f1309933ba737fccbc02d13a6c712e7b75fa757ac0e4fbe65977f17bbefde31c8fcf51f867a698233bf25bbdb1f03c104dcdbf1173886a48eb5a8b4d27cd841196de0b53466a3f1d28500fb4dbcee8d3458662443eb2aaa5de9 +A = d745c04ed95d4090ed66784339202f9d0e57bdc1a6f6b6ca09337153f0236cdf99b61db85604791b3a373885210f6aade8530c8d3 + +Square = 974463573c968f1734741dde2a800761fa749b553dd6499b920d3af9bab73a87f40c9cad39c51cfabcfa0895f1970281af063d80f89f4103624a75bcb0d23f5ef6c1cd9a10930118e1459ee8732728ceb7961f7d83cd2344a51e6229fe708bda46382e142706137facf7161 +A = -31323f98f0f73fb66e541471774ce0e0fff53d69b2b726480b9ec7b0775b345ec4ec57c4334ab8ff4b388f4c7fbdfa3beeba0f3e0bcf + +Square = 673a62011d769ff0333f69f10f00b28781fece47ddeed25fb0bf4f8d95dde4efff60690076aa520ebaa3ba63e6d445541b9586241141ecc37cd75b178389265224533055ec82a393e5dd61640d3f442adaab917c8fee1f8fc0ff8ca8d577e1d2d976c2a8b873f699aa92c272c164 +A = -a28fdafefdd393f993a8fc1ae321e420451dd0c5071410367d5a911b2a3a668bcae4452e134159e0b1974505f99865cd97cdb020bab0b6 + +Square = c4f34585a29667b582a3ee69b1a5f6c04746d105a57bc92763958c5add45c64b5c1cfeb1a321fc5194aab818c92ede5408afae0a2a74ed4c7757dae0bcc602169a805d525c5a63ca97391a9a7987a3eaf04bc44c89547c5d312f7193fc571851b1a8f8f091849f649ae91e15a050f5799 +A = 3822b607fccfbf0c5be97d4358bc682784e6453c71781fd3eef9d247485211c55d742279a35bf35e64ba8ec8cfe20dc0889688e2bc81fe0c5 + +Square = cfdf0eb68dc27d60840b8afa8daf96bf831002dadb2801c5d6f7ca558256bf3c7c5372fa00f2b3e300287745f8664dcf8e679fa35adfcac93839cec53b349553f31058a4db05af40b047bb367234dd78717aaeb80334f0deabb09d2d4d90394ec28cc3589b0aa78cf227ce8678b8bb5cd775e9 +A = -e6af13779d5a5eedfecb7c4d34009affee1f0bb65934ea9656ed6eae02271ac8a29104439000650a3a8cd7fecb171a7154c0e2bb2b1cb908cd3 + +Square = 6ec1b1333481c37be059ed7e088c862f869bb559b34360781f7263eeb206a210b90321aca198aa41c2a79e3a8d7df4336c75c87ba2ed4b02052a07b234afd9d2cb55413d4296645cd0dc8f987120acbc82fbfb089190f50e55eb1f509c86734dc14b2e8ae42ce880023dc7a014b02727b53d0e5f779 +A = -2a18acca3306bf06fd90da4ec2cbce995fb08beaec6d1cf4b30694d682c83e04b39f9a569eec52782b9eda7db0680165c77a1b0f54a1b995f8bd75 + +Square = 5382be4ee86b9d80dc2d4ec58606ac538ba7074d57e2011346f0dfb9a9d6677fe015e4015ed607906e9068a3c5601f0bb77186a9d147416ac68e344318cbae5c70c437c5e1dfc2d6c3c8725198937ac2d8e796f749bfe95c7fe6d0e460a633be2d86462d48290a2f8b344ebcda2f6ad353d6fd5f3355d819 +A = 9236f7ad22da9cdd8c187082c630098bf3a558b04856e876433c570a63d39863416c9890dd089f7665d6ba073b2ce90f88e7d04af96f1c82287903fb + +Square = d68e15e8a46e001e47022daf63d2b33fee0f9d3dfefe9d204b0de6daea31dca4b287a60827bda9de2860c433b77186aca10bf3ac1d02a204ddf8bf070c3c20ea69d9638a865c8843e8e63211951e10a844f8527345c5bb5417e3301a19c929e6fc48902f0e0be8e393ecb3fe0e9de6188a72d102fbae846d05dc1 +A = 3a973dd50d4239f05d86ba25ee6ca8f8ef46424951a8bb89e7d1d6e066d6fcbabb3758ad9e1647a440e51976c0ce628d78b59a4d9e42fab0c723182b31f + +Square = f03a448bc7405d2d54c0ea1a9016d8757d4af893024e542df80fcce448491d07a4b451d67c9e7d9a6c7c5a6155bf156d3cdf8103162d8e0265111655fc0ae46f4be944fdf275221b217274357977abf64316615dafb6ec84c5466f617c4e8d9ad4739f3e5050e583892db75366a4a7d2c4558436ed036a79084c7f9100 +A = f7fd0a9634d14d540daea21c7b804d37de49b7c13bde85c045859ddae1dd3142994e385f455becb7ee30576d55d4dc2f3d9d82e86032e170da1730b2c8a90 + +Square = af945dc2241029744548517dfd7858d42097076b06427419e74ab08071a23aaaa1f5daa6290287ce8e832a0524ba5581d64abf054408ecf6ed21a4f8289c1e4c7a8087384d268a1ccf7ed40e74922a619b5c1f2c08d810065710046190b7cfff33d4f67e58927477500eec54ba4f63a57532ed10c6b861fca9d46bfc3d32640 +A = -3500a8b6d244f1a21e10de7cfbeeb75d57ffa62e9dfbbdba8fe93d17488c56dc89787f13e660d0d7c7755242f8412d00988bfc7d3f6704782324c48691e7ca28 + +Square = a466e34dc7875aaf945c088bac23f3347a41f7cd039b0c9120c2517ada94b96bdd72d7c9bb55539af12931a3a39f6e09a4cd4311fba57dbfcc51bd17b03905e2560275c8bb3d786defeb131a634e86ecb793867355b048dbaf2db8b654a4d50aace6bc9d60de6934ce25ab58381f6ddbd1c063652e283c30a2dcd61d9d776d60e209 +A = -cd26a0c3d84e83d9f14dbe95cc39e3ed2e8861b76f4bf55ab120ea636d8f9efb0b6198986eb52075108d0a5c6ae0ee762f834f3db802c3f20bedf938f47b8bfb03 + +Square = 9f3f4d5110ea1bad21fae923825ba869a9982b753284f1946edea19f22cf0a49485b9336a2af7df8bf2641cb2083f4dce82202162d85a5779a4394213bf3bb3e47356bfc1150e66ddb6cd945092c9af14eeefd2d08b76c5e4a585ed8ef39202c42dbbceb25697f22f9508e7d954d3c1da103818aa6f63121f895e2c26d3d7463aea7ca749 +A = 327a2f6607c41ce920c14e9c9e8a059a931d71aeebc3e05e93107265a2810ec286819a4b2af9d2b70b754bdab6022b10ee6b81b32a7382cee99fb2bbcf6fe85af05e3 + +Square = 50ac4c46f2014a7a382b0d5ec9db4a67f34ffe9fd5410995810d3ea8d7d87d47442d0253c7eceb1799272bb5f5e7bd63174959f9844e5b4b65b6a4920166d83d01a5c2638b4d3b6db7fed99e28b9128dcb7c10be539114c5887842f8e5a7fb743298ec9642e50bd0979156cc6aea9ce802a0c1b14a2a1b7afe28dba534c9933209f14474b6e484 +A = -8fb585e01a0c62367dfa8a1953e553476b1564e843bdc2c5d964864ab2da56e0bfa7f5ce5b7850398451619a061de02ffbe0c336ecbeae818d32dcd40355fd11a7a3822 + +Square = 9214e31bb62f62a7f92d6c7f1453bc4430595a1765b7223a1e50ec30f934908c19fe82d7bb8ef1174bb6787aba9df1a38a84203630ae9f62e08fb4ac55ed329282315937d193992e9e12adec9727ef91df5a065cc5858062c765f34bd2630fd3f654a8f8421b75dc384477744efef3d6f0d15820c9328bf43a43409f6527dce48a92c3e1ef145b5e284 +A = -30587ef092cb9456caa844be9629d77ef1bfe21d2ffd5625ea353beb1f294e38a7fdddd5bf77cffe5caffaf609b8976756c9eb4908ca77b1630ac0d706503c46177c5d905e + +Square = 54bf52644a244276ad3dac90661a1e21468f23a117a1fcc904c66119d86ce98a0b90fd4096708bcefa7a9df87c6bb85149305f193cf5505802172ef9ec343f662a4c895a9d19edeeed5d91e20abc894948fe59c1869928616392f3694d82aabee325b651e1170006ca1fc355212308442a5ec8a8fda4f5f90b7fef2aa731f3fe0f028143ead04490d78b2151 +A = 934b16f56700b455d5791ee8c119b5921976a829bb5d1fedb201e63c9ebb82afe4e29aaf0ae27148e4d34269c48dfa42131cc8b3b78e23ac3e7292eb0d715247a345c800f377 + +Square = 63b7884fbb6d5521c38f7deea5cc131ec6bea15a362322a8e27c762880836cffb69a069a168663908707bee9d83aad41c045bc84dadc6cd927ad62140f8c2fd001d34f0a7462bc939cc8996e17ebabafda95a73483c70191311a6fb7c670c76c9e2ed7e589e464617888d30cb7793e91672d7de9b3b4b1811b2c009dd1c690d44710bbab832d91f16f9b3564a0c49 +A = 27f17f0865513350381ea1aa1545439fde427ccc64385979bc787cfc4c7e6b624b2c77140da2c4176c55dbe43c506fac14b4cd7815e87f3120330dd3003bee087a371f85d6f4e9d + +Square = 9d1c4239accb286c3c7868ad3b4dd97b93774fd0c65e04ca8dd405c0298ec6d1f52d60be6ddb5f8f0389cde756b49b23dd2f0de568a432fb99dbbd40db798261d1dd39bf5017e6dc74cb9ca91f8b2f892c7eaa28485c04a96add206c7c38943912de065be17b65292db5a144f82427016b5e0eb4ded2e4d0b7d12b01cb0b2b61e5e1bf22dcf1567a8b149cc0ef5299a8b1 +A = c88cc5a46bc1cffedad4f45e66fb55dc4347eb2a24a09878358d40fbdb03e738ca1d54a1d26a777915248fd730daffb0d3b5305684709db0f258f581fde06b11a33a3f76b3fa53e39 + +Square = 789545f15fded8fbf0b4275cec30c3ac65eb42ab8cc75670fbb2ab0b4cd90ed41a1290383b5f14bf87a88c67ff1e04d0f478fb11fefa64e86eae5777855ddeae451e166e23ec30227fb4021d51ec7cfe4ce531c78ba1bf6c797dc73f093b0a5a5aa59ad8de3234808e776d690007c8c332b3f03331dbdbb8645b91552091afc36c28c3229220b1a7966c7cf13db6bdbd4673440 +A = -2bec94112014c1a506417e659157192dca1df58f933510d7a8d6f6feda5031d799a66d2746c09f827199ad9fcbf11f323a636feff5806c9fecb2ac684c2870d60c8a72358562c4eaddb8 + +Square = caa64c9f6bd66f76c99604d1f2b8a29a9a10c0d6a41cf32b5bc40edd7a1d97b295c63aa62c30498f15d70e427d5612ec3f6a2c1f2997fa9283f48018435fa6092269dc2e4ad524cc6da9689302f5c398d79e2b2d19470ea8240db9df0bc0bdc911c4d53f4f24a7ce44ec76378794d16d367434b4f8b6184c7651db77fcbebb8fcc5d3a51ee9739922cf20d4a8888139fe4669a164400 +A = -e3c4a10a64b7e67d786aeb81bb7ea14655637ce963f46cce59bc0cb6b5a9cb9c92afec3d527119db97bd2605d315cf28198992b4b2206e5616d3c560bc8163f56cb1f5626a7ac6d8427520 + +Square = 429e4283af7f895fe732ee88e4904348ed01bf579a93cffb7aa8e135d41cb9be218f8b9a9cb4f556124105cf042de51f34c8162fdc7a981de88e005a014149c955068e87214c174daa40fbc618c536a6e507ebd313763fba197059d68c69bd39933d614b2c32f235cc955e335c4a37b9e98cd7f98c7f26ea2da932c7f82ffd95be22a7741da423123f8908cb188abc26afaf4ba6d47b56e11 +A = 20a5e2a911627544219a1639c3321bbcd6192a32129b248cf62351f85b7a719cb275a4e44368a74f4d1a307ffd27ea2cae4d8584a57070609a30fb4e365564908f3d501b53c1a54f0e37745e9 + +Square = 9bcc8d423c3fdfaaaabe24a910e6ac3619eaa15e23b9f317c844d39d164c952fdf5c4bd270a83f3902e54d3817fd78c96018a706c1f652025dde0b98afe35597e0d8782deaeed23337ef6b3edc9317d54e3c8a57e4e7e2695f9d2681bf82927bab193ca1f135bd0e542696772f08520faab61fb4ea6ff0d15bb91f21e68bd7f084a6b8f24a47ecc30a779ee86610387b29a1de94de517f81318001 +A = -c7b60f4c355f2ca3937ba3c124eea2cd8d3536226a44afcaa3d17abe931c09ccaabf25a1986b172fcf46fb02a0fc36f2c163b6e42cee047c54ab05e9d30f03f6943b9fbab83aa6da12d7898c001 + +Square = 45df25540de94883dbc182009c29fec43627d3e5758e6a07cf40064e0befa0df184528a84757b445dd079c2b0feded48b651ab18b4bede2a81796be45caad0125c3692560d19cd9a6c8c0de8383fea0bc1ab46f6aca4e9c36b26575cff88fdf1eb1e13182308295457374968fe3a9ca34c6acd24c753fb84d41246614789dfe154faf34fc684cd15035dc9c1c6b0ea171e089e0f3236840e355bd123ac4 +A = -216f8a9a3e54d4afadf368c2693743efd3eaa4cbda7a87cd07f5b1a713eefd2548343e7f091ee4d9d6ed1d4343c06a0597db0eb5194b91bf2c858210557a8288c1aa7b0e0607a24dcff9de04146d8e + +Square = 5cc707d97eb107c5c40c0f19fd432cbac9855f280082802dbe4deb45bfd193ac7a9149fd12c4ae6e9282411e2f1f2ca92135424f215b800634092ed4ff2859d16ab9fb8619ece41b50f8888d3e13773d38789e19158e18396096dd57fa5470f50b391c22378d980e59b4585f013e6db52c1e24c14ad83262fd37d42f52323896f7d4cb3e38868abea8a07e7ad3f90512eea001c5147645bf00396cb0e7a553f1 +A = 9a1d1b0beea76e7f32bde9f4f2c8bcff9094db2d32c04fb7ff43624b61033646e482aa0fadb9f8b4225b47121070b4ee5d6818d3606ed775aa631e0ed42da68c2a09dab26b6a4d09ac226cc09321fed9 + +Square = a32fd053eb90c365e77ff47573a24add3b25b4c301f4c662dfc1fa635af8e18e7947381989b37a9c9de2713ca438b9f85890b7b160fe251933aa7dad1c3839d502debb42ddc927fa0e9b40c80dc3d408889be567699a856b1c9cf3a393b3b818432e95feea825c17d0981b942236b3779f2acaaccaf9a5817ca47bd03045fc4de454d8f1d4377e218c5f7ece369aacc35369ab57a71652dd42621491834119afbe729 +A = 33190b787a2c3327b122d1f5823bdee5c93b19b586ce1bf79d801a19b2558aafc8f6274d0908bb7a8362f7f71d3fb52b8ffc87d458249caba7af3a516ce868e8a620e3126ad43d6aeffee11866fe77677b3 + +Square = 74215d33fa398e21c34034af6f9c7af6a3e01982320ec8cf23074a938f1a31543f80e6aece01de247668fe67f276cb4411db27666e1dc8fb2bfa4eb68cfd3563167d1ac4efa3361f920d8dd0fbb7f06362167f5ab5ecfb72956c20db934f67ff1c75aabb594c853fa61f43d219a3f5d0d45274005e3b167cfff5493b0f26d15f85d8e906a0a6e7645eac1f40c6dc637e6d1e061e5b9071a1227469cfb2c0f17ff983684100 +A = ac6c0b9c69785f35dbe244dc85a54313ef836ac67c853531ef5db45b28835ffe61dd258c5528b0acea50f5aa5c0f5d08dcb8d82ee19bc432fa8a45badadb50693fedc1cc79a17d63aa73fe9597f1d4ce8ddf0 + +Square = dce5cac967c47b8a58ed6f1bb1d1e6185e849400228afa2bfa05b9c2dd327b04a86f2a4da2d02ea102868ea0c4da0f3e5a40bd02c87a08aaa5cd8d9358b3a5ebd8c9fc2dbb1268c261f46d6717b0307b993deff0adc8190d32b4f2bf695eb2cc74a6a9a712c5a621c673219ff8a24ded0997508f8f9eb1ea872008c46e71fa97f55b839950e63130c38b49c0ce3ce724a0e8faa9738d2e28ce6e7fc7eab62b3561d2981f314f751 +A = -3b735400064b15fad81b08362b8557f8318c20656839ffb4d2513512015036ab0039442032f1cf515f8c10c9933afe4206a2f309e933d1561b06bc665af2f04f4d064e073eed2280053f56cbeb137a9482c0a077 + +Square = 6b619bcaf632f0d8b1d715e8850c0cbbd29ac6373a9a5e93dd1bbd2b82744a8a50a7446b48c6e215911ffafcda9ed7becaf5d26b7d6df7dc8798d53239f62a482f974bdb654750def1c941c49a24fcdfcfe73881b556a7b528d88daeeaea8d62b357211a1946c81cbf0819ad8d0188f60aaaab4ea2dfef7e9012ade7abeaaa4a23d7403c1248c36aa26b43b8e7de8a5aea639a0449f50359e9b4c1b125a548383af33703f8dfbc2528e4 +A = -a5ccc69663a8712c15f96e6fc746252af89a8c2a6317caef905dd2d8a6d4fe878ac7aa66cdb3c3721ba7dd36da310753dde9801b31d759339ac919a464ab52541bb2e0dc938752bf0f1ff7a9524eb98340d62576aa + +Square = 77ea5b715823045afe13d10416dfd46a511141a7d1279ebd624f1de428cc04a4f246246e65c3f84344cebfa32864de9264b2e54d4b3010c4de9d3e6a27aae8f5f9e9d8e49fe26b73ac7e65bb216aa6a42db36ac03d749b5dc04192df819631593202a58264714628686507fc5655f169483b0ffecf45995cbc12faa105895564d287a9f4b220947d6c93786c85b2ee84a0a29183483f7c241d6a67fd0b1c38c7f74421355a14c6d9ed5720e24 +A = 2bcd67e6bde3f54c4ce0ea428418fc5c97272217c6c7de90549238ee322810dcc1bb9385967673aa3f9f5a5c05d987c6445135cf1efc26b3c17e55b93cc052761a77c9dcb5c22927b09e90a92e053ec1bc799bbe7597a + +Square = 40d113460ca3e70545bf3613c2ba5de5d8485641ebf531a43b6b8bb76884ff4f348727ac6606e026981d2116ef1e60d4b37b44ed7e2003410d7d636b58aed2f92e962003f28342aa5f059d23b3d58a1ddfb47833ffe1d1deee0a7e78b8f7d9d6487f22376664f1ed9ddb5ee3d17f43afda296bead11680fd17576a122c2599fa9802ddd84a2115f9fda03aba898f66e303895f452077c920a322b6aaa0965f51fbb36f01b1d412c6ccf390da050d24 +A = -80d0699a46619db033461aa6060983def7deeb976d1a71f5c6ddb85e8b46dc70b7ddb1d254971d38ca87c7ee3905e63506c6db105dd683375f4239523cbf1874069266c2c0f4b37edcdd261c51088081d25813758bdbfc6 + +Square = ace99f98cba0d1dc1c758dc7211aa4078a2aeb6d3fff19bdfa6981ded0982b15bac792e6b542ae48a86f9b40c6de937e402e230fcfc390b10c3e60202dee1337ab39da7a342999487b8d8b0e494f2809cd1bfdb39209da5daa590f78ded211b6bbd3fca9013300b951d8906c9ce8d1c0dd9554d5d1d352f9784f822c928dd9700ef8a5fecf3771966abb1dc6a70b301461eb6b6087d6ab80a4b624205489584224cf6578f75acd8091fd621d02306504389 +A = -349936d60c9d77a0974dc8985930d8674976db6b3cbaa067554ca6b30b1de33f2d4e1c9564ce102ac6387755aabf42916f63632a375d995913f9d45ebda54bee3fdb7cedee46ebb5c8ae7764e4de323c17c797d3b529230cbd + +Square = db6c73be2a59bdd35dd312240aef18dde4231c72aa28551bb370a87dded587accec2279bea24c930236f06f24d537fcf242497aafcbf72f085fd3ecf030cd750fb382efea0f82ad9d3195680324d73fa99d48802d085c150164aec0d29fdcc3262264bbe72311f89989cc71a4afdac6ab103ab4fbb6e973a42a1f8711bee463d198f727dc7bad848ff8fa77cd3b2f612d142ba46e95bd79a86a1fe4c2b8f9181be84825d05989695842113828a83b826e7d2c8c1 +A = ed01dd49d2e5d51fd30e9c578259cf107771b4ded6bf21f8b9b632fd360e34da740e0b1af6b5a67789fda5a44025af0f1547271ca8accc7a975d98ea7ec3d41c9697018d84ffb5d49b88d884ccdb011f715a199ddc44a4109261 + +Square = d6e38250ab89ffe11abaf8c5d07ba11e9053f1924ee1228f834111af16ed282389d04330cb0f47dbb186dee577aed82878ecb065b759312eaf167c4698eab5ed03a8657341bf5fb14a8e28e3b443a6b657c1f4379ff2549498a33922ea84f1fb19d10866fb0ad07ce1cc44c93cd4d9ec6bbb0e61c797750c6b5d7e8d55499655dde112f4747798f0e985fc2b937a44da9b04c2dc4b0816cfc57da1f80179db653c1ce287e786ed7eff7ad6d1383fc6de8c941d4af7bd1 +A = 3aa2e696ee570160b2a869c3f21c3f223959a185cda2274feea1c829af2234c70a504c959bcc49fe0313f4f5ffd27448e28aa0fc6ce24f36943d334c626459d7e6017339e787ab074879ebf697a93ad93835d69ab09294d007a0837 + +Square = fc39360cc0fe040b6f8340e0728c650e5e74cf1664f7b301e79986fe066f36e8df34d38d1a06b74a1bdc76867baeb3f39a9161acd200bc7532fa4aa0ea829377659646f073db82ee044279ae5fd797edd37d3261970819589853cb320887a085c4011c23d0da9b6d6f1b5911bb3399146c2912a967ab3b3f611f0bd52e00f418e6a6f0297fcf5c4a1f71c6bb8cc8e1c76694bb7301502d1d00c8b6c05bfabbf5d350590561abf3e2b1a82e98b56583e2e4e25cf707320a0e40 +A = fe1acf3d7b54e718c901c53f365894c22c8bb4182fee8a4c2558731e01e1519bfd1bf6e353483b8c4219453fa66f06063c6c99050068c15cd13cd1648ffc42b5badfc70f6fd4a0a5552fe637e54c4f92ca45c60cf9a0163978ac08d58 + +Square = 9abf1324ef65c726330f64643a024c466fad37604f4dd3dfc404d31c2a430fcfaa0c78283666c15a094d494b96d3c12de6e29a34d2c99f4f8cae8217bcd2a989d59807ac68c46d60600238a86155de499eeb35642d0f581045481b40e4f0a76905f9b6bc5b9585f77f8410b99333f7ea983c3f29f3fe66ca7b793b784a5a6a4f74512aa4385dd1e996832b1f41bb3af965be58c4ac5e867cdf8dc6a4f9d20a6f1e16e153fcbb45ae5fe8a798cb06a4ffe467d6b6aca2b31f335a344 +A = -31c243593ea611dffecc65d1439db345b2e89941113f9792c91a76b4890db6e4dbaf1482ee812e295d27956e48d07a14de38357f15b5931c5cc08d1d248df7bfee1cae5b5ce98984c5043a3e1a2b449ba1671bf1cfef91011e12bab94b6e + +Square = 66aee3e4f43c672e0478c76e2092bef33e7c60afee5d4c7defbcc5c0c86d8fe956c90a740cebe604224cc3f518463b1208699b8ea2316315474991d0f120ae905a67028492cf46fff2ae244869db2a02d06aac6ac6eb054fb3c14c756d8a3e7ca64f06586e3e86e4477f185ed527a8aea6a3c741f3fd4b64a2ee77ff140190260c431cc53f411fb227377c02f85d0258a75bf6d44dccbb8bd04ebdafa115dd55b176b6eff5567e5b1bedcae15110826574053681fe25a695ac4540186e90 +A = -a221dfee30286adc076673cbcebd24a41a438a0a7a6a547c75d33149cb1a094a8425feaa5a23cc234a722db4cca8d5912fe1dfb6db4e92bd87c12f0d06b6d954fdb9b172955412b2eb5c9fa3b4df2933390384fd1f929a2b1a8dac479ec94c + +Square = e880f8655b51739e34393c3e6d69d63e0256b1a887f7e69f40c78d21133b17e92277a136f5e37da2533ed599efad189975d22ad0340005ef58db0b471651d749dfbd48b3f7b3b8a42d4677048a855e99dae6c729d8bd7eef86911feca9f5490dd216b06d9e8d1ab695c1081e72449baad28dfe113744853382901e6bdab5413c67c52d6cbbb2e0bea711edbb3a219a4046e8739c04729cf8c8210028dbc4087737bc6c1d7e0c15ecf16774690168342b1372d3646d4d8696384bc932144c98529 +A = 3cfe075d4525a3c780d6d05f7bb708b2fdf7277a0f9967e0a209fee9d42136a0bbf98660d8ee8cb4720a8042da09f6271c45ad13db24eaac465f8207f78629e9085c1c890675f441c78efa38e5022b1b80afde5e3fd08e55648f2817631eb6cb3 + +Square = 8d6cf4eaf58099b1323fc598b7554b371f4afef5ab501dd162ab8429333d46916fe15dfc4ed6a99ca7fa7fc1aaa0cec3533b41e291fb7f69b560259507226eca87aabd07b1ae2eb93bb53f98fec508f051cc04db4a172901e06b74229c4fa3f550a81626c7a63fa99d41e46c2cf792287a5cf7bb68946971bd43c7c0356312cdc25e524665dd39a24b6464bbbe64fe8e87ee313b860639728a9143c3a6118bc8b150dde6c10a13bea637fa8873c393e6338319c506aec6ee973b4b52a272a74bb62084 +A = -be46a8072aa44b3bff0f90c81474dd576756fca624c15f55a17e1d0bd2842467ae000b04f79f561690c93ca7118ce17ecf830a8da3678c15436876d2a74324d9714dc8ad8181904be657d7f1da3313b78448cc06e32299a09ed59bfc1961e8bd722 + +Square = fbaa4fcf9800673fbd3a132305ed3e14f4889518fb56ab82aa5e9b3529b74d7f9a467626d68f4709a2030264aaebcf05c0a0edb511e81f357d85b79d925a24605f1bcd4645915bb75d363654b676266329df532cdb39152fb360df1b9500e0c296014289650ff77faa78a604397a82b34d16484e94a8de123fe720e514c88f11ec276725111563db91477480c3245542ec6bd0bb2f4aaec02c6c4eb1769030a31b05da3798c224c9117f7c38d3e98a343fca03ab584ec2d7e6db60fdc4273c3d8e23cc1ce09 +A = -3f74b25f2a9c4d8d977e69a4e067f9fcec281136a508e365b282e5fc3b1d097bc6a0f59f7827fb90d4890b08840a0a1919032c67448f8f1a771f785a0f125a4aa4137c154fdb489dc1099d57bfcfc75f4ca5e69f93f2bb87ed09cc0dc620d3e76ecd03 + +Square = 5135becca97d93dd4b16a5a1105ba3a3e3fe02bd6a7c3cd182186fc63ed4351641182a2727ab6715e9672458dfbc31aded4781fa345054eb4c317872e2af6d4ed64b2ca7e8c25e1e664b5349df937118632a64e4ce439ffc625a5ad3358270dc83fdfa73c7afba03406094fa36d87517e5e2e1fee5526fd2dc00d9210a0f6c3745b3d4bceee5f8b03d976d696c57a09d1e08e4ce780972eca4f2ed6500c23bf5782c31f13059e48246180fd09db693d2fb5d48d51846ece8beee45cef7efc87c003b44d7b137a900 +A = 902fbe2127354a7df5cb7fd057f3d080a7bebbdb83c86a50560b8c287a37a841bb9c8421c63d359078d2948b6b57559f98fad8f8014f93c912cb70a6701c4dc4fc5e88aa413fcfb685c32975a8b72424742eeff8262d28cebad00c5fcf88baeafe8f6730 + +Square = b5976cf6a6560412aefa6704b126e0d987dfcedbb4da436c08ce17b1bf1b6e0bab9f934abb5c4186a5415fa38724fb8fa341d381319e7d768209ab108c8debd99075d31deb3e03ff7d23957d4f3204d543b7d9079cf337be3037b1cb4908fd8c104d92e52f041b4cb27c045a741f4d64009980e8d27af75d9493920ed98c7234777592d6577f2d1b3a0eec645ab4cee2f28d9e4efd3e4514db6796487ba68a462fa0e316e1420d6604db2b901de46553546cab42976fd0d459afd81196275cd88ec4dd448ff331bb35499 +A = 35e700e034950bdd7318d5b3c17e90a4772ecdacdb055b9391b31538eb823fc8a4599f029e78e4fe5299ba1a423a449dc257a431d189dd5dca275c02cc1f12417e111c73b731631d8a1741b907dd8f24de226ddf9e3044cf4064e8e51ebd55be774be7ad2bb + +Square = b7de0f73397893a97928e266bc56299cc8d43b16a251992662646072b58fa578ca80f7be1e12619012b130e9514be803dc166b12ddfd26f558d36c2053ee6209b01458379e49469753300ef20f6b3dcd5383b121861c76ab25debb28c448ec33a81250d05f7eff80a5a4133d522d270fab29f739b607395a77278609aa5e1a55ef58d1d48492b71ee30a24a6505aab1a3ac22b9d143c9d6781fae14bbb980fe3a99dfa9a1a406611d7d0304493342f53faf5fd79f9c96b9583a219a1b22aad02dd58f32ee98146b3a8cf054bf9 +A = d8f4d3bcfc7eebd7068b851858c3668ce062a834927e165679b49132d4f780ca682876c65c7cf2e7ce34ed10e43696477da6301d13f92abb8c76e2424c4bc28a6565f15e59563d607b852dc946652b68fbfda1c3200ecc2976400ce7296b96e75fb059a4c8eb5 + +Square = 5ec02661f49fb9807bb73debc3c6eccdac1df1735e0d61fa7e0eee07471068a5809796a2af490c46a77d61f618b44a3168dde67aae1cf9e530382411056958d55bd18f0e76fe2c31c98b00f87fcb7f5691ed5b65424f82204156dc361ef6dec5d44cf690582599b3994ee47ef42850d5d2370a4169c5f73942657f85422ca24f66943877f73af493c865fbeb29574cc1cc730e9bbb097b598574f6b90257748e950bff867bcc01bf62f8df67d7aee1b6dc1d5db88826e86a3f9fcd8663e09cf8393ee71a09c43d0d38ba6ef643f4ab1 +A = -26ef9b6708a80d00f4d01e0f0a5546ed217085ff23519819ee89af430580ea1f086beb0eb51982682c6d3b922a2c92752dce63657836223a9d94964bd584bc8e37c6e30fdcaffbdb128344d51a92705e1c9f94205ca36452c15a08f7e62e0e02479ecd48085de8c7 + +Square = f6364409467a829abc2b13c93979dec84984caa12154b7cda2f4c8d91bf24ad7c45a968ffaac8d6722cc26e6aaf52dd29ea2f09370ba46d79684b7a06faedcd17136f35a58e5b550f3a2caef7b195d8409914fedd3c3154101bd735155098e8b10fbbb1b2e13555d2ab5d5b52b203d4efb27e498b240f37178f2e89b413f94859b0e8b2ec10b926c8c0b6f2937ee2d0355445364841c7e0539f7073b88c7d568edf1b253f3c10627e22c2ed731b7d4d199449cb0b5e7a66109932fe2c9cd741d75170deb9f98469049549c10a7a622bf6e91 +A = -fb0eec3246e99212879e51b17ea6615275818ecc5ea3058b13dbaba2576ef90e1519e3629b09fdaeb02661091c395c862b848f6326b9f536f7af45718c4412f09f19261b537bca36742d3ec66f964343516aae2ac27e249a15beb545b447e37b4062180f6c82809429 + +Square = bc4193ecb5dac900191e02be06297106155c6840c4908fbf6e41e9aae137d53c3d4ffb87f334f49837dc4ab7a66299994e4f5c9bf6ea03e7db663bdef066e94c610580a8896a9ae9c8f6587eb83d789683f5d6391bbac3a1dc1de60b4108428e6f5fdeaed6cd3e74fa01f85c6368023b61a413b69b14276b66f22653491e4f25790985053d075387cb13c79dcf963b6d880d01174314921afe1cc700c02efd2979dcbc59c417a6316db9ac45a2d60d2a036571bfbd75f9f5e42048ca086cfb4b818a9beca4a6e0ed51afa320ef3549151fb39e100 +A = 36e1f16043b4c9b4a304496c39dd63459d6521d2ac92916d348daca3f972835973fc8d21b07b09d8f5e3197b39a8f3fd0011168b815d67c48143c413e169ffe0f56ff2cf8b6596bd0a3b5b7a6b9a14ffb797f350b7e6aa7020d84d1d1b8006850139795abe2c74f03b8f0 + +Square = 4cbb5bc1dd7112326e2c94581f19efc8fb25339a299fa9c007114c3a22b395e9d39a8ffe21134e97ad1b87b97e667ba48b2a40af61afc81fb1e20e8e38c7ba666b146016af4dff3faf5de306591e5ce6eddc1173fdda6fe241a9f2fc6e054c41e56d296f8954377df0d140096b9e9d6a5a23a231db4dfab0cabfb11190c7a0d1c55ae35203836d433da96ca7339682bac0a7edb8b5b4dc267c6e83ac9b67a0d0d564717ee3c20aaf52c0a750f3aad94a12537c6971ee009d0f82ff576e984b06c7f7b357f5c049454e31326b952af17aa62104780e9ca1 +A = -8c279ebe466de3115b8740f3ff9c1f605b4eaa75512d82fdc8ca5ce84e11a68688154fd603ae1d607807dbfcbb822a8dc259098842c6a7b7ec350be29a3daa20fd5b093a56692e9d42e7a389c4ad2122a74205f835e268c9742d09ad36238c34e143f6e2ec69c0f490d29d1 + +Square = 4f771ade09cbd1a033d2bfc6036fe46ae6c12acc6f2b9bd52e7781693fa6358cf93089f23d1f0ee6fca476a43093b9b52446f3a7abd72ed0ce9b562dc438822ffd84bcd898ef9d092f1b0b7ff89c4fdb33d8715dd4a0d68ec49ad41338fbb62ca87867d847a4d99310641a37ea78b04c85606069d0c0950484ddbeedac8ec6f95124e7fd83da4e942d40103bc14474f5cb125fa0b06cf167f076979948003dd8dc3711923f5af5beb5f56c0a48ac0c5240b62738c1cdb06b87ac3dfa17befbe938ddc7281f6c248c41a1c7b99b93f69fac83a46eb298a9fd8b9 +A = -23a845bf2007ba8480e3ece0a1bbaf8bfccba6bf061e3fe1d8bcbcd6c761e650891c0958bac68618a1f55b27d2bc6e1e1b50afc29f58e2e034bdda8405e5378cb5bff0d84efcb458c5428fc607597d89d589d85d90f3da4b89a64c9d1623b98b10518a6f2e7d2295c37527026b + +Square = ab45d12a4e15a294830741f4b9d4a14cc7dbed1c3454612047f890211c749d92ae0418f11cd44acbf1585b1f7323b33ac9a4b13c44e1a7e31b0dcc1c6dd4eaa12a655b5de08f3b948270a152db7d9e04dc54677075797bfad6a9a0e3958458d40e3df5e15028954bae99518de4dd3adfb2ec4b38897a8a4e4807849e1416aa4040c95a0e49a8d2889f6fb0537875f87516c3723e8d3b46da8da855929c67c0eb83daad62ceced52b4f52d2bf1c4e34f26bf16aa7da3afe0f5df76c0858ed98f21e1fc3d01e1572715b774bd5c2faabec5fa3fa59a7a1f32565a4f1f9 +A = d164d875e1f766b4567e9228241213e69d6b6c58620600166fac56938c5d9643932d01f1f4a2263dca4b9ad26dca1548e4b5b7e27581a63375d0e624f4e4c99b7fb9aeb25307c61142760bc4771e48c7ce38f5eb2408def632096fe40b80d488fe17a455d80edfc1c23c429775b5 + +Square = 5ae4e7dc5727543af39ed3d5e9ac086d1a2220421231b82f6f41caee7b9815b4049aea0d43ff499c6c9e1f226f8641351d03f37731c64686d9a9ce68e9234d6a762efcffdecd42f81044111599963d9b6873cc20bf4c8284fae03d2e4f238a14a74df4388fdc80fad0375a5d0d974da7854ede5896ed2ab25d2b49a3c39093600f73120e4fd2faf75381854f6ae80f81b977f62fc72f1fd01c278d183544052b77bd753dd88ffdf5c01745521fb8474b5c23b0b7dc709bafeb91cee0863a0c23ad7192c43cf15fc181d629853cb9b8334082c915dd3d04e3a0a81511d2e84 +A = 2622a7bf45ccd3cd567c757f4c5796b5a0fbca555bd0ac2759c24083172d82d6a887dcf93d9788fde052cb20a8963cb6db22bf5eee6151600f9d1896a7606b11a1b100cbc0925bce037bcea57e361efcc560a9abc495d7f7f45831c6429ac8f979dedc08c304f4da9c0d4d687376d5e + +Square = 473cc933f5a650a4ae358c7f486d325c0e20c83b54838fc08b6ac3ff010f7c4b6a609bdf472974dfc5abda0c6b33c5ec7dc4628d85cb4276108e2b0bc4e19cba135533b3d7bb6a94332aea3165dccb230860d2353166b9905635e606185b014730e9dcf2c433e18cba83859fb2eac4aabef68c8314ef86dec2d534a184ebc4cb193643add0897341690cbe18bc2e775327fd7d71ffc7ebc49bad83cd68394eb276b2e615ec430180303010a454ef73b6a8f02bc48a1fc8a32f8150ef1b733f07da752b8e808000329f4924976bc8b8573927f18ca7c88c210845de6dcd0dee2904 +A = 870b2c4b054076d0d02877b19fe1210a8fad3422b00905a6db748239b8e807716ed9fee0d8c25496593717917edceb5db57f9960bddc1956b6652868d6ace82827bbbada5ae8c15efa26fda22657126c6300906f90e8fabfd58ddf312ce0eee760e0090fac44f00378c676115cd0639be + +Square = b151124402d2f04b0e6599222d380dcf67b9716ef50d2d9ded0b21521b34a7294171f71b41762511b7cca93d9f50e9e30083ef19144882928011dbb143807d1b88c55eea6b19f0c4180023be6da63a59b6bc027aff3f5abe2f65c73b2de1e71c5f4b248bc4547040764e83a860cb3f882bb8b5f7821f92802808fa37c50f2f94d8f56daca841f42d3362762ba843aedbd03d3cdda887f75ba92423965ab4256eb842ad755aa7a2af331b488186f891065b07f5a299c807dc24fc176e085a8024bbbf12f386ef49ccc91bd4ada0936b6de78088cf5952ae6c04f6916799378bc0ede0da4 +A = -35439da9e361700152a35ebdea253378a1febec5f288e5b2bb0bdf25b84751b47e4da5aad7453b70cfd6640d5832237d2115575c738482ac6036c5fc21a981c0a7f979c8d621a92c02166b777475618aa6362a0e225dd6138ead3b2766ed9785ee01e4950a863d2fa0b7f5cb4c9a108bb626 + +Square = 4ed7263ae5beb0069f24318b38afe951a5a058a2e960e67f086c9680d0cc6d713f943812070bf94152f7926bdab9e5908941261244542b832f458f05ed5dc048c8b9eb84c2a85efe717e257796b4ca816948a6c8ea209c0675efb2fb5af4622b44e36066593db01b17f4dee21d7c1337ff41436cd0e5a8d01e4030dcd3d49839e59996fbbf1d39bd205343a424f2395b4d3eacdeb9ed3235d8df0dd00a2573260af63db3116a7c65d1dc69684a05caebff34e3d2cba9d4869a953a7b1fce10ebd008cba021008ac3187bba846abd7b39a1b97c9c07d8080549e313dd58b716022de3c1920329 +A = -8e1141dcebae61d5c4d81697f001d792ee2e847c589816f923f0ed42bb4de0d8f911b8ca47ffe77f80b9da6896a9b42f0030a3276218868bbe1a3fa64fb0a577704339af5dd82e66780da6f58900da3f1d75ebfcc302f78ed66ea3c7a737898a29b1f2500686b43bae1e6571addd2842cdce4d + +Square = b09f5e9472cbb75070a67d025957fd5ac3be89c41e4acbcd5f75780ca459562461082c3f19c5a4a416a668b0a55f31f74cf2ec44555ddc43fde64da0ba781adfac4520dd0f78d04d9d2fd33d8b49c72663a6bc845015523e2e4e7ccc69e5b748b8b891e4089420bf0a3f6032602824c7230b5ff95f85a688dcdcfc890af3384710a9fe32ecf9ad7c6cc5761f13079b19d7b2906c7e63c14b64fc88c6f4bd7c41c0356c777d35c3626d49db8cb2d1e89ce682c7fccc3a459b08c20c4e5fc3a8eced9b37d01bed5af6ce9baff0d2b435e6e62871fcb20cf9ec10d1897a5c76e73a441e07fbcc2d9f4e4 +A = 3528e6581de547de385c93ccf1086a17614f23356a918b25bc6d73656a2302b318963bb679c9a93357f4a4f614e74f2e5e88e9c8aed8a6fdd8434630f664ed15ebb6095cbff1593f188a12f4dd6087a85b202f6c24df68ac3b137406c88c5098faf47d1eeec0743b35baaec7dae29b5a44eb09daa + +Square = 5d5dc40783411475a4aac7c1a1eb760f76fcc6ec68dfebb754251cf499870654cd309422935ec841e6be4f5a15078356235c2b8cbe1ae755cd6d814e811072bdb76156b83c7d2064a202ff90af1e0f88f5889e5729a3cffa9faf33c463b74d0ad21fbb4473d4d3ebfa8a52e9c209ded5ce5131b12b69747c365146fa17ee5810e0dbab992f9da28b6c323062484d62472232721d608cdb9b5a341a677e2d7a6e5a983247d9a4001e16687b489b10b18bbf205f982b7ceee27cc3e9c6641827ab7952373f15d36e5f177b82d7eebb3f5054e12cec82c5f520a2675afdec6cbf6235d358c2fe73344002e400 +A = -9a9a19fcdf11bba84b0395088c5d187d84d69b68b77bc6418f63c88bbd8dbbccfe02917d814f9e2241fa0709817a0c85bd554fe887babae7439d96248514c12d71587c906247b3e965e954cdd57f1e51f1979f73c3237509863169efdf281c1359488daad3d9eb990a50ecf4d3fd25d4820077832a0 + +Square = a4d69ed4c4c9c08116ec5cc49ad458f0fb2ca00f356aeb148f18037bc49621e14820f325af39f3954bddc9cf01de7ba1e443088545883a94c04ff41a7ed5f65676109c5b711b4115775489667e00aa1b77f6dee5ac5c1789bc71c9fc797abf41c7c5ae3e2c1cf82d5b49b6c0da25190dfa9360b99b2f63444d21ec6114038b8284bf598eed24a2ab2b9802d6edd5b0fdb52f60621a87a14612844ffc71ca98180ff0915cf75f47432f73d28dfd7a932a125095655f07f50722b1673df2cc4f7566a1c6035792ff3f02356b9b9d25e905121df768dc6a1884cf5483eeb813c1c009fe4ed043febd61800ba978a40 +A = -335b12e40bfe0b847ed6ec143490df33d2e64ef4363869cb78dec008cb5cd66ea671dba964a53e48267da288ef4040e06371e1209691b81df02f2c86a79cac85fdcbb6732a1e5309fbbdbcd899fdfed18518d47258c9e63ff7f116ef4a8f5c4867aedd907ccc7d222cf8087afebc108f2a0f197c717198 + +Square = 74dcdacc1a4f02a99e3642f54f9d917b117d2ae8d9c392f8b6dee53fac66ebe1680c8e8cc29f5330e0eed3f63d10980060799bc37b34c93dd7b384d4ba30a5b5d42a145acc412ae838d7b9b7137637546d1118f7cf3eadf88b785f0aa01da8638f027c56faa16aba8591b64b45dae6138c9a40309b2ad29c5029a867465f9c6de8fbc5fc4b0442c8a8946272667c7622454ed6f2a236103bed7697dba20db84b5154ff3fbc6b4b9eb67ee43bcaae741d87ee2093ee67defb8eebc4a4a22d97a4e2aa7d4c31a1c88abf4a440ba4e2a5e40c4d903ba5ee4d80b4e8dffb8864bcb9806e015c1ce16490068df87282393111 +A = acf70350e554732c1972903cce269b215e985ecb8d6eeaa67fd5398d0a1b57c0db63368c0f8c2288c3a0466e2b3db081106b90920c46462faf00b5bd654f7140a689b78ef656a26b82af8dd1988f166ea04e9aa777a094d892bc7da4bc7bcf0618526f496cddea6d67df7bb0de9e99a35a0b1b210ff07497 + +Square = 9668b9e40a8bdde3c93943a918ca71fa0009cb05a1f592b2bb2c6c6172b2950719bfd80cddaf45d044cbb6aa99715046088f40ec6812945885679231c07f4200023548ead086b834abd8c8f8294db28b203329553242fd2f778ef5cc5ed0b48c7356d8c2d782a01809ccdb6b012896617f11d963300e7bd38ff512829514d94343476818ddf9d712bc70cffe7f767a9fc75a5630e6250ed45e6831b4660eb49d47dd1b8b6a0dddf3fb3ff0e12834337f145f741f70a2aa43769af50f099e004269ac47fab79e060800dc74da88141adbc46c15c7330931e3a2bed9b958f78b30214f81a64d121f96fbcebf7569fec0cdc6b11 +A = 310e7a40667d9d5dc29744b123cdf6a663a1b995f62fa9d4d853cbae0dd23669f4778bb2040317ebf6a06ac6299b21067aece5c5c1afbe6e789d656745ad66464991cada0eb237c6ffe991cac4670bfc90eed5f8c75073f4f846ea244bca0e9502ff56f8e9bc9b6caf275aaef38e26566fef35329ca45392069 + +Square = 49e677c8b052b7db97542948542449af47e14248021f8d3d3f92b9af41c803072f71050f16dd848aebb270affc47e85427a7c73f227f0d63f140d0d293157af0d972eb5b38de494fbc78ad3a4c3d1ab40197bc4427752b6102d1ced6d6cbc9d7caa0d1bcc57e708535822180055ecc9d9667e0590274b778480a3720823e931ff6daef358b1a1a9092f1f05fbb5b10ad5707a124e8be63bc696f083eb74e5b4f0e3110de8f297ecd30dfd2bcb010dcad4e387520d3d00365fc51c2a3dfe064b1ac77a9295f66beffbe5dd4333e5cd823b0f36b0b94d66507b1d9381060980f62f38a62e38e5a75203233bb8d64089bfd100f3205f1 +A = 898b5f3655de74cec3b0fde2ab03fd18cdbcfc3eeea48ba39317d26917130c2b78e05237cb0454ece268f091cab699fbcd51ce341b53d6ec0cda5d0d5388bac25c6517214a39d03450ef8502e1675bfe8e57bb6086f10ce4cf8ce65eadc865b5bd8a00dc26394f3adb2ace609149e3582cf44246184b2adc0ffd9 + +Square = ad00f10fed55175159b2409dc80899f9113ba7c8099d0402ec0f520ab4aeeb46d36369494a4e6fa23675adb38148fd2efa082df5094c0acfb77a9ab6ba7a299298d69b04b58011c35325f46b765e580b5c05eca721904f1fcc355dbe39faa92af5c9a6dbc4ab80e62b815b45983d9506ebd52b9efa7a6b9da352d1e4fd6ffa81d3b4596a0c14fb825297da361461ff2240e4378340d2ae529932d78f3d9f6b3c6d65d717e66122e5f590c50ce0a5d81ad8e0f24e104c0913cd8d0eb2de4c8cf62a7535bab5502df3fba08bb4dfe73d89c8b00edaa7d5f3274be9959e7ab6b6dde54f2491728a1dc11fa8e1c6a95e67eb7617e9b7471ee40 +A = -349cc2a5658fdbe9ba5c350d3b25baa38b1ede01926694bd550d36883e53d8758e8f1ebe83e2f4560605510413a7d880929e2d9cbc2730b1736dc2689cf7bbcdc68a342b6398e547a9bd67cabe298796d76b98ed4c1dd9c22e36145892e8fcf2258529aed24252a70b6ca8fd2aad8a84becf7e1bf98b1e9bb024b8a8 + +Square = daa3835d3189ec9ade592e6076e76d441838077a9431273bdec02379b3a6ac38aecbbd57c3755ea58ddef8105ac28f2ecc8598ec0c4bfc9c1c80222fffc776722eb0621cdd8a0d55f08767fc2922282a76e529d81e4d6e21a2542b8c9a403709ed1132e3b52786b81e684591438fdddb5df2f0b72e6b39cd2db6c0cc55c759c2dc1b6ccc20a5cfd10c6fd345fc766035c7478570d4ac534db3fdb718e2bdad3d096b137bfc09a562043800957e2afe4fdcfe292881f6189edfce52370c0438c2822ce3b14d73b3eff32f7e5ca97e989326b4e3a8fa35544193f8590bbb0ddb1f914894ab87998090771a0be1fd23917cd792be86ea0b98e6eb24 +A = -ec953f1b7ba7d561edaaa23076987daf86f50e9a66c36f0993290549a9006dd9d424885c0fa77295cfe34fc81c5edce9e2371b3039ea18d8f998d1956196284e6d81eb1c62ecaa8cf3fcaca28ca7e64342803c8dc3c139080bdd4a1ff30d7288b085a579d9e90903bd363b48f2072bb6fbfbd9ba2cab30a8a63784d246 + +Square = b33f4f3ae453058f4e865ec78f0844bab7af66a97dc2f265ca73ae2232777474bfdda39e10652d7386c16f145272192af728893c3d8a8e92c60d77722b924c30269ff5a399a2449ce15e50320c528c22655ad06227ac4efe5a993179ec61c2fc9115f89d75b53961fd16f7797657f6fbf55662b019608a1d30f64a2c0838e0018b7526921fdd34fd462bfcb2462b7065e2bc7abd57d71371e45dfd8fcfcc00a71f7e45430820747c9a060b72e4f6d2919cbffd00beb0c31a2bdc32afe2cc540b38dd04a2b73ae5ba481a6e535f37a757bbd6aaa972986213afadfa47cb7a15a6f1d443f93cb0ed824a10b4b7d82cae524a096b65ccb39be3c37c07f59 +A = 358da59ef65f62f633675764e292e5a68879df24a4727eca1fc4d232b3a6d936976c92eeb11456b5e8c11319838c145c6529d2f3acc828e55b8274bfe9afb5db241b102715f8e8164e454ef39f13ff1b37cf367a5a66c4f743c750896b7c3c29026e448bb36c6c06b0d9a3d048086ef0c3cd922a02e794223f388b5d646db + +Square = cd4246489f6f221f920acbd8bdcdd17f47d2b77268f72254de4190685c123e8c5eab8517fded1852e8316c9e549d3fa355142d91b2921a3c94aafd8862cd2235429340da38a2af131b8d002f17662354f5805f6a7af7afb6dbd2f641036600614cea42bd8b24d86a5109eed29c0865a5f30c5291b1d1ef3223f9b9826dee773d98ce972da92daa19e843f84ca5f1cd77925a3c1117242ab0fb509b94a83f8de4fc8d21f856f37a4d025b3024bd0dbb6d8acfda4ab2993fd6eb7a7448d4f66ec725d37f0eb14eb242c0ff3f0c4572ba6b98a4ce905fe1b7ca3daca56c225171428c56af938fb66b37e99e54139157bbf41f536989ef813af738837afcd62290 +A = -e53ad05c88568f09f616797f0b7f2756fb543d691ec2a5b645c1e5892a247302826419a35b1348cfd2c1c569c23c31b4c46d6c57d4a488c29ab5beb77904d4adfcd0a01ea0a26bb0cc8790441cc2c8c900f030d7315b4319f1a3cf5685a140e03abe6b94730ad79e8de1f4a0cded86a3d6cfe2db267fa7dc9b2bb32872a90cc + +Square = eea8028b26e0df090504d54da714a6f5f2695202e53cff479c78aedd47a8dc676243ec586740fde53b3eca9ca02b91031ce766242184109503fbe25b1b6d318e3cd5970fabd16dfa22984dd2e9f1e0f14c189170fc69c031d66663703e6235a942d51a4545bd7b0769d01d302ce2b00b83f01568a1e378f61fd0ca6201b0490330580cd9de85719e174a71915d7efbf65cd73d8f4e66f27e0dd3144d58ec09ed0f7ed7d1238ee596922807100fb7a11127944ddcdec6a9ca3bbf6df7301e354f3f049bfb7c275b43c3d8cda5907a932fba507c9145ea3166081c1b48fcc710ee32cd931f936c796b14f8a78a592e67753a7c9e428a01719c8ba82652f3a89fae110 +A = -3dcb44be1e54c5a5d7db48055ca9afa1ebe2ae648aa6e16ac497502a7deee09ffa124720fad0ab163ce8b3ea6a90f110ea52b67dbc424d0cf1e8c9726dfd9e45bebcefaa5cd5706edeed27896525f31c6bbea3d67ee97badefabf3e2532470b66e3ae3100f66ddf50cf02fc3a8e3f44c304251d3b6a7ca3a6e4bd5d16a41bd97a4 + +Square = 0 +A = 0 + +Square = 1 +A = 1 + +# See https://github.com/openssl/openssl/commit/e9e726506cd2a3fd9c0f12daf8cc1fe934c7dddb +# Test vectors from commit message. + +Square = 15c72e32605a3061d11b10123c1874836df96999bd0c22bad3e7d4374724a82f912c5e616a187efe8f7c47fcf6945fe575be8e3d97ed17d47950b4653cb32899 +A = 4aaac91962056c84fba7334e1a6be678022181bafd3aa878899b2346ee210f45 + +Square = 48a699fe82f8b62bd2ed18878133575be8e3d97ed17d47950b4653cb32899 +A = 22181bafd3aa878899b2346ee210f45 + +Square = 15c72e32272c4471392debf018c679c8b85496496bf8254cd0204f36611e2be10cdb3db8f3c081d8c94ba0e1bacc5061191b83d47ff929f65be0aebfc13ae68d3eea7a7fdf2f575842f7ec656cab3cb56a28095be34756f264f24687bf37de062822309cd1d292f96fa698c972372f09771e97d3a868cda0dc421e8a00000001 +A = 4aaac9190000000062056c8400000000fba7334e000000001a6be67800000000022181ba00000000fd3aa87800000000899b234635dad283ee210f4500000001 + + +# Product tests. +# +# These test vectors satisfy A * B = Product. + +Product = 5befab3320f8f90542f3120235abd926aac3805a19e343f690 +A = b057af553afb120db6b7764f8 +B = 857734c4c27a1d17f7cf59dee + +Product = -ab1ce167f4b2945c55ae3f87df50ad07d4be87cf9f8aa07b0c +A = ae7a6a87ea8981a567d0b3ecc +B = -fb0fed5f8c737bcacef4d6cb1 + +Product = -c2606cd48e6b075c8da79eb4668e7157f1f175c2860fd4c475 +A = -c28dc31984d4583e9d45424c3 +B = ffc4581a5c3f885cf42767e67 + +Product = aa6805b5408aff7f914472756da07830dcad902834dbdd6944 +A = -ffa07ff9f503511954e5dd3f9 +B = -aaa7af472ad8957763f5a7c64 + +Product = 58ca2569173389df29b5ce4b784086055dee821a7243db7210 +A = af417d936f4690008811a1ae8 +B = 81b26b80b43aa65aa55ded52a + +Product = -a043d31dfce8bd01724d31c863d0a64f1bf013509d77737c42 +A = fb5fae5edefb6997d44a1ecd6 +B = -a336e50c6f7845a1686cc88a3 + +Product = -b5d6a45ffce851b201239d938ba551bab7dcb59fc11fc35fce +A = -f918faa58bb57a2ffb8b01f05 +B = bae08c3006fade695029a1df6 + +Product = 6f2fde7d1a18625d727c6345ed85e597d546d9228bf7f0564a +A = -8d108d7a16f0696d4ceb24445 +B = -c9c764cae465207097ef8d2c2 + +Product = 93808b1140841dc9735cd61c6f855ddbbb83066689b0d7e1a0 +A = b386d08daf3fa2154e9c768d6 +B = d2557dceb2d02d04d9c578670 + +Product = -ad04212ca8cadb1f7861c5130ba3a747046a2a7e4a0c72b69a +A = e4e5f7d1311e0c5f2e404d55b +B = -c18057a328d8c7375afdfd4ee + +Product = -685e75c232f2b4a0e455fe5ee8aea52f292ad8b8178320e692 +A = -a683312f132b2320632e74ef6 +B = a0758f12791453b4af354730b + +Product = 6f588c53185c503dc5b0dc3002d3817ca2e7eb2370b3e9a647 +A = -d70c9b93170261091f0c53f27 +B = -848c86c51a186ac4c9080d3e1 + +Product = 5e3bc5a04e054a9a244bf7c86cae215072fdb70e9199989427 +A = 898b64ef09d7cf63966e1a3b5 +B = af638b12f26aa5d12e97439eb + +Product = -8d8372b235b16108285203c03a8aef6fdd3c0e1a9fd31d4f68 +A = f6003dc83818c14fbe36c9998 +B = -9343f6cbcc81fa4c9399dce5f + +Product = -5ee6509abeeb7af7fc5caef40d1822ad3150c8d74f522dc7c8 +A = -875ff6f56ca72cbdf614bb9ca +B = b375a68a21dfb1f159c22fa14 + +Product = ada25be404a17385af5a330da799e5909da81bfa0715baa6f4 +A = -c9b8df392e76abc3eb7d5ce04 +B = -dc5ab818c70594dd917b4243d + +Product = bb24422ee4656ddfcd50ec38201b15baf679d3b75e5cb878ca +A = f8e12cf4defe388b78510f687 +B = c07ee817b4ae95c2915b88966 + +Product = -93da296ba164c7220a17330647aef0980c94eddd2cfa2a3b2d +A = bc5dc74ddf7a1363d1c2b1f25 +B = -c8f069bad7f93cbfe6df51169 + +Product = -6b2e1d132c4e0b0dc9b7e7de7d424fda5180480cb5ff47c755 +A = -a8048acb66a8bb88df39266e7 +B = a34e0b265d71435ae8c92a463 + +Product = 6ccb2cd93783576a8602ae43f41c786008b6623a4cca0a010a +A = -b071f1f54790c951c1dd2a1cf +B = -9dd89bb4d9b546207e282e2d6 + +Product = 5c742ba47d0d64bd97509927ce957deedb855766cc24c60016 +A = b44f3f252c368096fa62747f2 +B = 83439b97dbac579fa4f7b7d23 + +Product = -7347ba65691c913286c2fb55e45b177f031c1d86ae0e9f654f +A = 937cf0643ffa53cdea24d642f +B = -c81881f78243dd5737a7d28e1 + +Product = -9bc0649a703674e59f83ff9b8a560e5cbf51f65ca310f80f95 +A = -b536f8d9769be6f62da941ae5 +B = dc0746fb101881ae0cacde6f1 + +Product = bf4992fc3a124de350f9fb90ea825cf663b1fa051282ef22e2 +A = -ff7eacc7de1bb01d668c693aa +B = -bfaa6627f9fc7ba68ae41bb2d + +Product = 7c8992d34cc0b63f1c953f68d4e12a99d3f3a34d16bd76caa9 +A = 9e0d5a850d078890a983c0ec9 +B = c9b72c118b3e1f1023a696ce1 + +Product = -a75840c95082b9a0ae0d6e0a4eb5e09288e4e2a66e9697d9cd +A = b2b042a21045a74ef1a5091d9 +B = -efbf8b120b384e869692a1b15 + +Product = -a510b333bdb4ed7479c142e8fbe2b12f7671a42acbe16c0998 +A = -e7fd5e0bb5496b9d876c27f65 +B = b6262653b2be44501af1d85b8 + +Product = a1c1e90afc4684754155526e307fc6ed798746f347bae2c880 +A = -b84674832b26ded0a690a8ff0 +B = -e0b7bdf2fd05a038ed3640b78 + +Product = 5588e0c33bffbefcc5695ca0615abd383343f21a8a0d22b222 +A = 80cad81ad9a66ab6a1c2e5669 +B = aa0453a77c8af1584f54750d2 + +Product = -6460c2fcd6cf3304ab163ea883ac48e2031cd10f2e9014c0ab +A = c49ad3d7c8848d4fbf913b10b +B = -82b3dedbe3cc7cd532ad632e1 + +Product = -a18717330b711669e85abde8c4dce426529aa621ba3da2a477 +A = -cab4a9c0a331a5a5e826dda1f +B = cbfee5041c13075dfe3399aa9 + +Product = 8ab6282ee892b53c083d319a9dcab48af97a1ac8493c0bfcad +A = -f7d13e47f9aaac8c25f9bf75b +B = -8f4aa95231c1e2336aa092297 + +Product = 8f2d1c23c78777ed371f13155445ca3c88cbc0a9b299bdf9d3 +A = 9d8248d00defce1ad081337c3 +B = e8b479295ecd9cef7301f24b1 + +Product = -86d5e0c5b581fe59819730b4b71e33d1f85f9ab504c7dbe2d6 +A = b21b45e88acff48562a19729a +B = -c1cdfebccc763beeac394b997 + +Product = -484ca05aefa113bdfcb1bc623f730c9f9555b462a8ab4c9606 +A = -8c12b406c02c4417163c0956b +B = 8422b15c80c1c087b17eedd92 + +Product = 614c3c91f60050c785fd229a3ad74674577a90cacb654e0a5c +A = -93d45bce155a23a397506d96a +B = -a87e339c3fd5aebede5fb1b36 + +Product = 9683285f194a7e4feeab196a36bdfc4f828035fd184b9cc692 +A = f196d8fe760fdcae7eb60e2f7 +B = 9f7d88a2163ad818bf3a6377e + +Product = -988a64599c19cc64f3cadc1a83fea6550185f6cc3ab82af822 +A = d0584b2a306671e4d2c9d0c7b +B = -bb6e7559df199c68d6df3a3c6 + +Product = -68456814cb0edd951196d04c853172afdd5787a5bd69a57876 +A = -cefce1b0a1fb22862418bb597 +B = 80f614139947aea5e76cd55fa + +Product = b4b1cbf5d6566e7a57aee0cc5c9c8ec4ad885e8766aa7662a4 +A = -d68ed1bea046c6cad057e21db +B = -d7988b9be54f6e332d019032c + +Product = 6b09212675ff5257a1384371e17b37dcc268bbb141577902e4 +A = a8208053adc20a609d5d01404 +B = a2fa927c5458c4fe662d7a3b9 + +Product = -8361bc26f9bcf55f677e047d822d3004027da0d0455b244d10 +A = e82b6410b29020c2d6810a977 +B = -90ddfe0e7f0d6b9cdc0815f70 + +Product = -f1b6da00923fd513a83e32040a515649fbd362f69ebc016d9f +A = -f9b697d9ec774a8d1ee5ea905 +B = f7ccb46a8869cb028492bed53 + +Product = d06206963f2e150bacdb32c823c3a47f013d5a267c3c0d0c88 +A = -ea8e63afa99c719897ad7f2ab +B = -e36f11f55b6148d1b4f46e598 + +Product = af774a5eae6084df5ca499ef005642730adabf6a4f9533e2fd +A = e4c7af7eea3ec9cc2443b7319 +B = c457bc264c8461789931baf85 + +Product = -76350f428bfbb95e6c253ec0f457aa84cebe8c7cb1af2a2120 +A = 8fd1ff97465775d44dee58ae0 +B = -d268a7d328f44baf80e35119f + +Product = -787ae3f114f9a8dd4d249d5d3f3b0897b02564b9469416cefe +A = -bc0b398bd0ec045b0cf147b7e +B = a4050955c234e473257d0c641 + +Product = 9d6320b3d4aabac097a079b9bd2aca7f1898bcab0f23409fd0 +A = -9d7a4ebac630cc0662b816fb5 +B = -ffda517d3eb3214986b04e290 + +Product = 80bab8bd800ac8c9dc3bb57dca306f10af6fd88c5d8314833c +A = 834bc50140d6c6ab938dc58b6 +B = fafee47793cbc533b3c66af3a + +Product = -b08920f5922226b1dec87151ae087d8a7e5c1aea8c9be148b6 +A = bfd5b1ad323c79428cb2db36a +B = -eb956a10edebdd658e6810fcf + +Product = -6d428e08e8350bb4b0fae3b662c82df2aef7beadaa17430dbb +A = -a57da276998c548101f514e9f +B = a9040c1909712e1149d295765 + +Product = a57da276998c548101f514e9f +A = -a57da276998c548101f514e9f +B = -1 + +Product = 14afb44ed3318a90203ea29d3e +A = a57da276998c548101f514e9f +B = 2 + +Product = -295f689da6631520407d453a7c +A = a57da276998c548101f514e9f +B = -4 + +Product = -867614005cc204a8d19720fe13 +A = -a57da276998c548101f514e9f +B = d + +Product = 12bf3b676f64e5929d38c35e803 +A = -a57da276998c548101f514e9f +B = -1d + +Product = 24d8f92c68303ed0b96f91a8167 +A = a57da276998c548101f514e9f +B = 39 + +Product = -49b1f258d0607da172df23502ce +A = a57da276998c548101f514e9f +B = -72 + +Product = -6fd5e6ca25c3d51b2e529f22173 +A = -a57da276998c548101f514e9f +B = ad + +Product = 1276d4705b81b82da4c7e82559d7 +A = -a57da276998c548101f514e9f +B = -1c9 + +Product = 1ddb9abfc5d4017f068a67b5f4fd +A = a57da276998c548101f514e9f +B = 2e3 + +Product = -3a8b41c914b1b4a4e341433601f7 +A = a57da276998c548101f514e9f +B = -5a9 + +Product = -97c0f4ba414d6e7d4c8b7ced84d4 +A = -a57da276998c548101f514e9f +B = eac + +Product = 1198739e0c23639c176d46d13f7c8 +A = -a57da276998c548101f514e9f +B = -1b38 + +Product = 159150954ee0dedf541e4dbac0ec3 +A = a57da276998c548101f514e9f +B = 215d + +Product = -441d4bc44c86f02ff12c3d91a1562 +A = a57da276998c548101f514e9f +B = -695e + +Product = -64726b76005ebee27592237ba5dde +A = -a57da276998c548101f514e9f +B = 9b62 + +Product = bbe4ec7cf7c5bbd198e0ea86bb658 +A = -a57da276998c548101f514e9f +B = -122a8 + +Product = 21f717d05681fd2eb1796776a69ef7 +A = a57da276998c548101f514e9f +B = 348a9 + +Product = -396ac788a1748bc6955f99be4d2c64 +A = a57da276998c548101f514e9f +B = -58d1c + +Product = -54a213eb083aed1a04f3d1b2da62e7 +A = -a57da276998c548101f514e9f +B = 82eb9 + +Product = 1366fb9c20fb14b8b9a9be4b3e3dde1 +A = -a57da276998c548101f514e9f +B = -1e037f + +Product = 238d65fd26da4733e5d93ab2485d40b +A = a57da276998c548101f514e9f +B = 36ff15 + +Product = -38272a99be154d531e922be405aee9a +A = a57da276998c548101f514e9f +B = -56dd26 + +Product = -64651b62b6a454c08951632c7f2c398 +A = -a57da276998c548101f514e9f +B = 9b4d68 + +Product = fb272e3597b816144f8b945ae6130e0 +A = -a57da276998c548101f514e9f +B = -1848320 + +Product = 280d9f5ed7243712ecb9a7c6358bcb8b +A = a57da276998c548101f514e9f +B = 3df5795 + +Product = -2fbb6bb8e1ba78cefc47fbbc20e188ee +A = a57da276998c548101f514e9f +B = -49d6652 + +Product = -57f29c13691ffa1642d2860dab9d288e +A = -a57da276998c548101f514e9f +B = 880c2b2 + +Product = 139c19d7668e6aabf2d7206cb0723ed34 +A = -a57da276998c548101f514e9f +B = -1e55aa4c + +Product = 2950ce04bf0cf836d4fe94b88fb757d0a +A = a57da276998c548101f514e9f +B = 3fe968b6 + +Product = -5175239488dad05a58414251496d2a06c +A = a57da276998c548101f514e9f +B = -7e020414 + +Product = -945ff0ed38bc6020cf679cbd3e0758c6d +A = -a57da276998c548101f514e9f +B = e585e573 + +Product = 11c69ae98f6b27e95477986f796bc67c8c +A = -a57da276998c548101f514e9f +B = -1b7f653f4 + +Product = 209afe75e8fb5ac76d13c06b545f5d4d73 +A = a57da276998c548101f514e9f +B = 3270154ad + +Product = -386d64b215e41506514f4988ed237e4da2 +A = a57da276998c548101f514e9f +B = -5749c891e + +Product = -6c13cccdb1d140d0babd52707ea72fa278 +A = -a57da276998c548101f514e9f +B = a72fb6288 + +Product = 136228a8a45540372b9b3cd7f82021f6546 +A = -a57da276998c548101f514e9f +B = -1dfc08a2fa + +Product = 1f0ad3babf9d132eaa08cf5cdb8f19dbf01 +A = a57da276998c548101f514e9f +B = 30050f2e5f + +Product = -50d615ce183258e95af77319b766fac81e2 +A = a57da276998c548101f514e9f +B = -7d0bf92cde + +Product = -817d358293b86a56a4e881e50257c549471 +A = -a57da276998c548101f514e9f +B = c84efb12ef + +Product = f09b9e80be251de474d726b16e25a6865fc +A = -a57da276998c548101f514e9f +B = -1743322a484 + +Product = 22996cb0f9c60e35dce49f3825f8a479db26 +A = a57da276998c548101f514e9f +B = 3585acec11a + +Product = -2b307a37c91791a61c0691858f5f783e4678 +A = a57da276998c548101f514e9f +B = -42cf6be3e88 + +Product = -8826698fcba6c30d755fc523de1cc25301ae +A = -a57da276998c548101f514e9f +B = d29cc8af592 + +Product = ae37fc99fd419809310782714530d7428d77 +A = -a57da276998c548101f514e9f +B = -10d8059d4a29 + +Product = 1d544a20f9bc7d95ab67d1f65743979f23bba +A = a57da276998c548101f514e9f +B = 2d5eadef1c06 + +Product = -367897184e9929a0294d320f10278889fbeb7 +A = a57da276998c548101f514e9f +B = -54431582d0e9 + +Product = -943a509076a00060a2e7fa1cddb7468d734a1 +A = -a57da276998c548101f514e9f +B = e54bb102f4bf + +Product = fcce6e42879af5ad13545c0bcaab85b690cea +A = -a57da276998c548101f514e9f +B = -18711db522cd6 + +Product = 258c49f86d0cbb14ae9edbd3456be8cede2022 +A = a57da276998c548101f514e9f +B = 3a1562c7c269e + +Product = -4a8bbce59ad7daa51136d557f7fa16e9a2faad +A = a57da276998c548101f514e9f +B = -7350e780b0f33 + +Product = -82f53ec9333275d5cc271876a7db936db49280 +A = -a57da276998c548101f514e9f +B = ca94ad312dd80 + +Product = 11daee4fcc713db5b2806e47fa5dff3b5b770eb +A = -a57da276998c548101f514e9f +B = -1b9ed6758f9635 + +Product = 17038cac4f0c94dc24985ea108ae6682e175752 +A = a57da276998c548101f514e9f +B = 2399b8a9b1116e + +Product = -37e5f14394bf347a3ed061769fe8e6424af4348 +A = a57da276998c548101f514e9f +B = -567840a7569fb8 + +Product = -9253d4a32a88d8f725984514d969012ead7cc9a +A = -a57da276998c548101f514e9f +B = e25b246f733f26 + +Product = ace3648371c16a931d29004e79f5b9678391da5 +A = -a57da276998c548101f514e9f +B = -10b717b27b6a13b + +Product = 1faa5b45d04c143c339b09d3aad94d39b94ef960 +A = a57da276998c548101f514e9f +B = 30fbd672e106aa0 + +Product = -3fdfe246d27aae0d08d63b2bc501461d2bff3b8d +A = a57da276998c548101f514e9f +B = -62cef5f078a8253 + +Product = -5b792bfaeff04ee3d948cb343a249d49eb344f57 +A = -a57da276998c548101f514e9f +B = 8d805ac65649c49 + +Product = c5f824406161eec321da5a58e3e00d393b55abe9 +A = -a57da276998c548101f514e9f +B = -1323dd41d2e1e077 + +Product = 2226dec8a57be8e84e42559007e2d101ccbe67f8d +A = a57da276998c548101f514e9f +B = 34d47842b5d0be53 + +Product = -340f50f812c7420b502000940788a700f6769788a +A = a57da276998c548101f514e9f +B = -508836d8e1193d36 + +Product = -a00f1d96e19c590479625c5329a87774b5964cc78 +A = -a57da276998c548101f514e9f +B = f798fc858657f888 + +Product = cb94f830cba8997331912a6a31c34f1bef826d121 +A = -a57da276998c548101f514e9f +B = -13aec7a5c52a0883f + +Product = 16b45140b048d6dc0b9fc811df7ce7dd88357fff04 +A = a57da276998c548101f514e9f +B = 231f27f3e347bd67c + +Product = -2aa94179351b4e87de5849ab619d94f47450640199 +A = a57da276998c548101f514e9f +B = -41fe3ec2189599cc7 + +Product = -5489401d3da93158d4284e557d74016c0a7cfd935a +A = -a57da276998c548101f514e9f +B = 82c5281df41bfc066 + +Product = ae04d5b212ecfc9a6d7df07794d565df52991fb70e +A = -a57da276998c548101f514e9f +B = -10d3139229f5d02432 + +Product = 27821bc811f45d63089790b41d307be978d4b19564c +A = a57da276998c548101f514e9f +B = 3d1da85cc012b3e234 + +Product = -3de3c9e9d7fa3020a578706339314890dccf63096c2 +A = a57da276998c548101f514e9f +B = -5fbcfb28bfc9044bfe + +Product = -627dcb299a6720044abcf11469bdfd3f951edbb5bf7 +A = -a57da276998c548101f514e9f +B = 985b930517b78e6ba9 + +Product = cc0622441497a37fddf1856d5e2c99df52b99ea4573 +A = -a57da276998c548101f514e9f +B = -13b9b88948fb7e95cad + +Product = 1a5168e1a492210591ad1ed660adde9110390e4caf32 +A = a57da276998c548101f514e9f +B = 28b631c6e04b6ab0d8e + +Product = -4d8ec27b7460ce616421b9f5cae708c2ac241daa59b4 +A = a57da276998c548101f514e9f +B = -77f99bdf1eb09da6dcc + +Product = -55afd796db7bce822a00073fc8926d3bd0c79772f036 +A = -a57da276998c548101f514e9f +B = 848cdd6212b9bb3620a + +Product = dc494b0d73e8ec07cd2bb6dd8191d2b4d48e7700cc34 +A = -a57da276998c548101f514e9f +B = -154c39567bd8be5f6b4c + +Product = 240e9301b4345b914ecd91a49a0e651524dcecb6fdc6c +A = a57da276998c548101f514e9f +B = 37c6e7ee89cf87674814 + +Product = -39002ecfd6d96661b336157ccef6536756ad2e9219be3 +A = a57da276998c548101f514e9f +B = -582cdab09915a652203d + +Product = -695f49fc891d53f396f0593efae3973082b76d4f9e944 +A = -a57da276998c548101f514e9f +B = a30074dbce2246af043c + +Product = bba2b7b45b97cb0d7fb30fed95089870742ad69e7aed7 +A = -a57da276998c548101f514e9f +B = -1224195afc7b394ae8cc9 + +Product = 1910edc278515ab7d4cc09b496dc3c06c32c75bc7368af +A = a57da276998c548101f514e9f +B = 26c6701c39334169e7bf1 + +Product = -3670b7f9b661aba35ce50984d83173c84c8fa60e04d100 +A = a57da276998c548101f514e9f +B = -5436e84b4a29858a68f00 + +Product = -7fa0d3e0082b37475342b7e22e5dbad7b8d4cb5d64f871 +A = -a57da276998c548101f514e9f +B = c56e0f44fc63bca242eef + +Product = da7fe3367ce640fa5941c033ac1874312f10ba5950da75 +A = -a57da276998c548101f514e9f +B = -15200043166ff309f0426b + +Product = 1871d72481f66b1d413100edd6b339cbbaa67b3b2b3cd57 +A = a57da276998c548101f514e9f +B = 25d057879db26fa29a5e49 + +Product = -3cf1dd1e2df3456757d72f35353c3c7a659b2ef844ad857 +A = a57da276998c548101f514e9f +B = -5e46be70de21949df67349 + +Product = -5e861cbe47aefab2a7ea59292aab1258932b9a322f66e63 +A = -a57da276998c548101f514e9f +B = 9238670897685a6c9cbdbd + +Product = f623344788efb857db55c924e95a437effa4dc8bb2bcd24 +A = -a57da276998c548101f514e9f +B = -17cc0ec84c228225a7cf45c + +Product = 15514c916b0ae7cde6add16c629d3e19ba52a101d75dff72 +A = a57da276998c548101f514e9f +B = 20f9f925b3ed307edbb154e + +Product = -460cf5b14f9d0b547c3084bf44207bf881745c409b08d07f +A = a57da276998c548101f514e9f +B = -6c5cbfd29f3dae1dce99221 + +Product = -5ddf7fb91d765af97dfda5333d8779e80837c2b51cfb4f43 +A = -a57da276998c548101f514e9f +B = 9136aa79080defd1bcf90dd + +Product = 12c1a0edfb6ab6a0caae2553fb3743827e1470a8954e0a3fd +A = -a57da276998c548101f514e9f +B = -1d03b512470dc3052779f3e3 + +Product = 28388a244214abf046488a8d95308d95f021eae4b994a5a52 +A = a57da276998c548101f514e9f +B = 3e37dce784274962ff862e6e + +Product = -4da476e76119deef291c0f56934a912a0877278a19a561ee0 +A = a57da276998c548101f514e9f +B = -781b2f2dc40094a7f8fed520 + +Product = -5792496d33dd45e225f9dfca17419a04e075ffc0c90b37b82 +A = -a57da276998c548101f514e9f +B = 87772a4fb582acafd3e4ef3e + +Product = dd3a3506a7d748de16fb43d666928a87de0354d8e8a1bcaaa +A = -a57da276998c548101f514e9f +B = -1563841bf7851ff158a395716 + +Product = 24e8fb09a9ab0808ff643122479dea5ed41060c6c5b74e8752 +A = a57da276998c548101f514e9f +B = 3918c30b5568318a58e9be16e + +Product = -366c125f96b38b58d01c939c27c4100af3377eabb792b5491a +A = a57da276998c548101f514e9f +B = -542fb814f45924aa09a16f2a6 + +Product = 0 +A = 0 +B = 542fb814f45924aa09a16f2a6 + +Product = 0 +A = 542fb814f45924aa09a16f2a6 +B = 0 + +Product = 542fb814f45924aa09a16f2a6 +A = 1 +B = 542fb814f45924aa09a16f2a6 + +Product = 542fb814f45924aa09a16f2a6 +A = 542fb814f45924aa09a16f2a6 +B = 1 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899f571f257fa81c36a868d80e7fa2bcbda68a72ca3e31db8892b94d073e006433dd7128b7bf677d2b411532e5662cdff66d657673d58e03d4a338bae1a5513296f91d4d2b5b680527a2e12318e422ec2b7f05ea4fd3ef4780576488211dad5733685a8f0e5d2ecda549a15eebb235495e70d26b194c994cf16d98d356218d08a34d1593d90bc0d3572df0e84bdb1705c6c5e64ea4895599bb21bf219abdd4329813ecc198e708cee199c22f749bdeb0c206690e8420883f6c0661e47b29969986a7a72996ef63234c31aa39b7be37995d2898063ef5c3b672c43afbc1a065dec2671ae87e17639cfcd3148145a8323e1e9dc4f9c9daf981dd6aba4e8be01344c2eda185b87 +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899aa73af54a4e1825aa6714016da99d9e3d0c02eb139716db437705cd9efabf0123b0831689735f4e488f226e577d4688d30914dd50ed368939452af0a7a094c065c6718bd54f53a808585fc1728c3bd1e7c968d76c6dca32f95a8323bacad31cdd4aae544d4208262c40bcf726c2f26cf1e60341c3e1e0c8ed4542555b9bf00488680b737a245cc9b7817231f1f6f1e614cdf43ea281fb850ebbb9305b1aa441a45dfdaa1e98b9d79d9ca511be070bfa94d8cd3cc750607c93e1b451a14e32356bd48d77860b37fd2e714827e770a5648ce8579a00ba5cae034502a8b03ba754994d9e002130cfdee6bfdf078dc8f6767b927c964197664c8e32bd3d31bd461ce +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a80dbb5a46feff82a92989bca577998c68ee619d9ea9972c6f139e97f5bdde635152830bedf302873508d2ed73badb82f9e32e1f4d12ea8c8b1059aa6d15f8e17d649bf41467903ab40d220d50570b5a263f637c0fcebc0ca29f8a81e2a01bf39bcb60cb9229dfd40618f706b941836bc5c291dec45ee9193e74d3a4cc5f73054ca56fd774a359f17a687268587393b76204a37cd48dcb09d3daed57a7e6d7d93a0ca3d6de8557fc4ddbfe9cb163fd10b7fe5f270dc57aa2fb88cdca2a3795015a17fd352d85fb688a38fa54883d0cab67aab08dbabd58d307c601f0f810014d78b101ff0bddb6d550b2480782406a905b9201e70ef6c1cb9765e91c10c8f5d240c +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6788e14a9e3812764dd3ebb7489e6e66058ca6ccf9c007f8c049eda369b2889cc411bca78d4f5b0e3a9e80243e87e112072b01922b595afdef4dd562e58ce917f11e69c8fe050de54fdb2d607d05f09afd6dd140e9d195b91d85269610a1e5d5036e8c9fea2d4fa693d80ecdc819b201c0aed27dfe0b92b4b3b9ecabb3b9548f0d27dc917ffb14308c4f970863e163f375852fcd9fb115640dc40534f8f51a7b903599117dca6c80924fa9a1aeb43cf5a9a3f67ae818b484feed51d7ef60b3656720891b13a983c02c281c8a0954f13b7bfaca844d2cb66de5c11ff507e39cf774c7c93b38e296a44f04e5ecf2819b57943fb0509774ddbcfeb +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c58ba611f7 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d8899c7bedb01951b0f4fdb2c0fb64ad74707fda20027f4cee25da9b59be288d404cbd348f27600b87015d28f03cdf411f0e8c22deb9de5b3e0094f7820d78d59c90017cbd426297f8a32fb4b55b09362cf7cfb5910085acb24dbf618752b8b74c7e87f9cac44cb3b7486c43aa9b19a64d40a74eaf1de8b5f168b43d5750236aef753278c11294efd1adaddb6addb846f45fa55d7391898e8ec1c82bcf0008d9850c4c096571e8872e975dc8af1ba01bfbe8c8c27dc30cdaddd198936e4496579741a3a20e1b8e17241fe4abe5e98794e469180b742b2e1904940381f703f512885bda0340fe74e997ab269be00a3ca29bb937db2e06d8054e26dc13a5014ba51b175 +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a817a4d88997cc097fe3f7ace3ffb0fcee52b45551165bb02354b229788b59128489879b1a0373e9862a17692464a2dfc5d09185a0f1c67d2359ba70b52b03f21c7b24feb96e25e1a2dc7f4723952bf203979f7c9e38790f881e2b35006157825555d4c867fce9ea0a3cc6f1c94ee308a68e33f64f286247465ffe854033e9c64f5d79d6d66dcb38ad03535b20376bf4c3cf26e07ef445192ba2baf08bb5286695a61ff6b5dc7aa1832017198d61a324b8c244572157323c7bb3a2fee226133e1b0e0f2ff067cf71fc24bf38d0e172f459b0cdf0707c5bc586390faacf428bfdeb04e850ee0c35f6807eb6ca8d3a473dcc2239541115a8b0d33ea33295ff8c13b2a +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a80dbb5a46fc245133c3335163cce37555d36c555182e6d9a754b9aa9305c070083d0fe806d2c5eda4a976f749d6ef40515c425e6531a7f4d11926e49907b7a8a938205e0d6fefaacb145200cbe3deec686476bcdc1f6bb3535147ecb00818f2cd666ac0dd497f0fbc087bf05c6425b7752a02e2a695655d4310f04943a6178946a74dbe4688bd1eb3f1a166aef37e39f3e1d36b6d6d422ec0db264cae8d44869f57a92952bd74a026dd7cfc672803905f029c723487d4123a7520688fc9c68b2384be32e881f64d0ed7ae555bf00e5799740dd8c6accc40f3fe573f194f4848bb05aea8a5509f2dd10fce023093f1ef20267244a990d7ffd462f4e85a4 +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6788e14a9e353744d86d954c06f3b84ef271b184ac9957a5f88b08b606fa6aa97afc4983a62f1e74aa3f242e14a3f4cf5ea415d1437818663556a29d117ea7df1cf1ee32f70d6d5566e25d53f892c42d3f92e481b622455fce36e400de09e2d435099695354ceee249c793b76b3c544d70164381e0420ef8b85609502afff9130729ba7851e0775dc5d8c606ba614e7607625fbc38908c88fac43e29ff9b8728f5809e63f20289246b5128016478437550a833c60edb0df43dd9a47654f2e4ef308d4a18cea57ea4b0c6d08add07f2e7adc427cf591c29dbd1f975432922e3f2b71c75e4d2557efccf626be7a0d522b658d420ae321 +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9ffec082c5 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a8126efa5e7be8e75d54e5ba9405f671d624eaf8d7a115d0479f6fb773b940525fd46b69bc43c815b6bb1798813ca95790bc68032f0b9e73fc964a9922507d8aac25f859745939b828ef5ed326b226b555e5088f13531be16272a89ad41ae82c940935b5d8fe75dc520a230cc279a887bce01bae0a79356f044af13c6f4a5e53c00b2d03cfcbb0f93b26202441a207ec91576410ac1750e257906d945bfe9204b73fc417600bd191edcf2e3eb79acbf4f84dda372405b5e98397abe85c1593543cd7a5b17cb90e299f422f0ce107d86b56474e435dbbcbb5314fb579cd68d54777aa2d0ff9b6b96de62b4676edea5b09589698ed829cad22a52aaec732b79edf6af +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a8126efa5e7739032d1f8bb68307f4adc912f1d9b83797606874d4f2c669fe0b263565c4898a07701585237aa444234719adb869c17142126611a9cbd6e689fabb2847bb9dc5e2dc89694621a7179df1fe7371deb9bbdf5fea0b271d86bcde2796a65331c27365fb97fa3647435c47e5c854a95718fa49072cc239d046ca0ac2bf453beb31070370d59483adb42b9876776e43fccb663887f1a999f625eb8e9c4cdd0a89099c42cdff06be29ad9ea66a957002925c9425a83c3e74096ca31324134f5d4a2b7d3b8d7fd8d72192049f79c670874f65201c068c5aac2008a7df4e5eba02d88be8ec23683513a9cffe06671a7c2fa5da7a7aa571914caba1e +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef989b0c6121e293a808857c1bdb914ae0fec75b02d527263093a9d9b8a42289ec74dc73e0e46568a9e8ee117659597434048308c9b66fa7a539694285b1238a13d1163fbac33db147e5431af1c7aca5b1a118db4f6650ec6340491ef7a2d203b53e43d536639f980eb6e92a37bffb2149c5eb45d6718a9496f0784370674c1d29732b944a3c3885b68f0fd2a121f556dc82d1b942e7aabba780f087b9df359d86e2055248c3aabc568e93bba67d3ccca2c4240c876506d63bb05aad6fc4c77dfafff1731a46c6711bc60c4d23976268928bc63e1d133add0633c737bb508c81fa1ff3b452b49b992ebac930432d555ab8c62ae17357b1186e80689672f5a9f472c +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96c826c5268b0a6783ab6c7314a43e85a92955a5fbfbffcd31ef0913ba93563dab2b7f54d90fa21ca827ad15b5b1fb399a303f94837536b2813cb563f793fb780e91f8333a2de7bb9f10efdb652a504d6f242e7c15362d3a6eb6e3d1a5abb03023dfe964656979765a14fe8fc36af3d785030ce549b92a91dcb8e2aa13f5b89eb8449b31961a0f77117c8cac79af95ee69f6594e557af7bb017cd885027ff7c0cb1d2f99d1ed5eacb788f645c25150e737cf1184b546bb2d55f2014a18015ffe647580df6fe4d528ce983309baeac0347ae8739e2b1f6d1a83e12e4dbfea1cd81b11b8628837432ad1906c70323529b718c8c6e398e1dfa73 +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc95262b94a0aca2f9f +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c374bc58f225bca564b7e6561b56e0edbb3a7f5934f382b916ab38423221d656357ce0e9bf1e9b04c0678b9c555e8365a0f977c95bd8dca1fb2ad2268193531ca36cbe7f40da8e1afe097e451dc2931b323ce731c03cc027a92ed8ae105c5e9c1bd385e238d989fadbf3aa54c097a8666df8a66b7e2d016e65a2a632603f2c84290ccd7346ada28dff79dd06c7f7989689aca4f494b977f984650f91327ab9936cb92675932440f135e54e4abeecf255d7061482b4c8d91769e02fc94b8acc43325d69541903c3ef7a7a8a5bd19bf886506d42bcf0efcb6197a8d178d6a60516a5aa771ae238a342dc61df8c18c6ba1ed952d4e0c3409c14639 +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea39224eed9ef1 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c374bc58f2210cc134828c520a58df29ae28863a158a044937809d7d84d2940efbdddb448c64da5f1f31977e7865fd5529eac82fee3e804064a6315936295f8cb26f0de16a47373f5e8365939e280a57dacb508166a583a630c75730c2fe54971e70a35e224e7a1a21e3bd8f417a47c4796d34148cae15068e19eec637bed8f32846dc5aa7e8f50599e840903a8129206fc384e0b4085f9f1e7e3bf2fc67b62b02566ce73cb4b22d471cde35b4f0cccb74283cdded5748d62286f7ea5c184c1308d520ecc7c7f1535b1132708298bf94c0967bc8f8541bb2f2b3c81f11e50f1d8cba4ce3746ad5f85e6bacbefada657c9b386b991b2 +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954a6ea3922 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef96ebae79ce1360c36ad2daaf856508e861c7f68a2611a215a93e3a15f68f72bb80a4fe9f4cfb6c7f91639179342c633db0f70c9dd849b5b5767908b27e61b812659dcd1a0613433f2c0940be49010886bb384d4676bd523f9827c1a48c7649fbfa73e872a5160796813956979b0f3fd3af728dd48f8a7348090300e41b181c8acae08a3b3106b61f90b0421803e6eba0d68e9bc93d3b659fd6316ba2815cb4b3b6a74f1f3fd24b0c07f619d995ac2beada44188eb72d371a6894f90087eaabe148755409bbff60114bcfefbfe2182e6dc4218d0da75af80059bbb14e848c2e60790fb35bf1cb685cbb133b2baf3f2faefcc3f69e34102def4 +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad1eb654821c4af954 + +Product = 4f993781409d730da892c8451cc47a4c5c132a2c079f6c13a2689e9552450ed0b35c5291b82aae5614c0fc34f777940798a33b8bd5e010eb3c5c88595e8668fc8fb88ccd3d0cd5eee7c88e5b0b2be4605980fea4f8f2e42457963abe7860060482cfa2291e568ea55095ae2ada1c6bf9fda228664c9e02e7f12a8da4c355af044a537dd65dbf9c5d746c3c5f05a3d4d0515a48d9434b38fcbcc485558964fd9f212cf3c4aee9c03aebc468c25740df679d17823bfb20d96620c64b29f4013f0385cdd1a40fcbec3b06132a52aee615c4dbd880d0b030d5bc6aa06801d21fabd49774cd81ef504696d9655652db220ef9518c8ddd2bbd782e5f8cb06be77fc8d0c29f12d4ce67bb2478369710d003f0cb6f40a1341a5a5f2509d2d189084ea4346a44368a54f44c2be4c7b90c4d22976a31985927d0379b2e5d715a7e67eb3228943a07325a29316c695867e8f4ff676e00ffca0a6dfe8fe24652aef9e7f12616e8a54e367b90942f543a01dc7c1b8000ff991228ae83fe0131cfc235ba12ab2bdb33bd4ab0ba1b356bdbc6da4a70eed9fbf2c704e14ed6230eb5478dac0b02f4def1d8c076d1c0c0e2c4cdadb248de4acf961cee51dc41e545bd5a605a0860fb343c28ebf3f8814a9d5a7e0f3e9c93e742db76bc5671258d1da7758b41efead5 +A = f33cad5d3876f0b60a001e13043e41033ee78c29ed8528fd6f22a87fc65c8c650277fab430722fcf63b3984c35ac46883127d544e2f44a465647814e15c0ff595382eff8bdff3be862f8a57a51f27ab4af9899861240855380f5bb883476699ef9eff179a1b88c64cfd6648240a5fc68de054468dc91dac11aaebe696dc05b6b0de0f54bd365ad798f3c85bceaf6ddf976b72cdf69de58335520d358f90e9856de5357dd5d2686cd1a41293d8c2687ba2cb1504420ae2c07014521889172b30df89521e2f66142345115110adf3dc603b1ddba5d80dc6b42fb980e9994aba2dfca00a3df8ea9062f570ec7e0e94d2bc9 +B = 53c66ff2bc0e0d733d26f809aeedd151406ae8f44104f4e58f99e3eb54b06d542806932966bdbf30e13d81e5d6fa96f5308fc45613894b49dc7b766af02738dd89b10ca372d6232b0cbd57dcb873dea3c7598ef69b58ea5d72a0f2aaabd71025b488824a35cc33f8068ae4cd999fbb536be54e07f26df5d3bf8705281c8e94dd3712ad7c6a88f9d7b04f6f8924e18568ea07d46e58d197984824d797dd9ca1efe9763c62cc55fff69fad60d6501765dcf4926c18c027b4f9825d53cc38e99365c1b869245e66e7792f40dabeefe63e404cffc1d2ea63a9dd3fd4643afb2ddd288c6d4737abf20cec860584a7a600b4ad diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/test/quotient_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/quotient_tests.txt new file mode 100644 index 000000000000..d848edee7f02 --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/quotient_tests.txt @@ -0,0 +1,1839 @@ +# Quotient tests. +# +# These test vectors satisfy Quotient = A / B, rounded towards zero, and +# Remainder = A - B * Quotient. + +Quotient = 1 +Remainder = 0 +A = 8cdaaa7c422f3c2bb0ace2da7d7ff151e5bdefb23e6426cf3e6b21491e6e80e977bfa6c65931a8dee31fc7992c0c801d5d7c +B = 8cdaaa7c422f3c2bb0ace2da7d7ff151e5bdefb23e6426cf3e6b21491e6e80e977bfa6c65931a8dee31fc7992c0c801d5d7c + +Quotient = -2 +Remainder = 1 +A = 107f0e6cebfe22ac11294a06fed2b994d01c9b3610d50bdd254adafd08c93be8ebdd1e85e1286fe9c9e682a90cbbd6351681b +B = -83f873675ff11560894a5037f695cca680e4d9b086a85ee92a56d7e84649df475ee8f42f09437f4e4f34154865deb1a8b40d + +Quotient = -4 +Remainder = -2 +A = -3d8746ae2123c2d3f1d35910b42af1f86f5e81f8e98986cea20b2a1bdb8af6cf111f1258f112c837accdf4868463fe9eba536 +B = f61d1ab8848f0b4fc74d6442d0abc7e1bd7a07e3a6261b3a882ca86f6e2bdb3c447c4963c44b20deb337d21a118ffa7ae94d + +Quotient = 8 +Remainder = -3 +A = -5645d65662eaac73050de06f8f982a9b2ae680467712284be3e2b0e58ef4bf4d72b5be5e12ee1fd803b47f161759662ff5c4b +B = -ac8bacacc5d558e60a1bc0df1f30553655cd008cee245097c7c561cb1de97e9ae56b7cbc25dc3fb00768fe2c2eb2cc5feb89 + +Quotient = 10 +Remainder = 4 +A = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b4 +B = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b + +Quotient = -20 +Remainder = 5 +A = 12805392c55ffa0e27e85e15f2b339872793664e9ed3074cd2600aa52459a57197130d1ea46775ef43115c9413248cc7b34805 +B = -94029c962affd0713f42f0af9599cc393c9b3274f6983a669300552922cd2b8cb89868f5233baf7a188ae4a09924663d9a40 + +Quotient = -40 +Remainder = -6 +A = -3579fc4d6083394c691b060cf9e20318fe17da0487337f76710bd11512578830ba94ac7b587a2d5ab7cb4afe611e349cdcfb86 +B = d5e7f135820ce531a46c1833e7880c63f85f68121ccdfdd9c42f4454495e20c2ea52b1ed61e8b56adf2d2bf98478d27373ee + +Quotient = 80 +Remainder = -7 +A = -74ebad4b39ebaaff82cd91082408c979527907c363d8f0f75db410523f8477c074c45ff85851b6275b1ebc5279029818e78d87 +B = -e9d75a9673d755ff059b2210481192f2a4f20f86c7b1e1eebb6820a47f08ef80e988bff0b0a36c4eb63d78a4f2053031cf1b + +Quotient = 100 +Remainder = 8 +A = d2d8a4419fb3b1c22bfca04ca08c2ee066ccbc9fce2f41861b5eef91efd3c13eeb7eae5abea0ef1849662cfdfef7bbff892c08 +B = d2d8a4419fb3b1c22bfca04ca08c2ee066ccbc9fce2f41861b5eef91efd3c13eeb7eae5abea0ef1849662cfdfef7bbff892c + +Quotient = -200 +Remainder = 9 +A = 1bf534da2f4365c96fc5dd4928e73ac24b157b5136ead90cf6596033ec387a2c14bca828000ae1725f3a5ace8ad67a8c07a0a09 +B = -dfa9a6d17a1b2e4b7e2eea494739d61258abda89b756c867b2cb019f61c3d160a5e5414000570b92f9d2d67456b3d4603d05 + +Quotient = -400 +Remainder = -a +A = -3a172cc9483774544311a1366659d9e61cc9fac7dc11c68e36aa991ef4d5e96becf5bac3e0967c904d926617ea11bb9551b980a +B = e85cb32520ddd1510c4684d9996767987327eb1f70471a38daaa647bd357a5afb3d6eb0f8259f2413649985fa846ee5546e6 + +Quotient = 800 +Remainder = -b +A = -5ecff3a3e47fa615b6e3ce2dedfdeefbfe1d437c394631820968a9650b59dc3a2dd1c9a0b06537e4e5c408a59e580921503580b +B = -bd9fe747c8ff4c2b6dc79c5bdbfbddf7fc3a86f8728c630412d152ca16b3b8745ba3934160ca6fc9cb88114b3cb01242a06b + +Quotient = 1000 +Remainder = c +A = d3ef80fca0ab3ac3432b22e2b485131d816810c39d02a9c82dcc05ec5e6406bc216026de3abe53ab103ea3b2ddbc2ea377ae00c +B = d3ef80fca0ab3ac3432b22e2b485131d816810c39d02a9c82dcc05ec5e6406bc216026de3abe53ab103ea3b2ddbc2ea377ae + +Quotient = -2000 +Remainder = d +A = 163956bc32325f28f48d41d32bb08d2a9c4ccbb0d818368fb13941e82b27da21d04094f7e897ce79c2d0ff8470505f1ef63fc00d +B = -b1cab5e19192f947a46a0e995d846954e2665d86c0c1b47d89ca0f41593ed10e8204a7bf44be73ce1687fc238282f8f7b1fe + +Quotient = -4000 +Remainder = -e +A = -3763f8e43bd05e6ffeec6d509bbe6ff9a9022ced8cb191c9abaf5fd0e0b75a53e2ad581455e3af09e702a77b164ed3fb54ae000e +B = dd8fe390ef4179bffbb1b5426ef9bfe6a408b3b632c64726aebd7f4382dd694f8ab56051578ebc279c0a9dec593b4fed52b8 + +Quotient = 8000 +Remainder = -f +A = -531dd44dfa9e79a5aec8fa7c84bd3b753c146770d22d2c14a6d2125f7ab95e9b320e84c31cf3e0d883e1295a220f2a546550800f +B = -a63ba89bf53cf34b5d91f4f9097a76ea7828cee1a45a58294da424bef572bd36641d098639e7c1b107c252b4441e54a8caa1 + +Quotient = 10000 +Remainder = 10 +A = 900996b61f58713f0755e68bbdfa4e0bb47f034bb0304f77829847923d14715def1771f43b526c41b9667438b434d2b966c20010 +B = 900996b61f58713f0755e68bbdfa4e0bb47f034bb0304f77829847923d14715def1771f43b526c41b9667438b434d2b966c2 + +Quotient = -20000 +Remainder = 11 +A = 179d7ede3db0c105525286551331d5b9e1f97a7883f0c13cf250afe9765bb5aaa527af7945c19cdd4596565cbc8532a3cfa5c0011 +B = -bcebf6f1ed86082a929432a8998eadcf0fcbd3c41f8609e792857f4bb2ddad55293d7bca2e0ce6ea2cb2b2e5e429951e7d2e + +Quotient = -40000 +Remainder = -12 +A = -293dc443c294c6a6c53dd49e84f58305d59a432afb6c7ea2039cd02a513231239571ae07f29b5427e869b9faa485511ca45980012 +B = a4f7110f0a531a9b14f7527a13d60c1756690cabedb1fa880e7340a944c8c48e55c6b81fca6d509fa1a6e7ea921544729166 + +Quotient = 80000 +Remainder = -13 +A = -5b637eb8aa51ef15a18d9b144031c9756527fc0fb96c84b6df03700e5079ae1b3e96940a2c1e07f3b47ad8a9b2b8ca99171a00013 +B = -b6c6fd7154a3de2b431b3628806392eaca4ff81f72d9096dbe06e01ca0f35c367d2d2814583c0fe768f5b153657195322e34 + +Quotient = 100000 +Remainder = 14 +A = 87c846f5469d4c5819aed0c7e77797209b2c1b83a7a0e2be70280b9f30946b5db9bd0f25a06cf4bdba1c7183a1b9eb75c19400014 +B = 87c846f5469d4c5819aed0c7e77797209b2c1b83a7a0e2be70280b9f30946b5db9bd0f25a06cf4bdba1c7183a1b9eb75c194 + +Quotient = -200000 +Remainder = 15 +A = 11c2a4509f419aa977c3d37fa446fcf21b4b3b9f983fbaddeba4f51c285ac4032200711a54cc6edf24297b1f3d46ad020131a00015 +B = -8e152284fa0cd54bbe1e9bfd2237e790da59dcfcc1fdd6ef5d27a8e142d62019100388d2a66376f9214bd8f9ea356810098d + +Quotient = -400000 +Remainder = -16 +A = -39e37ae0edd92b957e84682358039f5e432c42492a44f3de01cdf74d643760260f2837946608663e12291e9b0695449c1153800016 +B = e78deb83b764ae55fa11a08d600e7d790cb10924a913cf780737dd3590dd80983ca0de51982198f848a47a6c1a551270454e + +Quotient = 800000 +Remainder = -17 +A = -72f725edd5a3dd6f20b5e9ca7da08a99f8ec9214c80588182c0d42e03bcff34b488b28c03cdf41813a6193c10672a8ee68f6000017 +B = -e5ee4bdbab47bade416bd394fb411533f1d92429900b1030581a85c0779fe6969116518079be830274c327820ce551dcd1ec + +Quotient = 1000000 +Remainder = 18 +A = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd000018 +B = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd + +Quotient = -2000000 +Remainder = 19 +A = 190790727c1514b4ef83a1c6aa07493c0af7087fbc8a675bfd9a1e97b8ef80ef684219d6c6f1a5fb5b919f105fd7717cdd5aa000019 +B = -c83c8393e0a8a5a77c1d0e35503a49e057b843fde4533adfecd0f4bdc77c077b4210ceb6378d2fdadc8cf882febb8be6ead5 + +Quotient = -4000000 +Remainder = -1a +A = -22d115ab02f8663d8c009960086a0275d301d358cd3b250bb9e7c16cc6ebed4a8fbe43bbced856d93be64a17377d95f5f9c8800001a +B = 8b4456ac0be198f63002658021a809d74c074d6334ec942ee79f05b31bafb52a3ef90eef3b615b64ef99285cddf657d7e722 + +Quotient = 8000000 +Remainder = -1b +A = -41f2e708ba47494a13607223b08e6d99c0b4247436632961d873804e83446dc97139ffaef3e25969950bd4b5bb4ff73b1a25000001b +B = -83e5ce11748e929426c0e447611cdb33816848e86cc652c3b0e7009d0688db92e273ff5de7c4b2d32a17a96b769fee76344a + +Quotient = 10000000 +Remainder = 1c +A = e4b52f78179039499c2f6b500840f41103fbd60eac0d7082297236f25189c18a8301a92f533945047fbb83427dcade334336000001c +B = e4b52f78179039499c2f6b500840f41103fbd60eac0d7082297236f25189c18a8301a92f533945047fbb83427dcade334336 + +Quotient = -20000000 +Remainder = 1d +A = 10888959278661bc36089519a215bda60f9ce24ff7c0ac1f543b6e652f94dbff1f32aa40cad2b4b4d676f16948551501c29f2000001d +B = -84444ac93c330de1b044a8cd10aded307ce7127fbe0560faa1db73297ca6dff8f99552065695a5a6b3b78b4a42a8a80e14f9 + +Quotient = -40000000 +Remainder = -1e +A = -3ada453530a180fda58533ab8c62beb4f693a134f512e4d23e487dac3b575e5390c0a90992400e402bb47aac93d46ded55f54000001e +B = eb6914d4c28603f69614ceae318afad3da4e84d3d44b9348f921f6b0ed5d794e4302a42649003900aed1eab24f51b7b557d5 + +Quotient = 80000000 +Remainder = -1f +A = -57879eb5d92d565daac3ac5173639bfe44b6ecc69ff770af57bd79c9b93841c5677042cb362b794f3d8b24b0d3b73ed1cba58000001f +B = -af0f3d6bb25aacbb558758a2e6c737fc896dd98d3feee15eaf7af3937270838acee085966c56f29e7b164961a76e7da3974b + +Quotient = 100000000 +Remainder = 20 +A = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d00000020 +B = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d + +Quotient = -200000000 +Remainder = 21 +A = 1c267719338a4562e934bc57fabe6da86ca534a34244bd38c15032f01f47c2fd498c83f644b345c5c661ada0e586a096bb63000000021 +B = -e133b8c99c522b1749a5e2bfd5f36d436529a51a1225e9c60a819780fa3e17ea4c641fb2259a2e2e330d6d072c3504b5db18 + +Quotient = -400000000 +Remainder = -22 +A = -250249f2185d4b428fa9534f03ef3cbed535bd31c56c0b273e6c3d35e0266f7777a6e59a99da5738b8e3af8ac60061d6716ac00000022 +B = 940927c861752d0a3ea54d3c0fbcf2fb54d6f4c715b02c9cf9b0f4d78099bdddde9b966a67695ce2e38ebe2b18018759c5ab + +Quotient = 800000000 +Remainder = -23 +A = -710b30c23c3c4e646ba90da33d2ce35af2ff181c40b02e3ffa607966730c6b6e274dd4c3c78e578e0b10f431f2d832274bf6800000023 +B = -e216618478789cc8d7521b467a59c6b5e5fe303881605c7ff4c0f2cce618d6dc4e9ba9878f1caf1c1621e863e5b0644e97ed + +Quotient = 1000000000 +Remainder = 24 +A = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719000000024 +B = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719 + +Quotient = -2000000000 +Remainder = 25 +A = 1ed1b7d9e4cf3d44ee98ef69850e61a39f54cc407c6795c07c887374441fd9ec258c21193f8a8c55802fb8f8c579cf94cb0ce000000025 +B = -f68dbecf2679ea2774c77b4c28730d1cfaa66203e33cae03e4439ba220fecf612c6108c9fc5462ac017dc7c62bce7ca65867 + +Quotient = -4000000000 +Remainder = -26 +A = -35d324ba37d2000f960ca1c9e1ab96e341a2ae6a5ea5cef014c73a39dde000d8ad9606b817ad67e4e4593cc5894d354854898000000026 +B = d74c92e8df48003e5832872786ae5b8d068ab9a97a973bc0531ce8e777800362b6581ae05eb59f939164f3162534d5215226 + +Quotient = 8000000000 +Remainder = -27 +A = -7039477c3e0a6f415e25e9f9b1dab1edcd8a23f984e7e3bc149c206a3b756b1be001450af4049cd4535e4243d7032afcf6790000000027 +B = -e0728ef87c14de82bc4bd3f363b563db9b1447f309cfc778293840d476ead637c0028a15e80939a8a6bc8487ae0655f9ecf2 + +Quotient = 10000000000 +Remainder = 28 +A = d6c59dd07409da98f7bbc7ee471b6e06c4d9e832e9f4d04ed9da63564d37d3072a950564cf549bb5d6e7dc85565d3cc8ba340000000028 +B = d6c59dd07409da98f7bbc7ee471b6e06c4d9e832e9f4d04ed9da63564d37d3072a950564cf549bb5d6e7dc85565d3cc8ba34 + +Quotient = -20000000000 +Remainder = 29 +A = 14d27a16a9cf2fdbc85b88a604dd8f0e57b5b34a27089d75d805e05fbb367dfa61c085aa98b896e3e53b85ef774a3fa52417a0000000029 +B = -a693d0b54e797ede42dc453026ec7872bdad9a513844ebaec02f02fdd9b3efd30e042d54c5c4b71f29dc2f7bba51fd2920bd + +Quotient = -40000000000 +Remainder = -2a +A = -3bd0119619fbb5b260c44050d61e6b1925a49713d754ceb06bafb1d730a93f199df654b153c40e75096ebbaf5a6ce3c801820000000002a +B = ef40465867eed6c9831101435879ac6496925c4f5d533ac1aebec75cc2a4fc6677d952c54f1039d425baeebd69b38f200608 + +Quotient = 80000000000 +Remainder = -2b +A = -61a283fe41d965ee770704bb453f689cb82a81089422d6d904a91776a06d32857220286e6ef6327807b724062dda143b46890000000002b +B = -c34507fc83b2cbdcee0e09768a7ed139705502112845adb209522eed40da650ae44050dcddec64f00f6e480c5bb428768d12 + +Quotient = 100000000000 +Remainder = 2c +A = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe10000000002c +B = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe1 + +Quotient = -200000000000 +Remainder = 2d +A = 1eb7cfb197d19f56ad994eca52d1af6466fd09da07d68d63067602046b2d42d3063ef5eda6b58afd69fd92b0b727a0ecde1420000000002d +B = -f5be7d8cbe8cfab56cca7652968d7b2337e84ed03eb46b1833b01023596a169831f7af6d35ac57eb4fec9585b93d0766f0a1 + +Quotient = -400000000000 +Remainder = -2e +A = -3ab858b3329e5bd0469118be52a867b2febbe2894d962cedeb3a5be1738db1cea106cd0710c9f6937348c2c63b109ae623d500000000002e +B = eae162ccca796f411a4462f94aa19ecbfaef8a253658b3b7ace96f85ce36c73a841b341c4327da4dcd230b18ec426b988f54 + +Quotient = 800000000000 +Remainder = -2f +A = -6137bae6cf7573afcbb6fd5c066ba37648cba8db0ecafe9dbc66959b19deabf42f3083719a2268b7602bafa2140a1ee8ce7d80000000002f +B = -c26f75cd9eeae75f976dfab80cd746ec919751b61d95fd3b78cd2b3633bd57e85e6106e33444d16ec0575f4428143dd19cfb + +Quotient = 1000000000000 +Remainder = 30 +A = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7000000000030 +B = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7 + +Quotient = -2000000000000 +Remainder = 31 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -940693131e2ba7b2af531803794983337dd526f0d84d08d58723edf002a388d55c8502d88c2a2a6e78233a2a1b1c8d339a13 + +Quotient = -611b743a0e2acb1043bb33de50a59eaa0405b37bf6b622075dd69291fe5b53305dbfcc377d1f3082319c153d0c1ffb3b3346 +Remainder = -16e346b6a4297 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 30c77f3380ccf + +Quotient = b9e34073d5e6e5b9e5d2d7250150f8ad86870faeb88d5aed5029fb25c176de216e2388e0f5d33f7c3b56102873eb40b06f2 +Remainder = -16ebc86eb88339 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -197b6f6ad5b75c + +Quotient = 141bc8752e846cd63743e6fce4a22efc3eb5f0ce46ba81b8f578c94c516288ec3610fc9923f45d4af2b94c0b0a20b48ed0a +Remainder = 9bab19f12d81c3 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = eb90162ecae18b + +Quotient = -381bd85c951e1dd775b0d7fab344aadf06b1b592c643b5852fa44aa55159eedf3b3e47fe0d9f399ad92da85ab2bfd18240 +Remainder = 1e4f817a2f52b71 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -546c109fa8a9d7b + +Quotient = -5e385a83b56830626cf8306acc232f955178080e86384bbcf92eec3a8961360223c4cfc1d8d118022972e61866cbfc46b +Remainder = -292e149300fdd1ad +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 3246242094394c8c + +Quotient = 9af0246f4b49316df43f61ae3795a764fe9b1d071ce227982ebda7988a7a7a98129c94a76635c6913cb15e4f75ea1608 +Remainder = -dd3b3e32ddc79cb9 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1e928618913898b2f + +Quotient = 1fe40099811c648aa4e84e4fbb8cbc19706774a11391fc03a9667d8dc72dd0b26c4a46d0bae56ba90fe4bfac1517d241 +Remainder = 16e021603d30dde2 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 948887c1634f4b08f + +Quotient = -3f4fa4c179dab02ad461bbea8f890292c934496db560f72878323a4463d77ae261363f4dc8f53eab145fcc3815d3253 +Remainder = 407ccb4f0b814dc5c5 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -4ad17434071e1ce664 + +Quotient = -4d17d19f7f6861189a520776339a1e425876808111c303e391118714370111151ef4ad2e6e84250f59b0fe09ab3293 +Remainder = -36f745b0f421d16db7 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 3d71635bcc25183cdde + +Quotient = b976d544af44e711351c6618106d3a002c42ebbe22fe939a2457d24e8dcc35c95dde5c7c77af6b4545344a198be82 +Remainder = -107334ab98e5099fec5f +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -198a54e35fa0cfa328a9 + +Quotient = 1307bb8e89aaff7466bc238d32672fbbde7be19d15423bcfa14f9a23fe85af9739b72807fd4bc420ad0b0fac37a42 +Remainder = 170ebe9b83d4c43b79ab +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = f8e923a8bbc0242eafe3 + +Quotient = -3925a167c1c4d2fae265f277302b989466e309a7211e0b7173031cbbb91ab7fac8dfe43c9d832764e222e9d8581d +Remainder = 4d404e93edb435dbd60af +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -52e36cee22274556059ea + +Quotient = -4d5a6ef346a872142b999ff9a5429198b3c2a97e968f55aa2c01583efe30e9687c57e2bca2372db4d3d443052b6 +Remainder = -3a2ea5f9d204dc31f21833 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 3d3c79a115d9071b573d2d + +Quotient = a49dee54430f1737a04543d5f549efafab25f0f28f5e304f1bbca191f99521c2c4be1b9927bde19e1ec2060bb2 +Remainder = -17d02758f8fcadca911a95f +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1cc65a75211f2826c9d0811 + +Quotient = 1808ab7c0ccac2ff8f7cb61248bf4624fb60352a356fdd1408904f8c6fb0cc52b7642ec59183bcaf5dd89ca0ac +Remainder = 5c95323f3b8861261dc31ed +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = c516e6e3fa6e3dc52cf5933 + +Quotient = -437e04d7076794850aada0cb4ca7a1055df103e74e00766be6a2fdb2631bf294cdbf2695d0a2f8f9eb5587aa5 +Remainder = 1fc63797594c56160536faa9 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -462ee529b488d1db2b6c60e8 + +Quotient = -5dde5497accc4575a412e7232ce75bdf7905936e09e382d5c9f133faf82a05ad9dcc94ad858aed34cc14c714 +Remainder = -15e79293d5e055f906381a899 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 32765b0a34c88864d39bedaae + +Quotient = 11ac52a9287472e1d3b8577b3d50c95076e190714796761322b3ce869d96b44387e190e824849ee345d0a22b +Remainder = -a158ccc7c055d64e7df3fbcf0 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -10c061a37f6cbd11bf0c327643 + +Quotient = 1ff5cda1551867577c5ca72c86516a82fb8fc5f59ce967b73c6bcc1b85168389872c9a747ddf044d6dba174 +Remainder = 21e766a0020ba429b330a325d5 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 9435cd2dc2a92c950bb9e69b83 + +Quotient = -2719c892fa3f4dbc9951b2095056a16159adaf32dff902e20a800a0cc2e858ccae408f2161aae25d3e1f6d +Remainder = cafbe9caa1f83fd0dd3d5a6881 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -7924e4dcf8f96da61f54bf83870 + +Quotient = -5080dc99dba295f4a2d9a474c2ddfa3b232a82fe629fe62177514988983eff8195b37d3fee3afa343b497 +Remainder = -94ae72f78982ac1ff83f300cfe8 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 3ad70d4b6b9b5f5b2eb65da67e1f + +Quotient = e475eebcfc53d49ffad2e0c2a4ba48fe7ce02c42ff107e01ab3fe5b26eee45c83c4f58c181d77c259155 +Remainder = -c83ac7582a02b47ee734e0f24dc5 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -14bbcff5423a260b21895327b18bc + +Quotient = 201308a421b85291d23465d648ad2a8d6f3393efc16fb675a42ea7bbca635ddd8c2449b1b34e5db30a03 +Remainder = 8e07efb8ae4c9df39533042362081 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 93aebb72a81ba68e8881fd1a56a90 + +Quotient = -2584cc534f88f091fe471c652ac66a695906a7cde1fc1cde9be3ee09026b690c1a899378ff31f6acb90 +Remainder = 794801d9d5770a60e312b99d6b9f91 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -7e408caf387a0ce9bbf4309c80755a + +Quotient = -63f7bfc0fe5a5421bc0a19fa6c87713a72eeb2a33e5eadee8c2f32c20d14f403ab8bdc424b9e8e0c68 +Remainder = -24227c242afedee2473c1a66a5cc29 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 2f622c665af7f8126eabfd90df8e9c5 + +Quotient = e557e6d2180aeeee5d2cef453fbdf38e84cc148f4608ade8836045498be2d318520ffadcea6319432 +Remainder = -dd290149e0e159f9ba6bb9f5a4b003d +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -14a7623d1d9dfc177e913d3119d0d30a + +Quotient = 1651d852316d472b41ba0460566e43fabb9257861859ad0fb6ea5a6433a4164299e078f4d50c58afb +Remainder = fb60aff5fdd2a2b794b0d973ac4d92a +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = d439da27b5e70342aa5cb365ece15665 + +Quotient = -3ae357761a8ff43d3b1bc53eb336260342a39d22f8fac44eeeac96c2f6de32580dd6a688faa9c515 +Remainder = 4fa6f7ee4faf2f6be99c5ce4b65cd642f +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -50700f9c0da59482165a47a3eda2bf07a + +Quotient = -543b4390e4e254226683aa0b83b2ca176ec27a373969fb88f766ac72adc9125ff83b2652e46afd3 +Remainder = -12ff398d9a7d9e97a7f63a0bb293c8fb0 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 383c5a4f1767e83fc382ad4f1c7c2b7ddb + +Quotient = ecb72c14c59d49287fb6b2cacdf04619ee617d5f3f0f1b2890fd4e79746a4fbd848613cf5eb437 +Remainder = -1035512a2717a89062d48f1bfd213333ed0 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1402b751a1e5f3fc46e22b43240d6ce9b27 + +Quotient = 1e800ddc5d5126f322298383f32fd593623eb88a91b2d68c5d9f56e20c16ffe2cefabe873570ab +Remainder = 72935d534bed5ba557b91ea023601f50b1d +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 9b4df766c608ff3efe5ea1f65cc850fa73c + +Quotient = -2c2dc2378abceb983904cdf6728f361d279b4c821710ae785724a7251c43fe4f705f023afa7e2 +Remainder = 249f6433af4e8e224eb570fd438197af62f3 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -6b382f812816c77d65c94c0c660b31a69b8f + +Quotient = -5f3ced1e42fbd3c6b2c6f1e16953e0c1bb6efb4e49566f974a968f69a1a66a3d7558f5a802a8 +Remainder = -317a7fb1af65982fe4641fbb1e5837e6ea3e1 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 31bc97372d17038fd842b72eaba2abb26df62 + +Quotient = af3fef8111c449b9e0858e7e53e1d00b764232f7a077d75043249c387ece30af351c8a40335 +Remainder = -a1493bcbf57a8480461d62796aa8f8541ece4 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1b076b2f7b78b4a0f0e24ba3a05d6c697efab9 + +Quotient = 196734cefb08f09cb32ffefc07da8d9545d3451d5a08736757184bad94c73be71311cf1e01c +Remainder = 273e33521f4d74840a96b3fffe169f79d32855 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = ba7746f4400f812919a3dc86b00642e1487691 + +Quotient = -3c5989cf33145057a9c8e904435d12939db519cc6b9ca1c0a11934399cb139a73613950f2f +Remainder = 456ebf56c636d54e37709b9e799e83b7a08cb93 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -4e7d4f389423f42e980eda55b4a6a45f6f4bdc2 + +Quotient = -8432cf3338bce1d12586f83025aea50cff3864af3eb2103a36bbb0aba10b0ba4831641633 +Remainder = -4f62c678137df301c4bef216e6aa910104e76ff +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 23d4c57b5a8162aae8d937be12efbcfd7b96ec06 + +Quotient = 9f94c4399eef16dfc65a1e015e0786c86470299865932c4d564b71c9b1551a9c0308af38 +Remainder = -168b74a6073b4a5b54fa14aacb5c3bb7897ed0fe1 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1daecf01ec633610373b79e04c22cd7499012bc66 + +Quotient = 1d5b838dce6c0324f157ad125adefde6e1045dce9ff97cf8d1d39b79bce02128e3433ffe +Remainder = 3aa816216d55fc3c910a030fd10fbda1e12f2ac2d +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = a1598a12a84e9cba42ea0e200e88d4599c9f615fe + +Quotient = -3edb182b53890ca8762f3039d2d71a8a27c36cc884d0879e0635e6326af0182bc47cad7 +Remainder = 4610b2b1305220bc0de584dd3f87d90109012a8077 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -4b5c2f1ba3a82047c9de61d47cbf1bec86b6ef90d6 + +Quotient = -7571ed4c509630886483f6ca0923859e644063acb38cfb338bf3a681fe449501262516 +Remainder = -21c579846594fc3e5efc53ab01576a7b32d69faf41f +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 28550e1f7c6492f4cb682c37b105f92b049c13fc03b + +Quotient = 9ed8fb31327a110ef4377258681c5287de8ef9dbe62aa4fe84a7f2a94bb69607cbdb2 +Remainder = -1b7bb759dd0ebc346cbe216e56be8063f063490c17c5 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1dd1e61caed1efc07d21ce05d889de1ad65808cae026 + +Quotient = 1aa716227d1ca6af68286062b2d6dafd7ade16abbd5d6fa4ada0365832fe18f73bf35 +Remainder = 32e714b0c4ecefb38735cb88cd5e07c21c81be858cae +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = b1b959a7b3262d7f4dff488315903aeaffd982b726d7 + +Quotient = -2a9979a530046939e0b43a25edfbea6775784eb5cf346a9fc3a2d22e1aad473cdada +Remainder = 4edeb91a2472e80068b1883cf2cc45d68ff9bbed1756b +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -6f31bbe097587a68fdf01d0bf93830bd03a23920ccc0f + +Quotient = -566ff76814e1c7d31ad53bfb9f3c0607ef1f7d1cf9bdee6e1cfb78b3ad7018f8bbd +Remainder = -1eac095d6d84021c33aa9b219d191bd0637f20b5920eed +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 36ccf5bdece624b4f54c729a8cde13325d8dd764f44894 + +Quotient = aee4f377611179d8b6315811dd94639aaaee63e99bddcfa8eee297ce1dc04daf8e +Remainder = -59cb3ba7efa1637c46b21795872e8deaff90f13402cfaf +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1b157ad838684b45065aa77ca3238a4d8c5427f719cdfb7 + +Quotient = 1c72d32cb83cf4a9043d3bb5002f61b03e29c34e44a9fc5cc4d613726f5e618546 +Remainder = 7312d11fb5828c7f1a0060a5152a7644fc1e6a59de28d03 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = a681444c4d47d829f7b629b561ffaa0c3be1232346c907d + +Quotient = -2702afc4095a0396215e3ca36e2a59725f743b30de0dd8d4ec4d943fef6c37162 +Remainder = 223dd3080ede3a64744b14df8742cedd71388b0df99073bd +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -796c9ea38ccf516a2054a1e584c18b64b996c9679960585a + +Quotient = -805585c6a7badc933bced6f8373ffdfe9796e963d3fc90e85b1a22c38f842062 +Remainder = -a6ebff3f651644915d5c466cc2915d104f0f85a44e08fd6f +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 24e8fb7a6a3057ddcafff92916c46f7e4038b98c3104ae831 + +Quotient = 10383ff8feeb180d4fde925b534be97ec3d5f1f1dab5d8cd9ab5d8ea646cfcdf +Remainder = -a7efdd0401c74a69cf74442fe3da907acf92e8edc51668828 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1240a71ed8d81e86fd9b16e1d64f438b35d6f8eff672494017 + +Quotient = 195d95a520fd22317492117dc756ff97806c48c1aac67a41ae56fe503a60cec +Remainder = 8b8692bee56f8a1ada9ffd8b3583eae33a0df9b73a7d8585f1 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = babe02063b61cb90634ac0493174073d2419e00728d46ad2b0 + +Quotient = -37791adae674b866e4791c107a697363847dee4a58a37806391426ea48b8c9 +Remainder = 33986fc6a5f5c4f4e31458fc7de55e08a4e9320509d90299b93 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -5563bb852e7338c65aa21c516eecf47f498e5788c608ed46cae + +Quotient = -68a30494eceff55e4f54a556dd9b30025ccfa22c0952fd746adfd13d31d00 +Remainder = -1b511d0ab81d528d00a1058850bef48df2e9ae9357e779bb9231 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 2d44e919fd27bb3fd2093062d11830c30fa77febafe0a2082cc6 + +Quotient = bd30999592dbeabb8871b76aa04cc1c6c3794a83f0178c2ad505d8189485 +Remainder = -b0dbce286df5faccf0bdb40ca60f508d436f9410c5e49c3f1360 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1909930e2d16fc877c15895a3ec8b2125858bfa1c5a1b8776bedd + +Quotient = 2171694ef4a9d57b83b09357a511d4e11cecbab5e9387928b480d686a0e9 +Remainder = 29abc8898d5ef85f87323c2a6fa36ab6e1bdbcc0ca742b1a2347e +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 8da37bc9c7c9bdc62f49cadcd40e156e776b7f4c8f7ad543f463b + +Quotient = -267d470f32911150d9944e684c14e1834734b15475bee968748dd5f6502 +Remainder = 53a2ffef61709bd7143c4c876e021f20a99ba481f2b11abcd45da3 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -7b117ddccee97816c2ca2f1a612cc0d94ac67f5a79ed41744c8fc7 + +Quotient = -5a21a3bdd3a3d4f1361a978706ba1cec409c296a5b3c369e91fc8317bb +Remainder = -2cdc818f1e445fb3772d2a56833aefb2f5565a5fca80662e6fc1845 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 348dfba3c793f0018d7d3a70c4060c3148b4a3163ba60af9d6f8b04 + +Quotient = b301b4050fdf4ede8f9c746b26d968110e1eb119ca42cd9c9bd8d4fab +Remainder = -17993daf81711fe59204ec82e363d2b91971129af9206ff9506d3cb1 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1a76328184b9bea8770c91cfccf8ab98e75b2224d666af58022aca80 + +Quotient = 19c401336dd43c221a61264f8b91791d250e6c99c61850efe6d1e3532 +Remainder = 6c9e547a77c98eaba1b021777dbd98ea88f7fd37c95a2b182f2b9067 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = b7d7b1f95f4fe2f267af88b81af88fbdf603e54ab6de73ccd000c32d + +Quotient = -38a77853de88a8db14612884b515e3cd7c673175779d4ab71ba58f83 +Remainder = 51851549cfa00dbfae388cc3b46fd4824268e00e12fba288acceab339 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -539c0171f48e4160e5c308ee9e74f35d8b6d032e946dbcf748b1335a8 + +Quotient = -79a7eab82e5b65f4f6734e8803fa7c30852ea3ae56e801c5dd11778 +Remainder = -f89592eedcbcc68d5df80663b3cdc638d9d779707d4ae5a552d97d009 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 26efac15401a945ffd37066bc5af23191292765164a0f1e4fd537fd64b + +Quotient = d33afb58753a21581c5b2351a74f3d220599ed56ebeacf1d43eeb2 +Remainder = -f699437f44af44b3ddc080f5b74f753d35f70baf3866040ba3c64b30f +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -166cc6a3c60facfa0d8d318f26c6514c7eb9113f6b625c1de804ad379f9 + +Quotient = 19e55bdaaa5a375c36e6869700f8677db563e5cf985be2a8d1b012 +Remainder = 7bccc3a653f29f3f45b52b8de2449c868c64d976666c01bff2dca03a8d +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = b6eae7a82b5dd1554795573cbf558d7cfed813eec270c326bf290adccc2 + +Quotient = -297530094c3e4270ab5cf67e60fa5af6a32eb41b18b050fa6d46d +Remainder = 62d8b502e172da7bce53fbb7c1ae376b6c21b3a3a47523aa0023406e353d +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -7241ae5f1aaee9340d437ad2dab94b70dd29fc6fff7fe31b100aa5001644 + +Quotient = -640f3c38230962c6d6fca459afe0e46137525e8d62dd9b84da73 +Remainder = -16fcadd5155910764ecf0b4bd0afc3707e2ce49cedcbd5414f1c7d860e95c +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 2f570d2da7a4e62097eb494ca43f7bde33e36525308dc864ffbaeb5d48f97 + +Quotient = b3895ebba13c8f383ac0482be02e1f5518511420cb4513426bb +Remainder = -21bc847fdfd48c7a4c36c778681ea20481081cbb7af6b281c8b8ebf2b2c3b +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1a6233954b3480af5f911a6bb8ad33967d5e0446c3e56f521e892c986b6b82 + +Quotient = 243f3fbefbf842c79c5e96162fc42fe4f177a59d27681c54b3a +Remainder = bbfaf15a90e744dc4a1caceda3cb339e5491e4507a1118613c5e9739f976b +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 82ae783b8a13e2e65d52dd3a6d6b057163347872f4d72245ff364dbf2421ff + +Quotient = -30f7cef2948c9ebed8fa3c5ea9a9bfa96ee4e9729c9b18e9d3 +Remainder = 1feb3fd887629cca60c664e385dddf538d9bf7fff2d34ca9e0e7614946d807f +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -60bba60d69093c0134fcb90aefdb9c190e7bf037ecc13dab3cc7915d7893046 + +Quotient = -6b6f0183c1f598a68683ba7435c05d700d74681fe472669a1 +Remainder = -1f4d58f81a8c18523918d31791a00ea9aafbbb87792d90a5392273ec4e405da2 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 2c17372a5128d7c403a3b94838072ecf9aff88d164764b12bfbf6261df957e2f + +Quotient = c4347fe42b2a7d9d5a650b72724369c5c1f59262a7be3fc2 +Remainder = -1103ec9c4a15373949cae4e34b7b42e242da41edbf5ad8362ce5e5426d3154a1b +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1824671758069b7660bad819f06c86fc76a9344ea38412058380363e5c5b4086b + +Quotient = 15e8c8d6847dfe974cefeef5fee93da9e58b74d640c6c413 +Remainder = 61dac240f2b39832903d5ecad9cfda5162bf8ebb0610545f259b75c3dc6ab8771 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = d83386fb9682576cc70cf84520c53169e391b414f5421cddca6e257bd77753c40 + +Quotient = -3572711bf994e6ad48535cc4d65ac323ef1ccff530b4337 +Remainder = b5899d4cb879e37022c539962959339d055900cca16153da09b54c658753cf50e +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -58a05faf5c61f85ac5a090b6bb045c851ea17332d9bfad4309ce2b7a79ad3cc575 + +Quotient = -6931ebfc6e34305e5d7cba5284829d088d1ec0abdde508 +Remainder = -1b09eafde481064bab3a5c7fd895edceca40b1e62a9cf953eae1061dfbe00936391 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 2d0769f392ca9ec629ef1bfbdf08cd8cc9219330ffe3c05343df792dd94b1147714 + +Quotient = 9a4800f0cb2bfbe8d234410deb510103b7da30cbac7d9 +Remainder = -971e4a529e439a1b96b942001631027ff2fbe40b8939e224adb7f2ed30faff64d1c +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1eb3d7971125a036c3a67d9f5ce580a4ef4c469a492be53a55bafd2eafd4032b5b9d + +Quotient = 23116704b7a1a86cfa2ee5707ee46268634db5d50dc0f +Remainder = 467c6b64c8121e4f250492191ea36a27119a0a6d19af519bf7ccdc2436c885c99d85 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 87134e98f73470e23a96c6a9139af3d4d21574de8aa9ea1d720df8940bcbda343694 + +Quotient = -3b7f72ecf4f55c02366c52f38a827f5773b7cdebb9ba +Remainder = 194b334b2046a66be3ddd7c6df01c88967fcb11e97b8206d000bcf6043c6e9ccb13f5 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -4f9d0341cadfb1f0bc38184d93503faa196fb8170f8ba2b5d3b512c09d39b7f79a5b6 + +Quotient = -6db1d69019dd4cb26fd65d5b88a31bb6413b30278a1 +Remainder = -2042a060391e181882dc0c8d91c3b03c1ea35e2eff01babb3ae876ba1e57a505d44856 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 2b2e8f445c0c3aaef0285945e4ca37a700310e003086f34d02c891b94b117f3d3032fb + +Quotient = c0e5b9a5853bb21b5e2e37f469764579d5cb2bf984 +Remainder = -154669d4bce7914cdc8d79f2b8d1faa43e8cc3b20fb0767e1c9a47c9e1daed4b665cfdd +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -188e619dbb719381e701363de874fe168529c10f30d3ff184e4356991fdec1649f72235 + +Quotient = 180054f8c36833d44cab9dd61e6d89d28605c564af +Remainder = 59192ec5c6fbd9773b8b7dd7d8ab1800dfecc8eb01c29997d15ad75b79575d9e26e1fc9 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = c55b5eb165c63ac2794bfac21980ebacadb93f1e059309fd2b855621572e8d9b3f29018 + +Quotient = -31412e97045c19ec38951b0e3884c66d1d7479437 +Remainder = 56f1425227bfc6eb1ecda7bfae0e5cb59e92a2cc5306b28465c8739e40893dc5c1e94cbc +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -602b8c25ded1ab3877f58cb048c733649c7dcadf87b2652e35c4e5544d2306107ebff7b3 + +Quotient = -8da1489ccf7203ecead94c67a5750884122b6e75 +Remainder = -15162026586a1e55dda72785f31c9e6140d166a1fd34c87a7d8c78f8d8f87bbdcf8f75b1e +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 2171ee4a6f7f67d5a33d0a08c367184d70ffe39da28562655e75f6b66c866b1c2ac93e467 + +Quotient = e635f8bdbf80e99723aa5718d3fade4e573be2c +Remainder = -ffbd73bfe05f95bc2b135f12682288c620215eac3d6d56503d93a90e06f236e597d1df975 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -149375d478a096e724b84faf795c589ef0d772c4623f5be38da99006cd833dc5b28363faed + +Quotient = 20f76f5c6d0c8284764a10f6936c22bfba5f851 +Remainder = 82e3fb3f7252dd87b5370d26d9e8b9e98c7d333701f0ce8a05c337054c7aeb343d04d7e342 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 8faf8c0a3ef94ab1069394998e5412a7d84f44aff97edf63abc46d96f897172c38faa0b13f + +Quotient = -382586dfe93872abbe3a504fc62a8973913f96 +Remainder = 4d407323ef56093eea2f3993334215950f4e1a85ba18cdcd77d819d92b8b292c3ec8edea425 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -545d81ed25602b158bc79aadf98a8f655fc399fb8652ae94333bf54c8c9ffaf8c6b3f2a9d52 + +Quotient = -7d179efc493eaceaf46572a1f3a62bdfc4a38 +Remainder = -3de3d817a9cf7d529b5229a503e8ebbbd2c53215ac3c584c010947f780198dee16ffbf47791 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 25dddb00f65d6a1ba8caf7815a8063c5da656d775eae9e0108c68ce11dc925183810888dd04c + +Quotient = a9f7e5f235bae0e3e29393ac5c99d510b009 +Remainder = -150478b4a0df3eb20dcd1be8da283a00636c021c5c6337e7732aae9c4b49853b95f6d2475ea7 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1bde6cae7f5ced9006c0b1a61fb50982a433e4e2050aa486298f456556d8e909e96933e2ba3ba + +Quotient = 16de125df5936181981b4c2d0051a8b4d211 +Remainder = 29ac7c8a11f9beb9ad649257994216146b663bf4f237c561bf315d95778fcdb1010283475ebf1 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = cf24735a60ff5906410be5c4d98e3c9247919b57e404aeabc7eaefbf07bd64762bc61b96c9040 + +Quotient = -268a52cd10ab4814268f66d9f44f71a98eb +Remainder = 20293699f12fbfef2e391963866fc082a7884cd13b1c9bd8d5d203558feed2b889720be936451a +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -7ae7d548212830013b7d653072c33f0dd54a6ebd8792bf75809d29a8c798dbc67c3edd99a69b85 + +Quotient = -8f051067ccb82b6a3dffedd0ff2ee97c46 +Remainder = -100dac0d3bf5aacc5fade281c071eb2399560a65349566567ce1c0c34e43f175a575ed1eeeb3b07 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 211ebb5dc59a051fdfa3b18ac491971e863f2086cdc099672c1215af4ec877e29950efa4f487be7 + +Quotient = 9b7ee4c499386f922432fcb1a453ee2ec +Remainder = -f410122a74386d724cdd45b2e548645ac5ee4a44cbfecb82aad34ae470526674da44ebbf557bb75 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -1e76750814dec1ecbb1af0fa2281ab3185e94e47fc16a77fed312f23f261ad7709ad7c9f85862c1d + +Quotient = 23efb26228d7bcf281cd45f54572e2b3a +Remainder = 65bf2ef1c2f8e94d98060aa305f85e6cb869c74eabad99877010d30654aa2e578ef6aa3c5f1122e3 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 83cfc25e90a61cf8686e3d5857b2f958674d478622c54cf8427275ca5e9312ed24e44ed4a1b5e413 + +Quotient = -2cfcae0e922f2d884bfa0a3346dc9812 +Remainder = 14de2725b11a9c6784d9608c52770d29b9fbf824ecd4890bf28f3ec0dc6c52e4df9be540332b8882d +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -694b057ff381badb37c7c15c81e74cbd6774e8d61c9e7d450811c36262ea834fc1287fa59708ee072 + +Quotient = -4c0238ff3c18d4d58e543f020002802 +Remainder = -2ddef796c50817e82ea6f64a02a8c6b30ab40070ff5401c2d39ca14b9c4d99de33834bfe566a0c2efb +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 3e51c9ab14f522b55e8f9d3ba995c0846a864dfa2d568ea211b0cac1463ce6a1da72d0a15746fdcc9b + +Quotient = d41f9102a7785ce64f76b7d7b870b0 +Remainder = -106eaafdd518c658bd371164ee43ccd915a01b513fc7d220900039ff840ba36450e16ce9987e08e7141 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -16549c5d57b531528dd4d781f03cf275b66cb94eba038b782b739c3ab30b8631c8706abac06004a942d + +Quotient = 1616b432b3277e774aad92b0cf544c +Remainder = 2c89373720b834d718ff3df985ae47c3a7cde0e0309f682f5fd48dc97a1ff3d69fa0dcaa1245e956445 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = d6721300e877a8145d05f4f3d8085697c2ca5f34a5357fed0bdb7169f83b6f8d855232eeea594846b79 + +Quotient = -320fd6a7375a42a3961362ae196d1 +Remainder = 5336711bf81237ea3449f4e9f4e6358dc250f8ebd86082cab92a8079f2c8f835bc783082efb0ed7e3f66 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -5e9e8e1d446fdd314d487cac1226088696e33161d923acb67d3c75e87e428bdbc193e02f53200610fcdb + +Quotient = -4bd06daed3f30345d269f51e4381 +Remainder = -1f3513bdefa40662f0f50a04b418a833aa2f85522dc6c399298b1b147662ef2164ddbfb7247ba9511b8ec +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = 3e7ab7ffe5f63a6c1e109b95b83af470ff820cdedbb3c90c398ec42e44a45e1ca894870a7fa51f17ad5c5 + +Quotient = d6fd01a0c5b55fbe36e58bbe77b +Remainder = -c51af3e8b430870388357cb366ea888bd7b4ccde09ad3a1d2ee1426af060245c6d6b5980ae87fb66c4642 +A = -1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -16086df3dd5e665f2631a294563c68931faa19ee67d6a2153d262940a648ae71bb3c1745daca5ea977331d + +Quotient = 18bd9a8f5678d28cefd955cf99d +Remainder = e193f2fece67b7abe16373c3f84f18dfedcf654d951bf47585fccfaf67ee04f5037354d057c9f5eaa8eef +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = bf758acacd11f3f3e6665cd740517c9ab2384266f3c7ff9afd0888cdad2f6c9401c24d6c11fc3949aabbaa + +Quotient = -371239db55c79521206c9e60c0 +Remainder = 93773085af7582dd298b09d7098835787978d820289ea6850f27d0d77eecce8614785e32b228f46ca4b371 +A = 1280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 +B = -56033fd85be464301f10177b58d895fbb6df6154da5c2a2a7cfc3a24d83a96f5295fb17a08148a4e51dde91 + +Quotient = 696d8e378d12221e2d970c53bf63a20ef381db8566701972c22fe067cdba99c57b68706a5c6e52f21bb3de861e49ed2141b3036f07d1fd0ee +Remainder = 9f0e50ca76031b +A = b2668f5fbcf4170820ed3fc9b12a61862acf8e3cb17175482efe23c5cfd3556e77634d407b6d1f98a73437a8d6066319a7a860afcab2338a1b1313037e30f4d9 +B = 1b1313037e30f4d9 + +Quotient = babe271ea266bc7bc16d193097903037819f82366c7e9ff8f2cb14157b40433c6ee327038d5dcc44140b070d823befaefbee5e13419f6f17 +Remainder = 93d7c547a9ba0a4a +A = 74b1a591f449377836f378e05d2902b29964df59c6926e5a9182cc09ce3111783cb7021a185340b4880d56635de268d6f3855c4d9997373b9ff8df899ee3b3f1 +B = 9ff8df899ee3b3f1 + +Quotient = 890139fef28aa3b77814e1122b9c7f26e746ee3c507e6082b508fcbe380de83b06a01f735239c6847c30eae44749fc8c5e3bd97eb40ba297 +Remainder = 6c97aace900389d0 +A = 7e89adea82b4cb6feb41297b6dc8d948e72c3d5554a987900e7fae48cfb38fb5282b13d9a1f5793cf7cbf1ef551865041c3ffe0e287714a6ec7123556af55a48 +B = ec7123556af55a48 + +Quotient = 1fdeead441e2d7a6ce3cce2389b2a22248ddca7970ae3f7e7d8453052fd08534ff7c46f6a4537fb6f28df6c5fc8a7d384336e679b74205315 +Remainder = 2903c7cc2651bfa8 +A = 9ca66de3d83f0a747fe986464522bde5e42aeac20e8ace1ea13fa6bc9514c58517479a4281d4128c6d775489b85dfd114ad184613f308f6c4ea484a22ab0ad1e +B = 4ea484a22ab0ad1e + +Quotient = 12f16c8f9f898a08853982e2ac5a906d784c5ab8d74007ba3ab311e861d7c1ac115efe694cab7583f75a4a59ceff2887dab53b2f1022aa452 +Remainder = 4bdaf1f352e87aa5 +A = 6e6a97b358b591b78db43772378dc084a11836ddc9dd4607f263ce620714e8fdf6bf67387c163b6f2999f84270802b4bd5c0f0377e949fbd5d42fe145e66ffeb +B = 5d42fe145e66ffeb + +Quotient = 14e0c06c8cff1f9f5dd8afb6fa6c340f0953a18ba7d2b26b22d8e7f946ef20fd5ac277ceb59cbd4ce3e8213803c3b5b0452ed449e22bf2c29 +Remainder = 55422f1caf4a9a00 +A = bc9c054ff568af73e301e0751bc1ee055e82826cdc53449f2d9f45feda2ba227bedd6df9b74fb58a85917d60b087bef04a156a571716e9bc908ae83784ee35c0 +B = 908ae83784ee35c0 + +Quotient = a457ea94da3237c0dd15ee30e9c13e7b4ca1dc90fcd67951b873787206babaed837a3eb17e298d74cae92d1059636f9aefe11aef9ffa31053 +Remainder = 124768541b600598 +A = ea6dc82b1906c277526ed867fe8b0fbe32feecfb935dbab860aef59a7d72799fd4e952e70b4c9304c7b2a06af8badcd6cfa12d0b6c9db38d16d2c4a24099ca14 +B = 16d2c4a24099ca14 + +Quotient = da0a37eece8972a0e2e8817c54e67c4d9f92373340488539d5051984bce0ae3300ef6ca9d0902daa4d485dec3b4db6c8b1ffd2c5d08b18ae +Remainder = 1ba15c46023500b9 +A = 36ca8763e20e6ebf07a55cdfdd83892bef0bab68ac092093bfdac1a49c1da015541196a24249bb2262e70f7ed53e0fbae61f02ebac4b61f740548136ce50f243 +B = 40548136ce50f243 + +Quotient = 3d8c433daedfbf681b528f88d610204d33bbe74d0b13978c34a617ae94177e07a757519b5a8f1a93a73d0751c7b5b72b4bdf475a9708fecac +Remainder = 4cdfd72349c6110 +A = e0dd7e73b2a64dc017da65992176e2535c43b6fc14f2f7b0a7d894d768bbc77507eac0112b2dc3ca83d70989a1b949ccf374be6a012d80a23a74bba39671fcd0 +B = 3a74bba39671fcd0 + +Quotient = 39d084b444e39c32f2883e9968301151802da15141f65893f37b8b834eb01c074aa1e1a978c5c99732c87ae106bf8db09e1728c8bf2aae88 +Remainder = 2950443357cd7477 +A = 16df31dc290559c3b6a3d192cf15d825cfe79f8dbd5c9848eac7fa90eea5d87f8b430cccf9baab3e8e4dc33467a4234d8551ff25e33af175654686ff1368e96f +B = 654686ff1368e96f + +Quotient = bbead8f70c8e61114f22d36e97861f16037efabe1347613e78c51d7f539065421a66c907faddaed13ad2a0f0b00f8fd594e917799cd937e5 +Remainder = 3013136f5f728b68 +A = ba5e688ab4f8ab5c25592bc4334b6dc2b7a06d491d0f919b716bf1cf109b62a30d9dd59dd4bdf870dd2687894edab303277a5f3e3a537cc8fde3ee3bb61767d6 +B = fde3ee3bb61767d6 + +Quotient = 42aefe467ff2a5614efef1edce25a1acba9c476b3abbcd680140a3aecf8f51c1ebaab8912de217451bfaca2842c0bae717b8a030b6318c0 +Remainder = 1f130dd2ead0d35e +A = 17bd50b5322c51ac883852ad2a4446c039dbc210ca3aa0313065fc88cce6819b324e93b036bd0c71be58586cd2b243d01a4a918c10ea0cc5b22f9d795df09de +B = 5b22f9d795df09de + +Quotient = 13de73dcd72a3638fe2a907fd7f6574bbb228698fa60e4ecffb082911c5f09c74bb4f50564d3d4035d07eedea38b634a3e3acc26c8e9aeff8 +Remainder = acb8702f0113e0c4 +A = e0327b2e59236a3f91ccf960490cc69b2afc854de9299ad2edff9618f9fe24251886afc65f5c581a9bc86013f356d599e98b8b10f5236a51b48a6b29025983a4 +B = b48a6b29025983a4 + +Quotient = 27d11481f00519b786eaee96220afd45bc51700f7366fb5e7da35bbc84891aac3d9d2b709dddae371a6b78439fef810c68eef586e1d68350d +Remainder = 3d1890c5e1555d74 +A = f3504d5d96c9e27a1527725ced337f1cd0a183531642051e166507432c01e8d44c4e8918701c2a05eb8a9d7e26bf04993f9adeef2826ae4e61c602477f849121 +B = 61c602477f849121 + +Quotient = 10bdeac209c67b023044186704735c7291423054bcddc24b731ad601b49372f4d5ce6e9d85002f8dddf0411efce943f81a5e42cee2d0c9fe5 +Remainder = a93a0c5bd51004e4 +A = fa29e37b0d0410d19fd180149b14f94ec2edccd347da65f6832850aa06a61b7b78c96faf64dcb347893c93c560b8043466419864a382c6f2ef1412873b2d8cbf +B = ef1412873b2d8cbf + +Quotient = 1c9b6cffe44241292320c0660b89f2f77aaadc8d36e33f5ac3da0f12b3c114a156870a92079f7192d237f8bf49aeee6282531c929cc56d75 +Remainder = 1ce3e5eb13ac7958 +A = 144325a641463ed6bddfcbd73e50620a44c606d71fac38efb1c9d2747b4903f7b51fdedacfb66db022aea09b43c7c2ad7b851035165ebe59b552d4f7eee617b2 +B = b552d4f7eee617b2 + +Quotient = 1b4ad18dc0e634053beb3cf840b53e35117ea06309ea8ca22e37123fd7e1d391c96c792e5125e322c27daa73301024080d73ba3491484b659 +Remainder = 3286bdce6dc3a828 +A = e3a2b90d3ef446f6bde30d3e726cf3e78212324054b40deb0b18fe00645568fb0a6234b6bded6240977373731bb30d1349e25cefd54b7a9985735e9b78002691 +B = 85735e9b78002691 + +Quotient = 28f5e8da6733240cc2f18e3cf4d42a50d92816062af33a9e1871fa89bdb39a0d905c49faf51cc1c1378741bea34d25ac2c8e522881a6f6087 +Remainder = 135784870eb40c68 +A = 593206f9367b72f9cc59b3e37d2eb23b2061422859162ee53656899c2471017474f500c6e23efe1f6b1e57852cd4229329dc182ba01a257122d76a26aaf9b844 +B = 22d76a26aaf9b844 + +Quotient = 1ab276448d16c533b6e90b5b5ca266e13ec27b5a58c80b7657df963ec2d1fe4eb1c1d24873eff6408bcb3d0cf97c31e85240eedf0efcc1e5a +Remainder = 27b105741264f875 +A = d84fde3d851b52ed3b2a1268e9b765ec6c09c5768bba709b3b799802fadac30a6c3184185e6d57249b1c34619f3c9d2b90bc0c348b22537281a39fcadf738083 +B = 81a39fcadf738083 + +Quotient = 84a87678485b3e60ee1cae3701ebdf0a29ee44115a492c34a0c8e84090e14070eb2ad0abfe2c339f26b5099327515104fe3d1c5546feea98ed +Remainder = 95f7434941f9d8 +A = f79a0643bcd9c28cc22cc7b4178b3340e4685dd2672792516d6fc08567d2de2d3e25d43f100a58826edb146ac94acac4213bb09bdf8a258001ddd0ab110b89fe +B = 1ddd0ab110b89fe + +Quotient = 516a2ac26e5b3afa502c7f3c6f15376f7a380e5842c229443343b5b74dc3de84db3ae99a0c57043e32a504ded19943c0310cababb3e92cf8 +Remainder = 327cf78eed336523 +A = 17c0d5814e1020d5d69674bdf6b9df193a16c0c8567a589d014e8eb7f6c9c36560791f7acbbbacee7c456eb51a4cdd7ca88011e9d8d9f2d64ab08ad74f7be5cb +B = 4ab08ad74f7be5cb + +Quotient = f0da0beebcfaa716f494cf3fc81fe65117c90adde3b3942e8e66986fe8050fd5c9ebe1c88c5db04cea4c4c14779555d70cafb53870671f95 +Remainder = 3b2f844440d7be00 +A = ebba8c393c2a22b094d824ed95b4acf6875719fc165f73ee6d359e1134949169fdacbb42d5deb8cea96e11e3aac985635b5bcc6c02a6778cfa8e03d9ce6fc680 +B = fa8e03d9ce6fc680 + +Quotient = 56527f07593774f0fa642241400985d0bb9b41d3dc9e025ca069130d93afc972d75e3fe0f798e127c3e1b4e925000459a3a5a83b15186e516 +Remainder = b620b7a3b752b78 +A = 5d6cad9e26267abb480b2b9ac5ea323bc4c3c53e0de8ce40c89c85accf0499aea5b11703a04296519047585ff12f8795f98da0546c20016a115100eddabfb468 +B = 115100eddabfb468 + +Quotient = 294dca3b56ce9529aed2c132a9bd6c0c61de7a58ac50582f396b4fadcf7873b502bb869f801a9ab1f12384631cefee72b3e6050a7f69eba4 +Remainder = 53a0fcf5486c7a6f +A = 24aa73803f270185d23310df2cf3ef67b18d7800bc41aad2ca13f372a27ef0a9217194f3f512e79f545a903895def195a5eb9a1a1b6b3f4de340e9da9b305d3b +B = e340e9da9b305d3b + +Quotient = 16bf4dab1c29bd284c9b6649de65a4ee58f21d6a8b51627ca133fa817872b1a4a9956662db0aead5898ed0eda08511be7c47449638f2fab95d +Remainder = e7751deb047d98 +A = 77b04d93272491322ed2fe651044e28cadb2ae7825f02b55aeb0f73b8b8a8b336802416fe08c718ab681581ac04d87116323f61f50bfd2180542fcd4a46dcff6 +B = 542fcd4a46dcff6 + +Quotient = 388ae1c243bc9111e663c0c80495c36e8767bafe188b532b7ac84b5160d902af1b638aec6e4c66955d16bd8ce94ce6027a7bf95910f705ad0 +Remainder = 7c667ea307017c2 +A = 52f357e9a57722a867d8199242e100f06e8df810ee913d6992bfd9dc03ed78bcf44d692aaa7be806df0c9e0802851d7ae8405f76114e6322177907198f85cb62 +B = 177907198f85cb62 + +Quotient = 33dc2fcceef7dce92e3a9df58566c6e28d03b58ff6ecbbb31e43936cda6380a56788285d37b5e8f11487afd78c39cb2150cc98d9d78a0c6cb +Remainder = 429a380c9f8eeeba +A = d99cf9a0bfc347c9631ae8c69defe1f1509c3ecaeeee5dbc61317bb73fa5cc6e704f64c865cf4d898f8a2f63214dbd511f61aa6e09856222432376698f8d2f67 +B = 432376698f8d2f67 + +Quotient = 18ecac9e5539a014cffd8310ceb1170577cb23aa9cb3c523d57ad83069d1609ff743cd3c275b67097a038b85afcd7105ad21672f9ecbbc7df +Remainder = 37924fea665f5c92 +A = f87aa8b6e62b09291e0e9b832ad71d8f85d60501a8d89d2638dccd4022e89bc4932c186a198557282527dfa86dfacc2f90fe0656695b61429f8220509f5106b9 +B = 9f8220509f5106b9 + +Quotient = 37c0649a53c8cab91a7458702870bf64cb1de9fc1c6b9a3b92444119d368501b62d3a5138af72bdb7752eab8af6bf4e3bdb9e3beb1805b88 +Remainder = de179463e3e91ad +A = 995c04c1f24c4efe88393bab7a7545e39193662d5db7c8e557d6c554ed4367f5af82c463d0ba6bc3148620481140add5677937989e03fb52c0323980d8841d5 +B = 2c0323980d8841d5 + +Quotient = a6d193cfe7d8983768ff29908ee6e07fee99927a4bc4ef41d01f63f3b4a2e7029630b7d925d0979458cdaa903771286af672253cd99593b3 +Remainder = 6bf69921db298b3e +A = 55c856daa8110599cc4fde0a44acbd69a68eb177e0438f7d843ba0fb74caab2a7e0c8a6f176f5555779e65c555e9157a16a1497edf36ccb583a458f0372a57c9 +B = 83a458f0372a57c9 + +Quotient = 63f379bef9866b59f8bfd6bb0120a75dc03506b0034e7440764afc8ec14d8d735aa6f03a568ea98d0a74ab9bbe9c6e11b288467e5f79a2539 +Remainder = 11c077beb8667d88 +A = ff1fc3ea60fb37ff23e2f2f4e207a86e055cca41eebcc5bd6376904b51fb3d233cb04666fdc92be33239b5ee552870e45717890e35fdbe3728d6ff55d5662419 +B = 28d6ff55d5662419 + +Quotient = 285ba8cdfbf00b112e496ce65cdba2271c82a273b3d30bed82ef2d360790c5deb97f3311bd5eb9876a61e33b3a37782d00c2d5ffbeec752ca +Remainder = 1672a8aa119c3a1d +A = d614352268930d301aa4046cd38e2eda4dcfcc52eac984943f2c863de5c4f8a44473a8ecebf12cb8f4da4722d305e5c9c3eddc0109d416e854df334dbfcfdd4b +B = 54df334dbfcfdd4b + +Quotient = 358178128648fa9ea28dcfe68b4cecc7071e129e3ce4d113f5d1e387f7e5a412e9d2dfe5ff16d9987a544004d213ade9c134cc240eeb6871 +Remainder = 44c3fdb374bc0c30 +A = 18b973dd011969e29a1f4a5b8f118313f715c2e31dfebd9fe0957cf23cf36eded89c38637a8d3512bb23324ff2a3627d5b942300200c823d764b7a6c12d1c91b +B = 764b7a6c12d1c91b + +Quotient = 19ea7212f6604d423b308fe3f2f4986f31aea9d6a117a3e207e38ce5bbd8d7a866285ac60433630de547fc84e364c451457fbf864a82c6613 +Remainder = 2718de2dd0796f08 +A = 83577f755a448d5586e19486b04de7836818223ea920465c4eee979a9ce5696ad8e2fd5253b5d5dcfdf355465e8c0819658ccc5580fd29b351169b54c62b779c +B = 51169b54c62b779c + +Quotient = 13e0c5b9905770b60a6f978d1c983cbc84dccfaed0f4222f534df80c7d3d129f5e8f74f19581332a7f6d383915424c71db4ca19bde2591fcd +Remainder = abf5f6c8ab6ed4f4 +A = e2bf43c91cdbb244790eb165cc13feafea36f5187cc9bf8aa8cf202042efd5441e3822a1164992da5be750aaac0bb11f09375bdfbd4a39e3b682c7ee6ab5f5f1 +B = b682c7ee6ab5f5f1 + +Quotient = 3919f31521e87f90df3a4463d0c83fa31e3f569449009d307962d26f07d854e8d3f0badbf55311c206bf34e6227949327a93b1a5ada7a930 +Remainder = 6c3802d44dd4668f +A = 2546880cc6f97fb379afbc4a2664115ba7909414f35a5bf88be2ed5187bd1a24afaf82eeceb0b438d4999ebf9b7ec752236669425bd3cce6a71d9ad67ff2ff5f +B = a71d9ad67ff2ff5f + +Quotient = 121d5ad4115c2768b962e51d09f426d61624e0f203ac6c923289b4e7964e165b34f3dc1ff938a7cf37478d407de251c64db71d3ee629c1035 +Remainder = 660a35e1c1245910 +A = a36d3250c123697adbbbdf489e6cb40be57febaff654ca951c9fa0b396b1714c55ed6e05e468153ac443dabca29de9b43cc0cc4e62cdf24690593662c86fb5ac +B = 90593662c86fb5ac + +Quotient = ad81debaa02f6e60da58b46e76ce041fc4da64138634ea7b3c165b8fbda027eb64b6b5339e70babbb83430d60383c2cfe22029e617fd03a7 +Remainder = 2e4aeafa2ad76832 +A = 8992cd131757ba5cbe54aa58be115723ea3438ddc782a4d1996980b7b312fa76e4483584df744b10340e5fc9e468690cef538920a732a8f0cafb4e30846cad1d +B = cafb4e30846cad1d + +Quotient = 67a71b9ebaec91121a8cf6bc2932b6be01af7954eca69c5202d771c2c2d13683cdf90ec942a3445771ccfe484f947f078de825ea88b3c05a +Remainder = 8395953f744cfb31 +A = 4f8ada84096198175174896167405b85cbc03fe0642f6b263a70f9a22f19ad6c9aef38da8ac036d409e6fd925023c95312cebe04eb653e0ec473dc8dfed98967 +B = c473dc8dfed98967 + +Quotient = 9416326e2347a541b777a0fa1b0c35d8fe76c940d24c6f6806d6ae8ac1e280c16e480786478bda3f780ee92f3f3c361574efc2ed5ca98e26 +Remainder = b8ff45f31bdb58d8 +A = 902f5e48b96b9b1fd16c3b21292ed495987ddac4e1d92b2ab10378f2966c4399d6a41eef622a4991ccd1f647531dcd145de4ac99b3036779f9414ed2f4ba7e08 +B = f9414ed2f4ba7e08 + +Quotient = 403c651b4e571e8301c4158fc185396554bf61d900708d2af5c2bdf495b3cb539b0b9b5acd0d71654b3aa68024961d5a7bc9e2788e6c822b6 +Remainder = 7856ec047cec8dc +A = bdd6d846983fbf140173a26d2b709b9f31b4fee1eac9d25fdf0ef3523be0e6afb372acab470cfe1806b36d84017ec99302eb9eb5eb2862222f4916d8b6201d14 +B = 2f4916d8b6201d14 + +Quotient = 1b6d967173f9777cb6194c8f69289b91da731456fe5a1515a49e4463cd906c84f97381cabdf9f358d97fad5d3cb140e3a3de397e7f9f683157 +Remainder = 83649246ade8bb4 +A = e3da80658acd53ada7c2dc57178e697f2907c5b0c64f4a87a794ca7521105a0568a32874207646df3768ee60964b7d1d2e29ea6bf7fbaa7e084eabd4ea553a72 +B = 84eabd4ea553a72 + +Quotient = 27b8f1e49e404455cc68217a20766590e749507976a3a6de25a7cf2c32593aaabb04d84deba1ec6bbe048a2959ffd747243c396dc53c9c811 +Remainder = 3daa032278ce53d0 +A = ff3ead7c7b27f607d16f1ef4ffa91b6cc28301b9256cfcb0c22b6818371ce648ae8812dc50a86e4bdc0d0b1e5b0d55c6ba07b240886a6d5766cfb3ed0937a543 +B = 66cfb3ed0937a543 + +Quotient = bf987f58700508356fb6274f64a9f78d455e4c436fc6fcc980ec0800287ab3789b91c29a8a72b16645ecfeec926b6f8242f3c7dc3adb40cd +Remainder = c007da44faa80584 +A = 971aa67c9af10f70977f600e10f9278b8e66d2471956da38e5f4b3fedce9a5fc7ff42b800bb4a78314c70bb59394d0880383f5182b6c1960c9e5b47ef8e63be5 +B = c9e5b47ef8e63be5 + +Quotient = 7332104442474715d7c4cdac15fc1731240f8b4dd0e6ff3284a15a62a8f9a071dedb87f2220efcc5839cb7e6933a8f65d767819db26e134dd +Remainder = ef65a7789f54174 +A = bcea2ae4b1edfebf905a5820f0481b6c58d76a69df9dbe84764add3f49496a5d7005d645eaee3754e0ed105c13a114e6a0eae5cc4efab6aa1a3d3a0050fa86f5 +B = 1a3d3a0050fa86f5 + +Quotient = 3f6182804a7ff12fe7ed3c8521b55564559b1a47a78e1fd56597b9470e7e0f6e7e48c58bc8841c9d118718ccd5e0c0bf9a08d8e244ae60da5 +Remainder = 398e30aff5bd284 +A = 2b877181a960c5e29ab1b2672ee22539256a82369e8f6cb5bcfb69e5e4a41f782e89b58fc0ef6ca336469ff929729f8492b44f12199f0e1c0afd12b2c999e787 +B = afd12b2c999e787 + +Quotient = 1a80a681d2c42edbcbde552323dac3a1c03b43251a99b5549da6cb39ec6947daa0d574f0df68512984fa8e269b0b27a5576b3aaccb76ebc23 +Remainder = 378e44fdc7a5ec4c +A = d37e62f44de27a1418f348139eac5ab9fcc1ada21ea6d7695273daf638b4d7eee6745f54b99a9678cf742d304736ee356f66d16d874f8cc67fae9be5dfd41a3a +B = 7fae9be5dfd41a3a + +Quotient = ee982a63816d56758c29d284c19b9b984908cf0a9ae3f1f926e162a2cae4f88703aa477c5c14042247635c103494d11593c2c3839baf4d93 +Remainder = 39afe3275c01aae6 +A = 9a0b0476cd33861d2fc3137df292728e1f636f6fcba5105f384533723231a3104e7c77df46f7f34a4bdc63d5c67b418cafcf106b26ad020ea547d34edac1d3a5 +B = a547d34edac1d3a5 + +Quotient = fb3f4a39a661e5c31228a6b7b4c27e6e52d1954e8ce262b98b61650efffd762cf2a1aec228bec5d5787683cad6b2e6e49a0de91c15c81874 +Remainder = 63e5ed36ff73a42 +A = 4453712f56467328401a69d4d749a0771732734a760a74094e50a62a030cb604e735bfe0bf0641754edff94ac0e0549e8c10941255f0f21f459e52a6cfe4d9ca +B = 459e52a6cfe4d9ca + +Quotient = 7af60a7c0f995178be76c070cf49eee311e6d1e3afaf50c8c93ff200c1b3fe742b23259b4fc0b9ed0947be4fc9a6c212d86de9a0f7dbb5279 +Remainder = 19657d8ce516a138 +A = c9c92a31ad0f3cfb56a294c42a26eaecb77edf33ed40a7e6797927a0c996a7c0a701b484741163df388bb082e3daebf4e1b7a99002632d6f1a41c1d517238557 +B = 1a41c1d517238557 + +Quotient = c890c55a8e2a3105b9bf9344a57a9b9fab5fa1fd57083d52431b695553bfbe7a44a9b6cd1f83958224f351f8511b14215d1648e88e938573 +Remainder = 1bab5b03c372daee +A = 88341550e470016c7ab600b9f6cb410071a77f907a58cb6da4ce3e955d1e859534c2c1098fcfd91b9fa66926e51896733c36a824c3a20844add94e27f30ca651 +B = add94e27f30ca651 + +Quotient = 34c240c42da400317f66f5151630493a2f200ee418d5ca3300cab10dfb429c2acd7280bf066fe19115f86db83d8f5b93cda714533b16abfdc +Remainder = 18cd326996ccebc1 +A = 7e96d7b90ff09b114dd4393e9bdfb13d8ff517681126c566e18dd6369d87d248734d94bd02a1f19cca90be7642822b636369c51dee441a9d2663ec896e1d6c6d +B = 2663ec896e1d6c6d + +Quotient = 10d18159e75efa8204e325e6be830b4ee8d2c07419e8276edeac6cc286488fc0c888300db3ebb5f935aa82654d3b932540f0093d1880e1d6d +Remainder = fe9b6b8ba7c30f8 +A = 731aa6e2fb2ad1e1f80d7668c7b0642203af24af382abd207a5ffb588209e8b5caf953e9a96b478f39ec03a397d1433998e3c95e382d93376d80cf0c957788e6 +B = 6d80cf0c957788e6 + +Quotient = 450d1f4a105ff8d1a3efbb12165ca98c67ae70404472e4862db479e03313b08783ecc42104780c9d57df0ddf19c5b4547ee9ba52ea82dd0c7 +Remainder = 169e15b4d5aa180a +A = 902bcb1904b80183656dcbd51879e2982e2b46a547c9ae3119ffc12c6a003e4321b519289b7f22fad19d16480182d1d797c3045b2d29dcc12167f9ce5e233d89 +B = 2167f9ce5e233d89 + +Quotient = a426f71cb3d75365cd076a6c35c10765bbc3f4bd317fb83a70083b0f7dc43a4e0b95508e60dc1dedb780e9b485f4f7a8870960de669b73af2 +Remainder = da381ae5c97a506 +A = bd59dcdefcbaecd9292c4c3685fb87d3a94c0f0ed01e43e63e1f36fb65d6c5eab3b584f3d1f76d31458c9f6b4c69869d96e943c61df102771274c5b4d821469a +B = 1274c5b4d821469a + +Quotient = 26ccd4b7be090af22221729b0ca51a5e66435c2d33f8d88f94405f6c0123ccbbbbc8080cd8448a977946019ccbf5d267ac3f151ebe686720 +Remainder = c41f9e7bf20b376c +A = 212dbeff03f14b5825f0d7cf8a7501db21b60581a01a26d522ee44e7fe69545cfcaaac64dbc76c7e3027ac39ddc2d80af6f3fca1824c6ff6dae90967d9ab48ec +B = dae90967d9ab48ec + +Quotient = 801df28f4fd987b4e980760f4f2625276a2a7191d453095c82aa98a2253324ad2873abae70cd98c28ef3ce102fdd53469b9f01889f3ba8b0 +Remainder = 8e435da582e59809 +A = 48341b28138dd04807e522e341f74ac46b0449fa45f96d7fc586997c056a21eb3c399752a6a6c023509f042cf9e879f397a34af9aa2ec2e8904674f2ea3ff739 +B = 904674f2ea3ff739 + +Quotient = d3857b72b70adff9b5dec3cbc63de7c90ccd7aab6595339b2de39bd6b9789045141d224aa4e6bf9a06e017aa3edd00e716a771b3f5b97771 +Remainder = 14135c686d2e9f70 +A = c1cea45dd46409d5e24fb7ed7d849dbb079247af2d312e01083754ed07f65f090e4dd50d23a973488702ef00936c5d78af603ec0fdf03dceea8f939c922b1e7f +B = ea8f939c922b1e7f + +Quotient = abe20c90896e261e7d31bf40e7f3136d36b0b78006d12225a4dbef6aaf2062b609379eefe7e5af5bcec17126286f196f1330da8477096763 +Remainder = 230307c44cd55896 +A = 19a637e4f3051be0f7c4d35513bca4a91ca9b8082fe3c73899b70b6805a7aa0458512495cb6ee1ade55ecd5851be1dba96d65202f06bc7122633a0d905017545 +B = 2633a0d905017545 + +Quotient = 5ed3765c4a777a903e182f7c9ce39d19c01460f389b904c3ce1d3525edf25ffe7dc0f4d9e24f0bc8b7e01bef19c83e74f17884bd7bfabb2c +Remainder = 40f5346f8775e20 +A = 546578393e914be30581e24508a33f6560a5805dfb1c675d1ff1d6f5eaa7ee638b9e0265f543413e04e3f1f3b0895dec271c9897a48d9ce9e3d7df32c15b75a0 +B = e3d7df32c15b75a0 + +Quotient = ed73a67932746985465fb0606fb0e81595514f1647c911c303d4d31eb0306e3b2aece07320f6fea57a7071d73150591ab2a82a7d53968a81 +Remainder = 2e495a881876da00 +A = 8976445bc318921f7e12c8d4e8e50596849a1503b5efb65e939c291de136597c05a1fd16137f0bbbd7197df943cd612118d1e55a50ee097c94331c1cfb1e941c +B = 94331c1cfb1e941c + +Quotient = 5dce24b7a16d847b0c43cf365ea20bee9679fa0e8732813e827cf6ef3c9bdb7fd8846b5689ce8b80a7dc0dd05721cb06d2700aeeb7ff04d6 +Remainder = d8ead1ae3126aded +A = 59b99e5d028e6771d27004bc19830a5fcb347f7ae04c0ba7c49130bfb198c5b16821e425c979e6d2dddc14889ae58475bb52c6cdefecf2a8f4dd6e462bbc8f47 +B = f4dd6e462bbc8f47 + +Quotient = 170e10b399a4c5fe354b536fe59d53602102f215d5107493680ab6e181f67d75ffd45bf49ffb23cf9269b856156b5ac6b1c5def4ab1abb18a +Remainder = 57131776937c5df9 +A = aeb35966e2a616762768b7f63ce3aee5e81561080617bbabd7846b3ca03fafaaef83dd05b8d16cef40db0a56f3b0ef6eca5e236681cb57c8793dc0907d9aa30f +B = 793dc0907d9aa30f + +Quotient = 1acdb88f047f9bf679c50ed67ba01dd24dca92103f8ea2677215b6142083b64f9fd2a365499dc8f2bc61e29fa176f7d76b55557fa58e34f9 +Remainder = 5065b726dc6b3758 +A = 15a6292c9fb66c6770a8dbc6fd431d2a4b57338581f78d0860fda90182cca563eb2272a79fb4f5a6fc72c90dc23e8a95713b65988b5b3f9bcec4f0466c1c47cb +B = cec4f0466c1c47cb + +Quotient = add8127c0a27c961203ea0351aed5b3c75aa816e9c2684574e55f55c7140adcbf69d2cff843e5f53c157bd60b43c45c8b6658de72062fbba +Remainder = 67f48d3584cf4fe5 +A = 4e8938c8cc46d34e3369c5d8536b18c963dbde56020678f77cebac5f8777e0afc62ca2ba4f533cf6cf7561bdce77b6f495bc1b05f1416d1173a6a288012c7c73 +B = 73a6a288012c7c73 + +Quotient = 688ddf883a0bcc1ff9bd582119c2fea7c059e19aded8c048390a1d8fd7d769666987418bbe0d4cf4b67009a342958928769375c1c0d558acf +Remainder = a5356d04b64ee12 +A = e0c9e32056977aeca72e229d83f0d320fbaf5cd8bf3e033289f46101c75ef59a854982f33bcbcfd200034e8ff439d669a03fa404e7dbfea822664967d67dd5f1 +B = 22664967d67dd5f1 + +Quotient = 39d4d94587fd1445f31457c275fd6294fcb69ba155e7da3e6cfef38ed1272d6c95755bca49007ca62cc101b038d264876f18594b8fd4c329 +Remainder = a34980d5046e2ed0 +A = 2efcb12fb55c923f5c6ca7ae076765059e15d9e75240a6e5fc3db92de184143fab1934c7450c3a380a9851846c9f43d67bc199a314e82e72cffee795d695f82e +B = cffee795d695f82e + +Quotient = 145ea82eff186b7db4b11fa1514674fb9d41c698efb33227eb1abbc4eb78bdb2a280c0c4c47adaf4e010a4336cbb5650becd1ef544e223e53 +Remainder = 36052bba2867f5f4 +A = f6a6c7e33fd4c664652d696c495df387b85b132cfdfe34bbd35759477b4a3c052f610df57e49e85720489e4bb8dc923696400a4a28dd000cc1bd491446a50b96 +B = c1bd491446a50b96 + +Quotient = 35d0c9d870348b113868282aaba22b21ec87cf421519a23b288b150604729356f924090ba038d7400c0ccd4932836c65902b4d3c46a202a0 +Remainder = dc8c7d087bf24b0 +A = 22228c8a5966ebdec64007704a373b0596ae702d62e29e468653b21a890ace2f02c27f26b043f48495687ce8c2ca8092ead21aa250ce0f6ca26129615a2432b0 +B = a26129615a2432b0 + +Quotient = 52fc995a486c4bfd17ed9722948e9ede1c4ac2fe80e6bd7482fc47944c4337a185a506a9ca473d49073e1b813ad742f19b13d57914888d5f +Remainder = 75c703f654ad630a +A = 3473041ae301dd2806da30dcf06b9c09600086d6873cf3ee9d5a0be638849afb56bce2664f797de4123f6f8fe3e12acd32e33a285bb7f493a1cc13a7108327f5 +B = a1cc13a7108327f5 + +Quotient = 1744946730b2789977620f2e7439641125dd338d1b31fc50813b34dea70b83d209330bd17fd527db9a402ad9752c26b8823082ec9971f4ae65 +Remainder = 453a3d59303ec3c +A = c0f592d83649bcafb7e2de1a8a71fa863c1f51b595bfa638c8fe30731c6fca36da975b6f19c657e3ca29efff6febfb311c003ec68189998c084afe4979b5bb19 +B = 84afe4979b5bb19 + +Quotient = 468f3eece20aa9d6473f3c559760793e702758a3d9cc19d7817216392c7cc7c3968778cf2fe0c3f0c1424d7512cee19ac0717952f18aa287 +Remainder = 5904e71034e3a02 +A = 1f0c99a128c757d76ae6dfcd01012f0453c8f89b00476ec46321ecb872f99a48b4da29a4abffd0bbff2b727dfa182652ca85350b4ce100fb70a6a40ab6c41d95 +B = 70a6a40ab6c41d95 + +Quotient = 12198913ef16c1cfc7c1be13f1cc5991a61ff74935e09f0c46d26456b7cf2825403b9851d07d27e0197c1fa2ac5e32e836979a184f14cd94a +Remainder = 33431c3df719f946 +A = fbfbf5494a9c5384c7ae3df6c02a5e1f9f32dc31cd7f437832696bba164bae1a9d95daefb8bc08e0e8e637436fb747084460697b5ef5ac9ddec06757dbe61aea +B = dec06757dbe61aea + +Quotient = 376c2f902566d83c21eb7c3aa3a6fa0482ed52c253f67f00d5b915d0183c2d9a2891c2ff837fcb426a4c990c48bda4f90e0bf69d13558696 +Remainder = 31540f5e05e8b4df +A = 2527f8cafaf7e8319ca53104229199188ab1ca5fe592bde8ecf605e17ca6446414e06898a85e177d6985b5cc6d4eeabd6b222b5f44b4fc1baba050665c090b5d +B = aba050665c090b5d + +Quotient = b8fdd5cd7b2d9295258bd99e2780921cb2ea70627a79088039fc3ab1c62bcfc6307e86db4a7803f18e5339f152063f9e41d370e97b1ba2f5 +Remainder = 4ed4f2d12e4f4ba0 +A = a25bd113c5a8c67ef65aa80f1512de43c9441fec0c41250048d29c406fbdae80912eb3970457d621c552e3af7ef2d6bc1b5448e7df5be724e0adf6f71df7eef8 +B = e0adf6f71df7eef8 + +Quotient = 5421daac8cdeb6acc2b8b0dd85b592f255ee4fedb3a9e90f2a5bedfb0f9f033d7c562c96958346bcdda4664c67848b9d9fa7d3892bc4e9af +Remainder = 7e5661558c345eea +A = 490aef65c81b32f5df76dd58decdec3e3f73bc1fcbdb6aee0c93cd98725056153b572509e75d2cc4b042bbeb0a77d27fbca1e39efbc765adde41a7dfc5c3576d +B = de41a7dfc5c3576d + +Quotient = 156a8a24e7804c5f576cd1757dba44cb4185bc13cb56603b54ee3b70fa35cd98db1992904d4f7d99a63b3a486e6fb31141a9d39cc0301f897 +Remainder = 29e9c1627537e5a4 +A = 5e4a10e772de8dd2c96acd714f7d3880ae8ab460095a01038f3aa9b8ac8165889403b42019a1e70e0e7f32e77fb388eae3579dbcb690729c4671868b0526aeca +B = 4671868b0526aeca + +Quotient = 1b0eff2ff0aeb2c02ee3cc9e0bff808f4d616eb290293b13a6b58a84127972bb417d55e1d001a9720ec72562ef3ea688e64c4f32c7e26cc87 +Remainder = 664d57c57d4952e +A = 806b8504abfbeec4d5923f83ddc071be88e11c4394168854448df96160b95adb1fd9c288852e2f3df3e36916ba5118815ca2e83a6a7d9e074bef9c961e2958e3 +B = 4bef9c961e2958e3 + +Quotient = 2e363b13b0457a0e9effc2d7e297df78f35e5d24d0f8ad4525b573fb2f66f374871291ee8a8ee3d15a823b560156d474c678f79ee480bbe4 +Remainder = 5ba8f49e0ca36ab4 +A = 2e1bb261d98ec405dbb068daac5efeb0a51f08149181864e9dd6bf6cfcb617b76d8facaee2ef468807e0403bc550d58e8ad9e5cc0f094b02ff6d0277fe642f44 +B = ff6d0277fe642f44 + +Quotient = 149a5b1a81b9e47ed36be76252055bb202dc25f8fe7beaa1ce59c279b32941cfbaf8fe4555867850b2fba43b10b74534db82398320f9786d25 +Remainder = 1ef621737e81780 +A = 63de892cf5df40c98de78c755c99e94e0e76cd5dc0b49b8856fe69dd0abcdc535bb1416f0d02b4eeb54e8a939cf7ad4edfb7de4dac87523e04d8ea8637e50920 +B = 4d8ea8637e50920 + +Quotient = dea8a9211974758752d89965eeeb93cc616f88ce757ec2809f829cbb8d99b4ffdc3f0f643779fc5e0bb53b5273a5b15965f4a364863592f +Remainder = 9ae7de3edb6c7edc +A = acd5cebd069f7febc38c318867ba3a562bbf8ea9b19a6b33538ba107e49439f8ac6e880c6267c29b39141dbe2273d93062464de307efdb7c6b738c0bb282c3e +B = c6b738c0bb282c3e + +Quotient = e9149b347cdea84d740be70060b239af000c4336ddf36fd5159083b795c4763588c87a959df0104212a04cc928baf60b0ea72e8cccc6d477 +Remainder = 3ef5c6ee67e6f5da +A = 6ccf1b8b406e6a106160e73ac4122a04c0814ef5a47708a6776eb52002d52772d3fce3fc05398172bba191390aba925bb23aa1eee626410877822f27d1e3cb09 +B = 77822f27d1e3cb09 + +Quotient = 1606c2fe44cd0b780ee474a9c7daf0b2bebf62db0ba8ef5a99fe22036019890a4c7dff73e678965bb0e2a6e61d00a74a1d33dc1106842115a +Remainder = 7cf920ba2897f714 +A = ef9a3983f26237576311a871e4a3df0538593dd0cfda58ab90b889fdb35c700f7d158abafad127605057ca0532e846992c41ec06902ce58cae0c1fe238c726cc +B = ae0c1fe238c726cc + +Quotient = 8ccf17de5068451fef1c2808c62e19997c7f920d5cc0fde1f5a247cc57c6d730df553cf33094b786597a343a0ce9e4bffef568247e904343 +Remainder = 2689c40a54df34bc +A = 8435babd279b7a3833d01988c58005d4557f7689ea9b7168ef42ce2b31a1a3c32a982aff654f271a651085335496dd826ee4b3bc27f58920f05dc6676e51c662 +B = f05dc6676e51c662 + +Quotient = a9e78c48c779140b1d15843089765ce9ece3855537ce88cad3eb7aa7bd6ec72df65adacba2bdf6c491066406bdc3dd3dd734a70e93eed958 +Remainder = 53da0b15ac079ccd +A = 78550cb7b58b58d6878b615dfa25a5b90a1ff631740e631c7f8829962446903c686c810c46a1551b6c1f7a89ae898435bb8e36d1bae24a80b54edbf4bbc9af85 +B = b54edbf4bbc9af85 + +Quotient = 1e3b41304ee07f6baf1ca061e0e28a3740991c6ca2749eba70d3ea1f9cba8adec45cb69a31cbff22784a9e056e884713c0812e8c7981e49328 +Remainder = 3d051148ec43a72 +A = 76b9453d315e7a9c592e1f2640f5b6b90a65e7f2ff8ac24b9b47e35abb76fa5d303be6d501b341a882bdd9d2a1c81a9280724673f87fbe9803ed5a2e7edaeec2 +B = 3ed5a2e7edaeec2 + +Quotient = 1921410e1a538a71d33d9c5de95593fada116200c399fa7590ebc374282570477f5f4abdd5166784ccee9671a1a23b96378df62168049f6b8 +Remainder = 1a1f4aeb882d7546 +A = e4aa84f782a65d376b10e7789a7d56695885aae274db6cb37e0a34414397a57b4a5f76dced11376af5fd11d31828203e685861a6dea239789196fe73d0e46116 +B = 9196fe73d0e46116 + +Quotient = ed2afbd2e63617a651911017d9d02224d521e99275ab642ad1a941827983b17ef0f2067b5405b20e8e97f2ae6099150a1989df94276aadee +Remainder = 4578107045b9cb81 +A = b547cd987638ff7e3c30fec9b728bc10c3b8cf16e7040bfe0fe9a26e44d2898c4c4d28ef525cde2b4007b2ffb3aa80fc4514a99b9aa2e112c3acc56b72ddbe9b +B = c3acc56b72ddbe9b + +Quotient = 56181509251931afca3bb9dca21eedd6ed4226be67497d8d1bd0ec052af146993e7358f132e842f9b6c4934cf1b4501f5d6c5912e65c8d3ce +Remainder = 1b9861df51429a6 +A = 32988a4e0769a5aca200f6f6f1498512e13b4904a9a311cd8a962fdd688de0c6e50b04f42cdd2cf8bf9b0a6922657f9ad195773e1250f85509672452618da9c2 +B = 9672452618da9c2 + +Quotient = 1fa45bb973dd1d2df0002772afba55284a1e41f6aa4b0d1a6c6a4beb8ae00b52e88a9889037b8bfa9b7ee38036c57b713b48af156c3f9e8d8 +Remainder = 2525d52ecdec8814 +A = bda657ddeabe24c82c883e85822941bf64448b7cbb368468078101289b6fca36680b3884e35edc1fce5a5cdbdfc11359a1ba8ac0785c09ba5fe5cdbd30726df4 +B = 5fe5cdbd30726df4 + +Quotient = 63e21f5568d07976aa81a2690b9e81b76fc3291cdeb010d1693d0e80191186815c7b2f83551a5f1b172640425d4733f06f4df1b2c8a7e6ed7 +Remainder = 14781a368471ecae +A = 9f3dad0b3b56de15ac46cde1d79aba6a2f3b34d685cc810e9fa3f2d865bea4afb480d58653630319a258e9e8ded9be93cda3bc52b80a9359198221221724cc3b +B = 198221221724cc3b + +Quotient = aae37878db016dd758003b85ef52acc7288b7b74c4723e3876a710baed4751d3be2ae49123b248f2b2c55a5be702c4428b1dba9b8a6ae8a9 +Remainder = 6c754d5c167e1228 +A = 4b93a98eb7b92cea0a4f5c2223e77abdfbd332b39f295b4ac40f71625d88e4add7e482adf3010082d8dd8854cf714a54fba0887de87946e97137cf7eabda038f +B = 7137cf7eabda038f + +Quotient = 9881f551c4b7e67611f37df29e77cbe4e2d9fd5e17b7da3d013d6f3d4312e53dd26dfe3a2a12525cfef1ef81e6ebeeb7ef8fb4f918bf15ee +Remainder = b14595005716bfe3 +A = 7737f8e7337160c14cfa8411236ca0354d8aeabf389b9fc4b14bb2ec3bb68286f3d82eb394dbd8062862b955e9fc8e86eb646317d1315d09c81ef51b30288cf1 +B = c81ef51b30288cf1 + +Quotient = 4c8519d4d85ccf845fc5b8f31c27c60f0893ffda29ba86e8a3fd5fe67de5d29cb29362679abde996039b8febda2ecf71f6b9e1c1874361464 +Remainder = 10fae644af084f8a +A = 900f7846e927760d9986894de6489e53cbbcdd59f7707917e7581422508f2ce79b77bd2c56d964a41e60baa927ca679faedcd9cd8102dde91e1f583ae834b092 +B = 1e1f583ae834b092 + +Quotient = 16ef17b40bb73063f3cd0929cfe2405ca0ff2d3d426ac05f8a8dfadc85659105f7f728e113baab59247c4c7936ab975c08d6f1c72c12c532 +Remainder = baff11e6961c72e3 +A = 130b212cb6f3d854e4f17524953fd8592f5e59dfe92fc7d955e2899d1dde1ae4aa20d749caa349ca8d1bda7eeec2310532a7af54660e2a1fd4929335a1623bad +B = d4929335a1623bad + +Quotient = 1cdd7ee2eff733b83beda5b862673177e2f2151ee0fd9ac0bf0ec5b7e05516f1d1b59ea754b0483d0e4bfb7668bb99117907a58a8ceb78028 +Remainder = 29e33e0c2a515780 +A = b0131ec2c1ffe9a523591a9453d2fc740bf885e7efc1a0158905da1e646745ef1bbf39b406564cb3da2f842bee307b36219bdee5991c969d6199279c25d4e380 +B = 6199279c25d4e380 + +Quotient = 20bfcd06f9c54c537ae563e33dab31047aa30a6bc4e7eb0902bfbab3bbb7e65df442c46625c39e08c88310116348e9ebca2450ab463727f90 +Remainder = 11d8f2f6d4c1f55c +A = cefafbaa2990eaa88184162ecb118d20e5999e5a8fdd25ae7f6248650ea74a8cfb92c58efecdd5d31eceb618f1596d7a6bfd31d092cf86da651f629975faf91c +B = 651f629975faf91c + +Quotient = 37204c5735e4ba5e47e845d8b652cfc2b1dc715abf21ea0ecf5b1c6c8b9e596591fd7a7f41787be1a028c147a721ebb891b0abe3bd079b589 +Remainder = 1ee700ffb0ea02d8 +A = ce22d36b3cb913b32bd0e25cc14c7270d3f7b8e600a9b6732377f846adafd7fbd8a09d12fb7011f2283d988fc29aa25948dd4a0f24512b4a3bd460ee19887d35 +B = 3bd460ee19887d35 + +Quotient = 191051194e4362bb201f5471d4bfaf92f79b6fbd119ca3dc1afffba334869ed9f8acd14fc42a2d8f616d652610a483ad90f5140e9a5ca4172 +Remainder = 74785b6874d8fa37 +A = f3c79f9a6af1c5bec72218d969620149afe8bf068cf7a7aceda977076665bb5a2c30729ac3aa976c9be379c6a5458f1501db8802652ef69d9b9f4f097027ddd9 +B = 9b9f4f097027ddd9 + +Quotient = 6c46c17fdb03d192f75d636e1e2ab4e858d55f0f205cffd75550c4347726b5cfe036c6c901782cbe5a04f1985d9fd1dd39d747d25a6a7a88 +Remainder = 9a836be71a24e72e +A = 4f6cf6e357b4985442a25b5c84e2cc0a5e685e2f5ff71ceba439b81f4123e16db2296dd4333fff23eea92bdbb812daf1d27c721412fa9847bbc9a0bf08879b1e +B = bbc9a0bf08879b1e + +Quotient = -4984390f93e11c9a77880cfbe157dc41d43fe901c8895ac5091c5367a77370b16d42e8cc260058adf4d3fc8ee8cc6c0099804f4c319f15561b0a2b1caa7d703db82a726c9eab569c +Remainder = -19374dcf21822188d720d6ec892bda2c084e8af84f38012da7029a3c3660c7e813fd4f7644ca80373575ff98ab6d743e939269c51bf62e04f +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 330af318ce0ffdaa92448777ed117de9c104e0f975651322c8e01b1c470f3cfb7a78b11f7daeea57614cec37d18b89155f19babeda0016171 + +Quotient = 1a56f7d6c06a316a9a466319cbd558a99f06843782673a54775d859768a61933de3fc410068d00d5f6ab13fafc9228fd40ad41434501f8827bd7461441140eb6977f18d102d446 +Remainder = -3c3d566cd48a909292be2ce30f88ebb68e9122a3359f52d1d7b0189c467b829a9f226c0b64845715020dee12d179913ddb7f17da2db86d854bd +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -8e770450768d07ce20ff8f5f6af464b1ee5f1d0e8faaf927a19d3ff801f6089378133e822b8e63cf29c4c9ed721adfc91d3355a3c7bbde77bdd + +Quotient = 42131cf8f52a6a3f189697ce402a8c9439bf05cb3dc1cf8bc49dc2f07cef15b3bf0102c941b5b3bde6440abc6eacfbf77ea8da06ce932fffb226b33dedf001e9657464b0f06 +Remainder = 4cd483574fce075404dd22072abe61200fc455c15b382c7f2962ffd82c38ec1e2c60f71267cbc35fcf77fe1f9301d6b5f884f1c416304aa9f4d4b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 38caa64e74b29a7e9bbf341edbab112a730b17103831a9ecb70ef077e9660b2dd1fbf71d7f6bb4cdae2ed7cdbe9070ec9fde996c91b9bca5b83450 + +Quotient = -11d6883fcd705ac97cae5bb7f8a2929d6f636f4f232ae9a4af9769183dfce9a9296fa0714c3f4fa1eea467a5c96a484a59d0cdd87496b9398e7a818daf89a58add3a39e80 +Remainder = a6b7984fd80d719ffe2e6eb756e4e3bd7ab51f6088e04ac8fecdc744b0385294dd23b5007910109abf40cfca814c10addcb5330e422b6f5eab6efa2b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -d25d50f53c694cddd56aadda2654ae5888603b39cdbace93d19c117af5505750aa24e615f95446862bd693f5b444e2a876eb2cf49f6c7acd007eae02 + +Quotient = -3fa898b02c621915f44b213ba4e80b8e85c7a2f4c78df2bda7d99494bbca3eb2d9354965d83e1c9001f10aad9b3f3ed837a630b329f5a4b28935158fbd9d291a120b08 +Remainder = -320d41a3875da2e83ea9a83947f5abb1a7026c84020e983381722bf7aa87d5987ab088cb2c37fc3781c82c81bef3263fec560023e236a747030618e9d2b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3af2721aad4b18db27842b5e539d8cada9dcd7ac4c5b885065dd2496a6f76fa73c8a51b239b5c068ea6feffda22d8ea806fb488ad5a94210264597edb40 + +Quotient = 179307c3e14de14a744d082825ed723b996a4e15f156ac473960583138c43f4275b4436c50ef8f21a7b450a969819b81c15bc355fbc5fb55cdd8e124d931d142851a +Remainder = -9c8eabd36a25e995c1811b79a2a0357f6aeef4477cac0ffdd130046cb2a647f928a34d91d9b489d394965719cd58604b957c693a93145328e5568d33d88a9 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -9f2d3da1da77914df66bc889a40847a0d705d4648a11f282e09173d170e96d84b5a45092d995318fe7a954b54b88b784423402519a38bb521e84a4f6c5485 + +Quotient = 6c0f316406afb4cc2aebe34f7948422de0b612a02dc47f4ae59419c579fc465ceae1980a3e524fdfdbdfad4862f168a9851664688c9ba01a8bc1ac156a6276643 +Remainder = bf52a2fb6493eac22fc8b334ccd8e8fa347620539d9189d535373f94503310a027c5423197c7279bb51ab8c459e27f548d57b55740320e80b753290d077aa7f +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 22b9e55639ad3ff4f071a49c8bba6bd9047e162fb31882421db8ec5ce46f28fbc35040bbc74ead5a948c47c43e9c7adc32fa52046b53f12b07b5224e0d8e93e4 + +Quotient = -1008fcb6894d8c411905136fb3e05b38ec5d8df35db06379fc2d6d3e3579bcb34fa6e021b98b899d9d082c111b1a6ac8e50418fcd5968ade6aff8828d8e4777 +Remainder = 3d7dca387b00c677d855fc4af4d86d86331fe4309929039e828765f0937990bffa964d3ffc5d4f2f4b8bea978329e7cedb847c7cc341ee52217f903ddcf9446ce4 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -ea045323f406bd7ce25b3ab4993b5f6dd92ca80e3a02607a862deb13470ccef229fad67ae958cd87fecf4f08d9609595077d0d1360d9fe48c4566e237aa877e7b1 + +Quotient = -42a50301031962754ebf9c4b1e125e6df3dd40ffbe09c044b1cf4b62ffb4f92d298b05933a450bcef65e86398da80740a610ba45928000a5c12d26e9f6a4 +Remainder = -c5485b82cfefb3f980e0fc7c6cd89b1345a8fb942299bdc36ed4ff8916016315a0da84ca0ee2824dce3c7e5ed49d517c45173c9c8e30b224940af6cf828c73db8db7 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 384e523d5a687bd1a90101e43334894b6a27e8c6809a8bf5bffabc34d558a8309997dd6f2a3b7c1a63100dcc0b6647b444ef7e5aa4a9c52c7caba1ebd096c3fae6f95 + +Quotient = 1054439945ccb5bc5461fed04e364c7a36d5dd2c0428872676debe07654b2ce31e435a90c81f2bac1032143acb0c49ad101398feee8426bf270bdc0229 +Remainder = -7bf919e14b2559ab82b3c1bf428d083a4c851a7a1fea44718377e9e945caa5cf48e0b1ad727e251bbb330292402a75ecd96a56db4ad07146533a3ab5a717d0a25a3a7c9 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -e5cd83a644ec86b94f5e33d4dc307a2f14ee8653288145dabb2b5f894560c164470197fb9e37749656f47df343c245258627aeea17965fea10a57336bdc6b4a47443492 + +Quotient = 62675274798218da426a54ed7158f8f737b7b3c328a9c351371f0cf61f41712f9b28741f187eb635ce45866762fb5fc5051776151d202e2556c5845 +Remainder = 1aeb5d1fde3c259917e430e6790b00484d0d9508391ba6ebab0f6299190d4b34f5f7d8ea2174974471a1e28ee2c15e05da645db971f699d5d0e80569b7eba7908ae579f5ed +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2622350611b486e6be7a7c1c073c230d604d782c2696038a3233ebcc3f01c6a711969094e47f49e294f2c5bcd04fb1b7c0934f19bf6e7aa519a8d4ec2c172ac59cc1a57b26 + +Quotient = -12970cdd96b92c37787971cd8dd166999ff241be881eb9543ff29165a9c1a3beeb38b1910a5724ffe2b73ab95ac1ca88d3989aa531374d4ec6122 +Remainder = 627455cb555398150e5b4c1c53ee16dac8d80d9616ed1ef40031424287f8028a9cad1a10bdd8430f6f65368cfd00390c8d4355aa5ecdbd1ff0266a1ade235f33cb5309446961 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -c9dac93cfb7abaa3fcde359e09a92ab0b5c06359bc09ae9bade3c6783064dba90b233b4c8d5c6236a13ef96c7a223e37bbdd931eae61e845e5a10088f75b3ff5f1158e833b15 + +Quotient = -6742b3871dece5986d4e219bf5f43c101da8896f247521fa286fde696e0b71ffeb3b6a3e4f33710c9ab150b7a1f747cee76839c5e7f2509f62 +Remainder = -203b2d6eec9d485f7b439fe9d4c640bb31170af38418faf4daad577c30e44ca06efda55ceea4fbd959b3809fa2002b6e2cb891decb09334ed89ac66ff05502036b2155ff62f8aeb +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2457088096865cd052e9cd9349c6e5e34e46c89d6e860a36f8e2a0bb1e5d983e07d05e6f6b31edc67e4793cb4d40979c029c80a13e654b66c8acf6b894f615a3ac800bbd09ce020 + +Quotient = 15eafc416460d757d0abbda8d094eb535262a71dd033c25e704a6df54265b6123247e5625da476e0c220ba88582a1ed94265135bf8bf1fb1 +Remainder = -64ccd9a0ae0b0abcb5507d51b2e6c8e52e67907474605c439796febda06eabd8a3185fdfc0bd088cc49fdf564b5b45890b07269c15b1aa2f993cd9872b97aa6cc37dea2f03444b3ed +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -ab34d3906d8a2b806b22c73d44948d703c1e05a9337f75cb0b5df5205c5e2d23f8a92d8381372f9398c9ac2f7b9302b83e48b26512ccd0b06e6b8ef1b930ec2678d71e2eddbf7349e + +Quotient = 3b22916d9fe3145fcc3b8872bebf5aee4e14235f618e0aed09199852c6bed80df39256d8407d334c06f4479f230913370b7d451fad99d +Remainder = 1b02a7b97f9ac1f6306aa00fff0e59f55fce463ffdc640364a950df29474e08b67cdfcec0628e973d42fa1e4f98e988ec4c47e4915651a1731b71d5e36a10a0d1b3420427dbb79ba7d52 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3f74cafe9ab0c1b307cd7571fd442665fa3205fb2f45b3811b92d1d38b096a2025b8170663a29c52ca84da102e62048e583fba96a594c0b23952fec587814857c25221ff2cd0533cba6d + +Quotient = -12ffa4b6fc369404968911c17358012b993c18c2ff34122e06f450d3d441926b5f5638b40efb012d76d8bcd3c0012d0a0ce5d55c596 +Remainder = 64548684fd5f6c816bd296234740a4eed772570bd4a48852462f9cddf14f1350ce7c7c6a58aee8f66ad7df87927458db09e3af08eb5376de08444f35e5171cfa0992fb27f70b81574f6e8f +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -c58383afca9e1c480ee75d3cb6b0b99ea42e827d39fc96bab6b0dddc97e3eaaaec02a74847f9f7d49937f5ade3580bfcd491990737d172d4079437067251ab403c36a9826e974b113e2d2a + +Quotient = -4964410c2b038573107b0151b36177cdd62495e0dbef536b59c8aacb8836bb45e7bb014e5022360621e8e82a273d0d462b8eb6fc +Remainder = -1250c42f8c9b129a5c477be446b86356edd1b19409d362c3a5fb5d59c30f1c3fdc1424a88a0d6ce20bae885905d98c8a5a6495931f73edf4c60112ed78834e3bff6de3ed54c867fbf16a1cd53 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 33212ef4a8e80daf1049ac6f639f8e1990142ac32f7ebc97675ec90f8eb1a2814dfdd295ae67317253d0187ad33f3932a3a7efb056d0a3c87d28e64e23e9f1de751ee6f0f61c6f39d08d72f0a + +Quotient = 17f77efddeed52ef2e423bc2c10d2ae15c97384b766f4108474964c2a44789e61249103d9f5fe00b4d612772dc6ea12a42e395 +Remainder = -1ec95323b7b95169d5ec0667f3cbf683e98c15dd0fe44df4ed9de9586e43f1f69337e41a6d11d889452665dc0b03cf8d9ef2effe0b350eeb9f6468751b8a2c42608ba2a33192b770cb62381a966 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -9c91fdf2dd1827ed103a102db254630c278bf8b47bb12a342a92f081acbdd8ae5f5476ae194e24b187011ac25b19fd09e6e690777f9d3efb6b3a32c8f5905e1478a27fe4b1adf17a70abb4e7571 + +Quotient = 4f5dec525ffc737094f40d27446ca0be5b7a2aff02d51d99609165c4cea0dbbc1d92bc0a8680782b616c149bbef7f5ca912 +Remainder = 1bc84ce56a9a0c74962681c02ac927051c81f3824d9f3f0f91465df333ecdb449473d9c26ae3abb9509add5795e89ba5eba6ec7c89b114c86e6991ca0c185b34d6e66925a14fd82809dbc4936d273 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2f47be01e6dc6a86097676fbd472c2af0c83a2f743fcaa885e44fda7e9f350e9fb7a8cd07fda59ccb7963f1e95e6a1236f5f94939decdc85afc0e523c711b24641c844cd3113c17fe35ca988ba407c + +Quotient = -163cafed5bcfdeda88555f30bd4cc2da2cefe2bcec9a7c19c36ccd04a45121a5a0dc28d0bf6ab7fa4b78933c47a5d5286 +Remainder = 93f856077f5b2907cefcddc4d767ffeb0acb7af64bb9dd8a15dcfdda6c244c24fb8404ff9ea2fe1dc337faa05930d33cac4f61e171d0236e222374cb3da76396ae1329a407fb4ac652fcbdc568d0fafb +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -a8bfcac452a5e48fee9132b73bc2fef771450143ab80aabd8690ce54c9b52c2b5a669076a7a35fa6d926268077bec6d90b722b5d074f28ce3843fb0147e567c45f4e91a11416c082762e71b5c6129c08 + +Quotient = -617dbaeb8c6f9d584e8eae923c872048f9f9bf039ec6b50cf8f09c061bf79acc3311b37c2502e560848c05ab316fe8 +Remainder = -1ab4613767c4f1f7d127e848f2bb7c72a3a9e1dd6173b63198b80d3bbebce6a31494f19b53ad9e3a77248e6f9b26fc59060e2759a20dcdbe785297bbd912da9a1819527fac550d64bfd20ed1f96450c30f3 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 267d9397138fd0374a7a58593d41627ba1203a646ec2c04997acf607e9d217b8f40183d2f9304447d6f7e727a476e636ded4697a5ff30a9ae3d249baf97969658209c1b32ddc0edf920b0b278e9b5464313 + +Quotient = 10ad85703fd51870306c5e36b51512341d6d39e0bac47a03732787b2f62e49c76666f7f49b2596de6cb5c5b2f31b +Remainder = -846b4479713bb19ebb8c1f1b75d2be0f39fc1095a3d2ca149b5565146bc19382b86e5ab0d098ab1fca1ce701d582400190fee34b602845c3c0c498925710f0b9e3af2412ed5ead1fe03d77e9b2b407ac83823 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -e0ffa4e120f2f46fd1430b6022fd03f71a22f9b120f8d40e901279be235b32d94760fb8c2403d23cdeb728ae73e2b16af7322d6ebd5f5673187668c99805e700f1e997423886bbcb851448dc1ed4cd66d6598 + +Quotient = 41567bbf616ab41da51108d7edcb5a8a4877c5a8663b3aed7559421b1fcf4b535a54989efedfcc935b3917fcd +Remainder = fc026e554a0821e0d36b796fe6a676fcd7383a55fd6158d78ace4edfc3d8aa87c65f0eb41baa2aafadc51218b0562ff4b5c9b17bbe84afc491d9e309217a5138ad48dd51e1b1a9aa51d69963b608ec47d63fcd3 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 396e9b45ce43d3f89386cfad8ddef4b483ecb5173234530c67447ab74629d246c18b9da09522c77f598957e3fd2a1c0c9417399912fd547fb1023ba6b90d63d223bcbf3e7ba155e51bba7e8635aa5c39d2b9dbb8 + +Quotient = -18f1f395347ce8df530d9330c61c0e30ac9531b50a0af2ae7809db1258285c15ba7a436121287990fcdbda2 +Remainder = 51417b9e9995de34316a66a2f70c146df8e36952fe64124819607bd8691a465f4fde98e590dcd56f0faeb95d1b67751081c2393626713c27ec2a2123aec2a4ec3761e5ace4aaeb612d46e52e16d72a186d2ec8a7ff +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -966dfc779cbf9c388a84e947d1128e2392399ff45d9491259c7cb19589154f82f41e852e0c6bb5a728f6e87ff4ff95abcb9b2b57af1b6b7fc125497775ecc1338e4bbcb5315f7afde4e283347184b908545211afb6 + +Quotient = -3fd962e88dc1d501fe9335fff8b6b2d50eea967c3035a3dcbcdc9599b81f9a445ed5a6ae7413b8865fd4 +Remainder = -97f06f6155f8d0ee6850728192e0b4fcf55fbd9ba982c5f1d598ddcbc4e1c4be0e209fefa6ab3b7eb2b4c645e4dc40217202285ab0a7270d085dd9d4fd24e5293faf6797b4c3c79bbf3ec63fd82942549f9e8f862297 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3ac566d6b2d18572360fbdc626ec488aa316a74f33d71a17a2d0e1d2bf26395623eb91dc4abebf2f944e9bc3d669fae2e4332088e9ff9d9f43927a7888b1390ef60f05efd6e63ec606ecb3e164ed6dbdc9d088586aa71 + +Quotient = fb5ce21bcf28490afb64e6746a1a81792c90eae17407c0b4c5ebf2464eeea43e516be2c615f84901d +Remainder = -3d255bf94c3d610c32266fd472d070c0f5e7dddb88d32723b2e1a20709aed2faf28701e0d0227c2b33ecfa9e708e5ac354a97be732b786210d86f1f05d191513386c580b1ad1f4ac6890f87fd0d4270f23cc5c2064502c6 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -eedb64a6e204ee3d6df508830704f1d5b2d2e627698d38a114c07458ea0befd593a80dfd2e08fcb1893adf57061ec4fbcd3130692de7c46f5ca51361e9b79bb7a91963618b8e5b7591392a5f0e3be954e8b9978c97f12e9 + +Quotient = 6933a3123d0b32693351a834751345300c49324b861a663e8700bdb3b70ad996747b284a8ea5c02 +Remainder = 13849ef93cbc77460c3c496e8f31f7e01a98c21cdfcd6877547161f9601680665b394933d3a0824f0d32854508c89f0e4a0873280c779c7ca636cd89cf6ee5d42a917b4f382be3b9654039f623c11b43164827f870fa0f0781 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 23ab6042240a7709d43de7ee17332a9710bd0d913c42b3591341527bf48d5bc30abb962482292d45a15cb03c9457cc8d78d1e00aaa63358427b000e59e4260bfe1e2cc603e175d7fcf02bd9f61fae3740cb8e10a510ea3d1d5 + +Quotient = -10e67cbb33dc6e24765893a047252766c2bfad8385150689dd4fec9ef495dff63ede1fdf78bb6 +Remainder = 9dabe2cbc734b910fa1bd25616daee5657d25b6e4dbc2cd93cf8549715c87974a8336fc5070d86c11f6b670d4b3bd5ee8ae3af2bb321fbb4f8fade3f5c6c2d6c366b4d800dd13ce897f13b0d3fb79f1d9ca525b4e7286c56ff29 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -de093dba98747499f2876c8b6b7a6b9587284835ae35f0716dd594c826cdf5b9179f2c6b08d800a77a6936602ff2b64ee0b7c94493bd5009633f5bbe423454b7f018ae96c21230510ab4bf5db394ff153b0e9eda3ef90eb4c253 + +Quotient = -521f5e35300b9ec2742ff472cf61235dfe2e449772afa638b1adb812cccf269afd164b7602 +Remainder = -2ad10e8758e1d358d4744ad344ce319617027107c0b8db195d1b58c6e6035450c9b377f026fdf9e5737750af5615cff2ac3ccee623c060d779373136d48a735b353d64bcc5f2e6ea1e46083fd799b5f57dd5ad0ff3e6df9764af977 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2db1990ba1e353a1a62de1b914ccb691380b6ea937c13621a29f0a40ecef460cea52cfbc77d98706fb3c9939ceaaf962fb8003b0cfb40535e0dee22e8e7d04b5648fce2e58803242c199421cc4b26cae776d3603f2ce410ddd1e0da + +Quotient = 1d45aa6fe6837a1b7ac95efd55d1690b66487202949a286fc85da7ac0b50b860215e44fb +Remainder = -7984639b596f1d4e6efea9d8b4719215588620ac959034b303584679a44fa84a4be0c89fd2e29f54e62959f9b7a858c06b0cc051176af82d4b85e7334555ba11c39e6cfa1829995c383ba81dbc220e527e90a1d440c1d069703cc1370 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -80316fdc405bb002990d3ef7d0e98defcd1f0e370d1e51db2d21ecbd96230baf69d00b168afcb7b8da9edc3ef7f6621ae5c5a0d7797e5c92283342e42468dba1036fcb2ffef1f493ff97826477364f6b5a41dc56d6389a01b83eee041 + +Quotient = 3c0c3f7a777e611d1bd0d17d669a1ef7920b72ea8de06d4b415a73b836e37d6cf0780 +Remainder = d8c77134a75584ecd5ab29e97a909ec139464901f9cfcb1d3d9e29a63d204615b6845d466c8710873980f107c40ab54eca9f8933ef6d726f9bd0f3e9e97eade5eb1a9bcaa7b01b6ad51ff3ecf67d6e4d345f128e990494a2db434fcd3ab +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3e7dd961be36c0c286eb9e78bf3b33e6f9bdf2c2137a0c660f1d21dea31ac9a044e526bf47ec8190e137a60f1f55e947046b9cd04a2485679e48cac80a1bb064a915208889289d63a6e338cf7069ad799861c31ec6eafe02a4ef2c2641c9 + +Quotient = -178d749de2dae3a2ea4898c59aaba98ad9f340762040f5aea13cad45a793f1256ef +Remainder = 6c5d9b19aed9f099255b6e3d251aa50d1e534e6c86d82eebe097dc8dd0748201e48ac62eec070a999c21f5c7684e5a700212e9079b5fb731321dd1e16ca82ce80c1f5c17fd1720f1353bb90997f47f5fce335a43a6f59facff0b3724423393 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -9f52ead13916f9807d0cf0c6699578af52c54816828f22de62328fbd7b4fd6c3740ffc82af4e24892092c7ecac44b5e775944445e6615fce25610984030a345731f944128f5734e6e315a0ea97aafd7563105695d026880d065761687b75e8 + +Quotient = -4fe43bfa9417839ee408b254603c3dd176653b6915a89de5b781b400162fbed6 +Remainder = -1c15816e03751a203ae23c48965c8541849b09996bc81d28e28d7871fa87d1c3b2d383c056d3084d7d01d853bebe270fe2c0839e71851e169d417c47caacab2aff8a8e05f65dfb20eb17ed8f67475702fa83087bd868246cbb885d52639797b85 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2ef8419306ebfd215d9079c7a2b959a53ca2f4553845e3cd32caab2635c0e77fee8c5c016c121e3cbedfac57f810c132486ba78df9e719a976e0112516893f14cf9b89f95a89aaabf31cce509ac8e7e62ec3833f0be4336afe6d7d73518141d39 + +Quotient = 127e8c06e12943017f9dd57ca24dca0ead230092811d307386c81b6efe009c +Remainder = -24f3431858d5aee412443feab243b465b849f5dc97e4de4db88c7adf774d9bdda65fa0a28cf6b18eac6078b00cbeed2ac406f8426aef868d4b59ab045825d4b0a18af6c9105e32abc72fadef55b221278d329ff6fb9019630411bec143c4156df7f +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -cae6399216401dec0f8ff5eaca884ab061469082ee3a18e49e0b4d5f9cfc98a598c373249a8ad2374e0b3de71370e93a98650684fbb931aa5d8b4482cb0be142492bb71743c251346df66896806f926a4a5dd4c16ca3294f01bb998835e6583d29d + +Quotient = 3f180694e59df85f48ac02b6d4faa26278af9641db18d79f198da5d802f +Remainder = 36cf82dcf8c7ec783b4de68e0627a4a4b2a508637c176de09feef62dcf382bfa5d8b88539b5ca2cab6cbbdbbd0e54c092f00ee13f4a352cb570034cb0a012cc0fbdb6ed32967f3b81d146f352139bd3d9a5c27789468b7d79b84d6a8f6085f859532f7 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3b7983bfaf565c5ca444367654a07b8bc2bf7fdc04ef12128c392bef2f6b67d9475b4d2f0ce1c380913aa98616fbe1d74dc5c9d64df15f5c9b87a8bfbcadf335a6e8f863c7a01ac175a7d79645ababa5f961fad7d1b9926f7284e254fed33765339e0c + +Quotient = -11f635baf7b7d613e84dc38978a21ade2f4cd741d0c4f6ae592d93af9 +Remainder = 4317c686dfd56216bc4865f8dcb6a3446e13d8b33861e74d6c4a3223c387ffb8caeea0141049898609ed1abfc2adbd21756cf64a72272aab6c0b8f2177419abcbf9086635dfbea80a7b884181f2f2ec9a402cb0505e8208909fe062d5e6dc7094d66af62 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -d0ea50558197566f22704e66a70328cacd6f4b7ca9b00c16b7c4b4e7dcbd47c9b2526b3858ebb4de7a571ac570872f3b44ba1fec655c0778a8a87ca24851f6072c5c0b7591b5e67a8cdaca78fa46f201e02379fcb9a8470e4a4971acde36cf501d369751 + +Quotient = -64a078497f85588d3402355bf3e83d25ca1f0ed2c24a395ef6de6b +Remainder = -87fc31ac66a24ebd629a26209ccac1b2c85e52dc83c5240269ae5a27333f33d31152c9470efd41472af034e8536bbe94b0a49e892b1d23db3c13fd84b7395d7e3f19d7d4cb4a4c07dd1860826696cf7202483446452aed2b4980388e7eda0ccac792d77a33 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 254a85bf512d9159b00a70678239902ee7e15ac2790ce5747c4a4743c6a0851e6a179b64c75acf312dd37a7b82a729246f79196b8a399ff476c48a05f89c29fb106bb06ef0300c4b330a7b2bcd4ea1e82584c7a96b99ec2131c885c5851343cfa6ae4d384e8 + +Quotient = 116a06b1d38067cef9f55875fee1254c8ce39b42c19fb232a287 +Remainder = -c15a797fed3810e4f536e9509564b2142ffbfc0c961ee5aa923d43a824765c05d2a99fef79bfcb6310c77a91d9bc6d0762bd687493865de270c99989e891fbf6da7ea5c7c7a1032449457eb73222a011bb755ff44e4bdce8e86f8aa9f687840c0832f7fd8ce48 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -d77c14100d19fbaff6334ca6aa504001a1d56f274632dc89d48e1d517935503c26b60c047cab9e186a55b72439761c884f63fdd2a38ca1acc653f6ccbb4b7262e6215e6d00c8829b448b7ac8716fe0bfdbf8088c8c61eee8f8db43b7b5551f6278081ac2eb1c5 + +Quotient = 6fc9533f6d0e6c55494cb1b319ec47bde8e621aa92d91155e +Remainder = a1a70f674cb141a896c4adace0dc58cdcbe2503fd0ad36ce348dc5b8afc96d0f2f8c65bbbadabf2920012798b7ccaedbe8d896dd2674082ad3cc75b54c5c190ad56ff34e8cb5dd29c031656497d48571295d6da396d5f4cdb652732d874a79a674d06a1d7b979f5 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 21917f48bb8e65646c618068fd9069c06e22ce8c679a845f9c4ec843849010abeee12e2d3c61fb963297abca30813c446f2ae82e909ca6ac7839fb58974fa65f3b5d91fb8b3f99d948519ed56653d50026d694060208cf48e3c757f64885b4ed4328c6f071e9f5d5 + +Quotient = -1abc689fd19523d2e295f260d248041bd00ad3009cc7581 +Remainder = 1ab5af1478fe7373d012befb319b53ff9e36899c1749ea763fb74f7d24624e70ee78faf3115c2a423629528f45295e4adec7b122b993b5c29260558be4831df06468bb1c63e8afcfb1b9b533ec6acf754563d2ae25e2adb4cfe5ee3024611e03a156484a130ee01f3c +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -8c5a7b6bc8ed6ac015ec24efff607b0446c1b736dc8b409e2f433e69d0ca015d70c64b4c924175d0e0102ebc3e1dd96dd4d5bb01cccad229e699f9d8f9ad0e04339d70cd113e93d50c10c03083a81264396f5db2d979d272798ed30efa15d52289d0c72f42582ea56f + +Quotient = -4aa210fbc0457fa7366a8aa9a3acb3f9fce812303ec9 +Remainder = -737bc4fdd3d5496fc7f936ccf14bfc3d93f5b7caf4718c444db7a3228b41015c67aed304fec7704ea8238ba6cccb1e94cac3bcf4764a44bafb49e5fcb0339ae44c0114cc304b9c4370363657cd2bec09bf962ccb21f6091b081e71d2bff8556600576e18d4f78fc68b12 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 324774e49bb429553c10156e8db122670d6dcaf6ef5291f515c517d7ffaee36ec5ec5ccb4d12dff71ae7a05bdfbb03ebaf4dc6c4e8bfdc165b77cae20153c27d53bf27d92ff25643b4888cb586e773955a1c02ecbf0fa6958a8ec0b832332eab2e449be6e72c48d2f1ad1 + +Quotient = 1c8631a18d189f1fb689f896005f2dd2098e0dae9e +Remainder = -1a1ac9612fc3354056a5378de5b315f12591ee71f0fa9d8a6b2ea2b1c4eca9947e5c4f5ed3d4b78e69ef7a1f5a9894b9c7d85f6e2244ae76881eb06584eaa98c78b60b46084b517f4882758691f91d9e2acfd580d5e901dae14ff4a4fd6b0d7c73450e4928fc6f02fb5463 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -838df2a27bbb033fa0e581073b879d6e8747fff38539801a1870f2e52d91bc84cf10f2560e93784650fba080304244dbfe9da679f207b6920be46b0214a1e490537e56d99beef3f58b30f311a12283501ad79a5407ff209d19a6efd0421aa144e0cd427380d89bfae5d1f5c + +Quotient = 4213d04b9f0b30026bd355404bee887b22b2cf9 +Remainder = c2bc097d1c20f050e88912f066b658446cacc7a4d510343a8d88ed007a8c0cfd5d44fe5f067a0e81536d121b39f2d0feb8dd053bb5632e3f9c04be5f6bf4091d646860cd38c96271cdba466ef8b7e2377a51d5669117e664269fe3c08a51b10e1e019ac063d670a3c7db12563 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 38ca0c2f03a5c56676a2f95cd7a69d4aa2085343af6b1d2a71e0d1c54157ec0e8f9125df2a499cdd484c04feb23b1e0042ca908db74744584036c79f21c25c40401d551a65afed0ef35f1ea000fa1a99cb29e6307f6ca0304145f7e483d008cf9efb028ebb654115a8c6b87a08 + +Quotient = -134e043b3b88b31f89ff4bc709cfa1bd2c1a8 +Remainder = 99c1c846cbce5e9a26c5afcc0186bb1e43b2501ab3205d13fdf01dccb9b1a935bc1cf8adf74d58f1c316381577366b6d126da49991a0d5e02acaa678085f335ff8b8e975e5bf2e52a05488ebfc21a3e0d0bc5bbe67442f77bfc3c1f0c03b7f7ce42bd0fedd8a498f018d8cbea47b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -c261a6c562fcdd56e67fbd2b91027f17c95da43175eaca6e4069c16d240ebbd240582dcde953eea739a4668fbfcdc6af8ff3ab58674c95de90fdb43f64a61108b030d644a44b0319b912bb563f61e520dca9c88f411b32e99c872cf00a01f5badad584636352913b7429b99ecfbe + +Quotient = -448c4922b7a7d5e1efec2c3f41d0264b76 +Remainder = -2599e928027d10d3a11056eb719768e5edb1a625fc0b8a1dd4439ebd30a82bfdf89e617ac7c71622058cc64ba32dc242d96fe3ecb856f1b146f831334af562cf88139a99410dcb869b9ad6ac4826563b400b59f55d8fff262dc920fe525b12b2fa167ec237028a098c9117cb77bc3f3 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 36be11eb72832f8ae7b6bdf689f794f62cc1c885e64706d14a77a11df9761c2e9cd81d8f6a0ad0cb1696c69afd80c8bb992cda5100cf1162d600515568b9dc9c81a518da9d240888d4984df65c129ac0b4c557b4e63ee5be79a27473ff5bca58e559cb04c4ac93b61545e7351bb6514 + +Quotient = 152474a1a76700598c18d9301866ec00 +Remainder = -274a2f9e2bc5f9d75f9897b28f840b71bb10a3e4e7a35ee1dc1150be61130b4e0e987e8742c5edb75a1ce3158eb8bdb7d657b8ba39436d7c88fbff160c7488ddff2f13b3b95ffe149a3d0d2d406b1737a7671f69c0e5d7074a151cb2776b2d13ca24bec261662f2967fd22339ed6c3f2b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -b17c79a31d5085b49793b6a6d628109a6047e3b1afc947e5212d0a9ae32b1955cfd6fed07fc60634ad15f32a9e402d7d5f750fb6d1ad958211f9e8ecda8990689e5212cf72b24e9b51bd07a6e0477dd4c02381d0ab6c0ad3cac1f620f723ab004880800736804751349f6bb19d3db48da + +Quotient = 5665f53d5a7405c83a5ff382ec376 +Remainder = 252d055186ec896cb3142c9e4e49c441e2ddad365b86ad21ae4ef1c522d3306c2834d6993a5e1f8c64a1ed582bad8ab746f7e773fc004b1c47814f73560db72f7237ef6e2f671d3b19a8777be2e4c662a76db87ea64f32c48ea371b1ffb15df26726854a417e18afcf49054c6d2e0e337e71 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2b6eb2caa3ca650be02fa199e9ea6c48646a76434e268713753a547e49571f9817ad396f2cb7b16d307801fc8892f0af3e7f93ce08f7955a8acfbc0b56add4b4c7ef7351f60e402b9a8ef7fe02ccdcb4b00b7ffe78c7009268dbcf1d606c3a1b5307d9a8ee6121c6a635a742b8bf36b56cc7 + +Quotient = -eeda035247bb13860f228d8f2c +Remainder = 3976edf710ab42bf069e5829de7e16962d1b765f6ae6ad0ffabe723e21ab01cb9f3f5f4edb1d8c13cafc0556c0aa93d72dbcff754ae9260abd294647b71785bb049bbb865a26bba22defc458a14af019a796e942e77d03484028aac2b3798fa730ae0193d89728bf80a8728715a0807b3c497b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -fb5e55f261aa96f54983869d58b3e9f0757d363b9c43aca5580b7c0380096f396ec79d1b30037702c19be5889fc6376793cad51975100f33ebf43e0897dfabcb9adf3adf8d845aa7589ba1f6d155b25f73dae3b2f835595ad6050401fd4e6392012d06194af415b810b0c10a53bc56350bfcc4 + +Quotient = -5b37eb0c3e3f8f8d9ac6f4e4 +Remainder = -28fde388257b9a11441c592580cd38caf2d69e2ba57d43151c77d26535226e05e08a9e6d8ed470d4354e9f46b7626e5f2b22b652a2d78f817bb51598c727a765941fba63510b58fb3dd5f30717f237da43b42d20bc260b06d488c9c912bfcea1e7808544c58960a3e1355c50c889cefe75d4d9937 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 29232a3fb059242cae6e0b419ff13c479048cfe46a9063188706c6a3842674b16a1aeaf771c5b0ef401d2dc8a57f6fb4fe1b3c7bb545c18ae763e39421e6a07c4469d234f9fc737ac21ca67a5553c7ed693eede4325dbd132dbd9889d815c02f426801eff1f46e7a52f72845234acc6c153f34065 + +Quotient = 1c7ac058af2e7bfbda9484 +Remainder = -54d7aa6dace87e61e24d87053b9d094bd160916b720d7cf4f740a4fc5a7f03909773d0456c530ea0204427146fd44d3ecec51d8627b5768de1494bf42081a8a4fa97163b0b93b59e70e533f3257723e441cafa4aab471ec4086601021c4462e1f74bebf298ef45fec98fa8e6ea97415f84c93c12633 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -83c2cdca7577b32c20e9e20fb498a2bceb7174ea9aca09d4dd2fc7a1d3b922797b4e9640c7eb9dbdb4d93c7fb9daadd680c1c7645d8102d77e9c877a9f65b13239f9a650dceefc1fd41ea9bd2b38a622bbec99cfddbc6e88f377cd51cc29fd17a27f3d0d970403a2aeeac6ff9fd69c3bbc5c2b0fe7e + +Quotient = 472df5f4393f33cc382 +Remainder = 16579a289cc776a47611353e158c43dadf0a78833396f8419fcbbe47d90c7e840e2c90e73e563e6c505bfcf691120ab0f1e9ef9c31db608cade70eb8e487b1113a46e2b5c7f4a172ad99b502eacdc0f91c295fe608389e61d030607a94d09d349fe1a0cc46d1e07c8db533cedebcb4a3b89afd8b924993 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 34b7f6780620246f5a0a92a768072185f02e57a52db1d865c21c952f4386ddb7e2dc1df076316cb4f2f394397cbcde1af0197fcf33e6428e6f5d42a9ccf623f75fae5940873097d4591d9b1a4cbd00074d134272700ab06d901742da695c3ca9d4f917a808113336f883e769fa8051cdcb0cad7cabd1cc + +Quotient = -12b4e74d76bd306d9 +Remainder = 8768fbe8ddbf60b548938d8b4a74c4a326ef335257e5f513e65a7d2cfbe9d456425ceb719407bde3cbc74c9c978970597b5663a0ec61962e77eb351adaee2d2d37f1fb55b5d2ceccf282ea3a0d398be1dd1b166d55dce04a39ef434fa392893618003adcfa61401276ce4e599051ad93152e3477ff524f0c +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -c898a753745f0fc178227a7004d917557cf3dcae2e85e95aee51e137b29c895755853ce2d61f214b80070174cad8ebc2795a7d070790acd335b383f9dc88c01227eeab85f1f29d76c1136ffcc7b9fdc073a3a03d8812c7c561b32d8e69754fff64acfd64994b7e9574d2a7cae6bfd5a6fd61dee7ee993bb7 + +Quotient = -548c97fd02eca7 +Remainder = -939e90e281f97a433eb1c6510668d0fc448f03d737d92693b6362c692167add7e4442105d60ff3db29c03ed06c3121aa4a53c4625906519a4092e4821c918d2264ed0cf088b7da43a222877f3ad9a9fe8ec06fc66b9cfbb44e0fdca1dbe4e461dda9b85231b5b9733e0c78852da83bae557755de3680ab61d4 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2c61dce04200e725ab0ecc5016f66044218391bdf650bc0bd31f3749ac06c24707e79526ee459ccfd4bc22834f8d23f391f2e99135f92b5abd0b04079ab75a263c0e98e46edfb440cd865269ed7872e8c1ada312df1bfd6a5fcd2ebf548d7b7d1d75bc36f62e5e9d15262bb8652a8041e5c8f4d673eecb777d1 + +Quotient = 14622572f311 +Remainder = -6d197a84d2ed486327790059adb5c073218c56345f48c15caf6892734fff0aa7af4782738bebf24d984bc8adb3056f67e57f9960001a67fa462afd8c57ac9d60ae6517d58ffb4773b637ebe6bf2473a5490511fcdc576a4c40ed03b3afcb2fd27c57b66a26f6d3f9b2bb101502b1117ba3ce7214c9db6302fe20b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -b818674faf69bc92085b7230d9335d7bead0413f2905539a54e8d1233843ef13f07cb5538e0787097cb24f152cf54a92e62ef143e31cfbbaf3c09650b14229a4f61a783eead26430949c88a87f1618788abab9728aa52dd8419f5d568e6a109f278b2afdea91cdedca43e562d4bb8fb7f1b7aef13992fa7edc320 + +Quotient = 5cdbb03ee +Remainder = 1cfa68d5da7a600a7ac598b9ca1a0759f972fd9a46ba62e5e96d8f6f00fbccd0ab26ca03d14470b43793411ea9803c9409908625fd74ef8f9b2d7c2064b2e3439adcb684e6f01432a1feb0f492fcdd2b8b5a6cdbd0bf460272218bcf763974be8784e5306c219ee535baf5541b8580952e3690b585fd99f77c46d69f +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2869338cd16322409d3efbd328b27e2ba53cbf71816ff5c093849b1d866b8cdecbd6bd8ffea0b7787251acb760f85c277ded21e56acef05d29bc728cf44f55be87cb4c8913408a01a1ad53461058a1cf94538f05ec14a6d3eba804264df957de7eb1a61b794a1141218966463dd42402c260c229241ec46afdb5a06a + +Quotient = -f16da1 +Remainder = d8b66b622b5a54963c2c84aa186bfde5b67a3562e07a23a5f6843bdb615a3c5d4f007ad8b275ad7e4c5b1436252efe35699cff2e0546e6dd8c7230d6ad560c51cd54db6d312be32ae4c708e9047c3a25c211e2566c58d6b9291de31612006d4e847c6916702be99b3f7ce40e1ac842908acb7f03dc120aa8998c60737 +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -f8af8fb7002a9d2218dcd0f0c139b8e3dbbd48e25a5c910f6d0b6684bca224f62768b64955580306bac6bfd45b99ad77483563fc7dbe015edc06bee3ff93b0afa8f5866c23c7a7570b366550490c97ad84062c2495cff30717aaa965a8e15e270b504dbd4fa943be4f97a7fd1f3b589bc9fcf4f907a7690d99c978a374 + +Quotient = -71bc +Remainder = -13316e9b053a06520526f579718c326402d2a9686d51a340375cb53d7cebba99c8d1ae93388db0a41cf55d5753dd1174014ff3305fcdbd5b02de9e90c45ec0d2900ebf6ef847c2a045eab7f80f07f01c81b9fff093a779a280ae42239df79de8d2ec4bff6723788c86786fe276ae6a4dc1472442b552258e1e5b597305187 +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 20fe256859a2e4c4f77db6adef78b2aa4758b29ad0787ce7e277bc68391d5949bb4dd07a9b1a79fe890c8a760871d81adfd3858e27d1bd6de33fd31b8aa6131fef9130a50f995c3be1d615d1bfb9878804b7f6494237d8ad78ac219488f17335ae54b494532f03a3fc8e9576cab6facd90c662658878fec86db66bacda3a7 + +Quotient = 10 +Remainder = -23e09736f469c83f280052ff01071b1bdb52b7e2b061e8a1a8c6a4e091fcd7ca0b33ade885d928a11a3375599aedfe554d1c2289795daba08f07327a19a8adfc219592bcdf9fc5aee5961a48b3b1b5fc380eff5ed2ba7d7e564462397fb6c6187254ee41c74602b141d7adba99205d2e0b35da57efa96397b3a5d112751cf7b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -e849bc0bfd9560cb90e42c8e4e88df175133c14466e530716d89ad0326b660b0e617b4efe8df6b000f517d3cc24d9dd4cafa2773dafd4c6bace0aba54e43c17e8e3ff9497a97ed83e6408aa0aee0e6485dd1d89d52520d1acf4d587422b0c5cd2d5e7e81fdcf842d6331779e800f96628206e8be020ad4021789008a641f67b + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 22004040a65f9b6f120bb7243c638cf3a4cf6fc58c230da932c79568f68e31af7a7b8569aae77af671f8335ae68d6dc1698baa9d6ba9cd633a662101b45bde51d55098b50fabde8546f317ecc2ae7a39521bc075942e3751a349f51ca3c371f3b8a6cbbea3e11a334d677c07612bcdca767194c07fca78ea8a06cc3b0dc6dcb8ba + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -cad46f410062dc33ad4d712c3b743ae2b7613576b2bd7c346a8479ed679a08e3644c7ee4f23b95f1cc9111905714b170abc37ee1003956f64f0a7e876b38d524fbb2436ed56069479d8d2e4029770f7801a7278fff99b3dc76280f35c7d43ee594073f725554a92eaf4f785c18a7cf6669dce5adb0995233241f3294cfb5bd8f4741 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2fef69f9745646aa13e0c38d77951161a1f881a7ceef032698da3fce00764959f11140bec7d7f53d6777c3622453d4525fb068da48047609d18d463a8fbacde1d21035963b668ca11d5b9ae66db13de7a7a5b66a40608dfb56d9f9f0c8880426641083a05b5ff9e6ba0d6da3a04af1af01dc218e9b4f6ad7b1d3a4d1d26a5c906093b2c + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -c50a24e5ddafb768f64677233c5cf09da1b4f06894bd68e194b23feb5c5d6844320a12a02d13ad012f13b1438eedd6313bac9c1f9bb4548fcd314988d8fe0ce6458306735307afe08a96a0c2bcd9cf126f529e48b7ff4b8266caa28c40b5c3d2a473ab8805c860d27d7ee9c032423148d96fad019490ea019d40679de7a2a3323e80979f9 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3a8682d0e5a4efa985dfa8bbddc2c0d72a4400b8b070a8cf7450aa8f831d8a91c9ae3542641b7a4ad793e232a0d301b82664fe2c7f20bd9bf8275828a2a20027d6056b211638b9b0220fa4252d058bb485dd3c4622b1eac97d54b9634b558ff1bd5bd11085d4f3d288f7965af52beaa922b23ac0207d5763c24c085076128e0ef7370eeaa19d + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -f00fb238bc9383079c7ecad9b9f6efc622d58a76f2d5d40ec7cd7c3c083c459fbcf3d128df4d20ead5f585505515aab11c36584ca622d28e0cf037419a649d598346063a07e29c61b7a8e76d1949dbce3720d45576763aa0d391b39dd6b694c7cc60a1b4f4f107d87130402985695e1847e82cce39b8d0fb5c88bcf3b37d6dbb90baf5a8553c3a + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2b809f6baacecf61198856d9edbb768ca2df2abe9b7b8ce1669fd9259732c8569c0cafde2e32d253094480ed281a8db230f84e780c6e8bbf3657c0b0baaf19ea973fd8daa2870c9d79f3695d78e063f9130fe07ce806a088ca267fd2820f10dac34b5b32aebec20e4362dce26eee0c29d2fedc1e020d452bc2499234d07a2a6e54314e3fd6dd85fe5 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -90ed75629073df816ec1d6dfedd1cdbed9239661e362db706288dc4d774d806bfacfd4b32c3013ec67d8c2af133b46989f12f809fe202d33d5ba53659bd2a9a85d3fa542de4a5c656aacbbf8899aa66ba816b809f2629f37b0444cd3a6dfc99103bcf2a5ee87790b8401be806b5d7fb7064ff0a6fc8ec769d0ccbddbc3d35f7dc4d388d8d28021c95b6 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3f60052c9dfe0bac797a674ca7f11377a24c28a1396ffa0f46acab7909543086aee1995cf51852ea4a21ff4bbf6e7309cba9848a7b2e3b33dbe660bdc58d513d16bc709f1f2253648b46daa7aa037332552db1da81b4ab9850ac4ec66621648fc856a71eee3cedc6617071600ecbc5ac8636233f288ec249b7ae0bac942a5fd539d03990c4fb28a46653aa + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -c12fc156d9345cdfcff94bdd324429530ad8caf8afaaa1a82297eb3a8aecf2ac021384036749e489fae05e8776da0deca7e4325436bc8f383bed579c2d67a456c4e23871489780d760d63d0bc0d1d0ab41f06a091b44f602bcdc0bd4e817202e39ca6a934c0c9405adb5a14d24da895c58a81d1c7ce52734183e00d80a414ddd8869998822364e029b3f42cc + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 205dc6227dbd3adf8ee49dffd43f835882822b1c94f92cf38f5efc62f943075d80b33588973a0e0a8ff5e800ede21d394736ba98d4eedc53a9122f8c262cd09fe9e91cedfd0237003b0124d757797ee13cd03e7a3a257bd8df756940a4d22face9287edca00ca23e7d5e629966ef710b07e54241dbace041aa6d9f82687c3ecba818203adb376ec0b201894a500 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -82c30a9ef6a83d81b77825c71ddc563939b8508f1b7e44c725ae0f61006646ba9b86507ec9a4dfd3755ecd8bfb451c2d43a61599732b8aaeedff7a304ce0a9327e2333f75e9a010556ecbc3abaed02214f25e1c8373bfafc2c288ea36b8d5f848b76295a141d8f633609a6656c07f3d98177f5fa83833476dcd111aad179001f81d6013ca3a54cddcd8dc0ce7eb24 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 33aeafda3cfc20710f0b4a3d9ace4817eed80ca57ce6c82dc2e7946058a40983c9204ac95a1399fa633bc96cb10af3ddeee3ad2337c64391a42dc7794fca629e3e1e4e03a2ae24a000e7113b91c1b6230cce9592e45b6ee7984680b45aa0aabd7f56cab1a64ec310cefe5211821a75deef2e0c8e43eb467dea79dc8c03d2d523734498d079d5493c904a2ebfd8a3a9bd + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -b897bc87a40211ef8f93645b1f6c981fa00ab3b12e117a89375400ab5f4c64bfbba01d265c7bc6f5e3a8e26de5de9df3b8f70f4a39c0eba577db5e4b7a68f751b4a69ff4a38915983cbf70dd7e066779405d572f5bbe0719c978b6865ea1a72d90d3ec8a8c146f20d98595036b3de88a7500d7b476644913e4b63e85c4e2632048e9600d553e560759770a902cca680b17 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 20604e080549e1c503049ebf4a56cf9447d90fe699a9773915b0a65588890e15bd58f55ad7b52bd7b7992a8b24704f1dfd5fd07c70aae4ccba5646405ff8a9cbf542dc334cc0c27a790c05420b552539fbf0a155861bec0e4d9e3fbf045720ea3aed58307d5738b64252a963f3fd5ecd0587cb4d7e159b4980dcb112e26c9c34f10a192e090ade157eac1d7a6f970871eaa69 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -f11fc9682601cab97c25533b2599f50edb1ac65d46f1969bd9c3cb3717461627621c8cd401a0a0b91f3645b8804e095aecab31c1bab0c26df556adafdd7e7f4f0510e0bceefa3619e26b8c9a1bc613db03857f53e9eb5d4b8f75a8cd1429feb81edc705e5a779d5f95373d2243368ce17ef22da79a6a2672496bdf629171b7973fc4659c8eae9ae867cf38d6d7617029bf59d2e + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3cb0ffbd9ad21d0e86e4e4dab4d237e2a17d97356bdd305fda772fdd99acefcfb8309d813643c852f66e1c6c7fa41ffd44f8335ef7333b2b3e846139fa9be2c4ea762afba4e11263c0b5fab18c5efff2a18d83ee89844f5f4db2c1325f0f55e066a9e01030c07a85e2c9bbd37b5e767ebcc9b95f474ecff24df9ae52a19edeb66546a3a28980f616eb5a351cd399e5f8436f17faf6 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -b8aaffe779855c6ae51807f8cba780aa64bc22e8fa5e33f7f1dcb084fc476791565bc33eb37b4f791ef5cf46d64576f48b5fadc9f096f20c798355861ce5d24a7be1450bb871f9821099f98213d74a5e5cf83b895ae65e0e0fd096698463906a112e6e169a1cc0769df7a5ba6812300fdd33611761b6339385e1a70f8f8b2be7679ca216f5b183140e69586a27aaa9f2fac118118875 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2b7ee3ee34347dd89ba4a81415aa1269d0390346597b07444f0febb71d490a01b6fee174634bd88e8aa180409549b2726d044b4690353de2fb2294c8f69c612485aa066f68fdb89466760a85901cbc7312bfe5a6f656e67dfd2d4ee099ff97694b01d6d5b8626ab1650eac5267be53f5f3ced5dda1aa86bf42ae132a28fddb94902a515da40e0fd0586dc8b17a34af8eb03d06f70ab89df + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -bf8213944ba785e01b8d37a12de77b2ce1492f34bf6f67406cb51da89675b4f70f4d4f314f30ca8d65cbc48ee2fa1f0a3e4ac0de3a87d2c4c589b6812e850623d78ef2e46fbb555f6d3c69b211892c11a4a2dc3d8a9a19e96a07952602ed5ffc0232c140c3e828acf990e5425d8dd9ce0c1107ad1c6f96c8fbc90ffa457abab0d843094dca3c8a45ddad81b7850190625613a4851485f38fd + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3083421e375f0722b9397e156de47f77635d62ba1d51794469371b473b71c02e3722841bca2ca06b5d1cf1492bbacfa0abfe394dfdaa7bb8787550ddbd953540e9c97631d9a1efe0c8f8e14f395c82d20245cec6d8021f8564b4d66e7779c3245734c56fb74481172f4e349d9a113cd0ee5263c69ebf746c5285cd4c0fa91d9531f769fea3610c2972ccfe9a22c00aa62ebf52b3a4c6135f3069 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -d736bce537f47ae4797faad797af8cfeaf8a4fd42df1f7e61febf8ebf6e47dabc48252ff7948f3dbf8cc369b6952dc58f64cf09b4c53447d135c7a753c21b6052a9726a47a61e13628edf0f2bdb357f2e780ac1ae1f28f211296c8961c2955b773d7dc2904dfea96780b2877af133c9591a0dd54cb20884f014f363862478ee7ec45236bfdcf0321af0692e68f744af28fbcca827ebdc7b210da38 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2cf1708f1e675ba688c0d19eb61a05d2c8642528ea6b1512375faa732acc59ec04ea0aa55e0049144be09eae1292b6cba6db7a9823f1e912df6a5032bb9674f4f26c0c8244ea0dde7acfda566574956cdc33e4a27bcdea25fe255c19f218cc4316ae8428ea61d1bf865197a066b959c5fcbd7c9596207997d05fc38e32322aa189ea06cf5139522571661745c0d72b740dc6d842f1dd8481e318b5792 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -a9180e44a284b5bbe72fff46e55869f749b626ac33c8cb17be1fc260d7c6f460f24a89e1367112e00d0da4d213a821d09f103f35bc4eade5605bef23c5d048b1cfb45dace8b9c637af626a85fc773cf51e6602a7a5999a030030cf114ed6a4ed7583465b9303a72e7f60824c12329517c6763b0f64abd8ba2b9b26cebe882a51f05ef8076e527d53a213db910a5f42be5fb78729a3dcd08d69a709920a2 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2f26e156b3b1117f7cec542b20fcc06ca66cec03a19b6f5eeebf22b4c0fc265df5ff06fc9dcac569735135bdc142b526b295225711efb71577b10aacda2fa446f5208487c725407c2188b3185237740c813e4455a6f1dde4f62916237f23164a3471aac0fcfe24ad1ce1dd81a6144f5861ad0cf22dc337abe10fc4a88b36116dc4929602ab48eb971fdd7a5ff747d6b9e0b2bff75c59621550991966a0a19f + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -9fe18ae697576dd36ebdb621d14cac1cfdfd1f5cbb7cfa8962c5a7dace96f9f54fb4f4cf2e650dbec5d1ba89ba53d251ecef7dcc1cab8c2ff3d77903f5fb5f29a4e8e3a2a3c05c105d5733b5132f2f8d88f99d17de86ca1191c32ad8ed469bb649ef188306f69f183bd0fcc32759e4f855170f88c0a3f6745aa98f6225536821bfa056a42b37535a622f42b009859c974cabf2e14f75c749d0fe5a01fb3ab0c0 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 33ab185854b20a8126884eed85181b14e75d4ee452958cc1043b099bc16c24b9c2f3e0b792744f230013907844496e600389800e45fd55133fff0cf19c9c152b9d031039eb90da568f9c5212a3ba283f4d1353ff8ff9dd04d292c265bdcb77c3e411716f471930bccbb8ddb819ebb0e0036dc1a18457cd97f4f5909a725baabbd15e8ce33875895aa8dce77a4dbedeb0271a2a4a17f77f5920c3776caa4a75ac650 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -e7ca0c037bf8bad5f8d9c5a2737e044d9f7284c616156d142612a53eb217f57f4aa00b6daa424e6c0d9163939e1ad0510a1cd64fbd576f3e54c59d7aa6228fb3caaba7cdcc951e00ed141ac3a68abb9780bf46bf544fe0e347f677288e962fb69782741df49b27cbbe8720c6f8f2e769147d89df6e17e3c592bede2e696d384b9f01b99b31c505d67eb6193a8844f8c4cdadc9fe45dd446a0dc572c9da6e58ed303f2 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 22b76d6973e37aff4a09216e57662f186c0a0748c4375d6bed370ea61d1f6fac2d9bbe04487a629118b6b0b0c8cc4179fff7bedcf048cc529498bbd9cc81ef3a103d6cac49d58bc41c83f961b6df7f00c7171fb7d9359e03c76e4364cffae5f67321ce646e9b05f9c04aa16ea65389e940022eda6dc740ddc070bfc7e589b86fd1559dc320701c39de20d54d0483fdeef6c4fd012850630b982c2e243ac1ff918377ceb4 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -e6e4d69a82b83e26ef8ac0f4c3a211153ea6655b7ca12840e7b866510d114693049c5b8b22c3a097eac832bbd1986e60564298e54dba3316807ad64bd6c18903a0f22660c9e8d5dac180f57cbb90b176b842d5b58d6dd9f47499a037833a92a18f397238a8bcdc4afd129382fd6d200d3d267ca1e6bcc2cc65950831cb8e30bcc01665c8149b874c9f11168153c187341afdc43e4d8652ce4fbed9f9eac75db40d64344ade + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 319a81f052db21ee213c536db2cb8a71e0dcd0a9b2ce780a9588c38b717c5e487a337f82b5223f638fb552e92b826192e6a1c27771d1e86584bc6c7cbc5d9a6ce6edf2ea2ccf6939485959ccbf3183b40e410768c4665adf90a0ae2792fb4b5d8aaa06c6294e31893620decc3bc72fb4eb68f1e56b48e39c59abe869d07509b7564268d0b7f178ef09ef5dcde6e7dbd2a20fd1d4fcd707943dd63adf590a117ead1ad10ff85cb + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -eced809145e696ceaa0ee8f831eca67049509b31a1b15e7fc86cdd97a73a2ca05bfea5f4b283d287e49906463ef36f2f8ea23c2aa12d5534c08e9769055e04822be0f8ac85f404f5c025a6833b4115f78da9470451c852ba0f24062397d20385f58c5aca10f3f09072b2592e5672ffb989a390abf86cbce74268aef1f4ffde730b3b962df1088bf8745105a7462379ce142f819c2538d9bba99e094ffbc4478625bc54df16c5e1a + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2c1ffbbb30e71d5fa77b5473392f95297b489c85f83013262abbe948842473154e00c86b2e354278844083f960fd746a3b7cb9baecb9c66932774b3a28f678d50dd8fe52fbeead43d8c8adad7c0fcdbe5e02664b0feb0ce214c5fa007c5fa2d08c5fe96787b95639311cc4b7eb2a7217c9c38c6d93444fa60c1f52ddae9bb2ec1a49a593e210e47377d3623cd2c4994ad9343863443911062e12233176f4a65ec715b3c9731c4a0cec + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -c3bf056b905c0392a7b5fa57446ed350f325eb67d59f1784c744b04c7f4d8f5397db913407aa8a7f1dd0225c1a9673828db0d8bf3d4908ef53307131bf5b5c4c6068ad73b874aab98e8db33b0a758532172acd8b2c830d0679a8226537090166317b8eea91e8ee4a7282c0ab0ab6f2b7b63d728d22b534fdc88294c376a8d036ba9a644c2489bcc84f6aec83afbac08067a7b93f3897f8dadfb68c327b751841927a728faba47dc44ec4 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 23fcf9510caa531a304eee8d0b2d49050fca83abbf287b6b6dea06501c5afc6d87d2924df1d45b1bf6c4bf77b563a3013cfb4ad9094f8ee9892d33f6ee1c70131cd5721c5af804a9da7654510e8591aa185ee723f8caa78046d9e6fbb891e6024d2ec70110ae61c3969995e35941d2c7f3779d5bb71ce5b693bc9ce4b087068adbb554acc4ab23624e060f7cea169ab512a06ff3d2a36c2b6e3bd9a75f1a9ad30a6a16b0256c42eaff2c3f4 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -c32d5e643b12db6616554116299c1da672efff1eee394378c5e9e5f702ea4ad64f0dac8904bd2751d2cef91adcb283599f6c661967dbab27059e94dd50025489cf74c6897a22e95013669aa3063fcdd4b73aa6a9a1ba5cad3956bb26346e22df6741cd0ba1c0ab87fbe74035618a394383823216df47b910cae495b8fe7ac5feb3b2cf0d0ef6c75db477160b75324db8eeac48a0fce72b9abbd7079ce6f529a89025a03a3777cc7d1deaf3e4a + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2a8f2c530342bb6ce683a760540e956a1155c0fe065476e400caec59861ca97ca71e51a11b3213b2baea1a41a29449998778e0f533fcc181698d293f05e28bff2750ef4095170de98a19a36ddcf59a65f3789a3808ead51680245070262c9544e446f23652eba47065a2bc4701c55378bd49733619ed2c213f8ed12a4a317c465f37efe07ff2df8e88fc33d3eb42cde9408dda28215702bfa607030839285a8bbf89b5e8842fa7d7f50d83fd4ab5 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -bcd2b2362aa146cd120b729e81c98ae598804006d046a7ed0f9782baa10a85e37c7c22288dc61c24830a1b42b123d63779e88d7555028292fed5ada1793264b35e961b608bdd7398e421c5474c33a65059ef13787e0cedf4f8f032beac48c4b5e5a67417109142a43b198ab617d1de1a38d6fb4922c6ef70a5aad3faf6f8d5da3af9679c94cf61ee760ba792d2972376425e2ec9c4109e969e3d9c3dd90cdbaeaeb7382cb7bd024b75a1fd6d621c13 + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 3940430ace4b5b87bf4baa2673582db3d27307ca4cd8e55e976ea3e10da72b6deb7de932253bc9228c85cd4ae7766cd0264004c658a66d81e60bb9bf4dd66e2afe11057b7f7b53a1ec222510748be53a93970fb056e8082631b2b77413fccb6e61cdc6f224b7903d75345afed8a4f194b4bcedfee1f16dc256c2bb9f4a129fab6a9fe752895a93937a3d087ab7ca212991ff34f1bf1c55987a574674af43986312bbc3bad3280bbddf4ab0217440f851b + +Quotient = 0 +Remainder = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = -ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -f0dc20b88450f45381791e85d080e4f2cf38837391e16e608b8cb5e0ac0ca75e9f72cc04bf2f56f130d46aff31efbabc0ab14f0c0ad680d6899797297152be85ac012644c8d0927b5b6c70dc3e5a8d79ef92a0873ec22af3d9683bb5db1ffd5ebfb698c5ea64cbe2b6a8b9f14d4c18624be1b78b19eca14942ae9542012692cd0d5289ebf75fcf5486596f92659143e9f952af3622137e633376fb95e628055e0fb1ba3a37ccdf0af69a4c0d6b0793078e0 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = 2f2135850715f623909e41a745eaf7b37593567fa8be2d1ccf76d10b93a096e244b91d8700cca37a2ec1bff7c3d21cc3211ea8b03a3594921dec32faa185e7f3d9d17e98cbf8d881fd2abb944181659242ede21df7e5e8784f541cad678df1ef6ca4a5fa91f7856c62fe593c4d24436810cf4fbd11125bcb571f6975d82afeb81bd0c7700e053fc175fb5fc7b329c438479a863b8d5fbe6b4436b67355c51d0306e8847a27a30c9e61f0e08232673cdf0ba4e0 + +Quotient = 0 +Remainder = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b +B = -cf429f101a2e19a65af1e238f6745215cf476ff2609c846f10289f1ef21b89af2aec53def3f4ec07ea42041f8b5862dc37fd03b2df12adaa8c9f1933cc69b526d47797b40f49545fd093b8ceddee3c55721d1fa19b336218de0cac56d410cc6cff4e620578cf820f5cdaadc367dc4d6372aab1e0ae3831a6d153c14920b1dcf09e7629b7442a06385420d79742e409677e3b82ec58bcbfa668ca072e981e20728a983d84a432605389c855a6668e0ee0d2b67449 + +Quotient = 6f949f45c70d69f65ace3e8d79071803fc6b8cbecc1ec1105ee6dd4e3a07577f1df5674853637faf6e5064ac86c3595627497311d749864c87ae8d6a0fcdbf258de637ac8db6cf079a230105582230644422186051875243269bdd6558b95eea7db6f16147554764d8a36d8faca89e8e7583576a0f9beb7142bf4d4d77d97c91 +Remainder = 0 +A = 6f949f45c70d69f65ace3e8d79071803fc6b8cbecc1ec1105ee6dd4e3a07577f1df5674853637faf6e5064ac86c3595627497311d749864c87ae8d6a0fcdbf258de637ac8db6cf079a230105582230644422186051875243269bdd6558b95eea7db6f16147554764d8a36d8faca89e8e7583576a0f9beb7142bf4d4d77d97c91 +B = 1 + +Quotient = 3b5c3007d9c49498ff8437b6f0014d146b63c20b6c5b91febee47211f42109f6081204b21a8af99e9ab2b5165d536344fec16bd691fb3883ee7335e12d69afc8bff57641ac7a4cee350209a08301553854873da153ccf056427a2415e3ce72972afb5883393806ec2388169b513674c0935f67ec79c89dfc4bdc6f9cf877a10f +Remainder = 1 +A = 76b8600fb3892931ff086f6de0029a28d6c78416d8b723fd7dc8e423e84213ec102409643515f33d35656a2cbaa6c689fd82d7ad23f67107dce66bc25ad35f917feaec8358f499dc6a0413410602aa70a90e7b42a799e0ac84f4482bc79ce52e55f6b10672700dd847102d36a26ce98126becfd8f3913bf897b8df39f0ef421f +B = 2 + +Quotient = 4f54d7e1ac8816945de169e9a2c497ff240e313c2b7d58612c8175e277f032cd4ee5dd640605028c59395a1eb4aa00772a8187a0568b93919aa5b95b0462e5bd31c1e507170039306e1b2f4f75f63ab0a3add0eb01217df61a74765fc37e941dedf10fe142ae317573a4f0c8ce408c213749a12f56add5d100d0973b019350a1 +Remainder = 0 +A = edfe87a5059843bd19a43dbce84dc7fd6c2a93b482780923858461a767d09867ecb1982c120f07a50bac0e5c1dfe01657f8496e103a2bab4cff12c110d28b1379545af154500ab914a518dee61e2b011eb0972c1036479e24f5d631f4a7bbc59c9d32fa3c80a94605aeed25a6ac1a463a5dce38e040981730271c5b104b9f1e3 +B = 3 + +Quotient = 2922aed641a12010a3099f3c03f708962e2791dd860e65440acf3b982a4041804dcbedf45deefdae5130df96902056f8b2942069fc17bfb29f46a096a36e842ecb30d0800da13b6572c5b3a095038baa3107ca28094063571b517f7cda3659b63099c57a40d7dd2893b92d60b1fe2fb4594fc3a19b7d7957921437556db0e353 +Remainder = 0 +A = a48abb59068480428c267cf00fdc2258b89e4776183995102b3cee60a9010601372fb7d177bbf6b944c37e5a40815be2ca5081a7f05efeca7d1a825a8dba10bb2cc342003684ed95cb16ce82540e2ea8c41f28a025018d5c6d45fdf368d966d8c26715e9035f74a24ee4b582c7f8bed1653f0e866df5e55e4850dd55b6c38d4c +B = 4 + +Quotient = 216236f9c82fe6f1c021853a21fde3e21e6de355cf193f16b403edf59a6a6ebeedb266d4c7a6683f5f6a434c7129f582d2a5a852269d66d2eda45a1e2f25286c665f6641ff8b55913603064cc7a157f755e515a426873e7bc6b9d699d1f316759c4505a67b7a025598f9d1af6ebff2ed0fe393db829f768178c1080ea004e4f4 +Remainder = 4 +A = a6eb12e0e8ef82b8c0a79a22a9f5736a982570ad0b7e3b718413a5cc041429baa47c0227e640093cdd13507e35d1cb8e1d3c499ac113021ea435c296ebb9ca1dffdcff49fdb8abd60e0f1f7fe626b7d4ad796c34c0a4386ae1a1310119bf704c0d591c4069620babfce1186d29bfbea14f71e3498d1d50875bc52849201878c8 +B = 5 + +Quotient = b9fbd48d54b9b70374425aabe16d6a8a819944a43185c2fd07073e20358510ac3de13cff33fe6220ba952d88b2e0f3f7eddb8daf27462b476b5e127e72ea60fd56cc54bf14d2d92765d5d21652d8e16aad4423cd9789515d59aaa02d42d3e957dde50ed1c9a69e2295144a643a8104660ccaafba250854e7f28a686935738 +Remainder = b6d +A = 8ec1cca67b888cfa26bcee98ee887c47507a253008032c2b37e50f2fb914a34c357f6351e368c2521f3781736d4dab43ce130640f1a55c3851e9b5320f34e772751fd70cab7bd7aebdaa9fc22297790661fecd7b4ed0e6f4275377f2bdcba89bf1d251e0074864618b6e1319eee807e054d193e2616ce52c09ab3d24c187332d +B = c48 + +Quotient = 5157f1bb35866dcaa3abb4abb73580d43d03536c3c7960aa95910db60f4d1ffada96c7d89dfcb290bd8c5bb154872e2dd6e50602fafb435193575a4cf253e4d22dbecf11f8f97408dcc83d6e591b1d5daa59825ed8cb08cf562fc50d62cd666b9720055dc11cd42278258e5bd8021aada0b39a340b6c5585bb6c9c84a9ff8 +Remainder = 3d2 +A = 469e999cc737f4d12c97d19a13ce331841f8232cb780602c18592e274ec8b503884566ffcf28a206288f1a9ab3a25bd74bd054781664a331922a96254d6155677836e7455a6690fcb1acd7550cdbca3e9124356ed7b644660092f8d2df06d22ae7f38ca8a4e7472aecce9ad73c47d3a93cc3ec9faeeacd3f59f70ae22c9614b2 +B = de4 + +Quotient = 3566586b9f864dac5ed132d95d4ac6d1fd5ef6a2c67fee39ece89d615b4c681284b4dd5e27b90c6270b85b150fa2a63440e470b0f937b0eb83432be03eaeb37a0927a9c76b07fe40e3509c93a7b660b77ebbec9bca235d387a9a80a6432c77ddd8190c0ae8ea1d72331d5f4985467755b27573bf23109a01c02975e07daf3 +Remainder = 2a2f +A = 9d68d0643f1d44b63aff6a83fca08c52bf800dc59260db9b7ff930eb1bc01a47966fa509abd7da21ad856f7cf536d32dc7c962afaca1c9e43bcde135e4c5b9cd9b3c8ad775e06fda06117f8cc03ffad8e5f4b456baba7eaa9c67af7a19c2f4d65120d51fa8d31d0cc1ec7502187cd784fd2d78514cbccff969123718de7cb30d +B = 2f2a + +Quotient = e36f2fbcfe134fdf3137539006d6d9c03b8774883211f759b0258bb09585440d6ff440e799ffc434a2fc529773a455db9abf72d8c55903d9ae5abd5b2b5e9ccf23c015882cab8565c654532d9407a188a40d0cb026fb3bfda428d4bdfc14bec72b5cbd59540c42598f1371e9e61a86e6b4c957ea331baca764b771212495 +Remainder = 6eeb +A = b669c646d1bbd7389fc642da6d2c440788fec53bd8409ee604222d08b1fc31b3d301e42a8168be0ac394e5f20eb51708b11e7b09d25043f19032310d6649d33eb6c9688506ebd56ebfd0d3f277511ad3caaba3642c53d27e8fb0eb991c75577f584c52b1ec44111b3a9bf5863c18d8a07b91d8ae0bdbbb3b05ec8d11380a9c3a +B = cd53 + +Quotient = a891f8a42093cd86d76cb11cf734a65dccd5b4d350328a7d2f2be76e2edb6b7dcf4c5e1915c65764c77ae73fd6e42eb8451253507e16f2e25ef80e5d1f27ea18dc976a9b12147ecb643b2ab060163307df818127b2e40dcea95a109d7841edc9288190587ac48ba9687ccd0d014d531bcf66ec401bbcbed777325fd1060c +Remainder = 6e66 +A = 9077614b809f4b22707cf965a7e79217e13ca2011cf9e069babe2b4d908e318608f91da095864403b168d750d904fbfe11c9ed80ba9f60d57a8dac2754647002a0848fefb7a5aa8e04fd28dcb9c8e669de4ef794eab2abc93d68dcbf4400d86de603d199a3ee93050638fca7063ea99a9465dfb60d0568b99dfa1ed79da41522 +B = db65 + +Quotient = 1b16f2e2ef7709fe285ede17beb7d9932caae2dd5fa0eebb541770ca1d53da4428820986cb7e79026eb8bc261eceb200b7696a4b90f675ea9af8389c60dde4d564c8adeba6b117edd05469d285670c0bc78afbc3ad047828cdc611fbcab403c0cb79665d6285b43fa04b77f0309bc7f74136778f8ec16899df040db34f4751 +Remainder = 68 +A = e91e7c26e2b562fe2568613656381d5581628e4705ede6660ca5b79b4a609748889707faf9295b57eecfbb1c0b1cb5cc2a5825b84878e8b9e3960f29b59580385a4af0aae375f8eb7fc66aa6a1fdc4a95e29048ce1e5760722c77cc1c95b1c4c16fdb3e59ed4961f8869711ff24c91ccbe2fb6e0617a5f242227e1e60b3ab673 +B = 89b + +Quotient = 37370826964cbd65a48598e73b519db77df6f520bcead8c0446f1288ac189403adb65603b2a68ab3cc232b667232f2e206b5bee0fd48fea8b3ff515f452b5ef0cac591b6ac8c8c509c59c6d3d4e3fa03e22578ff71f1c72ddad9d637ae0497ef0e2a4b261a72cb784f8283eb7e82b6a05aff0a2f61da4780e4e7cfcc4807 +Remainder = 3a29 +A = 16ad5614f9129c7952c5ee8057d8d12a70780144e616e3ed571b2e38a9ce482a52c436eb9ccb6e4f400321bf1f3ef4c8dc897cd91f868eb7018d084784c4840a1d078c8c6a75e950cb76cf2cd81b719ac04d2be5c9a830b1d1361f7ef6345af66a6d56c53234cd98f587b6762401674973df670addcc4a05ec0344d402453a25 +B = 6924 + +Quotient = 9bb00032a27651eac898b8a567e19ed6448669c8514b5659c4b1103069d9289c6c00b38b44160e0efb2c635b7a64c8296c1c1b5c2cdb285b749e614eb9247c6defa06f8dac077b1e1c26059847de56a1a5ddf7fb1254662624f2ffe6edc48f3b318ffdc7ba2a81ef2d963b934120f58afba2b107a215b58f324e2d923f75 +Remainder = c03 +A = 74524695d4dc11023ff202ed2d165551ace0c126f7a51ebb3ff21ecd7c058cd4a6bda2254c55ce6ef76fd11807f92e80dad31bfd254f9a2e1ca89949f65a1fab8f6a4978c488f2dfa61df46c1faa418ff45250d82958e8f5fdd9426c44a3bcd7c4eeca276abae466787a5ff0ec482514e03434ee68fce24fc620e31265c3718c +B = bf45 + +Quotient = cecbbc189fb1d44c5511f742b63207bcba9c78d09342cdcd12a1b1bc3a95466e7fdd8c59329a9b18f7c793c43f08d52339a8202dfa3a9fa86a2426bf5a94e006849b45cbe9a5dd74ca43e2acdf1051be23359624e8f146b203864d03651d98165b783398a59b446314c9b01f79b1139c30df348b14ffd25b22d9d90866b +Remainder = b265 +A = c3721776b9b5fea8608aa9d381d80ac603d27043089dac276832e7cde8d222ffe142f06c314e94c3b9f6148d029f260879b700e1d435b5f318c8c8caebe92236c9060c183783edec2845e6d4e816197196a0de3644544093b04ac6fb4c69d7446954fbabadcc5dc3309e9a3fcf70368ba7448455cec9c3dc78512a19ebb04f6 +B = f1f3 + +Quotient = 4090a2c78cf8711388347149926610d624543765c9667567ad86eef9f9777f53c0cc0f9a989d9195a5e0da875c03e5c74614f95b8752f9ab89fa61c264b8b5d3e02b043fd539d36dbc6782f45a555d1f36751603d5c3423c7f27b3b5dcb91ddc81bf1563dd3abb0970de6109d76da1f4f9d5208ade2b131fc407c5b169c +Remainder = 2a87 +A = 129d32cde3c648298f8e8e8123f2e8ee9cad3f909a5647ed09e91cb99549d177575f54a7a3ebbd4ed2b89940722927a8b9565ffbc13d8df6d2616d5b1925b87bbb6aa6d39f2b11d26d071fa30e63083ed5a5357ecf0ab1028cf0a43178486679e86fe4dcb071c49832c83c9de4599d672e5ecfc7c9190f1d7275f5a0abed80f +B = 49ce + +Quotient = 43340591e68e228fb03e44a5f2046afe41a3d7ca99ea9ff1a445d75f95f2ff7f55fb914791613b5db7369121d416a5f92f834b0b5e9280b49a9e66be4c682019881e6e8883d7a923d2a5d309b9d265b01d6b8a4ee07f7552934f2de002cf961fd93f33641aaaccc7c367fb6798436eecc9bb22357087a9c482131e1065eb +Remainder = 6332 +A = 42e75e3b8c23287044593d9fa4bc5df437a0f8e876d3105334a677b5ecebf653e8bd7e55dbbf6876005196e44980bc23df491949c59aa199cc9e0a111b58f954eaff2bd270214726e5c98de502ba71b42089fba51e8763f0c11f278faf4c61589ceb674d7c7c61f62f8d18ccd619c20243a508c26b934f06ddeec0421b372326 +B = fedc + +Quotient = 688c7120765f8ef7363f7ae1bb65bc568b16e32c59762f59f34a57f08839d19019313dfcc9e96d7415766bc0aa032b19ecea72c249bffa0538bb1ac06401657df2fbea5c46b18d8a79cee4029e5972d8361fb7e6c2c537673aecd727dbc758a3bca1a001765a216e9985eb7eea67ae979f3803f14587507ba0f8fa29957 +Remainder = 9970 +A = 688c0894053f1897a74844a2408400f0cec058157649d5e3c3f064a63049495647a124cb8beca38aa802564a3e428116c1d085d7d6fdb0453eb5e2054941017c8d7df7605c5546d8ec446a33ba56d47ec34781c70ade74a203859c3b049f7cdc63fde35fd658ab14781751f8fee8c42ff0a064b941960af4507d59309b50019 +B = ffff diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/test/shift_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/shift_tests.txt new file mode 100644 index 000000000000..fa1aa590a972 --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/shift_tests.txt @@ -0,0 +1,2416 @@ +# LShift1 tests. +# +# These test vectors satisfy A * 2 = LShift1 + +LShift1 = 0 +A = 0 + +LShift1 = 13116120bca5df64e13f314254 +A = 988b0905e52efb2709f98a12a + +LShift1 = -13116120bca5df64e13f314254 +A = -988b0905e52efb2709f98a12a + +LShift1 = 2622c241794bbec9c27e6284a8 +A = 13116120bca5df64e13f314254 + +LShift1 = -2622c241794bbec9c27e6284a8 +A = -13116120bca5df64e13f314254 + +LShift1 = 4c458482f2977d9384fcc50950 +A = 2622c241794bbec9c27e6284a8 + +LShift1 = -4c458482f2977d9384fcc50950 +A = -2622c241794bbec9c27e6284a8 + +LShift1 = 988b0905e52efb2709f98a12a2 +A = 4c458482f2977d9384fcc50951 + +LShift1 = -988b0905e52efb2709f98a12a2 +A = -4c458482f2977d9384fcc50951 + +LShift1 = 13116120bca5df64e13f3142544 +A = 988b0905e52efb2709f98a12a2 + +LShift1 = -13116120bca5df64e13f3142544 +A = -988b0905e52efb2709f98a12a2 + +LShift1 = 2622c241794bbec9c27e6284a8a +A = 13116120bca5df64e13f3142545 + +LShift1 = -2622c241794bbec9c27e6284a8a +A = -13116120bca5df64e13f3142545 + +LShift1 = 4c458482f2977d9384fcc509514 +A = 2622c241794bbec9c27e6284a8a + +LShift1 = -4c458482f2977d9384fcc509514 +A = -2622c241794bbec9c27e6284a8a + +LShift1 = 988b0905e52efb2709f98a12a28 +A = 4c458482f2977d9384fcc509514 + +LShift1 = -988b0905e52efb2709f98a12a28 +A = -4c458482f2977d9384fcc509514 + +LShift1 = 13116120bca5df64e13f31425450 +A = 988b0905e52efb2709f98a12a28 + +LShift1 = -13116120bca5df64e13f31425450 +A = -988b0905e52efb2709f98a12a28 + +LShift1 = 2622c241794bbec9c27e6284a8a0 +A = 13116120bca5df64e13f31425450 + +LShift1 = -2622c241794bbec9c27e6284a8a0 +A = -13116120bca5df64e13f31425450 + +LShift1 = 4c458482f2977d9384fcc5095142 +A = 2622c241794bbec9c27e6284a8a1 + +LShift1 = -4c458482f2977d9384fcc5095142 +A = -2622c241794bbec9c27e6284a8a1 + +LShift1 = 988b0905e52efb2709f98a12a286 +A = 4c458482f2977d9384fcc5095143 + +LShift1 = -988b0905e52efb2709f98a12a286 +A = -4c458482f2977d9384fcc5095143 + +LShift1 = 13116120bca5df64e13f31425450c +A = 988b0905e52efb2709f98a12a286 + +LShift1 = -13116120bca5df64e13f31425450c +A = -988b0905e52efb2709f98a12a286 + +LShift1 = 2622c241794bbec9c27e6284a8a18 +A = 13116120bca5df64e13f31425450c + +LShift1 = -2622c241794bbec9c27e6284a8a18 +A = -13116120bca5df64e13f31425450c + +LShift1 = 4c458482f2977d9384fcc50951430 +A = 2622c241794bbec9c27e6284a8a18 + +LShift1 = -4c458482f2977d9384fcc50951430 +A = -2622c241794bbec9c27e6284a8a18 + +LShift1 = 988b0905e52efb2709f98a12a2862 +A = 4c458482f2977d9384fcc50951431 + +LShift1 = -988b0905e52efb2709f98a12a2862 +A = -4c458482f2977d9384fcc50951431 + +LShift1 = 13116120bca5df64e13f31425450c6 +A = 988b0905e52efb2709f98a12a2863 + +LShift1 = -13116120bca5df64e13f31425450c6 +A = -988b0905e52efb2709f98a12a2863 + +LShift1 = 2622c241794bbec9c27e6284a8a18e +A = 13116120bca5df64e13f31425450c7 + +LShift1 = -2622c241794bbec9c27e6284a8a18e +A = -13116120bca5df64e13f31425450c7 + +LShift1 = 4c458482f2977d9384fcc50951431e +A = 2622c241794bbec9c27e6284a8a18f + +LShift1 = -4c458482f2977d9384fcc50951431e +A = -2622c241794bbec9c27e6284a8a18f + +LShift1 = 988b0905e52efb2709f98a12a2863c +A = 4c458482f2977d9384fcc50951431e + +LShift1 = -988b0905e52efb2709f98a12a2863c +A = -4c458482f2977d9384fcc50951431e + +LShift1 = 13116120bca5df64e13f31425450c7a +A = 988b0905e52efb2709f98a12a2863d + +LShift1 = -13116120bca5df64e13f31425450c7a +A = -988b0905e52efb2709f98a12a2863d + +LShift1 = 2622c241794bbec9c27e6284a8a18f4 +A = 13116120bca5df64e13f31425450c7a + +LShift1 = -2622c241794bbec9c27e6284a8a18f4 +A = -13116120bca5df64e13f31425450c7a + +LShift1 = 4c458482f2977d9384fcc50951431e8 +A = 2622c241794bbec9c27e6284a8a18f4 + +LShift1 = -4c458482f2977d9384fcc50951431e8 +A = -2622c241794bbec9c27e6284a8a18f4 + +LShift1 = 988b0905e52efb2709f98a12a2863d2 +A = 4c458482f2977d9384fcc50951431e9 + +LShift1 = -988b0905e52efb2709f98a12a2863d2 +A = -4c458482f2977d9384fcc50951431e9 + +LShift1 = 13116120bca5df64e13f31425450c7a4 +A = 988b0905e52efb2709f98a12a2863d2 + +LShift1 = -13116120bca5df64e13f31425450c7a4 +A = -988b0905e52efb2709f98a12a2863d2 + +LShift1 = 2622c241794bbec9c27e6284a8a18f4a +A = 13116120bca5df64e13f31425450c7a5 + +LShift1 = -2622c241794bbec9c27e6284a8a18f4a +A = -13116120bca5df64e13f31425450c7a5 + +LShift1 = 4c458482f2977d9384fcc50951431e94 +A = 2622c241794bbec9c27e6284a8a18f4a + +LShift1 = -4c458482f2977d9384fcc50951431e94 +A = -2622c241794bbec9c27e6284a8a18f4a + +LShift1 = 988b0905e52efb2709f98a12a2863d2a +A = 4c458482f2977d9384fcc50951431e95 + +LShift1 = -988b0905e52efb2709f98a12a2863d2a +A = -4c458482f2977d9384fcc50951431e95 + +LShift1 = 13116120bca5df64e13f31425450c7a56 +A = 988b0905e52efb2709f98a12a2863d2b + +LShift1 = -13116120bca5df64e13f31425450c7a56 +A = -988b0905e52efb2709f98a12a2863d2b + +LShift1 = 2622c241794bbec9c27e6284a8a18f4ae +A = 13116120bca5df64e13f31425450c7a57 + +LShift1 = -2622c241794bbec9c27e6284a8a18f4ae +A = -13116120bca5df64e13f31425450c7a57 + +LShift1 = 4c458482f2977d9384fcc50951431e95c +A = 2622c241794bbec9c27e6284a8a18f4ae + +LShift1 = -4c458482f2977d9384fcc50951431e95c +A = -2622c241794bbec9c27e6284a8a18f4ae + +LShift1 = 988b0905e52efb2709f98a12a2863d2ba +A = 4c458482f2977d9384fcc50951431e95d + +LShift1 = -988b0905e52efb2709f98a12a2863d2ba +A = -4c458482f2977d9384fcc50951431e95d + +LShift1 = 13116120bca5df64e13f31425450c7a576 +A = 988b0905e52efb2709f98a12a2863d2bb + +LShift1 = -13116120bca5df64e13f31425450c7a576 +A = -988b0905e52efb2709f98a12a2863d2bb + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aee +A = 13116120bca5df64e13f31425450c7a577 + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aee +A = -13116120bca5df64e13f31425450c7a577 + +LShift1 = 4c458482f2977d9384fcc50951431e95de +A = 2622c241794bbec9c27e6284a8a18f4aef + +LShift1 = -4c458482f2977d9384fcc50951431e95de +A = -2622c241794bbec9c27e6284a8a18f4aef + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbc +A = 4c458482f2977d9384fcc50951431e95de + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbc +A = -4c458482f2977d9384fcc50951431e95de + +LShift1 = 13116120bca5df64e13f31425450c7a577a +A = 988b0905e52efb2709f98a12a2863d2bbd + +LShift1 = -13116120bca5df64e13f31425450c7a577a +A = -988b0905e52efb2709f98a12a2863d2bbd + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef4 +A = 13116120bca5df64e13f31425450c7a577a + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef4 +A = -13116120bca5df64e13f31425450c7a577a + +LShift1 = 4c458482f2977d9384fcc50951431e95dea +A = 2622c241794bbec9c27e6284a8a18f4aef5 + +LShift1 = -4c458482f2977d9384fcc50951431e95dea +A = -2622c241794bbec9c27e6284a8a18f4aef5 + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6 +A = 4c458482f2977d9384fcc50951431e95deb + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6 +A = -4c458482f2977d9384fcc50951431e95deb + +LShift1 = 13116120bca5df64e13f31425450c7a577ac +A = 988b0905e52efb2709f98a12a2863d2bbd6 + +LShift1 = -13116120bca5df64e13f31425450c7a577ac +A = -988b0905e52efb2709f98a12a2863d2bbd6 + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5a +A = 13116120bca5df64e13f31425450c7a577ad + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5a +A = -13116120bca5df64e13f31425450c7a577ad + +LShift1 = 4c458482f2977d9384fcc50951431e95deb4 +A = 2622c241794bbec9c27e6284a8a18f4aef5a + +LShift1 = -4c458482f2977d9384fcc50951431e95deb4 +A = -2622c241794bbec9c27e6284a8a18f4aef5a + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6a +A = 4c458482f2977d9384fcc50951431e95deb5 + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6a +A = -4c458482f2977d9384fcc50951431e95deb5 + +LShift1 = 13116120bca5df64e13f31425450c7a577ad6 +A = 988b0905e52efb2709f98a12a2863d2bbd6b + +LShift1 = -13116120bca5df64e13f31425450c7a577ad6 +A = -988b0905e52efb2709f98a12a2863d2bbd6b + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5ae +A = 13116120bca5df64e13f31425450c7a577ad7 + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5ae +A = -13116120bca5df64e13f31425450c7a577ad7 + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5e +A = 2622c241794bbec9c27e6284a8a18f4aef5af + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5e +A = -2622c241794bbec9c27e6284a8a18f4aef5af + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6be +A = 4c458482f2977d9384fcc50951431e95deb5f + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6be +A = -4c458482f2977d9384fcc50951431e95deb5f + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7e +A = 988b0905e52efb2709f98a12a2863d2bbd6bf + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7e +A = -988b0905e52efb2709f98a12a2863d2bbd6bf + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5afe +A = 13116120bca5df64e13f31425450c7a577ad7f + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5afe +A = -13116120bca5df64e13f31425450c7a577ad7f + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5fe +A = 2622c241794bbec9c27e6284a8a18f4aef5aff + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5fe +A = -2622c241794bbec9c27e6284a8a18f4aef5aff + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bfe +A = 4c458482f2977d9384fcc50951431e95deb5ff + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bfe +A = -4c458482f2977d9384fcc50951431e95deb5ff + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe +A = 988b0905e52efb2709f98a12a2863d2bbd6bff + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe +A = -988b0905e52efb2709f98a12a2863d2bbd6bff + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc +A = 13116120bca5df64e13f31425450c7a577ad7fe + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc +A = -13116120bca5df64e13f31425450c7a577ad7fe + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff8 +A = 2622c241794bbec9c27e6284a8a18f4aef5affc + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff8 +A = -2622c241794bbec9c27e6284a8a18f4aef5affc + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff0 +A = 4c458482f2977d9384fcc50951431e95deb5ff8 + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff0 +A = -4c458482f2977d9384fcc50951431e95deb5ff8 + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0 +A = 988b0905e52efb2709f98a12a2863d2bbd6bff0 + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0 +A = -988b0905e52efb2709f98a12a2863d2bbd6bff0 + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc0 +A = 13116120bca5df64e13f31425450c7a577ad7fe0 + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc0 +A = -13116120bca5df64e13f31425450c7a577ad7fe0 + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff82 +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1 + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff82 +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1 + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06 +A = 4c458482f2977d9384fcc50951431e95deb5ff83 + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06 +A = -4c458482f2977d9384fcc50951431e95deb5ff83 + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0c +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06 + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0c +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06 + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1a +A = 13116120bca5df64e13f31425450c7a577ad7fe0d + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1a +A = -13116120bca5df64e13f31425450c7a577ad7fe0d + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836 +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836 +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06c +A = 4c458482f2977d9384fcc50951431e95deb5ff836 + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06c +A = -4c458482f2977d9384fcc50951431e95deb5ff836 + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0da +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06d + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0da +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06d + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b6 +A = 13116120bca5df64e13f31425450c7a577ad7fe0db + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b6 +A = -13116120bca5df64e13f31425450c7a577ad7fe0db + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836e +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7 + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836e +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7 + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06de +A = 4c458482f2977d9384fcc50951431e95deb5ff836f + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06de +A = -4c458482f2977d9384fcc50951431e95deb5ff836f + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbe +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbe +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7c +A = 13116120bca5df64e13f31425450c7a577ad7fe0dbe + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7c +A = -13116120bca5df64e13f31425450c7a577ad7fe0dbe + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fa +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7d + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fa +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7d + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6 +A = 4c458482f2977d9384fcc50951431e95deb5ff836fb + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6 +A = -4c458482f2977d9384fcc50951431e95deb5ff836fb + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbec +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6 + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbec +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6 + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7da +A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7da +A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb6 +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb6 +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c +A = 4c458482f2977d9384fcc50951431e95deb5ff836fb6 + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c +A = -4c458482f2977d9384fcc50951431e95deb5ff836fb6 + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed8 +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed8 +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db0 +A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed8 + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db0 +A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed8 + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60 +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db0 + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60 +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db0 + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c0 +A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60 + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c0 +A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60 + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed82 +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c1 + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed82 +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c1 + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db06 +A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed83 + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db06 +A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed83 + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60c +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db06 + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60c +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db06 + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c18 +A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60c + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c18 +A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60c + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed832 +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19 + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed832 +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19 + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db066 +A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833 + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db066 +A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833 + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60ce +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067 + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60ce +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067 + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19e +A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cf + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19e +A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cf + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833e +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833e +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067c +A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833e + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067c +A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833e + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfa +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067d + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfa +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067d + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f6 +A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfb + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f6 +A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfb + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833ee +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7 + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833ee +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7 + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067de +A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833ef + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067de +A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833ef + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbe +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067df + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbe +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067df + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7e +A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7e +A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf + +LShift1 = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833efe +A = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7f + +LShift1 = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833efe +A = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7f + +LShift1 = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067dfc +A = 13116120bca5df64e13f31425450c7a577ad7fe0dbed833efe + +LShift1 = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067dfc +A = -13116120bca5df64e13f31425450c7a577ad7fe0dbed833efe + +LShift1 = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf8 +A = 2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067dfc + +LShift1 = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf8 +A = -2622c241794bbec9c27e6284a8a18f4aef5affc1b7db067dfc + +LShift1 = 988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7f0 +A = 4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf8 + +LShift1 = -988b0905e52efb2709f98a12a2863d2bbd6bff06df6c19f7f0 +A = -4c458482f2977d9384fcc50951431e95deb5ff836fb60cfbf8 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e0000000000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c0000000000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c8380000000000000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b41386190700000000000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e00000000000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c00000000000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c83800000000000000000000000 + +LShift1 = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000000 +A = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000000 + +LShift1 = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000000 +A = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b413861907000000000000000000000000 + +LShift1 = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000000 +A = 1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000000 + +LShift1 = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000000 +A = -1569d01c96acaadb32211d67966be2fa35d07b46768270c320e000000000000000000000000 + +LShift1 = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000000 +A = 2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000000 + +LShift1 = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000000 +A = -2ad3a0392d5955b664423acf2cd7c5f46ba0f68ced04e18641c000000000000000000000000 + +LShift1 = ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000000 +A = 55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000000 + +LShift1 = -ab4e80e4b56556d99108eb3cb35f17d1ae83da33b4138619070000000000000000000000000 +A = -55a740725ab2ab6cc884759e59af8be8d741ed19da09c30c838000000000000000000000000 + + +# LShift tests +# +# These test vectors satisfy A * 2^N = LShift. + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 1 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 2 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 3 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 4 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 5 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 6 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 7 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 8 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 9 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = a + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = b + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = c + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = d + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = e + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = f + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 10 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 11 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 12 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 13 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 14 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 15 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 16 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 17 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 18 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 19 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 1a + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 1b + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 1c + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 1d + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 1e + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 1f + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 20 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 21 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 22 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 23 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 24 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 25 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 26 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 27 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 28 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 29 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 2a + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 2b + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 2c + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 2d + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 2e + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 2f + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 30 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 31 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 32 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 33 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 34 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 35 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 36 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 37 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 38 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 39 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 3a + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 3b + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 3c + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 3d + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 3e + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 3f + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 40 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 41 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 42 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 43 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 44 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 45 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 46 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 47 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 48 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 49 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 4a + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 4b + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 4c + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 4d + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 4e + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 4f + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 50 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 51 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 52 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 53 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 54 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 55 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 56 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 57 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 58 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e00000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 59 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c00000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 5a + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b27800000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 5b + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f000000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 5c + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e000000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 5d + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c000000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 5e + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b278000000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 5f + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0000000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 60 + +LShift = 18c9e860855d594dcb06d00b7d1933608ba906d85fa2d92c9e0000000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 61 + +LShift = 3193d0c10abab29b960da016fa3266c117520db0bf45b2593c0000000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 62 + +LShift = 6327a182157565372c1b402df464cd822ea41b617e8b64b2780000000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 63 + +LShift = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f00000000000000000000000000 +A = c64f43042aeaca6e5836805be8c99b045d4836c2fd16c964f0 +N = 64 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 1 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 2 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 3 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 4 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 5 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 6 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 7 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 8 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 9 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = a + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = b + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = c + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = d + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = e + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = f + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 10 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 11 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 12 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 13 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 14 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 15 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 16 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 17 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 18 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 19 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 1a + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 1b + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 1c + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 1d + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 1e + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 1f + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 20 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 21 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 22 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 23 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 24 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 25 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 26 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 27 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 28 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 29 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 2a + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 2b + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 2c + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 2d + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 2e + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 2f + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 30 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 31 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 32 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 33 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 34 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 35 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 36 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 37 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 38 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 39 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 3a + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 3b + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 3c + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 3d + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 3e + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 3f + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 40 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 41 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 42 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 43 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 44 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 45 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 46 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 47 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 48 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 49 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 4a + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 4b + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 4c + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 4d + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 4e + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 4f + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 50 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 51 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 52 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 53 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 54 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 55 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 56 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 57 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 58 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c0000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 59 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b2380000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 5a + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f300551844764700000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 5b + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e00000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 5c + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c00000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 5d + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b23800000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 5e + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f3005518447647000000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 5f + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e000000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 60 + +LShift = 1d1cf8b5ccbae667bd05797fbaf9d4c1ff623cc01546111d91c000000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 61 + +LShift = 3a39f16b9975cccf7a0af2ff75f3a983fec479802a8c223b238000000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 62 + +LShift = 7473e2d732eb999ef415e5feebe75307fd88f30055184476470000000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 63 + +LShift = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e0000000000000000000000000 +A = e8e7c5ae65d7333de82bcbfdd7cea60ffb11e600aa3088ec8e +N = 64 + + +# RShift tests +# +# These test vectors satisfy A / 2^N = RShift, rounding towards zero. + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b36380 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 1 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9b1c0 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 2 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ecd8e0 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 3 + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c70 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 4 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b3638 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 5 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9b1c +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 6 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ecd8e +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 7 + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c7 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 8 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b363 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 9 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9b1 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = a + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ecd8 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = b + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = c + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b36 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = d + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9b +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = e + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ecd +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = f + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 10 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b3 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 11 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd9 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 12 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365ec +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 13 + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f6 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 14 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97b +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 15 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cbd +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 16 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365e +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 17 + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 18 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd97 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 19 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66cb +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 1a + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b365 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 1b + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 1c + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd9 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 1d + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66c +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 1e + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b36 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 1f + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 20 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596cd +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 21 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb66 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 22 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b3 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 23 + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 24 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596c +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 25 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb6 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 26 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565b +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 27 + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2d +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 28 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d596 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 29 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806acb +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 2a + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403565 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 2b + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab2 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 2c + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d59 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 2d + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806ac +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 2e + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa5740356 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 2f + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01ab +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 30 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d5 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 31 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806a +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 32 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa574035 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 33 + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01a +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 34 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00d +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 35 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae806 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 36 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57403 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 37 + +RShift = d9ce8dff4f2f39c216ea39a461080552ba01 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 38 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d00 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 39 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae80 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 3a + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa5740 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 3b + +RShift = d9ce8dff4f2f39c216ea39a461080552ba0 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 3c + +RShift = 6ce746ffa7979ce10b751cd2308402a95d0 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 3d + +RShift = 3673a37fd3cbce7085ba8e6918420154ae8 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 3e + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa574 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 3f + +RShift = d9ce8dff4f2f39c216ea39a461080552ba +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 40 + +RShift = 6ce746ffa7979ce10b751cd2308402a95d +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 41 + +RShift = 3673a37fd3cbce7085ba8e6918420154ae +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 42 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa57 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 43 + +RShift = d9ce8dff4f2f39c216ea39a461080552b +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 44 + +RShift = 6ce746ffa7979ce10b751cd2308402a95 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 45 + +RShift = 3673a37fd3cbce7085ba8e6918420154a +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 46 + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa5 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 47 + +RShift = d9ce8dff4f2f39c216ea39a461080552 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 48 + +RShift = 6ce746ffa7979ce10b751cd2308402a9 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 49 + +RShift = 3673a37fd3cbce7085ba8e6918420154 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 4a + +RShift = 1b39d1bfe9e5e73842dd47348c2100aa +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 4b + +RShift = d9ce8dff4f2f39c216ea39a46108055 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 4c + +RShift = 6ce746ffa7979ce10b751cd2308402a +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 4d + +RShift = 3673a37fd3cbce7085ba8e691842015 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 4e + +RShift = 1b39d1bfe9e5e73842dd47348c2100a +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 4f + +RShift = d9ce8dff4f2f39c216ea39a4610805 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 50 + +RShift = 6ce746ffa7979ce10b751cd2308402 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 51 + +RShift = 3673a37fd3cbce7085ba8e69184201 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 52 + +RShift = 1b39d1bfe9e5e73842dd47348c2100 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 53 + +RShift = d9ce8dff4f2f39c216ea39a461080 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 54 + +RShift = 6ce746ffa7979ce10b751cd230840 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 55 + +RShift = 3673a37fd3cbce7085ba8e6918420 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 56 + +RShift = 1b39d1bfe9e5e73842dd47348c210 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 57 + +RShift = d9ce8dff4f2f39c216ea39a46108 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 58 + +RShift = 6ce746ffa7979ce10b751cd23084 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 59 + +RShift = 3673a37fd3cbce7085ba8e691842 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 5a + +RShift = 1b39d1bfe9e5e73842dd47348c21 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 5b + +RShift = d9ce8dff4f2f39c216ea39a4610 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 5c + +RShift = 6ce746ffa7979ce10b751cd2308 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 5d + +RShift = 3673a37fd3cbce7085ba8e69184 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 5e + +RShift = 1b39d1bfe9e5e73842dd47348c2 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 5f + +RShift = d9ce8dff4f2f39c216ea39a461 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 60 + +RShift = 6ce746ffa7979ce10b751cd230 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 61 + +RShift = 3673a37fd3cbce7085ba8e6918 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 62 + +RShift = 1b39d1bfe9e5e73842dd47348c +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 63 + +RShift = d9ce8dff4f2f39c216ea39a46 +A = d9ce8dff4f2f39c216ea39a461080552ba01ab2d9b2f66c701 +N = 64 diff --git a/third_party/boringssl/src/crypto/fipsmodule/bn/test/sum_tests.txt b/third_party/boringssl/src/crypto/fipsmodule/bn/test/sum_tests.txt new file mode 100644 index 000000000000..3aba891485d8 --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/bn/test/sum_tests.txt @@ -0,0 +1,2619 @@ +# Sum tests. +# +# These test vectors satisfy A + B = Sum. + +Sum = 0 +A = 0 +B = 0 + +Sum = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d +A = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d +B = 0 + +Sum = -c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d +A = -c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d +B = 0 + +Sum = 0 +A = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d +B = -c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d + +Sum = c590e57ee64fced3ca84d4bb013bba7d633e68b2ff4e27bf1db43f386dbfcce501f112b7fff6fb9436a576ccfccce12867becf02b91961453ea41f414764407d +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 23f85668bf4d0fa273d8c7f63c5fee57811062a674111e295a73a58e08dd0fd58eda1f473960559d5b96d1862164e96efded31f756df3f57c + +Sum = c590e57ee64fceccd54e0bdc52476a756d32e794922dca0acc780d2c6af8852351102b40dfb97009f95e019a5bf38e5d127aa78bc34425edf96f763084a8b09f +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -4b5b16252ba2355e0b87f01baa721783c403607a4c1b5652c09a68e96926c8e314fa580bf0ad3f8f59bd70f14df86a4676661899b54c79a62 + +Sum = -c590e57ee64fcec882fef3ffd015a3fd9024d8f5f6d53eb537d6abdb0ff5e76a8fb08d5feed113fc9e74745d957adf32704a08339ba42efd5746c5d478e3f57b +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 908007a2f3c551c58958d1059427a0391d4d768f61cb802e4cb062c778354ea3eaa8f0dfbd14ca8203e07ae6d07269b58088a39f7608c5586 + +Sum = -c590e57ee64fceeb242f8a0893eaa0d2ccc3dc57ec40fe917cfde66618fba678ce0c8fffc566d4e8c7944d6443def8014fe8ee410a1b8dfd06cb0b436619e0dd +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1999301bd9877fe07ca711f308b2f1bc4a704fd194ec4dbc297355d6285340d6ad7e90cb0add1770aea19737a06750c3a7a6fa0b778ca995dc + +Sum = c590e57ee64fcef321395bba088ca0a867e1e85a1ea77478f8783e6a6cf8f3e582bff83cb2d7d9fd549fcbb40dea22ac140351007030059500bdca81413600e9 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 219639ed8afc21e052422fff0ae5583231ebca2999404b099628093e6540b1dbc20b9c495aa7229b5965b19a5fcd653b3fa0eccab567c5b5e8 + +Sum = c590e57ee64fce834a00cc6282cb0eef49eac7a8d5b51988cb49253ed85ae261c76f2327a691fc63eceab02614807048b2816cdb9b89ca66a17b6ed1abdab580 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -4e40fea1cc899fb166dbc721a6639a28be4164ef92545307ed934796afcb9401d75c18d23352471709fbd049c50740ffeebe5590fa2d959581 + +Sum = -c590e57ee64fce1a17609c61ce02f1020c6eb6e241e3fdd01546ce7247725589de32db95f36718d410f9ce9a94fecc8fb205e876fde75ce83f4d01e1bd5d818d +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = b7739ed1cd3e67cf541943326cf76b4476f767465ee53b94c57c83de417ebee5673809b3bed1c8bac2fc4bce29a4e36d6d2083fdea1c12c974 + +Sum = -c590e57ee64fd03e2d08c3d8e5110d08e3d36557d82e0e49b408337a8c9d4298802ae5f0145a9587531a70d2f8af932b8262245428b5c549817d333f2dfaeeec +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -16ca20955a9d8a64cb2be217c089edecc02a75a1ea95fef584925742c18a234974c0a16ee7991e80bd8d4106db385eafaf421ac3373548aa3eb + +Sum = c590e57ee64fd1bcac71b5b055e5934ba15dd7f56370063369c36e57a6b753269e085d0f4d38bfb711d5579dd1d89d07f266e727b232a497d5b0d9bfbc02d8a5 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 2eb21724781497ad2f57babeea62a20c3ec5d1559867a0968d74351a337db12c17bc8d1d5446b1115b5441530870f67da4275dfd9f3e2928da4 + +Sum = c590e57ee64fc7860b0be6ce861bc2f099db7fb623912b7b0729c019a8183c669c73efe02b195483a4cd2c78244cd59678ac4d62f6887fe686a3eed37ed460ff +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -74b7ff38760864efd658bd6699915be16cc058454b78495ade8be42c9f7470ca9b7a43655e1427ab1bc35a5693dac424a6ed92d10f85a9bea02 + +Sum = -c590e57ee64fc3126776e79d9fca06233bd2ef5570a65e4521183627bdbdbc555e9118508cf63f519bc0caedbffd5b1a913ee8c3603804820a9ce54b1207bdef +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = bbf238886916ca0ba32e9def9f9c8a8e401eb95dea96ef02df9fc25a186e52fbee9ad42b76ba6ca2c381d12cddd4292c5d355341a80c7688d12 + +Sum = -c590e57ee64fe6dfd728dfbe45aee52380b5a00cf1e05e9f09ac582e2714bb589caf2ad038111c5b1b5573a45706ab1f6fd5d5a1ee7ef4a9bf186dca8a9ede12 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -180e4c29718f394424cd5b03b6bdb8911c57fcfe435cfa66d10941f870f8c5eb1e1fd251f14af03f23ccc1841f014bb42a545f476dfeb12e9311 + +Sum = c590e57ee65004b3e18a5820de4a6d25e7c3d310003e0b8716bbfd51d5f0f3e87fdf8e00599d713397255281e66ef419a9d9bb228e8f052764f5f861ccca656f +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 35e2568ae9f1d1dfaccfc211e9c0c6eec9400a0de880a94309992528d428e77772f84e21d0287fa76cc6fb880481ebc43ad20524f895f35a1a6e + +Sum = c590e57ee64f84896a5f11f575d34b6001f27d4b4d6e7cd9485260629f8f7f1c6ca6f6115b98d776774295dde4d59cdbbceccad097a0a054b501bfb47d81e85c +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -4a4820a05c39969774f623bf6c03ebe0c56dc45bb46e8d1e6b32ee0fc3c6168d26c4d1c0ec7b81f1ea76f164ebd00b2a2a00aacf40175bee62a5 + +Sum = -c590e57ee64edf1b2b57b4cbb92d778ea6b9d9878a0374d4ea81691b09811b105bb6dbf23a57d89264f0e6c83f8d00fe00681644feed56e15fc81103ab9b7dd6 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = efb65fa7b963533d48c77ef80fc7af4bcd72222cabb6232ccf3efeffdde537ce25a8e4129b91273a8654ade9a05ba3dd73740008eec82dd4cd2b + +Sum = -c590e57ee650e25da7b60146e014f472bfff9809aa8f519db7943f69d9ad09ee75a3427c6127cce7bd27f224b9dec03111fb066956b4903f9f9740cce1aa4ba7 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1138c1cb69317d3aa341c9a4daeba71400f56aae62a98acff1f9f1aec88a4ef01ceac74246fcb531738de63a94fc8b3e9c5ea3fc64101083a00a6 + +Sum = c590e57ee653af8752322840ed720f628f9674c81073b58372e49ef26d4a2a9d46a0391bc170336614b27849de98709a4b321da4ddfb978e9f10df29154edb9f +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 3e0b5c732ba11e1074f0c69e48b78d724733c66368a21409c404debe97f444f4a352acbaef5f077d0e9479ce067043b30cd393f3fdf5d3bde909e + +Sum = c590e57ee64bc13634cbd149aae35ee47bde6ea3663f74ff300cfdb2d845f902f017586c6d4f83f08c3b4f0c035055d13fc9d340b7b9ed164432aed44e8f4d7c +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -40d9b56339ce561876171a9d37aabd30fcd47dca1171e5467f14c6a9f616b04d67a4abcc8334d637731816e87e35feb10dd3f1b9e50f78ae0fd85 + +Sum = -c590e57ee6477eb692705f8da1357e71591336907a5e0a6e39715088d53b2610882765357563fd101bcf05ca545a0c718f52879fdf4f80cb9a12cf108eca60ed +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 8501af88f0ea16b3541e4cc9eb2bebef137d8d33cc4485772c43ed28f54a1fcc2012b2d347c8f126d7ae11eff2f00c37b4989c5be30bb4aa5ea14 + +Sum = -c590e57ee669b662e37f5abf13d00d2f0c1c9a8b99ec546361aad255f375bc2742a3487c351c5ba00efef09c77331577460a47c57125c620b643e9eaf36a146b +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -19e791587fec9007654cd8e66ab13c609d121c54fcbd84c6c7d1d7e7ec8ea4c2f65d64c5fb6e43106b8e2497b89124ce5afbcb5672ea1f19f9c96a + +Sum = c590e57ee681dcbf1554f22c0b1ffead917dd414299cb37ce6967ffec9c333931e70358729843c8130ac95aba47fa1fa5da74000eff25eecae176f093a4effca +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 320ded8a5583fcfeb53e576bcbeac4f04d7135d9e86b2d9d154943c3b97bafb75e3e45e7a913523db81aa7af5589604d2794974e466f3d60deb4c9 + +Sum = c590e57ee5e505ae4a2e1f25a1ae9b7b4d17dd2cccc09f2416d964e55af6d0d31fe259c160f87646a72e6732d5110256b3b35425225d622b81418435c9dd8cc4 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -6ac92340d14f096abc24dad89a0c226c8ea322f5d4afebd1b7197c3ad46016112d87f4a1d51b2691b684fbfa9e627b806d6829de8f7b960f92be3d + +Sum = -c590e57ee58c3ef1582bf7a516e36f92b60f5a587e2c8cb071d1d52ff215854e52de1519fd5204fa52292dfdc397d8d76b78005941358b63a3e6ca41b0eb09b7 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = c38fe032d37689f58750c36fa28ef6bb22b5969adc3fa13a98650107d8a4bd74d3f940f6da545ba32fae7b42d9b64761953ef1bbea358a2885414a + +Sum = -c590e57ee80262967da4038a143f8ff2e78646108f25ff7183444ba507d76f9b05a34c8310e682c05495d0863ceff264964dbfa7c064adf6d26d2dca6e22ab13 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1b293c4f2a4955b07d4cf9cc1d45cc155d6bd2a769636d3db29854baaec92ab9ec084850b924e2cd6286b11e7fc09071d99e3a1729c2dfe94b26012 + +Sum = c590e57ee85427f08e8c89ffebfcc05c73370ad4cb77696c2b2f3878e6f6df341d4d931b5097aba49f14ac0312e7da1c843d6fd08119822e75e6e7a8c7bcb7b0 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 204591f038d1bd0df9200064d852185922827251e8123a7ba48f4e4c296d943de71ad69561129a9ac2052c9d5ebb92fde4eb7d91615e7dcee4c6caf + +Sum = c590e57ee051ca1a363c47a4cc016c3de7f7e17985009b545528289e9fbc9086f4b42a73826eca0c278b0d1b4ef6d74b9a0bfcb7855d40fdb201fbad1074b927 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -5fe04b754c3268a406954183dba07d5b44ea6f2b785ec328cf159c866028f63efb7342f2178753e17d0b0071445b9e91d6d8957adcf041ec8fb91da + +Sum = -c590e57edcd6e9ef06fe33f3817ba3d0c50c8122b77615c4b8fa50c5514f113d7ba53ce057d487bcbc373c4384d07b29a527b7ef785ca609474879b42a9a4c3a +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 978e4e284013a3b8aef1c8560a5682c81d92c8253b3c40bdb5ed911df117cf71a51767e8ccc4615e1f70c290929feb12a6e244c18888617aed5fec7 + +Sum = -c590e57f0436bdceb586a093522eb1630e0fc08f8790957aba1875a42b7676f9ca936e8f6f3478d6ef5cd590bf6ded0700440dcd769496822af8015f0a6ba2b6 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1de6eefd2a87326445c3f10ce85dd7404e415333ad6a60d2fec88caa6fdcb4b7fd0e7a9ba659533758a665b451f2572cd3c9cc2ccb27019330fb57b5 + +Sum = c590e57f1df3f004d5e49f49fa28603b26659f1fd35e0d8d7a2753591dbc12c51e6b588427dbe3faba2f0c1f2f0a2aea9ba1fcb2fe71c6ff40555058d23c8661 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 37a421334ae5311aedbd9fe500b3b5d09a0ecb466d793e87f10e2875c3b49eacb5b5e5bf712b89c5c842a397ed5046125ba6fca9e084508cf8cc3b60 + +Sum = c590e57e9a4abf4572fa7c4c9f73e9d3fd1227646fd6d15b51924bd7a5d417b01fe6b4273eaa6ece387422b81c8116f29702d7d66d2f6e8c3454807b3b7d413c +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -4c050f8c1804f1e26cf6d682289fc1eac97870ebbb1bc8f986d9d29f3ad005b0337b8f6d108f5fa14a467060174edeca359b5bc92b7c7f509df309c5 + +Sum = -c590e57e64216c306f17017ac9dd7085113e16c83168664dbb77c7ad3ddfc79b09f9ea0c474a0b497ca15e7fb258eed9666fd009f691a3b2d691c2c6b22ba3b3 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 822e62a11be86cb4428d4fd11473d28707e6dbf951364d23eece22b450bccfcb2adbf2f1cc6223d9b46e987947e1e696ac3926a2893f3d052744a74e + +Sum = -c590e5806ab4d09773c4f94a4aac09f6ed7609eec1d0bafecb09e30f032f706e9adadc191ff9e6d7dccc821f7a8666a590e521749d24912c5a5ffeff246f7c85 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1846501c5e8c58b1b3e4149a0c7c4209f888178b7be5bce3dd681861f40242241add3e89c93c8ffc613bedf52e2936ad3fa59c6d6fa8eff334aff3184 + +Sum = c590e58248cbf5dd61ec57994fc862ab479dc6cda51cc17356c45cef66bbfdd12f5cc421940a561581c123fb17483beb7a1cce2596fa9ca76e722a6f4621eae9 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 3627c270bd6ece96a435da25521ebdd7e6bcd7f2c4a16481e3a0e1381d4a60a4a21e457da38bda1a1b080b498cbcb1784f42fd2520ea12aa36cb19fe8 + +Sum = c590e5771a85bdb1f26c0386ce837bec4b0af5656496efdf4f134d875f066dd6d477ca8f87ffb275da07da4dd1bed4232849a526836b47f2d69f2d53b6b3e2f1 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -7cbca111f98936aa83de74469daa6f3e9d4b85267bd9ac749cda77c78863eef47ea264bc56efba80b9508b32f8608117a1f5f82628931d27822bc6810 + +Sum = -c590e571c76afad23439f904e8a80fc28dcabb6cb732e361ed3eef471be6fa755e3fe746edbfe448c1f289ffed7dfc01fe9066d780564f57f93abbca9b9a995a +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = d1ee4d3ff56c5752a23c2b09397e72de2821c5ee51f6f258a10c6efd9fc76d290846619f28710f85979498b50afc14fc922747afd669644013dd5b1a7 + +Sum = -c590e598cd5d4a59ff5d6c97c6370fb517f1d492a7776f90063b0ddd6702e37c60fc78bb12857911cea37b7263584d7dc815676de6b8880200acea154b59b08b +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -19e70d7b88745dfe68b9cc4f5ef23feb436e282d48f98cf90c3a54f92d0645bee3a05f7ad6859ff918fc90c62b19c3b0cd43edbdaca0dbea4971e9658a + +Sum = c590e5b5829e6fceb77830fbe999a98127b50302fd0f6a86ea4aea27b846747a07e6fcf5457676e6446137d6bdd8ff4fb7ca747b650b066d65d7dc1e172488e7 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 369c4ea0fd2c78c2ccdd2ee92b020319b3c3c0283fdd9cd5568b988a2aad30431dd35078aafb5db57d571177fd0978bddac2403c180606dc523db43de6 + +Sum = c590e52a3ab5d5c458634254e2f672a322000750741e969d2f6cd12d172480ad1455300e3a0575b068b85d50b58f9737be13073188d0f03b71494bd0fd2fea16 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -54ab99f90d329c2bda29744db303b1e1fec530aba9dd4143a4158969a2466189c93820888ae04b2508b137f01af03eaf6f19f9da19ee87b3fadc4060eb + +Sum = -c590e4880579ef7241bde94e8c7847badc705f53828751f9975f0e66371d2ddff8740b143f32e88be8e686e2bf5a3ce03d864d7699a813b1777b9239af242c7d +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = f6e0d5df5f494184e07ff2789b494189fbb6c7f04d754f066af590bc6f6242aec332f315af601cfb76a76d4a7270cb692a0922b6a3e8556d922a4c1e84 + +Sum = -c590e6dbe54098694155509e38c61d503ab7e5237d2cdfc2b87fb57e3a8420fe37fe50a0dad4f0eae3d38fad6198e4ecaeae183a12078f53d09ac8099c715242 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -15cfef0c997b655e26f2c5b5cfa1505fbd443dd9d7babd1a0ad0dd636aedd4796c968aef2af9ad00d53fad15d9a005c61996f3cc4fe70c9c83dc3010741 + +Sum = c590e906254d013be2021ad591e76e26706a6815b8c484b6528fec65416e1066957002713e1183f1005f565983aad7aa031e549e6fc57094ca3e4383e7fdbc15 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 3873efd326a5702aca6857cadd04ab87ec67f75426f45e1d79414c026173ab94899cbeb85b5b75bd4001ce3505754cc9dfdccfaa63f6a6d43b80e8d7114 + +Sum = c590e0e0079190d7afd80acd6326fe93cc00903318608df31ee4493d11271dac7291bd142cca0e5dd7dda59dabd460a69b7855d9c2acb5f062de76665e07cbd7 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -49edebe3df9db276361a943c1c259b1591c20eeb453edc9cb941b86cca2e824fcc3455befdd7125dcbbbaf326ac12d960c6e01e1464fcf289657b687f2a + +Sum = -c590d9ae456d66c1b132d844eb223867ba4560b36f53c42a616cf8cc657e6d252f813847fb9fc50127227684e5c0f5cd890eceb341d21e788e42f843e9b64080 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = bd0a0e2680fd9cc95ea214887ee6b6c889bc9fb7e1cab411c04c72f7d2a2b35818f7686393a21e10bd4810691852542e7ed60f8abdcd18e0787efba0a81 + +Sum = -c5910498291472fe1d0047d5bdd9e46deb3f26000e943fce8d83d700d9ae233ab3a28849bbb346803da142db6a471e9f79cd49571f40dbc46f7b727a4bb3016a +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1f1942c4a42c9200d9a6b16f2417c58d3cb0d544fd8780d5c22fad0038eb58ebce72498d4844f49dc082037f974ccb7b92b67c76116f0faa72ae7242b669 + +Sum = c59112d841ea109440e78563d9eefef201c81e86ae967083f8b7db80d1eaf58551d30519ca6dd79164fe69a29cf1ba22446cb2999f73292241005bf17b37528e +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 2d595b9a41c2b5e81734cd843e9bdc16353775472e3cec09c6afa53d0b35f71c4b425847d9561bfae749362a32cf961afbf8fca85ecce12f5c25a1c7078d + +Sum = c590671f890ca06c74ac6d2c4d75aabeaaa55312e85a5e1ea9cef0e08e154e2b090eaba869e9f6e4a47ae10b9c1eb0f6ae4fb3ef12b3121d96066c6c8e592b6e +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -7e5f5d432e6516530102bef515977b0c963c50f4e42862df23f09e989c2451a80e2f083c0756a488a14dcaa8d65c000202b19017b837c9ca935f4b171f93 + +Sum = -c58ff0ae92ab03072154949a7143d45278ef77a0ba71a785d5a370e0d30a9b4b4f7e96a395d13e6afeebbd717365d471ee56ba11c472a63c0532558104bedfc5 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = f4d053a4cbca69aad9949b26ec03acc271ae7edd9ac1370aa3f059a34f040b382333dc54bfd04a17c4e7f361b2e0bffafc8ede5824195a9eaa4ad4b16b3c + +Sum = -c5927a5fcc3b31abeca3998ad99c07626112288a6ad95b24929fed581040757fdce73881c48b02daf09986ea436a3f5ceb6833c31fa2e1691567601a26c7a6c9 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -194e0e5eb62da61a42b5bcd31470c3b603f3b318a18dd85f1d886e3928b3082307eaa5265049fa7960490dca2b80a3d167d227cd81713b596604e4d575bc8 + +Sum = c59395e94d495451e3fea153f3e4361a088004a7d5426c1b94aec44108ad6f5cecc3a80dda0cea9f51b882747258137e171bf021b4fc59f4dcf0106d4ba952fa +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 2b06a66f9858058ff3324e77975c3e2ce1b589bf329d48800af6fdbff850d920cee3667e6ec6408b5001b0b908c2b68ca398112318f9f7d1f10a1723907f9 + +Sum = c58bdb26c0fd6766f3affea389cbe7db25c06d5d56356d3d945347775bddf479ffc9e279e7d1ee88eddb239906749815ae4502fbbc6fe978a001ccdafd89cb10 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -50a582552676a974f6f8b829ed87afff17bf1e319d509785acd59d0cff5d55aecd75d8a540fb25b285ec06052ef3d000cb3a4e65ae0dcbfcf32f0dbe67ff1 + +Sum = -c581afe9b7ae86d4b7053f19649beea6cb935799a553f035f9b9a7fba6d5559e4ecdcd1637c73c8052c6cc52ee1c28d1e5aed9db7261b7356afd6e3dbc213684 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = f35952ea147fcd3fa2f15a7ced1af5a1e91b593fb521112f46cd585d894b10be8ecc13a5ec1baf63cb60678ab5e80c8a2dcc53069131ff4d3918e1d4f147d + +Sum = -c5a19f36a65a6a8d52a53a63f99a1b957d6e376b7010ad14695d78d67b0d7c86881006188bd27bbf205c8c9c200dc8f5c08ab6b97dcd512f6cb93ed9a361ff9f +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -10b9b7c00a9bbbc7a5cc34ed2f5b3f57bc4e1c36c16acd5caf64054e5f92372d594c4119ac7d83d7590a42b94641a312390018db0286da0ce83f0dc9f1b49e + +Sum = c5cd0e5da24b67a894402b0eee5dd586ab70e5beb0693e263a54995193663a9b770141379c1f097a49d1a889bbf0c348c6f40ed50bd7bdc11a7869c6106c6d80 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 3c28debbfb98d70940bcdfe1f3153085befc6f7719fbdf2da6848066b8504c1c4a876029f90b3f00ce263055293bf618a25834690cf36bbaa769fa36fc227f + +Sum = c54e2c560a00226701b76cf03d5de27a8c69b38a6b85dad9f7c903d2e87f9a7d247522e72491460f6a529e5ca2aaaf690cb238b873ffb49d9fb0ecacfedd4e90 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -42b928dc4fac6a8948013ecf0cdddb994835c4cdc9676d14e510fe442e4fd2364196f04d94b82bdeb0e3fcc41cd7e9a19f7de82ecb15b7c020131eda92fc71 + +Sum = -c4bfb037f6e6e861efb090ee610c33e7568790259f747dc6e55d442aadd68c0cc93c7617f83980e8813c0fb7dd28c8aaca6ad8fdde5d2bfec9ae096faa9ef54e +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = d13546ef68e66f9b4edd40ab5e8c6ecf2a592999dac4802750d0a67ed75e42917a43bf79ec7d52c7c772a1899ebea7e3e6dda2c46d9e569622f65c2ed155b3 + +Sum = -c6aa2af8c9ae8be4aada83f66b7f31a8bce5e92c67d8938424a1405903e5502bffc4ee1e333da4bcfd0cb383b19a566372f877a8344b66dbceabc9786dd0e4f2 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1194579e35ebd131fdb15c75f1471529733ffdd2e89513d17f32b87d73765dca50e3446c117a681b409312a4ad2cf10c4a6c10791809c866edac9ac946099f1 + +Sum = c8aff66c9bdaa49eafac0f65d3ddff223b7a5471f7400431ca3a54615d600fc4a163f8fb648bddb5fd6915db1991611805040e0f86f152c8fd3333ef70d632e4 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 31f10edb58ad5cd24aca136c7733ecc15c86b22bdf0c1eabd8c3f9030b2257546ad3f23f265df7ab4659381b2c9d9c556b2576ee42688739d6234239765e7e3 + +Sum = be1b6eb768e2cef388eebe31f9b21e51b38b351cc8175eba06d49eef04c2936f32167174dcb82297fd4180d0afb5da2c455d158c7a5bf01bdef8c295a4f20390 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -77576c77d6cffde0210affd12b8a2047226b4327137e38d05d975e227eb56e028a04862956ddba34bc20188b711ad2668f4a114286eda3980d83d36347e4771 + +Sum = -ba32fca1d5cc5f31ecaf5407f376d3aef9f4abc04fd4c6893721d3e50e9141abf356eb2ff6f7a4f9b42983148670d2918e1dff7aa7ae33a6e9dadcb708b4f9dc +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = b5de8dd10836f9f9e501a2718f3eca72bbd3d8ee97a7bbdd58c40ec1e1ca8a3675fcea77b2e594194d9ff44e056b4c12033b725fb1c96ae75f62314d0bb5125 + +Sum = -e388afbf17c495f86aa7298a45f848eb57e5baaee42b1f7de8c2311bfbb8f74549712c05fd3bd11ab8874fb55abb22a37ba3512e733ecd5c472842e8e6f7b179 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1df7ca403174c726dfa7bb5b398d88953233d15faadbdd36dc141c4acf0b0cf5eeba722e8b15d2df6f83cd5bf3f39b50cd519a8dd0740306e757431d0d876678 + +Sum = e891babe65ee02c02e7e876c0df3dc3bb37491008f3642ca7affe2d623fa82a6d5a9e5400944a374ab70fbb8f952dad0c8b27c77475b0dfec7b0694051dcd1f4 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 2300d53f7f9e33eea37f193d01891be58dc2a7b155e700836e51ce04f74c98577af32b68971ea539626d795f928b537e1a60c5d6a49043a967df6974786c86f3 + +Sum = 4dfc2f63d60f83fb1d397d2406b02a3b25c1a57c09c2fe02c76696b7c956e44facdef11470074d8fd8220c7bf8e647ba873fe9c3f9e77d6aae7b5fb64f1cf566 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -7794b61b10404ad66dc5f10b05ba961afff043d32f8c444445477e19635705ffadd7c8c3021eb0ab70e175dd6de13f982711ccdca8e34ceab155a0158a53559b + +Sum = -3c19bedc60e7d7dc3daaa36795e453d810c952dd5185fcdc857e2be806e520068dbedb91c4a1131b9eb6dcdfd500045209514e3e9f6e6df41d2ec67fba20e10a +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 897726a28567f6f54d54cac776866c7e14e89671e7c9456a872fe8e925c8ca48ccf7de45ad84eb1faa4ca57991c78300a5006862035c5c6142a2394c1f4f69f7 + +Sum = -28c2bddfeffbdbdb1ec6f06aa310d1bb6f0c4b88d0106a1b381ae6fe8f65c18bd9895fcba6931ecf06d9dab6c7a3ac9e00361bf165f16bd16af25230d040cd842 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1c69af880196deee0616f987b24a25b60cb12cf3dc7b75f6c75005b17c9ae2e6e3ddf42e2f70beeb5249a29131373428d55100875bc4bf2c14f5423412a9c8d41 + +Sum = 372ea360832e30b16a3c30a2157c8bddc4408ce0428169deb09bf68113e4b8482d887de1a7cfc80272e597c3f3f104e6825a1fd2a68b41cbc307caaae17d453e6 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 2ad5950894c933c4518c39bf24b5dfd861e56e4b4eec75ba3fd115340119d9a337dd124430ad681ebe555f9e5d848c71577504689c5e95266d0abaae23e6408e5 + +Sum = -5b29f4991cad86845a50949f25ad6cd7c883d71ceec9795cc528f58a4a4aef9dc139e8e87cb82071e112b2d256181eaad0a98fa36b25b67dc673608939b48e08a +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -678302f10b12837173008b82167418dd2adef5b1e25e6d8135f3d6d75d15ce42b6e55485f3da805595a2eaf7ec84971ffb8eab0d755263231c707085f74b92b8b + +Sum = 98b37ecc0b42a15f52c8fc8bc2aba294031bc2dfa37dcba0fdf1f5f5da00b8b3daece033b47bf254e8b5e201bae24995034673800d53213f6ee0796be1ca93845 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = a50c8d23f9a79e4c6b78f36eb3724e996576e1749712bfc56ebcd742eccb9758d0984bd12b9e52389d461a27514ec20a2e2b8eea177fcde4c4dd89689f6198346 + +Sum = -1c15985f3ee941d7ab6bedad88143cf497681424e7456fe30eafbdedfcdf1e927db124c775b87f36cefff17a35972ac40d498c4be818883bfc206f44c5e5eec23b +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1b500779c002f208d9e0ee3f5907d2344142623b980c20a0c7a30fd92bb270a82e566e0d9e46593893b6edf7dc30633cba9b3a954775bd71a6c09e44fa0c7e773a + +Sum = 34ab71257e63b234258027e26bd35dfa5e07f67385b6772c5ed445438478bef5a835e87c9de413e23839849a71f5af99a67427098b682bfb6becb66d20eaecb2e7 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 33e5e03fff7d626553f528743cc6f33a07e2448a367d27ea17c7972eb34c110b58db31c2c671ede3fcf08118188ee81253c5d552eac56131168ce56d55117c67e6 + +Sum = -44f9508e3430f93d4e2c8be1b856f46c01d6940e1bfda8515c747a1a95239547322999e500e718ec98ed211ae04ffc76b0e6f2364ce9d913ffb80397f24ee8d64e +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -45bee173b317490c1fb78b4fe7635f2c57fc45f76b36f793a381282f665043318184509ed8593eead436249d39b6c3fe039543eced8ca3de5517d497be2859214f + +Sum = bea59d2cb0bf556876d4f8a248339af69644a12d3dc1d9a3d83929929b8db5aa26289bd06e2488a96820ea8f59168cc82f19b5dfaab20d245495d6e24bfb260a3a +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = bf6b2e122fa5a537485ff810774005b6ec6a53168cfb28e61f45d7a76cba63947583528a4596aea7a369ee11b27d544f81c807964b54d7eea9f5a7e217d496553b + +Sum = -166abef6a1682bef78d4c5905a833b81a03c0bf0f3735973bf7f02181a8ce5c7f125f41fcbb10c7f5905e492fc3f6b172f23d041620f8a7ac6f76e0c8a53d3cb5e8 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -165e65e84979c6f28bbc1599779274d59ad9b0d25e7fc47f9b0e3736cd7a1ae94c3048b42e39ea1f7551545ad6a8fe9eb9f8eb25f8055dce21a170fc8d963cc6ae7 + +Sum = 3245e002843eb7116b987b5cf9160e6891a74a6843039f8517fbda68b0e6ad87fd0aa836a2b6aacabcd67d45d327e6cab43ef569f488354e22f4553eed09e83d601 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 323986f42c5052147e7fcb66162547bc8c44ef49ae100a90f38b0f8763d3e2a95814fccb053f886ad921ed0dad917a523f14104e8a7e08a17d9e582ef04c5138b00 + +Sum = -464684d68716498baaa3744d20c112a854e148e6d004e4142c79f4e25a36c0acbff72c047925377f377ad690c63fd21a3f05911d11fb8bb79bec4ea68fef9f1d575 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -4652dde4df04ae8897bc244403b1d9545a43a40564f8790850eabfc3a7498b8b64ecd770169c59df1b2f66c8ebd63e92b43076387c05b86441424bb68cad3622076 + +Sum = bb90e9e393538df233d499955020b8f3c9789b1f18fd5ba31cdcca6afe24842166e6cbf1985f7f9e002335be46de06ce11ffbf6dbfe743642cdeefca1a856219fe4 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = bb9d42f1eb41f2ef20ed498c33117f9fcedaf63dadf0f097414d954c4b374f000bdc775d35d6a1fde3d7c5f66c747346872aa48929f17010d234ecda1742f91eae5 + +Sum = -1804d154182f4b71cab3529447ced41ac310a1d14121847816c74171759998b707db0f1f3a9d6f6e01a2de48ec83a45e5dc7d0ac9133c8e00ec41814e3d2818834f4 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -18040bc332b06521fbe1c794d99fc7b002ba7c1f57d24b28d48034c360c86c091d8bb46880c5fd48036795456a2a3d96d675225ada932615446eb843e406a817e9f3 + +Sum = 3b75f0b892eb00075eb21961cc018a2d297764bf560cede3290cab6682a56931b831380b72a9afc3dff88f042ed5bd5d8468d8a1e267b36e508c09ccac2a565936e0 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 3b752b27ad6c19b78fe08e625dd27dc269213f0d6cbdb493e6c59eb86dd43c83cde1dd54b8d23d9de1bd4600ac7c5695fd162a502bc710a38636a9fbac5e7ce8ebdf + +Sum = -4b4bf674436c9b1079c2b24cdda19247d0db44061c562ab6f5300eac53556fbe758151824b6bc6bb63a958895fd7c4205cde5484a9fcbbe787fe38c3d36f4549dc23 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -4b4cbc0528eb816048943d4c4bd09eb2913169b805a5640637771b5a68269c6c5fd0ac39054338e161e4a18ce2312ae7e43102d6609d5eb252539894d33b1eba2724 + +Sum = dd8af6a278a84889cab2d444efb282a7259a608117db26583287f051bca1b70c21f8c3d95b2f4e0b7d25b6966771a5c41414c386bf4491ef7b055b07455c12b5d8d5 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = dd8bbc335e272ed999845f445de18f11e5f08633012a5fa774cefcffd172e3ba0c481e901506c0317b60ff99e9cb0c8b9b6771d875e534ba455abad84527ec2623d6 + +Sum = -16cac44109b24fd5d47dfb5994caecbbd534ee11178aaea4a100d9e63bb2c5ecdcafce1e2080eafdda00d26c29e01980166d8db67800e33027f5260d154efe1a98973 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -16cab7e7fb5a6170d790e2a99de7fbf5292f8bb5f8f5bb0facdc691b5a65b321fe0ad872b4e373db7a1d1ddbf1ba83139df862d15c96d9037b4fd0100552408393e72 + +Sum = 22db04aa783edd3e1a55d263262805f2892c013f78ebb86239f2e5981090158f57bdf3bb171c2e0c1c7bf9bc88ab62683581f8b02c5bec8f631bb24ade9be235108bb +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 22daf85169e6eed91d68b9b32f45152bdd269ee45a56c4cd45ce74cd2f4302c47918fe0fab7eb6e9bc98452c5085cbfbbd0ccdcb10f1e262b6765c4dce9f249e0bdba + +Sum = -4c8c0b74eb7a79a12ecaecf885b9672ac717b1c8db5ad251f1551ce80af89acf3a495066c85a96e6430be8e5888ab1ef3edd5e76645b5914ab55d221c34d07f8d5ce0 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -4c8c17cdf9d268062bb805a87c9c57f1731d1423f9efc5e6e5798db2ec45ad9a18ee461233f80e08a2ef9d75c0b0485bb752895b7fc5634157fb281ed349c58fda7e1 + +Sum = e3718adf0c2546c8cceb0e8c7d909deaa50b50f51d7b80f8040763eafbf581c017e7e12325b258503fe651ffa4c3d3ff9200515d816dfa3ba372dc937480d121ef056 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = e37197381a7d352dc9d8273c74738eb15110b3503c10748cf82bd4b5dd42948af68cd6ce914fcf729fca068fdce96a6c0a757c429cd8046850183290847d8eb8f3b57 + +Sum = -18dd84a4e54a29c1b3106ef2f2d92be21ba64d2e26b3f4c2ea68685557d01a07f9229365c6d109205fa116fee59cf385cdd61b7fa5de8de751f02f1dc0eeb304babb4e +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -18dd83df5464aadb63419d67f36afcd5b0e5f70874caa5899b262148a9bb48db4b38440b101731ae39a2dbb5e21a9a1f064ec8d15427ed448725d9bdefeee72b4a704d + +Sum = 3ce64e7953aff0e057cdd6c17499461666f5bf8dc3a929ba7ba919486c1631c25c0e142584470d3f759157c045f9f488502a76024b6b7b2bf84c0adcce8dd7c6d6898f +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 3ce64db3c2ca71fa07ff0536752b1709fc35696811bfda812c66d23bbe016095ae23c4cacd8d35cd4f931c7742779b2188a32353f9b4da892d81b57cfd8e0bed663e8e + +Sum = -6a392e555c2ae89dd73f86e11fd98d1d59ed03072a0dd61add633b317d5638d67984a55e51f01a2db94ad6eb6488fa80cf4f25a32d436886599c33b5287a9525f41a4a +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -6a392f1aed106784270e586c1f47bc29c4ad592cdbf725542ca5823e2b6b0a03276ef4b908a9f19fdf491234680b53e796d678517efa092924668914f97a60ff64654b + +Sum = 8202089b883a5e77457036254c2a73aaf32f03eb1e61fae428926028b499b7d0a4f4e5256094f34bc2478f0595aa01aa79b5d36d7f30136d3af2be93b70552fc6e988e +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 82020961191fdd5d953f07b04b98a2b75def5a10d04b4a1d77d4a73562ae88fd52df3480174ecabde845ca4e992c5b11413d261bd0e6b41005bd13f388051ed5dee38f + +Sum = -13a2e13d675e3fa89489c870cda617ae92ccb7d2f6b6405eafcad9c89a682b63364c333476adf0322febffad973f3dbddb7cbaa41a64b1ea24dcb2bc2196a0af42eac3f +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -13a2e1310e4fe7ba2f8cdb581daf34bdcc20b2709b97ab6b1ad6b557cf86de506b6d8e3ecb4252bb0d8c1bf9070718276f044579354947dff8300d662486a3f1abe613e + +Sum = 2bf9f45c817a8f5c589a208c57c30b52866e75a9b6ee0fb7c3f0c7ec3761f2c114858241a189e331aa9ab440132dc8f5ab7dac0891a69d5573dbe42fda019d30610f07b +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 2bf9f450286c376df39d3373a7cc2861bfc270475bcf7ac42efca37b6c80a5ae49a6dd4bf61e45ba883ad08b82f5a35f3f0536ddac8b334b472f3ed9dcf1a072ca0a57a + +Sum = -40557025ab86f90705fc86e3ab3d8494255bee490822e27c5551037f36f9ca834fd33c11a1a162357cb21eb83254c4da56b9f8f54aca29b95283ac03732a849258e7c41 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -40557032049550f56af973fc5b346784ec07f3ab6341776fea4527f001db17961ab1e1074d0cffac9f12026cc28cea70c3326e202fe593c37f305159703a814fefec742 + +Sum = d2985750cb9579d3f5dc3db7d2229f06e2a0d57d195819b3646f84c08eafc093def93748aaedf1f430eedb90c1694d894339caa4141ef5f07708e1a3607c5793df599b5 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = d298575d24a3d1c25ad92ad0821981f7a94cdadf7476aea6f963a93159910da6a9d7dc3e56598f6b534ebf4551a1731fafb23fcef93a5ffaa3b586f95d8c5451765e4b6 + +Sum = -13a024fb88eba47aea55fb69680479058efda97b81fb1e6e7cfe520e8dd8ad12deffb69662852f9a94f3b029a37befc620d792a8589660e2ebc7d6e1bc8c0c8f35ac1216 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -13a024fac35abefc04062c97dd050ad68292e9255c49351f43af0fc7812a9841b251cc4707ce75c322cdb1ee5a786d6cba100b55aa44aa4248fd0c8c5cbb0cc35c3bc715 + +Sum = 22701a8dfb82a2ddc8a5485b05362205a549bcdd24bbd660f2041a6672732824bbcac4ff58605ccf1d8ee066204a4a639828c41b722fb4a1e6c9bc3f82a89d85fd042f85 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 22701a8d35f1bd5ee25579897a36b3d698defc86ff09ed11b8b4d81f65c513538f1cdaaffda9a2f7ab68e22ad746c80a31613cc8c3ddfe0143fef1ea22d79dba2393e484 + +Sum = -4f73fdc6540686b350c859bdbe8f22340786ddb04b7ddb8858d33ce8931bcf660269129607f77dbc1db38d8186d8bae7ebb4ec8716c6eb26342ec8290d8d8988b1f5fb0d +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -4f73fdc719976c323718288f498e906313f19e06712fc4d792227f2f9fc9e4372f16fce562ae37938fd98bbccfdc3d41527c73d9c518a1c6d6f9927e6d5e89548b66460e + +Sum = dcbcb3df6508052fd0d1cfb0a6088fe978227066c58317cc359f508bce9f45987ce3152022e19ef068b0381ce7d781ae3e7c04243541744c9f374a3f28dbd746acd3b9fa +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = dcbcb3e02a98eaaeb7219e823107fe18848d30bceb35011b6eee92d2db4d5a69a990ff6f7d9858c7dad6365830db0407a5438b76e3932aed4202149488acd712864404fb + +Sum = -163f4ba6595207387ef0956796ac29e3c6862b5344abdce3db4ff7e960b7727fa0a2870dbbe17bd8c446000b3074c1145368d4b84b39029110f915b61916fc29555d7d800 +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -163f4ba64cf8f8e0908b987a7dfc3300d5bf7f4de250be4ee7bb03c4efec91328dd7a868c636103b4d23a0277be488eebcfc5c432053e72706cc6910c319ec2c97c678cff + +Sum = 3588d982604f471ff0ff784942bd43d85cad820864e0b9ee80cc9a9e3807d2739eb58d447830f73fc8cadc88d864f98577e43adf5150b2eb104e75939caa7de02419b6575 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 3588d98253f638c8029a7b5c2a0d4cf56be6d60302859b598d37a679c73cf1268beaae9f82858ba251a87ca523d4c15fe177c26a266b97810621c8ee46ad6de36682b1a74 + +Sum = -4d51ba5f184e5d20b30f8e41d663d14dbe4f692f1a0749789c02290af4c889268c319fad8b9b7c9cc71e8d9878039931447fd6ede967c5c82c1915631f3237aaacf4a1763 +A = c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -4d51ba5f24a76b78a1748b2eef13c830af1615347c62680d8f971d2f65936a739efc7e528146e83a3e40ed7c2c93d156daec4f63144ce1323645c208752f47a76a8ba6264 + +Sum = 9d7a5610dcfc50699e6bc065584fed73fddbd58dfbefe377eaacc024e33e6b4fd361fac0844489fdf13efd8dca7fae0747603f4b26bb2a9bab9de5241a3af4a935ac940aa +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = 9d7a5610e9555ec18cd0bd5270ffe456eea281935e4b020cde41b44954094c9ce62cd96579eff59b68615d717f0fe62cddccb7c051a04605b5ca91c9703804a5f34398bab + +Sum = -1258b397182002c966f064c2cdadb06910e2042d0f51b4af494338c12b6efff052fe564a00e581c5aac0ea79fd8a1ff68ed92b7f74baabb03a51337d4b9b01a2f64ac803cd +A = -c590e57ee64fced18aff6e2f0c6ac05625b1e94f394f42470cae14d12cadea4f5ab6b9d77225fe3b4903825966c78752ae51b6a0a2caca555fd0ffcbd9704b01 +B = -1258b397175a71e3e80a14f3fc22b0fae1d5996cb92c02c5fa09e97ee46251db81d1a85fb18acb0bd34ec47bc2411c74357263f8220c59f999ae68b2f63b30a32a7157b8cc + +Sum = a1eea50170df6807aef40929a52c097081e1755b575a49548ee5868281973a141920234cd0176d64f84a5874dc417cdc8a5c338cb54bca390538e1014d638b51 +A = a1eea50170df6807aef40929a52c097081e1755b575a49548ee5868281973a141920234cd0176d64f84a5874dc417cdc8a5c338cb54bca390538e1014d638b50 +B = 1 + +Sum = c7c26d68246f16d9d9996fe67616d2fd48809916e8121a5ef95b17bb9b8333d84e2416bf2a5eb3b686c936b9722e0a92a376f357aea7719610e864d9e2a5a677 +A = c7c26d68246f16d9d9996fe67616d2fd48809916e8121a5ef95b17bb9b8333d84e2416bf2a5eb3b686c936b9722e0a92a376f357aea7719610e864d9e2a5a676 +B = 1 + +Sum = 80d5de21acc1eb10fff4e534d23b5cd39e1eebc3d7f03aea438bb6e5237ced9955bf86898e93c74565c9a197e3ed2ff8edd3acc41ecef97c4fcfd52e1cdbb07e +A = 80d5de21acc1eb10fff4e534d23b5cd39e1eebc3d7f03aea438bb6e5237ced9955bf86898e93c74565c9a197e3ed2ff8edd3acc41ecef97c4fcfd52e1cdbb07c +B = 2 + +Sum = e020b9bd8d194468f8b563c8f586f6959533be8507bd4d3d7e494ef3733007c062caaa65da5c51b52f18cec4894966352f948517ee92d5f9b5ed00f020b1d1dd +A = e020b9bd8d194468f8b563c8f586f6959533be8507bd4d3d7e494ef3733007c062caaa65da5c51b52f18cec4894966352f948517ee92d5f9b5ed00f020b1d1d8 +B = 5 + +Sum = dad6af803cf2f40e75cbb564e8229c0d25465930d2ceea73715682c26d582148a943c1c767ac5167c0425975ff75a66eec5ad418ded078569dea2f77359c1cf8 +A = dad6af803cf2f40e75cbb564e8229c0d25465930d2ceea73715682c26d582148a943c1c767ac5167c0425975ff75a66eec5ad418ded078569dea2f77359c1cfc +B = -4 + +Sum = de90e3172430754f80e116cc8c848bee88c8e31810c6ef0ded5b05bbef6d5b81f9bf6593622ebfcb2b41be2e87d62ab7fd566763b74428275a16d1da482e5f76 +A = de90e3172430754f80e116cc8c848bee88c8e31810c6ef0ded5b05bbef6d5b81f9bf6593622ebfcb2b41be2e87d62ab7fd566763b74428275a16d1da482e5f7b +B = -5 + +Sum = c153ce69e35411c7f1e52809773ce03ce8d2af10b5c7aa3f4c9354de5ca044b7ef25089f1e96bd14d6c62c88b3c39951df19c73751ba25dc758534adba7faddc +A = c153ce69e35411c7f1e52809773ce03ce8d2af10b5c7aa3f4c9354de5ca044b7ef25089f1e96bd14d6c62c88b3c39951df19c73751ba25dc758534adba7fade2 +B = -6 + +Sum = f0c843f86e227571d67cfc34ac00d0e6f87f4cbd3273af68562657ae5ca82ddf5fd63476d56d5cccf62dd93f8320c0ba88658493dde282abc22bd09a01f6f2be +A = f0c843f86e227571d67cfc34ac00d0e6f87f4cbd3273af68562657ae5ca82ddf5fd63476d56d5cccf62dd93f8320c0ba88658493dde282abc22bd09a01f6f2c5 +B = -7 + +Sum = c5ba28844b8947aa0c2933f06aa88f0b34e0e10ca9baf1cc3bd5ff2dc0590e3ac5a2f2d3a1408009e1b35e08426bdda001adf93e872b03f4f6df28d34a3355e5 +A = c5ba28844b8947aa0c2933f06aa88f0b34e0e10ca9baf1cc3bd5ff2dc0590e3ac5a2f2d3a1408009e1b35e08426bdda001adf93e872b03f4f6df28d34a3355ed +B = -8 + +Sum = 84da246c2485e335d1f3b7e31c2408365f2afe7bff7b596440281c1618bbc8bf7a3896ece480fac4a29070539a95f1d718c151ffbfafbb82629bef9d2afbaaf7 +A = 84da246c2485e335d1f3b7e31c2408365f2afe7bff7b596440281c1618bbc8bf7a3896ece480fac4a29070539a95f1d718c151ffbfafbb82629bef9d2afba900 +B = 1f7 + +Sum = 9673d93165b5be256689ba4e750243537f85bc28daac7f65338074081f114b3a83871683c89fae3c87d44da053557aa16dd074b1bdc16c02a74c5b495f875449 +A = 9673d93165b5be256689ba4e750243537f85bc28daac7f65338074081f114b3a83871683c89fae3c87d44da053557aa16dd074b1bdc16c02a74c5b495f875453 +B = -a + +Sum = fce022b2dd492a96f8b095712803f318a45a9a8f00a48dec06accaf793e54e59daa14c56c2fce011e30e6394937f7bd6fa6afa1b6dc3b5359ec7bb4f757c5d89 +A = fce022b2dd492a96f8b095712803f318a45a9a8f00a48dec06accaf793e54e59daa14c56c2fce011e30e6394937f7bd6fa6afa1b6dc3b5359ec7bb4f757c5594 +B = 7f5 + +Sum = f04028fafffb1aee499812d12f9fcbb23e6a872b3f69fe7a7a246d8f98ba2aa954f78506b39c023397855ead87854412c881fdd16267c07ee12f085b055c7c71 +A = f04028fafffb1aee499812d12f9fcbb23e6a872b3f69fe7a7a246d8f98ba2aa954f78506b39c023397855ead87854412c881fdd16267c07ee12f085b055c6c7d +B = ff4 + +Sum = 9c008016815a6580728b3f690eddc7695fed44171557df8a4a6e8c0d5e7c3296832b4ba9ee4a4cd7e6a8ef23cf8c64fcd0518664289c4e72105b404cd6c0ab6d +A = 9c008016815a6580728b3f690eddc7695fed44171557df8a4a6e8c0d5e7c3296832b4ba9ee4a4cd7e6a8ef23cf8c64fcd0518664289c4e72105b404cd6c0ab7a +B = -d + +Sum = c12bf7e503d2c5845c60886ad5ef87d24e002498003b44922e462f36592a52c878123a6d1037896ce9fb7d2c680d008e80009da72c8e1415e957b2fefb52c34b +A = c12bf7e503d2c5845c60886ad5ef87d24e002498003b44922e462f36592a52c878123a6d1037896ce9fb7d2c680d008e80009da72c8e1415e957b2fefb52c359 +B = -e + +Sum = febba964e2548ed1474dac7c1eb9b1cd169ac913530b7fb358d67197517266707e5a176a814ec82cf8945214b30c36ca7ac0b1ade1848573e72d408dbede8f53 +A = febba964e2548ed1474dac7c1eb9b1cd169ac913530b7fb358d67197517266707e5a176a814ec82cf8945214b30c36ca7ac0b1ade1848573e72d408dbede8f62 +B = -f + +Sum = 8a3f9eeb76e96f13446c593fe2cabd4215e0debc54025df7791d924d8afc08dc8f607b82a3d07d75897bfeee0c42b9a32e0e77a098c1cce9c001aabe0481996d +A = 8a3f9eeb76e96f13446c593fe2cabd4215e0debc54025df7791d924d8afc08dc8f607b82a3d07d75897bfeee0c42b9a32e0e77a098c1cce9c001aabe0481997d +B = -10 + +Sum = be825a00c3c6b192d04863b0719ee1e687dbbf2cfc0c331c00b8b947c17fecb7700c9e534bbc49bd61978754ffae1e57d80aab34f5fd23a267e10a4b5a13a9d8 +A = be825a00c3c6b192d04863b0719ee1e687dbbf2cfc0c331c00b8b947c17fecb7700c9e534bbc49bd61978754ffae1e57d80aab34f5fd23a267e10a4b5a11a9e9 +B = 1ffef + +Sum = d1c861822ba0e93be81fc78a2628756480146225c79b4a389588a9c3bff9a7500660e99c28807d9ae7bf8c1e89e81d4f9ff2f72d35ea6b34d09df053d46dd294 +A = d1c861822ba0e93be81fc78a2628756480146225c79b4a389588a9c3bff9a7500660e99c28807d9ae7bf8c1e89e81d4f9ff2f72d35ea6b34d09df053d469d2a6 +B = 3ffee + +Sum = 98ac65b4c06400baeb40ed137ecdd930a3607423caecbe1f1a936a8210c28fd84b53324e5bb73b7e4b71209b1a4d106796d57a4a23fad2c23abc0c039539080d +A = 98ac65b4c06400baeb40ed137ecdd930a3607423caecbe1f1a936a8210c28fd84b53324e5bb73b7e4b71209b1a4d106796d57a4a23fad2c23abc0c0395390820 +B = -13 + +Sum = da02949862a4b26a4fb4bff43b21c2cdd048189199612616303d3ab34dc6f201be256f5889e368867a0da200a0b03e904048d6ba5caee1dafa16f4fdb1f00029 +A = da02949862a4b26a4fb4bff43b21c2cdd048189199612616303d3ab34dc6f201be256f5889e368867a0da200a0b03e904048d6ba5caee1dafa16f4fdb1e0003d +B = fffec + +Sum = ea9523fdde49d481c9f449969fd8e191e118058e0593f2a27ef0ade666ff478c50acb274a6c77d9ec4ca628ab0d7f3dc18708327423de28616235187acb197f8 +A = ea9523fdde49d481c9f449969fd8e191e118058e0593f2a27ef0ade666ff478c50acb274a6c77d9ec4ca628ab0d7f3dc18708327423de28616235187acb1980d +B = -15 + +Sum = dab5613ae3756d29f22bc30213363900e3fdced153a3c20852d51c71cbb9af41aba6a16d0b72926192ef48f25e8975881ca7973a69590dc6f0224395e6f3684d +A = dab5613ae3756d29f22bc30213363900e3fdced153a3c20852d51c71cbb9af41aba6a16d0b72926192ef48f25e8975881ca7973a69590dc6f0224395e6f36863 +B = -16 + +Sum = c442f3e574310f78e0ac187af96550d4999b79da9c9d6ffa9eb9437a2ac01479003d8e795ce68dfc0f87a4fd9b00b6c172c72c7f580a32af015a3a3375b85285 +A = c442f3e574310f78e0ac187af96550d4999b79da9c9d6ffa9eb9437a2ac01479003d8e795ce68dfc0f87a4fd9b00b6c172c72c7f580a32af015a3a3375b8529c +B = -17 + +Sum = b9ac1e23fbfe179d9d3ff99b2ad8399754ea5531e6fce5dad997e2c961110d49d0e3d9c2ec03289edeb39e5a6b4744dd4b3cdd6c43f4e8f4c8e91617772e7fd0 +A = b9ac1e23fbfe179d9d3ff99b2ad8399754ea5531e6fce5dad997e2c961110d49d0e3d9c2ec03289edeb39e5a6b4744dd4b3cdd6c43f4e8f4c8e91617762e7fe8 +B = ffffe8 + +Sum = e087174c20cba6c4e1e8ffc2ecfeeee770898916454724c24b56d8619c27db123078d406d6b7b836b0dd3092b34b736c472f1afd983971230f1e2b729b00acd4 +A = e087174c20cba6c4e1e8ffc2ecfeeee770898916454724c24b56d8619c27db123078d406d6b7b836b0dd3092b34b736c472f1afd983971230f1e2b729900aced +B = 1ffffe7 + +Sum = ba66837e8e8bdefa4c3df73ba5ee65d1ab45a68f51072bf2997446b13b6c73b29c26d15ddff186c9621e156bd3b650caa267dffa54abb782734c443bf502b276 +A = ba66837e8e8bdefa4c3df73ba5ee65d1ab45a68f51072bf2997446b13b6c73b29c26d15ddff186c9621e156bd3b650caa267dffa54abb782734c443bf102b290 +B = 3ffffe6 + +Sum = fc461dea452aaf0e2c1df10b7cb4293fbc498d40caa7a917a741c6d3534914fc039bb7a62d14cc3e9ea6cc8d2b41228628ad56687d18858c3867c75ae83a3216 +A = fc461dea452aaf0e2c1df10b7cb4293fbc498d40caa7a917a741c6d3534914fc039bb7a62d14cc3e9ea6cc8d2b41228628ad56687d18858c3867c75ae03a3231 +B = 7ffffe5 + +Sum = d109e7982ffd500ed77702054ccbfa49bb47b5cdb2220988ef58af3cbe0ac90bb3b2ac8a2c558fe744231bf227bf35343e12ecb312242ce50a85fe461e73b601 +A = d109e7982ffd500ed77702054ccbfa49bb47b5cdb2220988ef58af3cbe0ac90bb3b2ac8a2c558fe744231bf227bf35343e12ecb312242ce50a85fe461e73b61d +B = -1c + +Sum = babcba83c01843f6448fc3f91c006a673e514c9626c6399d43c016c31a8fd1a9fc58d1c63ba5b9565dd7320c4a04fe4331fbb79de1e03d68db331bbe2b4b9036 +A = babcba83c01843f6448fc3f91c006a673e514c9626c6399d43c016c31a8fd1a9fc58d1c63ba5b9565dd7320c4a04fe4331fbb79de1e03d68db331bbe0b4b9053 +B = 1fffffe3 + +Sum = c52e7fb27c4f670109b32cb6d3f705e1685e2cb7474a90d3815e486de77dd2584a0b65d22040059ae5279450682a189eb1b0f847e0d3fe022628a73eeb99c54c +A = c52e7fb27c4f670109b32cb6d3f705e1685e2cb7474a90d3815e486de77dd2584a0b65d22040059ae5279450682a189eb1b0f847e0d3fe022628a73eab99c56a +B = 3fffffe2 + +Sum = b5f074f655dbe68df022b0093534b609b23c17eefcfdc9b1b150c8cfdafe1d320fff7452c147c7d9f9cbe16be25970a23e6499bc90e689497c8bf2d38219e4f4 +A = b5f074f655dbe68df022b0093534b609b23c17eefcfdc9b1b150c8cfdafe1d320fff7452c147c7d9f9cbe16be25970a23e6499bc90e689497c8bf2d38219e513 +B = -1f + +Sum = a1a41b6638409305ab9ffa22bb3cb9434f587d4ce6f6da47c0ad6f8f720f397c37cd61254f35fc9f0cda36476ca6d95f233604b9ae5ea2f1a1207caf15682e81 +A = a1a41b6638409305ab9ffa22bb3cb9434f587d4ce6f6da47c0ad6f8f720f397c37cd61254f35fc9f0cda36476ca6d95f233604b9ae5ea2f1a1207cae15682ea1 +B = ffffffe0 + +Sum = f187feee94925d57f65f9b1200193d8e9359340d670bab27c022d6d63a54635e4573593790e6c6b779becb9e5ea81c9b075baa2d3bc95493b0c5a2da1fccebbd +A = f187feee94925d57f65f9b1200193d8e9359340d670bab27c022d6d63a54635e4573593790e6c6b779becb9e5ea81c9b075baa2d3bc95493b0c5a2d81fccebde +B = 1ffffffdf + +Sum = dc9c51e1313cb655969b4a069f2e8edd850d4fbc5bbc36f05df42a526f4e5b3ed18886263d86231193442b3ac3e7a71e5a6377021e71ad07dd9411953dbeedc5 +A = dc9c51e1313cb655969b4a069f2e8edd850d4fbc5bbc36f05df42a526f4e5b3ed18886263d86231193442b3ac3e7a71e5a6377021e71ad07dd9411913dbeede7 +B = 3ffffffde + +Sum = f2b5e665a6a2e7009bff8b2750b5fb11576bfd49dee5dd7f32b02c46430923b0ec95c3fcee0006b0c2591cbf1fb18dde331d8fb119d92f3196a7dfd8178be33e +A = f2b5e665a6a2e7009bff8b2750b5fb11576bfd49dee5dd7f32b02c46430923b0ec95c3fcee0006b0c2591cbf1fb18dde331d8fb119d92f3196a7dfd0178be361 +B = 7ffffffdd + +Sum = fb0f545b752979151bc6004b3db33bad63230c26d060ba00f5b82e7bee7e2c854b09b2a7c6b4186776c6b3cc45afbc50ef35df7abad11fec62523a12be1cb7a1 +A = fb0f545b752979151bc6004b3db33bad63230c26d060ba00f5b82e7bee7e2c854b09b2a7c6b4186776c6b3cc45afbc50ef35df7abad11fec62523a02be1cb7c5 +B = fffffffdc + +Sum = fc197e83249b069fb34552188cd6d06a7e0b42c6a6a9869ede485328a0fabd0c0ec2f79b81747129ccd70ee5c0f9efea62c36d1a4e1fb2b80393fe636469c25a +A = fc197e83249b069fb34552188cd6d06a7e0b42c6a6a9869ede485328a0fabd0c0ec2f79b81747129ccd70ee5c0f9efea62c36d1a4e1fb2b80393fe636469c27f +B = -25 + +Sum = aaf9a8ecbbfee9c3092d9887ec35118a9614a9fa84fc50b79b11d03a4967066c361f67cbf7a8e5beb620c7da55f4bc7dc50ad44b22c9128994781c7816a439af +A = aaf9a8ecbbfee9c3092d9887ec35118a9614a9fa84fc50b79b11d03a4967066c361f67cbf7a8e5beb620c7da55f4bc7dc50ad44b22c9128994781c7816a439d5 +B = -26 + +Sum = e74e32fc45d099ed147bcf7d798bd3aef9b046291038d98431698e90d22cf944a92bdcd8a5cf378e9a3aa0001150cf6e4dc37fa4e54a25e13c75099c64b9350f +A = e74e32fc45d099ed147bcf7d798bd3aef9b046291038d98431698e90d22cf944a92bdcd8a5cf378e9a3aa0001150cf6e4dc37fa4e54a25e13c75099c64b93536 +B = -27 + +Sum = a3486d022ef4d0a0c72170f05300cee78df844db19c63754c2d631d3d9ae20a0205cfe0fe947f8f4d2f9fa34e2081f448a938a446e8764ac2141157cab01dfa0 +A = a3486d022ef4d0a0c72170f05300cee78df844db19c63754c2d631d3d9ae20a0205cfe0fe947f8f4d2f9fa34e2081f448a938a446e8764ac2141147cab01dfc8 +B = ffffffffd8 + +Sum = 8952cb3f70b1344facdd7fe79747773f9c101bc2a083fa8fdef0679c24ba93218d14d4d7e848d293ce431119d1542833e9a0624b812f0b31b2b9f7ed9455e8b9 +A = 8952cb3f70b1344facdd7fe79747773f9c101bc2a083fa8fdef0679c24ba93218d14d4d7e848d293ce431119d1542833e9a0624b812f0b31b2b9f5ed9455e8e2 +B = 1ffffffffd7 + +Sum = de9cb4d4cdd1d58572fa1052edf72bb9241555bdb967bd8cefb26cb12c6622d6147385dc3f72e110b17afbdebc5feb959cb6c320a2ba01f36585b53fb1c5f07f +A = de9cb4d4cdd1d58572fa1052edf72bb9241555bdb967bd8cefb26cb12c6622d6147385dc3f72e110b17afbdebc5feb959cb6c320a2ba01f36585b13fb1c5f0a9 +B = 3ffffffffd6 + +Sum = d37f2e1638c0b3bd624104d244d9770ae05bf37f7a6ec32db552af413c0006fdcfc312cf281190eb6738370f3a8c4655beddb6b39b342f0a67cc9af92a2c7fdc +A = d37f2e1638c0b3bd624104d244d9770ae05bf37f7a6ec32db552af413c0006fdcfc312cf281190eb6738370f3a8c4655beddb6b39b342f0a67cc92f92a2c8007 +B = 7ffffffffd5 + +Sum = 831aca9ef43bea89f048250aab79b06207458647ce347c68f91013695299c80d610c6e49e2dcd46eb02dd56573d31720efc277469e573f6ecfb71b12886653ac +A = 831aca9ef43bea89f048250aab79b06207458647ce347c68f91013695299c80d610c6e49e2dcd46eb02dd56573d31720efc277469e573f6ecfb70b12886653d8 +B = fffffffffd4 + +Sum = da95fd2d2438a79843bdf92c1cadd0e9165d002d22dcacbe4118cc3cf7d5de2fd2106aaefc790aa1559b28b641f83e4e5aa0f8446b57fde5c3663c13efbc04fb +A = da95fd2d2438a79843bdf92c1cadd0e9165d002d22dcacbe4118cc3cf7d5de2fd2106aaefc790aa1559b28b641f83e4e5aa0f8446b57fde5c3661c13efbc0528 +B = 1fffffffffd3 + +Sum = bf9e3169dd4b6d336848e744231d1ca85678aa3d1d62d42eac0b16500ef527e028757da54a456b3d684199f3bb3c866a002ee3885c86d2a79180487f4e8a45f1 +A = bf9e3169dd4b6d336848e744231d1ca85678aa3d1d62d42eac0b16500ef527e028757da54a456b3d684199f3bb3c866a002ee3885c86d2a79180087f4e8a461f +B = 3fffffffffd2 + +Sum = b5880868d947554eeb536246c312c9765ca8c96888817f3ffdc16cdbafb41fe8f7c151cb316da27562d3b82b2d45abf7c9304f488538386e84c6a23e3dc375fa +A = b5880868d947554eeb536246c312c9765ca8c96888817f3ffdc16cdbafb41fe8f7c151cb316da27562d3b82b2d45abf7c9304f488538386e84c6223e3dc37629 +B = 7fffffffffd1 + +Sum = 84b1e4079d09df569a1623b990d917871b1197723b30b19fcf3c063b0e84c9cef1c3ffed16f33aa9bede08b4831bb3ecdadae1622c93e1f86b474a4989496fa4 +A = 84b1e4079d09df569a1623b990d917871b1197723b30b19fcf3c063b0e84c9cef1c3ffed16f33aa9bede08b4831bb3ecdadae1622c93e1f86b464a4989496fd4 +B = ffffffffffd0 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30c6365e1eeb044 +B = 1ffffffffffcf + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 80695b879bb74400c107619981f3bcb3c9987c76d545f6485ed128082377799534508a83112fbde2ee5558c246332c656455 +B = f6446ca2883d7e27209eeaa01fdec632d4027113b81bb47dacc8f10eadc3b3ffc26d84135d91e70deb8aec84c7820332e8cf786e2af9b4217a4c1d32b5894bbe + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1b510bc480138145e2a142fce8330ee5f4030dccaf6017a1dd85bc5bbe9b2fee4f9d8fb484661a839dc9613652bcca11a00eb +B = f6446ca2883d7e27209eeaa01fe0fbacebd20e03107a9f993e30f63358d6bdc91baf4f5acdf81e3ad94ef9af3ffc315c6e9acfff91167f0ce6738f328308b0fe + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 219f59352ebda4cfb785a18834ec1c99145a6647265baf5d8f3b405f29a746785a5e70777d528ff1526688c01b9eee288e6cd +B = -f6446ca2883d7e27209eeaa01fe16091c2dcf8a54917eddf26e5c1c43408c33ea356bf1449b339931985aa70a89cdd6a7aca5ec6e7f1c8df5f101d54c47796e0 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -7e5a2ec59519143f7bda2829cfee4ae75cc8038f31303ff9bbb1e2cbfe93c46a1367c9d6a2a3d9cb40f1a6930c18c78f85724 +B = -f6446ca2883d7e27209eeaa01fd760f94330bb39b824b7e28bc5741dbc01b11805f14655543e8ac0e6d326bffa760106d5e85f604c28935c69dda1d968f658ef + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 9f580ff614b449cf9c46c91256c20983f5c70200739de72b917344db81c1aa1bf3927c38c22d026d6ce38ac746ada2948e538 +B = f6446ca2883d7e27209eeaa01fd5511b3028c1865f22b1187d3d06e1d23821281edd1f7ae1212eaac5daf3e19f57fe5bafc666cdc205d43e2699f88bb8a5cadb + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -15773d29ba363a15a0cb31ac4a60c0c228967e857d7d11c1ebb0a8db855c0d0797c0e409899a50e1b1c989a7dcea6f26238d27 +B = f6446ca2883d7e27209eeaa01ff4bdd95944430511bd40b6baacd3c32ca01416c461d66b15c5f687ef186c0948aef8677cdc23eeca8e6c007aeb4dd508123d3a + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 2f90f72f59dd7738f5572e31d41b91599ed500d59537bf5c21a1bedad709303cba0d5bf1b5e4eaac1a85c261ce94c45b64646e +B = -f6446ca2883d7e27209eeaa0200ed7935ee3ea423511ccb340368e93c416529914799118affbe79dee6a192c7dd144df65086e8894f7283934dcf82a3d531481 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -73978eee2b2a4ac8ef12b3042dd5e1ae8724a0a676d0a52035e801d741a61b92c638a3b0cece6a81bfd2703e3c502ad1fa784c +B = -f6446ca2883d7e27209eeaa01f6baf0d415ee280332d62d20a349d20bbf058f7986d88b433a45ddd3c5169e0ae50fedfc283bb33671cd00694d2133b0ff437c7 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = a462699ec5214f0d7860974a669d1728b4983a1c3c440213d12b2da58bba9dd1caf1d5ed391a3ebd80aa6e9ef0396e62260a1f +B = f6446ca2883d7e27209eeaa01f3ae43290c4eb7beea414edc3fbd5eb41c2e55e22a8155740091ab16e07555e6f4c45ad86196f5f2b5bf808341e29f77fc8a5f4 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -130f7a12825a6c5b6b109b91e2506505a261c9f7c1a62fdfbe252275d3f6844dda2aca2d0ff6d8406ac5c679c80ab6d29817b4d +B = f6446ca2883d7e27209eeaa021103e3d57afb390b2cd7f3e2c877952c49d9a37bafebc574fbc980670d278411eb9e4264451f721ef88fede6f8f0ed30b702b60 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 2863fa82289aff06fb16bd1b866da9ac0ae0f411a8d8c2c084cf78b81d6713a9a4700248ef61d5e52ca7470f1f251380368df10 +B = -f6446ca2883d7e27209eeaa0226586445213bcbb6bcde156c6c94d9d2b258cd95971e5855c273d6a95698136db5e37a80248a6fc3ba716e7c500b49de5578f23 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -6176f648b54dc4e2d11ba7e32d2d9d3f400fbafa489fbe7f126daf1f929ef8f219c78ff1063dd27650d4751c63b6e7ad7d9a588 +B = -f6446ca2883d7e27209eeaa019c7d737a435307ccf0abb06db8f992e767681e89a5a5d7162b36aed1a69206d1f7abe8462eeac7683cf5b250cd2f4eb0a150a8b + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = ccff1ed8726e309c4e0f2e166c497cd718a8eac347674ca57b6f317ea491b743a89d25f87c37f379f6239b13d848eee1ffa9328 +B = f6446ca2883d7e27209eeaa0130f54aea86329c1373b82a3a79ddb34f8eceeec0a6de48efc2352c72949f488068d6523eb8f0a66497a68c59589d477c1f41ceb + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -13d1c041415fbc18179c970fe989ad9e1f10e4ff658c1bc550e93f6ab9f9cc9832fd49cf6f2e75af72a71dbd7b121111ee0d4098 +B = f6446ca2883d7e27209eeaa033b106dd70e9c8e313b90c94f7ec20a089886297a470751ea4c38549cd8cdc9474148152e280ff4d5b83c0344e207477cffbf0ab + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 27ede3a23479dcc5447bc3b64df32c121761de88086204484cea0782b8d63d72b57192f2b20dd3dff395e937c91e21cdbd13b68b +B = -f6446ca2883d7e27209eeaa047cd2a3e6403e9904098393b5c559f1481d95c2047465da1a0c44d61cc694d6ef688ca7625605d7ddc728bae9c2c85339f02669e + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -4ad10e7f5637cc48b04d4b250e4ca00a0d102c91caaaf6291f1248b7a1cec979f87b7251c50db8e5e49206bebb30b7f3f25c8577 +B = -f6446ca2883d7e27209eea9fd50e381cd95240824bcf2a600015d2f85d6751067439633034c7fd2771c44682489bc531ae44d0b8044a9bb817ddab71ef922a9c + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = c6b77c2c932d9d5ec6175def706d6e9c411216fe12ac52043c617761d3a37804487f158de60a9c18e7a19646c455804a65bd80f2 +B = f6446ca2883d7e27209eea9f5927ca6f9c5c6f6c360517959df504662965669a2c3807551778ce7d3fef97f7f89821f58d47ed85013b0c300eb8e31b7c312f21 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -187976849837d4ad4cfc9764fd0e3f865fa9d1d9f20d98ccd52a6b3652277100bcfff85fb8414c2967dacd26f269502d3c2caff12 +B = f6446ca2883d7e27209eeaa1a776aee5b307579fcbe5ebd4df466b6865149b375fbde626a680f944360a20081116bd7ef7674c34668974e5f9a36639a4b9af25 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 33913efb99088ab80c706ee229e7a6ea6b274097f6ed3734452dabe0865eb86fcf20c9c6ae0e613b72dbfb8b126383e7d10e8bbb4 +B = -f6446ca2883d7e27209eeaa358f33655c012b84bc32363a7acdce1a91ceb8717adb7cc9da6b503e7797e96f93323d3ee54389d55169c5b27f946a1e2f2d76bc7 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -5d84033a924ff84666d3ee1a1342ac118224264c439bc658213b9762586e8dbdef141024d757175f30bec23a960ab145832dee9af +B = -f6446ca2883d7e27209eea9a479f12f30a8a88648edd93e3da37b1ea483518d40527f3d74020cfb98caa341d4fd63535fde113aadcf07ecd72634f0daf0fc664 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = a2aeba6a0d6142f527358ffd4c9139c390c9dfab07947c902085d1f3c367035db0f22f249295b974b1d9ebe7add3dfac7ec237f72 +B = f6446ca2883d7e27209eea95f4f39ffb5975dd7888c375b0454ed6c95dd982e7c59c90574b7d26a2dd22da2131f4453a49f6f252cb3de3fbf5d0689df5cb30a1 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1e545f433c1bda45a7900793d2cd18ba630fcb11d4a2c88bc7a0fb392d270088a1ad126743b80342bcfcfa9e939c9ccdccb7f4f198 +B = f6446ca2883d7e27209eeabe743e89d84b6452728c240957db7b2d657a428f6ce1ace520f4d57f0c3a93989dee299ec72b55cc5ae5d7410a6fab313299e3a1ab + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 244bf1eb701c53bc7847a644269277f53b58dc23b55a2f996faaceff22666eece40fe14644aaa2ab0197a5a915fefa394a5c357db4 +B = -f6446ca2883d7e27209eeac46bd1320c4bddc94343c2b9aba0da683dc353a14d9913f2c8fea945017a01fce050f87dc81df5349f80824b8cd2089cb03e242dc7 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -7e3419b44f3596c6486e095c3fc9a84b5599868abd292354278a2520f54929d5bc325dc3d095e84431960265dcae84f0815ef5beb9 +B = -f6446ca2883d7e27209eea21ebc5924cf9f346828e13194544ba27acd0f0f2db15c10531c9b524e9ca693a400eb973b2dd6a456c52da3c9a248972e482f8f15a + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 81fae0f8555d46ede9e74a93b8a7c6273c9bee0eef0f51b4575aad5cbdc0e10a3d03d53cf2a42e6a3625074c812cd0ae41d94d34ee +B = f6446ca2883d7e27209eea1e24fe4e46d2431ee114d1e1cc669c4bc5ce896ea92f92a501f92ce92152b205bf3d41fa90cf241f67c3d555f5a63db52408a17b25 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1558c919b3dcd4cc2eacfee2ae98a3b4286bdb6aa67db97ce35df3ac72f6c6418df10444ce791109a9a71250896f20d4dbf19d559f0 +B = f6446ca2883d7e27209eebf5ac70e1d9fcd6cfb5cc0aa06e989db589282e28001a7c278f33150d0e7ff728db515b846b046324385a01ab0dc51bb124fbc40a03 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 3a9c8b150408b2449466b8328ccb0a5334f2340479203cb790780e71b6609f7999c691ba19f947d8cac4329a4e45377fd6bf226fed2 +B = -f6446ca2883d7e27209eee49e89096dcbaae5611679f9e51bf07a6518db7c52a42afd260d4c161451d8aa998aa32d92307d0164a2c06475b268660d1d415aee5 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -450c41a9cca23287b6448a0b248d24075ed20bec41c600279fd86869b1a51e1842cb7f4d59144436edc1c052f44428965b3b2d98757 +B = -f6446ca2883d7e27209ee64f5bc4a9d20c619166b37bc33c3c21fd1549b8b97bdee1df5bcd53aac4c1b18bcf892261f22f0f1ac1ccd773329084fdb22f1528bc + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 9d48745690ee5aa8fc448371f9236153c584466583aa30d999461a3defac314356230a763c204c2595794db93fcd3917f25b83d1b85 +B = f6446ca2883d7e27209ee0cb9899dd8d49df7d06b3e555f2d84d36aa2611255d9bd6bfc4f23666e4507eda9a106fd3c16e90304654010e79ff7ce44029b1948e + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1a3f8af71d423da8c007022421f09a53034c6e9d7d23572b8b4b273b091a6f024ea4216ebbca25daa4e9e83fb46a1d9e65fea344bcd4 +B = f6446ca2883d7e27209f04dfaad663de6d32ccd1fe409775a8b5764ed914fabb960fe4a47b154ef982955ea06285f34d992d2e87d11c56e0f0acc96485336ce7 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 3cd13ae384718065169d7e6b600ea1d1a514832649029f92f1d2b5bebbf83454fcde0133f3bb4716cf452a3f930d28f30e7f22f21982 +B = -f6446ca2883d7e27209f27715ac2cb0dafef23687a87d593b0341816ed9dc69ade774b2c099901d747e80cda424b2b3eba6958e3131c3583fc0171e504e0c995 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -5849ade77039ed0b15524c08929a4553a6c0825178f6522915592ffa9638a8143fe8426df9757e8c06aabc97a2ef87b4a58869d1df4d +B = -f6446ca2883d7e27209e925671f7d662427ef778b013e2eac90ecc41e82604a1ecbb440023dfafa66b7ed013fea93e0df4c682f32c44ff874b59bddd781cd0c6 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 9c4b4b4800fe2f11e1897ee8c8e147b143a252847548145e77d9a9d3e4e3a79283f833e760bdc69d5f75fc1d0356615b0c10b1e34f9f +B = f6446ca2883d7e27209e4e54d497459e00782b417d33aca3c6b12f6017f308502a85e17faa0660fb6c008c040d2fd6c5acb52a27ecbf9f2071b35755300b6074 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1bbe5a805b857ccd9dae7cba6f3dab95d22f7d2e1621a2ab382898bfb2b4efccb263929f752397da4ad030e6d5c8773dde8fe04c42f97 +B = f6446ca2883d7e2720a0a685c7e4fef3fc63e7b2c7c3695fc7bf95fa3d58dfb26997dbe2dfd5712e105e36356b0e89bcf0f736a0f749fefe46ec4c63e6b2dfaa + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 255c9a10ee08acfe197fecdc7b6cbae27f8dd38887f135cc5adb1b9276c94ccce420887a7476b2d17c2708c84b7e9a8b4160f676f8d1e +B = -f6446ca2883d7e2720a14069c0ee2726ff6ba4c9c9e42c50bc8a6bdfa2fffcab9baa070b0d01b273e0615204c8be7eeea06a4c0e75615a607bc27975495e3d31 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -4bb5296b4ce3e960ecadc3f15de0a3a0dacf12d34f690cafaa8f2e31b0e9e69d42a3b16bce84361c81b7584be32210daaddefd7184659 +B = -f6446ca2883d7e27209a2f4d892a785d997b41eebd06977ad454c6113d42870773e9b06670bf3740a9bee5c12a5a4f40118a6e28641e7055c56385760ad669ba + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = efb45966d1f6d79c9b4c72c3a584e26e7b7136295fb79a911433a10ef649b47b14b8d76cc42e54852176ef7da7d08b86186cbe6e98b23 +B = f6446ca2883d7e27208fef5a8972272eb5c05803cfe21d36e77abbef07e1821e95d3161f42eae143cbe1c46eca4af49e2b00722ef102256e1aacdc99fb0524f0 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1e30bf701cd589fa3d2adff0217e8f748d1a254b771d77d342fffe3e3138aa3d4a75ca8c1e6636919636d4d96d8b04d583af4dc208b51b +B = f6446ca2883d7e2720bd1b5f8ffc1c2629c737aaec3df41482ef8d27b5ee9b1012275957920b7e8950dd85c6cd359dba04e8c072c24a2d7ba89212b3a3f7652e + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 320eee30dae44f272fc9606477927bac85b677c3333fa55f4c5b5c7e71bc02266a906d8838a096551a8b5b94980cd819ac721a6ca70a71 +B = -f6446ca2883d7e2720d0f98e50ba2aeb56b9d62b60940800bae8297a2daabd3d9e30b4b5d24c01e139fda069c94fd819c86d14f97d74af4eecbad5804e95ba84 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -5819f4921a515433459006c62df3be1c4e642a52340381b5954df3f9dd0ed5f73f8dc9a17e536b88090ae8d5fbc411f16eeca2449ffb96 +B = -f6446ca2883d7e272046d0ab8dc4f547fc447cc435ee81c6f2140ed818437a16894f0b6559fd37091c5382329f98e417eb497eb512e0de64e19f76c39d4eb47d + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = f238bbcd9701966bc4482fb8df8ca395ad15e2b83c014e59898e33a36623580e9c91faa3873eb26a0e97c4d29ff209e22c4faa0a1295a0 +B = f6446ca2883d7e271facb1e452484505c3c5c49b433ce8e178b55d1fb23b7c49e55acb25b074228704f67e019d8ff8d10943f1d9163cb06cf0e213bbd7dc1a73 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1e00b3b3bab1081231e0f1a2029b146f8391869dad416f6c8443c124ea7c908ee402f6b6fe06d883c2d232713512ed5d8636a07898523f3 +B = f6446ca2883d7e27227ef5db5b8a571d52a81be51c4626cc069b8b6c454b948f0728956ba2820ee801d33f67b0f7a50baf7facc4fc2dd14cab71cd6d6b73d406 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 2030dfab0a9e0af1764f416171c8eee2d0b87bd5b80e6cddee4ee2a7509a301956050b6e3bb067f827d13c33abf31693d4101951d4a0b96 +B = -f6446ca2883d7e2722a1f89ad089274b46ef00e1133904733b6dfabfc5f864661dc94783c8e3e8e0a8f360b324d23e02f5cf9d61239bd3e0104f64faff38bba9 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -7427bfdba61a57b644fdd11b2a3ea1d3507cdf4ea1389436bade3fbaf751724000774127923658c7b090f182d1d7e320aeaeb1e3dc0b30a +B = -f6446ca2883d7e27195c6ea2657da120cb3a2fb949788b67d95aa50d8063f454d336755da4652ebb138b9be9c7f3d1f6f8497a85bbbf2444c8237847a42dfd09 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = d23891ab621e6ee43b3b250d66ab139cc97db21429da33e01910635969af402b6792f6d741292a0e1bb6bc30b2a7b32fcce9f5e8c2e48bd +B = f6446ca2883d7e27137b618569bd5fadebd65a7a25b1c44b41ca97e127d9da5a3d535323bd3f51dc5d19e08ecd04a4e291971ddaddb22743d63fc40755c06756 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1d6d78b7e83cedb64f0afa17c56360a58eb5ccc4e647bd3c594feb6695531f9434adb169ce314d4c93b4efc260fc92b268ca22143fb7e994 +B = f6446ca2883d7e273e0c6358081c34527e9506e2c17fd62a9d183fc750bf3ad4983444bfe92d65734840c1660f4884d00707796049d935293bd8857a21a699a7 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 255261901144afcf37c28015f4ec493bfc06cbabf851997d06cdc2fa742a97e234085ce67dcd867451a19d3427acc5ac2fb5b919f1514e06 +B = -f6446ca2883d7e2745f14c303123f66b674c8ce0f108bec10a693eae62c9171545b21c53c804ddc1479b6ce2bee4bdf7c4f426d21089682302c41c7fd33ffe19 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -4c222346b39b4b87631fb26dd9b3a8942374f10ec577d0aced5cada7bb0fb34d9c85bd06b6d52a4229ec662ca5605aff7896f7d74483fe99 +B = -f6446ca2883d7e26d47cc7596c43fb14cc6a5a5d2268ccf0eaed81f3a4ffaceb5187abb198ca9291770d52f58a420d4149662371437c47775a776b8e9d6ab17a + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = b832106ab8bf5c27886927f67c5bb95d81280a5b4a3a044c39c816dfa5c5a4c6e8058d34c3e44bab649194932e42c197b40d16213f6565e4 +B = f6446ca2883d7e26686cda35671fea74a720e4d47fc0bc278d3a68a7203d794c051c4279ae14a1182b8d82c77d32ebd80ec0f50aba99e0df1f014d44a2894a2f + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1e4bd432a98b6d68d35627f4a46b56f04b378a535b50c7287ec949008e8ace3ed04a128043cbac7a49c6c1cb98dc27b684c4f971d69b51268 +B = f6446ca2883d7e29055c2dcab8961d2964ec8c1542d1e489c1db18381f83f0202b78e9623c8729cc183438007dd1ff280fbea657769f1ddf1f5dfa834ba3c27b + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 2af2a9aa0364d970115f35b6ab676f4baf1f4ed52d07cd808dcc7fc7bcdf2268f917a7e4476e429200a37b246e786e85a2b62d6b52de13135 +B = -f6446ca2883d7e29cfc98540562cdd9d457d6835b2936a40005760553af455a11bac55d521cc6c6ea50d8e40b7fb60a37d8a3be4d0638ad0fe713a1b0fcfe148 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -5dcc7b06c24160a67934f3adf5f5a468f10b0bfe1b82e133c797674c941c9480bb1e71ceddd1151f88244bebc63c2da41557670132848e482 +B = -f6446ca2883d7e2143d73a33fbc93c349c3ad1eb9cc22ef5fdb1b320b2496a5bc56de4901210fdd361abf30e6405e58af10dcae18519c8357d97f352b9a5cb91 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = fe6a6b7e6ee19b5e4e2a4cef85f637a5b0a76007bf1080fcdc86c952a49adce824573dbb3c0d3f94d519698968594e0b840b6c91ec9153aa8 +B = f6446ca2883d7e1739f832b931c590b74ce53dd29cb8fb2a03ec7286796f6dca7677c42f0a2c775cce1f344880433e3621bbf1076347c1be92579a4718d9756b + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1f219dbf1e789d4d74f10ff27fb947bf6cc94bf1e742ba203caf33810589005f8326704b8414819d90698fe08d9b3c16bd261beb922a9af9a5 +B = f6446ca2883d7e46423ca9be987c94112099ff4ab56434f1d7ae64e9ad319dd4ee17da5edcdaa5623a035b805598d513dce26a2b8418b933f92a4ef80c89a9b8 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 25bbd6ed7646662f6dd8481ac4c4a531174bcd05123889d4cf904d12d8d2bcad5425074d9c7fa1ba70ac5c8a3723fe6b20e064fb4a9999e716 +B = -f6446ca2883d7e4cdc75d8166645760a07d2278fc0c1a69c5a2f7814a3015267cf316c322696f333389a5d98c0b8f1f41faf13d50cdb0d97b3735eb07b889729 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -74af822547dd8aa99da2b3b60b1aa5d45c33cbbdca0d2876531b31a25cec244482832671c861b749effc1cf5e150aeb9d8e88583953aacd577 +B = -f6446ca2883d7db2711cc55842549cfe8cd656bfe176a128da96b5385d4f074523b2b6fc67b6015c906c9e33df5fed93773593bc982de89dea88dfd0a741da9c + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = d35d55e21fdf90fb0abaea71ae6d7f44401f615e7dc6761713ec45650b94c02f85e7bca8c2f43ada8975617eb7ae6fa41f4eadedaeb544654f +B = f6446ca2883d7d53c3490880404e4b91749f9b1c8e9d3144ef011484a4016684529ef44dbf1a16592bd667394cdc5cf9fdf10ae63a6cfe57846075b72caa4ac4 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -14872666f07cb43b47b4b82ef6df5b7696c2ff49a88ec9308e27d27736df05f79d452957297271756ca1afbc47ad011f1b77f32bbff831bb941 +B = f6446ca2883d7f6f930559a7eb22fb177b0cfc38f1d3def13e570d8b570a867abc0bccc74439bfb366288293682e8e4d8e4e4e18b8ee942e52411f65650a6954 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 2d2316a87167a23eff9da00b857c9423e44feb69620852e9e8d87ac70d96367a8947729b57804ab1d54022442f5504d23ea42a6cb0eddad04c3 +B = -f6446ca2883d80f9520971b69a033696098ac522c55eb3ca0d190922efa61c25c690ca32b741ee738abcc57445c254d77576cc933929c66115b52e74bf9bb4d6 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -4a296521345e531b059bd7bedbdee650280008947bb0de4012c11281d92be141b2d29b92812a4843eafc296fa69c55a697b4e9620a79fa8fd6d +B = -f6446ca2883d79848a4cd75a3aad9642720e1f0d0db773050dd92b475c937c6c2dbc3bc695c62ab1e9d9e7e99c92f8d3b0bb8f34238238fb847842be4245b2a6 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = a29d4661e53bde02d72f6e0e3d19ccbd85d8c0a0392d7153ed330ff11e6f75c9880dd1f77a89be8c4e48b10bc7b43b46fbffb592a9a2f23b932 +B = f6446ca2883d73fd4c38cc4c61ff192938a928f95f509d2782586f6f93623ec50de547725c7dad5e36739853a52e729ee841cd22a52832b6d7b538cbb2caf6e1 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1c7a1c6185b0a2d7c02f3a7884e5a11513785520f1a27e8c29cc30707300edbaaef99509e9c4f578d086b2a8c593d0a04d32682c7c71f6a3d025 +B = f6446ca2883d9aa13d007050c2b706cb6a0291b09d3188fd638364a4e903a7646f54cc5a4194f4d8a89cf9c13690080a25fb4f31b97cefa93b3adfd7d8928038 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 21eaee9881dff114d10dad6acbb6e712c6d1acc6b878ec60253c44ad7e9272bb5ab0e2ceb2023fa9f427a23ebb464b2c8c411bd86032c6873ef9 +B = -f6446ca2883da0120f376c8010f417a9dcf4d881e32f3c56bb292b7b56d7a2d48391d7ebc695a08ff661c1fe80c12bab159144e434092eb7eee6c398a875ef0c + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -46f16fa8b7a3b6ecf476f8cdf5f77ea3a7c9be958ced5db6c6a9e11e6bcf3a156b3fb60bd5ff862c80d7c3e3f23c15df57a8fd7822d4c7d9738a +B = -f6446ca2883d3735b0f632fc68f2522536bc16d37d78cdbb4fcce6150cc0b6ee5dc5ed8a19c4da9f5d8739fcbaeab6abaf6e9761d2fd4acdd59640911a153c89 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = bdd97dea2fd68c602862b0fdcbbe47d5e2e23ec1a10925cf34e9773d09d90caf70b5beed3ae1509392289be0ee66b649d45b3dc880ce4f48bb4c +B = f6446ca2883cc04da2b4bac9937f1e397e8c410cb44692a2cfa0d1f944a848aec7a74f80472ad52954a5d51af083a55ad7719b373292ce1b9545e29792a5f4c7 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -145dd43715b37e7df4b56e5afa79caff8668de6fe4c2f725866d0f84522682f38694a26bea588a576900862dee9c9498df909fe788d72db324f6f +B = f6446ca2883ec404641045d807be91f31539b467ac14dc12f560bf31dccfe46937297bc18312af293a51b584e68dc78bd6317367326a9b80d186f0d8bd20ff82 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 35094bde0256df169828d23a250e3a10f35f1fe30f168d463ccd8389197b8aaeb326ca86fd09b3d8a29769ac3c6ed856c34f10cb0d993e38252d5 +B = -f6446ca28840cebbde7f100e1148c929532c5dae9d2bab770c93646b3edb4a707775f111fec5784bbc02e0977ea160fa0e16508b6e48d767dfbf3cf9c57102e8 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -578294d2b3d43ffd19b79a65778710da245eb96fda50d50a3aa6ae3295dc50d8f7da1f5c8b98f4a9905ee840dcd139a62697eb45678259d7639ff +B = -f6446ca2883805fdd373ad5c200dab2289329459ee7a2f997764cdf519d3d32d5bbafb94464ac83d1dca566cf67e3194ef44bc8a4e7a38f81eb7eb4044787614 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = ab192cde88b1cb3e6b094409c1e81ff84715d64ddb7413f6fc5dc1182abfcaca481c8035d16e0d698476d7094f2bf7cb3de1b1210ba68701168a3 +B = f6446ca28832cc9452b65f836bf89607eeedee48fc980427a984bbc12b07b7bc2d61ad5ca735c4171035f91b6a7ef01602bd96de6c28c45bc0fda8fd71dd4770 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -19a7abdefad11d1c9b6c4e0c4c1ff1194c490f63086ede1e4c43d964555a2f5e561a9bf5dc3a670b7ddfe8894271197747860c78949e6c9e357460 +B = f6446ca2885725d2ff99bbbd3c7ab2ea3bd62cbc1568be94716ae1e088c3c171a339b388b230607b096f4a634c95176bfc94fab7602428834ba301d280242473 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 275ce169251250a596ac64ac6e23ae05f8785db63b9cb83a9dec067472d059ea3aef07cf9fc20b846b3292899a8d3fe1aed5b92f21a89c1d924bbd +B = -f6446ca28864db0889c3fcf0c575f300dbf830790214ede2c49e0fbaa515699eb35729b33e1534e6e332d207c5826a15fced16ddca8b783002300c01ff80fbd0 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -61039a571c78308b819da54c1849d8d6169a82e25f61f26e30ab16b545080417f2008ef89116e002660f95863c47ac02bc161bbb7aa8817457eade +B = -f6446ca287dc7a8cc982726f945da8f6e371c2f22605db022c03110ffc46d281899f51553be845501b01f91c3eb127eded1641f1e6208c5b1793bae46d96c535 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = fca0b32bf9e248320b8c10128ff4368a766dd34fbfbf77e66cb2298fa3833bbf24451f508a50afd0131ad49c9ac8e851d4fb53f2fe33675f5e6b34 +B = f6446ca28740dd73f4a50857edd3ba8c1cfa189471a607b1bea2b38a840acb6eaf40d61d94b600bfc308bf4c71041caed6b7c0b59707a722e0102ffe829044df + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1c6f81990e54d6894188d5b872009c3eb5b2f10137bf7a27999d918790b587594afab3950330296979c354851164f95938d1df77995f6c0a9a3edef +B = f6446ca28a047640b1843808b3f7d3f7b6aa168ee777a49521de6aa4e41156b0b7efb1cee889f11863c61292d8b36ccbc468d9337c69c06e4ca45a268b929e02 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 310b6086b85bf12c7e391184e070f623c9cfe07a8e495010fc13d584d748098f070ac4b7c31cbd28acd32ab6270e2a98f48d8d31525ada808858785 +B = -f6446ca28b4e342f8c24a9b2e7c2d7b47d911c2d38b9738cb74708037a38baf08c58d9f2444af22a8fc4dbcecbe46a2ed5c36c4778257b49e834110dea743798 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -4a51109cf8c033e683b1bff229f081d71cd5cafde15dc2d5f8ad0457e79b9b2e015659ee564de59f27204c685ef58977e13e19fe36a2d017fe6860b +B = -f6446ca283986d1d5112e761b7a42a9d0ceb04ad8a4f18d5304c96d50aecad52c06a9fa673c4e0402e2e31a24ea532bced6331066ac8c0d6efa4366462082a08 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = f3e425af6aa16899624f20b49c4e9115034aa4d06ce9db9aa742a6e60d59d6ce0a067f5645b8e7f896c8561315ef1f7151e073d115f8e38df274438 +B = f6446ca278ff3bcc29f4d41689ba5490e5c523b9abe7cb380793d548c0035329de0ebbec7339dde9af37817cb7aab22241f397a6d3be9b39c1aed52d02c76bdb + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -18b2de417fc4bef91b5dd82b0e93315b306bf3a7f7bf0a486a567e9cd1370587b7e47adcb9accba03a8dfda5871b0bb1bdb569a90c079f7a9a4e87d2 +B = f6446ca2a0f05c68a063a9993b3d1ec73e1d3e262c88692d06217d4ad4cdfc35101b5ee10bbec0bbcd3fdb9c7ba53528fa6d954fa6920c1fdf1602e07c3d37e5 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 26b556807e84a9bf7cdf2697050cbd7145a42b8ef6fe10666da7a2e69827ad04880bb97ab3108a27da5fcc29a041bd6aebbaf00ab25a841674ff9f1e +B = -f6446ca2aef2d4a79f23945f9cbe6d333496ca3c41c0a11405608368d81f207ed70c065ddbe5ff59c6a39a241b7703ad13944708d49792818568e77c56ee4f31 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -40b258c2211cc2cb9e2614ab4b23cb9eadb1ddcae903c93646e9f5e5afcaf912a2fdef26c864d83dcdd6f434ca2b0aa7f8ea7a21e790a9e4601de110 +B = -f6446ca2478b2564ff8227d481b931f0e466412c4e6a97ba255ea9cc238d87b28f196046b0dc56b84b2e37be7340434ea9277ef5eff22854eb7db98181d0cf03 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 97631efbd149bb0fdecce09d14aedf2efe30407c01c68e000be9c7be954999375e1f7720e8e5f1edfc48b92f9a063f6b2b378996459bffeae3d362e3 +B = f6446ca1f0da5f2b4f552f90411265ff1adb2d9bfdec35090c9be5025e8db5d9a99ac021f5bacebe2aad1e0e44ce7e53d94c4a32bda518e08d72637afe1b4d30 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -15f4c3634bbbd1ce04fdf96a69b2b8263290e188ca83956b74c6d190e7b877dbd176657a19ea125dfe9c95d2764002ca5d98e28315cb391779d56fcb2 +B = f6446ca3e789b45bdc5c07806fbedd42cab58f2e252a8e11b69bc9b9b6e496a6ba6bd7166b409d80b23435dc2ae094aad752b643c26acaa82fc1f4dd7f45acc5 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 39ecc3b285eb99a2ac91329da615e581f791eaebd477d87c7739dd961a2c5c6cf86a34c73856efcf3b812909d830186c910f8f053192cac9fca8ab7a3 +B = -f6446ca62709b94f7f5884cae8f2707690e864ea753b244255dffac9de1556f9e1aa2028da7d925299020ceff929c820f6541066f9d592c9ec3b1005ac7967b6 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -707e64f8bee7a679d9b72bd04b231cda716f5dc1b7a404f8c0679770c46fc944470ee2a221d1e3d166619ba6a430d0349e7e75c0ee021ed027dab5d74 +B = -f6446c9b80572e9b32248302846c89977d583f23e52699699422237663fe068bf7e7c514e2ec1bbcf674d2e5dafd7d193045865400f54667f2ec76636443529f + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 9ca2c37f4b1a392c34551f570ff06a74c5f027170815454c5ed3535d5232df54fb1f65f2304e32b4995bb77ccd4ece69db98452f182dbeda98d525a19 +B = f6446c98be1146326efb57dcda8d512b3083657e9d1a04148d0e1e3c7d4247c31bb66409a1e3e6bc0eafe4b2ab5bbfb69e65a3002f584f85503275bc549c55fa + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1190fea35b9a1ba1c280d57888664aa7db5f9d6d4325b35a6276bf61291d67e6e14e3001f5af1753faff61fa53861ab8ed15d15965e0dcb05718bdecc6 +B = f6446cb4193c2182baba8c62a0b4bf2495d4b4a65bb9e2c83415cd64e136dec15c4c403aa20a47d4c2aa63f7407931d6f96d428afeadfbdcb3eb13bcfaac9cd9 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 209797b717f068e5f808dd2b4e12576fa056879da881bfcc1819228e4f9dc6f84347edbdbe273657d533d7c928e51b68a82c59d93dfb038514c104c1bc +B = -f6446cc31fd5353f1107d09828bc71ea41e17c6b52a4132d90223f1a839a0be7dcab519c9bc8039d3ac967d174ef00ac586df24615367bb4ce11e87aa2f371cf + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -7198b6aa26be42e97cad682aaa63d68d51952dae52d4cfe5f9a6acef93f35b6d7b7be87a1f2a944cf7fa9483cd6c3df7599d44c5b56e5ff38cd43d23c0 +B = -f6446c30ef86d400625c012372771bf1cbb37f7966eec73239928d08c3ca8e044b88ebddd7f1cbbfe8fec3044682b3b6071492444b97dcc164ae6fd90db18c53 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = cb788549eee4fa559118f0bd66b68d94845bdb7d07b2042d53a64921f3e3df76a2b143e9e9ad39dacaf405cec5fed9fd59050c5d27322142e4e11d4ede +B = f6446bd70fb834383ba4950f06ee893578fc7846a040f87d5c5e45aec42e5ba45b04e2b6a2965bf5665935314d1168bd74788c44e3d0454fa0ed208100d16135 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1122c39c2c252ec96e9274bdf713bfa8200e35ed9f18dd087fedd2005e5898b6f8ed37e1cd7e1f7b0c5be137a71a27b7e4e4669b1f412e154e6ad2ad567 +B = f6446db4b47740e9738b8189472b260d6b848ecbdf7b4f769c32fb014797837dc86fc8e8275862b6f58ac0c1ff2ab1f515ce07ec2f46546ae5efb84c8f19857a + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 2d57e15c8039f8367d2e0198d9fc27616e53efdc9cb0adc0b0199362d08f5698af1f07499cd2b72005f1c09900c71b677e57cd62094743a9b3ae541e74d +B = -f6446f780653462ac0225272fff8d43bf20023b03b1a3f50193e7e0403adaaa1344de44b444edfac3f05105b5d20c78fe509018365b2c30b4748fea0c7309760 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -539b4413477ef77c15fd53e202d8e5d183eb1c91fecf5b89959bb8d60d3f7907e95c5dd045d698a6a17f0150861b43bfeb2e5d40bdc970839b0712ee17f +B = -f6446768d3fc49af312729404aa1266ea12cf48c4a53559818a9d9a8aeea1cc44753dac38dfd4181aa08a5e451022f21bf168aeb0308969a3c0629b570bfce94 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = fe46dc4f55346ee27d6ced0256b0ec64f82d5150c3b49d4cc7d56a60ae5d10bb649a57f4c97acc146388a6a9d25d3c3c7e42372e46bb4f8a72171ea5979 +B = f6445cbe1a7888d3d9b0c2c9510f213120c3bd4827076949c48da68513d172b26dd8a30fae5af94766d1c9c3b6ac9a5d9f8ec1b9c569be0b1e15bc447004569a + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1fbd702bd26d37bb1fa554ad261f1e7161ea438f49b41aab950884c5c87eb1e0b9a3a69807b759a1440ef9e5683c1a13b9d610fd87fb131619cb63997891 +B = f6448c5ff8695094585a0a45748c6cbb4dfb6eb53fabbf39290e080aef3d4616f0c512fcfa724d966d34540b3afc9fbf8d664373f9da2a71e6247d31458828a4 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 260abc8cb124b3c17698ee342bdbe4b1513a085effb4f79aca252c98c8799ad203dccc9c305cdccd2edc16159d0e2c7a125c50f8abff9e12dbe8d93c655d +B = -f64492ad44ca2f4bd46061390e137278143b5e05047b753a05fd3d2797104611d9b65d362076763bf0603ed8572cd4919fcc9bfa39d54e7671213f4ebb2b1570 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -6f961198d2039a92d24c53bfcafd73251b575d5e06565db36666545d5994e511c4c3905cc0b93586f05916c08b8f51a0e0fe1b6253fcfa41bfec25196482 +B = -f643fd0c76a4ac23860c1853cc1f7b9ebc64f1739ebe6f2eb0af0c9c161a240359d29495c37d8525de0c1fa32a56abf421b1a89fcd7a4e79d8cca379bcd54b91 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = ed86313f32aabf2f7487dd9f587431e17b9a46e1a78fe89b0ebe81c737a73c2a8fef92c0963fc36e9808309d00c3bd14612fdf4fb236e06add8fe9329252 +B = f6437f1c56fe4b7c616f7618423fee27fda89130b53acdf525c76443e8b045f102b9c969c119af9f502477f4107a36bfb63e286e098cf03ff2a385d5f8bc1dc1 + +Sum = f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -1741bce7ae27a7b3effa5b08b39f9d03d69efe7b0716cc57dc106aac17925a2d77c18386f7398db17f813c9c6f2dfcc9347e9f55de76b11475fcf77bbedb1 +B = f645e0be56b860a19bddea45d06a8095ffc776bae3cce6f1d3e034091538f6bde1bbd5718c49b977eeab08100ade2a633fe5d187de3a89e1e455c33559aa9dc4 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = 20bd41a0d6d691e8554ee8b90a775e04f086f318b7afdc7b5d6d7c3b7ab6b955aa286809856e1bd195dace84b18b2d0365edc8e066d2e8db9ae8325d00843 +B = -f6467876a24aeb903f243f8eab6fee120fd9153a2da7f082d61849da2e2f2903d43efbdfd4729cc0d0ac6da9296250364388e87a76e30fa560c811e907beb856 + +Sum = -f6446ca2883d7e27209eeaa01fdf469c2f8a0ccafc1c75850e6273026a777d983ee4595953da45df13930ffc411737837352899de8dca276d30e6365e1eeb013 +A = -685147a1e74dab824bc6cb7fb30a773fbe5e380f46189574038d2d2f3983ced8777a080af6b06e9bb3c2d134a3302fa099b4bc78a4f01a4c157424ee3c773 +B = -f63de78e0e1f094c687a2e3367e415f4bb8e26e77b2813fbb7223a2f9783e55b515ce1b8d32adad829d7d3cf2dcd04807948ee52215253752e4d0c23930ae8a0 + +Sum = 1 +A = 0 +B = 1 + +Sum = 2 +A = 1 +B = 1 + +Sum = 4 +A = 3 +B = 1 + +Sum = 8 +A = 7 +B = 1 + +Sum = 10 +A = f +B = 1 + +Sum = 20 +A = 1f +B = 1 + +Sum = 40 +A = 3f +B = 1 + +Sum = 80 +A = 7f +B = 1 + +Sum = 100 +A = ff +B = 1 + +Sum = 200 +A = 1ff +B = 1 + +Sum = 400 +A = 3ff +B = 1 + +Sum = 800 +A = 7ff +B = 1 + +Sum = 1000 +A = fff +B = 1 + +Sum = 2000 +A = 1fff +B = 1 + +Sum = 4000 +A = 3fff +B = 1 + +Sum = 8000 +A = 7fff +B = 1 + +Sum = 10000 +A = ffff +B = 1 + +Sum = 20000 +A = 1ffff +B = 1 + +Sum = 40000 +A = 3ffff +B = 1 + +Sum = 80000 +A = 7ffff +B = 1 + +Sum = 100000 +A = fffff +B = 1 + +Sum = 200000 +A = 1fffff +B = 1 + +Sum = 400000 +A = 3fffff +B = 1 + +Sum = 800000 +A = 7fffff +B = 1 + +Sum = 1000000 +A = ffffff +B = 1 + +Sum = 2000000 +A = 1ffffff +B = 1 + +Sum = 4000000 +A = 3ffffff +B = 1 + +Sum = 8000000 +A = 7ffffff +B = 1 + +Sum = 10000000 +A = fffffff +B = 1 + +Sum = 20000000 +A = 1fffffff +B = 1 + +Sum = 40000000 +A = 3fffffff +B = 1 + +Sum = 80000000 +A = 7fffffff +B = 1 + +Sum = 100000000 +A = ffffffff +B = 1 + +Sum = 200000000 +A = 1ffffffff +B = 1 + +Sum = 400000000 +A = 3ffffffff +B = 1 + +Sum = 800000000 +A = 7ffffffff +B = 1 + +Sum = 1000000000 +A = fffffffff +B = 1 + +Sum = 2000000000 +A = 1fffffffff +B = 1 + +Sum = 4000000000 +A = 3fffffffff +B = 1 + +Sum = 8000000000 +A = 7fffffffff +B = 1 + +Sum = 10000000000 +A = ffffffffff +B = 1 + +Sum = 20000000000 +A = 1ffffffffff +B = 1 + +Sum = 40000000000 +A = 3ffffffffff +B = 1 + +Sum = 80000000000 +A = 7ffffffffff +B = 1 + +Sum = 100000000000 +A = fffffffffff +B = 1 + +Sum = 200000000000 +A = 1fffffffffff +B = 1 + +Sum = 400000000000 +A = 3fffffffffff +B = 1 + +Sum = 800000000000 +A = 7fffffffffff +B = 1 + +Sum = 1000000000000 +A = ffffffffffff +B = 1 + +Sum = 2000000000000 +A = 1ffffffffffff +B = 1 + +Sum = 4000000000000 +A = 3ffffffffffff +B = 1 + +Sum = 8000000000000 +A = 7ffffffffffff +B = 1 + +Sum = 10000000000000 +A = fffffffffffff +B = 1 + +Sum = 20000000000000 +A = 1fffffffffffff +B = 1 + +Sum = 40000000000000 +A = 3fffffffffffff +B = 1 + +Sum = 80000000000000 +A = 7fffffffffffff +B = 1 + +Sum = 100000000000000 +A = ffffffffffffff +B = 1 + +Sum = 200000000000000 +A = 1ffffffffffffff +B = 1 + +Sum = 400000000000000 +A = 3ffffffffffffff +B = 1 + +Sum = 800000000000000 +A = 7ffffffffffffff +B = 1 + +Sum = 1000000000000000 +A = fffffffffffffff +B = 1 + +Sum = 2000000000000000 +A = 1fffffffffffffff +B = 1 + +Sum = 4000000000000000 +A = 3fffffffffffffff +B = 1 + +Sum = 8000000000000000 +A = 7fffffffffffffff +B = 1 + +Sum = 10000000000000000 +A = ffffffffffffffff +B = 1 + +Sum = 20000000000000000 +A = 1ffffffffffffffff +B = 1 + +Sum = 40000000000000000 +A = 3ffffffffffffffff +B = 1 + +Sum = 80000000000000000 +A = 7ffffffffffffffff +B = 1 + +Sum = 100000000000000000 +A = fffffffffffffffff +B = 1 + +Sum = 200000000000000000 +A = 1fffffffffffffffff +B = 1 + +Sum = 400000000000000000 +A = 3fffffffffffffffff +B = 1 + +Sum = 800000000000000000 +A = 7fffffffffffffffff +B = 1 + +Sum = 1000000000000000000 +A = ffffffffffffffffff +B = 1 + +Sum = 2000000000000000000 +A = 1ffffffffffffffffff +B = 1 + +Sum = 4000000000000000000 +A = 3ffffffffffffffffff +B = 1 + +Sum = 8000000000000000000 +A = 7ffffffffffffffffff +B = 1 + +Sum = 10000000000000000000 +A = fffffffffffffffffff +B = 1 + +Sum = 20000000000000000000 +A = 1fffffffffffffffffff +B = 1 + +Sum = 40000000000000000000 +A = 3fffffffffffffffffff +B = 1 + +Sum = 80000000000000000000 +A = 7fffffffffffffffffff +B = 1 + +Sum = 100000000000000000000 +A = ffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000 +A = 1ffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000 +A = 3ffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000 +A = 7ffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000 +A = fffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000 +A = 1fffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000 +A = 3fffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000 +A = 7fffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000 +A = ffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000 +A = 1ffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000 +A = 3ffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000 +A = 7ffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000 +A = fffffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000000 +A = 1fffffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000000 +A = 3fffffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000000 +A = 7fffffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000000 +A = ffffffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000000 +A = 1ffffffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000000 +A = 3ffffffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000000 +A = 7ffffffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000000 +A = fffffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000000 +A = 1fffffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000000 +A = 3fffffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000000 +A = 7fffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000 +A = ffffffffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000000000 +A = 1ffffffffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000000000 +A = 3ffffffffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000000000 +A = 7ffffffffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000000000 +A = fffffffffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000000000 +A = 1fffffffffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000000000 +A = 3fffffffffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000000000 +A = 7fffffffffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000000000 +A = ffffffffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000000000 +A = 1ffffffffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000000000 +A = 3ffffffffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000000000 +A = 7ffffffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000000 +A = fffffffffffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000000000000 +A = 1fffffffffffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000000000000 +A = 3fffffffffffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000000000000 +A = 7fffffffffffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000000000000 +A = ffffffffffffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000000000000 +A = fffffffffffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 200000000000000000000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 400000000000000000000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 800000000000000000000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 1000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 2000000000000000000000000000000000000000000000000 +A = 1ffffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 4000000000000000000000000000000000000000000000000 +A = 3ffffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 8000000000000000000000000000000000000000000000000 +A = 7ffffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 10000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 20000000000000000000000000000000000000000000000000 +A = 1fffffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 40000000000000000000000000000000000000000000000000 +A = 3fffffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 80000000000000000000000000000000000000000000000000 +A = 7fffffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffffffff +B = 1 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffe +B = 2 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffffc +B = 4 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffff8 +B = 8 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffff0 +B = 10 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffffffe0 +B = 20 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffffffc0 +B = 40 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffffff80 +B = 80 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffffff00 +B = 100 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffe00 +B = 200 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffffc00 +B = 400 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffff800 +B = 800 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffff000 +B = 1000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffffe000 +B = 2000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffffc000 +B = 4000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffff8000 +B = 8000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffff0000 +B = 10000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffe0000 +B = 20000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffffc0000 +B = 40000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffff80000 +B = 80000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffff00000 +B = 100000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffe00000 +B = 200000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffffc00000 +B = 400000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffff800000 +B = 800000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffff000000 +B = 1000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffe000000 +B = 2000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffffc000000 +B = 4000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffff8000000 +B = 8000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffff0000000 +B = 10000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffe0000000 +B = 20000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffffc0000000 +B = 40000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffff80000000 +B = 80000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffff00000000 +B = 100000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffe00000000 +B = 200000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffffc00000000 +B = 400000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffff800000000 +B = 800000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffff000000000 +B = 1000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffe000000000 +B = 2000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffffc000000000 +B = 4000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffff8000000000 +B = 8000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffff0000000000 +B = 10000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffe0000000000 +B = 20000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffffc0000000000 +B = 40000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffff80000000000 +B = 80000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffff00000000000 +B = 100000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffe00000000000 +B = 200000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffffc00000000000 +B = 400000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffff800000000000 +B = 800000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffff000000000000 +B = 1000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffe000000000000 +B = 2000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffffc000000000000 +B = 4000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffff8000000000000 +B = 8000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffff0000000000000 +B = 10000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffe0000000000000 +B = 20000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffffc0000000000000 +B = 40000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffff80000000000000 +B = 80000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffff00000000000000 +B = 100000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffe00000000000000 +B = 200000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffffc00000000000000 +B = 400000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffff800000000000000 +B = 800000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffff000000000000000 +B = 1000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffe000000000000000 +B = 2000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffffc000000000000000 +B = 4000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffff8000000000000000 +B = 8000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffff0000000000000000 +B = 10000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffe0000000000000000 +B = 20000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffffc0000000000000000 +B = 40000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffff80000000000000000 +B = 80000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffff00000000000000000 +B = 100000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffe00000000000000000 +B = 200000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffffc00000000000000000 +B = 400000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffff800000000000000000 +B = 800000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffff000000000000000000 +B = 1000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffe000000000000000000 +B = 2000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffffc000000000000000000 +B = 4000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffff8000000000000000000 +B = 8000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffff0000000000000000000 +B = 10000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffe0000000000000000000 +B = 20000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffffc0000000000000000000 +B = 40000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffff80000000000000000000 +B = 80000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffff00000000000000000000 +B = 100000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffe00000000000000000000 +B = 200000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffffc00000000000000000000 +B = 400000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffff800000000000000000000 +B = 800000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffff000000000000000000000 +B = 1000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffe000000000000000000000 +B = 2000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffffc000000000000000000000 +B = 4000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffff8000000000000000000000 +B = 8000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffff0000000000000000000000 +B = 10000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffe0000000000000000000000 +B = 20000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffffc0000000000000000000000 +B = 40000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffff80000000000000000000000 +B = 80000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffff00000000000000000000000 +B = 100000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffe00000000000000000000000 +B = 200000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffffc00000000000000000000000 +B = 400000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffff800000000000000000000000 +B = 800000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffff000000000000000000000000 +B = 1000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffe000000000000000000000000 +B = 2000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffffc000000000000000000000000 +B = 4000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffff8000000000000000000000000 +B = 8000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffff0000000000000000000000000 +B = 10000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffe0000000000000000000000000 +B = 20000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffffc0000000000000000000000000 +B = 40000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffff80000000000000000000000000 +B = 80000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffff00000000000000000000000000 +B = 100000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffe00000000000000000000000000 +B = 200000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffffc00000000000000000000000000 +B = 400000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffff800000000000000000000000000 +B = 800000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffff000000000000000000000000000 +B = 1000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffe000000000000000000000000000 +B = 2000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffffc000000000000000000000000000 +B = 4000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffff8000000000000000000000000000 +B = 8000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffff0000000000000000000000000000 +B = 10000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffe0000000000000000000000000000 +B = 20000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffffc0000000000000000000000000000 +B = 40000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffff80000000000000000000000000000 +B = 80000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffff00000000000000000000000000000 +B = 100000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffe00000000000000000000000000000 +B = 200000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffffc00000000000000000000000000000 +B = 400000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffff800000000000000000000000000000 +B = 800000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffff000000000000000000000000000000 +B = 1000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffe000000000000000000000000000000 +B = 2000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffffc000000000000000000000000000000 +B = 4000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffff8000000000000000000000000000000 +B = 8000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffff0000000000000000000000000000000 +B = 10000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffe0000000000000000000000000000000 +B = 20000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffffc0000000000000000000000000000000 +B = 40000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffff80000000000000000000000000000000 +B = 80000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffff00000000000000000000000000000000 +B = 100000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffe00000000000000000000000000000000 +B = 200000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffffc00000000000000000000000000000000 +B = 400000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffff800000000000000000000000000000000 +B = 800000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffff000000000000000000000000000000000 +B = 1000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffe000000000000000000000000000000000 +B = 2000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffffc000000000000000000000000000000000 +B = 4000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffff8000000000000000000000000000000000 +B = 8000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffff0000000000000000000000000000000000 +B = 10000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffe0000000000000000000000000000000000 +B = 20000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffffc0000000000000000000000000000000000 +B = 40000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffff80000000000000000000000000000000000 +B = 80000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffff00000000000000000000000000000000000 +B = 100000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffe00000000000000000000000000000000000 +B = 200000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffffc00000000000000000000000000000000000 +B = 400000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffff800000000000000000000000000000000000 +B = 800000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffff000000000000000000000000000000000000 +B = 1000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffe000000000000000000000000000000000000 +B = 2000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffffc000000000000000000000000000000000000 +B = 4000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffff8000000000000000000000000000000000000 +B = 8000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffff0000000000000000000000000000000000000 +B = 10000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffe0000000000000000000000000000000000000 +B = 20000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffffc0000000000000000000000000000000000000 +B = 40000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffff80000000000000000000000000000000000000 +B = 80000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffff00000000000000000000000000000000000000 +B = 100000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffe00000000000000000000000000000000000000 +B = 200000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffffc00000000000000000000000000000000000000 +B = 400000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffff800000000000000000000000000000000000000 +B = 800000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffff000000000000000000000000000000000000000 +B = 1000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffe000000000000000000000000000000000000000 +B = 2000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffffc000000000000000000000000000000000000000 +B = 4000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffff8000000000000000000000000000000000000000 +B = 8000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffff0000000000000000000000000000000000000000 +B = 10000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffe0000000000000000000000000000000000000000 +B = 20000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffffc0000000000000000000000000000000000000000 +B = 40000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffff80000000000000000000000000000000000000000 +B = 80000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffff00000000000000000000000000000000000000000 +B = 100000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffe00000000000000000000000000000000000000000 +B = 200000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffffc00000000000000000000000000000000000000000 +B = 400000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffff800000000000000000000000000000000000000000 +B = 800000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffff000000000000000000000000000000000000000000 +B = 1000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffe000000000000000000000000000000000000000000 +B = 2000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffffc000000000000000000000000000000000000000000 +B = 4000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffff8000000000000000000000000000000000000000000 +B = 8000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffff0000000000000000000000000000000000000000000 +B = 10000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffe0000000000000000000000000000000000000000000 +B = 20000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffffc0000000000000000000000000000000000000000000 +B = 40000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffff80000000000000000000000000000000000000000000 +B = 80000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffff00000000000000000000000000000000000000000000 +B = 100000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffe00000000000000000000000000000000000000000000 +B = 200000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffffc00000000000000000000000000000000000000000000 +B = 400000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffff800000000000000000000000000000000000000000000 +B = 800000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffff000000000000000000000000000000000000000000000 +B = 1000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffe000000000000000000000000000000000000000000000 +B = 2000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffffc000000000000000000000000000000000000000000000 +B = 4000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffff8000000000000000000000000000000000000000000000 +B = 8000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffff0000000000000000000000000000000000000000000000 +B = 10000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffe0000000000000000000000000000000000000000000000 +B = 20000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fffc0000000000000000000000000000000000000000000000 +B = 40000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fff80000000000000000000000000000000000000000000000 +B = 80000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fff00000000000000000000000000000000000000000000000 +B = 100000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffe00000000000000000000000000000000000000000000000 +B = 200000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ffc00000000000000000000000000000000000000000000000 +B = 400000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ff800000000000000000000000000000000000000000000000 +B = 800000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = ff000000000000000000000000000000000000000000000000 +B = 1000000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fe000000000000000000000000000000000000000000000000 +B = 2000000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = fc000000000000000000000000000000000000000000000000 +B = 4000000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = f8000000000000000000000000000000000000000000000000 +B = 8000000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = f0000000000000000000000000000000000000000000000000 +B = 10000000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = e0000000000000000000000000000000000000000000000000 +B = 20000000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = c0000000000000000000000000000000000000000000000000 +B = 40000000000000000000000000000000000000000000000000 + +Sum = 100000000000000000000000000000000000000000000000000 +A = 80000000000000000000000000000000000000000000000000 +B = 80000000000000000000000000000000000000000000000000 diff --git a/third_party/boringssl/src/crypto/fipsmodule/cipher/cipher.c b/third_party/boringssl/src/crypto/fipsmodule/cipher/cipher.c index ee455784a79c..18b5e0a5e9bd 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/cipher/cipher.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.c b/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.c index 5f237934209f..0db77b846b5a 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.c +++ b/third_party/boringssl/src/crypto/fipsmodule/cipher/e_aes.c @@ -529,11 +529,10 @@ static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) { if (gctx->iv == c->iv) { gctx_out->iv = out->iv; } else { - gctx_out->iv = OPENSSL_malloc(gctx->ivlen); + gctx_out->iv = OPENSSL_memdup(gctx->iv, gctx->ivlen); if (!gctx_out->iv) { return 0; } - OPENSSL_memcpy(gctx_out->iv, gctx->iv, gctx->ivlen); } return 1; } @@ -1469,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/third_party/boringssl/src/crypto/fipsmodule/dh/dh.c b/third_party/boringssl/src/crypto/fipsmodule/dh/dh.c index 11dbfc2990d5..83435118a044 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/dh/dh.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/digest/digest.c b/third_party/boringssl/src/crypto/fipsmodule/digest/digest.c index cb723d6c8baf..f499c468ff3a 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/digest/digest.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl b/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl index 0d628e73c152..95dc4c888147 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-armv8-asm.pl +++ b/third_party/boringssl/src/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] @@ -1365,7 +1388,7 @@ //////////////////////////////////////////////////////////////////////// // void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4], -// int rep); +// uint64_t rep); .globl ecp_nistz256_ord_sqr_mont .type ecp_nistz256_ord_sqr_mont,%function .align 4 @@ -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] diff --git a/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl b/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl index c75d7845a7f3..0701996dfb92 100755 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/ec/ec.c b/third_party/boringssl/src/crypto/fipsmodule/ec/ec.c index 4e632e1971fb..61ecc1f337a8 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/ec.c +++ b/third_party/boringssl/src/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; } @@ -1195,7 +1192,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); diff --git a/third_party/boringssl/src/crypto/fipsmodule/ec/ec_key.c b/third_party/boringssl/src/crypto/fipsmodule/ec/ec_key.c index e676e3c0504f..e427e3c5df41 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/ec_key.c +++ b/third_party/boringssl/src/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); @@ -247,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; } @@ -394,14 +392,73 @@ int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, const BIGNUM *x, return ok; } +int EC_KEY_oct2key(EC_KEY *key, const uint8_t *in, size_t len, BN_CTX *ctx) { + if (key->group == NULL) { + OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); + return 0; + } + + EC_POINT *point = EC_POINT_new(key->group); + int ok = point != NULL && + EC_POINT_oct2point(key->group, point, in, len, ctx) && + EC_KEY_set_public_key(key, point); + EC_POINT_free(point); + return ok; +} + size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form, - unsigned char **out_buf, BN_CTX *ctx) { + uint8_t **out_buf, BN_CTX *ctx) { if (key == NULL || key->pub_key == NULL || key->group == NULL) { + OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); + return 0; + } + + return EC_POINT_point2buf(key->group, key->pub_key, form, out_buf, ctx); +} + +int EC_KEY_oct2priv(EC_KEY *key, const uint8_t *in, size_t len) { + if (key->group == NULL) { + OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); + return 0; + } + + if (len != BN_num_bytes(EC_GROUP_get0_order(key->group))) { + OPENSSL_PUT_ERROR(EC, EC_R_DECODE_ERROR); + return 0; + } + + BIGNUM *priv_key = BN_bin2bn(in, len, NULL); + int ok = priv_key != NULL && // + EC_KEY_set_private_key(key, priv_key); + BN_free(priv_key); + return ok; +} + +size_t EC_KEY_priv2oct(const EC_KEY *key, uint8_t *out, size_t max_out) { + if (key->group == NULL || key->priv_key == NULL) { + OPENSSL_PUT_ERROR(EC, EC_R_MISSING_PARAMETERS); return 0; } - const size_t len = - EC_POINT_point2oct(key->group, key->pub_key, form, NULL, 0, ctx); + size_t len = BN_num_bytes(EC_GROUP_get0_order(key->group)); + if (out == NULL) { + return len; + } + + if (max_out < len) { + OPENSSL_PUT_ERROR(EC, EC_R_BUFFER_TOO_SMALL); + return 0; + } + + size_t bytes_written; + ec_scalar_to_bytes(key->group, out, &bytes_written, &key->priv_key->scalar); + assert(bytes_written == len); + return len; +} + +size_t EC_KEY_priv2buf(const EC_KEY *key, uint8_t **out_buf) { + *out_buf = NULL; + size_t len = EC_KEY_priv2oct(key, NULL, 0); if (len == 0) { return 0; } @@ -411,8 +468,8 @@ size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form, return 0; } - if (EC_POINT_point2oct(key->group, key->pub_key, form, buf, len, ctx) != - len) { + len = EC_KEY_priv2oct(key, buf, len); + if (len == 0) { OPENSSL_free(buf); return 0; } diff --git a/third_party/boringssl/src/crypto/fipsmodule/ec/ec_montgomery.c b/third_party/boringssl/src/crypto/fipsmodule/ec/ec_montgomery.c index 21d5d40d9810..f458df9c74a2 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/ec_montgomery.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/ec/ec_test.cc b/third_party/boringssl/src/crypto/fipsmodule/ec/ec_test.cc index edcfeaac0a16..9ccc54b72b6e 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/ec_test.cc +++ b/third_party/boringssl/src/crypto/fipsmodule/ec/ec_test.cc @@ -105,6 +105,20 @@ static const uint8_t kECKeyWithZeros[] = { 0x37, 0xbf, 0x51, 0xf5, }; +static const uint8_t kECKeyWithZerosPublic[] = { + 0x04, 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, + 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2, 0x77, 0x03, 0x7d, 0x81, 0x2d, + 0xeb, 0x33, 0xa0, 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96, + 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7, 0xeb, + 0x4a, 0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, + 0x5e, 0xce, 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5, +}; + +static const uint8_t kECKeyWithZerosRawPrivate[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; + // DecodeECPrivateKey decodes |in| as an ECPrivateKey structure and returns the // result or nullptr on error. static bssl::UniquePtr DecodeECPrivateKey(const uint8_t *in, @@ -191,11 +205,52 @@ TEST(ECTest, ZeroPadding) { EXPECT_TRUE(EncodeECPrivateKey(&out, key.get())); EXPECT_EQ(Bytes(kECKeyWithZeros), Bytes(out.data(), out.size())); + // Check the private key encodes correctly, including with the leading zeros. + EXPECT_EQ(32u, EC_KEY_priv2oct(key.get(), nullptr, 0)); + uint8_t buf[32]; + ASSERT_EQ(32u, EC_KEY_priv2oct(key.get(), buf, sizeof(buf))); + EXPECT_EQ(Bytes(buf), Bytes(kECKeyWithZerosRawPrivate)); + + // Buffer too small. + EXPECT_EQ(0u, EC_KEY_priv2oct(key.get(), buf, sizeof(buf) - 1)); + + // Extra space in buffer. + uint8_t large_buf[33]; + ASSERT_EQ(32u, EC_KEY_priv2oct(key.get(), large_buf, sizeof(large_buf))); + EXPECT_EQ(Bytes(buf), Bytes(kECKeyWithZerosRawPrivate)); + + // Allocating API. + uint8_t *buf_alloc; + size_t len = EC_KEY_priv2buf(key.get(), &buf_alloc); + ASSERT_GT(len, 0u); + bssl::UniquePtr free_buf_alloc(buf_alloc); + EXPECT_EQ(Bytes(buf_alloc, len), Bytes(kECKeyWithZerosRawPrivate)); + // Keys without leading zeros also parse, but they encode correctly. key = DecodeECPrivateKey(kECKeyMissingZeros, sizeof(kECKeyMissingZeros)); ASSERT_TRUE(key); EXPECT_TRUE(EncodeECPrivateKey(&out, key.get())); EXPECT_EQ(Bytes(kECKeyWithZeros), Bytes(out.data(), out.size())); + + // Test the key can be constructed with |EC_KEY_oct2*|. + key.reset(EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + ASSERT_TRUE(key); + ASSERT_TRUE(EC_KEY_oct2key(key.get(), kECKeyWithZerosPublic, + sizeof(kECKeyWithZerosPublic), nullptr)); + ASSERT_TRUE(EC_KEY_oct2priv(key.get(), kECKeyWithZerosRawPrivate, + sizeof(kECKeyWithZerosRawPrivate))); + EXPECT_TRUE(EncodeECPrivateKey(&out, key.get())); + EXPECT_EQ(Bytes(kECKeyWithZeros), Bytes(out.data(), out.size())); + + // |EC_KEY_oct2priv|'s format is fixed-width and must match the group order. + key.reset(EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + ASSERT_TRUE(key); + EXPECT_FALSE(EC_KEY_oct2priv(key.get(), kECKeyWithZerosRawPrivate + 1, + sizeof(kECKeyWithZerosRawPrivate) - 1)); + uint8_t padded[sizeof(kECKeyWithZerosRawPrivate) + 1] = {0}; + memcpy(padded + 1, kECKeyWithZerosRawPrivate, + sizeof(kECKeyWithZerosRawPrivate)); + EXPECT_FALSE(EC_KEY_oct2priv(key.get(), padded, sizeof(padded))); } TEST(ECTest, SpecifiedCurve) { @@ -474,12 +529,12 @@ TEST(ECTest, BrainpoolP256r1) { EXPECT_EQ(0, BN_cmp(y.get(), qy.get())); } -class ECCurveTest : public testing::TestWithParam { +class ECCurveTest : public testing::TestWithParam { public: const EC_GROUP *group() const { return group_.get(); } void SetUp() override { - group_.reset(EC_GROUP_new_by_curve_name(GetParam().nid)); + group_.reset(EC_GROUP_new_by_curve_name(GetParam())); ASSERT_TRUE(group_); } @@ -489,7 +544,7 @@ class ECCurveTest : public testing::TestWithParam { TEST_P(ECCurveTest, SetAffine) { // Generate an EC_KEY. - bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam().nid)); + bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam())); ASSERT_TRUE(key); ASSERT_TRUE(EC_KEY_generate_key(key.get())); @@ -531,7 +586,7 @@ TEST_P(ECCurveTest, SetAffine) { } TEST_P(ECCurveTest, IsOnCurve) { - bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam().nid)); + bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam())); ASSERT_TRUE(key); ASSERT_TRUE(EC_KEY_generate_key(key.get())); @@ -555,12 +610,12 @@ TEST_P(ECCurveTest, IsOnCurve) { } TEST_P(ECCurveTest, Compare) { - bssl::UniquePtr key1(EC_KEY_new_by_curve_name(GetParam().nid)); + bssl::UniquePtr key1(EC_KEY_new_by_curve_name(GetParam())); ASSERT_TRUE(key1); ASSERT_TRUE(EC_KEY_generate_key(key1.get())); const EC_POINT *pub1 = EC_KEY_get0_public_key(key1.get()); - bssl::UniquePtr key2(EC_KEY_new_by_curve_name(GetParam().nid)); + bssl::UniquePtr key2(EC_KEY_new_by_curve_name(GetParam())); ASSERT_TRUE(key2); ASSERT_TRUE(EC_KEY_generate_key(key2.get())); const EC_POINT *pub2 = EC_KEY_get0_public_key(key2.get()); @@ -601,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)); @@ -610,13 +666,13 @@ TEST_P(ECCurveTest, Compare) { TEST_P(ECCurveTest, GenerateFIPS) { // Generate an EC_KEY. - bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam().nid)); + bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam())); ASSERT_TRUE(key); ASSERT_TRUE(EC_KEY_generate_key_fips(key.get())); } TEST_P(ECCurveTest, AddingEqualPoints) { - bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam().nid)); + bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam())); ASSERT_TRUE(key); ASSERT_TRUE(EC_KEY_generate_key(key.get())); @@ -785,11 +841,11 @@ TEST_P(ECCurveTest, MulNonMinimal) { // Test that EC_KEY_set_private_key rejects invalid values. TEST_P(ECCurveTest, SetInvalidPrivateKey) { - bssl::UniquePtr key(EC_KEY_new_by_curve_name(GetParam().nid)); + 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"; @@ -800,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) { @@ -882,26 +943,53 @@ 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())); } -static std::vector AllCurves() { +// Test that we refuse to encode or decode the point at infinity. +TEST_P(ECCurveTest, EncodeInfinity) { + // The point at infinity is encoded as a single zero byte, but we do not + // support it. + static const uint8_t kInfinity[] = {0}; + bssl::UniquePtr inf(EC_POINT_new(group())); + ASSERT_TRUE(inf); + EXPECT_FALSE(EC_POINT_oct2point(group(), inf.get(), kInfinity, + sizeof(kInfinity), nullptr)); + + // Encoding it also fails. + ASSERT_TRUE(EC_POINT_set_to_infinity(group(), inf.get())); + uint8_t buf[128]; + EXPECT_EQ( + 0u, EC_POINT_point2oct(group(), inf.get(), POINT_CONVERSION_UNCOMPRESSED, + buf, sizeof(buf), nullptr)); + + // Measuring the length of the encoding also fails. + EXPECT_EQ( + 0u, EC_POINT_point2oct(group(), inf.get(), POINT_CONVERSION_UNCOMPRESSED, + nullptr, 0, nullptr)); +} + +static std::vector AllCurves() { const size_t num_curves = EC_get_builtin_curves(nullptr, 0); std::vector curves(num_curves); EC_get_builtin_curves(curves.data(), num_curves); - return curves; + std::vector nids; + for (const auto& curve : curves) { + nids.push_back(curve.nid); + } + return nids; } -static std::string CurveToString( - const testing::TestParamInfo ¶ms) { - // The comment field contains characters GTest rejects, so use the OBJ name. - return OBJ_nid2sn(params.param.nid); +static std::string CurveToString(const testing::TestParamInfo ¶ms) { + return OBJ_nid2sn(params.param); } INSTANTIATE_TEST_SUITE_P(All, ECCurveTest, testing::ValuesIn(AllCurves()), @@ -1124,8 +1212,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; @@ -1135,26 +1233,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" @@ -1181,7 +1324,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))); @@ -1198,11 +1341,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. + EXPECT_FALSE(ec_hash_to_curve_p384_xmd_sha384_sswu( + p384.get(), &raw, nullptr, 0, kMessage, sizeof(kMessage))); } TEST(ECTest, HashToScalar) { diff --git a/third_party/boringssl/src/crypto/fipsmodule/ec/internal.h b/third_party/boringssl/src/crypto/fipsmodule/ec/internal.h index f6c8e8a63b66..3b6fa4a4b050 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/internal.h +++ b/third_party/boringssl/src/crypto/fipsmodule/ec/internal.h @@ -91,6 +91,8 @@ extern "C" { // be the largest fields anyone plausibly uses. #define EC_MAX_BYTES 66 #define EC_MAX_WORDS ((EC_MAX_BYTES + BN_BYTES - 1) / BN_BYTES) +#define EC_MAX_COMPRESSED (EC_MAX_BYTES + 1) +#define EC_MAX_UNCOMPRESSED (2 * EC_MAX_BYTES + 1) static_assert(EC_MAX_WORDS <= BN_SMALL_MAX_WORDS, "bn_*_small functions not usable"); @@ -119,8 +121,8 @@ OPENSSL_EXPORT void ec_scalar_to_bytes(const EC_GROUP *group, uint8_t *out, // ec_scalar_from_bytes deserializes |in| and stores the resulting scalar over // group |group| to |out|. It returns one on success and zero if |in| is // invalid. -int ec_scalar_from_bytes(const EC_GROUP *group, EC_SCALAR *out, - const uint8_t *in, size_t len); +OPENSSL_EXPORT int ec_scalar_from_bytes(const EC_GROUP *group, EC_SCALAR *out, + const uint8_t *in, size_t len); // ec_scalar_reduce sets |out| to |words|, reduced modulo the group order. // |words| must be less than order^2. |num| must be at most twice the width of @@ -279,8 +281,8 @@ void ec_affine_to_jacobian(const EC_GROUP *group, EC_RAW_POINT *out, // // If only extracting the x-coordinate, use |ec_get_x_coordinate_*| which is // slightly faster. -int ec_jacobian_to_affine(const EC_GROUP *group, EC_AFFINE *out, - const EC_RAW_POINT *p); +OPENSSL_EXPORT int ec_jacobian_to_affine(const EC_GROUP *group, EC_AFFINE *out, + const EC_RAW_POINT *p); // ec_jacobian_to_affine_batch converts |num| points in |in| from Jacobian // coordinates to affine coordinates and writes the results to |out|. It returns @@ -439,11 +441,18 @@ int ec_get_x_coordinate_as_bytes(const EC_GROUP *group, uint8_t *out, size_t *out_len, size_t max_out, const EC_RAW_POINT *p); -// ec_point_to_bytes behaves like |EC_POINT_point2oct| but takes an -// |EC_AFFINE|. +// ec_point_byte_len returns the number of bytes in the byte representation of +// a non-infinity point in |group|, encoded according to |form|, or zero if +// |form| is invalid. +size_t ec_point_byte_len(const EC_GROUP *group, point_conversion_form_t form); + +// ec_point_to_bytes encodes |point| according to |form| and writes the result +// |buf|. It returns the size of the output on success or zero on error. At most +// |max_out| bytes will be written. The buffer should be at least +// |ec_point_byte_len| long to guarantee success. size_t ec_point_to_bytes(const EC_GROUP *group, const EC_AFFINE *point, point_conversion_form_t form, uint8_t *buf, - size_t len); + size_t max_out); // ec_point_from_uncompressed parses |in| as a point in uncompressed form and // sets the result to |out|. It returns one on success and zero if the input was @@ -553,6 +562,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); @@ -643,6 +658,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/third_party/boringssl/src/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go b/third_party/boringssl/src/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go index 716da55b7733..1d3896aa988f 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/make_ec_scalar_base_mult_tests.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/ec/make_p256-nistz-tests.go b/third_party/boringssl/src/crypto/fipsmodule/ec/make_p256-nistz-tests.go index 36194e61b437..e10990b30ef0 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/make_p256-nistz-tests.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/ec/make_tables.go b/third_party/boringssl/src/crypto/fipsmodule/ec/make_tables.go index dbcaab06f6f2..120c40bd5a44 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/make_tables.go +++ b/third_party/boringssl/src/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 @@ -151,7 +153,7 @@ func writeP256Table(path string) error { // Tables for other points have table[i] = iG for i in 0 .. 16. // fiat_p256_g_pre_comp is the table of precomputed base points -#if defined(BORINGSSL_NISTP256_64BIT) +#if defined(OPENSSL_64_BIT) static const fiat_p256_felem fiat_p256_g_pre_comp[2][15][2] = ` if _, err := f.WriteString(fileHeader); err != nil { return err diff --git a/third_party/boringssl/src/crypto/fipsmodule/ec/oct.c b/third_party/boringssl/src/crypto/fipsmodule/ec/oct.c index ddd0f37a197c..eb77643cf754 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/oct.c +++ b/third_party/boringssl/src/crypto/fipsmodule/ec/oct.c @@ -73,9 +73,7 @@ #include "internal.h" -size_t ec_point_to_bytes(const EC_GROUP *group, const EC_AFFINE *point, - point_conversion_form_t form, uint8_t *buf, - size_t len) { +size_t ec_point_byte_len(const EC_GROUP *group, point_conversion_form_t form) { if (form != POINT_CONVERSION_COMPRESSED && form != POINT_CONVERSION_UNCOMPRESSED) { OPENSSL_PUT_ERROR(EC, EC_R_INVALID_FORM); @@ -88,27 +86,30 @@ size_t ec_point_to_bytes(const EC_GROUP *group, const EC_AFFINE *point, // Uncompressed points have a second coordinate. output_len += field_len; } + return output_len; +} - // if 'buf' is NULL, just return required length - if (buf != NULL) { - if (len < output_len) { - OPENSSL_PUT_ERROR(EC, EC_R_BUFFER_TOO_SMALL); - return 0; - } +size_t ec_point_to_bytes(const EC_GROUP *group, const EC_AFFINE *point, + point_conversion_form_t form, uint8_t *buf, + size_t max_out) { + size_t output_len = ec_point_byte_len(group, form); + if (max_out < output_len) { + OPENSSL_PUT_ERROR(EC, EC_R_BUFFER_TOO_SMALL); + return 0; + } - size_t field_len_out; - ec_felem_to_bytes(group, buf + 1, &field_len_out, &point->X); - assert(field_len_out == field_len); + size_t field_len; + ec_felem_to_bytes(group, buf + 1, &field_len, &point->X); + assert(field_len == BN_num_bytes(&group->field)); - if (form == POINT_CONVERSION_UNCOMPRESSED) { - ec_felem_to_bytes(group, buf + 1 + field_len, &field_len_out, &point->Y); - assert(field_len_out == field_len); - buf[0] = form; - } else { - uint8_t y_buf[EC_MAX_BYTES]; - ec_felem_to_bytes(group, y_buf, &field_len_out, &point->Y); - buf[0] = form + (y_buf[field_len_out - 1] & 1); - } + if (form == POINT_CONVERSION_UNCOMPRESSED) { + ec_felem_to_bytes(group, buf + 1 + field_len, &field_len, &point->Y); + assert(field_len == BN_num_bytes(&group->field)); + buf[0] = form; + } else { + uint8_t y_buf[EC_MAX_BYTES]; + ec_felem_to_bytes(group, y_buf, &field_len, &point->Y); + buf[0] = form + (y_buf[field_len - 1] & 1); } return output_len; @@ -209,16 +210,46 @@ int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form, uint8_t *buf, - size_t len, BN_CTX *ctx) { + size_t max_out, BN_CTX *ctx) { if (EC_GROUP_cmp(group, point->group, NULL) != 0) { OPENSSL_PUT_ERROR(EC, EC_R_INCOMPATIBLE_OBJECTS); return 0; } + if (buf == NULL) { + // When |buf| is NULL, just return the number of bytes that would be + // written, without doing an expensive Jacobian-to-affine conversion. + if (ec_GFp_simple_is_at_infinity(group, &point->raw)) { + OPENSSL_PUT_ERROR(EC, EC_R_POINT_AT_INFINITY); + return 0; + } + return ec_point_byte_len(group, form); + } EC_AFFINE affine; if (!ec_jacobian_to_affine(group, &affine, &point->raw)) { return 0; } - return ec_point_to_bytes(group, &affine, form, buf, len); + return ec_point_to_bytes(group, &affine, form, buf, max_out); +} + +size_t EC_POINT_point2buf(const EC_GROUP *group, const EC_POINT *point, + point_conversion_form_t form, uint8_t **out_buf, + BN_CTX *ctx) { + *out_buf = NULL; + size_t len = EC_POINT_point2oct(group, point, form, NULL, 0, ctx); + if (len == 0) { + return 0; + } + uint8_t *buf = OPENSSL_malloc(len); + if (buf == NULL) { + return 0; + } + len = EC_POINT_point2oct(group, point, form, buf, len, ctx); + if (len == 0) { + OPENSSL_free(buf); + return 0; + } + *out_buf = buf; + return len; } int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, @@ -289,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/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.c b/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.c index 996c2fe3637e..c56222b47f54 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz_test.cc b/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz_test.cc index 6aa51e8520eb..a53d94eeb2d2 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/p256-nistz_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/ec/p256.c b/third_party/boringssl/src/crypto/fipsmodule/ec/p256.c index 816e6f1ad4f7..cd2b6fc0eefc 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/p256.c +++ b/third_party/boringssl/src/crypto/fipsmodule/ec/p256.c @@ -30,13 +30,10 @@ #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" +#elif defined(OPENSSL_64_BIT) +#include "../../../third_party/fiat/p256_64_msvc.h" #else #include "../../../third_party/fiat/p256_32.h" #endif @@ -44,7 +41,7 @@ // utility functions, handwritten -#if defined(BORINGSSL_NISTP256_64BIT) +#if defined(OPENSSL_64_BIT) #define FIAT_P256_NLIMBS 4 typedef uint64_t fiat_p256_limb_t; typedef uint64_t fiat_p256_felem[FIAT_P256_NLIMBS]; @@ -743,10 +740,12 @@ 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; out->cmp_x_coordinate = ec_GFp_nistp256_cmp_x_coordinate; } - -#undef BORINGSSL_NISTP256_64BIT diff --git a/third_party/boringssl/src/crypto/fipsmodule/ec/p256_table.h b/third_party/boringssl/src/crypto/fipsmodule/ec/p256_table.h index 14129a36f34e..d823d37ff0f0 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/p256_table.h +++ b/third_party/boringssl/src/crypto/fipsmodule/ec/p256_table.h @@ -50,7 +50,7 @@ // Tables for other points have table[i] = iG for i in 0 .. 16. // fiat_p256_g_pre_comp is the table of precomputed base points -#if defined(BORINGSSL_NISTP256_64BIT) +#if defined(OPENSSL_64_BIT) static const fiat_p256_felem fiat_p256_g_pre_comp[2][15][2] = { {{{0x79e730d418a9143c, 0x75ba95fc5fedb601, 0x79fb732b77622510, 0x18905f76a53755c6}, diff --git a/third_party/boringssl/src/crypto/fipsmodule/ec/wnaf.c b/third_party/boringssl/src/crypto/fipsmodule/ec/wnaf.c index 65cc89459e86..ce0d4b8b6b41 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ec/wnaf.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/ecdsa/ecdsa.c b/third_party/boringssl/src/crypto/fipsmodule/ecdsa/ecdsa.c index 95b367f13cb0..4cd95bb27215 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/ecdsa/ecdsa.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/hkdf/hkdf.c b/third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf.c similarity index 99% rename from third_party/boringssl/src/crypto/hkdf/hkdf.c rename to third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf.c index 23b60afe0ee8..fa1cc7244caf 100644 --- a/third_party/boringssl/src/crypto/hkdf/hkdf.c +++ b/third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf.c @@ -20,7 +20,7 @@ #include #include -#include "../internal.h" +#include "../../internal.h" int HKDF(uint8_t *out_key, size_t out_len, const EVP_MD *digest, diff --git a/third_party/boringssl/src/crypto/hkdf/hkdf_test.cc b/third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf_test.cc similarity index 99% rename from third_party/boringssl/src/crypto/hkdf/hkdf_test.cc rename to third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf_test.cc index 8aad6c854072..dd7dd58365cc 100644 --- a/third_party/boringssl/src/crypto/hkdf/hkdf_test.cc +++ b/third_party/boringssl/src/crypto/fipsmodule/hkdf/hkdf_test.cc @@ -20,9 +20,9 @@ #include -#include "../test/file_test.h" -#include "../test/test_util.h" -#include "../test/wycheproof_util.h" +#include "../../test/file_test.h" +#include "../../test/test_util.h" +#include "../../test/wycheproof_util.h" struct HKDFTestVector { diff --git a/third_party/boringssl/src/crypto/fipsmodule/hmac/hmac.c b/third_party/boringssl/src/crypto/fipsmodule/hmac/hmac.c index ca774bc05ec1..c6f12e2ab73b 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/hmac/hmac.c +++ b/third_party/boringssl/src/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; } diff --git a/third_party/boringssl/src/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl b/third_party/boringssl/src/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl index 793f34c51b1b..b0b65bf84ae5 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl +++ b/third_party/boringssl/src/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl @@ -71,14 +71,18 @@ # no AVX2 instructions being used. if ($avx>1) {{{ -($inp,$out,$len,$key,$ivp,$Xip)=("%rdi","%rsi","%rdx","%rcx","%r8","%r9"); +# On Windows, only four parameters are passed in registers. The last two +# parameters will be manually loaded into %rdi and %rsi. +my ($inp, $out, $len, $key, $ivp, $Xip) = + $win64 ? ("%rcx", "%rdx", "%r8", "%r9", "%rdi", "%rsi") : + ("%rdi", "%rsi", "%rdx", "%rcx", "%r8", "%r9"); ($Ii,$T1,$T2,$Hkey, $Z0,$Z1,$Z2,$Z3,$Xi) = map("%xmm$_",(0..8)); ($inout0,$inout1,$inout2,$inout3,$inout4,$inout5,$rndkey) = map("%xmm$_",(9..15)); -($counter,$rounds,$ret,$const,$in0,$end0)=("%ebx","%ebp","%r10","%r11","%r14","%r15"); +($counter,$rounds,$const,$in0,$end0)=("%ebx","%r10d","%r11","%r14","%r15"); $code=<<___; .text @@ -375,6 +379,9 @@ vpaddb $T2,$T1,$Ii mov %r13,0x70+8(%rsp) lea 0x60($inp),$inp + # These two prefetches were added in BoringSSL. See change that added them. + prefetcht0 512($inp) # We use 96-byte block so prefetch 2 lines (128 bytes) + prefetcht0 576($inp) vaesenclast $Z1,$inout2,$inout2 vpaddb $T2,$Ii,$Z1 mov %r12,0x78+8(%rsp) @@ -387,7 +394,7 @@ vaesenclast $Hkey,$inout5,$inout5 vpaddb $T2,$Z3,$Hkey - add \$0x60,$ret + add \$0x60,%rax sub \$0x6,$len jc .L6x_done @@ -421,46 +428,76 @@ # struct { u128 Xi,H,Htbl[9]; } *Xip); $code.=<<___; .globl aesni_gcm_decrypt -.type aesni_gcm_decrypt,\@function,6 +.type aesni_gcm_decrypt,\@abi-omnipotent .align 32 aesni_gcm_decrypt: .cfi_startproc - xor $ret,$ret +.seh_startproc + xor %rax,%rax # We call |_aesni_ctr32_ghash_6x|, which requires at least 96 (0x60) # bytes of input. cmp \$0x60,$len # minimal accepted length jb .Lgcm_dec_abort - lea (%rsp),%rax # save stack pointer -.cfi_def_cfa_register %rax - push %rbx -.cfi_push %rbx push %rbp .cfi_push %rbp +.seh_pushreg %rbp + mov %rsp, %rbp # save stack pointer +.cfi_def_cfa_register %rbp + push %rbx +.cfi_push %rbx +.seh_pushreg %rbx push %r12 .cfi_push %r12 +.seh_pushreg %r12 push %r13 .cfi_push %r13 +.seh_pushreg %r13 push %r14 .cfi_push %r14 +.seh_pushreg %r14 push %r15 .cfi_push %r15 +.seh_pushreg %r15 ___ -$code.=<<___ if ($win64); - lea -0xa8(%rsp),%rsp - movaps %xmm6,-0xd8(%rax) - movaps %xmm7,-0xc8(%rax) - movaps %xmm8,-0xb8(%rax) - movaps %xmm9,-0xa8(%rax) - movaps %xmm10,-0x98(%rax) - movaps %xmm11,-0x88(%rax) - movaps %xmm12,-0x78(%rax) - movaps %xmm13,-0x68(%rax) - movaps %xmm14,-0x58(%rax) - movaps %xmm15,-0x48(%rax) -.Lgcm_dec_body: +if ($win64) { +$code.=<<___ + lea -0xa8(%rsp),%rsp # 8 extra bytes to align the stack +.seh_allocstack 0xa8 +.seh_setframe %rbp, 0xa8+5*8 + # Load the last two parameters. These go into %rdi and %rsi, which are + # non-volatile on Windows, so stash them in the parameter stack area + # first. + mov %rdi, 0x10(%rbp) +.seh_savereg %rdi, 0xa8+5*8+0x10 + mov %rsi, 0x18(%rbp) +.seh_savereg %rsi, 0xa8+5*8+0x18 + mov 0x30(%rbp), $ivp + mov 0x38(%rbp), $Xip + # Save non-volatile XMM registers. + movaps %xmm6,-0xd0(%rbp) +.seh_savexmm128 %xmm6, 0xa8+5*8-0xd0 + movaps %xmm7,-0xc0(%rbp) +.seh_savexmm128 %xmm7, 0xa8+5*8-0xc0 + movaps %xmm8,-0xb0(%rbp) +.seh_savexmm128 %xmm8, 0xa8+5*8-0xb0 + movaps %xmm9,-0xa0(%rbp) +.seh_savexmm128 %xmm9, 0xa8+5*8-0xa0 + movaps %xmm10,-0x90(%rbp) +.seh_savexmm128 %xmm10, 0xa8+5*8-0x90 + movaps %xmm11,-0x80(%rbp) +.seh_savexmm128 %xmm11, 0xa8+5*8-0x80 + movaps %xmm12,-0x70(%rbp) +.seh_savexmm128 %xmm12, 0xa8+5*8-0x70 + movaps %xmm13,-0x60(%rbp) +.seh_savexmm128 %xmm13, 0xa8+5*8-0x60 + movaps %xmm14,-0x50(%rbp) +.seh_savexmm128 %xmm14, 0xa8+5*8-0x50 + movaps %xmm15,-0x40(%rbp) +.seh_savexmm128 %xmm15, 0xa8+5*8-0x40 ___ +} $code.=<<___; vzeroupper @@ -488,7 +525,7 @@ .Ldec_no_key_aliasing: vmovdqu 0x50($inp),$Z3 # I[5] - lea ($inp),$in0 + mov $inp,$in0 vmovdqu 0x40($inp),$Z0 # |_aesni_ctr32_ghash_6x| requires |$end0| to point to 2*96 (0xc0) @@ -501,7 +538,7 @@ vmovdqu 0x30($inp),$Z1 shr \$4,$len - xor $ret,$ret + xor %rax,%rax vmovdqu 0x20($inp),$Z2 vpshufb $Ii,$Z3,$Z3 # passed to _aesni_ctr32_ghash_6x vmovdqu 0x10($inp),$T2 @@ -532,35 +569,37 @@ vzeroupper ___ $code.=<<___ if ($win64); - movaps -0xd8(%rax),%xmm6 - movaps -0xc8(%rax),%xmm7 - movaps -0xb8(%rax),%xmm8 - movaps -0xa8(%rax),%xmm9 - movaps -0x98(%rax),%xmm10 - movaps -0x88(%rax),%xmm11 - movaps -0x78(%rax),%xmm12 - movaps -0x68(%rax),%xmm13 - movaps -0x58(%rax),%xmm14 - movaps -0x48(%rax),%xmm15 + movaps -0xd0(%rbp),%xmm6 + movaps -0xc0(%rbp),%xmm7 + movaps -0xb0(%rbp),%xmm8 + movaps -0xa0(%rbp),%xmm9 + movaps -0x90(%rbp),%xmm10 + movaps -0x80(%rbp),%xmm11 + movaps -0x70(%rbp),%xmm12 + movaps -0x60(%rbp),%xmm13 + movaps -0x50(%rbp),%xmm14 + movaps -0x40(%rbp),%xmm15 + mov 0x10(%rbp),%rdi + mov 0x18(%rbp),%rsi ___ $code.=<<___; - mov -48(%rax),%r15 -.cfi_restore %r15 - 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 # restore %rsp -.cfi_def_cfa_register %rsp + lea -0x28(%rbp), %rsp # restore %rsp to fixed allocation +.cfi_def_cfa %rsp, 0x38 + pop %r15 +.cfi_pop %r15 + pop %r14 +.cfi_pop %r14 + pop %r13 +.cfi_pop %r13 + pop %r12 +.cfi_pop %r12 + pop %rbx +.cfi_pop %rbx + pop %rbp +.cfi_pop %rbp .Lgcm_dec_abort: - mov $ret,%rax # return value ret +.seh_endproc .cfi_endproc .size aesni_gcm_decrypt,.-aesni_gcm_decrypt ___ @@ -660,15 +699,16 @@ .size _aesni_ctr32_6x,.-_aesni_ctr32_6x .globl aesni_gcm_encrypt -.type aesni_gcm_encrypt,\@function,6 +.type aesni_gcm_encrypt,\@abi-omnipotent .align 32 aesni_gcm_encrypt: .cfi_startproc +.seh_startproc #ifdef BORINGSSL_DISPATCH_TEST .extern BORINGSSL_function_hit movb \$1,BORINGSSL_function_hit+2(%rip) #endif - xor $ret,$ret + xor %rax,%rax # We call |_aesni_ctr32_6x| twice, each call consuming 96 bytes of # input. Then we call |_aesni_ctr32_ghash_6x|, which requires at @@ -676,35 +716,64 @@ cmp \$0x60*3,$len # minimal accepted length jb .Lgcm_enc_abort - lea (%rsp),%rax # save stack pointer -.cfi_def_cfa_register %rax - push %rbx -.cfi_push %rbx push %rbp .cfi_push %rbp +.seh_pushreg %rbp + mov %rsp, %rbp # save stack pointer +.cfi_def_cfa_register %rbp + push %rbx +.cfi_push %rbx +.seh_pushreg %rbx push %r12 .cfi_push %r12 +.seh_pushreg %r12 push %r13 .cfi_push %r13 +.seh_pushreg %r13 push %r14 .cfi_push %r14 +.seh_pushreg %r14 push %r15 .cfi_push %r15 +.seh_pushreg %r15 ___ -$code.=<<___ if ($win64); - lea -0xa8(%rsp),%rsp - movaps %xmm6,-0xd8(%rax) - movaps %xmm7,-0xc8(%rax) - movaps %xmm8,-0xb8(%rax) - movaps %xmm9,-0xa8(%rax) - movaps %xmm10,-0x98(%rax) - movaps %xmm11,-0x88(%rax) - movaps %xmm12,-0x78(%rax) - movaps %xmm13,-0x68(%rax) - movaps %xmm14,-0x58(%rax) - movaps %xmm15,-0x48(%rax) -.Lgcm_enc_body: +if ($win64) { +$code.=<<___ + lea -0xa8(%rsp),%rsp # 8 extra bytes to align the stack +.seh_allocstack 0xa8 +.seh_setframe %rbp, 0xa8+5*8 + # Load the last two parameters. These go into %rdi and %rsi, which are + # non-volatile on Windows, so stash them in the parameter stack area + # first. + mov %rdi, 0x10(%rbp) +.seh_savereg %rdi, 0xa8+5*8+0x10 + mov %rsi, 0x18(%rbp) +.seh_savereg %rsi, 0xa8+5*8+0x18 + mov 0x30(%rbp), $ivp + mov 0x38(%rbp), $Xip + # Save non-volatile XMM registers. + movaps %xmm6,-0xd0(%rbp) +.seh_savexmm128 %xmm6, 0xa8+5*8-0xd0 + movaps %xmm7,-0xc0(%rbp) +.seh_savexmm128 %xmm7, 0xa8+5*8-0xc0 + movaps %xmm8,-0xb0(%rbp) +.seh_savexmm128 %xmm8, 0xa8+5*8-0xb0 + movaps %xmm9,-0xa0(%rbp) +.seh_savexmm128 %xmm9, 0xa8+5*8-0xa0 + movaps %xmm10,-0x90(%rbp) +.seh_savexmm128 %xmm10, 0xa8+5*8-0x90 + movaps %xmm11,-0x80(%rbp) +.seh_savexmm128 %xmm11, 0xa8+5*8-0x80 + movaps %xmm12,-0x70(%rbp) +.seh_savexmm128 %xmm12, 0xa8+5*8-0x70 + movaps %xmm13,-0x60(%rbp) +.seh_savexmm128 %xmm13, 0xa8+5*8-0x60 + movaps %xmm14,-0x50(%rbp) +.seh_savexmm128 %xmm14, 0xa8+5*8-0x50 + movaps %xmm15,-0x40(%rbp) +.seh_savexmm128 %xmm15, 0xa8+5*8-0x40 ___ +} $code.=<<___; vzeroupper @@ -728,7 +797,7 @@ sub $end0,%rsp # avoid aliasing with key .Lenc_no_key_aliasing: - lea ($out),$in0 + mov $out,$in0 # |_aesni_ctr32_ghash_6x| requires |$end0| to point to 2*96 (0xc0) # bytes before the end of the input. Note, in particular, that this is @@ -759,7 +828,7 @@ vmovdqu ($Xip),$Xi # load Xi lea 0x20+0x20($Xip),$Xip # size optimization sub \$12,$len - mov \$0x60*2,$ret + mov \$0x60*2,%rax vpshufb $Ii,$Xi,$Xi call _aesni_ctr32_ghash_6x @@ -948,40 +1017,43 @@ vzeroupper ___ $code.=<<___ if ($win64); - movaps -0xd8(%rax),%xmm6 - movaps -0xc8(%rax),%xmm7 - movaps -0xb8(%rax),%xmm8 - movaps -0xa8(%rax),%xmm9 - movaps -0x98(%rax),%xmm10 - movaps -0x88(%rax),%xmm11 - movaps -0x78(%rax),%xmm12 - movaps -0x68(%rax),%xmm13 - movaps -0x58(%rax),%xmm14 - movaps -0x48(%rax),%xmm15 + movaps -0xd0(%rbp),%xmm6 + movaps -0xc0(%rbp),%xmm7 + movaps -0xb0(%rbp),%xmm8 + movaps -0xa0(%rbp),%xmm9 + movaps -0x90(%rbp),%xmm10 + movaps -0x80(%rbp),%xmm11 + movaps -0x70(%rbp),%xmm12 + movaps -0x60(%rbp),%xmm13 + movaps -0x50(%rbp),%xmm14 + movaps -0x40(%rbp),%xmm15 + mov 0x10(%rbp),%rdi + mov 0x18(%rbp),%rsi ___ $code.=<<___; - mov -48(%rax),%r15 -.cfi_restore %r15 - 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 # restore %rsp -.cfi_def_cfa_register %rsp + lea -0x28(%rbp), %rsp # restore %rsp to fixed allocation +.cfi_def_cfa %rsp, 0x38 + pop %r15 +.cfi_pop %r15 + pop %r14 +.cfi_pop %r14 + pop %r13 +.cfi_pop %r13 + pop %r12 +.cfi_pop %r12 + pop %rbx +.cfi_pop %rbx + pop %rbp +.cfi_pop %rbp .Lgcm_enc_abort: - mov $ret,%rax # return value ret +.seh_endproc .cfi_endproc -.size aesni_gcm_encrypt,.-aesni_gcm_encrypt +.size aesni_gcm_decrypt,.-aesni_gcm_decrypt ___ $code.=<<___; +.section .rodata .align 64 .Lbswap_mask: .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 @@ -995,128 +1067,8 @@ .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 ___ -if ($win64) { -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___ -.extern __imp_RtlVirtualUnwind -.type gcm_se_handler,\@abi-omnipotent -.align 16 -gcm_se_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue label - cmp %r10,%rbx # context->RipRsp - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - mov 120($context),%rax # pull context->Rax - - mov -48(%rax),%r15 - mov -40(%rax),%r14 - mov -32(%rax),%r13 - mov -24(%rax),%r12 - mov -16(%rax),%rbp - mov -8(%rax),%rbx - mov %r15,240($context) - mov %r14,232($context) - mov %r13,224($context) - mov %r12,216($context) - mov %rbp,160($context) - mov %rbx,144($context) - - lea -0xd8(%rax),%rsi # %xmm save area - lea 512($context),%rdi # & context.Xmm6 - mov \$20,%ecx # 10*sizeof(%xmm0)/sizeof(%rax) - .long 0xa548f3fc # cld; rep movsq - -.Lcommon_seh_tail: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$154,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size gcm_se_handler,.-gcm_se_handler - -.section .pdata -.align 4 - .rva .LSEH_begin_aesni_gcm_decrypt - .rva .LSEH_end_aesni_gcm_decrypt - .rva .LSEH_gcm_dec_info - - .rva .LSEH_begin_aesni_gcm_encrypt - .rva .LSEH_end_aesni_gcm_encrypt - .rva .LSEH_gcm_enc_info -.section .xdata -.align 8 -.LSEH_gcm_dec_info: - .byte 9,0,0,0 - .rva gcm_se_handler - .rva .Lgcm_dec_body,.Lgcm_dec_abort -.LSEH_gcm_enc_info: - .byte 9,0,0,0 - .rva gcm_se_handler - .rva .Lgcm_enc_body,.Lgcm_enc_abort -___ -} }}} else {{{ $code=<<___; # assembler is too old .text diff --git a/third_party/boringssl/src/crypto/fipsmodule/modes/asm/aesv8-gcm-armv8.pl b/third_party/boringssl/src/crypto/fipsmodule/modes/asm/aesv8-gcm-armv8.pl new file mode 100644 index 000000000000..bf86174efc9b --- /dev/null +++ b/third_party/boringssl/src/crypto/fipsmodule/modes/asm/aesv8-gcm-armv8.pl @@ -0,0 +1,1540 @@ +#! /usr/bin/env perl + +# Copyright (c) 2022, ARM 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. */ + +#======================================================================== +# Written by Fangming Fang for the OpenSSL project, +# derived from https://github.com/ARM-software/AArch64cryptolib, original +# author Samuel Lee . +#======================================================================== +# +# Approach - assume we don't want to reload constants, so reserve ~half of +# vector register file for constants +# +# main loop to act on 4 16B blocks per iteration, and then do modulo of the +# accumulated intermediate hashes from the 4 blocks +# +# ____________________________________________________ +# | | +# | PRE | +# |____________________________________________________| +# | | | | +# | CTR block 4k+8 | AES block 4k+4 | GHASH block 4k+0 | +# |________________|________________|__________________| +# | | | | +# | CTR block 4k+9 | AES block 4k+5 | GHASH block 4k+1 | +# |________________|________________|__________________| +# | | | | +# | CTR block 4k+10| AES block 4k+6 | GHASH block 4k+2 | +# |________________|________________|__________________| +# | | | | +# | CTR block 4k+11| AES block 4k+7 | GHASH block 4k+3 | +# |________________|____(mostly)____|__________________| +# | | +# | MODULO | +# |____________________________________________________| +# +# PRE: Ensure previous generated intermediate hash is aligned and merged with +# result for GHASH 4k+0 +# +# EXT low_acc, low_acc, low_acc, #8 +# EOR res_curr (4k+0), res_curr (4k+0), low_acc +# +# CTR block: Increment and byte reverse counter in scalar registers and transfer +# to SIMD registers +# +# REV ctr32, rev_ctr32 +# ORR ctr64, constctr96_top32, ctr32, LSL #32 +# // Keeping this in scalar registers to free up space in SIMD RF +# INS ctr_next.d[0], constctr96_bottom64 +# INS ctr_next.d[1], ctr64X +# ADD rev_ctr32, #1 +# +# AES block: +# +# Do AES encryption/decryption on CTR block X and EOR it with input block X. +# Take 256 bytes key below for example. Doing small trick here of loading input +# in scalar registers, EORing with last key and then transferring Given we are +# very constrained in our ASIMD registers this is quite important +# +# Encrypt: +# LDR input_low, [ input_ptr ], #8 +# LDR input_high, [ input_ptr ], #8 +# EOR input_low, k14_low +# EOR input_high, k14_high +# INS res_curr.d[0], input_low +# INS res_curr.d[1], input_high +# AESE ctr_curr, k0; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k1; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k2; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k3; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k4; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k5; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k6; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k7; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k8; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k9; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k10; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k11; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k12; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k13 +# EOR res_curr, res_curr, ctr_curr +# ST1 { res_curr.16b }, [ output_ptr ], #16 +# +# Decrypt: +# AESE ctr_curr, k0; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k1; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k2; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k3; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k4; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k5; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k6; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k7; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k8; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k9; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k10; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k11; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k12; AESMC ctr_curr, ctr_curr +# AESE ctr_curr, k13 +# LDR res_curr, [ input_ptr ], #16 +# EOR res_curr, res_curr, ctr_curr +# MOV output_low, res_curr.d[0] +# MOV output_high, res_curr.d[1] +# EOR output_low, k14_low +# EOR output_high, k14_high +# STP output_low, output_high, [ output_ptr ], #16 +# +# GHASH block X: +# Do 128b karatsuba polynomial multiplication on block. We only have +# 64b->128b polynomial multipliers, naively that means we need to do 4 64b +# multiplies to generate a 128b. +# +# multiplication: +# Pmull(A,B) == (Pmull(Ah,Bh)<<128 | Pmull(Al,Bl)) ^ +# (Pmull(Ah,Bl) ^ Pmull(Al,Bh))<<64 +# +# The idea behind Karatsuba multiplication is that we can do just 3 64b +# multiplies: +# Pmull(A,B) == (Pmull(Ah,Bh)<<128 | Pmull(Al,Bl)) ^ +# (Pmull(Ah^Al,Bh^Bl) ^ Pmull(Ah,Bh) ^ +# Pmull(Al,Bl))<<64 +# +# There is some complication here because the bit order of GHASH's PMULL is +# reversed compared to elsewhere, so we are multiplying with "twisted" +# powers of H +# +# Note: We can PMULL directly into the acc_x in first GHASH of the loop +# +# Note: For scheduling big cores we want to split the processing to happen over +# two loop iterations - otherwise the critical path latency dominates the +# performance. +# +# This has a knock on effect on register pressure, so we have to be a bit +# more clever with our temporary registers than indicated here +# +# REV64 res_curr, res_curr +# INS t_m.d[0], res_curr.d[1] +# EOR t_m.8B, t_m.8B, res_curr.8B +# PMULL2 t_h, res_curr, HX +# PMULL t_l, res_curr, HX +# PMULL t_m, t_m, HX_k +# EOR acc_h, acc_h, t_h +# EOR acc_l, acc_l, t_l +# EOR acc_m, acc_m, t_m +# +# MODULO: take the partial accumulators (~representing sum of 256b +# multiplication results), from GHASH and do modulo reduction on them +# There is some complication here because the bit order of GHASH's +# PMULL is reversed compared to elsewhere, so we are doing modulo with +# a reversed constant +# +# EOR acc_m, acc_m, acc_h +# EOR acc_m, acc_m, acc_l // Finish off karatsuba processing +# PMULL t_mod, acc_h, mod_constant +# EXT acc_h, acc_h, acc_h, #8 +# EOR acc_m, acc_m, acc_h +# EOR acc_m, acc_m, t_mod +# PMULL acc_h, acc_m, mod_constant +# EXT acc_m, acc_m, acc_m, #8 +# EOR acc_l, acc_l, acc_h +# EOR acc_l, acc_l, acc_m +# +# This code was then modified to merge the AES-128-GCM, AES-192-GCM, and +# AES-256-GCM implementations into a single function to reduce size. We move the +# last two round keys into consistent registers across all sizes, as they're +# treated special. Then, after rounds 0 through 8, we added some branches to +# conditionally run rounds 9-10 (AES-192 + AES-256) and 11-12 (AES-256), before +# merging back into code which finishes up the last two rounds. +# +# There is a mostly decision to be made around how much parallel work goes +# before or after the conditional part. We attempted to preserve the original +# scheduling where possible, but it's possible other schedulings are more +# optimal with the current ordering. + +$flavour = shift; +$output = shift; + +$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; +( $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; + +$code=<<___; +#include +#if __ARM_MAX_ARCH__ >= 8 + +.arch armv8-a+crypto +.text +___ + +$input_ptr="x0"; #argument block +$bit_length="x1"; +$output_ptr="x2"; +$current_tag="x3"; +$counter="x16"; +$cc="x8"; + +{ +my ($end_input_ptr,$main_end_input_ptr,$input_l0,$input_h0)=map("x$_",(4..7)); +my ($input_l1,$input_h1,$input_l2,$input_h2,$input_l3,$input_h3)=map("x$_",(19..24)); +my ($output_l1,$output_h1,$output_l2,$output_h2,$output_l3,$output_h3)=map("x$_",(19..24)); +my ($output_l0,$output_h0)=map("x$_",(6..7)); + +# rkN_l and rkN_h store the final round key, which is handled slightly +# differently because it is EORed through general-purpose registers. +my $ctr32w="w9"; +my ($ctr32x,$ctr96_b64x,$ctr96_t32x,$rctr32x,$rkN_l,$rkN_h,$len)=map("x$_",(9..15)); +my ($ctr96_t32w,$rctr32w)=map("w$_",(11..12)); + +my $rounds="x17"; +my $roundsw="w17"; + +my ($ctr0b,$ctr1b,$ctr2b,$ctr3b,$res0b,$res1b,$res2b,$res3b)=map("v$_.16b",(0..7)); +my ($ctr0,$ctr1,$ctr2,$ctr3,$res0,$res1,$res2,$res3)=map("v$_",(0..7)); +my ($ctr0d,$ctr1d,$ctr2d,$ctr3d,$res0d,$res1d,$res2d,$res3d)=map("d$_",(0..7)); +my ($res0q,$res1q,$res2q,$res3q)=map("q$_",(4..7)); + +my ($acc_hb,$acc_mb,$acc_lb)=map("v$_.16b",(9..11)); +my ($acc_h,$acc_m,$acc_l)=map("v$_",(9..11)); +my ($acc_hd,$acc_md,$acc_ld)=map("d$_",(9..11)); + +my ($h1,$h2,$h3,$h4,$h12k,$h34k)=map("v$_",(12..17)); +my ($h1q,$h2q,$h3q,$h4q)=map("q$_",(12..15)); +my ($h1b,$h2b,$h3b,$h4b)=map("v$_.16b",(12..15)); + +my $t0="v8"; +my $t0d="d8"; +my $t1="v4"; +my $t1d="d4"; +my $t2="v8"; +my $t2d="d8"; +my $t3="v4"; +my $t3d="d4"; +my $t4="v4"; +my $t4d="d4"; +my $t5="v5"; +my $t5d="d5"; +my $t6="v8"; +my $t6d="d8"; +my $t7="v5"; +my $t7d="d5"; +my $t8="v6"; +my $t8d="d6"; +my $t9="v4"; +my $t9d="d4"; + +my ($ctr_t0,$ctr_t1,$ctr_t2,$ctr_t3)=map("v$_",(4..7)); +my ($ctr_t0d,$ctr_t1d,$ctr_t2d,$ctr_t3d)=map("d$_",(4..7)); +my ($ctr_t0b,$ctr_t1b,$ctr_t2b,$ctr_t3b)=map("v$_.16b",(4..7)); + +my $mod_constantd="d8"; +my $mod_constant="v8"; +my $mod_t="v7"; + +# rkNm1 stores the second-to-last round key, which is handled slightly +# differently because it uses plain AESE instead of an AESE + AESMC macro-op. +my ($rk0,$rk1,$rk2,$rk3,$rk4,$rk5,$rk6,$rk7,$rk8,$rk9,$rk10,$rk11,$rk12,$rkNm1)=map("v$_.16b",(18..31)); +my ($rk0q,$rk1q,$rk2q,$rk3q,$rk4q,$rk5q,$rk6q,$rk7q,$rk8q,$rk9q,$rk10q,$rk11q,$rk12q,$rkNm1q)=map("q$_",(18..31)); +my $rk2q1="v20.1q"; +my $rk3q1="v21.1q"; +my $rk4v="v22"; +my $rk4d="d22"; + +################################################################################ +# size_t aes_gcm_enc_kernel(const uint8_t *in, +# size_t len_bits, +# uint8_t *out, +# u64 *Xi, +# uint8_t ivec[16], +# const void *key); +# +$code.=<<___; +.global aes_gcm_enc_kernel +.type aes_gcm_enc_kernel,%function +.align 4 +aes_gcm_enc_kernel: + AARCH64_SIGN_LINK_REGISTER + stp x29, x30, [sp, #-128]! + mov x29, sp + stp x19, x20, [sp, #16] + mov $counter, x4 + mov $cc, x5 + stp x21, x22, [sp, #32] + stp x23, x24, [sp, #48] + stp d8, d9, [sp, #64] + stp d10, d11, [sp, #80] + stp d12, d13, [sp, #96] + stp d14, d15, [sp, #112] + ldr $roundsw, [$cc, #240] + add $input_l1, $cc, $rounds, lsl #4 // borrow input_l1 for last key + ldp $rkN_l, $rkN_h, [$input_l1] // load round N keys + ldr $rkNm1q, [$input_l1, #-16] // load round N-1 keys + add $end_input_ptr, $input_ptr, $bit_length, lsr #3 // end_input_ptr + lsr $main_end_input_ptr, $bit_length, #3 // byte_len + mov $len, $main_end_input_ptr + ldp $ctr96_b64x, $ctr96_t32x, [$counter] // ctr96_b64, ctr96_t32 + ld1 { $ctr0b}, [$counter] // special case vector load initial counter so we can start first AES block as quickly as possible + sub $main_end_input_ptr, $main_end_input_ptr, #1 // byte_len - 1 + ldr $rk0q, [$cc, #0] // load rk0 + and $main_end_input_ptr, $main_end_input_ptr, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + ldr $rk7q, [$cc, #112] // load rk7 + add $main_end_input_ptr, $main_end_input_ptr, $input_ptr + lsr $rctr32x, $ctr96_t32x, #32 + fmov $ctr2d, $ctr96_b64x // CTR block 2 + orr $ctr96_t32w, $ctr96_t32w, $ctr96_t32w + rev $rctr32w, $rctr32w // rev_ctr32 + fmov $ctr1d, $ctr96_b64x // CTR block 1 + aese $ctr0b, $rk0 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 0 + add $rctr32w, $rctr32w, #1 // increment rev_ctr32 + rev $ctr32w, $rctr32w // CTR block 1 + fmov $ctr3d, $ctr96_b64x // CTR block 3 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 1 + add $rctr32w, $rctr32w, #1 // CTR block 1 + ldr $rk1q, [$cc, #16] // load rk1 + fmov $ctr1.d[1], $ctr32x // CTR block 1 + rev $ctr32w, $rctr32w // CTR block 2 + add $rctr32w, $rctr32w, #1 // CTR block 2 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 2 + ldr $rk2q, [$cc, #32] // load rk2 + fmov $ctr2.d[1], $ctr32x // CTR block 2 + rev $ctr32w, $rctr32w // CTR block 3 + aese $ctr0b, $rk1 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 1 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 3 + fmov $ctr3.d[1], $ctr32x // CTR block 3 + aese $ctr1b, $rk0 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 0 + ldr $rk3q, [$cc, #48] // load rk3 + aese $ctr0b, $rk2 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 2 + ldr $rk6q, [$cc, #96] // load rk6 + aese $ctr2b, $rk0 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 0 + ldr $rk5q, [$cc, #80] // load rk5 + aese $ctr1b, $rk1 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 1 + ldr $h3q, [$current_tag, #80] // load h3l | h3h + ext $h3b, $h3b, $h3b, #8 + aese $ctr3b, $rk0 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 0 + aese $ctr2b, $rk1 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 1 + ldr $rk4q, [$cc, #64] // load rk4 + aese $ctr1b, $rk2 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 2 + ldr $h2q, [$current_tag, #64] // load h2l | h2h + ext $h2b, $h2b, $h2b, #8 + aese $ctr3b, $rk1 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 1 + ldr $rk12q, [$cc, #192] // load rk12 + aese $ctr2b, $rk2 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 2 + ldr $h4q, [$current_tag, #112] // load h4l | h4h + ext $h4b, $h4b, $h4b, #8 + aese $ctr1b, $rk3 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 3 + ldr $rk11q, [$cc, #176] // load rk11 + aese $ctr3b, $rk2 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 2 + ldr $rk8q, [$cc, #128] // load rk8 + aese $ctr2b, $rk3 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 3 + add $rctr32w, $rctr32w, #1 // CTR block 3 + aese $ctr0b, $rk3 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 3 + aese $ctr3b, $rk3 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 3 + ld1 { $acc_lb}, [$current_tag] + ext $acc_lb, $acc_lb, $acc_lb, #8 + rev64 $acc_lb, $acc_lb + aese $ctr2b, $rk4 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 4 + aese $ctr0b, $rk4 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 4 + aese $ctr1b, $rk4 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 4 + aese $ctr3b, $rk4 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 4 + cmp $rounds, #12 // setup flags for AES-128/192/256 check + aese $ctr0b, $rk5 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 5 + aese $ctr1b, $rk5 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 5 + aese $ctr3b, $rk5 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 5 + aese $ctr2b, $rk5 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 5 + aese $ctr1b, $rk6 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 6 + trn2 $h34k.2d, $h3.2d, $h4.2d // h4l | h3l + aese $ctr3b, $rk6 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 6 + ldr $rk9q, [$cc, #144] // load rk9 + aese $ctr0b, $rk6 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 6 + ldr $h1q, [$current_tag, #32] // load h1l | h1h + ext $h1b, $h1b, $h1b, #8 + aese $ctr2b, $rk6 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 6 + ldr $rk10q, [$cc, #160] // load rk10 + aese $ctr1b, $rk7 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 7 + trn1 $acc_h.2d, $h3.2d, $h4.2d // h4h | h3h + aese $ctr0b, $rk7 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 7 + aese $ctr2b, $rk7 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 7 + aese $ctr3b, $rk7 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 7 + trn2 $h12k.2d, $h1.2d, $h2.2d // h2l | h1l + aese $ctr1b, $rk8 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 8 + aese $ctr2b, $rk8 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 8 + aese $ctr3b, $rk8 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 8 + aese $ctr0b, $rk8 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 8 + b.lt .Lenc_finish_first_blocks // branch if AES-128 + + aese $ctr1b, $rk9 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 9 + aese $ctr2b, $rk9 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 9 + aese $ctr3b, $rk9 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 9 + aese $ctr0b, $rk9 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 9 + aese $ctr1b, $rk10 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 10 + aese $ctr2b, $rk10 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 10 + aese $ctr3b, $rk10 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 10 + aese $ctr0b, $rk10 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 10 + b.eq .Lenc_finish_first_blocks // branch if AES-192 + + aese $ctr1b, $rk11 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 11 + aese $ctr2b, $rk11 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 11 + aese $ctr0b, $rk11 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 11 + aese $ctr3b, $rk11 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 11 + aese $ctr1b, $rk12 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 12 + aese $ctr2b, $rk12 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 12 + aese $ctr0b, $rk12 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 12 + aese $ctr3b, $rk12 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 12 + +.Lenc_finish_first_blocks: + cmp $input_ptr, $main_end_input_ptr // check if we have <= 4 blocks + eor $h34k.16b, $h34k.16b, $acc_h.16b // h4k | h3k + aese $ctr2b, $rkNm1 // AES block 2 - round N-1 + trn1 $t0.2d, $h1.2d, $h2.2d // h2h | h1h + aese $ctr1b, $rkNm1 // AES block 1 - round N-1 + aese $ctr0b, $rkNm1 // AES block 0 - round N-1 + aese $ctr3b, $rkNm1 // AES block 3 - round N-1 + eor $h12k.16b, $h12k.16b, $t0.16b // h2k | h1k + b.ge .Lenc_tail // handle tail + + ldp $input_l1, $input_h1, [$input_ptr, #16] // AES block 1 - load plaintext + rev $ctr32w, $rctr32w // CTR block 4 + ldp $input_l0, $input_h0, [$input_ptr, #0] // AES block 0 - load plaintext + ldp $input_l3, $input_h3, [$input_ptr, #48] // AES block 3 - load plaintext + ldp $input_l2, $input_h2, [$input_ptr, #32] // AES block 2 - load plaintext + add $input_ptr, $input_ptr, #64 // AES input_ptr update + eor $input_l1, $input_l1, $rkN_l // AES block 1 - round N low + eor $input_h1, $input_h1, $rkN_h // AES block 1 - round N high + fmov $ctr_t1d, $input_l1 // AES block 1 - mov low + eor $input_l0, $input_l0, $rkN_l // AES block 0 - round N low + eor $input_h0, $input_h0, $rkN_h // AES block 0 - round N high + eor $input_h3, $input_h3, $rkN_h // AES block 3 - round N high + fmov $ctr_t0d, $input_l0 // AES block 0 - mov low + cmp $input_ptr, $main_end_input_ptr // check if we have <= 8 blocks + fmov $ctr_t0.d[1], $input_h0 // AES block 0 - mov high + eor $input_l3, $input_l3, $rkN_l // AES block 3 - round N low + eor $input_l2, $input_l2, $rkN_l // AES block 2 - round N low + fmov $ctr_t1.d[1], $input_h1 // AES block 1 - mov high + fmov $ctr_t2d, $input_l2 // AES block 2 - mov low + add $rctr32w, $rctr32w, #1 // CTR block 4 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4 + fmov $ctr_t3d, $input_l3 // AES block 3 - mov low + eor $input_h2, $input_h2, $rkN_h // AES block 2 - round N high + fmov $ctr_t2.d[1], $input_h2 // AES block 2 - mov high + eor $res0b, $ctr_t0b, $ctr0b // AES block 0 - result + fmov $ctr0d, $ctr96_b64x // CTR block 4 + fmov $ctr0.d[1], $ctr32x // CTR block 4 + rev $ctr32w, $rctr32w // CTR block 5 + add $rctr32w, $rctr32w, #1 // CTR block 5 + eor $res1b, $ctr_t1b, $ctr1b // AES block 1 - result + fmov $ctr1d, $ctr96_b64x // CTR block 5 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 5 + fmov $ctr1.d[1], $ctr32x // CTR block 5 + rev $ctr32w, $rctr32w // CTR block 6 + st1 { $res0b}, [$output_ptr], #16 // AES block 0 - store result + fmov $ctr_t3.d[1], $input_h3 // AES block 3 - mov high + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 6 + eor $res2b, $ctr_t2b, $ctr2b // AES block 2 - result + st1 { $res1b}, [$output_ptr], #16 // AES block 1 - store result + add $rctr32w, $rctr32w, #1 // CTR block 6 + fmov $ctr2d, $ctr96_b64x // CTR block 6 + fmov $ctr2.d[1], $ctr32x // CTR block 6 + st1 { $res2b}, [$output_ptr], #16 // AES block 2 - store result + rev $ctr32w, $rctr32w // CTR block 7 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 7 + eor $res3b, $ctr_t3b, $ctr3b // AES block 3 - result + st1 { $res3b}, [$output_ptr], #16 // AES block 3 - store result + b.ge .Lenc_prepretail // do prepretail + +.Lenc_main_loop: // main loop start + aese $ctr0b, $rk0 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 0 + rev64 $res0b, $res0b // GHASH block 4k (only t0 is free) + aese $ctr1b, $rk0 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 0 + fmov $ctr3d, $ctr96_b64x // CTR block 4k+3 + aese $ctr2b, $rk0 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 0 + ext $acc_lb, $acc_lb, $acc_lb, #8 // PRE 0 + aese $ctr0b, $rk1 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 1 + fmov $ctr3.d[1], $ctr32x // CTR block 4k+3 + aese $ctr1b, $rk1 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 1 + ldp $input_l3, $input_h3, [$input_ptr, #48] // AES block 4k+7 - load plaintext + aese $ctr2b, $rk1 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 1 + ldp $input_l2, $input_h2, [$input_ptr, #32] // AES block 4k+6 - load plaintext + aese $ctr0b, $rk2 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 2 + eor $res0b, $res0b, $acc_lb // PRE 1 + aese $ctr1b, $rk2 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 2 + aese $ctr3b, $rk0 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 0 + eor $input_l3, $input_l3, $rkN_l // AES block 4k+7 - round N low + aese $ctr0b, $rk3 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 3 + mov $acc_md, $h34k.d[1] // GHASH block 4k - mid + pmull2 $acc_h.1q, $res0.2d, $h4.2d // GHASH block 4k - high + eor $input_h2, $input_h2, $rkN_h // AES block 4k+6 - round N high + mov $t0d, $res0.d[1] // GHASH block 4k - mid + aese $ctr3b, $rk1 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 1 + rev64 $res1b, $res1b // GHASH block 4k+1 (t0 and t1 free) + aese $ctr0b, $rk4 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 4 + pmull $acc_l.1q, $res0.1d, $h4.1d // GHASH block 4k - low + eor $t0.8b, $t0.8b, $res0.8b // GHASH block 4k - mid + aese $ctr2b, $rk2 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 2 + aese $ctr0b, $rk5 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 5 + rev64 $res3b, $res3b // GHASH block 4k+3 (t0, t1, t2 and t3 free) + pmull2 $t1.1q, $res1.2d, $h3.2d // GHASH block 4k+1 - high + pmull $acc_m.1q, $t0.1d, $acc_m.1d // GHASH block 4k - mid + rev64 $res2b, $res2b // GHASH block 4k+2 (t0, t1, and t2 free) + pmull $t2.1q, $res1.1d, $h3.1d // GHASH block 4k+1 - low + eor $acc_hb, $acc_hb, $t1.16b // GHASH block 4k+1 - high + mov $t3d, $res1.d[1] // GHASH block 4k+1 - mid + aese $ctr1b, $rk3 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 3 + aese $ctr3b, $rk2 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 2 + eor $acc_lb, $acc_lb, $t2.16b // GHASH block 4k+1 - low + aese $ctr2b, $rk3 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 3 + aese $ctr1b, $rk4 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 4 + mov $t6d, $res2.d[1] // GHASH block 4k+2 - mid + aese $ctr3b, $rk3 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 3 + eor $t3.8b, $t3.8b, $res1.8b // GHASH block 4k+1 - mid + aese $ctr2b, $rk4 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 4 + aese $ctr0b, $rk6 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 6 + eor $t6.8b, $t6.8b, $res2.8b // GHASH block 4k+2 - mid + aese $ctr3b, $rk4 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 4 + pmull $t3.1q, $t3.1d, $h34k.1d // GHASH block 4k+1 - mid + aese $ctr0b, $rk7 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 7 + aese $ctr3b, $rk5 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 5 + ins $t6.d[1], $t6.d[0] // GHASH block 4k+2 - mid + aese $ctr1b, $rk5 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 5 + aese $ctr0b, $rk8 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 8 + aese $ctr2b, $rk5 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 5 + aese $ctr1b, $rk6 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 6 + eor $acc_mb, $acc_mb, $t3.16b // GHASH block 4k+1 - mid + pmull2 $t4.1q, $res2.2d, $h2.2d // GHASH block 4k+2 - high + pmull $t5.1q, $res2.1d, $h2.1d // GHASH block 4k+2 - low + aese $ctr1b, $rk7 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 7 + pmull $t8.1q, $res3.1d, $h1.1d // GHASH block 4k+3 - low + eor $acc_hb, $acc_hb, $t4.16b // GHASH block 4k+2 - high + aese $ctr3b, $rk6 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 6 + ldp $input_l1, $input_h1, [$input_ptr, #16] // AES block 4k+5 - load plaintext + aese $ctr1b, $rk8 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 8 + mov $t9d, $res3.d[1] // GHASH block 4k+3 - mid + aese $ctr2b, $rk6 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 6 + eor $acc_lb, $acc_lb, $t5.16b // GHASH block 4k+2 - low + pmull2 $t6.1q, $t6.2d, $h12k.2d // GHASH block 4k+2 - mid + pmull2 $t7.1q, $res3.2d, $h1.2d // GHASH block 4k+3 - high + eor $t9.8b, $t9.8b, $res3.8b // GHASH block 4k+3 - mid + aese $ctr2b, $rk7 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 7 + eor $input_l1, $input_l1, $rkN_l // AES block 4k+5 - round N low + aese $ctr2b, $rk8 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 8 + eor $acc_mb, $acc_mb, $t6.16b // GHASH block 4k+2 - mid + aese $ctr3b, $rk7 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 7 + eor $input_l2, $input_l2, $rkN_l // AES block 4k+6 - round N low + aese $ctr3b, $rk8 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 8 + movi $mod_constant.8b, #0xc2 + pmull $t9.1q, $t9.1d, $h12k.1d // GHASH block 4k+3 - mid + eor $acc_hb, $acc_hb, $t7.16b // GHASH block 4k+3 - high + cmp $rounds, #12 // setup flags for AES-128/192/256 check + fmov $ctr_t1d, $input_l1 // AES block 4k+5 - mov low + ldp $input_l0, $input_h0, [$input_ptr, #0] // AES block 4k+4 - load plaintext + b.lt .Lenc_main_loop_continue // branch if AES-128 + + aese $ctr1b, $rk9 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 9 + aese $ctr0b, $rk9 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 9 + aese $ctr2b, $rk9 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 9 + aese $ctr3b, $rk9 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 9 + aese $ctr0b, $rk10 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 10 + aese $ctr1b, $rk10 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 10 + aese $ctr2b, $rk10 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 10 + aese $ctr3b, $rk10 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 10 + b.eq .Lenc_main_loop_continue // branch if AES-192 + + aese $ctr0b, $rk11 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 11 + aese $ctr1b, $rk11 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 11 + aese $ctr2b, $rk11 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 11 + aese $ctr3b, $rk11 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 11 + aese $ctr1b, $rk12 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 12 + aese $ctr0b, $rk12 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 12 + aese $ctr2b, $rk12 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 12 + aese $ctr3b, $rk12 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 12 + +.Lenc_main_loop_continue: + shl $mod_constantd, $mod_constantd, #56 // mod_constant + eor $acc_lb, $acc_lb, $t8.16b // GHASH block 4k+3 - low + eor $acc_mb, $acc_mb, $t9.16b // GHASH block 4k+3 - mid + add $rctr32w, $rctr32w, #1 // CTR block 4k+3 + eor $t9.16b, $acc_lb, $acc_hb // MODULO - karatsuba tidy up + add $input_ptr, $input_ptr, #64 // AES input_ptr update + pmull $mod_t.1q, $acc_h.1d, $mod_constant.1d // MODULO - top 64b align with mid + rev $ctr32w, $rctr32w // CTR block 4k+8 + ext $acc_hb, $acc_hb, $acc_hb, #8 // MODULO - other top alignment + eor $input_l0, $input_l0, $rkN_l // AES block 4k+4 - round N low + eor $acc_mb, $acc_mb, $t9.16b // MODULO - karatsuba tidy up + eor $input_h0, $input_h0, $rkN_h // AES block 4k+4 - round N high + fmov $ctr_t0d, $input_l0 // AES block 4k+4 - mov low + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4k+8 + eor $mod_t.16b, $acc_hb, $mod_t.16b // MODULO - fold into mid + eor $input_h1, $input_h1, $rkN_h // AES block 4k+5 - round N high + eor $input_h3, $input_h3, $rkN_h // AES block 4k+7 - round N high + add $rctr32w, $rctr32w, #1 // CTR block 4k+8 + aese $ctr0b, $rkNm1 // AES block 4k+4 - round N-1 + fmov $ctr_t0.d[1], $input_h0 // AES block 4k+4 - mov high + eor $acc_mb, $acc_mb, $mod_t.16b // MODULO - fold into mid + fmov $ctr_t3d, $input_l3 // AES block 4k+7 - mov low + aese $ctr1b, $rkNm1 // AES block 4k+5 - round N-1 + fmov $ctr_t1.d[1], $input_h1 // AES block 4k+5 - mov high + fmov $ctr_t2d, $input_l2 // AES block 4k+6 - mov low + cmp $input_ptr, $main_end_input_ptr // LOOP CONTROL + fmov $ctr_t2.d[1], $input_h2 // AES block 4k+6 - mov high + pmull $acc_h.1q, $acc_m.1d, $mod_constant.1d // MODULO - mid 64b align with low + eor $res0b, $ctr_t0b, $ctr0b // AES block 4k+4 - result + fmov $ctr0d, $ctr96_b64x // CTR block 4k+8 + fmov $ctr0.d[1], $ctr32x // CTR block 4k+8 + rev $ctr32w, $rctr32w // CTR block 4k+9 + add $rctr32w, $rctr32w, #1 // CTR block 4k+9 + eor $res1b, $ctr_t1b, $ctr1b // AES block 4k+5 - result + fmov $ctr1d, $ctr96_b64x // CTR block 4k+9 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4k+9 + fmov $ctr1.d[1], $ctr32x // CTR block 4k+9 + aese $ctr2b, $rkNm1 // AES block 4k+6 - round N-1 + rev $ctr32w, $rctr32w // CTR block 4k+10 + st1 { $res0b}, [$output_ptr], #16 // AES block 4k+4 - store result + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4k+10 + eor $acc_lb, $acc_lb, $acc_hb // MODULO - fold into low + fmov $ctr_t3.d[1], $input_h3 // AES block 4k+7 - mov high + ext $acc_mb, $acc_mb, $acc_mb, #8 // MODULO - other mid alignment + st1 { $res1b}, [$output_ptr], #16 // AES block 4k+5 - store result + add $rctr32w, $rctr32w, #1 // CTR block 4k+10 + aese $ctr3b, $rkNm1 // AES block 4k+7 - round N-1 + eor $res2b, $ctr_t2b, $ctr2b // AES block 4k+6 - result + fmov $ctr2d, $ctr96_b64x // CTR block 4k+10 + st1 { $res2b}, [$output_ptr], #16 // AES block 4k+6 - store result + fmov $ctr2.d[1], $ctr32x // CTR block 4k+10 + rev $ctr32w, $rctr32w // CTR block 4k+11 + eor $acc_lb, $acc_lb, $acc_mb // MODULO - fold into low + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4k+11 + eor $res3b, $ctr_t3b, $ctr3b // AES block 4k+7 - result + st1 { $res3b}, [$output_ptr], #16 // AES block 4k+7 - store result + b.lt .Lenc_main_loop + +.Lenc_prepretail: // PREPRETAIL + aese $ctr1b, $rk0 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 0 + rev64 $res2b, $res2b // GHASH block 4k+2 (t0, t1, and t2 free) + aese $ctr2b, $rk0 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 0 + fmov $ctr3d, $ctr96_b64x // CTR block 4k+3 + aese $ctr0b, $rk0 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 0 + rev64 $res0b, $res0b // GHASH block 4k (only t0 is free) + fmov $ctr3.d[1], $ctr32x // CTR block 4k+3 + ext $acc_lb, $acc_lb, $acc_lb, #8 // PRE 0 + aese $ctr2b, $rk1 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 1 + aese $ctr0b, $rk1 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 1 + eor $res0b, $res0b, $acc_lb // PRE 1 + rev64 $res1b, $res1b // GHASH block 4k+1 (t0 and t1 free) + aese $ctr2b, $rk2 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 2 + aese $ctr3b, $rk0 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 0 + mov $acc_md, $h34k.d[1] // GHASH block 4k - mid + aese $ctr1b, $rk1 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 1 + pmull $acc_l.1q, $res0.1d, $h4.1d // GHASH block 4k - low + mov $t0d, $res0.d[1] // GHASH block 4k - mid + pmull2 $acc_h.1q, $res0.2d, $h4.2d // GHASH block 4k - high + aese $ctr2b, $rk3 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 3 + aese $ctr1b, $rk2 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 2 + eor $t0.8b, $t0.8b, $res0.8b // GHASH block 4k - mid + aese $ctr0b, $rk2 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 2 + aese $ctr3b, $rk1 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 1 + aese $ctr1b, $rk3 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 3 + pmull $acc_m.1q, $t0.1d, $acc_m.1d // GHASH block 4k - mid + pmull2 $t1.1q, $res1.2d, $h3.2d // GHASH block 4k+1 - high + pmull $t2.1q, $res1.1d, $h3.1d // GHASH block 4k+1 - low + aese $ctr3b, $rk2 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 2 + eor $acc_hb, $acc_hb, $t1.16b // GHASH block 4k+1 - high + mov $t3d, $res1.d[1] // GHASH block 4k+1 - mid + aese $ctr0b, $rk3 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 3 + eor $acc_lb, $acc_lb, $t2.16b // GHASH block 4k+1 - low + aese $ctr3b, $rk3 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 3 + eor $t3.8b, $t3.8b, $res1.8b // GHASH block 4k+1 - mid + mov $t6d, $res2.d[1] // GHASH block 4k+2 - mid + aese $ctr0b, $rk4 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 4 + rev64 $res3b, $res3b // GHASH block 4k+3 (t0, t1, t2 and t3 free) + aese $ctr3b, $rk4 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 4 + pmull $t3.1q, $t3.1d, $h34k.1d // GHASH block 4k+1 - mid + eor $t6.8b, $t6.8b, $res2.8b // GHASH block 4k+2 - mid + add $rctr32w, $rctr32w, #1 // CTR block 4k+3 + pmull $t5.1q, $res2.1d, $h2.1d // GHASH block 4k+2 - low + aese $ctr3b, $rk5 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 5 + aese $ctr2b, $rk4 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 4 + eor $acc_mb, $acc_mb, $t3.16b // GHASH block 4k+1 - mid + pmull2 $t4.1q, $res2.2d, $h2.2d // GHASH block 4k+2 - high + eor $acc_lb, $acc_lb, $t5.16b // GHASH block 4k+2 - low + ins $t6.d[1], $t6.d[0] // GHASH block 4k+2 - mid + aese $ctr2b, $rk5 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 5 + eor $acc_hb, $acc_hb, $t4.16b // GHASH block 4k+2 - high + mov $t9d, $res3.d[1] // GHASH block 4k+3 - mid + aese $ctr1b, $rk4 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 4 + pmull2 $t6.1q, $t6.2d, $h12k.2d // GHASH block 4k+2 - mid + eor $t9.8b, $t9.8b, $res3.8b // GHASH block 4k+3 - mid + pmull2 $t7.1q, $res3.2d, $h1.2d // GHASH block 4k+3 - high + aese $ctr1b, $rk5 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 5 + pmull $t9.1q, $t9.1d, $h12k.1d // GHASH block 4k+3 - mid + eor $acc_mb, $acc_mb, $t6.16b // GHASH block 4k+2 - mid + aese $ctr0b, $rk5 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 5 + aese $ctr1b, $rk6 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 6 + aese $ctr2b, $rk6 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 6 + aese $ctr0b, $rk6 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 6 + movi $mod_constant.8b, #0xc2 + aese $ctr3b, $rk6 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 6 + aese $ctr1b, $rk7 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 7 + eor $acc_hb, $acc_hb, $t7.16b // GHASH block 4k+3 - high + aese $ctr0b, $rk7 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 7 + aese $ctr3b, $rk7 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 7 + shl $mod_constantd, $mod_constantd, #56 // mod_constant + aese $ctr1b, $rk8 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 8 + eor $acc_mb, $acc_mb, $t9.16b // GHASH block 4k+3 - mid + pmull $t8.1q, $res3.1d, $h1.1d // GHASH block 4k+3 - low + aese $ctr3b, $rk8 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 8 + cmp $rounds, #12 // setup flags for AES-128/192/256 check + aese $ctr0b, $rk8 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 8 + eor $acc_lb, $acc_lb, $t8.16b // GHASH block 4k+3 - low + aese $ctr2b, $rk7 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 7 + eor $acc_mb, $acc_mb, $acc_hb // karatsuba tidy up + aese $ctr2b, $rk8 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 8 + pmull $t1.1q, $acc_h.1d, $mod_constant.1d + ext $acc_hb, $acc_hb, $acc_hb, #8 + eor $acc_mb, $acc_mb, $acc_lb + b.lt .Lenc_finish_prepretail // branch if AES-128 + + aese $ctr1b, $rk9 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 9 + aese $ctr3b, $rk9 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 9 + aese $ctr0b, $rk9 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 9 + aese $ctr2b, $rk9 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 9 + aese $ctr3b, $rk10 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 10 + aese $ctr1b, $rk10 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 10 + aese $ctr0b, $rk10 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 10 + aese $ctr2b, $rk10 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 10 + b.eq .Lenc_finish_prepretail // branch if AES-192 + + aese $ctr1b, $rk11 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 11 + aese $ctr0b, $rk11 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 11 + aese $ctr3b, $rk11 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 11 + aese $ctr2b, $rk11 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 11 + aese $ctr1b, $rk12 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 12 + aese $ctr0b, $rk12 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 12 + aese $ctr3b, $rk12 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 12 + aese $ctr2b, $rk12 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 12 + +.Lenc_finish_prepretail: + eor $acc_mb, $acc_mb, $t1.16b + eor $acc_mb, $acc_mb, $acc_hb + pmull $t1.1q, $acc_m.1d, $mod_constant.1d + ext $acc_mb, $acc_mb, $acc_mb, #8 + aese $ctr1b, $rkNm1 // AES block 4k+5 - round N-1 + eor $acc_lb, $acc_lb, $t1.16b + aese $ctr3b, $rkNm1 // AES block 4k+7 - round N-1 + aese $ctr0b, $rkNm1 // AES block 4k+4 - round N-1 + aese $ctr2b, $rkNm1 // AES block 4k+6 - round N-1 + eor $acc_lb, $acc_lb, $acc_mb + +.Lenc_tail: // TAIL + ext $t0.16b, $acc_lb, $acc_lb, #8 // prepare final partial tag + sub $main_end_input_ptr, $end_input_ptr, $input_ptr // main_end_input_ptr is number of bytes left to process + ldp $input_l0, $input_h0, [$input_ptr], #16 // AES block 4k+4 - load plaintext + eor $input_l0, $input_l0, $rkN_l // AES block 4k+4 - round N low + eor $input_h0, $input_h0, $rkN_h // AES block 4k+4 - round N high + cmp $main_end_input_ptr, #48 + fmov $ctr_t0d, $input_l0 // AES block 4k+4 - mov low + fmov $ctr_t0.d[1], $input_h0 // AES block 4k+4 - mov high + eor $res1b, $ctr_t0b, $ctr0b // AES block 4k+4 - result + b.gt .Lenc_blocks_more_than_3 + cmp $main_end_input_ptr, #32 + mov $ctr3b, $ctr2b + movi $acc_l.8b, #0 + movi $acc_h.8b, #0 + sub $rctr32w, $rctr32w, #1 + mov $ctr2b, $ctr1b + movi $acc_m.8b, #0 + b.gt .Lenc_blocks_more_than_2 + mov $ctr3b, $ctr1b + sub $rctr32w, $rctr32w, #1 + cmp $main_end_input_ptr, #16 + b.gt .Lenc_blocks_more_than_1 + sub $rctr32w, $rctr32w, #1 + b .Lenc_blocks_less_than_1 +.Lenc_blocks_more_than_3: // blocks left > 3 + st1 { $res1b}, [$output_ptr], #16 // AES final-3 block - store result + ldp $input_l0, $input_h0, [$input_ptr], #16 // AES final-2 block - load input low & high + rev64 $res0b, $res1b // GHASH final-3 block + eor $input_l0, $input_l0, $rkN_l // AES final-2 block - round N low + eor $res0b, $res0b, $t0.16b // feed in partial tag + eor $input_h0, $input_h0, $rkN_h // AES final-2 block - round N high + mov $rk4d, $res0.d[1] // GHASH final-3 block - mid + fmov $res1d, $input_l0 // AES final-2 block - mov low + fmov $res1.d[1], $input_h0 // AES final-2 block - mov high + eor $rk4v.8b, $rk4v.8b, $res0.8b // GHASH final-3 block - mid + movi $t0.8b, #0 // suppress further partial tag feed in + mov $acc_md, $h34k.d[1] // GHASH final-3 block - mid + pmull $acc_l.1q, $res0.1d, $h4.1d // GHASH final-3 block - low + pmull2 $acc_h.1q, $res0.2d, $h4.2d // GHASH final-3 block - high + pmull $acc_m.1q, $rk4v.1d, $acc_m.1d // GHASH final-3 block - mid + eor $res1b, $res1b, $ctr1b // AES final-2 block - result +.Lenc_blocks_more_than_2: // blocks left > 2 + st1 { $res1b}, [$output_ptr], #16 // AES final-2 block - store result + ldp $input_l0, $input_h0, [$input_ptr], #16 // AES final-1 block - load input low & high + rev64 $res0b, $res1b // GHASH final-2 block + eor $input_l0, $input_l0, $rkN_l // AES final-1 block - round N low + eor $res0b, $res0b, $t0.16b // feed in partial tag + fmov $res1d, $input_l0 // AES final-1 block - mov low + eor $input_h0, $input_h0, $rkN_h // AES final-1 block - round N high + fmov $res1.d[1], $input_h0 // AES final-1 block - mov high + movi $t0.8b, #0 // suppress further partial tag feed in + pmull2 $rk2q1, $res0.2d, $h3.2d // GHASH final-2 block - high + mov $rk4d, $res0.d[1] // GHASH final-2 block - mid + pmull $rk3q1, $res0.1d, $h3.1d // GHASH final-2 block - low + eor $rk4v.8b, $rk4v.8b, $res0.8b // GHASH final-2 block - mid + eor $res1b, $res1b, $ctr2b // AES final-1 block - result + eor $acc_hb, $acc_hb, $rk2 // GHASH final-2 block - high + pmull $rk4v.1q, $rk4v.1d, $h34k.1d // GHASH final-2 block - mid + eor $acc_lb, $acc_lb, $rk3 // GHASH final-2 block - low + eor $acc_mb, $acc_mb, $rk4v.16b // GHASH final-2 block - mid +.Lenc_blocks_more_than_1: // blocks left > 1 + st1 { $res1b}, [$output_ptr], #16 // AES final-1 block - store result + rev64 $res0b, $res1b // GHASH final-1 block + ldp $input_l0, $input_h0, [$input_ptr], #16 // AES final block - load input low & high + eor $res0b, $res0b, $t0.16b // feed in partial tag + movi $t0.8b, #0 // suppress further partial tag feed in + eor $input_l0, $input_l0, $rkN_l // AES final block - round N low + mov $rk4d, $res0.d[1] // GHASH final-1 block - mid + pmull2 $rk2q1, $res0.2d, $h2.2d // GHASH final-1 block - high + eor $input_h0, $input_h0, $rkN_h // AES final block - round N high + eor $rk4v.8b, $rk4v.8b, $res0.8b // GHASH final-1 block - mid + eor $acc_hb, $acc_hb, $rk2 // GHASH final-1 block - high + ins $rk4v.d[1], $rk4v.d[0] // GHASH final-1 block - mid + fmov $res1d, $input_l0 // AES final block - mov low + fmov $res1.d[1], $input_h0 // AES final block - mov high + pmull2 $rk4v.1q, $rk4v.2d, $h12k.2d // GHASH final-1 block - mid + pmull $rk3q1, $res0.1d, $h2.1d // GHASH final-1 block - low + eor $res1b, $res1b, $ctr3b // AES final block - result + eor $acc_mb, $acc_mb, $rk4v.16b // GHASH final-1 block - mid + eor $acc_lb, $acc_lb, $rk3 // GHASH final-1 block - low +.Lenc_blocks_less_than_1: // blocks left <= 1 + and $bit_length, $bit_length, #127 // bit_length %= 128 + mvn $rkN_l, xzr // rkN_l = 0xffffffffffffffff + sub $bit_length, $bit_length, #128 // bit_length -= 128 + neg $bit_length, $bit_length // bit_length = 128 - #bits in input (in range [1,128]) + ld1 { $rk0}, [$output_ptr] // load existing bytes where the possibly partial last block is to be stored + mvn $rkN_h, xzr // rkN_h = 0xffffffffffffffff + and $bit_length, $bit_length, #127 // bit_length %= 128 + lsr $rkN_h, $rkN_h, $bit_length // rkN_h is mask for top 64b of last block + cmp $bit_length, #64 + csel $input_l0, $rkN_l, $rkN_h, lt + csel $input_h0, $rkN_h, xzr, lt + fmov $ctr0d, $input_l0 // ctr0b is mask for last block + fmov $ctr0.d[1], $input_h0 + and $res1b, $res1b, $ctr0b // possibly partial last block has zeroes in highest bits + rev64 $res0b, $res1b // GHASH final block + eor $res0b, $res0b, $t0.16b // feed in partial tag + bif $res1b, $rk0, $ctr0b // insert existing bytes in top end of result before storing + pmull2 $rk2q1, $res0.2d, $h1.2d // GHASH final block - high + mov $t0d, $res0.d[1] // GHASH final block - mid + rev $ctr32w, $rctr32w + pmull $rk3q1, $res0.1d, $h1.1d // GHASH final block - low + eor $acc_hb, $acc_hb, $rk2 // GHASH final block - high + eor $t0.8b, $t0.8b, $res0.8b // GHASH final block - mid + pmull $t0.1q, $t0.1d, $h12k.1d // GHASH final block - mid + eor $acc_lb, $acc_lb, $rk3 // GHASH final block - low + eor $acc_mb, $acc_mb, $t0.16b // GHASH final block - mid + movi $mod_constant.8b, #0xc2 + eor $t9.16b, $acc_lb, $acc_hb // MODULO - karatsuba tidy up + shl $mod_constantd, $mod_constantd, #56 // mod_constant + eor $acc_mb, $acc_mb, $t9.16b // MODULO - karatsuba tidy up + pmull $mod_t.1q, $acc_h.1d, $mod_constant.1d // MODULO - top 64b align with mid + ext $acc_hb, $acc_hb, $acc_hb, #8 // MODULO - other top alignment + eor $acc_mb, $acc_mb, $mod_t.16b // MODULO - fold into mid + eor $acc_mb, $acc_mb, $acc_hb // MODULO - fold into mid + pmull $acc_h.1q, $acc_m.1d, $mod_constant.1d // MODULO - mid 64b align with low + ext $acc_mb, $acc_mb, $acc_mb, #8 // MODULO - other mid alignment + str $ctr32w, [$counter, #12] // store the updated counter + st1 { $res1b}, [$output_ptr] // store all 16B + eor $acc_lb, $acc_lb, $acc_hb // MODULO - fold into low + eor $acc_lb, $acc_lb, $acc_mb // MODULO - fold into low + ext $acc_lb, $acc_lb, $acc_lb, #8 + rev64 $acc_lb, $acc_lb + mov x0, $len + st1 { $acc_l.16b }, [$current_tag] + ldp x19, x20, [sp, #16] + ldp x21, x22, [sp, #32] + ldp x23, x24, [sp, #48] + ldp d8, d9, [sp, #64] + ldp d10, d11, [sp, #80] + ldp d12, d13, [sp, #96] + ldp d14, d15, [sp, #112] + ldp x29, x30, [sp], #128 + AARCH64_VALIDATE_LINK_REGISTER + ret +.size aes_gcm_enc_kernel,.-aes_gcm_enc_kernel +___ + +{ +my $t8="v4"; +my $t8d="d4"; +my $t9="v6"; +my $t9d="d6"; +################################################################################ +# size_t aes_gcm_dec_kernel(const uint8_t *in, +# size_t len_bits, +# uint8_t *out, +# u64 *Xi, +# uint8_t ivec[16], +# const void *key); +# +$code.=<<___; +.global aes_gcm_dec_kernel +.type aes_gcm_dec_kernel,%function +.align 4 +aes_gcm_dec_kernel: + AARCH64_SIGN_LINK_REGISTER + stp x29, x30, [sp, #-128]! + mov x29, sp + stp x19, x20, [sp, #16] + mov $counter, x4 + mov $cc, x5 + stp x21, x22, [sp, #32] + stp x23, x24, [sp, #48] + stp d8, d9, [sp, #64] + stp d10, d11, [sp, #80] + stp d12, d13, [sp, #96] + stp d14, d15, [sp, #112] + ldr $roundsw, [$cc, #240] + add $input_l1, $cc, $rounds, lsl #4 // borrow input_l1 for last key + ldp $rkN_l, $rkN_h, [$input_l1] // load round N keys + ldr $rkNm1q, [$input_l1, #-16] // load round N-1 keys + lsr $main_end_input_ptr, $bit_length, #3 // byte_len + mov $len, $main_end_input_ptr + ldp $ctr96_b64x, $ctr96_t32x, [$counter] // ctr96_b64, ctr96_t32 + ldr $rk8q, [$cc, #128] // load rk8 + sub $main_end_input_ptr, $main_end_input_ptr, #1 // byte_len - 1 + ldr $rk7q, [$cc, #112] // load rk7 + and $main_end_input_ptr, $main_end_input_ptr, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + add $end_input_ptr, $input_ptr, $bit_length, lsr #3 // end_input_ptr + ldr $rk6q, [$cc, #96] // load rk6 + lsr $rctr32x, $ctr96_t32x, #32 + ldr $rk5q, [$cc, #80] // load rk5 + orr $ctr96_t32w, $ctr96_t32w, $ctr96_t32w + ldr $rk3q, [$cc, #48] // load rk3 + add $main_end_input_ptr, $main_end_input_ptr, $input_ptr + rev $rctr32w, $rctr32w // rev_ctr32 + add $rctr32w, $rctr32w, #1 // increment rev_ctr32 + fmov $ctr3d, $ctr96_b64x // CTR block 3 + rev $ctr32w, $rctr32w // CTR block 1 + add $rctr32w, $rctr32w, #1 // CTR block 1 + fmov $ctr1d, $ctr96_b64x // CTR block 1 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 1 + ld1 { $ctr0b}, [$counter] // special case vector load initial counter so we can start first AES block as quickly as possible + fmov $ctr1.d[1], $ctr32x // CTR block 1 + rev $ctr32w, $rctr32w // CTR block 2 + add $rctr32w, $rctr32w, #1 // CTR block 2 + fmov $ctr2d, $ctr96_b64x // CTR block 2 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 2 + fmov $ctr2.d[1], $ctr32x // CTR block 2 + rev $ctr32w, $rctr32w // CTR block 3 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 3 + ldr $rk0q, [$cc, #0] // load rk0 + fmov $ctr3.d[1], $ctr32x // CTR block 3 + add $rctr32w, $rctr32w, #1 // CTR block 3 + ldr $rk4q, [$cc, #64] // load rk4 + ldr $rk1q, [$cc, #16] // load rk1 + aese $ctr0b, $rk0 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 0 + ldr $h3q, [$current_tag, #80] // load h3l | h3h + ext $h3b, $h3b, $h3b, #8 + aese $ctr3b, $rk0 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 0 + ldr $h4q, [$current_tag, #112] // load h4l | h4h + ext $h4b, $h4b, $h4b, #8 + aese $ctr1b, $rk0 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 0 + ldr $h2q, [$current_tag, #64] // load h2l | h2h + ext $h2b, $h2b, $h2b, #8 + aese $ctr2b, $rk0 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 0 + ldr $rk2q, [$cc, #32] // load rk2 + aese $ctr0b, $rk1 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 1 + aese $ctr1b, $rk1 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 1 + ld1 { $acc_lb}, [$current_tag] + ext $acc_lb, $acc_lb, $acc_lb, #8 + rev64 $acc_lb, $acc_lb + aese $ctr2b, $rk1 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 1 + ldr $rk9q, [$cc, #144] // load rk9 + aese $ctr3b, $rk1 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 1 + ldr $rk12q, [$cc, #192] // load rk12 + aese $ctr0b, $rk2 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 2 + ldr $h1q, [$current_tag, #32] // load h1l | h1h + ext $h1b, $h1b, $h1b, #8 + aese $ctr2b, $rk2 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 2 + ldr $rk10q, [$cc, #160] // load rk10 + aese $ctr3b, $rk2 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 2 + aese $ctr0b, $rk3 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 3 + aese $ctr1b, $rk2 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 2 + aese $ctr3b, $rk3 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 3 + aese $ctr0b, $rk4 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 4 + aese $ctr2b, $rk3 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 3 + aese $ctr1b, $rk3 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 3 + aese $ctr3b, $rk4 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 4 + aese $ctr2b, $rk4 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 4 + aese $ctr1b, $rk4 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 4 + aese $ctr3b, $rk5 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 5 + aese $ctr0b, $rk5 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 5 + aese $ctr1b, $rk5 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 5 + aese $ctr2b, $rk5 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 5 + aese $ctr0b, $rk6 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 6 + aese $ctr3b, $rk6 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 6 + cmp $rounds, #12 // setup flags for AES-128/192/256 check + aese $ctr1b, $rk6 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 6 + aese $ctr2b, $rk6 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 6 + aese $ctr0b, $rk7 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 7 + aese $ctr1b, $rk7 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 7 + aese $ctr3b, $rk7 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 7 + aese $ctr0b, $rk8 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 8 + aese $ctr2b, $rk7 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 7 + aese $ctr3b, $rk8 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 8 + aese $ctr1b, $rk8 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 8 + ldr $rk11q, [$cc, #176] // load rk11 + aese $ctr2b, $rk8 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 8 + b.lt .Ldec_finish_first_blocks // branch if AES-128 + + aese $ctr0b, $rk9 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 9 + aese $ctr1b, $rk9 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 9 + aese $ctr3b, $rk9 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 9 + aese $ctr2b, $rk9 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 9 + aese $ctr0b, $rk10 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 10 + aese $ctr1b, $rk10 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 10 + aese $ctr3b, $rk10 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 10 + aese $ctr2b, $rk10 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 10 + b.eq .Ldec_finish_first_blocks // branch if AES-192 + + aese $ctr0b, $rk11 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 11 + aese $ctr3b, $rk11 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 11 + aese $ctr1b, $rk11 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 11 + aese $ctr2b, $rk11 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 11 + aese $ctr1b, $rk12 \n aesmc $ctr1b, $ctr1b // AES block 1 - round 12 + aese $ctr0b, $rk12 \n aesmc $ctr0b, $ctr0b // AES block 0 - round 12 + aese $ctr2b, $rk12 \n aesmc $ctr2b, $ctr2b // AES block 2 - round 12 + aese $ctr3b, $rk12 \n aesmc $ctr3b, $ctr3b // AES block 3 - round 12 + +.Ldec_finish_first_blocks: + cmp $input_ptr, $main_end_input_ptr // check if we have <= 4 blocks + trn1 $acc_h.2d, $h3.2d, $h4.2d // h4h | h3h + trn2 $h34k.2d, $h3.2d, $h4.2d // h4l | h3l + trn1 $t0.2d, $h1.2d, $h2.2d // h2h | h1h + trn2 $h12k.2d, $h1.2d, $h2.2d // h2l | h1l + eor $h34k.16b, $h34k.16b, $acc_h.16b // h4k | h3k + aese $ctr1b, $rkNm1 // AES block 1 - round N-1 + aese $ctr2b, $rkNm1 // AES block 2 - round N-1 + eor $h12k.16b, $h12k.16b, $t0.16b // h2k | h1k + aese $ctr3b, $rkNm1 // AES block 3 - round N-1 + aese $ctr0b, $rkNm1 // AES block 0 - round N-1 + b.ge .Ldec_tail // handle tail + + ldr $res0q, [$input_ptr, #0] // AES block 0 - load ciphertext + ldr $res1q, [$input_ptr, #16] // AES block 1 - load ciphertext + rev $ctr32w, $rctr32w // CTR block 4 + eor $ctr0b, $res0b, $ctr0b // AES block 0 - result + eor $ctr1b, $res1b, $ctr1b // AES block 1 - result + rev64 $res1b, $res1b // GHASH block 1 + ldr $res3q, [$input_ptr, #48] // AES block 3 - load ciphertext + mov $output_h0, $ctr0.d[1] // AES block 0 - mov high + mov $output_l0, $ctr0.d[0] // AES block 0 - mov low + rev64 $res0b, $res0b // GHASH block 0 + add $rctr32w, $rctr32w, #1 // CTR block 4 + fmov $ctr0d, $ctr96_b64x // CTR block 4 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4 + fmov $ctr0.d[1], $ctr32x // CTR block 4 + rev $ctr32w, $rctr32w // CTR block 5 + add $rctr32w, $rctr32w, #1 // CTR block 5 + mov $output_l1, $ctr1.d[0] // AES block 1 - mov low + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 5 + mov $output_h1, $ctr1.d[1] // AES block 1 - mov high + eor $output_h0, $output_h0, $rkN_h // AES block 0 - round N high + eor $output_l0, $output_l0, $rkN_l // AES block 0 - round N low + stp $output_l0, $output_h0, [$output_ptr], #16 // AES block 0 - store result + fmov $ctr1d, $ctr96_b64x // CTR block 5 + ldr $res2q, [$input_ptr, #32] // AES block 2 - load ciphertext + add $input_ptr, $input_ptr, #64 // AES input_ptr update + fmov $ctr1.d[1], $ctr32x // CTR block 5 + rev $ctr32w, $rctr32w // CTR block 6 + add $rctr32w, $rctr32w, #1 // CTR block 6 + eor $output_l1, $output_l1, $rkN_l // AES block 1 - round N low + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 6 + eor $output_h1, $output_h1, $rkN_h // AES block 1 - round N high + stp $output_l1, $output_h1, [$output_ptr], #16 // AES block 1 - store result + eor $ctr2b, $res2b, $ctr2b // AES block 2 - result + cmp $input_ptr, $main_end_input_ptr // check if we have <= 8 blocks + b.ge .Ldec_prepretail // do prepretail + +.Ldec_main_loop: // main loop start + mov $output_l2, $ctr2.d[0] // AES block 4k+2 - mov low + ext $acc_lb, $acc_lb, $acc_lb, #8 // PRE 0 + eor $ctr3b, $res3b, $ctr3b // AES block 4k+3 - result + aese $ctr0b, $rk0 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 0 + mov $output_h2, $ctr2.d[1] // AES block 4k+2 - mov high + aese $ctr1b, $rk0 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 0 + fmov $ctr2d, $ctr96_b64x // CTR block 4k+6 + fmov $ctr2.d[1], $ctr32x // CTR block 4k+6 + eor $res0b, $res0b, $acc_lb // PRE 1 + rev $ctr32w, $rctr32w // CTR block 4k+7 + aese $ctr0b, $rk1 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 1 + mov $output_h3, $ctr3.d[1] // AES block 4k+3 - mov high + aese $ctr1b, $rk1 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 1 + mov $output_l3, $ctr3.d[0] // AES block 4k+3 - mov low + pmull2 $acc_h.1q, $res0.2d, $h4.2d // GHASH block 4k - high + mov $t0d, $res0.d[1] // GHASH block 4k - mid + fmov $ctr3d, $ctr96_b64x // CTR block 4k+7 + aese $ctr0b, $rk2 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 2 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4k+7 + aese $ctr2b, $rk0 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 0 + fmov $ctr3.d[1], $ctr32x // CTR block 4k+7 + aese $ctr1b, $rk2 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 2 + eor $t0.8b, $t0.8b, $res0.8b // GHASH block 4k - mid + aese $ctr0b, $rk3 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 3 + eor $output_h2, $output_h2, $rkN_h // AES block 4k+2 - round N high + aese $ctr2b, $rk1 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 1 + mov $acc_md, $h34k.d[1] // GHASH block 4k - mid + aese $ctr1b, $rk3 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 3 + rev64 $res2b, $res2b // GHASH block 4k+2 + aese $ctr3b, $rk0 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 0 + eor $output_l2, $output_l2, $rkN_l // AES block 4k+2 - round N low + aese $ctr2b, $rk2 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 2 + stp $output_l2, $output_h2, [$output_ptr], #16 // AES block 4k+2 - store result + pmull $acc_l.1q, $res0.1d, $h4.1d // GHASH block 4k - low + pmull2 $t1.1q, $res1.2d, $h3.2d // GHASH block 4k+1 - high + aese $ctr2b, $rk3 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 3 + rev64 $res3b, $res3b // GHASH block 4k+3 + pmull $acc_m.1q, $t0.1d, $acc_m.1d // GHASH block 4k - mid + eor $output_l3, $output_l3, $rkN_l // AES block 4k+3 - round N low + pmull $t2.1q, $res1.1d, $h3.1d // GHASH block 4k+1 - low + eor $output_h3, $output_h3, $rkN_h // AES block 4k+3 - round N high + eor $acc_hb, $acc_hb, $t1.16b // GHASH block 4k+1 - high + aese $ctr2b, $rk4 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 4 + aese $ctr3b, $rk1 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 1 + mov $t3d, $res1.d[1] // GHASH block 4k+1 - mid + aese $ctr0b, $rk4 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 4 + eor $acc_lb, $acc_lb, $t2.16b // GHASH block 4k+1 - low + aese $ctr2b, $rk5 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 5 + add $rctr32w, $rctr32w, #1 // CTR block 4k+7 + aese $ctr3b, $rk2 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 2 + mov $t6d, $res2.d[1] // GHASH block 4k+2 - mid + aese $ctr1b, $rk4 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 4 + eor $t3.8b, $t3.8b, $res1.8b // GHASH block 4k+1 - mid + pmull $t5.1q, $res2.1d, $h2.1d // GHASH block 4k+2 - low + aese $ctr3b, $rk3 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 3 + eor $t6.8b, $t6.8b, $res2.8b // GHASH block 4k+2 - mid + aese $ctr1b, $rk5 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 5 + aese $ctr0b, $rk5 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 5 + eor $acc_lb, $acc_lb, $t5.16b // GHASH block 4k+2 - low + pmull $t3.1q, $t3.1d, $h34k.1d // GHASH block 4k+1 - mid + rev $ctr32w, $rctr32w // CTR block 4k+8 + aese $ctr1b, $rk6 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 6 + ins $t6.d[1], $t6.d[0] // GHASH block 4k+2 - mid + aese $ctr0b, $rk6 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 6 + add $rctr32w, $rctr32w, #1 // CTR block 4k+8 + aese $ctr3b, $rk4 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 4 + aese $ctr1b, $rk7 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 7 + eor $acc_mb, $acc_mb, $t3.16b // GHASH block 4k+1 - mid + aese $ctr0b, $rk7 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 7 + pmull2 $t4.1q, $res2.2d, $h2.2d // GHASH block 4k+2 - high + mov $t9d, $res3.d[1] // GHASH block 4k+3 - mid + aese $ctr3b, $rk5 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 5 + pmull2 $t6.1q, $t6.2d, $h12k.2d // GHASH block 4k+2 - mid + aese $ctr0b, $rk8 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 8 + eor $acc_hb, $acc_hb, $t4.16b // GHASH block 4k+2 - high + aese $ctr3b, $rk6 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 6 + pmull $t8.1q, $res3.1d, $h1.1d // GHASH block 4k+3 - low + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4k+8 + eor $acc_mb, $acc_mb, $t6.16b // GHASH block 4k+2 - mid + pmull2 $t7.1q, $res3.2d, $h1.2d // GHASH block 4k+3 - high + cmp $rounds, #12 // setup flags for AES-128/192/256 check + eor $t9.8b, $t9.8b, $res3.8b // GHASH block 4k+3 - mid + aese $ctr1b, $rk8 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 8 + aese $ctr2b, $rk6 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 6 + eor $acc_hb, $acc_hb, $t7.16b // GHASH block 4k+3 - high + pmull $t9.1q, $t9.1d, $h12k.1d // GHASH block 4k+3 - mid + movi $mod_constant.8b, #0xc2 + aese $ctr2b, $rk7 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 7 + eor $acc_lb, $acc_lb, $t8.16b // GHASH block 4k+3 - low + aese $ctr3b, $rk7 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 7 + shl $mod_constantd, $mod_constantd, #56 // mod_constant + aese $ctr2b, $rk8 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 8 + eor $acc_mb, $acc_mb, $t9.16b // GHASH block 4k+3 - mid + aese $ctr3b, $rk8 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 8 + b.lt .Ldec_main_loop_continue // branch if AES-128 + + aese $ctr0b, $rk9 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 9 + aese $ctr2b, $rk9 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 9 + aese $ctr1b, $rk9 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 9 + aese $ctr3b, $rk9 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 9 + aese $ctr0b, $rk10 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 10 + aese $ctr1b, $rk10 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 10 + aese $ctr2b, $rk10 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 10 + aese $ctr3b, $rk10 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 10 + b.eq .Ldec_main_loop_continue // branch if AES-192 + + aese $ctr0b, $rk11 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 11 + aese $ctr1b, $rk11 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 11 + aese $ctr2b, $rk11 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 11 + aese $ctr3b, $rk11 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 11 + aese $ctr0b, $rk12 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 12 + aese $ctr1b, $rk12 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 12 + aese $ctr2b, $rk12 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 12 + aese $ctr3b, $rk12 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 12 + +.Ldec_main_loop_continue: + pmull $mod_t.1q, $acc_h.1d, $mod_constant.1d // MODULO - top 64b align with mid + eor $t9.16b, $acc_lb, $acc_hb // MODULO - karatsuba tidy up + ldr $res0q, [$input_ptr, #0] // AES block 4k+4 - load ciphertext + aese $ctr0b, $rkNm1 // AES block 4k+4 - round N-1 + ext $acc_hb, $acc_hb, $acc_hb, #8 // MODULO - other top alignment + eor $acc_mb, $acc_mb, $t9.16b // MODULO - karatsuba tidy up + ldr $res1q, [$input_ptr, #16] // AES block 4k+5 - load ciphertext + eor $ctr0b, $res0b, $ctr0b // AES block 4k+4 - result + stp $output_l3, $output_h3, [$output_ptr], #16 // AES block 4k+3 - store result + eor $acc_mb, $acc_mb, $mod_t.16b // MODULO - fold into mid + ldr $res3q, [$input_ptr, #48] // AES block 4k+7 - load ciphertext + ldr $res2q, [$input_ptr, #32] // AES block 4k+6 - load ciphertext + mov $output_h0, $ctr0.d[1] // AES block 4k+4 - mov high + eor $acc_mb, $acc_mb, $acc_hb // MODULO - fold into mid + aese $ctr1b, $rkNm1 // AES block 4k+5 - round N-1 + add $input_ptr, $input_ptr, #64 // AES input_ptr update + mov $output_l0, $ctr0.d[0] // AES block 4k+4 - mov low + fmov $ctr0d, $ctr96_b64x // CTR block 4k+8 + fmov $ctr0.d[1], $ctr32x // CTR block 4k+8 + pmull $mod_constant.1q, $acc_m.1d, $mod_constant.1d // MODULO - mid 64b align with low + eor $ctr1b, $res1b, $ctr1b // AES block 4k+5 - result + rev $ctr32w, $rctr32w // CTR block 4k+9 + aese $ctr2b, $rkNm1 // AES block 4k+6 - round N-1 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4k+9 + cmp $input_ptr, $main_end_input_ptr // LOOP CONTROL + add $rctr32w, $rctr32w, #1 // CTR block 4k+9 + eor $output_l0, $output_l0, $rkN_l // AES block 4k+4 - round N low + eor $output_h0, $output_h0, $rkN_h // AES block 4k+4 - round N high + mov $output_h1, $ctr1.d[1] // AES block 4k+5 - mov high + eor $ctr2b, $res2b, $ctr2b // AES block 4k+6 - result + eor $acc_lb, $acc_lb, $mod_constant.16b // MODULO - fold into low + mov $output_l1, $ctr1.d[0] // AES block 4k+5 - mov low + fmov $ctr1d, $ctr96_b64x // CTR block 4k+9 + ext $acc_mb, $acc_mb, $acc_mb, #8 // MODULO - other mid alignment + fmov $ctr1.d[1], $ctr32x // CTR block 4k+9 + rev $ctr32w, $rctr32w // CTR block 4k+10 + add $rctr32w, $rctr32w, #1 // CTR block 4k+10 + aese $ctr3b, $rkNm1 // AES block 4k+7 - round N-1 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4k+10 + rev64 $res1b, $res1b // GHASH block 4k+5 + eor $output_h1, $output_h1, $rkN_h // AES block 4k+5 - round N high + stp $output_l0, $output_h0, [$output_ptr], #16 // AES block 4k+4 - store result + eor $output_l1, $output_l1, $rkN_l // AES block 4k+5 - round N low + stp $output_l1, $output_h1, [$output_ptr], #16 // AES block 4k+5 - store result + rev64 $res0b, $res0b // GHASH block 4k+4 + eor $acc_lb, $acc_lb, $acc_mb // MODULO - fold into low + b.lt .Ldec_main_loop + +.Ldec_prepretail: // PREPRETAIL + ext $acc_lb, $acc_lb, $acc_lb, #8 // PRE 0 + mov $output_l2, $ctr2.d[0] // AES block 4k+2 - mov low + eor $ctr3b, $res3b, $ctr3b // AES block 4k+3 - result + aese $ctr0b, $rk0 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 0 + mov $output_h2, $ctr2.d[1] // AES block 4k+2 - mov high + aese $ctr1b, $rk0 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 0 + fmov $ctr2d, $ctr96_b64x // CTR block 4k+6 + fmov $ctr2.d[1], $ctr32x // CTR block 4k+6 + rev $ctr32w, $rctr32w // CTR block 4k+7 + eor $res0b, $res0b, $acc_lb // PRE 1 + rev64 $res2b, $res2b // GHASH block 4k+2 + orr $ctr32x, $ctr96_t32x, $ctr32x, lsl #32 // CTR block 4k+7 + mov $output_l3, $ctr3.d[0] // AES block 4k+3 - mov low + aese $ctr1b, $rk1 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 1 + mov $output_h3, $ctr3.d[1] // AES block 4k+3 - mov high + pmull $acc_l.1q, $res0.1d, $h4.1d // GHASH block 4k - low + mov $t0d, $res0.d[1] // GHASH block 4k - mid + fmov $ctr3d, $ctr96_b64x // CTR block 4k+7 + pmull2 $acc_h.1q, $res0.2d, $h4.2d // GHASH block 4k - high + fmov $ctr3.d[1], $ctr32x // CTR block 4k+7 + aese $ctr2b, $rk0 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 0 + mov $acc_md, $h34k.d[1] // GHASH block 4k - mid + aese $ctr0b, $rk1 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 1 + eor $t0.8b, $t0.8b, $res0.8b // GHASH block 4k - mid + pmull2 $t1.1q, $res1.2d, $h3.2d // GHASH block 4k+1 - high + aese $ctr2b, $rk1 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 1 + rev64 $res3b, $res3b // GHASH block 4k+3 + aese $ctr3b, $rk0 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 0 + pmull $acc_m.1q, $t0.1d, $acc_m.1d // GHASH block 4k - mid + eor $acc_hb, $acc_hb, $t1.16b // GHASH block 4k+1 - high + pmull $t2.1q, $res1.1d, $h3.1d // GHASH block 4k+1 - low + aese $ctr3b, $rk1 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 1 + mov $t3d, $res1.d[1] // GHASH block 4k+1 - mid + aese $ctr0b, $rk2 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 2 + aese $ctr1b, $rk2 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 2 + eor $acc_lb, $acc_lb, $t2.16b // GHASH block 4k+1 - low + aese $ctr2b, $rk2 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 2 + aese $ctr0b, $rk3 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 3 + mov $t6d, $res2.d[1] // GHASH block 4k+2 - mid + aese $ctr3b, $rk2 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 2 + eor $t3.8b, $t3.8b, $res1.8b // GHASH block 4k+1 - mid + pmull $t5.1q, $res2.1d, $h2.1d // GHASH block 4k+2 - low + aese $ctr0b, $rk4 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 4 + aese $ctr3b, $rk3 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 3 + eor $t6.8b, $t6.8b, $res2.8b // GHASH block 4k+2 - mid + pmull $t3.1q, $t3.1d, $h34k.1d // GHASH block 4k+1 - mid + aese $ctr0b, $rk5 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 5 + eor $acc_lb, $acc_lb, $t5.16b // GHASH block 4k+2 - low + aese $ctr3b, $rk4 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 4 + pmull2 $t7.1q, $res3.2d, $h1.2d // GHASH block 4k+3 - high + eor $acc_mb, $acc_mb, $t3.16b // GHASH block 4k+1 - mid + pmull2 $t4.1q, $res2.2d, $h2.2d // GHASH block 4k+2 - high + aese $ctr3b, $rk5 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 5 + ins $t6.d[1], $t6.d[0] // GHASH block 4k+2 - mid + aese $ctr2b, $rk3 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 3 + aese $ctr1b, $rk3 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 3 + eor $acc_hb, $acc_hb, $t4.16b // GHASH block 4k+2 - high + pmull $t8.1q, $res3.1d, $h1.1d // GHASH block 4k+3 - low + aese $ctr2b, $rk4 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 4 + mov $t9d, $res3.d[1] // GHASH block 4k+3 - mid + aese $ctr1b, $rk4 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 4 + pmull2 $t6.1q, $t6.2d, $h12k.2d // GHASH block 4k+2 - mid + aese $ctr2b, $rk5 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 5 + eor $t9.8b, $t9.8b, $res3.8b // GHASH block 4k+3 - mid + aese $ctr1b, $rk5 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 5 + aese $ctr3b, $rk6 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 6 + eor $acc_mb, $acc_mb, $t6.16b // GHASH block 4k+2 - mid + aese $ctr2b, $rk6 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 6 + aese $ctr0b, $rk6 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 6 + movi $mod_constant.8b, #0xc2 + aese $ctr1b, $rk6 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 6 + eor $acc_lb, $acc_lb, $t8.16b // GHASH block 4k+3 - low + pmull $t9.1q, $t9.1d, $h12k.1d // GHASH block 4k+3 - mid + aese $ctr3b, $rk7 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 7 + cmp $rounds, #12 // setup flags for AES-128/192/256 check + eor $acc_hb, $acc_hb, $t7.16b // GHASH block 4k+3 - high + aese $ctr1b, $rk7 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 7 + aese $ctr0b, $rk7 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 7 + eor $acc_mb, $acc_mb, $t9.16b // GHASH block 4k+3 - mid + aese $ctr3b, $rk8 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 8 + aese $ctr2b, $rk7 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 7 + eor $t9.16b, $acc_lb, $acc_hb // MODULO - karatsuba tidy up + aese $ctr1b, $rk8 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 8 + aese $ctr0b, $rk8 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 8 + shl $mod_constantd, $mod_constantd, #56 // mod_constant + aese $ctr2b, $rk8 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 8 + b.lt .Ldec_finish_prepretail // branch if AES-128 + + aese $ctr1b, $rk9 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 9 + aese $ctr2b, $rk9 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 9 + aese $ctr3b, $rk9 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 9 + aese $ctr0b, $rk9 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 9 + aese $ctr2b, $rk10 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 10 + aese $ctr3b, $rk10 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 10 + aese $ctr0b, $rk10 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 10 + aese $ctr1b, $rk10 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 10 + b.eq .Ldec_finish_prepretail // branch if AES-192 + + aese $ctr2b, $rk11 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 11 + aese $ctr0b, $rk11 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 11 + aese $ctr1b, $rk11 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 11 + aese $ctr2b, $rk12 \n aesmc $ctr2b, $ctr2b // AES block 4k+6 - round 12 + aese $ctr3b, $rk11 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 11 + aese $ctr1b, $rk12 \n aesmc $ctr1b, $ctr1b // AES block 4k+5 - round 12 + aese $ctr0b, $rk12 \n aesmc $ctr0b, $ctr0b // AES block 4k+4 - round 12 + aese $ctr3b, $rk12 \n aesmc $ctr3b, $ctr3b // AES block 4k+7 - round 12 + +.Ldec_finish_prepretail: + eor $acc_mb, $acc_mb, $t9.16b // MODULO - karatsuba tidy up + pmull $mod_t.1q, $acc_h.1d, $mod_constant.1d // MODULO - top 64b align with mid + ext $acc_hb, $acc_hb, $acc_hb, #8 // MODULO - other top alignment + eor $acc_mb, $acc_mb, $mod_t.16b // MODULO - fold into mid + eor $output_h2, $output_h2, $rkN_h // AES block 4k+2 - round N high + eor $output_l3, $output_l3, $rkN_l // AES block 4k+3 - round N low + eor $acc_mb, $acc_mb, $acc_hb // MODULO - fold into mid + add $rctr32w, $rctr32w, #1 // CTR block 4k+7 + eor $output_l2, $output_l2, $rkN_l // AES block 4k+2 - round N low + pmull $mod_constant.1q, $acc_m.1d, $mod_constant.1d // MODULO - mid 64b align with low + eor $output_h3, $output_h3, $rkN_h // AES block 4k+3 - round N high + stp $output_l2, $output_h2, [$output_ptr], #16 // AES block 4k+2 - store result + ext $acc_mb, $acc_mb, $acc_mb, #8 // MODULO - other mid alignment + stp $output_l3, $output_h3, [$output_ptr], #16 // AES block 4k+3 - store result + + eor $acc_lb, $acc_lb, $mod_constant.16b // MODULO - fold into low + aese $ctr1b, $rkNm1 // AES block 4k+5 - round N-1 + aese $ctr0b, $rkNm1 // AES block 4k+4 - round N-1 + aese $ctr3b, $rkNm1 // AES block 4k+7 - round N-1 + aese $ctr2b, $rkNm1 // AES block 4k+6 - round N-1 + eor $acc_lb, $acc_lb, $acc_mb // MODULO - fold into low + +.Ldec_tail: // TAIL + sub $main_end_input_ptr, $end_input_ptr, $input_ptr // main_end_input_ptr is number of bytes left to process + ld1 { $res1b}, [$input_ptr], #16 // AES block 4k+4 - load ciphertext + eor $ctr0b, $res1b, $ctr0b // AES block 4k+4 - result + mov $output_l0, $ctr0.d[0] // AES block 4k+4 - mov low + mov $output_h0, $ctr0.d[1] // AES block 4k+4 - mov high + ext $t0.16b, $acc_lb, $acc_lb, #8 // prepare final partial tag + cmp $main_end_input_ptr, #48 + eor $output_l0, $output_l0, $rkN_l // AES block 4k+4 - round N low + eor $output_h0, $output_h0, $rkN_h // AES block 4k+4 - round N high + b.gt .Ldec_blocks_more_than_3 + sub $rctr32w, $rctr32w, #1 + mov $ctr3b, $ctr2b + movi $acc_m.8b, #0 + movi $acc_l.8b, #0 + cmp $main_end_input_ptr, #32 + movi $acc_h.8b, #0 + mov $ctr2b, $ctr1b + b.gt .Ldec_blocks_more_than_2 + sub $rctr32w, $rctr32w, #1 + mov $ctr3b, $ctr1b + cmp $main_end_input_ptr, #16 + b.gt .Ldec_blocks_more_than_1 + sub $rctr32w, $rctr32w, #1 + b .Ldec_blocks_less_than_1 +.Ldec_blocks_more_than_3: // blocks left > 3 + rev64 $res0b, $res1b // GHASH final-3 block + ld1 { $res1b}, [$input_ptr], #16 // AES final-2 block - load ciphertext + stp $output_l0, $output_h0, [$output_ptr], #16 // AES final-3 block - store result + mov $acc_md, $h34k.d[1] // GHASH final-3 block - mid + eor $res0b, $res0b, $t0.16b // feed in partial tag + eor $ctr0b, $res1b, $ctr1b // AES final-2 block - result + mov $rk4d, $res0.d[1] // GHASH final-3 block - mid + mov $output_l0, $ctr0.d[0] // AES final-2 block - mov low + mov $output_h0, $ctr0.d[1] // AES final-2 block - mov high + eor $rk4v.8b, $rk4v.8b, $res0.8b // GHASH final-3 block - mid + movi $t0.8b, #0 // suppress further partial tag feed in + pmull2 $acc_h.1q, $res0.2d, $h4.2d // GHASH final-3 block - high + pmull $acc_m.1q, $rk4v.1d, $acc_m.1d // GHASH final-3 block - mid + eor $output_l0, $output_l0, $rkN_l // AES final-2 block - round N low + pmull $acc_l.1q, $res0.1d, $h4.1d // GHASH final-3 block - low + eor $output_h0, $output_h0, $rkN_h // AES final-2 block - round N high +.Ldec_blocks_more_than_2: // blocks left > 2 + rev64 $res0b, $res1b // GHASH final-2 block + ld1 { $res1b}, [$input_ptr], #16 // AES final-1 block - load ciphertext + eor $res0b, $res0b, $t0.16b // feed in partial tag + stp $output_l0, $output_h0, [$output_ptr], #16 // AES final-2 block - store result + eor $ctr0b, $res1b, $ctr2b // AES final-1 block - result + mov $rk4d, $res0.d[1] // GHASH final-2 block - mid + pmull $rk3q1, $res0.1d, $h3.1d // GHASH final-2 block - low + pmull2 $rk2q1, $res0.2d, $h3.2d // GHASH final-2 block - high + eor $rk4v.8b, $rk4v.8b, $res0.8b // GHASH final-2 block - mid + mov $output_l0, $ctr0.d[0] // AES final-1 block - mov low + mov $output_h0, $ctr0.d[1] // AES final-1 block - mov high + eor $acc_lb, $acc_lb, $rk3 // GHASH final-2 block - low + movi $t0.8b, #0 // suppress further partial tag feed in + pmull $rk4v.1q, $rk4v.1d, $h34k.1d // GHASH final-2 block - mid + eor $acc_hb, $acc_hb, $rk2 // GHASH final-2 block - high + eor $output_l0, $output_l0, $rkN_l // AES final-1 block - round N low + eor $acc_mb, $acc_mb, $rk4v.16b // GHASH final-2 block - mid + eor $output_h0, $output_h0, $rkN_h // AES final-1 block - round N high +.Ldec_blocks_more_than_1: // blocks left > 1 + stp $output_l0, $output_h0, [$output_ptr], #16 // AES final-1 block - store result + rev64 $res0b, $res1b // GHASH final-1 block + ld1 { $res1b}, [$input_ptr], #16 // AES final block - load ciphertext + eor $res0b, $res0b, $t0.16b // feed in partial tag + movi $t0.8b, #0 // suppress further partial tag feed in + mov $rk4d, $res0.d[1] // GHASH final-1 block - mid + eor $ctr0b, $res1b, $ctr3b // AES final block - result + pmull2 $rk2q1, $res0.2d, $h2.2d // GHASH final-1 block - high + eor $rk4v.8b, $rk4v.8b, $res0.8b // GHASH final-1 block - mid + pmull $rk3q1, $res0.1d, $h2.1d // GHASH final-1 block - low + mov $output_l0, $ctr0.d[0] // AES final block - mov low + ins $rk4v.d[1], $rk4v.d[0] // GHASH final-1 block - mid + mov $output_h0, $ctr0.d[1] // AES final block - mov high + pmull2 $rk4v.1q, $rk4v.2d, $h12k.2d // GHASH final-1 block - mid + eor $output_l0, $output_l0, $rkN_l // AES final block - round N low + eor $acc_lb, $acc_lb, $rk3 // GHASH final-1 block - low + eor $acc_hb, $acc_hb, $rk2 // GHASH final-1 block - high + eor $acc_mb, $acc_mb, $rk4v.16b // GHASH final-1 block - mid + eor $output_h0, $output_h0, $rkN_h // AES final block - round N high +.Ldec_blocks_less_than_1: // blocks left <= 1 + and $bit_length, $bit_length, #127 // bit_length %= 128 + mvn $rkN_h, xzr // rkN_h = 0xffffffffffffffff + sub $bit_length, $bit_length, #128 // bit_length -= 128 + mvn $rkN_l, xzr // rkN_l = 0xffffffffffffffff + ldp $end_input_ptr, $main_end_input_ptr, [$output_ptr] // load existing bytes we need to not overwrite + neg $bit_length, $bit_length // bit_length = 128 - #bits in input (in range [1,128]) + and $bit_length, $bit_length, #127 // bit_length %= 128 + lsr $rkN_h, $rkN_h, $bit_length // rkN_h is mask for top 64b of last block + cmp $bit_length, #64 + csel $ctr32x, $rkN_l, $rkN_h, lt + csel $ctr96_b64x, $rkN_h, xzr, lt + fmov $ctr0d, $ctr32x // ctr0b is mask for last block + and $output_l0, $output_l0, $ctr32x + mov $ctr0.d[1], $ctr96_b64x + bic $end_input_ptr, $end_input_ptr, $ctr32x // mask out low existing bytes + rev $ctr32w, $rctr32w + bic $main_end_input_ptr, $main_end_input_ptr, $ctr96_b64x // mask out high existing bytes + orr $output_l0, $output_l0, $end_input_ptr + and $output_h0, $output_h0, $ctr96_b64x + orr $output_h0, $output_h0, $main_end_input_ptr + and $res1b, $res1b, $ctr0b // possibly partial last block has zeroes in highest bits + rev64 $res0b, $res1b // GHASH final block + eor $res0b, $res0b, $t0.16b // feed in partial tag + pmull $rk3q1, $res0.1d, $h1.1d // GHASH final block - low + mov $t0d, $res0.d[1] // GHASH final block - mid + eor $t0.8b, $t0.8b, $res0.8b // GHASH final block - mid + pmull2 $rk2q1, $res0.2d, $h1.2d // GHASH final block - high + pmull $t0.1q, $t0.1d, $h12k.1d // GHASH final block - mid + eor $acc_hb, $acc_hb, $rk2 // GHASH final block - high + eor $acc_lb, $acc_lb, $rk3 // GHASH final block - low + eor $acc_mb, $acc_mb, $t0.16b // GHASH final block - mid + movi $mod_constant.8b, #0xc2 + eor $t9.16b, $acc_lb, $acc_hb // MODULO - karatsuba tidy up + shl $mod_constantd, $mod_constantd, #56 // mod_constant + eor $acc_mb, $acc_mb, $t9.16b // MODULO - karatsuba tidy up + pmull $mod_t.1q, $acc_h.1d, $mod_constant.1d // MODULO - top 64b align with mid + ext $acc_hb, $acc_hb, $acc_hb, #8 // MODULO - other top alignment + eor $acc_mb, $acc_mb, $mod_t.16b // MODULO - fold into mid + eor $acc_mb, $acc_mb, $acc_hb // MODULO - fold into mid + pmull $mod_constant.1q, $acc_m.1d, $mod_constant.1d // MODULO - mid 64b align with low + ext $acc_mb, $acc_mb, $acc_mb, #8 // MODULO - other mid alignment + eor $acc_lb, $acc_lb, $mod_constant.16b // MODULO - fold into low + stp $output_l0, $output_h0, [$output_ptr] + str $ctr32w, [$counter, #12] // store the updated counter + eor $acc_lb, $acc_lb, $acc_mb // MODULO - fold into low + ext $acc_lb, $acc_lb, $acc_lb, #8 + rev64 $acc_lb, $acc_lb + mov x0, $len + st1 { $acc_l.16b }, [$current_tag] + ldp x19, x20, [sp, #16] + ldp x21, x22, [sp, #32] + ldp x23, x24, [sp, #48] + ldp d8, d9, [sp, #64] + ldp d10, d11, [sp, #80] + ldp d12, d13, [sp, #96] + ldp d14, d15, [sp, #112] + ldp x29, x30, [sp], #128 + AARCH64_VALIDATE_LINK_REGISTER + ret +.size aes_gcm_dec_kernel,.-aes_gcm_dec_kernel +___ +} +} + +$code.=<<___; +#endif +___ + +print $code; +close STDOUT or die "error closing STDOUT: $!"; # enforce flush diff --git a/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghash-ssse3-x86_64.pl b/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghash-ssse3-x86_64.pl index f7364739740a..00364f0bbef0 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghash-ssse3-x86_64.pl +++ b/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghash-ssse3-x86_64.pl @@ -103,16 +103,15 @@ .align 16 gcm_gmult_ssse3: .cfi_startproc -.Lgmult_seh_begin: +.seh_startproc ____ $code .= <<____ if ($win64); subq \$40, %rsp -.Lgmult_seh_allocstack: +.seh_allocstack 40 movdqa %xmm6, (%rsp) -.Lgmult_seh_save_xmm6: +.seh_savexmm128 %xmm6, 0 movdqa %xmm10, 16(%rsp) -.Lgmult_seh_save_xmm10: -.Lgmult_seh_prolog_end: +.seh_savexmm128 %xmm10, 16 ____ $code .= <<____; movdqu ($Xi), %xmm0 @@ -230,8 +229,8 @@ sub process_rows { ____ $code .= <<____; ret -.Lgmult_seh_end: .cfi_endproc +.seh_endproc .size gcm_gmult_ssse3,.-gcm_gmult_ssse3 ____ @@ -245,19 +244,18 @@ sub process_rows { .globl gcm_ghash_ssse3 .align 16 gcm_ghash_ssse3: -.Lghash_seh_begin: .cfi_startproc +.seh_startproc ____ $code .= <<____ if ($win64); subq \$56, %rsp -.Lghash_seh_allocstack: +.seh_allocstack 56 movdqa %xmm6, (%rsp) -.Lghash_seh_save_xmm6: +.seh_savexmm128 %xmm6, 0 movdqa %xmm10, 16(%rsp) -.Lghash_seh_save_xmm10: +.seh_savexmm128 %xmm10, 16 movdqa %xmm11, 32(%rsp) -.Lghash_seh_save_xmm11: -.Lghash_seh_prolog_end: +.seh_savexmm128 %xmm11, 32 ____ $code .= <<____; movdqu ($Xi), %xmm0 @@ -329,10 +327,11 @@ sub process_rows { ____ $code .= <<____; ret -.Lghash_seh_end: .cfi_endproc +.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. @@ -341,73 +340,8 @@ sub process_rows { # .Llow4_mask is an XMM mask which selects the low four bits of each byte. .Llow4_mask: .quad 0x0f0f0f0f0f0f0f0f, 0x0f0f0f0f0f0f0f0f +.text ____ -if ($win64) { - # Add unwind metadata for SEH. - # - # TODO(davidben): This is all manual right now. Once we've added SEH tests, - # add support for emitting these in x86_64-xlate.pl, probably based on MASM - # and Yasm's unwind directives, and unify with CFI. Then upstream it to - # replace the error-prone and non-standard custom handlers. - - # See https://docs.microsoft.com/en-us/cpp/build/struct-unwind-code?view=vs-2017 - my $UWOP_ALLOC_SMALL = 2; - my $UWOP_SAVE_XMM128 = 8; - - $code .= <<____; -.section .pdata -.align 4 - .rva .Lgmult_seh_begin - .rva .Lgmult_seh_end - .rva .Lgmult_seh_info - - .rva .Lghash_seh_begin - .rva .Lghash_seh_end - .rva .Lghash_seh_info - -.section .xdata -.align 8 -.Lgmult_seh_info: - .byte 1 # version 1, no flags - .byte .Lgmult_seh_prolog_end-.Lgmult_seh_begin - .byte 5 # num_slots = 1 + 2 + 2 - .byte 0 # no frame register - - .byte .Lgmult_seh_save_xmm10-.Lgmult_seh_begin - .byte @{[$UWOP_SAVE_XMM128 | (10 << 4)]} - .value 1 - - .byte .Lgmult_seh_save_xmm6-.Lgmult_seh_begin - .byte @{[$UWOP_SAVE_XMM128 | (6 << 4)]} - .value 0 - - .byte .Lgmult_seh_allocstack-.Lgmult_seh_begin - .byte @{[$UWOP_ALLOC_SMALL | (((40 - 8) / 8) << 4)]} - -.align 8 -.Lghash_seh_info: - .byte 1 # version 1, no flags - .byte .Lghash_seh_prolog_end-.Lghash_seh_begin - .byte 7 # num_slots = 1 + 2 + 2 + 2 - .byte 0 # no frame register - - .byte .Lghash_seh_save_xmm11-.Lghash_seh_begin - .byte @{[$UWOP_SAVE_XMM128 | (11 << 4)]} - .value 2 - - .byte .Lghash_seh_save_xmm10-.Lghash_seh_begin - .byte @{[$UWOP_SAVE_XMM128 | (10 << 4)]} - .value 1 - - .byte .Lghash_seh_save_xmm6-.Lghash_seh_begin - .byte @{[$UWOP_SAVE_XMM128 | (6 << 4)]} - .value 0 - - .byte .Lghash_seh_allocstack-.Lghash_seh_begin - .byte @{[$UWOP_ALLOC_SMALL | (((56 - 8) / 8) << 4)]} -____ -} - print $code; close STDOUT or die "error closing STDOUT: $!"; diff --git a/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghash-x86_64.pl b/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghash-x86_64.pl index 1aeb7b7d287f..19b18cc6180c 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghash-x86_64.pl +++ b/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghash-x86_64.pl @@ -205,13 +205,14 @@ sub reduction_alg9 { # 17/11 times faster than Intel version .align 16 gcm_init_clmul: .cfi_startproc +.seh_startproc .L_init_clmul: ___ $code.=<<___ if ($win64); -.LSEH_begin_gcm_init_clmul: - # I can't trust assembler to use specific encoding:-( - .byte 0x48,0x83,0xec,0x18 #sub $0x18,%rsp - .byte 0x0f,0x29,0x34,0x24 #movaps %xmm6,(%rsp) + sub \$0x18,%rsp +.seh_allocstack 0x18 + movaps %xmm6,(%rsp) +.seh_savexmm128 %xmm6, 0 ___ $code.=<<___; movdqu ($Xip),$Hkey @@ -270,11 +271,11 @@ sub reduction_alg9 { # 17/11 times faster than Intel version $code.=<<___ if ($win64); movaps (%rsp),%xmm6 lea 0x18(%rsp),%rsp -.LSEH_end_gcm_init_clmul: ___ $code.=<<___; ret .cfi_endproc +.seh_endproc .size gcm_init_clmul,.-gcm_init_clmul ___ } @@ -338,23 +339,33 @@ sub reduction_alg9 { # 17/11 times faster than Intel version .align 32 gcm_ghash_clmul: .cfi_startproc +.seh_startproc .L_ghash_clmul: ___ $code.=<<___ if ($win64); lea -0x88(%rsp),%rax -.LSEH_begin_gcm_ghash_clmul: - # I can't trust assembler to use specific encoding:-( - .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax),%rsp - .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6,-0x20(%rax) - .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7,-0x10(%rax) - .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8,0(%rax) - .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9,0x10(%rax) - .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10,0x20(%rax) - .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11,0x30(%rax) - .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12,0x40(%rax) - .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13,0x50(%rax) - .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14,0x60(%rax) - .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15,0x70(%rax) + lea -0x20(%rax),%rsp +.seh_allocstack 0x20+0x88 + movaps %xmm6,-0x20(%rax) +.seh_savexmm128 %xmm6, 0x20-0x20 + movaps %xmm7,-0x10(%rax) +.seh_savexmm128 %xmm7, 0x20-0x10 + movaps %xmm8,0(%rax) +.seh_savexmm128 %xmm8, 0x20+0 + movaps %xmm9,0x10(%rax) +.seh_savexmm128 %xmm9, 0x20+0x10 + movaps %xmm10,0x20(%rax) +.seh_savexmm128 %xmm10, 0x20+0x20 + movaps %xmm11,0x30(%rax) +.seh_savexmm128 %xmm11, 0x20+0x30 + movaps %xmm12,0x40(%rax) +.seh_savexmm128 %xmm12, 0x20+0x40 + movaps %xmm13,0x50(%rax) +.seh_savexmm128 %xmm13, 0x20+0x50 + movaps %xmm14,0x60(%rax) +.seh_savexmm128 %xmm14, 0x20+0x60 + movaps %xmm15,0x70(%rax) +.seh_savexmm128 %xmm15, 0x20+0x70 ___ $code.=<<___; movdqa .Lbswap_mask(%rip),$T3 @@ -682,11 +693,11 @@ sub reduction_alg9 { # 17/11 times faster than Intel version movaps 0x80(%rsp),%xmm14 movaps 0x90(%rsp),%xmm15 lea 0xa8(%rsp),%rsp -.LSEH_end_gcm_ghash_clmul: ___ $code.=<<___; ret .cfi_endproc +.seh_endproc .size gcm_ghash_clmul,.-gcm_ghash_clmul ___ } @@ -703,10 +714,11 @@ sub reduction_alg9 { # 17/11 times faster than Intel version my $HK="%xmm6"; $code.=<<___ if ($win64); -.LSEH_begin_gcm_init_avx: - # I can't trust assembler to use specific encoding:-( - .byte 0x48,0x83,0xec,0x18 #sub $0x18,%rsp - .byte 0x0f,0x29,0x34,0x24 #movaps %xmm6,(%rsp) +.seh_startproc + sub \$0x18,%rsp +.seh_allocstack 0x18 + movaps %xmm6,(%rsp) +.seh_savexmm128 %xmm6, 0 ___ $code.=<<___; vzeroupper @@ -821,10 +833,10 @@ sub reduction_avx { $code.=<<___ if ($win64); movaps (%rsp),%xmm6 lea 0x18(%rsp),%rsp -.LSEH_end_gcm_init_avx: ___ $code.=<<___; ret +.seh_endproc .cfi_endproc .size gcm_init_avx,.-gcm_init_avx ___ @@ -861,20 +873,30 @@ sub reduction_avx { $Xi,$Xo,$Tred,$bswap,$Ii,$Ij) = map("%xmm$_",(0..15)); $code.=<<___ if ($win64); +.seh_startproc lea -0x88(%rsp),%rax -.LSEH_begin_gcm_ghash_avx: - # I can't trust assembler to use specific encoding:-( - .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax),%rsp - .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6,-0x20(%rax) - .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7,-0x10(%rax) - .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8,0(%rax) - .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9,0x10(%rax) - .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10,0x20(%rax) - .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11,0x30(%rax) - .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12,0x40(%rax) - .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13,0x50(%rax) - .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14,0x60(%rax) - .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15,0x70(%rax) + lea -0x20(%rax),%rsp +.seh_allocstack 0x20+0x88 + movaps %xmm6,-0x20(%rax) +.seh_savexmm128 %xmm6, 0x20-0x20 + movaps %xmm7,-0x10(%rax) +.seh_savexmm128 %xmm7, 0x20-0x10 + movaps %xmm8,0(%rax) +.seh_savexmm128 %xmm8, 0x20+0 + movaps %xmm9,0x10(%rax) +.seh_savexmm128 %xmm9, 0x20+0x10 + movaps %xmm10,0x20(%rax) +.seh_savexmm128 %xmm10, 0x20+0x20 + movaps %xmm11,0x30(%rax) +.seh_savexmm128 %xmm11, 0x20+0x30 + movaps %xmm12,0x40(%rax) +.seh_savexmm128 %xmm12, 0x20+0x40 + movaps %xmm13,0x50(%rax) +.seh_savexmm128 %xmm13, 0x20+0x50 + movaps %xmm14,0x60(%rax) +.seh_savexmm128 %xmm14, 0x20+0x60 + movaps %xmm15,0x70(%rax) +.seh_savexmm128 %xmm15, 0x20+0x70 ___ $code.=<<___; vzeroupper @@ -1260,11 +1282,11 @@ sub reduction_avx { movaps 0x80(%rsp),%xmm14 movaps 0x90(%rsp),%xmm15 lea 0xa8(%rsp),%rsp -.LSEH_end_gcm_ghash_avx: ___ $code.=<<___; ret .cfi_endproc +.seh_endproc .size gcm_ghash_avx,.-gcm_ghash_avx ___ } else { @@ -1275,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 @@ -1286,52 +1309,9 @@ sub reduction_avx { .asciz "GHASH for x86_64, CRYPTOGAMS by " .align 64 +.text ___ -if ($win64) { -$code.=<<___; -.section .pdata -.align 4 - .rva .LSEH_begin_gcm_init_clmul - .rva .LSEH_end_gcm_init_clmul - .rva .LSEH_info_gcm_init_clmul - - .rva .LSEH_begin_gcm_ghash_clmul - .rva .LSEH_end_gcm_ghash_clmul - .rva .LSEH_info_gcm_ghash_clmul -___ -$code.=<<___ if ($avx); - .rva .LSEH_begin_gcm_init_avx - .rva .LSEH_end_gcm_init_avx - .rva .LSEH_info_gcm_init_clmul - - .rva .LSEH_begin_gcm_ghash_avx - .rva .LSEH_end_gcm_ghash_avx - .rva .LSEH_info_gcm_ghash_clmul -___ -$code.=<<___; -.section .xdata -.align 8 -.LSEH_info_gcm_init_clmul: - .byte 0x01,0x08,0x03,0x00 - .byte 0x08,0x68,0x00,0x00 #movaps 0x00(rsp),xmm6 - .byte 0x04,0x22,0x00,0x00 #sub rsp,0x18 -.LSEH_info_gcm_ghash_clmul: - .byte 0x01,0x33,0x16,0x00 - .byte 0x33,0xf8,0x09,0x00 #movaps 0x90(rsp),xmm15 - .byte 0x2e,0xe8,0x08,0x00 #movaps 0x80(rsp),xmm14 - .byte 0x29,0xd8,0x07,0x00 #movaps 0x70(rsp),xmm13 - .byte 0x24,0xc8,0x06,0x00 #movaps 0x60(rsp),xmm12 - .byte 0x1f,0xb8,0x05,0x00 #movaps 0x50(rsp),xmm11 - .byte 0x1a,0xa8,0x04,0x00 #movaps 0x40(rsp),xmm10 - .byte 0x15,0x98,0x03,0x00 #movaps 0x30(rsp),xmm9 - .byte 0x10,0x88,0x02,0x00 #movaps 0x20(rsp),xmm8 - .byte 0x0c,0x78,0x01,0x00 #movaps 0x10(rsp),xmm7 - .byte 0x08,0x68,0x00,0x00 #movaps 0x00(rsp),xmm6 - .byte 0x04,0x01,0x15,0x00 #sub rsp,0xa8 -___ -} - $code =~ s/\`([^\`]*)\`/eval($1)/gem; print $code; diff --git a/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl b/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl deleted file mode 100644 index e9ca11a88e5f..000000000000 --- a/third_party/boringssl/src/crypto/fipsmodule/modes/asm/ghashp8-ppc.pl +++ /dev/null @@ -1,670 +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 STDOUT,"| $^X \"$xlate\" $flavour \"$output\"" || die "can't call $xlate: $!"; - -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/third_party/boringssl/src/crypto/fipsmodule/modes/gcm.c b/third_party/boringssl/src/crypto/fipsmodule/modes/gcm.c index 1a77ec0e4cb1..f22fa9de94ce 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/modes/gcm.c +++ b/third_party/boringssl/src/crypto/fipsmodule/modes/gcm.c @@ -132,6 +132,46 @@ void gcm_init_ssse3(u128 Htable[16], const uint64_t H[2]) { (*gcm_ghash_p)((ctx)->Xi.u, (ctx)->gcm_key.Htable, in, len) #endif // GCM_FUNCREF +#if defined(HW_GCM) && defined(OPENSSL_X86_64) +static size_t hw_gcm_encrypt(const uint8_t *in, uint8_t *out, size_t len, + const AES_KEY *key, uint8_t ivec[16], + uint64_t *Xi) { + return aesni_gcm_encrypt(in, out, len, key, ivec, Xi); +} + +static size_t hw_gcm_decrypt(const uint8_t *in, uint8_t *out, size_t len, + const AES_KEY *key, uint8_t ivec[16], + uint64_t *Xi) { + return aesni_gcm_decrypt(in, out, len, key, ivec, Xi); +} +#endif // HW_GCM && X86_64 + +#if defined(HW_GCM) && defined(OPENSSL_AARCH64) + +static size_t hw_gcm_encrypt(const uint8_t *in, uint8_t *out, size_t len, + const AES_KEY *key, uint8_t ivec[16], + uint64_t *Xi) { + const size_t len_blocks = len & kSizeTWithoutLower4Bits; + if (!len_blocks) { + return 0; + } + aes_gcm_enc_kernel(in, len_blocks * 8, out, Xi, ivec, key); + return len_blocks; +} + +static size_t hw_gcm_decrypt(const uint8_t *in, uint8_t *out, size_t len, + const AES_KEY *key, uint8_t ivec[16], + uint64_t *Xi) { + const size_t len_blocks = len & kSizeTWithoutLower4Bits; + if (!len_blocks) { + return 0; + } + aes_gcm_dec_kernel(in, len_blocks * 8, out, Xi, ivec, key); + return len_blocks; +} + +#endif // HW_GCM && AARCH64 + void CRYPTO_ghash_init(gmult_func *out_mult, ghash_func *out_hash, u128 *out_key, u128 out_table[16], int *out_is_avx, const uint8_t gcm_key[16]) { @@ -190,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); @@ -217,7 +250,12 @@ void CRYPTO_gcm128_init_key(GCM128_KEY *gcm_key, const AES_KEY *aes_key, CRYPTO_ghash_init(&gcm_key->gmult, &gcm_key->ghash, &gcm_key->H, gcm_key->Htable, &is_avx, ghash_key); - gcm_key->use_aesni_gcm_crypt = (is_avx && block_is_hwaes) ? 1 : 0; +#if defined(OPENSSL_AARCH64) && !defined(OPENSSL_NO_ASM) + gcm_key->use_hw_gcm_crypt = (gcm_pmull_capable() && block_is_hwaes) ? 1 : + 0; +#else + gcm_key->use_hw_gcm_crypt = (is_avx && block_is_hwaes) ? 1 : 0; +#endif } void CRYPTO_gcm128_setiv(GCM128_CONTEXT *ctx, const AES_KEY *key, @@ -544,12 +582,12 @@ int CRYPTO_gcm128_encrypt_ctr32(GCM128_CONTEXT *ctx, const AES_KEY *key, } } -#if defined(AESNI_GCM) +#if defined(HW_GCM) // Check |len| to work around a C language bug. See https://crbug.com/1019588. - if (ctx->gcm_key.use_aesni_gcm_crypt && len > 0) { - // |aesni_gcm_encrypt| may not process all the input given to it. It may + if (ctx->gcm_key.use_hw_gcm_crypt && len > 0) { + // |hw_gcm_encrypt| may not process all the input given to it. It may // not process *any* of its input if it is deemed too small. - size_t bulk = aesni_gcm_encrypt(in, out, len, key, ctx->Yi.c, ctx->Xi.u); + size_t bulk = hw_gcm_encrypt(in, out, len, key, ctx->Yi.c, ctx->Xi.u); in += bulk; out += bulk; len -= bulk; @@ -632,12 +670,12 @@ int CRYPTO_gcm128_decrypt_ctr32(GCM128_CONTEXT *ctx, const AES_KEY *key, } } -#if defined(AESNI_GCM) +#if defined(HW_GCM) // Check |len| to work around a C language bug. See https://crbug.com/1019588. - if (ctx->gcm_key.use_aesni_gcm_crypt && len > 0) { - // |aesni_gcm_decrypt| may not process all the input given to it. It may + if (ctx->gcm_key.use_hw_gcm_crypt && len > 0) { + // |hw_gcm_decrypt| may not process all the input given to it. It may // not process *any* of its input if it is deemed too small. - size_t bulk = aesni_gcm_decrypt(in, out, len, key, ctx->Yi.c, ctx->Xi.u); + size_t bulk = hw_gcm_decrypt(in, out, len, key, ctx->Yi.c, ctx->Xi.u); in += bulk; out += bulk; len -= bulk; diff --git a/third_party/boringssl/src/crypto/fipsmodule/modes/gcm_test.cc b/third_party/boringssl/src/crypto/fipsmodule/modes/gcm_test.cc index d66d8ae46015..e7fcd5c2273b 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/modes/gcm_test.cc +++ b/third_party/boringssl/src/crypto/fipsmodule/modes/gcm_test.cc @@ -173,17 +173,17 @@ TEST(GCMTest, ABI) { aes_hw_set_encrypt_key(kKey, 128, &aes_key); for (size_t blocks : kBlockCounts) { - CHECK_ABI(aesni_gcm_encrypt, buf, buf, blocks * 16, &aes_key, iv, - gcm.Xi.u); - CHECK_ABI(aesni_gcm_encrypt, buf, buf, blocks * 16 + 7, &aes_key, iv, - gcm.Xi.u); + CHECK_ABI_SEH(aesni_gcm_encrypt, buf, buf, blocks * 16, &aes_key, iv, + gcm.Xi.u); + CHECK_ABI_SEH(aesni_gcm_encrypt, buf, buf, blocks * 16 + 7, &aes_key, + iv, gcm.Xi.u); } aes_hw_set_decrypt_key(kKey, 128, &aes_key); for (size_t blocks : kBlockCounts) { - CHECK_ABI(aesni_gcm_decrypt, buf, buf, blocks * 16, &aes_key, iv, - gcm.Xi.u); - CHECK_ABI(aesni_gcm_decrypt, buf, buf, blocks * 16 + 7, &aes_key, iv, - gcm.Xi.u); + CHECK_ABI_SEH(aesni_gcm_decrypt, buf, buf, blocks * 16, &aes_key, iv, + gcm.Xi.u); + CHECK_ABI_SEH(aesni_gcm_decrypt, buf, buf, blocks * 16 + 7, &aes_key, + iv, gcm.Xi.u); } } } @@ -209,14 +209,18 @@ TEST(GCMTest, ABI) { } #endif // GHASH_ASM_ARM -#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); +#if defined(OPENSSL_AARCH64) && defined(HW_GCM) + if (hwaes_capable() && gcm_pmull_capable()) { + static const uint8_t kKey[16] = {0}; + uint8_t iv[16] = {0}; + + for (size_t key_bits = 128; key_bits <= 256; key_bits += 64) { + AES_KEY aes_key; + aes_hw_set_encrypt_key(kKey, key_bits, &aes_key); + CHECK_ABI(aes_gcm_enc_kernel, buf, sizeof(buf) * 8, buf, X, iv, &aes_key); + CHECK_ABI(aes_gcm_dec_kernel, buf, sizeof(buf) * 8, buf, X, iv, &aes_key); } } -#endif // GHASH_ASM_PPC64LE +#endif } #endif // SUPPORTS_ABI_TEST && !OPENSSL_NO_ASM diff --git a/third_party/boringssl/src/crypto/fipsmodule/modes/internal.h b/third_party/boringssl/src/crypto/fipsmodule/modes/internal.h index 0164aace0f46..d77efcaac4e2 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/modes/internal.h +++ b/third_party/boringssl/src/crypto/fipsmodule/modes/internal.h @@ -136,9 +136,9 @@ typedef struct gcm128_key_st { block128_f block; - // use_aesni_gcm_crypt is true if this context should use the assembly - // functions |aesni_gcm_encrypt| and |aesni_gcm_decrypt| to process data. - unsigned use_aesni_gcm_crypt:1; + // use_hw_gcm_crypt is true if this context should use platform-specific + // assembly to process GCM data. + unsigned use_hw_gcm_crypt:1; } GCM128_KEY; // GCM128_CONTEXT contains state for a single GCM operation. The structure @@ -267,7 +267,7 @@ void gcm_gmult_avx(uint64_t Xi[2], const u128 Htable[16]); void gcm_ghash_avx(uint64_t Xi[2], const u128 Htable[16], const uint8_t *in, size_t len); -#define AESNI_GCM +#define HW_GCM size_t aesni_gcm_encrypt(const uint8_t *in, uint8_t *out, size_t len, const AES_KEY *key, uint8_t ivec[16], uint64_t *Xi); size_t aesni_gcm_decrypt(const uint8_t *in, uint8_t *out, size_t len, @@ -279,6 +279,7 @@ size_t aesni_gcm_decrypt(const uint8_t *in, uint8_t *out, size_t len, #endif // OPENSSL_X86 #elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) + #define GHASH_ASM_ARM #define GCM_FUNCREF @@ -298,13 +299,15 @@ void gcm_gmult_neon(uint64_t Xi[2], const u128 Htable[16]); void gcm_ghash_neon(uint64_t Xi[2], const u128 Htable[16], const uint8_t *inp, size_t len); -#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); +#if defined(OPENSSL_AARCH64) +#define HW_GCM +// These functions are defined in aesv8-gcm-armv8.pl. +void aes_gcm_enc_kernel(const uint8_t *in, uint64_t in_bits, void *out, + void *Xi, uint8_t *ivec, const AES_KEY *key); +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 + #endif #endif // OPENSSL_NO_ASM diff --git a/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg_test.cc b/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg_test.cc index e6ebbca2eb56..50f42973f0c8 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rand/ctrdrbg_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/rand/fork_detect.c b/third_party/boringssl/src/crypto/fipsmodule/rand/fork_detect.c index a6eb2305f11d..29143a7e0f89 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rand/fork_detect.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/rand/fork_detect.h b/third_party/boringssl/src/crypto/fipsmodule/rand/fork_detect.h index 8518830cec6b..f9bbe02f766b 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rand/fork_detect.h +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/rand/getrandom_fillin.h b/third_party/boringssl/src/crypto/fipsmodule/rand/getrandom_fillin.h index c0dea35be70f..0f290e96374d 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rand/getrandom_fillin.h +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/rand/rand.c b/third_party/boringssl/src/crypto/fipsmodule/rand/rand.c index cb1ee7d51482..0ead1822cad2 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rand/rand.c +++ b/third_party/boringssl/src/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 @@ -416,11 +410,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/third_party/boringssl/src/crypto/fipsmodule/rand/urandom_test.cc b/third_party/boringssl/src/crypto/fipsmodule/rand/urandom_test.cc index 13ac61046049..f92fe9480e9a 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rand/urandom_test.cc +++ b/third_party/boringssl/src/crypto/fipsmodule/rand/urandom_test.cc @@ -15,26 +15,50 @@ #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" +#include "getrandom_fillin.h" #if !defined(PTRACE_O_EXITKILL) #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 +69,10 @@ struct Event { kGetRandom, kOpen, kUrandomRead, + kSocket, + kConnect, + kSocketRead, + kSocketClose, kAbort, }; @@ -53,8 +81,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 +91,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 +103,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 +138,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 +168,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 +195,213 @@ 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); + +struct regs { + uintptr_t syscall; + uintptr_t args[3]; + uintptr_t ret; + 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; + } + + 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) { + // 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; +} + +#elif defined(OPENSSL_AARCH64) + +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.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 set_regset(int child_pid, int regset, const void *data, + size_t len) { + struct iovec io; + 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) { + struct regs regs; + if (!regs_read(®s, child_pid)) { + return false; + } + regs.regs.regs[0] = ret; + 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) { + // 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 + +// 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 @@ -158,7 +425,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. @@ -173,6 +441,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)); @@ -185,66 +457,123 @@ 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 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 +590,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 +621,47 @@ 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; + 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)); @@ -304,7 +669,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 +714,20 @@ 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)) || + 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)) || // Second entropy draw. (!have_fork_detection() && !sysrand(true, kAdditionalDataLength))) { return ret; @@ -368,7 +740,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))) { @@ -405,16 +777,37 @@ 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); 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; + } + + if (!has_getrandom && !(flags & NO_GETRANDOM)) { + 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); @@ -432,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(); @@ -445,5 +840,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/third_party/boringssl/src/crypto/fipsmodule/rsa/blinding.c b/third_party/boringssl/src/crypto/fipsmodule/rsa/blinding.c index 29477bd75b65..c4cfcc231390 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rsa/blinding.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/rsa/internal.h b/third_party/boringssl/src/crypto/fipsmodule/rsa/internal.h index 1cb3b5f3bca0..12394a445410 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rsa/internal.h +++ b/third_party/boringssl/src/crypto/fipsmodule/rsa/internal.h @@ -67,6 +67,8 @@ extern "C" { #endif +#define RSA_PKCS1_PADDING_SIZE 11 + // Default implementations of RSA operations. const RSA_METHOD *RSA_default_method(void); @@ -75,8 +77,6 @@ size_t rsa_default_size(const RSA *rsa); int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding); -int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, - const uint8_t *in, size_t in_len, int padding); int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, size_t len); @@ -90,21 +90,13 @@ int BN_BLINDING_invert(BIGNUM *n, const BN_BLINDING *b, BN_MONT_CTX *mont_ctx, BN_CTX *ctx); +int PKCS1_MGF1(uint8_t *out, size_t len, const uint8_t *seed, size_t seed_len, + const EVP_MD *md); int RSA_padding_add_PKCS1_type_1(uint8_t *to, size_t to_len, const uint8_t *from, size_t from_len); int RSA_padding_check_PKCS1_type_1(uint8_t *out, size_t *out_len, size_t max_out, const uint8_t *from, size_t from_len); -int RSA_padding_add_PKCS1_type_2(uint8_t *to, size_t to_len, - const uint8_t *from, size_t from_len); -int RSA_padding_check_PKCS1_type_2(uint8_t *out, size_t *out_len, - size_t max_out, const uint8_t *from, - size_t from_len); -int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, - size_t max_out, const uint8_t *from, - size_t from_len, const uint8_t *param, - size_t param_len, const EVP_MD *md, - const EVP_MD *mgf1md); int RSA_padding_add_none(uint8_t *to, size_t to_len, const uint8_t *from, size_t from_len); @@ -112,10 +104,16 @@ int RSA_padding_add_none(uint8_t *to, size_t to_len, const uint8_t *from, // within DoS bounds. int rsa_check_public_key(const RSA *rsa); -// RSA_private_transform calls either the method-specific |private_transform| -// function (if given) or the generic one. See the comment for -// |private_transform| in |rsa_meth_st|. -int RSA_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, +// rsa_private_transform_no_self_test calls either the method-specific +// |private_transform| function (if given) or the generic one. See the comment +// for |private_transform| in |rsa_meth_st|. +int rsa_private_transform_no_self_test(RSA *rsa, uint8_t *out, + const uint8_t *in, size_t len); + +// rsa_private_transform acts the same as |rsa_private_transform_no_self_test| +// but, in FIPS mode, performs an RSA self test before calling the default RSA +// implementation. +int rsa_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, size_t len); @@ -142,7 +140,7 @@ int rsa_verify_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out, size_t in_len, int padding); int rsa_sign_no_self_test(int hash_nid, const uint8_t *digest, - unsigned digest_len, uint8_t *out, unsigned *out_len, + size_t digest_len, uint8_t *out, unsigned *out_len, RSA *rsa); diff --git a/third_party/boringssl/src/crypto/fipsmodule/rsa/padding.c b/third_party/boringssl/src/crypto/fipsmodule/rsa/padding.c index 0dafed442b7f..998e4591a40f 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rsa/padding.c +++ b/third_party/boringssl/src/crypto/fipsmodule/rsa/padding.c @@ -71,8 +71,6 @@ #include "../../internal.h" -#define RSA_PKCS1_PADDING_SIZE 11 - int RSA_padding_add_PKCS1_type_1(uint8_t *to, size_t to_len, const uint8_t *from, size_t from_len) { // See RFC 8017, section 9.2. @@ -146,109 +144,6 @@ int RSA_padding_check_PKCS1_type_1(uint8_t *out, size_t *out_len, return 1; } -static void rand_nonzero(uint8_t *out, size_t len) { - FIPS_service_indicator_lock_state(); - RAND_bytes(out, len); - - for (size_t i = 0; i < len; i++) { - while (out[i] == 0) { - RAND_bytes(out + i, 1); - } - } - - FIPS_service_indicator_unlock_state(); -} - -int RSA_padding_add_PKCS1_type_2(uint8_t *to, size_t to_len, - const uint8_t *from, size_t from_len) { - // See RFC 8017, section 7.2.1. - if (to_len < RSA_PKCS1_PADDING_SIZE) { - OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL); - return 0; - } - - if (from_len > to_len - RSA_PKCS1_PADDING_SIZE) { - OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE); - return 0; - } - - to[0] = 0; - to[1] = 2; - - size_t padding_len = to_len - 3 - from_len; - rand_nonzero(to + 2, padding_len); - to[2 + padding_len] = 0; - OPENSSL_memcpy(to + to_len - from_len, from, from_len); - return 1; -} - -int RSA_padding_check_PKCS1_type_2(uint8_t *out, size_t *out_len, - size_t max_out, const uint8_t *from, - size_t from_len) { - if (from_len == 0) { - OPENSSL_PUT_ERROR(RSA, RSA_R_EMPTY_PUBLIC_KEY); - return 0; - } - - // PKCS#1 v1.5 decryption. See "PKCS #1 v2.2: RSA Cryptography - // Standard", section 7.2.2. - if (from_len < RSA_PKCS1_PADDING_SIZE) { - // |from| is zero-padded to the size of the RSA modulus, a public value, so - // this can be rejected in non-constant time. - OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL); - return 0; - } - - crypto_word_t first_byte_is_zero = constant_time_eq_w(from[0], 0); - crypto_word_t second_byte_is_two = constant_time_eq_w(from[1], 2); - - crypto_word_t zero_index = 0, looking_for_index = CONSTTIME_TRUE_W; - for (size_t i = 2; i < from_len; i++) { - crypto_word_t equals0 = constant_time_is_zero_w(from[i]); - zero_index = - constant_time_select_w(looking_for_index & equals0, i, zero_index); - looking_for_index = constant_time_select_w(equals0, 0, looking_for_index); - } - - // The input must begin with 00 02. - crypto_word_t valid_index = first_byte_is_zero; - valid_index &= second_byte_is_two; - - // We must have found the end of PS. - valid_index &= ~looking_for_index; - - // PS must be at least 8 bytes long, and it starts two bytes into |from|. - valid_index &= constant_time_ge_w(zero_index, 2 + 8); - - // Skip the zero byte. - zero_index++; - - // NOTE: Although this logic attempts to be constant time, the API contracts - // of this function and |RSA_decrypt| with |RSA_PKCS1_PADDING| make it - // impossible to completely avoid Bleichenbacher's attack. Consumers should - // use |RSA_PADDING_NONE| and perform the padding check in constant-time - // combined with a swap to a random session key or other mitigation. - CONSTTIME_DECLASSIFY(&valid_index, sizeof(valid_index)); - CONSTTIME_DECLASSIFY(&zero_index, sizeof(zero_index)); - - if (!valid_index) { - OPENSSL_PUT_ERROR(RSA, RSA_R_PKCS_DECODING_ERROR); - return 0; - } - - const size_t msg_len = from_len - zero_index; - if (msg_len > max_out) { - // This shouldn't happen because this function is always called with - // |max_out| as the key size and |from_len| is bounded by the key size. - OPENSSL_PUT_ERROR(RSA, RSA_R_PKCS_DECODING_ERROR); - return 0; - } - - OPENSSL_memcpy(out, &from[zero_index], msg_len); - *out_len = msg_len; - return 1; -} - int RSA_padding_add_none(uint8_t *to, size_t to_len, const uint8_t *from, size_t from_len) { if (from_len > to_len) { @@ -265,8 +160,8 @@ int RSA_padding_add_none(uint8_t *to, size_t to_len, const uint8_t *from, return 1; } -static int PKCS1_MGF1(uint8_t *out, size_t len, const uint8_t *seed, - size_t seed_len, const EVP_MD *md) { +int PKCS1_MGF1(uint8_t *out, size_t len, const uint8_t *seed, size_t seed_len, + const EVP_MD *md) { int ret = 0; EVP_MD_CTX ctx; EVP_MD_CTX_init(&ctx); @@ -310,180 +205,6 @@ static int PKCS1_MGF1(uint8_t *out, size_t len, const uint8_t *seed, return ret; } -int RSA_padding_add_PKCS1_OAEP_mgf1(uint8_t *to, size_t to_len, - const uint8_t *from, size_t from_len, - const uint8_t *param, size_t param_len, - const EVP_MD *md, const EVP_MD *mgf1md) { - if (md == NULL) { - md = EVP_sha1(); - } - if (mgf1md == NULL) { - mgf1md = md; - } - - size_t mdlen = EVP_MD_size(md); - - if (to_len < 2 * mdlen + 2) { - OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL); - return 0; - } - - size_t emlen = to_len - 1; - if (from_len > emlen - 2 * mdlen - 1) { - OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE); - return 0; - } - - if (emlen < 2 * mdlen + 1) { - OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL); - return 0; - } - - to[0] = 0; - uint8_t *seed = to + 1; - uint8_t *db = to + mdlen + 1; - - uint8_t *dbmask = NULL; - int ret = 0; - FIPS_service_indicator_lock_state(); - if (!EVP_Digest(param, param_len, db, NULL, md, NULL)) { - goto out; - } - OPENSSL_memset(db + mdlen, 0, emlen - from_len - 2 * mdlen - 1); - db[emlen - from_len - mdlen - 1] = 0x01; - OPENSSL_memcpy(db + emlen - from_len - mdlen, from, from_len); - if (!RAND_bytes(seed, mdlen)) { - goto out; - } - - dbmask = OPENSSL_malloc(emlen - mdlen); - if (dbmask == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); - goto out; - } - - if (!PKCS1_MGF1(dbmask, emlen - mdlen, seed, mdlen, mgf1md)) { - goto out; - } - for (size_t i = 0; i < emlen - mdlen; i++) { - db[i] ^= dbmask[i]; - } - - uint8_t seedmask[EVP_MAX_MD_SIZE]; - if (!PKCS1_MGF1(seedmask, mdlen, db, emlen - mdlen, mgf1md)) { - goto out; - } - for (size_t i = 0; i < mdlen; i++) { - seed[i] ^= seedmask[i]; - } - ret = 1; - -out: - OPENSSL_free(dbmask); - FIPS_service_indicator_unlock_state(); - return ret; -} - -int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, - size_t max_out, const uint8_t *from, - size_t from_len, const uint8_t *param, - size_t param_len, const EVP_MD *md, - const EVP_MD *mgf1md) { - uint8_t *db = NULL; - - if (md == NULL) { - md = EVP_sha1(); - } - if (mgf1md == NULL) { - mgf1md = md; - } - - size_t mdlen = EVP_MD_size(md); - - // The encoded message is one byte smaller than the modulus to ensure that it - // doesn't end up greater than the modulus. Thus there's an extra "+1" here - // compared to https://tools.ietf.org/html/rfc2437#section-9.1.1.2. - if (from_len < 1 + 2*mdlen + 1) { - // 'from_len' is the length of the modulus, i.e. does not depend on the - // particular ciphertext. - goto decoding_err; - } - - size_t dblen = from_len - mdlen - 1; - FIPS_service_indicator_lock_state(); - db = OPENSSL_malloc(dblen); - if (db == NULL) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); - goto err; - } - - const uint8_t *maskedseed = from + 1; - const uint8_t *maskeddb = from + 1 + mdlen; - - uint8_t seed[EVP_MAX_MD_SIZE]; - if (!PKCS1_MGF1(seed, mdlen, maskeddb, dblen, mgf1md)) { - goto err; - } - for (size_t i = 0; i < mdlen; i++) { - seed[i] ^= maskedseed[i]; - } - - if (!PKCS1_MGF1(db, dblen, seed, mdlen, mgf1md)) { - goto err; - } - for (size_t i = 0; i < dblen; i++) { - db[i] ^= maskeddb[i]; - } - - uint8_t phash[EVP_MAX_MD_SIZE]; - if (!EVP_Digest(param, param_len, phash, NULL, md, NULL)) { - goto err; - } - - crypto_word_t bad = ~constant_time_is_zero_w(CRYPTO_memcmp(db, phash, mdlen)); - bad |= ~constant_time_is_zero_w(from[0]); - - crypto_word_t looking_for_one_byte = CONSTTIME_TRUE_W; - size_t one_index = 0; - for (size_t i = mdlen; i < dblen; i++) { - crypto_word_t equals1 = constant_time_eq_w(db[i], 1); - crypto_word_t equals0 = constant_time_eq_w(db[i], 0); - one_index = - constant_time_select_w(looking_for_one_byte & equals1, i, one_index); - looking_for_one_byte = - constant_time_select_w(equals1, 0, looking_for_one_byte); - bad |= looking_for_one_byte & ~equals0; - } - - bad |= looking_for_one_byte; - - if (bad) { - goto decoding_err; - } - - one_index++; - size_t mlen = dblen - one_index; - if (max_out < mlen) { - OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE); - goto err; - } - - OPENSSL_memcpy(out, db + one_index, mlen); - *out_len = mlen; - OPENSSL_free(db); - FIPS_service_indicator_unlock_state(); - return 1; - -decoding_err: - // 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); - FIPS_service_indicator_unlock_state(); - return 0; -} - static const uint8_t kPSSZeroes[] = {0, 0, 0, 0, 0, 0, 0, 0}; int RSA_verify_PKCS1_PSS_mgf1(const RSA *rsa, const uint8_t *mHash, @@ -500,9 +221,9 @@ int RSA_verify_PKCS1_PSS_mgf1(const RSA *rsa, const uint8_t *mHash, FIPS_service_indicator_lock_state(); // Negative sLen has special meanings: - // -1 sLen == hLen - // -2 salt length is autorecovered from signature - // -N reserved + // -1 sLen == hLen + // -2 salt length is autorecovered from signature + // -N reserved size_t hLen = EVP_MD_size(Hash); if (sLen == -1) { sLen = (int)hLen; @@ -537,7 +258,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)) { @@ -647,7 +367,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/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa.c b/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa.c index 14cdae59b179..dffc8aa1ba46 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa.c +++ b/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa.c @@ -56,6 +56,7 @@ #include +#include #include #include @@ -87,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; } @@ -288,21 +288,6 @@ int RSA_set0_crt_params(RSA *rsa, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp) { return 1; } -int RSA_public_encrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa, - int padding) { - size_t out_len; - - if (!RSA_encrypt(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) { - return -1; - } - - if (out_len > INT_MAX) { - OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW); - return -1; - } - return (int)out_len; -} - static int rsa_sign_raw_no_self_test(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding) { @@ -320,58 +305,6 @@ int RSA_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, padding); } -int RSA_private_encrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa, - int padding) { - size_t out_len; - - if (!RSA_sign_raw(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) { - return -1; - } - - if (out_len > INT_MAX) { - OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW); - return -1; - } - return (int)out_len; -} - -int RSA_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, - const uint8_t *in, size_t in_len, int padding) { - if (rsa->meth->decrypt) { - return rsa->meth->decrypt(rsa, out_len, out, max_out, in, in_len, padding); - } - - return rsa_default_decrypt(rsa, out_len, out, max_out, in, in_len, padding); -} - -int RSA_private_decrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa, - int padding) { - size_t out_len; - if (!RSA_decrypt(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) { - return -1; - } - - if (out_len > INT_MAX) { - OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW); - return -1; - } - return (int)out_len; -} - -int RSA_public_decrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa, - int padding) { - size_t out_len; - if (!RSA_verify_raw(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) { - return -1; - } - - if (out_len > INT_MAX) { - OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW); - return -1; - } - return (int)out_len; -} - unsigned RSA_size(const RSA *rsa) { size_t ret = rsa->meth->size ? rsa->meth->size(rsa) : rsa_default_size(rsa); // RSA modulus sizes are bounded by |BIGNUM|, which must fit in |unsigned|. @@ -470,18 +403,43 @@ static const struct pkcs1_sig_prefix kPKCS1SigPrefixes[] = { }, }; -int RSA_add_pkcs1_prefix(uint8_t **out_msg, size_t *out_msg_len, - int *is_alloced, int hash_nid, const uint8_t *digest, - size_t digest_len) { +static int rsa_check_digest_size(int hash_nid, size_t digest_len) { if (hash_nid == NID_md5_sha1) { - // Special case: SSL signature, just check the length. if (digest_len != SSL_SIG_LENGTH) { OPENSSL_PUT_ERROR(RSA, RSA_R_INVALID_MESSAGE_LENGTH); return 0; } + return 1; + } + + for (size_t i = 0; kPKCS1SigPrefixes[i].nid != NID_undef; i++) { + const struct pkcs1_sig_prefix *sig_prefix = &kPKCS1SigPrefixes[i]; + if (sig_prefix->nid == hash_nid) { + if (digest_len != sig_prefix->hash_len) { + OPENSSL_PUT_ERROR(RSA, RSA_R_INVALID_MESSAGE_LENGTH); + return 0; + } + return 1; + } + } + + OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_ALGORITHM_TYPE); + return 0; + +} + +int RSA_add_pkcs1_prefix(uint8_t **out_msg, size_t *out_msg_len, + int *is_alloced, int hash_nid, const uint8_t *digest, + size_t digest_len) { + if (!rsa_check_digest_size(hash_nid, digest_len)) { + return 0; + } + if (hash_nid == NID_md5_sha1) { + // The length should already have been checked. + assert(digest_len == SSL_SIG_LENGTH); *out_msg = (uint8_t *)digest; - *out_msg_len = SSL_SIG_LENGTH; + *out_msg_len = digest_len; *is_alloced = 0; return 1; } @@ -492,11 +450,8 @@ int RSA_add_pkcs1_prefix(uint8_t **out_msg, size_t *out_msg_len, continue; } - if (digest_len != sig_prefix->hash_len) { - OPENSSL_PUT_ERROR(RSA, RSA_R_INVALID_MESSAGE_LENGTH); - return 0; - } - + // The length should already have been checked. + assert(digest_len == sig_prefix->hash_len); const uint8_t* prefix = sig_prefix->bytes; size_t prefix_len = sig_prefix->len; size_t signed_msg_len = prefix_len + digest_len; @@ -507,7 +462,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; } @@ -526,19 +480,25 @@ int RSA_add_pkcs1_prefix(uint8_t **out_msg, size_t *out_msg_len, } int rsa_sign_no_self_test(int hash_nid, const uint8_t *digest, - unsigned digest_len, uint8_t *out, unsigned *out_len, + size_t digest_len, uint8_t *out, unsigned *out_len, RSA *rsa) { + if (rsa->meth->sign) { + if (!rsa_check_digest_size(hash_nid, digest_len)) { + return 0; + } + // All supported digest lengths fit in |unsigned|. + assert(digest_len <= EVP_MAX_MD_SIZE); + static_assert(EVP_MAX_MD_SIZE <= UINT_MAX, "digest too long"); + return rsa->meth->sign(hash_nid, digest, (unsigned)digest_len, out, out_len, + rsa); + } + const unsigned rsa_size = RSA_size(rsa); int ret = 0; uint8_t *signed_msg = NULL; size_t signed_msg_len = 0; int signed_msg_is_alloced = 0; size_t size_t_out_len; - - if (rsa->meth->sign) { - return rsa->meth->sign(hash_nid, digest, digest_len, out, out_len, rsa); - } - if (!RSA_add_pkcs1_prefix(&signed_msg, &signed_msg_len, &signed_msg_is_alloced, hash_nid, digest, digest_len) || @@ -563,7 +523,7 @@ int rsa_sign_no_self_test(int hash_nid, const uint8_t *digest, return ret; } -int RSA_sign(int hash_nid, const uint8_t *digest, unsigned digest_len, +int RSA_sign(int hash_nid, const uint8_t *digest, size_t digest_len, uint8_t *out, unsigned *out_len, RSA *rsa) { boringssl_ensure_rsa_self_test(); @@ -581,7 +541,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; } @@ -615,7 +574,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; } @@ -662,7 +620,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; } @@ -743,7 +700,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; } @@ -758,7 +714,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); @@ -870,7 +827,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; } @@ -917,7 +873,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; } @@ -940,8 +895,8 @@ int RSA_check_fips(RSA *key) { return ret; } -int RSA_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, - size_t len) { +int rsa_private_transform_no_self_test(RSA *rsa, uint8_t *out, + const uint8_t *in, size_t len) { if (rsa->meth->private_transform) { return rsa->meth->private_transform(rsa, out, in, len); } @@ -949,6 +904,12 @@ int RSA_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, return rsa_default_private_transform(rsa, out, in, len); } +int rsa_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, + size_t len) { + boringssl_ensure_rsa_self_test(); + return rsa_private_transform_no_self_test(rsa, out, in, len); +} + int RSA_flags(const RSA *rsa) { return rsa->flags; } int RSA_test_flags(const RSA *rsa, int flags) { return rsa->flags & flags; } diff --git a/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.c b/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.c index 2bef70dac169..dabcd2fc02a2 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.c +++ b/third_party/boringssl/src/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 @@ -259,95 +266,6 @@ size_t rsa_default_size(const RSA *rsa) { return BN_num_bytes(rsa->n); } -int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, - const uint8_t *in, size_t in_len, int padding) { - boringssl_ensure_rsa_self_test(); - - if (!rsa_check_public_key(rsa)) { - return 0; - } - - const unsigned rsa_size = RSA_size(rsa); - BIGNUM *f, *result; - uint8_t *buf = NULL; - BN_CTX *ctx = NULL; - int i, ret = 0; - - if (max_out < rsa_size) { - OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL); - return 0; - } - - ctx = BN_CTX_new(); - if (ctx == NULL) { - goto err; - } - - BN_CTX_start(ctx); - f = BN_CTX_get(ctx); - result = BN_CTX_get(ctx); - buf = OPENSSL_malloc(rsa_size); - if (!f || !result || !buf) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); - goto err; - } - - switch (padding) { - case RSA_PKCS1_PADDING: - i = RSA_padding_add_PKCS1_type_2(buf, rsa_size, in, in_len); - break; - case RSA_PKCS1_OAEP_PADDING: - // Use the default parameters: SHA-1 for both hashes and no label. - i = RSA_padding_add_PKCS1_OAEP_mgf1(buf, rsa_size, in, in_len, - NULL, 0, NULL, NULL); - break; - case RSA_NO_PADDING: - i = RSA_padding_add_none(buf, rsa_size, in, in_len); - break; - default: - OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE); - goto err; - } - - if (i <= 0) { - goto err; - } - - if (BN_bin2bn(buf, rsa_size, f) == NULL) { - goto err; - } - - if (BN_ucmp(f, rsa->n) >= 0) { - // usually the padding functions would catch this - OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS); - goto err; - } - - if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) || - !BN_mod_exp_mont(result, f, rsa->e, &rsa->mont_n->N, ctx, rsa->mont_n)) { - goto err; - } - - // put in leading 0 bytes if the number is less than the length of the - // modulus - if (!BN_bn2bin_padded(out, rsa_size, result)) { - OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR); - goto err; - } - - *out_len = rsa_size; - ret = 1; - -err: - if (ctx != NULL) { - BN_CTX_end(ctx); - BN_CTX_free(ctx); - } - OPENSSL_free(buf); - - return ret; -} - // MAX_BLINDINGS_PER_RSA defines the maximum number of cached BN_BLINDINGs per // RSA*. Then this limit is exceeded, BN_BLINDING objects will be created and // destroyed as needed. @@ -365,7 +283,7 @@ int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, // // On success, the index of the assigned BN_BLINDING is written to // |*index_used| and must be passed to |rsa_blinding_release| when finished. -static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used, +static BN_BLINDING *rsa_blinding_get(RSA *rsa, size_t *index_used, BN_CTX *ctx) { assert(ctx != NULL); assert(rsa->mont_n != NULL); @@ -376,7 +294,7 @@ static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used, // Wipe the blinding cache on |fork|. if (rsa->blinding_fork_generation != fork_generation) { - for (unsigned i = 0; i < rsa->num_blindings; i++) { + for (size_t i = 0; i < rsa->num_blindings; i++) { // The inuse flag must be zero unless we were forked from a // multi-threaded process, in which case calling back into BoringSSL is // forbidden. @@ -407,7 +325,7 @@ static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used, // Double the length of the cache. static_assert(MAX_BLINDINGS_PER_RSA < UINT_MAX / 2, "MAX_BLINDINGS_PER_RSA too large"); - unsigned new_num_blindings = rsa->num_blindings * 2; + size_t new_num_blindings = rsa->num_blindings * 2; if (new_num_blindings == 0) { new_num_blindings = 1; } @@ -416,8 +334,6 @@ static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used, } assert(new_num_blindings > rsa->num_blindings); - static_assert(MAX_BLINDINGS_PER_RSA < UINT_MAX / sizeof(BN_BLINDING *), - "MAX_BLINDINGS_PER_RSA too large"); BN_BLINDING **new_blindings = OPENSSL_malloc(sizeof(BN_BLINDING *) * new_num_blindings); uint8_t *new_blindings_inuse = OPENSSL_malloc(new_num_blindings); @@ -429,10 +345,10 @@ static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used, sizeof(BN_BLINDING *) * rsa->num_blindings); OPENSSL_memcpy(new_blindings_inuse, rsa->blindings_inuse, rsa->num_blindings); - for (unsigned i = rsa->num_blindings; i < new_num_blindings; i++) { + for (size_t i = rsa->num_blindings; i < new_num_blindings; i++) { new_blindings[i] = BN_BLINDING_new(); if (new_blindings[i] == NULL) { - for (unsigned j = rsa->num_blindings; j < i; j++) { + for (size_t j = rsa->num_blindings; j < i; j++) { BN_BLINDING_free(new_blindings[j]); } goto err; @@ -466,7 +382,7 @@ static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used, // rsa_blinding_release marks the cached BN_BLINDING at the given index as free // for other threads to use. static void rsa_blinding_release(RSA *rsa, BN_BLINDING *blinding, - unsigned blinding_index) { + size_t blinding_index) { if (blinding_index == MAX_BLINDINGS_PER_RSA) { // This blinding wasn't cached. BN_BLINDING_free(blinding); @@ -493,7 +409,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; } @@ -513,7 +428,7 @@ int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, goto err; } - if (!RSA_private_transform(rsa, out, buf, rsa_size)) { + if (!rsa_private_transform_no_self_test(rsa, out, buf, rsa_size)) { goto err; } @@ -527,72 +442,6 @@ int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, return ret; } -int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, - const uint8_t *in, size_t in_len, int padding) { - boringssl_ensure_rsa_self_test(); - - const unsigned rsa_size = RSA_size(rsa); - uint8_t *buf = NULL; - int ret = 0; - - if (max_out < rsa_size) { - OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL); - return 0; - } - - if (padding == RSA_NO_PADDING) { - buf = out; - } else { - // 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; - } - } - - if (in_len != rsa_size) { - OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN); - goto err; - } - - if (!RSA_private_transform(rsa, buf, in, rsa_size)) { - goto err; - } - - switch (padding) { - case RSA_PKCS1_PADDING: - ret = - RSA_padding_check_PKCS1_type_2(out, out_len, rsa_size, buf, rsa_size); - break; - case RSA_PKCS1_OAEP_PADDING: - // Use the default parameters: SHA-1 for both hashes and no label. - ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, out_len, rsa_size, buf, - rsa_size, NULL, 0, NULL, NULL); - break; - case RSA_NO_PADDING: - *out_len = rsa_size; - ret = 1; - break; - default: - OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE); - goto err; - } - - CONSTTIME_DECLASSIFY(&ret, sizeof(ret)); - if (!ret) { - OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED); - } else { - CONSTTIME_DECLASSIFY(out, *out_len); - } - -err: - if (padding != RSA_NO_PADDING) { - OPENSSL_free(buf); - } - - return ret; -} static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); @@ -628,7 +477,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; } @@ -638,7 +486,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; } } @@ -707,7 +554,7 @@ int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, BIGNUM *f, *result; BN_CTX *ctx = NULL; - unsigned blinding_index = 0; + size_t blinding_index = 0; BN_BLINDING *blinding = NULL; int ret = 0; @@ -720,10 +567,11 @@ 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; } + // The caller should have ensured this. + assert(len == BN_num_bytes(rsa->n)); if (BN_bin2bn(in, len, f) == NULL) { goto err; } @@ -785,16 +633,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 && @@ -808,6 +656,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; @@ -926,11 +775,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/third_party/boringssl/src/crypto/fipsmodule/self_check/self_check.c b/third_party/boringssl/src/crypto/fipsmodule/self_check/self_check.c index 0c833aa7f2a5..0c9224227d27 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/self_check/self_check.c +++ b/third_party/boringssl/src/crypto/fipsmodule/self_check/self_check.c @@ -323,6 +323,9 @@ static int boringssl_self_test_rsa(void) { fprintf(stderr, "RSA key construction failed\n"); goto err; } + // Disable blinding for the power-on tests because it's not needed and + // triggers an entropy draw. + rsa_key->flags |= RSA_FLAG_NO_BLINDING; // RSA Sign KAT @@ -950,6 +953,76 @@ static int boringssl_self_test_fast(void) { goto err; } + // TLS v1.3: derives a dummy client-early-traffic secret. + static const uint8_t kTLS13Secret[32] = { + 0x02, 0x4a, 0x0d, 0x80, 0xf3, 0x57, 0xf2, 0x49, 0x9a, 0x12, 0x44, + 0xda, 0xc2, 0x6d, 0xab, 0x66, 0xfc, 0x13, 0xed, 0x85, 0xfc, 0xa7, + 0x1d, 0xac, 0xe1, 0x46, 0x21, 0x11, 0x19, 0x52, 0x58, 0x74, + }; + static const uint8_t kTLS13Salt[16] = { + 0x54, 0x61, 0x11, 0x36, 0x75, 0x91, 0xf0, 0xf8, + 0x92, 0xec, 0x70, 0xbd, 0x78, 0x2a, 0xef, 0x61, + }; + static const uint8_t kTLS13Label[] = "c e traffic"; + static const uint8_t kTLS13ClientHelloHash[32] = { + 0x1d, 0xe8, 0x67, 0xed, 0x93, 0x6a, 0x73, 0x65, 0x9b, 0x05, 0xcf, + 0x8a, 0x22, 0x77, 0xb7, 0x37, 0x29, 0xf2, 0x44, 0x94, 0x81, 0x6a, + 0x83, 0x33, 0x7f, 0x09, 0xbb, 0x6c, 0xc2, 0x6f, 0x48, 0x9c, + }; + static const uint8_t kTLS13ExpandLabelOutput[32] = { + 0x62, 0x91, 0x52, 0x90, 0x2e, 0xc9, 0xcf, 0x9c, 0x5f, 0x1e, 0x0a, + 0xb7, 0x00, 0x33, 0x42, 0x24, 0xc4, 0xe3, 0xba, 0x01, 0x40, 0x32, + 0x06, 0xab, 0x09, 0x23, 0x8a, 0xdd, 0x01, 0xa4, 0x05, 0xcd, + }; + uint8_t tls13_extract_output[32]; + size_t tls13_extract_output_len; + uint8_t tls13_expand_label_output[32]; + if (!HKDF_extract(tls13_extract_output, &tls13_extract_output_len, + EVP_sha256(), kTLS13Secret, sizeof(kTLS13Secret), + kTLS13Salt, sizeof(kTLS13Salt)) || + tls13_extract_output_len != sizeof(tls13_extract_output) || + !CRYPTO_tls13_hkdf_expand_label( + tls13_expand_label_output, sizeof(tls13_expand_label_output), + EVP_sha256(), tls13_extract_output, sizeof(tls13_extract_output), + kTLS13Label, sizeof(kTLS13Label) - 1, kTLS13ClientHelloHash, + sizeof(kTLS13ClientHelloHash)) || + !check_test(kTLS13ExpandLabelOutput, tls13_expand_label_output, + sizeof(kTLS13ExpandLabelOutput), + "CRYPTO_tls13_hkdf_expand_label")) { + fprintf(stderr, "TLSv1.3 KDF failed.\n"); + goto err; + } + + // HKDF + static const uint8_t kHKDFSecret[32] = { + 0x68, 0x67, 0x85, 0x04, 0xb9, 0xb3, 0xad, 0xd1, 0x7d, 0x59, 0x67, + 0xa1, 0xa7, 0xbd, 0x37, 0x99, 0x3f, 0xd8, 0xa3, 0x3c, 0xe7, 0x30, + 0x30, 0x71, 0xf3, 0x9c, 0x09, 0x6d, 0x16, 0x35, 0xb3, 0xc9, + }; + static const uint8_t kHKDFSalt[32] = { + 0x8a, 0xab, 0x18, 0xb4, 0x9b, 0x0a, 0x17, 0xf9, 0xe8, 0xe6, 0x97, + 0x1a, 0x3d, 0xff, 0xda, 0x9b, 0x26, 0x8b, 0x3d, 0x17, 0x78, 0x0a, + 0xb3, 0xea, 0x65, 0xdb, 0x2a, 0xc0, 0x29, 0x9c, 0xfa, 0x72, + }; + static const uint8_t kHKDFInfo[32] = { + 0xe5, 0x6f, 0xf9, 0xe1, 0x18, 0x5e, 0x64, 0x8c, 0x6c, 0x8f, 0xee, + 0xc6, 0x93, 0x5a, 0xc5, 0x14, 0x8c, 0xf3, 0xd9, 0x78, 0xd2, 0x3a, + 0x86, 0xdd, 0x01, 0xdf, 0xb9, 0xe9, 0x5e, 0xe5, 0x1a, 0x56, + }; + static const uint8_t kHKDFOutput[32] = { + 0xa6, 0x29, 0xb4, 0xd7, 0xf4, 0xc1, 0x16, 0x64, 0x71, 0x5e, 0xa4, + 0xa8, 0xe6, 0x60, 0x8c, 0xf3, 0xc1, 0xa5, 0x03, 0xe2, 0x22, 0xf9, + 0x89, 0xe2, 0x12, 0x18, 0xbe, 0xef, 0x16, 0x86, 0xe0, 0xec, + }; + uint8_t hkdf_output[sizeof(kHKDFOutput)]; + if (!HKDF(hkdf_output, sizeof(hkdf_output), EVP_sha256(), kHKDFSecret, + sizeof(kHKDFSecret), kHKDFSalt, sizeof(kHKDFSalt), kHKDFInfo, + sizeof(kHKDFInfo)) || + !check_test(kHKDFOutput, hkdf_output, sizeof(kHKDFOutput), "HKDF")) { + fprintf(stderr, "HKDF failed.\n"); + goto err; + } + ret = 1; err: diff --git a/third_party/boringssl/src/crypto/fipsmodule/service_indicator/service_indicator.c b/third_party/boringssl/src/crypto/fipsmodule/service_indicator/service_indicator.c index febe534480c2..b1ea28e80c78 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/service_indicator/service_indicator.c +++ b/third_party/boringssl/src/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; } @@ -239,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(); } } diff --git a/third_party/boringssl/src/crypto/fipsmodule/sha/asm/sha1-x86_64.pl b/third_party/boringssl/src/crypto/fipsmodule/sha/asm/sha1-x86_64.pl index 51260253524a..d9afacbd3e58 100755 --- a/third_party/boringssl/src/crypto/fipsmodule/sha/asm/sha1-x86_64.pl +++ b/third_party/boringssl/src/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) { @@ -1815,6 +1816,7 @@ () } } $code.=<<___; +.section .rodata .align 64 K_XX_XX: .long 0x5a827999,0x5a827999,0x5a827999,0x5a827999 # K_00_19 @@ -1833,6 +1835,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/third_party/boringssl/src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl b/third_party/boringssl/src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl index 2abd06586b7b..e831ae5c2531 100755 --- a/third_party/boringssl/src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/sha/internal.h b/third_party/boringssl/src/crypto/fipsmodule/sha/internal.h index cc90914956a6..605f1665b89d 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/sha/internal.h +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/sha/sha1-altivec.c b/third_party/boringssl/src/crypto/fipsmodule/sha/sha1-altivec.c deleted file mode 100644 index 3152827a0c9e..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/crypto/fipsmodule/tls/internal.h b/third_party/boringssl/src/crypto/fipsmodule/tls/internal.h index ef642a6cd5aa..535b7ebe6987 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/tls/internal.h +++ b/third_party/boringssl/src/crypto/fipsmodule/tls/internal.h @@ -31,6 +31,14 @@ OPENSSL_EXPORT int CRYPTO_tls1_prf(const EVP_MD *digest, const uint8_t *seed1, size_t seed1_len, const uint8_t *seed2, size_t seed2_len); +// CRYPTO_tls13_hkdf_expand_label computes the TLS 1.3 KDF function of the same +// name. See https://www.rfc-editor.org/rfc/rfc8446#section-7.1. +OPENSSL_EXPORT int CRYPTO_tls13_hkdf_expand_label( + uint8_t *out, size_t out_len, const EVP_MD *digest, // + const uint8_t *secret, size_t secret_len, // + const uint8_t *label, size_t label_len, // + const uint8_t *hash, size_t hash_len); + #if defined(__cplusplus) } diff --git a/third_party/boringssl/src/crypto/fipsmodule/tls/kdf.c b/third_party/boringssl/src/crypto/fipsmodule/tls/kdf.c index 046cb526aad0..9c6cfaf03ca5 100644 --- a/third_party/boringssl/src/crypto/fipsmodule/tls/kdf.c +++ b/third_party/boringssl/src/crypto/fipsmodule/tls/kdf.c @@ -52,6 +52,7 @@ #include +#include #include #include #include @@ -176,3 +177,34 @@ int CRYPTO_tls1_prf(const EVP_MD *digest, } return ret; } + +int CRYPTO_tls13_hkdf_expand_label(uint8_t *out, size_t out_len, + const EVP_MD *digest, // + const uint8_t *secret, size_t secret_len, + const uint8_t *label, size_t label_len, + const uint8_t *hash, size_t hash_len) { + static const uint8_t kProtocolLabel[] = "tls13 "; + CBB cbb, child; + uint8_t *hkdf_label = NULL; + size_t hkdf_label_len; + + CBB_zero(&cbb); + if (!CBB_init(&cbb, 2 + 1 + sizeof(kProtocolLabel) - 1 + label_len + 1 + + hash_len) || + !CBB_add_u16(&cbb, out_len) || + !CBB_add_u8_length_prefixed(&cbb, &child) || + !CBB_add_bytes(&child, kProtocolLabel, sizeof(kProtocolLabel) - 1) || + !CBB_add_bytes(&child, label, label_len) || + !CBB_add_u8_length_prefixed(&cbb, &child) || + !CBB_add_bytes(&child, hash, hash_len) || + !CBB_finish(&cbb, &hkdf_label, &hkdf_label_len)) { + CBB_cleanup(&cbb); + return 0; + } + + const int ret = HKDF_expand(out, out_len, digest, secret, secret_len, + hkdf_label, hkdf_label_len); + OPENSSL_free(hkdf_label); + return ret; +} + diff --git a/third_party/boringssl/src/crypto/hmac_extra/hmac_test.cc b/third_party/boringssl/src/crypto/hmac_extra/hmac_test.cc index c2d6199390f1..e65cd6a85019 100644 --- a/third_party/boringssl/src/crypto/hmac_extra/hmac_test.cc +++ b/third_party/boringssl/src/crypto/hmac_extra/hmac_test.cc @@ -99,8 +99,7 @@ TEST(HMACTest, TestVectors) { ASSERT_EQ(EVP_MD_size(digest), output.size()); // Test using the one-shot API. - unsigned expected_mac_len = EVP_MD_size(digest); - std::unique_ptr mac(new uint8_t[expected_mac_len]); + std::unique_ptr mac(new uint8_t[EVP_MD_size(digest)]); unsigned mac_len; ASSERT_TRUE(HMAC(digest, key.data(), key.size(), input.data(), input.size(), mac.get(), &mac_len)); diff --git a/third_party/boringssl/src/crypto/hpke/hpke.c b/third_party/boringssl/src/crypto/hpke/hpke.c index f94b68416178..3dfdb29b07cd 100644 --- a/third_party/boringssl/src/crypto/hpke/hpke.c +++ b/third_party/boringssl/src/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); @@ -366,13 +365,11 @@ const EVP_AEAD *EVP_HPKE_AEAD_aead(const EVP_HPKE_AEAD *aead) { static int hpke_build_suite_id(const EVP_HPKE_CTX *ctx, uint8_t out[HPKE_SUITE_ID_LEN]) { CBB cbb; - int ret = CBB_init_fixed(&cbb, out, HPKE_SUITE_ID_LEN) && - add_label_string(&cbb, "HPKE") && // - CBB_add_u16(&cbb, ctx->kem->id) && // - CBB_add_u16(&cbb, ctx->kdf->id) && // - CBB_add_u16(&cbb, ctx->aead->id); - CBB_cleanup(&cbb); - return ret; + CBB_init_fixed(&cbb, out, HPKE_SUITE_ID_LEN); + return add_label_string(&cbb, "HPKE") && // + CBB_add_u16(&cbb, ctx->kem->id) && // + CBB_add_u16(&cbb, ctx->kdf->id) && // + CBB_add_u16(&cbb, ctx->aead->id); } #define HPKE_MODE_BASE 0 @@ -409,8 +406,8 @@ static int hpke_key_schedule(EVP_HPKE_CTX *ctx, const uint8_t *shared_secret, uint8_t context[sizeof(uint8_t) + 2 * EVP_MAX_MD_SIZE]; size_t context_len; CBB context_cbb; - if (!CBB_init_fixed(&context_cbb, context, sizeof(context)) || - !CBB_add_u8(&context_cbb, HPKE_MODE_BASE) || + CBB_init_fixed(&context_cbb, context, sizeof(context)); + if (!CBB_add_u8(&context_cbb, HPKE_MODE_BASE) || !CBB_add_bytes(&context_cbb, psk_id_hash, psk_id_hash_len) || !CBB_add_bytes(&context_cbb, info_hash, info_hash_len) || !CBB_finish(&context_cbb, NULL, &context_len)) { @@ -467,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/third_party/boringssl/src/crypto/hrss/asm/poly_rq_mul.S b/third_party/boringssl/src/crypto/hrss/asm/poly_rq_mul.S index c37d7d0b4d36..eaf45a873240 100644 --- a/third_party/boringssl/src/crypto/hrss/asm/poly_rq_mul.S +++ b/third_party/boringssl/src/crypto/hrss/asm/poly_rq_mul.S @@ -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. -#if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_SMALL) && defined(__linux__) +#if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_SMALL) && defined(__linux__) && defined(__x86_64__) #if defined(BORINGSSL_PREFIX) #include @@ -8489,5 +8489,5 @@ ret #endif #if defined(__ELF__) -.section .note.GNU-stack,"",@progbits +.section .note.GNU-stack,"",%progbits #endif diff --git a/third_party/boringssl/src/crypto/internal.h b/third_party/boringssl/src/crypto/internal.h index 772f7e507bfb..b81bc8ab552f 100644 --- a/third_party/boringssl/src/crypto/internal.h +++ b/third_party/boringssl/src/crypto/internal.h @@ -174,7 +174,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); #if defined(STARBOARD) @@ -236,6 +236,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. @@ -313,7 +323,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; @@ -321,7 +331,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; @@ -329,7 +339,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; @@ -476,20 +486,44 @@ 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 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 + // 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. + 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); +} + // Thread-safe initialisation. @@ -1285,16 +1319,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 @@ -1309,6 +1333,13 @@ extern unsigned long OPENSSL_ppc64le_hwcap2; 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/third_party/boringssl/src/crypto/kyber/internal.h b/third_party/boringssl/src/crypto/kyber/internal.h new file mode 100644 index 000000000000..b3bfa86b84c0 --- /dev/null +++ b/third_party/boringssl/src/crypto/kyber/internal.h @@ -0,0 +1,91 @@ +/* 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 +#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; + 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); + +// 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) +} +#endif + +#endif // OPENSSL_HEADER_CRYPTO_KYBER_INTERNAL_H diff --git a/third_party/boringssl/src/crypto/kyber/keccak.c b/third_party/boringssl/src/crypto/kyber/keccak.c new file mode 100644 index 000000000000..f1c012d115ec --- /dev/null +++ b/third_party/boringssl/src/crypto/kyber/keccak.c @@ -0,0 +1,204 @@ +/* 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. + 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]; + 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 + 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/third_party/boringssl/src/crypto/kyber/keccak_tests.txt b/third_party/boringssl/src/crypto/kyber/keccak_tests.txt new file mode 100644 index 000000000000..c13aeb3d7910 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/kyber/kyber.c b/third_party/boringssl/src/crypto/kyber/kyber.c new file mode 100644 index 000000000000..f2ac30bd314a --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/kyber/kyber_test.cc b/third_party/boringssl/src/crypto/kyber/kyber_test.cc new file mode 100644 index 000000000000..ae51ac959764 --- /dev/null +++ b/third_party/boringssl/src/crypto/kyber/kyber_test.cc @@ -0,0 +1,222 @@ +/* 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 + +#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, 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/third_party/boringssl/src/crypto/kyber/kyber_tests.txt b/third_party/boringssl/src/crypto/kyber/kyber_tests.txt new file mode 100644 index 000000000000..d3a1c47797ce --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/mem.c b/third_party/boringssl/src/crypto/mem.c index a5a6f8451a48..2ecaaf9304d6 100644 --- a/third_party/boringssl/src/crypto/mem.c +++ b/third_party/boringssl/src/crypto/mem.c @@ -57,8 +57,11 @@ #include #include +#include +#include #include #include +#include #include @@ -68,6 +71,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" @@ -121,7 +130,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)); #endif // !defined(OPENSSL_SYS_STARBOARD) @@ -130,18 +139,108 @@ 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) +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, + any_malloc_failed = 0; + +static void malloc_exit_handler(void) { + CRYPTO_STATIC_MUTEX_lock_read(&malloc_failure_lock); + 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); +} + +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++; + any_malloc_failed = any_malloc_failed || should_fail; + 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; +} + +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 + void *OPENSSL_malloc(size_t size) { + if (should_fail_allocation()) { + goto err; + } + #if !defined(OPENSSL_SYS_STARBOARD) 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; } #endif // !defined(OPENSSL_SYS_STARBOARD) @@ -154,18 +253,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) { @@ -253,9 +357,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; } @@ -322,6 +424,34 @@ 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'); @@ -329,6 +459,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]); @@ -373,6 +508,62 @@ 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 < 0) { + goto err; + } + if ((size_t)ret >= candidate_len) { + // Too big to fit in allocation. + char *tmp; + + candidate_len = (size_t)ret + 1; + if ((tmp = reallocate(candidate, candidate_len)) == NULL) { + goto err; + } + candidate = tmp; + ret = vsnprintf(candidate, candidate_len, format, args); + } + // At this point this should not 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); @@ -384,7 +575,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; } @@ -423,7 +613,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/third_party/boringssl/src/crypto/obj/obj.c b/third_party/boringssl/src/crypto/obj/obj.c index 958625d02cd9..1ce9d5479e9f 100644 --- a/third_party/boringssl/src/crypto/obj/obj.c +++ b/third_party/boringssl/src/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); @@ -506,25 +505,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 +546,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/third_party/boringssl/src/crypto/obj/obj_dat.h b/third_party/boringssl/src/crypto/obj/obj_dat.h index cc185f1bf16a..7cd11536bca2 100644 --- a/third_party/boringssl/src/crypto/obj/obj_dat.h +++ b/third_party/boringssl/src/crypto/obj/obj_dat.h @@ -57,7 +57,7 @@ /* This file is generated by crypto/obj/objects.go. */ -#define NUM_NID 964 +#define NUM_NID 967 static const uint8_t kObjectData[] = { /* NID_rsadsi */ @@ -8777,11 +8777,14 @@ static const ASN1_OBJECT kObjects[NUM_NID] = { {"AuthPSK", "auth-psk", NID_auth_psk, 0, NULL, 0}, {"KxANY", "kx-any", NID_kx_any, 0, NULL, 0}, {"AuthANY", "auth-any", NID_auth_any, 0, NULL, 0}, - {"CECPQ2", "CECPQ2", NID_CECPQ2, 0, NULL, 0}, + {NULL, NULL, NID_undef, 0, NULL, 0}, {"ED448", "ED448", NID_ED448, 3, &kObjectData[6181], 0}, {"X448", "X448", NID_X448, 3, &kObjectData[6184], 0}, {"SHA512-256", "sha512-256", NID_sha512_256, 9, &kObjectData[6187], 0}, {"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[] = { @@ -8843,7 +8846,6 @@ static const uint16_t kNIDsInShortNameOrder[] = { 110 /* CAST5-CFB */, 109 /* CAST5-ECB */, 111 /* CAST5-OFB */, - 959 /* CECPQ2 */, 894 /* CMAC */, 13 /* CN */, 141 /* CRLReason */, @@ -8915,6 +8917,8 @@ static const uint16_t kNIDsInShortNameOrder[] = { 18 /* OU */, 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 */, @@ -8981,6 +8985,7 @@ static const uint16_t kNIDsInShortNameOrder[] = { 458 /* UID */, 0 /* UNDEF */, 948 /* X25519 */, + 964 /* X25519Kyber768 */, 961 /* X448 */, 11 /* X500 */, 378 /* X500algorithms */, @@ -9752,7 +9757,6 @@ static const uint16_t kNIDsInLongNameOrder[] = { 285 /* Biometric Info */, 179 /* CA Issuers */, 785 /* CA Repository */, - 959 /* CECPQ2 */, 131 /* Code Signing */, 783 /* Diffie-Hellman based MAC */, 382 /* Directory */, @@ -9828,6 +9832,8 @@ static const uint16_t kNIDsInLongNameOrder[] = { 366 /* OCSP Nonce */, 371 /* OCSP Service Locator */, 180 /* OCSP Signing */, + 965 /* P256Kyber768 */, + 966 /* P384Kyber768 */, 161 /* PBES2 */, 69 /* PBKDF2 */, 162 /* PBMAC1 */, @@ -9852,6 +9858,7 @@ static const uint16_t kNIDsInLongNameOrder[] = { 133 /* Time Stamping */, 375 /* Trust Root */, 948 /* X25519 */, + 964 /* X25519Kyber768 */, 961 /* X448 */, 12 /* X509 */, 402 /* X509v3 AC Targeting */, diff --git a/third_party/boringssl/src/crypto/obj/obj_mac.num b/third_party/boringssl/src/crypto/obj/obj_mac.num index 6367cc36456b..583f6e36480a 100644 --- a/third_party/boringssl/src/crypto/obj/obj_mac.num +++ b/third_party/boringssl/src/crypto/obj/obj_mac.num @@ -947,8 +947,10 @@ auth_ecdsa 955 auth_psk 956 kx_any 957 auth_any 958 -CECPQ2 959 ED448 960 X448 961 sha512_256 962 hkdf 963 +X25519Kyber768 964 +P256Kyber768 965 +P384Kyber768 966 diff --git a/third_party/boringssl/src/crypto/obj/objects.go b/third_party/boringssl/src/crypto/obj/objects.go index 361cdfe21cde..077a6e12f641 100644 --- a/third_party/boringssl/src/crypto/obj/objects.go +++ b/third_party/boringssl/src/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 ( @@ -19,7 +21,6 @@ import ( "bytes" "errors" "fmt" - "io/ioutil" "os" "os/exec" "sort" @@ -518,24 +519,11 @@ extern "C" { return err } - return ioutil.WriteFile(path, []byte(formatted), 0666) -} - -// TODO(davidben): Replace this with sort.Slice once Go 1.8 is sufficiently -// common. -type nidSorter struct { - nids []int - objs *objects - cmp func(a, b object) bool + return os.WriteFile(path, []byte(formatted), 0666) } -func (a nidSorter) obj(i int) object { return a.objs.byNID[a.nids[i]] } -func (a nidSorter) Len() int { return len(a.nids) } -func (a nidSorter) Swap(i, j int) { a.nids[i], a.nids[j] = a.nids[j], a.nids[i] } -func (a nidSorter) Less(i, j int) bool { return a.cmp(a.obj(i), a.obj(j)) } - func sortNIDs(nids []int, objs *objects, cmp func(a, b object) bool) { - sort.Sort(&nidSorter{nids, objs, cmp}) + sort.Slice(nids, func(i, j int) bool { return cmp(objs.byNID[nids[i]], objs.byNID[nids[j]]) }) } func writeData(path string, objs *objects) error { @@ -710,7 +698,7 @@ func writeData(path string, objs *objects) error { return err } - return ioutil.WriteFile(path, []byte(formatted), 0666) + return os.WriteFile(path, []byte(formatted), 0666) } func main() { diff --git a/third_party/boringssl/src/crypto/obj/objects.txt b/third_party/boringssl/src/crypto/obj/objects.txt index 67b76c773497..cad6a3bc79a7 100644 --- a/third_party/boringssl/src/crypto/obj/objects.txt +++ b/third_party/boringssl/src/crypto/obj/objects.txt @@ -1332,8 +1332,10 @@ secg-scheme 14 3 : dhSinglePass-cofactorDH-sha512kdf-scheme : dh-std-kdf : dh-cofactor-kdf -# NID for CECPQ2 (no corresponding OID). - : CECPQ2 +# NIDs for post quantum key agreements (no corresponding OIDs). + : X25519Kyber768 + : P256Kyber768 + : P384Kyber768 # See RFC 8410. 1 3 101 110 : X25519 diff --git a/third_party/boringssl/src/crypto/pem/pem_info.c b/third_party/boringssl/src/crypto/pem/pem_info.c index 04b4743709d7..c097013d40c2 100644 --- a/third_party/boringssl/src/crypto/pem/pem_info.c +++ b/third_party/boringssl/src/crypto/pem/pem_info.c @@ -1,4 +1,3 @@ -/* crypto/pem/pem_info.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -140,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/third_party/boringssl/src/crypto/pem/pem_lib.c b/third_party/boringssl/src/crypto/pem/pem_lib.c index 76622abd783a..30ba387e49a8 100644 --- a/third_party/boringssl/src/crypto/pem/pem_lib.c +++ b/third_party/boringssl/src/crypto/pem/pem_lib.c @@ -1,4 +1,3 @@ -/* crypto/pem/pem_lib.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -76,10 +75,11 @@ #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) { +// 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) { @@ -97,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, @@ -299,7 +302,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; @@ -320,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; } @@ -334,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); @@ -465,8 +467,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++; @@ -494,28 +496,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; @@ -559,7 +555,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; } @@ -622,7 +617,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; } @@ -648,7 +642,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); @@ -658,7 +651,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'; @@ -678,7 +670,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) { @@ -692,7 +683,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'; @@ -719,7 +709,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); @@ -796,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/third_party/boringssl/src/crypto/pem/pem_oth.c b/third_party/boringssl/src/crypto/pem/pem_oth.c index 8ea05be08c02..a94fed9bee88 100644 --- a/third_party/boringssl/src/crypto/pem/pem_oth.c +++ b/third_party/boringssl/src/crypto/pem/pem_oth.c @@ -1,4 +1,3 @@ -/* crypto/pem/pem_oth.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/crypto/pem/pem_pk8.c b/third_party/boringssl/src/crypto/pem/pem_pk8.c index 85196fa9bc2c..610f36ca7f57 100644 --- a/third_party/boringssl/src/crypto/pem/pem_pk8.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/pem/pem_x509.c b/third_party/boringssl/src/crypto/pem/pem_x509.c index 97f814dba0f4..fbaf6ca6a6ab 100644 --- a/third_party/boringssl/src/crypto/pem/pem_x509.c +++ b/third_party/boringssl/src/crypto/pem/pem_x509.c @@ -1,4 +1,3 @@ -/* pem_x509.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 2001. diff --git a/third_party/boringssl/src/crypto/pem/pem_xaux.c b/third_party/boringssl/src/crypto/pem/pem_xaux.c index b0cceca30fb1..5967175f4554 100644 --- a/third_party/boringssl/src/crypto/pem/pem_xaux.c +++ b/third_party/boringssl/src/crypto/pem/pem_xaux.c @@ -1,4 +1,3 @@ -/* pem_xaux.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 2001. diff --git a/third_party/boringssl/src/crypto/perlasm/arm-xlate.pl b/third_party/boringssl/src/crypto/perlasm/arm-xlate.pl index c000e020a5d3..e876c8b27367 100755 --- a/third_party/boringssl/src/crypto/perlasm/arm-xlate.pl +++ b/third_party/boringssl/src/crypto/perlasm/arm-xlate.pl @@ -151,6 +151,28 @@ sub expand_line { return $line; } +my ($arch_defines, $target_defines); +if ($flavour =~ /32/) { + $arch_defines = "defined(__ARMEL__)"; +} elsif ($flavour =~ /64/) { + $arch_defines = "defined(__AARCH64EL__)"; +} else { + die "unknown architecture: $flavour"; +} +if ($flavour =~ /linux/) { + # Although the flavour is specified as "linux", it is really used by all + # ELF platforms. + $target_defines = "defined(__ELF__)"; +} elsif ($flavour =~ /ios/) { + # Although the flavour is specified as "ios", it is really used by all Apple + # platforms. + $target_defines = "defined(__APPLE__)"; +} elsif ($flavour =~ /win/) { + $target_defines = "defined(_WIN32)"; +} else { + die "unknown target: $flavour"; +} + print <<___; // This file is generated from a similarly-named Perl script in the BoringSSL // source tree. Do not edit by hand. @@ -162,12 +184,9 @@ sub expand_line { #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) +#if !defined(OPENSSL_NO_ASM) && $arch_defines && $target_defines ___ -print "#if defined(__arm__)\n" if ($flavour eq "linux32"); -print "#if defined(__aarch64__)\n" if ($flavour eq "linux64" || $flavour eq "win64"); - print "#if defined(BORINGSSL_PREFIX)\n"; print "#include \n"; print "#endif\n"; @@ -239,10 +258,12 @@ sub expand_line { print "\n"; } -print "#endif\n" if ($flavour eq "linux32" || $flavour eq "linux64" || $flavour eq "win64"); -print "#endif // !OPENSSL_NO_ASM\n"; - -# See https://www.airs.com/blog/archives/518. -print ".section\t.note.GNU-stack,\"\",\%progbits\n" if ($flavour =~ /linux/); +print <<___; +#endif // !OPENSSL_NO_ASM && $arch_defines && $target_defines +#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/third_party/boringssl/src/crypto/perlasm/ppc-xlate.pl b/third_party/boringssl/src/crypto/perlasm/ppc-xlate.pl deleted file mode 100644 index fff9c004fab6..000000000000 --- a/third_party/boringssl/src/crypto/perlasm/ppc-xlate.pl +++ /dev/null @@ -1,317 +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__) -___ - -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__\n"; - -# See https://www.airs.com/blog/archives/518. -print ".section\t.note.GNU-stack,\"\",\@progbits\n" if ($flavour =~ /linux/); - -close STDOUT or die "error closing STDOUT: $!"; diff --git a/third_party/boringssl/src/crypto/perlasm/x86_64-xlate.pl b/third_party/boringssl/src/crypto/perlasm/x86_64-xlate.pl index e3745f898a28..16a7846835f1 100755 --- a/third_party/boringssl/src/crypto/perlasm/x86_64-xlate.pl +++ b/third_party/boringssl/src/crypto/perlasm/x86_64-xlate.pl @@ -59,6 +59,10 @@ # 9. .init segment is allowed to contain calls to functions only. # a. If function accepts more than 4 arguments *and* >4th argument # is declared as non 64-bit value, do clear its upper part. +# +# TODO(https://crbug.com/boringssl/259): The dual-ABI mechanism described here +# does not quite unwind correctly on Windows. The seh_directive logic below has +# the start of a new mechanism. use strict; @@ -72,6 +76,7 @@ my $gas=1; $gas=0 if ($output =~ /\.asm$/); my $elf=1; $elf=0 if (!$gas); +my $apple=0; my $win64=0; my $prefix=""; my $decor=".L"; @@ -91,7 +96,7 @@ $prefix=`echo __USER_LABEL_PREFIX__ | $ENV{CC} -E -P -`; $prefix =~ s|\R$||; # Better chomp } -elsif ($flavour eq "macosx") { $gas=1; $elf=0; $prefix="_"; $decor="L\$"; } +elsif ($flavour eq "macosx") { $gas=1; $elf=0; $apple=1; $prefix="_"; $decor="L\$"; } elsif ($flavour eq "masm") { $gas=0; $elf=0; $masm=$masmref; $win64=1; $decor="\$L\$"; } elsif ($flavour eq "nasm") { $gas=0; $elf=0; $nasm=$nasmref; $win64=1; $decor="\$L\$"; $PTR=""; } elsif (!$gas) { die "unknown flavour $flavour"; } @@ -709,15 +714,351 @@ return ($elf ? $self->{value} : undef); } } +{ package seh_directive; + # This implements directives, like MASM's, for specifying Windows unwind + # codes. See https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170 + # for details on the Windows unwind mechanism. Unlike MASM's directives, we + # have no .seh_endprolog directive. Instead, the last prolog directive is + # implicitly the end of the prolog. + # + # TODO(https://crbug.com/boringssl/259): For now, SEH directives are ignored + # on non-Windows platforms. This means functions need to specify both CFI + # and SEH directives, often redundantly. Ideally we'd abstract between the + # two. E.g., we can synthesize CFI from SEH prologs, but SEH does not + # annotate epilogs, so we'd need to combine parts from both. Or we can + # restrict ourselves to a subset of CFI and synthesize SEH from CFI. + # + # Additionally, this only supports @abi-omnipotent functions. It is + # incompatible with the automatic calling convention conversion. The main + # complication is the current scheme modifies RDI and RSI (non-volatile on + # Windows) at the start of the function, and saves them in the parameter + # stack area. This can be expressed with .seh_savereg, but .seh_savereg is + # only usable late in the prolog. However, unwind information gives enough + # information to locate the parameter stack area at any point in the + # function, so we can defer conversion or implement other schemes. + + my $UWOP_PUSH_NONVOL = 0; + my $UWOP_ALLOC_LARGE = 1; + my $UWOP_ALLOC_SMALL = 2; + my $UWOP_SET_FPREG = 3; + my $UWOP_SAVE_NONVOL = 4; + my $UWOP_SAVE_NONVOL_FAR = 5; + my $UWOP_SAVE_XMM128 = 8; + my $UWOP_SAVE_XMM128_FAR = 9; + + my %UWOP_REG_TO_NUMBER = ("%rax" => 0, "%rcx" => 1, "%rdx" => 2, "%rbx" => 3, + "%rsp" => 4, "%rbp" => 5, "%rsi" => 6, "%rdi" => 7, + map(("%r$_" => $_), (8..15))); + my %UWOP_NUMBER_TO_REG = reverse %UWOP_REG_TO_NUMBER; + + # The contents of the pdata and xdata sections so far. + my ($xdata, $pdata) = ("", ""); + + my %info; + + my $next_label = 0; + my $current_label_func = ""; + + # _new_unwind_label allocates a new label, unique to the file. + sub _new_unwind_label { + my ($name) = (@_); + # Labels only need to be unique, but to make diffs easier to read, scope + # them all under the current function. + my $func = $current_function->{name}; + if ($func ne $current_label_func) { + $current_label_func = $func; + $next_label = 0; + } + + my $num = $next_label++; + return ".LSEH_${name}_${func}_${num}"; + } + + sub _check_in_proc { + die "Missing .seh_startproc directive" unless %info; + } + + sub _check_not_in_proc { + die "Missing .seh_endproc directive" if %info; + } + + sub _startproc { + _check_not_in_proc(); + if ($current_function->{abi} eq "svr4") { + die "SEH directives can only be used with \@abi-omnipotent"; + } + + my $info_label = _new_unwind_label("info"); + my $start_label = _new_unwind_label("begin"); + %info = ( + # info_label is the label of the function's entry in .xdata. + info_label => $info_label, + # start_label is the start of the function. + start_label => $start_label, + # endprolog is the label of the last unwind code in the function. + endprolog => $start_label, + # unwind_codes contains the textual representation of the + # unwind codes in the function so far. + unwind_codes => "", + # num_codes is the number of 16-bit words in unwind_codes. + num_codes => 0, + # frame_reg is the number of the frame register, or zero if + # there is none. + frame_reg => 0, + # frame_offset is the offset into the fixed part of the stack that + # the frame register points into. + frame_offset => 0, + # has_offset is whether directives taking an offset have + # been used. This is used to check that such directives + # come after the fixed portion of the stack frame is established. + has_offset => 0, + # has_nonpushreg is whether directives other than + # .seh_pushreg have been used. This is used to check that + # .seh_pushreg directives are first. + has_nonpushreg => 0, + ); + return $start_label; + } + + sub _add_unwind_code { + my ($op, $value, @extra) = @_; + _check_in_proc(); + if ($op != $UWOP_PUSH_NONVOL) { + $info{has_nonpushreg} = 1; + } elsif ($info{has_nonpushreg}) { + die ".seh_pushreg directives must appear first in the prolog"; + } + + my $label = _new_unwind_label("prolog"); + # Encode an UNWIND_CODE structure. See + # https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170#struct-unwind_code + my $encoded = $op | ($value << 4); + my $codes = <<____; + .byte $label-$info{start_label} + .byte $encoded +____ + # Some opcodes need additional values to encode themselves. + foreach (@extra) { + $codes .= "\t.value\t$_\n"; + } + + $info{num_codes} += 1 + scalar(@extra); + # Unwind codes are listed in reverse order. + $info{unwind_codes} = $codes . $info{unwind_codes}; + # Track the label of the last unwind code. It implicitly is the end of + # the prolog. MASM has an endprolog directive, but it seems to be + # unnecessary. + $info{endprolog} = $label; + return $label; + } + + sub _updating_fixed_allocation { + _check_in_proc(); + if ($info{frame_reg} != 0) { + # Windows documentation does not explicitly forbid .seh_allocstack + # after .seh_setframe, but it appears to have no effect. Offsets are + # still relative to the fixed allocation when the frame register was + # established. + die "fixed allocation may not be increased after .seh_setframe"; + } + if ($info{has_offset}) { + # Windows documentation does not explicitly forbid .seh_savereg + # before .seh_allocstack, but it does not work very well. Offsets + # are relative to the top of the final fixed allocation, not where + # RSP currently is. + die "directives with an offset must come after the fixed allocation is established."; + } + } + + sub _endproc { + _check_in_proc(); + if ($info{num_codes} == 0) { + # If a Windows function has no directives (i.e. it doesn't touch the + # stack), it is a leaf function and is not expected to appear in + # .pdata or .xdata. + die ".seh_endproc found with no unwind codes"; + } + + my $end_label = _new_unwind_label("end"); + # Encode a RUNTIME_FUNCTION. See + # https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170#struct-runtime_function + $pdata .= <<____; + .rva $info{start_label} + .rva $end_label + .rva $info{info_label} + +____ + + # Encode an UNWIND_INFO. See + # https://learn.microsoft.com/en-us/cpp/build/exception-handling-x64?view=msvc-170#struct-unwind_info + my $frame_encoded = $info{frame_reg} | (($info{frame_offset} / 16) << 4); + $xdata .= <<____; +$info{info_label}: + .byte 1 # version 1, no flags + .byte $info{endprolog}-$info{start_label} + .byte $info{num_codes} + .byte $frame_encoded +$info{unwind_codes} +____ + + %info = (); + return $end_label; + } + + sub re { + my ($class, $line) = @_; + if ($$line =~ s/^\s*\.seh_(\w+)\s*//) { + my $dir = $1; + if (!$win64) { + $$line = ""; + return; + } + + my $label; + SWITCH: for ($dir) { + /^startproc$/ && do { + $label = _startproc(); + last; + }; + /^pushreg$/ && do { + $$line =~ /^(%\w+)\s*$/ or die "could not parse .seh_$dir"; + my $reg_num = $UWOP_REG_TO_NUMBER{$1} or die "unknown register $1"; + _updating_fixed_allocation(); + $label = _add_unwind_code($UWOP_PUSH_NONVOL, $reg_num); + last; + }; + /^allocstack$/ && do { + my $num = eval($$line); + if ($num <= 0 || $num % 8 != 0) { + die "invalid stack allocation: $num"; + } + _updating_fixed_allocation(); + if ($num <= 128) { + $label = _add_unwind_code($UWOP_ALLOC_SMALL, ($num - 8) / 8); + } elsif ($num < 512 * 1024) { + $label = _add_unwind_code($UWOP_ALLOC_LARGE, 0, $num / 8); + } elsif ($num < 4 * 1024 * 1024 * 1024) { + $label = _add_unwind_code($UWOP_ALLOC_LARGE, 1, $num >> 16, $num & 0xffff); + } else { + die "stack allocation too large: $num" + } + last; + }; + /^setframe$/ && do { + if ($info{frame_reg} != 0) { + die "duplicate .seh_setframe directive"; + } + if ($info{has_offset}) { + die "directives with with an offset must come after .seh_setframe."; + } + $$line =~ /(%\w+)\s*,\s*(.+)/ or die "could not parse .seh_$dir"; + my $reg_num = $UWOP_REG_TO_NUMBER{$1} or die "unknown register $1"; + my $offset = eval($2); + if ($offset < 0 || $offset % 16 != 0 || $offset > 240) { + die "invalid offset: $offset"; + } + $info{frame_reg} = $reg_num; + $info{frame_offset} = $offset; + $label = _add_unwind_code($UWOP_SET_FPREG, 0); + last; + }; + /^savereg$/ && do { + $$line =~ /(%\w+)\s*,\s*(.+)/ or die "could not parse .seh_$dir"; + my $reg_num = $UWOP_REG_TO_NUMBER{$1} or die "unknown register $1"; + my $offset = eval($2); + if ($offset < 0 || $offset % 8 != 0) { + die "invalid offset: $offset"; + } + if ($offset < 8 * 65536) { + $label = _add_unwind_code($UWOP_SAVE_NONVOL, $reg_num, $offset / 8); + } else { + $label = _add_unwind_code($UWOP_SAVE_NONVOL_FAR, $reg_num, $offset >> 16, $offset & 0xffff); + } + $info{has_offset} = 1; + last; + }; + /^savexmm128$/ && do { + $$line =~ /%xmm(\d+)\s*,\s*(.+)/ or die "could not parse .seh_$dir"; + my $reg_num = $1; + my $offset = eval($2); + if ($offset < 0 || $offset % 16 != 0) { + die "invalid offset: $offset"; + } + if ($offset < 16 * 65536) { + $label = _add_unwind_code($UWOP_SAVE_XMM128, $reg_num, $offset / 16); + } else { + $label = _add_unwind_code($UWOP_SAVE_XMM128_FAR, $reg_num, $offset >> 16, $offset & 0xffff); + } + $info{has_offset} = 1; + last; + }; + /^endproc$/ && do { + $label = _endproc(); + last; + }; + die "unknown SEH directive .seh_$dir"; + } + + # All SEH directives compile to labels inline. The other data is + # emitted later. + $$line = ""; + $label .= ":"; + return label->re(\$label); + } + } + + sub pdata_and_xdata { + return "" unless $win64; + + my $ret = ""; + if ($pdata ne "") { + $ret .= <<____; +.section .pdata +.align 4 +$pdata +____ + } + if ($xdata ne "") { + $ret .= <<____; +.section .xdata +.align 4 +$xdata +____ + } + return $ret; + } +} { 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 = {}; my $ret; my $dir; - # chain-call to cfi_directive + # chain-call to cfi_directive and seh_directive. $ret = cfi_directive->re($line) and return $ret; + $ret = seh_directive->re($line) and return $ret; if ($$line =~ /^\s*(\.\w+)/) { bless $self,$class; @@ -787,6 +1128,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"; } @@ -814,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\$"; @@ -827,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"; @@ -839,18 +1183,20 @@ /\.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/) { - $v.=" rdata align="; - $v.=$1 eq "p"? 4 : 8; + my $qualifiers = ""; + if ($$line=~/\.([prx])data/) { + $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"; - if ($$line=~/\.([px])data/) { + if ($$line=~/\.([prx])data/) { $v.=" READONLY"; $v.=" ALIGN(".($1 eq "p" ? 4 : 8).")" if ($masm>=$masmref); } elsif ($$line=~/\.CRT\$/i) { @@ -908,11 +1254,11 @@ map(s/(0b[0-1]+)/oct($1)/eig,@str); map(s/0x([0-9a-f]+)/0$1h/ig,@str) if ($masm); while ($#str>15) { - $self->{value}.="DB\t" + $self->{value}.="\tDB\t" .join(",",@str[0..15])."\n"; foreach (0..15) { shift @str; } } - $self->{value}.="DB\t" + $self->{value}.="\tDB\t" .join(",",@str) if (@str); last; }; @@ -1146,15 +1492,17 @@ sub rxb { } if ($nasm) { + die "unknown target" unless ($win64); print <<___; +\%ifidn __OUTPUT_FORMAT__, win64 default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD +\%define XMMWORD +\%define YMMWORD +\%define ZMMWORD -%ifdef BORINGSSL_PREFIX -%include "boringssl_prefix_symbols_nasm.inc" -%endif +\%ifdef BORINGSSL_PREFIX +\%include "boringssl_prefix_symbols_nasm.inc" +\%endif ___ } elsif ($masm) { print <<___; @@ -1163,22 +1511,32 @@ sub rxb { } if ($gas) { - print <<___; + my $target; + if ($elf) { + # The "elf" target is really ELF with SysV ABI, but every ELF platform + # uses the SysV ABI. + $target = "defined(__ELF__)"; + } elsif ($apple) { + $target = "defined(__APPLE__)"; + } else { + die "unknown target: $flavour"; + } + print <<___; #if defined(__has_feature) #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) #define OPENSSL_NO_ASM #endif #endif -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) +#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) && $target #if defined(BORINGSSL_PREFIX) #include #endif ___ } -while(defined(my $line=<>)) { - +sub process_line { + my $line = shift; $line =~ s|\R$||; # Better chomp if ($nasm) { @@ -1258,11 +1616,34 @@ sub rxb { print $line,"\n"; } +while(defined(my $line=<>)) { + process_line($line); +} +foreach my $line (split(/\n/, seh_directive->pdata_and_xdata())) { + process_line($line); +} + print "\n$current_segment\tENDS\n" if ($current_segment && $masm); -print "END\n" if ($masm); -print "#endif\n" if ($gas); -# See https://www.airs.com/blog/archives/518. -print ".section\t.note.GNU-stack,\"\",\@progbits\n" if ($elf); +if ($masm) { + print "END\n"; +} elsif ($gas) { + print <<___; +#endif +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",\%progbits +#endif +___ +} elsif ($nasm) { + print <<___; +\%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +\%endif +___ +} else { + die "unknown assembler"; +} close STDOUT or die "error closing STDOUT: $!"; diff --git a/third_party/boringssl/src/crypto/perlasm/x86asm.pl b/third_party/boringssl/src/crypto/perlasm/x86asm.pl index c22421f9ac75..d66255ed6ffd 100644 --- a/third_party/boringssl/src/crypto/perlasm/x86asm.pl +++ b/third_party/boringssl/src/crypto/perlasm/x86asm.pl @@ -284,22 +284,49 @@ sub ::asm_finish ___ if ($win32) { print <<___ unless $masm; -%ifdef BORINGSSL_PREFIX -%include "boringssl_prefix_symbols_nasm.inc" -%endif +\%ifdef BORINGSSL_PREFIX +\%include "boringssl_prefix_symbols_nasm.inc" +\%endif +\%ifidn __OUTPUT_FORMAT__, win32 +___ + print @out; + print <<___ unless $masm; +\%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +\%endif ___ } else { + my $target; + if ($elf) { + $target = "defined(__ELF__)"; + } elsif ($macosx) { + $target = "defined(__APPLE__)"; + } else { + die "unknown target"; + } + print <<___; -#if defined(__i386__) +#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(__i386__) && $target #if defined(BORINGSSL_PREFIX) #include #endif +___ + print @out; + print <<___; +#endif // !defined(OPENSSL_NO_ASM) && defined(__i386__) && $target +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",\%progbits +#endif ___ } - print @out; - print "#endif\n" unless ($win32); - # See https://www.airs.com/blog/archives/518. - print ".section\t.note.GNU-stack,\"\",\@progbits\n" if ($elf); } sub ::asm_init diff --git a/third_party/boringssl/src/crypto/pkcs7/pkcs7_test.cc b/third_party/boringssl/src/crypto/pkcs7/pkcs7_test.cc index bf8537964572..3c042ec5f013 100644 --- a/third_party/boringssl/src/crypto/pkcs7/pkcs7_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/pkcs7/pkcs7_x509.c b/third_party/boringssl/src/crypto/pkcs7/pkcs7_x509.c index 773c5923d482..fd71bd7b374f 100644 --- a/third_party/boringssl/src/crypto/pkcs7/pkcs7_x509.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/pkcs8/pkcs8.c b/third_party/boringssl/src/crypto/pkcs8/pkcs8.c index 84b7b1271995..6dd111b8545e 100644 --- a/third_party/boringssl/src/crypto/pkcs8/pkcs8.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.c b/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.c index 8795a5eda770..193d5e2de5f7 100644 --- a/third_party/boringssl/src/crypto/pkcs8/pkcs8_x509.c +++ b/third_party/boringssl/src/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; } @@ -782,7 +780,9 @@ PKCS12* d2i_PKCS12_bio(BIO *bio, PKCS12 **out_p12) { } for (;;) { - int n = BIO_read(bio, &buf->data[used], buf->length - used); + size_t max_read = buf->length - used; + int n = BIO_read(bio, &buf->data[used], + max_read > INT_MAX ? INT_MAX : (int)max_read); if (n < 0) { if (used == 0) { goto out; @@ -844,7 +844,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); @@ -885,7 +884,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/third_party/boringssl/src/crypto/poly1305/poly1305.c b/third_party/boringssl/src/crypto/poly1305/poly1305.c index 94853b8deea7..12f49bbd42fa 100644 --- a/third_party/boringssl/src/crypto/poly1305/poly1305.c +++ b/third_party/boringssl/src/crypto/poly1305/poly1305.c @@ -241,7 +241,6 @@ void CRYPTO_poly1305_update(poly1305_state *statep, const uint8_t *in, void CRYPTO_poly1305_finish(poly1305_state *statep, uint8_t mac[16]) { struct poly1305_state_st *state = poly1305_aligned_state(statep); - uint64_t f0, f1, f2, f3; uint32_t g0, g1, g2, g3, g4; uint32_t b, nb; @@ -294,22 +293,22 @@ void CRYPTO_poly1305_finish(poly1305_state *statep, uint8_t mac[16]) { state->h3 = (state->h3 & nb) | (g3 & b); state->h4 = (state->h4 & nb) | (g4 & b); - f0 = ((state->h0) | (state->h1 << 26)) + - (uint64_t)CRYPTO_load_u32_le(&state->key[0]); - f1 = ((state->h1 >> 6) | (state->h2 << 20)) + - (uint64_t)CRYPTO_load_u32_le(&state->key[4]); - f2 = ((state->h2 >> 12) | (state->h3 << 14)) + - (uint64_t)CRYPTO_load_u32_le(&state->key[8]); - f3 = ((state->h3 >> 18) | (state->h4 << 8)) + - (uint64_t)CRYPTO_load_u32_le(&state->key[12]); + uint64_t f0 = ((state->h0) | (state->h1 << 26)) + + (uint64_t)CRYPTO_load_u32_le(&state->key[0]); + uint64_t f1 = ((state->h1 >> 6) | (state->h2 << 20)) + + (uint64_t)CRYPTO_load_u32_le(&state->key[4]); + uint64_t f2 = ((state->h2 >> 12) | (state->h3 << 14)) + + (uint64_t)CRYPTO_load_u32_le(&state->key[8]); + uint64_t f3 = ((state->h3 >> 18) | (state->h4 << 8)) + + (uint64_t)CRYPTO_load_u32_le(&state->key[12]); - CRYPTO_store_u32_le(&mac[0], f0); + CRYPTO_store_u32_le(&mac[0], (uint32_t)f0); f1 += (f0 >> 32); - CRYPTO_store_u32_le(&mac[4], f1); + CRYPTO_store_u32_le(&mac[4], (uint32_t)f1); f2 += (f1 >> 32); - CRYPTO_store_u32_le(&mac[8], f2); + CRYPTO_store_u32_le(&mac[8], (uint32_t)f2); f3 += (f2 >> 32); - CRYPTO_store_u32_le(&mac[12], f3); + CRYPTO_store_u32_le(&mac[12], (uint32_t)f3); } #endif // !BORINGSSL_HAS_UINT128 || !OPENSSL_X86_64 diff --git a/third_party/boringssl/src/crypto/poly1305/poly1305_arm_asm.S b/third_party/boringssl/src/crypto/poly1305/poly1305_arm_asm.S index 80a4b31faa88..7895ab49daba 100644 --- a/third_party/boringssl/src/crypto/poly1305/poly1305_arm_asm.S +++ b/third_party/boringssl/src/crypto/poly1305/poly1305_arm_asm.S @@ -4,7 +4,7 @@ #endif #endif -#if defined(__arm__) && !defined(OPENSSL_NO_ASM) && !defined(__APPLE__) +#if defined(__ARMEL__) && !defined(OPENSSL_NO_ASM) && defined(__ELF__) #if defined(BORINGSSL_PREFIX) #include @@ -2022,7 +2022,7 @@ vst1.8 d4,[r0,: 64] add sp,sp,#0 bx lr -#endif /* __arm__ && !OPENSSL_NO_ASM && !__APPLE__ */ +#endif /* __ARMEL__ && !OPENSSL_NO_ASM && __ELF__ */ #if defined(__ELF__) .section .note.GNU-stack,"",%progbits diff --git a/third_party/boringssl/src/crypto/rand_extra/passive.c b/third_party/boringssl/src/crypto/rand_extra/passive.c index f27803b63edf..c54e2e8a9b07 100644 --- a/third_party/boringssl/src/crypto/rand_extra/passive.c +++ b/third_party/boringssl/src/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); } diff --git a/third_party/boringssl/src/crypto/asn1/a_print.c b/third_party/boringssl/src/crypto/rsa_extra/internal.h similarity index 84% rename from third_party/boringssl/src/crypto/asn1/a_print.c rename to third_party/boringssl/src/crypto/rsa_extra/internal.h index a5be164664ec..6317cfc01c60 100644 --- a/third_party/boringssl/src/crypto/asn1/a_print.c +++ b/third_party/boringssl/src/crypto/rsa_extra/internal.h @@ -54,29 +54,24 @@ * copied and put under another distribution licence * [including the GNU Public Licence.] */ -#include -#include +#ifndef OPENSSL_HEADER_RSA_EXTRA_INTERNAL_H +#define OPENSSL_HEADER_RSA_EXTRA_INTERNAL_H -#include "internal.h" +#if defined(__cplusplus) +extern "C" { +#endif -int ASN1_PRINTABLE_type(const unsigned char *s, int len) { - if (len < 0) { - len = strlen((const char *)s); - } +int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, + size_t max_out, const uint8_t *from, + size_t from_len, const uint8_t *param, + size_t param_len, const EVP_MD *md, + const EVP_MD *mgf1md); - int printable = 1; - for (int i = 0; i < len; i++) { - unsigned char c = s[i]; - if (c & 0x80) { - // No need to continue iterating. - return V_ASN1_T61STRING; - } - if (!asn1_is_printable(c)) { - printable = 0; - } - } - return printable ? V_ASN1_PRINTABLESTRING : V_ASN1_IA5STRING; -} +#if defined(__cplusplus) +} // extern C +#endif + +#endif // OPENSSL_HEADER_RSA_EXTRA_INTERNAL_H diff --git a/third_party/boringssl/src/crypto/rsa_extra/rsa_crypt.c b/third_party/boringssl/src/crypto/rsa_extra/rsa_crypt.c new file mode 100644 index 000000000000..97afa3db3476 --- /dev/null +++ b/third_party/boringssl/src/crypto/rsa_extra/rsa_crypt.c @@ -0,0 +1,563 @@ +/* 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.] */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "../fipsmodule/bn/internal.h" +#include "../fipsmodule/rsa/internal.h" +#include "../internal.h" +#include "internal.h" + + +static void rand_nonzero(uint8_t *out, size_t len) { + RAND_bytes(out, len); + + for (size_t i = 0; i < len; i++) { + while (out[i] == 0) { + RAND_bytes(out + i, 1); + } + } +} + +int RSA_padding_add_PKCS1_OAEP_mgf1(uint8_t *to, size_t to_len, + const uint8_t *from, size_t from_len, + const uint8_t *param, size_t param_len, + const EVP_MD *md, const EVP_MD *mgf1md) { + if (md == NULL) { + md = EVP_sha1(); + } + if (mgf1md == NULL) { + mgf1md = md; + } + + size_t mdlen = EVP_MD_size(md); + + if (to_len < 2 * mdlen + 2) { + OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL); + return 0; + } + + size_t emlen = to_len - 1; + if (from_len > emlen - 2 * mdlen - 1) { + OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE); + return 0; + } + + if (emlen < 2 * mdlen + 1) { + OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL); + return 0; + } + + to[0] = 0; + uint8_t *seed = to + 1; + uint8_t *db = to + mdlen + 1; + + uint8_t *dbmask = NULL; + int ret = 0; + if (!EVP_Digest(param, param_len, db, NULL, md, NULL)) { + goto out; + } + OPENSSL_memset(db + mdlen, 0, emlen - from_len - 2 * mdlen - 1); + db[emlen - from_len - mdlen - 1] = 0x01; + OPENSSL_memcpy(db + emlen - from_len - mdlen, from, from_len); + if (!RAND_bytes(seed, mdlen)) { + goto out; + } + + dbmask = OPENSSL_malloc(emlen - mdlen); + if (dbmask == NULL) { + goto out; + } + + if (!PKCS1_MGF1(dbmask, emlen - mdlen, seed, mdlen, mgf1md)) { + goto out; + } + for (size_t i = 0; i < emlen - mdlen; i++) { + db[i] ^= dbmask[i]; + } + + uint8_t seedmask[EVP_MAX_MD_SIZE]; + if (!PKCS1_MGF1(seedmask, mdlen, db, emlen - mdlen, mgf1md)) { + goto out; + } + for (size_t i = 0; i < mdlen; i++) { + seed[i] ^= seedmask[i]; + } + ret = 1; + +out: + OPENSSL_free(dbmask); + return ret; +} + +int RSA_padding_check_PKCS1_OAEP_mgf1(uint8_t *out, size_t *out_len, + size_t max_out, const uint8_t *from, + size_t from_len, const uint8_t *param, + size_t param_len, const EVP_MD *md, + const EVP_MD *mgf1md) { + uint8_t *db = NULL; + + if (md == NULL) { + md = EVP_sha1(); + } + if (mgf1md == NULL) { + mgf1md = md; + } + + size_t mdlen = EVP_MD_size(md); + + // The encoded message is one byte smaller than the modulus to ensure that it + // doesn't end up greater than the modulus. Thus there's an extra "+1" here + // compared to https://tools.ietf.org/html/rfc2437#section-9.1.1.2. + if (from_len < 1 + 2 * mdlen + 1) { + // 'from_len' is the length of the modulus, i.e. does not depend on the + // particular ciphertext. + goto decoding_err; + } + + size_t dblen = from_len - mdlen - 1; + db = OPENSSL_malloc(dblen); + if (db == NULL) { + goto err; + } + + const uint8_t *maskedseed = from + 1; + const uint8_t *maskeddb = from + 1 + mdlen; + + uint8_t seed[EVP_MAX_MD_SIZE]; + if (!PKCS1_MGF1(seed, mdlen, maskeddb, dblen, mgf1md)) { + goto err; + } + for (size_t i = 0; i < mdlen; i++) { + seed[i] ^= maskedseed[i]; + } + + if (!PKCS1_MGF1(db, dblen, seed, mdlen, mgf1md)) { + goto err; + } + for (size_t i = 0; i < dblen; i++) { + db[i] ^= maskeddb[i]; + } + + uint8_t phash[EVP_MAX_MD_SIZE]; + if (!EVP_Digest(param, param_len, phash, NULL, md, NULL)) { + goto err; + } + + crypto_word_t bad = ~constant_time_is_zero_w(CRYPTO_memcmp(db, phash, mdlen)); + bad |= ~constant_time_is_zero_w(from[0]); + + crypto_word_t looking_for_one_byte = CONSTTIME_TRUE_W; + size_t one_index = 0; + for (size_t i = mdlen; i < dblen; i++) { + crypto_word_t equals1 = constant_time_eq_w(db[i], 1); + crypto_word_t equals0 = constant_time_eq_w(db[i], 0); + one_index = + constant_time_select_w(looking_for_one_byte & equals1, i, one_index); + looking_for_one_byte = + constant_time_select_w(equals1, 0, looking_for_one_byte); + bad |= looking_for_one_byte & ~equals0; + } + + bad |= looking_for_one_byte; + + // 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) { + OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE); + goto err; + } + + OPENSSL_memcpy(out, db + one_index, mlen); + *out_len = mlen; + OPENSSL_free(db); + return 1; + +decoding_err: + // 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); + return 0; +} + +static int rsa_padding_add_PKCS1_type_2(uint8_t *to, size_t to_len, + const uint8_t *from, size_t from_len) { + // See RFC 8017, section 7.2.1. + if (to_len < RSA_PKCS1_PADDING_SIZE) { + OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL); + return 0; + } + + if (from_len > to_len - RSA_PKCS1_PADDING_SIZE) { + OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE); + return 0; + } + + to[0] = 0; + to[1] = 2; + + size_t padding_len = to_len - 3 - from_len; + rand_nonzero(to + 2, padding_len); + to[2 + padding_len] = 0; + OPENSSL_memcpy(to + to_len - from_len, from, from_len); + return 1; +} + +static int rsa_padding_check_PKCS1_type_2(uint8_t *out, size_t *out_len, + size_t max_out, const uint8_t *from, + size_t from_len) { + if (from_len == 0) { + OPENSSL_PUT_ERROR(RSA, RSA_R_EMPTY_PUBLIC_KEY); + return 0; + } + + // PKCS#1 v1.5 decryption. See "PKCS #1 v2.2: RSA Cryptography + // Standard", section 7.2.2. + if (from_len < RSA_PKCS1_PADDING_SIZE) { + // |from| is zero-padded to the size of the RSA modulus, a public value, so + // this can be rejected in non-constant time. + OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL); + return 0; + } + + crypto_word_t first_byte_is_zero = constant_time_eq_w(from[0], 0); + crypto_word_t second_byte_is_two = constant_time_eq_w(from[1], 2); + + crypto_word_t zero_index = 0, looking_for_index = CONSTTIME_TRUE_W; + for (size_t i = 2; i < from_len; i++) { + crypto_word_t equals0 = constant_time_is_zero_w(from[i]); + zero_index = + constant_time_select_w(looking_for_index & equals0, i, zero_index); + looking_for_index = constant_time_select_w(equals0, 0, looking_for_index); + } + + // The input must begin with 00 02. + crypto_word_t valid_index = first_byte_is_zero; + valid_index &= second_byte_is_two; + + // We must have found the end of PS. + valid_index &= ~looking_for_index; + + // PS must be at least 8 bytes long, and it starts two bytes into |from|. + valid_index &= constant_time_ge_w(zero_index, 2 + 8); + + // Skip the zero byte. + zero_index++; + + // NOTE: Although this logic attempts to be constant time, the API contracts + // of this function and |RSA_decrypt| with |RSA_PKCS1_PADDING| make it + // impossible to completely avoid Bleichenbacher's attack. Consumers should + // use |RSA_PADDING_NONE| and perform the padding check in constant-time + // combined with a swap to a random session key or other mitigation. + CONSTTIME_DECLASSIFY(&valid_index, sizeof(valid_index)); + CONSTTIME_DECLASSIFY(&zero_index, sizeof(zero_index)); + + if (!valid_index) { + OPENSSL_PUT_ERROR(RSA, RSA_R_PKCS_DECODING_ERROR); + return 0; + } + + const size_t msg_len = from_len - zero_index; + if (msg_len > max_out) { + // This shouldn't happen because this function is always called with + // |max_out| as the key size and |from_len| is bounded by the key size. + OPENSSL_PUT_ERROR(RSA, RSA_R_PKCS_DECODING_ERROR); + return 0; + } + + OPENSSL_memcpy(out, &from[zero_index], msg_len); + *out_len = msg_len; + return 1; +} + +int RSA_public_encrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa, + int padding) { + size_t out_len; + + if (!RSA_encrypt(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) { + return -1; + } + + if (out_len > INT_MAX) { + OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW); + return -1; + } + return (int)out_len; +} + +int RSA_private_encrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa, + int padding) { + size_t out_len; + + if (!RSA_sign_raw(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) { + return -1; + } + + if (out_len > INT_MAX) { + OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW); + return -1; + } + return (int)out_len; +} + +int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, + const uint8_t *in, size_t in_len, int padding) { + if (!rsa_check_public_key(rsa)) { + return 0; + } + + const unsigned rsa_size = RSA_size(rsa); + BIGNUM *f, *result; + uint8_t *buf = NULL; + BN_CTX *ctx = NULL; + int i, ret = 0; + + if (max_out < rsa_size) { + OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL); + return 0; + } + + ctx = BN_CTX_new(); + if (ctx == NULL) { + goto err; + } + + BN_CTX_start(ctx); + f = BN_CTX_get(ctx); + result = BN_CTX_get(ctx); + buf = OPENSSL_malloc(rsa_size); + if (!f || !result || !buf) { + goto err; + } + + switch (padding) { + case RSA_PKCS1_PADDING: + i = rsa_padding_add_PKCS1_type_2(buf, rsa_size, in, in_len); + break; + case RSA_PKCS1_OAEP_PADDING: + // Use the default parameters: SHA-1 for both hashes and no label. + i = RSA_padding_add_PKCS1_OAEP_mgf1(buf, rsa_size, in, in_len, NULL, 0, + NULL, NULL); + break; + case RSA_NO_PADDING: + i = RSA_padding_add_none(buf, rsa_size, in, in_len); + break; + default: + OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE); + goto err; + } + + if (i <= 0) { + goto err; + } + + if (BN_bin2bn(buf, rsa_size, f) == NULL) { + goto err; + } + + if (BN_ucmp(f, rsa->n) >= 0) { + // usually the padding functions would catch this + OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS); + goto err; + } + + if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) || + !BN_mod_exp_mont(result, f, rsa->e, &rsa->mont_n->N, ctx, rsa->mont_n)) { + goto err; + } + + // put in leading 0 bytes if the number is less than the length of the + // modulus + if (!BN_bn2bin_padded(out, rsa_size, result)) { + OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR); + goto err; + } + + *out_len = rsa_size; + ret = 1; + +err: + if (ctx != NULL) { + BN_CTX_end(ctx); + BN_CTX_free(ctx); + } + OPENSSL_free(buf); + + return ret; +} + +static int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, + size_t max_out, const uint8_t *in, size_t in_len, + int padding) { + const unsigned rsa_size = RSA_size(rsa); + uint8_t *buf = NULL; + int ret = 0; + + if (max_out < rsa_size) { + OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL); + return 0; + } + + if (padding == RSA_NO_PADDING) { + buf = out; + } else { + // Allocate a temporary buffer to hold the padded plaintext. + buf = OPENSSL_malloc(rsa_size); + if (buf == NULL) { + goto err; + } + } + + if (in_len != rsa_size) { + OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN); + goto err; + } + + if (!rsa_private_transform(rsa, buf, in, rsa_size)) { + goto err; + } + + switch (padding) { + case RSA_PKCS1_PADDING: + ret = + rsa_padding_check_PKCS1_type_2(out, out_len, rsa_size, buf, rsa_size); + break; + case RSA_PKCS1_OAEP_PADDING: + // Use the default parameters: SHA-1 for both hashes and no label. + ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, out_len, rsa_size, buf, + rsa_size, NULL, 0, NULL, NULL); + break; + case RSA_NO_PADDING: + *out_len = rsa_size; + ret = 1; + break; + default: + OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE); + goto err; + } + + CONSTTIME_DECLASSIFY(&ret, sizeof(ret)); + if (!ret) { + OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED); + } else { + CONSTTIME_DECLASSIFY(out, *out_len); + } + +err: + if (padding != RSA_NO_PADDING) { + OPENSSL_free(buf); + } + + return ret; +} + +int RSA_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, + const uint8_t *in, size_t in_len, int padding) { + if (rsa->meth->decrypt) { + return rsa->meth->decrypt(rsa, out_len, out, max_out, in, in_len, padding); + } + + return rsa_default_decrypt(rsa, out_len, out, max_out, in, in_len, padding); +} + +int RSA_private_decrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa, + int padding) { + size_t out_len; + if (!RSA_decrypt(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) { + return -1; + } + + if (out_len > INT_MAX) { + OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW); + return -1; + } + return (int)out_len; +} + +int RSA_public_decrypt(size_t flen, const uint8_t *from, uint8_t *to, RSA *rsa, + int padding) { + size_t out_len; + if (!RSA_verify_raw(rsa, &out_len, to, RSA_size(rsa), from, flen, padding)) { + return -1; + } + + if (out_len > INT_MAX) { + OPENSSL_PUT_ERROR(RSA, ERR_R_OVERFLOW); + return -1; + } + return (int)out_len; +} diff --git a/third_party/boringssl/src/crypto/rsa_extra/rsa_test.cc b/third_party/boringssl/src/crypto/rsa_extra/rsa_test.cc index 883eb97f2d02..d3ee69b31c6e 100644 --- a/third_party/boringssl/src/crypto/rsa_extra/rsa_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/stack/stack.c b/third_party/boringssl/src/crypto/stack/stack.c index fe1b51344d7f..7f60b2ea753f 100644 --- a/third_party/boringssl/src/crypto/stack/stack.c +++ b/third_party/boringssl/src/crypto/stack/stack.c @@ -212,7 +212,7 @@ void *sk_delete(_STACK *sk, size_t where) { if (where != sk->num - 1) { OPENSSL_memmove(&sk->data[where], &sk->data[where + 1], - sizeof(void *) * (sk->num - where - 1)); + sizeof(void *) * (sk->num - where - 1)); } sk->num--; @@ -233,6 +233,22 @@ void *sk_delete_ptr(_STACK *sk, const void *p) { return NULL; } +void sk_delete_if(_STACK *sk, OPENSSL_sk_call_delete_if_func call_func, + OPENSSL_sk_delete_if_func func, void *data) { + if (sk == NULL) { + return; + } + + size_t new_num = 0; + for (size_t i = 0; i < sk->num; i++) { + if (!call_func(func, sk->data[i], data)) { + sk->data[new_num] = sk->data[i]; + new_num++; + } + } + sk->num = new_num; +} + int sk_find(const _STACK *sk, size_t *out_index, const void *p, OPENSSL_sk_call_cmp_func call_cmp_func) { if (sk == NULL) { @@ -399,7 +415,8 @@ int sk_is_sorted(const _STACK *sk) { if (!sk) { return 1; } - return sk->sorted; + // Zero- and one-element lists are always sorted. + return sk->sorted || (sk->comp != NULL && sk->num < 2); } OPENSSL_sk_cmp_func sk_set_cmp_func(_STACK *sk, OPENSSL_sk_cmp_func comp) { diff --git a/third_party/boringssl/src/crypto/stack/stack_test.cc b/third_party/boringssl/src/crypto/stack/stack_test.cc index 7be84ed073b8..7900fc9094e6 100644 --- a/third_party/boringssl/src/crypto/stack/stack_test.cc +++ b/third_party/boringssl/src/crypto/stack/stack_test.cc @@ -163,7 +163,7 @@ TEST(StackTest, Basic) { // Test both deep and shallow copies. bssl::UniquePtr copy(sk_TEST_INT_deep_copy( sk.get(), - [](TEST_INT *x) -> TEST_INT * { + [](const TEST_INT *x) -> TEST_INT * { return x == nullptr ? nullptr : TEST_INT_new(*x).release(); }, TEST_INT_free)); @@ -179,13 +179,12 @@ TEST(StackTest, Basic) { } // Deep copies may fail. This should clean up temporaries. - EXPECT_FALSE(sk_TEST_INT_deep_copy(sk.get(), - [](TEST_INT *x) -> TEST_INT * { - return x == nullptr || *x == 4 - ? nullptr - : TEST_INT_new(*x).release(); - }, - TEST_INT_free)); + EXPECT_FALSE(sk_TEST_INT_deep_copy( + sk.get(), + [](const TEST_INT *x) -> TEST_INT * { + return x == nullptr || *x == 4 ? nullptr : TEST_INT_new(*x).release(); + }, + TEST_INT_free)); // sk_TEST_INT_zero clears a stack, but does not free the elements. ShallowStack shallow2(sk_TEST_INT_dup(sk.get())); @@ -211,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; @@ -222,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); } @@ -274,7 +273,9 @@ TEST(StackTest, Sorted) { // Copies preserve comparison and sorted information. bssl::UniquePtr copy(sk_TEST_INT_deep_copy( sk.get(), - [](TEST_INT *x) -> TEST_INT * { return TEST_INT_new(*x).release(); }, + [](const TEST_INT *x) -> TEST_INT * { + return TEST_INT_new(*x).release(); + }, TEST_INT_free)); ASSERT_TRUE(copy); EXPECT_TRUE(sk_TEST_INT_is_sorted(copy.get())); @@ -290,6 +291,7 @@ TEST(StackTest, Sorted) { // Removing elements does not affect sortedness. TEST_INT_free(sk_TEST_INT_delete(sk.get(), 0)); EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); // Changing the comparison function invalidates sortedness. sk_TEST_INT_set_cmp_func(sk.get(), compare_reverse); @@ -315,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))); @@ -392,3 +395,89 @@ 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); + ASSERT_TRUE(bssl::PushToStack(sk.get(), std::move(obj))); + } + + auto keep_only_multiples = [](TEST_INT *x, void *data) { + auto d = static_cast(data); + if (*x % *d == 0) { + return 0; + } + TEST_INT_free(x); + return 1; + }; + + int d = 2; + sk_TEST_INT_delete_if(sk.get(), keep_only_multiples, &d); + ExpectStackEquals(sk.get(), {2, 8, 4, 6}); + + EXPECT_FALSE(sk_TEST_INT_is_sorted(sk.get())); + sk_TEST_INT_sort(sk.get()); + ExpectStackEquals(sk.get(), {2, 4, 6, 8}); + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); + + // Keep only multiples of four. + d = 4; + sk_TEST_INT_delete_if(sk.get(), keep_only_multiples, &d); + ExpectStackEquals(sk.get(), {4, 8}); + + // Removing elements preserves the sorted bit. + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); + + // Delete everything. + d = 16; + sk_TEST_INT_delete_if(sk.get(), keep_only_multiples, &d); + ExpectStackEquals(sk.get(), {}); + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); +} + +TEST(StackTest, IsSorted) { + bssl::UniquePtr sk(sk_TEST_INT_new_null()); + ASSERT_TRUE(sk); + EXPECT_FALSE(sk_TEST_INT_is_sorted(sk.get())); + + // Empty lists are always known to be sorted. + sk_TEST_INT_set_cmp_func(sk.get(), compare); + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); + + // As are one-element lists. + auto value = TEST_INT_new(2); + ASSERT_TRUE(value); + ASSERT_TRUE(bssl::PushToStack(sk.get(), std::move(value))); + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); + + // Two-element lists require an explicit sort. + value = TEST_INT_new(1); + ASSERT_TRUE(value); + ASSERT_TRUE(bssl::PushToStack(sk.get(), std::move(value))); + EXPECT_FALSE(sk_TEST_INT_is_sorted(sk.get())); + + // The list is now sorted. + sk_TEST_INT_sort(sk.get()); + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); + + // After changing the comparison function, it no longer is sorted. + sk_TEST_INT_set_cmp_func(sk.get(), compare_reverse); + EXPECT_FALSE(sk_TEST_INT_is_sorted(sk.get())); + + sk_TEST_INT_sort(sk.get()); + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); + + // But, starting from one element, switching the comparison function preserves + // the sorted bit. + TEST_INT_free(sk_TEST_INT_pop(sk.get())); + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); + sk_TEST_INT_set_cmp_func(sk.get(), compare); + EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get())); + + // Without a comparison function, the list cannot be sorted. + sk_TEST_INT_set_cmp_func(sk.get(), nullptr); + EXPECT_FALSE(sk_TEST_INT_is_sorted(sk.get())); +} diff --git a/third_party/boringssl/src/crypto/test/CMakeLists.txt b/third_party/boringssl/src/crypto/test/CMakeLists.txt index b968fd78c3b2..9bfa2ec5a3cd 100644 --- a/third_party/boringssl/src/crypto/test/CMakeLists.txt +++ b/third_party/boringssl/src/crypto/test/CMakeLists.txt @@ -5,7 +5,6 @@ add_library( abi_test.cc file_test.cc - malloc.cc test_util.cc wycheproof_util.cc ) @@ -18,14 +17,7 @@ endif() if(WIN32) target_link_libraries(test_support_lib dbghelp) endif() -add_dependencies(test_support_lib global_target) +target_link_libraries(test_support_lib boringssl_gtest crypto) -add_library( - boringssl_gtest_main - - OBJECT - - gtest_main.cc -) - -add_dependencies(boringssl_gtest_main global_target) +add_library(boringssl_gtest_main STATIC gtest_main.cc) +target_link_libraries(boringssl_gtest_main boringssl_gtest crypto test_support_lib) diff --git a/third_party/boringssl/src/crypto/test/abi_test.h b/third_party/boringssl/src/crypto/test/abi_test.h index 1ba82b120977..24340c90655b 100644 --- a/third_party/boringssl/src/crypto/test/abi_test.h +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/test/asm/trampoline-ppc.pl b/third_party/boringssl/src/crypto/test/asm/trampoline-ppc.pl deleted file mode 100755 index b29c3612dae5..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/crypto/test/asm/trampoline-x86_64.pl b/third_party/boringssl/src/crypto/test/asm/trampoline-x86_64.pl index f6d83850799b..75c85ec47c75 100755 --- a/third_party/boringssl/src/crypto/test/asm/trampoline-x86_64.pl +++ b/third_party/boringssl/src/crypto/test/asm/trampoline-x86_64.pl @@ -139,8 +139,8 @@ sub store_caller_state { .globl abi_test_trampoline .align 16 abi_test_trampoline: -.Labi_test_trampoline_seh_begin: .cfi_startproc +.seh_startproc # Stack layout: # 8 bytes - align # $caller_state_size bytes - saved caller registers @@ -178,7 +178,7 @@ sub store_caller_state { $code .= <<____; subq \$$stack_alloc_size, %rsp .cfi_adjust_cfa_offset $stack_alloc_size -.Labi_test_trampoline_seh_prolog_alloc: +.seh_allocstack $stack_alloc_size ____ $code .= <<____ if (!$win64); movq $unwind, $unwind_offset(%rsp) @@ -186,20 +186,20 @@ sub store_caller_state { # Store our caller's state. This is needed because we modify it ourselves, and # also to isolate the test infrastruction from the function under test failing # to save some register. -my %reg_offsets; $code .= store_caller_state($caller_state_offset, "%rsp", sub { my ($off, $reg) = @_; $reg = substr($reg, 1); - $reg_offsets{$reg} = $off; - $off -= $stack_alloc_size + 8; + # SEH records offsets relative to %rsp (when there is no frame pointer), while + # CFI records them relative to the CFA, the value of the parent's stack + # pointer just before the call. + my $cfi_off = $off - $stack_alloc_size - 8; + my $seh_dir = ".seh_savereg"; + $seh_dir = ".seh_savexmm128" if ($reg =~ /^xmm/); return <<____; -.cfi_offset $reg, $off -.Labi_test_trampoline_seh_prolog_$reg: +.cfi_offset $reg, $cfi_off +$seh_dir \%$reg, $off ____ }); -$code .= <<____; -.Labi_test_trampoline_seh_prolog_end: -____ $code .= load_caller_state(0, $state); $code .= <<____; @@ -295,7 +295,7 @@ sub store_caller_state { # %rax already contains \$func's return value, unmodified. ret .cfi_endproc -.Labi_test_trampoline_seh_end: +.seh_endproc .size abi_test_trampoline,.-abi_test_trampoline ____ @@ -334,10 +334,10 @@ sub store_caller_state { .align 16 abi_test_bad_unwind_wrong_register: .cfi_startproc -.Labi_test_bad_unwind_wrong_register_seh_begin: +.seh_startproc pushq %r12 -.cfi_push %r13 # This should be %r12 -.Labi_test_bad_unwind_wrong_register_seh_push_r13: +.cfi_push %r13 # This should be %r13 +.seh_pushreg %r13 # This should be %r13 # Windows evaluates epilogs directly in the unwinder, rather than using # unwind codes. Add a nop so there is one non-epilog point (immediately # before the nop) where the unwinder can observe the mistake. @@ -345,7 +345,7 @@ sub store_caller_state { popq %r12 .cfi_pop %r12 ret -.Labi_test_bad_unwind_wrong_register_seh_end: +.seh_endproc .cfi_endproc .size abi_test_bad_unwind_wrong_register,.-abi_test_bad_unwind_wrong_register @@ -357,10 +357,10 @@ sub store_caller_state { .align 16 abi_test_bad_unwind_temporary: .cfi_startproc -.Labi_test_bad_unwind_temporary_seh_begin: +.seh_startproc pushq %r12 .cfi_push %r12 -.Labi_test_bad_unwind_temporary_seh_push_r12: +.seh_pushreg %r12 movq %r12, %rax inc %rax @@ -374,8 +374,8 @@ sub store_caller_state { popq %r12 .cfi_pop %r12 ret -.Labi_test_bad_unwind_temporary_seh_end: .cfi_endproc +.seh_endproc .size abi_test_bad_unwind_temporary,.-abi_test_bad_unwind_temporary # abi_test_get_and_clear_direction_flag clears the direction flag. If the flag @@ -412,9 +412,9 @@ sub store_caller_state { .globl abi_test_bad_unwind_epilog .align 16 abi_test_bad_unwind_epilog: -.Labi_test_bad_unwind_epilog_seh_begin: +.seh_startproc pushq %r12 -.Labi_test_bad_unwind_epilog_seh_push_r12: +.seh_pushreg %r12 nop @@ -422,136 +422,8 @@ sub store_caller_state { popq %r12 nop ret -.Labi_test_bad_unwind_epilog_seh_end: +.seh_endproc .size abi_test_bad_unwind_epilog,.-abi_test_bad_unwind_epilog -____ - - # Add unwind metadata for SEH. - # - # TODO(davidben): This is all manual right now. Once we've added SEH tests, - # add support for emitting these in x86_64-xlate.pl, probably based on MASM - # and Yasm's unwind directives, and unify with CFI. (Sadly, NASM does not - # support these directives.) Then push that upstream to replace the - # error-prone and non-standard custom handlers. - - # See https://docs.microsoft.com/en-us/cpp/build/struct-unwind-code?view=vs-2017 - my $UWOP_PUSH_NONVOL = 0; - my $UWOP_ALLOC_LARGE = 1; - my $UWOP_ALLOC_SMALL = 2; - my $UWOP_SAVE_NONVOL = 4; - my $UWOP_SAVE_XMM128 = 8; - - my %UWOP_REG_NUMBER = (rax => 0, rcx => 1, rdx => 2, rbx => 3, rsp => 4, - rbp => 5, rsi => 6, rdi => 7, - map(("r$_" => $_), (8..15))); - - my $unwind_codes = ""; - my $num_slots = 0; - foreach my $reg (reverse @caller_state) { - $reg = substr($reg, 1); - die "unknown register $reg" unless exists($reg_offsets{$reg}); - if ($reg =~ /^r/) { - die "unknown register $reg" unless exists($UWOP_REG_NUMBER{$reg}); - my $info = $UWOP_SAVE_NONVOL | ($UWOP_REG_NUMBER{$reg} << 4); - my $value = $reg_offsets{$reg} / 8; - $unwind_codes .= <<____; - .byte .Labi_test_trampoline_seh_prolog_$reg-.Labi_test_trampoline_seh_begin - .byte $info - .value $value -____ - $num_slots += 2; - } elsif ($reg =~ /^xmm/) { - my $info = $UWOP_SAVE_XMM128 | (substr($reg, 3) << 4); - my $value = $reg_offsets{$reg} / 16; - $unwind_codes .= <<____; - .byte .Labi_test_trampoline_seh_prolog_$reg-.Labi_test_trampoline_seh_begin - .byte $info - .value $value -____ - $num_slots += 2; - } else { - die "unknown register $reg"; - } - } - - if ($stack_alloc_size <= 128) { - my $info = $UWOP_ALLOC_SMALL | ((($stack_alloc_size - 8) / 8) << 4); - $unwind_codes .= <<____; - .byte .Labi_test_trampoline_seh_prolog_alloc-.Labi_test_trampoline_seh_begin - .byte $info -____ - $num_slots++; - } else { - die "stack allocation needs three unwind slots" if ($stack_alloc_size > 512 * 1024 + 8); - my $info = $UWOP_ALLOC_LARGE; - my $value = $stack_alloc_size / 8; - $unwind_codes .= <<____; - .byte .Labi_test_trampoline_seh_prolog_alloc-.Labi_test_trampoline_seh_begin - .byte $info - .value $value -____ - $num_slots += 2; - } - - $code .= <<____; -.section .pdata -.align 4 - # https://docs.microsoft.com/en-us/cpp/build/struct-runtime-function?view=vs-2017 - .rva .Labi_test_trampoline_seh_begin - .rva .Labi_test_trampoline_seh_end - .rva .Labi_test_trampoline_seh_info - - .rva .Labi_test_bad_unwind_wrong_register_seh_begin - .rva .Labi_test_bad_unwind_wrong_register_seh_end - .rva .Labi_test_bad_unwind_wrong_register_seh_info - - .rva .Labi_test_bad_unwind_temporary_seh_begin - .rva .Labi_test_bad_unwind_temporary_seh_end - .rva .Labi_test_bad_unwind_temporary_seh_info - - .rva .Labi_test_bad_unwind_epilog_seh_begin - .rva .Labi_test_bad_unwind_epilog_seh_end - .rva .Labi_test_bad_unwind_epilog_seh_info - -.section .xdata -.align 8 -.Labi_test_trampoline_seh_info: - # https://docs.microsoft.com/en-us/cpp/build/struct-unwind-info?view=vs-2017 - .byte 1 # version 1, no flags - .byte .Labi_test_trampoline_seh_prolog_end-.Labi_test_trampoline_seh_begin - .byte $num_slots - .byte 0 # no frame register -$unwind_codes - -.align 8 -.Labi_test_bad_unwind_wrong_register_seh_info: - .byte 1 # version 1, no flags - .byte .Labi_test_bad_unwind_wrong_register_seh_push_r13-.Labi_test_bad_unwind_wrong_register_seh_begin - .byte 1 # one slot - .byte 0 # no frame register - - .byte .Labi_test_bad_unwind_wrong_register_seh_push_r13-.Labi_test_bad_unwind_wrong_register_seh_begin - .byte @{[$UWOP_PUSH_NONVOL | ($UWOP_REG_NUMBER{r13} << 4)]} - -.align 8 -.Labi_test_bad_unwind_temporary_seh_info: - .byte 1 # version 1, no flags - .byte .Labi_test_bad_unwind_temporary_seh_push_r12-.Labi_test_bad_unwind_temporary_seh_begin - .byte 1 # one slot - .byte 0 # no frame register - - .byte .Labi_test_bad_unwind_temporary_seh_push_r12-.Labi_test_bad_unwind_temporary_seh_begin - .byte @{[$UWOP_PUSH_NONVOL | ($UWOP_REG_NUMBER{r12} << 4)]} - -.align 8 -.Labi_test_bad_unwind_epilog_seh_info: - .byte 1 # version 1, no flags - .byte .Labi_test_bad_unwind_epilog_seh_push_r12-.Labi_test_bad_unwind_epilog_seh_begin - .byte 1 # one slot - .byte 0 # no frame register - - .byte .Labi_test_bad_unwind_epilog_seh_push_r12-.Labi_test_bad_unwind_epilog_seh_begin - .byte @{[$UWOP_PUSH_NONVOL | ($UWOP_REG_NUMBER{r12} << 4)]} ____ } diff --git a/third_party/boringssl/src/crypto/test/file_test.cc b/third_party/boringssl/src/crypto/test/file_test.cc index e1ab2aa7c815..d7ef95115e44 100644 --- a/third_party/boringssl/src/crypto/test/file_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/test/gtest_main.h b/third_party/boringssl/src/crypto/test/gtest_main.h index 20ccf2143311..05d468ecfca1 100644 --- a/third_party/boringssl/src/crypto/test/gtest_main.h +++ b/third_party/boringssl/src/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 diff --git a/third_party/boringssl/src/crypto/test/malloc.cc b/third_party/boringssl/src/crypto/test/malloc.cc deleted file mode 100644 index 17189398f4cb..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/crypto/test/test_util.cc b/third_party/boringssl/src/crypto/test/test_util.cc index 7f954138c068..23e8909fe88f 100644 --- a/third_party/boringssl/src/crypto/test/test_util.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/thread_pthread.c b/third_party/boringssl/src/crypto/thread_pthread.c index 08bdd5a750b0..82cbbfe57419 100644 --- a/third_party/boringssl/src/crypto/thread_pthread.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/thread_win.c b/third_party/boringssl/src/crypto/thread_win.c index 3b61bfcfcdc1..57e4f9be60ef 100644 --- a/third_party/boringssl/src/crypto/thread_win.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/trust_token/internal.h b/third_party/boringssl/src/crypto/trust_token/internal.h index 31ecc49b5cd2..8fc5d6eae337 100644 --- a/third_party/boringssl/src/crypto/trust_token/internal.h +++ b/third_party/boringssl/src/crypto/trust_token/internal.h @@ -71,6 +71,7 @@ typedef struct { // TRUST_TOKEN_PRETOKEN represents the intermediate state a client keeps during // a Trust_Token issuance operation. typedef struct pmb_pretoken_st { + uint8_t salt[TRUST_TOKEN_NONCE_SIZE]; uint8_t t[TRUST_TOKEN_NONCE_SIZE]; EC_SCALAR r; EC_AFFINE Tp; @@ -100,18 +101,22 @@ int pmbtoken_exp1_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key, const uint8_t *in, size_t len); int pmbtoken_exp1_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, const uint8_t *in, size_t len); -STACK_OF(TRUST_TOKEN_PRETOKEN) * pmbtoken_exp1_blind(CBB *cbb, size_t count); +STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_exp1_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len); int pmbtoken_exp1_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, size_t num_requested, size_t num_to_issue, uint8_t private_metadata); -STACK_OF(TRUST_TOKEN) * - pmbtoken_exp1_unblind(const TRUST_TOKEN_CLIENT_KEY *key, - const STACK_OF(TRUST_TOKEN_PRETOKEN) * pretokens, - CBS *cbs, size_t count, uint32_t key_id); +STACK_OF(TRUST_TOKEN) *pmbtoken_exp1_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id); int pmbtoken_exp1_read(const TRUST_TOKEN_ISSUER_KEY *key, uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], uint8_t *out_private_metadata, const uint8_t *token, - size_t token_len); + size_t token_len, int include_message, + const uint8_t *msg, size_t msg_len); // pmbtoken_exp1_get_h_for_testing returns H in uncompressed coordinates. This // function is used to confirm H was computed as expected. @@ -128,23 +133,59 @@ int pmbtoken_exp2_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key, const uint8_t *in, size_t len); int pmbtoken_exp2_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, const uint8_t *in, size_t len); -STACK_OF(TRUST_TOKEN_PRETOKEN) * pmbtoken_exp2_blind(CBB *cbb, size_t count); +STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_exp2_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len); int pmbtoken_exp2_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, size_t num_requested, size_t num_to_issue, uint8_t private_metadata); -STACK_OF(TRUST_TOKEN) * - pmbtoken_exp2_unblind(const TRUST_TOKEN_CLIENT_KEY *key, - const STACK_OF(TRUST_TOKEN_PRETOKEN) * pretokens, - CBS *cbs, size_t count, uint32_t key_id); +STACK_OF(TRUST_TOKEN) *pmbtoken_exp2_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id); int pmbtoken_exp2_read(const TRUST_TOKEN_ISSUER_KEY *key, uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], uint8_t *out_private_metadata, const uint8_t *token, - size_t token_len); + size_t token_len, int include_message, + const uint8_t *msg, size_t msg_len); // pmbtoken_exp2_get_h_for_testing returns H in uncompressed coordinates. This // function is used to confirm H was computed as expected. OPENSSL_EXPORT int pmbtoken_exp2_get_h_for_testing(uint8_t out[97]); +// The following functions implement the corresponding |TRUST_TOKENS_METHOD| +// functions for |TRUST_TOKENS_pst_v1|'s PMBTokens construction which uses +// P-384. +int pmbtoken_pst1_generate_key(CBB *out_private, CBB *out_public); +int pmbtoken_pst1_derive_key_from_secret(CBB *out_private, CBB *out_public, + const uint8_t *secret, + size_t secret_len); +int pmbtoken_pst1_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key, + const uint8_t *in, size_t len); +int pmbtoken_pst1_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, + const uint8_t *in, size_t len); +STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_pst1_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len); +int pmbtoken_pst1_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, + size_t num_requested, size_t num_to_issue, + uint8_t private_metadata); +STACK_OF(TRUST_TOKEN) *pmbtoken_pst1_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id); +int pmbtoken_pst1_read(const TRUST_TOKEN_ISSUER_KEY *key, + uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], + uint8_t *out_private_metadata, const uint8_t *token, + size_t token_len, int include_message, + const uint8_t *msg, size_t msg_len); + +// pmbtoken_pst1_get_h_for_testing returns H in uncompressed coordinates. This +// function is used to confirm H was computed as expected. +OPENSSL_EXPORT int pmbtoken_pst1_get_h_for_testing(uint8_t out[97]); + // VOPRF. // @@ -165,18 +206,52 @@ int voprf_exp2_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key, const uint8_t *in, size_t len); int voprf_exp2_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, const uint8_t *in, size_t len); -STACK_OF(TRUST_TOKEN_PRETOKEN) * voprf_exp2_blind(CBB *cbb, size_t count); +STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_exp2_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len); int voprf_exp2_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, size_t num_requested, size_t num_to_issue, uint8_t private_metadata); -STACK_OF(TRUST_TOKEN) * - voprf_exp2_unblind(const TRUST_TOKEN_CLIENT_KEY *key, - const STACK_OF(TRUST_TOKEN_PRETOKEN) * pretokens, - CBS *cbs, size_t count, uint32_t key_id); +STACK_OF(TRUST_TOKEN) *voprf_exp2_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id); int voprf_exp2_read(const TRUST_TOKEN_ISSUER_KEY *key, uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], uint8_t *out_private_metadata, const uint8_t *token, - size_t token_len); + size_t token_len, int include_message, const uint8_t *msg, + size_t msg_len); + +// The following functions implement the corresponding |TRUST_TOKENS_METHOD| +// functions for |TRUST_TOKENS_pst_v1|'s VOPRF construction which uses P-384. +int voprf_pst1_generate_key(CBB *out_private, CBB *out_public); +int voprf_pst1_derive_key_from_secret(CBB *out_private, CBB *out_public, + const uint8_t *secret, size_t secret_len); +int voprf_pst1_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key, + const uint8_t *in, size_t len); +int voprf_pst1_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, + const uint8_t *in, size_t len); +STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_pst1_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len); +int voprf_pst1_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, + size_t num_requested, size_t num_to_issue, + uint8_t private_metadata); +OPENSSL_EXPORT int voprf_pst1_sign_with_proof_scalar_for_testing( + const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, size_t num_requested, + size_t num_to_issue, uint8_t private_metadata, + const uint8_t *proof_scalar_buf, size_t proof_scalar_len); +STACK_OF(TRUST_TOKEN) *voprf_pst1_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id); +int voprf_pst1_read(const TRUST_TOKEN_ISSUER_KEY *key, + uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], + uint8_t *out_private_metadata, const uint8_t *token, + size_t token_len, int include_message, const uint8_t *msg, + size_t msg_len); // Trust Tokens internals. @@ -191,7 +266,7 @@ struct trust_token_method_st { // |secret| and writes their serialized forms into |out_private| and // |out_public|. It returns one on success and zero on failure. int (*derive_key_from_secret)(CBB *out_private, CBB *out_public, - const uint8_t *secret, size_t secret_len); + const uint8_t *secret, size_t secret_len); // client_key_from_bytes decodes a client key from |in| and sets |key| // to the resulting key. It returns one on success and zero @@ -205,14 +280,17 @@ struct trust_token_method_st { int (*issuer_key_from_bytes)(TRUST_TOKEN_ISSUER_KEY *key, const uint8_t *in, size_t len); - // blind generates a new issuance request for |count| tokens. On + // blind generates a new issuance request for |count| tokens. If + // |include_message| is set, then |msg| is used to derive the token nonces. On // success, it returns a newly-allocated |STACK_OF(TRUST_TOKEN_PRETOKEN)| and // writes a request to the issuer to |cbb|. On failure, it returns NULL. The - // |STACK_OF(TRUST_TOKEN_PRETOKEN)|s should be passed to |pmbtoken_unblind| when - // the server responds. + // |STACK_OF(TRUST_TOKEN_PRETOKEN)|s should be passed to |pmbtoken_unblind| + // when the server responds. // // This function implements the AT.Usr0 operation. - STACK_OF(TRUST_TOKEN_PRETOKEN) * (*blind)(CBB *cbb, size_t count); + STACK_OF(TRUST_TOKEN_PRETOKEN) *(*blind)(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, size_t msg_len); // sign parses a request for |num_requested| tokens from |cbs| and // issues |num_to_issue| tokens with |key| and a private metadata value of @@ -232,20 +310,22 @@ struct trust_token_method_st { // returns NULL. // // This function implements the AT.Usr1 operation. - STACK_OF(TRUST_TOKEN) * - (*unblind)(const TRUST_TOKEN_CLIENT_KEY *key, - const STACK_OF(TRUST_TOKEN_PRETOKEN) * pretokens, CBS *cbs, - size_t count, uint32_t key_id); - - // read parses a PMBToken from |token| and verifies it using |key|. On - // success, it returns one and stores the nonce and private metadata bit in - // |out_nonce| and |*out_private_metadata|. Otherwise, it returns zero. Note - // that, unlike the output of |unblind|, |token| does not have a - // four-byte key ID prepended. + STACK_OF(TRUST_TOKEN) *(*unblind)( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id); + + // read parses a token from |token| and verifies it using |key|. If + // |include_message| is set, then the nonce is derived from |msg| and the salt + // in the token. On success, it returns one and stores the nonce and private + // metadata bit in |out_nonce| and |*out_private_metadata|. Otherwise, it + // returns zero. Note that, unlike the output of |unblind|, |token| does not + // have a four-byte key ID prepended. int (*read)(const TRUST_TOKEN_ISSUER_KEY *key, uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], uint8_t *out_private_metadata, const uint8_t *token, - size_t token_len); + size_t token_len, int include_message, const uint8_t *msg, + size_t msg_len); // whether the construction supports private metadata. int has_private_metadata; @@ -284,7 +364,7 @@ struct trust_token_client_st { size_t num_keys; // pretokens is the intermediate state during an active issuance. - STACK_OF(TRUST_TOKEN_PRETOKEN)* pretokens; + STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens; // srr_key is the public key used to verify the signature of the SRR. EVP_PKEY *srr_key; diff --git a/third_party/boringssl/src/crypto/trust_token/pmbtoken.c b/third_party/boringssl/src/crypto/trust_token/pmbtoken.c index 68d8909b9170..dcb94665d24d 100644 --- a/third_party/boringssl/src/crypto/trust_token/pmbtoken.c +++ b/third_party/boringssl/src/crypto/trust_token/pmbtoken.c @@ -123,8 +123,7 @@ static int derive_scalar_from_secret(const PMBTOKEN_METHOD *method, static int point_to_cbb(CBB *out, const EC_GROUP *group, const EC_AFFINE *point) { - size_t len = - ec_point_to_bytes(group, point, POINT_CONVERSION_UNCOMPRESSED, NULL, 0); + size_t len = ec_point_byte_len(group, POINT_CONVERSION_UNCOMPRESSED); if (len == 0) { return 0; } @@ -325,12 +324,14 @@ static int pmbtoken_issuer_key_from_bytes(const PMBTOKEN_METHOD *method, return 1; } -static STACK_OF(TRUST_TOKEN_PRETOKEN) * - pmbtoken_blind(const PMBTOKEN_METHOD *method, CBB *cbb, size_t count) { +static STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_blind( + const PMBTOKEN_METHOD *method, CBB *cbb, size_t count, int include_message, + const uint8_t *msg, size_t msg_len) { + SHA512_CTX hash_ctx; + 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; } @@ -339,17 +340,24 @@ static STACK_OF(TRUST_TOKEN_PRETOKEN) * 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; } - RAND_bytes(pretoken->t, sizeof(pretoken->t)); + RAND_bytes(pretoken->salt, sizeof(pretoken->salt)); + if (include_message) { + assert(SHA512_DIGEST_LENGTH == TRUST_TOKEN_NONCE_SIZE); + SHA512_Init(&hash_ctx); + SHA512_Update(&hash_ctx, pretoken->salt, sizeof(pretoken->salt)); + SHA512_Update(&hash_ctx, msg, msg_len); + SHA512_Final(pretoken->t, &hash_ctx); + } else { + OPENSSL_memcpy(pretoken->t, pretoken->salt, TRUST_TOKEN_NONCE_SIZE); + } // 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; } @@ -384,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); @@ -424,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; } @@ -462,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; } @@ -494,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; } @@ -629,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; } @@ -665,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; } @@ -824,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; } @@ -865,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; @@ -934,29 +934,24 @@ static int pmbtoken_sign(const PMBTOKEN_METHOD *method, return ret; } -static STACK_OF(TRUST_TOKEN) * - pmbtoken_unblind(const PMBTOKEN_METHOD *method, - const TRUST_TOKEN_CLIENT_KEY *key, - const STACK_OF(TRUST_TOKEN_PRETOKEN) * pretokens, CBS *cbs, - size_t count, uint32_t key_id) { +static STACK_OF(TRUST_TOKEN) *pmbtoken_unblind( + const PMBTOKEN_METHOD *method, const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id) { const EC_GROUP *group = method->group; if (count > sk_TRUST_TOKEN_PRETOKEN_num(pretokens)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); return NULL; } - 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; - } - 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)); @@ -964,16 +959,16 @@ static STACK_OF(TRUST_TOKEN) * 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) || !point_to_cbb(&batch_cbb, method->group, &key->pub1)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -1004,7 +999,6 @@ static STACK_OF(TRUST_TOKEN) * !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; } @@ -1025,7 +1019,7 @@ static STACK_OF(TRUST_TOKEN) * if (!CBB_init(&token_cbb, 4 + TRUST_TOKEN_NONCE_SIZE + 3 * (2 + point_len)) || !CBB_add_u32(&token_cbb, key_id) || - !CBB_add_bytes(&token_cbb, pretoken->t, TRUST_TOKEN_NONCE_SIZE) || + !CBB_add_bytes(&token_cbb, pretoken->salt, TRUST_TOKEN_NONCE_SIZE) || !cbb_add_prefixed_point(&token_cbb, group, &affines[0], method->prefix_point) || !cbb_add_prefixed_point(&token_cbb, group, &affines[1], @@ -1042,7 +1036,6 @@ static STACK_OF(TRUST_TOKEN) * 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; } @@ -1097,12 +1090,13 @@ static int pmbtoken_read(const PMBTOKEN_METHOD *method, const TRUST_TOKEN_ISSUER_KEY *key, uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], uint8_t *out_private_metadata, const uint8_t *token, - size_t token_len) { + size_t token_len, int include_message, + const uint8_t *msg, size_t msg_len) { const EC_GROUP *group = method->group; - CBS cbs; + CBS cbs, salt; CBS_init(&cbs, token, token_len); EC_AFFINE S, W, Ws; - if (!CBS_copy_bytes(&cbs, out_nonce, TRUST_TOKEN_NONCE_SIZE) || + if (!CBS_get_bytes(&cbs, &salt, TRUST_TOKEN_NONCE_SIZE) || !cbs_get_prefixed_point(&cbs, group, &S, method->prefix_point) || !cbs_get_prefixed_point(&cbs, group, &W, method->prefix_point) || !cbs_get_prefixed_point(&cbs, group, &Ws, method->prefix_point) || @@ -1111,6 +1105,16 @@ static int pmbtoken_read(const PMBTOKEN_METHOD *method, return 0; } + if (include_message) { + SHA512_CTX hash_ctx; + assert(SHA512_DIGEST_LENGTH == TRUST_TOKEN_NONCE_SIZE); + SHA512_Init(&hash_ctx); + SHA512_Update(&hash_ctx, CBS_data(&salt), CBS_len(&salt)); + SHA512_Update(&hash_ctx, msg, msg_len); + SHA512_Final(out_nonce, &hash_ctx); + } else { + OPENSSL_memcpy(out_nonce, CBS_data(&salt), CBS_len(&salt)); + } EC_RAW_POINT T; if (!method->hash_t(group, &T, out_nonce)) { @@ -1181,7 +1185,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; } @@ -1276,11 +1279,15 @@ int pmbtoken_exp1_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, return pmbtoken_issuer_key_from_bytes(&pmbtoken_exp1_method, key, in, len); } -STACK_OF(TRUST_TOKEN_PRETOKEN) * pmbtoken_exp1_blind(CBB *cbb, size_t count) { +STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_exp1_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len) { if (!pmbtoken_exp1_init_method()) { return NULL; } - return pmbtoken_blind(&pmbtoken_exp1_method, cbb, count); + return pmbtoken_blind(&pmbtoken_exp1_method, cbb, count, include_message, msg, + msg_len); } int pmbtoken_exp1_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, @@ -1293,10 +1300,10 @@ int pmbtoken_exp1_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, num_to_issue, private_metadata); } -STACK_OF(TRUST_TOKEN) * - pmbtoken_exp1_unblind(const TRUST_TOKEN_CLIENT_KEY *key, - const STACK_OF(TRUST_TOKEN_PRETOKEN) * pretokens, - CBS *cbs, size_t count, uint32_t key_id) { +STACK_OF(TRUST_TOKEN) *pmbtoken_exp1_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id) { if (!pmbtoken_exp1_init_method()) { return NULL; } @@ -1307,12 +1314,14 @@ STACK_OF(TRUST_TOKEN) * int pmbtoken_exp1_read(const TRUST_TOKEN_ISSUER_KEY *key, uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], uint8_t *out_private_metadata, const uint8_t *token, - size_t token_len) { + size_t token_len, int include_message, + const uint8_t *msg, size_t msg_len) { if (!pmbtoken_exp1_init_method()) { return 0; } return pmbtoken_read(&pmbtoken_exp1_method, key, out_nonce, - out_private_metadata, token, token_len); + out_private_metadata, token, token_len, include_message, + msg, msg_len); } int pmbtoken_exp1_get_h_for_testing(uint8_t out[97]) { @@ -1349,7 +1358,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; } @@ -1445,11 +1453,15 @@ int pmbtoken_exp2_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, return pmbtoken_issuer_key_from_bytes(&pmbtoken_exp2_method, key, in, len); } -STACK_OF(TRUST_TOKEN_PRETOKEN) * pmbtoken_exp2_blind(CBB *cbb, size_t count) { +STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_exp2_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len) { if (!pmbtoken_exp2_init_method()) { return NULL; } - return pmbtoken_blind(&pmbtoken_exp2_method, cbb, count); + return pmbtoken_blind(&pmbtoken_exp2_method, cbb, count, include_message, msg, + msg_len); } int pmbtoken_exp2_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, @@ -1462,10 +1474,10 @@ int pmbtoken_exp2_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, num_to_issue, private_metadata); } -STACK_OF(TRUST_TOKEN) * - pmbtoken_exp2_unblind(const TRUST_TOKEN_CLIENT_KEY *key, - const STACK_OF(TRUST_TOKEN_PRETOKEN) * pretokens, - CBS *cbs, size_t count, uint32_t key_id) { +STACK_OF(TRUST_TOKEN) *pmbtoken_exp2_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id) { if (!pmbtoken_exp2_init_method()) { return NULL; } @@ -1476,12 +1488,14 @@ STACK_OF(TRUST_TOKEN) * int pmbtoken_exp2_read(const TRUST_TOKEN_ISSUER_KEY *key, uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], uint8_t *out_private_metadata, const uint8_t *token, - size_t token_len) { + size_t token_len, int include_message, + const uint8_t *msg, size_t msg_len) { if (!pmbtoken_exp2_init_method()) { return 0; } return pmbtoken_read(&pmbtoken_exp2_method, key, out_nonce, - out_private_metadata, token, token_len); + out_private_metadata, token, token_len, include_message, + msg, msg_len); } int pmbtoken_exp2_get_h_for_testing(uint8_t out[97]) { @@ -1494,3 +1508,177 @@ int pmbtoken_exp2_get_h_for_testing(uint8_t out[97]) { ec_point_to_bytes(pmbtoken_exp2_method.group, &h, POINT_CONVERSION_UNCOMPRESSED, out, 97) == 97; } + +// PMBTokens PST v1. + +static int pmbtoken_pst1_hash_t(const EC_GROUP *group, EC_RAW_POINT *out, + const uint8_t t[TRUST_TOKEN_NONCE_SIZE]) { + const uint8_t kHashTLabel[] = "PMBTokens PST V1 HashT"; + return ec_hash_to_curve_p384_xmd_sha384_sswu( + group, out, kHashTLabel, sizeof(kHashTLabel), t, TRUST_TOKEN_NONCE_SIZE); +} + +static int pmbtoken_pst1_hash_s(const EC_GROUP *group, EC_RAW_POINT *out, + const EC_AFFINE *t, + const uint8_t s[TRUST_TOKEN_NONCE_SIZE]) { + const uint8_t kHashSLabel[] = "PMBTokens PST V1 HashS"; + int ret = 0; + CBB cbb; + uint8_t *buf = NULL; + size_t len; + if (!CBB_init(&cbb, 0) || + !point_to_cbb(&cbb, group, t) || + !CBB_add_bytes(&cbb, s, TRUST_TOKEN_NONCE_SIZE) || + !CBB_finish(&cbb, &buf, &len) || + !ec_hash_to_curve_p384_xmd_sha384_sswu( + group, out, kHashSLabel, sizeof(kHashSLabel), buf, len)) { + goto err; + } + + ret = 1; + +err: + OPENSSL_free(buf); + CBB_cleanup(&cbb); + return ret; +} + +static int pmbtoken_pst1_hash_c(const EC_GROUP *group, EC_SCALAR *out, + uint8_t *buf, size_t len) { + const uint8_t kHashCLabel[] = "PMBTokens PST V1 HashC"; + return ec_hash_to_scalar_p384_xmd_sha384( + group, out, kHashCLabel, sizeof(kHashCLabel), buf, len); +} + +static int pmbtoken_pst1_hash_to_scalar(const EC_GROUP *group, EC_SCALAR *out, + uint8_t *buf, size_t len) { + const uint8_t kHashLabel[] = "PMBTokens PST V1 HashToScalar"; + return ec_hash_to_scalar_p384_xmd_sha384( + group, out, kHashLabel, sizeof(kHashLabel), buf, len); +} + +static int pmbtoken_pst1_ok = 0; +static PMBTOKEN_METHOD pmbtoken_pst1_method; +static CRYPTO_once_t pmbtoken_pst1_method_once = CRYPTO_ONCE_INIT; + +static void pmbtoken_pst1_init_method_impl(void) { + // This is the output of |ec_hash_to_scalar_p384_xmd_sha384| with DST + // "PMBTokens PST V1 HashH" and message "generator". + static const uint8_t kH[] = { + 0x04, 0x4c, 0xfa, 0xd4, 0x33, 0x6d, 0x8c, 0x4e, 0x18, 0xce, 0x1a, + 0x82, 0x7b, 0x53, 0x8c, 0xf8, 0x63, 0x18, 0xe5, 0xa3, 0x96, 0x0d, + 0x05, 0xde, 0xf4, 0x83, 0xa7, 0xd8, 0xde, 0x9c, 0x50, 0x81, 0x38, + 0xc9, 0x38, 0x25, 0xa3, 0x70, 0x97, 0xc1, 0x1c, 0x33, 0x2e, 0x83, + 0x68, 0x64, 0x9c, 0x53, 0x73, 0xc3, 0x03, 0xc1, 0xa9, 0xd8, 0x92, + 0xa2, 0x32, 0xf4, 0x22, 0x40, 0x07, 0x2d, 0x9b, 0x6f, 0xab, 0xff, + 0x2a, 0x92, 0x03, 0xb1, 0x73, 0x09, 0x1a, 0x6a, 0x4a, 0xc2, 0x4c, + 0xac, 0x13, 0x59, 0xf4, 0x28, 0x0e, 0x78, 0x69, 0xa5, 0xdf, 0x0d, + 0x74, 0xeb, 0x14, 0xca, 0x8a, 0x32, 0xbb, 0xd3, 0x91 + }; + + pmbtoken_pst1_ok = pmbtoken_init_method( + &pmbtoken_pst1_method, NID_secp384r1, kH, sizeof(kH), + pmbtoken_pst1_hash_t, pmbtoken_pst1_hash_s, pmbtoken_pst1_hash_c, + pmbtoken_pst1_hash_to_scalar, 0); +} + +static int pmbtoken_pst1_init_method(void) { + CRYPTO_once(&pmbtoken_pst1_method_once, pmbtoken_pst1_init_method_impl); + if (!pmbtoken_pst1_ok) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_INTERNAL_ERROR); + return 0; + } + return 1; +} + +int pmbtoken_pst1_generate_key(CBB *out_private, CBB *out_public) { + if (!pmbtoken_pst1_init_method()) { + return 0; + } + + return pmbtoken_generate_key(&pmbtoken_pst1_method, out_private, out_public); +} + + +int pmbtoken_pst1_derive_key_from_secret(CBB *out_private, CBB *out_public, + const uint8_t *secret, + size_t secret_len) { + if (!pmbtoken_pst1_init_method()) { + return 0; + } + + return pmbtoken_derive_key_from_secret(&pmbtoken_pst1_method, out_private, + out_public, secret, secret_len); +} + +int pmbtoken_pst1_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key, + const uint8_t *in, size_t len) { + if (!pmbtoken_pst1_init_method()) { + return 0; + } + return pmbtoken_client_key_from_bytes(&pmbtoken_pst1_method, key, in, len); +} + +int pmbtoken_pst1_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, + const uint8_t *in, size_t len) { + if (!pmbtoken_pst1_init_method()) { + return 0; + } + return pmbtoken_issuer_key_from_bytes(&pmbtoken_pst1_method, key, in, len); +} + +STACK_OF(TRUST_TOKEN_PRETOKEN) *pmbtoken_pst1_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len) { + if (!pmbtoken_pst1_init_method()) { + return NULL; + } + return pmbtoken_blind(&pmbtoken_pst1_method, cbb, count, include_message, msg, + msg_len); +} + +int pmbtoken_pst1_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, + size_t num_requested, size_t num_to_issue, + uint8_t private_metadata) { + if (!pmbtoken_pst1_init_method()) { + return 0; + } + return pmbtoken_sign(&pmbtoken_pst1_method, key, cbb, cbs, num_requested, + num_to_issue, private_metadata); +} + +STACK_OF(TRUST_TOKEN) *pmbtoken_pst1_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id) { + if (!pmbtoken_pst1_init_method()) { + return NULL; + } + return pmbtoken_unblind(&pmbtoken_pst1_method, key, pretokens, cbs, count, + key_id); +} + +int pmbtoken_pst1_read(const TRUST_TOKEN_ISSUER_KEY *key, + uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], + uint8_t *out_private_metadata, const uint8_t *token, + size_t token_len, int include_message, + const uint8_t *msg, size_t msg_len) { + if (!pmbtoken_pst1_init_method()) { + return 0; + } + return pmbtoken_read(&pmbtoken_pst1_method, key, out_nonce, + out_private_metadata, token, token_len, include_message, + msg, msg_len); +} + +int pmbtoken_pst1_get_h_for_testing(uint8_t out[97]) { + if (!pmbtoken_pst1_init_method()) { + return 0; + } + EC_AFFINE h; + return ec_jacobian_to_affine(pmbtoken_pst1_method.group, &h, + &pmbtoken_pst1_method.h) && + ec_point_to_bytes(pmbtoken_pst1_method.group, &h, + POINT_CONVERSION_UNCOMPRESSED, out, 97) == 97; +} diff --git a/third_party/boringssl/src/crypto/trust_token/trust_token.c b/third_party/boringssl/src/crypto/trust_token/trust_token.c index 5afb487c07a2..93172c37c23d 100644 --- a/third_party/boringssl/src/crypto/trust_token/trust_token.c +++ b/third_party/boringssl/src/crypto/trust_token/trust_token.c @@ -78,6 +78,41 @@ const TRUST_TOKEN_METHOD *TRUST_TOKEN_experiment_v2_pmb(void) { return &kMethod; } +const TRUST_TOKEN_METHOD *TRUST_TOKEN_pst_v1_voprf(void) { + static const TRUST_TOKEN_METHOD kMethod = { + voprf_pst1_generate_key, + voprf_pst1_derive_key_from_secret, + voprf_pst1_client_key_from_bytes, + voprf_pst1_issuer_key_from_bytes, + voprf_pst1_blind, + voprf_pst1_sign, + voprf_pst1_unblind, + voprf_pst1_read, + 0, /* has_private_metadata */ + 6, /* max_keys */ + 0, /* has_srr */ + }; + return &kMethod; +} + +const TRUST_TOKEN_METHOD *TRUST_TOKEN_pst_v1_pmb(void) { + static const TRUST_TOKEN_METHOD kMethod = { + pmbtoken_pst1_generate_key, + pmbtoken_pst1_derive_key_from_secret, + pmbtoken_pst1_client_key_from_bytes, + pmbtoken_pst1_issuer_key_from_bytes, + pmbtoken_pst1_blind, + pmbtoken_pst1_sign, + pmbtoken_pst1_unblind, + pmbtoken_pst1_read, + 1, /* has_private_metadata */ + 3, /* max_keys */ + 0, /* has_srr */ + }; + return &kMethod; +} + + void TRUST_TOKEN_PRETOKEN_free(TRUST_TOKEN_PRETOKEN *pretoken) { OPENSSL_free(pretoken); } @@ -85,13 +120,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; } @@ -113,34 +146,26 @@ int TRUST_TOKEN_generate_key(const TRUST_TOKEN_METHOD *method, size_t *out_pub_key_len, size_t max_pub_key_len, uint32_t id) { // Prepend the key ID in front of the PMBTokens format. - int ret = 0; CBB priv_cbb, pub_cbb; - CBB_zero(&priv_cbb); - CBB_zero(&pub_cbb); - if (!CBB_init_fixed(&priv_cbb, out_priv_key, max_priv_key_len) || - !CBB_init_fixed(&pub_cbb, out_pub_key, max_pub_key_len) || - !CBB_add_u32(&priv_cbb, id) || + CBB_init_fixed(&priv_cbb, out_priv_key, max_priv_key_len); + CBB_init_fixed(&pub_cbb, out_pub_key, max_pub_key_len); + if (!CBB_add_u32(&priv_cbb, id) || // !CBB_add_u32(&pub_cbb, id)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL); - goto err; + return 0; } if (!method->generate_key(&priv_cbb, &pub_cbb)) { - goto err; + return 0; } if (!CBB_finish(&priv_cbb, NULL, out_priv_key_len) || !CBB_finish(&pub_cbb, NULL, out_pub_key_len)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL); - goto err; + return 0; } - ret = 1; - -err: - CBB_cleanup(&priv_cbb); - CBB_cleanup(&pub_cbb); - return ret; + return 1; } int TRUST_TOKEN_derive_key_from_secret( @@ -149,35 +174,27 @@ int TRUST_TOKEN_derive_key_from_secret( size_t *out_pub_key_len, size_t max_pub_key_len, uint32_t id, const uint8_t *secret, size_t secret_len) { // Prepend the key ID in front of the PMBTokens format. - int ret = 0; CBB priv_cbb, pub_cbb; - CBB_zero(&priv_cbb); - CBB_zero(&pub_cbb); - if (!CBB_init_fixed(&priv_cbb, out_priv_key, max_priv_key_len) || - !CBB_init_fixed(&pub_cbb, out_pub_key, max_pub_key_len) || - !CBB_add_u32(&priv_cbb, id) || + CBB_init_fixed(&priv_cbb, out_priv_key, max_priv_key_len); + CBB_init_fixed(&pub_cbb, out_pub_key, max_pub_key_len); + if (!CBB_add_u32(&priv_cbb, id) || // !CBB_add_u32(&pub_cbb, id)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL); - goto err; + return 0; } if (!method->derive_key_from_secret(&priv_cbb, &pub_cbb, secret, secret_len)) { - goto err; + return 0; } if (!CBB_finish(&priv_cbb, NULL, out_priv_key_len) || !CBB_finish(&pub_cbb, NULL, out_pub_key_len)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_BUFFER_TOO_SMALL); - goto err; + return 0; } - ret = 1; - -err: - CBB_cleanup(&priv_cbb); - CBB_cleanup(&pub_cbb); - return ret; + return 1; } TRUST_TOKEN_CLIENT *TRUST_TOKEN_CLIENT_new(const TRUST_TOKEN_METHOD *method, @@ -190,7 +207,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)); @@ -242,8 +258,9 @@ int TRUST_TOKEN_CLIENT_set_srr_key(TRUST_TOKEN_CLIENT *ctx, EVP_PKEY *key) { return 1; } -int TRUST_TOKEN_CLIENT_begin_issuance(TRUST_TOKEN_CLIENT *ctx, uint8_t **out, - size_t *out_len, size_t count) { +static int trust_token_client_begin_issuance_impl( + TRUST_TOKEN_CLIENT *ctx, uint8_t **out, size_t *out_len, size_t count, + int include_message, const uint8_t *msg, size_t msg_len) { if (count > ctx->max_batchsize) { count = ctx->max_batchsize; } @@ -253,17 +270,16 @@ int TRUST_TOKEN_CLIENT_begin_issuance(TRUST_TOKEN_CLIENT *ctx, uint8_t **out, 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; } - pretokens = ctx->method->blind(&request, count); + pretokens = + ctx->method->blind(&request, count, include_message, msg, msg_len); if (pretokens == NULL) { goto err; } if (!CBB_finish(&request, out, out_len)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -278,6 +294,20 @@ int TRUST_TOKEN_CLIENT_begin_issuance(TRUST_TOKEN_CLIENT *ctx, uint8_t **out, return ret; } +int TRUST_TOKEN_CLIENT_begin_issuance(TRUST_TOKEN_CLIENT *ctx, uint8_t **out, + size_t *out_len, size_t count) { + return trust_token_client_begin_issuance_impl(ctx, out, out_len, count, + /*include_message=*/0, NULL, 0); +} + +int TRUST_TOKEN_CLIENT_begin_issuance_over_message( + TRUST_TOKEN_CLIENT *ctx, uint8_t **out, size_t *out_len, size_t count, + const uint8_t *msg, size_t msg_len) { + return trust_token_client_begin_issuance_impl( + ctx, out, out_len, count, /*include_message=*/1, msg, msg_len); +} + + STACK_OF(TRUST_TOKEN) * TRUST_TOKEN_CLIENT_finish_issuance(TRUST_TOKEN_CLIENT *ctx, size_t *out_key_index, @@ -345,7 +375,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 +390,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 +426,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 +448,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 +505,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 +556,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 +570,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; } @@ -558,13 +581,11 @@ int TRUST_TOKEN_ISSUER_issue(const TRUST_TOKEN_ISSUER *ctx, uint8_t **out, return ret; } - -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) { +static int trust_token_issuer_redeem_impl( + 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 include_message, const uint8_t *msg, size_t msg_len) { CBS request_cbs, token_cbs; CBS_init(&request_cbs, request, request_len); if (!CBS_get_u16_length_prefixed(&request_cbs, &token_cbs)) { @@ -586,7 +607,8 @@ int TRUST_TOKEN_ISSUER_redeem_raw(const TRUST_TOKEN_ISSUER *ctx, 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))) { + CBS_data(&token_cbs), CBS_len(&token_cbs), + include_message, msg, msg_len)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_INVALID_TOKEN); return 0; } @@ -602,13 +624,11 @@ int TRUST_TOKEN_ISSUER_redeem_raw(const TRUST_TOKEN_ISSUER *ctx, 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; @@ -624,48 +644,26 @@ int TRUST_TOKEN_ISSUER_redeem_raw(const TRUST_TOKEN_ISSUER *ctx, return 0; } -// 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, value | major_type); - } - if (value <= 0xff) { - return CBB_add_u8(cbb, 0x18 | major_type) && CBB_add_u8(cbb, value); - } - if (value <= 0xffff) { - return CBB_add_u8(cbb, 0x19 | major_type) && CBB_add_u16(cbb, value); - } - if (value <= 0xffffffff) { - return CBB_add_u8(cbb, 0x1a | major_type) && CBB_add_u32(cbb, value); - } - if (value <= 0xffffffffffffffff) { - return CBB_add_u8(cbb, 0x1b | major_type) && CBB_add_u64(cbb, value); - } - return 0; -} - -// 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); +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); } -// 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); +int TRUST_TOKEN_ISSUER_redeem_over_message( + 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, + const uint8_t *msg, size_t msg_len) { + return trust_token_issuer_redeem_impl(ctx, out_public, out_private, out_token, + out_client_data, out_client_data_len, + request, request_len, 1, msg, msg_len); } static uint8_t get_metadata_obfuscator(const uint8_t *key, size_t key_len, @@ -680,212 +678,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))) { - 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/third_party/boringssl/src/crypto/trust_token/trust_token_test.cc b/third_party/boringssl/src/crypto/trust_token/trust_token_test.cc index 5ab80cddcf91..df679b61666a 100644 --- a/third_party/boringssl/src/crypto/trust_token/trust_token_test.cc +++ b/third_party/boringssl/src/crypto/trust_token/trust_token_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 @@ -44,6 +45,8 @@ BSSL_NAMESPACE_BEGIN namespace { +const uint8_t kMessage[] = "MSG"; + TEST(TrustTokenTest, KeyGenExp1) { uint8_t priv_key[TRUST_TOKEN_MAX_PRIVATE_KEY_SIZE]; uint8_t pub_key[TRUST_TOKEN_MAX_PUBLIC_KEY_SIZE]; @@ -289,26 +292,343 @@ TEST(TrustTokenTest, HExp2) { EXPECT_EQ(Bytes(h), Bytes(expected_bytes, expected_len)); } +// Test that H in |TRUST_TOKEN_pst_v1_pmb| was computed correctly. +TEST(TrustTokenTest, HPST1) { + const EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp384r1); + ASSERT_TRUE(group); + + const uint8_t kHGen[] = "generator"; + const uint8_t kHLabel[] = "PMBTokens PST V1 HashH"; + + bssl::UniquePtr expected_h(EC_POINT_new(group)); + ASSERT_TRUE(expected_h); + ASSERT_TRUE(ec_hash_to_curve_p384_xmd_sha384_sswu( + group, &expected_h->raw, kHLabel, sizeof(kHLabel), kHGen, sizeof(kHGen))); + uint8_t expected_bytes[1 + 2 * EC_MAX_BYTES]; + size_t expected_len = + EC_POINT_point2oct(group, expected_h.get(), POINT_CONVERSION_UNCOMPRESSED, + expected_bytes, sizeof(expected_bytes), nullptr); + + uint8_t h[97]; + ASSERT_TRUE(pmbtoken_pst1_get_h_for_testing(h)); + EXPECT_EQ(Bytes(h), Bytes(expected_bytes, expected_len)); +} + +static int ec_point_uncompressed_from_compressed( + const EC_GROUP *group, uint8_t out[EC_MAX_UNCOMPRESSED], size_t *out_len, + const uint8_t *in, size_t len) { + bssl::UniquePtr point(EC_POINT_new(group)); + if (!point || + !EC_POINT_oct2point(group, point.get(), in, len, nullptr)) { + return 0; + } + + *out_len = + EC_POINT_point2oct(group, point.get(), POINT_CONVERSION_UNCOMPRESSED, out, + EC_MAX_UNCOMPRESSED, nullptr); + return 1; +} + +static bool setup_voprf_test_key(const EC_GROUP *group, + TRUST_TOKEN_ISSUER_KEY *out) { + static const uint8_t kPrivateKey[] = { + 0x05, 0x16, 0x46, 0xb9, 0xe6, 0xe7, 0xa7, 0x1a, 0xe2, 0x7c, 0x1e, 0x1d, + 0x0b, 0x87, 0xb4, 0x38, 0x1d, 0xb6, 0xd3, 0x59, 0x5e, 0xee, 0xb1, 0xad, + 0xb4, 0x15, 0x79, 0xad, 0xbf, 0x99, 0x2f, 0x42, 0x78, 0xf9, 0x01, 0x6e, + 0xaf, 0xc9, 0x44, 0xed, 0xaa, 0x2b, 0x43, 0x18, 0x35, 0x81, 0x77, 0x9d + }; + + static const uint8_t kPublicKey[] = { + 0x03, 0x1d, 0x68, 0x96, 0x86, 0xc6, 0x11, 0x99, 0x1b, 0x55, + 0xf1, 0xa1, 0xd8, 0xf4, 0x30, 0x5c, 0xcd, 0x6c, 0xb7, 0x19, + 0x44, 0x6f, 0x66, 0x0a, 0x30, 0xdb, 0x61, 0xb7, 0xaa, 0x87, + 0xb4, 0x6a, 0xcf, 0x59, 0xb7, 0xc0, 0xd4, 0xa9, 0x07, 0x7b, + 0x3d, 0xa2, 0x1c, 0x25, 0xdd, 0x48, 0x22, 0x29, 0xa0 + }; + + if (!ec_scalar_from_bytes(group, &out->xs, kPrivateKey, + sizeof(kPrivateKey))) { + return false; + } + + bssl::UniquePtr pub(EC_POINT_new(group)); + return pub && + EC_POINT_oct2point(group, pub.get(), kPublicKey, sizeof(kPublicKey), + nullptr) && + ec_jacobian_to_affine(group, &out->pubs, &pub->raw); +} + +TEST(TrustTokenTest, PSTV1VOPRFTestVector1) { + const EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp384r1); + TRUST_TOKEN_ISSUER_KEY key; + ASSERT_TRUE(setup_voprf_test_key(group, &key)); + + static const uint8_t kBlindedElement[] = { + 0x02, 0xd3, 0x38, 0xc0, 0x5c, 0xbe, 0xcb, 0x82, 0xde, 0x13, + 0xd6, 0x70, 0x0f, 0x09, 0xcb, 0x61, 0x19, 0x05, 0x43, 0xa7, + 0xb7, 0xe2, 0xc6, 0xcd, 0x4f, 0xca, 0x56, 0x88, 0x7e, 0x56, + 0x4e, 0xa8, 0x26, 0x53, 0xb2, 0x7f, 0xda, 0xd3, 0x83, 0x99, + 0x5e, 0xa6, 0xd0, 0x2c, 0xf2, 0x6d, 0x0e, 0x24, 0xd9 + }; + + static const uint8_t kEvaluatedElement[] = { + 0x02, 0xa7, 0xbb, 0xa5, 0x89, 0xb3, 0xe8, 0x67, 0x2a, 0xa1, + 0x9e, 0x8f, 0xd2, 0x58, 0xde, 0x2e, 0x6a, 0xae, 0x20, 0x10, + 0x1c, 0x8d, 0x76, 0x12, 0x46, 0xde, 0x97, 0xa6, 0xb5, 0xee, + 0x9c, 0xf1, 0x05, 0xfe, 0xbc, 0xe4, 0x32, 0x7a, 0x32, 0x62, + 0x55, 0xa3, 0xc6, 0x04, 0xf6, 0x3f, 0x60, 0x0e, 0xf6 + }; + + static const uint8_t kProof[] = { + 0xbf, 0xc6, 0xcf, 0x38, 0x59, 0x12, 0x7f, 0x5f, 0xe2, 0x55, 0x48, 0x85, + 0x98, 0x56, 0xd6, 0xb7, 0xfa, 0x1c, 0x74, 0x59, 0xf0, 0xba, 0x57, 0x12, + 0xa8, 0x06, 0xfc, 0x09, 0x1a, 0x30, 0x00, 0xc4, 0x2d, 0x8b, 0xa3, 0x4f, + 0xf4, 0x5f, 0x32, 0xa5, 0x2e, 0x40, 0x53, 0x3e, 0xfd, 0x2a, 0x03, 0xbc, + 0x87, 0xf3, 0xbf, 0x4f, 0x9f, 0x58, 0x02, 0x82, 0x97, 0xcc, 0xb9, 0xcc, + 0xb1, 0x8a, 0xe7, 0x18, 0x2b, 0xcd, 0x1e, 0xf2, 0x39, 0xdf, 0x77, 0xe3, + 0xbe, 0x65, 0xef, 0x14, 0x7f, 0x3a, 0xcf, 0x8b, 0xc9, 0xcb, 0xfc, 0x55, + 0x24, 0xb7, 0x02, 0x26, 0x34, 0x14, 0xf0, 0x43, 0xe3, 0xb7, 0xca, 0x2e + }; + + static const uint8_t kProofScalar[] = { + 0x80, 0x3d, 0x95, 0x5f, 0x0e, 0x07, 0x3a, 0x04, 0xaa, 0x5d, 0x92, 0xb3, + 0xfb, 0x73, 0x9f, 0x56, 0xf9, 0xdb, 0x00, 0x12, 0x66, 0x67, 0x7f, 0x62, + 0xc0, 0x95, 0x02, 0x1d, 0xb0, 0x18, 0xcd, 0x8c, 0xbb, 0x55, 0x94, 0x1d, + 0x40, 0x73, 0x69, 0x8c, 0xe4, 0x5c, 0x40, 0x5d, 0x13, 0x48, 0xb7, 0xb1 + }; + + uint8_t blinded_buf[EC_MAX_UNCOMPRESSED]; + size_t blinded_len; + ASSERT_TRUE(ec_point_uncompressed_from_compressed( + group, blinded_buf, &blinded_len, kBlindedElement, + sizeof(kBlindedElement))); + + CBS sign_input; + CBS_init(&sign_input, blinded_buf, blinded_len); + bssl::ScopedCBB response; + ASSERT_TRUE(CBB_init(response.get(), 0)); + ASSERT_TRUE(voprf_pst1_sign_with_proof_scalar_for_testing( + &key, response.get(), &sign_input, /*num_requested=*/1, + /*num_to_issue=*/1, + /*private_metadata=*/0, kProofScalar, sizeof(kProofScalar))); + + uint8_t evaluated_buf[EC_MAX_UNCOMPRESSED]; + size_t evaluated_len; + ASSERT_TRUE(ec_point_uncompressed_from_compressed( + group, evaluated_buf, &evaluated_len, kEvaluatedElement, + sizeof(kEvaluatedElement))); + + bssl::ScopedCBB expected_response; + ASSERT_TRUE(CBB_init(expected_response.get(), 0)); + ASSERT_TRUE( + CBB_add_bytes(expected_response.get(), evaluated_buf, evaluated_len)); + ASSERT_TRUE(CBB_add_u16(expected_response.get(), sizeof(kProof))); + ASSERT_TRUE(CBB_add_bytes(expected_response.get(), kProof, sizeof(kProof))); + ASSERT_TRUE(CBB_flush(expected_response.get())); + + ASSERT_EQ(Bytes(CBB_data(expected_response.get()), + CBB_len(expected_response.get())), + Bytes(CBB_data(response.get()), CBB_len(response.get()))); +} + +TEST(TrustTokenTest, PSTV1VOPRFTestVector2) { + const EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp384r1); + TRUST_TOKEN_ISSUER_KEY key; + ASSERT_TRUE(setup_voprf_test_key(group, &key)); + + static const uint8_t kBlindedElement[] = { + 0x02, 0xf2, 0x74, 0x69, 0xe0, 0x59, 0x88, 0x6f, 0x22, 0x1b, + 0xe5, 0xf2, 0xcc, 0xa0, 0x3d, 0x2b, 0xdc, 0x61, 0xe5, 0x52, + 0x21, 0x72, 0x1c, 0x3b, 0x3e, 0x56, 0xfc, 0x01, 0x2e, 0x36, + 0xd3, 0x1a, 0xe5, 0xf8, 0xdc, 0x05, 0x81, 0x09, 0x59, 0x15, + 0x56, 0xa6, 0xdb, 0xd3, 0xa8, 0xc6, 0x9c, 0x43, 0x3b + }; + + static const uint8_t kEvaluatedElement[] = { + 0x03, 0xf1, 0x6f, 0x90, 0x39, 0x47, 0x03, 0x54, 0x00, 0xe9, + 0x6b, 0x7f, 0x53, 0x1a, 0x38, 0xd4, 0xa0, 0x7a, 0xc8, 0x9a, + 0x80, 0xf8, 0x9d, 0x86, 0xa1, 0xbf, 0x08, 0x9c, 0x52, 0x5a, + 0x92, 0xc7, 0xf4, 0x73, 0x37, 0x29, 0xca, 0x30, 0xc5, 0x6c, + 0xe7, 0x8b, 0x1a, 0xb4, 0xf7, 0xd9, 0x2d, 0xb8, 0xb4 + }; + + static const uint8_t kProof[] = { + 0xd0, 0x05, 0xd6, 0xda, 0xaa, 0xd7, 0x57, 0x14, 0x14, 0xc1, 0xe0, + 0xc7, 0x5f, 0x7e, 0x57, 0xf2, 0x11, 0x3c, 0xa9, 0xf4, 0x60, 0x4e, + 0x84, 0xbc, 0x90, 0xf9, 0xbe, 0x52, 0xda, 0x89, 0x6f, 0xff, 0x3b, + 0xee, 0x49, 0x6d, 0xcd, 0xe2, 0xa5, 0x78, 0xae, 0x9d, 0xf3, 0x15, + 0x03, 0x25, 0x85, 0xf8, 0x01, 0xfb, 0x21, 0xc6, 0x08, 0x0a, 0xc0, + 0x56, 0x72, 0xb2, 0x91, 0xe5, 0x75, 0xa4, 0x02, 0x95, 0xb3, 0x06, + 0xd9, 0x67, 0x71, 0x7b, 0x28, 0xe0, 0x8f, 0xcc, 0x8a, 0xd1, 0xca, + 0xb4, 0x78, 0x45, 0xd1, 0x6a, 0xf7, 0x3b, 0x3e, 0x64, 0x3d, 0xdc, + 0xc1, 0x91, 0x20, 0x8e, 0x71, 0xc6, 0x46, 0x30 + }; + + static const uint8_t kProofScalar[] = { + 0x80, 0x3d, 0x95, 0x5f, 0x0e, 0x07, 0x3a, 0x04, 0xaa, 0x5d, 0x92, 0xb3, + 0xfb, 0x73, 0x9f, 0x56, 0xf9, 0xdb, 0x00, 0x12, 0x66, 0x67, 0x7f, 0x62, + 0xc0, 0x95, 0x02, 0x1d, 0xb0, 0x18, 0xcd, 0x8c, 0xbb, 0x55, 0x94, 0x1d, + 0x40, 0x73, 0x69, 0x8c, 0xe4, 0x5c, 0x40, 0x5d, 0x13, 0x48, 0xb7, 0xb1 + }; + + uint8_t blinded_buf[EC_MAX_UNCOMPRESSED]; + size_t blinded_len; + ASSERT_TRUE(ec_point_uncompressed_from_compressed( + group, blinded_buf, &blinded_len, kBlindedElement, + sizeof(kBlindedElement))); + + CBS sign_input; + CBS_init(&sign_input, blinded_buf, blinded_len); + bssl::ScopedCBB response; + ASSERT_TRUE(CBB_init(response.get(), 0)); + ASSERT_TRUE(voprf_pst1_sign_with_proof_scalar_for_testing( + &key, response.get(), &sign_input, /*num_requested=*/1, + /*num_to_issue=*/1, + /*private_metadata=*/0, kProofScalar, sizeof(kProofScalar))); + + uint8_t evaluated_buf[EC_MAX_UNCOMPRESSED]; + size_t evaluated_len; + ASSERT_TRUE(ec_point_uncompressed_from_compressed( + group, evaluated_buf, &evaluated_len, kEvaluatedElement, + sizeof(kEvaluatedElement))); + + bssl::ScopedCBB expected_response; + ASSERT_TRUE(CBB_init(expected_response.get(), 0)); + ASSERT_TRUE( + CBB_add_bytes(expected_response.get(), evaluated_buf, evaluated_len)); + ASSERT_TRUE(CBB_add_u16(expected_response.get(), sizeof(kProof))); + ASSERT_TRUE(CBB_add_bytes(expected_response.get(), kProof, sizeof(kProof))); + ASSERT_TRUE(CBB_flush(expected_response.get())); + + ASSERT_EQ(Bytes(CBB_data(expected_response.get()), + CBB_len(expected_response.get())), + Bytes(CBB_data(response.get()), CBB_len(response.get()))); +} + +TEST(TrustTokenTest, PSTV1VOPRFTestVector3) { + const EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp384r1); + TRUST_TOKEN_ISSUER_KEY key; + ASSERT_TRUE(setup_voprf_test_key(group, &key)); + + static const uint8_t kBlindedElement1[] = { + 0x02, 0xd3, 0x38, 0xc0, 0x5c, 0xbe, 0xcb, 0x82, 0xde, 0x13, + 0xd6, 0x70, 0x0f, 0x09, 0xcb, 0x61, 0x19, 0x05, 0x43, 0xa7, + 0xb7, 0xe2, 0xc6, 0xcd, 0x4f, 0xca, 0x56, 0x88, 0x7e, 0x56, + 0x4e, 0xa8, 0x26, 0x53, 0xb2, 0x7f, 0xda, 0xd3, 0x83, 0x99, + 0x5e, 0xa6, 0xd0, 0x2c, 0xf2, 0x6d, 0x0e, 0x24, 0xd9 + }; + static const uint8_t kBlindedElement2[] = { + 0x02, 0xfa, 0x02, 0x47, 0x0d, 0x7f, 0x15, 0x10, 0x18, 0xb4, + 0x1e, 0x82, 0x22, 0x3c, 0x32, 0xfa, 0xd8, 0x24, 0xde, 0x6a, + 0xd4, 0xb5, 0xce, 0x9f, 0x8e, 0x9f, 0x98, 0x08, 0x3c, 0x9a, + 0x72, 0x6d, 0xe9, 0xa1, 0xfc, 0x39, 0xd7, 0xa0, 0xcb, 0x6f, + 0x4f, 0x18, 0x8d, 0xd9, 0xce, 0xa0, 0x14, 0x74, 0xcd + }; + + static const uint8_t kEvaluatedElement1[] = { + 0x02, 0xa7, 0xbb, 0xa5, 0x89, 0xb3, 0xe8, 0x67, 0x2a, 0xa1, + 0x9e, 0x8f, 0xd2, 0x58, 0xde, 0x2e, 0x6a, 0xae, 0x20, 0x10, + 0x1c, 0x8d, 0x76, 0x12, 0x46, 0xde, 0x97, 0xa6, 0xb5, 0xee, + 0x9c, 0xf1, 0x05, 0xfe, 0xbc, 0xe4, 0x32, 0x7a, 0x32, 0x62, + 0x55, 0xa3, 0xc6, 0x04, 0xf6, 0x3f, 0x60, 0x0e, 0xf6 + }; + + static const uint8_t kEvaluatedElement2[] = { + 0x02, 0x8e, 0x9e, 0x11, 0x56, 0x25, 0xff, 0x4c, 0x2f, 0x07, + 0xbf, 0x87, 0xce, 0x3f, 0xd7, 0x3f, 0xc7, 0x79, 0x94, 0xa7, + 0xa0, 0xc1, 0xdf, 0x03, 0xd2, 0xa6, 0x30, 0xa3, 0xd8, 0x45, + 0x93, 0x0e, 0x2e, 0x63, 0xa1, 0x65, 0xb1, 0x14, 0xd9, 0x8f, + 0xe3, 0x4e, 0x61, 0xb6, 0x8d, 0x23, 0xc0, 0xb5, 0x0a + }; + + static const uint8_t kProof[] = { + 0x6d, 0x8d, 0xcb, 0xd2, 0xfc, 0x95, 0x55, 0x0a, 0x02, 0x21, 0x1f, + 0xb7, 0x8a, 0xfd, 0x01, 0x39, 0x33, 0xf3, 0x07, 0xd2, 0x1e, 0x7d, + 0x85, 0x5b, 0x0b, 0x1e, 0xd0, 0xaf, 0x78, 0x07, 0x6d, 0x81, 0x37, + 0xad, 0x8b, 0x0a, 0x1b, 0xfa, 0x05, 0x67, 0x6d, 0x32, 0x52, 0x49, + 0xc1, 0xdb, 0xb9, 0xa5, 0x2b, 0xd8, 0x1b, 0x1c, 0x2b, 0x7b, 0x0e, + 0xfc, 0x77, 0xcf, 0x7b, 0x27, 0x8e, 0x1c, 0x94, 0x7f, 0x62, 0x83, + 0xf1, 0xd4, 0xc5, 0x13, 0x05, 0x3f, 0xc0, 0xad, 0x19, 0xe0, 0x26, + 0xfb, 0x0c, 0x30, 0x65, 0x4b, 0x53, 0xd9, 0xce, 0xa4, 0xb8, 0x7b, + 0x03, 0x72, 0x71, 0xb5, 0xd2, 0xe2, 0xd0, 0xea + }; + + static const uint8_t kProofScalar[] = { + 0xa0, 0x97, 0xe7, 0x22, 0xed, 0x24, 0x27, 0xde, 0x86, 0x96, + 0x69, 0x10, 0xac, 0xba, 0x9f, 0x5c, 0x35, 0x0e, 0x80, 0x40, + 0xf8, 0x28, 0xbf, 0x6c, 0xec, 0xa2, 0x74, 0x05, 0x42, 0x0c, + 0xdf, 0x3d, 0x63, 0xcb, 0x3a, 0xef, 0x00, 0x5f, 0x40, 0xba, + 0x51, 0x94, 0x3c, 0x80, 0x26, 0x87, 0x79, 0x63 + }; + + uint8_t blinded_buf[2*EC_MAX_UNCOMPRESSED]; + size_t blinded_len; + ASSERT_TRUE(ec_point_uncompressed_from_compressed( + group, blinded_buf, &blinded_len, kBlindedElement1, + sizeof(kBlindedElement1))); + size_t offset = blinded_len; + ASSERT_TRUE(ec_point_uncompressed_from_compressed( + group, blinded_buf + offset, &blinded_len, kBlindedElement2, + sizeof(kBlindedElement2))); + + CBS sign_input; + CBS_init(&sign_input, blinded_buf, offset + blinded_len); + bssl::ScopedCBB response; + ASSERT_TRUE(CBB_init(response.get(), 0)); + ASSERT_TRUE(voprf_pst1_sign_with_proof_scalar_for_testing( + &key, response.get(), &sign_input, /*num_requested=*/2, + /*num_to_issue=*/2, + /*private_metadata=*/0, kProofScalar, sizeof(kProofScalar))); + + uint8_t evaluated_buf[2 * EC_MAX_UNCOMPRESSED]; + size_t evaluated_len; + ASSERT_TRUE(ec_point_uncompressed_from_compressed( + group, evaluated_buf, &evaluated_len, kEvaluatedElement1, + sizeof(kEvaluatedElement1))); + offset = evaluated_len; + ASSERT_TRUE(ec_point_uncompressed_from_compressed( + group, evaluated_buf + offset, &evaluated_len, kEvaluatedElement2, + sizeof(kEvaluatedElement2))); + + bssl::ScopedCBB expected_response; + ASSERT_TRUE(CBB_init(expected_response.get(), 0)); + ASSERT_TRUE(CBB_add_bytes(expected_response.get(), evaluated_buf, + offset + evaluated_len)); + ASSERT_TRUE(CBB_add_u16(expected_response.get(), sizeof(kProof))); + ASSERT_TRUE(CBB_add_bytes(expected_response.get(), kProof, sizeof(kProof))); + ASSERT_TRUE(CBB_flush(expected_response.get())); + + ASSERT_EQ(Bytes(CBB_data(expected_response.get()), + CBB_len(expected_response.get())), + Bytes(CBB_data(response.get()), CBB_len(response.get()))); +} + static std::vector AllMethods() { return { TRUST_TOKEN_experiment_v1(), TRUST_TOKEN_experiment_v2_voprf(), - TRUST_TOKEN_experiment_v2_pmb() + TRUST_TOKEN_experiment_v2_pmb(), + TRUST_TOKEN_pst_v1_voprf(), + TRUST_TOKEN_pst_v1_pmb() }; } class TrustTokenProtocolTestBase : public ::testing::Test { public: - explicit TrustTokenProtocolTestBase(const TRUST_TOKEN_METHOD *method_arg) - : method_(method_arg) {} + explicit TrustTokenProtocolTestBase(const TRUST_TOKEN_METHOD *method_arg, + bool use_msg) + : method_(method_arg), use_msg_(use_msg) {} // KeyID returns the key ID associated with key index |i|. static uint32_t KeyID(size_t i) { + assert(i <= UINT32_MAX); // Use a different value from the indices to that we do not mix them up. - return 7 + i; + return static_cast(7 + i); } - const TRUST_TOKEN_METHOD *method() { return method_; } + const TRUST_TOKEN_METHOD *method() const { return method_; } + + bool use_message() const { return use_msg_; } protected: void SetupContexts() { @@ -348,6 +668,7 @@ class TrustTokenProtocolTestBase : public ::testing::Test { } const TRUST_TOKEN_METHOD *method_; + bool use_msg_; uint16_t client_max_batchsize = 10; uint16_t issuer_max_batchsize = 10; bssl::UniquePtr client; @@ -357,13 +678,17 @@ class TrustTokenProtocolTestBase : public ::testing::Test { class TrustTokenProtocolTest : public TrustTokenProtocolTestBase, - public testing::WithParamInterface { + public testing::WithParamInterface< + std::tuple> { public: - TrustTokenProtocolTest() : TrustTokenProtocolTestBase(GetParam()) {} + TrustTokenProtocolTest() + : TrustTokenProtocolTestBase(std::get<0>(GetParam()), + std::get<1>(GetParam())) {} }; INSTANTIATE_TEST_SUITE_P(TrustTokenAllProtocolTest, TrustTokenProtocolTest, - testing::ValuesIn(AllMethods())); + testing::Combine(testing::ValuesIn(AllMethods()), + testing::Bool())); TEST_P(TrustTokenProtocolTest, InvalidToken) { ASSERT_NO_FATAL_FAILURE(SetupContexts()); @@ -373,8 +698,13 @@ TEST_P(TrustTokenProtocolTest, InvalidToken) { size_t key_index; size_t tokens_issued; - ASSERT_TRUE( - TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, &msg_len, 1)); + if (use_message()) { + ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance_over_message( + client.get(), &issue_msg, &msg_len, 1, kMessage, sizeof(kMessage))); + } else { + ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, + &msg_len, 1)); + } bssl::UniquePtr free_issue_msg(issue_msg); ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue( issuer.get(), &issue_resp, &resp_len, &tokens_issued, issue_msg, msg_len, @@ -394,13 +724,20 @@ TEST_P(TrustTokenProtocolTest, InvalidToken) { ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_redemption( client.get(), &redeem_msg, &msg_len, token, NULL, 0, 0)); bssl::UniquePtr free_redeem_msg(redeem_msg); + uint32_t public_value; + uint8_t private_value; TRUST_TOKEN *rtoken; uint8_t *client_data; size_t client_data_len; - uint64_t redemption_time; - ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem( - issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data, - &client_data_len, &redemption_time, redeem_msg, msg_len, 600)); + if (use_message()) { + ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem_over_message( + 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( + issuer.get(), &public_value, &private_value, &rtoken, &client_data, + &client_data_len, redeem_msg, msg_len)); + } bssl::UniquePtr free_redeem_resp(redeem_resp); } } @@ -410,8 +747,13 @@ TEST_P(TrustTokenProtocolTest, TruncatedIssuanceRequest) { uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); + 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); msg_len = 10; size_t tokens_issued; @@ -427,8 +769,13 @@ TEST_P(TrustTokenProtocolTest, TruncatedIssuanceResponse) { uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); + 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( @@ -449,8 +796,13 @@ TEST_P(TrustTokenProtocolTest, ExtraDataIssuanceResponse) { uint8_t *request = NULL, *response = NULL; size_t request_len, response_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &request, - &request_len, 10)); + if (use_message()) { + ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance_over_message( + client.get(), &request, &request_len, 10, kMessage, sizeof(kMessage))); + } else { + ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &request, + &request_len, 10)); + } bssl::UniquePtr free_request(request); size_t tokens_issued; ASSERT_TRUE(TRUST_TOKEN_ISSUER_issue(issuer.get(), &response, &response_len, @@ -473,8 +825,13 @@ TEST_P(TrustTokenProtocolTest, TruncatedRedemptionRequest) { uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); + 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( @@ -492,78 +849,27 @@ TEST_P(TrustTokenProtocolTest, TruncatedRedemptionRequest) { const uint8_t kClientData[] = "\x70TEST CLIENT DATA"; uint64_t kRedemptionTime = (method()->has_srr ? 13374242 : 0); - uint8_t *redeem_msg = NULL, *redeem_resp = NULL; + uint8_t *redeem_msg = 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); msg_len = 10; + uint32_t public_value; + uint8_t private_value; TRUST_TOKEN *rtoken; uint8_t *client_data; size_t client_data_len; - uint64_t redemption_time; - ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem( - issuer.get(), &redeem_resp, &resp_len, &rtoken, &client_data, - &client_data_len, &redemption_time, redeem_msg, msg_len, 600)); - } -} - -TEST_P(TrustTokenProtocolTest, TruncatedRedemptionResponse) { - ASSERT_NO_FATAL_FAILURE(SetupContexts()); - - uint8_t *issue_msg = NULL, *issue_resp = NULL; - size_t msg_len, resp_len; - 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); + if (use_message()) { + ASSERT_FALSE(TRUST_TOKEN_ISSUER_redeem_over_message( + 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( + issuer.get(), &public_value, &private_value, &rtoken, &client_data, + &client_data_len, redeem_msg, msg_len)); + } } } @@ -612,8 +918,13 @@ TEST_P(TrustTokenProtocolTest, IssuedWithBadKeyID) { uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); + 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( @@ -629,13 +940,14 @@ TEST_P(TrustTokenProtocolTest, IssuedWithBadKeyID) { class TrustTokenMetadataTest : public TrustTokenProtocolTestBase, public testing::WithParamInterface< - std::tuple> { + std::tuple> { public: TrustTokenMetadataTest() - : TrustTokenProtocolTestBase(std::get<0>(GetParam())) {} + : TrustTokenProtocolTestBase(std::get<0>(GetParam()), + std::get<1>(GetParam())) {} - int public_metadata() { return std::get<1>(GetParam()); } - bool private_metadata() { return std::get<2>(GetParam()); } + int public_metadata() { return std::get<2>(GetParam()); } + bool private_metadata() { return std::get<3>(GetParam()); } }; TEST_P(TrustTokenMetadataTest, SetAndGetMetadata) { @@ -643,140 +955,13 @@ TEST_P(TrustTokenMetadataTest, SetAndGetMetadata) { uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; - 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)); + 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)); } -} - -TEST_P(TrustTokenMetadataTest, RawSetAndGetMetadata) { - ASSERT_NO_FATAL_FAILURE(SetupContexts()); - - uint8_t *issue_msg = NULL, *issue_resp = NULL; - size_t msg_len, resp_len; - 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( @@ -809,9 +994,15 @@ TEST_P(TrustTokenMetadataTest, RawSetAndGetMetadata) { TRUST_TOKEN *rtoken; uint8_t *client_data; size_t client_data_len; - ASSERT_TRUE(TRUST_TOKEN_ISSUER_redeem_raw( - issuer.get(), &public_value, &private_value, &rtoken, - &client_data, &client_data_len, redeem_msg, msg_len)); + if (use_message()) { + ASSERT_TRUE(TRUST_TOKEN_ISSUER_redeem_over_message( + 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( + 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); @@ -832,8 +1023,13 @@ TEST_P(TrustTokenMetadataTest, TooManyRequests) { uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); + 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( @@ -859,8 +1055,13 @@ TEST_P(TrustTokenMetadataTest, TruncatedProof) { uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); + 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( @@ -885,7 +1086,8 @@ TEST_P(TrustTokenMetadataTest, TruncatedProof) { if (method() == TRUST_TOKEN_experiment_v1()) { token_length += 4; } - if (method() == TRUST_TOKEN_experiment_v2_voprf()) { + if (method() == TRUST_TOKEN_experiment_v2_voprf() || + method() == TRUST_TOKEN_pst_v1_voprf()) { token_length = 1 + 2 * BN_num_bytes(&group->field); } for (size_t i = 0; i < count; i++) { @@ -922,8 +1124,13 @@ TEST_P(TrustTokenMetadataTest, ExcessDataProof) { uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); + 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( @@ -948,7 +1155,8 @@ TEST_P(TrustTokenMetadataTest, ExcessDataProof) { if (method() == TRUST_TOKEN_experiment_v1()) { token_length += 4; } - if (method() == TRUST_TOKEN_experiment_v2_voprf()) { + if (method() == TRUST_TOKEN_experiment_v2_voprf() || + method() == TRUST_TOKEN_pst_v1_voprf()) { token_length = 1 + 2 * BN_num_bytes(&group->field); } for (size_t i = 0; i < count; i++) { @@ -980,6 +1188,7 @@ TEST_P(TrustTokenMetadataTest, ExcessDataProof) { INSTANTIATE_TEST_SUITE_P( TrustTokenAllMetadataTest, TrustTokenMetadataTest, testing::Combine(testing::ValuesIn(AllMethods()), + testing::Bool(), testing::Values(TrustTokenProtocolTest::KeyID(0), TrustTokenProtocolTest::KeyID(1), TrustTokenProtocolTest::KeyID(2)), @@ -988,13 +1197,14 @@ INSTANTIATE_TEST_SUITE_P( class TrustTokenBadKeyTest : public TrustTokenProtocolTestBase, public testing::WithParamInterface< - std::tuple> { + std::tuple> { public: TrustTokenBadKeyTest() - : TrustTokenProtocolTestBase(std::get<0>(GetParam())) {} + : TrustTokenProtocolTestBase(std::get<0>(GetParam()), + std::get<1>(GetParam())) {} - bool private_metadata() { return std::get<1>(GetParam()); } - int corrupted_key() { return std::get<2>(GetParam()); } + bool private_metadata() { return std::get<2>(GetParam()); } + int corrupted_key() { return std::get<3>(GetParam()); } }; TEST_P(TrustTokenBadKeyTest, BadKey) { @@ -1010,8 +1220,13 @@ TEST_P(TrustTokenBadKeyTest, BadKey) { uint8_t *issue_msg = NULL, *issue_resp = NULL; size_t msg_len, resp_len; - ASSERT_TRUE(TRUST_TOKEN_CLIENT_begin_issuance(client.get(), &issue_msg, - &msg_len, 10)); + 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); struct trust_token_issuer_key_st *key = &issuer->keys[0]; @@ -1042,6 +1257,7 @@ TEST_P(TrustTokenBadKeyTest, BadKey) { INSTANTIATE_TEST_SUITE_P(TrustTokenAllBadKeyTest, TrustTokenBadKeyTest, testing::Combine(testing::ValuesIn(AllMethods()), + testing::Bool(), testing::Bool(), testing::Values(0, 1, 2, 3, 4, 5))); diff --git a/third_party/boringssl/src/crypto/trust_token/voprf.c b/third_party/boringssl/src/crypto/trust_token/voprf.c index cedee1e8033d..aa7df8ef7839 100644 --- a/third_party/boringssl/src/crypto/trust_token/voprf.c +++ b/third_party/boringssl/src/crypto/trust_token/voprf.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "../ec_extra/internal.h" #include "../fipsmodule/ec/internal.h" @@ -62,19 +63,24 @@ static int voprf_init_method(VOPRF_METHOD *method, int curve_nid, static int cbb_add_point(CBB *out, const EC_GROUP *group, const EC_AFFINE *point) { - size_t len = - ec_point_to_bytes(group, point, POINT_CONVERSION_UNCOMPRESSED, NULL, 0); - if (len == 0) { - return 0; - } - uint8_t *p; + size_t len = ec_point_byte_len(group, POINT_CONVERSION_UNCOMPRESSED); return CBB_add_space(out, &p, len) && ec_point_to_bytes(group, point, POINT_CONVERSION_UNCOMPRESSED, p, len) == len && CBB_flush(out); } +static int cbb_serialize_point(CBB *out, const EC_GROUP *group, + const EC_AFFINE *point) { + uint8_t *p; + size_t len = ec_point_byte_len(group, POINT_CONVERSION_COMPRESSED); + return CBB_add_u16(out, len) && CBB_add_space(out, &p, len) && + ec_point_to_bytes(group, point, POINT_CONVERSION_COMPRESSED, p, len) == + len && + CBB_flush(out); +} + static int cbs_get_point(CBS *cbs, const EC_GROUP *group, EC_AFFINE *out) { CBS child; size_t plen = 1 + 2 * BN_num_bytes(&group->field); @@ -91,7 +97,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); @@ -201,13 +206,17 @@ static int voprf_issuer_key_from_bytes(const VOPRF_METHOD *method, return 1; } -static STACK_OF(TRUST_TOKEN_PRETOKEN) * - voprf_blind(const VOPRF_METHOD *method, CBB *cbb, size_t count) { +static STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_blind(const VOPRF_METHOD *method, + CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len) { + SHA512_CTX hash_ctx; + 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; } @@ -217,18 +226,25 @@ static STACK_OF(TRUST_TOKEN_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; } - RAND_bytes(pretoken->t, sizeof(pretoken->t)); + RAND_bytes(pretoken->salt, sizeof(pretoken->salt)); + if (include_message) { + assert(SHA512_DIGEST_LENGTH == TRUST_TOKEN_NONCE_SIZE); + SHA512_Init(&hash_ctx); + SHA512_Update(&hash_ctx, pretoken->salt, sizeof(pretoken->salt)); + SHA512_Update(&hash_ctx, msg, msg_len); + SHA512_Final(pretoken->t, &hash_ctx); + } else { + OPENSSL_memcpy(pretoken->t, pretoken->salt, TRUST_TOKEN_NONCE_SIZE); + } // We sample r in Montgomery form to simplify inverting. EC_SCALAR r; if (!ec_random_nonzero_scalar(group, &r, kDefaultAdditionalData)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -278,7 +294,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; } @@ -290,6 +305,30 @@ static int hash_to_scalar_dleq(const VOPRF_METHOD *method, EC_SCALAR *out, return ok; } +static int hash_to_scalar_challenge(const VOPRF_METHOD *method, EC_SCALAR *out, + const EC_AFFINE *Bm, const EC_AFFINE *a0, + const EC_AFFINE *a1, const EC_AFFINE *a2, + const EC_AFFINE *a3) { + static const uint8_t kChallengeLabel[] = "Challenge"; + + CBB cbb; + uint8_t transcript[5 * EC_MAX_COMPRESSED + 2 + sizeof(kChallengeLabel) - 1]; + size_t len; + if (!CBB_init_fixed(&cbb, transcript, sizeof(transcript)) || + !cbb_serialize_point(&cbb, method->group, Bm) || + !cbb_serialize_point(&cbb, method->group, a0) || + !cbb_serialize_point(&cbb, method->group, a1) || + !cbb_serialize_point(&cbb, method->group, a2) || + !cbb_serialize_point(&cbb, method->group, a3) || + !CBB_add_bytes(&cbb, kChallengeLabel, sizeof(kChallengeLabel) - 1) || + !CBB_finish(&cbb, NULL, &len) || + !method->hash_to_scalar(method->group, out, transcript, len)) { + return 0; + } + + return 1; +} + static int hash_to_scalar_batch(const VOPRF_METHOD *method, EC_SCALAR *out, const CBB *points, size_t index) { static const uint8_t kDLEQBatchLabel[] = "DLEQ BATCH"; @@ -310,7 +349,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; } @@ -373,7 +411,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; } @@ -448,9 +485,9 @@ static int dleq_verify(const VOPRF_METHOD *method, CBS *cbs, return 1; } -static int voprf_sign(const VOPRF_METHOD *method, - const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, - size_t num_requested, size_t num_to_issue) { +static int voprf_sign_tt(const VOPRF_METHOD *method, + const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, + size_t num_requested, size_t num_to_issue) { const EC_GROUP *group = method->group; if (num_requested < num_to_issue) { OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_INTERNAL_ERROR); @@ -474,7 +511,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; } @@ -494,7 +530,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; @@ -548,39 +583,35 @@ static int voprf_sign(const VOPRF_METHOD *method, return ret; } -static STACK_OF(TRUST_TOKEN) * - voprf_unblind(const VOPRF_METHOD *method, const TRUST_TOKEN_CLIENT_KEY *key, - const STACK_OF(TRUST_TOKEN_PRETOKEN) * pretokens, CBS *cbs, - size_t count, uint32_t key_id) { +static STACK_OF(TRUST_TOKEN) *voprf_unblind_tt( + const VOPRF_METHOD *method, const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id) { const EC_GROUP *group = method->group; if (count > sk_TRUST_TOKEN_PRETOKEN_num(pretokens)) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); return NULL; } - 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; - } - 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)) { - OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_MALLOC_FAILURE); goto err; } @@ -599,7 +630,6 @@ static STACK_OF(TRUST_TOKEN) * 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; } @@ -618,7 +648,7 @@ static STACK_OF(TRUST_TOKEN) * size_t point_len = 1 + 2 * BN_num_bytes(&group->field); if (!CBB_init(&token_cbb, 4 + TRUST_TOKEN_NONCE_SIZE + (2 + point_len)) || !CBB_add_u32(&token_cbb, key_id) || - !CBB_add_bytes(&token_cbb, pretoken->t, TRUST_TOKEN_NONCE_SIZE) || + !CBB_add_bytes(&token_cbb, pretoken->salt, TRUST_TOKEN_NONCE_SIZE) || !cbb_add_point(&token_cbb, group, &N_affine) || !CBB_flush(&token_cbb)) { CBB_cleanup(&token_cbb); @@ -630,7 +660,6 @@ static STACK_OF(TRUST_TOKEN) * 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; } @@ -674,21 +703,424 @@ static STACK_OF(TRUST_TOKEN) * return ret; } +static void sha384_update_u16(SHA512_CTX *ctx, uint16_t v) { + uint8_t buf[2] = {v >> 8, v & 0xff}; + SHA384_Update(ctx, buf, 2); +} + +static void sha384_update_point_with_length( + SHA512_CTX *ctx, const EC_GROUP *group, const EC_AFFINE *point) { + uint8_t buf[EC_MAX_COMPRESSED]; + size_t len = ec_point_to_bytes(group, point, POINT_CONVERSION_COMPRESSED, + buf, sizeof(buf)); + assert(len > 0); + sha384_update_u16(ctx, (uint16_t)len); + SHA384_Update(ctx, buf, len); +} + +static int compute_composite_seed(const VOPRF_METHOD *method, + uint8_t out[SHA384_DIGEST_LENGTH], + const EC_AFFINE *pub) { + const EC_GROUP *group = method->group; + static const uint8_t kSeedDST[] = "Seed-OPRFV1-\x01-P384-SHA384"; + + SHA512_CTX hash_ctx; + SHA384_Init(&hash_ctx); + sha384_update_point_with_length(&hash_ctx, group, pub); + sha384_update_u16(&hash_ctx, sizeof(kSeedDST) - 1); + SHA384_Update(&hash_ctx, kSeedDST, sizeof(kSeedDST) - 1); + SHA384_Final(out, &hash_ctx); + + return 1; +} + +static int compute_composite_element(const VOPRF_METHOD *method, + uint8_t seed[SHA384_DIGEST_LENGTH], + EC_SCALAR *di, size_t index, + const EC_AFFINE *C, const EC_AFFINE *D) { + static const uint8_t kCompositeLabel[] = "Composite"; + const EC_GROUP *group = method->group; + + if (index > UINT16_MAX) { + return 0; + } + + CBB cbb; + uint8_t transcript[2 + SHA384_DIGEST_LENGTH + 2 + 2 * EC_MAX_COMPRESSED + + sizeof(kCompositeLabel) - 1]; + size_t len; + if (!CBB_init_fixed(&cbb, transcript, sizeof(transcript)) || + !CBB_add_u16(&cbb, SHA384_DIGEST_LENGTH) || + !CBB_add_bytes(&cbb, seed, SHA384_DIGEST_LENGTH) || + !CBB_add_u16(&cbb, index) || + !cbb_serialize_point(&cbb, group, C) || + !cbb_serialize_point(&cbb, group, D) || + !CBB_add_bytes(&cbb, kCompositeLabel, + sizeof(kCompositeLabel) - 1) || + !CBB_finish(&cbb, NULL, &len) || + !method->hash_to_scalar(method->group, di, transcript, len)) { + return 0; + } + + return 1; +} + +static int generate_proof(const VOPRF_METHOD *method, CBB *cbb, + const TRUST_TOKEN_ISSUER_KEY *priv, + const EC_SCALAR *r, const EC_RAW_POINT *M, + const EC_RAW_POINT *Z) { + const EC_GROUP *group = method->group; + + enum { + idx_M, + idx_Z, + idx_t2, + idx_t3, + num_idx, + }; + EC_RAW_POINT jacobians[num_idx]; + + if (!ec_point_mul_scalar_base(group, &jacobians[idx_t2], r) || + !ec_point_mul_scalar(group, &jacobians[idx_t3], M, r)) { + return 0; + } + + + EC_AFFINE affines[num_idx]; + jacobians[idx_M] = *M; + jacobians[idx_Z] = *Z; + if (!ec_jacobian_to_affine_batch(group, affines, jacobians, num_idx)) { + return 0; + } + + EC_SCALAR c; + if (!hash_to_scalar_challenge(method, &c, &priv->pubs, &affines[idx_M], + &affines[idx_Z], &affines[idx_t2], + &affines[idx_t3])) { + return 0; + } + + EC_SCALAR c_mont; + ec_scalar_to_montgomery(group, &c_mont, &c); + + // s = r - c*xs + EC_SCALAR s; + ec_scalar_mul_montgomery(group, &s, &priv->xs, &c_mont); + ec_scalar_sub(group, &s, r, &s); + + // Store DLEQ proof in transcript. + if (!scalar_to_cbb(cbb, group, &c) || + !scalar_to_cbb(cbb, group, &s)) { + return 0; + } + + return 1; +} + +static int verify_proof(const VOPRF_METHOD *method, CBS *cbs, + const TRUST_TOKEN_CLIENT_KEY *pub, + const EC_RAW_POINT *M, const EC_RAW_POINT *Z) { + const EC_GROUP *group = method->group; + + enum { + idx_M, + idx_Z, + idx_t2, + idx_t3, + num_idx, + }; + EC_RAW_POINT jacobians[num_idx]; + + EC_SCALAR c, s; + if (!scalar_from_cbs(cbs, group, &c) || + !scalar_from_cbs(cbs, group, &s)) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); + return 0; + } + + EC_RAW_POINT pubs; + ec_affine_to_jacobian(group, &pubs, &pub->pubs); + if (!ec_point_mul_scalar_public(group, &jacobians[idx_t2], &s, &pubs, + &c) || + !mul_public_2(group, &jacobians[idx_t3], M, &s, Z, &c)) { + return 0; + } + + EC_AFFINE affines[num_idx]; + jacobians[idx_M] = *M; + jacobians[idx_Z] = *Z; + if (!ec_jacobian_to_affine_batch(group, affines, jacobians, num_idx)) { + return 0; + } + + EC_SCALAR expected_c; + if (!hash_to_scalar_challenge(method, &expected_c, &pub->pubs, + &affines[idx_M], &affines[idx_Z], + &affines[idx_t2], &affines[idx_t3])) { + return 0; + } + + // c == expected_c + if (!ec_scalar_equal_vartime(group, &c, &expected_c)) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_INVALID_PROOF); + return 0; + } + + return 1; +} + +static int voprf_sign_impl(const VOPRF_METHOD *method, + const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, + CBS *cbs, size_t num_requested, size_t num_to_issue, + const EC_SCALAR *proof_scalar) { + const EC_GROUP *group = method->group; + if (num_requested < num_to_issue) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_INTERNAL_ERROR); + return 0; + } + + if (num_to_issue > ((size_t)-1) / sizeof(EC_RAW_POINT) || + num_to_issue > ((size_t)-1) / sizeof(EC_SCALAR)) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_OVERFLOW); + return 0; + } + + int ret = 0; + EC_RAW_POINT *BTs = OPENSSL_malloc(num_to_issue * sizeof(EC_RAW_POINT)); + EC_RAW_POINT *Zs = OPENSSL_malloc(num_to_issue * sizeof(EC_RAW_POINT)); + EC_SCALAR *dis = OPENSSL_malloc(num_to_issue * sizeof(EC_SCALAR)); + if (!BTs || !Zs || !dis) { + goto err; + } + + uint8_t seed[SHA384_DIGEST_LENGTH]; + if (!compute_composite_seed(method, seed, &key->pubs)) { + goto err; + } + + // This implements the BlindEvaluateBatch as defined in section 4 of + // draft-robert-privacypass-batched-tokens-01, based on the constructions + // in draft-irtf-cfrg-voprf-21. To optimize the computation of the proof, + // the computation of di is done during the token signing and passed into + // the proof generation. + for (size_t i = 0; i < num_to_issue; i++) { + EC_AFFINE BT_affine, Z_affine; + EC_RAW_POINT BT, Z; + if (!cbs_get_point(cbs, group, &BT_affine)) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); + goto err; + } + ec_affine_to_jacobian(group, &BT, &BT_affine); + if (!ec_point_mul_scalar(group, &Z, &BT, &key->xs) || + !ec_jacobian_to_affine(group, &Z_affine, &Z) || + !cbb_add_point(cbb, group, &Z_affine)) { + goto err; + } + BTs[i] = BT; + Zs[i] = Z; + if (!compute_composite_element(method, seed, &dis[i], i, &BT_affine, + &Z_affine)) { + goto err; + } + + if (!CBB_flush(cbb)) { + goto err; + } + } + + EC_RAW_POINT M, Z; + if (!ec_point_mul_scalar_public_batch(group, &M, + /*g_scalar=*/NULL, BTs, dis, + num_to_issue) || + !ec_point_mul_scalar(group, &Z, &M, &key->xs)) { + goto err; + } + + CBB proof; + if (!CBB_add_u16_length_prefixed(cbb, &proof) || + !generate_proof(method, &proof, key, proof_scalar, &M, &Z) || + !CBB_flush(cbb)) { + goto err; + } + + // Skip over any unused requests. + size_t point_len = 1 + 2 * BN_num_bytes(&group->field); + if (!CBS_skip(cbs, point_len * (num_requested - num_to_issue))) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); + goto err; + } + + ret = 1; + +err: + OPENSSL_free(BTs); + OPENSSL_free(Zs); + OPENSSL_free(dis); + return ret; +} + +static int voprf_sign(const VOPRF_METHOD *method, + const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, + size_t num_requested, size_t num_to_issue) { + EC_SCALAR proof_scalar; + if (!ec_random_nonzero_scalar(method->group, &proof_scalar, + kDefaultAdditionalData)) { + return 0; + } + + return voprf_sign_impl(method, key, cbb, cbs, num_requested, num_to_issue, + &proof_scalar); +} + +static int voprf_sign_with_proof_scalar_for_testing( + const VOPRF_METHOD *method, const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, + CBS *cbs, size_t num_requested, size_t num_to_issue, + const uint8_t *proof_scalar_buf, size_t proof_scalar_len) { + EC_SCALAR proof_scalar; + if (!ec_scalar_from_bytes(method->group, &proof_scalar, proof_scalar_buf, + proof_scalar_len)) { + return 0; + } + return voprf_sign_impl(method, key, cbb, cbs, num_requested, num_to_issue, + &proof_scalar); +} + +static STACK_OF(TRUST_TOKEN) *voprf_unblind( + const VOPRF_METHOD *method, const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id) { + const EC_GROUP *group = method->group; + if (count > sk_TRUST_TOKEN_PRETOKEN_num(pretokens)) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); + 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 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 *dis = OPENSSL_malloc(count * sizeof(EC_SCALAR)); + if (ret == NULL || !BTs || !Zs || !dis) { + goto err; + } + + uint8_t seed[SHA384_DIGEST_LENGTH]; + if (!compute_composite_seed(method, seed, &key->pubs)) { + goto err; + } + + for (size_t i = 0; i < count; i++) { + const TRUST_TOKEN_PRETOKEN *pretoken = + sk_TRUST_TOKEN_PRETOKEN_value(pretokens, i); + + EC_AFFINE Z_affine; + if (!cbs_get_point(cbs, group, &Z_affine)) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_DECODE_FAILURE); + goto err; + } + + ec_affine_to_jacobian(group, &BTs[i], &pretoken->Tp); + ec_affine_to_jacobian(group, &Zs[i], &Z_affine); + if (!compute_composite_element(method, seed, &dis[i], i, &pretoken->Tp, + &Z_affine)) { + goto err; + } + + // Unblind the token. + // pretoken->r is rinv. + EC_RAW_POINT N; + EC_AFFINE N_affine; + if (!ec_point_mul_scalar(group, &N, &Zs[i], &pretoken->r) || + !ec_jacobian_to_affine(group, &N_affine, &N)) { + goto err; + } + + // Serialize the token. Include |key_id| to avoid an extra copy in the layer + // above. + CBB token_cbb; + size_t point_len = 1 + 2 * BN_num_bytes(&group->field); + if (!CBB_init(&token_cbb, 4 + TRUST_TOKEN_NONCE_SIZE + (2 + point_len)) || + !CBB_add_u32(&token_cbb, key_id) || + !CBB_add_bytes(&token_cbb, pretoken->salt, TRUST_TOKEN_NONCE_SIZE) || + !cbb_add_point(&token_cbb, group, &N_affine) || + !CBB_flush(&token_cbb)) { + CBB_cleanup(&token_cbb); + goto err; + } + + TRUST_TOKEN *token = + TRUST_TOKEN_new(CBB_data(&token_cbb), CBB_len(&token_cbb)); + CBB_cleanup(&token_cbb); + if (token == NULL || + !sk_TRUST_TOKEN_push(ret, token)) { + TRUST_TOKEN_free(token); + goto err; + } + } + + EC_RAW_POINT M, Z; + if (!ec_point_mul_scalar_public_batch(group, &M, + /*g_scalar=*/NULL, BTs, dis, + count) || + !ec_point_mul_scalar_public_batch(group, &Z, + /*g_scalar=*/NULL, Zs, dis, + count)) { + goto err; + } + + CBS proof; + if (!CBS_get_u16_length_prefixed(cbs, &proof) || + !verify_proof(method, &proof, key, &M, &Z) || + CBS_len(&proof) != 0) { + goto err; + } + + ok = 1; + +err: + OPENSSL_free(BTs); + OPENSSL_free(Zs); + OPENSSL_free(dis); + if (!ok) { + sk_TRUST_TOKEN_pop_free(ret, TRUST_TOKEN_free); + ret = NULL; + } + return ret; +} + static int voprf_read(const VOPRF_METHOD *method, const TRUST_TOKEN_ISSUER_KEY *key, uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], - const uint8_t *token, size_t token_len) { + const uint8_t *token, size_t token_len, + int include_message, const uint8_t *msg, size_t msg_len) { const EC_GROUP *group = method->group; - CBS cbs; + CBS cbs, salt; CBS_init(&cbs, token, token_len); EC_AFFINE Ws; - if (!CBS_copy_bytes(&cbs, out_nonce, TRUST_TOKEN_NONCE_SIZE) || + if (!CBS_get_bytes(&cbs, &salt, TRUST_TOKEN_NONCE_SIZE) || !cbs_get_point(&cbs, group, &Ws) || CBS_len(&cbs) != 0) { OPENSSL_PUT_ERROR(TRUST_TOKEN, TRUST_TOKEN_R_INVALID_TOKEN); return 0; } + if (include_message) { + SHA512_CTX hash_ctx; + assert(SHA512_DIGEST_LENGTH == TRUST_TOKEN_NONCE_SIZE); + SHA512_Init(&hash_ctx); + SHA512_Update(&hash_ctx, CBS_data(&salt), CBS_len(&salt)); + SHA512_Update(&hash_ctx, msg, msg_len); + SHA512_Final(out_nonce, &hash_ctx); + } else { + OPENSSL_memcpy(out_nonce, CBS_data(&salt), CBS_len(&salt)); + } + EC_RAW_POINT T; if (!method->hash_to_group(group, &T, out_nonce)) { @@ -776,11 +1208,15 @@ int voprf_exp2_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, return voprf_issuer_key_from_bytes(&voprf_exp2_method, key, in, len); } -STACK_OF(TRUST_TOKEN_PRETOKEN) * voprf_exp2_blind(CBB *cbb, size_t count) { +STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_exp2_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len) { if (!voprf_exp2_init_method()) { return NULL; } - return voprf_blind(&voprf_exp2_method, cbb, count); + return voprf_blind(&voprf_exp2_method, cbb, count, include_message, msg, + msg_len); } int voprf_exp2_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, @@ -789,27 +1225,156 @@ int voprf_exp2_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, if (!voprf_exp2_init_method() || private_metadata != 0) { return 0; } - return voprf_sign(&voprf_exp2_method, key, cbb, cbs, num_requested, - num_to_issue); + return voprf_sign_tt(&voprf_exp2_method, key, cbb, cbs, num_requested, + num_to_issue); } -STACK_OF(TRUST_TOKEN) * - voprf_exp2_unblind(const TRUST_TOKEN_CLIENT_KEY *key, - const STACK_OF(TRUST_TOKEN_PRETOKEN) * pretokens, - CBS *cbs, size_t count, uint32_t key_id) { +STACK_OF(TRUST_TOKEN) *voprf_exp2_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id) { if (!voprf_exp2_init_method()) { return NULL; } - return voprf_unblind(&voprf_exp2_method, key, pretokens, cbs, count, + return voprf_unblind_tt(&voprf_exp2_method, key, pretokens, cbs, count, key_id); } int voprf_exp2_read(const TRUST_TOKEN_ISSUER_KEY *key, uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], uint8_t *out_private_metadata, const uint8_t *token, - size_t token_len) { + size_t token_len, int include_message, const uint8_t *msg, + size_t msg_len) { if (!voprf_exp2_init_method()) { return 0; } - return voprf_read(&voprf_exp2_method, key, out_nonce, token, token_len); + return voprf_read(&voprf_exp2_method, key, out_nonce, token, token_len, + include_message, msg, msg_len); +} + +// VOPRF PST v1. + +static int voprf_pst1_hash_to_group(const EC_GROUP *group, EC_RAW_POINT *out, + const uint8_t t[TRUST_TOKEN_NONCE_SIZE]) { + const uint8_t kHashTLabel[] = "HashToGroup-OPRFV1-\x01-P384-SHA384"; + return ec_hash_to_curve_p384_xmd_sha384_sswu(group, out, kHashTLabel, + sizeof(kHashTLabel) - 1, t, + TRUST_TOKEN_NONCE_SIZE); +} + +static int voprf_pst1_hash_to_scalar(const EC_GROUP *group, EC_SCALAR *out, + uint8_t *buf, size_t len) { + const uint8_t kHashCLabel[] = "HashToScalar-OPRFV1-\x01-P384-SHA384"; + return ec_hash_to_scalar_p384_xmd_sha384(group, out, kHashCLabel, + sizeof(kHashCLabel) - 1, buf, len); +} + +static int voprf_pst1_ok = 0; +static VOPRF_METHOD voprf_pst1_method; +static CRYPTO_once_t voprf_pst1_method_once = CRYPTO_ONCE_INIT; + +static void voprf_pst1_init_method_impl(void) { + voprf_pst1_ok = + voprf_init_method(&voprf_pst1_method, NID_secp384r1, + voprf_pst1_hash_to_group, voprf_pst1_hash_to_scalar); +} + +static int voprf_pst1_init_method(void) { + CRYPTO_once(&voprf_pst1_method_once, voprf_pst1_init_method_impl); + if (!voprf_pst1_ok) { + OPENSSL_PUT_ERROR(TRUST_TOKEN, ERR_R_INTERNAL_ERROR); + return 0; + } + return 1; +} + +int voprf_pst1_generate_key(CBB *out_private, CBB *out_public) { + if (!voprf_pst1_init_method()) { + return 0; + } + + return voprf_generate_key(&voprf_pst1_method, out_private, out_public); +} + +int voprf_pst1_derive_key_from_secret(CBB *out_private, CBB *out_public, + const uint8_t *secret, + size_t secret_len) { + if (!voprf_pst1_init_method()) { + return 0; + } + + return voprf_derive_key_from_secret(&voprf_pst1_method, out_private, + out_public, secret, secret_len); +} + +int voprf_pst1_client_key_from_bytes(TRUST_TOKEN_CLIENT_KEY *key, + const uint8_t *in, size_t len) { + if (!voprf_pst1_init_method()) { + return 0; + } + return voprf_client_key_from_bytes(&voprf_pst1_method, key, in, len); +} + +int voprf_pst1_issuer_key_from_bytes(TRUST_TOKEN_ISSUER_KEY *key, + const uint8_t *in, size_t len) { + if (!voprf_pst1_init_method()) { + return 0; + } + return voprf_issuer_key_from_bytes(&voprf_pst1_method, key, in, len); +} + +STACK_OF(TRUST_TOKEN_PRETOKEN) *voprf_pst1_blind(CBB *cbb, size_t count, + int include_message, + const uint8_t *msg, + size_t msg_len) { + if (!voprf_pst1_init_method()) { + return NULL; + } + return voprf_blind(&voprf_pst1_method, cbb, count, include_message, msg, + msg_len); +} + +int voprf_pst1_sign(const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, + size_t num_requested, size_t num_to_issue, + uint8_t private_metadata) { + if (!voprf_pst1_init_method() || private_metadata != 0) { + return 0; + } + return voprf_sign(&voprf_pst1_method, key, cbb, cbs, num_requested, + num_to_issue); +} + + +int voprf_pst1_sign_with_proof_scalar_for_testing( + const TRUST_TOKEN_ISSUER_KEY *key, CBB *cbb, CBS *cbs, size_t num_requested, + size_t num_to_issue, uint8_t private_metadata, + const uint8_t *proof_scalar_buf, size_t proof_scalar_len) { + if (!voprf_pst1_init_method() || private_metadata != 0) { + return 0; + } + return voprf_sign_with_proof_scalar_for_testing( + &voprf_pst1_method, key, cbb, cbs, num_requested, num_to_issue, + proof_scalar_buf, proof_scalar_len); +} + +STACK_OF(TRUST_TOKEN) *voprf_pst1_unblind( + const TRUST_TOKEN_CLIENT_KEY *key, + const STACK_OF(TRUST_TOKEN_PRETOKEN) *pretokens, CBS *cbs, size_t count, + uint32_t key_id) { + if (!voprf_pst1_init_method()) { + return NULL; + } + return voprf_unblind(&voprf_pst1_method, key, pretokens, cbs, count, key_id); +} + +int voprf_pst1_read(const TRUST_TOKEN_ISSUER_KEY *key, + uint8_t out_nonce[TRUST_TOKEN_NONCE_SIZE], + uint8_t *out_private_metadata, const uint8_t *token, + size_t token_len, int include_message, const uint8_t *msg, + size_t msg_len) { + if (!voprf_pst1_init_method()) { + return 0; + } + return voprf_read(&voprf_pst1_method, key, out_nonce, token, token_len, + include_message, msg, msg_len); } diff --git a/third_party/boringssl/src/crypto/x509/a_digest.c b/third_party/boringssl/src/crypto/x509/a_digest.c index d7dcecc73c95..4686993e779f 100644 --- a/third_party/boringssl/src/crypto/x509/a_digest.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/x509/a_sign.c b/third_party/boringssl/src/crypto/x509/a_sign.c index 3711a00490d4..8ee47798832a 100644 --- a/third_party/boringssl/src/crypto/x509/a_sign.c +++ b/third_party/boringssl/src/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,27 +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; - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); + 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/third_party/boringssl/src/crypto/x509/a_verify.c b/third_party/boringssl/src/crypto/x509/a_verify.c index af2c9145572d..a70769fd0b7f 100644 --- a/third_party/boringssl/src/crypto/x509/a_verify.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/x509/asn1_gen.c b/third_party/boringssl/src/crypto/x509/asn1_gen.c index 81079952bb9f..321f63bec055 100644 --- a/third_party/boringssl/src/crypto/x509/asn1_gen.c +++ b/third_party/boringssl/src/crypto/x509/asn1_gen.c @@ -56,11 +56,14 @@ #include +#include +#include +#include #include #include +#include #include -#include #include #include @@ -69,738 +72,515 @@ #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 } +// ASN1_GEN_MAX_DEPTH is the maximum number of nested TLVs allowed. +#define ASN1_GEN_MAX_DEPTH 50 -#define ASN1_FLAG_EXP_MAX 20 -// Maximum number of nested sequences -#define ASN1_GEN_SEQ_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) -// Input formats - -// 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, X509V3_CTX *cnf, int depth, - int *perr); +// 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, X509V3_CTX *cnf, - int depth, int *perr); -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, X509V3_CTX *cnf) { - int err = 0; - ASN1_TYPE *ret = generate_v3(str, cnf, 0, &err); - if (err) { - OPENSSL_PUT_ERROR(ASN1, err); - } - return ret; -} -static ASN1_TYPE *generate_v3(const char *str, X509V3_CTX *cnf, int depth, - int *perr) { - 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) { - *perr = ASN1_R_UNKNOWN_TAG; +ASN1_TYPE *ASN1_generate_v3(const char *str, const X509V3_CTX *cnf) { + 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) { - *perr = ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG; - return NULL; - } - if (depth >= ASN1_GEN_SEQ_MAX_DEPTH) { - *perr = ASN1_R_ILLEGAL_NESTED_TAGGING; - return NULL; - } - ret = asn1_multi(asn1_tags.utype, asn1_tags.str, cnf, depth, perr); - } else { - ret = asn1_str2type(asn1_tags.str, asn1_tags.format, asn1_tags.utype); - } - - if (!ret) { + // 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; } - // 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, X509V3_CTX *cnf, - int depth, int *perr) { - ASN1_TYPE *ret = NULL; - STACK_OF(ASN1_TYPE) *sk = NULL; - 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, (char *)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, perr); - 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); - X509V3_section_free(cnf, sect); - 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("VISIBLESTRING", V_ASN1_VISIBLESTRING), - ASN1_GEN_STR("VISIBLE", V_ASN1_VISIBLESTRING), - 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), - ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING), - ASN1_GEN_STR("GENSTR", V_ASN1_GENERALSTRING), - ASN1_GEN_STR("NUMERIC", V_ASN1_NUMERICSTRING), - ASN1_GEN_STR("NUMERICSTRING", V_ASN1_NUMERICSTRING), - - // 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; + // |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_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); + 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))) { + size_t 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; + } + // 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; + } } - 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 || + // 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; } - if (!ASN1_BIT_STRING_set_bit(bitstr, bitnum, 1)) { - OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE); + if (!ASN1_BIT_STRING_set_bit(bitstr, (int)bitnum, 1)) { return 0; } return 1; diff --git a/third_party/boringssl/src/crypto/x509/by_dir.c b/third_party/boringssl/src/crypto/x509/by_dir.c index 67a2c24b9d10..7045f0137abf 100644 --- a/third_party/boringssl/src/crypto/x509/by_dir.c +++ b/third_party/boringssl/src/crypto/x509/by_dir.c @@ -1,4 +1,3 @@ -/* crypto/x509/by_dir.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -172,7 +171,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; } @@ -231,7 +231,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; } } @@ -320,7 +319,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) { @@ -339,29 +337,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 diff --git a/third_party/boringssl/src/crypto/x509/by_file.c b/third_party/boringssl/src/crypto/x509/by_file.c index dbf866fac5ee..c2ebb6c76f56 100644 --- a/third_party/boringssl/src/crypto/x509/by_file.c +++ b/third_party/boringssl/src/crypto/x509/by_file.c @@ -1,4 +1,3 @@ -/* crypto/x509/by_file.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/crypto/x509/i2d_pr.c b/third_party/boringssl/src/crypto/x509/i2d_pr.c index 3c8887ff69d3..e5865a4289ee 100644 --- a/third_party/boringssl/src/crypto/x509/i2d_pr.c +++ b/third_party/boringssl/src/crypto/x509/i2d_pr.c @@ -1,4 +1,3 @@ -/* crypto/asn1/i2d_pr.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -66,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/third_party/boringssl/src/crypto/x509/internal.h b/third_party/boringssl/src/crypto/x509/internal.h index edba75c8147d..1937aa19c932 100644 --- a/third_party/boringssl/src/crypto/x509/internal.h +++ b/third_party/boringssl/src/crypto/x509/internal.h @@ -72,9 +72,6 @@ extern "C" { // Internal structures. -typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE; -typedef struct X509_POLICY_TREE_st X509_POLICY_TREE; - typedef struct X509_val_st { ASN1_TIME *notBefore; ASN1_TIME *notAfter; @@ -150,20 +147,17 @@ struct x509_st { CRYPTO_EX_DATA ex_data; // These contain copies of various extension values long ex_pathlen; - long ex_pcpathlen; - unsigned long ex_flags; - unsigned long ex_kusage; - unsigned long ex_xkusage; - unsigned long ex_nscert; + uint32_t ex_flags; + uint32_t ex_kusage; + uint32_t ex_xkusage; + uint32_t ex_nscert; ASN1_OCTET_STRING *skid; AUTHORITY_KEYID *akid; - X509_POLICY_CACHE *policy_cache; STACK_OF(DIST_POINT) *crldp; STACK_OF(GENERAL_NAME) *altname; NAME_CONSTRAINTS *nc; unsigned char cert_hash[SHA256_DIGEST_LENGTH]; X509_CERT_AUX *aux; - CRYPTO_BUFFER *buf; CRYPTO_MUTEX lock; } /* X509 */; @@ -233,7 +227,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 @@ -350,9 +344,6 @@ struct x509_store_ctx_st { int valid; // if 0, rebuild chain int last_untrusted; // index of last untrusted cert STACK_OF(X509) *chain; // chain of X509s - built up and trusted - X509_POLICY_TREE *tree; // Valid policy tree - - int explicit_policy; // Require explicit policy value // When something goes wrong, this is why int error_depth; @@ -369,7 +360,7 @@ struct x509_store_ctx_st { CRYPTO_EX_DATA ex_data; } /* X509_STORE_CTX */; -ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf); +ASN1_TYPE *ASN1_generate_v3(const char *str, const X509V3_CTX *cnf); int X509_CERT_AUX_print(BIO *bp, X509_CERT_AUX *x, int indent); @@ -410,6 +401,20 @@ int x509_digest_verify_init(EVP_MD_CTX *ctx, const X509_ALGOR *sigalg, EVP_PKEY *pkey); +// Path-building functions. + +// X509_policy_check checks certificate policies in |certs|. |user_policies| is +// 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 +// chain, it sets |*out_current_cert| to NULL. +int X509_policy_check(const STACK_OF(X509) *certs, + const STACK_OF(ASN1_OBJECT) *user_policies, + unsigned long flags, X509 **out_current_cert); + + #if defined(__cplusplus) } // extern C #endif diff --git a/third_party/boringssl/src/crypto/x509/name_print.c b/third_party/boringssl/src/crypto/x509/name_print.c index 29207ccb69e3..5dc34dae540f 100644 --- a/third_party/boringssl/src/crypto/x509/name_print.c +++ b/third_party/boringssl/src/crypto/x509/name_print.c @@ -56,6 +56,7 @@ #include +#include #include #include @@ -84,8 +85,7 @@ static int do_indent(BIO *out, int indent) { static int do_name_ex(BIO *out, const X509_NAME *n, int indent, unsigned long flags) { - int i, prev = -1, orflags, cnt; - int fn_opt, fn_nid; + int prev = -1, orflags; char objtmp[80]; const char *objbuf; int outlen, len; @@ -142,10 +142,8 @@ static int do_name_ex(BIO *out, const X509_NAME *n, int indent, sep_eq_len = 1; } - fn_opt = flags & XN_FLAG_FN_MASK; - - cnt = X509_NAME_entry_count(n); - for (i = 0; i < cnt; i++) { + int cnt = X509_NAME_entry_count(n); + for (int i = 0; i < cnt; i++) { const X509_NAME_ENTRY *ent; if (flags & XN_FLAG_DN_REV) { ent = X509_NAME_get_entry(n, cnt - i - 1); @@ -172,40 +170,20 @@ static int do_name_ex(BIO *out, const X509_NAME *n, int indent, prev = X509_NAME_ENTRY_set(ent); const ASN1_OBJECT *fn = X509_NAME_ENTRY_get_object(ent); const ASN1_STRING *val = X509_NAME_ENTRY_get_data(ent); - fn_nid = OBJ_obj2nid(fn); - if (fn_opt != XN_FLAG_FN_NONE) { - int objlen, fld_len; - if ((fn_opt == XN_FLAG_FN_OID) || (fn_nid == NID_undef)) { - OBJ_obj2txt(objtmp, sizeof objtmp, fn, 1); - fld_len = 0; // XXX: what should this be? - objbuf = objtmp; - } else { - if (fn_opt == XN_FLAG_FN_SN) { - fld_len = FN_WIDTH_SN; - objbuf = OBJ_nid2sn(fn_nid); - } else if (fn_opt == XN_FLAG_FN_LN) { - fld_len = FN_WIDTH_LN; - objbuf = OBJ_nid2ln(fn_nid); - } else { - fld_len = 0; // XXX: what should this be? - objbuf = ""; - } - } - objlen = strlen(objbuf); - if (!maybe_write(out, objbuf, objlen)) { - return -1; - } - if ((objlen < fld_len) && (flags & XN_FLAG_FN_ALIGN)) { - if (!do_indent(out, fld_len - objlen)) { - return -1; - } - outlen += fld_len - objlen; - } - if (!maybe_write(out, sep_eq, sep_eq_len)) { - return -1; - } - outlen += objlen + sep_eq_len; + assert((flags & XN_FLAG_FN_MASK) == XN_FLAG_FN_SN); + int fn_nid = OBJ_obj2nid(fn); + if (fn_nid == NID_undef) { + OBJ_obj2txt(objtmp, sizeof(objtmp), fn, 1); + objbuf = objtmp; + } else { + objbuf = OBJ_nid2sn(fn_nid); + } + int objlen = strlen(objbuf); + if (!maybe_write(out, objbuf, objlen) || + !maybe_write(out, sep_eq, sep_eq_len)) { + return -1; } + outlen += objlen + sep_eq_len; // If the field name is unknown then fix up the DER dump flag. We // might want to limit this further so it will DER dump on anything // other than a few 'standard' fields. diff --git a/third_party/boringssl/src/crypto/x509/policy.c b/third_party/boringssl/src/crypto/x509/policy.c new file mode 100644 index 000000000000..b0c27126c4e0 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/policy.c @@ -0,0 +1,790 @@ +/* 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 +#include +#include + +#include "../internal.h" +#include "../x509v3/internal.h" +#include "internal.h" + + +// This file computes the X.509 policy tree, as described in RFC 5280, section +// 6.1. It differs in that: +// +// (1) It does not track "qualifier_set". This is not needed as it is not +// output by this implementation. +// +// (2) It builds a directed acyclic graph, rather than a tree. When a given +// policy matches multiple parents, RFC 5280 makes a separate node for +// each parent. This representation condenses them into one node with +// multiple parents. Thus we refer to this structure as a "policy graph", +// rather than a "policy tree". +// +// (3) "expected_policy_set" is not tracked explicitly and built temporarily +// as part of building the graph. +// +// (4) anyPolicy nodes are not tracked explicitly. +// +// (5) Some pruning steps are deferred to when policies are evaluated, as a +// reachability pass. + +// An X509_POLICY_NODE is a node in the policy graph. It corresponds to a node +// from RFC 5280, section 6.1.2, step (a), but we store some fields differently. +typedef struct x509_policy_node_st { + // policy is the "valid_policy" field from RFC 5280. + ASN1_OBJECT *policy; + + // parent_policies, if non-empty, is the list of "valid_policy" values for all + // nodes which are a parent of this node. In this case, no entry in this list + // will be anyPolicy. This list is in no particular order and may contain + // duplicates if the corresponding certificate had duplicate mappings. + // + // If empty, this node has a single parent, anyPolicy. The node is then a root + // policies, and is in authorities-constrained-policy-set if it has a path to + // a leaf node. + // + // Note it is not possible for a policy to have both anyPolicy and a + // concrete policy as a parent. Section 6.1.3, step (d.1.ii) only runs if + // there was no match in step (d.1.i). We do not need to represent a parent + // list of, say, {anyPolicy, OID1, OID2}. + STACK_OF(ASN1_OBJECT) *parent_policies; + + // mapped is one if this node matches a policy mapping in the certificate and + // zero otherwise. + int mapped; + + // reachable is one if this node is reachable from some valid policy in the + // end-entity certificate. It is computed during |has_explicit_policy|. + int reachable; +} X509_POLICY_NODE; + +DEFINE_STACK_OF(X509_POLICY_NODE) + +// An X509_POLICY_LEVEL is the collection of nodes at the same depth in the +// policy graph. This structure can also be used to represent a level's +// "expected_policy_set" values. See |process_policy_mappings|. +typedef struct x509_policy_level_st { + // nodes is the list of nodes at this depth, except for the anyPolicy node, if + // any. This list is sorted by policy OID for efficient lookup. + STACK_OF(X509_POLICY_NODE) *nodes; + + // has_any_policy is one if there is an anyPolicy node at this depth, and zero + // otherwise. + int has_any_policy; +} X509_POLICY_LEVEL; + +DEFINE_STACK_OF(X509_POLICY_LEVEL) + +static int is_any_policy(const ASN1_OBJECT *obj) { + return OBJ_obj2nid(obj) == NID_any_policy; +} + +static void x509_policy_node_free(X509_POLICY_NODE *node) { + if (node != NULL) { + ASN1_OBJECT_free(node->policy); + sk_ASN1_OBJECT_pop_free(node->parent_policies, ASN1_OBJECT_free); + OPENSSL_free(node); + } +} + +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) { + return NULL; + } + OPENSSL_memset(node, 0, sizeof(X509_POLICY_NODE)); + node->policy = OBJ_dup(policy); + node->parent_policies = sk_ASN1_OBJECT_new_null(); + if (node->policy == NULL || node->parent_policies == NULL) { + x509_policy_node_free(node); + return NULL; + } + return node; +} + +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); +} + +static void x509_policy_level_free(X509_POLICY_LEVEL *level) { + if (level != NULL) { + sk_X509_POLICY_NODE_pop_free(level->nodes, x509_policy_node_free); + OPENSSL_free(level); + } +} + +static X509_POLICY_LEVEL *x509_policy_level_new(void) { + X509_POLICY_LEVEL *level = OPENSSL_malloc(sizeof(X509_POLICY_LEVEL)); + if (level == NULL) { + 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) { + x509_policy_level_free(level); + return NULL; + } + return level; +} + +static int x509_policy_level_is_empty(const X509_POLICY_LEVEL *level) { + return !level->has_any_policy && sk_X509_POLICY_NODE_num(level->nodes) == 0; +} + +static void x509_policy_level_clear(X509_POLICY_LEVEL *level) { + level->has_any_policy = 0; + for (size_t i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) { + x509_policy_node_free(sk_X509_POLICY_NODE_value(level->nodes, i)); + } + sk_X509_POLICY_NODE_zero(level->nodes); +} + +// x509_policy_level_find returns the node in |level| corresponding to |policy|, +// or NULL if none exists. +static X509_POLICY_NODE *x509_policy_level_find(X509_POLICY_LEVEL *level, + const ASN1_OBJECT *policy) { + assert(sk_X509_POLICY_NODE_is_sorted(level->nodes)); + X509_POLICY_NODE node; + node.policy = (ASN1_OBJECT *)policy; + size_t idx; + if (!sk_X509_POLICY_NODE_find(level->nodes, &idx, &node)) { + return NULL; + } + return sk_X509_POLICY_NODE_value(level->nodes, idx); +} + +// x509_policy_level_add_nodes adds the nodes in |nodes| to |level|. It returns +// one on success and zero on error. No policy in |nodes| may already be present +// in |level|. This function modifies |nodes| to avoid making a copy, but the +// caller is still responsible for releasing |nodes| itself. +// +// This function is used to add nodes to |level| in bulk, and avoid resorting +// |level| after each addition. +static int x509_policy_level_add_nodes(X509_POLICY_LEVEL *level, + STACK_OF(X509_POLICY_NODE) *nodes) { + 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)) { + return 0; + } + sk_X509_POLICY_NODE_set(nodes, i, NULL); + } + sk_X509_POLICY_NODE_sort(level->nodes); + +#if !defined(NDEBUG) + // There should be no duplicate nodes. + for (size_t i = 1; i < sk_X509_POLICY_NODE_num(level->nodes); i++) { + assert(OBJ_cmp(sk_X509_POLICY_NODE_value(level->nodes, i - 1)->policy, + sk_X509_POLICY_NODE_value(level->nodes, i)->policy) != 0); + } +#endif + return 1; +} + +static int policyinfo_cmp(const POLICYINFO *const *a, + const POLICYINFO *const *b) { + return OBJ_cmp((*a)->policyid, (*b)->policyid); +} + +static int delete_if_not_in_policies(X509_POLICY_NODE *node, void *data) { + const CERTIFICATEPOLICIES *policies = data; + assert(sk_POLICYINFO_is_sorted(policies)); + POLICYINFO info; + info.policyid = node->policy; + if (sk_POLICYINFO_find(policies, NULL, &info)) { + return 0; + } + x509_policy_node_free(node); + return 1; +} + +// process_certificate_policies updates |level| to incorporate |x509|'s +// certificate policies extension. This implements steps (d) and (e) of RFC +// 5280, section 6.1.3. |level| must contain the previous level's +// "expected_policy_set" information. For all but the top-most level, this is +// the output of |process_policy_mappings|. |any_policy_allowed| specifies +// whether anyPolicy is allowed or inhibited, taking into account the exception +// for self-issued certificates. +static int process_certificate_policies(const X509 *x509, + X509_POLICY_LEVEL *level, + int any_policy_allowed) { + int ret = 0; + int critical; + STACK_OF(X509_POLICY_NODE) *new_nodes = NULL; + CERTIFICATEPOLICIES *policies = + X509_get_ext_d2i(x509, NID_certificate_policies, &critical, NULL); + if (policies == NULL) { + if (critical != -1) { + return 0; // Syntax error in the extension. + } + + // RFC 5280, section 6.1.3, step (e). + x509_policy_level_clear(level); + return 1; + } + + // certificatePolicies may not be empty. See RFC 5280, section 4.2.1.4. + // TODO(https://crbug.com/boringssl/443): Move this check into the parser. + if (sk_POLICYINFO_num(policies) == 0) { + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION); + goto err; + } + + sk_POLICYINFO_set_cmp_func(policies, policyinfo_cmp); + sk_POLICYINFO_sort(policies); + int cert_has_any_policy = 0; + for (size_t i = 0; i < sk_POLICYINFO_num(policies); i++) { + const POLICYINFO *policy = sk_POLICYINFO_value(policies, i); + if (is_any_policy(policy->policyid)) { + cert_has_any_policy = 1; + } + if (i > 0 && OBJ_cmp(sk_POLICYINFO_value(policies, i - 1)->policyid, + policy->policyid) == 0) { + // Per RFC 5280, section 4.2.1.4, |policies| may not have duplicates. + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION); + goto err; + } + } + + // This does the same thing as RFC 5280, section 6.1.3, step (d), though in + // a slighty different order. |level| currently contains "expected_policy_set" + // values of the previous level. See |process_policy_mappings| for details. + const int previous_level_has_any_policy = level->has_any_policy; + + // First, we handle steps (d.1.i) and (d.2). The net effect of these two steps + // is to intersect |level| with |policies|, ignoring anyPolicy if it is + // inhibited. + if (!cert_has_any_policy || !any_policy_allowed) { + sk_X509_POLICY_NODE_delete_if(level->nodes, delete_if_not_in_policies, + policies); + level->has_any_policy = 0; + } + + // Step (d.1.ii) may attach new nodes to the previous level's anyPolicy node. + if (previous_level_has_any_policy) { + new_nodes = sk_X509_POLICY_NODE_new_null(); + if (new_nodes == NULL) { + goto err; + } + for (size_t i = 0; i < sk_POLICYINFO_num(policies); i++) { + const POLICYINFO *policy = sk_POLICYINFO_value(policies, i); + // Though we've reordered the steps slightly, |policy| is in |level| if + // and only if it would have been a match in step (d.1.ii). + if (!is_any_policy(policy->policyid) && + x509_policy_level_find(level, policy->policyid) == NULL) { + X509_POLICY_NODE *node = x509_policy_node_new(policy->policyid); + if (node == NULL || // + !sk_X509_POLICY_NODE_push(new_nodes, node)) { + x509_policy_node_free(node); + goto err; + } + } + } + if (!x509_policy_level_add_nodes(level, new_nodes)) { + goto err; + } + } + + ret = 1; + +err: + sk_X509_POLICY_NODE_pop_free(new_nodes, x509_policy_node_free); + CERTIFICATEPOLICIES_free(policies); + return ret; +} + +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 *const *a, + const POLICY_MAPPING *const *b) { + return OBJ_cmp((*a)->subjectDomainPolicy, (*b)->subjectDomainPolicy); +} + +static int delete_if_mapped(X509_POLICY_NODE *node, void *data) { + const POLICY_MAPPINGS *mappings = data; + // |mappings| must have been sorted by |compare_issuer_policy|. + assert(sk_POLICY_MAPPING_is_sorted(mappings)); + POLICY_MAPPING mapping; + mapping.issuerDomainPolicy = node->policy; + if (!sk_POLICY_MAPPING_find(mappings, /*out_index=*/NULL, &mapping)) { + return 0; + } + x509_policy_node_free(node); + return 1; +} + +// process_policy_mappings processes the policy mappings extension of |cert|, +// whose corresponding graph level is |level|. |mapping_allowed| specifies +// whether policy mapping is inhibited at this point. On success, it returns an +// |X509_POLICY_LEVEL| containing the "expected_policy_set" for |level|. On +// error, it returns NULL. This implements steps (a) and (b) of RFC 5280, +// section 6.1.4. +// +// We represent the "expected_policy_set" as an |X509_POLICY_LEVEL|. +// |has_any_policy| indicates whether there is an anyPolicy node with +// "expected_policy_set" of {anyPolicy}. If a node with policy oid P1 contains +// P2 in its "expected_policy_set", the level will contain a node of policy P2 +// with P1 in |parent_policies|. +// +// This is equivalent to the |X509_POLICY_LEVEL| that would result if the next +// certificats contained anyPolicy. |process_certificate_policies| will filter +// this result down to compute the actual level. +static X509_POLICY_LEVEL *process_policy_mappings(const X509 *cert, + X509_POLICY_LEVEL *level, + int mapping_allowed) { + int ok = 0; + STACK_OF(X509_POLICY_NODE) *new_nodes = NULL; + X509_POLICY_LEVEL *next = NULL; + int critical; + POLICY_MAPPINGS *mappings = + X509_get_ext_d2i(cert, NID_policy_mappings, &critical, NULL); + if (mappings == NULL && critical != -1) { + // Syntax error in the policy mappings extension. + goto err; + } + + if (mappings != NULL) { + // PolicyMappings may not be empty. See RFC 5280, section 4.2.1.5. + // TODO(https://crbug.com/boringssl/443): Move this check into the parser. + if (sk_POLICY_MAPPING_num(mappings) == 0) { + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION); + goto err; + } + + // RFC 5280, section 6.1.4, step (a). + for (size_t i = 0; i < sk_POLICY_MAPPING_num(mappings); i++) { + POLICY_MAPPING *mapping = sk_POLICY_MAPPING_value(mappings, i); + if (is_any_policy(mapping->issuerDomainPolicy) || + is_any_policy(mapping->subjectDomainPolicy)) { + goto err; + } + } + + // Sort to group by issuerDomainPolicy. + sk_POLICY_MAPPING_set_cmp_func(mappings, compare_issuer_policy); + sk_POLICY_MAPPING_sort(mappings); + + if (mapping_allowed) { + // Mark nodes as mapped, and add any nodes to |level| which may be needed + // as part of RFC 5280, section 6.1.4, step (b.1). + new_nodes = sk_X509_POLICY_NODE_new_null(); + if (new_nodes == NULL) { + goto err; + } + const ASN1_OBJECT *last_policy = NULL; + for (size_t i = 0; i < sk_POLICY_MAPPING_num(mappings); i++) { + const POLICY_MAPPING *mapping = sk_POLICY_MAPPING_value(mappings, i); + // There may be multiple mappings with the same |issuerDomainPolicy|. + if (last_policy != NULL && + OBJ_cmp(mapping->issuerDomainPolicy, last_policy) == 0) { + continue; + } + last_policy = mapping->issuerDomainPolicy; + + X509_POLICY_NODE *node = + x509_policy_level_find(level, mapping->issuerDomainPolicy); + if (node == NULL) { + if (!level->has_any_policy) { + continue; + } + node = x509_policy_node_new(mapping->issuerDomainPolicy); + if (node == NULL || // + !sk_X509_POLICY_NODE_push(new_nodes, node)) { + x509_policy_node_free(node); + goto err; + } + } + node->mapped = 1; + } + if (!x509_policy_level_add_nodes(level, new_nodes)) { + goto err; + } + } else { + // RFC 5280, section 6.1.4, step (b.2). If mapping is inhibited, delete + // all mapped nodes. + sk_X509_POLICY_NODE_delete_if(level->nodes, delete_if_mapped, mappings); + sk_POLICY_MAPPING_pop_free(mappings, POLICY_MAPPING_free); + mappings = NULL; + } + } + + // If a node was not mapped, it retains the original "explicit_policy_set" + // value, itself. Add those to |mappings|. + if (mappings == NULL) { + mappings = sk_POLICY_MAPPING_new_null(); + if (mappings == NULL) { + goto err; + } + } + for (size_t i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) { + X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(level->nodes, i); + if (!node->mapped) { + POLICY_MAPPING *mapping = POLICY_MAPPING_new(); + if (mapping == NULL) { + goto err; + } + mapping->issuerDomainPolicy = OBJ_dup(node->policy); + mapping->subjectDomainPolicy = OBJ_dup(node->policy); + if (mapping->issuerDomainPolicy == NULL || + mapping->subjectDomainPolicy == NULL || + !sk_POLICY_MAPPING_push(mappings, mapping)) { + POLICY_MAPPING_free(mapping); + goto err; + } + } + } + + // Sort to group by subjectDomainPolicy. + sk_POLICY_MAPPING_set_cmp_func(mappings, compare_subject_policy); + sk_POLICY_MAPPING_sort(mappings); + + // Convert |mappings| to our "expected_policy_set" representation. + next = x509_policy_level_new(); + if (next == NULL) { + goto err; + } + next->has_any_policy = level->has_any_policy; + + X509_POLICY_NODE *last_node = NULL; + for (size_t i = 0; i < sk_POLICY_MAPPING_num(mappings); i++) { + POLICY_MAPPING *mapping = sk_POLICY_MAPPING_value(mappings, i); + // Skip mappings where |issuerDomainPolicy| does not appear in the graph. + if (!level->has_any_policy && + x509_policy_level_find(level, mapping->issuerDomainPolicy) == NULL) { + continue; + } + + if (last_node == NULL || + OBJ_cmp(last_node->policy, mapping->subjectDomainPolicy) != 0) { + last_node = x509_policy_node_new(mapping->subjectDomainPolicy); + if (last_node == NULL || + !sk_X509_POLICY_NODE_push(next->nodes, last_node)) { + x509_policy_node_free(last_node); + goto err; + } + } + + if (!sk_ASN1_OBJECT_push(last_node->parent_policies, + mapping->issuerDomainPolicy)) { + goto err; + } + mapping->issuerDomainPolicy = NULL; + } + + sk_X509_POLICY_NODE_sort(next->nodes); + ok = 1; + +err: + if (!ok) { + x509_policy_level_free(next); + next = NULL; + } + + sk_POLICY_MAPPING_pop_free(mappings, POLICY_MAPPING_free); + sk_X509_POLICY_NODE_pop_free(new_nodes, x509_policy_node_free); + return next; +} + +// apply_skip_certs, if |skip_certs| is non-NULL, sets |*value| to the minimum +// of its current value and |skip_certs|. It returns one on success and zero if +// |skip_certs| is negative. +static int apply_skip_certs(const ASN1_INTEGER *skip_certs, size_t *value) { + if (skip_certs == NULL) { + return 1; + } + + // TODO(https://crbug.com/boringssl/443): Move this check into the parser. + if (skip_certs->type & V_ASN1_NEG) { + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION); + return 0; + } + + // If |skip_certs| does not fit in |uint64_t|, it must exceed |*value|. + uint64_t u64; + if (ASN1_INTEGER_get_uint64(&u64, skip_certs) && u64 < *value) { + *value = (size_t)u64; + } + ERR_clear_error(); + return 1; +} + +// process_policy_constraints updates |*explicit_policy|, |*policy_mapping|, and +// |*inhibit_any_policy| according to |x509|'s policy constraints and inhibit +// anyPolicy extensions. It returns one on success and zero on error. This +// implements steps (i) and (j) of RFC 5280, section 6.1.4. +static int process_policy_constraints(const X509 *x509, size_t *explicit_policy, + size_t *policy_mapping, + size_t *inhibit_any_policy) { + int critical; + POLICY_CONSTRAINTS *constraints = + X509_get_ext_d2i(x509, NID_policy_constraints, &critical, NULL); + if (constraints == NULL && critical != -1) { + return 0; + } + if (constraints != NULL) { + if (constraints->requireExplicitPolicy == NULL && + constraints->inhibitPolicyMapping == NULL) { + // Per RFC 5280, section 4.2.1.11, at least one of the fields must be + // present. + OPENSSL_PUT_ERROR(X509, X509_R_INVALID_POLICY_EXTENSION); + POLICY_CONSTRAINTS_free(constraints); + return 0; + } + int ok = + apply_skip_certs(constraints->requireExplicitPolicy, explicit_policy) && + apply_skip_certs(constraints->inhibitPolicyMapping, policy_mapping); + POLICY_CONSTRAINTS_free(constraints); + if (!ok) { + return 0; + } + } + + ASN1_INTEGER *inhibit_any_policy_ext = + X509_get_ext_d2i(x509, NID_inhibit_any_policy, &critical, NULL); + if (inhibit_any_policy_ext == NULL && critical != -1) { + return 0; + } + int ok = apply_skip_certs(inhibit_any_policy_ext, inhibit_any_policy); + ASN1_INTEGER_free(inhibit_any_policy_ext); + return ok; +} + +// has_explicit_policy returns one if the set of authority-space policy OIDs +// |levels| has some non-empty intersection with |user_policies|, and zero +// otherwise. This mirrors the logic in RFC 5280, section 6.1.5, step (g). This +// function modifies |levels| and should only be called at the end of policy +// evaluation. +static int has_explicit_policy(STACK_OF(X509_POLICY_LEVEL) *levels, + const STACK_OF(ASN1_OBJECT) *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); + X509_POLICY_LEVEL *level = sk_X509_POLICY_LEVEL_value(levels, num_levels - 1); + if (x509_policy_level_is_empty(level)) { + return 0; + } + + // If |user_policies| is empty, we interpret it as having a single anyPolicy + // value. The caller may also have supplied anyPolicy explicitly. + int user_has_any_policy = sk_ASN1_OBJECT_num(user_policies) == 0; + for (size_t i = 0; i < sk_ASN1_OBJECT_num(user_policies); i++) { + if (is_any_policy(sk_ASN1_OBJECT_value(user_policies, i))) { + user_has_any_policy = 1; + break; + } + } + + // Step (g.ii). If the policy graph is not empty and the user set contains + // anyPolicy, the intersection is the entire (non-empty) graph. + if (user_has_any_policy) { + return 1; + } + + // Step (g.iii) does not delete anyPolicy nodes, so if the graph has + // anyPolicy, some explicit policy will survive. The actual intersection may + // synthesize some nodes in step (g.iii.3), but we do not return the policy + // list itself, so we skip actually computing this. + if (level->has_any_policy) { + return 1; + } + + // We defer pruning the tree, so as we look for nodes with parent anyPolicy, + // step (g.iii.1), we must limit to nodes reachable from the bottommost level. + // Start by marking each of those nodes as reachable. + for (size_t i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) { + sk_X509_POLICY_NODE_value(level->nodes, i)->reachable = 1; + } + + for (size_t i = num_levels - 1; i < num_levels; i--) { + level = sk_X509_POLICY_LEVEL_value(levels, i); + for (size_t j = 0; j < sk_X509_POLICY_NODE_num(level->nodes); j++) { + X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(level->nodes, j); + if (!node->reachable) { + continue; + } + if (sk_ASN1_OBJECT_num(node->parent_policies) == 0) { + // |node|'s parent is anyPolicy and is part of "valid_policy_node_set". + // If it exists in |user_policies|, the intersection is non-empty and we + // can return immediately. + if (sk_ASN1_OBJECT_find(user_policies, /*out_index=*/NULL, + node->policy)) { + return 1; + } + } else if (i > 0) { + // |node|'s parents are concrete policies. Mark the parents reachable, + // to be inspected by the next loop iteration. + X509_POLICY_LEVEL *prev = sk_X509_POLICY_LEVEL_value(levels, i - 1); + for (size_t k = 0; k < sk_ASN1_OBJECT_num(node->parent_policies); k++) { + X509_POLICY_NODE *parent = x509_policy_level_find( + prev, sk_ASN1_OBJECT_value(node->parent_policies, k)); + if (parent != NULL) { + parent->reachable = 1; + } + } + } + } + } + + return 0; +} + +static int asn1_object_cmp(const ASN1_OBJECT *const *a, + const ASN1_OBJECT *const *b) { + return OBJ_cmp(*a, *b); +} + +int X509_policy_check(const STACK_OF(X509) *certs, + const STACK_OF(ASN1_OBJECT) *user_policies, + unsigned long flags, X509 **out_current_cert) { + *out_current_cert = NULL; + int ret = X509_V_ERR_OUT_OF_MEM; + X509_POLICY_LEVEL *level = NULL; + STACK_OF(X509_POLICY_LEVEL) *levels = NULL; + STACK_OF(ASN1_OBJECT) *user_policies_sorted = NULL; + size_t num_certs = sk_X509_num(certs); + + // Skip policy checking if the chain is just the trust anchor. + if (num_certs <= 1) { + return X509_V_OK; + } + + // See RFC 5280, section 6.1.2, steps (d) through (f). + size_t explicit_policy = + (flags & X509_V_FLAG_EXPLICIT_POLICY) ? 0 : num_certs + 1; + size_t inhibit_any_policy = + (flags & X509_V_FLAG_INHIBIT_ANY) ? 0 : num_certs + 1; + size_t policy_mapping = + (flags & X509_V_FLAG_INHIBIT_MAP) ? 0 : num_certs + 1; + + levels = sk_X509_POLICY_LEVEL_new_null(); + if (levels == NULL) { + goto err; + } + + for (size_t i = num_certs - 2; i < num_certs; i--) { + X509 *cert = sk_X509_value(certs, i); + if (!x509v3_cache_extensions(cert)) { + goto err; + } + const int is_self_issued = (cert->ex_flags & EXFLAG_SI) != 0; + + if (level == NULL) { + assert(i == num_certs - 2); + level = x509_policy_level_new(); + if (level == NULL) { + goto err; + } + level->has_any_policy = 1; + } + + // RFC 5280, section 6.1.3, steps (d) and (e). |any_policy_allowed| is + // computed as in step (d.2). + const int any_policy_allowed = + inhibit_any_policy > 0 || (i > 0 && is_self_issued); + if (!process_certificate_policies(cert, level, any_policy_allowed)) { + ret = X509_V_ERR_INVALID_POLICY_EXTENSION; + *out_current_cert = cert; + goto err; + } + + // RFC 5280, section 6.1.3, step (f). + if (explicit_policy == 0 && x509_policy_level_is_empty(level)) { + ret = X509_V_ERR_NO_EXPLICIT_POLICY; + goto err; + } + + // Insert into the list. + if (!sk_X509_POLICY_LEVEL_push(levels, level)) { + goto err; + } + X509_POLICY_LEVEL *current_level = level; + level = NULL; + + // If this is not the leaf certificate, we go to section 6.1.4. If it + // is the leaf certificate, we go to section 6.1.5 instead. + if (i != 0) { + // RFC 5280, section 6.1.4, steps (a) and (b). + level = process_policy_mappings(cert, current_level, policy_mapping > 0); + if (level == NULL) { + ret = X509_V_ERR_INVALID_POLICY_EXTENSION; + *out_current_cert = cert; + goto err; + } + } + + // RFC 5280, section 6.1.4, step (h-j) for non-leaves, and section 6.1.5, + // step (a-b) for leaves. In the leaf case, RFC 5280 says only to update + // |explicit_policy|, but |policy_mapping| and |inhibit_any_policy| are no + // longer read at this point, so we use the same process. + if (i == 0 || !is_self_issued) { + if (explicit_policy > 0) { + explicit_policy--; + } + if (policy_mapping > 0) { + policy_mapping--; + } + if (inhibit_any_policy > 0) { + inhibit_any_policy--; + } + } + if (!process_policy_constraints(cert, &explicit_policy, &policy_mapping, + &inhibit_any_policy)) { + ret = X509_V_ERR_INVALID_POLICY_EXTENSION; + *out_current_cert = cert; + goto err; + } + } + + // RFC 5280, section 6.1.5, step (g). We do not output the policy set, so it + // 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. + 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); + } + + if (!has_explicit_policy(levels, user_policies_sorted)) { + ret = X509_V_ERR_NO_EXPLICIT_POLICY; + goto err; + } + } + + ret = X509_V_OK; + +err: + x509_policy_level_free(level); + // |user_policies_sorted|'s contents are owned by |user_policies|, so we do + // not use |sk_ASN1_OBJECT_pop_free|. + sk_ASN1_OBJECT_free(user_policies_sorted); + sk_X509_POLICY_LEVEL_pop_free(levels, x509_policy_level_free); + return ret; +} diff --git a/third_party/boringssl/src/crypto/x509/rsa_pss.c b/third_party/boringssl/src/crypto/x509/rsa_pss.c index 606fffd6aff5..9e69663ed9a7 100644 --- a/third_party/boringssl/src/crypto/x509/rsa_pss.c +++ b/third_party/boringssl/src/crypto/x509/rsa_pss.c @@ -202,7 +202,7 @@ int x509_rsa_ctx_to_pss(EVP_MD_CTX *ctx, X509_ALGOR *algor) { OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS); return 0; } - int md_len = EVP_MD_size(sigmd); + int md_len = (int)EVP_MD_size(sigmd); if (saltlen == -1) { saltlen = md_len; } else if (saltlen != md_len) { diff --git a/third_party/boringssl/src/crypto/x509/t_x509.c b/third_party/boringssl/src/crypto/x509/t_x509.c index 6694e3d1277e..1d71576ccd9b 100644 --- a/third_party/boringssl/src/crypto/x509/t_x509.c +++ b/third_party/boringssl/src/crypto/x509/t_x509.c @@ -91,14 +91,8 @@ int X509_print(BIO *bp, X509 *x) { int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, unsigned long cflag) { - long l; - int ret = 0, i; - char *m = NULL, mlch = ' '; + char mlch = ' '; int nmindent = 0; - X509_CINF *ci; - EVP_PKEY *pkey = NULL; - const char *neg; - if ((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) { mlch = '\n'; nmindent = 12; @@ -108,26 +102,26 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, nmindent = 16; } - ci = x->cert_info; + const X509_CINF *ci = x->cert_info; if (!(cflag & X509_FLAG_NO_HEADER)) { if (BIO_write(bp, "Certificate:\n", 13) <= 0) { - goto err; + return 0; } if (BIO_write(bp, " Data:\n", 10) <= 0) { - goto err; + return 0; } } if (!(cflag & X509_FLAG_NO_VERSION)) { - l = X509_get_version(x); + long l = X509_get_version(x); assert(X509_VERSION_1 <= l && l <= X509_VERSION_3); if (BIO_printf(bp, "%8sVersion: %ld (0x%lx)\n", "", l + 1, (unsigned long)l) <= 0) { - goto err; + return 0; } } if (!(cflag & X509_FLAG_NO_SERIAL)) { if (BIO_write(bp, " Serial Number:", 22) <= 0) { - goto err; + return 0; } const ASN1_INTEGER *serial = X509_get0_serialNumber(x); @@ -136,19 +130,20 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, assert(serial->type != V_ASN1_NEG_INTEGER); if (BIO_printf(bp, " %" PRIu64 " (0x%" PRIx64 ")\n", serial_u64, serial_u64) <= 0) { - goto err; + return 0; } } else { ERR_clear_error(); // Clear |ASN1_INTEGER_get_uint64|'s error. - neg = (serial->type == V_ASN1_NEG_INTEGER) ? " (Negative)" : ""; + const char *neg = + (serial->type == V_ASN1_NEG_INTEGER) ? " (Negative)" : ""; if (BIO_printf(bp, "\n%12s%s", "", neg) <= 0) { - goto err; + return 0; } - for (i = 0; i < serial->length; i++) { + for (int i = 0; i < serial->length; i++) { if (BIO_printf(bp, "%02x%c", serial->data[i], ((i + 1 == serial->length) ? '\n' : ':')) <= 0) { - goto err; + return 0; } } } @@ -156,69 +151,69 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, if (!(cflag & X509_FLAG_NO_SIGNAME)) { if (X509_signature_print(bp, ci->signature, NULL) <= 0) { - goto err; + return 0; } } if (!(cflag & X509_FLAG_NO_ISSUER)) { if (BIO_printf(bp, " Issuer:%c", mlch) <= 0) { - goto err; + return 0; } if (X509_NAME_print_ex(bp, X509_get_issuer_name(x), nmindent, nmflags) < 0) { - goto err; + return 0; } if (BIO_write(bp, "\n", 1) <= 0) { - goto err; + return 0; } } if (!(cflag & X509_FLAG_NO_VALIDITY)) { if (BIO_write(bp, " Validity\n", 17) <= 0) { - goto err; + return 0; } if (BIO_write(bp, " Not Before: ", 24) <= 0) { - goto err; + return 0; } if (!ASN1_TIME_print(bp, X509_get_notBefore(x))) { - goto err; + return 0; } if (BIO_write(bp, "\n Not After : ", 25) <= 0) { - goto err; + return 0; } if (!ASN1_TIME_print(bp, X509_get_notAfter(x))) { - goto err; + return 0; } if (BIO_write(bp, "\n", 1) <= 0) { - goto err; + return 0; } } if (!(cflag & X509_FLAG_NO_SUBJECT)) { if (BIO_printf(bp, " Subject:%c", mlch) <= 0) { - goto err; + return 0; } if (X509_NAME_print_ex(bp, X509_get_subject_name(x), nmindent, nmflags) < 0) { - goto err; + return 0; } if (BIO_write(bp, "\n", 1) <= 0) { - goto err; + return 0; } } if (!(cflag & X509_FLAG_NO_PUBKEY)) { if (BIO_write(bp, " Subject Public Key Info:\n", 33) <= 0) { - goto err; + return 0; } if (BIO_printf(bp, "%12sPublic Key Algorithm: ", "") <= 0) { - goto err; + return 0; } if (i2a_ASN1_OBJECT(bp, ci->key->algor->algorithm) <= 0) { - goto err; + return 0; } if (BIO_puts(bp, "\n") <= 0) { - goto err; + return 0; } - pkey = X509_get_pubkey(x); + EVP_PKEY *pkey = X509_get_pubkey(x); if (pkey == NULL) { BIO_printf(bp, "%12sUnable to load Public Key\n", ""); ERR_print_errors(bp); @@ -231,18 +226,18 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, if (!(cflag & X509_FLAG_NO_IDS)) { if (ci->issuerUID) { if (BIO_printf(bp, "%8sIssuer Unique ID: ", "") <= 0) { - goto err; + return 0; } if (!X509_signature_dump(bp, ci->issuerUID, 12)) { - goto err; + return 0; } } if (ci->subjectUID) { if (BIO_printf(bp, "%8sSubject Unique ID: ", "") <= 0) { - goto err; + return 0; } if (!X509_signature_dump(bp, ci->subjectUID, 12)) { - goto err; + return 0; } } } @@ -253,20 +248,16 @@ int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags, if (!(cflag & X509_FLAG_NO_SIGDUMP)) { if (X509_signature_print(bp, x->sig_alg, x->signature) <= 0) { - goto err; + return 0; } } if (!(cflag & X509_FLAG_NO_AUX)) { if (!X509_CERT_AUX_print(bp, x->aux, 0)) { - goto err; + return 0; } } - ret = 1; -err: - if (m != NULL) { - OPENSSL_free(m); - } - return ret; + + return 1; } int X509_signature_print(BIO *bp, const X509_ALGOR *sigalg, diff --git a/third_party/boringssl/src/crypto/x509/test/make_basic_constraints.go b/third_party/boringssl/src/crypto/x509/test/make_basic_constraints.go index 23158b594732..ea502b4c8d7d 100644 --- a/third_party/boringssl/src/crypto/x509/test/make_basic_constraints.go +++ b/third_party/boringssl/src/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. @@ -23,8 +25,8 @@ import ( "crypto/x509/pkix" "encoding/pem" "fmt" - "io/ioutil" "math/big" + "os" "time" ) @@ -75,7 +77,7 @@ func main() { } certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certBytes}) - if err := ioutil.WriteFile(fmt.Sprintf("basic_constraints_%s.pem", cert.name), certPEM, 0666); err != nil { + if err := os.WriteFile(fmt.Sprintf("basic_constraints_%s.pem", cert.name), certPEM, 0666); err != nil { panic(err) } } diff --git a/third_party/boringssl/src/crypto/x509/test/make_invalid_extensions.go b/third_party/boringssl/src/crypto/x509/test/make_invalid_extensions.go index d0c2ceebafff..8287bf8d310f 100644 --- a/third_party/boringssl/src/crypto/x509/test/make_invalid_extensions.go +++ b/third_party/boringssl/src/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. @@ -49,9 +51,9 @@ var extensions = []extension{ var leafKey, intermediateKey, rootKey *ecdsa.PrivateKey func init() { - leafKey = ecdsaKeyFromPEMOrPanic(leafKeyPEM) - intermediateKey = ecdsaKeyFromPEMOrPanic(intermediateKeyPEM) - rootKey = ecdsaKeyFromPEMOrPanic(rootKeyPEM) + leafKey = mustParseECDSAKey(leafKeyPEM) + intermediateKey = mustParseECDSAKey(intermediateKeyPEM) + rootKey = mustParseECDSAKey(rootKeyPEM) } type templateAndKey struct { @@ -59,7 +61,7 @@ type templateAndKey struct { key *ecdsa.PrivateKey } -func generateCertificateOrPanic(path string, subject, issuer *templateAndKey) []byte { +func mustGenerateCertificate(path string, subject, issuer *templateAndKey) []byte { cert, err := x509.CreateCertificate(rand.Reader, &subject.template, &issuer.template, &subject.key.PublicKey, issuer.key) if err != nil { panic(err) @@ -135,9 +137,9 @@ func main() { } // Generate a valid certificate chain from the templates. - generateCertificateOrPanic("invalid_extension_root.pem", &root, &root) - generateCertificateOrPanic("invalid_extension_intermediate.pem", &intermediate, &root) - leafDER := generateCertificateOrPanic("invalid_extension_leaf.pem", &leaf, &intermediate) + mustGenerateCertificate("invalid_extension_root.pem", &root, &root) + mustGenerateCertificate("invalid_extension_intermediate.pem", &intermediate, &root) + leafDER := mustGenerateCertificate("invalid_extension_leaf.pem", &leaf, &intermediate) leafCert, err := x509.ParseCertificate(leafDER) if err != nil { @@ -151,15 +153,15 @@ func main() { rootInvalid := root rootInvalid.template.ExtraExtensions = invalidExtension - generateCertificateOrPanic(fmt.Sprintf("invalid_extension_root_%s.pem", ext.name), &rootInvalid, &rootInvalid) + mustGenerateCertificate(fmt.Sprintf("invalid_extension_root_%s.pem", ext.name), &rootInvalid, &rootInvalid) intermediateInvalid := intermediate intermediateInvalid.template.ExtraExtensions = invalidExtension - generateCertificateOrPanic(fmt.Sprintf("invalid_extension_intermediate_%s.pem", ext.name), &intermediateInvalid, &root) + mustGenerateCertificate(fmt.Sprintf("invalid_extension_intermediate_%s.pem", ext.name), &intermediateInvalid, &root) leafInvalid := leaf leafInvalid.template.ExtraExtensions = invalidExtension - generateCertificateOrPanic(fmt.Sprintf("invalid_extension_leaf_%s.pem", ext.name), &leafInvalid, &intermediate) + mustGenerateCertificate(fmt.Sprintf("invalid_extension_leaf_%s.pem", ext.name), &leafInvalid, &intermediate) // Additionally generate a copy of the leaf certificate with extra data in // the extension. @@ -177,7 +179,7 @@ func main() { leafTrailingData := leaf leafTrailingData.template.ExtraExtensions = trailingDataExtension - generateCertificateOrPanic(fmt.Sprintf("trailing_data_leaf_%s.pem", ext.name), &leafTrailingData, &intermediate) + mustGenerateCertificate(fmt.Sprintf("trailing_data_leaf_%s.pem", ext.name), &leafTrailingData, &intermediate) } } @@ -199,7 +201,7 @@ Hr+qcPlp5N1jM3ACXys57bPujg+hRANCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44Tq ChRYI6IeV9tIB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolt -----END PRIVATE KEY-----` -func ecdsaKeyFromPEMOrPanic(in string) *ecdsa.PrivateKey { +func mustParseECDSAKey(in string) *ecdsa.PrivateKey { keyBlock, _ := pem.Decode([]byte(in)) if keyBlock == nil || keyBlock.Type != "PRIVATE KEY" { panic("could not decode private key") diff --git a/third_party/boringssl/src/crypto/x509/test/make_many_constraints.go b/third_party/boringssl/src/crypto/x509/test/make_many_constraints.go index 578618dfbfc5..24a5c4071769 100644 --- a/third_party/boringssl/src/crypto/x509/test/make_many_constraints.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/x509/test/make_policy_certs.go b/third_party/boringssl/src/crypto/x509/test/make_policy_certs.go new file mode 100644 index 000000000000..739d8ced3938 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/make_policy_certs.go @@ -0,0 +1,353 @@ +// 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 + +import ( + "crypto/ecdsa" + "crypto/rand" + "crypto/x509" + "crypto/x509/pkix" + "encoding/asn1" + "encoding/pem" + "flag" + "math/big" + "os" + "time" + + "golang.org/x/crypto/cryptobyte" + cbasn1 "golang.org/x/crypto/cryptobyte/asn1" +) + +var resetFlag = flag.Bool("reset", false, "if set, regenerates certificates that already exist") + +var ( + // https://davidben.net/oid + testOID1 = asn1.ObjectIdentifier([]int{1, 2, 840, 113554, 4, 1, 72585, 2, 1}) + testOID2 = asn1.ObjectIdentifier([]int{1, 2, 840, 113554, 4, 1, 72585, 2, 2}) + testOID3 = asn1.ObjectIdentifier([]int{1, 2, 840, 113554, 4, 1, 72585, 2, 3}) + testOID4 = asn1.ObjectIdentifier([]int{1, 2, 840, 113554, 4, 1, 72585, 2, 4}) + testOID5 = asn1.ObjectIdentifier([]int{1, 2, 840, 113554, 4, 1, 72585, 2, 5}) + + // https://www.rfc-editor.org/rfc/rfc5280.html#section-4.2.1.4 + certificatePoliciesOID = asn1.ObjectIdentifier([]int{2, 5, 29, 32}) + anyPolicyOID = asn1.ObjectIdentifier([]int{2, 5, 29, 32, 0}) + + // https://www.rfc-editor.org/rfc/rfc5280.html#section-4.2.1.5 + policyMappingsOID = asn1.ObjectIdentifier([]int{2, 5, 29, 33}) + + // https://www.rfc-editor.org/rfc/rfc5280.html#section-4.2.1.11 + policyConstraintsOID = asn1.ObjectIdentifier([]int{2, 5, 29, 36}) +) + +var leafKey, intermediateKey, rootKey *ecdsa.PrivateKey + +func init() { + leafKey = mustParseECDSAKey(leafKeyPEM) + intermediateKey = mustParseECDSAKey(intermediateKeyPEM) + rootKey = mustParseECDSAKey(rootKeyPEM) +} + +type templateAndKey struct { + template x509.Certificate + key *ecdsa.PrivateKey +} + +func mustGenerateCertificate(path string, subject, issuer *templateAndKey) { + if !*resetFlag { + // Skip if the file already exists. + _, err := os.Stat(path) + if err == nil { + return + } + if !os.IsNotExist(err) { + panic(err) + } + } + cert, err := x509.CreateCertificate(rand.Reader, &subject.template, &issuer.template, &subject.key.PublicKey, issuer.key) + if err != nil { + panic(err) + } + file, err := os.Create(path) + if err != nil { + panic(err) + } + defer file.Close() + err = pem.Encode(file, &pem.Block{Type: "CERTIFICATE", Bytes: cert}) + if err != nil { + panic(err) + } +} + +func main() { + flag.Parse() + + notBefore, err := time.Parse(time.RFC3339, "2000-01-01T00:00:00Z") + if err != nil { + panic(err) + } + notAfter, err := time.Parse(time.RFC3339, "2100-01-01T00:00:00Z") + if err != nil { + panic(err) + } + + root2 := templateAndKey{ + template: x509.Certificate{ + SerialNumber: new(big.Int).SetInt64(1), + Subject: pkix.Name{CommonName: "Policy Root 2"}, + NotBefore: notBefore, + NotAfter: notAfter, + BasicConstraintsValid: true, + IsCA: true, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + KeyUsage: x509.KeyUsageCertSign, + SignatureAlgorithm: x509.ECDSAWithSHA256, + }, + key: rootKey, + } + root := templateAndKey{ + template: x509.Certificate{ + SerialNumber: new(big.Int).SetInt64(1), + Subject: pkix.Name{CommonName: "Policy Root"}, + NotBefore: notBefore, + NotAfter: notAfter, + BasicConstraintsValid: true, + IsCA: true, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + KeyUsage: x509.KeyUsageCertSign, + SignatureAlgorithm: x509.ECDSAWithSHA256, + }, + key: rootKey, + } + intermediate := templateAndKey{ + template: x509.Certificate{ + SerialNumber: new(big.Int).SetInt64(2), + Subject: pkix.Name{CommonName: "Policy Intermediate"}, + NotBefore: notBefore, + NotAfter: notAfter, + BasicConstraintsValid: true, + IsCA: true, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + KeyUsage: x509.KeyUsageCertSign, + SignatureAlgorithm: x509.ECDSAWithSHA256, + PolicyIdentifiers: []asn1.ObjectIdentifier{testOID1, testOID2}, + }, + key: intermediateKey, + } + leaf := templateAndKey{ + template: x509.Certificate{ + SerialNumber: new(big.Int).SetInt64(3), + Subject: pkix.Name{CommonName: "www.example.com"}, + NotBefore: notBefore, + NotAfter: notAfter, + BasicConstraintsValid: true, + IsCA: false, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + KeyUsage: x509.KeyUsageCertSign, + SignatureAlgorithm: x509.ECDSAWithSHA256, + DNSNames: []string{"www.example.com"}, + PolicyIdentifiers: []asn1.ObjectIdentifier{testOID1, testOID2}, + }, + key: leafKey, + } + + // Generate a valid certificate chain from the templates. + mustGenerateCertificate("policy_root.pem", &root, &root) + mustGenerateCertificate("policy_intermediate.pem", &intermediate, &root) + mustGenerateCertificate("policy_leaf.pem", &leaf, &intermediate) + + // root2 is used for tests that need a longer chain, using a Root/Root2 + // cross-sign as one of the certificates. + mustGenerateCertificate("policy_root2.pem", &root2, &root2) + + // Introduce syntax errors in the leaf and intermediate. + leafInvalid := leaf + leafInvalid.template.PolicyIdentifiers = nil + leafInvalid.template.ExtraExtensions = []pkix.Extension{{Id: certificatePoliciesOID, Value: []byte("INVALID")}} + mustGenerateCertificate("policy_leaf_invalid.pem", &leafInvalid, &root) + + intermediateInvalid := intermediate + intermediateInvalid.template.PolicyIdentifiers = nil + intermediateInvalid.template.ExtraExtensions = []pkix.Extension{{Id: certificatePoliciesOID, Value: []byte("INVALID")}} + mustGenerateCertificate("policy_intermediate_invalid.pem", &intermediateInvalid, &root) + + // Duplicates are not allowed in certificatePolicies. + leafDuplicate := leaf + leafDuplicate.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID1, testOID2, testOID2} + mustGenerateCertificate("policy_leaf_duplicate.pem", &leafDuplicate, &root) + + intermediateDuplicate := intermediate + intermediateDuplicate.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID1, testOID2, testOID2} + mustGenerateCertificate("policy_intermediate_duplicate.pem", &intermediateDuplicate, &root) + + // Various policy constraints with requireExplicitPolicy values. + b := cryptobyte.NewBuilder(nil) + b.AddASN1(cbasn1.SEQUENCE, func(seq *cryptobyte.Builder) { + seq.AddASN1Int64WithTag(0, cbasn1.Tag(0).ContextSpecific()) + }) + requireExplicitPolicy0 := b.BytesOrPanic() + + b = cryptobyte.NewBuilder(nil) + b.AddASN1(cbasn1.SEQUENCE, func(seq *cryptobyte.Builder) { + seq.AddASN1Int64WithTag(1, cbasn1.Tag(0).ContextSpecific()) + }) + requireExplicitPolicy1 := b.BytesOrPanic() + + b = cryptobyte.NewBuilder(nil) + b.AddASN1(cbasn1.SEQUENCE, func(seq *cryptobyte.Builder) { + seq.AddASN1Int64WithTag(2, cbasn1.Tag(0).ContextSpecific()) + }) + requireExplicitPolicy2 := b.BytesOrPanic() + + // A version of the intermediate that sets requireExplicitPolicy, skipping + // zero certificates. + intermediateRequire := intermediate + intermediateRequire.template.ExtraExtensions = []pkix.Extension{{Id: policyConstraintsOID, Value: requireExplicitPolicy0}} + mustGenerateCertificate("policy_intermediate_require.pem", &intermediateRequire, &root) + + // Same as above, but there are no policies on the intermediate. + intermediateRequire.template.PolicyIdentifiers = nil + mustGenerateCertificate("policy_intermediate_require_no_policies.pem", &intermediateRequire, &root) + + // Same as above, but the policy list has duplicates. + intermediateRequire.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID1, testOID2, testOID2} + mustGenerateCertificate("policy_intermediate_require_duplicate.pem", &intermediateRequire, &root) + + // Corresponding certificates that instead assert the anyPolicy OID. + intermediateAny := intermediate + intermediateAny.template.PolicyIdentifiers = []asn1.ObjectIdentifier{anyPolicyOID} + mustGenerateCertificate("policy_intermediate_any.pem", &intermediateAny, &root) + + // Other requireExplicitPolicy values, on the leaf and intermediate. + intermediateRequire = intermediate + intermediateRequire.template.ExtraExtensions = []pkix.Extension{{Id: policyConstraintsOID, Value: requireExplicitPolicy1}} + mustGenerateCertificate("policy_intermediate_require1.pem", &intermediateRequire, &root) + intermediateRequire.template.ExtraExtensions = []pkix.Extension{{Id: policyConstraintsOID, Value: requireExplicitPolicy2}} + mustGenerateCertificate("policy_intermediate_require2.pem", &intermediateRequire, &root) + leafRequire := leaf + leafRequire.template.ExtraExtensions = []pkix.Extension{{Id: policyConstraintsOID, Value: requireExplicitPolicy0}} + mustGenerateCertificate("policy_leaf_require.pem", &leafRequire, &intermediate) + leafRequire.template.ExtraExtensions = []pkix.Extension{{Id: policyConstraintsOID, Value: requireExplicitPolicy1}} + mustGenerateCertificate("policy_leaf_require1.pem", &leafRequire, &intermediate) + + leafAny := leaf + leafAny.template.PolicyIdentifiers = []asn1.ObjectIdentifier{anyPolicyOID} + mustGenerateCertificate("policy_leaf_any.pem", &leafAny, &intermediate) + + // An intermediate which maps OID1 to (OID2, OID3), and which asserts the + // input OIDs either all at once, or as anyPolicy. + b = cryptobyte.NewBuilder(nil) + b.AddASN1(cbasn1.SEQUENCE, func(seq *cryptobyte.Builder) { + // Map OID3 to (OID1, OID2). + seq.AddASN1(cbasn1.SEQUENCE, func(mapping *cryptobyte.Builder) { + mapping.AddASN1ObjectIdentifier(testOID3) + mapping.AddASN1ObjectIdentifier(testOID1) + }) + seq.AddASN1(cbasn1.SEQUENCE, func(mapping *cryptobyte.Builder) { + mapping.AddASN1ObjectIdentifier(testOID3) + mapping.AddASN1ObjectIdentifier(testOID2) + }) + + // Map all pairs of OID4 and OID5 to each other. + seq.AddASN1(cbasn1.SEQUENCE, func(mapping *cryptobyte.Builder) { + mapping.AddASN1ObjectIdentifier(testOID4) + mapping.AddASN1ObjectIdentifier(testOID4) + }) + seq.AddASN1(cbasn1.SEQUENCE, func(mapping *cryptobyte.Builder) { + mapping.AddASN1ObjectIdentifier(testOID4) + mapping.AddASN1ObjectIdentifier(testOID5) + }) + seq.AddASN1(cbasn1.SEQUENCE, func(mapping *cryptobyte.Builder) { + mapping.AddASN1ObjectIdentifier(testOID5) + mapping.AddASN1ObjectIdentifier(testOID4) + }) + seq.AddASN1(cbasn1.SEQUENCE, func(mapping *cryptobyte.Builder) { + mapping.AddASN1ObjectIdentifier(testOID5) + mapping.AddASN1ObjectIdentifier(testOID5) + }) + }) + intermediateMapped := intermediate + intermediateMapped.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID1, testOID2, testOID3, testOID4, testOID5} + intermediateMapped.template.ExtraExtensions = []pkix.Extension{{Id: policyMappingsOID, Value: b.BytesOrPanic()}} + mustGenerateCertificate("policy_intermediate_mapped.pem", &intermediateMapped, &root) + + intermediateMapped.template.PolicyIdentifiers = []asn1.ObjectIdentifier{anyPolicyOID} + mustGenerateCertificate("policy_intermediate_mapped_any.pem", &intermediateMapped, &root) + + intermediateMapped.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID3} + mustGenerateCertificate("policy_intermediate_mapped_oid3.pem", &intermediateMapped, &root) + + // Leaves which assert more specific OIDs, to test intermediate_mapped. + leafSingle := leaf + leafSingle.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID1} + mustGenerateCertificate("policy_leaf_oid1.pem", &leafSingle, &intermediate) + leafSingle.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID2} + mustGenerateCertificate("policy_leaf_oid2.pem", &leafSingle, &intermediate) + leafSingle.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID3} + mustGenerateCertificate("policy_leaf_oid3.pem", &leafSingle, &intermediate) + leafSingle.template.PolicyIdentifiers = []asn1.ObjectIdentifier{testOID4} + mustGenerateCertificate("policy_leaf_oid4.pem", &leafSingle, &intermediate) + 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) + b.AddASN1(cbasn1.SEQUENCE, func(seq *cryptobyte.Builder) { + seq.AddASN1Int64WithTag(0, cbasn1.Tag(1).ContextSpecific()) + }) + inhibitPolicyMapping0 := b.BytesOrPanic() + + inhibitMapping := root + inhibitMapping.template.PolicyIdentifiers = []asn1.ObjectIdentifier{anyPolicyOID} + inhibitMapping.template.ExtraExtensions = []pkix.Extension{{Id: policyConstraintsOID, Value: inhibitPolicyMapping0}} + mustGenerateCertificate("policy_root_cross_inhibit_mapping.pem", &inhibitMapping, &root2) +} + +const leafKeyPEM = `-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgoPUXNXuH9mgiS/nk +024SYxryxMa3CyGJldiHymLxSquhRANCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5 +w8u3SSwm7HZREvmcBCJBjVIREacRqI0umhzR2V5NLzBBP9yPD/A+Ch5X +-----END PRIVATE KEY-----` + +const intermediateKeyPEM = `-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWHKCKgY058ahE3t6 +vpxVQgzlycgCVMogwjK0y3XMNfWhRANCAATiOnyojN4xS5C8gJ/PHL5cOEsMbsoE +Y6KT9xRQSh8lEL4d1Vb36kqUgkpqedEImo0Og4Owk6VWVVR/m4Lk+yUw +-----END PRIVATE KEY-----` + +const rootKeyPEM = `-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBwND/eHytW0I417J +Hr+qcPlp5N1jM3ACXys57bPujg+hRANCAAQmdqXYl1GvY7y3jcTTK6MVXIQr44Tq +ChRYI6IeV9tIB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAPEPSJwPndjolt +-----END PRIVATE KEY-----` + +func mustParseECDSAKey(in string) *ecdsa.PrivateKey { + keyBlock, _ := pem.Decode([]byte(in)) + if keyBlock == nil || keyBlock.Type != "PRIVATE KEY" { + panic("could not decode private key") + } + key, err := x509.ParsePKCS8PrivateKey(keyBlock.Bytes) + if err != nil { + panic(err) + } + return key.(*ecdsa.PrivateKey) +} diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate.pem new file mode 100644 index 000000000000..759deb4c43a6 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBqjCCAVGgAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjgYUwgYIwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQM +MAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJDS9/4O7qhr +CIRhwsXrPVBagG2uMCsGA1UdIAQkMCIwDwYNKoZIhvcSBAGEtwkCATAPBg0qhkiG +9xIEAYS3CQICMAoGCCqGSM49BAMCA0cAMEQCIFN2ZtknXQ9vz23qD1ecprC9iIo7 +j/SI42Ub64qZQaraAiA+CRCWJz/l+NQ1+TPWYDDWY6Wh2L9Wbddh1Nj5KJEkhQ== +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_any.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_any.pem new file mode 100644 index 000000000000..0931964f520b --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_any.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBkDCCATWgAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjajBoMA4GA1UdDwEB/wQEAwICBDATBgNVHSUEDDAK +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSQ0vf+Du6oawiE +YcLF6z1QWoBtrjARBgNVHSAECjAIMAYGBFUdIAAwCgYIKoZIzj0EAwIDSQAwRgIh +AJbyXshUwjsFCiqrJkg91GzJdhZZ+3WXOekCJgi8uEESAiEAhv4sEE0wRRqgHDjl +vIt26IELfFE2Z/FBF3ihGmi6NoI= +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_duplicate.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_duplicate.pem new file mode 100644 index 000000000000..0eafe8d86a88 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_duplicate.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBvDCCAWKgAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjgZYwgZMwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQM +MAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJDS9/4O7qhr +CIRhwsXrPVBagG2uMDwGA1UdIAQ1MDMwDwYNKoZIhvcSBAGEtwkCATAPBg0qhkiG +9xIEAYS3CQICMA8GDSqGSIb3EgQBhLcJAgIwCgYIKoZIzj0EAwIDSAAwRQIgUpG6 +FUeWrC62BtTPHiSlWBdnLWUYH0llS6uYUkpJFJECIQCWfhoZYXvHdMhgBDSI/vzY +Sw4uNdcMxrC2kP6lIioUSw== +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_invalid.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_invalid.pem new file mode 100644 index 000000000000..11c95afcea48 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_invalid.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBjDCCATKgAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjZzBlMA4GA1UdDwEB/wQEAwICBDATBgNVHSUEDDAK +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSQ0vf+Du6oawiE +YcLF6z1QWoBtrjAOBgNVHSAEB0lOVkFMSUQwCgYIKoZIzj0EAwIDSAAwRQIgS2uK +cYlZ1bxeqgMy3X0Sfi0arAnqpePsAqAeEf+HJHQCIQDwfCnXrWyHET9lM/gJSkfN +j/JRJvJELDrAMVewCxZWKA== +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_mapped.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_mapped.pem new file mode 100644 index 000000000000..fa45e604b43a --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_mapped.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICrjCCAlSgAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjggGHMIIBgzAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUkNL3/g7u +qGsIhGHCxes9UFqAba4wXgYDVR0gBFcwVTAPBg0qhkiG9xIEAYS3CQIBMA8GDSqG +SIb3EgQBhLcJAgIwDwYNKoZIhvcSBAGEtwkCAzAPBg0qhkiG9xIEAYS3CQIEMA8G +DSqGSIb3EgQBhLcJAgUwgcsGA1UdIQSBwzCBwDAeBg0qhkiG9xIEAYS3CQIDBg0q +hkiG9xIEAYS3CQIBMB4GDSqGSIb3EgQBhLcJAgMGDSqGSIb3EgQBhLcJAgIwHgYN +KoZIhvcSBAGEtwkCBAYNKoZIhvcSBAGEtwkCBDAeBg0qhkiG9xIEAYS3CQIEBg0q +hkiG9xIEAYS3CQIFMB4GDSqGSIb3EgQBhLcJAgUGDSqGSIb3EgQBhLcJAgQwHgYN +KoZIhvcSBAGEtwkCBQYNKoZIhvcSBAGEtwkCBTAKBggqhkjOPQQDAgNIADBFAiAe +Ah2vJMZsW/RV35mM7b7/NjsjScjPEIxfDJu49inNXQIhANmGBqyWUogh/gXyVB0/ +IfDro27pANW3R02A+zH34q5k +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_mapped_any.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_mapped_any.pem new file mode 100644 index 000000000000..ae47bf45ceae --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_mapped_any.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICYjCCAgegAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjggE6MIIBNjAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUkNL3/g7u +qGsIhGHCxes9UFqAba4wEQYDVR0gBAowCDAGBgRVHSAAMIHLBgNVHSEEgcMwgcAw +HgYNKoZIhvcSBAGEtwkCAwYNKoZIhvcSBAGEtwkCATAeBg0qhkiG9xIEAYS3CQID +Bg0qhkiG9xIEAYS3CQICMB4GDSqGSIb3EgQBhLcJAgQGDSqGSIb3EgQBhLcJAgQw +HgYNKoZIhvcSBAGEtwkCBAYNKoZIhvcSBAGEtwkCBTAeBg0qhkiG9xIEAYS3CQIF +Bg0qhkiG9xIEAYS3CQIEMB4GDSqGSIb3EgQBhLcJAgUGDSqGSIb3EgQBhLcJAgUw +CgYIKoZIzj0EAwIDSQAwRgIhAIOx3GL5xlldQGdTLIvTTAvczm8wiYHzZDAif2yj +wAjEAiEAg4K02kTYX9x7PC/u1PYdwvo+LVbnGbO6AN6U3K2d7gs= +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_mapped_oid3.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_mapped_oid3.pem new file mode 100644 index 000000000000..c04a38a48f12 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_mapped_oid3.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICajCCAhCgAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjggFDMIIBPzAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUkNL3/g7u +qGsIhGHCxes9UFqAba4wGgYDVR0gBBMwETAPBg0qhkiG9xIEAYS3CQIDMIHLBgNV +HSEEgcMwgcAwHgYNKoZIhvcSBAGEtwkCAwYNKoZIhvcSBAGEtwkCATAeBg0qhkiG +9xIEAYS3CQIDBg0qhkiG9xIEAYS3CQICMB4GDSqGSIb3EgQBhLcJAgQGDSqGSIb3 +EgQBhLcJAgQwHgYNKoZIhvcSBAGEtwkCBAYNKoZIhvcSBAGEtwkCBTAeBg0qhkiG +9xIEAYS3CQIFBg0qhkiG9xIEAYS3CQIEMB4GDSqGSIb3EgQBhLcJAgUGDSqGSIb3 +EgQBhLcJAgUwCgYIKoZIzj0EAwIDSAAwRQIhAK0bRaGgd5qQlX+zTw3IUynFHxfk +zRbZagnTzjYtkNNmAiBJ2kOnvRdW930eHAwZPGpc1Hn5hMSOQdUhNZ3XZDASkQ== +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require.pem new file mode 100644 index 000000000000..5cf5d5bfe623 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBuDCCAV+gAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjgZMwgZAwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQM +MAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJDS9/4O7qhr +CIRhwsXrPVBagG2uMCsGA1UdIAQkMCIwDwYNKoZIhvcSBAGEtwkCATAPBg0qhkiG +9xIEAYS3CQICMAwGA1UdJAQFMAOAAQAwCgYIKoZIzj0EAwIDRwAwRAIgbPUZ9ezH +SgTqom7VLPOvrQQXwy3b/ijSobs7+SOouKMCIDaqcb9143BG005etqeTvlgUyOGF +GQDWhiW8bizH+KEl +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require1.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require1.pem new file mode 100644 index 000000000000..7087404b3f11 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require1.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBujCCAV+gAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjgZMwgZAwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQM +MAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJDS9/4O7qhr +CIRhwsXrPVBagG2uMCsGA1UdIAQkMCIwDwYNKoZIhvcSBAGEtwkCATAPBg0qhkiG +9xIEAYS3CQICMAwGA1UdJAQFMAOAAQEwCgYIKoZIzj0EAwIDSQAwRgIhAIAwvhHB +GQDN5YXlidd+n3OT/SqoeXfp7RiEonBnCkW4AiEA+iFc47EOBchHb+Gy0gg8F9Po +RnlpoulWDfbDwx9r4lc= +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require2.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require2.pem new file mode 100644 index 000000000000..350f41919879 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require2.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBuTCCAV+gAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjgZMwgZAwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQM +MAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJDS9/4O7qhr +CIRhwsXrPVBagG2uMCsGA1UdIAQkMCIwDwYNKoZIhvcSBAGEtwkCATAPBg0qhkiG +9xIEAYS3CQICMAwGA1UdJAQFMAOAAQIwCgYIKoZIzj0EAwIDSAAwRQIgOpliSKKA ++wy/auQnKKl+wwtn/hGw6eZXgIOtFgDmyMYCIQC84zoJL87AE64gsrdX4XSHq6lb +WhZQp9ZnDaNu88SQLQ== +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require_duplicate.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require_duplicate.pem new file mode 100644 index 000000000000..733087af91c1 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require_duplicate.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIByjCCAXCgAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjgaQwgaEwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQM +MAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJDS9/4O7qhr +CIRhwsXrPVBagG2uMDwGA1UdIAQ1MDMwDwYNKoZIhvcSBAGEtwkCATAPBg0qhkiG +9xIEAYS3CQICMA8GDSqGSIb3EgQBhLcJAgIwDAYDVR0kBAUwA4ABADAKBggqhkjO +PQQDAgNIADBFAiA2GxzMRYYo7NNq8u/ZvffXkCj/phqXQ8I64tEDd0X8pgIhAOJJ +e+dzzf4vbWfMlYkOQ4kf6ei5Zf+J2PL6VrqVrHQa +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require_no_policies.pem b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require_no_policies.pem new file mode 100644 index 000000000000..1e81e0c1165d --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_intermediate_require_no_policies.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBizCCATCgAwIBAgIBAjAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowHjEcMBoGA1UE +AxMTUG9saWN5IEludGVybWVkaWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BOI6fKiM3jFLkLyAn88cvlw4SwxuygRjopP3FFBKHyUQvh3VVvfqSpSCSmp50Qia +jQ6Dg7CTpVZVVH+bguT7JTCjZTBjMA4GA1UdDwEB/wQEAwICBDATBgNVHSUEDDAK +BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSQ0vf+Du6oawiE +YcLF6z1QWoBtrjAMBgNVHSQEBTADgAEAMAoGCCqGSM49BAMCA0kAMEYCIQDJYPgf +50fFDVho5TFeqkNVONx0ArVNgULPB27yPDHLrwIhAN+eua6oM4Q/O0jUESQ4VAKt +ts7ZCquTZbvgRgyqtjuT +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf.pem new file mode 100644 index 000000000000..fb70306c8a61 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBpzCCAU2gAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo34wfDAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAaBgNVHREEEzARgg93d3cuZXhh +bXBsZS5jb20wKwYDVR0gBCQwIjAPBg0qhkiG9xIEAYS3CQIBMA8GDSqGSIb3EgQB +hLcJAgIwCgYIKoZIzj0EAwIDSAAwRQIgBEOriD1N3/cqoAofxEtf73M7Wi4UfjFK +jiU9nQhwnnoCIQD1v/XDp2BkWNHxNq7TaPnil3xXTvMX97yUbkUg8IRo0w== +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_any.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_any.pem new file mode 100644 index 000000000000..d2c1b9e9555d --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_any.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBjTCCATOgAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo2QwYjAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAaBgNVHREEEzARgg93d3cuZXhh +bXBsZS5jb20wEQYDVR0gBAowCDAGBgRVHSAAMAoGCCqGSM49BAMCA0gAMEUCIQC4 +UwAf1R4HefSzyO8lyQ3fmMjkptVEhFBee0a7N12IvwIgJMYZgQ52VTbqXyXqraJ8 +V+y+o7eHds7NewqnyuLbc78= +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_duplicate.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_duplicate.pem new file mode 100644 index 000000000000..bdeb13cbd68e --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_duplicate.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBsTCCAVigAwIBAgIBAzAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowGjEYMBYGA1UE +AxMPd3d3LmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkSrY +vFVtkZJmvirfY0JDDYrZQrNJecPLt0ksJux2URL5nAQiQY1SERGnEaiNLpoc0dle +TS8wQT/cjw/wPgoeV6OBkDCBjTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAwwCgYI +KwYBBQUHAwEwDAYDVR0TAQH/BAIwADAaBgNVHREEEzARgg93d3cuZXhhbXBsZS5j +b20wPAYDVR0gBDUwMzAPBg0qhkiG9xIEAYS3CQIBMA8GDSqGSIb3EgQBhLcJAgIw +DwYNKoZIhvcSBAGEtwkCAjAKBggqhkjOPQQDAgNHADBEAiBjYDwsWcs35hU/wPqa +5gf0QUMvV/8z5LPX14fB2y4RGQIgMw0ekrt9K5UcgkvFupV/XXIjLRFQvc8URA3C +/+w+2/4= +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_invalid.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_invalid.pem new file mode 100644 index 000000000000..de7a5e9b20f7 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_invalid.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBgjCCASigAwIBAgIBAzAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowGjEYMBYGA1UE +AxMPd3d3LmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkSrY +vFVtkZJmvirfY0JDDYrZQrNJecPLt0ksJux2URL5nAQiQY1SERGnEaiNLpoc0dle +TS8wQT/cjw/wPgoeV6NhMF8wDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoGCCsG +AQUFBwMBMAwGA1UdEwEB/wQCMAAwGgYDVR0RBBMwEYIPd3d3LmV4YW1wbGUuY29t +MA4GA1UdIAQHSU5WQUxJRDAKBggqhkjOPQQDAgNIADBFAiAgfcDIeqmV+u5YtUe4 +aBnj13tZAJAQh6ttum1xZ+xHEgIhAJqvGX5c0/d1qYelBlm/jE3UuivijdEjVsLX +GVH+X1VA +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_none.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_none.pem new file mode 100644 index 000000000000..13ad7cec0175 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid1.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid1.pem new file mode 100644 index 000000000000..94cd1a77b45f --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid1.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBlTCCATygAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo20wazAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAaBgNVHREEEzARgg93d3cuZXhh +bXBsZS5jb20wGgYDVR0gBBMwETAPBg0qhkiG9xIEAYS3CQIBMAoGCCqGSM49BAMC +A0cAMEQCIHh4Bo8l/HVJhLMWcYusPOE0arqoDrJ5E0M6nEi3nRhgAiAArK8bBohG +fZ3DmVMq/2BJtQZwRRj+50VKWuf9mBSflQ== +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid2.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid2.pem new file mode 100644 index 000000000000..10adf86c5213 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid2.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBlzCCATygAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo20wazAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAaBgNVHREEEzARgg93d3cuZXhh +bXBsZS5jb20wGgYDVR0gBBMwETAPBg0qhkiG9xIEAYS3CQICMAoGCCqGSM49BAMC +A0kAMEYCIQDvW7rdL6MSW/0BPNET4hEeECO6LWmZZHKCHIu6o33dsAIhAPwgm6lD +KV2hMOxkE6rBDQzlCr+zAkQrxSzQZqJp5p+W +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid3.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid3.pem new file mode 100644 index 000000000000..e5c103151bd8 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid3.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBlzCCATygAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo20wazAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAaBgNVHREEEzARgg93d3cuZXhh +bXBsZS5jb20wGgYDVR0gBBMwETAPBg0qhkiG9xIEAYS3CQIDMAoGCCqGSM49BAMC +A0kAMEYCIQDBPnPpRsOH20ncg8TKUdlONfbO62WafQj9SKgyi/nGBQIhAMhT8J7f +fTEou6jlAilaIQwlAgZzVKRqgghIHezFY86T +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid4.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid4.pem new file mode 100644 index 000000000000..7dd7a547af20 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid4.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBlzCCATygAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo20wazAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAaBgNVHREEEzARgg93d3cuZXhh +bXBsZS5jb20wGgYDVR0gBBMwETAPBg0qhkiG9xIEAYS3CQIEMAoGCCqGSM49BAMC +A0kAMEYCIQD2gnpCTMxUalCtEV52eXzqeJgsKMYvEpJTuU/VqH5KwQIhAPEavAkt +cSJsgMgJcJnbBzAdSrbOgHXF2etDHmFbg0hz +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid5.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid5.pem new file mode 100644 index 000000000000..2a9aee73b59f --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_oid5.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBlzCCATygAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo20wazAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0l +BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAaBgNVHREEEzARgg93d3cuZXhh +bXBsZS5jb20wGgYDVR0gBBMwETAPBg0qhkiG9xIEAYS3CQIFMAoGCCqGSM49BAMC +A0kAMEYCIQDDFVjhlQ1Wu0KITcRX8kELpVDeYSKSlvEbZc3rn1QjkQIhAMPthqBi +I0acz8DPQcdFmHXV0xR2xyC1yuen0gES5WLR +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_require.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_require.pem new file mode 100644 index 000000000000..169b8444199e --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_require.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBuDCCAV2gAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GNMIGKMA4GA1UdDwEB/wQEAwICBDATBgNV +HSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBoGA1UdEQQTMBGCD3d3dy5l +eGFtcGxlLmNvbTArBgNVHSAEJDAiMA8GDSqGSIb3EgQBhLcJAgEwDwYNKoZIhvcS +BAGEtwkCAjAMBgNVHSQEBTADgAEAMAoGCCqGSM49BAMCA0kAMEYCIQDrNQPi/mdK +l7Nd/YmMXWYTHJBWWin1zA64Ohkd7z4jGgIhAJpw/umk5MxS1MwSi+YTkkcSQKpl +YROQH6+T53DauoW6 +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_leaf_require1.pem b/third_party/boringssl/src/crypto/x509/test/policy_leaf_require1.pem new file mode 100644 index 000000000000..261ef954f12a --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_leaf_require1.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBuDCCAV2gAwIBAgIBAzAKBggqhkjOPQQDAjAeMRwwGgYDVQQDExNQb2xpY3kg +SW50ZXJtZWRpYXRlMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAa +MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMB +BwNCAASRKti8VW2Rkma+Kt9jQkMNitlCs0l5w8u3SSwm7HZREvmcBCJBjVIREacR +qI0umhzR2V5NLzBBP9yPD/A+Ch5Xo4GNMIGKMA4GA1UdDwEB/wQEAwICBDATBgNV +HSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBoGA1UdEQQTMBGCD3d3dy5l +eGFtcGxlLmNvbTArBgNVHSAEJDAiMA8GDSqGSIb3EgQBhLcJAgEwDwYNKoZIhvcS +BAGEtwkCAjAMBgNVHSQEBTADgAEBMAoGCCqGSM49BAMCA0kAMEYCIQCtXENGJrKv +IOeLHO/3Nu/SMRXc69Vb3q+4b/uHBFbuqwIhAK22Wfh/ZIHKu3FwbjL+sN0Z39pf +Dsak6fp1y4tqNuvK +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_root.pem b/third_party/boringssl/src/crypto/x509/test/policy_root.pem new file mode 100644 index 000000000000..595f8a132a50 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_root.pem @@ -0,0 +1,10 @@ +-----BEGIN CERTIFICATE----- +MIIBdTCCARqgAwIBAgIBATAKBggqhkjOPQQDAjAWMRQwEgYDVQQDEwtQb2xpY3kg +Um9vdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowFjEUMBIGA1UE +AxMLUG9saWN5IFJvb3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQmdqXYl1Gv +Y7y3jcTTK6MVXIQr44TqChRYI6IeV9tIB6jIsOY+Qol1bk8x/7A5FGOnUWFVLEAP +EPSJwPndjolto1cwVTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUH +AwEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU0GnnoB+yeN63WMthnh6Uh1HH +dRIwCgYIKoZIzj0EAwIDSQAwRgIhAKVxVAaJnmvt+q4SqegGS23QSzKPM9Yakw9e +bOUU9+52AiEAjXPRBdd90YDey4VFu4f/78yVe0cxMK30lll7lLl7TTA= +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_root2.pem b/third_party/boringssl/src/crypto/x509/test/policy_root2.pem new file mode 100644 index 000000000000..1350035fd462 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_root2.pem @@ -0,0 +1,10 @@ +-----BEGIN CERTIFICATE----- +MIIBeDCCAR6gAwIBAgIBATAKBggqhkjOPQQDAjAYMRYwFAYDVQQDEw1Qb2xpY3kg +Um9vdCAyMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAYMRYwFAYD +VQQDEw1Qb2xpY3kgUm9vdCAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJnal +2JdRr2O8t43E0yujFVyEK+OE6goUWCOiHlfbSAeoyLDmPkKJdW5PMf+wORRjp1Fh +VSxADxD0icD53Y6JbaNXMFUwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoGCCsG +AQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNBp56Afsnjet1jLYZ4e +lIdRx3USMAoGCCqGSM49BAMCA0gAMEUCIQDm9rw9ODVtJUPBn2lWoK8s7ElbyY4/ +Gc2thHR50UUzbgIgKRenEDhKiBR6cGC77RaIiaaafW8b7HMd7obuZdDU/58= +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/test/policy_root_cross_inhibit_mapping.pem b/third_party/boringssl/src/crypto/x509/test/policy_root_cross_inhibit_mapping.pem new file mode 100644 index 000000000000..9273a53086f0 --- /dev/null +++ b/third_party/boringssl/src/crypto/x509/test/policy_root_cross_inhibit_mapping.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBljCCAT2gAwIBAgIBATAKBggqhkjOPQQDAjAYMRYwFAYDVQQDEw1Qb2xpY3kg +Um9vdCAyMCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAWMRQwEgYD +VQQDEwtQb2xpY3kgUm9vdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCZ2pdiX +Ua9jvLeNxNMroxVchCvjhOoKFFgjoh5X20gHqMiw5j5CiXVuTzH/sDkUY6dRYVUs +QA8Q9InA+d2OiW2jeDB2MA4GA1UdDwEB/wQEAwICBDATBgNVHSUEDDAKBggrBgEF +BQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTQaeegH7J43rdYy2GeHpSH +Ucd1EjARBgNVHSAECjAIMAYGBFUdIAAwDAYDVR0kBAUwA4EBADAKBggqhkjOPQQD +AgNHADBEAiBzR3JGEf9PITYuiXTx+vx9gXji5idGsVog9wRUbY98wwIgVVeYNQQb +x+RN2wYp3kmm8iswUOrqiI6J4PSzT8CYP8Q= +-----END CERTIFICATE----- diff --git a/third_party/boringssl/src/crypto/x509/x509_att.c b/third_party/boringssl/src/crypto/x509/x509_att.c index d1c8f56045de..23e92f294b2d 100644 --- a/third_party/boringssl/src/crypto/x509/x509_att.c +++ b/third_party/boringssl/src/crypto/x509/x509_att.c @@ -1,4 +1,3 @@ -/* crypto/x509/x509_att.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -57,155 +56,13 @@ #include #include -#include #include -#include #include #include "../asn1/internal.h" #include "internal.h" -int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x) { - return sk_X509_ATTRIBUTE_num(x); -} - -int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, - int lastpos) { - const ASN1_OBJECT *obj = OBJ_nid2obj(nid); - if (obj == NULL) { - return -1; - } - return X509at_get_attr_by_OBJ(x, obj, lastpos); -} - -int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, - const ASN1_OBJECT *obj, int lastpos) { - int n; - X509_ATTRIBUTE *ex; - - if (sk == NULL) { - return -1; - } - lastpos++; - if (lastpos < 0) { - lastpos = 0; - } - n = sk_X509_ATTRIBUTE_num(sk); - for (; lastpos < n; lastpos++) { - ex = sk_X509_ATTRIBUTE_value(sk, lastpos); - if (OBJ_cmp(ex->object, obj) == 0) { - return lastpos; - } - } - return -1; -} - -X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc) { - if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t)loc) { - return NULL; - } else { - return sk_X509_ATTRIBUTE_value(x, loc); - } -} - -X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc) { - X509_ATTRIBUTE *ret; - - if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t)loc) { - return NULL; - } - ret = sk_X509_ATTRIBUTE_delete(x, loc); - return ret; -} - -STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, - X509_ATTRIBUTE *attr) { - X509_ATTRIBUTE *new_attr = NULL; - STACK_OF(X509_ATTRIBUTE) *sk = NULL; - - if (x == NULL) { - OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER); - goto err2; - } - - if (*x == NULL) { - if ((sk = sk_X509_ATTRIBUTE_new_null()) == NULL) { - goto err; - } - } else { - sk = *x; - } - - if ((new_attr = X509_ATTRIBUTE_dup(attr)) == NULL) { - goto err2; - } - if (!sk_X509_ATTRIBUTE_push(sk, new_attr)) { - goto err; - } - if (*x == NULL) { - *x = sk; - } - return sk; -err: - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); -err2: - if (new_attr != NULL) { - X509_ATTRIBUTE_free(new_attr); - } - if (sk != NULL) { - sk_X509_ATTRIBUTE_free(sk); - } - return NULL; -} - -STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x, - const ASN1_OBJECT *obj, - int type, - const unsigned char *bytes, - int len) { - X509_ATTRIBUTE *attr; - STACK_OF(X509_ATTRIBUTE) *ret; - attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, type, bytes, len); - if (!attr) { - return 0; - } - ret = X509at_add1_attr(x, attr); - X509_ATTRIBUTE_free(attr); - return ret; -} - -STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x, - int nid, int type, - const unsigned char *bytes, - int len) { - X509_ATTRIBUTE *attr; - STACK_OF(X509_ATTRIBUTE) *ret; - attr = X509_ATTRIBUTE_create_by_NID(NULL, nid, type, bytes, len); - if (!attr) { - return 0; - } - ret = X509at_add1_attr(x, attr); - X509_ATTRIBUTE_free(attr); - return ret; -} - -STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x, - const char *attrname, - int type, - const unsigned char *bytes, - int len) { - X509_ATTRIBUTE *attr; - STACK_OF(X509_ATTRIBUTE) *ret; - attr = X509_ATTRIBUTE_create_by_txt(NULL, attrname, type, bytes, len); - if (!attr) { - return 0; - } - ret = X509at_add1_attr(x, attr); - X509_ATTRIBUTE_free(attr); - return ret; -} - X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, int attrtype, const void *data, int len) { @@ -227,7 +84,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 { @@ -327,7 +183,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/third_party/boringssl/src/crypto/x509/x509_cmp.c b/third_party/boringssl/src/crypto/x509/x509_cmp.c index c9966e9ad017..b696b9491ed1 100644 --- a/third_party/boringssl/src/crypto/x509/x509_cmp.c +++ b/third_party/boringssl/src/crypto/x509/x509_cmp.c @@ -1,4 +1,3 @@ -/* crypto/x509/x509_cmp.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -285,10 +284,11 @@ 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) { + 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/third_party/boringssl/src/crypto/x509/x509_d2.c b/third_party/boringssl/src/crypto/x509/x509_d2.c index da08f244e2ae..748bd88acdf5 100644 --- a/third_party/boringssl/src/crypto/x509/x509_d2.c +++ b/third_party/boringssl/src/crypto/x509/x509_d2.c @@ -1,4 +1,3 @@ -/* crypto/x509/x509_d2.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/crypto/x509/x509_def.c b/third_party/boringssl/src/crypto/x509/x509_def.c index a6489c62d758..1721da5d993a 100644 --- a/third_party/boringssl/src/crypto/x509/x509_def.c +++ b/third_party/boringssl/src/crypto/x509/x509_def.c @@ -1,4 +1,3 @@ -/* crypto/x509/x509_def.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/crypto/x509/x509_ext.c b/third_party/boringssl/src/crypto/x509/x509_ext.c index 8ab1926d2355..a8f561d44589 100644 --- a/third_party/boringssl/src/crypto/x509/x509_ext.c +++ b/third_party/boringssl/src/crypto/x509/x509_ext.c @@ -1,4 +1,3 @@ -/* crypto/x509/x509_ext.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/crypto/x509/x509_lu.c b/third_party/boringssl/src/crypto/x509/x509_lu.c index d02aef8f9092..cd4ed1247e20 100644 --- a/third_party/boringssl/src/crypto/x509/x509_lu.c +++ b/third_party/boringssl/src/crypto/x509/x509_lu.c @@ -1,4 +1,3 @@ -/* crypto/x509/x509_lu.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -141,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) { @@ -170,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; } @@ -321,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; } @@ -426,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)++; @@ -544,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/third_party/boringssl/src/crypto/x509/x509_obj.c b/third_party/boringssl/src/crypto/x509/x509_obj.c index d247314e58e0..ed6dcc66364d 100644 --- a/third_party/boringssl/src/crypto/x509/x509_obj.c +++ b/third_party/boringssl/src/crypto/x509/x509_obj.c @@ -1,4 +1,3 @@ -/* crypto/x509/x509_obj.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -120,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; @@ -156,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)) { @@ -202,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/third_party/boringssl/src/crypto/x509/x509_req.c b/third_party/boringssl/src/crypto/x509/x509_req.c index 6cd250d0d690..69eb63c2716a 100644 --- a/third_party/boringssl/src/crypto/x509/x509_req.c +++ b/third_party/boringssl/src/crypto/x509/x509_req.c @@ -1,4 +1,3 @@ -/* crypto/x509/x509_req.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -65,6 +64,7 @@ #include #include +#include "../asn1/internal.h" #include "internal.h" @@ -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); } @@ -165,62 +160,111 @@ int X509_REQ_add_extensions(X509_REQ *req, return X509_REQ_add_extensions_nid(req, exts, NID_ext_req); } -// Request attribute functions - int X509_REQ_get_attr_count(const X509_REQ *req) { - return X509at_get_attr_count(req->req_info->attributes); + return sk_X509_ATTRIBUTE_num(req->req_info->attributes); } int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos) { - return X509at_get_attr_by_NID(req->req_info->attributes, nid, lastpos); + const ASN1_OBJECT *obj = OBJ_nid2obj(nid); + if (obj == NULL) { + return -1; + } + return X509_REQ_get_attr_by_OBJ(req, obj, lastpos); } int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj, int lastpos) { - return X509at_get_attr_by_OBJ(req->req_info->attributes, obj, lastpos); + if (req->req_info->attributes == NULL) { + return -1; + } + lastpos++; + if (lastpos < 0) { + lastpos = 0; + } + int n = sk_X509_ATTRIBUTE_num(req->req_info->attributes); + for (; lastpos < n; lastpos++) { + const X509_ATTRIBUTE *attr = + sk_X509_ATTRIBUTE_value(req->req_info->attributes, lastpos); + if (OBJ_cmp(attr->object, obj) == 0) { + return lastpos; + } + } + return -1; } X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc) { - return X509at_get_attr(req->req_info->attributes, loc); + if (req->req_info->attributes == NULL || loc < 0 || + sk_X509_ATTRIBUTE_num(req->req_info->attributes) <= (size_t)loc) { + return NULL; + } + return sk_X509_ATTRIBUTE_value(req->req_info->attributes, loc); } X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc) { - return X509at_delete_attr(req->req_info->attributes, loc); + if (req->req_info->attributes == NULL || loc < 0 || + sk_X509_ATTRIBUTE_num(req->req_info->attributes) <= (size_t)loc) { + return NULL; + } + return sk_X509_ATTRIBUTE_delete(req->req_info->attributes, loc); } -int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr) { - if (X509at_add1_attr(&req->req_info->attributes, attr)) { - return 1; +static int X509_REQ_add0_attr(X509_REQ *req, X509_ATTRIBUTE *attr) { + if (req->req_info->attributes == NULL) { + req->req_info->attributes = sk_X509_ATTRIBUTE_new_null(); + } + if (req->req_info->attributes == NULL || + !sk_X509_ATTRIBUTE_push(req->req_info->attributes, attr)) { + return 0; } - return 0; + + return 1; +} + +int X509_REQ_add1_attr(X509_REQ *req, const X509_ATTRIBUTE *attr) { + X509_ATTRIBUTE *new_attr = X509_ATTRIBUTE_dup(attr); + if (new_attr == NULL || !X509_REQ_add0_attr(req, new_attr)) { + X509_ATTRIBUTE_free(new_attr); + return 0; + } + + return 1; } int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, const ASN1_OBJECT *obj, int attrtype, const unsigned char *data, int len) { - if (X509at_add1_attr_by_OBJ(&req->req_info->attributes, obj, attrtype, data, - len)) { - return 1; + X509_ATTRIBUTE *attr = + X509_ATTRIBUTE_create_by_OBJ(NULL, obj, attrtype, data, len); + if (attr == NULL || !X509_REQ_add0_attr(req, attr)) { + X509_ATTRIBUTE_free(attr); + return 0; } - return 0; + + return 1; } int X509_REQ_add1_attr_by_NID(X509_REQ *req, int nid, int attrtype, const unsigned char *data, int len) { - if (X509at_add1_attr_by_NID(&req->req_info->attributes, nid, attrtype, data, - len)) { - return 1; + X509_ATTRIBUTE *attr = + X509_ATTRIBUTE_create_by_NID(NULL, nid, attrtype, data, len); + if (attr == NULL || !X509_REQ_add0_attr(req, attr)) { + X509_ATTRIBUTE_free(attr); + return 0; } - return 0; + + return 1; } int X509_REQ_add1_attr_by_txt(X509_REQ *req, const char *attrname, int attrtype, const unsigned char *data, int len) { - if (X509at_add1_attr_by_txt(&req->req_info->attributes, attrname, attrtype, - data, len)) { - return 1; + X509_ATTRIBUTE *attr = + X509_ATTRIBUTE_create_by_txt(NULL, attrname, attrtype, data, len); + if (attr == NULL || !X509_REQ_add0_attr(req, attr)) { + X509_ATTRIBUTE_free(attr); + return 0; } - return 0; + + return 1; } void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, @@ -238,6 +282,6 @@ int X509_REQ_get_signature_nid(const X509_REQ *req) { } int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp) { - req->req_info->enc.modified = 1; + asn1_encoding_clear(&req->req_info->enc); return i2d_X509_REQ_INFO(req->req_info, pp); } diff --git a/third_party/boringssl/src/crypto/x509/x509_test.cc b/third_party/boringssl/src/crypto/x509/x509_test.cc index bdb92ac7983f..7913a67807ba 100644 --- a/third_party/boringssl/src/crypto/x509/x509_test.cc +++ b/third_party/boringssl/src/crypto/x509/x509_test.cc @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,10 @@ #include "../test/test_util.h" #include "../x509v3/internal.h" +#if defined(OPENSSL_THREADS) +#include +#endif + std::string GetTestData(const char *path); @@ -1094,14 +1099,13 @@ 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, const std::vector &intermediates, const std::vector &crls, unsigned long flags = 0, - std::function configure_callback = nullptr, - int (*verify_callback)(int, X509_STORE_CTX *) = nullptr) { + std::function configure_callback = nullptr) { bssl::UniquePtr roots_stack(CertsToStack(roots)); bssl::UniquePtr intermediates_stack( CertsToStack(intermediates)); @@ -1129,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); } @@ -1247,6 +1251,31 @@ TEST(X509Test, TestVerify) { } } +#if defined(OPENSSL_THREADS) +// Verifying the same |X509| objects on two threads should be safe. +TEST(X509Test, VerifyThreads) { + bssl::UniquePtr root(CertFromPEM(kRootCAPEM)); + bssl::UniquePtr intermediate(CertFromPEM(kIntermediatePEM)); + bssl::UniquePtr leaf(CertFromPEM(kLeafPEM)); + ASSERT_TRUE(root); + ASSERT_TRUE(intermediate); + ASSERT_TRUE(leaf); + + const size_t kNumThreads = 10; + std::vector threads; + for (size_t i = 0; i < kNumThreads; i++) { + threads.emplace_back([&] { + EXPECT_EQ(X509_V_OK, + Verify(leaf.get(), {root.get()}, {intermediate.get()}, + /*crls=*/{})); + }); + } + for (auto &thread : threads) { + thread.join(); + } +} +#endif // OPENSSL_THREADS + static const char kHostname[] = "example.com"; static const char kWrongHostname[] = "example2.com"; static const char kEmail[] = "test@example.com"; @@ -1362,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)); @@ -1454,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); })); @@ -1463,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); })); @@ -1880,7 +1910,7 @@ static bool SignatureRoundTrips(EVP_MD_CTX *md_ctx, EVP_PKEY *pkey) { } // Re-encode the certificate. X509 objects contain a cached TBSCertificate - // encoding and |X509_sign_ctx| should have refreshed that cache. + // encoding and |X509_sign_ctx| should have dropped that cache. bssl::UniquePtr copy = ReencodeCertificate(cert.get()); return copy && X509_verify(copy.get(), pkey); } @@ -1943,8 +1973,9 @@ TEST(X509Test, RSASign) { EXPECT_FALSE(X509_sign_ctx(cert.get(), md_ctx.get())); } -// Test the APIs for manually signing a certificate. -TEST(X509Test, RSASignManual) { +// Test the APIs for signing a certificate, particularly whether they correctly +// handle the TBSCertificate cache. +TEST(X509Test, SignCertificate) { const int kSignatureNID = NID_sha384WithRSAEncryption; const EVP_MD *kSignatureHash = EVP_sha384(); @@ -1955,74 +1986,86 @@ TEST(X509Test, RSASignManual) { ASSERT_TRUE(X509_ALGOR_set0(algor.get(), OBJ_nid2obj(kSignatureNID), V_ASN1_NULL, nullptr)); - // Test certificates made both from other certificates and |X509_new|, in case - // there are bugs in filling in fields from different states. (Parsed - // certificates contain a TBSCertificate cache, and |X509_new| initializes - // fields based on complex ASN.1 template logic.) - for (bool new_cert : {true, false}) { - SCOPED_TRACE(new_cert); - - bssl::UniquePtr cert; - if (new_cert) { - cert.reset(X509_new()); - ASSERT_TRUE(cert); - // Fill in some fields for the certificate arbitrarily. - EXPECT_TRUE(X509_set_version(cert.get(), X509_VERSION_3)); - EXPECT_TRUE(ASN1_INTEGER_set_int64(X509_get_serialNumber(cert.get()), 1)); - EXPECT_TRUE(X509_gmtime_adj(X509_getm_notBefore(cert.get()), 0)); - EXPECT_TRUE( - X509_gmtime_adj(X509_getm_notAfter(cert.get()), 60 * 60 * 24)); - X509_NAME *subject = X509_get_subject_name(cert.get()); - X509_NAME_add_entry_by_txt(subject, "CN", MBSTRING_ASC, - reinterpret_cast("Test"), -1, - -1, 0); - EXPECT_TRUE(X509_set_issuer_name(cert.get(), subject)); - EXPECT_TRUE(X509_set_pubkey(cert.get(), pkey.get())); - } else { - // Extract fields from a parsed certificate. - cert = CertFromPEM(kLeafPEM); - ASSERT_TRUE(cert); + // Test both signing with |X509_sign| and constructing a signature manually. + for (bool sign_manual : {true, false}) { + SCOPED_TRACE(sign_manual); + + // Test certificates made both from other certificates and |X509_new|, in + // case there are bugs in filling in fields from different states. (Parsed + // certificates contain a TBSCertificate cache, and |X509_new| initializes + // fields based on complex ASN.1 template logic.) + for (bool new_cert : {true, false}) { + SCOPED_TRACE(new_cert); + + bssl::UniquePtr cert; + if (new_cert) { + cert.reset(X509_new()); + ASSERT_TRUE(cert); + // Fill in some fields for the certificate arbitrarily. + EXPECT_TRUE(X509_set_version(cert.get(), X509_VERSION_3)); + EXPECT_TRUE( + ASN1_INTEGER_set_int64(X509_get_serialNumber(cert.get()), 1)); + EXPECT_TRUE(X509_gmtime_adj(X509_getm_notBefore(cert.get()), 0)); + EXPECT_TRUE( + X509_gmtime_adj(X509_getm_notAfter(cert.get()), 60 * 60 * 24)); + X509_NAME *subject = X509_get_subject_name(cert.get()); + X509_NAME_add_entry_by_txt(subject, "CN", MBSTRING_ASC, + reinterpret_cast("Test"), + -1, -1, 0); + EXPECT_TRUE(X509_set_issuer_name(cert.get(), subject)); + EXPECT_TRUE(X509_set_pubkey(cert.get(), pkey.get())); + } else { + // Extract fields from a parsed certificate. + cert = CertFromPEM(kLeafPEM); + ASSERT_TRUE(cert); - // We should test with a different algorithm from what is already in the - // certificate. - EXPECT_NE(kSignatureNID, X509_get_signature_nid(cert.get())); - } + // We should test with a different algorithm from what is already in the + // certificate. + EXPECT_NE(kSignatureNID, X509_get_signature_nid(cert.get())); + } - // Fill in the signature algorithm. - ASSERT_TRUE(X509_set1_signature_algo(cert.get(), algor.get())); - - // Extract the TBSCertificiate. - uint8_t *tbs_cert = nullptr; - int tbs_cert_len = i2d_re_X509_tbs(cert.get(), &tbs_cert); - bssl::UniquePtr free_tbs_cert(tbs_cert); - ASSERT_GT(tbs_cert_len, 0); - - // Generate a signature externally and fill it in. - bssl::ScopedEVP_MD_CTX md_ctx; - ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, kSignatureHash, - nullptr, pkey.get())); - size_t sig_len; - ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, tbs_cert, - tbs_cert_len)); - std::vector sig(sig_len); - ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), sig.data(), &sig_len, tbs_cert, - tbs_cert_len)); - sig.resize(sig_len); - ASSERT_TRUE(X509_set1_signature_value(cert.get(), sig.data(), sig.size())); - - // Check the signature. - EXPECT_TRUE(X509_verify(cert.get(), pkey.get())); + if (sign_manual) { + // Fill in the signature algorithm. + ASSERT_TRUE(X509_set1_signature_algo(cert.get(), algor.get())); + + // Extract the TBSCertificiate. + uint8_t *tbs_cert = nullptr; + int tbs_cert_len = i2d_re_X509_tbs(cert.get(), &tbs_cert); + bssl::UniquePtr free_tbs_cert(tbs_cert); + ASSERT_GT(tbs_cert_len, 0); + + // Generate a signature externally and fill it in. + bssl::ScopedEVP_MD_CTX md_ctx; + ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, kSignatureHash, + nullptr, pkey.get())); + size_t sig_len; + ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, tbs_cert, + tbs_cert_len)); + std::vector sig(sig_len); + ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), sig.data(), &sig_len, tbs_cert, + tbs_cert_len)); + sig.resize(sig_len); + ASSERT_TRUE( + X509_set1_signature_value(cert.get(), sig.data(), sig.size())); + } else { + ASSERT_TRUE(X509_sign(cert.get(), pkey.get(), EVP_sha384())); + } + + // Check the signature. + EXPECT_TRUE(X509_verify(cert.get(), pkey.get())); - // Re-encode the certificate. X509 objects contain a cached TBSCertificate - // encoding and |i2d_re_X509_tbs| should have refreshed that cache. - bssl::UniquePtr copy = ReencodeCertificate(cert.get()); - ASSERT_TRUE(copy); - EXPECT_TRUE(X509_verify(copy.get(), pkey.get())); + // Re-encode the certificate. X509 objects contain a cached TBSCertificate + // encoding and re-signing should have dropped that cache. + bssl::UniquePtr copy = ReencodeCertificate(cert.get()); + ASSERT_TRUE(copy); + EXPECT_TRUE(X509_verify(copy.get(), pkey.get())); + } } } -// Test the APIs for manually signing a CSR. -TEST(X509Test, RSASignCRLManual) { +// Test the APIs for signing a CRL, particularly whether they correctly handle +// the TBSCertList cache. +TEST(X509Test, SignCRL) { const int kSignatureNID = NID_sha384WithRSAEncryption; const EVP_MD *kSignatureHash = EVP_sha384(); @@ -2033,69 +2076,80 @@ TEST(X509Test, RSASignCRLManual) { ASSERT_TRUE(X509_ALGOR_set0(algor.get(), OBJ_nid2obj(kSignatureNID), V_ASN1_NULL, nullptr)); - // Test CRLs made both from other CRLs and |X509_CRL_new|, in case there are - // bugs in filling in fields from different states. (Parsed CRLs contain a - // TBSCertList cache, and |X509_CRL_new| initializes fields based on complex - // ASN.1 template logic.) - for (bool new_crl : {true, false}) { - SCOPED_TRACE(new_crl); - - bssl::UniquePtr crl; - if (new_crl) { - crl.reset(X509_CRL_new()); - ASSERT_TRUE(crl); - // Fill in some fields for the certificate arbitrarily. - 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(X509_CRL_set1_lastUpdate(crl.get(), last_update.get())); - bssl::UniquePtr issuer(X509_NAME_new()); - ASSERT_TRUE(issuer); - ASSERT_TRUE(X509_NAME_add_entry_by_txt( - issuer.get(), "CN", MBSTRING_ASC, - reinterpret_cast("Test"), -1, -1, 0)); - EXPECT_TRUE(X509_CRL_set_issuer_name(crl.get(), issuer.get())); - } else { - // Extract fields from a parsed CRL. - crl = CRLFromPEM(kBasicCRL); - ASSERT_TRUE(crl); + // Test both signing with |X509_CRL_sign| and constructing a signature + // manually. + for (bool sign_manual : {true, false}) { + SCOPED_TRACE(sign_manual); + + // Test CRLs made both from other CRLs and |X509_CRL_new|, in case there are + // bugs in filling in fields from different states. (Parsed CRLs contain a + // TBSCertList cache, and |X509_CRL_new| initializes fields based on complex + // ASN.1 template logic.) + for (bool new_crl : {true, false}) { + SCOPED_TRACE(new_crl); + + bssl::UniquePtr crl; + if (new_crl) { + crl.reset(X509_CRL_new()); + ASSERT_TRUE(crl); + // Fill in some fields for the certificate arbitrarily. + 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_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); + ASSERT_TRUE(X509_NAME_add_entry_by_txt( + issuer.get(), "CN", MBSTRING_ASC, + reinterpret_cast("Test"), -1, -1, 0)); + EXPECT_TRUE(X509_CRL_set_issuer_name(crl.get(), issuer.get())); + } else { + // Extract fields from a parsed CRL. + crl = CRLFromPEM(kBasicCRL); + ASSERT_TRUE(crl); - // We should test with a different algorithm from what is already in the - // CRL. - EXPECT_NE(kSignatureNID, X509_CRL_get_signature_nid(crl.get())); - } + // We should test with a different algorithm from what is already in the + // CRL. + EXPECT_NE(kSignatureNID, X509_CRL_get_signature_nid(crl.get())); + } + + if (sign_manual) { + // Fill in the signature algorithm. + ASSERT_TRUE(X509_CRL_set1_signature_algo(crl.get(), algor.get())); + + // Extract the TBSCertList. + uint8_t *tbs = nullptr; + int tbs_len = i2d_re_X509_CRL_tbs(crl.get(), &tbs); + bssl::UniquePtr free_tbs(tbs); + ASSERT_GT(tbs_len, 0); + + // Generate a signature externally and fill it in. + bssl::ScopedEVP_MD_CTX md_ctx; + ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, kSignatureHash, + nullptr, pkey.get())); + size_t sig_len; + ASSERT_TRUE( + EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, tbs, tbs_len)); + std::vector sig(sig_len); + ASSERT_TRUE( + EVP_DigestSign(md_ctx.get(), sig.data(), &sig_len, tbs, tbs_len)); + sig.resize(sig_len); + ASSERT_TRUE( + X509_CRL_set1_signature_value(crl.get(), sig.data(), sig.size())); + } else { + ASSERT_TRUE(X509_CRL_sign(crl.get(), pkey.get(), EVP_sha384())); + } + + // Check the signature. + EXPECT_TRUE(X509_CRL_verify(crl.get(), pkey.get())); - // Fill in the signature algorithm. - ASSERT_TRUE(X509_CRL_set1_signature_algo(crl.get(), algor.get())); - - // Extract the TBSCertList. - uint8_t *tbs = nullptr; - int tbs_len = i2d_re_X509_CRL_tbs(crl.get(), &tbs); - bssl::UniquePtr free_tbs(tbs); - ASSERT_GT(tbs_len, 0); - - // Generate a signature externally and fill it in. - bssl::ScopedEVP_MD_CTX md_ctx; - ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, kSignatureHash, - nullptr, pkey.get())); - size_t sig_len; - ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, tbs, tbs_len)); - std::vector sig(sig_len); - ASSERT_TRUE( - EVP_DigestSign(md_ctx.get(), sig.data(), &sig_len, tbs, tbs_len)); - sig.resize(sig_len); - ASSERT_TRUE( - X509_CRL_set1_signature_value(crl.get(), sig.data(), sig.size())); - - // Check the signature. - EXPECT_TRUE(X509_CRL_verify(crl.get(), pkey.get())); - - // Re-encode the CRL. X509_CRL objects contain a cached TBSCertList encoding - // and |i2d_re_X509_tbs| should have refreshed that cache. - bssl::UniquePtr copy = ReencodeCRL(crl.get()); - ASSERT_TRUE(copy); - EXPECT_TRUE(X509_CRL_verify(copy.get(), pkey.get())); + // Re-encode the CRL. X509_CRL objects contain a cached TBSCertList + // encoding and re-signing should have dropped that cache. + bssl::UniquePtr copy = ReencodeCRL(crl.get()); + ASSERT_TRUE(copy); + EXPECT_TRUE(X509_CRL_verify(copy.get(), pkey.get())); + } } } @@ -2117,8 +2171,9 @@ rZGEJG3+X9OuhczVKGJyg+3gU7oDbecc -----END CERTIFICATE REQUEST----- )"; -// Test the APIs for manually signing a certificate. -TEST(X509Test, RSASignCSRManual) { +// Test the APIs for signing a CSR, particularly whether they correctly handle +// the CertificationRequestInfo cache. +TEST(X509Test, SignCSR) { const int kSignatureNID = NID_sha384WithRSAEncryption; const EVP_MD *kSignatureHash = EVP_sha384(); @@ -2129,71 +2184,82 @@ TEST(X509Test, RSASignCSRManual) { ASSERT_TRUE(X509_ALGOR_set0(algor.get(), OBJ_nid2obj(kSignatureNID), V_ASN1_NULL, nullptr)); - // Test CSRs made both from other CSRs and |X509_REQ_new|, in case there are - // bugs in filling in fields from different states. (Parsed CSRs contain a - // CertificationRequestInfo cache, and |X509_REQ_new| initializes fields based - // on complex ASN.1 template logic.) - for (bool new_csr : {true, false}) { - SCOPED_TRACE(new_csr); - - bssl::UniquePtr csr; - if (new_csr) { - csr.reset(X509_REQ_new()); - ASSERT_TRUE(csr); - bssl::UniquePtr subject(X509_NAME_new()); - ASSERT_TRUE(subject); - ASSERT_TRUE(X509_NAME_add_entry_by_txt( - subject.get(), "CN", MBSTRING_ASC, - reinterpret_cast("New CSR"), -1, -1, 0)); - EXPECT_TRUE(X509_REQ_set_subject_name(csr.get(), subject.get())); - } else { - // Extract fields from a parsed CSR. - csr = CSRFromPEM(kTestCSR); - ASSERT_TRUE(csr); - } + // Test both signing with |X509_REQ_sign| and constructing a signature + // manually. + for (bool sign_manual : {true, false}) { + SCOPED_TRACE(sign_manual); + + // Test CSRs made both from other CSRs and |X509_REQ_new|, in case there are + // bugs in filling in fields from different states. (Parsed CSRs contain a + // CertificationRequestInfo cache, and |X509_REQ_new| initializes fields + // based on complex ASN.1 template logic.) + for (bool new_csr : {true, false}) { + SCOPED_TRACE(new_csr); + + bssl::UniquePtr csr; + if (new_csr) { + csr.reset(X509_REQ_new()); + ASSERT_TRUE(csr); + bssl::UniquePtr subject(X509_NAME_new()); + ASSERT_TRUE(subject); + ASSERT_TRUE(X509_NAME_add_entry_by_txt( + subject.get(), "CN", MBSTRING_ASC, + reinterpret_cast("New CSR"), -1, -1, 0)); + EXPECT_TRUE(X509_REQ_set_subject_name(csr.get(), subject.get())); + } else { + // Extract fields from a parsed CSR. + csr = CSRFromPEM(kTestCSR); + ASSERT_TRUE(csr); + } - // Override the public key from the CSR unconditionally. Unlike certificates - // and CRLs, CSRs do not contain a signed copy of the signature algorithm, - // so we use a different field to confirm |i2d_re_X509_REQ_tbs| clears the - // cache as expected. - EXPECT_TRUE(X509_REQ_set_pubkey(csr.get(), pkey.get())); - - // Fill in the signature algorithm. - ASSERT_TRUE(X509_REQ_set1_signature_algo(csr.get(), algor.get())); - - // Extract the CertificationRequestInfo. - uint8_t *tbs = nullptr; - int tbs_len = i2d_re_X509_REQ_tbs(csr.get(), &tbs); - bssl::UniquePtr free_tbs(tbs); - ASSERT_GT(tbs_len, 0); - - // Generate a signature externally and fill it in. - bssl::ScopedEVP_MD_CTX md_ctx; - ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, kSignatureHash, - nullptr, pkey.get())); - size_t sig_len; - ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, tbs, tbs_len)); - std::vector sig(sig_len); - ASSERT_TRUE( - EVP_DigestSign(md_ctx.get(), sig.data(), &sig_len, tbs, tbs_len)); - sig.resize(sig_len); - ASSERT_TRUE( - X509_REQ_set1_signature_value(csr.get(), sig.data(), sig.size())); - - // Check the signature. - EXPECT_TRUE(X509_REQ_verify(csr.get(), pkey.get())); - - // Re-encode the CSR. X509_REQ objects contain a cached - // CertificationRequestInfo encoding and |i2d_re_X509_REQ_tbs| should have - // refreshed that cache. - bssl::UniquePtr copy = ReencodeCSR(csr.get()); - ASSERT_TRUE(copy); - EXPECT_TRUE(X509_REQ_verify(copy.get(), pkey.get())); - - // Check the signature was over the new public key. - bssl::UniquePtr copy_pubkey(X509_REQ_get_pubkey(copy.get())); - ASSERT_TRUE(copy_pubkey); - EXPECT_EQ(1, EVP_PKEY_cmp(pkey.get(), copy_pubkey.get())); + // Override the public key from the CSR unconditionally. Unlike + // certificates and CRLs, CSRs do not contain a signed copy of the + // signature algorithm, so we use a different field to confirm + // |i2d_re_X509_REQ_tbs| clears the cache as expected. + EXPECT_TRUE(X509_REQ_set_pubkey(csr.get(), pkey.get())); + + if (sign_manual) { + // Fill in the signature algorithm. + ASSERT_TRUE(X509_REQ_set1_signature_algo(csr.get(), algor.get())); + + // Extract the CertificationRequestInfo. + uint8_t *tbs = nullptr; + int tbs_len = i2d_re_X509_REQ_tbs(csr.get(), &tbs); + bssl::UniquePtr free_tbs(tbs); + ASSERT_GT(tbs_len, 0); + + // Generate a signature externally and fill it in. + bssl::ScopedEVP_MD_CTX md_ctx; + ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, kSignatureHash, + nullptr, pkey.get())); + size_t sig_len; + ASSERT_TRUE( + EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, tbs, tbs_len)); + std::vector sig(sig_len); + ASSERT_TRUE( + EVP_DigestSign(md_ctx.get(), sig.data(), &sig_len, tbs, tbs_len)); + sig.resize(sig_len); + ASSERT_TRUE( + X509_REQ_set1_signature_value(csr.get(), sig.data(), sig.size())); + } else { + ASSERT_TRUE(X509_REQ_sign(csr.get(), pkey.get(), EVP_sha384())); + } + + // Check the signature. + EXPECT_TRUE(X509_REQ_verify(csr.get(), pkey.get())); + + // Re-encode the CSR. X509_REQ objects contain a cached + // CertificationRequestInfo encoding and re-signing should have dropped + // that cache. + bssl::UniquePtr copy = ReencodeCSR(csr.get()); + ASSERT_TRUE(copy); + EXPECT_TRUE(X509_REQ_verify(copy.get(), pkey.get())); + + // Check the signature was over the new public key. + bssl::UniquePtr copy_pubkey(X509_REQ_get_pubkey(copy.get())); + ASSERT_TRUE(copy_pubkey); + EXPECT_EQ(1, EVP_PKEY_cmp(pkey.get(), copy_pubkey.get())); + } } } @@ -2315,12 +2381,25 @@ TEST(X509Test, TestFromBufferReused) { size_t data2_len; bssl::UniquePtr data2; ASSERT_TRUE(PEMToDER(&data2, &data2_len, kLeafPEM)); - - X509 *x509p = root.get(); + EXPECT_TRUE(buffers_alias(root->cert_info->enc.enc, root->cert_info->enc.len, + CRYPTO_BUFFER_data(buf.get()), + CRYPTO_BUFFER_len(buf.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->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. @@ -2335,7 +2414,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) { @@ -2402,7 +2481,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(). @@ -2460,6 +2541,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)); @@ -2482,6 +2564,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( @@ -3639,6 +3782,8 @@ TEST(X509Test, GeneralName) { {0x82, 0x01, 0x61}, // [2 PRIMITIVE] { "b" } {0x82, 0x01, 0x62}, + // [3] {} + {0xa3, 0x00}, // [4] { // SEQUENCE { // SET { @@ -3736,6 +3881,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])); @@ -4006,13 +4157,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); @@ -4050,9 +4201,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); } }; @@ -4161,6 +4312,48 @@ 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----- +)"; + +// 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)); @@ -4172,6 +4365,12 @@ 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)); + EXPECT_FALSE(CertFromPEM(kNonMinimalLengthSerial)); + // We, for now, accept a non-minimal length in the signature field. See + // b/18228011. + EXPECT_TRUE(CertFromPEM(kNonMinimalLengthSignature)); } TEST(X509Test, Names) { @@ -4681,50 +4880,35 @@ TEST(X509Test, NamePrint) { "CN = \"Common " "Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\0ACN=A\\0A\", " "CN = \" spaces \""}, - // |XN_FLAG_MULTILINE| is an OpenSSL-specific multi-line format that tries - // to vertically align the equal sizes. The vertical alignment doesn't - // quite handle multi-valued RDNs right and uses a non-RFC-2253 escaping. - {/*indent=*/0, - /*flags=*/XN_FLAG_MULTILINE, - "countryName = US\n" - "stateOrProvinceName = Some State + " - "stateOrProvinceName = Some Other State \\U2603 + " - "stateOrProvinceName = Another State \\U2603 + " - "1.2.840.113554.4.1.72585.2 = \\U2603\n" - "1.2.840.113554.4.1.72585.3 = 0\\06\\02\\01\\01\\02\\01\\02\n" - "organizationName = Org Name\n" - "commonName = Common " - "Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\0ACN=A\\0A\n" - "commonName = spaces "}, - // The multiline format indents every line. - {/*indent=*/2, - /*flags=*/XN_FLAG_MULTILINE, - " countryName = US\n" - " stateOrProvinceName = Some State + " - "stateOrProvinceName = Some Other State \\U2603 + " - "stateOrProvinceName = Another State \\U2603 + " - "1.2.840.113554.4.1.72585.2 = \\U2603\n" - " 1.2.840.113554.4.1.72585.3 = 0\\06\\02\\01\\01\\02\\01\\02\n" - " organizationName = Org Name\n" - " commonName = Common " - "Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\0ACN=A\\0A\n" - " commonName = spaces "}, - // Callers can also customize the output, wuith both |XN_FLAG_*| and - // |ASN1_STRFLGS_*|. |XN_FLAG_SEP_SPLUS_SPC| uses semicolon separators and - // |XN_FLAG_FN_OID| forces OIDs. + // Callers can also customize the output, with both |XN_FLAG_*| and + // |ASN1_STRFLGS_*|. |XN_FLAG_SEP_SPLUS_SPC| uses semicolon separators. {/*indent=*/0, - /*flags=*/XN_FLAG_SEP_SPLUS_SPC | XN_FLAG_FN_OID | ASN1_STRFLGS_RFC2253 | + /*flags=*/XN_FLAG_SEP_SPLUS_SPC | ASN1_STRFLGS_RFC2253 | ASN1_STRFLGS_ESC_QUOTE, - "2.5.4.6=US; " - "2.5.4.8=Some State + " - "2.5.4.8=Some Other State \\E2\\98\\83 + " - "2.5.4.8=Another State \\E2\\98\\83 + " + "C=US; " + "ST=Some State + " + "ST=Some Other State \\E2\\98\\83 + " + "ST=Another State \\E2\\98\\83 + " "1.2.840.113554.4.1.72585.2=\\E2\\98\\83; " "1.2.840.113554.4.1.72585.3=#3006020101020102; " - "2.5.4.10=Org Name; " - "2.5.4.3=\"Common " + "O=Org Name; " + "CN=\"Common " "Name/CN=A/CN=B,CN=A,CN=B+CN=A+CN=B;CN=A;CN=B\\0ACN=A\\0A\"; " - "2.5.4.3=\" spaces \""}, + "CN=\" spaces \""}, + // Node uses these parameters. + {/*indent=*/0, + /*flags=*/ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_ESC_CTRL | + ASN1_STRFLGS_UTF8_CONVERT | XN_FLAG_SEP_MULTILINE | XN_FLAG_FN_SN, + "C=US\n" + "ST=Some State + " + "ST=Some Other State \xE2\x98\x83 + " + "ST=Another State \xE2\x98\x83 + " + "1.2.840.113554.4.1.72585.2=\xE2\x98\x83\n" + "1.2.840.113554.4.1.72585.3=0\\06\\02\\01\\01\\02\\01\\02\n" + "O=Org Name\n" + "CN=Common " + "Name/CN=A/CN=B\\,CN=A\\,CN=B\\+CN=A\\+CN=B\\;CN=A\\;CN=B\\0ACN=A\\0A\n" + "CN=\\ spaces\\ "}, // |XN_FLAG_COMPAT| matches |X509_NAME_print|, rather than // |X509_NAME_print_ex|. // @@ -4776,8 +4960,8 @@ TEST(X509Test, NamePrint) { "/C=US", "/ST=Some State", "/ST=Some Other State \\xE2\\x98\\x83", - "/ST=\\x00A\\x00n\\x00o\\x00t\\x00h\\x00e\\x00r\\x00 " - "\\x00S\\x00t\\x00a\\x00t\\x00e\\x00 &\\x03", + ("/ST=\\x00A\\x00n\\x00o\\x00t\\x00h\\x00e\\x00r\\x00 " + "\\x00S\\x00t\\x00a\\x00t\\x00e\\x00 &\\x03"), "/1.2.840.113554.4.1.72585.2=\\x00\\x00&\\x03", "/1.2.840.113554.4.1.72585.3=0\\x06\\x02\\x01\\x01\\x02\\x01\\x02", "/O=Org Name", @@ -5207,3 +5391,1424 @@ TEST(X509Test, SetSerialNumberChecksASN1StringType) { ASSERT_TRUE(ASN1_INTEGER_get_int64(&val, X509_get0_serialNumber(root.get()))); EXPECT_EQ(-1, val); } + +TEST(X509Test, Policy) { + bssl::UniquePtr oid1( + OBJ_txt2obj("1.2.840.113554.4.1.72585.2.1", /*dont_search_names=*/1)); + ASSERT_TRUE(oid1); + bssl::UniquePtr oid2( + OBJ_txt2obj("1.2.840.113554.4.1.72585.2.2", /*dont_search_names=*/1)); + ASSERT_TRUE(oid2); + bssl::UniquePtr oid3( + OBJ_txt2obj("1.2.840.113554.4.1.72585.2.3", /*dont_search_names=*/1)); + ASSERT_TRUE(oid3); + bssl::UniquePtr oid4( + OBJ_txt2obj("1.2.840.113554.4.1.72585.2.4", /*dont_search_names=*/1)); + ASSERT_TRUE(oid4); + bssl::UniquePtr oid5( + OBJ_txt2obj("1.2.840.113554.4.1.72585.2.5", /*dont_search_names=*/1)); + ASSERT_TRUE(oid5); + + bssl::UniquePtr root( + CertFromPEM(GetTestData("crypto/x509/test/policy_root.pem").c_str())); + ASSERT_TRUE(root); + bssl::UniquePtr root_cross_inhibit_mapping(CertFromPEM( + GetTestData("crypto/x509/test/policy_root_cross_inhibit_mapping.pem") + .c_str())); + ASSERT_TRUE(root_cross_inhibit_mapping); + bssl::UniquePtr root2( + CertFromPEM(GetTestData("crypto/x509/test/policy_root2.pem").c_str())); + ASSERT_TRUE(root2); + bssl::UniquePtr intermediate(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate.pem").c_str())); + ASSERT_TRUE(intermediate); + bssl::UniquePtr intermediate_any(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_any.pem").c_str())); + ASSERT_TRUE(intermediate_any); + bssl::UniquePtr intermediate_duplicate(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_duplicate.pem") + .c_str())); + ASSERT_TRUE(intermediate_duplicate); + bssl::UniquePtr intermediate_invalid(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_invalid.pem").c_str())); + ASSERT_TRUE(intermediate_invalid); + bssl::UniquePtr intermediate_mapped(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_mapped.pem") + .c_str())); + ASSERT_TRUE(intermediate_mapped); + bssl::UniquePtr intermediate_mapped_any(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_mapped_any.pem") + .c_str())); + ASSERT_TRUE(intermediate_mapped_any); + bssl::UniquePtr intermediate_mapped_oid3(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_mapped_oid3.pem") + .c_str())); + ASSERT_TRUE(intermediate_mapped_oid3); + bssl::UniquePtr intermediate_require(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_require.pem").c_str())); + ASSERT_TRUE(intermediate_require); + bssl::UniquePtr intermediate_require1(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_require1.pem") + .c_str())); + ASSERT_TRUE(intermediate_require1); + bssl::UniquePtr intermediate_require2(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_require2.pem") + .c_str())); + ASSERT_TRUE(intermediate_require2); + bssl::UniquePtr intermediate_require_duplicate(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate_require_duplicate.pem") + .c_str())); + ASSERT_TRUE(intermediate_require_duplicate); + bssl::UniquePtr intermediate_require_no_policies(CertFromPEM( + GetTestData( + "crypto/x509/test/policy_intermediate_require_no_policies.pem") + .c_str())); + ASSERT_TRUE(intermediate_require_no_policies); + bssl::UniquePtr leaf( + CertFromPEM(GetTestData("crypto/x509/test/policy_leaf.pem").c_str())); + ASSERT_TRUE(leaf); + bssl::UniquePtr leaf_any( + CertFromPEM(GetTestData("crypto/x509/test/policy_leaf_any.pem").c_str())); + ASSERT_TRUE(leaf_any); + bssl::UniquePtr leaf_duplicate(CertFromPEM( + GetTestData("crypto/x509/test/policy_leaf_duplicate.pem").c_str())); + ASSERT_TRUE(leaf_duplicate); + 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); + bssl::UniquePtr leaf_oid2(CertFromPEM( + GetTestData("crypto/x509/test/policy_leaf_oid2.pem").c_str())); + ASSERT_TRUE(leaf_oid2); + bssl::UniquePtr leaf_oid3(CertFromPEM( + GetTestData("crypto/x509/test/policy_leaf_oid3.pem").c_str())); + ASSERT_TRUE(leaf_oid3); + bssl::UniquePtr leaf_oid4(CertFromPEM( + GetTestData("crypto/x509/test/policy_leaf_oid4.pem").c_str())); + ASSERT_TRUE(leaf_oid4); + bssl::UniquePtr leaf_oid5(CertFromPEM( + GetTestData("crypto/x509/test/policy_leaf_oid5.pem").c_str())); + ASSERT_TRUE(leaf_oid5); + bssl::UniquePtr leaf_require(CertFromPEM( + GetTestData("crypto/x509/test/policy_leaf_require.pem").c_str())); + ASSERT_TRUE(leaf_require); + bssl::UniquePtr leaf_require1(CertFromPEM( + GetTestData("crypto/x509/test/policy_leaf_require1.pem").c_str())); + ASSERT_TRUE(leaf_require1); + + auto set_policies = [](X509_VERIFY_PARAM *param, + std::vector oids) { + for (const ASN1_OBJECT *oid : oids) { + bssl::UniquePtr copy(OBJ_dup(oid)); + ASSERT_TRUE(copy); + ASSERT_TRUE(X509_VERIFY_PARAM_add0_policy(param, copy.get())); + copy.release(); // |X509_VERIFY_PARAM_add0_policy| takes ownership on + // success. + } + }; + + // 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) { + set_policies(param, {oid1.get()}); + })); + EXPECT_EQ(X509_V_OK, + Verify(leaf.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, + X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid2.get()}); + })); + EXPECT_EQ(X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, + X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + EXPECT_EQ(X509_V_OK, + Verify(leaf.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, + X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get(), oid2.get()}); + })); + EXPECT_EQ(X509_V_OK, + Verify(leaf.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, + X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get(), oid3.get()}); + })); + + // The policy extension cannot be parsed. + EXPECT_EQ(X509_V_ERR_INVALID_POLICY_EXTENSION, + Verify(leaf.get(), {root.get()}, {intermediate_invalid.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_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=*/{}, X509_V_FLAG_EXPLICIT_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, + Verify(leaf.get(), {root.get()}, {intermediate_duplicate.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + + // The policy extension in the leaf cannot be parsed. + EXPECT_EQ(X509_V_ERR_INVALID_POLICY_EXTENSION, + Verify(leaf_duplicate.get(), {root.get()}, {intermediate.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + + // Without |X509_V_FLAG_EXPLICIT_POLICY|, the policy tree is built and + // intersected with user-specified policies, but it is not required to result + // in any valid policies. + EXPECT_EQ(X509_V_OK, + Verify(leaf.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + EXPECT_EQ(X509_V_OK, + Verify(leaf.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + + // However, a CA with policy constraints can require an explicit policy. + EXPECT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()}, + {intermediate_require.get()}, /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + EXPECT_EQ(X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf.get(), {root.get()}, {intermediate_require.get()}, + /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + 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=*/{}, /*flags=*/0)); + EXPECT_EQ(X509_V_OK, Verify(leaf_require.get(), {root.get()}, + {intermediate.get()}, /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + EXPECT_EQ(X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf_require.get(), {root.get()}, {intermediate.get()}, + /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + + // requireExplicitPolicy is a count of certificates to skip. If the value is + // not zero by the end of the chain, it doesn't count. + EXPECT_EQ(X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf.get(), {root.get()}, {intermediate_require1.get()}, + /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + EXPECT_EQ(X509_V_OK, + Verify(leaf.get(), {root.get()}, {intermediate_require2.get()}, + /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + EXPECT_EQ(X509_V_OK, + Verify(leaf_require1.get(), {root.get()}, {intermediate.get()}, + /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + + // If multiple certificates specify the constraint, the more constrained value + // wins. + EXPECT_EQ( + X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf_require1.get(), {root.get()}, {intermediate_require1.get()}, + /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + EXPECT_EQ( + X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf_require.get(), {root.get()}, {intermediate_require2.get()}, + /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + + // An intermediate that requires an explicit policy, but then specifies no + // policies should fail verification as a result. + EXPECT_EQ(X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf.get(), {root.get()}, + {intermediate_require_no_policies.get()}, /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + + // A constrained intermediate's policy extension has a duplicate policy, which + // is invalid. Historically this, and the above case, leaked memory. + EXPECT_EQ(X509_V_ERR_INVALID_POLICY_EXTENSION, + Verify(leaf.get(), {root.get()}, + {intermediate_require_duplicate.get()}, /*crls=*/{}, + /*flags=*/0, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + + // The leaf asserts anyPolicy, but the intermediate does not. The resulting + // valid policies are the intersection. + EXPECT_EQ( + X509_V_OK, + Verify(leaf_any.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, + X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + EXPECT_EQ( + X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf_any.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, + X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + + // The intermediate asserts anyPolicy, but the leaf does not. The resulting + // valid policies are the intersection. + EXPECT_EQ( + X509_V_OK, + Verify(leaf.get(), {root.get()}, {intermediate_any.get()}, /*crls=*/{}, + X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + EXPECT_EQ( + X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf.get(), {root.get()}, {intermediate_any.get()}, /*crls=*/{}, + X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + + // Both assert anyPolicy. All policies are valid. + EXPECT_EQ(X509_V_OK, + Verify(leaf_any.get(), {root.get()}, {intermediate_any.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + EXPECT_EQ(X509_V_OK, + Verify(leaf_any.get(), {root.get()}, {intermediate_any.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + + // With just a trust anchor, policy checking silently succeeds. + EXPECT_EQ(X509_V_OK, Verify(root.get(), {root.get()}, {}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + + for (bool use_any : {false, true}) { + SCOPED_TRACE(use_any); + X509 *cert = + use_any ? intermediate_mapped_any.get() : intermediate_mapped.get(); + // OID3 is mapped to {OID1, OID2}, which means OID1 and OID2 (or both) are + // acceptable for OID3. + EXPECT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + EXPECT_EQ(X509_V_OK, Verify(leaf_oid1.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + EXPECT_EQ(X509_V_OK, Verify(leaf_oid2.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + + // If the intermediate's policies were anyPolicy, OID3 at the leaf, despite + // being mapped, is still acceptable as OID3 at the root. Despite the OID3 + // having expected_policy_set = {OID1, OID2}, it can match the anyPolicy + // node instead. + // + // If the intermediate's policies listed OIDs explicitly, OID3 at the leaf + // is not acceptable as OID3 at the root. OID3 has expected_polciy_set = + // {OID1, OID2} and no other node allows OID3. + EXPECT_EQ(use_any ? X509_V_OK : X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf_oid3.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + + // If the intermediate's policies were anyPolicy, OID1 at the leaf is no + // longer acceptable as OID1 at the root because policies only match + // anyPolicy when they match no other policy. + // + // If the intermediate's policies listed OIDs explicitly, OID1 at the leaf + // is acceptable as OID1 at the root because it will match both OID1 and + // OID3 (mapped) policies. + EXPECT_EQ(use_any ? X509_V_ERR_NO_EXPLICIT_POLICY : X509_V_OK, + Verify(leaf_oid1.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + + // All pairs of OID4 and OID5 are mapped together, so either can stand for + // the other. + EXPECT_EQ(X509_V_OK, Verify(leaf_oid4.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid4.get()}); + })); + EXPECT_EQ(X509_V_OK, Verify(leaf_oid4.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid5.get()}); + })); + EXPECT_EQ(X509_V_OK, Verify(leaf_oid5.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid4.get()}); + })); + EXPECT_EQ(X509_V_OK, Verify(leaf_oid5.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid5.get()}); + })); + + EXPECT_EQ(X509_V_OK, Verify(leaf_oid4.get(), {root.get()}, {cert}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid4.get(), oid5.get()}); + })); + } + + // Although |intermediate_mapped_oid3| contains many mappings, it only accepts + // OID3. Nodes should not be created for the other mappings. + EXPECT_EQ(X509_V_OK, Verify(leaf_oid1.get(), {root.get()}, + {intermediate_mapped_oid3.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + EXPECT_EQ( + X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf_oid4.get(), {root.get()}, {intermediate_mapped_oid3.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid4.get()}); + })); + + // Policy mapping can be inhibited, either by the caller or a certificate in + // the chain, in which case mapped policies are unassertable (apart from some + // anyPolicy edge cases). + EXPECT_EQ( + X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf_oid1.get(), {root.get()}, {intermediate_mapped_oid3.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY | X509_V_FLAG_INHIBIT_MAP, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); + EXPECT_EQ( + X509_V_ERR_NO_EXPLICIT_POLICY, + Verify(leaf_oid1.get(), {root2.get()}, + {intermediate_mapped_oid3.get(), root_cross_inhibit_mapping.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid3.get()}); + })); +} + +#if defined(OPENSSL_THREADS) +// A similar test to the above, but ensures the various bits of intermediate +// state are computed safely. +TEST(X509Test, PolicyThreads) { + const size_t kNumThreads = 10; + + bssl::UniquePtr oid1( + OBJ_txt2obj("1.2.840.113554.4.1.72585.2.1", /*dont_search_names=*/1)); + ASSERT_TRUE(oid1); + bssl::UniquePtr oid2( + OBJ_txt2obj("1.2.840.113554.4.1.72585.2.2", /*dont_search_names=*/1)); + ASSERT_TRUE(oid2); + bssl::UniquePtr oid3( + OBJ_txt2obj("1.2.840.113554.4.1.72585.2.3", /*dont_search_names=*/1)); + ASSERT_TRUE(oid3); + + auto set_policies = [](X509_VERIFY_PARAM *param, + std::vector oids) { + for (const ASN1_OBJECT *oid : oids) { + bssl::UniquePtr copy(OBJ_dup(oid)); + ASSERT_TRUE(copy); + ASSERT_TRUE(X509_VERIFY_PARAM_add0_policy(param, copy.get())); + copy.release(); // |X509_VERIFY_PARAM_add0_policy| takes ownership on + // success. + } + }; + + { + bssl::UniquePtr root( + CertFromPEM(GetTestData("crypto/x509/test/policy_root.pem").c_str())); + ASSERT_TRUE(root); + bssl::UniquePtr intermediate(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate.pem").c_str())); + ASSERT_TRUE(intermediate); + bssl::UniquePtr leaf( + CertFromPEM(GetTestData("crypto/x509/test/policy_leaf.pem").c_str())); + ASSERT_TRUE(leaf); + + std::vector threads; + for (size_t i = 0; i < kNumThreads; i++) { + threads.emplace_back([&] { + EXPECT_EQ( + X509_V_OK, + Verify(leaf.get(), {root.get()}, {intermediate.get()}, /*crls=*/{}, + X509_V_FLAG_EXPLICIT_POLICY, [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + }); + } + for (auto &thread : threads) { + thread.join(); + } + } + + { + bssl::UniquePtr root( + CertFromPEM(GetTestData("crypto/x509/test/policy_root.pem").c_str())); + ASSERT_TRUE(root); + bssl::UniquePtr intermediate(CertFromPEM( + GetTestData("crypto/x509/test/policy_intermediate.pem").c_str())); + ASSERT_TRUE(intermediate); + bssl::UniquePtr leaf_invalid(CertFromPEM( + GetTestData("crypto/x509/test/policy_leaf_invalid.pem").c_str())); + ASSERT_TRUE(leaf_invalid); + + + std::vector threads; + for (size_t i = 0; i < kNumThreads; i++) { + threads.emplace_back([&] { + EXPECT_EQ(X509_V_ERR_INVALID_POLICY_EXTENSION, + Verify(leaf_invalid.get(), {root.get()}, {intermediate.get()}, + /*crls=*/{}, X509_V_FLAG_EXPLICIT_POLICY, + [&](X509_VERIFY_PARAM *param) { + set_policies(param, {oid1.get()}); + })); + }); + } + for (auto &thread : threads) { + thread.join(); + } + } +} +#endif // OPENSSL_THREADS + +TEST(X509Test, ExtensionFromConf) { + static const char kTestOID[] = "1.2.840.113554.4.1.72585.2"; + const struct { + const char *name; + 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. + std::vector expected; + } kTests[] = { + // Many extensions have built-in syntax. + {"basicConstraints", + "critical,CA:true", + nullptr, + {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", + "[section]\nCA = true\n", + {0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff}}, + + // 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, {}}, + + {"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 + // 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, " + "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, {}}, + + {"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, + 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x05, + 0x00, 0x01, 0x02, 0x03, 0x04}}, + {kTestOID, + "DER:00:01:02:03:04", + nullptr, + {0x30, 0x15, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x05, 0x00, 0x01, 0x02, 0x03, 0x04}}, + {kTestOID, "DER:invalid hex", nullptr, {}}, + + // The "ASN1:" prefix implements a complex language for describing ASN.1 + // structures. See + // https://www.openssl.org/docs/man1.1.1/man3/ASN1_generate_nconf.html + {kTestOID, "ASN1:invalid", nullptr, {}}, + {kTestOID, + "ASN1:BOOLEAN:TRUE", + nullptr, + {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, 0x01, 0x01, 0xff}}, + {kTestOID, "ASN1:BOOL:yes", nullptr, {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, + 0x01, 0x01, 0xff}}, + {kTestOID, + "ASN1:BOOLEAN:NO", + nullptr, + {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, 0x01, 0x01, 0x00}}, + {kTestOID, + "ASN1:BOOLEAN", // Missing value + nullptr, + {}}, + {kTestOID, "ASN1:BOOLEAN:invalid", nullptr, {}}, + {kTestOID, "ASN1:BOOLEAN:TRUE,invalid", nullptr, {}}, + + {kTestOID, "ASN1:NULL", nullptr, {0x30, 0x12, 0x06, 0x0c, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, + 0x02, 0x04, 0x02, 0x05, 0x00}}, + {kTestOID, "ASN1:NULL,invalid", nullptr, {}}, + {kTestOID, "ASN1:NULL:invalid", nullptr, {}}, + + // Missing value. + {kTestOID, "ASN1:INTEGER", nullptr, {}}, + {kTestOID, "ASN1:INTEGER:", nullptr, {}}, + {kTestOID, "ASN1:INTEGER,invalid", nullptr, {}}, + + // INTEGER may be decimal or hexadecimal. + {kTestOID, "ASN1:INT:-0x10", nullptr, {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, + 0x02, 0x01, 0xf0}}, + {kTestOID, "ASN1:INT:-10", nullptr, {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, + 0x02, 0x01, 0xf6}}, + {kTestOID, "ASN1:INT:0", nullptr, {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, + 0x02, 0x01, 0x00}}, + {kTestOID, + "ASN1:INTEGER:10", + nullptr, + {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, 0x02, 0x01, 0x0a}}, + {kTestOID, + "ASN1:INTEGER:0x10", + nullptr, + {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, 0x02, 0x01, 0x10}}, + + {kTestOID, "ASN1:ENUM:0", nullptr, {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, + 0x0a, 0x01, 0x00}}, + {kTestOID, + "ASN1:ENUMERATED:0", + nullptr, + {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, 0x0a, 0x01, 0x00}}, + + // OIDs may be spelled out or specified by name. + {kTestOID, "ASN1:OBJECT:invalid", nullptr, {}}, + {kTestOID, + "ASN1:OBJECT:basicConstraints", + nullptr, + {0x30, 0x15, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x05, 0x06, 0x03, 0x55, 0x1d, 0x13}}, + {kTestOID, + "ASN1:OBJECT:2.5.29.19", + nullptr, + {0x30, 0x15, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x05, 0x06, 0x03, 0x55, 0x1d, 0x13}}, + {kTestOID, + "ASN1:OID:2.5.29.19", + nullptr, + {0x30, 0x15, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x05, 0x06, 0x03, 0x55, 0x1d, 0x13}}, + + {kTestOID, "ASN1:UTC:invalid", nullptr, {}}, + {kTestOID, "ASN1:UTC:20001231235959Z", nullptr, {}}, + {kTestOID, "ASN1:UTCTIME:invalid", nullptr, {}}, + {kTestOID, + "ASN1:UTC:001231235959Z", + nullptr, + {0x30, 0x1f, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x0f, 0x17, 0x0d, 0x30, 0x30, + 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a}}, + {kTestOID, + "ASN1:UTCTIME:001231235959Z", + nullptr, + {0x30, 0x1f, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x0f, 0x17, 0x0d, 0x30, 0x30, + 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a}}, + + {kTestOID, "ASN1:GENTIME:invalid", nullptr, {}}, + {kTestOID, "ASN1:GENTIME:001231235959Z", nullptr, {}}, + {kTestOID, "ASN1:GENERALIZEDTIME:invalid", nullptr, {}}, + {kTestOID, + "ASN1:GENTIME:20001231235959Z", + nullptr, + {0x30, 0x21, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x11, 0x18, 0x0f, 0x32, 0x30, 0x30, 0x30, + 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a}}, + {kTestOID, + "ASN1:GENERALIZEDTIME:20001231235959Z", + nullptr, + {0x30, 0x21, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x11, 0x18, 0x0f, 0x32, 0x30, 0x30, 0x30, + 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a}}, + + // The default input format for string types is ASCII, which is then + // converted into the target string type. + {kTestOID, "ASN1:UTF8:hello", nullptr, {0x30, 0x17, 0x06, 0x0c, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, + 0x02, 0x04, 0x07, 0x0c, 0x05, + 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:UTF8String:hello", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x0c, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:UNIV:hello", + nullptr, + {0x30, 0x26, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x16, 0x1c, 0x14, + 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, + 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6f}}, + {kTestOID, + "ASN1:UNIVERSALSTRING:hello", + nullptr, + {0x30, 0x26, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x16, 0x1c, 0x14, + 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, + 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6f}}, + {kTestOID, + "ASN1:BMP:hello", + nullptr, + {0x30, 0x1c, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x0c, 0x1e, 0x0a, + 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f}}, + {kTestOID, + "ASN1:BMPSTRING:hello", + nullptr, + {0x30, 0x1c, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x0c, 0x1e, 0x0a, + 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f}}, + {kTestOID, "ASN1:IA5:hello", nullptr, {0x30, 0x17, 0x06, 0x0c, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, + 0x02, 0x04, 0x07, 0x16, 0x05, + 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:IA5STRING:hello", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x16, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:PRINTABLE:hello", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x13, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:PRINTABLESTRING:hello", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x13, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, "ASN1:T61:hello", nullptr, {0x30, 0x17, 0x06, 0x0c, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, + 0x02, 0x04, 0x07, 0x14, 0x05, + 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:T61STRING:hello", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x14, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:TELETEXSTRING:hello", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x14, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + + // FORMAT:UTF8 switches the input format to UTF-8. This should be + // converted to the destination string, or rejected if invalid. + {kTestOID, + "ASN1:FORMAT:UTF8,UTF8:\xe2\x98\x83", + nullptr, + {0x30, 0x15, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x05, 0x0c, 0x03, 0xe2, 0x98, 0x83}}, + {kTestOID, + "ASN1:FORMAT:UTF8,UNIV:\xe2\x98\x83", + nullptr, + {0x30, 0x16, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, + 0x04, 0x06, 0x1c, 0x04, 0x00, 0x00, 0x26, 0x03}}, + {kTestOID, + "ASN1:FORMAT:UTF8,BMP:\xe2\x98\x83", + nullptr, + {0x30, 0x14, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x04, 0x1e, 0x02, 0x26, 0x03}}, + {kTestOID, "ASN1:FORMAT:UTF8,IA5:\xe2\x98\x83", nullptr, {}}, + {kTestOID, + "ASN1:FORMAT:UTF8,IA5:hello", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x16, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, "ASN1:FORMAT:UTF8,PRINTABLE:\xe2\x98\x83", nullptr, {}}, + {kTestOID, + "ASN1:FORMAT:UTF8,PRINTABLE:hello", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x13, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, "ASN1:FORMAT:UTF8,T61:\xe2\x98\x83", nullptr, {}}, + {kTestOID, + "ASN1:FORMAT:UTF8,T61:\xc3\xb7", + nullptr, + {0x30, 0x13, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x03, 0x14, 0x01, 0xf7}}, + + // Invalid UTF-8. + {kTestOID, "ASN1:FORMAT:UTF8,UTF8:\xff", nullptr, {}}, + + // We don't support these string types. + {kTestOID, "ASN1:NUMERIC:0", nullptr, {}}, + {kTestOID, "ASN1:NUMERICSTRING:0", nullptr, {}}, + {kTestOID, "ASN1:VISIBLE:hello", nullptr, {}}, + {kTestOID, "ASN1:VISIBLESTRING:hello", nullptr, {}}, + {kTestOID, "ASN1:GeneralString:hello", nullptr, {}}, + + // OCTET STRING and BIT STRING also default to ASCII, but also accept HEX. + // BIT STRING interprets OCTET STRING formats by having zero unused bits. + {kTestOID, "ASN1:OCT:hello", nullptr, {0x30, 0x17, 0x06, 0x0c, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, + 0x02, 0x04, 0x07, 0x04, 0x05, + 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:OCTETSTRING:hello", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x04, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:FORMAT:HEX,OCT:0123abcd", + nullptr, + {0x30, 0x16, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, + 0x04, 0x06, 0x04, 0x04, 0x01, 0x23, 0xab, 0xcd}}, + {kTestOID, + "ASN1:BITSTR:hello", + nullptr, + {0x30, 0x18, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x08, + 0x03, 0x06, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:BITSTRING:hello", + nullptr, + {0x30, 0x18, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x08, + 0x03, 0x06, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f}}, + {kTestOID, + "ASN1:FORMAT:HEX,BITSTR:0123abcd", + nullptr, + {0x30, 0x17, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x12, 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x07, + 0x03, 0x05, 0x00, 0x01, 0x23, 0xab, 0xcd}}, + + {kTestOID, "ASN1:FORMAT:HEX,OCT:invalid hex", nullptr, {}}, + + // BIT STRING additionally supports a BITLIST type, which specifies a + // list of bits to set. + {kTestOID, + "ASN1:FORMAT:BITLIST,BITSTR:1,5", + nullptr, + {0x30, 0x14, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x04, 0x03, 0x02, 0x02, 0x44}}, + + {kTestOID, "ASN1:FORMAT:BITLIST,BITSTR:1,invalid,5", 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, {}}, + {kTestOID, "ASN1:FORMAT:BITLIST,UTF8:abcd", nullptr, {}}, + {kTestOID, "ASN1:FORMAT:BITLIST,OCT:abcd", nullptr, {}}, + {kTestOID, "ASN1:FORMAT:BITLIST,UTC:abcd", nullptr, {}}, + {kTestOID, "ASN1:FORMAT:HEX,IA5:abcd", nullptr, {}}, + {kTestOID, "ASN1:FORMAT:HEX,UTF8:abcd", nullptr, {}}, + {kTestOID, "ASN1:FORMAT:HEX,UTC:abcd", nullptr, {}}, + {kTestOID, "ASN1:FORMAT:UTF8,OCT:abcd", nullptr, {}}, + {kTestOID, "ASN1:FORMAT:UTF8,UTC:abcd", nullptr, {}}, + + // Invalid format type. + {kTestOID, "ASN1:FORMAT:invalid,IA5:abcd", nullptr, {}}, + + // SEQUENCE and SET encode empty values when there is no value. + {kTestOID, "ASN1:SEQ", nullptr, {0x30, 0x12, 0x06, 0x0c, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7, + 0x09, 0x02, 0x04, 0x02, 0x30, 0x00}}, + {kTestOID, "ASN1:SET", nullptr, {0x30, 0x12, 0x06, 0x0c, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7, + 0x09, 0x02, 0x04, 0x02, 0x31, 0x00}}, + {kTestOID, "ASN1:SEQUENCE", nullptr, {0x30, 0x12, 0x06, 0x0c, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, + 0x02, 0x04, 0x02, 0x30, 0x00}}, + + // Otherwise, they require a corresponding section in the config database + // to encode values. This can be nested recursively. + {kTestOID, "ASN1:SEQ:missing_confdb", nullptr, {}}, + {kTestOID, "ASN1:SET:missing_confdb", nullptr, {}}, + {kTestOID, + "ASN1:SEQ:seq", + R"( +[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] +)", + {0x30, 0x24, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x14, 0x30, 0x12, + 0x05, 0x00, 0x16, 0x01, 0x61, 0x31, 0x0b, 0x02, 0x01, 0x01, + 0x02, 0x01, 0x02, 0x02, 0x01, 0x03, 0x30, 0x00}}, + + // There is a recursion limit to stop infinite recursion. + {kTestOID, + "ASN1:SEQ:seq1", + R"( +[seq1] +val = SEQ:seq2 +[seq2] +val = SEQ:seq1 +)", + {}}, + + // Various modifiers wrap with explicit tagging or universal types. + {kTestOID, + "ASN1:EXP:0,EXP:16U,EXP:100A,EXP:1000C,OCTWRAP,SEQWRAP,SETWRAP,BITWRAP," + "NULL", + nullptr, + {0x30, 0x26, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x16, 0xa0, 0x14, + 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, + "ASN1:IMP:1A,OCTWRAP,IMP:10,SEQWRAP,IMP:100,SETWRAP,IMP:1000,BITWRAP," + "IMP:10000,NULL", + nullptr, + {0x30, 0x20, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, + 0x84, 0xb7, 0x09, 0x02, 0x04, 0x10, 0x41, 0x0e, 0xaa, 0x0c, 0xbf, 0x64, + 0x09, 0x9f, 0x87, 0x68, 0x05, 0x00, 0x9f, 0xce, 0x10, 0x00}}, + + // Implicit tagging may not be applied to explicit tagging or itself. + // There's no rule against this in ASN.1, but OpenSSL does not allow it + // here. + {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 + // string " a, b ". + {kTestOID, + "ASN1: EXP:0 , IA5: a, b ", + nullptr, + {0x30, 0x1a, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x0a, 0xa0, 0x08, + 0x16, 0x06, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x20}}, + + // Modifiers without a final type. + {kTestOID, "ASN1:EXP:1", nullptr, {}}, + + // Put it all together to describe a test Ed25519 key (wrapped inside an + // X.509 extension). + {kTestOID, + "ASN1:SEQUENCE:pkcs8", + R"( +[pkcs8] +vers = INT:0 +alg = SEQWRAP,OID:1.3.101.112 +key = FORMAT:HEX,OCTWRAP,OCT:9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 +)", + {0x30, 0x40, 0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, + 0x01, 0x84, 0xb7, 0x09, 0x02, 0x04, 0x30, 0x30, 0x2e, 0x02, 0x01, + 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x04, 0x22, 0x04, + 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 +)", + {}}, + + // 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); + SCOPED_TRACE(t.value); + SCOPED_TRACE(t.conf); + + bssl::UniquePtr conf; + if (t.conf != nullptr) { + conf.reset(NCONF_new(nullptr)); + ASSERT_TRUE(conf); + bssl::UniquePtr bio(BIO_new_mem_buf(t.conf, strlen(t.conf))); + ASSERT_TRUE(bio); + long error_line; + ASSERT_TRUE(NCONF_load_bio(conf.get(), bio.get(), &error_line)) + << "Failed to load config at line " << error_line; + } + + bssl::UniquePtr ext( + X509V3_EXT_nconf(conf.get(), nullptr, t.name, t.value.c_str())); + if (t.expected.empty()) { + EXPECT_FALSE(ext); + } else { + ASSERT_TRUE(ext); + uint8_t *der = nullptr; + int len = i2d_X509_EXTENSION(ext.get(), &der); + ASSERT_GE(len, 0); + bssl::UniquePtr free_der(der); + EXPECT_EQ(Bytes(t.expected), Bytes(der, len)); + } + + // Repeat the test with an explicit |X509V3_CTX|. + 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.c_str())); + if (t.expected.empty()) { + EXPECT_FALSE(ext); + } else { + ASSERT_TRUE(ext); + uint8_t *der = nullptr; + int len = i2d_X509_EXTENSION(ext.get(), &der); + ASSERT_GE(len, 0); + bssl::UniquePtr free_der(der); + EXPECT_EQ(Bytes(t.expected), Bytes(der, len)); + } + } +} + +TEST(X509Test, 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)); +} + +// 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)); +} + +TEST(X509Test, NameAttributeValues) { + // 1.2.840.113554.4.1.72585.0. We use an unrecognized OID because using an + // arbitrary ASN.1 type as the value for commonName is invalid. Our parser + // does not check this, but best to avoid unrelated errors in tests, in case + // we decide to later. + static const uint8_t kOID[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, + 0x04, 0x01, 0x84, 0xb7, 0x09, 0x00}; + + const struct { + CBS_ASN1_TAG der_tag; + std::string der_contents; + int str_type; + std::string str_contents; + } kTests[] = { + // String types are parsed as string types. + {CBS_ASN1_BITSTRING, std::string("\0", 1), V_ASN1_BIT_STRING, ""}, + {CBS_ASN1_UTF8STRING, "abc", V_ASN1_UTF8STRING, "abc"}, + {CBS_ASN1_NUMERICSTRING, "123", V_ASN1_NUMERICSTRING, "123"}, + {CBS_ASN1_PRINTABLESTRING, "abc", V_ASN1_PRINTABLESTRING, "abc"}, + {CBS_ASN1_T61STRING, "abc", V_ASN1_T61STRING, "abc"}, + {CBS_ASN1_IA5STRING, "abc", V_ASN1_IA5STRING, "abc"}, + {CBS_ASN1_UNIVERSALSTRING, std::string("\0\0\0a", 4), + V_ASN1_UNIVERSALSTRING, std::string("\0\0\0a", 4)}, + {CBS_ASN1_BMPSTRING, std::string("\0a", 2), V_ASN1_BMPSTRING, + std::string("\0a", 2)}, + + // ENUMERATED is supported but, currently, INTEGER is not. + {CBS_ASN1_ENUMERATED, "\x01", V_ASN1_ENUMERATED, "\x01"}, + + // SEQUENCE is supported but, currently, SET is not. Note the + // |ASN1_STRING| representation will include the tag and length. + {CBS_ASN1_SEQUENCE, "", V_ASN1_SEQUENCE, std::string("\x30\x00", 2)}, + + // These types are not actually supported by the library but, + // historically, we would parse them, and not other unsupported types, due + // to quirks of |ASN1_tag2bit|. + {7, "", V_ASN1_OBJECT_DESCRIPTOR, ""}, + {8, "", V_ASN1_EXTERNAL, ""}, + {9, "", V_ASN1_REAL, ""}, + {11, "", 11 /* EMBEDDED PDV */, ""}, + {13, "", 13 /* RELATIVE-OID */, ""}, + {14, "", 14 /* TIME */, ""}, + {15, "", 15 /* not a type; reserved value */, ""}, + {29, "", 29 /* CHARACTER STRING */, ""}, + + // TODO(crbug.com/boringssl/412): Attribute values are an ANY DEFINED BY + // type, so we actually shoudl be accepting all ASN.1 types. We currently + // do not and only accept the above types. Extend this test when we fix + // this. + }; + for (const auto &t : kTests) { + SCOPED_TRACE(t.der_tag); + SCOPED_TRACE(Bytes(t.der_contents)); + + // Construct an X.509 name containing a single RDN with a single attribute: + // kOID with the specified value. + bssl::ScopedCBB cbb; + ASSERT_TRUE(CBB_init(cbb.get(), 128)); + CBB seq, rdn, attr, attr_type, attr_value; + ASSERT_TRUE(CBB_add_asn1(cbb.get(), &seq, CBS_ASN1_SEQUENCE)); + ASSERT_TRUE(CBB_add_asn1(&seq, &rdn, CBS_ASN1_SET)); + ASSERT_TRUE(CBB_add_asn1(&rdn, &attr, CBS_ASN1_SEQUENCE)); + ASSERT_TRUE(CBB_add_asn1(&attr, &attr_type, CBS_ASN1_OBJECT)); + ASSERT_TRUE(CBB_add_bytes(&attr_type, kOID, sizeof(kOID))); + ASSERT_TRUE(CBB_add_asn1(&attr, &attr_value, t.der_tag)); + ASSERT_TRUE(CBB_add_bytes( + &attr_value, reinterpret_cast(t.der_contents.data()), + t.der_contents.size())); + ASSERT_TRUE(CBB_flush(cbb.get())); + SCOPED_TRACE(Bytes(CBB_data(cbb.get()), CBB_len(cbb.get()))); + + // The input should parse. + const uint8_t *inp = CBB_data(cbb.get()); + bssl::UniquePtr name( + d2i_X509_NAME(nullptr, &inp, CBB_len(cbb.get()))); + ASSERT_TRUE(name); + EXPECT_EQ(inp, CBB_data(cbb.get()) + CBB_len(cbb.get())) + << "input was not fully consumed"; + + // Check there is a single attribute with the expected in-memory + // representation. + ASSERT_EQ(1, X509_NAME_entry_count(name.get())); + const X509_NAME_ENTRY *entry = X509_NAME_get_entry(name.get(), 0); + const ASN1_OBJECT *obj = X509_NAME_ENTRY_get_object(entry); + EXPECT_EQ(Bytes(OBJ_get0_data(obj), OBJ_length(obj)), Bytes(kOID)); + const ASN1_STRING *value = X509_NAME_ENTRY_get_data(entry); + EXPECT_EQ(ASN1_STRING_type(value), t.str_type); + EXPECT_EQ(Bytes(ASN1_STRING_get0_data(value), ASN1_STRING_length(value)), + Bytes(t.str_contents)); + + // The name should re-encode with the same input. + uint8_t *der = nullptr; + int der_len = i2d_X509_NAME(name.get(), &der); + ASSERT_GE(der_len, 0); + bssl::UniquePtr free_der(der); + EXPECT_EQ(Bytes(der, der_len), + (Bytes(CBB_data(cbb.get()), CBB_len(cbb.get())))); + } +} diff --git a/third_party/boringssl/src/crypto/x509/x509_time_test.cc b/third_party/boringssl/src/crypto/x509/x509_time_test.cc index fcd51c89f0c1..c0327d28a5be 100644 --- a/third_party/boringssl/src/crypto/x509/x509_time_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/x509/x509_trs.c b/third_party/boringssl/src/crypto/x509/x509_trs.c index 49c66c169a9e..13e5eca0e060 100644 --- a/third_party/boringssl/src/crypto/x509/x509_trs.c +++ b/third_party/boringssl/src/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; } @@ -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; } @@ -183,7 +182,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 +192,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); } @@ -218,16 +215,19 @@ 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))) { - 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; } + sk_X509_TRUST_sort(trtable); } return 1; } diff --git a/third_party/boringssl/src/crypto/x509/x509_v3.c b/third_party/boringssl/src/crypto/x509/x509_v3.c index 4b88ea70764b..0d4ecfa22b28 100644 --- a/third_party/boringssl/src/crypto/x509/x509_v3.c +++ b/third_party/boringssl/src/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; } @@ -180,10 +182,11 @@ 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); - sk_X509_EXTENSION_free(sk); + if (free_sk) { + sk_X509_EXTENSION_free(sk); + } return NULL; } @@ -209,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 { @@ -250,7 +252,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/third_party/boringssl/src/crypto/x509/x509_vfy.c b/third_party/boringssl/src/crypto/x509/x509_vfy.c index 7d445f7483cf..ea9ff3c6c280 100644 --- a/third_party/boringssl/src/crypto/x509/x509_vfy.c +++ b/third_party/boringssl/src/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; @@ -451,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; @@ -468,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); } @@ -543,35 +537,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 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; - } + int ok = 0, plen = 0; - 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; @@ -582,8 +556,10 @@ 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; + + 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); @@ -591,33 +567,9 @@ static int check_chain_extensions(X509_STORE_CTX *ctx) { 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; - ctx->error = X509_V_ERR_INVALID_CA; - } else { - ret = 1; - } - break; - default: - // impossible. - ret = 0; - } - - if (ret == 0) { + 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); @@ -625,22 +577,9 @@ 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; - } - } - } // 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; @@ -653,24 +592,6 @@ 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; - } } ok = 1; end: @@ -978,14 +899,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 +928,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) { @@ -1689,41 +1610,20 @@ static int cert_crl(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x) { } static int check_policy(X509_STORE_CTX *ctx) { - int ret; + // TODO(davidben): Why do we disable policy validation for CRL paths? if (ctx->parent) { return 1; } - // TODO(davidben): Historically, outputs of the |X509_policy_check| were saved - // on |ctx| and accessible via the public API. This has since been removed, so - // remove the fields from |X509_STORE_CTX|. - ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain, - ctx->param->policies, ctx->param->flags); - if (ret == 0) { - OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); - ctx->error = X509_V_ERR_OUT_OF_MEM; - return 0; - } - // Invalid or inconsistent extensions - if (ret == -1) { - // Locate certificates with bad extensions and notify callback. - X509 *x; - size_t i; - for (i = 1; i < sk_X509_num(ctx->chain); i++) { - x = sk_X509_value(ctx->chain, i); - if (!(x->ex_flags & EXFLAG_INVALID_POLICY)) { - continue; - } - ctx->current_cert = x; - ctx->error = X509_V_ERR_INVALID_POLICY_EXTENSION; - if (!ctx->verify_cb(0, ctx)) { - return 0; - } + + X509 *current_cert = NULL; + int ret = X509_policy_check(ctx->chain, ctx->param->policies, + ctx->param->flags, ¤t_cert); + if (ret != X509_V_OK) { + ctx->current_cert = current_cert; + ctx->error = ret; + if (ret == X509_V_ERR_OUT_OF_MEM) { + return 0; } - return 1; - } - if (ret == -2) { - ctx->current_cert = NULL; - ctx->error = X509_V_ERR_NO_EXPLICIT_POLICY; return ctx->verify_cb(0, ctx); } @@ -1746,14 +1646,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; @@ -1770,7 +1670,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; @@ -1873,17 +1773,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) { @@ -1896,12 +1800,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); @@ -2012,7 +1916,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); } @@ -2163,7 +2066,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); @@ -2283,7 +2185,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; } @@ -2313,10 +2214,6 @@ void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx) { } ctx->param = NULL; } - if (ctx->tree != NULL) { - X509_policy_tree_free(ctx->tree); - ctx->tree = NULL; - } if (ctx->chain != NULL) { sk_X509_pop_free(ctx->chain, X509_free); ctx->chain = NULL; @@ -2333,12 +2230,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/third_party/boringssl/src/crypto/x509/x509_vpm.c b/third_party/boringssl/src/crypto/x509/x509_vpm.c index e594033b0092..583b4a050b9b 100644 --- a/third_party/boringssl/src/crypto/x509/x509_vpm.c +++ b/third_party/boringssl/src/crypto/x509/x509_vpm.c @@ -72,8 +72,6 @@ #define SET_HOST 0 #define ADD_HOST 1 -static char *str_copy(char *s) { return OPENSSL_strdup(s); } - static void str_free(char *s) { OPENSSL_free(s); } #define string_stack_free(sk) sk_OPENSSL_STRING_pop_free(sk, str_free) @@ -279,7 +277,8 @@ int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest, dest->hosts = NULL; } if (src->hosts) { - dest->hosts = sk_OPENSSL_STRING_deep_copy(src->hosts, str_copy, str_free); + dest->hosts = + sk_OPENSSL_STRING_deep_copy(src->hosts, OPENSSL_strdup, str_free); if (dest->hosts == NULL) { return 0; } @@ -351,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; } @@ -379,11 +375,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) { @@ -399,38 +399,23 @@ int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, } int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, - STACK_OF(ASN1_OBJECT) *policies) { - size_t i; - ASN1_OBJECT *oid, *doid; + const STACK_OF(ASN1_OBJECT) *policies) { if (!param) { return 0; } - if (param->policies) { - sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free); - } + sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free); if (!policies) { param->policies = NULL; return 1; } - param->policies = sk_ASN1_OBJECT_new_null(); + param->policies = + sk_ASN1_OBJECT_deep_copy(policies, OBJ_dup, ASN1_OBJECT_free); if (!param->policies) { return 0; } - for (i = 0; i < sk_ASN1_OBJECT_num(policies); i++) { - oid = sk_ASN1_OBJECT_value(policies, i); - doid = OBJ_dup(oid); - if (!doid) { - return 0; - } - if (!sk_ASN1_OBJECT_push(param->policies, doid)) { - ASN1_OBJECT_free(doid); - return 0; - } - } - param->flags |= X509_V_FLAG_POLICY_CHECK; return 1; } @@ -556,76 +541,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 **a, const X509_VERIFY_PARAM **b) { - return strcmp((*a)->name, (*b)->name); -} - -int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param) { - 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; - - 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); - (void)sk_X509_VERIFY_PARAM_delete(param_table, idx); - } - } - if (!sk_X509_VERIFY_PARAM_push(param_table, param)) { - return 0; - } - 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; - 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); - } - } - - 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/third_party/boringssl/src/crypto/x509/x509cset.c b/third_party/boringssl/src/crypto/x509/x509cset.c index 6eba6d1ea449..6dd1fc082629 100644 --- a/third_party/boringssl/src/crypto/x509/x509cset.c +++ b/third_party/boringssl/src/crypto/x509/x509cset.c @@ -59,6 +59,7 @@ #include #include +#include "../asn1/internal.h" #include "../internal.h" #include "internal.h" @@ -132,7 +133,7 @@ int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) { int X509_CRL_sort(X509_CRL *c) { // Sort the data so it will be written in serial number order. sk_X509_REVOKED_sort(c->crl->revoked); - c->crl->enc.modified = 1; + asn1_encoding_clear(&c->crl->enc); return 1; } @@ -241,7 +242,7 @@ const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions( } int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp) { - crl->crl->enc.modified = 1; + asn1_encoding_clear(&crl->crl->enc); return i2d_X509_CRL_INFO(crl->crl, outp); } diff --git a/third_party/boringssl/src/crypto/x509/x509name.c b/third_party/boringssl/src/crypto/x509/x509name.c index fcfbc0c91c9a..25f7b8b350bb 100644 --- a/third_party/boringssl/src/crypto/x509/x509name.c +++ b/third_party/boringssl/src/crypto/x509/x509name.c @@ -178,8 +178,8 @@ X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc) { } int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, - int type, const unsigned char *bytes, int len, - int loc, int set) { + int type, const unsigned char *bytes, + ossl_ssize_t len, int loc, int set) { X509_NAME_ENTRY *ne = X509_NAME_ENTRY_create_by_OBJ(NULL, obj, type, bytes, len); if (!ne) { @@ -191,8 +191,8 @@ int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, } int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, - const unsigned char *bytes, int len, int loc, - int set) { + const unsigned char *bytes, ossl_ssize_t len, + int loc, int set) { X509_NAME_ENTRY *ne = X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes, len); if (!ne) { @@ -204,8 +204,8 @@ int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, } int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, - const unsigned char *bytes, int len, int loc, - int set) { + const unsigned char *bytes, ossl_ssize_t len, + int loc, int set) { X509_NAME_ENTRY *ne = X509_NAME_ENTRY_create_by_txt(NULL, field, type, bytes, len); if (!ne) { @@ -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) { @@ -283,7 +282,7 @@ int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *entry, int loc, X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, const char *field, int type, const unsigned char *bytes, - int len) { + ossl_ssize_t len) { ASN1_OBJECT *obj; X509_NAME_ENTRY *nentry; @@ -301,7 +300,7 @@ X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, int type, const unsigned char *bytes, - int len) { + ossl_ssize_t len) { const ASN1_OBJECT *obj = OBJ_nid2obj(nid); if (obj == NULL) { OPENSSL_PUT_ERROR(X509, X509_R_UNKNOWN_NID); @@ -313,7 +312,7 @@ X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, const ASN1_OBJECT *obj, int type, const unsigned char *bytes, - int len) { + ossl_ssize_t len) { X509_NAME_ENTRY *ret; if ((ne == NULL) || (*ne == NULL)) { @@ -353,9 +352,7 @@ int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj) { } int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, - const unsigned char *bytes, int len) { - int i; - + const unsigned char *bytes, ossl_ssize_t len) { if ((ne == NULL) || ((bytes == NULL) && (len != 0))) { return 0; } @@ -368,8 +365,7 @@ int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, if (len < 0) { len = strlen((const char *)bytes); } - i = ASN1_STRING_set(ne->value, bytes, len); - if (!i) { + if (!ASN1_STRING_set(ne->value, bytes, len)) { return 0; } if (type != V_ASN1_UNDEF) { diff --git a/third_party/boringssl/src/crypto/x509/x509spki.c b/third_party/boringssl/src/crypto/x509/x509spki.c index 825153416eed..2b9b904eebce 100644 --- a/third_party/boringssl/src/crypto/x509/x509spki.c +++ b/third_party/boringssl/src/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; @@ -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/third_party/boringssl/src/crypto/x509/x_all.c b/third_party/boringssl/src/crypto/x509/x_all.c index bad9ce6221f7..6808ab78b1a7 100644 --- a/third_party/boringssl/src/crypto/x509/x_all.c +++ b/third_party/boringssl/src/crypto/x509/x_all.c @@ -66,6 +66,7 @@ #include #include +#include "../asn1/internal.h" #include "internal.h" @@ -84,35 +85,37 @@ int X509_REQ_verify(X509_REQ *req, EVP_PKEY *pkey) { } int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md) { - x->cert_info->enc.modified = 1; + asn1_encoding_clear(&x->cert_info->enc); return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature, x->sig_alg, x->signature, x->cert_info, pkey, md)); } int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx) { - x->cert_info->enc.modified = 1; + asn1_encoding_clear(&x->cert_info->enc); return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature, x->sig_alg, x->signature, x->cert_info, ctx); } int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md) { + asn1_encoding_clear(&x->req_info->enc); return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL, x->signature, x->req_info, pkey, md)); } int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx) { + asn1_encoding_clear(&x->req_info->enc); return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL, x->signature, x->req_info, ctx); } int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md) { - x->crl->enc.modified = 1; + asn1_encoding_clear(&x->crl->enc); return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg, x->sig_alg, x->signature, x->crl, pkey, md)); } int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx) { - x->crl->enc.modified = 1; + asn1_encoding_clear(&x->crl->enc); return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg, x->sig_alg, x->signature, x->crl, ctx); } @@ -127,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); } @@ -198,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) @@ -232,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) @@ -275,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/third_party/boringssl/src/crypto/x509/x_crl.c b/third_party/boringssl/src/crypto/x509/x_crl.c index c153b5d44a40..4a645bad0557 100644 --- a/third_party/boringssl/src/crypto/x509/x_crl.c +++ b/third_party/boringssl/src/crypto/x509/x_crl.c @@ -67,10 +67,12 @@ #include +#include "../asn1/internal.h" #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) = { @@ -360,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); } @@ -371,10 +374,9 @@ 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; } - inf->enc.modified = 1; + asn1_encoding_clear(&inf->enc); return 1; } diff --git a/third_party/boringssl/src/crypto/x509/x_info.c b/third_party/boringssl/src/crypto/x509/x_info.c index e6f9be2c095c..0f074f613ce1 100644 --- a/third_party/boringssl/src/crypto/x509/x_info.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/x509/x_name.c b/third_party/boringssl/src/crypto/x509/x_name.c index a17d9d73f63a..a65c116d3b77 100644 --- a/third_party/boringssl/src/crypto/x509/x_name.c +++ b/third_party/boringssl/src/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) @@ -154,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); @@ -189,8 +186,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 +204,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, /*buf=*/NULL); if (ret <= 0) { return ret; } @@ -258,7 +255,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; @@ -281,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; @@ -307,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), @@ -317,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; @@ -443,12 +438,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 +449,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 +458,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 +468,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/third_party/boringssl/src/crypto/x509/x_pkey.c b/third_party/boringssl/src/crypto/x509/x_pkey.c index 52bc5b673dc3..d48ecd111f4a 100644 --- a/third_party/boringssl/src/crypto/x509/x_pkey.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/x509/x_sig.c b/third_party/boringssl/src/crypto/x509/x_sig.c index 4710cae85a23..adf224df44c4 100644 --- a/third_party/boringssl/src/crypto/x509/x_sig.c +++ b/third_party/boringssl/src/crypto/x509/x_sig.c @@ -1,4 +1,3 @@ -/* crypto/asn1/x_sig.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/crypto/x509/x_spki.c b/third_party/boringssl/src/crypto/x509/x_spki.c index 589987821cad..905a87be3994 100644 --- a/third_party/boringssl/src/crypto/x509/x_spki.c +++ b/third_party/boringssl/src/crypto/x509/x_spki.c @@ -1,4 +1,3 @@ -/* crypto/asn1/x_spki.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/crypto/x509/x_val.c b/third_party/boringssl/src/crypto/x509/x_val.c index 62dbf6fef230..cc02e92fb32e 100644 --- a/third_party/boringssl/src/crypto/x509/x_val.c +++ b/third_party/boringssl/src/crypto/x509/x_val.c @@ -1,4 +1,3 @@ -/* crypto/asn1/x_val.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/crypto/x509/x_x509.c b/third_party/boringssl/src/crypto/x509/x_x509.c index 27cbd9938935..31dbebe15936 100644 --- a/third_party/boringssl/src/crypto/x509/x_x509.c +++ b/third_party/boringssl/src/crypto/x509/x_x509.c @@ -1,4 +1,3 @@ -/* crypto/asn1/x_x509.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -68,6 +67,8 @@ #include #include +#include "../asn1/internal.h" +#include "../bytestring/internal.h" #include "../internal.h" #include "internal.h" @@ -87,115 +88,289 @@ 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 - -extern void policy_cache_free(X509_POLICY_CACHE *cache); - -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; - 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; - 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; +} + +X509 *X509_new(void) { + X509 *ret = x509_new_null(); + if (ret == NULL) { + return NULL; + } + + 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 ret; +} + +void X509_free(X509 *x509) { + if (x509 == NULL || !CRYPTO_refcount_dec_and_test_zero(&x509->references)) { + return; + } + + CRYPTO_free_ex_data(&g_ex_data_class, x509, &x509->ex_data); + + 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); +} + +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; + } - break; + // 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 != 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; } + } - 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); - policy_cache_free(ret->policy_cache); - GENERAL_NAMES_free(ret->altname); - NAME_CONSTRAINTS_free(ret->nc); - CRYPTO_BUFFER_free(ret->buf); - break; + // 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; } - return 1; + // 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; } -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) +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; + } -IMPLEMENT_ASN1_FUNCTIONS(X509) + // 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; + } -IMPLEMENT_ASN1_DUP_FUNCTION(X509) + 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; + } -X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf) { - if (CRYPTO_BUFFER_len(buf) > LONG_MAX) { - OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW); + 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; +} + +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; } - X509 *x509 = X509_new(); - if (x509 == NULL) { - return NULL; + 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; } - x509->cert_info->enc.alias_only_on_next_parse = 1; + *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); +} - 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); +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); + if (len < 0) { return NULL; } - assert(x509p == x509); - assert(ret == x509); - CRYPTO_BUFFER_up_ref(buf); - ret->buf = buf; + 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; + } return ret; } @@ -329,7 +504,7 @@ int i2d_X509_AUX(X509 *a, unsigned char **pp) { } int i2d_re_X509_tbs(X509 *x509, unsigned char **outp) { - x509->cert_info->enc.modified = 1; + asn1_encoding_clear(&x509->cert_info->enc); return i2d_X509_CINF(x509->cert_info, outp); } diff --git a/third_party/boringssl/src/crypto/x509/x_x509a.c b/third_party/boringssl/src/crypto/x509/x_x509a.c index c473f93dd12d..4b34caaa7370 100644 --- a/third_party/boringssl/src/crypto/x509/x_x509a.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/crypto/x509v3/ext_dat.h b/third_party/boringssl/src/crypto/x509v3/ext_dat.h index 84dc693b835c..502bf3656b07 100644 --- a/third_party/boringssl/src/crypto/x509v3/ext_dat.h +++ b/third_party/boringssl/src/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; @@ -118,7 +118,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/third_party/boringssl/src/crypto/x509v3/internal.h b/third_party/boringssl/src/crypto/x509v3/internal.h index 9c9c42540836..315d9343dcb2 100644 --- a/third_party/boringssl/src/crypto/x509v3/internal.h +++ b/third_party/boringssl/src/crypto/x509v3/internal.h @@ -90,11 +90,11 @@ 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_name_cmp returns zero if |name| is equal to |cmp| or begins with |cmp| -// followed by '.'. Otherwise, it returns a non-zero number. -int x509v3_name_cmp(const char *name, const char *cmp); +// x509v3_conf_name_matches returns one if |name| is equal to |cmp| or begins +// with |cmp| followed by '.', and zero otherwise. +int x509v3_conf_name_matches(const char *name, const char *cmp); // x509v3_looks_like_dns_name returns one if |in| looks like a DNS name and zero // otherwise. @@ -104,7 +104,7 @@ OPENSSL_EXPORT int x509v3_looks_like_dns_name(const unsigned char *in, // x509v3_cache_extensions fills in a number of fields relating to X.509 // extensions in |x|. It returns one on success and zero if some extensions were // invalid. -int x509v3_cache_extensions(X509 *x); +OPENSSL_EXPORT int x509v3_cache_extensions(X509 *x); // x509v3_a2i_ipadd decodes |ipasc| as an IPv4 or IPv6 address. IPv6 addresses // use colon-separated syntax while IPv4 addresses use dotted decimal syntax. If @@ -127,162 +127,67 @@ typedef struct { int x509V3_add_value_asn1_string(const char *name, const ASN1_STRING *value, STACK_OF(CONF_VALUE) **extlist); - -// Internal structures - -// This structure and the field names correspond to the Policy 'node' of -// RFC 3280. NB this structure contains no pointers to parent or child data: -// X509_POLICY_NODE contains that. This means that the main policy data can -// be kept static and cached with the certificate. - -typedef struct X509_POLICY_DATA_st X509_POLICY_DATA; -typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL; -typedef struct X509_POLICY_NODE_st X509_POLICY_NODE; - -DEFINE_STACK_OF(X509_POLICY_DATA) - -struct X509_POLICY_DATA_st { - unsigned int flags; - // Policy OID and qualifiers for this data - ASN1_OBJECT *valid_policy; - STACK_OF(POLICYQUALINFO) *qualifier_set; - STACK_OF(ASN1_OBJECT) *expected_policy_set; -}; - -// X509_POLICY_DATA flags values - -// This flag indicates the structure has been mapped using a policy mapping -// extension. If policy mapping is not active its references get deleted. - -#define POLICY_DATA_FLAG_MAPPED 0x1 - -// This flag indicates the data doesn't correspond to a policy in Certificate -// Policies: it has been mapped to any policy. - -#define POLICY_DATA_FLAG_MAPPED_ANY 0x2 - -// AND with flags to see if any mapping has occurred - -#define POLICY_DATA_FLAG_MAP_MASK 0x3 - -// qualifiers are shared and shouldn't be freed - -#define POLICY_DATA_FLAG_SHARED_QUALIFIERS 0x4 - -// Parent node is an extra node and should be freed - -#define POLICY_DATA_FLAG_EXTRA_NODE 0x8 - -// Corresponding CertificatePolicies is critical - -#define POLICY_DATA_FLAG_CRITICAL 0x10 - -// This structure is cached with a certificate - -struct X509_POLICY_CACHE_st { - // anyPolicy data or NULL if no anyPolicy - X509_POLICY_DATA *anyPolicy; - // other policy data - STACK_OF(X509_POLICY_DATA) *data; - // If InhibitAnyPolicy present this is its value or -1 if absent. - long any_skip; - // If policyConstraints and requireExplicitPolicy present this is its - // value or -1 if absent. - long explicit_skip; - // If policyConstraints and policyMapping present this is its value or -1 - // if absent. - long map_skip; -}; - -// #define POLICY_CACHE_FLAG_CRITICAL POLICY_DATA_FLAG_CRITICAL - -// This structure represents the relationship between nodes - -struct X509_POLICY_NODE_st { - // node data this refers to - const X509_POLICY_DATA *data; - // Parent node - X509_POLICY_NODE *parent; - // Number of child nodes - int nchild; -}; - -DEFINE_STACK_OF(X509_POLICY_NODE) - -struct X509_POLICY_LEVEL_st { - // Cert for this level - X509 *cert; - // nodes at this level - STACK_OF(X509_POLICY_NODE) *nodes; - // anyPolicy node - X509_POLICY_NODE *anyPolicy; - // Extra data - // - // STACK_OF(X509_POLICY_DATA) *extra_data; - unsigned int flags; -}; - -struct X509_POLICY_TREE_st { - // This is the tree 'level' data - X509_POLICY_LEVEL *levels; - int nlevel; - // Extra policy data when additional nodes (not from the certificate) are - // required. - STACK_OF(X509_POLICY_DATA) *extra_data; - // This is the authority constained policy set - STACK_OF(X509_POLICY_NODE) *auth_policies; - STACK_OF(X509_POLICY_NODE) *user_policies; - unsigned int flags; -}; - -// Set if anyPolicy present in user policies -#define POLICY_FLAG_ANY_POLICY 0x2 - -// Useful macros - -#define node_data_critical(data) ((data)->flags & POLICY_DATA_FLAG_CRITICAL) -#define node_critical(node) node_data_critical((node)->data) - -// Internal functions - -void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); - -int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, - STACK_OF(X509) *certs, STACK_OF(ASN1_OBJECT) *policy_oids, - unsigned int flags); - -void X509_policy_tree_free(X509_POLICY_TREE *tree); - -X509_POLICY_DATA *policy_data_new(POLICYINFO *policy, const ASN1_OBJECT *id, - int crit); -void policy_data_free(X509_POLICY_DATA *data); - -X509_POLICY_DATA *policy_cache_find_data(const X509_POLICY_CACHE *cache, - const ASN1_OBJECT *id); -int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps); - -STACK_OF(X509_POLICY_NODE) *policy_node_cmp_new(void); - -void policy_cache_init(void); - -void policy_cache_free(X509_POLICY_CACHE *cache); - -X509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level, - const X509_POLICY_NODE *parent, - const ASN1_OBJECT *id); - -X509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *sk, - const ASN1_OBJECT *id); - -X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level, - X509_POLICY_DATA *data, - X509_POLICY_NODE *parent, - X509_POLICY_TREE *tree); -void policy_node_free(X509_POLICY_NODE *node); -int policy_node_match(const X509_POLICY_LEVEL *lvl, - const X509_POLICY_NODE *node, const ASN1_OBJECT *oid); - -const X509_POLICY_CACHE *policy_cache_set(X509 *x); +// X509V3_NAME_from_section adds attributes to |nm| by interpreting the +// key/value pairs in |dn_sk|. It returns one on success and zero on error. +// |chtype|, which should be one of |MBSTRING_*| constants, determines the +// character encoding used to interpret values. +int X509V3_NAME_from_section(X509_NAME *nm, const STACK_OF(CONF_VALUE) *dn_sk, + int chtype); + +// 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); + +// 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); + +// X509V3_add_value appends a |CONF_VALUE| containing |name| and |value| to +// |*extlist|. It returns one on success and zero on error. If |*extlist| is +// NULL, it sets |*extlist| to a newly-allocated |STACK_OF(CONF_VALUE)| +// containing the result. Either |name| or |value| may be NULL to omit the +// field. +// +// On failure, if |*extlist| was NULL, |*extlist| will remain NULL when the +// function returns. +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); + +// X509V3_add_value_bool behaves like |X509V3_add_value| but stores the value +// "TRUE" if |asn1_bool| is non-zero and "FALSE" otherwise. +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); + +// X509V3_add_value_bool behaves like |X509V3_add_value| but stores a string +// representation of |aint|. Note this string representation may be decimal or +// hexadecimal, depending on the size of |aint|. +int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); + +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); + +#define X509V3_conf_err(val) \ + 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) diff --git a/third_party/boringssl/src/crypto/x509v3/pcy_cache.c b/third_party/boringssl/src/crypto/x509v3/pcy_cache.c deleted file mode 100644 index 74f95f93bf7d..000000000000 --- a/third_party/boringssl/src/crypto/x509v3/pcy_cache.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project - * 2004. - */ -/* ==================================================================== - * Copyright (c) 2004 The OpenSSL Project. 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. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * licensing@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED 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 OpenSSL PROJECT OR - * ITS 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. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). */ - -#include -#include -#include -#include -#include - -#include "../internal.h" -#include "../x509/internal.h" -#include "internal.h" - -static int policy_data_cmp(const X509_POLICY_DATA **a, - const X509_POLICY_DATA **b); -static int policy_cache_set_int(long *out, ASN1_INTEGER *value); - -// Set cache entry according to CertificatePolicies extension. Note: this -// destroys the passed CERTIFICATEPOLICIES structure. - -static int policy_cache_create(X509 *x, CERTIFICATEPOLICIES *policies, - int crit) { - size_t i; - int ret = 0; - X509_POLICY_CACHE *cache = x->policy_cache; - X509_POLICY_DATA *data = NULL; - POLICYINFO *policy; - if (sk_POLICYINFO_num(policies) == 0) { - goto bad_policy; - } - cache->data = sk_X509_POLICY_DATA_new(policy_data_cmp); - if (!cache->data) { - goto bad_policy; - } - for (i = 0; i < sk_POLICYINFO_num(policies); i++) { - policy = sk_POLICYINFO_value(policies, i); - data = policy_data_new(policy, NULL, crit); - if (!data) { - goto bad_policy; - } - // Duplicate policy OIDs are illegal: reject if matches found. - sk_X509_POLICY_DATA_sort(cache->data); - if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) { - if (cache->anyPolicy) { - ret = -1; - goto bad_policy; - } - cache->anyPolicy = data; - } else if (sk_X509_POLICY_DATA_find(cache->data, NULL, data)) { - ret = -1; - goto bad_policy; - } else if (!sk_X509_POLICY_DATA_push(cache->data, data)) { - goto bad_policy; - } - data = NULL; - } - ret = 1; -bad_policy: - if (ret == -1) { - x->ex_flags |= EXFLAG_INVALID_POLICY; - } - if (data) { - policy_data_free(data); - } - sk_POLICYINFO_pop_free(policies, POLICYINFO_free); - if (ret <= 0) { - sk_X509_POLICY_DATA_pop_free(cache->data, policy_data_free); - cache->data = NULL; - } - return ret; -} - -static int policy_cache_new(X509 *x) { - X509_POLICY_CACHE *cache; - ASN1_INTEGER *ext_any = NULL; - POLICY_CONSTRAINTS *ext_pcons = NULL; - CERTIFICATEPOLICIES *ext_cpols = NULL; - POLICY_MAPPINGS *ext_pmaps = NULL; - int i; - cache = OPENSSL_malloc(sizeof(X509_POLICY_CACHE)); - if (!cache) { - return 0; - } - cache->anyPolicy = NULL; - cache->data = NULL; - cache->any_skip = -1; - cache->explicit_skip = -1; - cache->map_skip = -1; - - x->policy_cache = cache; - - // Handle requireExplicitPolicy *first*. Need to process this even if we - // don't have any policies. - ext_pcons = X509_get_ext_d2i(x, NID_policy_constraints, &i, NULL); - - if (!ext_pcons) { - if (i != -1) { - goto bad_cache; - } - } else { - if (!ext_pcons->requireExplicitPolicy && !ext_pcons->inhibitPolicyMapping) { - goto bad_cache; - } - if (!policy_cache_set_int(&cache->explicit_skip, - ext_pcons->requireExplicitPolicy)) { - goto bad_cache; - } - if (!policy_cache_set_int(&cache->map_skip, - ext_pcons->inhibitPolicyMapping)) { - goto bad_cache; - } - } - - // Process CertificatePolicies - - ext_cpols = X509_get_ext_d2i(x, NID_certificate_policies, &i, NULL); - // If no CertificatePolicies extension or problem decoding then there is - // no point continuing because the valid policies will be NULL. - if (!ext_cpols) { - // If not absent some problem with extension - if (i != -1) { - goto bad_cache; - } - return 1; - } - - i = policy_cache_create(x, ext_cpols, i); - - // NB: ext_cpols freed by policy_cache_set_policies - - if (i <= 0) { - return i; - } - - ext_pmaps = X509_get_ext_d2i(x, NID_policy_mappings, &i, NULL); - - if (!ext_pmaps) { - // If not absent some problem with extension - if (i != -1) { - goto bad_cache; - } - } else { - i = policy_cache_set_mapping(x, ext_pmaps); - if (i <= 0) { - goto bad_cache; - } - } - - ext_any = X509_get_ext_d2i(x, NID_inhibit_any_policy, &i, NULL); - - if (!ext_any) { - if (i != -1) { - goto bad_cache; - } - } else if (!policy_cache_set_int(&cache->any_skip, ext_any)) { - goto bad_cache; - } - - if (0) { - bad_cache: - x->ex_flags |= EXFLAG_INVALID_POLICY; - } - - if (ext_pcons) { - POLICY_CONSTRAINTS_free(ext_pcons); - } - - if (ext_any) { - ASN1_INTEGER_free(ext_any); - } - - return 1; -} - -void policy_cache_free(X509_POLICY_CACHE *cache) { - if (!cache) { - return; - } - if (cache->anyPolicy) { - policy_data_free(cache->anyPolicy); - } - if (cache->data) { - sk_X509_POLICY_DATA_pop_free(cache->data, policy_data_free); - } - OPENSSL_free(cache); -} - -// g_x509_policy_cache_lock is used to protect against concurrent calls to -// |policy_cache_new|. Ideally this would be done with a |CRYPTO_once_t| in -// the |X509| structure, but |CRYPTO_once_t| isn't public. -static struct CRYPTO_STATIC_MUTEX g_x509_policy_cache_lock = - CRYPTO_STATIC_MUTEX_INIT; - -const X509_POLICY_CACHE *policy_cache_set(X509 *x) { - X509_POLICY_CACHE *cache; - - CRYPTO_STATIC_MUTEX_lock_read(&g_x509_policy_cache_lock); - cache = x->policy_cache; - CRYPTO_STATIC_MUTEX_unlock_read(&g_x509_policy_cache_lock); - - if (cache != NULL) { - return cache; - } - - CRYPTO_STATIC_MUTEX_lock_write(&g_x509_policy_cache_lock); - if (x->policy_cache == NULL) { - policy_cache_new(x); - } - cache = x->policy_cache; - CRYPTO_STATIC_MUTEX_unlock_write(&g_x509_policy_cache_lock); - - return cache; -} - -X509_POLICY_DATA *policy_cache_find_data(const X509_POLICY_CACHE *cache, - const ASN1_OBJECT *id) { - size_t idx; - X509_POLICY_DATA tmp; - - tmp.valid_policy = (ASN1_OBJECT *)id; - sk_X509_POLICY_DATA_sort(cache->data); - if (!sk_X509_POLICY_DATA_find(cache->data, &idx, &tmp)) { - return NULL; - } - return sk_X509_POLICY_DATA_value(cache->data, idx); -} - -static int policy_data_cmp(const X509_POLICY_DATA **a, - const X509_POLICY_DATA **b) { - return OBJ_cmp((*a)->valid_policy, (*b)->valid_policy); -} - -static int policy_cache_set_int(long *out, ASN1_INTEGER *value) { - if (value == NULL) { - return 1; - } - if (value->type == V_ASN1_NEG_INTEGER) { - return 0; - } - *out = ASN1_INTEGER_get(value); - return 1; -} diff --git a/third_party/boringssl/src/crypto/x509v3/pcy_data.c b/third_party/boringssl/src/crypto/x509v3/pcy_data.c deleted file mode 100644 index 28a572f2941e..000000000000 --- a/third_party/boringssl/src/crypto/x509v3/pcy_data.c +++ /dev/null @@ -1,134 +0,0 @@ -/* pcy_data.c */ -/* - * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project - * 2004. - */ -/* ==================================================================== - * Copyright (c) 2004 The OpenSSL Project. 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. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * licensing@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED 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 OpenSSL PROJECT OR - * ITS 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. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -#include -#include -#include -#include - -#include "internal.h" - -// Policy Node routines - -void policy_data_free(X509_POLICY_DATA *data) { - ASN1_OBJECT_free(data->valid_policy); - // Don't free qualifiers if shared - if (!(data->flags & POLICY_DATA_FLAG_SHARED_QUALIFIERS)) { - sk_POLICYQUALINFO_pop_free(data->qualifier_set, POLICYQUALINFO_free); - } - sk_ASN1_OBJECT_pop_free(data->expected_policy_set, ASN1_OBJECT_free); - OPENSSL_free(data); -} - -// Create a data based on an existing policy. If 'id' is NULL use the oid in -// the policy, otherwise use 'id'. This behaviour covers the two types of -// data in RFC 3280: data with from a CertificatePolcies extension and -// additional data with just the qualifiers of anyPolicy and ID from another -// source. - -X509_POLICY_DATA *policy_data_new(POLICYINFO *policy, const ASN1_OBJECT *cid, - int crit) { - X509_POLICY_DATA *ret; - ASN1_OBJECT *id; - if (!policy && !cid) { - return NULL; - } - if (cid) { - id = OBJ_dup(cid); - if (!id) { - return NULL; - } - } else { - id = NULL; - } - ret = OPENSSL_malloc(sizeof(X509_POLICY_DATA)); - if (!ret) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - ASN1_OBJECT_free(id); - return NULL; - } - ret->expected_policy_set = sk_ASN1_OBJECT_new_null(); - if (!ret->expected_policy_set) { - OPENSSL_free(ret); - ASN1_OBJECT_free(id); - return NULL; - } - - if (crit) { - ret->flags = POLICY_DATA_FLAG_CRITICAL; - } else { - ret->flags = 0; - } - - if (id) { - ret->valid_policy = id; - } else { - ret->valid_policy = policy->policyid; - policy->policyid = NULL; - } - - if (policy) { - ret->qualifier_set = policy->qualifiers; - policy->qualifiers = NULL; - } else { - ret->qualifier_set = NULL; - } - - return ret; -} diff --git a/third_party/boringssl/src/crypto/x509v3/pcy_map.c b/third_party/boringssl/src/crypto/x509v3/pcy_map.c deleted file mode 100644 index e4fa9a1e61a8..000000000000 --- a/third_party/boringssl/src/crypto/x509v3/pcy_map.c +++ /dev/null @@ -1,129 +0,0 @@ -/* pcy_map.c */ -/* - * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project - * 2004. - */ -/* ==================================================================== - * Copyright (c) 2004 The OpenSSL Project. 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. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * licensing@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED 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 OpenSSL PROJECT OR - * ITS 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. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -#include -#include -#include - -#include "../x509/internal.h" -#include "internal.h" - -// Set policy mapping entries in cache. Note: this modifies the passed -// POLICY_MAPPINGS structure - -int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps) { - POLICY_MAPPING *map; - X509_POLICY_DATA *data; - X509_POLICY_CACHE *cache = x->policy_cache; - size_t i; - int ret = 0; - if (sk_POLICY_MAPPING_num(maps) == 0) { - ret = -1; - goto bad_mapping; - } - for (i = 0; i < sk_POLICY_MAPPING_num(maps); i++) { - map = sk_POLICY_MAPPING_value(maps, i); - // Reject if map to or from anyPolicy - if ((OBJ_obj2nid(map->subjectDomainPolicy) == NID_any_policy) || - (OBJ_obj2nid(map->issuerDomainPolicy) == NID_any_policy)) { - ret = -1; - goto bad_mapping; - } - - // Attempt to find matching policy data - data = policy_cache_find_data(cache, map->issuerDomainPolicy); - // If we don't have anyPolicy can't map - if (!data && !cache->anyPolicy) { - continue; - } - - // Create a NODE from anyPolicy - if (!data) { - data = - policy_data_new(NULL, map->issuerDomainPolicy, - cache->anyPolicy->flags & POLICY_DATA_FLAG_CRITICAL); - if (!data) { - goto bad_mapping; - } - data->qualifier_set = cache->anyPolicy->qualifier_set; - // map->issuerDomainPolicy = NULL; - data->flags |= POLICY_DATA_FLAG_MAPPED_ANY; - data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS; - if (!sk_X509_POLICY_DATA_push(cache->data, data)) { - policy_data_free(data); - goto bad_mapping; - } - } else { - data->flags |= POLICY_DATA_FLAG_MAPPED; - } - if (!sk_ASN1_OBJECT_push(data->expected_policy_set, - map->subjectDomainPolicy)) { - goto bad_mapping; - } - map->subjectDomainPolicy = NULL; - } - - ret = 1; -bad_mapping: - if (ret == -1) { - x->ex_flags |= EXFLAG_INVALID_POLICY; - } - sk_POLICY_MAPPING_pop_free(maps, POLICY_MAPPING_free); - return ret; -} diff --git a/third_party/boringssl/src/crypto/x509v3/pcy_node.c b/third_party/boringssl/src/crypto/x509v3/pcy_node.c deleted file mode 100644 index 71847f3473f1..000000000000 --- a/third_party/boringssl/src/crypto/x509v3/pcy_node.c +++ /dev/null @@ -1,187 +0,0 @@ -/* pcy_node.c */ -/* - * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project - * 2004. - */ -/* ==================================================================== - * Copyright (c) 2004 The OpenSSL Project. 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. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * licensing@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED 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 OpenSSL PROJECT OR - * ITS 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. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). */ - -#include -#include -#include -#include -#include - -#include "internal.h" - -static int node_cmp(const X509_POLICY_NODE **a, const X509_POLICY_NODE **b) { - return OBJ_cmp((*a)->data->valid_policy, (*b)->data->valid_policy); -} - -STACK_OF(X509_POLICY_NODE) *policy_node_cmp_new(void) { - return sk_X509_POLICY_NODE_new(node_cmp); -} - -X509_POLICY_NODE *tree_find_sk(STACK_OF(X509_POLICY_NODE) *nodes, - const ASN1_OBJECT *id) { - X509_POLICY_DATA n; - X509_POLICY_NODE l; - size_t idx; - - n.valid_policy = (ASN1_OBJECT *)id; - l.data = &n; - - sk_X509_POLICY_NODE_sort(nodes); - if (!sk_X509_POLICY_NODE_find(nodes, &idx, &l)) { - return NULL; - } - - return sk_X509_POLICY_NODE_value(nodes, idx); -} - -X509_POLICY_NODE *level_find_node(const X509_POLICY_LEVEL *level, - const X509_POLICY_NODE *parent, - const ASN1_OBJECT *id) { - X509_POLICY_NODE *node; - size_t i; - for (i = 0; i < sk_X509_POLICY_NODE_num(level->nodes); i++) { - node = sk_X509_POLICY_NODE_value(level->nodes, i); - if (node->parent == parent) { - if (!OBJ_cmp(node->data->valid_policy, id)) { - return node; - } - } - } - return NULL; -} - -X509_POLICY_NODE *level_add_node(X509_POLICY_LEVEL *level, - X509_POLICY_DATA *data, - X509_POLICY_NODE *parent, - X509_POLICY_TREE *tree) { - X509_POLICY_NODE *node; - node = OPENSSL_malloc(sizeof(X509_POLICY_NODE)); - if (!node) { - return NULL; - } - node->data = data; - node->parent = parent; - node->nchild = 0; - if (level) { - if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) { - if (level->anyPolicy) { - goto node_error; - } - level->anyPolicy = node; - } else { - if (!level->nodes) { - level->nodes = policy_node_cmp_new(); - } - if (!level->nodes) { - goto node_error; - } - if (!sk_X509_POLICY_NODE_push(level->nodes, node)) { - goto node_error; - } - } - } - - if (tree) { - if (!tree->extra_data) { - tree->extra_data = sk_X509_POLICY_DATA_new_null(); - } - if (!tree->extra_data) { - goto node_error; - } - if (!sk_X509_POLICY_DATA_push(tree->extra_data, data)) { - goto node_error; - } - } - - if (parent) { - parent->nchild++; - } - - return node; - -node_error: - policy_node_free(node); - return 0; -} - -void policy_node_free(X509_POLICY_NODE *node) { OPENSSL_free(node); } - -// See if a policy node matches a policy OID. If mapping enabled look through -// expected policy set otherwise just valid policy. - -int policy_node_match(const X509_POLICY_LEVEL *lvl, - const X509_POLICY_NODE *node, const ASN1_OBJECT *oid) { - size_t i; - ASN1_OBJECT *policy_oid; - const X509_POLICY_DATA *x = node->data; - - if ((lvl->flags & X509_V_FLAG_INHIBIT_MAP) || - !(x->flags & POLICY_DATA_FLAG_MAP_MASK)) { - if (!OBJ_cmp(x->valid_policy, oid)) { - return 1; - } - return 0; - } - - for (i = 0; i < sk_ASN1_OBJECT_num(x->expected_policy_set); i++) { - policy_oid = sk_ASN1_OBJECT_value(x->expected_policy_set, i); - if (!OBJ_cmp(policy_oid, oid)) { - return 1; - } - } - return 0; -} diff --git a/third_party/boringssl/src/crypto/x509v3/pcy_tree.c b/third_party/boringssl/src/crypto/x509v3/pcy_tree.c deleted file mode 100644 index 44ade30c53d8..000000000000 --- a/third_party/boringssl/src/crypto/x509v3/pcy_tree.c +++ /dev/null @@ -1,829 +0,0 @@ -/* - * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project - * 2004. - */ -/* ==================================================================== - * Copyright (c) 2004 The OpenSSL Project. 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. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * licensing@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED 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 OpenSSL PROJECT OR - * ITS 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. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include "../internal.h" -#include "../x509/internal.h" -#include "internal.h" - -// Enable this to print out the complete policy tree at various point during -// evaluation. - -// #define OPENSSL_POLICY_DEBUG - -#ifdef OPENSSL_POLICY_DEBUG - -static void expected_print(BIO *err, X509_POLICY_LEVEL *lev, - X509_POLICY_NODE *node, int indent) { - if ((lev->flags & X509_V_FLAG_INHIBIT_MAP) || - !(node->data->flags & POLICY_DATA_FLAG_MAP_MASK)) { - BIO_puts(err, " Not Mapped\n"); - } else { - int i; - STACK_OF(ASN1_OBJECT) *pset = node->data->expected_policy_set; - ASN1_OBJECT *oid; - BIO_puts(err, " Expected: "); - for (i = 0; i < sk_ASN1_OBJECT_num(pset); i++) { - oid = sk_ASN1_OBJECT_value(pset, i); - if (i) { - BIO_puts(err, ", "); - } - i2a_ASN1_OBJECT(err, oid); - } - BIO_puts(err, "\n"); - } -} - -static void tree_print(char *str, X509_POLICY_TREE *tree, - X509_POLICY_LEVEL *curr) { - X509_POLICY_LEVEL *plev; - X509_POLICY_NODE *node; - int i; - BIO *err; - err = BIO_new_fp(stderr, BIO_NOCLOSE); - if (!curr) { - curr = tree->levels + tree->nlevel; - } else { - curr++; - } - BIO_printf(err, "Level print after %s\n", str); - BIO_printf(err, "Printing Up to Level %ld\n", curr - tree->levels); - for (plev = tree->levels; plev != curr; plev++) { - BIO_printf(err, "Level %ld, flags = %x\n", plev - tree->levels, - plev->flags); - for (i = 0; i < sk_X509_POLICY_NODE_num(plev->nodes); i++) { - node = sk_X509_POLICY_NODE_value(plev->nodes, i); - X509_POLICY_NODE_print(err, node, 2); - expected_print(err, plev, node, 2); - BIO_printf(err, " Flags: %x\n", node->data->flags); - } - if (plev->anyPolicy) { - X509_POLICY_NODE_print(err, plev->anyPolicy, 2); - } - } - - BIO_free(err); -} -#else - -#define tree_print(a, b, c) // - -#endif - -//- -// Initialize policy tree. Return values: -// 0 Some internal error occurred. -// -1 Inconsistent or invalid extensions in certificates. -// 1 Tree initialized OK. -// 2 Policy tree is empty. -// 5 Tree OK and requireExplicitPolicy true. -// 6 Tree empty and requireExplicitPolicy true. - -static int tree_init(X509_POLICY_TREE **ptree, STACK_OF(X509) *certs, - unsigned int flags) { - X509_POLICY_TREE *tree; - X509_POLICY_LEVEL *level; - const X509_POLICY_CACHE *cache; - X509_POLICY_DATA *data = NULL; - X509 *x; - int ret = 1; - int i, n; - int explicit_policy; - int any_skip; - int map_skip; - *ptree = NULL; - n = sk_X509_num(certs); - -#if 0 - // Disable policy mapping for now... - flags |= X509_V_FLAG_INHIBIT_MAP; -#endif - - if (flags & X509_V_FLAG_EXPLICIT_POLICY) { - explicit_policy = 0; - } else { - explicit_policy = n + 1; - } - - if (flags & X509_V_FLAG_INHIBIT_ANY) { - any_skip = 0; - } else { - any_skip = n + 1; - } - - if (flags & X509_V_FLAG_INHIBIT_MAP) { - map_skip = 0; - } else { - map_skip = n + 1; - } - - // Can't do anything with just a trust anchor - if (n == 1) { - return 1; - } - // First setup policy cache in all certificates apart from the trust - // anchor. Note any bad cache results on the way. Also can calculate - // explicit_policy value at this point. - for (i = n - 2; i >= 0; i--) { - x = sk_X509_value(certs, i); - X509_check_purpose(x, -1, -1); - cache = policy_cache_set(x); - // If cache NULL something bad happened: return immediately - if (cache == NULL) { - return 0; - } - // If inconsistent extensions keep a note of it but continue - if (x->ex_flags & EXFLAG_INVALID_POLICY) { - ret = -1; - } - // Otherwise if we have no data (hence no CertificatePolicies) and - // haven't already set an inconsistent code note it. - else if ((ret == 1) && !cache->data) { - ret = 2; - } - if (explicit_policy > 0) { - if (!(x->ex_flags & EXFLAG_SI)) { - explicit_policy--; - } - if ((cache->explicit_skip != -1) && - (cache->explicit_skip < explicit_policy)) { - explicit_policy = cache->explicit_skip; - } - } - } - - if (ret != 1) { - if (ret == 2 && !explicit_policy) { - return 6; - } - return ret; - } - - // If we get this far initialize the tree - - tree = OPENSSL_malloc(sizeof(X509_POLICY_TREE)); - - if (!tree) { - return 0; - } - - tree->flags = 0; - tree->levels = OPENSSL_malloc(sizeof(X509_POLICY_LEVEL) * n); - tree->nlevel = 0; - tree->extra_data = NULL; - tree->auth_policies = NULL; - tree->user_policies = NULL; - - if (!tree->levels) { - OPENSSL_free(tree); - return 0; - } - - OPENSSL_memset(tree->levels, 0, n * sizeof(X509_POLICY_LEVEL)); - - tree->nlevel = n; - - level = tree->levels; - - // Root data: initialize to anyPolicy - - data = policy_data_new(NULL, OBJ_nid2obj(NID_any_policy), 0); - - if (!data || !level_add_node(level, data, NULL, tree)) { - goto bad_tree; - } - - for (i = n - 2; i >= 0; i--) { - level++; - x = sk_X509_value(certs, i); - cache = policy_cache_set(x); - X509_up_ref(x); - level->cert = x; - - if (!cache->anyPolicy) { - level->flags |= X509_V_FLAG_INHIBIT_ANY; - } - - // Determine inhibit any and inhibit map flags - if (any_skip == 0) { - // Any matching allowed if certificate is self issued and not the - // last in the chain. - if (!(x->ex_flags & EXFLAG_SI) || (i == 0)) { - level->flags |= X509_V_FLAG_INHIBIT_ANY; - } - } else { - if (!(x->ex_flags & EXFLAG_SI)) { - any_skip--; - } - if ((cache->any_skip >= 0) && (cache->any_skip < any_skip)) { - any_skip = cache->any_skip; - } - } - - if (map_skip == 0) { - level->flags |= X509_V_FLAG_INHIBIT_MAP; - } else { - if (!(x->ex_flags & EXFLAG_SI)) { - map_skip--; - } - if ((cache->map_skip >= 0) && (cache->map_skip < map_skip)) { - map_skip = cache->map_skip; - } - } - } - - *ptree = tree; - - if (explicit_policy) { - return 1; - } else { - return 5; - } - -bad_tree: - - X509_policy_tree_free(tree); - - return 0; -} - -static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr, - X509_POLICY_DATA *data) { - X509_POLICY_LEVEL *last = curr - 1; - X509_POLICY_NODE *node; - int matched = 0; - size_t i; - // Iterate through all in nodes linking matches - for (i = 0; i < sk_X509_POLICY_NODE_num(last->nodes); i++) { - node = sk_X509_POLICY_NODE_value(last->nodes, i); - if (policy_node_match(last, node, data->valid_policy)) { - if (!level_add_node(curr, data, node, NULL)) { - return 0; - } - matched = 1; - } - } - if (!matched && last->anyPolicy) { - if (!level_add_node(curr, data, last->anyPolicy, NULL)) { - return 0; - } - } - return 1; -} - -// This corresponds to RFC 3280 6.1.3(d)(1): link any data from -// CertificatePolicies onto matching parent or anyPolicy if no match. - -static int tree_link_nodes(X509_POLICY_LEVEL *curr, - const X509_POLICY_CACHE *cache) { - size_t i; - X509_POLICY_DATA *data; - - for (i = 0; i < sk_X509_POLICY_DATA_num(cache->data); i++) { - data = sk_X509_POLICY_DATA_value(cache->data, i); - // If a node is mapped any it doesn't have a corresponding - // CertificatePolicies entry. However such an identical node would - // be created if anyPolicy matching is enabled because there would be - // no match with the parent valid_policy_set. So we create link - // because then it will have the mapping flags right and we can prune - // it later. -#if 0 - if ((data->flags & POLICY_DATA_FLAG_MAPPED_ANY) - && !(curr->flags & X509_V_FLAG_INHIBIT_ANY)) - continue; -#endif - // Look for matching nodes in previous level - if (!tree_link_matching_nodes(curr, data)) { - return 0; - } - } - return 1; -} - -// This corresponds to RFC 3280 6.1.3(d)(2): Create new data for any unmatched -// policies in the parent and link to anyPolicy. - -static int tree_add_unmatched(X509_POLICY_LEVEL *curr, - const X509_POLICY_CACHE *cache, - const ASN1_OBJECT *id, X509_POLICY_NODE *node, - X509_POLICY_TREE *tree) { - X509_POLICY_DATA *data; - if (id == NULL) { - id = node->data->valid_policy; - } - // Create a new node with qualifiers from anyPolicy and id from unmatched - // node. - data = policy_data_new(NULL, id, node_critical(node)); - - if (data == NULL) { - return 0; - } - // Curr may not have anyPolicy - data->qualifier_set = cache->anyPolicy->qualifier_set; - data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS; - if (!level_add_node(curr, data, node, tree)) { - policy_data_free(data); - return 0; - } - - return 1; -} - -static int tree_link_unmatched(X509_POLICY_LEVEL *curr, - const X509_POLICY_CACHE *cache, - X509_POLICY_NODE *node, X509_POLICY_TREE *tree) { - const X509_POLICY_LEVEL *last = curr - 1; - size_t i; - - if ((last->flags & X509_V_FLAG_INHIBIT_MAP) || - !(node->data->flags & POLICY_DATA_FLAG_MAPPED)) { - // If no policy mapping: matched if one child present - if (node->nchild) { - return 1; - } - if (!tree_add_unmatched(curr, cache, NULL, node, tree)) { - return 0; - } - // Add it - } else { - // If mapping: matched if one child per expected policy set - STACK_OF(ASN1_OBJECT) *expset = node->data->expected_policy_set; - if ((size_t)node->nchild == sk_ASN1_OBJECT_num(expset)) { - return 1; - } - // Locate unmatched nodes - for (i = 0; i < sk_ASN1_OBJECT_num(expset); i++) { - ASN1_OBJECT *oid = sk_ASN1_OBJECT_value(expset, i); - if (level_find_node(curr, node, oid)) { - continue; - } - if (!tree_add_unmatched(curr, cache, oid, node, tree)) { - return 0; - } - } - } - - return 1; -} - -static int tree_link_any(X509_POLICY_LEVEL *curr, - const X509_POLICY_CACHE *cache, - X509_POLICY_TREE *tree) { - size_t i; - // X509_POLICY_DATA *data; - X509_POLICY_NODE *node; - X509_POLICY_LEVEL *last = curr - 1; - - for (i = 0; i < sk_X509_POLICY_NODE_num(last->nodes); i++) { - node = sk_X509_POLICY_NODE_value(last->nodes, i); - - if (!tree_link_unmatched(curr, cache, node, tree)) { - return 0; - } - -#if 0 - - // Skip any node with any children: we only want unmathced nodes. - // Note: need something better for policy mapping because each node - // may have multiple children - if (node->nchild) - continue; - - // Create a new node with qualifiers from anyPolicy and id from - // unmatched node. - data = policy_data_new(NULL, node->data->valid_policy, - node_critical(node)); - - if (data == NULL) - return 0; - // Curr may not have anyPolicy - data->qualifier_set = cache->anyPolicy->qualifier_set; - data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS; - if (!level_add_node(curr, data, node, tree)) { - policy_data_free(data); - return 0; - } -#endif - } - // Finally add link to anyPolicy - if (last->anyPolicy) { - if (!level_add_node(curr, cache->anyPolicy, last->anyPolicy, NULL)) { - return 0; - } - } - return 1; -} - -// Prune the tree: delete any child mapped child data on the current level -// then proceed up the tree deleting any data with no children. If we ever -// have no data on a level we can halt because the tree will be empty. - -static int tree_prune(X509_POLICY_TREE *tree, X509_POLICY_LEVEL *curr) { - STACK_OF(X509_POLICY_NODE) *nodes; - X509_POLICY_NODE *node; - int i; - nodes = curr->nodes; - if (curr->flags & X509_V_FLAG_INHIBIT_MAP) { - for (i = sk_X509_POLICY_NODE_num(nodes) - 1; i >= 0; i--) { - node = sk_X509_POLICY_NODE_value(nodes, i); - // Delete any mapped data: see RFC 3280 XXXX - if (node->data->flags & POLICY_DATA_FLAG_MAP_MASK) { - node->parent->nchild--; - OPENSSL_free(node); - (void)sk_X509_POLICY_NODE_delete(nodes, i); - } - } - } - - for (;;) { - --curr; - nodes = curr->nodes; - for (i = sk_X509_POLICY_NODE_num(nodes) - 1; i >= 0; i--) { - node = sk_X509_POLICY_NODE_value(nodes, i); - if (node->nchild == 0) { - node->parent->nchild--; - OPENSSL_free(node); - (void)sk_X509_POLICY_NODE_delete(nodes, i); - } - } - if (curr->anyPolicy && !curr->anyPolicy->nchild) { - if (curr->anyPolicy->parent) { - curr->anyPolicy->parent->nchild--; - } - OPENSSL_free(curr->anyPolicy); - curr->anyPolicy = NULL; - } - if (curr == tree->levels) { - // If we zapped anyPolicy at top then tree is empty - if (!curr->anyPolicy) { - return 2; - } - return 1; - } - } -} - -static int tree_add_auth_node(STACK_OF(X509_POLICY_NODE) **pnodes, - X509_POLICY_NODE *pcy) { - if (!*pnodes) { - *pnodes = policy_node_cmp_new(); - if (!*pnodes) { - return 0; - } - } else { - sk_X509_POLICY_NODE_sort(*pnodes); - if (sk_X509_POLICY_NODE_find(*pnodes, NULL, pcy)) { - return 1; - } - } - if (!sk_X509_POLICY_NODE_push(*pnodes, pcy)) { - return 0; - } - - return 1; -} - -// Calculate the authority set based on policy tree. The 'pnodes' parameter -// is used as a store for the set of policy nodes used to calculate the user -// set. If the authority set is not anyPolicy then pnodes will just point to -// the authority set. If however the authority set is anyPolicy then the set -// of valid policies (other than anyPolicy) is store in pnodes. The return -// value of '2' is used in this case to indicate that pnodes should be freed. - -static int tree_calculate_authority_set(X509_POLICY_TREE *tree, - STACK_OF(X509_POLICY_NODE) **pnodes) { - X509_POLICY_LEVEL *curr; - X509_POLICY_NODE *node, *anyptr; - STACK_OF(X509_POLICY_NODE) **addnodes; - int i; - size_t j; - curr = tree->levels + tree->nlevel - 1; - - // If last level contains anyPolicy set is anyPolicy - if (curr->anyPolicy) { - if (!tree_add_auth_node(&tree->auth_policies, curr->anyPolicy)) { - return 0; - } - addnodes = pnodes; - } else { - // Add policies to authority set - addnodes = &tree->auth_policies; - } - - curr = tree->levels; - for (i = 1; i < tree->nlevel; i++) { - // If no anyPolicy node on this this level it can't appear on lower - // levels so end search. - if (!(anyptr = curr->anyPolicy)) { - break; - } - curr++; - for (j = 0; j < sk_X509_POLICY_NODE_num(curr->nodes); j++) { - node = sk_X509_POLICY_NODE_value(curr->nodes, j); - if ((node->parent == anyptr) && !tree_add_auth_node(addnodes, node)) { - return 0; - } - } - } - - if (addnodes == pnodes) { - return 2; - } - - *pnodes = tree->auth_policies; - - return 1; -} - -static int tree_calculate_user_set(X509_POLICY_TREE *tree, - STACK_OF(ASN1_OBJECT) *policy_oids, - STACK_OF(X509_POLICY_NODE) *auth_nodes) { - size_t i; - X509_POLICY_NODE *node; - ASN1_OBJECT *oid; - - X509_POLICY_NODE *anyPolicy; - X509_POLICY_DATA *extra; - - // Check if anyPolicy present in authority constrained policy set: this - // will happen if it is a leaf node. - - if (sk_ASN1_OBJECT_num(policy_oids) <= 0) { - return 1; - } - - anyPolicy = tree->levels[tree->nlevel - 1].anyPolicy; - - for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++) { - oid = sk_ASN1_OBJECT_value(policy_oids, i); - if (OBJ_obj2nid(oid) == NID_any_policy) { - tree->flags |= POLICY_FLAG_ANY_POLICY; - return 1; - } - } - - for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++) { - oid = sk_ASN1_OBJECT_value(policy_oids, i); - node = tree_find_sk(auth_nodes, oid); - if (!node) { - if (!anyPolicy) { - continue; - } - // Create a new node with policy ID from user set and qualifiers - // from anyPolicy. - extra = policy_data_new(NULL, oid, node_critical(anyPolicy)); - if (!extra) { - return 0; - } - extra->qualifier_set = anyPolicy->data->qualifier_set; - extra->flags = - POLICY_DATA_FLAG_SHARED_QUALIFIERS | POLICY_DATA_FLAG_EXTRA_NODE; - node = level_add_node(NULL, extra, anyPolicy->parent, tree); - } - if (!tree->user_policies) { - tree->user_policies = sk_X509_POLICY_NODE_new_null(); - if (!tree->user_policies) { - return 1; - } - } - if (!sk_X509_POLICY_NODE_push(tree->user_policies, node)) { - return 0; - } - } - return 1; -} - -static int tree_evaluate(X509_POLICY_TREE *tree) { - int ret, i; - X509_POLICY_LEVEL *curr = tree->levels + 1; - const X509_POLICY_CACHE *cache; - - for (i = 1; i < tree->nlevel; i++, curr++) { - cache = policy_cache_set(curr->cert); - if (!tree_link_nodes(curr, cache)) { - return 0; - } - - if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY) && - !tree_link_any(curr, cache, tree)) { - return 0; - } - tree_print("before tree_prune()", tree, curr); - ret = tree_prune(tree, curr); - if (ret != 1) { - return ret; - } - } - - return 1; -} - -static void exnode_free(X509_POLICY_NODE *node) { - if (node->data && (node->data->flags & POLICY_DATA_FLAG_EXTRA_NODE)) { - OPENSSL_free(node); - } -} - -void X509_policy_tree_free(X509_POLICY_TREE *tree) { - if (!tree) { - return; - } - - sk_X509_POLICY_NODE_free(tree->auth_policies); - sk_X509_POLICY_NODE_pop_free(tree->user_policies, exnode_free); - - for (int i = 0; i < tree->nlevel; i++) { - X509_POLICY_LEVEL *curr = &tree->levels[i]; - X509_free(curr->cert); - sk_X509_POLICY_NODE_pop_free(curr->nodes, policy_node_free); - policy_node_free(curr->anyPolicy); - } - - sk_X509_POLICY_DATA_pop_free(tree->extra_data, policy_data_free); - OPENSSL_free(tree->levels); - OPENSSL_free(tree); -} - -//- -// Application policy checking function. -// Return codes: -// 0 Internal Error. -// 1 Successful. -// -1 One or more certificates contain invalid or inconsistent extensions -// -2 User constrained policy set empty and requireExplicit true. - -int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, - STACK_OF(X509) *certs, STACK_OF(ASN1_OBJECT) *policy_oids, - unsigned int flags) { - int ret; - int calc_ret; - X509_POLICY_TREE *tree = NULL; - STACK_OF(X509_POLICY_NODE) *nodes, *auth_nodes = NULL; - *ptree = NULL; - - *pexplicit_policy = 0; - ret = tree_init(&tree, certs, flags); - - switch (ret) { - // Tree empty requireExplicit False: OK - case 2: - return 1; - - // Some internal error - case -1: - return -1; - - // Some internal error - case 0: - return 0; - - // Tree empty requireExplicit True: Error - - case 6: - *pexplicit_policy = 1; - return -2; - - // Tree OK requireExplicit True: OK and continue - case 5: - *pexplicit_policy = 1; - break; - - // Tree OK: continue - - case 1: - if (!tree) { - // tree_init() returns success and a null tree - // if it's just looking at a trust anchor. - // I'm not sure that returning success here is - // correct, but I'm sure that reporting this - // as an internal error which our caller - // interprets as a malloc failure is wrong. - return 1; - } - break; - } - - if (!tree) { - goto error; - } - ret = tree_evaluate(tree); - - tree_print("tree_evaluate()", tree, NULL); - - if (ret <= 0) { - goto error; - } - - // Return value 2 means tree empty - if (ret == 2) { - X509_policy_tree_free(tree); - if (*pexplicit_policy) { - return -2; - } else { - return 1; - } - } - - // Tree is not empty: continue - - calc_ret = tree_calculate_authority_set(tree, &auth_nodes); - - if (!calc_ret) { - goto error; - } - - ret = tree_calculate_user_set(tree, policy_oids, auth_nodes); - - if (calc_ret == 2) { - sk_X509_POLICY_NODE_free(auth_nodes); - } - - if (!ret) { - goto error; - } - - - if (tree) { - *ptree = tree; - } - - if (*pexplicit_policy) { - if (tree->flags & POLICY_FLAG_ANY_POLICY) { - nodes = tree->auth_policies; - } else { - nodes = tree->user_policies; - } - if (sk_X509_POLICY_NODE_num(nodes) <= 0) { - return -2; - } - } - - return 1; - -error: - X509_policy_tree_free(tree); - return 0; -} diff --git a/third_party/boringssl/src/crypto/x509v3/tab_test.cc b/third_party/boringssl/src/crypto/x509v3/tab_test.cc index bf91a265f200..b5b662fdaeab 100644 --- a/third_party/boringssl/src/crypto/x509v3/tab_test.cc +++ b/third_party/boringssl/src/crypto/x509v3/tab_test.cc @@ -1,4 +1,3 @@ -/* tabtest.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. diff --git a/third_party/boringssl/src/crypto/x509v3/v3_akey.c b/third_party/boringssl/src/crypto/x509v3/v3_akey.c index 7616f4f08754..2af596af0bb7 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_akey.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_akey.c @@ -1,4 +1,3 @@ -/* v3_akey.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -72,7 +71,8 @@ static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID( const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *extlist); static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *values); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *values); const X509V3_EXT_METHOD v3_akey_id = { NID_authority_key_identifier, @@ -132,22 +132,20 @@ static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID( // is always included. static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *values) { + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *values) { char keyid = 0, issuer = 0; - size_t i; int j; - CONF_VALUE *cnf; ASN1_OCTET_STRING *ikeyid = NULL; X509_NAME *isname = NULL; GENERAL_NAMES *gens = NULL; GENERAL_NAME *gen = NULL; ASN1_INTEGER *serial = NULL; - X509 *cert; + const X509 *cert; AUTHORITY_KEYID *akeyid; - for (i = 0; i < sk_CONF_VALUE_num(values); i++) { - cnf = sk_CONF_VALUE_value(values, i); + for (size_t i = 0; i < sk_CONF_VALUE_num(values); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(values, i); if (!strcmp(cnf->name, "keyid")) { keyid = 1; if (cnf->value && !strcmp(cnf->value, "always")) { @@ -166,7 +164,7 @@ static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method, } if (!ctx || !ctx->issuer_cert) { - if (ctx && (ctx->flags == CTX_TEST)) { + if (ctx && (ctx->flags == X509V3_CTX_TEST)) { return AUTHORITY_KEYID_new(); } OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_ISSUER_CERTIFICATE); @@ -189,7 +187,7 @@ static void *v2i_AUTHORITY_KEYID(const X509V3_EXT_METHOD *method, if ((issuer && !ikeyid) || (issuer == 2)) { isname = X509_NAME_dup(X509_get_issuer_name(cert)); - serial = ASN1_INTEGER_dup(X509_get_serialNumber(cert)); + serial = ASN1_INTEGER_dup(X509_get0_serialNumber(cert)); if (!isname || !serial) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS); goto err; @@ -203,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/third_party/boringssl/src/crypto/x509v3/v3_akeya.c b/third_party/boringssl/src/crypto/x509v3/v3_akeya.c index f612d7c01427..f18f4e339e0e 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_akeya.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_akeya.c @@ -1,4 +1,3 @@ -/* v3_akey_asn1.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. diff --git a/third_party/boringssl/src/crypto/x509v3/v3_alt.c b/third_party/boringssl/src/crypto/x509v3/v3_alt.c index 1f83d880b7ff..ddd112a2eb1d 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_alt.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_alt.c @@ -1,4 +1,3 @@ -/* v3_alt.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -68,14 +67,18 @@ #include "internal.h" -static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval); -static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval); -static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p); -static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens); -static int do_othername(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx); -static int do_dirname(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx); +static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval); +static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval); +static int copy_email(const X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p); +static int copy_issuer(const X509V3_CTX *ctx, GENERAL_NAMES *gens); +static int do_othername(GENERAL_NAME *gen, const char *value, + const X509V3_CTX *ctx); +static int do_dirname(GENERAL_NAME *gen, const char *value, + const X509V3_CTX *ctx); static STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES_cb( const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *ret) { @@ -94,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) { @@ -115,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 @@ -204,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:"); @@ -241,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; @@ -258,6 +259,7 @@ int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen) { break; } break; + } case GEN_RID: BIO_printf(out, "Registered ID"); @@ -267,28 +269,26 @@ int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen) { return 1; } -static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval) { - GENERAL_NAMES *gens = NULL; - CONF_VALUE *cnf; - size_t i; - if (!(gens = sk_GENERAL_NAME_new_null())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); +static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { + GENERAL_NAMES *gens = sk_GENERAL_NAME_new_null(); + if (gens == NULL) { return NULL; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - cnf = sk_CONF_VALUE_value(nval, i); - if (!x509v3_name_cmp(cnf->name, "issuer") && cnf->value && + for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); + if (x509v3_conf_name_matches(cnf->name, "issuer") && cnf->value && !strcmp(cnf->value, "copy")) { if (!copy_issuer(ctx, gens)) { goto err; } } else { - GENERAL_NAME *gen; - if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) { + GENERAL_NAME *gen = v2i_GENERAL_NAME(method, ctx, cnf); + if (gen == NULL || !sk_GENERAL_NAME_push(gens, gen)) { + GENERAL_NAME_free(gen); goto err; } - sk_GENERAL_NAME_push(gens, gen); } } return gens; @@ -299,8 +299,8 @@ static void *v2i_issuer_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, // Append subject altname of issuer to issuer alt name of subject -static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens) { - if (ctx && (ctx->flags == CTX_TEST)) { +static int copy_issuer(const X509V3_CTX *ctx, GENERAL_NAMES *gens) { + if (ctx && (ctx->flags == X509V3_CTX_TEST)) { return 1; } if (!ctx || !ctx->issuer_cert) { @@ -324,7 +324,6 @@ static int copy_issuer(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|. @@ -338,33 +337,31 @@ static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens) { return ret; } -static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval) { - GENERAL_NAMES *gens = NULL; - CONF_VALUE *cnf; - size_t i; - if (!(gens = sk_GENERAL_NAME_new_null())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); +static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { + GENERAL_NAMES *gens = sk_GENERAL_NAME_new_null(); + if (gens == NULL) { return NULL; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - cnf = sk_CONF_VALUE_value(nval, i); - if (!x509v3_name_cmp(cnf->name, "email") && cnf->value && + for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); + if (x509v3_conf_name_matches(cnf->name, "email") && cnf->value && !strcmp(cnf->value, "copy")) { if (!copy_email(ctx, gens, 0)) { goto err; } - } else if (!x509v3_name_cmp(cnf->name, "email") && cnf->value && + } else if (x509v3_conf_name_matches(cnf->name, "email") && cnf->value && !strcmp(cnf->value, "move")) { if (!copy_email(ctx, gens, 1)) { goto err; } } else { - GENERAL_NAME *gen; - if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) { + GENERAL_NAME *gen = v2i_GENERAL_NAME(method, ctx, cnf); + if (gen == NULL || !sk_GENERAL_NAME_push(gens, gen)) { + GENERAL_NAME_free(gen); goto err; } - sk_GENERAL_NAME_push(gens, gen); } } return gens; @@ -375,13 +372,13 @@ static void *v2i_subject_alt(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, // Copy any email addresses in a certificate or request to GENERAL_NAMES -static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) { +static int copy_email(const X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) { X509_NAME *nm; ASN1_IA5STRING *email = NULL; X509_NAME_ENTRY *ne; GENERAL_NAME *gen = NULL; int i; - if (ctx != NULL && ctx->flags == CTX_TEST) { + if (ctx != NULL && ctx->flags == X509V3_CTX_TEST) { return 1; } if (!ctx || (!ctx->subject_cert && !ctx->subject_req)) { @@ -406,14 +403,12 @@ static int copy_email(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; @@ -428,21 +423,19 @@ static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) { } GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) { - GENERAL_NAME *gen; - GENERAL_NAMES *gens = NULL; - CONF_VALUE *cnf; - size_t i; - if (!(gens = sk_GENERAL_NAME_new_null())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { + GENERAL_NAMES *gens = sk_GENERAL_NAME_new_null(); + if (gens == NULL) { return NULL; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - cnf = sk_CONF_VALUE_value(nval, i); - if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) { + for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); + GENERAL_NAME *gen = v2i_GENERAL_NAME(method, ctx, cnf); + if (gen == NULL || !sk_GENERAL_NAME_push(gens, gen)) { + GENERAL_NAME_free(gen); goto err; } - sk_GENERAL_NAME_push(gens, gen); } return gens; err: @@ -450,28 +443,26 @@ GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, return NULL; } -GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - CONF_VALUE *cnf) { +GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, + const X509V3_CTX *ctx, const CONF_VALUE *cnf) { return v2i_GENERAL_NAME_ex(NULL, method, ctx, cnf, 0); } GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, - const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - int gen_type, const char *value, int is_nc) { - char is_string = 0; - GENERAL_NAME *gen = NULL; - + const X509V3_EXT_METHOD *method, + const X509V3_CTX *ctx, int gen_type, + const char *value, int is_nc) { if (!value) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); return NULL; } + GENERAL_NAME *gen = NULL; if (out) { gen = out; } else { gen = GENERAL_NAME_new(); if (gen == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } } @@ -479,9 +470,16 @@ 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); + goto err; + } + gen->type = gen_type; + gen->d.ia5 = str; break; + } case GEN_RID: { ASN1_OBJECT *obj; @@ -490,10 +488,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 { @@ -524,16 +525,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: @@ -545,32 +536,29 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc) { - int type; - - char *name, *value; - - name = cnf->name; - value = cnf->value; - + const X509V3_CTX *ctx, const CONF_VALUE *cnf, + int is_nc) { + const char *name = cnf->name; + const char *value = cnf->value; if (!value) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_MISSING_VALUE); return NULL; } - if (!x509v3_name_cmp(name, "email")) { + int type; + if (x509v3_conf_name_matches(name, "email")) { type = GEN_EMAIL; - } else if (!x509v3_name_cmp(name, "URI")) { + } else if (x509v3_conf_name_matches(name, "URI")) { type = GEN_URI; - } else if (!x509v3_name_cmp(name, "DNS")) { + } else if (x509v3_conf_name_matches(name, "DNS")) { type = GEN_DNS; - } else if (!x509v3_name_cmp(name, "RID")) { + } else if (x509v3_conf_name_matches(name, "RID")) { type = GEN_RID; - } else if (!x509v3_name_cmp(name, "IP")) { + } else if (x509v3_conf_name_matches(name, "IP")) { type = GEN_IPADD; - } else if (!x509v3_name_cmp(name, "dirName")) { + } else if (x509v3_conf_name_matches(name, "dirName")) { type = GEN_DIRNAME; - } else if (!x509v3_name_cmp(name, "otherName")) { + } else if (x509v3_conf_name_matches(name, "otherName")) { type = GEN_OTHERNAME; } else { OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNSUPPORTED_OPTION); @@ -581,44 +569,52 @@ GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc); } -static int do_othername(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx) { - char *objtmp = NULL; - const char *p; - int objlen; - if (!(p = strchr(value, ';'))) { +static int do_othername(GENERAL_NAME *gen, const char *value, + const X509V3_CTX *ctx) { + 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, X509V3_CTX *ctx) { +static int do_dirname(GENERAL_NAME *gen, const char *value, + const X509V3_CTX *ctx) { int ret = 0; - STACK_OF(CONF_VALUE) *sk = NULL; X509_NAME *nm = X509_NAME_new(); if (nm == NULL) { goto err; } - sk = X509V3_get_section(ctx, value); + const STACK_OF(CONF_VALUE) *sk = X509V3_get_section(ctx, value); if (sk == NULL) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND); ERR_add_error_data(2, "section=", value); @@ -628,6 +624,7 @@ static int do_dirname(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx) { if (!X509V3_NAME_from_section(nm, sk, MBSTRING_ASC)) { goto err; } + gen->type = GEN_DIRNAME; gen->d.dirn = nm; ret = 1; @@ -635,6 +632,5 @@ static int do_dirname(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx) { if (!ret) { X509_NAME_free(nm); } - X509V3_section_free(ctx, sk); return ret; } diff --git a/third_party/boringssl/src/crypto/x509v3/v3_bcons.c b/third_party/boringssl/src/crypto/x509v3/v3_bcons.c index 19c1a5df15e6..e614b8ec6987 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_bcons.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_bcons.c @@ -1,4 +1,3 @@ -/* v3_bcons.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -65,11 +64,14 @@ #include #include +#include "internal.h" + + static STACK_OF(CONF_VALUE) *i2v_BASIC_CONSTRAINTS( const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *extlist); static void *v2i_BASIC_CONSTRAINTS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *values); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *values); const X509V3_EXT_METHOD v3_bcons = { NID_basic_constraints, @@ -104,17 +106,14 @@ static STACK_OF(CONF_VALUE) *i2v_BASIC_CONSTRAINTS( } static void *v2i_BASIC_CONSTRAINTS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *values) { + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *values) { BASIC_CONSTRAINTS *bcons = NULL; - CONF_VALUE *val; - size_t i; if (!(bcons = BASIC_CONSTRAINTS_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } - for (i = 0; i < sk_CONF_VALUE_num(values); i++) { - val = sk_CONF_VALUE_value(values, i); + for (size_t i = 0; i < sk_CONF_VALUE_num(values); i++) { + const CONF_VALUE *val = sk_CONF_VALUE_value(values, i); if (!strcmp(val->name, "CA")) { if (!X509V3_get_value_bool(val, &bcons->ca)) { goto err; diff --git a/third_party/boringssl/src/crypto/x509v3/v3_bitst.c b/third_party/boringssl/src/crypto/x509v3/v3_bitst.c index 9562826fbea5..1201738b55cd 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_bitst.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_bitst.c @@ -1,4 +1,3 @@ -/* v3_bitst.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -102,21 +101,18 @@ static STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING( } static void *v2i_ASN1_BIT_STRING(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) { - CONF_VALUE *val; + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { ASN1_BIT_STRING *bs; - size_t i; - const BIT_STRING_BITNAME *bnam; if (!(bs = ASN1_BIT_STRING_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - val = sk_CONF_VALUE_value(nval, i); + for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { + const CONF_VALUE *val = sk_CONF_VALUE_value(nval, i); + const BIT_STRING_BITNAME *bnam; 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/third_party/boringssl/src/crypto/x509v3/v3_conf.c b/third_party/boringssl/src/crypto/x509v3/v3_conf.c index 64bed7a4e2dc..7904c7f7ec71 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_conf.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_conf.c @@ -1,4 +1,3 @@ -/* v3_conf.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -58,6 +57,7 @@ // extension creation utilities #include +#include #include #include @@ -74,28 +74,32 @@ static int v3_check_critical(const char **value); static int v3_check_generic(const char **value); -static X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid, - int crit, const char *value); +static X509_EXTENSION *do_ext_nconf(const CONF *conf, const X509V3_CTX *ctx, + int ext_nid, int crit, const char *value); static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, int crit, int type, - X509V3_CTX *ctx); + const X509V3_CTX *ctx); 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, X509V3_CTX *ctx, - long *ext_len); -// CONF *conf: Config file -// char *name: Name -// char *value: Value -X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name, - const char *value) { - int crit; - int ext_type; - X509_EXTENSION *ret; - crit = v3_check_critical(&value); - if ((ext_type = v3_check_generic(&value))) { +static unsigned char *generic_asn1(const char *value, const X509V3_CTX *ctx, + size_t *ext_len); + +X509_EXTENSION *X509V3_EXT_nconf(const CONF *conf, const X509V3_CTX *ctx, + const char *name, const char *value) { + // If omitted, fill in an empty |X509V3_CTX|. + X509V3_CTX ctx_tmp; + if (ctx == NULL) { + X509V3_set_ctx(&ctx_tmp, NULL, NULL, NULL, NULL, 0); + X509V3_set_nconf(&ctx_tmp, conf); + ctx = &ctx_tmp; + } + + int crit = v3_check_critical(&value); + int ext_type = v3_check_generic(&value); + if (ext_type != 0) { return v3_generic_extension(name, value, crit, ext_type, ctx); } - ret = do_ext_nconf(conf, ctx, OBJ_sn2nid(name), crit, value); + X509_EXTENSION *ret = do_ext_nconf(conf, ctx, OBJ_sn2nid(name), crit, value); if (!ret) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_ERROR_IN_EXTENSION); ERR_add_error_data(4, "name=", name, ", value=", value); @@ -103,14 +107,19 @@ X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name, return ret; } -// CONF *conf: Config file -// char *value: Value -X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, - const char *value) { - int crit; - int ext_type; - crit = v3_check_critical(&value); - if ((ext_type = v3_check_generic(&value))) { +X509_EXTENSION *X509V3_EXT_nconf_nid(const CONF *conf, const X509V3_CTX *ctx, + int ext_nid, const char *value) { + // If omitted, fill in an empty |X509V3_CTX|. + X509V3_CTX ctx_tmp; + if (ctx == NULL) { + X509V3_set_ctx(&ctx_tmp, NULL, NULL, NULL, NULL, 0); + X509V3_set_nconf(&ctx_tmp, conf); + ctx = &ctx_tmp; + } + + int crit = v3_check_critical(&value); + int ext_type = v3_check_generic(&value); + if (ext_type != 0) { return v3_generic_extension(OBJ_nid2sn(ext_nid), value, crit, ext_type, ctx); } @@ -119,11 +128,12 @@ X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, // CONF *conf: Config file // char *value: Value -static X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid, - int crit, const char *value) { +static X509_EXTENSION *do_ext_nconf(const CONF *conf, const X509V3_CTX *ctx, + int ext_nid, int crit, const char *value) { const X509V3_EXT_METHOD *method; X509_EXTENSION *ext; - STACK_OF(CONF_VALUE) *nval; + const STACK_OF(CONF_VALUE) *nval; + STACK_OF(CONF_VALUE) *nval_owned = NULL; void *ext_struc; if (ext_nid == NID_undef) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_UNKNOWN_EXTENSION_NAME); @@ -136,22 +146,26 @@ static X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid, // Now get internal extension representation based on type if (method->v2i) { if (*value == '@') { + // TODO(davidben): This is the only place where |X509V3_EXT_nconf|'s + // |conf| parameter is used. All other codepaths use the copy inside + // |ctx|. Should this be switched and then the parameter ignored? + if (conf == NULL) { + OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_CONFIG_DATABASE); + return NULL; + } nval = NCONF_get_section(conf, value + 1); } else { - nval = X509V3_parse_list(value); + nval_owned = X509V3_parse_list(value); + nval = nval_owned; } if (nval == NULL || sk_CONF_VALUE_num(nval) <= 0) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_EXTENSION_STRING); ERR_add_error_data(4, "name=", OBJ_nid2sn(ext_nid), ",section=", value); - if (*value != '@') { - sk_CONF_VALUE_pop_free(nval, X509V3_conf_free); - } + sk_CONF_VALUE_pop_free(nval_owned, X509V3_conf_free); return NULL; } ext_struc = method->v2i(method, ctx, nval); - if (*value != '@') { - sk_CONF_VALUE_pop_free(nval, X509V3_conf_free); - } + sk_CONF_VALUE_pop_free(nval_owned, X509V3_conf_free); if (!ext_struc) { return NULL; } @@ -160,7 +174,11 @@ static X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid, return NULL; } } else if (method->r2i) { - if (!ctx->db || !ctx->db_meth) { + // TODO(davidben): Should this check be removed? This matches OpenSSL, but + // r2i-based extensions do not necessarily require a config database. The + // two built-in extensions only use it some of the time, and already handle + // |X509V3_get_section| returning NULL. + if (!ctx->db) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_CONFIG_DATABASE); return NULL; } @@ -174,53 +192,30 @@ static X509_EXTENSION *do_ext_nconf(CONF *conf, X509V3_CTX *ctx, int ext_nid, } ext = do_ext_i2d(method, ext_nid, crit, ext_struc); - if (method->it) { - ASN1_item_free(ext_struc, ASN1_ITEM_ptr(method->it)); - } else { - method->ext_free(ext_struc); - } + ASN1_item_free(ext_struc, ASN1_ITEM_ptr(method->it)); return ext; } static X509_EXTENSION *do_ext_i2d(const X509V3_EXT_METHOD *method, int ext_nid, int crit, void *ext_struc) { - unsigned char *ext_der; - int ext_len; - ASN1_OCTET_STRING *ext_oct; - X509_EXTENSION *ext; - // Convert internal representation to DER - if (method->it) { - ext_der = NULL; - ext_len = ASN1_item_i2d(ext_struc, &ext_der, ASN1_ITEM_ptr(method->it)); - if (ext_len < 0) { - goto merr; - } - } else { - unsigned char *p; - ext_len = method->i2d(ext_struc, NULL); - if (!(ext_der = OPENSSL_malloc(ext_len))) { - goto merr; - } - p = ext_der; - method->i2d(ext_struc, &p); - } - if (!(ext_oct = ASN1_OCTET_STRING_new())) { - goto merr; + // Convert the extension's internal representation to DER. + unsigned char *ext_der = NULL; + int ext_len = ASN1_item_i2d(ext_struc, &ext_der, ASN1_ITEM_ptr(method->it)); + if (ext_len < 0) { + return NULL; } - ext_oct->data = ext_der; - ext_oct->length = ext_len; - ext = X509_EXTENSION_create_by_NID(NULL, ext_nid, crit, ext_oct); - if (!ext) { - goto merr; + ASN1_OCTET_STRING *ext_oct = ASN1_OCTET_STRING_new(); + if (ext_oct == NULL) { + OPENSSL_free(ext_der); + return NULL; } - ASN1_OCTET_STRING_free(ext_oct); + ASN1_STRING_set0(ext_oct, ext_der, ext_len); + X509_EXTENSION *ext = + X509_EXTENSION_create_by_NID(NULL, ext_nid, crit, ext_oct); + ASN1_OCTET_STRING_free(ext_oct); return ext; - -merr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - return NULL; } // Given an internal structure, nid and critical flag create an extension @@ -241,7 +236,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; @@ -262,7 +257,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; @@ -272,9 +267,9 @@ static int v3_check_generic(const char **value) { // Create a generic extension: for now just handle DER type static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, int crit, int gen_type, - X509V3_CTX *ctx) { + 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; @@ -296,13 +291,17 @@ static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, goto err; } - if (!(oct = ASN1_OCTET_STRING_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); + if (ext_len > INT_MAX) { + OPENSSL_PUT_ERROR(X509V3, ERR_R_OVERFLOW); + goto err; + } + + oct = ASN1_OCTET_STRING_new(); + if (oct == NULL) { goto err; } - oct->data = ext_der; - oct->length = ext_len; + ASN1_STRING_set0(oct, ext_der, (int)ext_len); ext_der = NULL; extension = X509_EXTENSION_create_by_OBJ(NULL, obj, crit, oct); @@ -314,48 +313,49 @@ static X509_EXTENSION *v3_generic_extension(const char *ext, const char *value, return extension; } -static unsigned char *generic_asn1(const char *value, X509V3_CTX *ctx, - long *ext_len) { - ASN1_TYPE *typ; - unsigned char *ext_der = NULL; - typ = ASN1_generate_v3(value, ctx); +static unsigned char *generic_asn1(const char *value, const X509V3_CTX *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; } // This is the main function: add a bunch of extensions based on a config // file section to an extension STACK. -int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, const char *section, +int X509V3_EXT_add_nconf_sk(const CONF *conf, const X509V3_CTX *ctx, + const char *section, STACK_OF(X509_EXTENSION) **sk) { - X509_EXTENSION *ext; - STACK_OF(CONF_VALUE) *nval; - CONF_VALUE *val; - size_t i; - if (!(nval = NCONF_get_section(conf, section))) { + const STACK_OF(CONF_VALUE) *nval = NCONF_get_section(conf, section); + if (nval == NULL) { return 0; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - val = sk_CONF_VALUE_value(nval, i); - if (!(ext = X509V3_EXT_nconf(conf, ctx, val->name, val->value))) { + 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); + 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; } // Convenience functions to add extensions to a certificate, CRL and request -int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, - X509 *cert) { +int X509V3_EXT_add_nconf(const CONF *conf, const X509V3_CTX *ctx, + const char *section, X509 *cert) { STACK_OF(X509_EXTENSION) **sk = NULL; if (cert) { sk = &cert->cert_info->extensions; @@ -365,8 +365,8 @@ int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, // Same as above but for a CRL -int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, - X509_CRL *crl) { +int X509V3_EXT_CRL_add_nconf(const CONF *conf, const X509V3_CTX *ctx, + const char *section, X509_CRL *crl) { STACK_OF(X509_EXTENSION) **sk = NULL; if (crl) { sk = &crl->crl->extensions; @@ -376,8 +376,8 @@ int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, // Add extensions to certificate request -int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, - X509_REQ *req) { +int X509V3_EXT_REQ_add_nconf(const CONF *conf, const X509V3_CTX *ctx, + const char *section, X509_REQ *req) { STACK_OF(X509_EXTENSION) *extlist = NULL, **sk = NULL; int i; if (req) { @@ -394,71 +394,22 @@ int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, // Config database functions -char *X509V3_get_string(X509V3_CTX *ctx, const char *name, - const char *section) { - if (!ctx->db || !ctx->db_meth || !ctx->db_meth->get_string) { +const STACK_OF(CONF_VALUE) *X509V3_get_section(const X509V3_CTX *ctx, + const char *section) { + if (ctx->db == NULL) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_OPERATION_NOT_DEFINED); return NULL; } - if (ctx->db_meth->get_string) { - return ctx->db_meth->get_string(ctx->db, name, section); - } - return NULL; -} - -STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, const char *section) { - if (!ctx->db || !ctx->db_meth || !ctx->db_meth->get_section) { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_OPERATION_NOT_DEFINED); - return NULL; - } - if (ctx->db_meth->get_section) { - return ctx->db_meth->get_section(ctx->db, section); - } - return NULL; + return NCONF_get_section(ctx->db, section); } -void X509V3_string_free(X509V3_CTX *ctx, char *str) { - if (!str) { - return; - } - if (ctx->db_meth->free_string) { - ctx->db_meth->free_string(ctx->db, str); - } -} - -void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section) { - if (!section) { - return; - } - if (ctx->db_meth->free_section) { - ctx->db_meth->free_section(ctx->db, section); - } -} - -static char *nconf_get_string(void *db, const char *section, - const char *value) { - // TODO(fork): This returns a non-const pointer because |X509V3_CONF_METHOD| - // allows |get_string| to return caller-owned pointers, provided they're - // freed by |free_string|. |nconf_method| leaves |free_string| NULL, and - // there are no other implementations of |X509V3_CONF_METHOD|, so this can - // be simplified if we make it private. - return (char *)NCONF_get_string(db, section, value); -} - -static STACK_OF(CONF_VALUE) *nconf_get_section(void *db, const char *section) { - return NCONF_get_section(db, section); -} - -static const X509V3_CONF_METHOD nconf_method = {nconf_get_string, - nconf_get_section, NULL, NULL}; - -void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf) { - ctx->db_meth = &nconf_method; +void X509V3_set_nconf(X509V3_CTX *ctx, const CONF *conf) { ctx->db = conf; } -void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subj, X509_REQ *req, - X509_CRL *crl, int flags) { +void X509V3_set_ctx(X509V3_CTX *ctx, const X509 *issuer, const X509 *subj, + const X509_REQ *req, const X509_CRL *crl, int flags) { + OPENSSL_memset(ctx, 0, sizeof(*ctx)); ctx->issuer_cert = issuer; ctx->subject_cert = subj; ctx->crl = crl; diff --git a/third_party/boringssl/src/crypto/x509v3/v3_cpols.c b/third_party/boringssl/src/crypto/x509v3/v3_cpols.c index 82c68a1ee42e..7464a4265ba3 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_cpols.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_cpols.c @@ -1,4 +1,3 @@ -/* v3_cpols.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -75,16 +74,19 @@ static int i2r_certpol(const X509V3_EXT_METHOD *method, void *ext, BIO *out, int indent); -static void *r2i_certpol(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, +static void *r2i_certpol(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *value); static void print_qualifiers(BIO *out, const STACK_OF(POLICYQUALINFO) *quals, int indent); static void print_notice(BIO *out, const USERNOTICE *notice, int indent); -static POLICYINFO *policy_section(X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *polstrs, int ia5org); -static POLICYQUALINFO *notice_section(X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *unot, int ia5org); -static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, STACK_OF(CONF_VALUE) *nos); +static POLICYINFO *policy_section(const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *polstrs, + int ia5org); +static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *unot, + int ia5org); +static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, + const STACK_OF(CONF_VALUE) *nos); const X509V3_EXT_METHOD v3_cpols = { NID_certificate_policies, @@ -147,41 +149,32 @@ ASN1_SEQUENCE(NOTICEREF) = { IMPLEMENT_ASN1_FUNCTIONS_const(NOTICEREF) -static void *r2i_certpol(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, +static void *r2i_certpol(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *value) { - STACK_OF(POLICYINFO) *pols = NULL; - char *pstr; - POLICYINFO *pol; - ASN1_OBJECT *pobj; - STACK_OF(CONF_VALUE) *vals; - CONF_VALUE *cnf; - size_t i; - int ia5org; - pols = sk_POLICYINFO_new_null(); + STACK_OF(POLICYINFO) *pols = sk_POLICYINFO_new_null(); if (pols == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } - vals = X509V3_parse_list(value); + STACK_OF(CONF_VALUE) *vals = X509V3_parse_list(value); if (vals == NULL) { OPENSSL_PUT_ERROR(X509V3, ERR_R_X509V3_LIB); goto err; } - ia5org = 0; - for (i = 0; i < sk_CONF_VALUE_num(vals); i++) { - cnf = sk_CONF_VALUE_value(vals, i); + int ia5org = 0; + for (size_t i = 0; i < sk_CONF_VALUE_num(vals); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(vals, i); if (cnf->value || !cnf->name) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_POLICY_IDENTIFIER); X509V3_conf_err(cnf); goto err; } - pstr = cnf->name; + POLICYINFO *pol; + const char *pstr = cnf->name; if (!strcmp(pstr, "ia5org")) { ia5org = 1; continue; } else if (*pstr == '@') { - STACK_OF(CONF_VALUE) *polsect; - polsect = X509V3_get_section(ctx, pstr + 1); + const STACK_OF(CONF_VALUE) *polsect = X509V3_get_section(ctx, pstr + 1); if (!polsect) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION); @@ -189,19 +182,18 @@ static void *r2i_certpol(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, goto err; } pol = policy_section(ctx, polsect, ia5org); - X509V3_section_free(ctx, polsect); if (!pol) { goto err; } } else { - if (!(pobj = OBJ_txt2obj(cnf->name, 0))) { + ASN1_OBJECT *pobj = OBJ_txt2obj(cnf->name, 0); + if (pobj == NULL) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER); X509V3_conf_err(cnf); goto err; } pol = POLICYINFO_new(); if (pol == NULL) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); ASN1_OBJECT_free(pobj); goto err; } @@ -209,7 +201,6 @@ static void *r2i_certpol(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, } if (!sk_POLICYINFO_push(pols, pol)) { POLICYINFO_free(pol); - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); goto err; } } @@ -221,17 +212,16 @@ static void *r2i_certpol(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, return NULL; } -static POLICYINFO *policy_section(X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *polstrs, int ia5org) { - size_t i; - CONF_VALUE *cnf; +static POLICYINFO *policy_section(const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *polstrs, + int ia5org) { POLICYINFO *pol; POLICYQUALINFO *qual; if (!(pol = POLICYINFO_new())) { - goto merr; + goto err; } - for (i = 0; i < sk_CONF_VALUE_num(polstrs); i++) { - cnf = sk_CONF_VALUE_value(polstrs, i); + for (size_t i = 0; i < sk_CONF_VALUE_num(polstrs); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(polstrs, i); if (!strcmp(cnf->name, "policyIdentifier")) { ASN1_OBJECT *pobj; if (!(pobj = OBJ_txt2obj(cnf->value, 0))) { @@ -241,15 +231,15 @@ static POLICYINFO *policy_section(X509V3_CTX *ctx, } pol->policyid = pobj; - } else if (!x509v3_name_cmp(cnf->name, "CPS")) { + } else if (x509v3_conf_name_matches(cnf->name, "CPS")) { if (!pol->qualifiers) { 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) { @@ -261,24 +251,22 @@ static POLICYINFO *policy_section(X509V3_CTX *ctx, goto err; } if (!ASN1_STRING_set(qual->d.cpsuri, cnf->value, strlen(cnf->value))) { - goto merr; + goto err; } - } else if (!x509v3_name_cmp(cnf->name, "userNotice")) { - STACK_OF(CONF_VALUE) *unot; + } else if (x509v3_conf_name_matches(cnf->name, "userNotice")) { if (*cnf->value != '@') { OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXPECTED_A_SECTION_NAME); X509V3_conf_err(cnf); goto err; } - unot = X509V3_get_section(ctx, cnf->value + 1); + const STACK_OF(CONF_VALUE) *unot = + X509V3_get_section(ctx, cnf->value + 1); if (!unot) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION); - X509V3_conf_err(cnf); goto err; } qual = notice_section(ctx, unot, ia5org); - X509V3_section_free(ctx, unot); if (!qual) { goto err; } @@ -286,7 +274,7 @@ static POLICYINFO *policy_section(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); @@ -302,52 +290,47 @@ static POLICYINFO *policy_section(X509V3_CTX *ctx, return pol; -merr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - err: POLICYINFO_free(pol); return NULL; } -static POLICYQUALINFO *notice_section(X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *unot, int ia5org) { - size_t i; - int ret; - CONF_VALUE *cnf; - USERNOTICE * not ; +static POLICYQUALINFO *notice_section(const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *unot, + int ia5org) { + USERNOTICE *notice; POLICYQUALINFO *qual; if (!(qual = POLICYQUALINFO_new())) { - goto merr; + goto err; } qual->pqualid = OBJ_nid2obj(NID_id_qt_unotice); if (qual->pqualid == NULL) { OPENSSL_PUT_ERROR(X509V3, ERR_R_INTERNAL_ERROR); goto err; } - if (!(not = USERNOTICE_new())) { - goto merr; + if (!(notice = USERNOTICE_new())) { + goto err; } - qual->d.usernotice = not ; - for (i = 0; i < sk_CONF_VALUE_num(unot); i++) { - cnf = sk_CONF_VALUE_value(unot, i); + qual->d.usernotice = notice; + for (size_t i = 0; i < sk_CONF_VALUE_num(unot); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(unot, i); if (!strcmp(cnf->name, "explicitText")) { - not ->exptext = ASN1_VISIBLESTRING_new(); - if (not ->exptext == NULL) { - goto merr; + notice->exptext = ASN1_VISIBLESTRING_new(); + if (notice->exptext == NULL) { + goto err; } - if (!ASN1_STRING_set(not ->exptext, cnf->value, strlen(cnf->value))) { - goto merr; + if (!ASN1_STRING_set(notice->exptext, cnf->value, strlen(cnf->value))) { + goto err; } } else if (!strcmp(cnf->name, "organization")) { NOTICEREF *nref; - if (!not ->noticeref) { + if (!notice->noticeref) { if (!(nref = NOTICEREF_new())) { - goto merr; + goto err; } - not ->noticeref = nref; + notice->noticeref = nref; } else { - nref = not ->noticeref; + nref = notice->noticeref; } if (ia5org) { nref->organization->type = V_ASN1_IA5STRING; @@ -356,26 +339,27 @@ static POLICYQUALINFO *notice_section(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 (!not ->noticeref) { + if (!notice->noticeref) { if (!(nref = NOTICEREF_new())) { - goto merr; + goto err; } - not ->noticeref = nref; + notice->noticeref = nref; } else { - nref = not ->noticeref; + nref = notice->noticeref; } nos = X509V3_parse_list(cnf->value); 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; } - ret = nref_nos(nref->noticenos, nos); + int ret = nref_nos(nref->noticenos, nos); sk_CONF_VALUE_pop_free(nos, X509V3_conf_free); if (!ret) { goto err; @@ -387,46 +371,34 @@ static POLICYQUALINFO *notice_section(X509V3_CTX *ctx, } } - if (not ->noticeref && - (!not ->noticeref->noticenos || !not ->noticeref->organization)) { + if (notice->noticeref && + (!notice->noticeref->noticenos || !notice->noticeref->organization)) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_NEED_ORGANIZATION_AND_NUMBERS); goto err; } return qual; -merr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - err: POLICYQUALINFO_free(qual); return NULL; } -static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, STACK_OF(CONF_VALUE) *nos) { - CONF_VALUE *cnf; - ASN1_INTEGER *aint; - - size_t i; - - for (i = 0; i < sk_CONF_VALUE_num(nos); i++) { - cnf = sk_CONF_VALUE_value(nos, i); - if (!(aint = s2i_ASN1_INTEGER(NULL, cnf->name))) { +static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, + const STACK_OF(CONF_VALUE) *nos) { + for (size_t i = 0; i < sk_CONF_VALUE_num(nos); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(nos, i); + ASN1_INTEGER *aint = s2i_ASN1_INTEGER(NULL, cnf->name); + if (aint == NULL) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NUMBER); - goto err; + return 0; } if (!sk_ASN1_INTEGER_push(nnums, aint)) { - goto merr; + ASN1_INTEGER_free(aint); + return 0; } } return 1; - -merr: - ASN1_INTEGER_free(aint); - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - -err: - return 0; } static int i2r_certpol(const X509V3_EXT_METHOD *method, void *ext, BIO *out, @@ -503,19 +475,3 @@ static void print_notice(BIO *out, const USERNOTICE *notice, int indent) { notice->exptext->length, notice->exptext->data); } } - -void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent) { - const X509_POLICY_DATA *dat = node->data; - - BIO_printf(out, "%*sPolicy: ", indent, ""); - - i2a_ASN1_OBJECT(out, dat->valid_policy); - BIO_puts(out, "\n"); - BIO_printf(out, "%*s%s\n", indent + 2, "", - node_data_critical(dat) ? "Critical" : "Non Critical"); - if (dat->qualifier_set) { - print_qualifiers(out, dat->qualifier_set, indent + 2); - } else { - BIO_printf(out, "%*sNo Qualifiers\n", indent + 2, ""); - } -} diff --git a/third_party/boringssl/src/crypto/x509v3/v3_crld.c b/third_party/boringssl/src/crypto/x509v3/v3_crld.c index 68ab343981eb..4162c3538f8d 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_crld.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_crld.c @@ -1,4 +1,3 @@ -/* v3_crld.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -70,8 +69,8 @@ #include "internal.h" -static void *v2i_crld(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval); +static void *v2i_crld(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval); static int i2r_crldp(const X509V3_EXT_METHOD *method, void *pcrldp, BIO *out, int indent); @@ -109,59 +108,68 @@ const X509V3_EXT_METHOD v3_freshest_crl = { NULL, }; -static STACK_OF(GENERAL_NAME) *gnames_from_sectname(X509V3_CTX *ctx, +static STACK_OF(GENERAL_NAME) *gnames_from_sectname(const X509V3_CTX *ctx, char *sect) { - STACK_OF(CONF_VALUE) *gnsect; - STACK_OF(GENERAL_NAME) *gens; + const STACK_OF(CONF_VALUE) *gnsect; + STACK_OF(CONF_VALUE) *gnsect_owned = NULL; if (*sect == '@') { gnsect = X509V3_get_section(ctx, sect + 1); } else { - gnsect = X509V3_parse_list(sect); + gnsect_owned = X509V3_parse_list(sect); + gnsect = gnsect_owned; } if (!gnsect) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND); return NULL; } - gens = v2i_GENERAL_NAMES(NULL, ctx, gnsect); - if (*sect == '@') { - X509V3_section_free(ctx, gnsect); - } else { - sk_CONF_VALUE_pop_free(gnsect, X509V3_conf_free); - } + STACK_OF(GENERAL_NAME) *gens = v2i_GENERAL_NAMES(NULL, ctx, gnsect); + sk_CONF_VALUE_pop_free(gnsect_owned, X509V3_conf_free); return gens; } -static int set_dist_point_name(DIST_POINT_NAME **pdp, X509V3_CTX *ctx, - CONF_VALUE *cnf) { +// 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) { 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; - STACK_OF(CONF_VALUE) *dnsect; - 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; } - dnsect = X509V3_get_section(ctx, cnf->value); + const STACK_OF(CONF_VALUE) *dnsect = X509V3_get_section(ctx, cnf->value); if (!dnsect) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_SECTION_NOT_FOUND); return -1; } - ret = X509V3_NAME_from_section(nm, dnsect, MBSTRING_ASC); - X509V3_section_free(ctx, dnsect); + 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; @@ -207,27 +215,26 @@ static const BIT_STRING_BITNAME reason_flags[] = { {8, "AA Compromise", "AACompromise"}, {-1, NULL, NULL}}; -static int set_reasons(ASN1_BIT_STRING **preas, 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) { +static int set_reasons(ASN1_BIT_STRING **preas, const char *value) { + 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)) { @@ -270,19 +277,16 @@ static int print_reasons(BIO *out, const char *rname, ASN1_BIT_STRING *rflags, return 1; } -static DIST_POINT *crldp_from_section(X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval) { - size_t i; - CONF_VALUE *cnf; +static DIST_POINT *crldp_from_section(const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { DIST_POINT *point = NULL; point = DIST_POINT_new(); if (!point) { goto err; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - int ret; - cnf = sk_CONF_VALUE_value(nval, i); - ret = set_dist_point_name(&point->distpoint, ctx, cnf); + for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); + int ret = set_dist_point_name(&point->distpoint, ctx, cnf); if (ret > 0) { continue; } @@ -294,6 +298,7 @@ static DIST_POINT *crldp_from_section(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; @@ -308,54 +313,50 @@ static DIST_POINT *crldp_from_section(X509V3_CTX *ctx, return NULL; } -static void *v2i_crld(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval) { +static void *v2i_crld(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { STACK_OF(DIST_POINT) *crld = NULL; GENERAL_NAMES *gens = NULL; GENERAL_NAME *gen = NULL; - CONF_VALUE *cnf; - size_t i; if (!(crld = sk_DIST_POINT_new_null())) { - goto merr; + goto err; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { + for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { DIST_POINT *point; - cnf = sk_CONF_VALUE_value(nval, i); + const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); if (!cnf->value) { - STACK_OF(CONF_VALUE) *dpsect; - dpsect = X509V3_get_section(ctx, cnf->name); + const STACK_OF(CONF_VALUE) *dpsect = X509V3_get_section(ctx, cnf->name); if (!dpsect) { goto err; } point = crldp_from_section(ctx, dpsect); - X509V3_section_free(ctx, dpsect); if (!point) { goto err; } 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; @@ -364,8 +365,6 @@ static void *v2i_crld(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, } return crld; -merr: - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); err: GENERAL_NAME_free(gen); GENERAL_NAMES_free(gens); @@ -390,14 +389,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), @@ -426,8 +423,8 @@ IMPLEMENT_ASN1_FUNCTIONS(ISSUING_DIST_POINT) static int i2r_idp(const X509V3_EXT_METHOD *method, void *pidp, BIO *out, int indent); -static void *v2i_idp(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval); +static void *v2i_idp(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval); const X509V3_EXT_METHOD v3_idp = { NID_issuing_distribution_point, @@ -446,22 +443,17 @@ const X509V3_EXT_METHOD v3_idp = { NULL, }; -static void *v2i_idp(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval) { - ISSUING_DIST_POINT *idp = NULL; - CONF_VALUE *cnf; - char *name, *val; - size_t i; - int ret; - idp = ISSUING_DIST_POINT_new(); +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 (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - cnf = sk_CONF_VALUE_value(nval, i); - name = cnf->name; - val = cnf->value; - ret = set_dist_point_name(&idp->distpoint, ctx, cnf); + for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { + const CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i); + const char *name = cnf->name; + const char *val = cnf->value; + int ret = set_dist_point_name(&idp->distpoint, ctx, cnf); if (ret > 0) { continue; } @@ -496,8 +488,6 @@ static void *v2i_idp(const X509V3_EXT_METHOD *method, 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/third_party/boringssl/src/crypto/x509v3/v3_enum.c b/third_party/boringssl/src/crypto/x509v3/v3_enum.c index cd93f30b3697..3143a98d3539 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_enum.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_enum.c @@ -1,4 +1,3 @@ -/* v3_enum.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. diff --git a/third_party/boringssl/src/crypto/x509v3/v3_extku.c b/third_party/boringssl/src/crypto/x509v3/v3_extku.c index 0305ed29d1e0..d678ac781d9c 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_extku.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_extku.c @@ -1,4 +1,3 @@ -/* v3_extku.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -63,9 +62,12 @@ #include #include +#include "internal.h" + + static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval); static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE( const X509V3_EXT_METHOD *method, void *eku, STACK_OF(CONF_VALUE) *extlist); @@ -112,12 +114,10 @@ IMPLEMENT_ASN1_FUNCTIONS_const(EXTENDED_KEY_USAGE) static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE( const X509V3_EXT_METHOD *method, void *a, STACK_OF(CONF_VALUE) *ext_list) { - EXTENDED_KEY_USAGE *eku = a; - size_t i; - ASN1_OBJECT *obj; - char obj_tmp[80]; - for (i = 0; i < sk_ASN1_OBJECT_num(eku); i++) { - obj = sk_ASN1_OBJECT_value(eku, i); + const EXTENDED_KEY_USAGE *eku = a; + for (size_t i = 0; i < sk_ASN1_OBJECT_num(eku); i++) { + const ASN1_OBJECT *obj = sk_ASN1_OBJECT_value(eku, i); + char obj_tmp[80]; i2t_ASN1_OBJECT(obj_tmp, 80, obj); X509V3_add_value(NULL, obj_tmp, &ext_list); } @@ -125,33 +125,30 @@ static STACK_OF(CONF_VALUE) *i2v_EXTENDED_KEY_USAGE( } static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval) { - EXTENDED_KEY_USAGE *extku; - char *extval; - ASN1_OBJECT *objtmp; - CONF_VALUE *val; - size_t i; - - if (!(extku = sk_ASN1_OBJECT_new_null())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { + EXTENDED_KEY_USAGE *extku = sk_ASN1_OBJECT_new_null(); + if (extku == NULL) { return NULL; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - val = sk_CONF_VALUE_value(nval, i); + for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { + const CONF_VALUE *val = sk_CONF_VALUE_value(nval, i); + const char *extval; if (val->value) { extval = val->value; } else { extval = val->name; } - if (!(objtmp = OBJ_txt2obj(extval, 0))) { + ASN1_OBJECT *obj = OBJ_txt2obj(extval, 0); + if (obj == NULL || !sk_ASN1_OBJECT_push(extku, obj)) { + ASN1_OBJECT_free(obj); sk_ASN1_OBJECT_pop_free(extku, ASN1_OBJECT_free); OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER); X509V3_conf_err(val); return NULL; } - sk_ASN1_OBJECT_push(extku, objtmp); } + return extku; } diff --git a/third_party/boringssl/src/crypto/x509v3/v3_genn.c b/third_party/boringssl/src/crypto/x509v3/v3_genn.c index fef020445205..609c5dae4f8b 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_genn.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_genn.c @@ -1,4 +1,3 @@ -/* v3_genn.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -62,6 +61,8 @@ #include #include +#include "internal.h" + ASN1_SEQUENCE(OTHERNAME) = { ASN1_SIMPLE(OTHERNAME, type_id, ASN1_OBJECT), @@ -122,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(const OTHERNAME *a, const 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) { @@ -130,13 +147,13 @@ 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); 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: @@ -156,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/third_party/boringssl/src/crypto/x509v3/v3_ia5.c b/third_party/boringssl/src/crypto/x509v3/v3_ia5.c index 8abf40ca33b5..e0f9e6bfdaf7 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_ia5.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_ia5.c @@ -1,4 +1,3 @@ -/* v3_ia5.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -77,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); @@ -86,7 +84,7 @@ static char *i2s_ASN1_IA5STRING(const X509V3_EXT_METHOD *method, void *ext) { } static void *s2i_ASN1_IA5STRING(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, const char *str) { + const X509V3_CTX *ctx, const char *str) { ASN1_IA5STRING *ia5; if (!str) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT); @@ -101,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/third_party/boringssl/src/crypto/x509v3/v3_info.c b/third_party/boringssl/src/crypto/x509v3/v3_info.c index 872346acfe8c..5e14b7658750 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_info.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_info.c @@ -1,4 +1,3 @@ -/* v3_info.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -71,8 +70,8 @@ static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS( const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *ret); static void *v2i_AUTHORITY_INFO_ACCESS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval); const X509V3_EXT_METHOD v3_info = { NID_info_access, @@ -158,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); } @@ -166,39 +164,34 @@ static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS( } static void *v2i_AUTHORITY_INFO_ACCESS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval) { + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { AUTHORITY_INFO_ACCESS *ainfo = NULL; 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++) { - CONF_VALUE *cnf = sk_CONF_VALUE_value(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, ';'); + 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))) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); + 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/third_party/boringssl/src/crypto/x509v3/v3_int.c b/third_party/boringssl/src/crypto/x509v3/v3_int.c index 50cef849e6cf..0ca2b5ec25e9 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_int.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_int.c @@ -1,4 +1,3 @@ -/* v3_int.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -65,7 +64,7 @@ static char *i2s_ASN1_INTEGER_cb(const X509V3_EXT_METHOD *method, void *ext) { return i2s_ASN1_INTEGER(method, ext); } -static void *s2i_asn1_int(const X509V3_EXT_METHOD *meth, X509V3_CTX *ctx, +static void *s2i_asn1_int(const X509V3_EXT_METHOD *meth, const X509V3_CTX *ctx, const char *value) { return s2i_ASN1_INTEGER(meth, value); } diff --git a/third_party/boringssl/src/crypto/x509v3/v3_lib.c b/third_party/boringssl/src/crypto/x509v3/v3_lib.c index 51b0f37673c3..61cbeea28ebc 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_lib.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_lib.c @@ -1,4 +1,3 @@ -/* v3_lib.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -58,6 +57,7 @@ */ /* X509 v3 extension utilities */ +#include #include #include @@ -71,24 +71,23 @@ #include "ext_dat.h" 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); } int X509V3_EXT_add(X509V3_EXT_METHOD *ext) { + // We only support |ASN1_ITEM|-based extensions. + assert(ext->it != NULL); + + // TODO(davidben): This should be locked. Also check for duplicates. 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; } + sk_X509V3_EXT_METHOD_sort(ext_list); return 1; } @@ -116,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; } @@ -138,28 +136,12 @@ int X509V3_EXT_free(int nid, void *ext_data) { return 0; } - if (ext_method->it != NULL) { - ASN1_item_free(ext_data, ASN1_ITEM_ptr(ext_method->it)); - } else if (ext_method->ext_free != NULL) { - ext_method->ext_free(ext_data); - } else { - OPENSSL_PUT_ERROR(X509V3, X509V3_R_CANNOT_FIND_FREE_FUNCTION); - return 0; - } - - return 1; -} - -int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist) { - for (; extlist->ext_nid != -1; extlist++) { - if (!X509V3_EXT_add(extlist)) { - return 0; - } - } + ASN1_item_free(ext_data, ASN1_ITEM_ptr(ext_method->it)); return 1; } int X509V3_EXT_add_alias(int nid_to, int nid_from) { +OPENSSL_BEGIN_ALLOW_DEPRECATED const X509V3_EXT_METHOD *ext; X509V3_EXT_METHOD *tmpext; @@ -169,24 +151,16 @@ 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; tmpext->ext_nid = nid_to; - tmpext->ext_flags |= X509V3_EXT_DYNAMIC; - return X509V3_EXT_add(tmpext); -} - -void X509V3_EXT_cleanup(void) { - sk_X509V3_EXT_METHOD_pop_free(ext_list, ext_list_free); - ext_list = NULL; -} - -static void ext_list_free(X509V3_EXT_METHOD *ext) { - if (ext->ext_flags & X509V3_EXT_DYNAMIC) { - OPENSSL_free(ext); + if (!X509V3_EXT_add(tmpext)) { + OPENSSL_free(tmpext); + return 0; } + return 1; +OPENSSL_END_ALLOW_DEPRECATED } // Legacy function: we don't need to add standard extensions any more because @@ -204,23 +178,14 @@ void *X509V3_EXT_d2i(const X509_EXTENSION *ext) { return NULL; } p = ext->value->data; - void *ret; - if (method->it) { - ret = - ASN1_item_d2i(NULL, &p, ext->value->length, ASN1_ITEM_ptr(method->it)); - } else { - ret = method->d2i(NULL, &p, ext->value->length); - } + void *ret = + ASN1_item_d2i(NULL, &p, ext->value->length, ASN1_ITEM_ptr(method->it)); if (ret == NULL) { return NULL; } // Check for trailing data. if (p != ext->value->data + ext->value->length) { - if (method->it) { - ASN1_item_free(ret, ASN1_ITEM_ptr(method->it)); - } else { - method->ext_free(ret); - } + ASN1_item_free(ret, ASN1_ITEM_ptr(method->it)); OPENSSL_PUT_ERROR(X509V3, X509V3_R_TRAILING_DATA_IN_EXTENSION); return NULL; } diff --git a/third_party/boringssl/src/crypto/x509v3/v3_ncons.c b/third_party/boringssl/src/crypto/x509v3/v3_ncons.c index f923e29e5c95..ac9559f5c67b 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_ncons.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_ncons.c @@ -1,4 +1,3 @@ -/* v3_ncons.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -70,7 +69,8 @@ static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval); static int i2r_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, void *a, BIO *bp, int ind); static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, @@ -120,18 +120,18 @@ IMPLEMENT_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) IMPLEMENT_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) { - size_t i; - CONF_VALUE tval, *val; + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { STACK_OF(GENERAL_SUBTREE) **ptree = NULL; NAME_CONSTRAINTS *ncons = NULL; GENERAL_SUBTREE *sub = NULL; ncons = NAME_CONSTRAINTS_new(); if (!ncons) { - goto memerr; + goto err; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - val = sk_CONF_VALUE_value(nval, i); + for (size_t i = 0; i < sk_CONF_VALUE_num(nval); i++) { + const CONF_VALUE *val = sk_CONF_VALUE_value(nval, i); + CONF_VALUE tval; if (!strncmp(val->name, "permitted", 9) && val->name[9]) { ptree = &ncons->permittedSubtrees; tval.name = val->name + 10; @@ -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/third_party/boringssl/src/crypto/x509v3/v3_ocsp.c b/third_party/boringssl/src/crypto/x509v3/v3_ocsp.c index b490a1189678..f0ed0b822222 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_ocsp.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_ocsp.c @@ -20,8 +20,8 @@ static int i2r_ocsp_acutoff(const X509V3_EXT_METHOD *method, void *nonce, static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, void *nocheck, BIO *out, int indent); -static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - const char *str); +static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, + const X509V3_CTX *ctx, const char *str); const X509V3_EXT_METHOD v3_crl_invdate = { NID_invalidity_date, @@ -75,7 +75,7 @@ static int i2r_ocsp_nocheck(const X509V3_EXT_METHOD *method, void *nocheck, return 1; } -static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - const char *str) { +static void *s2i_ocsp_nocheck(const X509V3_EXT_METHOD *method, + const X509V3_CTX *ctx, const char *str) { return ASN1_NULL_new(); } diff --git a/third_party/boringssl/src/crypto/x509v3/v3_pci.c b/third_party/boringssl/src/crypto/x509v3/v3_pci.c deleted file mode 100644 index cafb40c90950..000000000000 --- a/third_party/boringssl/src/crypto/x509v3/v3_pci.c +++ /dev/null @@ -1,287 +0,0 @@ -/* v3_pci.c -*- mode:C; c-file-style: "eay" -*- */ -/* - * 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, 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) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - 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; - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - 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; - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - 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) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - 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, 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; - size_t i, j; - int nid; - - vals = X509V3_parse_list(value); - for (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 == '@') { - STACK_OF(CONF_VALUE) *sect; - int success_p = 1; - - 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 (j = 0; success_p && j < sk_CONF_VALUE_num(sect); j++) { - success_p = process_pci_value(sk_CONF_VALUE_value(sect, j), &language, - &pathlen, &policy); - } - X509V3_section_free(ctx, sect); - if (!success_p) { - 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) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - 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/third_party/boringssl/src/crypto/x509v3/v3_pcia.c b/third_party/boringssl/src/crypto/x509v3/v3_pcia.c deleted file mode 100644 index 62893ed79487..000000000000 --- a/third_party/boringssl/src/crypto/x509v3/v3_pcia.c +++ /dev/null @@ -1,55 +0,0 @@ -/* v3_pcia.c -*- mode:C; c-file-style: "eay" -*- */ -/* - * 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/third_party/boringssl/src/crypto/x509v3/v3_pcons.c b/third_party/boringssl/src/crypto/x509v3/v3_pcons.c index 7ed778b1ac3b..7b70a4e43138 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_pcons.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_pcons.c @@ -1,4 +1,3 @@ -/* v3_pcons.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -65,12 +64,15 @@ #include #include +#include "internal.h" + + static STACK_OF(CONF_VALUE) *i2v_POLICY_CONSTRAINTS( const X509V3_EXT_METHOD *method, void *bcons, STACK_OF(CONF_VALUE) *extlist); static void *v2i_POLICY_CONSTRAINTS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *values); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *values); const X509V3_EXT_METHOD v3_policy_constraints = { NID_policy_constraints, @@ -97,7 +99,7 @@ IMPLEMENT_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) static STACK_OF(CONF_VALUE) *i2v_POLICY_CONSTRAINTS( const X509V3_EXT_METHOD *method, void *a, STACK_OF(CONF_VALUE) *extlist) { - POLICY_CONSTRAINTS *pcons = a; + const POLICY_CONSTRAINTS *pcons = a; X509V3_add_value_int("Require Explicit Policy", pcons->requireExplicitPolicy, &extlist); X509V3_add_value_int("Inhibit Policy Mapping", pcons->inhibitPolicyMapping, @@ -106,17 +108,14 @@ static STACK_OF(CONF_VALUE) *i2v_POLICY_CONSTRAINTS( } static void *v2i_POLICY_CONSTRAINTS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *values) { + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *values) { POLICY_CONSTRAINTS *pcons = NULL; - CONF_VALUE *val; - size_t i; if (!(pcons = POLICY_CONSTRAINTS_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } - for (i = 0; i < sk_CONF_VALUE_num(values); i++) { - val = sk_CONF_VALUE_value(values, i); + for (size_t i = 0; i < sk_CONF_VALUE_num(values); i++) { + const CONF_VALUE *val = sk_CONF_VALUE_value(values, i); if (!strcmp(val->name, "requireExplicitPolicy")) { if (!X509V3_get_value_int(val, &pcons->requireExplicitPolicy)) { goto err; diff --git a/third_party/boringssl/src/crypto/x509v3/v3_pmaps.c b/third_party/boringssl/src/crypto/x509v3/v3_pmaps.c index 02f971650c24..cd8efd6d2d27 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_pmaps.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_pmaps.c @@ -1,4 +1,3 @@ -/* v3_pmaps.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -63,8 +62,12 @@ #include #include +#include "internal.h" + + static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval); static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS( const X509V3_EXT_METHOD *method, void *pmps, STACK_OF(CONF_VALUE) *extlist); @@ -98,13 +101,10 @@ IMPLEMENT_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS( const X509V3_EXT_METHOD *method, void *a, STACK_OF(CONF_VALUE) *ext_list) { - POLICY_MAPPINGS *pmaps = a; - POLICY_MAPPING *pmap; - size_t i; - char obj_tmp1[80]; - char obj_tmp2[80]; - for (i = 0; i < sk_POLICY_MAPPING_num(pmaps); i++) { - pmap = sk_POLICY_MAPPING_value(pmaps, i); + const POLICY_MAPPINGS *pmaps = a; + for (size_t i = 0; i < sk_POLICY_MAPPING_num(pmaps); i++) { + const POLICY_MAPPING *pmap = sk_POLICY_MAPPING_value(pmaps, i); + char obj_tmp1[80], obj_tmp2[80]; i2t_ASN1_OBJECT(obj_tmp1, 80, pmap->issuerDomainPolicy); i2t_ASN1_OBJECT(obj_tmp2, 80, pmap->subjectDomainPolicy); X509V3_add_value(obj_tmp1, obj_tmp2, &ext_list); @@ -113,43 +113,38 @@ static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS( } static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) { - POLICY_MAPPINGS *pmaps; - POLICY_MAPPING *pmap; - ASN1_OBJECT *obj1, *obj2; - CONF_VALUE *val; - size_t i; - - if (!(pmaps = sk_POLICY_MAPPING_new_null())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval) { + POLICY_MAPPINGS *pmaps = sk_POLICY_MAPPING_new_null(); + if (pmaps == NULL) { return NULL; } - for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { - val = sk_CONF_VALUE_value(nval, i); + 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; + goto err; + } + + POLICY_MAPPING *pmap = POLICY_MAPPING_new(); + if (pmap == NULL || !sk_POLICY_MAPPING_push(pmaps, pmap)) { + POLICY_MAPPING_free(pmap); + goto err; } - obj1 = OBJ_txt2obj(val->name, 0); - obj2 = OBJ_txt2obj(val->value, 0); - if (!obj1 || !obj2) { - sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free); + + 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); - return NULL; + goto err; } - pmap = POLICY_MAPPING_new(); - if (!pmap) { - sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free); - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); - return NULL; - } - pmap->issuerDomainPolicy = obj1; - pmap->subjectDomainPolicy = obj2; - sk_POLICY_MAPPING_push(pmaps, pmap); } return pmaps; + +err: + sk_POLICY_MAPPING_pop_free(pmaps, POLICY_MAPPING_free); + return NULL; } diff --git a/third_party/boringssl/src/crypto/x509v3/v3_prn.c b/third_party/boringssl/src/crypto/x509v3/v3_prn.c index 20d2ad99e58f..f6260e2483de 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_prn.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_prn.c @@ -1,4 +1,3 @@ -/* v3_prn.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -106,59 +105,47 @@ void X509V3_EXT_val_prn(BIO *out, const STACK_OF(CONF_VALUE) *val, int indent, int X509V3_EXT_print(BIO *out, const X509_EXTENSION *ext, unsigned long flag, int indent) { - void *ext_str = NULL; - char *value = NULL; - const X509V3_EXT_METHOD *method; - STACK_OF(CONF_VALUE) *nval = NULL; - int ok = 1; - - if (!(method = X509V3_EXT_get(ext))) { + const X509V3_EXT_METHOD *method = X509V3_EXT_get(ext); + if (method == NULL) { return unknown_ext_print(out, ext, flag, indent, 0); } const ASN1_STRING *ext_data = X509_EXTENSION_get_data(ext); const unsigned char *p = ASN1_STRING_get0_data(ext_data); - if (method->it) { - ext_str = ASN1_item_d2i(NULL, &p, ASN1_STRING_length(ext_data), - ASN1_ITEM_ptr(method->it)); - } else { - ext_str = method->d2i(NULL, &p, ASN1_STRING_length(ext_data)); - } - + void *ext_str = ASN1_item_d2i(NULL, &p, ASN1_STRING_length(ext_data), + ASN1_ITEM_ptr(method->it)); if (!ext_str) { return unknown_ext_print(out, ext, flag, indent, 1); } + char *value = NULL; + STACK_OF(CONF_VALUE) *nval = NULL; + int ok = 0; if (method->i2s) { if (!(value = method->i2s(method, ext_str))) { - ok = 0; goto err; } BIO_printf(out, "%*s%s", indent, "", value); } else if (method->i2v) { if (!(nval = method->i2v(method, ext_str, NULL))) { - ok = 0; goto err; } X509V3_EXT_val_prn(out, nval, indent, method->ext_flags & X509V3_EXT_MULTILINE); } else if (method->i2r) { if (!method->i2r(method, ext_str, out, indent)) { - ok = 0; + goto err; } } else { - ok = 0; + OPENSSL_PUT_ERROR(X509V3, X509V3_R_OPERATION_NOT_DEFINED); + goto err; } + ok = 1; + err: sk_CONF_VALUE_pop_free(nval, X509V3_conf_free); - if (value) { - OPENSSL_free(value); - } - if (method->it) { - ASN1_item_free(ext_str, ASN1_ITEM_ptr(method->it)); - } else { - method->ext_free(ext_str); - } + OPENSSL_free(value); + ASN1_item_free(ext_str, ASN1_ITEM_ptr(method->it)); return ok; } diff --git a/third_party/boringssl/src/crypto/x509v3/v3_purp.c b/third_party/boringssl/src/crypto/x509v3/v3_purp.c index 00c0571c2f03..34ce33e27d72 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_purp.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_purp.c @@ -1,4 +1,3 @@ -/* v3_purp.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 2001. @@ -96,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[] = { @@ -127,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; } @@ -202,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; } @@ -225,7 +223,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; @@ -237,7 +234,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,16 +266,19 @@ 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))) { - 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; } + sk_X509_PURPOSE_sort(xptable); } return 1; } @@ -335,7 +334,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 @@ -401,7 +399,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; @@ -454,23 +451,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) { @@ -802,11 +782,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/third_party/boringssl/src/crypto/x509v3/v3_skey.c b/third_party/boringssl/src/crypto/x509v3/v3_skey.c index 05c5050d4527..caa7fe50a0b9 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_skey.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_skey.c @@ -1,4 +1,3 @@ -/* v3_skey.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 1999. @@ -55,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" @@ -73,23 +74,28 @@ char *i2s_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, } ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, const char *str) { - ASN1_OCTET_STRING *oct; - long length; - - if (!(oct = ASN1_OCTET_STRING_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); + const X509V3_CTX *ctx, + const char *str) { + 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, @@ -97,7 +103,7 @@ static char *i2s_ASN1_OCTET_STRING_cb(const X509V3_EXT_METHOD *method, return i2s_ASN1_OCTET_STRING(method, ext); } -static void *s2i_skey_id(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, +static void *s2i_skey_id(const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *str) { ASN1_OCTET_STRING *oct; ASN1_BIT_STRING *pk; @@ -109,11 +115,10 @@ static void *s2i_skey_id(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, } if (!(oct = ASN1_OCTET_STRING_new())) { - OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return NULL; } - if (ctx && (ctx->flags == CTX_TEST)) { + if (ctx && (ctx->flags == X509V3_CTX_TEST)) { return oct; } @@ -138,7 +143,6 @@ static void *s2i_skey_id(const X509V3_EXT_METHOD *method, 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/third_party/boringssl/src/crypto/x509v3/v3_utl.c b/third_party/boringssl/src/crypto/x509v3/v3_utl.c index a78127b0e672..bbc82e283145 100644 --- a/third_party/boringssl/src/crypto/x509v3/v3_utl.c +++ b/third_party/boringssl/src/crypto/x509v3/v3_utl.c @@ -1,4 +1,3 @@ -/* v3_utl.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -76,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); @@ -97,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. @@ -107,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); @@ -142,11 +139,6 @@ int X509V3_add_value(const char *name, const char *value, /*omit_value=*/value == NULL, extlist); } -int X509V3_add_value_uchar(const char *name, const unsigned char *value, - STACK_OF(CONF_VALUE) **extlist) { - return X509V3_add_value(name, (const char *)value, extlist); -} - int x509V3_add_value_asn1_string(const char *name, const ASN1_STRING *value, STACK_OF(CONF_VALUE) **extlist) { return x509V3_add_len_value(name, (const char *)value->data, value->length, @@ -173,14 +165,6 @@ int X509V3_add_value_bool(const char *name, int asn1_bool, return X509V3_add_value(name, "FALSE", extlist); } -int X509V3_add_value_bool_nf(const char *name, int asn1_bool, - STACK_OF(CONF_VALUE) **extlist) { - if (asn1_bool) { - return X509V3_add_value(name, "TRUE", extlist); - } - return 1; -} - static char *bignum_to_string(const BIGNUM *bn) { char *tmp, *ret; size_t len; @@ -200,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; } @@ -226,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; @@ -240,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; @@ -274,6 +255,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); } @@ -314,23 +305,33 @@ 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) { - 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; +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 = 0; + } + 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; } @@ -341,6 +342,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; } @@ -359,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; @@ -446,14 +447,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) { @@ -489,14 +490,14 @@ 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; } -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; if (!str) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_NULL_ARGUMENT); return NULL; @@ -515,28 +516,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) { @@ -547,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: @@ -556,21 +541,19 @@ unsigned char *x509v3_hex_to_bytes(const char *str, long *len) { return NULL; } -int x509v3_name_cmp(const char *name, const char *cmp) { - int len, ret; - char c; - len = strlen(cmp); - if ((ret = strncmp(name, cmp, len))) { - return ret; - } - c = name[len]; - if (!c || (c == '.')) { +int x509v3_conf_name_matches(const char *name, const char *cmp) { + // |name| must begin with |cmp|. + size_t len = strlen(cmp); + if (strncmp(name, cmp, len) != 0) { return 0; } - return 1; + // |name| must either be equal to |cmp| or begin with |cmp|, followed by '.'. + 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; @@ -717,13 +700,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; } } @@ -813,8 +790,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; } } @@ -850,8 +826,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; @@ -925,8 +900,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 == ':') { @@ -1335,38 +1309,28 @@ 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; return 1; } -int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, - unsigned long chtype) { - CONF_VALUE *v; - int mval; - size_t i; - char *p, *type; +int X509V3_NAME_from_section(X509_NAME *nm, const STACK_OF(CONF_VALUE) *dn_sk, + int chtype) { if (!nm) { return 0; } - for (i = 0; i < sk_CONF_VALUE_num(dn_sk); i++) { - v = sk_CONF_VALUE_value(dn_sk, i); - type = v->name; + for (size_t i = 0; i < sk_CONF_VALUE_num(dn_sk); i++) { + const CONF_VALUE *v = sk_CONF_VALUE_value(dn_sk, i); + const char *type = v->name; // Skip past any leading X. X: X, etc to allow for multiple instances - for (p = type; *p; p++) { + for (const char *p = type; *p; p++) { if ((*p == ':') || (*p == ',') || (*p == '.')) { p++; if (*p) { @@ -1375,6 +1339,7 @@ int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, break; } } + int mval; if (*type == '+') { mval = -1; type++; diff --git a/third_party/boringssl/src/decrepit/CMakeLists.txt b/third_party/boringssl/src/decrepit/CMakeLists.txt index 16985da1996b..927882e943f3 100644 --- a/third_party/boringssl/src/decrepit/CMakeLists.txt +++ b/third_party/boringssl/src/decrepit/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../include) - add_library( decrepit @@ -21,9 +19,6 @@ add_library( x509/x509_decrepit.c xts/xts.c ) - -add_dependencies(decrepit global_target) - target_link_libraries(decrepit crypto ssl) add_executable( @@ -35,15 +30,7 @@ add_executable( evp/evp_test.cc ripemd/ripemd_test.cc xts/xts_test.cc - - $ ) - -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() +target_link_libraries(decrepit_test test_support_lib boringssl_gtest_main + decrepit crypto) add_dependencies(all_tests decrepit_test) diff --git a/third_party/boringssl/src/decrepit/cfb/cfb.c b/third_party/boringssl/src/decrepit/cfb/cfb.c index d2311535787d..c15292cf02c9 100644 --- a/third_party/boringssl/src/decrepit/cfb/cfb.c +++ b/third_party/boringssl/src/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/third_party/boringssl/src/decrepit/cfb/cfb_test.cc b/third_party/boringssl/src/decrepit/cfb/cfb_test.cc index 2510a88a6fc0..da9681eca62a 100644 --- a/third_party/boringssl/src/decrepit/cfb/cfb_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/decrepit/macros.h b/third_party/boringssl/src/decrepit/macros.h index 7888f0d10b41..4e4ea939e5cb 100644 --- a/third_party/boringssl/src/decrepit/macros.h +++ b/third_party/boringssl/src/decrepit/macros.h @@ -61,35 +61,35 @@ // NOTE - c is not incremented as per n2l -#define n2ln(c, l1, l2, n) \ - { \ - c += n; \ - l1 = l2 = 0; \ - switch (n) { \ - case 8: \ - l2 = ((unsigned long)(*(--(c)))); \ - OPENSSL_FALLTHROUGH; \ - case 7: \ - l2 |= ((unsigned long)(*(--(c)))) << 8; \ - OPENSSL_FALLTHROUGH; \ - case 6: \ - l2 |= ((unsigned long)(*(--(c)))) << 16; \ - OPENSSL_FALLTHROUGH; \ - case 5: \ - l2 |= ((unsigned long)(*(--(c)))) << 24; \ - OPENSSL_FALLTHROUGH; \ - case 4: \ - l1 = ((unsigned long)(*(--(c)))); \ - OPENSSL_FALLTHROUGH; \ - case 3: \ - l1 |= ((unsigned long)(*(--(c)))) << 8; \ - OPENSSL_FALLTHROUGH; \ - case 2: \ - l1 |= ((unsigned long)(*(--(c)))) << 16; \ - OPENSSL_FALLTHROUGH; \ - case 1: \ - l1 |= ((unsigned long)(*(--(c)))) << 24; \ - } \ +#define n2ln(c, l1, l2, n) \ + { \ + c += n; \ + l1 = l2 = 0; \ + switch (n) { \ + case 8: \ + l2 = ((uint32_t)(*(--(c)))); \ + OPENSSL_FALLTHROUGH; \ + case 7: \ + l2 |= ((uint32_t)(*(--(c)))) << 8; \ + OPENSSL_FALLTHROUGH; \ + case 6: \ + l2 |= ((uint32_t)(*(--(c)))) << 16; \ + OPENSSL_FALLTHROUGH; \ + case 5: \ + l2 |= ((uint32_t)(*(--(c)))) << 24; \ + OPENSSL_FALLTHROUGH; \ + case 4: \ + l1 = ((uint32_t)(*(--(c)))); \ + OPENSSL_FALLTHROUGH; \ + case 3: \ + l1 |= ((uint32_t)(*(--(c)))) << 8; \ + OPENSSL_FALLTHROUGH; \ + case 2: \ + l1 |= ((uint32_t)(*(--(c)))) << 16; \ + OPENSSL_FALLTHROUGH; \ + case 1: \ + l1 |= ((uint32_t)(*(--(c)))) << 24; \ + } \ } // NOTE - c is not incremented as per l2n @@ -99,25 +99,25 @@ switch (n) { \ case 8: \ *(--(c)) = (unsigned char)(((l2)) & 0xff); \ - OPENSSL_FALLTHROUGH; \ + OPENSSL_FALLTHROUGH; \ case 7: \ *(--(c)) = (unsigned char)(((l2) >> 8) & 0xff); \ - OPENSSL_FALLTHROUGH; \ + OPENSSL_FALLTHROUGH; \ case 6: \ *(--(c)) = (unsigned char)(((l2) >> 16) & 0xff); \ - OPENSSL_FALLTHROUGH; \ + OPENSSL_FALLTHROUGH; \ case 5: \ *(--(c)) = (unsigned char)(((l2) >> 24) & 0xff); \ - OPENSSL_FALLTHROUGH; \ + OPENSSL_FALLTHROUGH; \ case 4: \ *(--(c)) = (unsigned char)(((l1)) & 0xff); \ - OPENSSL_FALLTHROUGH; \ + OPENSSL_FALLTHROUGH; \ case 3: \ *(--(c)) = (unsigned char)(((l1) >> 8) & 0xff); \ - OPENSSL_FALLTHROUGH; \ + OPENSSL_FALLTHROUGH; \ case 2: \ *(--(c)) = (unsigned char)(((l1) >> 16) & 0xff); \ - OPENSSL_FALLTHROUGH; \ + OPENSSL_FALLTHROUGH; \ case 1: \ *(--(c)) = (unsigned char)(((l1) >> 24) & 0xff); \ } \ @@ -129,11 +129,9 @@ *((c)++) = (unsigned char)(((l) >> 8L) & 0xff), \ *((c)++) = (unsigned char)(((l)) & 0xff)) -#define n2l(c, l) \ - (l = ((unsigned long)(*((c)++))) << 24L, \ - l |= ((unsigned long)(*((c)++))) << 16L, \ - l |= ((unsigned long)(*((c)++))) << 8L, \ - l |= ((unsigned long)(*((c)++)))) +#define n2l(c, l) \ + (l = ((uint32_t)(*((c)++))) << 24L, l |= ((uint32_t)(*((c)++))) << 16L, \ + l |= ((uint32_t)(*((c)++))) << 8L, l |= ((uint32_t)(*((c)++)))) #endif // OPENSSL_HEADER_DECREPIT_MACROS_H diff --git a/third_party/boringssl/src/decrepit/ripemd/ripemd_test.cc b/third_party/boringssl/src/decrepit/ripemd/ripemd_test.cc index 0700baee000e..6338fec75197 100644 --- a/third_party/boringssl/src/decrepit/ripemd/ripemd_test.cc +++ b/third_party/boringssl/src/decrepit/ripemd/ripemd_test.cc @@ -57,17 +57,13 @@ static const RIPEMDTestCase kRIPEMDTestCases[] = { // TODO(davidben): Convert this file to GTest properly. TEST(RIPEMDTest, RunTest) { - unsigned test_num = 0; - int ok = 1; - for (const auto &test : kRIPEMDTestCases) { - test_num++; - + SCOPED_TRACE(test.input); const size_t input_len = strlen(test.input); for (size_t stride = 0; stride <= input_len; stride++) { + SCOPED_TRACE(stride); uint8_t digest[RIPEMD160_DIGEST_LENGTH]; - if (stride == 0) { RIPEMD160(reinterpret_cast(test.input), input_len, digest); @@ -89,12 +85,7 @@ TEST(RIPEMDTest, RunTest) { RIPEMD160_Final(digest, &ctx); } - if (OPENSSL_memcmp(digest, test.expected, sizeof(digest)) != 0) { - fprintf(stderr, "#%u: bad result with stride %u: ", test_num, - static_cast(stride)); - hexdump(stderr, "", digest, sizeof(digest)); - ok = 0; - } + EXPECT_EQ(Bytes(digest), Bytes(test.expected)); } } @@ -107,12 +98,6 @@ TEST(RIPEMDTest, RunTest) { static const uint8_t kMillionADigest[RIPEMD160_DIGEST_LENGTH] = { 0x52, 0x78, 0x32, 0x43, 0xc1, 0x69, 0x7b, 0xdb, 0xe1, 0x6d, 0x37, 0xf9, 0x7f, 0x68, 0xf0, 0x83, 0x25, 0xdc, 0x15, 0x28}; - - if (OPENSSL_memcmp(digest, kMillionADigest, sizeof(digest)) != 0) { - fprintf(stderr, u8"Digest incorrect for “million a's†test: "); - hexdump(stderr, "", digest, sizeof(digest)); - ok = 0; - } - - EXPECT_EQ(1, ok); + EXPECT_EQ(Bytes(digest), Bytes(kMillionADigest)) + << "Digest incorrect for \"million a's\" test"; } diff --git a/third_party/boringssl/src/decrepit/rsa/rsa_decrepit.c b/third_party/boringssl/src/decrepit/rsa/rsa_decrepit.c index 54be9b2712e4..2c06fe34e619 100644 --- a/third_party/boringssl/src/decrepit/rsa/rsa_decrepit.c +++ b/third_party/boringssl/src/decrepit/rsa/rsa_decrepit.c @@ -61,7 +61,7 @@ #include -RSA *RSA_generate_key(int bits, unsigned long e_value, void *callback, +RSA *RSA_generate_key(int bits, uint64_t e_value, void *callback, void *cb_arg) { assert(callback == NULL); assert(cb_arg == NULL); @@ -71,7 +71,7 @@ RSA *RSA_generate_key(int bits, unsigned long e_value, void *callback, if (rsa == NULL || e == NULL || - !BN_set_word(e, e_value) || + !BN_set_u64(e, e_value) || !RSA_generate_key_ex(rsa, bits, e, NULL)) { goto err; } diff --git a/third_party/boringssl/src/decrepit/x509/x509_decrepit.c b/third_party/boringssl/src/decrepit/x509/x509_decrepit.c index 3abab06a3acd..5af499ed41a6 100644 --- a/third_party/boringssl/src/decrepit/x509/x509_decrepit.c +++ b/third_party/boringssl/src/decrepit/x509/x509_decrepit.c @@ -19,8 +19,9 @@ #include -X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, - int ext_nid, const char *value) { +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + const X509V3_CTX *ctx, int ext_nid, + const char *value) { assert(conf == NULL); return X509V3_EXT_nconf_nid(NULL, ctx, ext_nid, value); } diff --git a/third_party/boringssl/src/decrepit/xts/xts_test.cc b/third_party/boringssl/src/decrepit/xts/xts_test.cc index 22e80facd337..346ca556ce37 100644 --- a/third_party/boringssl/src/decrepit/xts/xts_test.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/CMakeLists.txt b/third_party/boringssl/src/fuzz/CMakeLists.txt index 51da4a80a4ae..7856f55a5c6a 100644 --- a/third_party/boringssl/src/fuzz/CMakeLists.txt +++ b/third_party/boringssl/src/fuzz/CMakeLists.txt @@ -1,10 +1,6 @@ -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") @@ -15,19 +11,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/third_party/boringssl/src/fuzz/arm_cpuinfo.cc b/third_party/boringssl/src/fuzz/arm_cpuinfo.cc index ea40725f937d..840f9f04a38e 100644 --- a/third_party/boringssl/src/fuzz/arm_cpuinfo.cc +++ b/third_party/boringssl/src/fuzz/arm_cpuinfo.cc @@ -17,8 +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); - crypto_cpuinfo_has_broken_neon(&sp); return 0; } diff --git a/third_party/boringssl/src/fuzz/cert.cc b/third_party/boringssl/src/fuzz/cert.cc index 79e14561442b..548109e55a8c 100644 --- a/third_party/boringssl/src/fuzz/cert.cc +++ b/third_party/boringssl/src/fuzz/cert.cc @@ -16,12 +16,17 @@ #include #include +#include "../crypto/x509v3/internal.h" + extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) { X509 *x509 = d2i_X509(NULL, &buf, len); if (x509 != NULL) { // Extract the public key. EVP_PKEY_free(X509_get_pubkey(x509)); + // Fuzz some deferred parsing. + x509v3_cache_extensions(x509); + // Reserialize the structure. uint8_t *der = NULL; i2d_X509(x509, &der); diff --git a/third_party/boringssl/src/fuzz/conf.cc b/third_party/boringssl/src/fuzz/conf.cc new file mode 100644 index 000000000000..eed87f35016c --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/08dcd36db4461e27684979b5fc0686526e183c97 b/third_party/boringssl/src/fuzz/conf_corpus/08dcd36db4461e27684979b5fc0686526e183c97 new file mode 100644 index 000000000000..fa0363a42b26 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/08dcd36db4461e27684979b5fc0686526e183c97 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:EXP:1?,NULL + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/0a1e01eb1f9e8e1803399255c4295a31f0d09d50 b/third_party/boringssl/src/fuzz/conf_corpus/0a1e01eb1f9e8e1803399255c4295a31f0d09d50 new file mode 100644 index 000000000000..71531214c504 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/0ab7d18185a7251b6ef04aef2f1e6e687e20130a b/third_party/boringssl/src/fuzz/conf_corpus/0ab7d18185a7251b6ef04aef2f1e6e687e20130a new file mode 100644 index 000000000000..e26224db7e58 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/0b252c0c9bda64bf1660ea4dbd8cf113fa42758b b/third_party/boringssl/src/fuzz/conf_corpus/0b252c0c9bda64bf1660ea4dbd8cf113fa42758b new file mode 100644 index 000000000000..311136a3df0b --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/0b252c0c9bda64bf1660ea4dbd8cf113fa42758b @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:GENTIME:20001231235959Z + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/0d13a928828e81a04c821d7edc9ff2d2df41f1d7 b/third_party/boringssl/src/fuzz/conf_corpus/0d13a928828e81a04c821d7edc9ff2d2df41f1d7 new file mode 100644 index 000000000000..a276a04715f7 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/100bf54ae331e2042a88faf2638b166ff27e5e6f b/third_party/boringssl/src/fuzz/conf_corpus/100bf54ae331e2042a88faf2638b166ff27e5e6f new file mode 100644 index 000000000000..366b80bf4177 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/170c6e9fa613ab2781f872c57cd2c59fc01e0767 b/third_party/boringssl/src/fuzz/conf_corpus/170c6e9fa613ab2781f872c57cd2c59fc01e0767 new file mode 100644 index 000000000000..e8ffb437cba3 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/1797360721db937be80829d7055d265dc0ff8267 b/third_party/boringssl/src/fuzz/conf_corpus/1797360721db937be80829d7055d265dc0ff8267 new file mode 100644 index 000000000000..5e8ad5d2b5ac --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/18bec37e70eec020886a9800c6c56362917783a2 b/third_party/boringssl/src/fuzz/conf_corpus/18bec37e70eec020886a9800c6c56362917783a2 new file mode 100644 index 000000000000..5cd1829426d2 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/18bec37e70eec020886a9800c6c56362917783a2 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,T61:☃ + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/2202e54f0d7738c3a783eaa429ccde4783616a54 b/third_party/boringssl/src/fuzz/conf_corpus/2202e54f0d7738c3a783eaa429ccde4783616a54 new file mode 100644 index 000000000000..9d3715854b51 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/2202e54f0d7738c3a783eaa429ccde4783616a54 @@ -0,0 +1,5 @@ +# +# Example configuration file using includes. +# + +.include=conf-includes diff --git a/third_party/boringssl/src/fuzz/conf_corpus/230abc23734a336467f2c5dec4c3a58559f2ed9a b/third_party/boringssl/src/fuzz/conf_corpus/230abc23734a336467f2c5dec4c3a58559f2ed9a new file mode 100644 index 000000000000..652b4ac14fc9 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/230abc23734a336467f2c5dec4c3a58559f2ed9a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BITSTR:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/275b81ee8a1ba2abb0acad60920505a89067535a b/third_party/boringssl/src/fuzz/conf_corpus/275b81ee8a1ba2abb0acad60920505a89067535a new file mode 100644 index 000000000000..80641498d28d --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/281cc97b63f22afd0306f02883f74c4f718ab4f4 b/third_party/boringssl/src/fuzz/conf_corpus/281cc97b63f22afd0306f02883f74c4f718ab4f4 new file mode 100644 index 000000000000..f320569012ba --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/281cc97b63f22afd0306f02883f74c4f718ab4f4 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,BMP:☃ + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/2a050eb8e3426bd96a1327acd6c8914597c4390c b/third_party/boringssl/src/fuzz/conf_corpus/2a050eb8e3426bd96a1327acd6c8914597c4390c new file mode 100644 index 000000000000..c7f42d2ddeae --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/2a050eb8e3426bd96a1327acd6c8914597c4390c @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INTEGER + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/2c63e3f7ec9e2111d9c6bf63a3022a58b0c24ecd b/third_party/boringssl/src/fuzz/conf_corpus/2c63e3f7ec9e2111d9c6bf63a3022a58b0c24ecd new file mode 100644 index 000000000000..b18c3cea0f5f --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/2c63e3f7ec9e2111d9c6bf63a3022a58b0c24ecd @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UTC:20001231235959Z + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/2cf0606462f76c0946ffe26e2e613a4fe3ce3099 b/third_party/boringssl/src/fuzz/conf_corpus/2cf0606462f76c0946ffe26e2e613a4fe3ce3099 new file mode 100644 index 000000000000..2091646a872a --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/2cf0606462f76c0946ffe26e2e613a4fe3ce3099 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,IA5:☃ + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/30cfb27d45f0000106f031c87d4bc4c3074d70a4 b/third_party/boringssl/src/fuzz/conf_corpus/30cfb27d45f0000106f031c87d4bc4c3074d70a4 new file mode 100644 index 000000000000..a71e8ad049bf --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/328b0f18ee4445e85272d8956999d6141396bfdf b/third_party/boringssl/src/fuzz/conf_corpus/328b0f18ee4445e85272d8956999d6141396bfdf new file mode 100644 index 000000000000..7bfbc53edab5 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/328b0f18ee4445e85272d8956999d6141396bfdf @@ -0,0 +1,2 @@ +basicConstraints = critical,CA:true + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/32edc4bdd420e2aedf901789025250206e4e1386 b/third_party/boringssl/src/fuzz/conf_corpus/32edc4bdd420e2aedf901789025250206e4e1386 new file mode 100644 index 000000000000..eb24a6dfc0ef --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/35047bb8f4ab1d64027c5a849420b1696a353c8e b/third_party/boringssl/src/fuzz/conf_corpus/35047bb8f4ab1d64027c5a849420b1696a353c8e new file mode 100644 index 000000000000..81432ae2cf65 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/35c202e645ed1be5040eb358fe7eb4db6bfe624f b/third_party/boringssl/src/fuzz/conf_corpus/35c202e645ed1be5040eb358fe7eb4db6bfe624f new file mode 100644 index 000000000000..3fc5ba9c42f5 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/37b929a109a89d8ef4e07e43b3d58ce53610e9a6 b/third_party/boringssl/src/fuzz/conf_corpus/37b929a109a89d8ef4e07e43b3d58ce53610e9a6 new file mode 100644 index 000000000000..f5006868e115 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/37ecd9fbc4d6027e0ccf6d43295958b7ccd6a6ae b/third_party/boringssl/src/fuzz/conf_corpus/37ecd9fbc4d6027e0ccf6d43295958b7ccd6a6ae new file mode 100644 index 000000000000..b32876352805 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/38b948dd3fa55cb37982127562154068ecd8f7ec b/third_party/boringssl/src/fuzz/conf_corpus/38b948dd3fa55cb37982127562154068ecd8f7ec new file mode 100644 index 000000000000..b30c2ac09f3f --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/38b948dd3fa55cb37982127562154068ecd8f7ec @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:EXP:-1,NULL + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/395410ecd6d2db9216f9ca77417b290a945243f2 b/third_party/boringssl/src/fuzz/conf_corpus/395410ecd6d2db9216f9ca77417b290a945243f2 new file mode 100644 index 000000000000..91f796947a4f --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/395ad885030545f2fcf9c1e84c5fa7b173c7d256 b/third_party/boringssl/src/fuzz/conf_corpus/395ad885030545f2fcf9c1e84c5fa7b173c7d256 new file mode 100644 index 000000000000..163bbe1d7aa2 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/3ae4a7d00132b473b7451164636c325fc3d6790f b/third_party/boringssl/src/fuzz/conf_corpus/3ae4a7d00132b473b7451164636c325fc3d6790f new file mode 100644 index 000000000000..1b7e522e59cb --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/3ae4a7d00132b473b7451164636c325fc3d6790f @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:EXP:536870912,NULL + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/3dd3f33c2dabbd0dd23ac4712ec48b4804ff2a5c b/third_party/boringssl/src/fuzz/conf_corpus/3dd3f33c2dabbd0dd23ac4712ec48b4804ff2a5c new file mode 100644 index 000000000000..3c509c4f4c60 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/3dd3f33c2dabbd0dd23ac4712ec48b4804ff2a5c @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:HEX,UTC:abcd + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/42742f12cd752ced1398001ae54d3d0d11620069 b/third_party/boringssl/src/fuzz/conf_corpus/42742f12cd752ced1398001ae54d3d0d11620069 new file mode 100644 index 000000000000..5a5d7c698b03 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/45290902222264dc36d93a7dd9669ef419dac293 b/third_party/boringssl/src/fuzz/conf_corpus/45290902222264dc36d93a7dd9669ef419dac293 new file mode 100644 index 000000000000..af4044f251ae --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/45290902222264dc36d93a7dd9669ef419dac293 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:BITLIST,IA5:abcd + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/48380f4be820e22599410baa62bb004274cbfac2 b/third_party/boringssl/src/fuzz/conf_corpus/48380f4be820e22599410baa62bb004274cbfac2 new file mode 100644 index 000000000000..e64cc9f3a634 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/4a69a44ef6160aaddd0361db4d35b49eb48dfcc1 b/third_party/boringssl/src/fuzz/conf_corpus/4a69a44ef6160aaddd0361db4d35b49eb48dfcc1 new file mode 100644 index 000000000000..93f589992cad --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/4accb3f43a191f145ec9a1c8a747ab09a4be32d2 b/third_party/boringssl/src/fuzz/conf_corpus/4accb3f43a191f145ec9a1c8a747ab09a4be32d2 new file mode 100644 index 000000000000..e8df30af98fb --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/4accb3f43a191f145ec9a1c8a747ab09a4be32d2 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:EXP:1 + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/4bdb476bbcb81b40c869319e1565606945c68374 b/third_party/boringssl/src/fuzz/conf_corpus/4bdb476bbcb81b40c869319e1565606945c68374 new file mode 100644 index 000000000000..2a6559526338 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/4bdb476bbcb81b40c869319e1565606945c68374 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:SEQ + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/4beed6b185c0a4958b7e4b5cbd272e78859c076b b/third_party/boringssl/src/fuzz/conf_corpus/4beed6b185c0a4958b7e4b5cbd272e78859c076b new file mode 100644 index 000000000000..ff379381bdc1 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/50076fd5bd0e9429817a7b21a70b6cf3d00f2613 b/third_party/boringssl/src/fuzz/conf_corpus/50076fd5bd0e9429817a7b21a70b6cf3d00f2613 new file mode 100644 index 000000000000..078db6e484e0 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/50076fd5bd0e9429817a7b21a70b6cf3d00f2613 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UTC:001231235959Z + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/50dad276fd8b2a80ee94b3cb1f3c24874989d022 b/third_party/boringssl/src/fuzz/conf_corpus/50dad276fd8b2a80ee94b3cb1f3c24874989d022 new file mode 100644 index 000000000000..22325e3a0f7d --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/530a33f20602dfa94747ccd7e802e5db91e81613 b/third_party/boringssl/src/fuzz/conf_corpus/530a33f20602dfa94747ccd7e802e5db91e81613 new file mode 100644 index 000000000000..695ccce3ca28 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/542737d901a0297a82735ae043b3fa63d654c992 b/third_party/boringssl/src/fuzz/conf_corpus/542737d901a0297a82735ae043b3fa63d654c992 new file mode 100644 index 000000000000..984050da53eb --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/5469e35d858278e3cb1aed54d0299dec6b485d6a b/third_party/boringssl/src/fuzz/conf_corpus/5469e35d858278e3cb1aed54d0299dec6b485d6a new file mode 100644 index 000000000000..f141d8cafb91 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/5469e35d858278e3cb1aed54d0299dec6b485d6a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INT:-10 + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/55c19b8145675fb76d62b2700acb7fafb144bed7 b/third_party/boringssl/src/fuzz/conf_corpus/55c19b8145675fb76d62b2700acb7fafb144bed7 new file mode 100644 index 000000000000..2f34319e5bc4 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/57ebcafc9b0e27dd2fdf746a753d4a9b22d0ad62 b/third_party/boringssl/src/fuzz/conf_corpus/57ebcafc9b0e27dd2fdf746a753d4a9b22d0ad62 new file mode 100644 index 000000000000..2efe65399fa2 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/594a3570ef3c76647f001bf85539b9dc0dee0617 b/third_party/boringssl/src/fuzz/conf_corpus/594a3570ef3c76647f001bf85539b9dc0dee0617 new file mode 100644 index 000000000000..793dc58c66d3 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/594a3570ef3c76647f001bf85539b9dc0dee0617 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UTF8:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/59a8acfc2d50d5d2bcd638f2e82e168d1c3d419b b/third_party/boringssl/src/fuzz/conf_corpus/59a8acfc2d50d5d2bcd638f2e82e168d1c3d419b new file mode 100644 index 000000000000..e6118dc816c9 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/5b6a90c5ed62c8fc6f2a84d73002d83e4b75d269 b/third_party/boringssl/src/fuzz/conf_corpus/5b6a90c5ed62c8fc6f2a84d73002d83e4b75d269 new file mode 100644 index 000000000000..df059f24b575 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/5c59d0963dca28f161b3fad9c1aebb6c91759d31 b/third_party/boringssl/src/fuzz/conf_corpus/5c59d0963dca28f161b3fad9c1aebb6c91759d31 new file mode 100644 index 000000000000..e81c6be43f4a --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/60bc256c3ce7683798ab1ede1ed3a7379b4cfd8e b/third_party/boringssl/src/fuzz/conf_corpus/60bc256c3ce7683798ab1ede1ed3a7379b4cfd8e new file mode 100644 index 000000000000..a1e26adeb38c --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/60bc256c3ce7683798ab1ede1ed3a7379b4cfd8e @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:NULL,invalid + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/6140664f9791c7c0da4efcdb8997b0a21041f88a b/third_party/boringssl/src/fuzz/conf_corpus/6140664f9791c7c0da4efcdb8997b0a21041f88a new file mode 100644 index 000000000000..e5196faa8ba0 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/6140664f9791c7c0da4efcdb8997b0a21041f88a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BOOL:yes + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/616049a4fd7c60684de8d3b7886f950fa21b9869 b/third_party/boringssl/src/fuzz/conf_corpus/616049a4fd7c60684de8d3b7886f950fa21b9869 new file mode 100644 index 000000000000..4ac4faed36e8 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/68c1b4bbad7a11989b929f8aed14d65b31536164 b/third_party/boringssl/src/fuzz/conf_corpus/68c1b4bbad7a11989b929f8aed14d65b31536164 new file mode 100644 index 000000000000..f6f7c24454e2 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/68c1b4bbad7a11989b929f8aed14d65b31536164 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:HEX,IA5:abcd + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/697f1761f9030af0a8cb280eccf9edd5ecaaa0c7 b/third_party/boringssl/src/fuzz/conf_corpus/697f1761f9030af0a8cb280eccf9edd5ecaaa0c7 new file mode 100644 index 000000000000..6f69d321e2a6 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/697f1761f9030af0a8cb280eccf9edd5ecaaa0c7 @@ -0,0 +1,2 @@ +basicConstraints = critical,@section + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/69ad9ff26f71fd6aa54c0c1ed94df85bdba1d5cc b/third_party/boringssl/src/fuzz/conf_corpus/69ad9ff26f71fd6aa54c0c1ed94df85bdba1d5cc new file mode 100644 index 000000000000..c173a313f355 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/6c7f8c2045867641dd5ae32a8ceb25b8faa39808 b/third_party/boringssl/src/fuzz/conf_corpus/6c7f8c2045867641dd5ae32a8ceb25b8faa39808 new file mode 100644 index 000000000000..5ba1e55fa370 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/6c7f8c2045867641dd5ae32a8ceb25b8faa39808 @@ -0,0 +1,4 @@ +basicConstraints = critical,@section +[section] +CA = true + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/6cc82d1312421cee8a07f13e6fb27d49f08b9840 b/third_party/boringssl/src/fuzz/conf_corpus/6cc82d1312421cee8a07f13e6fb27d49f08b9840 new file mode 100644 index 000000000000..1737b70d1809 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/6cc82d1312421cee8a07f13e6fb27d49f08b9840 @@ -0,0 +1,5 @@ +# +# Example configuration file using includes. +# + +.include includes.cnf diff --git a/third_party/boringssl/src/fuzz/conf_corpus/6d7936a8355956094938102f653df82c4a99b099 b/third_party/boringssl/src/fuzz/conf_corpus/6d7936a8355956094938102f653df82c4a99b099 new file mode 100644 index 000000000000..d4b675b0def6 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/6d7936a8355956094938102f653df82c4a99b099 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,T61:÷ + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/702d7bd05ada6355620ace60e9b2cd4e0a1b3757 b/third_party/boringssl/src/fuzz/conf_corpus/702d7bd05ada6355620ace60e9b2cd4e0a1b3757 new file mode 100644 index 000000000000..835b2c672de7 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/7090fdb7e0d8e7106490d37f9aec664c7d050cf5 b/third_party/boringssl/src/fuzz/conf_corpus/7090fdb7e0d8e7106490d37f9aec664c7d050cf5 new file mode 100644 index 000000000000..ad67743ca2ba --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/7090fdb7e0d8e7106490d37f9aec664c7d050cf5 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,UTF8:☃ + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/76ae6d85df626927a0be162a6b3846132d40957b b/third_party/boringssl/src/fuzz/conf_corpus/76ae6d85df626927a0be162a6b3846132d40957b new file mode 100644 index 000000000000..b3a5a64c3ff2 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/788ddbf9d4770cced2a860ac60c81eea9dea7f92 b/third_party/boringssl/src/fuzz/conf_corpus/788ddbf9d4770cced2a860ac60c81eea9dea7f92 new file mode 100644 index 000000000000..4a1b3fa9a4fa --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/78b9cf1525d06cddf920ee48dbd148b76c1ff33c b/third_party/boringssl/src/fuzz/conf_corpus/78b9cf1525d06cddf920ee48dbd148b76c1ff33c new file mode 100644 index 000000000000..5473d837c10f --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/7aff02c03b03f36d83de3129397fa854d3ab8120 b/third_party/boringssl/src/fuzz/conf_corpus/7aff02c03b03f36d83de3129397fa854d3ab8120 new file mode 100644 index 000000000000..0e0244e77f3c --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/7aff02c03b03f36d83de3129397fa854d3ab8120 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:ENUM:0 + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/7d0c17dc2a2dc49ec014bed83b834a59d035b856 b/third_party/boringssl/src/fuzz/conf_corpus/7d0c17dc2a2dc49ec014bed83b834a59d035b856 new file mode 100644 index 000000000000..345eeb9884a2 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/7d0c17dc2a2dc49ec014bed83b834a59d035b856 @@ -0,0 +1,5 @@ +# +# Example configuration file using includes. +# + +.include conf-includes diff --git a/third_party/boringssl/src/fuzz/conf_corpus/81206f43ddab64bebeada8eca34dbe377dcf0586 b/third_party/boringssl/src/fuzz/conf_corpus/81206f43ddab64bebeada8eca34dbe377dcf0586 new file mode 100644 index 000000000000..8e133004ab3a --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/81206f43ddab64bebeada8eca34dbe377dcf0586 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,IA5:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/814af1dfe1b44feed24d1a09264146d1a067b104 b/third_party/boringssl/src/fuzz/conf_corpus/814af1dfe1b44feed24d1a09264146d1a067b104 new file mode 100644 index 000000000000..affc9292fb13 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/814af1dfe1b44feed24d1a09264146d1a067b104 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:HEX,OCT:0123abcd + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/81b46b866d7db2cbcb9120d37c580362ee87a38f b/third_party/boringssl/src/fuzz/conf_corpus/81b46b866d7db2cbcb9120d37c580362ee87a38f new file mode 100644 index 000000000000..fd71c48fd64b --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/81b46b866d7db2cbcb9120d37c580362ee87a38f @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:GENTIME:invalid + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/8206704aa14a2bde67c185e80255b7549069c432 b/third_party/boringssl/src/fuzz/conf_corpus/8206704aa14a2bde67c185e80255b7549069c432 new file mode 100644 index 000000000000..23f29ab772ae --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/822571601d5d7086fa241d10f8177dfbbdc7f13d b/third_party/boringssl/src/fuzz/conf_corpus/822571601d5d7086fa241d10f8177dfbbdc7f13d new file mode 100644 index 000000000000..3f9f1a0423f9 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/823bec7091ae3be48a31a9813abcc49eef62622f b/third_party/boringssl/src/fuzz/conf_corpus/823bec7091ae3be48a31a9813abcc49eef62622f new file mode 100644 index 000000000000..19ed239e36da --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/823bec7091ae3be48a31a9813abcc49eef62622f @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:OBJECT:invalid + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/83c71dd51a38cb8a1c79ffe6aad360758b4e08ea b/third_party/boringssl/src/fuzz/conf_corpus/83c71dd51a38cb8a1c79ffe6aad360758b4e08ea new file mode 100644 index 000000000000..c395a158ee0e --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/83c71dd51a38cb8a1c79ffe6aad360758b4e08ea @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:GENTIME:001231235959Z + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/84e212e03800aae7eac44321017a75523b500aec b/third_party/boringssl/src/fuzz/conf_corpus/84e212e03800aae7eac44321017a75523b500aec new file mode 100644 index 000000000000..5114f02626f1 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/86b04c728a03d3d796e5a02ec57c22d16b80b59a b/third_party/boringssl/src/fuzz/conf_corpus/86b04c728a03d3d796e5a02ec57c22d16b80b59a new file mode 100644 index 000000000000..856561f495c3 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/86b04c728a03d3d796e5a02ec57c22d16b80b59a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:invalid,IA5:abcd + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/8814ab1d77628a2e35cf59dded05a1ba09986b9a b/third_party/boringssl/src/fuzz/conf_corpus/8814ab1d77628a2e35cf59dded05a1ba09986b9a new file mode 100644 index 000000000000..b8f5f40b0a4b --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/8814ab1d77628a2e35cf59dded05a1ba09986b9a @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:OBJECT:basicConstraints + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/896af997791eac9fbccdd9d86eb46d45e7a8ddf2 b/third_party/boringssl/src/fuzz/conf_corpus/896af997791eac9fbccdd9d86eb46d45e7a8ddf2 new file mode 100644 index 000000000000..e01504fa599e --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/8baa38c5c8540561d86491916d0bb36cc13c1218 b/third_party/boringssl/src/fuzz/conf_corpus/8baa38c5c8540561d86491916d0bb36cc13c1218 new file mode 100644 index 000000000000..3566bb056597 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/8d4c7ac088d1cc761b4f79c9ccd7b40d05567aaf b/third_party/boringssl/src/fuzz/conf_corpus/8d4c7ac088d1cc761b4f79c9ccd7b40d05567aaf new file mode 100644 index 000000000000..ab1347419253 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/8d4c7ac088d1cc761b4f79c9ccd7b40d05567aaf @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,OCT:abcd + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/8de6365ad8ab8315fe22408785ed5d1121e0324b b/third_party/boringssl/src/fuzz/conf_corpus/8de6365ad8ab8315fe22408785ed5d1121e0324b new file mode 100644 index 000000000000..4501af122893 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/8e740a2d8429b288d9b034c8331393211d784167 b/third_party/boringssl/src/fuzz/conf_corpus/8e740a2d8429b288d9b034c8331393211d784167 new file mode 100644 index 000000000000..ea2ec34cbb73 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/8f7a36c905a0203b2cc27323b2b90a3ba5b8b9fe b/third_party/boringssl/src/fuzz/conf_corpus/8f7a36c905a0203b2cc27323b2b90a3ba5b8b9fe new file mode 100644 index 000000000000..70655275af47 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/917a403d9a6e8db8462cfd2d9f7958b80025dafc b/third_party/boringssl/src/fuzz/conf_corpus/917a403d9a6e8db8462cfd2d9f7958b80025dafc new file mode 100644 index 000000000000..ba84ff4dff77 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/91ded87bf790e2b94c6b4e3e046ea8534b8fc385 b/third_party/boringssl/src/fuzz/conf_corpus/91ded87bf790e2b94c6b4e3e046ea8534b8fc385 new file mode 100644 index 000000000000..b8860e90678e --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/92fde7b859f6f3f548690b89126c09a9f3057b82 b/third_party/boringssl/src/fuzz/conf_corpus/92fde7b859f6f3f548690b89126c09a9f3057b82 new file mode 100644 index 000000000000..3d889d524df6 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/93e31109bf290a5a77f1ac5a8695533b700f7f39 b/third_party/boringssl/src/fuzz/conf_corpus/93e31109bf290a5a77f1ac5a8695533b700f7f39 new file mode 100644 index 000000000000..aa5e67c06037 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/9997ee4592ed989c1dfb0f7b93fbd20d5e22702b b/third_party/boringssl/src/fuzz/conf_corpus/9997ee4592ed989c1dfb0f7b93fbd20d5e22702b new file mode 100644 index 000000000000..b718f41b4b27 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/99d8dd3e2036dde9df15123c52517767f14f4480 b/third_party/boringssl/src/fuzz/conf_corpus/99d8dd3e2036dde9df15123c52517767f14f4480 new file mode 100644 index 000000000000..1eb106546aa4 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/9bc8f7c02576f19eb229d6906b12044fb97cff85 b/third_party/boringssl/src/fuzz/conf_corpus/9bc8f7c02576f19eb229d6906b12044fb97cff85 new file mode 100644 index 000000000000..62e4502d6522 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/9cd1477e0647cbf3bbb49c69a5baf5f20e20c296 b/third_party/boringssl/src/fuzz/conf_corpus/9cd1477e0647cbf3bbb49c69a5baf5f20e20c296 new file mode 100644 index 000000000000..f5a58d6ce6c4 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/9cd1477e0647cbf3bbb49c69a5baf5f20e20c296 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:invalid + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/9d87d1e51de8f52272efaf32bb355b9b049e253b b/third_party/boringssl/src/fuzz/conf_corpus/9d87d1e51de8f52272efaf32bb355b9b049e253b new file mode 100644 index 000000000000..12796ea39c2c --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/9d87d1e51de8f52272efaf32bb355b9b049e253b @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INT:-0x10 + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/a2587c4e97408b64274e5e052b74e3754892c13a b/third_party/boringssl/src/fuzz/conf_corpus/a2587c4e97408b64274e5e052b74e3754892c13a new file mode 100644 index 000000000000..e643cfdbdf3f --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/a2b7a9ae5cc4c1a4811b86c67950ea1782b1b214 b/third_party/boringssl/src/fuzz/conf_corpus/a2b7a9ae5cc4c1a4811b86c67950ea1782b1b214 new file mode 100644 index 000000000000..336363f11502 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/a59ae53ccd6bc5f2a351bef57079029ac18a7d41 b/third_party/boringssl/src/fuzz/conf_corpus/a59ae53ccd6bc5f2a351bef57079029ac18a7d41 new file mode 100644 index 000000000000..1c71be9b97d0 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/a7d597a082be78a8a48a49bbbccaefcf7375ec24 b/third_party/boringssl/src/fuzz/conf_corpus/a7d597a082be78a8a48a49bbbccaefcf7375ec24 new file mode 100644 index 000000000000..b2678b541e74 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/a9efbc43a88aedba79010aded171e39498be0c2f b/third_party/boringssl/src/fuzz/conf_corpus/a9efbc43a88aedba79010aded171e39498be0c2f new file mode 100644 index 000000000000..ffaeb924305e --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/aa38fc31f54f2020bbf5335c1a3ef54f9d54a7a7 b/third_party/boringssl/src/fuzz/conf_corpus/aa38fc31f54f2020bbf5335c1a3ef54f9d54a7a7 new file mode 100644 index 000000000000..b844928ba90d --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/aa38fc31f54f2020bbf5335c1a3ef54f9d54a7a7 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:IA5:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/ac5814a191294c3f7c6c68d44cbf3519b3eb644f b/third_party/boringssl/src/fuzz/conf_corpus/ac5814a191294c3f7c6c68d44cbf3519b3eb644f new file mode 100644 index 000000000000..c474c9b89f33 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/acee4ed8c6d6fdc20ff2a54f66b552bd335de75d b/third_party/boringssl/src/fuzz/conf_corpus/acee4ed8c6d6fdc20ff2a54f66b552bd335de75d new file mode 100644 index 000000000000..efed26644b5b --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/acee4ed8c6d6fdc20ff2a54f66b552bd335de75d @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,PRINTABLE:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/aeab5e8bbc2417d92b0009a23a6a0b74fb31fbe9 b/third_party/boringssl/src/fuzz/conf_corpus/aeab5e8bbc2417d92b0009a23a6a0b74fb31fbe9 new file mode 100644 index 000000000000..5af22215e958 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/aeab5e8bbc2417d92b0009a23a6a0b74fb31fbe9 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:T61:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/af9f2cbae84ac395975f31730212c68ba4d73d11 b/third_party/boringssl/src/fuzz/conf_corpus/af9f2cbae84ac395975f31730212c68ba4d73d11 new file mode 100644 index 000000000000..34df69ea3edb --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/af9f2cbae84ac395975f31730212c68ba4d73d11 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = DER:invalid hex + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/afd1e920f075355a478e95142b2062ee6119fc9d b/third_party/boringssl/src/fuzz/conf_corpus/afd1e920f075355a478e95142b2062ee6119fc9d new file mode 100644 index 000000000000..0d60975534a0 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/afd1e920f075355a478e95142b2062ee6119fc9d @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BOOLEAN + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/b031873c1d543faefa84c94e772a8af2e38932d8 b/third_party/boringssl/src/fuzz/conf_corpus/b031873c1d543faefa84c94e772a8af2e38932d8 new file mode 100644 index 000000000000..1e53f28f0d15 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/b3ea0a503ac2fdbe8b36642ca820b3f2d960cede b/third_party/boringssl/src/fuzz/conf_corpus/b3ea0a503ac2fdbe8b36642ca820b3f2d960cede new file mode 100644 index 000000000000..00364439b2ab --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/b3ea0a503ac2fdbe8b36642ca820b3f2d960cede @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,UTF8:ÿ + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/b3f3cc61e482ee9dbbea624b41bd423acd1e00b6 b/third_party/boringssl/src/fuzz/conf_corpus/b3f3cc61e482ee9dbbea624b41bd423acd1e00b6 new file mode 100644 index 000000000000..a7355cdf339f --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/b3f3cc61e482ee9dbbea624b41bd423acd1e00b6 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:PRINTABLE:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/b43a40ec0466f347383475cf6e4907ea4cefb129 b/third_party/boringssl/src/fuzz/conf_corpus/b43a40ec0466f347383475cf6e4907ea4cefb129 new file mode 100644 index 000000000000..35df3982573d --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/b6638728fde6ba062209cce4cd0f51956634a981 b/third_party/boringssl/src/fuzz/conf_corpus/b6638728fde6ba062209cce4cd0f51956634a981 new file mode 100644 index 000000000000..1fb0855f5456 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/b7cfc698eae9584a7daa5721a1ebdb4c7eda78d9 b/third_party/boringssl/src/fuzz/conf_corpus/b7cfc698eae9584a7daa5721a1ebdb4c7eda78d9 new file mode 100644 index 000000000000..66c89006d0ce --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/b7e7338c20733d3bd2924fb53d8e2b619e059818 b/third_party/boringssl/src/fuzz/conf_corpus/b7e7338c20733d3bd2924fb53d8e2b619e059818 new file mode 100644 index 000000000000..5ee247ace98e --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/b7e7338c20733d3bd2924fb53d8e2b619e059818 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:OCT:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/b9c9c2d24d6dd35b445dc6da03603055715ec4e7 b/third_party/boringssl/src/fuzz/conf_corpus/b9c9c2d24d6dd35b445dc6da03603055715ec4e7 new file mode 100644 index 000000000000..ab764403a474 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/ba3adaea0e8015875583e258bda44aaa3d433b36 b/third_party/boringssl/src/fuzz/conf_corpus/ba3adaea0e8015875583e258bda44aaa3d433b36 new file mode 100644 index 000000000000..b23ebd0adadc --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/bc9109c3decb01fbf6c711238a3670efccb8ff72 b/third_party/boringssl/src/fuzz/conf_corpus/bc9109c3decb01fbf6c711238a3670efccb8ff72 new file mode 100644 index 000000000000..ebb352dc8443 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/bd049724a30d9e151ed04f2c630b9bb994d1c4d7 b/third_party/boringssl/src/fuzz/conf_corpus/bd049724a30d9e151ed04f2c630b9bb994d1c4d7 new file mode 100644 index 000000000000..6f1d8151ef60 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/bd049724a30d9e151ed04f2c630b9bb994d1c4d7 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BOOLEAN:NO + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/be4100590164af4b7689bdaaff5fa34eeaae331f b/third_party/boringssl/src/fuzz/conf_corpus/be4100590164af4b7689bdaaff5fa34eeaae331f new file mode 100644 index 000000000000..24ba4b62d97e --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/c06bb154438af6218b8f58bc0f70520674fb3090 b/third_party/boringssl/src/fuzz/conf_corpus/c06bb154438af6218b8f58bc0f70520674fb3090 new file mode 100644 index 000000000000..4acca4b0446f --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/c53c55a556815bf0869da3fab9bbc94f946e7f17 b/third_party/boringssl/src/fuzz/conf_corpus/c53c55a556815bf0869da3fab9bbc94f946e7f17 new file mode 100644 index 000000000000..05c193073037 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/c53c55a556815bf0869da3fab9bbc94f946e7f17 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BOOLEAN:TRUE + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/c8a605981467c909bef7ea586d7daf2bdbb9357c b/third_party/boringssl/src/fuzz/conf_corpus/c8a605981467c909bef7ea586d7daf2bdbb9357c new file mode 100644 index 000000000000..62e460c9e855 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/c951357508c09946709f3b7085080aa7882351a0 b/third_party/boringssl/src/fuzz/conf_corpus/c951357508c09946709f3b7085080aa7882351a0 new file mode 100644 index 000000000000..b875fbeecb27 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/c951357508c09946709f3b7085080aa7882351a0 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:SET:missing_confdb + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/cb8807caf78392bc3f6866b416b84b57423f0a92 b/third_party/boringssl/src/fuzz/conf_corpus/cb8807caf78392bc3f6866b416b84b57423f0a92 new file mode 100644 index 000000000000..74c29bb5793b --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/cb8807caf78392bc3f6866b416b84b57423f0a92 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,PRINTABLE:☃ + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/ce326c4f904c6409744a00ac16a570b11baa8d0f b/third_party/boringssl/src/fuzz/conf_corpus/ce326c4f904c6409744a00ac16a570b11baa8d0f new file mode 100644 index 000000000000..cb0cefba7532 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/d0a275bdfa6bb34b83e810a82fc46549bbdb2ebf b/third_party/boringssl/src/fuzz/conf_corpus/d0a275bdfa6bb34b83e810a82fc46549bbdb2ebf new file mode 100644 index 000000000000..1db545300d57 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/d0a275bdfa6bb34b83e810a82fc46549bbdb2ebf @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:SET + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/d0eaa3dcf6ee87d82500f0dc7faec1c68a9332c8 b/third_party/boringssl/src/fuzz/conf_corpus/d0eaa3dcf6ee87d82500f0dc7faec1c68a9332c8 new file mode 100644 index 000000000000..bb6f6d204786 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/d0eaa3dcf6ee87d82500f0dc7faec1c68a9332c8 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:UTF8,UNIV:☃ + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/d209fb4ee746274b928fc2fe0d738c3489cfad3e b/third_party/boringssl/src/fuzz/conf_corpus/d209fb4ee746274b928fc2fe0d738c3489cfad3e new file mode 100644 index 000000000000..42aa081fced8 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/d209fb4ee746274b928fc2fe0d738c3489cfad3e @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:ENUMERATED:0 + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/d40d0a5fae0458fe75a49ae5aa9d77b54b6e4147 b/third_party/boringssl/src/fuzz/conf_corpus/d40d0a5fae0458fe75a49ae5aa9d77b54b6e4147 new file mode 100644 index 000000000000..e679173a6f00 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/d61f5a98c3aaf7e8e428815fd44d166bfa4d6467 b/third_party/boringssl/src/fuzz/conf_corpus/d61f5a98c3aaf7e8e428815fd44d166bfa4d6467 new file mode 100644 index 000000000000..f655e7448dc6 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/dafef760e88c3ab60b70bb9cd40c838525e21844 b/third_party/boringssl/src/fuzz/conf_corpus/dafef760e88c3ab60b70bb9cd40c838525e21844 new file mode 100644 index 000000000000..fe32e8d19041 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/db3c104f8df5992c03182c0815ff2e18f55ab6e9 b/third_party/boringssl/src/fuzz/conf_corpus/db3c104f8df5992c03182c0815ff2e18f55ab6e9 new file mode 100644 index 000000000000..729aa2b90ba8 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/db3c104f8df5992c03182c0815ff2e18f55ab6e9 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:BMP:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/db88bc928305afb566adefef5015363f43ec722d b/third_party/boringssl/src/fuzz/conf_corpus/db88bc928305afb566adefef5015363f43ec722d new file mode 100644 index 000000000000..b20a2427603b --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/dd3c504d9aa688c7b6663010be449da67635f043 b/third_party/boringssl/src/fuzz/conf_corpus/dd3c504d9aa688c7b6663010be449da67635f043 new file mode 100644 index 000000000000..db43c1c2d5dc --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/dd9b29e2d9b871fac7942691fc72f5cbb36004f8 b/third_party/boringssl/src/fuzz/conf_corpus/dd9b29e2d9b871fac7942691fc72f5cbb36004f8 new file mode 100644 index 000000000000..d1642879be3b --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/de9e4e5ccbea6b35551ac18fd955b8bdc9fa86e3 b/third_party/boringssl/src/fuzz/conf_corpus/de9e4e5ccbea6b35551ac18fd955b8bdc9fa86e3 new file mode 100644 index 000000000000..f4c75cbe6261 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/de9e4e5ccbea6b35551ac18fd955b8bdc9fa86e3 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INT:0 + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/dea83c239f1cf4b30155bb86eb2b8e15298f56e6 b/third_party/boringssl/src/fuzz/conf_corpus/dea83c239f1cf4b30155bb86eb2b8e15298f56e6 new file mode 100644 index 000000000000..b0579ed97e91 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/e055b94e4253ca8c820e7d90cd898e91c387305f b/third_party/boringssl/src/fuzz/conf_corpus/e055b94e4253ca8c820e7d90cd898e91c387305f new file mode 100644 index 000000000000..04ff2755617b --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/e26367c7aa40d55985aff3458ed6b6bd775f4bfc b/third_party/boringssl/src/fuzz/conf_corpus/e26367c7aa40d55985aff3458ed6b6bd775f4bfc new file mode 100644 index 000000000000..c7da588c5de0 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/e2c246860c12b137377d1fd48d24beafbeabe730 b/third_party/boringssl/src/fuzz/conf_corpus/e2c246860c12b137377d1fd48d24beafbeabe730 new file mode 100644 index 000000000000..9f3d29a4166c --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/e455aa989be06525bd8cf5ab6d8f5406a9735347 b/third_party/boringssl/src/fuzz/conf_corpus/e455aa989be06525bd8cf5ab6d8f5406a9735347 new file mode 100644 index 000000000000..b670be000a63 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/e53857febc1becd1ae5b928971a6e048938d34b3 b/third_party/boringssl/src/fuzz/conf_corpus/e53857febc1becd1ae5b928971a6e048938d34b3 new file mode 100644 index 000000000000..39ac54edd9b5 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/e5ef73ebd19d87df954f20435820e1f30c9ce289 b/third_party/boringssl/src/fuzz/conf_corpus/e5ef73ebd19d87df954f20435820e1f30c9ce289 new file mode 100644 index 000000000000..5ea32ebdd935 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/e5ef73ebd19d87df954f20435820e1f30c9ce289 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = DER:0001020304 + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/e734f951873b98f37a1f4418c045f2b81f03c2eb b/third_party/boringssl/src/fuzz/conf_corpus/e734f951873b98f37a1f4418c045f2b81f03c2eb new file mode 100644 index 000000000000..957ce59f673d --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/e89cd88731014345571db8549b41fc2bd97c3c77 b/third_party/boringssl/src/fuzz/conf_corpus/e89cd88731014345571db8549b41fc2bd97c3c77 new file mode 100644 index 000000000000..9ebd56a9480c --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/e91a9da2d47e9de221557d52e75bc88383651c74 b/third_party/boringssl/src/fuzz/conf_corpus/e91a9da2d47e9de221557d52e75bc88383651c74 new file mode 100644 index 000000000000..4d74085c810a --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/e91a9da2d47e9de221557d52e75bc88383651c74 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:INTEGER:10 + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/ec90d9f753ca4d55f66f65839a9860c94497db24 b/third_party/boringssl/src/fuzz/conf_corpus/ec90d9f753ca4d55f66f65839a9860c94497db24 new file mode 100644 index 000000000000..d530e31f9914 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/ed1a1d969e7e6d58f52b9cb82fb0c7e67453e58c b/third_party/boringssl/src/fuzz/conf_corpus/ed1a1d969e7e6d58f52b9cb82fb0c7e67453e58c new file mode 100644 index 000000000000..d397a64e345b --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/f1eca4627e6a9f02bf41aca290f6cef886465fac b/third_party/boringssl/src/fuzz/conf_corpus/f1eca4627e6a9f02bf41aca290f6cef886465fac new file mode 100644 index 000000000000..18fe178dfd52 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/f1eca4627e6a9f02bf41aca290f6cef886465fac @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UTC:invalid + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/f2d29c5a0fa65ac03ffca407d706a24b0d0c5c4e b/third_party/boringssl/src/fuzz/conf_corpus/f2d29c5a0fa65ac03ffca407d706a24b0d0c5c4e new file mode 100644 index 000000000000..cbe4c7a56973 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/f2d29c5a0fa65ac03ffca407d706a24b0d0c5c4e @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:NULL + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/f327bf51b3dbd27db36d1d8f5d60b2fd24b10af4 b/third_party/boringssl/src/fuzz/conf_corpus/f327bf51b3dbd27db36d1d8f5d60b2fd24b10af4 new file mode 100644 index 000000000000..bda6eec4b09d --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/fa0bc7b35fb3959a17dbc0320292d864b0df68be b/third_party/boringssl/src/fuzz/conf_corpus/fa0bc7b35fb3959a17dbc0320292d864b0df68be new file mode 100644 index 000000000000..572af85f65d6 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/fa88066fa3360a2a2347c6cc7fff330025b33591 b/third_party/boringssl/src/fuzz/conf_corpus/fa88066fa3360a2a2347c6cc7fff330025b33591 new file mode 100644 index 000000000000..543479a2098d --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/fadf69d83c1e00e57e2531854949d5d1770c1660 b/third_party/boringssl/src/fuzz/conf_corpus/fadf69d83c1e00e57e2531854949d5d1770c1660 new file mode 100644 index 000000000000..0da07eda3240 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/fadf69d83c1e00e57e2531854949d5d1770c1660 @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:NULL:invalid + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/fb131639df5a1df7894bb7e81f9e896624a0e9bf b/third_party/boringssl/src/fuzz/conf_corpus/fb131639df5a1df7894bb7e81f9e896624a0e9bf new file mode 100644 index 000000000000..f212523fbed8 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/fuzz/conf_corpus/fbe2f5f1cf481f17c44729e05776c5b5d4251f8f b/third_party/boringssl/src/fuzz/conf_corpus/fbe2f5f1cf481f17c44729e05776c5b5d4251f8f new file mode 100644 index 000000000000..b24d974c9047 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/fbe2f5f1cf481f17c44729e05776c5b5d4251f8f @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:UNIV:hello + diff --git a/third_party/boringssl/src/fuzz/conf_corpus/ffe92960d72947bfdc67cb350c73378fc7d2ba1b b/third_party/boringssl/src/fuzz/conf_corpus/ffe92960d72947bfdc67cb350c73378fc7d2ba1b new file mode 100644 index 000000000000..f5f6f6a91064 --- /dev/null +++ b/third_party/boringssl/src/fuzz/conf_corpus/ffe92960d72947bfdc67cb350c73378fc7d2ba1b @@ -0,0 +1,2 @@ +1.2.840.113554.4.1.72585.2 = ASN1:FORMAT:BITLIST,BITSTR:4294967296 + diff --git a/third_party/boringssl/src/fuzz/der_roundtrip.cc b/third_party/boringssl/src/fuzz/der_roundtrip.cc index b88a7d645377..03fa4c3945ee 100644 --- a/third_party/boringssl/src/fuzz/der_roundtrip.cc +++ b/third_party/boringssl/src/fuzz/der_roundtrip.cc @@ -22,7 +22,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) { CBS cbs, body; - unsigned tag; + CBS_ASN1_TAG tag; CBS_init(&cbs, buf, len); if (CBS_get_any_asn1(&cbs, &body, &tag)) { // DER has a unique encoding, so any parsed input should round-trip diff --git a/third_party/boringssl/src/go.mod b/third_party/boringssl/src/go.mod index 25a9d66390c0..23038f02ce9b 100644 --- a/third_party/boringssl/src/go.mod +++ b/third_party/boringssl/src/go.mod @@ -1,8 +1,13 @@ module boringssl.googlesource.com/boringssl -go 1.13 +go 1.19 require ( - golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a - golang.org/x/net v0.0.0-20210614182718-04defd469f4e + golang.org/x/crypto v0.6.0 + golang.org/x/net v0.7.0 +) + +require ( + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect ) diff --git a/third_party/boringssl/src/go.sum b/third_party/boringssl/src/go.sum index 87e3c894c27e..a97a96075b23 100644 --- a/third_party/boringssl/src/go.sum +++ b/third_party/boringssl/src/go.sum @@ -1,13 +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/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -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/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/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/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +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= diff --git a/third_party/boringssl/src/include/openssl/aead.h b/third_party/boringssl/src/include/openssl/aead.h index 131cfecd2a81..26338800a3ea 100644 --- a/third_party/boringssl/src/include/openssl/aead.h +++ b/third_party/boringssl/src/include/openssl/aead.h @@ -408,8 +408,6 @@ OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_256_cbc_sha1_tls_implicit_iv(void); OPENSSL_EXPORT const EVP_AEAD *EVP_aead_des_ede3_cbc_sha1_tls(void); OPENSSL_EXPORT const EVP_AEAD *EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv(void); -OPENSSL_EXPORT const EVP_AEAD *EVP_aead_null_sha1_tls(void); - // EVP_aead_aes_128_gcm_tls12 is AES-128 in Galois Counter Mode using the TLS // 1.2 nonce construction. OPENSSL_EXPORT const EVP_AEAD *EVP_aead_aes_128_gcm_tls12(void); diff --git a/third_party/boringssl/src/include/openssl/asn1.h b/third_party/boringssl/src/include/openssl/asn1.h index 693b38e80f6f..d128c8dfe017 100644 --- a/third_party/boringssl/src/include/openssl/asn1.h +++ b/third_party/boringssl/src/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 @@ -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 @@ -447,10 +419,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 @@ -459,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); @@ -472,7 +453,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) @@ -485,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|, @@ -526,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 @@ -608,7 +597,8 @@ OPENSSL_EXPORT int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); // |data|. It returns one on success and zero on error. If |data| is NULL, it // updates the length and allocates the buffer as needed, but does not // initialize the contents. -OPENSSL_EXPORT int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +OPENSSL_EXPORT int ASN1_STRING_set(ASN1_STRING *str, const void *data, + ossl_ssize_t len); // ASN1_STRING_set0 sets the contents of |str| to |len| bytes from |data|. It // takes ownership of |data|, which must have been allocated with @@ -640,10 +630,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|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. +// |d2i_SAMPLE|. OPENSSL_EXPORT ASN1_BMPSTRING *d2i_ASN1_BMPSTRING(ASN1_BMPSTRING **out, const uint8_t **inp, long len); @@ -753,15 +740,17 @@ OPENSSL_EXPORT int ASN1_STRING_to_UTF8(unsigned char **out, // the result. If |out| is NULL, it returns the selected output type without // constructing an |ASN1_STRING|. On error, this function returns -1. OPENSSL_EXPORT int ASN1_mbstring_copy(ASN1_STRING **out, const uint8_t *in, - int len, int inform, unsigned long mask); + ossl_ssize_t len, int inform, + unsigned long mask); // ASN1_mbstring_ncopy behaves like |ASN1_mbstring_copy| but returns an error if // the input is less than |minsize| or greater than |maxsize| codepoints long. A // |maxsize| value of zero is ignored. Note the sizes are measured in // codepoints, not output bytes. OPENSSL_EXPORT int ASN1_mbstring_ncopy(ASN1_STRING **out, const uint8_t *in, - int len, int inform, unsigned long mask, - long minsize, long maxsize); + ossl_ssize_t len, int inform, + unsigned long mask, ossl_ssize_t minsize, + ossl_ssize_t maxsize); // ASN1_STRING_set_by_NID behaves like |ASN1_mbstring_ncopy|, but determines // |mask|, |minsize|, and |maxsize| based on |nid|. When |nid| is a recognized @@ -787,7 +776,7 @@ OPENSSL_EXPORT int ASN1_mbstring_ncopy(ASN1_STRING **out, const uint8_t *in, // to call |ASN1_mbstring_ncopy| directly instead. OPENSSL_EXPORT ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in, - int len, int inform, + ossl_ssize_t len, int inform, int nid); // STABLE_NO_MASK causes |ASN1_STRING_TABLE_add| to allow types other than @@ -832,7 +821,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. @@ -865,7 +854,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. @@ -926,10 +915,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|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. +// ASN.1 BIT STRING, as described in |d2i_SAMPLE|. OPENSSL_EXPORT ASN1_BIT_STRING *d2i_ASN1_BIT_STRING(ASN1_BIT_STRING **out, const uint8_t **inp, long len); @@ -941,11 +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. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. +// |d2i_SAMPLE| except, on success, it always consumes all |len| bytes. OPENSSL_EXPORT ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **out, const uint8_t **inp, long len); @@ -985,7 +967,8 @@ OPENSSL_EXPORT int ASN1_BIT_STRING_num_bytes(const ASN1_BIT_STRING *str, // TODO(davidben): Maybe it should? Wrapping a byte string in a bit string is a // common use case. OPENSSL_EXPORT int ASN1_BIT_STRING_set(ASN1_BIT_STRING *str, - const unsigned char *d, int length); + const unsigned char *d, + ossl_ssize_t length); // ASN1_BIT_STRING_set_bit sets bit |n| of |str| to one if |value| is non-zero // and zero if |value| is zero, resizing |str| as needed. It then truncates @@ -1036,10 +1019,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|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. +// ASN.1 INTEGER, as described in |d2i_SAMPLE|. OPENSSL_EXPORT ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **out, const uint8_t **inp, long len); @@ -1049,11 +1029,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. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// some invalid inputs, but this will be removed in the future. +// |d2i_SAMPLE| except, on success, it always consumes all |len| bytes. OPENSSL_EXPORT ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **in, const uint8_t **outp, long len); @@ -1121,10 +1097,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|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. +// ASN.1 ENUMERATED, as described in |d2i_SAMPLE|. OPENSSL_EXPORT ASN1_ENUMERATED *d2i_ASN1_ENUMERATED(ASN1_ENUMERATED **out, const uint8_t **inp, long len); @@ -1199,7 +1172,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. @@ -1217,20 +1190,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 @@ -1253,10 +1229,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|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. +// DER-encoded ASN.1 GeneralizedTime, as described in |d2i_SAMPLE|. OPENSSL_EXPORT ASN1_GENERALIZEDTIME *d2i_ASN1_GENERALIZEDTIME( ASN1_GENERALIZEDTIME **out, const uint8_t **inp, long len); @@ -1273,23 +1246,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| @@ -1311,7 +1285,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. @@ -1339,24 +1313,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 @@ -1404,9 +1383,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); @@ -1441,7 +1417,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 @@ -1449,21 +1425,17 @@ 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|. -// -// TODO(https://crbug.com/boringssl/354): This function currently also accepts -// BER, but this will be removed in the future. +// bytes at |*inp|, as described in |d2i_SAMPLE|. 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 -// |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); @@ -1505,15 +1477,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 { @@ -1553,10 +1524,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. @@ -1600,9 +1571,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. @@ -1616,7 +1587,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|. // @@ -1765,13 +1736,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); @@ -1847,15 +1816,6 @@ OPENSSL_EXPORT int ASN1_object_size(int constructed, int length, int tag); // Deprecated functions. -// ASN1_PRINTABLE_type interprets |len| bytes from |s| as a Latin-1 string. It -// returns the first of |V_ASN1_PRINTABLESTRING|, |V_ASN1_IA5STRING|, or -// |V_ASN1_T61STRING| that can represent every character. If |len| is negative, -// |strlen(s)| is used instead. -// -// TODO(davidben): Remove this once all copies of Conscrypt have been updated -// past https://github.com/google/conscrypt/pull/1032. -OPENSSL_EXPORT int ASN1_PRINTABLE_type(const unsigned char *s, int len); - // ASN1_STRING_set_default_mask does nothing. OPENSSL_EXPORT void ASN1_STRING_set_default_mask(unsigned long mask); @@ -1937,7 +1897,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. @@ -2102,4 +2062,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/third_party/boringssl/src/include/openssl/asn1t.h b/third_party/boringssl/src/include/openssl/asn1t.h index 105cee8deb45..7547b60af2e2 100644 --- a/third_party/boringssl/src/include/openssl/asn1t.h +++ b/third_party/boringssl/src/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 @@ -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) \ @@ -348,8 +343,8 @@ typedef struct ASN1_TLC_st ASN1_TLC; */ struct ASN1_TEMPLATE_st { -unsigned long flags; /* Various flags */ -long tag; /* tag, not used if no tagging */ +uint32_t flags; /* Various flags */ +int tag; /* tag, not used if no tagging */ unsigned long offset; /* Offset of this field in structure */ const char *field_name; /* Field name */ ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ @@ -366,7 +361,7 @@ typedef struct ASN1_ADB_st ASN1_ADB; typedef struct asn1_must_be_null_st ASN1_MUST_BE_NULL; struct ASN1_ADB_st { - unsigned long flags; /* Various flags */ + uint32_t flags; /* Various flags */ unsigned long offset; /* Offset of selector field */ ASN1_MUST_BE_NULL *unused; const ASN1_ADB_TABLE *tbl; /* Table of possible types */ @@ -441,21 +436,11 @@ 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 { char itype; /* The item type, primitive, SEQUENCE, CHOICE or extern */ -long utype; /* underlying type */ +int utype; /* underlying type */ const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains the contents */ long tcount; /* Number of templates if SEQUENCE or CHOICE */ const void *funcs; /* functions that handle this type */ @@ -512,35 +497,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. @@ -563,7 +519,7 @@ typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, typedef struct ASN1_AUX_st { void *app_data; - int flags; + uint32_t flags; int ref_offset; /* Offset of reference value */ ASN1_aux_cb *asn1_cb; int enc_offset; /* Offset of ASN1_ENCODING structure */ @@ -702,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/third_party/boringssl/src/include/openssl/base.h b/third_party/boringssl/src/include/openssl/base.h index 7afcc4fc95b6..80d18a78d8ab 100644 --- a/third_party/boringssl/src/include/openssl/base.h +++ b/third_party/boringssl/src/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 @@ -196,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) @@ -224,6 +221,33 @@ extern "C" { #endif // defined(BORINGSSL_SHARED_LIBRARY) +#if defined(_MSC_VER) + +// OPENSSL_DEPRECATED is used to mark a function as deprecated. Use +// of any functions so marked in caller code will produce a warning. +// OPENSSL_BEGIN_ALLOW_DEPRECATED and OPENSSL_END_ALLOW_DEPRECATED +// can be used to suppress the warning in regions of caller code. +#define OPENSSL_DEPRECATED __declspec(deprecated) +#define OPENSSL_BEGIN_ALLOW_DEPRECATED \ + __pragma(warning(push)) __pragma(warning(disable : 4996)) +#define OPENSSL_END_ALLOW_DEPRECATED __pragma(warning(pop)) + +#elif defined(__GNUC__) || defined(__clang__) + +#define OPENSSL_DEPRECATED __attribute__((__deprecated__)) +#define OPENSSL_BEGIN_ALLOW_DEPRECATED \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#define OPENSSL_END_ALLOW_DEPRECATED _Pragma("GCC diagnostic pop") + +#else + +#define OPENSSL_DEPRECATED +#define OPENSSL_BEGIN_ALLOW_DEPRECATED +#define OPENSSL_END_ALLOW_DEPRECATED + +#endif + #if defined(__GNUC__) || defined(__clang__) // MinGW has two different printf implementations. Ensure the format macro @@ -326,6 +350,19 @@ enum ssl_verify_result_t BORINGSSL_ENUM_INT; #define BORINGSSL_ENUM_INT #endif +// ossl_ssize_t is a signed type which is large enough to fit the size of any +// valid memory allocation. We prefer using |size_t|, but sometimes we need a +// signed type for OpenSSL API compatibility. This type can be used in such +// cases to avoid overflow. +// +// Not all |size_t| values fit in |ossl_ssize_t|, but all |size_t| values that +// are sizes of or indices into C objects, can be converted without overflow. +typedef ptrdiff_t ossl_ssize_t; + +// CBS_ASN1_TAG is the type used by |CBS| and |CBB| for ASN.1 tags. See that +// header for details. This type is defined in base.h as a forward declaration. +typedef uint32_t CBS_ASN1_TAG; + // CRYPTO_THREADID is a dummy value. typedef int CRYPTO_THREADID; @@ -409,9 +446,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; @@ -516,8 +551,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 @@ -601,7 +636,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/third_party/boringssl/src/include/openssl/bio.h b/third_party/boringssl/src/include/openssl/bio.h index c642241fe064..9d807ee25309 100644 --- a/third_party/boringssl/src/include/openssl/bio.h +++ b/third_party/boringssl/src/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 @@ -328,7 +328,7 @@ OPENSSL_EXPORT int BIO_printf(BIO *bio, const char *format, ...) OPENSSL_EXPORT int BIO_indent(BIO *bio, unsigned indent, unsigned max_indent); // BIO_hexdump writes a hex dump of |data| to |bio|. Each line will be indented -// by |indent| spaces. +// by |indent| spaces. It returns one on success and zero otherwise. OPENSSL_EXPORT int BIO_hexdump(BIO *bio, const uint8_t *data, size_t len, unsigned indent); @@ -383,7 +383,7 @@ OPENSSL_EXPORT const BIO_METHOD *BIO_s_mem(void); // // If |len| is negative, then |buf| is treated as a NUL-terminated string, but // don't depend on this in new code. -OPENSSL_EXPORT BIO *BIO_new_mem_buf(const void *buf, int len); +OPENSSL_EXPORT BIO *BIO_new_mem_buf(const void *buf, ossl_ssize_t len); // BIO_mem_contents sets |*out_contents| to point to the current contents of // |bio| and |*out_len| to contain the length of that data. It returns one on diff --git a/third_party/boringssl/src/include/openssl/bn.h b/third_party/boringssl/src/include/openssl/bn.h index 0f381af85a86..a03e41f18a01 100644 --- a/third_party/boringssl/src/include/openssl/bn.h +++ b/third_party/boringssl/src/include/openssl/bn.h @@ -136,7 +136,16 @@ extern "C" { // BN provides support for working with arbitrary sized integers. For example, // although the largest integer supported by the compiler might be 64 bits, BN -// will allow you to work with numbers until you run out of memory. +// will allow you to work with much larger numbers. +// +// This library is developed for use inside BoringSSL, and uses implementation +// 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. @@ -284,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 @@ -292,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| @@ -817,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 @@ -856,15 +874,6 @@ OPENSSL_EXPORT void BN_MONT_CTX_free(BN_MONT_CTX *mont); OPENSSL_EXPORT BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, const BN_MONT_CTX *from); -// BN_MONT_CTX_set_locked takes |lock| and checks whether |*pmont| is NULL. If -// so, it creates a new |BN_MONT_CTX| and sets the modulus for it to |mod|. It -// then stores it as |*pmont|. It returns one on success and zero on error. Note -// this function assumes |mod| is public. -// -// If |*pmont| is already non-NULL then it does nothing and returns one. -int BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, CRYPTO_MUTEX *lock, - const BIGNUM *mod, BN_CTX *bn_ctx); - // BN_to_montgomery sets |ret| equal to |a| in the Montgomery domain. |a| is // assumed to be in the range [0, n), where |n| is the Montgomery modulus. It // returns one on success or zero on error. diff --git a/third_party/boringssl/src/include/openssl/bytestring.h b/third_party/boringssl/src/include/openssl/bytestring.h index 33a417c16f0a..33e13ef8ed76 100644 --- a/third_party/boringssl/src/include/openssl/bytestring.h +++ b/third_party/boringssl/src/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 // @@ -169,8 +176,8 @@ OPENSSL_EXPORT int CBS_get_until_first(CBS *cbs, CBS *out, uint8_t c); // SEQUENCE, branching on CHOICEs or OPTIONAL fields, checking for trailing // data, and handling explict vs. implicit tagging. // -// Tags are represented as |unsigned| values in memory. The upper few bits store -// the class and constructed bit, and the remaining bits store the tag +// Tags are represented as |CBS_ASN1_TAG| values in memory. The upper few bits +// store the class and constructed bit, and the remaining bits store the tag // number. Note this differs from the DER serialization, to support tag numbers // beyond 31. Consumers must use the constants defined below to decompose or // assemble tags. @@ -231,31 +238,33 @@ OPENSSL_EXPORT int CBS_get_until_first(CBS *cbs, CBS *out, uint8_t c); // including tag and length bytes) and advances |cbs| over it. The ASN.1 // element must match |tag_value|. It returns one on success and zero // on error. -OPENSSL_EXPORT int CBS_get_asn1(CBS *cbs, CBS *out, unsigned tag_value); +OPENSSL_EXPORT int CBS_get_asn1(CBS *cbs, CBS *out, CBS_ASN1_TAG tag_value); // CBS_get_asn1_element acts like |CBS_get_asn1| but |out| will include the // ASN.1 header bytes too. -OPENSSL_EXPORT int CBS_get_asn1_element(CBS *cbs, CBS *out, unsigned tag_value); +OPENSSL_EXPORT int CBS_get_asn1_element(CBS *cbs, CBS *out, + CBS_ASN1_TAG tag_value); // CBS_peek_asn1_tag looks ahead at the next ASN.1 tag and returns one // if the next ASN.1 element on |cbs| would have tag |tag_value|. If // |cbs| is empty or the tag does not match, it returns zero. Note: if // it returns one, CBS_get_asn1 may still fail if the rest of the // element is malformed. -OPENSSL_EXPORT int CBS_peek_asn1_tag(const CBS *cbs, unsigned tag_value); +OPENSSL_EXPORT int CBS_peek_asn1_tag(const CBS *cbs, CBS_ASN1_TAG tag_value); // CBS_get_any_asn1 sets |*out| to contain the next ASN.1 element from |*cbs| // (not including tag and length bytes), sets |*out_tag| to the tag number, and // advances |*cbs|. It returns one on success and zero on error. Either of |out| // and |out_tag| may be NULL to ignore the value. -OPENSSL_EXPORT int CBS_get_any_asn1(CBS *cbs, CBS *out, unsigned *out_tag); +OPENSSL_EXPORT int CBS_get_any_asn1(CBS *cbs, CBS *out, + CBS_ASN1_TAG *out_tag); // CBS_get_any_asn1_element sets |*out| to contain the next ASN.1 element from // |*cbs| (including header bytes) and advances |*cbs|. It sets |*out_tag| to // the tag number and |*out_header_len| to the length of the ASN.1 header. Each // of |out|, |out_tag|, and |out_header_len| may be NULL to ignore the value. OPENSSL_EXPORT int CBS_get_any_asn1_element(CBS *cbs, CBS *out, - unsigned *out_tag, + CBS_ASN1_TAG *out_tag, size_t *out_header_len); // CBS_get_any_ber_asn1_element acts the same as |CBS_get_any_asn1_element| but @@ -271,7 +280,7 @@ OPENSSL_EXPORT int CBS_get_any_asn1_element(CBS *cbs, CBS *out, // element. Callers parsing indefinite-length encoding must check for EOC // separately. OPENSSL_EXPORT int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out, - unsigned *out_tag, + CBS_ASN1_TAG *out_tag, size_t *out_header_len, int *out_ber_found, int *out_indefinite); @@ -297,7 +306,7 @@ OPENSSL_EXPORT int CBS_get_asn1_bool(CBS *cbs, int *out); // one, otherwise zero. It returns one on success, whether or not the element // was present, and zero on decode failure. OPENSSL_EXPORT int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present, - unsigned tag); + CBS_ASN1_TAG tag); // CBS_get_optional_asn1_octet_string gets an optional // explicitly-tagged OCTET STRING from |cbs|. If present, it sets @@ -307,7 +316,7 @@ OPENSSL_EXPORT int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present, // present, and zero on decode failure. OPENSSL_EXPORT int CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out, int *out_present, - unsigned tag); + CBS_ASN1_TAG tag); // CBS_get_optional_asn1_uint64 gets an optional explicitly-tagged // INTEGER from |cbs|. If present, it sets |*out| to the @@ -315,7 +324,7 @@ OPENSSL_EXPORT int CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out, // on success, whether or not the element was present, and zero on // decode failure. OPENSSL_EXPORT int CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out, - unsigned tag, + CBS_ASN1_TAG tag, uint64_t default_value); // CBS_get_optional_asn1_bool gets an optional, explicitly-tagged BOOLEAN from @@ -323,7 +332,8 @@ OPENSSL_EXPORT int CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out, // boolean. Otherwise, it sets |*out| to |default_value|. It returns one on // success, whether or not the element was present, and zero on decode // failure. -OPENSSL_EXPORT int CBS_get_optional_asn1_bool(CBS *cbs, int *out, unsigned tag, +OPENSSL_EXPORT int CBS_get_optional_asn1_bool(CBS *cbs, int *out, + CBS_ASN1_TAG tag, int default_value); // CBS_is_valid_asn1_bitstring returns one if |cbs| is a valid ASN.1 BIT STRING @@ -346,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); @@ -391,28 +409,40 @@ OPENSSL_EXPORT int CBS_parse_utc_time(const CBS *cbs, struct tm *out_tm, struct cbb_buffer_st { uint8_t *buf; - size_t len; // The number of valid bytes. - size_t cap; // The size of buf. - char can_resize; /* One iff |buf| is owned by this object. If not then |buf| - cannot be resized. */ - char error; /* One iff there was an error writing to this CBB. All future - operations will fail. */ + // len is the number of valid bytes in |buf|. + size_t len; + // cap is the size of |buf|. + size_t cap; + // can_resize is one iff |buf| is owned by this object. If not then |buf| + // cannot be resized. + unsigned can_resize : 1; + // error is one if there was an error writing to this CBB. All future + // operations will fail. + unsigned error : 1; }; -struct cbb_st { +struct cbb_child_st { + // base is a pointer to the buffer this |CBB| writes to. struct cbb_buffer_st *base; - // child points to a child CBB if a length-prefix is pending. - CBB *child; // offset is the number of bytes from the start of |base->buf| to this |CBB|'s // pending length prefix. size_t offset; // pending_len_len contains the number of bytes in this |CBB|'s pending // length-prefix, or zero if no length-prefix is pending. uint8_t pending_len_len; - char pending_is_asn1; - // is_child is true iff this is a child |CBB| (as opposed to a top-level - // |CBB|). Top-level objects are valid arguments for |CBB_finish|. + unsigned pending_is_asn1 : 1; +}; + +struct cbb_st { + // child points to a child CBB if a length-prefix is pending. + CBB *child; + // is_child is one if this is a child |CBB| and zero if it is a top-level + // |CBB|. This determines which arm of the union is valid. char is_child; + union { + struct cbb_buffer_st base; + struct cbb_child_st child; + } u; }; // CBB_zero sets an uninitialised |cbb| to the zero state. It must be @@ -428,7 +458,8 @@ OPENSSL_EXPORT int CBB_init(CBB *cbb, size_t initial_capacity); // CBB_init_fixed initialises |cbb| to write to |len| bytes at |buf|. Since // |buf| cannot grow, trying to write more than |len| bytes will cause CBB -// functions to fail. It returns one on success or zero on error. +// functions to fail. This function is infallible and always returns one. It is +// safe, but not necessary, to call |CBB_cleanup| on |cbb|. OPENSSL_EXPORT int CBB_init_fixed(CBB *cbb, uint8_t *buf, size_t len); // CBB_cleanup frees all resources owned by |cbb| and other |CBB| objects @@ -489,7 +520,7 @@ OPENSSL_EXPORT int CBB_add_u24_length_prefixed(CBB *cbb, CBB *out_contents); // CBB_add_asn1 sets |*out_contents| to a |CBB| into which the contents of an // ASN.1 object can be written. The |tag| argument will be used as the tag for // the object. It returns one on success or zero on error. -OPENSSL_EXPORT int CBB_add_asn1(CBB *cbb, CBB *out_contents, unsigned tag); +OPENSSL_EXPORT int CBB_add_asn1(CBB *cbb, CBB *out_contents, CBS_ASN1_TAG tag); // CBB_add_bytes appends |len| bytes from |data| to |cbb|. It returns one on // success and zero otherwise. @@ -561,7 +592,7 @@ OPENSSL_EXPORT int CBB_add_asn1_uint64(CBB *cbb, uint64_t value); // |tag| as the tag instead of INTEGER. This is useful if the INTEGER type uses // implicit tagging. OPENSSL_EXPORT int CBB_add_asn1_uint64_with_tag(CBB *cbb, uint64_t value, - unsigned tag); + CBS_ASN1_TAG tag); // CBB_add_asn1_int64 writes an ASN.1 INTEGER into |cbb| using |CBB_add_asn1| // and writes |value| in its contents. It returns one on success and zero on @@ -572,7 +603,7 @@ OPENSSL_EXPORT int CBB_add_asn1_int64(CBB *cbb, int64_t value); // as the tag instead of INTEGER. This is useful if the INTEGER type uses // implicit tagging. OPENSSL_EXPORT int CBB_add_asn1_int64_with_tag(CBB *cbb, int64_t value, - unsigned tag); + CBS_ASN1_TAG tag); // CBB_add_asn1_octet_string writes an ASN.1 OCTET STRING into |cbb| with the // given contents. It returns one on success and zero on error. diff --git a/third_party/boringssl/src/include/openssl/cipher.h b/third_party/boringssl/src/include/openssl/cipher.h index ba4b6983f5e8..310d7c237fd8 100644 --- a/third_party/boringssl/src/include/openssl/cipher.h +++ b/third_party/boringssl/src/include/openssl/cipher.h @@ -214,26 +214,6 @@ OPENSSL_EXPORT int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, OPENSSL_EXPORT int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len); -// EVP_Cipher performs a one-shot encryption/decryption operation for non-AEAD -// ciphers. No partial blocks are maintained between calls. However, any -// internal cipher state is still updated. For CBC-mode ciphers, the IV is -// updated to the final ciphertext block. For stream ciphers, the stream is -// advanced past the bytes used. It returns one on success and zero otherwise. -// -// WARNING: This function behaves completely differently on AEAD ciphers, such -// as |EVP_aes_128_gcm|. Rather than being a one-shot operation, it behaves like -// |EVP_CipherUpdate| or |EVP_CipherFinal_ex|, depending on whether |in| is -// NULL. It also instead returns the number of bytes written or -1 on error. -// This behavior is deprecated. Use |EVP_CipherUpdate| or |EVP_CipherFinal_ex| -// instead. -// -// TODO(davidben): The normal ciphers currently never fail, even if, e.g., -// |in_len| is not a multiple of the block size for CBC-mode decryption. The -// input just gets rounded up while the output gets truncated. This should -// either be officially documented or fail. -OPENSSL_EXPORT int EVP_Cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, - const uint8_t *in, size_t in_len); - // EVP_CipherUpdate calls either |EVP_EncryptUpdate| or |EVP_DecryptUpdate| // depending on how |ctx| has been setup. OPENSSL_EXPORT int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, @@ -361,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|). @@ -432,6 +418,30 @@ OPENSSL_EXPORT int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, uint8_t *out, OPENSSL_EXPORT int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len); +// EVP_Cipher historically exposed an internal implementation detail of |ctx| +// and should not be used. Use |EVP_CipherUpdate| and |EVP_CipherFinal_ex| +// instead. +// +// If |ctx|'s cipher does not have the |EVP_CIPH_FLAG_CUSTOM_CIPHER| flag, it +// encrypts or decrypts |in_len| bytes from |in| and writes the resulting +// |in_len| bytes to |out|. It returns one on success and zero on error. +// |in_len| must be a multiple of the cipher's block size, or the behavior is +// undefined. +// +// TODO(davidben): Rather than being undefined (it'll often round the length up +// and likely read past the buffer), just fail the operation. +// +// If |ctx|'s cipher has the |EVP_CIPH_FLAG_CUSTOM_CIPHER| flag, it runs in one +// of two modes: If |in| is non-NULL, it behaves like |EVP_CipherUpdate|. If +// |in| is NULL, it behaves like |EVP_CipherFinal_ex|. In both cases, it returns +// |*out_len| on success and -1 on error. +// +// WARNING: The two possible calling conventions of this function signal errors +// incompatibly. In the first, zero indicates an error. In the second, zero +// indicates success with zero bytes of output. +OPENSSL_EXPORT int EVP_Cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, + const uint8_t *in, size_t in_len); + // EVP_add_cipher_alias does nothing and returns one. OPENSSL_EXPORT int EVP_add_cipher_alias(const char *a, const char *b); @@ -445,6 +455,12 @@ OPENSSL_EXPORT const EVP_CIPHER *EVP_get_cipherbyname(const char *name); // These AEADs are deprecated AES-GCM implementations that set // |EVP_CIPH_FLAG_CUSTOM_CIPHER|. Use |EVP_aead_aes_128_gcm| and // |EVP_aead_aes_256_gcm| instead. +// +// WARNING: Although these APIs allow streaming an individual AES-GCM operation, +// this is not secure. Until calling |EVP_DecryptFinal_ex|, the tag has not yet +// been checked and output released by |EVP_DecryptUpdate| is unauthenticated +// and easily manipulated by attackers. Callers must buffer the output and may +// not act on it until the entire operation is complete. OPENSSL_EXPORT const EVP_CIPHER *EVP_aes_128_gcm(void); OPENSSL_EXPORT const EVP_CIPHER *EVP_aes_256_gcm(void); @@ -496,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. diff --git a/third_party/boringssl/src/include/openssl/conf.h b/third_party/boringssl/src/include/openssl/conf.h index 0872e13d2366..908c16ea5750 100644 --- a/third_party/boringssl/src/include/openssl/conf.h +++ b/third_party/boringssl/src/include/openssl/conf.h @@ -110,8 +110,8 @@ OPENSSL_EXPORT int NCONF_load_bio(CONF *conf, BIO *bio, long *out_error_line); // NCONF_get_section returns a stack of values for a given section in |conf|. // If |section| is NULL, the default section is returned. It returns NULL on // error. -OPENSSL_EXPORT STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, - const char *section); +OPENSSL_EXPORT const STACK_OF(CONF_VALUE) *NCONF_get_section( + const CONF *conf, const char *section); // NCONF_get_string returns the value of the key |name|, in section |section|. // The |section| argument may be NULL to indicate the default section. It diff --git a/third_party/boringssl/src/include/openssl/crypto.h b/third_party/boringssl/src/include/openssl/crypto.h index b1f696ffd27d..171ac43f6b36 100644 --- a/third_party/boringssl/src/include/openssl/crypto.h +++ b/third_party/boringssl/src/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 diff --git a/third_party/boringssl/src/include/openssl/ctrdrbg.h b/third_party/boringssl/src/include/openssl/ctrdrbg.h index 62afe0c18ee5..5440fb4d1403 100644 --- a/third_party/boringssl/src/include/openssl/ctrdrbg.h +++ b/third_party/boringssl/src/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 diff --git a/third_party/boringssl/src/include/openssl/dsa.h b/third_party/boringssl/src/include/openssl/dsa.h index 7f10e549020d..30afd43834d4 100644 --- a/third_party/boringssl/src/include/openssl/dsa.h +++ b/third_party/boringssl/src/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/third_party/boringssl/src/include/openssl/ec.h b/third_party/boringssl/src/include/openssl/ec.h index 8339bfbb9a0a..dd5259bb848c 100644 --- a/third_party/boringssl/src/include/openssl/ec.h +++ b/third_party/boringssl/src/include/openssl/ec.h @@ -253,13 +253,23 @@ OPENSSL_EXPORT int EC_POINT_set_affine_coordinates(const EC_GROUP *group, BN_CTX *ctx); // EC_POINT_point2oct serialises |point| into the X9.62 form given by |form| -// into, at most, |len| bytes at |buf|. It returns the number of bytes written -// or zero on error if |buf| is non-NULL, else the number of bytes needed. The -// |ctx| argument may be used if not NULL. +// into, at most, |max_out| bytes at |buf|. It returns the number of bytes +// written or zero on error if |buf| is non-NULL, else the number of bytes +// needed. The |ctx| argument may be used if not NULL. OPENSSL_EXPORT size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form, - uint8_t *buf, size_t len, BN_CTX *ctx); + uint8_t *buf, size_t max_out, + BN_CTX *ctx); + +// EC_POINT_point2buf serialises |point| into the X9.62 form given by |form| to +// a newly-allocated buffer and sets |*out_buf| to point to it. It returns the +// length of the result on success or zero on error. The caller must release +// |*out_buf| with |OPENSSL_free| when done. +OPENSSL_EXPORT size_t EC_POINT_point2buf(const EC_GROUP *group, + const EC_POINT *point, + point_conversion_form_t form, + uint8_t **out_buf, BN_CTX *ctx); // EC_POINT_point2cbb behaves like |EC_POINT_point2oct| but appends the // serialised point to |cbb|. It returns one on success and zero on error. @@ -309,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/third_party/boringssl/src/include/openssl/ec_key.h b/third_party/boringssl/src/include/openssl/ec_key.h index 502bfc2d9595..00986cf421fd 100644 --- a/third_party/boringssl/src/include/openssl/ec_key.h +++ b/third_party/boringssl/src/include/openssl/ec_key.h @@ -179,12 +179,38 @@ OPENSSL_EXPORT int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, const BIGNUM *x, const BIGNUM *y); -// EC_KEY_key2buf encodes the public key in |key| to an allocated octet string -// and sets |*out_buf| to point to it. It returns the length of the encoded -// octet string or zero if an error occurred. +// EC_KEY_oct2key decodes |len| bytes from |in| as an EC public key in X9.62 +// form. |key| must already have a group configured. On success, it sets the +// public key in |key| to the result and returns one. Otherwise, it returns +// zero. +OPENSSL_EXPORT int EC_KEY_oct2key(EC_KEY *key, const uint8_t *in, size_t len, + BN_CTX *ctx); + +// EC_KEY_key2buf behaves like |EC_POINT_point2buf|, except it encodes the +// public key in |key|. OPENSSL_EXPORT size_t EC_KEY_key2buf(const EC_KEY *key, point_conversion_form_t form, - unsigned char **out_buf, BN_CTX *ctx); + uint8_t **out_buf, BN_CTX *ctx); + +// EC_KEY_oct2priv decodes a big-endian, zero-padded integer from |len| bytes +// from |in| and sets |key|'s private key to the result. It returns one on +// success and zero on error. The input must be padded to the size of |key|'s +// group order. +OPENSSL_EXPORT int EC_KEY_oct2priv(EC_KEY *key, const uint8_t *in, size_t len); + +// EC_KEY_priv2oct serializes |key|'s private key as a big-endian integer, +// zero-padded to the size of |key|'s group order and writes the result to at +// most |max_out| bytes of |out|. It returns the number of bytes written on +// success and zero on error. If |out| is NULL, it returns the number of bytes +// needed without writing anything. +OPENSSL_EXPORT size_t EC_KEY_priv2oct(const EC_KEY *key, uint8_t *out, + size_t max_out); + +// EC_KEY_priv2buf behaves like |EC_KEY_priv2oct| but sets |*out_buf| to a +// newly-allocated buffer containing the result. It returns the size of the +// result on success and zero on error. The caller must release |*out_buf| with +// |OPENSSL_free| when done. +OPENSSL_EXPORT size_t EC_KEY_priv2buf(const EC_KEY *key, uint8_t **out_buf); // Key generation. @@ -335,7 +361,7 @@ OPENSSL_EXPORT EC_KEY *o2i_ECPublicKey(EC_KEY **out_key, const uint8_t **inp, long len); // i2o_ECPublicKey marshals an EC point from |key|, as described in -// |i2d_SAMPLE|. +// |i2d_SAMPLE|, except it returns zero on error instead of a negative value. // // Use |EC_POINT_point2cbb| instead. OPENSSL_EXPORT int i2o_ECPublicKey(const EC_KEY *key, unsigned char **outp); diff --git a/third_party/boringssl/src/include/openssl/ecdsa.h b/third_party/boringssl/src/include/openssl/ecdsa.h index bc0dba562445..56be1547f5cc 100644 --- a/third_party/boringssl/src/include/openssl/ecdsa.h +++ b/third_party/boringssl/src/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 diff --git a/third_party/boringssl/src/include/openssl/err.h b/third_party/boringssl/src/include/openssl/err.h index 28ba2507079c..0ec71b171fd0 100644 --- a/third_party/boringssl/src/include/openssl/err.h +++ b/third_party/boringssl/src/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 @@ -184,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 @@ -411,7 +419,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. diff --git a/third_party/boringssl/src/include/openssl/evp.h b/third_party/boringssl/src/include/openssl/evp.h index 37daa9ade74a..00ae4f5de464 100644 --- a/third_party/boringssl/src/include/openssl/evp.h +++ b/third_party/boringssl/src/include/openssl/evp.h @@ -936,7 +936,10 @@ OPENSSL_EXPORT int EVP_PKEY_CTX_set_ec_param_enc(EVP_PKEY_CTX *ctx, // EVP_PKEY_set1_tls_encodedpoint replaces |pkey| with a public key encoded by // |in|. It returns one on success and zero on error. // -// This function only works on X25519 keys. +// If |pkey| is an EC key, the format is an X9.62 point and |pkey| must already +// have an EC group configured. If it is an X25519 key, it is the 32-byte X25519 +// public key representation. This function is not supported for other key types +// and will fail. OPENSSL_EXPORT int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey, const uint8_t *in, size_t len); @@ -946,7 +949,10 @@ OPENSSL_EXPORT int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY *pkey, // |OPENSSL_free| to release this buffer. The function returns the length of the // buffer on success and zero on error. // -// This function only works on X25519 keys. +// If |pkey| is an EC key, the format is an X9.62 point with uncompressed +// coordinates. If it is an X25519 key, it is the 32-byte X25519 public key +// representation. This function is not supported for other key types and will +// fail. OPENSSL_EXPORT size_t EVP_PKEY_get1_tls_encodedpoint(const EVP_PKEY *pkey, uint8_t **out_ptr); @@ -1050,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/third_party/boringssl/src/include/openssl/ex_data.h b/third_party/boringssl/src/include/openssl/ex_data.h index 102f8a8f6daf..8f2f98b0af31 100644 --- a/third_party/boringssl/src/include/openssl/ex_data.h +++ b/third_party/boringssl/src/include/openssl/ex_data.h @@ -145,7 +145,7 @@ OPENSSL_EXPORT int TYPE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_free *free_func); // TYPE_set_ex_data sets an extra data pointer on |t|. The |index| argument -// should have been returned from a previous call to |TYPE_get_ex_new_index|. +// must have been returned from a previous call to |TYPE_get_ex_new_index|. OPENSSL_EXPORT int TYPE_set_ex_data(TYPE *t, int index, void *arg); // TYPE_get_ex_data returns an extra data pointer for |t|, or NULL if no such diff --git a/third_party/boringssl/src/include/openssl/kyber.h b/third_party/boringssl/src/include/openssl/kyber.h new file mode 100644 index 000000000000..cafae9d17071 --- /dev/null +++ b/third_party/boringssl/src/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/third_party/boringssl/src/include/openssl/mem.h b/third_party/boringssl/src/include/openssl/mem.h index f07698db29bd..8da1dd67edd3 100644 --- a/third_party/boringssl/src/include/openssl/mem.h +++ b/third_party/boringssl/src/include/openssl/mem.h @@ -75,17 +75,26 @@ 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. +// 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 // 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); +#endif // !_BORINGSSL_PROHIBIT_OPENSSL_MALLOC // OPENSSL_cleanse zeros out |len| bytes of memory at |ptr|. This is similar to // |memset_s| from C11. @@ -110,13 +119,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_tolower is a locale-independent version of tolower(3). +// 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_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_strcasecmp is a locale-independent version of strcasecmp(3). +// 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, 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 @@ -131,12 +169,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). diff --git a/third_party/boringssl/src/include/openssl/nid.h b/third_party/boringssl/src/include/openssl/nid.h index 54ecc5e26b44..64c9c9c33538 100644 --- a/third_party/boringssl/src/include/openssl/nid.h +++ b/third_party/boringssl/src/include/openssl/nid.h @@ -4235,9 +4235,6 @@ extern "C" { #define LN_auth_any "auth-any" #define NID_auth_any 958 -#define SN_CECPQ2 "CECPQ2" -#define NID_CECPQ2 959 - #define SN_ED448 "ED448" #define NID_ED448 960 #define OBJ_ED448 1L, 3L, 101L, 113L @@ -4255,6 +4252,15 @@ extern "C" { #define LN_hkdf "hkdf" #define NID_hkdf 963 +#define SN_X25519Kyber768 "X25519Kyber768" +#define NID_X25519Kyber768 964 + +#define SN_P256Kyber768 "P256Kyber768" +#define NID_P256Kyber768 965 + +#define SN_P384Kyber768 "P384Kyber768" +#define NID_P384Kyber768 966 + #if defined(__cplusplus) } /* extern C */ diff --git a/third_party/boringssl/src/include/openssl/obj.h b/third_party/boringssl/src/include/openssl/obj.h index ad7271ec9cbe..3fb8bdeb92e0 100644 --- a/third_party/boringssl/src/include/openssl/obj.h +++ b/third_party/boringssl/src/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); diff --git a/third_party/boringssl/src/include/openssl/pem.h b/third_party/boringssl/src/include/openssl/pem.h index 56075ae8a427..21885ba39d35 100644 --- a/third_party/boringssl/src/include/openssl/pem.h +++ b/third_party/boringssl/src/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) @@ -417,40 +414,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); diff --git a/third_party/boringssl/src/include/openssl/rsa.h b/third_party/boringssl/src/include/openssl/rsa.h index 57a2cb2c8199..a1c03cd3b371 100644 --- a/third_party/boringssl/src/include/openssl/rsa.h +++ b/third_party/boringssl/src/include/openssl/rsa.h @@ -298,8 +298,8 @@ OPENSSL_EXPORT int RSA_private_decrypt(size_t flen, const uint8_t *from, // |hash_nid|. Passing unhashed inputs will not result in a secure signature // scheme. OPENSSL_EXPORT int RSA_sign(int hash_nid, const uint8_t *digest, - unsigned digest_len, uint8_t *out, - unsigned *out_len, RSA *rsa); + size_t digest_len, uint8_t *out, unsigned *out_len, + RSA *rsa); // RSA_sign_pss_mgf1 signs |digest_len| bytes from |digest| with the public key // from |rsa| using RSASSA-PSS with MGF1 as the mask generation function. It @@ -625,7 +625,7 @@ OPENSSL_EXPORT int RSA_blinding_on(RSA *rsa, BN_CTX *ctx); // should use instead. It returns NULL on error, or a newly-allocated |RSA| on // success. This function is provided for compatibility only. The |callback| // and |cb_arg| parameters must be NULL. -OPENSSL_EXPORT RSA *RSA_generate_key(int bits, unsigned long e, void *callback, +OPENSSL_EXPORT RSA *RSA_generate_key(int bits, uint64_t e, void *callback, void *cb_arg); // d2i_RSAPublicKey parses a DER-encoded RSAPublicKey structure (RFC 8017) from @@ -775,7 +775,7 @@ struct rsa_st { // num_blindings contains the size of the |blindings| and |blindings_inuse| // arrays. This member and the |blindings_inuse| array are protected by // |lock|. - unsigned num_blindings; + size_t num_blindings; // blindings is an array of BN_BLINDING structures that can be reserved by a // thread by locking |lock| and changing the corresponding element in // |blindings_inuse| from 0 to 1. diff --git a/third_party/boringssl/src/include/openssl/ssl.h b/third_party/boringssl/src/include/openssl/ssl.h index 04e875dc3b5b..d9cacafea55b 100644 --- a/third_party/boringssl/src/include/openssl/ssl.h +++ b/third_party/boringssl/src/include/openssl/ssl.h @@ -157,11 +157,6 @@ #include #endif -// NGINX needs this #include. Consider revisiting this after NGINX 1.14.0 has -// been out for a year or so (assuming that they fix it in that release.) See -// https://boringssl-review.googlesource.com/c/boringssl/+/21664. -#include - // Forward-declare struct timeval. On Windows, it is defined in winsock2.h and // Windows headers define too many macros to be included in public headers. // However, only a forward declaration is needed. @@ -1456,9 +1451,6 @@ OPENSSL_EXPORT int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, // // |SHA1|, and its alias |SHA|, match legacy cipher suites using HMAC-SHA1. // -// Although implemented, authentication-only ciphers match no rules and must be -// explicitly selected by name. -// // Deprecated cipher rules: // // |kEDH|, |EDH|, |kEECDH|, and |EECDH| are legacy aliases for |kDHE|, |DHE|, @@ -2341,7 +2333,8 @@ OPENSSL_EXPORT int SSL_set1_curves_list(SSL *ssl, const char *curves); #define SSL_CURVE_SECP384R1 24 #define SSL_CURVE_SECP521R1 25 #define SSL_CURVE_X25519 29 -#define SSL_CURVE_CECPQ2 16696 +#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 // completed handshake or 0 if not applicable. @@ -2416,21 +2409,51 @@ OPENSSL_EXPORT int SSL_set1_groups_list(SSL *ssl, const char *groups); // SSL_CTX_set_verify configures certificate verification behavior. |mode| is // one of the |SSL_VERIFY_*| values defined above. |callback|, if not NULL, is -// used to customize certificate verification. See the behavior of -// |X509_STORE_CTX_set_verify_cb|. +// used to customize certificate verification, but is deprecated. See +// |X509_STORE_CTX_set_verify_cb| for details. // // The callback may use |SSL_get_ex_data_X509_STORE_CTX_idx| with // |X509_STORE_CTX_get_ex_data| to look up the |SSL| from |store_ctx|. +// +// WARNING: |callback| should be NULL. This callback does not replace the +// default certificate verification process and is, instead, called multiple +// times in the course of that process. It is very difficult to implement this +// callback safely, without inadvertently relying on implementation details or +// making incorrect assumptions about when the callback is called. +// +// Instead, use |SSL_CTX_set_custom_verify| or +// |SSL_CTX_set_cert_verify_callback| to customize certificate verification. +// Those callbacks can inspect the peer-sent chain, call |X509_verify_cert| and +// inspect the result, or perform other operations more straightforwardly. +// +// TODO(crbug.com/boringssl/426): We cite |X509_STORE_CTX_set_verify_cb| but +// haven't documented it yet. Later that will have a more detailed warning about +// why one should not use this callback. OPENSSL_EXPORT void SSL_CTX_set_verify( SSL_CTX *ctx, int mode, int (*callback)(int ok, X509_STORE_CTX *store_ctx)); // SSL_set_verify configures certificate verification behavior. |mode| is one of // the |SSL_VERIFY_*| values defined above. |callback|, if not NULL, is used to -// customize certificate verification. See the behavior of +// customize certificate verification, but is deprecated. See the behavior of // |X509_STORE_CTX_set_verify_cb|. // // The callback may use |SSL_get_ex_data_X509_STORE_CTX_idx| with // |X509_STORE_CTX_get_ex_data| to look up the |SSL| from |store_ctx|. +// +// WARNING: |callback| should be NULL. This callback does not replace the +// default certificate verification process and is, instead, called multiple +// times in the course of that process. It is very difficult to implement this +// callback safely, without inadvertently relying on implementation details or +// making incorrect assumptions about when the callback is called. +// +// Instead, use |SSL_set_custom_verify| or |SSL_CTX_set_cert_verify_callback| to +// customize certificate verification. Those callbacks can inspect the peer-sent +// chain, call |X509_verify_cert| and inspect the result, or perform other +// operations more straightforwardly. +// +// TODO(crbug.com/boringssl/426): We cite |X509_STORE_CTX_set_verify_cb| but +// haven't documented it yet. Later that will have a more detailed warning about +// why one should not use this callback. OPENSSL_EXPORT void SSL_set_verify(SSL *ssl, int mode, int (*callback)(int ok, X509_STORE_CTX *store_ctx)); @@ -2834,7 +2857,7 @@ OPENSSL_EXPORT SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); // WARNING: this function is dangerous because it breaks the usual return value // convention. OPENSSL_EXPORT int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const uint8_t *protos, - unsigned protos_len); + size_t protos_len); // SSL_set_alpn_protos sets the client ALPN protocol list on |ssl| to |protos|. // |protos| must be in wire-format (i.e. a series of non-empty, 8-bit @@ -2845,7 +2868,7 @@ OPENSSL_EXPORT int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const uint8_t *protos, // WARNING: this function is dangerous because it breaks the usual return value // convention. OPENSSL_EXPORT int SSL_set_alpn_protos(SSL *ssl, const uint8_t *protos, - unsigned protos_len); + size_t protos_len); // SSL_CTX_set_alpn_select_cb sets a callback function on |ctx| that is called // during ClientHello processing in order to select an ALPN protocol from the @@ -3933,13 +3956,14 @@ OPENSSL_EXPORT int SSL_get_ivs(const SSL *ssl, const uint8_t **out_read_iv, const uint8_t **out_write_iv, size_t *out_iv_len); -// SSL_get_key_block_len returns the length of |ssl|'s key block. It is an error -// to call this function during a handshake. +// SSL_get_key_block_len returns the length of |ssl|'s key block, for TLS 1.2 +// and below. It is an error to call this function during a handshake, or if +// |ssl| negotiated TLS 1.3. OPENSSL_EXPORT size_t SSL_get_key_block_len(const SSL *ssl); // SSL_generate_key_block generates |out_len| bytes of key material for |ssl|'s -// current connection state. It is an error to call this function during a -// handshake. +// current connection state, for TLS 1.2 and below. It is an error to call this +// function during a handshake, or if |ssl| negotiated TLS 1.3. OPENSSL_EXPORT int SSL_generate_key_block(const SSL *ssl, uint8_t *out, size_t out_len); @@ -4328,12 +4352,24 @@ OPENSSL_EXPORT void SSL_CTX_set_dos_protection_cb( // respected on clients. OPENSSL_EXPORT void SSL_CTX_set_reverify_on_resume(SSL_CTX *ctx, int enabled); -// SSL_set_enforce_rsa_key_usage configures whether the keyUsage extension of -// RSA leaf certificates will be checked for consistency with the TLS -// usage. This parameter may be set late; it will not be read until after the +// SSL_set_enforce_rsa_key_usage configures whether, when |ssl| is a client +// negotiating TLS 1.2 or below, the keyUsage extension of RSA leaf server +// certificates will be checked for consistency with the TLS usage. In all other +// cases, this check is always enabled. +// +// This parameter may be set late; it will not be read until after the // certificate verification callback. OPENSSL_EXPORT void SSL_set_enforce_rsa_key_usage(SSL *ssl, int enabled); +// SSL_was_key_usage_invalid returns one if |ssl|'s handshake succeeded despite +// using TLS parameters which were incompatible with the leaf certificate's +// keyUsage extension. Otherwise, it returns zero. +// +// If |SSL_set_enforce_rsa_key_usage| is enabled or not applicable, this +// function will always return zero because key usages will be consistently +// checked. +OPENSSL_EXPORT int SSL_was_key_usage_invalid(const SSL *ssl); + // SSL_ST_* are possible values for |SSL_state|, the bitmasks that make them up, // and some historical values for compatibility. Only |SSL_ST_INIT| and // |SSL_ST_OK| are ever returned. @@ -4520,13 +4556,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; @@ -5412,6 +5441,18 @@ OPENSSL_EXPORT bool SSL_get_traffic_secrets( const SSL *ssl, Span *out_read_traffic_secret, Span *out_write_traffic_secret); +// SSL_CTX_set_aes_hw_override_for_testing sets |override_value| to +// override checking for aes hardware support for testing. If |override_value| +// is set to true, the library will behave as if aes hardware support is +// present. If it is set to false, the library will behave as if aes hardware +// support is not present. +OPENSSL_EXPORT void SSL_CTX_set_aes_hw_override_for_testing( + SSL_CTX *ctx, bool override_value); + +// SSL_set_aes_hw_override_for_testing acts the same as +// |SSL_CTX_set_aes_override_for_testing| but only configures a single |SSL*|. +OPENSSL_EXPORT void SSL_set_aes_hw_override_for_testing(SSL *ssl, + bool override_value); BSSL_NAMESPACE_END diff --git a/third_party/boringssl/src/include/openssl/ssl3.h b/third_party/boringssl/src/include/openssl/ssl3.h index 190bca4c4814..221adf084a8f 100644 --- a/third_party/boringssl/src/include/openssl/ssl3.h +++ b/third_party/boringssl/src/include/openssl/ssl3.h @@ -1,4 +1,3 @@ -/* ssl/ssl3.h */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * diff --git a/third_party/boringssl/src/include/openssl/stack.h b/third_party/boringssl/src/include/openssl/stack.h index 11761dcd2735..59b1c5eff115 100644 --- a/third_party/boringssl/src/include/openssl/stack.h +++ b/third_party/boringssl/src/include/openssl/stack.h @@ -120,17 +120,15 @@ typedef void (*sk_SAMPLE_free_func)(SAMPLE *); // sk_SAMPLE_copy_func is a callback to copy an element in a stack. It should // return the copy or NULL on error. -typedef SAMPLE *(*sk_SAMPLE_copy_func)(SAMPLE *); +typedef SAMPLE *(*sk_SAMPLE_copy_func)(const SAMPLE *); // sk_SAMPLE_cmp_func is a callback to compare |*a| to |*b|. It should return a // value < 0, 0, or > 0 if |*a| is less than, equal to, or greater than |*b|, // 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. @@ -178,6 +176,17 @@ SAMPLE *sk_SAMPLE_delete(STACK_OF(SAMPLE) *sk, size_t where); // otherwise it returns NULL. SAMPLE *sk_SAMPLE_delete_ptr(STACK_OF(SAMPLE) *sk, const SAMPLE *p); +// sk_SAMPLE_delete_if_func is the callback function for |sk_SAMPLE_delete_if|. +// It should return one to remove |p| and zero to keep it. +typedef int (*sk_SAMPLE_delete_if_func)(SAMPLE *p, void *data); + +// sk_SAMPLE_delete_if calls |func| with each element of |sk| and removes the +// entries where |func| returned one. This function does not free or return +// removed pointers so, if |sk| owns its contents, |func| should release the +// pointers prior to returning one. +void sk_SAMPLE_delete_if(STACK_OF(SAMPLE) *sk, sk_SAMPLE_delete_if_func func, + void *data); + // sk_SAMPLE_find find the first value in |sk| equal to |p|. |sk|'s comparison // function determines equality, or pointer equality if |sk| has no comparison // function. @@ -244,29 +253,33 @@ STACK_OF(SAMPLE) *sk_SAMPLE_deep_copy(const STACK_OF(SAMPLE) *sk, typedef void (*OPENSSL_sk_free_func)(void *ptr); // OPENSSL_sk_copy_func is a function that copies an element in a stack. Note -// its actual type is T *(*)(T *) for some T. Low-level |sk_*| functions will be -// passed a type-specific wrapper to call it correctly. -typedef void *(*OPENSSL_sk_copy_func)(void *ptr); +// its actual type is T *(*)(const T *) for some T. Low-level |sk_*| functions +// will be passed a type-specific wrapper to call it correctly. +typedef void *(*OPENSSL_sk_copy_func)(const void *ptr); // OPENSSL_sk_cmp_func is a comparison function that returns a value < 0, 0 or > // 0 if |*a| is less than, equal to or greater than |*b|, respectively. Note // 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(davidben): 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|. +typedef int (*OPENSSL_sk_delete_if_func)(void *obj, void *data); // The following function types call the above type-erased signatures with the // true types. typedef void (*OPENSSL_sk_call_free_func)(OPENSSL_sk_free_func, void *); -typedef void *(*OPENSSL_sk_call_copy_func)(OPENSSL_sk_copy_func, void *); +typedef void *(*OPENSSL_sk_call_copy_func)(OPENSSL_sk_copy_func, const void *); typedef int (*OPENSSL_sk_call_cmp_func)(OPENSSL_sk_cmp_func, const void *const *, const void *const *); +typedef int (*OPENSSL_sk_call_delete_if_func)(OPENSSL_sk_delete_if_func, void *, + void *); // stack_st contains an array of pointers. It is not designed to be used // directly, rather the wrapper macros should be used. @@ -300,6 +313,9 @@ OPENSSL_EXPORT void sk_pop_free_ex(_STACK *sk, OPENSSL_EXPORT size_t sk_insert(_STACK *sk, void *p, size_t where); OPENSSL_EXPORT void *sk_delete(_STACK *sk, size_t where); OPENSSL_EXPORT void *sk_delete_ptr(_STACK *sk, const void *p); +OPENSSL_EXPORT void sk_delete_if(_STACK *sk, + OPENSSL_sk_call_delete_if_func call_func, + OPENSSL_sk_delete_if_func func, void *data); OPENSSL_EXPORT int sk_find(const _STACK *sk, size_t *out_index, const void *p, OPENSSL_sk_call_cmp_func call_cmp_func); OPENSSL_EXPORT void *sk_shift(_STACK *sk); @@ -365,8 +381,10 @@ BSSL_NAMESPACE_END DECLARE_STACK_OF(name) \ \ typedef void (*sk_##name##_free_func)(ptrtype); \ - typedef ptrtype (*sk_##name##_copy_func)(ptrtype); \ - typedef int (*sk_##name##_cmp_func)(constptrtype *a, constptrtype *b); \ + typedef ptrtype (*sk_##name##_copy_func)(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( \ OPENSSL_sk_free_func free_func, void *ptr) { \ @@ -374,8 +392,8 @@ BSSL_NAMESPACE_END } \ \ OPENSSL_INLINE void *sk_##name##_call_copy_func( \ - OPENSSL_sk_copy_func copy_func, void *ptr) { \ - return (void *)((sk_##name##_copy_func)copy_func)((ptrtype)ptr); \ + OPENSSL_sk_copy_func copy_func, const void *ptr) { \ + return (void *)((sk_##name##_copy_func)copy_func)((constptrtype)ptr); \ } \ \ OPENSSL_INLINE int sk_##name##_call_cmp_func(OPENSSL_sk_cmp_func cmp_func, \ @@ -389,6 +407,11 @@ BSSL_NAMESPACE_END return ((sk_##name##_cmp_func)cmp_func)(&a_ptr, &b_ptr); \ } \ \ + OPENSSL_INLINE int sk_##name##_call_delete_if_func( \ + OPENSSL_sk_delete_if_func func, void *obj, void *data) { \ + return ((sk_##name##_delete_if_func)func)((ptrtype)obj, data); \ + } \ + \ OPENSSL_INLINE STACK_OF(name) *sk_##name##_new(sk_##name##_cmp_func comp) { \ return (STACK_OF(name) *)sk_new((OPENSSL_sk_cmp_func)comp); \ } \ @@ -440,6 +463,12 @@ BSSL_NAMESPACE_END return (ptrtype)sk_delete_ptr((_STACK *)sk, (const void *)p); \ } \ \ + OPENSSL_INLINE void sk_##name##_delete_if( \ + STACK_OF(name) *sk, sk_##name##_delete_if_func func, void *data) { \ + sk_delete_if((_STACK *)sk, sk_##name##_call_delete_if_func, \ + (OPENSSL_sk_delete_if_func)func, data); \ + } \ + \ OPENSSL_INLINE int sk_##name##_find(const STACK_OF(name) *sk, \ size_t *out_index, constptrtype p) { \ return sk_find((const _STACK *)sk, out_index, (const void *)p, \ diff --git a/third_party/boringssl/src/include/openssl/time.h b/third_party/boringssl/src/include/openssl/time.h new file mode 100644 index 000000000000..723ce10a031c --- /dev/null +++ b/third_party/boringssl/src/include/openssl/time.h @@ -0,0 +1,41 @@ +/* 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. */ + +#ifndef OPENSSL_HEADER_TIME_H +#define OPENSSL_HEADER_TIME_H + +#include + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +// OPENSSL_posix_to_tm converts a int64_t POSIX time value in |time|, which must +// be in the range of year 0000 to 9999, to a broken out time value in |tm|. It +// returns one on success and zero on error. +OPENSSL_EXPORT int OPENSSL_posix_to_tm(int64_t time, struct tm *out_tm); + +// OPENSSL_tm_to_posix converts a time value between the years 0 and 9999 in +// |tm| to a POSIX time value in |out|. One is returned on success, zero is +// returned on failure. It is a failure if |tm| contains out of range values. +OPENSSL_EXPORT int OPENSSL_tm_to_posix(const struct tm *tm, int64_t *out); + + +#if defined(__cplusplus) +} // extern C +#endif + +#endif // OPENSSL_HEADER_TIME_H diff --git a/third_party/boringssl/src/include/openssl/trust_token.h b/third_party/boringssl/src/include/openssl/trust_token.h index 745a860b0d54..b6aa6b34e273 100644 --- a/third_party/boringssl/src/include/openssl/trust_token.h +++ b/third_party/boringssl/src/include/openssl/trust_token.h @@ -48,6 +48,14 @@ OPENSSL_EXPORT const TRUST_TOKEN_METHOD *TRUST_TOKEN_experiment_v2_voprf(void); // PMBTokens and P-384 with up to 3 keys, without RR verification. OPENSSL_EXPORT const TRUST_TOKEN_METHOD *TRUST_TOKEN_experiment_v2_pmb(void); +// TRUST_TOKEN_pst_v1_voprf is an experimental Trust Tokens protocol +// using VOPRFs and P-384 with up to 6 keys, without RR verification. +OPENSSL_EXPORT const TRUST_TOKEN_METHOD *TRUST_TOKEN_pst_v1_voprf(void); + +// TRUST_TOKEN_pst_v1_pmb is an experimental Trust Tokens protocol using +// PMBTokens and P-384 with up to 3 keys, without RR verification. +OPENSSL_EXPORT const TRUST_TOKEN_METHOD *TRUST_TOKEN_pst_v1_pmb(void); + // trust_token_st represents a single-use token for the Trust Token protocol. // For the client, this is the token and its corresponding signature. For the // issuer, this is the token itself. @@ -143,6 +151,15 @@ OPENSSL_EXPORT int TRUST_TOKEN_CLIENT_begin_issuance(TRUST_TOKEN_CLIENT *ctx, size_t *out_len, size_t count); +// TRUST_TOKEN_CLIENT_begin_issuance_over_message produces a request for a trust +// token derived from |msg| and serializes the request into a newly-allocated +// buffer, setting |*out| to that buffer and |*out_len| to its length. The +// caller takes ownership of the buffer and must call |OPENSSL_free| when done. +// It returns one on success and zero on error. +OPENSSL_EXPORT int TRUST_TOKEN_CLIENT_begin_issuance_over_message( + TRUST_TOKEN_CLIENT *ctx, uint8_t **out, size_t *out_len, size_t count, + const uint8_t *msg, size_t msg_len); + // TRUST_TOKEN_CLIENT_finish_issuance consumes |response| from the issuer and // extracts the tokens, returning a list of tokens and the index of the key used // to sign the tokens in |*out_key_index|. The caller can use this to determine @@ -239,31 +256,32 @@ 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 +// 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 // |*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. +// buffer and stored in |*out_client_data|. 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. +// 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( - const TRUST_TOKEN_ISSUER *ctx, uint8_t **out, size_t *out_len, + 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, uint64_t *out_redemption_time, - const uint8_t *request, size_t request_len, uint64_t lifetime); + size_t *out_client_data_len, const uint8_t *request, size_t request_len); -// 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 +// 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 +// |*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 // |*out_token|. The extracted client data is stored into a newly-allocated // buffer and stored in |*out_client_data|. The caller takes ownership of each // output buffer and must call |OPENSSL_free| when done. It returns one on @@ -273,10 +291,11 @@ 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_over_message( 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); + size_t *out_client_data_len, const uint8_t *request, size_t request_len, + const uint8_t *msg, size_t msg_len); // TRUST_TOKEN_decode_private_metadata decodes |encrypted_bit| using the // private metadata key specified by a |key| buffer of length |key_len| and the diff --git a/third_party/boringssl/src/include/openssl/x509.h b/third_party/boringssl/src/include/openssl/x509.h index e3369d95497b..2954488df9fb 100644 --- a/third_party/boringssl/src/include/openssl/x509.h +++ b/third_party/boringssl/src/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 @@ -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 @@ -277,6 +277,12 @@ OPENSSL_EXPORT int X509_get_signature_nid(const X509 *x509); // |i2d_re_X509_tbs| instead. OPENSSL_EXPORT int i2d_X509_tbs(X509 *x509, unsigned char **outp); +// X509_verify checks that |x509| has a valid signature by |pkey|. It returns +// one if the signature is valid and zero otherwise. Note this function only +// checks the signature itself and does not perform a full certificate +// validation. +OPENSSL_EXPORT int X509_verify(X509 *x509, EVP_PKEY *pkey); + // Issuing certificates. // @@ -398,8 +404,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. @@ -414,13 +419,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 @@ -485,7 +490,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); @@ -577,6 +582,10 @@ OPENSSL_EXPORT int X509_CRL_get_signature_nid(const X509_CRL *crl); // instead. OPENSSL_EXPORT int i2d_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp); +// X509_CRL_verify checks that |crl| has a valid signature by |pkey|. It returns +// one if the signature is valid and zero otherwise. +OPENSSL_EXPORT int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *pkey); + // Issuing certificate revocation lists. // @@ -699,7 +708,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); @@ -711,7 +720,6 @@ OPENSSL_EXPORT X509_REQ *d2i_X509_REQ(X509_REQ **out, const uint8_t **inp, // mutated. OPENSSL_EXPORT int i2d_X509_REQ(X509_REQ *req, uint8_t **outp); - // X509_REQ_VERSION_1 is the version constant for |X509_REQ| objects. No other // versions are defined. #define X509_REQ_VERSION_1 0 @@ -732,6 +740,46 @@ OPENSSL_EXPORT X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req); // |EVP_PKEY_free| when done. OPENSSL_EXPORT EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); +// X509_REQ_get_attr_count returns the number of attributes in |req|. +OPENSSL_EXPORT int X509_REQ_get_attr_count(const X509_REQ *req); + +// X509_REQ_get_attr returns the attribute at index |loc| in |req|, or NULL if +// out of bounds. +OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); + +// X509_REQ_get_attr_by_NID returns the index of the attribute in |req| of type +// |nid|, or a negative number if not found. If found, callers can use +// |X509_REQ_get_attr| to look up the attribute by index. +// +// If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers +// can thus loop over all matching attributes by first passing -1 and then +// passing the previously-returned value until no match is returned. +OPENSSL_EXPORT int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, + int lastpos); + +// X509_REQ_get_attr_by_OBJ behaves like |X509_REQ_get_attr_by_NID| but looks +// for attributes of type |obj|. +OPENSSL_EXPORT int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, + const ASN1_OBJECT *obj, + int lastpos); + +// X509_REQ_extension_nid returns one if |nid| is a supported CSR attribute type +// for carrying extensions and zero otherwise. The supported types are +// |NID_ext_req| (pkcs-9-at-extensionRequest from RFC 2985) and |NID_ms_ext_req| +// (a Microsoft szOID_CERT_EXTENSIONS variant). +OPENSSL_EXPORT int X509_REQ_extension_nid(int nid); + +// X509_REQ_get_extensions decodes the list of requested extensions in |req| and +// returns a newly-allocated |STACK_OF(X509_EXTENSION)| containing the result. +// It returns NULL on error, or if |req| did not request extensions. +// +// CSRs do not store extensions directly. Instead there are attribute types +// which are defined to hold extensions. See |X509_REQ_extension_nid|. This +// function supports both pkcs-9-at-extensionRequest from RFC 2985 and the +// Microsoft szOID_CERT_EXTENSIONS variant. If both are present, +// pkcs-9-at-extensionRequest is preferred. +OPENSSL_EXPORT STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); + // X509_REQ_get0_signature sets |*out_sig| and |*out_alg| to the signature and // signature algorithm of |req|, respectively. Either output pointer may be NULL // to ignore the value. @@ -744,6 +792,10 @@ OPENSSL_EXPORT void X509_REQ_get0_signature(const X509_REQ *req, // a known NID. OPENSSL_EXPORT int X509_REQ_get_signature_nid(const X509_REQ *req); +// X509_REQ_verify checks that |req| has a valid signature by |pkey|. It returns +// one if the signature is valid and zero otherwise. +OPENSSL_EXPORT int X509_REQ_verify(X509_REQ *req, EVP_PKEY *pkey); + // Issuing certificate requests. // @@ -771,6 +823,55 @@ OPENSSL_EXPORT int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name); // and internally copies and updates reference counts as needed. OPENSSL_EXPORT int X509_REQ_set_pubkey(X509_REQ *req, EVP_PKEY *pkey); +// X509_REQ_delete_attr removes the attribute at index |loc| in |req|. It +// returns the removed attribute to the caller, or NULL if |loc| was out of +// bounds. If non-NULL, the caller must release the result with +// |X509_ATTRIBUTE_free| when done. It is also safe, but not necessary, to call +// |X509_ATTRIBUTE_free| if the result is NULL. +OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); + +// X509_REQ_add1_attr appends a copy of |attr| to |req|'s list of attributes. It +// returns one on success and zero on error. +OPENSSL_EXPORT int X509_REQ_add1_attr(X509_REQ *req, + const X509_ATTRIBUTE *attr); + +// X509_REQ_add1_attr_by_OBJ appends a new attribute to |req| with type |obj|. +// It returns one on success and zero on error. The value is determined by +// |X509_ATTRIBUTE_set1_data|. +// +// WARNING: The interpretation of |attrtype|, |data|, and |len| is complex and +// error-prone. See |X509_ATTRIBUTE_set1_data| for details. +OPENSSL_EXPORT int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, + int attrtype, + const unsigned char *data, + int len); + +// X509_REQ_add1_attr_by_NID behaves like |X509_REQ_add1_attr_by_OBJ| except the +// attribute type is determined by |nid|. +OPENSSL_EXPORT int X509_REQ_add1_attr_by_NID(X509_REQ *req, int nid, + int attrtype, + const unsigned char *data, + int len); + +// X509_REQ_add1_attr_by_txt behaves like |X509_REQ_add1_attr_by_OBJ| except the +// attribute type is determined by calling |OBJ_txt2obj| with |attrname|. +OPENSSL_EXPORT int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int attrtype, + const unsigned char *data, + int len); + +// X509_REQ_add_extensions_nid adds an attribute to |req| of type |nid|, to +// request the certificate extensions in |exts|. It returns one on success and +// zero on error. |nid| should be |NID_ext_req| or |NID_ms_ext_req|. +OPENSSL_EXPORT int X509_REQ_add_extensions_nid( + X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts, int nid); + +// X509_REQ_add_extensions behaves like |X509_REQ_add_extensions_nid|, using the +// standard |NID_ext_req| for the attribute type. +OPENSSL_EXPORT int X509_REQ_add_extensions( + X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts); + // X509_REQ_sign signs |req| with |pkey| and replaces the signature algorithm // and signature fields. It returns one on success and zero on error. This // function uses digest algorithm |md|, or |pkey|'s default if NULL. Other @@ -850,7 +951,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); @@ -938,25 +1039,28 @@ 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, - int loc, int set); + const uint8_t *bytes, + ossl_ssize_t len, int loc, + int set); // X509_NAME_add_entry_by_NID behaves like |X509_NAME_add_entry_by_OBJ| but sets // the entry's attribute type to |nid|, which should be one of the |NID_*| // constants. OPENSSL_EXPORT int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, const uint8_t *bytes, - int len, int loc, int set); + ossl_ssize_t len, int loc, + int set); // X509_NAME_add_entry_by_txt behaves like |X509_NAME_add_entry_by_OBJ| but sets // the entry's attribute type to |field|, which is passed to |OBJ_txt2obj|. OPENSSL_EXPORT int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, - const uint8_t *bytes, int len, - int loc, int set); + const uint8_t *bytes, + ossl_ssize_t len, int loc, + int set); // X509_NAME_ENTRY is an |ASN1_ITEM| whose ASN.1 type is AttributeTypeAndValue // (RFC 5280) and C type is |X509_NAME_ENTRY*|. @@ -970,7 +1074,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); @@ -1022,7 +1126,8 @@ OPENSSL_EXPORT ASN1_STRING *X509_NAME_ENTRY_get_data( // See |ASN1_STRING| for how to format ASN.1 types as an |ASN1_STRING|. If // |type| is |V_ASN1_UNDEF| the previous |ASN1_STRING| type is reused. OPENSSL_EXPORT int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *entry, int type, - const uint8_t *bytes, int len); + const uint8_t *bytes, + ossl_ssize_t len); // X509_NAME_ENTRY_set returns the zero-based index of the RDN which contains // |entry|. Consecutive entries with the same index are part of the same RDN. @@ -1038,19 +1143,20 @@ OPENSSL_EXPORT int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *entry); // object at |*out| instead of allocating a new one. OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ( X509_NAME_ENTRY **out, const ASN1_OBJECT *obj, int type, - const uint8_t *bytes, int len); + const uint8_t *bytes, ossl_ssize_t len); // X509_NAME_ENTRY_create_by_NID behaves like |X509_NAME_ENTRY_create_by_OBJ| // except the attribute type is |nid|, which should be one of the |NID_*| // constants. OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID( - X509_NAME_ENTRY **out, int nid, int type, const uint8_t *bytes, int len); + X509_NAME_ENTRY **out, int nid, int type, const uint8_t *bytes, + ossl_ssize_t len); // X509_NAME_ENTRY_create_by_txt behaves like |X509_NAME_ENTRY_create_by_OBJ| // except the attribute type is |field|, which is passed to |OBJ_txt2obj|. OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt( X509_NAME_ENTRY **out, const char *field, int type, const uint8_t *bytes, - int len); + ossl_ssize_t len); // Extensions. @@ -1073,15 +1179,14 @@ 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); -// 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, @@ -1149,7 +1254,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 +1340,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); @@ -1293,136 +1398,461 @@ OPENSSL_EXPORT void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); OPENSSL_EXPORT int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); -// Printing functions. +// Attributes. // -// The following functions output human-readable representations of -// X.509-related structures. They should only be used for debugging or logging -// and not parsed programmatically. - -// X509_signature_dump writes a human-readable representation of |sig| to |bio|, -// indented with |indent| spaces. It returns one on success and zero on error. -OPENSSL_EXPORT int X509_signature_dump(BIO *bio, const ASN1_STRING *sig, - int indent); +// Unlike certificates and CRLs, CSRs use a separate Attribute structure (RFC +// 2985, RFC 2986) for extensibility. This is represented by the library as +// |X509_ATTRIBUTE|. -// X509_signature_print writes a human-readable representation of |alg| and -// |sig| to |bio|. It returns one on success and zero on error. -OPENSSL_EXPORT int X509_signature_print(BIO *bio, const X509_ALGOR *alg, - const ASN1_STRING *sig); +DEFINE_STACK_OF(X509_ATTRIBUTE) +// X509_ATTRIBUTE is an |ASN1_ITEM| whose ASN.1 type is Attribute (RFC 2986) and +// C type is |X509_ATTRIBUTE*|. +DECLARE_ASN1_ITEM(X509_ATTRIBUTE) -// Convenience functions. +// X509_ATTRIBUTE_new returns a newly-allocated, empty |X509_ATTRIBUTE| object, +// or NULL on error. |X509_ATTRIBUTE_set1_*| may be used to finish initializing +// it. +OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_new(void); -// X509_pubkey_digest hashes the contents of the BIT STRING in |x509|'s -// subjectPublicKeyInfo field with |md| and writes the result to |out|. -// |EVP_MD_CTX_size| bytes are written, which is at most |EVP_MAX_MD_SIZE|. If -// |out_len| is not NULL, |*out_len| is set to the number of bytes written. This -// function returns one on success and zero on error. -// -// This hash omits the BIT STRING tag, length, and number of unused bits. It -// also omits the AlgorithmIdentifier which describes the key type. It -// corresponds to the OCSP KeyHash definition and is not suitable for other -// purposes. -OPENSSL_EXPORT int X509_pubkey_digest(const X509 *x509, const EVP_MD *md, - uint8_t *out, unsigned *out_len); +// X509_ATTRIBUTE_dup returns a newly-allocated copy of |attr|, or NULL on +// error. This function works by serializing the structure, so if |attr| is +// incomplete, it may fail. +OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_dup(const X509_ATTRIBUTE *attr); -// X509_digest hashes |x509|'s DER encoding with |md| and writes the result to -// |out|. |EVP_MD_CTX_size| bytes are written, which is at most -// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number -// of bytes written. This function returns one on success and zero on error. -// Note this digest covers the entire certificate, not just the signed portion. -OPENSSL_EXPORT int X509_digest(const X509 *x509, const EVP_MD *md, uint8_t *out, - unsigned *out_len); +// X509_ATTRIBUTE_free releases memory associated with |attr|. +OPENSSL_EXPORT void X509_ATTRIBUTE_free(X509_ATTRIBUTE *attr); -// X509_CRL_digest hashes |crl|'s DER encoding with |md| and writes the result -// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most -// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number -// of bytes written. This function returns one on success and zero on error. -// Note this digest covers the entire CRL, not just the signed portion. -OPENSSL_EXPORT int X509_CRL_digest(const X509_CRL *crl, const EVP_MD *md, - uint8_t *out, unsigned *out_len); +// d2i_X509_ATTRIBUTE parses up to |len| bytes from |*inp| as a DER-encoded +// Attribute (RFC 2986), as described in |d2i_SAMPLE|. +OPENSSL_EXPORT X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(X509_ATTRIBUTE **out, + const uint8_t **inp, + long len); -// X509_REQ_digest hashes |req|'s DER encoding with |md| and writes the result -// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most -// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number -// of bytes written. This function returns one on success and zero on error. -// Note this digest covers the entire certificate request, not just the signed -// portion. -OPENSSL_EXPORT int X509_REQ_digest(const X509_REQ *req, const EVP_MD *md, - uint8_t *out, unsigned *out_len); +// i2d_X509_ATTRIBUTE marshals |alg| as a DER-encoded Attribute (RFC 2986), as +// described in |i2d_SAMPLE|. +OPENSSL_EXPORT int i2d_X509_ATTRIBUTE(const X509_ATTRIBUTE *alg, + uint8_t **outp); -// X509_NAME_digest hashes |name|'s DER encoding with |md| and writes the result -// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most -// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number -// of bytes written. This function returns one on success and zero on error. -OPENSSL_EXPORT int X509_NAME_digest(const X509_NAME *name, const EVP_MD *md, - uint8_t *out, unsigned *out_len); +// X509_ATTRIBUTE_create returns a newly-allocated |X509_ATTRIBUTE|, or NULL on +// error. The attribute has type |nid| and contains a single value determined by +// |attrtype| and |value|, which are interpreted as in |ASN1_TYPE_set|. Note +// this function takes ownership of |value|. +OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype, + void *value); -// The following functions behave like the corresponding unsuffixed |d2i_*| -// functions, but read the result from |bp| instead. Callers using these -// functions with memory |BIO|s to parse structures already in memory should use -// |d2i_*| instead. -OPENSSL_EXPORT X509 *d2i_X509_bio(BIO *bp, X509 **x509); -OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); -OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); -OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); -OPENSSL_EXPORT RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); -OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); -OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); -OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); -OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); -OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); -OPENSSL_EXPORT X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); -OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio( - BIO *bp, PKCS8_PRIV_KEY_INFO **p8inf); -OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); -OPENSSL_EXPORT DH *d2i_DHparams_bio(BIO *bp, DH **dh); +// X509_ATTRIBUTE_create_by_NID returns a newly-allocated |X509_ATTRIBUTE| of +// type |nid|, or NULL on error. The value is determined as in +// |X509_ATTRIBUTE_set1_data|. +// +// If |attr| is non-NULL, the resulting |X509_ATTRIBUTE| is also written to +// |*attr|. If |*attr| was non-NULL when the function was called, |*attr| is +// reused instead of creating a new object. +// +// WARNING: The interpretation of |attrtype|, |data|, and |len| is complex and +// error-prone. See |X509_ATTRIBUTE_set1_data| for details. +// +// WARNING: The object reuse form is deprecated and may be removed in the +// future. It also currently incorrectly appends to the reused object's value +// set rather than overwriting it. +OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID( + X509_ATTRIBUTE **attr, int nid, int attrtype, const void *data, int len); -// d2i_PrivateKey_bio behaves like |d2i_AutoPrivateKey|, but reads from |bp| -// instead. -OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +// X509_ATTRIBUTE_create_by_OBJ behaves like |X509_ATTRIBUTE_create_by_NID| +// except the attribute's type is determined by |obj|. +OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ( + X509_ATTRIBUTE **attr, const ASN1_OBJECT *obj, int attrtype, + const void *data, int len); -// The following functions behave like the corresponding unsuffixed |i2d_*| -// functions, but write the result to |bp|. They return one on success and zero -// on error. Callers using them with memory |BIO|s to encode structures to -// memory should use |i2d_*| directly instead. -OPENSSL_EXPORT int i2d_X509_bio(BIO *bp, X509 *x509); -OPENSSL_EXPORT int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl); -OPENSSL_EXPORT int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req); -OPENSSL_EXPORT int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa); -OPENSSL_EXPORT int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa); -OPENSSL_EXPORT int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa); -OPENSSL_EXPORT int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); -OPENSSL_EXPORT int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); -OPENSSL_EXPORT int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); -OPENSSL_EXPORT int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); -OPENSSL_EXPORT int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8); -OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, - PKCS8_PRIV_KEY_INFO *p8inf); -OPENSSL_EXPORT int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); -OPENSSL_EXPORT int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); -OPENSSL_EXPORT int i2d_DHparams_bio(BIO *bp, const DH *dh); +// X509_ATTRIBUTE_create_by_txt behaves like |X509_ATTRIBUTE_create_by_NID| +// except the attribute's type is determined by calling |OBJ_txt2obj| with +// |attrname|. +OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt( + X509_ATTRIBUTE **attr, const char *attrname, int type, + const unsigned char *bytes, int len); -// i2d_PKCS8PrivateKeyInfo_bio encodes |key| as a PKCS#8 PrivateKeyInfo -// structure (see |EVP_marshal_private_key|) and writes the result to |bp|. It -// returns one on success and zero on error. -OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); +// X509_ATTRIBUTE_set1_object sets |attr|'s type to |obj|. It returns one on +// success and zero on error. +OPENSSL_EXPORT int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, + const ASN1_OBJECT *obj); -// The following functions behave like the corresponding |d2i_*_bio| functions, -// but read from |fp| instead. -OPENSSL_EXPORT X509 *d2i_X509_fp(FILE *fp, X509 **x509); -OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); -OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); -OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); -OPENSSL_EXPORT RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); -OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); -OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); -OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); -OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); -OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); -OPENSSL_EXPORT X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); -OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp( - FILE *fp, PKCS8_PRIV_KEY_INFO **p8inf); -OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +// X509_ATTRIBUTE_set1_data appends a value to |attr|'s value set and returns +// one on success or zero on error. The value is determined as follows: +// +// If |attrtype| is a |MBSTRING_*| constant, the value is an ASN.1 string. The +// string is determined by decoding |len| bytes from |data| in the encoding +// specified by |attrtype|, and then re-encoding it in a form appropriate for +// |attr|'s type. If |len| is -1, |strlen(data)| is used instead. See +// |ASN1_STRING_set_by_NID| for details. +// +// Otherwise, if |len| is not -1, the value is an ASN.1 string. |attrtype| is an +// |ASN1_STRING| type value and the |len| bytes from |data| are copied as the +// type-specific representation of |ASN1_STRING|. See |ASN1_STRING| for details. +// +// WARNING: If this form is used to construct a negative INTEGER or ENUMERATED, +// |attrtype| includes the |V_ASN1_NEG| flag for |ASN1_STRING|, but the function +// forgets to clear the flag for |ASN1_TYPE|. This matches OpenSSL but is +// probably a bug. For now, do not use this form with negative values. +// +// Otherwise, if |len| is -1, the value is constructed by passing |attrtype| and +// |data| to |ASN1_TYPE_set1|. That is, |attrtype| is an |ASN1_TYPE| type value, +// and |data| is cast to the corresponding pointer type. +// +// WARNING: Despite the name, this function appends to |attr|'s value set, +// rather than overwriting it. To overwrite the value set, create a new +// |X509_ATTRIBUTE| with |X509_ATTRIBUTE_new|. +// +// WARNING: If using the |MBSTRING_*| form, pass a length rather than relying on +// |strlen|. In particular, |strlen| will not behave correctly if the input is +// |MBSTRING_BMP| or |MBSTRING_UNIV|. +// +// WARNING: This function currently misinterprets |V_ASN1_OTHER| as an +// |MBSTRING_*| constant. This matches OpenSSL but means it is impossible to +// construct a value with a non-universal tag. +OPENSSL_EXPORT int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, + const void *data, int len); + +// X509_ATTRIBUTE_get0_data returns the |idx|th value of |attr| in a +// type-specific representation to |attrtype|, or NULL if out of bounds or the +// type does not match. |attrtype| is one of the type values in |ASN1_TYPE|. On +// match, the return value uses the same representation as |ASN1_TYPE_set0|. See +// |ASN1_TYPE| for details. +OPENSSL_EXPORT void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, + int attrtype, void *unused); + +// X509_ATTRIBUTE_count returns the number of values in |attr|. +OPENSSL_EXPORT int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr); + +// X509_ATTRIBUTE_get0_object returns the type of |attr|. +OPENSSL_EXPORT ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); + +// X509_ATTRIBUTE_get0_type returns the |idx|th value in |attr|, or NULL if out +// of bounds. Note this function returns one of |attr|'s values, not the type. +OPENSSL_EXPORT ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, + int idx); + + +// Printing functions. +// +// The following functions output human-readable representations of +// X.509-related structures. They should only be used for debugging or logging +// and not parsed programmatically. In many cases, the outputs are ambiguous, so +// attempting to parse them can lead to string injection vulnerabilities. + +// The following flags control |X509_print_ex| and |X509_REQ_print_ex|. + +// X509_FLAG_COMPAT disables all flags. It additionally causes names to be +// printed with a 16-byte indent. +#define X509_FLAG_COMPAT 0 + +// X509_FLAG_NO_HEADER skips a header identifying the type of object printed. +#define X509_FLAG_NO_HEADER 1L + +// X509_FLAG_NO_VERSION skips printing the X.509 version number. +#define X509_FLAG_NO_VERSION (1L << 1) + +// X509_FLAG_NO_SERIAL skips printing the serial number. It is ignored in +// |X509_REQ_print_fp|. +#define X509_FLAG_NO_SERIAL (1L << 2) + +// X509_FLAG_NO_SIGNAME skips printing the signature algorithm in the +// TBSCertificate. It is ignored in |X509_REQ_print_fp|. +#define X509_FLAG_NO_SIGNAME (1L << 3) + +// X509_FLAG_NO_ISSUER skips printing the issuer. +#define X509_FLAG_NO_ISSUER (1L << 4) + +// X509_FLAG_NO_ISSUER skips printing the notBefore and notAfter times. It is +// ignored in |X509_REQ_print_fp|. +#define X509_FLAG_NO_VALIDITY (1L << 5) + +// X509_FLAG_NO_ISSUER skips printing the subject. +#define X509_FLAG_NO_SUBJECT (1L << 6) + +// X509_FLAG_NO_PUBKEY skips printing the public key. +#define X509_FLAG_NO_PUBKEY (1L << 7) + +// X509_FLAG_NO_EXTENSIONS skips printing the extension list. It is ignored in +// |X509_REQ_print_fp|. CSRs instead have attributes, which is controlled by +// |X509_FLAG_NO_ATTRIBUTES|. +#define X509_FLAG_NO_EXTENSIONS (1L << 8) + +// X509_FLAG_NO_SIGDUMP skips printing the signature and outer signature +// algorithm. +#define X509_FLAG_NO_SIGDUMP (1L << 9) + +// X509_FLAG_NO_AUX skips printing auxiliary properties. (See |d2i_X509_AUX| and +// related functions.) +#define X509_FLAG_NO_AUX (1L << 10) + +// X509_FLAG_NO_ATTRIBUTES skips printing CSR attributes. It does nothing for +// certificates and CRLs. +#define X509_FLAG_NO_ATTRIBUTES (1L << 11) + +// X509_FLAG_NO_IDS skips printing the issuerUniqueID and subjectUniqueID in a +// certificate. It is ignored in |X509_REQ_print_fp|. +#define X509_FLAG_NO_IDS (1L << 12) + +// X509_print_ex writes a human-readable representation of |x| to |bp|. It +// returns one on success and zero on error. |nmflags| is the flags parameter +// for |X509_NAME_print_ex| when printing the subject and issuer. |cflag| should +// be some combination of the |X509_FLAG_*| constants. +OPENSSL_EXPORT int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); + +// X509_print_ex_fp behaves like |X509_print_ex| but writes to |fp|. +OPENSSL_EXPORT int X509_print_ex_fp(FILE *fp, X509 *x, unsigned long nmflag, + unsigned long cflag); + +// X509_print calls |X509_print_ex| with |XN_FLAG_COMPAT| and |X509_FLAG_COMPAT| +// flags. +OPENSSL_EXPORT int X509_print(BIO *bp, X509 *x); + +// X509_print_fp behaves like |X509_print| but writes to |fp|. +OPENSSL_EXPORT int X509_print_fp(FILE *fp, X509 *x); + +// X509_CRL_print writes a human-readable representation of |x| to |bp|. It +// returns one on success and zero on error. +OPENSSL_EXPORT int X509_CRL_print(BIO *bp, X509_CRL *x); + +// X509_CRL_print_fp behaves like |X509_CRL_print| but writes to |fp|. +OPENSSL_EXPORT int X509_CRL_print_fp(FILE *fp, X509_CRL *x); + +// X509_REQ_print_ex writes a human-readable representation of |x| to |bp|. It +// returns one on success and zero on error. |nmflags| is the flags parameter +// for |X509_NAME_print_ex|, when printing the subject. |cflag| should be some +// combination of the |X509_FLAG_*| constants. +OPENSSL_EXPORT int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, + unsigned long cflag); + +// X509_REQ_print calls |X509_REQ_print_ex| with |XN_FLAG_COMPAT| and +// |X509_FLAG_COMPAT| flags. +OPENSSL_EXPORT int X509_REQ_print(BIO *bp, X509_REQ *req); + +// X509_REQ_print_fp behaves like |X509_REQ_print| but writes to |fp|. +OPENSSL_EXPORT int X509_REQ_print_fp(FILE *fp, X509_REQ *req); + +// The following flags are control |X509_NAME_print_ex|. They must not collide +// with |ASN1_STRFLGS_*|. +// +// TODO(davidben): This is far, far too many options and most of them are +// useless. Trim this down. + +// XN_FLAG_COMPAT prints with |X509_NAME_print|'s format and return value +// convention. +#define XN_FLAG_COMPAT 0 + +// XN_FLAG_SEP_MASK determines the separators to use between attributes. +#define XN_FLAG_SEP_MASK (0xf << 16) + +// XN_FLAG_SEP_COMMA_PLUS separates RDNs with "," and attributes within an RDN +// with "+", as in RFC 2253. +#define XN_FLAG_SEP_COMMA_PLUS (1 << 16) + +// XN_FLAG_SEP_CPLUS_SPC behaves like |XN_FLAG_SEP_COMMA_PLUS| but adds spaces +// between the separators. +#define XN_FLAG_SEP_CPLUS_SPC (2 << 16) + +// XN_FLAG_SEP_SPLUS_SPC separates RDNs with "; " and attributes within an RDN +// with " + ". +#define XN_FLAG_SEP_SPLUS_SPC (3 << 16) + +// XN_FLAG_SEP_MULTILINE prints each attribute on one line. +#define XN_FLAG_SEP_MULTILINE (4 << 16) + +// XN_FLAG_DN_REV prints RDNs in reverse, from least significant to most +// significant, as RFC 2253. +#define XN_FLAG_DN_REV (1 << 20) + +// XN_FLAG_FN_MASK determines how attribute types are displayed. +#define XN_FLAG_FN_MASK (0x3 << 21) + +// XN_FLAG_FN_SN uses the attribute type's short name, when available. +#define XN_FLAG_FN_SN 0 + +// XN_FLAG_SPC_EQ wraps the "=" operator with spaces when printing attributes. +#define XN_FLAG_SPC_EQ (1 << 23) + +// XN_FLAG_DUMP_UNKNOWN_FIELDS causes unknown attribute types to be printed in +// hex, as in RFC 2253. +#define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +// XN_FLAG_RFC2253 prints like RFC 2253. +#define XN_FLAG_RFC2253 \ + (ASN1_STRFLGS_RFC2253 | XN_FLAG_SEP_COMMA_PLUS | XN_FLAG_DN_REV | \ + XN_FLAG_FN_SN | XN_FLAG_DUMP_UNKNOWN_FIELDS) + +// XN_FLAG_ONELINE prints a one-line representation of the name. +#define XN_FLAG_ONELINE \ + (ASN1_STRFLGS_RFC2253 | ASN1_STRFLGS_ESC_QUOTE | XN_FLAG_SEP_CPLUS_SPC | \ + XN_FLAG_SPC_EQ | XN_FLAG_FN_SN) + +// X509_NAME_print_ex writes a human-readable representation of |nm| to |out|. +// Each line of output is indented by |indent| spaces. It returns the number of +// bytes written on success, and -1 on error. If |out| is NULL, it returns the +// number of bytes it would have written but does not write anything. |flags| +// should be some combination of |XN_FLAG_*| and |ASN1_STRFLGS_*| values and +// determines the output. If unsure, use |XN_FLAG_RFC2253|. +// +// If |flags| is |XN_FLAG_COMPAT|, or zero, this function calls +// |X509_NAME_print| instead. In that case, it returns one on success, rather +// than the output length. +OPENSSL_EXPORT int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent, + unsigned long flags); + +// X509_NAME_print prints a human-readable representation of |name| to |bp|. It +// returns one on success and zero on error. |obase| is ignored. +// +// This function outputs a legacy format that does not correctly handle string +// encodings and other cases. Prefer |X509_NAME_print_ex| if printing a name for +// debugging purposes. +OPENSSL_EXPORT int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase); + +// X509_NAME_oneline writes a human-readable representation to |name| to a +// buffer as a NUL-terminated C string. +// +// If |buf| is NULL, returns a newly-allocated buffer containing the result on +// success, or NULL on error. The buffer must be released with |OPENSSL_free| +// when done. +// +// If |buf| is non-NULL, at most |size| bytes of output are written to |buf| +// instead. |size| includes the trailing NUL. The function then returns |buf| on +// success or NULL on error. If the output does not fit in |size| bytes, the +// output is silently truncated at an attribute boundary. +// +// This function outputs a legacy format that does not correctly handle string +// encodings and other cases. Prefer |X509_NAME_print_ex| if printing a name for +// debugging purposes. +OPENSSL_EXPORT char *X509_NAME_oneline(const X509_NAME *name, char *buf, int size); + +// X509_NAME_print_ex_fp behaves like |X509_NAME_print_ex| but writes to |fp|. +OPENSSL_EXPORT int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, + int indent, unsigned long flags); + +// X509_signature_dump writes a human-readable representation of |sig| to |bio|, +// indented with |indent| spaces. It returns one on success and zero on error. +OPENSSL_EXPORT int X509_signature_dump(BIO *bio, const ASN1_STRING *sig, + int indent); + +// X509_signature_print writes a human-readable representation of |alg| and +// |sig| to |bio|. It returns one on success and zero on error. +OPENSSL_EXPORT int X509_signature_print(BIO *bio, const X509_ALGOR *alg, + const ASN1_STRING *sig); + + +// Convenience functions. + +// X509_pubkey_digest hashes the contents of the BIT STRING in |x509|'s +// subjectPublicKeyInfo field with |md| and writes the result to |out|. +// |EVP_MD_CTX_size| bytes are written, which is at most |EVP_MAX_MD_SIZE|. If +// |out_len| is not NULL, |*out_len| is set to the number of bytes written. This +// function returns one on success and zero on error. +// +// This hash omits the BIT STRING tag, length, and number of unused bits. It +// also omits the AlgorithmIdentifier which describes the key type. It +// corresponds to the OCSP KeyHash definition and is not suitable for other +// purposes. +OPENSSL_EXPORT int X509_pubkey_digest(const X509 *x509, const EVP_MD *md, + uint8_t *out, unsigned *out_len); + +// X509_digest hashes |x509|'s DER encoding with |md| and writes the result to +// |out|. |EVP_MD_CTX_size| bytes are written, which is at most +// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number +// of bytes written. This function returns one on success and zero on error. +// Note this digest covers the entire certificate, not just the signed portion. +OPENSSL_EXPORT int X509_digest(const X509 *x509, const EVP_MD *md, uint8_t *out, + unsigned *out_len); + +// X509_CRL_digest hashes |crl|'s DER encoding with |md| and writes the result +// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most +// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number +// of bytes written. This function returns one on success and zero on error. +// Note this digest covers the entire CRL, not just the signed portion. +OPENSSL_EXPORT int X509_CRL_digest(const X509_CRL *crl, const EVP_MD *md, + uint8_t *out, unsigned *out_len); + +// X509_REQ_digest hashes |req|'s DER encoding with |md| and writes the result +// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most +// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number +// of bytes written. This function returns one on success and zero on error. +// Note this digest covers the entire certificate request, not just the signed +// portion. +OPENSSL_EXPORT int X509_REQ_digest(const X509_REQ *req, const EVP_MD *md, + uint8_t *out, unsigned *out_len); + +// X509_NAME_digest hashes |name|'s DER encoding with |md| and writes the result +// to |out|. |EVP_MD_CTX_size| bytes are written, which is at most +// |EVP_MAX_MD_SIZE|. If |out_len| is not NULL, |*out_len| is set to the number +// of bytes written. This function returns one on success and zero on error. +OPENSSL_EXPORT int X509_NAME_digest(const X509_NAME *name, const EVP_MD *md, + uint8_t *out, unsigned *out_len); + +// The following functions behave like the corresponding unsuffixed |d2i_*| +// functions, but read the result from |bp| instead. Callers using these +// functions with memory |BIO|s to parse structures already in memory should use +// |d2i_*| instead. +OPENSSL_EXPORT X509 *d2i_X509_bio(BIO *bp, X509 **x509); +OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); +OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); +OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); +OPENSSL_EXPORT RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); +OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); +OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +OPENSSL_EXPORT X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); +OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio( + BIO *bp, PKCS8_PRIV_KEY_INFO **p8inf); +OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); +OPENSSL_EXPORT DH *d2i_DHparams_bio(BIO *bp, DH **dh); + +// d2i_PrivateKey_bio behaves like |d2i_AutoPrivateKey|, but reads from |bp| +// instead. +OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); + +// The following functions behave like the corresponding unsuffixed |i2d_*| +// functions, but write the result to |bp|. They return one on success and zero +// on error. Callers using them with memory |BIO|s to encode structures to +// memory should use |i2d_*| directly instead. +OPENSSL_EXPORT int i2d_X509_bio(BIO *bp, X509 *x509); +OPENSSL_EXPORT int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl); +OPENSSL_EXPORT int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req); +OPENSSL_EXPORT int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa); +OPENSSL_EXPORT int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa); +OPENSSL_EXPORT int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa); +OPENSSL_EXPORT int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa); +OPENSSL_EXPORT int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa); +OPENSSL_EXPORT int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey); +OPENSSL_EXPORT int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey); +OPENSSL_EXPORT int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8); +OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO *p8inf); +OPENSSL_EXPORT int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey); +OPENSSL_EXPORT int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey); +OPENSSL_EXPORT int i2d_DHparams_bio(BIO *bp, const DH *dh); + +// i2d_PKCS8PrivateKeyInfo_bio encodes |key| as a PKCS#8 PrivateKeyInfo +// structure (see |EVP_marshal_private_key|) and writes the result to |bp|. It +// returns one on success and zero on error. +OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key); + +// The following functions behave like the corresponding |d2i_*_bio| functions, +// but read from |fp| instead. +OPENSSL_EXPORT X509 *d2i_X509_fp(FILE *fp, X509 **x509); +OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); +OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); +OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); +OPENSSL_EXPORT RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); +OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); +OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); +OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +OPENSSL_EXPORT X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); +OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp( + FILE *fp, PKCS8_PRIV_KEY_INFO **p8inf); +OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); // The following functions behave like the corresponding |i2d_*_bio| functions, @@ -1456,6 +1886,39 @@ OPENSSL_EXPORT X509 *X509_find_by_issuer_and_serial(const STACK_OF(X509) *sk, OPENSSL_EXPORT X509 *X509_find_by_subject(const STACK_OF(X509) *sk, X509_NAME *name); +// X509_cmp_time 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. If |t| is NULL, it uses the current time instead of |*t|. +// +// WARNING: Unlike most comparison functions, this function returns zero on +// 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); + +// X509_time_adj calls |X509_time_adj_ex| with |offset_day| equal to zero. +OPENSSL_EXPORT ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec, + time_t *t); + +// X509_time_adj_ex behaves like |ASN1_TIME_adj|, but adds an offset to |*t|. If +// |t| is NULL, it uses the current time instead of |*t|. +OPENSSL_EXPORT ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, int offset_day, + long offset_sec, time_t *t); + +// X509_gmtime_adj behaves like |X509_time_adj_ex| but adds |offset_sec| to the +// current time. +OPENSSL_EXPORT ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long offset_sec); + // ex_data functions. // @@ -1577,8 +2040,6 @@ struct X509_algor_st { #define X509v3_KU_DECIPHER_ONLY 0x8000 #define X509v3_KU_UNDEF 0xffff -DEFINE_STACK_OF(X509_ATTRIBUTE) - // This stuff is certificate "auxiliary info" // it contains details which are useful in certificate // stores and databases. When used this is tagged onto @@ -1624,77 +2085,9 @@ DEFINE_STACK_OF(X509_TRUST) // check_trust return codes -#define X509_TRUST_TRUSTED 1 -#define X509_TRUST_REJECTED 2 -#define X509_TRUST_UNTRUSTED 3 - -// Flags for X509_print_ex() - -#define X509_FLAG_COMPAT 0 -#define X509_FLAG_NO_HEADER 1L -#define X509_FLAG_NO_VERSION (1L << 1) -#define X509_FLAG_NO_SERIAL (1L << 2) -#define X509_FLAG_NO_SIGNAME (1L << 3) -#define X509_FLAG_NO_ISSUER (1L << 4) -#define X509_FLAG_NO_VALIDITY (1L << 5) -#define X509_FLAG_NO_SUBJECT (1L << 6) -#define X509_FLAG_NO_PUBKEY (1L << 7) -#define X509_FLAG_NO_EXTENSIONS (1L << 8) -#define X509_FLAG_NO_SIGDUMP (1L << 9) -#define X509_FLAG_NO_AUX (1L << 10) -#define X509_FLAG_NO_ATTRIBUTES (1L << 11) -#define X509_FLAG_NO_IDS (1L << 12) - -// Flags specific to X509_NAME_print_ex(). These flags must not collide with -// |ASN1_STRFLGS_*|. - -// The field separator information - -#define XN_FLAG_SEP_MASK (0xf << 16) - -#define XN_FLAG_COMPAT 0 // Traditional SSLeay: use old X509_NAME_print -#define XN_FLAG_SEP_COMMA_PLUS (1 << 16) // RFC 2253 ,+ -#define XN_FLAG_SEP_CPLUS_SPC (2 << 16) // ,+ spaced: more readable -#define XN_FLAG_SEP_SPLUS_SPC (3 << 16) // ;+ spaced -#define XN_FLAG_SEP_MULTILINE (4 << 16) // One line per field - -#define XN_FLAG_DN_REV (1 << 20) // Reverse DN order - -// How the field name is shown - -#define XN_FLAG_FN_MASK (0x3 << 21) - -#define XN_FLAG_FN_SN 0 // Object short name -#define XN_FLAG_FN_LN (1 << 21) // Object long name -#define XN_FLAG_FN_OID (2 << 21) // Always use OIDs -#define XN_FLAG_FN_NONE (3 << 21) // No field names - -#define XN_FLAG_SPC_EQ (1 << 23) // Put spaces round '=' - -// This determines if we dump fields we don't recognise: -// RFC 2253 requires this. - -#define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) - -#define XN_FLAG_FN_ALIGN (1 << 25) // Align field names to 20 characters - -// Complete set of RFC 2253 flags - -#define XN_FLAG_RFC2253 \ - (ASN1_STRFLGS_RFC2253 | XN_FLAG_SEP_COMMA_PLUS | XN_FLAG_DN_REV | \ - XN_FLAG_FN_SN | XN_FLAG_DUMP_UNKNOWN_FIELDS) - -// readable oneline form - -#define XN_FLAG_ONELINE \ - (ASN1_STRFLGS_RFC2253 | ASN1_STRFLGS_ESC_QUOTE | XN_FLAG_SEP_CPLUS_SPC | \ - XN_FLAG_SPC_EQ | XN_FLAG_FN_SN) - -// readable multiline form - -#define XN_FLAG_MULTILINE \ - (ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB | XN_FLAG_SEP_MULTILINE | \ - XN_FLAG_SPC_EQ | XN_FLAG_FN_LN | XN_FLAG_FN_ALIGN) +#define X509_TRUST_TRUSTED 1 +#define X509_TRUST_REJECTED 2 +#define X509_TRUST_UNTRUSTED 3 DEFINE_STACK_OF(X509_REVOKED) @@ -1770,20 +2163,6 @@ OPENSSL_EXPORT void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **out_alg, // a default description. OPENSSL_EXPORT const char *X509_verify_cert_error_string(long err); -// X509_verify checks that |x509| has a valid signature by |pkey|. It returns -// one if the signature is valid and zero otherwise. Note this function only -// checks the signature itself and does not perform a full certificate -// validation. -OPENSSL_EXPORT int X509_verify(X509 *x509, EVP_PKEY *pkey); - -// X509_REQ_verify checks that |req| has a valid signature by |pkey|. It returns -// one if the signature is valid and zero otherwise. -OPENSSL_EXPORT int X509_REQ_verify(X509_REQ *req, EVP_PKEY *pkey); - -// X509_CRL_verify checks that |crl| has a valid signature by |pkey|. It returns -// one if the signature is valid and zero otherwise. -OPENSSL_EXPORT int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *pkey); - // NETSCAPE_SPKI_verify checks that |spki| has a valid signature by |pkey|. It // returns one if the signature is valid and zero otherwise. OPENSSL_EXPORT int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *spki, EVP_PKEY *pkey); @@ -1794,7 +2173,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 @@ -1820,41 +2199,11 @@ OPENSSL_EXPORT int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *spki, OPENSSL_EXPORT int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *spki, EVP_PKEY *pkey, const EVP_MD *md); -// X509_ATTRIBUTE_dup returns a newly-allocated copy of |xa|, or NULL on error. -// This function works by serializing the structure, so if |xa| is incomplete, -// it may fail. -OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_dup(const X509_ATTRIBUTE *xa); - // X509_REVOKED_dup returns a newly-allocated copy of |rev|, or NULL on error. // This function works by serializing the structure, so if |rev| is incomplete, // it may fail. OPENSSL_EXPORT X509_REVOKED *X509_REVOKED_dup(const X509_REVOKED *rev); -// X509_cmp_time 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. If |t| is NULL, it uses the current time instead of |*t|. -// -// WARNING: Unlike most comparison functions, this function returns zero on -// error, not equality. -OPENSSL_EXPORT int X509_cmp_time(const ASN1_TIME *s, time_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); - -// X509_time_adj calls |X509_time_adj_ex| with |offset_day| equal to zero. -OPENSSL_EXPORT ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec, - time_t *t); - -// X509_time_adj_ex behaves like |ASN1_TIME_adj|, but adds an offset to |*t|. If -// |t| is NULL, it uses the current time instead of |*t|. -OPENSSL_EXPORT ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, int offset_day, - long offset_sec, time_t *t); - -// X509_gmtime_adj behaves like |X509_time_adj_ex| but adds |offset_sec| to the -// current time. -OPENSSL_EXPORT ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long offset_sec); - OPENSSL_EXPORT const char *X509_get_default_cert_area(void); OPENSSL_EXPORT const char *X509_get_default_cert_dir(void); OPENSSL_EXPORT const char *X509_get_default_cert_file(void); @@ -1877,15 +2226,6 @@ OPENSSL_EXPORT EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key); DECLARE_ASN1_FUNCTIONS_const(X509_SIG) -DECLARE_ASN1_FUNCTIONS_const(X509_ATTRIBUTE) - -// X509_ATTRIBUTE_create returns a newly-allocated |X509_ATTRIBUTE|, or NULL on -// error. The attribute has type |nid| and contains a single value determined by -// |attrtype| and |value|, which are interpreted as in |ASN1_TYPE_set|. Note -// this function takes ownership of |value|. -OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype, - void *value); - OPENSSL_EXPORT int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj); OPENSSL_EXPORT int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj); OPENSSL_EXPORT void X509_trust_clear(X509 *x); @@ -1910,7 +2250,6 @@ DECLARE_ASN1_FUNCTIONS_const(NETSCAPE_SPKAC) OPENSSL_EXPORT X509_INFO *X509_INFO_new(void); OPENSSL_EXPORT void X509_INFO_free(X509_INFO *a); -OPENSSL_EXPORT char *X509_NAME_oneline(const X509_NAME *a, char *buf, int size); OPENSSL_EXPORT int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, unsigned char *md, unsigned int *len); @@ -1933,93 +2272,6 @@ OPENSSL_EXPORT int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, ASN1_BIT_STRING *signature, void *asn, EVP_MD_CTX *ctx); -// X509_REQ_extension_nid returns one if |nid| is a supported CSR attribute type -// for carrying extensions and zero otherwise. The supported types are -// |NID_ext_req| (pkcs-9-at-extensionRequest from RFC 2985) and |NID_ms_ext_req| -// (a Microsoft szOID_CERT_EXTENSIONS variant). -OPENSSL_EXPORT int X509_REQ_extension_nid(int nid); - -// X509_REQ_get_extensions decodes the list of requested extensions in |req| and -// returns a newly-allocated |STACK_OF(X509_EXTENSION)| containing the result. -// It returns NULL on error, or if |req| did not request extensions. -// -// This function supports both pkcs-9-at-extensionRequest from RFC 2985 and the -// Microsoft szOID_CERT_EXTENSIONS variant. -OPENSSL_EXPORT STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req); - -// X509_REQ_add_extensions_nid adds an attribute to |req| of type |nid|, to -// request the certificate extensions in |exts|. It returns one on success and -// zero on error. |nid| should be |NID_ext_req| or |NID_ms_ext_req|. -OPENSSL_EXPORT int X509_REQ_add_extensions_nid( - X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts, int nid); - -// X509_REQ_add_extensions behaves like |X509_REQ_add_extensions_nid|, using the -// standard |NID_ext_req| for the attribute type. -OPENSSL_EXPORT int X509_REQ_add_extensions( - X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts); - -// X509_REQ_get_attr_count returns the number of attributes in |req|. -OPENSSL_EXPORT int X509_REQ_get_attr_count(const X509_REQ *req); - -// X509_REQ_get_attr_by_NID returns the index of the attribute in |req| of type -// |nid|, or a negative number if not found. If found, callers can use -// |X509_REQ_get_attr| to look up the attribute by index. -// -// If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers -// can thus loop over all matching attributes by first passing -1 and then -// passing the previously-returned value until no match is returned. -OPENSSL_EXPORT int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, - int lastpos); - -// X509_REQ_get_attr_by_OBJ behaves like |X509_REQ_get_attr_by_NID| but looks -// for attributes of type |obj|. -OPENSSL_EXPORT int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, - const ASN1_OBJECT *obj, - int lastpos); - -// X509_REQ_get_attr returns the attribute at index |loc| in |req|, or NULL if -// out of bounds. -OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); - -// X509_REQ_delete_attr removes the attribute at index |loc| in |req|. It -// returns the removed attribute to the caller, or NULL if |loc| was out of -// bounds. If non-NULL, the caller must release the result with -// |X509_ATTRIBUTE_free| when done. It is also safe, but not necessary, to call -// |X509_ATTRIBUTE_free| if the result is NULL. -OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); - -// X509_REQ_add1_attr appends a copy of |attr| to |req|'s list of attributes. It -// returns one on success and zero on error. -// -// TODO(https://crbug.com/boringssl/407): |attr| should be const. -OPENSSL_EXPORT int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); - -// X509_REQ_add1_attr_by_OBJ appends a new attribute to |req| with type |obj|. -// It returns one on success and zero on error. The value is determined by -// |X509_ATTRIBUTE_set1_data|. -// -// WARNING: The interpretation of |attrtype|, |data|, and |len| is complex and -// error-prone. See |X509_ATTRIBUTE_set1_data| for details. -OPENSSL_EXPORT int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, - const ASN1_OBJECT *obj, - int attrtype, - const unsigned char *data, - int len); - -// X509_REQ_add1_attr_by_NID behaves like |X509_REQ_add1_attr_by_OBJ| except the -// attribute type is determined by |nid|. -OPENSSL_EXPORT int X509_REQ_add1_attr_by_NID(X509_REQ *req, int nid, - int attrtype, - const unsigned char *data, - int len); - -// X509_REQ_add1_attr_by_txt behaves like |X509_REQ_add1_attr_by_OBJ| except the -// attribute type is determined by calling |OBJ_txt2obj| with |attrname|. -OPENSSL_EXPORT int X509_REQ_add1_attr_by_txt(X509_REQ *req, - const char *attrname, int attrtype, - const unsigned char *data, - int len); - OPENSSL_EXPORT int X509_CRL_sort(X509_CRL *crl); // X509_REVOKED_get0_serialNumber returns the serial number of the certificate @@ -2071,24 +2323,6 @@ OPENSSL_EXPORT unsigned long X509_NAME_hash_old(X509_NAME *x); OPENSSL_EXPORT int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); OPENSSL_EXPORT int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); -OPENSSL_EXPORT int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag, - unsigned long cflag); -OPENSSL_EXPORT int X509_print_fp(FILE *bp, X509 *x); -OPENSSL_EXPORT int X509_CRL_print_fp(FILE *bp, X509_CRL *x); -OPENSSL_EXPORT int X509_REQ_print_fp(FILE *bp, X509_REQ *req); -OPENSSL_EXPORT int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, - int indent, unsigned long flags); - -OPENSSL_EXPORT int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase); -OPENSSL_EXPORT int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent, - unsigned long flags); -OPENSSL_EXPORT int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, - unsigned long cflag); -OPENSSL_EXPORT int X509_print(BIO *bp, X509 *x); -OPENSSL_EXPORT int X509_CRL_print(BIO *bp, X509_CRL *x); -OPENSSL_EXPORT int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, - unsigned long cflag); -OPENSSL_EXPORT int X509_REQ_print(BIO *bp, X509_REQ *req); // X509_get_ext_d2i behaves like |X509V3_get_d2i| but looks for the extension in // |x509|'s extension list. @@ -2184,153 +2418,6 @@ OPENSSL_EXPORT int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, unsigned long flags); -// X509at_get_attr_count returns the number of attributes in |x|. -OPENSSL_EXPORT int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); - -// X509at_get_attr_by_NID returns the index of the attribute in |x| of type -// |nid|, or a negative number if not found. If found, callers can use -// |X509at_get_attr| to look up the attribute by index. -// -// If |lastpos| is non-negative, it begins searching at |lastpos| + 1. Callers -// can thus loop over all matching attributes by first passing -1 and then -// passing the previously-returned value until no match is returned. -OPENSSL_EXPORT int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, - int nid, int lastpos); - -// X509at_get_attr_by_OBJ behaves like |X509at_get_attr_by_NID| but looks for -// attributes of type |obj|. -OPENSSL_EXPORT int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, - const ASN1_OBJECT *obj, int lastpos); - -// X509at_get_attr returns the attribute at index |loc| in |x|, or NULL if -// out of bounds. -OPENSSL_EXPORT X509_ATTRIBUTE *X509at_get_attr( - const STACK_OF(X509_ATTRIBUTE) *x, int loc); - -// X509at_delete_attr removes the attribute at index |loc| in |x|. It returns -// the removed attribute to the caller, or NULL if |loc| was out of bounds. If -// non-NULL, the caller must release the result with |X509_ATTRIBUTE_free| when -// done. It is also safe, but not necessary, to call |X509_ATTRIBUTE_free| if -// the result is NULL. -OPENSSL_EXPORT X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, - int loc); - -// X509at_add1_attr appends a copy of |attr| to the attribute list in |*x|. If -// |*x| is NULL, it allocates a new |STACK_OF(X509_ATTRIBUTE)| to hold the copy -// and sets |*x| to the new list. It returns |*x| on success and NULL on error. -// The caller retains ownership of |attr| and can release it independently of -// |*x|. -OPENSSL_EXPORT STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr( - STACK_OF(X509_ATTRIBUTE) **x, X509_ATTRIBUTE *attr); - -// X509at_add1_attr_by_OBJ behaves like |X509at_add1_attr|, but adds an -// attribute created by |X509_ATTRIBUTE_create_by_OBJ|. -OPENSSL_EXPORT STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ( - STACK_OF(X509_ATTRIBUTE) **x, const ASN1_OBJECT *obj, int type, - const unsigned char *bytes, int len); - -// X509at_add1_attr_by_NID behaves like |X509at_add1_attr|, but adds an -// attribute created by |X509_ATTRIBUTE_create_by_NID|. -OPENSSL_EXPORT STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID( - STACK_OF(X509_ATTRIBUTE) **x, int nid, int type, const unsigned char *bytes, - int len); - -// X509at_add1_attr_by_txt behaves like |X509at_add1_attr|, but adds an -// attribute created by |X509_ATTRIBUTE_create_by_txt|. -OPENSSL_EXPORT STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt( - STACK_OF(X509_ATTRIBUTE) **x, const char *attrname, int type, - const unsigned char *bytes, int len); - -// X509_ATTRIBUTE_create_by_NID returns a newly-allocated |X509_ATTRIBUTE| of -// type |nid|, or NULL on error. The value is determined as in -// |X509_ATTRIBUTE_set1_data|. -// -// If |attr| is non-NULL, the resulting |X509_ATTRIBUTE| is also written to -// |*attr|. If |*attr| was non-NULL when the function was called, |*attr| is -// reused instead of creating a new object. -// -// WARNING: The interpretation of |attrtype|, |data|, and |len| is complex and -// error-prone. See |X509_ATTRIBUTE_set1_data| for details. -// -// WARNING: The object reuse form is deprecated and may be removed in the -// future. It also currently incorrectly appends to the reused object's value -// set rather than overwriting it. -OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID( - X509_ATTRIBUTE **attr, int nid, int attrtype, const void *data, int len); - -// X509_ATTRIBUTE_create_by_OBJ behaves like |X509_ATTRIBUTE_create_by_NID| -// except the attribute's type is determined by |obj|. -OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ( - X509_ATTRIBUTE **attr, const ASN1_OBJECT *obj, int attrtype, - const void *data, int len); - -// X509_ATTRIBUTE_create_by_txt behaves like |X509_ATTRIBUTE_create_by_NID| -// except the attribute's type is determined by calling |OBJ_txt2obj| with -// |attrname|. -OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt( - X509_ATTRIBUTE **attr, const char *attrname, int type, - const unsigned char *bytes, int len); - -// X509_ATTRIBUTE_set1_object sets |attr|'s type to |obj|. It returns one on -// success and zero on error. -OPENSSL_EXPORT int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, - const ASN1_OBJECT *obj); - -// X509_ATTRIBUTE_set1_data appends a value to |attr|'s value set and returns -// one on success or zero on error. The value is determined as follows: -// -// If |attrtype| is a |MBSTRING_*| constant, the value is an ASN.1 string. The -// string is determined by decoding |len| bytes from |data| in the encoding -// specified by |attrtype|, and then re-encoding it in a form appropriate for -// |attr|'s type. If |len| is -1, |strlen(data)| is used instead. See -// |ASN1_STRING_set_by_NID| for details. -// -// Otherwise, if |len| is not -1, the value is an ASN.1 string. |attrtype| is an -// |ASN1_STRING| type value and the |len| bytes from |data| are copied as the -// type-specific representation of |ASN1_STRING|. See |ASN1_STRING| for details. -// -// WARNING: If this form is used to construct a negative INTEGER or ENUMERATED, -// |attrtype| includes the |V_ASN1_NEG| flag for |ASN1_STRING|, but the function -// forgets to clear the flag for |ASN1_TYPE|. This matches OpenSSL but is -// probably a bug. For now, do not use this form with negative values. -// -// Otherwise, if |len| is -1, the value is constructed by passing |attrtype| and -// |data| to |ASN1_TYPE_set1|. That is, |attrtype| is an |ASN1_TYPE| type value, -// and |data| is cast to the corresponding pointer type. -// -// WARNING: Despite the name, this function appends to |attr|'s value set, -// rather than overwriting it. To overwrite the value set, create a new -// |X509_ATTRIBUTE| with |X509_ATTRIBUTE_new|. -// -// WARNING: If using the |MBSTRING_*| form, pass a length rather than relying on -// |strlen|. In particular, |strlen| will not behave correctly if the input is -// |MBSTRING_BMP| or |MBSTRING_UNIV|. -// -// WARNING: This function currently misinterprets |V_ASN1_OTHER| as an -// |MBSTRING_*| constant. This matches OpenSSL but means it is impossible to -// construct a value with a non-universal tag. -OPENSSL_EXPORT int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, - const void *data, int len); - -// X509_ATTRIBUTE_get0_data returns the |idx|th value of |attr| in a -// type-specific representation to |attrtype|, or NULL if out of bounds or the -// type does not match. |attrtype| is one of the type values in |ASN1_TYPE|. On -// match, the return value uses the same representation as |ASN1_TYPE_set0|. See -// |ASN1_TYPE| for details. -OPENSSL_EXPORT void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, - int attrtype, void *unused); - -// X509_ATTRIBUTE_count returns the number of values in |attr|. -OPENSSL_EXPORT int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr); - -// X509_ATTRIBUTE_get0_object returns the type of |attr|. -OPENSSL_EXPORT ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); - -// X509_ATTRIBUTE_get0_type returns the |idx|th value in |attr|, or NULL if out -// of bounds. Note this function returns one of |attr|'s values, not the type. -OPENSSL_EXPORT ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, - int idx); - OPENSSL_EXPORT int X509_verify_cert(X509_STORE_CTX *ctx); // PKCS#8 utilities @@ -2557,9 +2644,9 @@ 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 +// 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 @@ -2596,11 +2683,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( @@ -2771,6 +2853,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 *)); @@ -2805,10 +2890,12 @@ 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( - X509_VERIFY_PARAM *param, STACK_OF(ASN1_OBJECT) *policies); + X509_VERIFY_PARAM *param, const STACK_OF(ASN1_OBJECT) *policies); OPENSSL_EXPORT int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, const char *name, @@ -2832,12 +2919,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) @@ -2921,5 +3004,6 @@ BSSL_NAMESPACE_END #define X509_R_NO_CERTIFICATE_FOUND 141 #define X509_R_NO_CERTIFICATE_OR_CRL_FOUND 142 #define X509_R_NO_CRL_FOUND 143 +#define X509_R_INVALID_POLICY_EXTENSION 144 -#endif +#endif // OPENSSL_HEADER_X509_H diff --git a/third_party/boringssl/src/include/openssl/x509v3.h b/third_party/boringssl/src/include/openssl/x509v3.h index 9db57e6f6aec..d9c862da8367 100644 --- a/third_party/boringssl/src/include/openssl/x509v3.h +++ b/third_party/boringssl/src/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 @@ -89,23 +89,28 @@ typedef STACK_OF(CONF_VALUE) *(*X509V3_EXT_I2V)(const X509V3_EXT_METHOD *method, void *ext, STACK_OF(CONF_VALUE) *extlist); typedef void *(*X509V3_EXT_V2I)(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *values); + const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *values); typedef char *(*X509V3_EXT_I2S)(const X509V3_EXT_METHOD *method, void *ext); typedef void *(*X509V3_EXT_S2I)(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, const char *str); + const X509V3_CTX *ctx, const char *str); typedef int (*X509V3_EXT_I2R)(const X509V3_EXT_METHOD *method, void *ext, BIO *out, int indent); typedef void *(*X509V3_EXT_R2I)(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, const char *str); + const X509V3_CTX *ctx, const char *str); // V3 extension structure struct v3_ext_method { int ext_nid; int ext_flags; - // If this is set the following four fields are ignored + + // it determines how values of this extension are allocated, released, parsed, + // and marshalled. This must be non-NULL. ASN1_ITEM_EXP *it; - // Old style ASN1 calls + + // The following functions are ignored in favor of |it|. They are retained in + // the struct only for source compatibility with existing struct definitions. X509V3_EXT_NEW ext_new; X509V3_EXT_FREE ext_free; X509V3_EXT_D2I d2i; @@ -126,30 +131,9 @@ struct v3_ext_method { void *usr_data; // Any extension specific data }; -typedef struct X509V3_CONF_METHOD_st { - char *(*get_string)(void *db, const char *section, const char *value); - STACK_OF(CONF_VALUE) *(*get_section)(void *db, const char *section); - void (*free_string)(void *db, char *string); - void (*free_section)(void *db, STACK_OF(CONF_VALUE) *section); -} X509V3_CONF_METHOD; - -// Context specific info -struct v3_ext_ctx { -#define CTX_TEST 0x1 - int flags; - X509 *issuer_cert; - X509 *subject_cert; - X509_REQ *subject_req; - X509_CRL *crl; - const X509V3_CONF_METHOD *db_meth; - void *db; - // Maybe more here -}; - DEFINE_STACK_OF(X509V3_EXT_METHOD) // ext_flags values -#define X509V3_EXT_DYNAMIC 0x1 #define X509V3_EXT_CTX_DEP 0x2 #define X509V3_EXT_MULTILINE 0x4 @@ -186,7 +170,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; @@ -198,7 +182,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; @@ -317,20 +300,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; @@ -356,13 +325,6 @@ struct ISSUING_DIST_POINT_st { // onlysomereasons present #define IDP_REASONS 0x40 -#define X509V3_conf_err(val) \ - ERR_add_error_data(6, "section:", (val)->section, ",name:", (val)->name, \ - ",value:", (val)->value); - -#define X509V3_set_ctx_test(ctx) \ - X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) -#define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; // X509_PURPOSE stuff @@ -379,9 +341,7 @@ struct ISSUING_DIST_POINT_st { #define EXFLAG_INVALID 0x80 #define EXFLAG_SET 0x100 #define EXFLAG_CRITICAL 0x200 -#define EXFLAG_PROXY 0x400 -#define EXFLAG_INVALID_POLICY 0x800 #define EXFLAG_FRESHEST 0x1000 // Self signed #define EXFLAG_SS 0x2000 @@ -454,12 +414,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| @@ -470,9 +424,15 @@ OPENSSL_EXPORT int GENERAL_NAME_cmp(const 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|. @@ -488,15 +448,14 @@ 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, - X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *nval); +OPENSSL_EXPORT GENERAL_NAMES *v2i_GENERAL_NAMES( + const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, + const STACK_OF(CONF_VALUE) *nval); 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); @@ -507,10 +466,14 @@ 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, X509V3_CTX *ctx, const char *str); + const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *str); DECLARE_ASN1_FUNCTIONS_const(EXTENDED_KEY_USAGE) OPENSSL_EXPORT int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a); @@ -561,85 +524,141 @@ DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) OPENSSL_EXPORT GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, int gen_type, + const X509V3_CTX *ctx, int gen_type, const char *value, int is_nc); OPENSSL_EXPORT GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, - X509V3_CTX *ctx, CONF_VALUE *cnf); + const X509V3_CTX *ctx, + const CONF_VALUE *cnf); OPENSSL_EXPORT GENERAL_NAME *v2i_GENERAL_NAME_ex( - GENERAL_NAME *out, const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, - CONF_VALUE *cnf, int is_nc); + GENERAL_NAME *out, const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, + const CONF_VALUE *cnf, int is_nc); OPENSSL_EXPORT void X509V3_conf_free(CONF_VALUE *val); -// X509V3_EXT_conf_nid contains the only exposed instance of an LHASH in our -// public headers. The |conf| pointer must be NULL but cryptography.io wraps -// this function so we cannot, yet, replace the type with a dummy struct. -OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, - X509V3_CTX *ctx, int ext_nid, - const char *value); -OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, - int ext_nid, - const char *value); -OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, +// Deprecated config-based extension creation. +// +// The following functions allow specifying X.509 extensions using OpenSSL's +// config file syntax, from the OpenSSL command-line tool. They are retained, +// for now, for compatibility with legacy software but may be removed in the +// future. Construct the extensions using the typed C APIs instead. +// +// Callers should especially avoid these functions if passing in non-constant +// values. They use ad-hoc, string-based formats which are prone to injection +// vulnerabilities. For a CA, this means using them risks misissuance. +// +// These functions are not safe to use with untrusted inputs. The string formats +// may implicitly reference context information and, in OpenSSL (though not +// BoringSSL), one even allows reading arbitrary files. They additionally see +// much less testing and review than most of the library and may have bugs +// including memory leaks or crashes. + +// v3_ext_ctx, aka |X509V3_CTX|, contains additional context information for +// constructing extensions. Some string formats reference additional values in +// these objects. It must be initialized with |X509V3_set_ctx| or +// |X509V3_set_ctx_test| before use. +struct v3_ext_ctx { + int flags; + const X509 *issuer_cert; + const X509 *subject_cert; + const X509_REQ *subject_req; + const X509_CRL *crl; + const CONF *db; +}; + +#define X509V3_CTX_TEST 0x1 + +// X509V3_set_ctx initializes |ctx| with the specified objects. Some string +// formats will reference fields in these objects. Each object may be NULL to +// omit it, in which case those formats cannot be used. |flags| should be zero, +// unless called via |X509V3_set_ctx_test|. +// +// |issuer|, |subject|, |req|, and |crl|, if non-NULL, must outlive |ctx|. +OPENSSL_EXPORT void X509V3_set_ctx(X509V3_CTX *ctx, const X509 *issuer, + const X509 *subject, const X509_REQ *req, + const X509_CRL *crl, int flags); + +// X509V3_set_ctx_test calls |X509V3_set_ctx| without any reference objects and +// mocks out some features that use them. The resulting extensions may be +// incomplete and should be discarded. This can be used to partially validate +// syntax. +// +// TODO(davidben): Can we remove this? +#define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, X509V3_CTX_TEST) + +// X509V3_set_nconf sets |ctx| to use |conf| as the config database. |ctx| must +// have previously been initialized by |X509V3_set_ctx| or +// |X509V3_set_ctx_test|. Some string formats will reference sections in |conf|. +// |conf| may be NULL, in which case these formats cannot be used. If non-NULL, +// |conf| must outlive |ctx|. +OPENSSL_EXPORT void X509V3_set_nconf(X509V3_CTX *ctx, const CONF *conf); + +// X509V3_set_ctx_nodb calls |X509V3_set_nconf| with no config database. +#define X509V3_set_ctx_nodb(ctx) X509V3_set_nconf(ctx, NULL) + +// X509V3_EXT_nconf constructs an extension of type specified by |name|, and +// value specified by |value|. It returns a newly-allocated |X509_EXTENSION| +// object on success, or NULL on error. |conf| and |ctx| specify additional +// information referenced by some formats. Either |conf| or |ctx| may be NULL, +// in which case features which use it will be disabled. +// +// If non-NULL, |ctx| must be initialized with |X509V3_set_ctx| or +// |X509V3_set_ctx_test|. +// +// Both |conf| and |ctx| provide a |CONF| object. When |ctx| is non-NULL, most +// features use the |ctx| copy, configured with |X509V3_set_ctx|, but some use +// |conf|. Callers should ensure the two match to avoid surprisingly behavior. +OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_nconf(const CONF *conf, + const X509V3_CTX *ctx, const char *name, const char *value); -OPENSSL_EXPORT int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, + +// X509V3_EXT_nconf_nid behaves like |X509V3_EXT_nconf|, except the extension +// type is specified as a NID. +OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_nconf_nid(const CONF *conf, + const X509V3_CTX *ctx, + int ext_nid, + const char *value); + +// X509V3_EXT_conf_nid calls |X509V3_EXT_nconf_nid|. |conf| must be NULL. +// +// TODO(davidben): This is the only exposed instance of an LHASH in our public +// headers. cryptography.io wraps this function so we cannot, yet, replace the +// type with a dummy struct. +OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + const X509V3_CTX *ctx, + int ext_nid, + const char *value); + +// X509V3_EXT_add_nconf_sk looks up the section named |section| in |conf|. For +// each |CONF_VALUE| in the section, it constructs an extension as in +// |X509V3_EXT_nconf|, taking |name| and |value| from the |CONF_VALUE|. Each new +// extension is appended to |*sk|. If |*sk| is non-NULL, and at least one +// extension is added, it sets |*sk| to a newly-allocated +// |STACK_OF(X509_EXTENSION)|. It returns one on success and zero on error. +OPENSSL_EXPORT int X509V3_EXT_add_nconf_sk(const CONF *conf, + const X509V3_CTX *ctx, const char *section, STACK_OF(X509_EXTENSION) **sk); -OPENSSL_EXPORT int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, + +// X509V3_EXT_add_nconf adds extensions to |cert| as in +// |X509V3_EXT_add_nconf_sk|. It returns one on success and zero on error. +OPENSSL_EXPORT int X509V3_EXT_add_nconf(const CONF *conf, const X509V3_CTX *ctx, const char *section, X509 *cert); -OPENSSL_EXPORT int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, + +// X509V3_EXT_REQ_add_nconf adds extensions to |req| as in +// |X509V3_EXT_add_nconf_sk|. It returns one on success and zero on error. +OPENSSL_EXPORT int X509V3_EXT_REQ_add_nconf(const CONF *conf, + const X509V3_CTX *ctx, const char *section, X509_REQ *req); -OPENSSL_EXPORT int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, + +// X509V3_EXT_CRL_add_nconf adds extensions to |crl| as in +// |X509V3_EXT_add_nconf_sk|. It returns one on success and zero on error. +OPENSSL_EXPORT int X509V3_EXT_CRL_add_nconf(const CONF *conf, + const X509V3_CTX *ctx, const char *section, X509_CRL *crl); -OPENSSL_EXPORT int X509V3_add_value_bool_nf(const char *name, int asn1_bool, - STACK_OF(CONF_VALUE) **extlist); -OPENSSL_EXPORT int X509V3_get_value_bool(const CONF_VALUE *value, - int *asn1_bool); -OPENSSL_EXPORT int X509V3_get_value_int(const CONF_VALUE *value, - ASN1_INTEGER **aint); -OPENSSL_EXPORT void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); - -OPENSSL_EXPORT char *X509V3_get_string(X509V3_CTX *ctx, const char *name, - const char *section); -OPENSSL_EXPORT STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, - const char *section); -OPENSSL_EXPORT void X509V3_string_free(X509V3_CTX *ctx, char *str); -OPENSSL_EXPORT void X509V3_section_free(X509V3_CTX *ctx, - STACK_OF(CONF_VALUE) *section); -OPENSSL_EXPORT void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, - X509_REQ *req, X509_CRL *crl, int flags); - -// X509V3_add_value appends a |CONF_VALUE| containing |name| and |value| to -// |*extlist|. It returns one on success and zero on error. If |*extlist| is -// NULL, it sets |*extlist| to a newly-allocated |STACK_OF(CONF_VALUE)| -// containing the result. Either |name| or |value| may be NULL to omit the -// field. -// -// On failure, if |*extlist| was NULL, |*extlist| will remain NULL when the -// function returns. -OPENSSL_EXPORT int X509V3_add_value(const char *name, const char *value, - STACK_OF(CONF_VALUE) **extlist); - -// X509V3_add_value_uchar behaves like |X509V3_add_value| but takes an -// |unsigned char| pointer. -OPENSSL_EXPORT int X509V3_add_value_uchar(const char *name, - const unsigned char *value, - STACK_OF(CONF_VALUE) **extlist); - -// X509V3_add_value_bool behaves like |X509V3_add_value| but stores the value -// "TRUE" if |asn1_bool| is non-zero and "FALSE" otherwise. -OPENSSL_EXPORT int X509V3_add_value_bool(const char *name, int asn1_bool, - STACK_OF(CONF_VALUE) **extlist); - -// X509V3_add_value_bool behaves like |X509V3_add_value| but stores a string -// representation of |aint|. Note this string representation may be decimal or -// hexadecimal, depending on the size of |aint|. -OPENSSL_EXPORT int X509V3_add_value_int(const char *name, - const ASN1_INTEGER *aint, - STACK_OF(CONF_VALUE) **extlist); OPENSSL_EXPORT char *i2s_ASN1_INTEGER(const X509V3_EXT_METHOD *meth, const ASN1_INTEGER *aint); @@ -647,16 +666,42 @@ OPENSSL_EXPORT ASN1_INTEGER *s2i_ASN1_INTEGER(const X509V3_EXT_METHOD *meth, const char *value); OPENSSL_EXPORT char *i2s_ASN1_ENUMERATED(const X509V3_EXT_METHOD *meth, const ASN1_ENUMERATED *aint); -OPENSSL_EXPORT int X509V3_EXT_add(X509V3_EXT_METHOD *ext); -OPENSSL_EXPORT int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); -OPENSSL_EXPORT int X509V3_EXT_add_alias(int nid_to, int nid_from); -OPENSSL_EXPORT void X509V3_EXT_cleanup(void); + +// X509V3_EXT_add registers |ext| as a custom extension for the extension type +// |ext->ext_nid|. |ext| must be valid for the remainder of the address space's +// lifetime. It returns one on success and zero on error. +// +// WARNING: This function modifies global state. If other code in the same +// address space also registers an extension with type |ext->ext_nid|, the two +// registrations will conflict. Which registration takes effect is undefined. If +// the two registrations use incompatible in-memory representations, code +// expecting the other registration will then cast a type to the wrong type, +// resulting in a potentially exploitable memory error. This conflict can also +// occur if BoringSSL later adds support for |ext->ext_nid|, with a different +// in-memory representation than the one expected by |ext|. +// +// This function, additionally, is not thread-safe and cannot be called +// concurrently with any other BoringSSL function. +// +// As a result, it is impossible to safely use this function. Registering a +// custom extension has no impact on certificate verification so, instead, +// callers should simply handle the custom extension with the byte-based +// |X509_EXTENSION| APIs directly. Registering |ext| with the library has little +// practical value. +OPENSSL_EXPORT OPENSSL_DEPRECATED int X509V3_EXT_add(X509V3_EXT_METHOD *ext); + +// X509V3_EXT_add_alias registers a custom extension with NID |nid_to|. The +// corresponding ASN.1 type is copied from |nid_from|. It returns one on success +// and zero on error. +// +// WARNING: Do not use this function. See |X509V3_EXT_add|. +OPENSSL_EXPORT OPENSSL_DEPRECATED int X509V3_EXT_add_alias(int nid_to, + int nid_from); OPENSSL_EXPORT const X509V3_EXT_METHOD *X509V3_EXT_get( const X509_EXTENSION *ext); OPENSSL_EXPORT const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); OPENSSL_EXPORT int X509V3_add_standard_extensions(void); -OPENSSL_EXPORT STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); // X509V3_EXT_d2i decodes |ext| and returns a pointer to a newly-allocated // structure, with type dependent on the type of the extension. It returns NULL @@ -903,9 +948,6 @@ OPENSSL_EXPORT int X509_check_ip_asc(X509 *x, const char *ipasc, OPENSSL_EXPORT ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); OPENSSL_EXPORT ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); -OPENSSL_EXPORT int X509V3_NAME_from_section(X509_NAME *nm, - STACK_OF(CONF_VALUE) *dn_sk, - unsigned long chtype); // BEGIN ERROR CODES // The following lines are auto generated by the script mkerr.pl. Any changes @@ -1002,4 +1044,4 @@ BSSL_NAMESPACE_END #define X509V3_R_INVALID_VALUE 163 #define X509V3_R_TRAILING_DATA_IN_EXTENSION 164 -#endif +#endif // OPENSSL_HEADER_X509V3_H diff --git a/third_party/boringssl/src/rust/CMakeLists.txt b/third_party/boringssl/src/rust/CMakeLists.txt index f60ad4719ace..fcdf3db13acb 100644 --- a/third_party/boringssl/src/rust/CMakeLists.txt +++ b/third_party/boringssl/src/rust/CMakeLists.txt @@ -1,57 +1 @@ -# additional interop for things like macros and inlined functions -add_library( - rust_wrapper - STATIC - rust_wrapper.c -) - -# 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} - --no-derive-default - --enable-function-attribute-detection - --use-core - --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" - -- # 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/third_party/boringssl/src/rust/bssl-crypto/Cargo.toml b/third_party/boringssl/src/rust/bssl-crypto/Cargo.toml new file mode 100644 index 000000000000..7822767a09e2 --- /dev/null +++ b/third_party/boringssl/src/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 +# `cmake -G Ninja -B build -DRUST_BINDINGS="$(gcc -dumpmachine)" && ninja -C build` +bssl-sys = {path = "../../build/rust/bssl-sys"} diff --git a/third_party/boringssl/src/rust/bssl-crypto/README.md b/third_party/boringssl/src/rust/bssl-crypto/README.md new file mode 100644 index 000000000000..0d52053ae41a --- /dev/null +++ b/third_party/boringssl/src/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: +``` +cmake -G Ninja -B build -DRUST_BINDINGS="$(gcc -dumpmachine)" && ninja -C build +``` + +Then to run all tests: +``` +cd rust/bssl-crypto && cargo clippy && cargo deny check && cargo test +``` diff --git a/third_party/boringssl/src/rust/bssl-crypto/deny.toml b/third_party/boringssl/src/rust/bssl-crypto/deny.toml new file mode 100644 index 000000000000..cb3f3451657d --- /dev/null +++ b/third_party/boringssl/src/rust/bssl-crypto/deny.toml @@ -0,0 +1,215 @@ +# 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", +] +# 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 = "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 +# * 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 = "deny" +# 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! +# 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 = [ + # 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" }, +] +# 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/third_party/boringssl/src/rust/bssl-crypto/src/aes.rs b/third_party/boringssl/src/rust/bssl-crypto/src/aes.rs new file mode 100644 index 000000000000..e3ec5bdaf5ef --- /dev/null +++ b/third_party/boringssl/src/rust/bssl-crypto/src/aes.rs @@ -0,0 +1,224 @@ +/* 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. + 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(), + ) + }; + 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 + 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. + 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(), + ) + }; + 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. + let dec_key = unsafe { dec_key_uninit.assume_init() }; + + AesDecryptKey(dec_key) +} + +#[cfg(test)] +mod tests { + use crate::aes::{Aes, AesDecryptKey, AesEncryptKey}; + 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(decode_hex("2b7e151628aed2a6abf7158809cf4f3c")); + let mut block = [0_u8; 16]; + + block.copy_from_slice(&decode_hex::<16>("6bc1bee22e409f96e93d7e117393172a")); + Aes::encrypt(&key, &mut block); + assert_eq!(decode_hex("3ad77bb40d7a3660a89ecaf32466ef97"), block); + + block.copy_from_slice(&decode_hex::<16>("ae2d8a571e03ac9c9eb76fac45af8e51")); + Aes::encrypt(&key, &mut block); + assert_eq!(decode_hex("f5d3d58503b9699de785895a96fdbaaf"), block); + + block.copy_from_slice(&decode_hex::<16>("30c81c46a35ce411e5fbc1191a0a52ef")); + Aes::encrypt(&key, &mut block); + assert_eq!(decode_hex("43b1cd7f598ece23881b00e3ed030688"), block); + + block.copy_from_slice(&decode_hex::<16>("f69f2445df4f9b17ad2b417be66c3710")); + Aes::encrypt(&key, &mut 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(decode_hex("2b7e151628aed2a6abf7158809cf4f3c")); + let mut block = [0_u8; 16]; + + block.copy_from_slice(&decode_hex::<16>("3ad77bb40d7a3660a89ecaf32466ef97")); + Aes::decrypt(&key, &mut block); + assert_eq!(decode_hex::<16>("6bc1bee22e409f96e93d7e117393172a"), block); + + block.copy_from_slice(&decode_hex::<16>("f5d3d58503b9699de785895a96fdbaaf")); + Aes::decrypt(&key, &mut block); + assert_eq!(decode_hex::<16>("ae2d8a571e03ac9c9eb76fac45af8e51"), block); + + block.copy_from_slice(&decode_hex::<16>("43b1cd7f598ece23881b00e3ed030688")); + Aes::decrypt(&key, &mut block); + assert_eq!(decode_hex::<16>("30c81c46a35ce411e5fbc1191a0a52ef"), block); + + block.copy_from_slice(&decode_hex::<16>("7b0c785e27e8ad3f8223207104725dd4").as_slice()); + Aes::decrypt(&key, &mut 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(decode_hex( + "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", + )); + let mut block: [u8; 16]; + + block = decode_hex("6bc1bee22e409f96e93d7e117393172a"); + Aes::encrypt(&key, &mut block); + assert_eq!(decode_hex("f3eed1bdb5d2a03c064b5a7e3db181f8"), block); + + block = decode_hex("ae2d8a571e03ac9c9eb76fac45af8e51"); + Aes::encrypt(&key, &mut block); + assert_eq!(decode_hex("591ccb10d410ed26dc5ba74a31362870"), block); + + block = decode_hex("30c81c46a35ce411e5fbc1191a0a52ef"); + Aes::encrypt(&key, &mut block); + assert_eq!(decode_hex("b6ed21b99ca6f4f9f153e7b1beafed1d"), block); + + block = decode_hex("f69f2445df4f9b17ad2b417be66c3710"); + Aes::encrypt(&key, &mut 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(decode_hex( + "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", + )); + + let mut block: [u8; 16]; + + block = decode_hex("f3eed1bdb5d2a03c064b5a7e3db181f8"); + Aes::decrypt(&key, &mut block); + assert_eq!(decode_hex("6bc1bee22e409f96e93d7e117393172a"), block); + + block = decode_hex("591ccb10d410ed26dc5ba74a31362870"); + Aes::decrypt(&key, &mut block); + assert_eq!(decode_hex("ae2d8a571e03ac9c9eb76fac45af8e51"), block); + + block = decode_hex("b6ed21b99ca6f4f9f153e7b1beafed1d"); + Aes::decrypt(&key, &mut block); + assert_eq!(decode_hex("30c81c46a35ce411e5fbc1191a0a52ef"), block); + + block = decode_hex("23304b7a39f9f3ff067d8d8f9e24ecc7"); + Aes::decrypt(&key, &mut block); + assert_eq!(decode_hex("f69f2445df4f9b17ad2b417be66c3710"), block); + } +} diff --git a/third_party/boringssl/src/rust/bssl-crypto/src/digest.rs b/third_party/boringssl/src/rust/bssl-crypto/src/digest.rs new file mode 100644 index 000000000000..4f1941904bf7 --- /dev/null +++ b/third_party/boringssl/src/rust/bssl-crypto/src/digest.rs @@ -0,0 +1,87 @@ +/* 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 struct MdRef; + +unsafe impl ForeignTypeRef for MdRef { + type CType = bssl_sys::EVP_MD; +} + +/// Used internally to get a BoringSSL internal MD +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 + unsafe { MdRef::from_ptr(bssl_sys::EVP_sha256() as *mut _) } + } +} + +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 + 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/third_party/boringssl/src/rust/bssl-crypto/src/hkdf.rs b/third_party/boringssl/src/rust/bssl-crypto/src/hkdf.rs new file mode 100644 index 000000000000..66b8d60e305c --- /dev/null +++ b/third_party/boringssl/src/rust/bssl-crypto/src/hkdf.rs @@ -0,0 +1,289 @@ +/* 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 crate::test_helpers::{decode_hex, decode_hex_into_vec}; + use core::iter; + + struct Test { + ikm: Vec, + salt: Vec, + info: Vec, + okm: Vec, + } + + #[test] + fn hkdf_sha_256_test() { + 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.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 = decode_hex( + "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865", + ); + assert_eq!(okm, expected); + } + + #[test] + fn hkdf_sha512_test() { + 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.as_slice()), ikm.as_slice()); + let mut okm = [0u8; 42]; + hk.expand(&info, &mut okm).expect("Should succeed"); + + let expected = decode_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: 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: decode_hex_into_vec( + "000102030405060708090a0b0c0d0e0f\ + 101112131415161718191a1b1c1d1e1f\ + 202122232425262728292a2b2c2d2e2f\ + 303132333435363738393a3b3c3d3e3f\ + 404142434445464748494a4b4c4d4e4f", + ), + salt: decode_hex_into_vec( + "606162636465666768696a6b6c6d6e6f\ + 707172737475767778797a7b7c7d7e7f\ + 808182838485868788898a8b8c8d8e8f\ + 909192939495969798999a9b9c9d9e9f\ + a0a1a2a3a4a5a6a7a8a9aaabacadaeaf", + ), + 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: decode_hex_into_vec("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"), + salt: Vec::new(), + info: Vec::new(), + okm: decode_hex_into_vec( + "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8"), + }, + ]; + for Test { + ikm, + salt, + info, + okm, + } in tests.iter() + { + let salt = if salt.is_empty() { + None + } else { + Some(salt.as_slice()) + }; + let hkdf = HkdfSha256::new(salt, ikm.as_slice()); + let mut okm2 = vec![0u8; okm.len()]; + assert!(hkdf.expand(info.as_slice(), &mut okm2).is_ok()); + assert_eq!(okm2.as_slice(), okm.as_slice()); + } + } + + #[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/third_party/boringssl/src/rust/bssl-crypto/src/hmac.rs b/third_party/boringssl/src/rust/bssl-crypto/src/hmac.rs new file mode 100644 index 000000000000..7dbf39ba5b1f --- /dev/null +++ b/third_party/boringssl/src/rust/bssl-crypto/src/hmac.rs @@ -0,0 +1,429 @@ +/* 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 _, +}; +use core::{ + ffi::{c_uint, c_void}, + marker::PhantomData, + ptr, +}; + +/// 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_sha256(key: &[u8], data: &[u8]) -> [u8; 32] { + hmac::<32, Sha256>(key, data) +} + +/// 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_sha512(key: &[u8], data: &[u8]) -> [u8; 64] { + hmac::<64, Sha512>(key, data) +} + +/// The BoringSSL HMAC-SHA256 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]) -> Self { + Self(Hmac::new_from_slice(key)) + } + + /// 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) + } + + /// Resets the hmac instance to its initial state + pub fn reset(&mut self) { + self.0.reset() + } +} + +/// The BoringSSL HMAC-SHA512 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]) -> Self { + Self(Hmac::new_from_slice(key)) + } + + /// 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) + } + + /// Resets the hmac instance to its initial state + pub fn reset(&mut self) { + self.0.reset() + } +} + +/// 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]) -> [u8; N] { + 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 + let result = 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, + ) + }; + assert!(!result.is_null(), "Result of bssl_sys::HMAC was null"); + + 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 { + Self::new_from_slice(&key) + } + + /// Create new hmac value from variable size key. Panics on allocation failure + fn new_from_slice(key: &[u8]) -> Self { + // Safety: + // - HMAC_CTX_new panics if allocation fails + let ctx = unsafe { bssl_sys::HMAC_CTX_new() }; + 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, + // 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 + let result = 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(), + ) + }; + assert!(result > 0, "Allocation failure in bssl_sys::HMAC_Init_ex"); + + Self { + ctx, + _marker: Default::default(), + } + } + + /// Update state using the provided data, can be called repeatedly. + fn update(&mut self, data: &[u8]) { + 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()) + }; + assert_eq!(result, 1, "failure in bssl_sys::HMAC_Update"); + } + + /// 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 + 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 + } + + /// 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) + } + + /// Resets the hmac instance to its original state + fn reset(&mut self) { + // Passing a null ptr for the key will re-use the existing key + // Safety: + // - HMAC_Init_ex must be called with a context previously created with HMAC_CTX_new, + // which will always be the case if it is coming from self + // - HMAC_Init_ex may return an error if key is null but the md is different from + // before. The MD is guaranteed to be the same because it comes from the same generic param + // - HMAC_Init_ex returns 0 on allocation failure in which case we panic + let result = unsafe { + bssl_sys::HMAC_Init_ex( + self.ctx, + ptr::null_mut(), + 0, + M::get_md().as_ptr(), + ptr::null_mut(), + ) + }; + assert!(result > 0, "Allocation failure in bssl_sys::HMAC_Init_ex"); + } +} + +impl Drop for Hmac { + fn drop(&mut self) { + unsafe { bssl_sys::HMAC_CTX_free(self.ctx) } + } +} + +#[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); + hmac.update(data); + let hmac_result: [u8; 32] = hmac.finalize(); + + assert_eq!(&hmac_result, &expected_hmac); + } + + #[test] + fn hmac_sha256_reset_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 incorrect_data = b"This data does not match the expected mac"; + + let mut hmac = HmacSha256::new_from_slice(&key); + hmac.update(incorrect_data); + hmac.reset(); + + // hmac should be back to original state, so now when we update with the correct data it + // should work + hmac.update(data); + let hmac_result: [u8; 32] = hmac.finalize(); + 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); + 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_sha256(&key, data); + 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); + 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); + hmac.update(data); + assert!(hmac.verify(expected_hmac).is_ok()) + } +} diff --git a/third_party/boringssl/src/rust/bssl-crypto/src/lib.rs b/third_party/boringssl/src/rust/bssl-crypto/src/lib.rs new file mode 100644 index 000000000000..6ccf09cbf68b --- /dev/null +++ b/third_party/boringssl/src/rust/bssl-crypto/src/lib.rs @@ -0,0 +1,130 @@ +/* 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, + unsafe_op_in_unsafe_fn, + clippy::indexing_slicing, + clippy::unwrap_used, + clippy::panic, + clippy::expect_used +)] + +//! Rust boringssl binding + +extern crate core; + +/// BoringSSL implemented plain aes operations. +pub mod aes; + +/// BoringSSL implemented hash functions. +pub mod digest; + +/// BoringSSL implemented hkdf operations. +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; + +/// This is a helper struct which provides functions for passing slices over FFI. +struct CSlice<'a>(&'a [u8]); + +impl<'a> From<&'a [u8]> for CSlice<'a> { + fn from(value: &'a [u8]) -> Self { + Self(value) + } +} + +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() + } else { + self.0.as_ptr() as *const T + } + } +} + +/// 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) + } +} + +/// 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()); + unsafe { &*(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()); + unsafe { &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/third_party/boringssl/src/rust/bssl-crypto/src/rand.rs b/third_party/boringssl/src/rust/bssl-crypto/src/rand.rs new file mode 100644 index 000000000000..9fdbe0a7ec3e --- /dev/null +++ b/third_party/boringssl/src/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); + } +} diff --git a/third_party/boringssl/src/crypto/cpu_ppc64le.c b/third_party/boringssl/src/rust/bssl-crypto/src/test_helpers.rs similarity index 51% rename from third_party/boringssl/src/crypto/cpu_ppc64le.c rename to third_party/boringssl/src/rust/bssl-crypto/src/test_helpers.rs index a802e37e9acf..ea2d9dbcc94f 100644 --- a/third_party/boringssl/src/crypto/cpu_ppc64le.c +++ b/third_party/boringssl/src/rust/bssl-crypto/src/test_helpers.rs @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, Google Inc. +/* 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 @@ -10,29 +10,22 @@ * 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); + * 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() } -int CRYPTO_is_PPC64LE_vcrypto_capable(void) { - return (OPENSSL_ppc64le_hwcap2 & PPC_FEATURE2_HAS_VCRYPTO) != 0; +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::>() } - -#endif // OPENSSL_PPC64LE diff --git a/third_party/boringssl/src/rust/bssl-sys/CMakeLists.txt b/third_party/boringssl/src/rust/bssl-sys/CMakeLists.txt new file mode 100644 index 000000000000..5e5f4469d2bd --- /dev/null +++ b/third_party/boringssl/src/rust/bssl-sys/CMakeLists.txt @@ -0,0 +1,58 @@ +# 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. bindgen must be called from +# ${CMAKE_BINARY_DIR}, with the output path as a relative path. bindgen writes +# the depfile using the same syntax as the command-line argument, and ninja +# requires a path relative to the top-level build directory. +set(wrapper src/wrapper_${RUST_BINDINGS}.rs) +binary_dir_relative_path(${wrapper} wrapper_relative) +binary_dir_relative_path(${wrapper}.d depfile_relative) + +add_custom_command( + OUTPUT ${wrapper} + COMMAND ${BINDGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.h + -o ${wrapper_relative} + --depfile=${depfile_relative} + --no-derive-default + --enable-function-attribute-detection + --use-core + --default-macro-constant-type=signed + --rustified-enum=point_conversion_form_t + # These regexes need to accept both / and \ to handle Windows file + # path differences, due a bindgen issue. See + # https://crbug.com/boringssl/595. Ideally, we would write [/\\], but + # there are many layers of escaping here. First, CMake interprets + # backslashes. Then CMake generates a Ninja or Make file. That, in + # turn, uses the shell on POSIX, and does something else on Windows. + # + # It is unlikely that every layer here has sufficiently well-defined + # escaping and correctly handled the next layer's escaping. On top of + # that, we'd likely need to detect Windows vs POSIX hosts and change + # the input. Instead, just use [[:punct:]] which is more permissive + # than necessary, but we only need to exclude unwanted libc headers. + # + # If bindgen ever supports some file-based config (see + # https://github.com/rust-lang/rust-bindgen/issues/2508), we can + # switch to that. + --allowlist-file=".*[[:punct:]]include[[:punct:]]openssl[[:punct:]].*\\.h" + --allowlist-file=".*[[:punct:]]rust_wrapper\\.h" + -- # these are LLVM arg passthroughs + -I${PROJECT_SOURCE_DIR}/include + # https://doc.rust-lang.org/nightly/rustc/platform-support.html + --target=${RUST_BINDINGS} + DEPENDS wrapper.h + DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/${wrapper}.d + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +) +add_custom_target(bssl_sys ALL DEPENDS ${wrapper}) + +# 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) diff --git a/third_party/boringssl/src/rust/Cargo.toml b/third_party/boringssl/src/rust/bssl-sys/Cargo.toml similarity index 77% rename from third_party/boringssl/src/rust/Cargo.toml rename to third_party/boringssl/src/rust/bssl-sys/Cargo.toml index 6a2bb40ad3b3..634ed3cf7f1f 100644 --- a/third_party/boringssl/src/rust/Cargo.toml +++ b/third_party/boringssl/src/rust/bssl-sys/Cargo.toml @@ -3,6 +3,5 @@ name = "bssl-sys" version = "0.1.0" authors = ["Benjamin Brittain "] edition = "2018" - -[dependencies] -libc = "0.2" +publish = false +license = "MIT" diff --git a/third_party/boringssl/src/rust/README.md b/third_party/boringssl/src/rust/bssl-sys/README.md similarity index 100% rename from third_party/boringssl/src/rust/README.md rename to third_party/boringssl/src/rust/bssl-sys/README.md diff --git a/third_party/boringssl/src/rust/build.rs b/third_party/boringssl/src/rust/bssl-sys/build.rs similarity index 63% rename from third_party/boringssl/src/rust/build.rs rename to third_party/boringssl/src/rust/bssl-sys/build.rs index b02922325ec8..e5407025a89a 100644 --- a/third_party/boringssl/src/rust/build.rs +++ b/third_party/boringssl/src/rust/bssl-sys/build.rs @@ -19,18 +19,31 @@ 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(); + + // Find the bindgen generated target platform bindings file and set BINDGEN_RS_FILE + let bindgen_file = crate_path + .join("src") + .read_dir() + .unwrap() + .map(|file| file.unwrap().file_name().into_string().unwrap()) + .find(|file| file.starts_with("wrapper_")) + .unwrap(); + println!("cargo:rustc-env=BINDGEN_RS_FILE={}", bindgen_file); + + // building bssl-sys with: `cmake -G Ninja -B build -DRUST_BINDINGS="$(gcc -dumpmachine)" && ninja -C build` + // 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/third_party/boringssl/src/rust/rust_wrapper.c b/third_party/boringssl/src/rust/bssl-sys/rust_wrapper.c similarity index 100% rename from third_party/boringssl/src/rust/rust_wrapper.c rename to third_party/boringssl/src/rust/bssl-sys/rust_wrapper.c diff --git a/third_party/boringssl/src/rust/rust_wrapper.h b/third_party/boringssl/src/rust/bssl-sys/rust_wrapper.h similarity index 100% rename from third_party/boringssl/src/rust/rust_wrapper.h rename to third_party/boringssl/src/rust/bssl-sys/rust_wrapper.h diff --git a/third_party/boringssl/src/rust/src/lib.rs b/third_party/boringssl/src/rust/bssl-sys/src/lib.rs similarity index 79% rename from third_party/boringssl/src/rust/src/lib.rs rename to third_party/boringssl/src/rust/bssl-sys/src/lib.rs index d8c2c0003939..51ba2cf39a7d 100644 --- a/third_party/boringssl/src/rust/src/lib.rs +++ b/third_party/boringssl/src/rust/bssl-sys/src/lib.rs @@ -2,8 +2,8 @@ #![allow(non_camel_case_types)] #![allow(non_snake_case)] -// populated by cmake -${INCLUDES} +// Set in build.rs +include!(env!("BINDGEN_RS_FILE")); pub fn ERR_GET_LIB(packed_error: u32) -> i32 { unsafe { ERR_GET_LIB_RUST(packed_error) } @@ -18,5 +18,7 @@ pub fn ERR_GET_FUNC(packed_error: u32) -> i32 { } pub fn init() { - unsafe { CRYPTO_library_init(); } + unsafe { + CRYPTO_library_init(); + } } diff --git a/third_party/boringssl/src/rust/bssl-sys/wrapper.h b/third_party/boringssl/src/rust/bssl-sys/wrapper.h new file mode 100644 index 000000000000..bd7404955639 --- /dev/null +++ b/third_party/boringssl/src/rust/bssl-sys/wrapper.h @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rust_wrapper.h" diff --git a/third_party/boringssl/src/rust/wrapper.h b/third_party/boringssl/src/rust/wrapper.h deleted file mode 100644 index ff63244cc0b9..000000000000 --- a/third_party/boringssl/src/rust/wrapper.h +++ /dev/null @@ -1,77 +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/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/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/third_party/boringssl/src/sources.cmake b/third_party/boringssl/src/sources.cmake index aaca5a476584..5c7e881bf1d1 100644 --- a/third_party/boringssl/src/sources.cmake +++ b/third_party/boringssl/src/sources.cmake @@ -43,8 +43,17 @@ set( crypto/evp/evp_tests.txt crypto/evp/scrypt_tests.txt crypto/fipsmodule/aes/aes_tests.txt - crypto/fipsmodule/bn/bn_tests.txt - crypto/fipsmodule/bn/miller_rabin_tests.txt + crypto/fipsmodule/bn/test/exp_tests.txt + crypto/fipsmodule/bn/test/gcd_tests.txt + crypto/fipsmodule/bn/test/miller_rabin_tests.txt + crypto/fipsmodule/bn/test/mod_exp_tests.txt + crypto/fipsmodule/bn/test/mod_inv_tests.txt + crypto/fipsmodule/bn/test/mod_mul_tests.txt + crypto/fipsmodule/bn/test/mod_sqrt_tests.txt + crypto/fipsmodule/bn/test/product_tests.txt + crypto/fipsmodule/bn/test/quotient_tests.txt + crypto/fipsmodule/bn/test/shift_tests.txt + crypto/fipsmodule/bn/test/sum_tests.txt crypto/fipsmodule/cmac/cavp_3des_cmac_tests.txt crypto/fipsmodule/cmac/cavp_aes128_cmac_tests.txt crypto/fipsmodule/cmac/cavp_aes192_cmac_tests.txt @@ -57,6 +66,8 @@ 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/kyber/kyber_tests.txt crypto/pkcs8/test/empty_password.p12 crypto/pkcs8/test/no_encryption.p12 crypto/pkcs8/test/nss.p12 @@ -102,6 +113,33 @@ set( crypto/x509/test/many_names1.pem crypto/x509/test/many_names2.pem crypto/x509/test/many_names3.pem + crypto/x509/test/policy_intermediate_any.pem + crypto/x509/test/policy_intermediate_duplicate.pem + crypto/x509/test/policy_intermediate_invalid.pem + crypto/x509/test/policy_intermediate_mapped_any.pem + crypto/x509/test/policy_intermediate_mapped_oid3.pem + crypto/x509/test/policy_intermediate_mapped.pem + crypto/x509/test/policy_intermediate_require_duplicate.pem + crypto/x509/test/policy_intermediate_require_no_policies.pem + crypto/x509/test/policy_intermediate_require.pem + crypto/x509/test/policy_intermediate_require1.pem + crypto/x509/test/policy_intermediate_require2.pem + crypto/x509/test/policy_intermediate.pem + 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 + crypto/x509/test/policy_leaf_oid4.pem + crypto/x509/test/policy_leaf_oid5.pem + crypto/x509/test/policy_leaf_require.pem + crypto/x509/test/policy_leaf_require1.pem + crypto/x509/test/policy_leaf.pem + crypto/x509/test/policy_root_cross_inhibit_mapping.pem + crypto/x509/test/policy_root.pem + crypto/x509/test/policy_root2.pem crypto/x509/test/pss_sha1_explicit.pem crypto/x509/test/pss_sha1_mgf1_syntax_error.pem crypto/x509/test/pss_sha1.pem diff --git a/third_party/boringssl/src/ssl/CMakeLists.txt b/third_party/boringssl/src/ssl/CMakeLists.txt index b4b10326121a..d8d997e34397 100644 --- a/third_party/boringssl/src/ssl/CMakeLists.txt +++ b/third_party/boringssl/src/ssl/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../include) - add_library( ssl @@ -41,19 +39,11 @@ add_library( tls13_enc.cc tls13_server.cc ) -target_include_directories(ssl INTERFACE - $ - $ -) -install(TARGETS ssl EXPORT OpenSSLTargets - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -) +# 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_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( @@ -62,14 +52,6 @@ add_executable( span_test.cc ssl_test.cc ssl_c_test.c - - $ ) - -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() +target_link_libraries(ssl_test test_support_lib boringssl_gtest_main ssl crypto) add_dependencies(all_tests ssl_test) diff --git a/third_party/boringssl/src/ssl/bio_ssl.cc b/third_party/boringssl/src/ssl/bio_ssl.cc index a2498893fd83..fe834507b182 100644 --- a/third_party/boringssl/src/ssl/bio_ssl.cc +++ b/third_party/boringssl/src/ssl/bio_ssl.cc @@ -109,7 +109,7 @@ static long ssl_ctrl(BIO *bio, int cmd, long num, void *ptr) { // |bio->next_bio| with |ssl|'s rbio here, and on |BIO_CTRL_PUSH|. We call // into the corresponding |BIO| directly. (We can implement the upstream // behavior if it ends up necessary.) - bio->shutdown = num; + bio->shutdown = static_cast(num); bio->ptr = ptr; bio->init = 1; return 1; @@ -118,7 +118,7 @@ static long ssl_ctrl(BIO *bio, int cmd, long num, void *ptr) { return bio->shutdown; case BIO_CTRL_SET_CLOSE: - bio->shutdown = num; + bio->shutdown = static_cast(num); return 1; case BIO_CTRL_WPENDING: diff --git a/third_party/boringssl/src/ssl/d1_both.cc b/third_party/boringssl/src/ssl/d1_both.cc index 3424f6e8270b..55c92fad8a46 100644 --- a/third_party/boringssl/src/ssl/d1_both.cc +++ b/third_party/boringssl/src/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); @@ -682,6 +679,7 @@ static enum seal_result_t seal_next_message(SSL *ssl, uint8_t *out, // Assemble a fragment, to be sealed in-place. ScopedCBB cbb; + CBB child; uint8_t *frag = out + prefix; size_t max_frag = max_out - prefix, frag_len; if (!CBB_init_fixed(cbb.get(), frag, max_frag) || @@ -689,8 +687,8 @@ static enum seal_result_t seal_next_message(SSL *ssl, uint8_t *out, !CBB_add_u24(cbb.get(), hdr.msg_len) || !CBB_add_u16(cbb.get(), hdr.seq) || !CBB_add_u24(cbb.get(), ssl->d1->outgoing_offset) || - !CBB_add_u24(cbb.get(), todo) || - !CBB_add_bytes(cbb.get(), CBS_data(&body), todo) || + !CBB_add_u24_length_prefixed(cbb.get(), &child) || + !CBB_add_bytes(&child, CBS_data(&body), todo) || !CBB_finish(cbb.get(), NULL, &frag_len)) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); return seal_error; diff --git a/third_party/boringssl/src/ssl/encrypted_client_hello.cc b/third_party/boringssl/src/ssl/encrypted_client_hello.cc index 9e9adfea7b1f..a5492e9a0c06 100644 --- a/third_party/boringssl/src/ssl/encrypted_client_hello.cc +++ b/third_party/boringssl/src/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; } } @@ -573,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; } @@ -604,8 +601,8 @@ bool ssl_is_valid_ech_config_list(Span ech_config_list) { static bool select_ech_cipher_suite(const EVP_HPKE_KDF **out_kdf, const EVP_HPKE_AEAD **out_aead, - Span cipher_suites) { - const bool has_aes_hardware = EVP_has_aes_hardware(); + Span cipher_suites, + const bool has_aes_hardware) { const EVP_HPKE_AEAD *aead = nullptr; CBS cbs = cipher_suites; while (CBS_len(&cbs) != 0) { @@ -663,14 +660,16 @@ bool ssl_select_ech_config(SSL_HANDSHAKE *hs, Span out_enc, const EVP_HPKE_AEAD *aead; if (supported && // ech_config.kem_id == EVP_HPKE_DHKEM_X25519_HKDF_SHA256 && - select_ech_cipher_suite(&kdf, &aead, ech_config.cipher_suites)) { + select_ech_cipher_suite(&kdf, &aead, ech_config.cipher_suites, + hs->ssl->config->aes_hw_override + ? hs->ssl->config->aes_hw_override_value + : EVP_has_aes_hardware())) { ScopedCBB info; static const uint8_t kInfoLabel[] = "tls ech"; // includes trailing NUL if (!CBB_init(info.get(), sizeof(kInfoLabel) + ech_config.raw.size()) || !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; } @@ -718,9 +717,11 @@ static bool setup_ech_grease(SSL_HANDSHAKE *hs) { } const uint16_t kdf_id = EVP_HPKE_HKDF_SHA256; - const EVP_HPKE_AEAD *aead = EVP_has_aes_hardware() - ? EVP_hpke_aes_128_gcm() - : EVP_hpke_chacha20_poly1305(); + const bool has_aes_hw = hs->ssl->config->aes_hw_override + ? hs->ssl->config->aes_hw_override_value + : EVP_has_aes_hardware(); + const EVP_HPKE_AEAD *aead = + has_aes_hw ? EVP_hpke_aes_128_gcm() : EVP_hpke_chacha20_poly1305(); static_assert(ssl_grease_ech_config_id < sizeof(hs->grease_seed), "hs->grease_seed is too small"); uint8_t config_id = hs->grease_seed[ssl_grease_ech_config_id]; @@ -1038,7 +1039,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; @@ -1061,14 +1061,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/third_party/boringssl/src/ssl/extensions.cc b/third_party/boringssl/src/ssl/extensions.cc index 53a3e3cd94a2..4d9651b7944d 100644 --- a/third_party/boringssl/src/ssl/extensions.cc +++ b/third_party/boringssl/src/ssl/extensions.cc @@ -205,7 +205,13 @@ static bool tls1_check_duplicate_extensions(const CBS *cbs) { } static bool is_post_quantum_group(uint16_t id) { - return id == SSL_CURVE_CECPQ2; + switch (id) { + case SSL_CURVE_X25519KYBER768: + case SSL_CURVE_P256KYBER768: + return true; + default: + return false; + } } bool ssl_client_hello_init(const SSL *ssl, SSL_CLIENT_HELLO *out, @@ -340,8 +346,8 @@ bool tls1_get_shared_group(SSL_HANDSHAKE *hs, uint16_t *out_group_id) { for (uint16_t pref_group : pref) { for (uint16_t supp_group : supp) { if (pref_group == supp_group && - // CECPQ2(b) doesn't fit in the u8-length-prefixed ECPoint field in - // TLS 1.2 and below. + // Post-quantum key agreements don't fit in the u8-length-prefixed + // ECPoint field in TLS 1.2 and below. (ssl_protocol_version(ssl) >= TLS1_3_VERSION || !is_post_quantum_group(pref_group))) { *out_group_id = pref_group; @@ -407,7 +413,7 @@ bool tls1_set_curves_list(Array *out_group_ids, const char *curves) { bool tls1_check_group_id(const SSL_HANDSHAKE *hs, uint16_t group_id) { if (is_post_quantum_group(group_id) && ssl_protocol_version(hs->ssl) < TLS1_3_VERSION) { - // CECPQ2(b) requires TLS 1.3. + // Post-quantum "groups" require TLS 1.3. return false; } @@ -1248,10 +1254,12 @@ static bool ext_npn_parse_serverhello(SSL_HANDSHAKE *hs, uint8_t *out_alert, } } + // |orig_len| fits in |unsigned| because TLS extensions use 16-bit lengths. uint8_t *selected; uint8_t selected_len; if (ssl->ctx->next_proto_select_cb( - ssl, &selected, &selected_len, orig_contents, orig_len, + ssl, &selected, &selected_len, orig_contents, + static_cast(orig_len), ssl->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK || !ssl->s3->next_proto_negotiated.CopyFrom( MakeConstSpan(selected, selected_len))) { @@ -1564,11 +1572,14 @@ bool ssl_negotiate_alpn(SSL_HANDSHAKE *hs, uint8_t *out_alert, return false; } + // |protocol_name_list| fits in |unsigned| because TLS extensions use 16-bit + // lengths. const uint8_t *selected; uint8_t selected_len; int ret = ssl->ctx->alpn_select_cb( ssl, &selected, &selected_len, CBS_data(&protocol_name_list), - CBS_len(&protocol_name_list), ssl->ctx->alpn_select_cb_arg); + static_cast(CBS_len(&protocol_name_list)), + ssl->ctx->alpn_select_cb_arg); // ALPN is required when QUIC is used. if (ssl->quic_method && (ret == SSL_TLSEXT_ERR_NOACK || ret == SSL_TLSEXT_ERR_ALERT_WARNING)) { @@ -2295,11 +2306,13 @@ bool ssl_setup_key_shares(SSL_HANDSHAKE *hs, uint16_t override_group_id) { group_id = groups[0]; - if (is_post_quantum_group(group_id) && groups.size() >= 2) { - // CECPQ2(b) is not sent as the only initial key share. We'll include the - // 2nd preference group too to avoid round-trips. - second_group_id = groups[1]; - assert(second_group_id != group_id); + // We'll try to include one post-quantum and one classical initial key + // share. + for (size_t i = 1; i < groups.size() && second_group_id == 0; i++) { + if (is_post_quantum_group(group_id) != is_post_quantum_group(groups[i])) { + second_group_id = groups[i]; + assert(second_group_id != group_id); + } } } @@ -2308,7 +2321,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; } @@ -2317,7 +2330,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; } } @@ -2349,10 +2362,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; @@ -2369,7 +2382,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; } @@ -2434,13 +2447,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; } @@ -3930,7 +3943,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; } @@ -4097,10 +4109,7 @@ bool tls1_choose_signature_algorithm(SSL_HANDSHAKE *hs, uint16_t *out) { Span peer_sigalgs = tls1_get_peer_verify_algorithms(hs); for (uint16_t sigalg : sigalgs) { - // SSL_SIGN_RSA_PKCS1_MD5_SHA1 is an internal value and should never be - // negotiated. - if (sigalg == SSL_SIGN_RSA_PKCS1_MD5_SHA1 || - !ssl_private_key_supports_signature_algorithm(hs, sigalg)) { + if (!ssl_private_key_supports_signature_algorithm(hs, sigalg)) { continue; } diff --git a/third_party/boringssl/src/ssl/handoff.cc b/third_party/boringssl/src/ssl/handoff.cc index dd248118883b..6e5cc2da1434 100644 --- a/third_party/boringssl/src/ssl/handoff.cc +++ b/third_party/boringssl/src/ssl/handoff.cc @@ -26,7 +26,7 @@ BSSL_NAMESPACE_BEGIN constexpr int kHandoffVersion = 0; constexpr int kHandbackVersion = 0; -static const unsigned kHandoffTagALPS = CBS_ASN1_CONTEXT_SPECIFIC | 0; +static const CBS_ASN1_TAG kHandoffTagALPS = CBS_ASN1_CONTEXT_SPECIFIC | 0; // early_data_t represents the state of early data in a more compact way than // the 3 bits used by the implementation. @@ -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; } } @@ -380,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; @@ -488,6 +500,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 = @@ -704,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. } @@ -799,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, // } // @@ -823,19 +848,22 @@ int SSL_request_handshake_hints(SSL *ssl, const uint8_t *client_hello, // } // HandshakeHints tags. -static const unsigned kServerRandomTLS13Tag = CBS_ASN1_CONTEXT_SPECIFIC | 0; -static const unsigned kKeyShareHintTag = +static const CBS_ASN1_TAG kServerRandomTLS13Tag = + CBS_ASN1_CONTEXT_SPECIFIC | 0; +static const CBS_ASN1_TAG kKeyShareHintTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1; -static const unsigned kSignatureHintTag = +static const CBS_ASN1_TAG kSignatureHintTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 2; -static const unsigned kDecryptedPSKTag = CBS_ASN1_CONTEXT_SPECIFIC | 3; -static const unsigned kIgnorePSKTag = CBS_ASN1_CONTEXT_SPECIFIC | 4; -static const unsigned kCompressCertificateTag = CBS_ASN1_CONTEXT_SPECIFIC | 5; -static const unsigned kServerRandomTLS12Tag = CBS_ASN1_CONTEXT_SPECIFIC | 6; -static const unsigned kECDHEHintTag = CBS_ASN1_CONSTRUCTED | 7; -static const unsigned kDecryptedTicketTag = CBS_ASN1_CONTEXT_SPECIFIC | 8; -static const unsigned kRenewTicketTag = CBS_ASN1_CONTEXT_SPECIFIC | 9; -static const unsigned kIgnoreTicketTag = CBS_ASN1_CONTEXT_SPECIFIC | 10; +static const CBS_ASN1_TAG kDecryptedPSKTag = CBS_ASN1_CONTEXT_SPECIFIC | 3; +static const CBS_ASN1_TAG kIgnorePSKTag = CBS_ASN1_CONTEXT_SPECIFIC | 4; +static const CBS_ASN1_TAG kCompressCertificateTag = + CBS_ASN1_CONTEXT_SPECIFIC | 5; +static const CBS_ASN1_TAG kServerRandomTLS12Tag = + CBS_ASN1_CONTEXT_SPECIFIC | 6; +static const CBS_ASN1_TAG kECDHEHintTag = CBS_ASN1_CONSTRUCTED | 7; +static const CBS_ASN1_TAG kDecryptedTicketTag = CBS_ASN1_CONTEXT_SPECIFIC | 8; +static const CBS_ASN1_TAG kRenewTicketTag = CBS_ASN1_CONTEXT_SPECIFIC | 9; +static const CBS_ASN1_TAG kIgnoreTicketTag = CBS_ASN1_CONTEXT_SPECIFIC | 10; int SSL_serialize_handshake_hints(const SSL *ssl, CBB *out) { const SSL_HANDSHAKE *hs = ssl->s3->hs.get(); @@ -858,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; @@ -954,7 +982,7 @@ int SSL_serialize_handshake_hints(const SSL *ssl, CBB *out) { } static bool get_optional_implicit_null(CBS *cbs, bool *out_present, - unsigned tag) { + CBS_ASN1_TAG tag) { CBS value; int present; if (!CBS_get_optional_asn1(cbs, &value, &present, tag) || @@ -1012,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/third_party/boringssl/src/ssl/handshake_client.cc b/third_party/boringssl/src/ssl/handshake_client.cc index 0a41ffeb6293..7fe2a2b56739 100644 --- a/third_party/boringssl/src/ssl/handshake_client.cc +++ b/third_party/boringssl/src/ssl/handshake_client.cc @@ -239,8 +239,12 @@ static bool ssl_write_client_cipher_list(const SSL_HANDSHAKE *hs, CBB *out, TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff, ssl->config->only_fips_cipher_suites_in_tls13); - if (!EVP_has_aes_hardware() && // - include_chacha20 && // + const bool has_aes_hw = ssl->config->aes_hw_override + ? ssl->config->aes_hw_override_value + : EVP_has_aes_hardware(); + + if (!has_aes_hw && // + include_chacha20 && // !CBB_add_u16(&child, TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) { return false; } @@ -248,8 +252,8 @@ static bool ssl_write_client_cipher_list(const SSL_HANDSHAKE *hs, CBB *out, !CBB_add_u16(&child, TLS1_3_CK_AES_256_GCM_SHA384 & 0xffff)) { return false; } - if (EVP_has_aes_hardware() && // - include_chacha20 && // + if (has_aes_hw && // + include_chacha20 && // !CBB_add_u16(&child, TLS1_3_CK_CHACHA20_POLY1305_SHA256 & 0xffff)) { return false; } @@ -833,11 +837,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; } @@ -1098,7 +1109,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; } @@ -1118,7 +1128,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)) { @@ -1127,10 +1136,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)) { @@ -1390,11 +1398,13 @@ static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs) { ssl_key_usage_t intended_use = (alg_k & SSL_kRSA) ? key_usage_encipherment : key_usage_digital_signature; - if (hs->config->enforce_rsa_key_usage || - EVP_PKEY_id(hs->peer_pubkey.get()) != EVP_PKEY_RSA) { - if (!ssl_cert_check_key_usage(&leaf_cbs, intended_use)) { + if (!ssl_cert_check_key_usage(&leaf_cbs, intended_use)) { + if (hs->config->enforce_rsa_key_usage || + EVP_PKEY_id(hs->peer_pubkey.get()) != EVP_PKEY_RSA) { return ssl_hs_error; } + ERR_clear_error(); + ssl->s3->was_key_usage_invalid = true; } } @@ -1421,7 +1431,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; } @@ -1465,15 +1474,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 a premaster secret and encapsulate it. + bssl::UniquePtr kem = + 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 (!kem || !kem->Encap(&child, &pms, &alert, hs->peer_key)) { ssl_send_alert(ssl, SSL3_AL_FATAL, alert); return ssl_hs_error; } @@ -1481,9 +1491,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 @@ -1509,7 +1517,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/third_party/boringssl/src/ssl/handshake_server.cc b/third_party/boringssl/src/ssl/handshake_server.cc index fa6e9d6e5c54..e50a69021342 100644 --- a/third_party/boringssl/src/ssl/handshake_server.cc +++ b/third_party/boringssl/src/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; } } @@ -1148,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. @@ -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; } @@ -1493,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; } @@ -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/third_party/boringssl/src/ssl/internal.h b/third_party/boringssl/src/ssl/internal.h index 8ef150909890..e12b12f695de 100644 --- a/third_party/boringssl/src/ssl/internal.h +++ b/third_party/boringssl/src/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; @@ -549,8 +547,7 @@ BSSL_NAMESPACE_BEGIN #define SSL_AES256 0x00000004u #define SSL_AES128GCM 0x00000008u #define SSL_AES256GCM 0x00000010u -#define SSL_eNULL 0x00000020u -#define SSL_CHACHA20POLY1305 0x00000040u +#define SSL_CHACHA20POLY1305 0x00000020u #define SSL_AES (SSL_AES128 | SSL_AES256 | SSL_AES128GCM | SSL_AES256GCM) @@ -635,9 +632,11 @@ const EVP_MD *ssl_get_handshake_digest(uint16_t version, // newly-allocated |SSLCipherPreferenceList| containing the result. It returns // true on success and false on failure. If |strict| is true, nonsense will be // rejected. If false, nonsense will be silently ignored. An empty result is -// considered an error regardless of |strict|. +// considered an error regardless of |strict|. |has_aes_hw| indicates if the +// list should be ordered based on having support for AES in hardware or not. bool ssl_create_cipher_list(UniquePtr *out_cipher_list, - const char *rule_str, bool strict); + const bool has_aes_hw, const char *rule_str, + bool strict); // ssl_cipher_auth_mask_for_key returns the mask of cipher |algorithm_auth| // values suitable for use with |key| in TLS 1.2 and below. @@ -661,9 +660,12 @@ size_t ssl_cipher_get_record_split_len(const SSL_CIPHER *cipher); // ssl_choose_tls13_cipher returns an |SSL_CIPHER| corresponding with the best // available from |cipher_suites| compatible with |version|, |group_id|, and -// |only_fips|. It returns NULL if there isn't a compatible cipher. -const SSL_CIPHER *ssl_choose_tls13_cipher(CBS cipher_suites, uint16_t version, - uint16_t group_id, bool only_fips); +// |only_fips|. It returns NULL if there isn't a compatible cipher. |has_aes_hw| +// indicates if the choice should be made as if support for AES in hardware +// is available. +const SSL_CIPHER *ssl_choose_tls13_cipher(CBS cipher_suites, bool has_aes_hw, + uint16_t version, uint16_t group_id, + bool only_fips); // ssl_tls13_cipher_meets_policy returns true if |cipher_id| is acceptable given // |only_fips|. (For now there's only a single policy and so the policy argument @@ -1053,7 +1055,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() {} @@ -1064,40 +1074,29 @@ 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; - // 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|, @@ -1108,7 +1107,7 @@ class SSLKeyShare { struct NamedGroup { int nid; uint16_t group_id; - const char name[8], alias[11]; + const char name[12], alias[12]; }; // NamedGroups returns all supported groups. @@ -1313,7 +1312,8 @@ enum ssl_key_usage_t { // ssl_cert_check_key_usage parses the DER-encoded, X.509 certificate in |in| // and returns true if doesn't specify a key usage or, if it does, if it // includes |bit|. Otherwise it pushes to the error queue and returns false. -bool ssl_cert_check_key_usage(const CBS *in, enum ssl_key_usage_t bit); +OPENSSL_EXPORT bool ssl_cert_check_key_usage(const CBS *in, + enum ssl_key_usage_t bit); // ssl_cert_parse_pubkey extracts the public key from the DER-encoded, X.509 // certificate in |in|. It returns an allocated |EVP_PKEY| or else returns @@ -1692,7 +1692,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; @@ -1852,9 +1852,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 @@ -2762,6 +2762,11 @@ struct SSL3_STATE { // HelloRetryRequest message. bool used_hello_retry_request : 1; + // was_key_usage_invalid is whether the handshake succeeded despite using a + // TLS mode which was incompatible with the leaf certificate's keyUsage + // extension. + bool was_key_usage_invalid : 1; + // hs_buf is the buffer of handshake data to process. UniquePtr hs_buf; @@ -3110,6 +3115,15 @@ struct SSL_CONFIG { // only_fips_cipher_suites_in_tls13 constrains the selection of cipher suites // in TLS 1.3 such that only FIPS approved ones will be selected. bool only_fips_cipher_suites_in_tls13 : 1; + + // aes_hw_override if set indicates we should override checking for aes + // hardware support, and use the value in aes_hw_override_value instead. + bool aes_hw_override : 1; + + // aes_hw_override_value is used for testing to indicate the support or lack + // of support for AES hw. The value is only considered if |aes_hw_override| is + // true. + bool aes_hw_override_value : 1; }; // From RFC 8446, used in determining PSK modes. @@ -3131,8 +3145,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. @@ -3148,23 +3163,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 @@ -3721,6 +3735,15 @@ struct ssl_ctx_st { // in TLS 1.3 such that only FIPS approved ones will be selected. bool only_fips_cipher_suites_in_tls13 : 1; + // aes_hw_override if set indicates we should override checking for AES + // hardware support, and use the value in aes_hw_override_value instead. + bool aes_hw_override : 1; + + // aes_hw_override_value is used for testing to indicate the support or lack + // of support for AES hardware. The value is only considered if + // |aes_hw_override| is true. + bool aes_hw_override_value : 1; + private: ~ssl_ctx_st(); friend OPENSSL_EXPORT void SSL_CTX_free(SSL_CTX *); @@ -3837,11 +3860,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/third_party/boringssl/src/ssl/s3_both.cc b/third_party/boringssl/src/ssl/s3_both.cc index cb831f2e9ee5..f8352f3d75c6 100644 --- a/third_party/boringssl/src/ssl/s3_both.cc +++ b/third_party/boringssl/src/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; } @@ -664,31 +663,26 @@ void tls_next_message(SSL *ssl) { // the client. class CipherScorer { public: - CipherScorer(uint16_t group_id) - : aes_is_fine_(EVP_has_aes_hardware()), - security_128_is_fine_(group_id != SSL_CURVE_CECPQ2) {} + CipherScorer(bool has_aes_hw) : aes_is_fine_(has_aes_hw) {} - typedef std::tuple Score; + typedef std::tuple Score; // MinScore returns a |Score| that will compare less than the score of all // cipher suites. Score MinScore() const { - return Score(false, false, false); + return Score(false, false); } Score Evaluate(const SSL_CIPHER *a) const { return Score( // Something is always preferable to nothing. true, - // Either 128-bit is fine, or 256-bit is preferred. - security_128_is_fine_ || a->algorithm_enc != SSL_AES128GCM, // Either AES is fine, or else ChaCha20 is preferred. aes_is_fine_ || a->algorithm_enc == SSL_CHACHA20POLY1305); } private: const bool aes_is_fine_; - const bool security_128_is_fine_; }; bool ssl_tls13_cipher_meets_policy(uint16_t cipher_id, bool only_fips) { @@ -708,14 +702,15 @@ bool ssl_tls13_cipher_meets_policy(uint16_t cipher_id, bool only_fips) { } } -const SSL_CIPHER *ssl_choose_tls13_cipher(CBS cipher_suites, uint16_t version, - uint16_t group_id, bool only_fips) { +const SSL_CIPHER *ssl_choose_tls13_cipher(CBS cipher_suites, bool has_aes_hw, + uint16_t version, uint16_t group_id, + bool only_fips) { if (CBS_len(&cipher_suites) % 2 != 0) { return nullptr; } const SSL_CIPHER *best = nullptr; - CipherScorer scorer(group_id); + CipherScorer scorer(has_aes_hw); CipherScorer::Score best_score = scorer.MinScore(); while (CBS_len(&cipher_suites) > 0) { diff --git a/third_party/boringssl/src/ssl/s3_lib.cc b/third_party/boringssl/src/ssl/s3_lib.cc index 2adf386971dd..8e8a034eb54b 100644 --- a/third_party/boringssl/src/ssl/s3_lib.cc +++ b/third_party/boringssl/src/ssl/s3_lib.cc @@ -178,7 +178,8 @@ SSL3_STATE::SSL3_STATE() early_data_accepted(false), alert_dispatch(false), renegotiate_pending(false), - used_hello_retry_request(false) {} + used_hello_retry_request(false), + was_key_usage_invalid(false) {} SSL3_STATE::~SSL3_STATE() {} diff --git a/third_party/boringssl/src/ssl/ssl_aead_ctx.cc b/third_party/boringssl/src/ssl/ssl_aead_ctx.cc index 27f0084fbd05..25569221bca8 100644 --- a/third_party/boringssl/src/ssl/ssl_aead_ctx.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/ssl/ssl_asn1.cc b/third_party/boringssl/src/ssl/ssl_asn1.cc index 0426437c0387..3311246c6f6e 100644 --- a/third_party/boringssl/src/ssl/ssl_asn1.cc +++ b/third_party/boringssl/src/ssl/ssl_asn1.cc @@ -150,57 +150,57 @@ BSSL_NAMESPACE_BEGIN static const unsigned kVersion = 1; -static const unsigned kTimeTag = +static const CBS_ASN1_TAG kTimeTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 1; -static const unsigned kTimeoutTag = +static const CBS_ASN1_TAG kTimeoutTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 2; -static const unsigned kPeerTag = +static const CBS_ASN1_TAG kPeerTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 3; -static const unsigned kSessionIDContextTag = +static const CBS_ASN1_TAG kSessionIDContextTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 4; -static const unsigned kVerifyResultTag = +static const CBS_ASN1_TAG kVerifyResultTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 5; -static const unsigned kHostNameTag = +static const CBS_ASN1_TAG kHostNameTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 6; -static const unsigned kPSKIdentityTag = +static const CBS_ASN1_TAG kPSKIdentityTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 8; -static const unsigned kTicketLifetimeHintTag = +static const CBS_ASN1_TAG kTicketLifetimeHintTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 9; -static const unsigned kTicketTag = +static const CBS_ASN1_TAG kTicketTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 10; -static const unsigned kPeerSHA256Tag = +static const CBS_ASN1_TAG kPeerSHA256Tag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 13; -static const unsigned kOriginalHandshakeHashTag = +static const CBS_ASN1_TAG kOriginalHandshakeHashTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 14; -static const unsigned kSignedCertTimestampListTag = +static const CBS_ASN1_TAG kSignedCertTimestampListTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 15; -static const unsigned kOCSPResponseTag = +static const CBS_ASN1_TAG kOCSPResponseTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 16; -static const unsigned kExtendedMasterSecretTag = +static const CBS_ASN1_TAG kExtendedMasterSecretTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 17; -static const unsigned kGroupIDTag = +static const CBS_ASN1_TAG kGroupIDTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 18; -static const unsigned kCertChainTag = +static const CBS_ASN1_TAG kCertChainTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 19; -static const unsigned kTicketAgeAddTag = +static const CBS_ASN1_TAG kTicketAgeAddTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 21; -static const unsigned kIsServerTag = +static const CBS_ASN1_TAG kIsServerTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 22; -static const unsigned kPeerSignatureAlgorithmTag = +static const CBS_ASN1_TAG kPeerSignatureAlgorithmTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 23; -static const unsigned kTicketMaxEarlyDataTag = +static const CBS_ASN1_TAG kTicketMaxEarlyDataTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 24; -static const unsigned kAuthTimeoutTag = +static const CBS_ASN1_TAG kAuthTimeoutTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 25; -static const unsigned kEarlyALPNTag = +static const CBS_ASN1_TAG kEarlyALPNTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 26; -static const unsigned kIsQuicTag = +static const CBS_ASN1_TAG kIsQuicTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 27; -static const unsigned kQuicEarlyDataContextTag = +static const CBS_ASN1_TAG kQuicEarlyDataContextTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 28; -static const unsigned kLocalALPSTag = +static const CBS_ASN1_TAG kLocalALPSTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 29; -static const unsigned kPeerALPSTag = +static const CBS_ASN1_TAG kPeerALPSTag = CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 30; static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, @@ -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; } } @@ -438,7 +414,8 @@ static int SSL_SESSION_to_bytes_full(const SSL_SESSION *in, CBB *cbb, // tagged with |tag| from |cbs| and saves it in |*out|. If the element was not // found, it sets |*out| to NULL. It returns one on success, whether or not the // element was found, and zero on decode error. -static int SSL_SESSION_parse_string(CBS *cbs, UniquePtr *out, unsigned tag) { +static int SSL_SESSION_parse_string(CBS *cbs, UniquePtr *out, + CBS_ASN1_TAG tag) { CBS value; int present; if (!CBS_get_optional_asn1_octet_string(cbs, &value, &present, tag)) { @@ -452,7 +429,6 @@ static int SSL_SESSION_parse_string(CBS *cbs, UniquePtr *out, unsigned tag } char *raw = nullptr; if (!CBS_strdup(&value, &raw)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); return 0; } out->reset(raw); @@ -466,7 +442,7 @@ static int SSL_SESSION_parse_string(CBS *cbs, UniquePtr *out, unsigned tag // tagged with |tag| from |cbs| and stows it in |*out|. It returns one on // success, whether or not the element was found, and zero on decode error. static bool SSL_SESSION_parse_octet_string(CBS *cbs, Array *out, - unsigned tag) { + CBS_ASN1_TAG tag) { CBS value; if (!CBS_get_optional_asn1_octet_string(cbs, &value, NULL, tag)) { OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SSL_SESSION); @@ -477,7 +453,7 @@ static bool SSL_SESSION_parse_octet_string(CBS *cbs, Array *out, static int SSL_SESSION_parse_crypto_buffer(CBS *cbs, UniquePtr *out, - unsigned tag, + CBS_ASN1_TAG tag, CRYPTO_BUFFER_POOL *pool) { if (!CBS_peek_asn1_tag(cbs, tag)) { return 1; @@ -492,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; @@ -500,8 +475,10 @@ static int SSL_SESSION_parse_crypto_buffer(CBS *cbs, // SSL_SESSION_parse_bounded_octet_string parses an optional ASN.1 OCTET STRING // explicitly tagged with |tag| of size at most |max_out|. -static int SSL_SESSION_parse_bounded_octet_string( - CBS *cbs, uint8_t *out, uint8_t *out_len, uint8_t max_out, unsigned tag) { +static int SSL_SESSION_parse_bounded_octet_string(CBS *cbs, uint8_t *out, + uint8_t *out_len, + uint8_t max_out, + CBS_ASN1_TAG tag) { CBS value; if (!CBS_get_optional_asn1_octet_string(cbs, &value, NULL, tag) || CBS_len(&value) > max_out) { @@ -509,11 +486,11 @@ static int SSL_SESSION_parse_bounded_octet_string( 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; } -static int SSL_SESSION_parse_long(CBS *cbs, long *out, unsigned tag, +static int SSL_SESSION_parse_long(CBS *cbs, long *out, CBS_ASN1_TAG tag, long default_value) { uint64_t value; if (!CBS_get_optional_asn1_uint64(cbs, &value, tag, @@ -526,7 +503,7 @@ static int SSL_SESSION_parse_long(CBS *cbs, long *out, unsigned tag, return 1; } -static int SSL_SESSION_parse_u32(CBS *cbs, uint32_t *out, unsigned tag, +static int SSL_SESSION_parse_u32(CBS *cbs, uint32_t *out, CBS_ASN1_TAG tag, uint32_t default_value) { uint64_t value; if (!CBS_get_optional_asn1_uint64(cbs, &value, tag, @@ -539,7 +516,7 @@ static int SSL_SESSION_parse_u32(CBS *cbs, uint32_t *out, unsigned tag, return 1; } -static int SSL_SESSION_parse_u16(CBS *cbs, uint16_t *out, unsigned tag, +static int SSL_SESSION_parse_u16(CBS *cbs, uint16_t *out, CBS_ASN1_TAG tag, uint16_t default_value) { uint64_t value; if (!CBS_get_optional_asn1_uint64(cbs, &value, tag, @@ -601,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; @@ -709,7 +690,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; } @@ -717,7 +697,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; } } @@ -733,7 +712,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; } } @@ -808,7 +786,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/third_party/boringssl/src/ssl/ssl_cert.cc b/third_party/boringssl/src/ssl/ssl_cert.cc index 68e010ad6f0f..aa46a8bb6751 100644 --- a/third_party/boringssl/src/ssl/ssl_cert.cc +++ b/third_party/boringssl/src/ssl/ssl_cert.cc @@ -142,9 +142,9 @@ CERT::~CERT() { x509_method->cert_free(this); } -static CRYPTO_BUFFER *buffer_up_ref(CRYPTO_BUFFER *buffer) { - CRYPTO_BUFFER_up_ref(buffer); - return buffer; +static CRYPTO_BUFFER *buffer_up_ref(const CRYPTO_BUFFER *buffer) { + CRYPTO_BUFFER_up_ref(const_cast(buffer)); + return const_cast(buffer); } UniquePtr ssl_cert_dup(CERT *cert) { @@ -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; @@ -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/third_party/boringssl/src/ssl/ssl_cipher.cc b/third_party/boringssl/src/ssl/ssl_cipher.cc index 7c4c034acc33..383329403d18 100644 --- a/third_party/boringssl/src/ssl/ssl_cipher.cc +++ b/third_party/boringssl/src/ssl/ssl_cipher.cc @@ -157,17 +157,6 @@ BSSL_NAMESPACE_BEGIN static constexpr SSL_CIPHER kCiphers[] = { // The RSA ciphers - // Cipher 02 - { - SSL3_TXT_RSA_NULL_SHA, - "TLS_RSA_WITH_NULL_SHA", - SSL3_CK_RSA_NULL_SHA, - SSL_kRSA, - SSL_aRSA, - SSL_eNULL, - SSL_SHA1, - SSL_HANDSHAKE_MAC_DEFAULT, - }, // Cipher 0A { @@ -498,7 +487,6 @@ typedef struct cipher_alias_st { } CIPHER_ALIAS; static const CIPHER_ALIAS kCipherAliases[] = { - // "ALL" doesn't include eNULL. It must be explicitly enabled. {"ALL", ~0u, ~0u, ~0u, ~0u, 0}, // The "COMPLEMENTOFDEFAULT" rule is omitted. It matches nothing. @@ -599,9 +587,7 @@ bool ssl_cipher_get_evp_aead(const EVP_AEAD **out_aead, *out_fixed_iv_len = EVP_AEAD_nonce_length(*out_aead); } } else if (cipher->algorithm_mac == SSL_SHA1) { - if (cipher->algorithm_enc == SSL_eNULL) { - *out_aead = EVP_aead_null_sha1_tls(); - } else if (cipher->algorithm_enc == SSL_3DES) { + if (cipher->algorithm_enc == SSL_3DES) { if (version == TLS1_VERSION) { *out_aead = EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv(); *out_fixed_iv_len = 8; @@ -866,9 +852,7 @@ static void ssl_cipher_apply_rule( !(alg_auth & cp->algorithm_auth) || !(alg_enc & cp->algorithm_enc) || !(alg_mac & cp->algorithm_mac) || - (min_version != 0 && SSL_CIPHER_get_min_version(cp) != min_version) || - // The NULL cipher must be selected explicitly. - cp->algorithm_enc == SSL_eNULL) { + (min_version != 0 && SSL_CIPHER_get_min_version(cp) != min_version)) { continue; } } @@ -1002,8 +986,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 +1039,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++; } @@ -1150,7 +1132,8 @@ static bool ssl_cipher_process_rulestr(const char *rule_str, } bool ssl_create_cipher_list(UniquePtr *out_cipher_list, - const char *rule_str, bool strict) { + const bool has_aes_hw, const char *rule_str, + bool strict) { // Return with error if nothing to do. if (rule_str == NULL || out_cipher_list == NULL) { return false; @@ -1181,7 +1164,7 @@ bool ssl_create_cipher_list(UniquePtr *out_cipher_list, // CHACHA20 unless there is hardware support for fast and constant-time // AES_GCM. Of the two CHACHA20 variants, the new one is preferred over the // old one. - if (EVP_has_aes_hardware()) { + if (has_aes_hw) { ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES128GCM, ~0u, 0, CIPHER_ADD, -1, false, &head, &tail); ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES256GCM, ~0u, 0, CIPHER_ADD, -1, @@ -1384,8 +1367,6 @@ int SSL_CIPHER_is_aead(const SSL_CIPHER *cipher) { int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *cipher) { switch (cipher->algorithm_enc) { - case SSL_eNULL: - return NID_undef; case SSL_3DES: return NID_des_ede3_cbc; case SSL_AES128: @@ -1458,8 +1439,7 @@ int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *cipher) { } int SSL_CIPHER_is_block_cipher(const SSL_CIPHER *cipher) { - return (cipher->algorithm_enc & SSL_eNULL) == 0 && - cipher->algorithm_mac != SSL_AEAD; + return cipher->algorithm_mac != SSL_AEAD; } uint16_t SSL_CIPHER_get_min_version(const SSL_CIPHER *cipher) { @@ -1533,14 +1513,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; @@ -1566,11 +1538,6 @@ int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *out_alg_bits) { strength_bits = 112; break; - case SSL_eNULL: - alg_bits = 0; - strength_bits = 0; - break; - default: assert(0); alg_bits = 0; @@ -1661,10 +1628,6 @@ const char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, enc = "ChaCha20-Poly1305"; break; - case SSL_eNULL: - enc="None"; - break; - default: enc = "unknown"; break; diff --git a/third_party/boringssl/src/ssl/ssl_file.cc b/third_party/boringssl/src/ssl/ssl_file.cc index d867cf12c31e..9e06ec893f6e 100644 --- a/third_party/boringssl/src/ssl/ssl_file.cc +++ b/third_party/boringssl/src/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)}; diff --git a/third_party/boringssl/src/ssl/ssl_key_share.cc b/third_party/boringssl/src/ssl/ssl_key_share.cc index 920f25eed8ae..8885246f3e7b 100644 --- a/third_party/boringssl/src/ssl/ssl_key_share.cc +++ b/third_party/boringssl/src/ssl/ssl_key_share.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -38,85 +39,76 @@ 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 { + bool Generate(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; } return true; } - bool Finish(Array *out_secret, uint8_t *out_alert, - Span peer_key) override { - assert(private_key_); + 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); + } - // 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; - } + bool Decap(Array *out_secret, uint8_t *out_alert, + Span ciphertext) override { + assert(group_); + assert(private_key_); + *out_alert = SSL_AD_INTERNAL_ERROR; - 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())) { + 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; } // 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 +117,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 +132,7 @@ class ECKeyShare : public SSLKeyShare { private: UniquePtr private_key_; - int nid_; + const EC_GROUP *const group_ = nullptr; uint16_t group_id_; }; @@ -150,24 +142,31 @@ 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; if (!secret.Init(32)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); 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; @@ -193,65 +192,61 @@ class X25519KeyShare : public SSLKeyShare { uint8_t private_key_[32]; }; -class CECPQ2KeyShare : public SSLKeyShare { +class X25519Kyber768KeyShare : public SSLKeyShare { public: - CECPQ2KeyShare() {} + X25519Kyber768KeyShare() {} - uint16_t GroupID() const override { return SSL_CURVE_CECPQ2; } + uint16_t GroupID() const override { return SSL_CURVE_X25519KYBER768; } - bool Offer(CBB *out) override { + bool Generate(CBB *out) override { uint8_t x25519_public_key[32]; X25519_keypair(x25519_public_key, x25519_private_key_); - uint8_t hrss_entropy[HRSS_GENERATE_KEY_BYTES]; - HRSS_public_key hrss_public_key; - RAND_bytes(hrss_entropy, sizeof(hrss_entropy)); - if (!HRSS_generate_key(&hrss_public_key, &hrss_private_key_, - hrss_entropy)) { - return false; - } - - uint8_t hrss_public_key_bytes[HRSS_PUBLIC_KEY_BYTES]; - HRSS_marshal_public_key(hrss_public_key_bytes, &hrss_public_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, hrss_public_key_bytes, - sizeof(hrss_public_key_bytes))) { + !CBB_add_bytes(out, kyber_public_key, sizeof(kyber_public_key))) { return false; } 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)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); + if (!secret.Init(32 + 32)) { return false; } uint8_t x25519_public_key[32]; X25519_keypair(x25519_public_key, x25519_private_key_); - - HRSS_public_key peer_public_key; - if (peer_key.size() != 32 + HRSS_PUBLIC_KEY_BYTES || - !HRSS_parse_public_key(&peer_public_key, peer_key.data() + 32) || - !X25519(secret.data(), x25519_private_key_, peer_key.data())) { + 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 ciphertext[HRSS_CIPHERTEXT_BYTES]; - uint8_t entropy[HRSS_ENCAP_BYTES]; - RAND_bytes(entropy, sizeof(entropy)); + uint8_t kyber_ciphertext[KYBER_CIPHERTEXT_BYTES]; + KYBER_encap(kyber_ciphertext, secret.data() + 32, secret.size() - 32, + &peer_kyber_pub); - if (!HRSS_encap(ciphertext, secret.data() + 32, &peer_public_key, - entropy) || - !CBB_add_bytes(out_public_key, x25519_public_key, + if (!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, kyber_ciphertext, + sizeof(kyber_ciphertext))) { return false; } @@ -259,35 +254,54 @@ 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; - if (!secret.Init(32 + HRSS_KEY_BYTES)) { - OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); + if (!secret.Init(32 + 32)) { return false; } - if (peer_key.size() != 32 + HRSS_CIPHERTEXT_BYTES || - !X25519(secret.data(), x25519_private_key_, peer_key.data())) { + 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; } - if (!HRSS_decap(secret.data() + 32, &hrss_private_key_, - peer_key.data() + 32, peer_key.size() - 32)) { - 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]; - HRSS_private_key hrss_private_key_; + KYBER_private_key kyber_private_key_; +}; + +class P256Kyber768KeyShare : public SSLKeyShare { + public: + P256Kyber768KeyShare() {} + + uint16_t GroupID() const override { return SSL_CURVE_P256KYBER768; } + + 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; + } + + bool Encap(CBB *out_ciphertext, Array *out_secret, + uint8_t *out_alert, Span peer_key) override { + return false; + } + + bool Decap(Array *out_secret, uint8_t *out_alert, + Span ciphertext) override { + return false; + } }; constexpr NamedGroup kNamedGroups[] = { @@ -296,7 +310,9 @@ constexpr NamedGroup kNamedGroups[] = { {NID_secp384r1, SSL_CURVE_SECP384R1, "P-384", "secp384r1"}, {NID_secp521r1, SSL_CURVE_SECP521R1, "P-521", "secp521r1"}, {NID_X25519, SSL_CURVE_X25519, "X25519", "x25519"}, - {NID_CECPQ2, SSL_CURVE_CECPQ2, "CECPQ2", "CECPQ2"}, + {NID_X25519Kyber768, SSL_CURVE_X25519KYBER768, "X25519KYBER", + "X25519Kyber"}, + {NID_P256Kyber768, SSL_CURVE_P256KYBER768, "P256KYBER", "P256Kyber"}, }; } // namespace @@ -308,58 +324,24 @@ 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()); - case SSL_CURVE_CECPQ2: - return UniquePtr(New()); + return MakeUnique(); + case SSL_CURVE_X25519KYBER768: + return MakeUnique(); + case SSL_CURVE_P256KYBER768: + return MakeUnique(); default: return nullptr; } } -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; - 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/third_party/boringssl/src/ssl/ssl_lib.cc b/third_party/boringssl/src/ssl/ssl_lib.cc index 0d759e8cf266..254610d7f84f 100644 --- a/third_party/boringssl/src/ssl/ssl_lib.cc +++ b/third_party/boringssl/src/ssl/ssl_lib.cc @@ -143,6 +143,7 @@ #include #include +#include #include #include @@ -483,6 +484,17 @@ bool SSL_get_traffic_secrets(const SSL *ssl, return true; } +void SSL_CTX_set_aes_hw_override_for_testing(SSL_CTX *ctx, + bool override_value) { + ctx->aes_hw_override = true; + ctx->aes_hw_override_value = override_value; +} + +void SSL_set_aes_hw_override_for_testing(SSL *ssl, bool override_value) { + ssl->config->aes_hw_override = true; + ssl->config->aes_hw_override_value = override_value; +} + BSSL_NAMESPACE_END using namespace bssl; @@ -524,7 +536,9 @@ ssl_ctx_st::ssl_ctx_st(const SSL_METHOD *ssl_method) false_start_allowed_without_alpn(false), handoff(false), enable_early_data(false), - only_fips_cipher_suites_in_tls13(false) { + only_fips_cipher_suites_in_tls13(false), + aes_hw_override(false), + aes_hw_override_value(false) { CRYPTO_MUTEX_init(&lock); CRYPTO_new_ex_data(&ex_data); } @@ -646,6 +660,8 @@ SSL *SSL_new(SSL_CTX *ctx) { ssl->config->permute_extensions = ctx->permute_extensions; ssl->config->only_fips_cipher_suites_in_tls13 = ctx->only_fips_cipher_suites_in_tls13; + ssl->config->aes_hw_override = ctx->aes_hw_override; + ssl->config->aes_hw_override_value = ctx->aes_hw_override_value; if (!ssl->config->supported_group_list.CopyFrom(ctx->supported_group_list) || !ssl->config->alpn_client_proto_list.CopyFrom( @@ -2027,18 +2043,27 @@ const char *SSL_get_cipher_list(const SSL *ssl, int n) { } int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str) { - return ssl_create_cipher_list(&ctx->cipher_list, str, false /* not strict */); + const bool has_aes_hw = ctx->aes_hw_override ? ctx->aes_hw_override_value + : EVP_has_aes_hardware(); + return ssl_create_cipher_list(&ctx->cipher_list, has_aes_hw, str, + false /* not strict */); } int SSL_CTX_set_strict_cipher_list(SSL_CTX *ctx, const char *str) { - return ssl_create_cipher_list(&ctx->cipher_list, str, true /* strict */); + const bool has_aes_hw = ctx->aes_hw_override ? ctx->aes_hw_override_value + : EVP_has_aes_hardware(); + return ssl_create_cipher_list(&ctx->cipher_list, has_aes_hw, str, + true /* strict */); } int SSL_set_cipher_list(SSL *ssl, const char *str) { if (!ssl->config) { return 0; } - return ssl_create_cipher_list(&ssl->config->cipher_list, str, + const bool has_aes_hw = ssl->config->aes_hw_override + ? ssl->config->aes_hw_override_value + : EVP_has_aes_hardware(); + return ssl_create_cipher_list(&ssl->config->cipher_list, has_aes_hw, str, false /* not strict */); } @@ -2046,7 +2071,10 @@ int SSL_set_strict_cipher_list(SSL *ssl, const char *str) { if (!ssl->config) { return 0; } - return ssl_create_cipher_list(&ssl->config->cipher_list, str, + const bool has_aes_hw = ssl->config->aes_hw_override + ? ssl->config->aes_hw_override_value + : EVP_has_aes_hardware(); + return ssl_create_cipher_list(&ssl->config->cipher_list, has_aes_hw, str, true /* strict */); } @@ -2149,7 +2177,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; @@ -2201,8 +2228,10 @@ int SSL_select_next_proto(uint8_t **out, uint8_t *out_len, const uint8_t *peer, void SSL_get0_next_proto_negotiated(const SSL *ssl, const uint8_t **out_data, unsigned *out_len) { + // NPN protocols have one-byte lengths, so they must fit in |unsigned|. + assert(ssl->s3->next_proto_negotiated.size() <= UINT_MAX); *out_data = ssl->s3->next_proto_negotiated.data(); - *out_len = ssl->s3->next_proto_negotiated.size(); + *out_len = static_cast(ssl->s3->next_proto_negotiated.size()); } void SSL_CTX_set_next_protos_advertised_cb( @@ -2222,7 +2251,7 @@ void SSL_CTX_set_next_proto_select_cb( } int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const uint8_t *protos, - unsigned protos_len) { + size_t protos_len) { // Note this function's return value is backwards. auto span = MakeConstSpan(protos, protos_len); if (!span.empty() && !ssl_is_valid_alpn_list(span)) { @@ -2232,7 +2261,7 @@ int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const uint8_t *protos, return ctx->alpn_client_proto_list.CopyFrom(span) ? 0 : 1; } -int SSL_set_alpn_protos(SSL *ssl, const uint8_t *protos, unsigned protos_len) { +int SSL_set_alpn_protos(SSL *ssl, const uint8_t *protos, size_t protos_len) { // Note this function's return value is backwards. if (!ssl->config) { return 1; @@ -2256,13 +2285,16 @@ void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, void SSL_get0_alpn_selected(const SSL *ssl, const uint8_t **out_data, unsigned *out_len) { + Span protocol; if (SSL_in_early_data(ssl) && !ssl->server) { - *out_data = ssl->s3->hs->early_session->early_alpn.data(); - *out_len = ssl->s3->hs->early_session->early_alpn.size(); + protocol = ssl->s3->hs->early_session->early_alpn; } else { - *out_data = ssl->s3->alpn_selected.data(); - *out_len = ssl->s3->alpn_selected.size(); + protocol = ssl->s3->alpn_selected; } + // ALPN protocols have one-byte lengths, so they must fit in |unsigned|. + assert(protocol.size() < UINT_MAX); + *out_data = protocol.data(); + *out_len = static_cast(protocol.size()); } void SSL_CTX_set_allow_unknown_alpn_protos(SSL_CTX *ctx, int enabled) { @@ -2803,6 +2835,10 @@ void SSL_set_enforce_rsa_key_usage(SSL *ssl, int enabled) { ssl->config->enforce_rsa_key_usage = !!enabled; } +int SSL_was_key_usage_invalid(const SSL *ssl) { + return ssl->s3->was_key_usage_invalid; +} + void SSL_set_renegotiate_mode(SSL *ssl, enum ssl_renegotiate_mode_t mode) { ssl->renegotiate_mode = mode; diff --git a/third_party/boringssl/src/ssl/ssl_privkey.cc b/third_party/boringssl/src/ssl/ssl_privkey.cc index 0843e0b24f59..5a75b5e51728 100644 --- a/third_party/boringssl/src/ssl/ssl_privkey.cc +++ b/third_party/boringssl/src/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; } @@ -151,6 +151,20 @@ static bool pkey_supports_algorithm(const SSL *ssl, EVP_PKEY *pkey, return false; } + if (ssl_protocol_version(ssl) < TLS1_2_VERSION) { + // TLS 1.0 and 1.1 do not negotiate algorithms and always sign one of two + // hardcoded algorithms. + return sigalg == SSL_SIGN_RSA_PKCS1_MD5_SHA1 || + sigalg == SSL_SIGN_ECDSA_SHA1; + } + + // |SSL_SIGN_RSA_PKCS1_MD5_SHA1| is not a real SignatureScheme for TLS 1.2 and + // higher. It is an internal value we use to represent TLS 1.0/1.1's MD5/SHA1 + // concatenation. + if (sigalg == SSL_SIGN_RSA_PKCS1_MD5_SHA1) { + return false; + } + if (ssl_protocol_version(ssl) >= TLS1_3_VERSION) { // RSA keys may only be used with RSA-PSS. if (alg->pkey_type == EVP_PKEY_RSA && !alg->is_rsa_pss) { @@ -531,9 +545,83 @@ int SSL_is_signature_algorithm_rsa_pss(uint16_t sigalg) { return alg != nullptr && alg->is_rsa_pss; } +static int compare_uint16_t(const void *p1, const void *p2) { + uint16_t u1 = *((const uint16_t *)p1); + uint16_t u2 = *((const uint16_t *)p2); + if (u1 < u2) { + return -1; + } else if (u1 > u2) { + return 1; + } else { + return 0; + } +} + +static bool sigalgs_unique(Span in_sigalgs) { + if (in_sigalgs.size() < 2) { + return true; + } + + Array sigalgs; + if (!sigalgs.CopyFrom(in_sigalgs)) { + return false; + } + + qsort(sigalgs.data(), sigalgs.size(), sizeof(uint16_t), compare_uint16_t); + + for (size_t i = 1; i < sigalgs.size(); i++) { + if (sigalgs[i - 1] == sigalgs[i]) { + OPENSSL_PUT_ERROR(SSL, SSL_R_DUPLICATE_SIGNATURE_ALGORITHM); + return false; + } + } + + return true; +} + +static bool set_sigalg_prefs(Array *out, Span prefs) { + if (!sigalgs_unique(prefs)) { + return false; + } + + // Check for invalid algorithms, and filter out |SSL_SIGN_RSA_PKCS1_MD5_SHA1|. + Array filtered; + if (!filtered.Init(prefs.size())) { + return false; + } + size_t added = 0; + for (uint16_t pref : prefs) { + if (pref == SSL_SIGN_RSA_PKCS1_MD5_SHA1) { + // Though not intended to be used with this API, we treat + // |SSL_SIGN_RSA_PKCS1_MD5_SHA1| as a real signature algorithm in + // |SSL_PRIVATE_KEY_METHOD|. Not accepting it here makes for a confusing + // abstraction. + continue; + } + if (get_signature_algorithm(pref) == nullptr) { + OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM); + return false; + } + filtered[added] = pref; + added++; + } + filtered.Shrink(added); + + // This can happen if |prefs| contained only |SSL_SIGN_RSA_PKCS1_MD5_SHA1|. + // Leaving it empty would revert to the default, so treat this as an error + // condition. + if (!prefs.empty() && filtered.empty()) { + OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM); + return false; + } + + *out = std::move(filtered); + return true; +} + int SSL_CTX_set_signing_algorithm_prefs(SSL_CTX *ctx, const uint16_t *prefs, size_t num_prefs) { - return ctx->cert->sigalgs.CopyFrom(MakeConstSpan(prefs, num_prefs)); + return set_sigalg_prefs(&ctx->cert->sigalgs, MakeConstSpan(prefs, num_prefs)); } int SSL_set_signing_algorithm_prefs(SSL *ssl, const uint16_t *prefs, @@ -541,7 +629,8 @@ int SSL_set_signing_algorithm_prefs(SSL *ssl, const uint16_t *prefs, if (!ssl->config) { return 0; } - return ssl->config->cert->sigalgs.CopyFrom(MakeConstSpan(prefs, num_prefs)); + return set_sigalg_prefs(&ssl->config->cert->sigalgs, + MakeConstSpan(prefs, num_prefs)); } static constexpr struct { @@ -597,50 +686,16 @@ static bool parse_sigalg_pairs(Array *out, const int *values, return true; } -static int compare_uint16_t(const void *p1, const void *p2) { - uint16_t u1 = *((const uint16_t *)p1); - uint16_t u2 = *((const uint16_t *)p2); - if (u1 < u2) { - return -1; - } else if (u1 > u2) { - return 1; - } else { - return 0; - } -} - -static bool sigalgs_unique(Span in_sigalgs) { - if (in_sigalgs.size() < 2) { - return true; - } - - Array sigalgs; - if (!sigalgs.CopyFrom(in_sigalgs)) { - return false; - } - - qsort(sigalgs.data(), sigalgs.size(), sizeof(uint16_t), compare_uint16_t); - - for (size_t i = 1; i < sigalgs.size(); i++) { - if (sigalgs[i - 1] == sigalgs[i]) { - OPENSSL_PUT_ERROR(SSL, SSL_R_DUPLICATE_SIGNATURE_ALGORITHM); - return false; - } - } - - return true; -} - int SSL_CTX_set1_sigalgs(SSL_CTX *ctx, const int *values, size_t num_values) { Array sigalgs; - if (!parse_sigalg_pairs(&sigalgs, values, num_values) || - !sigalgs_unique(sigalgs)) { + if (!parse_sigalg_pairs(&sigalgs, values, num_values)) { return 0; } if (!SSL_CTX_set_signing_algorithm_prefs(ctx, sigalgs.data(), sigalgs.size()) || - !ctx->verify_sigalgs.CopyFrom(sigalgs)) { + !SSL_CTX_set_verify_algorithm_prefs(ctx, sigalgs.data(), + sigalgs.size())) { return 0; } @@ -654,13 +709,12 @@ int SSL_set1_sigalgs(SSL *ssl, const int *values, size_t num_values) { } Array sigalgs; - if (!parse_sigalg_pairs(&sigalgs, values, num_values) || - !sigalgs_unique(sigalgs)) { + if (!parse_sigalg_pairs(&sigalgs, values, num_values)) { return 0; } if (!SSL_set_signing_algorithm_prefs(ssl, sigalgs.data(), sigalgs.size()) || - !ssl->config->verify_sigalgs.CopyFrom(sigalgs)) { + !SSL_set_verify_algorithm_prefs(ssl, sigalgs.data(), sigalgs.size())) { return 0; } @@ -805,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); @@ -823,8 +876,7 @@ static bool parse_sigalgs_list(Array *out, const char *str) { int SSL_CTX_set1_sigalgs_list(SSL_CTX *ctx, const char *str) { Array sigalgs; - if (!parse_sigalgs_list(&sigalgs, str) || - !sigalgs_unique(sigalgs)) { + if (!parse_sigalgs_list(&sigalgs, str)) { return 0; } @@ -845,8 +897,7 @@ int SSL_set1_sigalgs_list(SSL *ssl, const char *str) { } Array sigalgs; - if (!parse_sigalgs_list(&sigalgs, str) || - !sigalgs_unique(sigalgs)) { + if (!parse_sigalgs_list(&sigalgs, str)) { return 0; } @@ -860,7 +911,8 @@ int SSL_set1_sigalgs_list(SSL *ssl, const char *str) { int SSL_CTX_set_verify_algorithm_prefs(SSL_CTX *ctx, const uint16_t *prefs, size_t num_prefs) { - return ctx->verify_sigalgs.CopyFrom(MakeConstSpan(prefs, num_prefs)); + return set_sigalg_prefs(&ctx->verify_sigalgs, + MakeConstSpan(prefs, num_prefs)); } int SSL_set_verify_algorithm_prefs(SSL *ssl, const uint16_t *prefs, @@ -870,5 +922,6 @@ int SSL_set_verify_algorithm_prefs(SSL *ssl, const uint16_t *prefs, return 0; } - return ssl->config->verify_sigalgs.CopyFrom(MakeConstSpan(prefs, num_prefs)); + return set_sigalg_prefs(&ssl->config->verify_sigalgs, + MakeConstSpan(prefs, num_prefs)); } diff --git a/third_party/boringssl/src/ssl/ssl_session.cc b/third_party/boringssl/src/ssl/ssl_session.cc index 05bcf6f82a4c..979ac5972f52 100644 --- a/third_party/boringssl/src/ssl/ssl_session.cc +++ b/third_party/boringssl/src/ssl/ssl_session.cc @@ -214,9 +214,9 @@ UniquePtr SSL_SESSION_dup(SSL_SESSION *session, int dup_flags) { } } if (session->certs != nullptr) { - auto buf_up_ref = [](CRYPTO_BUFFER *buf) { - CRYPTO_BUFFER_up_ref(buf); - return buf; + auto buf_up_ref = [](const CRYPTO_BUFFER *buf) { + CRYPTO_BUFFER_up_ref(const_cast(buf)); + return const_cast(buf); }; new_session->certs.reset(sk_CRYPTO_BUFFER_deep_copy( session->certs.get(), buf_up_ref, CRYPTO_BUFFER_free)); @@ -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 diff --git a/third_party/boringssl/src/ssl/ssl_test.cc b/third_party/boringssl/src/ssl/ssl_test.cc index 3515f602f192..854068f44b2b 100644 --- a/third_party/boringssl/src/ssl/ssl_test.cc +++ b/third_party/boringssl/src/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 @@ -400,8 +401,8 @@ static const CurveTest kCurveTests[] = { { SSL_CURVE_SECP256R1 }, }, { - "P-256:CECPQ2", - { SSL_CURVE_SECP256R1, SSL_CURVE_CECPQ2 }, + "P-256:X25519KYBER", + { SSL_CURVE_SECP256R1, SSL_CURVE_X25519KYBER768 }, }, { @@ -1037,10 +1038,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)); @@ -1100,6 +1097,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 +1977,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())); @@ -2267,6 +2271,8 @@ XRqE7XFhHL+7TNC2a9OOAjQsEF137YPWo+rhgko= ASSERT_TRUE(X509_STORE_add_cert(store.get(), root.get())); SSL_CTX_set_cert_store(client_ctx.get(), store.release()); SSL_CTX_set_verify(client_ctx.get(), SSL_VERIFY_PEER, nullptr); + X509_VERIFY_PARAM_set_flags(SSL_CTX_get0_param(client_ctx.get()), + X509_V_FLAG_NO_CHECK_TIME); static const char kSecretName[] = "secret.example"; ASSERT_TRUE(X509_VERIFY_PARAM_set1_host(SSL_CTX_get0_param(client_ctx.get()), kSecretName, strlen(kSecretName))); @@ -2340,6 +2346,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())); @@ -2367,6 +2374,81 @@ TEST(SSLTest, ECHThreads) { } #endif // OPENSSL_THREADS +TEST(SSLTest, TLS13ExporterAvailability) { + bssl::UniquePtr client_ctx(SSL_CTX_new(TLS_method())); + bssl::UniquePtr server_ctx = + CreateContextWithTestCertificate(TLS_method()); + ASSERT_TRUE(client_ctx); + ASSERT_TRUE(server_ctx); + // Configure only TLS 1.3. + ASSERT_TRUE(SSL_CTX_set_min_proto_version(client_ctx.get(), TLS1_3_VERSION)); + ASSERT_TRUE(SSL_CTX_set_max_proto_version(client_ctx.get(), TLS1_3_VERSION)); + + bssl::UniquePtr client, server; + ASSERT_TRUE(CreateClientAndServer(&client, &server, client_ctx.get(), + server_ctx.get())); + + std::vector buffer(32); + const char *label = "EXPORTER-test-label"; + + // The exporters are not available before the handshake starts. + EXPECT_FALSE(SSL_export_keying_material(client.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); + EXPECT_FALSE(SSL_export_keying_material(server.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); + + // Send the client's first flight of handshake messages. + int client_ret = SSL_do_handshake(client.get()); + EXPECT_EQ(SSL_get_error(client.get(), client_ret), SSL_ERROR_WANT_READ); + + // The handshake isn't far enough for the exporters to work. + EXPECT_FALSE(SSL_export_keying_material(client.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); + EXPECT_FALSE(SSL_export_keying_material(server.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); + + // Send all the server's handshake messages. + int server_ret = SSL_do_handshake(server.get()); + EXPECT_EQ(SSL_get_error(server.get(), server_ret), SSL_ERROR_WANT_READ); + + // At this point in the handshake, the server should have the exporter key + // derived since it's sent its Finished message. The client hasn't yet + // processed the server's handshake messages, so the exporter shouldn't be + // available to the client. + EXPECT_FALSE(SSL_export_keying_material(client.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); + EXPECT_TRUE(SSL_export_keying_material(server.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); + + // Finish the handshake on the client. + EXPECT_EQ(SSL_do_handshake(client.get()), 1); + + // The exporter should be available on both endpoints. + EXPECT_TRUE(SSL_export_keying_material(client.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); + EXPECT_TRUE(SSL_export_keying_material(server.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); + + // Finish the handshake on the server. + EXPECT_EQ(SSL_do_handshake(server.get()), 1); + + // The exporter should still be available on both endpoints. + EXPECT_TRUE(SSL_export_keying_material(client.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); + EXPECT_TRUE(SSL_export_keying_material(server.get(), buffer.data(), + buffer.size(), label, strlen(label), + nullptr, 0, 0)); +} + static void AppendSession(SSL_SESSION *session, void *arg) { std::vector *out = reinterpret_cast*>(arg); @@ -3172,7 +3254,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())); @@ -3350,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; } @@ -3377,7 +3461,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); @@ -4093,7 +4177,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; @@ -4658,6 +4742,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)); @@ -4711,9 +4796,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: @@ -4729,9 +4814,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); @@ -5113,6 +5198,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|. @@ -5138,6 +5224,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()); @@ -5265,6 +5352,7 @@ TEST(SSLTest, SigAlgs) { }; UniquePtr ctx(SSL_CTX_new(TLS_method())); + ASSERT_TRUE(ctx); unsigned n = 1; for (const auto &test : kTests) { @@ -5320,6 +5408,7 @@ TEST(SSLTest, SigAlgsList) { }; UniquePtr ctx(SSL_CTX_new(TLS_method())); + ASSERT_TRUE(ctx); unsigned n = 1; for (const auto &test : kTests) { @@ -5345,7 +5434,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 @@ -5383,7 +5474,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 @@ -5423,10 +5516,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)); @@ -5507,7 +5602,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)); }; @@ -5600,7 +5695,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) { @@ -5619,7 +5714,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)); }; @@ -5656,6 +5751,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)); } @@ -6028,8 +6125,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(); @@ -6417,7 +6516,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)); @@ -6502,7 +6601,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)); @@ -6670,8 +6769,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()); @@ -6892,10 +6991,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 @@ -6933,7 +7032,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())); @@ -6950,7 +7049,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; @@ -7309,7 +7408,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())); @@ -7655,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; } @@ -7693,7 +7792,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)); }; @@ -8334,7 +8433,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|. @@ -8400,7 +8499,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 @@ -8425,5 +8524,23 @@ TEST(SSLTest, QuietShutdown) { EXPECT_EQ(SSL_get_error(server.get(), ret), SSL_ERROR_ZERO_RETURN); } +TEST(SSLTest, InvalidSignatureAlgorithm) { + bssl::UniquePtr ctx(SSL_CTX_new(TLS_method())); + ASSERT_TRUE(ctx); + + static const uint16_t kInvalidPrefs[] = {1234}; + EXPECT_FALSE(SSL_CTX_set_signing_algorithm_prefs( + ctx.get(), kInvalidPrefs, OPENSSL_ARRAY_SIZE(kInvalidPrefs))); + EXPECT_FALSE(SSL_CTX_set_verify_algorithm_prefs( + ctx.get(), kInvalidPrefs, OPENSSL_ARRAY_SIZE(kInvalidPrefs))); + + static const uint16_t kDuplicatePrefs[] = {SSL_SIGN_RSA_PKCS1_SHA256, + SSL_SIGN_RSA_PKCS1_SHA256}; + EXPECT_FALSE(SSL_CTX_set_signing_algorithm_prefs( + ctx.get(), kDuplicatePrefs, OPENSSL_ARRAY_SIZE(kDuplicatePrefs))); + EXPECT_FALSE(SSL_CTX_set_verify_algorithm_prefs( + ctx.get(), kDuplicatePrefs, OPENSSL_ARRAY_SIZE(kDuplicatePrefs))); +} + } // namespace BSSL_NAMESPACE_END diff --git a/third_party/boringssl/src/ssl/ssl_x509.cc b/third_party/boringssl/src/ssl/ssl_x509.cc index 5533c7f0e6e6..e4b3775b316c 100644 --- a/third_party/boringssl/src/ssl/ssl_x509.cc +++ b/third_party/boringssl/src/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; } } @@ -1041,7 +1037,11 @@ SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const uint8_t **pp, long length) { } STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list) { - return sk_X509_NAME_deep_copy(list, X509_NAME_dup, X509_NAME_free); + // TODO(https://crbug.com/boringssl/407): |X509_NAME_dup| should be const. + auto name_dup = [](const X509_NAME *name) { + return X509_NAME_dup(const_cast(name)); + }; + return sk_X509_NAME_deep_copy(list, name_dup, X509_NAME_free); } static void set_client_CA_list(UniquePtr *ca_list, @@ -1100,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/third_party/boringssl/src/ssl/t1_enc.cc b/third_party/boringssl/src/ssl/t1_enc.cc index c8db457f1c7b..a985d38bb682 100644 --- a/third_party/boringssl/src/ssl/t1_enc.cc +++ b/third_party/boringssl/src/ssl/t1_enc.cc @@ -302,7 +302,7 @@ using namespace bssl; size_t SSL_get_key_block_len(const SSL *ssl) { // See |SSL_generate_key_block|. - if (SSL_in_init(ssl)) { + if (SSL_in_init(ssl) || ssl_protocol_version(ssl) > TLS1_2_VERSION) { return 0; } @@ -321,7 +321,7 @@ int SSL_generate_key_block(const SSL *ssl, uint8_t *out, size_t out_len) { // there are points where read and write states are from different epochs. // During a handshake, before ChangeCipherSpec, the encryption states may not // match |ssl->s3->client_random| and |ssl->s3->server_random|. - if (SSL_in_init(ssl)) { + if (SSL_in_init(ssl) || ssl_protocol_version(ssl) > TLS1_2_VERSION) { OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -333,16 +333,12 @@ int SSL_export_keying_material(SSL *ssl, uint8_t *out, size_t out_len, const char *label, size_t label_len, const uint8_t *context, size_t context_len, int use_context) { - // Exporters may be used in False Start and server 0-RTT, where the handshake - // has progressed enough. Otherwise, they may not be used during a handshake. - if (SSL_in_init(ssl) && - !SSL_in_false_start(ssl) && - !(SSL_is_server(ssl) && SSL_in_early_data(ssl))) { - OPENSSL_PUT_ERROR(SSL, SSL_R_HANDSHAKE_NOT_COMPLETE); - return 0; - } - - if (ssl_protocol_version(ssl) >= TLS1_3_VERSION) { + // In TLS 1.3, the exporter may be used whenever the secret has been derived. + if (ssl->s3->have_version && ssl_protocol_version(ssl) >= TLS1_3_VERSION) { + if (ssl->s3->exporter_secret_len == 0) { + OPENSSL_PUT_ERROR(SSL, SSL_R_HANDSHAKE_NOT_COMPLETE); + return 0; + } if (!use_context) { context = nullptr; context_len = 0; @@ -353,6 +349,13 @@ int SSL_export_keying_material(SSL *ssl, uint8_t *out, size_t out_len, MakeConstSpan(label, label_len), MakeConstSpan(context, context_len)); } + // Exporters may be used in False Start, where the handshake has progressed + // enough. Otherwise, they may not be used during a handshake. + if (SSL_in_init(ssl) && !SSL_in_false_start(ssl)) { + OPENSSL_PUT_ERROR(SSL, SSL_R_HANDSHAKE_NOT_COMPLETE); + return 0; + } + size_t seed_len = 2 * SSL3_RANDOM_SIZE; if (use_context) { if (context_len >= 1u << 16) { @@ -363,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/third_party/boringssl/src/ssl/test/CMakeLists.txt b/third_party/boringssl/src/ssl/test/CMakeLists.txt index f02d6e24f92d..110c6833f359 100644 --- a/third_party/boringssl/src/ssl/test/CMakeLists.txt +++ b/third_party/boringssl/src/ssl/test/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../../include) - add_executable( bssl_shim @@ -12,10 +10,7 @@ add_executable( test_config.cc test_state.cc ) - -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( @@ -30,10 +25,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") test_config.cc test_state.cc ) - - 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/third_party/boringssl/src/ssl/test/async_bio.cc b/third_party/boringssl/src/ssl/test/async_bio.cc index fd351760bcca..89d66d7787af 100644 --- a/third_party/boringssl/src/ssl/test/async_bio.cc +++ b/third_party/boringssl/src/ssl/test/async_bio.cc @@ -102,7 +102,7 @@ static long AsyncCtrl(BIO *bio, int cmd, long num, void *ptr) { return 0; } BIO_clear_retry_flags(bio); - int ret = BIO_ctrl(bio->next_bio, cmd, num, ptr); + long ret = BIO_ctrl(bio->next_bio, cmd, num, ptr); BIO_copy_next_retry(bio); return ret; } diff --git a/third_party/boringssl/src/ssl/test/bssl_shim.cc b/third_party/boringssl/src/ssl/test/bssl_shim.cc index 3e12a0f48d33..c64bb167fee4 100644 --- a/third_party/boringssl/src/ssl/test/bssl_shim.cc +++ b/third_party/boringssl/src/ssl/test/bssl_shim.cc @@ -583,16 +583,14 @@ static bool CheckHandshakeProperties(SSL *ssl, bool is_resume, } uint16_t cipher_id = SSL_CIPHER_get_protocol_id(SSL_get_current_cipher(ssl)); - if (config->expect_cipher_aes != 0 && - EVP_has_aes_hardware() && + if (config->expect_cipher_aes != 0 && EVP_has_aes_hardware() && config->expect_cipher_aes != cipher_id) { fprintf(stderr, "Cipher ID was %04x, wanted %04x (has AES hardware)\n", cipher_id, config->expect_cipher_aes); return false; } - if (config->expect_cipher_no_aes != 0 && - !EVP_has_aes_hardware() && + if (config->expect_cipher_no_aes != 0 && !EVP_has_aes_hardware() && config->expect_cipher_no_aes != cipher_id) { fprintf(stderr, "Cipher ID was %04x, wanted %04x (no AES hardware)\n", cipher_id, config->expect_cipher_no_aes); @@ -666,6 +664,12 @@ static bool CheckHandshakeProperties(SSL *ssl, bool is_resume, return false; } + if (config->expect_key_usage_invalid != !!SSL_was_key_usage_invalid(ssl)) { + fprintf(stderr, "X.509 key usage was %svalid, but wanted opposite.\n", + SSL_was_key_usage_invalid(ssl) ? "in" : ""); + return false; + } + // Test that handshake hints correctly skipped the expected operations. if (config->handshake_hints && !config->allow_hint_mismatch) { const TestState *state = GetTestState(ssl); diff --git a/third_party/boringssl/src/ssl/test/fuzzer.h b/third_party/boringssl/src/ssl/test/fuzzer.h index 00b5e84431d8..e18a820532ff 100644 --- a/third_party/boringssl/src/ssl/test/fuzzer.h +++ b/third_party/boringssl/src/ssl/test/fuzzer.h @@ -414,12 +414,13 @@ class TLSFuzzer { SSL_CTX_enable_ocsp_stapling(ctx_.get()); // Enable versions and ciphers that are off by default. - if (!SSL_CTX_set_strict_cipher_list(ctx_.get(), "ALL:NULL-SHA")) { + if (!SSL_CTX_set_strict_cipher_list(ctx_.get(), "ALL")) { return false; } - static const int kCurves[] = {NID_CECPQ2, NID_X25519, NID_X9_62_prime256v1, - NID_secp384r1, NID_secp521r1}; + static const int kCurves[] = {NID_X25519Kyber768, NID_X25519, + NID_X9_62_prime256v1, NID_secp384r1, + NID_secp521r1}; if (!SSL_CTX_set1_curves(ctx_.get(), kCurves, OPENSSL_ARRAY_SIZE(kCurves))) { return false; diff --git a/third_party/boringssl/src/ssl/test/mock_quic_transport.cc b/third_party/boringssl/src/ssl/test/mock_quic_transport.cc index 310b779a8ce1..b1c42f680b44 100644 --- a/third_party/boringssl/src/ssl/test/mock_quic_transport.cc +++ b/third_party/boringssl/src/ssl/test/mock_quic_transport.cc @@ -16,8 +16,9 @@ #include +#include +#include #include -#include MockQuicTransport::MockQuicTransport(bssl::UniquePtr bio, SSL *ssl) : bio_(std::move(bio)), @@ -51,11 +52,8 @@ bool ReadAll(BIO *bio, bssl::Span out) { size_t len = out.size(); uint8_t *buf = out.data(); while (len > 0) { - int chunk_len = std::numeric_limits::max(); - if (len <= static_cast(std::numeric_limits::max())) { - chunk_len = len; - } - int ret = BIO_read(bio, buf, chunk_len); + size_t chunk_len = std::min(len, size_t{INT_MAX}); + int ret = BIO_read(bio, buf, static_cast(chunk_len)); if (ret <= 0) { return false; } diff --git a/third_party/boringssl/src/ssl/test/packeted_bio.cc b/third_party/boringssl/src/ssl/test/packeted_bio.cc index 835dbfb1f0c7..35dd8a8f1502 100644 --- a/third_party/boringssl/src/ssl/test/packeted_bio.cc +++ b/third_party/boringssl/src/ssl/test/packeted_bio.cc @@ -195,7 +195,7 @@ static long PacketedCtrl(BIO *bio, int cmd, long num, void *ptr) { } BIO_clear_retry_flags(bio); - int ret = BIO_ctrl(bio->next_bio, cmd, num, ptr); + long ret = BIO_ctrl(bio->next_bio, cmd, num, ptr); BIO_copy_next_retry(bio); return ret; } diff --git a/third_party/boringssl/src/ssl/test/runner/cipher_suites.go b/third_party/boringssl/src/ssl/test/runner/cipher_suites.go index 5db57498bea1..b86f515f5420 100644 --- a/third_party/boringssl/src/ssl/test/runner/cipher_suites.go +++ b/third_party/boringssl/src/ssl/test/runner/cipher_suites.go @@ -127,11 +127,6 @@ var cipherSuites = []*cipherSuite{ {TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, 32, 20, ivLenAES, ecdhePSKKA, suiteECDHE | suitePSK, cipherAES, macSHA1, nil}, {TLS_PSK_WITH_AES_128_CBC_SHA, 16, 20, ivLenAES, pskKA, suitePSK, cipherAES, macSHA1, nil}, {TLS_PSK_WITH_AES_256_CBC_SHA, 32, 20, ivLenAES, pskKA, suitePSK, cipherAES, macSHA1, nil}, - {TLS_RSA_WITH_NULL_SHA, 0, 20, noIV, rsaKA, 0, cipherNull, macSHA1, nil}, -} - -func noIV(vers uint16) int { - return 0 } func ivLenChaCha20Poly1305(vers uint16) int { @@ -364,7 +359,6 @@ func cipherSuiteFromID(id uint16) *cipherSuite { // A list of the possible cipher suite ids. Taken from // http://www.iana.org/assignments/tls-parameters/tls-parameters.xml const ( - TLS_RSA_WITH_NULL_SHA uint16 = 0x0002 TLS_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x000a TLS_RSA_WITH_AES_128_CBC_SHA uint16 = 0x002f TLS_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0035 diff --git a/third_party/boringssl/src/ssl/test/runner/common.go b/third_party/boringssl/src/ssl/test/runner/common.go index 07562dfef195..ce06779be02c 100644 --- a/third_party/boringssl/src/ssl/test/runner/common.go +++ b/third_party/boringssl/src/ssl/test/runner/common.go @@ -148,12 +148,12 @@ var tls13HelloRetryRequest = []uint8{ type CurveID uint16 const ( - CurveP224 CurveID = 21 - CurveP256 CurveID = 23 - CurveP384 CurveID = 24 - CurveP521 CurveID = 25 - CurveX25519 CurveID = 29 - CurveCECPQ2 CurveID = 16696 + CurveP224 CurveID = 21 + CurveP256 CurveID = 23 + CurveP384 CurveID = 24 + CurveP521 CurveID = 25 + CurveX25519 CurveID = 29 + CurveX25519Kyber768 CurveID = 0x6399 ) // TLS Elliptic Curve Point Formats @@ -211,6 +211,11 @@ const ( // EdDSA algorithms signatureEd25519 signatureAlgorithm = 0x0807 signatureEd448 signatureAlgorithm = 0x0808 + + // signatureRSAPKCS1WithMD5AndSHA1 is the internal value BoringSSL uses to + // represent the TLS 1.0/1.1 RSA MD5/SHA1 concatenation. We define the + // constant here to test that this doesn't leak into the protocol. + signatureRSAPKCS1WithMD5AndSHA1 signatureAlgorithm = 0xff01 ) // supportedSignatureAlgorithms contains the default supported signature @@ -1792,10 +1797,15 @@ type ProtocolBugs struct { // reject CertificateRequest with the CertificateAuthorities extension. ExpectNoCertificateAuthoritiesExtension bool - // UseLegacySigningAlgorithm, if non-zero, is the signature algorithm + // SigningAlgorithmForLegacyVersions, if non-zero, is the signature algorithm // to use when signing in TLS 1.1 and earlier where algorithms are not // negotiated. - UseLegacySigningAlgorithm signatureAlgorithm + SigningAlgorithmForLegacyVersions signatureAlgorithm + + // AlwaysSignAsLegacyVersion, if true, causes all TLS versions to sign as if + // they were TLS 1.1 and earlier. This can be paired with + // SendSignatureAlgorithm to send a given signature algorithm enum. + AlwaysSignAsLegacyVersion bool // RejectUnsolicitedKeyUpdate, if true, causes all unsolicited // KeyUpdates from the peer to be rejected. @@ -1880,9 +1890,9 @@ type ProtocolBugs struct { // hello retry. FailIfHelloRetryRequested bool - // FailedIfCECPQ2Offered will cause a server to reject a ClientHello if CECPQ2 + // FailedIfKyberOffered will cause a server to reject a ClientHello if Kyber // is supported. - FailIfCECPQ2Offered bool + FailIfKyberOffered bool // ExpectKeyShares, if not nil, lists (in order) the curves that a ClientHello // should have key shares for. @@ -1986,7 +1996,7 @@ func (c *Config) maxVersion(isDTLS bool) uint16 { return ret } -var defaultCurvePreferences = []CurveID{CurveCECPQ2, CurveX25519, CurveP256, CurveP384, CurveP521} +var defaultCurvePreferences = []CurveID{CurveX25519, CurveP256, CurveP384, CurveP521} func (c *Config) curvePreferences() []CurveID { if c == nil || len(c.CurvePreferences) == 0 { diff --git a/third_party/boringssl/src/ssl/test/runner/handshake_client.go b/third_party/boringssl/src/ssl/test/runner/handshake_client.go index 5d04994ad23e..42f0534fd0db 100644 --- a/third_party/boringssl/src/ssl/test/runner/handshake_client.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/ssl/test/runner/handshake_messages.go b/third_party/boringssl/src/ssl/test/runner/handshake_messages.go index fbfbdd9563b2..b253b0c84931 100644 --- a/third_party/boringssl/src/ssl/test/runner/handshake_messages.go +++ b/third_party/boringssl/src/ssl/test/runner/handshake_messages.go @@ -841,6 +841,12 @@ func parseSignatureAlgorithms(reader *byteReader, out *[]signatureAlgorithm, all if !sigAlgs.readU16(&v) { return false } + if signatureAlgorithm(v) == signatureRSAPKCS1WithMD5AndSHA1 { + // signatureRSAPKCS1WithMD5AndSHA1 is an internal value BoringSSL + // uses to represent the TLS 1.0 MD5/SHA-1 concatenation. It should + // never appear on the wire. + return false + } *out = append(*out, signatureAlgorithm(v)) } return true diff --git a/third_party/boringssl/src/ssl/test/runner/handshake_server.go b/third_party/boringssl/src/ssl/test/runner/handshake_server.go index 5ae7d936524b..4f3cf7546a26 100644 --- a/third_party/boringssl/src/ssl/test/runner/handshake_server.go +++ b/third_party/boringssl/src/ssl/test/runner/handshake_server.go @@ -280,10 +280,10 @@ func (hs *serverHandshakeState) readClientHello() error { } } - if config.Bugs.FailIfCECPQ2Offered { + if config.Bugs.FailIfKyberOffered { for _, offeredCurve := range hs.clientHello.supportedCurves { if isPqGroup(offeredCurve) { - return errors.New("tls: CECPQ2 was offered") + return errors.New("tls: X25519Kyber768 was offered") } } } @@ -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 { @@ -1467,7 +1467,7 @@ func (hs *serverHandshakeState) processClientHello() (isResume bool, err error) Curves: for _, curve := range hs.clientHello.supportedCurves { if isPqGroup(curve) && c.vers < VersionTLS13 { - // CECPQ2 is TLS 1.3-only. + // Post-quantum is TLS 1.3 only. continue } diff --git a/third_party/boringssl/src/ssl/test/runner/hpke/hpke_test.go b/third_party/boringssl/src/ssl/test/runner/hpke/hpke_test.go index eec16e9dfe83..35503beb2d35 100644 --- a/third_party/boringssl/src/ssl/test/runner/hpke/hpke_test.go +++ b/third_party/boringssl/src/ssl/test/runner/hpke/hpke_test.go @@ -23,7 +23,7 @@ import ( "errors" "flag" "fmt" - "io/ioutil" + "os" "path/filepath" "testing" ) @@ -98,7 +98,7 @@ type ExportTestVector struct { // TestVectors checks all relevant test vectors in test-vectors.json. func TestVectors(t *testing.T) { - jsonStr, err := ioutil.ReadFile(filepath.Join(*testDataDir, "test-vectors.json")) + jsonStr, err := os.ReadFile(filepath.Join(*testDataDir, "test-vectors.json")) if err != nil { t.Errorf("error reading test vectors: %s", err) return diff --git a/third_party/boringssl/src/ssl/test/runner/hrss/hrss.go b/third_party/boringssl/src/ssl/test/runner/hrss/hrss.go deleted file mode 100644 index 9f4fdd776b0e..000000000000 --- a/third_party/boringssl/src/ssl/test/runner/hrss/hrss.go +++ /dev/null @@ -1,1212 +0,0 @@ -package hrss - -import ( - "crypto/hmac" - "crypto/sha256" - "crypto/subtle" - "encoding/binary" - "io" - "math/bits" -) - -const ( - PublicKeySize = modQBytes - CiphertextSize = modQBytes -) - -const ( - N = 701 - Q = 8192 - mod3Bytes = 140 - modQBytes = 1138 -) - -const ( - bitsPerWord = bits.UintSize - wordsPerPoly = (N + bitsPerWord - 1) / bitsPerWord - fullWordsPerPoly = N / bitsPerWord - bitsInLastWord = N % bitsPerWord -) - -// poly3 represents a degree-N polynomial over GF(3). Each coefficient is -// bitsliced across the |s| and |a| arrays, like this: -// -// s | a | value -// ----------------- -// 0 | 0 | 0 -// 0 | 1 | 1 -// 1 | 0 | 2 (aka -1) -// 1 | 1 | -// -// ('s' is for sign, and 'a' is just a letter.) -// -// Once bitsliced as such, the following circuits can be used to implement -// addition and multiplication mod 3: -// -// (s3, a3) = (s1, a1) × (s2, a2) -// s3 = (s2 ∧ a1) ⊕ (s1 ∧ a2) -// a3 = (s1 ∧ s2) ⊕ (a1 ∧ a2) -// -// (s3, a3) = (s1, a1) + (s2, a2) -// t1 = ~(s1 ∨ a1) -// t2 = ~(s2 ∨ a2) -// s3 = (a1 ∧ a2) ⊕ (t1 ∧ s2) ⊕ (t2 ∧ s1) -// a3 = (s1 ∧ s2) ⊕ (t1 ∧ a2) ⊕ (t2 ∧ a1) -// -// Negating a value just involves swapping s and a. -type poly3 struct { - s [wordsPerPoly]uint - a [wordsPerPoly]uint -} - -func (p *poly3) trim() { - p.s[wordsPerPoly-1] &= (1 << bitsInLastWord) - 1 - p.a[wordsPerPoly-1] &= (1 << bitsInLastWord) - 1 -} - -func (p *poly3) zero() { - for i := range p.a { - p.s[i] = 0 - p.a[i] = 0 - } -} - -func (p *poly3) fromDiscrete(in *poly) { - var shift uint - s := p.s[:] - a := p.a[:] - s[0] = 0 - a[0] = 0 - - for _, v := range in { - s[0] >>= 1 - s[0] |= uint((v>>1)&1) << (bitsPerWord - 1) - a[0] >>= 1 - a[0] |= uint(v&1) << (bitsPerWord - 1) - shift++ - if shift == bitsPerWord { - s = s[1:] - a = a[1:] - s[0] = 0 - a[0] = 0 - shift = 0 - } - } - - a[0] >>= bitsPerWord - shift - s[0] >>= bitsPerWord - shift -} - -func (p *poly3) fromModQ(in *poly) int { - var shift uint - s := p.s[:] - a := p.a[:] - s[0] = 0 - a[0] = 0 - ok := 1 - - for _, v := range in { - vMod3, vOk := modQToMod3(v) - ok &= vOk - - s[0] >>= 1 - s[0] |= uint((vMod3>>1)&1) << (bitsPerWord - 1) - a[0] >>= 1 - a[0] |= uint(vMod3&1) << (bitsPerWord - 1) - shift++ - if shift == bitsPerWord { - s = s[1:] - a = a[1:] - s[0] = 0 - a[0] = 0 - shift = 0 - } - } - - a[0] >>= bitsPerWord - shift - s[0] >>= bitsPerWord - shift - - return ok -} - -func (p *poly3) fromDiscreteMod3(in *poly) { - var shift uint - s := p.s[:] - a := p.a[:] - s[0] = 0 - a[0] = 0 - - for _, v := range in { - // This duplicates the 13th bit upwards to the top of the - // uint16, essentially treating it as a sign bit and converting - // into a signed int16. The signed value is reduced mod 3, - // yeilding {-2, -1, 0, 1, 2}. - v = uint16((int16(v<<3)>>3)%3) & 7 - - // We want to map v thus: - // {-2, -1, 0, 1, 2} -> {1, 2, 0, 1, 2}. We take the bottom - // three bits and then the constants below, when shifted by - // those three bits, perform the required mapping. - s[0] >>= 1 - s[0] |= (0xbc >> v) << (bitsPerWord - 1) - a[0] >>= 1 - a[0] |= (0x7a >> v) << (bitsPerWord - 1) - shift++ - if shift == bitsPerWord { - s = s[1:] - a = a[1:] - s[0] = 0 - a[0] = 0 - shift = 0 - } - } - - a[0] >>= bitsPerWord - shift - s[0] >>= bitsPerWord - shift -} - -func (p *poly3) marshal(out []byte) { - s := p.s[:] - a := p.a[:] - sw := s[0] - aw := a[0] - var shift int - - for i := 0; i < 700; i += 5 { - acc, scale := 0, 1 - for j := 0; j < 5; j++ { - v := int(aw&1) | int(sw&1)<<1 - acc += scale * v - scale *= 3 - - shift++ - if shift == bitsPerWord { - s = s[1:] - a = a[1:] - sw = s[0] - aw = a[0] - shift = 0 - } else { - sw >>= 1 - aw >>= 1 - } - } - - out[0] = byte(acc) - out = out[1:] - } -} - -func (p *poly) fromMod2(in *poly2) { - var shift uint - words := in[:] - word := words[0] - - for i := range p { - p[i] = uint16(word & 1) - word >>= 1 - shift++ - if shift == bitsPerWord { - words = words[1:] - word = words[0] - shift = 0 - } - } -} - -func (p *poly) fromMod3(in *poly3) { - var shift uint - s := in.s[:] - a := in.a[:] - sw := s[0] - aw := a[0] - - for i := range p { - p[i] = uint16(aw&1 | (sw&1)<<1) - aw >>= 1 - sw >>= 1 - shift++ - if shift == bitsPerWord { - a = a[1:] - s = s[1:] - aw = a[0] - sw = s[0] - shift = 0 - } - } -} - -func (p *poly) fromMod3ToModQ(in *poly3) { - var shift uint - s := in.s[:] - a := in.a[:] - sw := s[0] - aw := a[0] - - for i := range p { - p[i] = mod3ToModQ(uint16(aw&1 | (sw&1)<<1)) - aw >>= 1 - sw >>= 1 - shift++ - if shift == bitsPerWord { - a = a[1:] - s = s[1:] - aw = a[0] - sw = s[0] - shift = 0 - } - } -} - -func lsbToAll(v uint) uint { - return uint(int(v<<(bitsPerWord-1)) >> (bitsPerWord - 1)) -} - -func (p *poly3) mulConst(ms, ma uint) { - ms = lsbToAll(ms) - ma = lsbToAll(ma) - - for i := range p.a { - p.s[i], p.a[i] = (ma&p.s[i])^(ms&p.a[i]), (ma&p.a[i])^(ms&p.s[i]) - } -} - -func cmovWords(out, in *[wordsPerPoly]uint, mov uint) { - for i := range out { - out[i] = (out[i] & ^mov) | (in[i] & mov) - } -} - -func rotWords(out, in *[wordsPerPoly]uint, bits uint) { - start := bits / bitsPerWord - n := (N - bits) / bitsPerWord - - for i := uint(0); i < n; i++ { - out[i] = in[start+i] - } - - carry := in[wordsPerPoly-1] - - for i := uint(0); i < start; i++ { - out[n+i] = carry | in[i]<> (bitsPerWord - bitsInLastWord) - } - - out[wordsPerPoly-1] = carry -} - -// rotBits right-rotates the bits in |in|. bits must be a non-zero power of two -// and less than bitsPerWord. -func rotBits(out, in *[wordsPerPoly]uint, bits uint) { - if (bits == 0 || (bits & (bits - 1)) != 0 || bits > bitsPerWord/2 || bitsInLastWord < bitsPerWord/2) { - panic("internal error"); - } - - carry := in[wordsPerPoly-1] << (bitsPerWord - bits) - - for i := wordsPerPoly - 2; i >= 0; i-- { - out[i] = carry | in[i]>>bits - carry = in[i] << (bitsPerWord - bits) - } - - out[wordsPerPoly-1] = carry>>(bitsPerWord-bitsInLastWord) | in[wordsPerPoly-1]>>bits -} - -func (p *poly3) rotWords(bits uint, in *poly3) { - rotWords(&p.s, &in.s, bits) - rotWords(&p.a, &in.a, bits) -} - -func (p *poly3) rotBits(bits uint, in *poly3) { - rotBits(&p.s, &in.s, bits) - rotBits(&p.a, &in.a, bits) -} - -func (p *poly3) cmov(in *poly3, mov uint) { - cmovWords(&p.s, &in.s, mov) - cmovWords(&p.a, &in.a, mov) -} - -func (p *poly3) rot(bits uint) { - if bits > N { - panic("invalid") - } - var shifted poly3 - - shift := uint(9) - for ; (1 << shift) >= bitsPerWord; shift-- { - shifted.rotWords(1<>shift)) - } - for ; shift < 9; shift-- { - shifted.rotBits(1<>shift)) - } -} - -func (p *poly3) fmadd(ms, ma uint, in *poly3) { - ms = lsbToAll(ms) - ma = lsbToAll(ma) - - for i := range p.a { - products := (ma & in.s[i]) ^ (ms & in.a[i]) - producta := (ma & in.a[i]) ^ (ms & in.s[i]) - - ns1Ana1 := ^p.s[i] & ^p.a[i] - ns2Ana2 := ^products & ^producta - - p.s[i], p.a[i] = (p.a[i]&producta)^(ns1Ana1&products)^(p.s[i]&ns2Ana2), (p.s[i]&products)^(ns1Ana1&producta)^(p.a[i]&ns2Ana2) - } -} - -func (p *poly3) modPhiN() { - factora := uint(int(p.s[wordsPerPoly-1]<<(bitsPerWord-bitsInLastWord)) >> (bitsPerWord - 1)) - factors := uint(int(p.a[wordsPerPoly-1]<<(bitsPerWord-bitsInLastWord)) >> (bitsPerWord - 1)) - ns2Ana2 := ^factors & ^factora - - for i := range p.s { - ns1Ana1 := ^p.s[i] & ^p.a[i] - p.s[i], p.a[i] = (p.a[i]&factora)^(ns1Ana1&factors)^(p.s[i]&ns2Ana2), (p.s[i]&factors)^(ns1Ana1&factora)^(p.a[i]&ns2Ana2) - } -} - -func (p *poly3) cswap(other *poly3, swap uint) { - for i := range p.s { - sums := swap & (p.s[i] ^ other.s[i]) - p.s[i] ^= sums - other.s[i] ^= sums - - suma := swap & (p.a[i] ^ other.a[i]) - p.a[i] ^= suma - other.a[i] ^= suma - } -} - -func (p *poly3) mulx() { - carrys := (p.s[wordsPerPoly-1] >> (bitsInLastWord - 1)) & 1 - carrya := (p.a[wordsPerPoly-1] >> (bitsInLastWord - 1)) & 1 - - for i := range p.s { - outCarrys := p.s[i] >> (bitsPerWord - 1) - outCarrya := p.a[i] >> (bitsPerWord - 1) - p.s[i] <<= 1 - p.a[i] <<= 1 - p.s[i] |= carrys - p.a[i] |= carrya - carrys = outCarrys - carrya = outCarrya - } -} - -func (p *poly3) divx() { - var carrys, carrya uint - - for i := len(p.s) - 1; i >= 0; i-- { - outCarrys := p.s[i] & 1 - outCarrya := p.a[i] & 1 - p.s[i] >>= 1 - p.a[i] >>= 1 - p.s[i] |= carrys << (bitsPerWord - 1) - p.a[i] |= carrya << (bitsPerWord - 1) - carrys = outCarrys - carrya = outCarrya - } -} - -type poly2 [wordsPerPoly]uint - -func (p *poly2) fromDiscrete(in *poly) { - var shift uint - words := p[:] - words[0] = 0 - - for _, v := range in { - words[0] >>= 1 - words[0] |= uint(v&1) << (bitsPerWord - 1) - shift++ - if shift == bitsPerWord { - words = words[1:] - words[0] = 0 - shift = 0 - } - } - - words[0] >>= bitsPerWord - shift -} - -func (p *poly2) setPhiN() { - for i := range p { - p[i] = ^uint(0) - } - p[wordsPerPoly-1] &= (1 << bitsInLastWord) - 1 -} - -func (p *poly2) cswap(other *poly2, swap uint) { - for i := range p { - sum := swap & (p[i] ^ other[i]) - p[i] ^= sum - other[i] ^= sum - } -} - -func (p *poly2) fmadd(m uint, in *poly2) { - m = ^(m - 1) - - for i := range p { - p[i] ^= in[i] & m - } -} - -func (p *poly2) lshift1() { - var carry uint - for i := range p { - nextCarry := p[i] >> (bitsPerWord - 1) - p[i] <<= 1 - p[i] |= carry - carry = nextCarry - } -} - -func (p *poly2) rshift1() { - var carry uint - for i := len(p) - 1; i >= 0; i-- { - nextCarry := p[i] & 1 - p[i] >>= 1 - p[i] |= carry << (bitsPerWord - 1) - carry = nextCarry - } -} - -func (p *poly2) rot(bits uint) { - if bits > N { - panic("invalid") - } - var shifted [wordsPerPoly]uint - out := (*[wordsPerPoly]uint)(p) - - shift := uint(9) - for ; (1 << shift) >= bitsPerWord; shift-- { - rotWords(&shifted, out, 1<>shift)) - } - for ; shift < 9; shift-- { - rotBits(&shifted, out, 1<>shift)) - } -} - -type poly [N]uint16 - -func (in *poly) marshal(out []byte) { - p := in[:] - - for len(p) >= 8 { - out[0] = byte(p[0]) - out[1] = byte(p[0]>>8) | byte((p[1]&0x07)<<5) - out[2] = byte(p[1] >> 3) - out[3] = byte(p[1]>>11) | byte((p[2]&0x3f)<<2) - out[4] = byte(p[2]>>6) | byte((p[3]&0x01)<<7) - out[5] = byte(p[3] >> 1) - out[6] = byte(p[3]>>9) | byte((p[4]&0x0f)<<4) - out[7] = byte(p[4] >> 4) - out[8] = byte(p[4]>>12) | byte((p[5]&0x7f)<<1) - out[9] = byte(p[5]>>7) | byte((p[6]&0x03)<<6) - out[10] = byte(p[6] >> 2) - out[11] = byte(p[6]>>10) | byte((p[7]&0x1f)<<3) - out[12] = byte(p[7] >> 5) - - p = p[8:] - out = out[13:] - } - - // There are four remaining values. - out[0] = byte(p[0]) - out[1] = byte(p[0]>>8) | byte((p[1]&0x07)<<5) - out[2] = byte(p[1] >> 3) - out[3] = byte(p[1]>>11) | byte((p[2]&0x3f)<<2) - out[4] = byte(p[2]>>6) | byte((p[3]&0x01)<<7) - out[5] = byte(p[3] >> 1) - out[6] = byte(p[3] >> 9) -} - -func (out *poly) unmarshal(in []byte) bool { - p := out[:] - for i := 0; i < 87; i++ { - p[0] = uint16(in[0]) | uint16(in[1]&0x1f)<<8 - p[1] = uint16(in[1]>>5) | uint16(in[2])<<3 | uint16(in[3]&3)<<11 - p[2] = uint16(in[3]>>2) | uint16(in[4]&0x7f)<<6 - p[3] = uint16(in[4]>>7) | uint16(in[5])<<1 | uint16(in[6]&0xf)<<9 - p[4] = uint16(in[6]>>4) | uint16(in[7])<<4 | uint16(in[8]&1)<<12 - p[5] = uint16(in[8]>>1) | uint16(in[9]&0x3f)<<7 - p[6] = uint16(in[9]>>6) | uint16(in[10])<<2 | uint16(in[11]&7)<<10 - p[7] = uint16(in[11]>>3) | uint16(in[12])<<5 - - p = p[8:] - in = in[13:] - } - - // There are four coefficients left over - p[0] = uint16(in[0]) | uint16(in[1]&0x1f)<<8 - p[1] = uint16(in[1]>>5) | uint16(in[2])<<3 | uint16(in[3]&3)<<11 - p[2] = uint16(in[3]>>2) | uint16(in[4]&0x7f)<<6 - p[3] = uint16(in[4]>>7) | uint16(in[5])<<1 | uint16(in[6]&0xf)<<9 - - if in[6]&0xf0 != 0 { - return false - } - - out[N-1] = 0 - var top int - for _, v := range out { - top += int(v) - } - - out[N-1] = uint16(-top) % Q - return true -} - -func (in *poly) marshalS3(out []byte) { - p := in[:] - for len(p) >= 5 { - out[0] = byte(p[0] + p[1]*3 + p[2]*9 + p[3]*27 + p[4]*81) - out = out[1:] - p = p[5:] - } -} - -func (out *poly) unmarshalS3(in []byte) bool { - p := out[:] - for i := 0; i < 140; i++ { - c := in[0] - if c >= 243 { - return false - } - p[0] = uint16(c % 3) - p[1] = uint16((c / 3) % 3) - p[2] = uint16((c / 9) % 3) - p[3] = uint16((c / 27) % 3) - p[4] = uint16((c / 81) % 3) - - p = p[5:] - in = in[1:] - } - - out[N-1] = 0 - return true -} - -func (p *poly) modPhiN() { - for i := range p { - p[i] = (p[i] + Q - p[N-1]) % Q - } -} - -func (out *poly) shortSample(in []byte) { - // b a result - // 00 00 00 - // 00 01 01 - // 00 10 10 - // 00 11 11 - // 01 00 10 - // 01 01 00 - // 01 10 01 - // 01 11 11 - // 10 00 01 - // 10 01 10 - // 10 10 00 - // 10 11 11 - // 11 00 11 - // 11 01 11 - // 11 10 11 - // 11 11 11 - - // 1111 1111 1100 1001 1101 0010 1110 0100 - // f f c 9 d 2 e 4 - const lookup = uint32(0xffc9d2e4) - - p := out[:] - for i := 0; i < 87; i++ { - v := binary.LittleEndian.Uint32(in) - v2 := (v & 0x55555555) + ((v >> 1) & 0x55555555) - for j := 0; j < 8; j++ { - p[j] = uint16(lookup >> ((v2 & 15) << 1) & 3) - v2 >>= 4 - } - p = p[8:] - in = in[4:] - } - - // There are four values remaining. - v := binary.LittleEndian.Uint32(in) - v2 := (v & 0x55555555) + ((v >> 1) & 0x55555555) - for j := 0; j < 4; j++ { - p[j] = uint16(lookup >> ((v2 & 15) << 1) & 3) - v2 >>= 4 - } - - out[N-1] = 0 -} - -func (out *poly) shortSamplePlus(in []byte) { - out.shortSample(in) - - var sum uint16 - for i := 0; i < N-1; i++ { - sum += mod3ResultToModQ(out[i] * out[i+1]) - } - - scale := 1 + (1 & (sum >> 12)) - for i := 0; i < len(out); i += 2 { - out[i] = (out[i] * scale) % 3 - } -} - -func mul(out, scratch, a, b []uint16) { - const schoolbookLimit = 32 - if len(a) < schoolbookLimit { - for i := 0; i < len(a)*2; i++ { - out[i] = 0 - } - for i := range a { - for j := range b { - out[i+j] += a[i] * b[j] - } - } - return - } - - lowLen := len(a) / 2 - highLen := len(a) - lowLen - aLow, aHigh := a[:lowLen], a[lowLen:] - bLow, bHigh := b[:lowLen], b[lowLen:] - - for i := 0; i < lowLen; i++ { - out[i] = aHigh[i] + aLow[i] - } - if highLen != lowLen { - out[lowLen] = aHigh[lowLen] - } - - for i := 0; i < lowLen; i++ { - out[highLen+i] = bHigh[i] + bLow[i] - } - if highLen != lowLen { - out[highLen+lowLen] = bHigh[lowLen] - } - - mul(scratch, scratch[2*highLen:], out[:highLen], out[highLen:highLen*2]) - mul(out[lowLen*2:], scratch[2*highLen:], aHigh, bHigh) - mul(out, scratch[2*highLen:], aLow, bLow) - - for i := 0; i < lowLen*2; i++ { - scratch[i] -= out[i] + out[lowLen*2+i] - } - if lowLen != highLen { - scratch[lowLen*2] -= out[lowLen*4] - } - - for i := 0; i < 2*highLen; i++ { - out[lowLen+i] += scratch[i] - } -} - -func (out *poly) mul(a, b *poly) { - var prod, scratch [2 * N]uint16 - mul(prod[:], scratch[:], a[:], b[:]) - for i := range out { - out[i] = (prod[i] + prod[i+N]) % Q - } -} - -func (p3 *poly3) mulMod3(x, y *poly3) { - // (ð‘¥^n - 1) is a multiple of Φ(N) so we can work mod (ð‘¥^n - 1) here and - // (reduce mod Φ(N) afterwards. - x3 := *x - y3 := *y - s := x3.s[:] - a := x3.a[:] - sw := s[0] - aw := a[0] - p3.zero() - var shift uint - for i := 0; i < N; i++ { - p3.fmadd(sw, aw, &y3) - sw >>= 1 - aw >>= 1 - shift++ - if shift == bitsPerWord { - s = s[1:] - a = a[1:] - sw = s[0] - aw = a[0] - shift = 0 - } - y3.mulx() - } - p3.modPhiN() -} - -// mod3ToModQ maps {0, 1, 2, 3} to {0, 1, Q-1, 0xffff} -// The case of n == 3 should never happen but is included so that modQToMod3 -// can easily catch invalid inputs. -func mod3ToModQ(n uint16) uint16 { - return uint16(uint64(0xffff1fff00010000) >> (16 * n)) -} - -// modQToMod3 maps {0, 1, Q-1} to {(0, 0), (0, 1), (1, 0)} and also returns an int -// which is one if the input is in range and zero otherwise. -func modQToMod3(n uint16) (uint16, int) { - result := (n&3 - (n>>1)&1) - return result, subtle.ConstantTimeEq(int32(mod3ToModQ(result)), int32(n)) -} - -// mod3ResultToModQ maps {0, 1, 2, 4} to {0, 1, Q-1, 1} -func mod3ResultToModQ(n uint16) uint16 { - return ((((uint16(0x13) >> n) & 1) - 1) & 0x1fff) | ((uint16(0x12) >> n) & 1) - //shift := (uint(0x324) >> (2 * n)) & 3 - //return uint16(uint64(0x00011fff00010000) >> (16 * shift)) -} - -// mulXMinus1 sets out to a×(ð‘¥ - 1) mod (ð‘¥^n - 1) -func (out *poly) mulXMinus1() { - // Multiplying by (ð‘¥ - 1) means negating each coefficient and adding in - // the value of the previous one. - origOut700 := out[700] - - for i := N - 1; i > 0; i-- { - out[i] = (Q - out[i] + out[i-1]) % Q - } - out[0] = (Q - out[0] + origOut700) % Q -} - -func (out *poly) lift(a *poly) { - // We wish to calculate a/(ð‘¥-1) mod Φ(N) over GF(3), where Φ(N) is the - // Nth cyclotomic polynomial, i.e. 1 + ð‘¥ + … + ð‘¥^700 (since N is prime). - - // 1/(ð‘¥-1) has a fairly basic structure that we can exploit to speed this up: - // - // R. = PolynomialRing(GF(3)…) - // inv = R.cyclotomic_polynomial(1).inverse_mod(R.cyclotomic_polynomial(n)) - // list(inv)[:15] - // [1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2] - // - // This three-element pattern of coefficients repeats for the whole - // polynomial. - // - // Next define the overbar operator such that zÌ… = z[0] + - // reverse(z[1:]). (Index zero of a polynomial here is the coefficient - // of the constant term. So index one is the coefficient of ð‘¥ and so - // on.) - // - // A less odd way to define this is to see that zÌ… negates the indexes, - // so zÌ…[0] = z[-0], zÌ…[1] = z[-1] and so on. - // - // The use of zÌ… is that, when working mod (ð‘¥^701 - 1), vz[0] = , vz[1] = , …. (Where is the inner product: the sum - // of the point-wise products.) Although we calculated the inverse mod - // Φ(N), we can work mod (ð‘¥^N - 1) and reduce mod Φ(N) at the end. - // (That's because (ð‘¥^N - 1) is a multiple of Φ(N).) - // - // When working mod (ð‘¥^N - 1), multiplication by ð‘¥ is a right-rotation - // of the list of coefficients. - // - // Thus we can consider what the pattern of zÌ…, ð‘¥zÌ…, ð‘¥^2zÌ…, … looks like: - // - // def reverse(xs): - // suffix = list(xs[1:]) - // suffix.reverse() - // return [xs[0]] + suffix - // - // def rotate(xs): - // return [xs[-1]] + xs[:-1] - // - // zoverbar = reverse(list(inv) + [0]) - // xzoverbar = rotate(reverse(list(inv) + [0])) - // x2zoverbar = rotate(rotate(reverse(list(inv) + [0]))) - // - // zoverbar[:15] - // [1, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1] - // xzoverbar[:15] - // [0, 1, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0] - // x2zoverbar[:15] - // [2, 0, 1, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2] - // - // (For a formula for zÌ…, see lemma two of appendix B.) - // - // After the first three elements have been taken care of, all then have - // a repeating three-element cycle. The next value (ð‘¥^3zÌ…) involves - // three rotations of the first pattern, thus the three-element cycle - // lines up. However, the discontinuity in the first three elements - // obviously moves to a different position. Consider the difference - // between ð‘¥^3zÌ… and zÌ…: - // - // [x-y for (x,y) in zip(zoverbar, x3zoverbar)][:15] - // [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - // - // This pattern of differences is the same for all elements, although it - // obviously moves right with the rotations. - // - // From this, we reach algorithm eight of appendix B. - - // Handle the first three elements of the inner products. - out[0] = a[0] + a[2] - out[1] = a[1] - out[2] = 2*a[0] + a[2] - - // Use the repeating pattern to complete the first three inner products. - for i := 3; i < 699; i += 3 { - out[0] += 2*a[i] + a[i+2] - out[1] += a[i] + 2*a[i+1] - out[2] += a[i+1] + 2*a[i+2] - } - - // Handle the fact that the three-element pattern doesn't fill the - // polynomial exactly (since 701 isn't a multiple of three). - out[2] += a[700] - out[0] += 2 * a[699] - out[1] += a[699] + 2*a[700] - - out[0] = out[0] % 3 - out[1] = out[1] % 3 - out[2] = out[2] % 3 - - // Calculate the remaining inner products by taking advantage of the - // fact that the pattern repeats every three cycles and the pattern of - // differences is moves with the rotation. - for i := 3; i < N; i++ { - // Add twice something is the same as subtracting when working - // mod 3. Doing it this way avoids underflow. Underflow is bad - // because "% 3" doesn't work correctly for negative numbers - // here since underflow will wrap to 2^16-1 and 2^16 isn't a - // multiple of three. - out[i] = (out[i-3] + 2*(a[i-2]+a[i-1]+a[i])) % 3 - } - - // Reduce mod Φ(N) by subtracting a multiple of out[700] from every - // element and convert to mod Q. (See above about adding twice as - // subtraction.) - v := out[700] * 2 - for i := range out { - out[i] = mod3ToModQ((out[i] + v) % 3) - } - - out.mulXMinus1() -} - -func (a *poly) cswap(b *poly, swap uint16) { - for i := range a { - sum := swap & (a[i] ^ b[i]) - a[i] ^= sum - b[i] ^= sum - } -} - -func lt(a, b uint) uint { - if a < b { - return ^uint(0) - } - return 0 -} - -func bsMul(s1, a1, s2, a2 uint) (s3, a3 uint) { - s3 = (a1 & s2) ^ (s1 & a2) - a3 = (a1 & a2) ^ (s1 & s2) - return -} - -func (out *poly3) invertMod3(in *poly3) { - // This algorithm follows algorithm 10 in the paper. (Although note that - // the paper appears to have a bug: k should start at zero, not one.) - // The best explanation for why it works is in the "Why it works" - // section of - // https://assets.onboardsecurity.com/static/downloads/NTRU/resources/NTRUTech014.pdf. - var k uint - degF, degG := uint(N-1), uint(N-1) - - var b, c, g poly3 - f := *in - - for i := range g.a { - g.a[i] = ^uint(0) - } - - b.a[0] = 1 - - var f0s, f0a uint - stillGoing := ^uint(0) - for i := 0; i < 2*(N-1)-1; i++ { - ss, sa := bsMul(f.s[0], f.a[0], g.s[0], g.a[0]) - ss, sa = sa&stillGoing&1, ss&stillGoing&1 - shouldSwap := ^uint(int((ss|sa)-1)>>(bitsPerWord-1)) & lt(degF, degG) - f.cswap(&g, shouldSwap) - b.cswap(&c, shouldSwap) - degF, degG = (degG&shouldSwap)|(degF & ^shouldSwap), (degF&shouldSwap)|(degG&^shouldSwap) - f.fmadd(ss, sa, &g) - b.fmadd(ss, sa, &c) - - f.divx() - f.s[wordsPerPoly-1] &= ((1 << bitsInLastWord) - 1) >> 1 - f.a[wordsPerPoly-1] &= ((1 << bitsInLastWord) - 1) >> 1 - c.mulx() - c.s[0] &= ^uint(1) - c.a[0] &= ^uint(1) - - degF-- - k += 1 & stillGoing - f0s = (stillGoing & f.s[0]) | (^stillGoing & f0s) - f0a = (stillGoing & f.a[0]) | (^stillGoing & f0a) - stillGoing = ^uint(int(degF-1) >> (bitsPerWord - 1)) - } - - k -= N & lt(N, k) - *out = b - out.rot(k) - out.mulConst(f0s, f0a) - out.modPhiN() -} - -func (out *poly) invertMod2(a *poly) { - // This algorithm follows mix of algorithm 10 in the paper and the first - // page of the PDF linked below. (Although note that the paper appears - // to have a bug: k should start at zero, not one.) The best explanation - // for why it works is in the "Why it works" section of - // https://assets.onboardsecurity.com/static/downloads/NTRU/resources/NTRUTech014.pdf. - var k uint - degF, degG := uint(N-1), uint(N-1) - - var f poly2 - f.fromDiscrete(a) - var b, c, g poly2 - g.setPhiN() - b[0] = 1 - - stillGoing := ^uint(0) - for i := 0; i < 2*(N-1)-1; i++ { - s := uint(f[0]&1) & stillGoing - shouldSwap := ^(s - 1) & lt(degF, degG) - f.cswap(&g, shouldSwap) - b.cswap(&c, shouldSwap) - degF, degG = (degG&shouldSwap)|(degF & ^shouldSwap), (degF&shouldSwap)|(degG&^shouldSwap) - f.fmadd(s, &g) - b.fmadd(s, &c) - - f.rshift1() - c.lshift1() - - degF-- - k += 1 & stillGoing - stillGoing = ^uint(int(degF-1) >> (bitsPerWord - 1)) - } - - k -= N & lt(N, k) - b.rot(k) - out.fromMod2(&b) -} - -func (out *poly) invert(origA *poly) { - // Inversion mod Q, which is done based on the result of inverting mod - // 2. See the NTRU paper, page three. - var a, tmp, tmp2, b poly - b.invertMod2(origA) - - // Negate a. - for i := range a { - a[i] = Q - origA[i] - } - - // We are working mod Q=2**13 and we need to iterate ceil(log_2(13)) - // times, which is four. - for i := 0; i < 4; i++ { - tmp.mul(&a, &b) - tmp[0] += 2 - tmp2.mul(&b, &tmp) - b = tmp2 - } - - *out = b -} - -type PublicKey struct { - h poly -} - -func ParsePublicKey(in []byte) (*PublicKey, bool) { - ret := new(PublicKey) - if !ret.h.unmarshal(in) { - return nil, false - } - return ret, true -} - -func (pub *PublicKey) Marshal() []byte { - ret := make([]byte, modQBytes) - pub.h.marshal(ret) - return ret -} - -func (pub *PublicKey) Encap(rand io.Reader) (ciphertext []byte, sharedKey []byte) { - var randBytes [352 + 352]byte - if _, err := io.ReadFull(rand, randBytes[:]); err != nil { - panic("rand failed") - } - - var m, r poly - m.shortSample(randBytes[:352]) - r.shortSample(randBytes[352:]) - - var mBytes, rBytes [mod3Bytes]byte - m.marshalS3(mBytes[:]) - r.marshalS3(rBytes[:]) - - ciphertext = pub.owf(&m, &r) - - h := sha256.New() - h.Write([]byte("shared key\x00")) - h.Write(mBytes[:]) - h.Write(rBytes[:]) - h.Write(ciphertext) - sharedKey = h.Sum(nil) - - return ciphertext, sharedKey -} - -func (pub *PublicKey) owf(m, r *poly) []byte { - for i := range r { - r[i] = mod3ToModQ(r[i]) - } - - var mq poly - mq.lift(m) - - var e poly - e.mul(r, &pub.h) - for i := range e { - e[i] = (e[i] + mq[i]) % Q - } - - ret := make([]byte, modQBytes) - e.marshal(ret[:]) - return ret -} - -type PrivateKey struct { - PublicKey - f, fp poly3 - hInv poly - hmacKey [32]byte -} - -func (priv *PrivateKey) Marshal() []byte { - var ret [2*mod3Bytes + modQBytes]byte - priv.f.marshal(ret[:]) - priv.fp.marshal(ret[mod3Bytes:]) - priv.h.marshal(ret[2*mod3Bytes:]) - return ret[:] -} - -func (priv *PrivateKey) Decap(ciphertext []byte) (sharedKey []byte, ok bool) { - if len(ciphertext) != modQBytes { - return nil, false - } - - var e poly - if !e.unmarshal(ciphertext) { - return nil, false - } - - var f poly - f.fromMod3ToModQ(&priv.f) - - var v1, m poly - v1.mul(&e, &f) - - var v13 poly3 - v13.fromDiscreteMod3(&v1) - // Note: v13 is not reduced mod phi(n). - - var m3 poly3 - m3.mulMod3(&v13, &priv.fp) - m3.modPhiN() - m.fromMod3(&m3) - - var mLift, delta poly - mLift.lift(&m) - for i := range delta { - delta[i] = (e[i] - mLift[i] + Q) % Q - } - delta.mul(&delta, &priv.hInv) - delta.modPhiN() - - var r poly3 - allOk := r.fromModQ(&delta) - - var mBytes, rBytes [mod3Bytes]byte - m.marshalS3(mBytes[:]) - r.marshal(rBytes[:]) - - var rPoly poly - rPoly.fromMod3(&r) - expectedCiphertext := priv.PublicKey.owf(&m, &rPoly) - - allOk &= subtle.ConstantTimeCompare(ciphertext, expectedCiphertext) - - hmacHash := hmac.New(sha256.New, priv.hmacKey[:]) - hmacHash.Write(ciphertext) - hmacDigest := hmacHash.Sum(nil) - - h := sha256.New() - h.Write([]byte("shared key\x00")) - h.Write(mBytes[:]) - h.Write(rBytes[:]) - h.Write(ciphertext) - sharedKey = h.Sum(nil) - - mask := uint8(allOk - 1) - for i := range sharedKey { - sharedKey[i] = (sharedKey[i] & ^mask) | (hmacDigest[i] & mask) - } - - return sharedKey, true -} - -func GenerateKey(rand io.Reader) PrivateKey { - var randBytes [352 + 352]byte - if _, err := io.ReadFull(rand, randBytes[:]); err != nil { - panic("rand failed") - } - - var f poly - f.shortSamplePlus(randBytes[:352]) - var priv PrivateKey - priv.f.fromDiscrete(&f) - priv.fp.invertMod3(&priv.f) - - var g poly - g.shortSamplePlus(randBytes[352:]) - - var pgPhi1 poly - for i := range g { - pgPhi1[i] = mod3ToModQ(g[i]) - } - for i := range pgPhi1 { - pgPhi1[i] = (pgPhi1[i] * 3) % Q - } - pgPhi1.mulXMinus1() - - var fModQ poly - fModQ.fromMod3ToModQ(&priv.f) - - var pfgPhi1 poly - pfgPhi1.mul(&fModQ, &pgPhi1) - - var i poly - i.invert(&pfgPhi1) - - priv.h.mul(&i, &pgPhi1) - priv.h.mul(&priv.h, &pgPhi1) - - priv.hInv.mul(&i, &fModQ) - priv.hInv.mul(&priv.hInv, &fModQ) - - return priv -} diff --git a/third_party/boringssl/src/ssl/test/runner/key_agreement.go b/third_party/boringssl/src/ssl/test/runner/key_agreement.go index bfd35f69f6da..5739888f7824 100644 --- a/third_party/boringssl/src/ssl/test/runner/key_agreement.go +++ b/third_party/boringssl/src/ssl/test/runner/key_agreement.go @@ -17,7 +17,6 @@ import ( "io" "math/big" - "boringssl.googlesource.com/boringssl/ssl/test/runner/hrss" "golang.org/x/crypto/curve25519" ) @@ -231,28 +230,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 +269,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 +312,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,104 +340,18 @@ 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 { - x25519PrivateKey [32]byte - hrssPrivateKey hrss.PrivateKey -} - -func (e *cecpq2Curve) offer(rand io.Reader) (publicKey []byte, err error) { - if _, err := io.ReadFull(rand, e.x25519PrivateKey[:]); err != nil { - return nil, err - } - - var x25519Public [32]byte - curve25519.ScalarBaseMult(&x25519Public, &e.x25519PrivateKey) - - e.hrssPrivateKey = hrss.GenerateKey(rand) - hrssPublic := e.hrssPrivateKey.PublicKey.Marshal() - - var ret []byte - ret = append(ret, x25519Public[:]...) - ret = append(ret, hrssPublic...) - return ret, nil -} - -func (e *cecpq2Curve) accept(rand io.Reader, peerKey []byte) (publicKey []byte, preMasterSecret []byte, err error) { - if len(peerKey) != 32+hrss.PublicKeySize { - return nil, nil, errors.New("tls: bad length CECPQ2 offer") - } - - if _, err := io.ReadFull(rand, e.x25519PrivateKey[:]); err != nil { - return nil, nil, err - } - - var x25519Shared, x25519PeerKey, x25519Public [32]byte - copy(x25519PeerKey[:], peerKey) - curve25519.ScalarBaseMult(&x25519Public, &e.x25519PrivateKey) - curve25519.ScalarMult(&x25519Shared, &e.x25519PrivateKey, &x25519PeerKey) - - // Per RFC 7748, reject the all-zero value in constant time. - var zeros [32]byte - if subtle.ConstantTimeCompare(zeros[:], x25519Shared[:]) == 1 { - return nil, nil, errors.New("tls: X25519 value with wrong order") - } - - hrssPublicKey, ok := hrss.ParsePublicKey(peerKey[32:]) - if !ok { - return nil, nil, errors.New("tls: bad CECPQ2 offer") - } - - hrssCiphertext, hrssShared := hrssPublicKey.Encap(rand) - - publicKey = append(publicKey, x25519Public[:]...) - publicKey = append(publicKey, hrssCiphertext...) - preMasterSecret = append(preMasterSecret, x25519Shared[:]...) - preMasterSecret = append(preMasterSecret, hrssShared...) - - return publicKey, preMasterSecret, nil -} - -func (e *cecpq2Curve) finish(peerKey []byte) (preMasterSecret []byte, err error) { - if len(peerKey) != 32+hrss.CiphertextSize { - return nil, errors.New("tls: bad length CECPQ2 reply") - } - - var x25519Shared, x25519PeerKey [32]byte - copy(x25519PeerKey[:], peerKey) - curve25519.ScalarMult(&x25519Shared, &e.x25519PrivateKey, &x25519PeerKey) - - // Per RFC 7748, reject the all-zero value in constant time. - var zeros [32]byte - if subtle.ConstantTimeCompare(zeros[:], x25519Shared[:]) == 1 { - return nil, errors.New("tls: X25519 value with wrong order") - } - - hrssShared, ok := e.hrssPrivateKey.Decap(peerKey[32:]) - if !ok { - return nil, errors.New("tls: invalid HRSS ciphertext") - } - - preMasterSecret = append(preMasterSecret, x25519Shared[:]...) - preMasterSecret = append(preMasterSecret, hrssShared...) - - return preMasterSecret, 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 - case CurveCECPQ2: - return &cecpq2Curve{}, true + return &x25519KEM{setHighBit: config.Bugs.SetX25519HighBit}, true default: return nil, false } @@ -576,7 +488,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 } @@ -588,7 +500,7 @@ func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Cer NextCandidate: for _, candidate := range preferredCurves { if isPqGroup(candidate) && version < VersionTLS13 { - // CECPQ2 is TLS 1.3-only. + // Post-quantum "groups" require TLS 1.3. continue } @@ -605,12 +517,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 +548,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 +558,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 +580,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/third_party/boringssl/src/ssl/test/runner/mock_quic_transport.go b/third_party/boringssl/src/ssl/test/runner/mock_quic_transport.go index 709f7d12af1c..293927444fa2 100644 --- a/third_party/boringssl/src/ssl/test/runner/mock_quic_transport.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/ssl/test/runner/runner.go b/third_party/boringssl/src/ssl/test/runner/runner.go index 655226ca7a39..1da1e2a4f14a 100644 --- a/third_party/boringssl/src/ssl/test/runner/runner.go +++ b/third_party/boringssl/src/ssl/test/runner/runner.go @@ -32,7 +32,6 @@ import ( "flag" "fmt" "io" - "io/ioutil" "math/big" "net" "os" @@ -66,6 +65,7 @@ var ( allowHintMismatch = flag.String("allow-hint-mismatch", "", "Semicolon-separated patterns of tests where hints may mismatch") numWorkersFlag = flag.Int("num-workers", runtime.NumCPU(), "The number of workers to run in parallel.") shimPath = flag.String("shim-path", "../../../build/ssl/test/bssl_shim", "The location of the shim binary.") + shimExtraFlags = flag.String("shim-extra-flags", "", "Semicolon-separated extra flags to pass to the shim binary on each invocation.") handshakerPath = flag.String("handshaker-path", "../../../build/ssl/test/handshaker", "The location of the handshaker binary.") resourceDir = flag.String("resource-dir", ".", "The directory in which to find certificate and key files.") fuzzer = flag.Bool("fuzzer", false, "If true, tests against a BoringSSL built in fuzzer mode.") @@ -234,7 +234,7 @@ func initCertificates() { *testCerts[i].cert = cert } - channelIDPEMBlock, err := ioutil.ReadFile(path.Join(*resourceDir, channelIDKeyFile)) + channelIDPEMBlock, err := os.ReadFile(path.Join(*resourceDir, channelIDKeyFile)) if err != nil { panic(err) } @@ -294,7 +294,7 @@ type delegatedCredentialConfig struct { func loadRSAPrivateKey(filename string) (priv *rsa.PrivateKey, privPKCS8 []byte, err error) { pemPath := path.Join(*resourceDir, filename) - pemBytes, err := ioutil.ReadFile(pemPath) + pemBytes, err := os.ReadFile(pemPath) if err != nil { return nil, nil, err } @@ -712,7 +712,7 @@ func appendTranscript(path string, data []byte) error { return nil } - settings, err := ioutil.ReadFile(path) + settings, err := os.ReadFile(path) if err != nil { if !os.IsNotExist(err) { return err @@ -723,7 +723,7 @@ func appendTranscript(path string, data []byte) error { } settings = append(settings, data...) - return ioutil.WriteFile(path, settings, 0644) + return os.WriteFile(path, settings, 0644) } // A timeoutConn implements an idle timeout on each Read and Write operation. @@ -822,7 +822,7 @@ func doExchange(test *testCase, config *Config, conn net.Conn, isResume bool, tr bb := newByteBuilder() bb.addU24LengthPrefixed().addBytes(encodedInner) bb.addBytes(outer) - return ioutil.WriteFile(filepath.Join(dir, name), bb.finish(), 0644) + return os.WriteFile(filepath.Join(dir, name), bb.finish(), 0644) } } @@ -1091,7 +1091,7 @@ func doExchange(test *testCase, config *Config, conn net.Conn, isResume bool, tr return fmt.Errorf("messageLen < 0 not supported for DTLS tests") } // Read until EOF. - _, err := io.Copy(ioutil.Discard, tlsConn) + _, err := io.Copy(io.Discard, tlsConn) return err } if messageLen == 0 { @@ -1434,6 +1434,9 @@ func runTest(statusChan chan statusMsg, test *testCase, shimPath string, mallocN }() var flags []string + if len(*shimExtraFlags) > 0 { + flags = strings.Split(*shimExtraFlags, ";") + } if test.testType == serverTest { flags = append(flags, "-server") @@ -1851,7 +1854,6 @@ var testCipherSuites = []testCipherSuite{ {"CHACHA20_POLY1305_SHA256", TLS_CHACHA20_POLY1305_SHA256}, {"AES_128_GCM_SHA256", TLS_AES_128_GCM_SHA256}, {"AES_256_GCM_SHA384", TLS_AES_256_GCM_SHA384}, - {"RSA_WITH_NULL_SHA", TLS_RSA_WITH_NULL_SHA}, } func hasComponent(suiteName, component string) bool { @@ -1879,7 +1881,12 @@ func bigFromHex(hex string) *big.Int { func convertToSplitHandshakeTests(tests []testCase) (splitHandshakeTests []testCase, err error) { var stdout bytes.Buffer - shim := exec.Command(*shimPath, "-is-handshaker-supported") + var flags []string + if len(*shimExtraFlags) > 0 { + flags = strings.Split(*shimExtraFlags, ";") + } + flags = append(flags, "-is-handshaker-supported") + shim := exec.Command(*shimPath, flags...) shim.Stdout = &stdout if err := shim.Run(); err != nil { return nil, err @@ -3674,10 +3681,6 @@ func addTestForCipherSuite(suite testCipherSuite, ver tlsVersion, protocol proto "-psk", psk, "-psk-identity", pskIdentity) } - if hasComponent(suite.name, "NULL") { - // NULL ciphers must be explicitly enabled. - flags = append(flags, "-cipher", "DEFAULT:NULL-SHA") - } var shouldFail bool if isTLS12Only(suite.name) && ver.version < VersionTLS12 { @@ -9853,7 +9856,6 @@ func addSignatureAlgorithmTests() { []string{ "-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)), "-key-file", path.Join(*resourceDir, getShimKey(alg.cert)), - "-signing-prefs", strconv.Itoa(int(alg.id)), }, flagInts("-curves", shimConfig.AllCurves)..., ), @@ -9861,6 +9863,9 @@ func addSignatureAlgorithmTests() { peerSignatureAlgorithm: alg.id, }, } + if alg.id != 0 { + negotiateTest.flags = append(negotiateTest.flags, "-signing-prefs", strconv.Itoa(int(alg.id))) + } if testType == serverTest { // TLS 1.2 servers only sign on some cipher suites. @@ -9893,14 +9898,7 @@ func addSignatureAlgorithmTests() { IgnorePeerSignatureAlgorithmPreferences: shouldFail, }, }, - flags: append( - []string{ - "-expect-peer-signature-algorithm", strconv.Itoa(int(alg.id)), - // The algorithm may be disabled by default, so explicitly enable it. - "-verify-prefs", strconv.Itoa(int(alg.id)), - }, - flagInts("-curves", shimConfig.AllCurves)..., - ), + flags: flagInts("-curves", shimConfig.AllCurves), // Resume the session to assert the peer signature // algorithm is reported on both handshakes. resumeSession: !shouldFail, @@ -9908,6 +9906,11 @@ func addSignatureAlgorithmTests() { expectedError: verifyError, expectedLocalError: verifyLocalError, } + if alg.id != 0 { + verifyTest.flags = append(verifyTest.flags, "-expect-peer-signature-algorithm", strconv.Itoa(int(alg.id))) + // The algorithm may be disabled by default, so explicitly enable it. + verifyTest.flags = append(verifyTest.flags, "-verify-prefs", strconv.Itoa(int(alg.id))) + } // Test whether the shim expects the algorithm enabled by default. defaultTest := testCase{ @@ -9952,14 +9955,14 @@ func addSignatureAlgorithmTests() { InvalidSignature: true, }, }, - flags: append( - // The algorithm may be disabled by default, so explicitly enable it. - []string{"-verify-prefs", strconv.Itoa(int(alg.id))}, - flagInts("-curves", shimConfig.AllCurves)..., - ), + flags: flagInts("-curves", shimConfig.AllCurves), shouldFail: true, expectedError: ":BAD_SIGNATURE:", } + if alg.id != 0 { + // The algorithm may be disabled by default, so explicitly enable it. + invalidTest.flags = append(invalidTest.flags, "-verify-prefs", strconv.Itoa(int(alg.id))) + } if testType == serverTest { // TLS 1.2 servers only verify when they request client certificates. @@ -10478,10 +10481,8 @@ func addSignatureAlgorithmTests() { flags: []string{ "-cert-file", path.Join(*resourceDir, rsaCertificateFile), "-key-file", path.Join(*resourceDir, rsaKeyFile), - "-signing-prefs", strconv.Itoa(int(fakeSigAlg1)), "-signing-prefs", strconv.Itoa(int(signatureECDSAWithP256AndSHA256)), "-signing-prefs", strconv.Itoa(int(signatureRSAPKCS1WithSHA256)), - "-signing-prefs", strconv.Itoa(int(fakeSigAlg2)), }, expectations: connectionExpectations{ peerSignatureAlgorithm: signatureRSAPKCS1WithSHA256, @@ -10617,7 +10618,7 @@ func addSignatureAlgorithmTests() { Certificates: []Certificate{ed25519Certificate}, Bugs: ProtocolBugs{ // Sign with Ed25519 even though it is TLS 1.1. - UseLegacySigningAlgorithm: signatureEd25519, + SigningAlgorithmForLegacyVersions: signatureEd25519, }, }, flags: []string{"-verify-prefs", strconv.Itoa(int(signatureEd25519))}, @@ -10645,7 +10646,7 @@ func addSignatureAlgorithmTests() { Certificates: []Certificate{ed25519Certificate}, Bugs: ProtocolBugs{ // Sign with Ed25519 even though it is TLS 1.1. - UseLegacySigningAlgorithm: signatureEd25519, + SigningAlgorithmForLegacyVersions: signatureEd25519, }, }, flags: []string{ @@ -10765,6 +10766,69 @@ func addSignatureAlgorithmTests() { "-verify-prefs", strconv.Itoa(int(signatureEd25519)), }, }) + + for _, testType := range []testType{clientTest, serverTest} { + for _, ver := range tlsVersions { + if ver.version < VersionTLS12 { + continue + } + + prefix := "Client-" + ver.name + "-" + if testType == serverTest { + prefix = "Server-" + ver.name + "-" + } + + // Test that the shim will not sign MD5/SHA1 with RSA at TLS 1.2, + // even if specified in signing preferences. + testCases = append(testCases, testCase{ + testType: testType, + name: prefix + "NoSign-RSA_PKCS1_MD5_SHA1", + config: Config{ + MaxVersion: ver.version, + CipherSuites: signingCiphers, + ClientAuth: RequireAnyClientCert, + VerifySignatureAlgorithms: []signatureAlgorithm{signatureRSAPKCS1WithMD5AndSHA1}, + }, + flags: []string{ + "-cert-file", path.Join(*resourceDir, rsaCertificateFile), + "-key-file", path.Join(*resourceDir, rsaKeyFile), + "-signing-prefs", strconv.Itoa(int(signatureRSAPKCS1WithMD5AndSHA1)), + // Include a valid algorithm as well, to avoid an empty list + // if filtered out. + "-signing-prefs", strconv.Itoa(int(signatureRSAPKCS1WithSHA256)), + }, + shouldFail: true, + expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:", + }) + + // Test that the shim will not accept MD5/SHA1 with RSA at TLS 1.2, + // even if specified in verify preferences. + testCases = append(testCases, testCase{ + testType: testType, + name: prefix + "NoVerify-RSA_PKCS1_MD5_SHA1", + config: Config{ + MaxVersion: ver.version, + Certificates: []Certificate{rsaCertificate}, + Bugs: ProtocolBugs{ + IgnorePeerSignatureAlgorithmPreferences: true, + AlwaysSignAsLegacyVersion: true, + SendSignatureAlgorithm: signatureRSAPKCS1WithMD5AndSHA1, + }, + }, + flags: []string{ + "-cert-file", path.Join(*resourceDir, rsaCertificateFile), + "-key-file", path.Join(*resourceDir, rsaKeyFile), + "-verify-prefs", strconv.Itoa(int(signatureRSAPKCS1WithMD5AndSHA1)), + // Include a valid algorithm as well, to avoid an empty list + // if filtered out. + "-verify-prefs", strconv.Itoa(int(signatureRSAPKCS1WithSHA256)), + "-require-any-client-certificate", + }, + shouldFail: true, + expectedError: ":WRONG_SIGNATURE_TYPE:", + }) + } + } } // timeouts is the retransmit schedule for BoringSSL. It doubles and @@ -11311,13 +11375,12 @@ var testCurves = []struct { {"P-384", CurveP384}, {"P-521", CurveP521}, {"X25519", CurveX25519}, - {"CECPQ2", CurveCECPQ2}, } const bogusCurve = 0x1234 func isPqGroup(r CurveID) bool { - return r == CurveCECPQ2 + return r == CurveX25519Kyber768 } func addCurveTests() { @@ -11781,105 +11844,127 @@ func addCurveTests() { }, }) - // CECPQ2 should not be offered by a TLS < 1.3 client. + // Kyber should not be offered by a TLS < 1.3 client. testCases = append(testCases, testCase{ - name: "CECPQ2NotInTLS12", + name: "KyberNotInTLS12", config: Config{ Bugs: ProtocolBugs{ - FailIfCECPQ2Offered: true, + FailIfKyberOffered: true, }, }, flags: []string{ "-max-version", strconv.Itoa(VersionTLS12), - "-curves", strconv.Itoa(int(CurveCECPQ2)), + "-curves", strconv.Itoa(int(CurveX25519Kyber768)), "-curves", strconv.Itoa(int(CurveX25519)), }, }) - // CECPQ2 should not crash a TLS < 1.3 client if the server mistakenly + // Kyber should not crash a TLS < 1.3 client if the server mistakenly // selects it. testCases = append(testCases, testCase{ - name: "CECPQ2NotAcceptedByTLS12Client", + name: "KyberNotAcceptedByTLS12Client", config: Config{ Bugs: ProtocolBugs{ - SendCurve: CurveCECPQ2, + SendCurve: CurveX25519Kyber768, }, }, flags: []string{ "-max-version", strconv.Itoa(VersionTLS12), - "-curves", strconv.Itoa(int(CurveCECPQ2)), + "-curves", strconv.Itoa(int(CurveX25519Kyber768)), "-curves", strconv.Itoa(int(CurveX25519)), }, shouldFail: true, expectedError: ":WRONG_CURVE:", }) - // CECPQ2 should not be offered by default as a client. + // Kyber should not be offered by default as a client. testCases = append(testCases, testCase{ - name: "CECPQ2NotEnabledByDefaultInClients", + name: "KyberNotEnabledByDefaultInClients", config: Config{ MinVersion: VersionTLS13, Bugs: ProtocolBugs{ - FailIfCECPQ2Offered: true, + FailIfKyberOffered: true, }, }, }) - // If CECPQ2 is offered, both X25519 and CECPQ2 should have a key-share. + // If Kyber is offered, both X25519 and Kyber should have a key-share. testCases = append(testCases, testCase{ - name: "NotJustCECPQ2KeyShare", + name: "NotJustKyberKeyShare", config: Config{ MinVersion: VersionTLS13, Bugs: ProtocolBugs{ - ExpectedKeyShares: []CurveID{CurveCECPQ2, CurveX25519}, + ExpectedKeyShares: []CurveID{CurveX25519Kyber768, CurveX25519}, }, }, flags: []string{ - "-curves", strconv.Itoa(int(CurveCECPQ2)), + "-curves", strconv.Itoa(int(CurveX25519Kyber768)), "-curves", strconv.Itoa(int(CurveX25519)), - "-expect-curve-id", strconv.Itoa(int(CurveCECPQ2)), + // Cannot expect Kyber until we have a Go implementation of it. + // "-expect-curve-id", strconv.Itoa(int(CurveX25519Kyber768)), }, }) - // ... but only if CECPQ2 is listed first. + // ... and the other way around testCases = append(testCases, testCase{ - name: "CECPQ2KeyShareNotIncludedSecond", + name: "KyberKeyShareIncludedSecond", config: Config{ MinVersion: VersionTLS13, Bugs: ProtocolBugs{ - ExpectedKeyShares: []CurveID{CurveX25519}, + ExpectedKeyShares: []CurveID{CurveX25519, CurveX25519Kyber768}, }, }, flags: []string{ "-curves", strconv.Itoa(int(CurveX25519)), - "-curves", strconv.Itoa(int(CurveCECPQ2)), + "-curves", strconv.Itoa(int(CurveX25519Kyber768)), "-expect-curve-id", strconv.Itoa(int(CurveX25519)), }, }) - // If CECPQ2 is the only configured curve, the key share is sent. + // ... 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: "JustConfiguringCECPQ2Works", + name: "KyberKeyShareIncludedThird", config: Config{ MinVersion: VersionTLS13, Bugs: ProtocolBugs{ - ExpectedKeyShares: []CurveID{CurveCECPQ2}, + ExpectedKeyShares: []CurveID{CurveX25519, CurveX25519Kyber768}, }, }, flags: []string{ - "-curves", strconv.Itoa(int(CurveCECPQ2)), - "-expect-curve-id", strconv.Itoa(int(CurveCECPQ2)), + "-curves", strconv.Itoa(int(CurveX25519)), + "-curves", strconv.Itoa(int(CurveP256)), + "-curves", strconv.Itoa(int(CurveX25519Kyber768)), + "-expect-curve-id", strconv.Itoa(int(CurveX25519)), }, }) - // As a server, CECPQ2 is not yet supported by default. + // If Kyber is the only configured curve, the key share is sent. + testCases = append(testCases, testCase{ + name: "JustConfiguringKyberWorks", + config: Config{ + MinVersion: VersionTLS13, + Bugs: ProtocolBugs{ + ExpectedKeyShares: []CurveID{CurveX25519Kyber768}, + }, + }, + flags: []string{ + "-curves", strconv.Itoa(int(CurveX25519Kyber768)), + "-expect-curve-id", strconv.Itoa(int(CurveX25519Kyber768)), + }, + shouldFail: true, + expectedLocalError: "no curve supported by both client and server", + }) + + // As a server, Kyber is not yet supported by default. testCases = append(testCases, testCase{ testType: serverTest, - name: "CECPQ2NotEnabledByDefaultForAServer", + name: "KyberNotEnabledByDefaultForAServer", config: Config{ MinVersion: VersionTLS13, - CurvePreferences: []CurveID{CurveCECPQ2, CurveX25519}, - DefaultCurves: []CurveID{CurveCECPQ2}, + CurvePreferences: []CurveID{CurveX25519Kyber768, CurveX25519}, + DefaultCurves: []CurveID{CurveX25519Kyber768}, }, flags: []string{ "-server-preference", @@ -15107,95 +15192,6 @@ func addTLS13CipherPreferenceTests() { "-expect-cipher-no-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)), }, }) - - // CECPQ2 prefers 256-bit ciphers but will use AES-128 if there's nothing else. - testCases = append(testCases, testCase{ - testType: serverTest, - name: "TLS13-CipherPreference-CECPQ2-AES128Only", - config: Config{ - MaxVersion: VersionTLS13, - CipherSuites: []uint16{ - TLS_AES_128_GCM_SHA256, - }, - }, - flags: []string{ - "-curves", strconv.Itoa(int(CurveCECPQ2)), - }, - }) - - // When a 256-bit cipher is offered, even if not in first place, it should be - // picked. - testCases = append(testCases, testCase{ - testType: serverTest, - name: "TLS13-CipherPreference-CECPQ2-AES256Preferred", - config: Config{ - MaxVersion: VersionTLS13, - CipherSuites: []uint16{ - TLS_AES_128_GCM_SHA256, - TLS_AES_256_GCM_SHA384, - }, - }, - flags: []string{ - "-curves", strconv.Itoa(int(CurveCECPQ2)), - }, - expectations: connectionExpectations{ - cipher: TLS_AES_256_GCM_SHA384, - }, - }) - // ... but when CECPQ2 isn't being used, the client's preference controls. - testCases = append(testCases, testCase{ - testType: serverTest, - name: "TLS13-CipherPreference-CECPQ2-AES128PreferredOtherwise", - config: Config{ - MaxVersion: VersionTLS13, - CipherSuites: []uint16{ - TLS_AES_128_GCM_SHA256, - TLS_AES_256_GCM_SHA384, - }, - }, - flags: []string{ - "-curves", strconv.Itoa(int(CurveX25519)), - }, - expectations: connectionExpectations{ - cipher: TLS_AES_128_GCM_SHA256, - }, - }) - - // Test that CECPQ2 continues to honor AES vs ChaCha20 logic. - testCases = append(testCases, testCase{ - testType: serverTest, - name: "TLS13-CipherPreference-CECPQ2-AES128-ChaCha20-AES256", - config: Config{ - MaxVersion: VersionTLS13, - CipherSuites: []uint16{ - TLS_AES_128_GCM_SHA256, - TLS_CHACHA20_POLY1305_SHA256, - TLS_AES_256_GCM_SHA384, - }, - }, - flags: []string{ - "-curves", strconv.Itoa(int(CurveCECPQ2)), - "-expect-cipher-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)), - "-expect-cipher-no-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)), - }, - }) - testCases = append(testCases, testCase{ - testType: serverTest, - name: "TLS13-CipherPreference-CECPQ2-AES128-AES256-ChaCha20", - config: Config{ - MaxVersion: VersionTLS13, - CipherSuites: []uint16{ - TLS_AES_128_GCM_SHA256, - TLS_AES_256_GCM_SHA384, - TLS_CHACHA20_POLY1305_SHA256, - }, - }, - flags: []string{ - "-curves", strconv.Itoa(int(CurveCECPQ2)), - "-expect-cipher-aes", strconv.Itoa(int(TLS_AES_256_GCM_SHA384)), - "-expect-cipher-no-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)), - }, - }) } func addPeekTests() { @@ -15655,26 +15651,26 @@ func addRSAKeyUsageTests() { // In 1.2 and below, we should not enforce without the enforce-rsa-key-usage flag. testCases = append(testCases, testCase{ testType: clientTest, - name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-Unenforced" + ver.name, + name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-Unenforced-" + ver.name, config: Config{ MinVersion: ver.version, MaxVersion: ver.version, Certificates: []Certificate{dsCert}, CipherSuites: encSuites, }, - flags: []string{"-no-enforce-rsa-key-usage"}, + flags: []string{"-expect-key-usage-invalid", "-ignore-rsa-key-usage"}, }) testCases = append(testCases, testCase{ testType: clientTest, - name: "RSAKeyUsage-Client-WantEncipherment-GotSignature-Unenforced" + ver.name, + name: "RSAKeyUsage-Client-WantEncipherment-GotSignature-Unenforced-" + ver.name, config: Config{ MinVersion: ver.version, MaxVersion: ver.version, Certificates: []Certificate{encCert}, CipherSuites: dsSuites, }, - flags: []string{"-no-enforce-rsa-key-usage"}, + flags: []string{"-expect-key-usage-invalid", "-ignore-rsa-key-usage"}, }) } @@ -15682,14 +15678,14 @@ func addRSAKeyUsageTests() { // In 1.3 and above, we enforce keyUsage even when disabled. testCases = append(testCases, testCase{ testType: clientTest, - name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-AlwaysEnforced" + ver.name, + name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-AlwaysEnforced-" + ver.name, config: Config{ MinVersion: ver.version, MaxVersion: ver.version, Certificates: []Certificate{encCert}, CipherSuites: dsSuites, }, - flags: []string{"-no-enforce-rsa-key-usage"}, + flags: []string{"-ignore-rsa-key-usage"}, shouldFail: true, expectedError: ":KEY_USAGE_BIT_INCORRECT:", }) @@ -16380,7 +16376,7 @@ func addJDK11WorkaroundTests() { func addDelegatedCredentialTests() { certPath := path.Join(*resourceDir, rsaCertificateFile) - pemBytes, err := ioutil.ReadFile(certPath) + pemBytes, err := os.ReadFile(certPath) if err != nil { panic(err) } @@ -19544,7 +19540,7 @@ func main() { initCertificates() if len(*shimConfigFile) != 0 { - encoded, err := ioutil.ReadFile(*shimConfigFile) + encoded, err := os.ReadFile(*shimConfigFile) if err != nil { fmt.Fprintf(os.Stderr, "Couldn't read config file %q: %s\n", *shimConfigFile, err) os.Exit(1) diff --git a/third_party/boringssl/src/ssl/test/runner/sharding.go b/third_party/boringssl/src/ssl/test/runner/sharding.go index 5061a6ffed71..b10973a8d6d7 100644 --- a/third_party/boringssl/src/ssl/test/runner/sharding.go +++ b/third_party/boringssl/src/ssl/test/runner/sharding.go @@ -16,7 +16,6 @@ package runner import ( "fmt" - "io/ioutil" "os" "strconv" ) @@ -68,7 +67,7 @@ func getSharding() (index, total int, err error) { } if len(statusFile) > 0 { - if err := ioutil.WriteFile(statusFile, nil, 0664); err != nil { + if err := os.WriteFile(statusFile, nil, 0664); err != nil { return 0, 0, err } } diff --git a/third_party/boringssl/src/ssl/test/runner/sign.go b/third_party/boringssl/src/ssl/test/runner/sign.go index d57cd6070c0a..da6452ac00f7 100644 --- a/third_party/boringssl/src/ssl/test/runner/sign.go +++ b/third_party/boringssl/src/ssl/test/runner/sign.go @@ -274,8 +274,8 @@ func (e *ed25519Signer) verifyMessage(key crypto.PublicKey, msg, sig []byte) err func getSigner(version uint16, key interface{}, config *Config, sigAlg signatureAlgorithm, isVerify bool) (signer, error) { // TLS 1.1 and below use legacy signature algorithms. - if version < VersionTLS12 { - if config.Bugs.UseLegacySigningAlgorithm == 0 || isVerify { + if version < VersionTLS12 || (!isVerify && config.Bugs.AlwaysSignAsLegacyVersion) { + if config.Bugs.SigningAlgorithmForLegacyVersions == 0 || isVerify { switch key.(type) { case *rsa.PrivateKey, *rsa.PublicKey: return &rsaPKCS1Signer{crypto.MD5SHA1}, nil @@ -287,7 +287,7 @@ func getSigner(version uint16, key interface{}, config *Config, sigAlg signature } // Fall through, forcing a particular algorithm. - sigAlg = config.Bugs.UseLegacySigningAlgorithm + sigAlg = config.Bugs.SigningAlgorithmForLegacyVersions } switch sigAlg { diff --git a/third_party/boringssl/src/ssl/test/runner/tls.go b/third_party/boringssl/src/ssl/test/runner/tls.go index af3fa3af13e5..6e57d181970a 100644 --- a/third_party/boringssl/src/ssl/test/runner/tls.go +++ b/third_party/boringssl/src/ssl/test/runner/tls.go @@ -14,8 +14,8 @@ import ( "crypto/x509" "encoding/pem" "errors" - "io/ioutil" "net" + "os" "strings" "time" ) @@ -174,11 +174,11 @@ func Dial(network, addr string, config *Config) (*Conn, error) { // LoadX509KeyPair reads and parses a public/private key pair from a pair of // files. The files must contain PEM encoded data. func LoadX509KeyPair(certFile, keyFile string) (cert Certificate, err error) { - certPEMBlock, err := ioutil.ReadFile(certFile) + certPEMBlock, err := os.ReadFile(certFile) if err != nil { return } - keyPEMBlock, err := ioutil.ReadFile(keyFile) + keyPEMBlock, err := os.ReadFile(keyFile) if err != nil { return } diff --git a/third_party/boringssl/src/ssl/test/test_config.cc b/third_party/boringssl/src/ssl/test/test_config.cc index 0230bdb95837..ba10a3319004 100644 --- a/third_party/boringssl/src/ssl/test/test_config.cc +++ b/third_party/boringssl/src/ssl/test/test_config.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,7 @@ #include #include +#include #include #include #include @@ -62,7 +64,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; } @@ -364,8 +366,9 @@ std::vector SortedFlags() { IntFlag("-install-one-cert-compression-alg", &TestConfig::install_one_cert_compression_alg), BoolFlag("-reverify-on-resume", &TestConfig::reverify_on_resume), - BoolFlag("-no-enforce-rsa-key-usage", - &TestConfig::no_enforce_rsa_key_usage), + BoolFlag("-ignore-rsa-key-usage", &TestConfig::ignore_rsa_key_usage), + BoolFlag("-expect-key-usage-invalid", + &TestConfig::expect_key_usage_invalid), BoolFlag("-is-handshaker-supported", &TestConfig::is_handshaker_supported), BoolFlag("-handshaker-resume", &TestConfig::handshaker_resume), @@ -494,25 +497,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) { @@ -569,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; } @@ -584,8 +593,9 @@ static void MessageCallback(int is_write, int version, int content_type, } if (content_type == SSL3_RT_HEADER) { - if (len != - (config->is_dtls ? DTLS1_RT_HEADER_LENGTH : SSL3_RT_HEADER_LENGTH)) { + size_t header_len = + config->is_dtls ? DTLS1_RT_HEADER_LENGTH : SSL3_RT_HEADER_LENGTH; + if (len != header_len) { fprintf(stderr, "Incorrect length for record header: %zu.\n", len); state->msg_callback_ok = false; } @@ -922,22 +932,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; @@ -946,7 +940,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; @@ -1383,13 +1378,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"; @@ -1619,7 +1617,7 @@ static unsigned PskClientCallback(SSL *ssl, const char *hint, OPENSSL_strlcpy(out_identity, config->psk_identity.c_str(), max_identity_len); OPENSSL_memcpy(out_psk, config->psk.data(), config->psk.size()); - return config->psk.size(); + return static_cast(config->psk.size()); } static unsigned PskServerCallback(SSL *ssl, const char *identity, @@ -1637,7 +1635,7 @@ static unsigned PskServerCallback(SSL *ssl, const char *identity, } OPENSSL_memcpy(out_psk, config->psk.data(), config->psk.size()); - return config->psk.size(); + return static_cast(config->psk.size()); } static ssl_verify_result_t CustomVerifyCallback(SSL *ssl, uint8_t *out_alert) { @@ -1743,7 +1741,7 @@ bssl::UniquePtr TestConfig::NewSSL( if (reverify_on_resume) { SSL_CTX_set_reverify_on_resume(ssl_ctx, 1); } - if (no_enforce_rsa_key_usage) { + if (ignore_rsa_key_usage) { SSL_set_enforce_rsa_key_usage(ssl.get(), 0); } if (no_tls13) { @@ -1911,8 +1909,8 @@ bssl::UniquePtr TestConfig::NewSSL( nids.push_back(NID_X25519); break; - case SSL_CURVE_CECPQ2: - nids.push_back(NID_CECPQ2); + case SSL_CURVE_X25519KYBER768: + nids.push_back(NID_X25519Kyber768); break; } if (!SSL_set1_curves(ssl.get(), &nids[0], nids.size())) { diff --git a/third_party/boringssl/src/ssl/test/test_config.h b/third_party/boringssl/src/ssl/test/test_config.h index 6b158911cfdc..5cc59264373a 100644 --- a/third_party/boringssl/src/ssl/test/test_config.h +++ b/third_party/boringssl/src/ssl/test/test_config.h @@ -177,7 +177,8 @@ struct TestConfig { bool install_cert_compression_algs = false; int install_one_cert_compression_alg = 0; bool reverify_on_resume = false; - bool no_enforce_rsa_key_usage = false; + bool ignore_rsa_key_usage = false; + bool expect_key_usage_invalid = false; bool is_handshaker_supported = false; bool handshaker_resume = false; std::string handshaker_path; diff --git a/third_party/boringssl/src/ssl/test/test_state.cc b/third_party/boringssl/src/ssl/test/test_state.cc index 86deb5553c47..7c22a620b539 100644 --- a/third_party/boringssl/src/ssl/test/test_state.cc +++ b/third_party/boringssl/src/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) { diff --git a/third_party/boringssl/src/ssl/tls13_both.cc b/third_party/boringssl/src/ssl/tls13_both.cc index d7997c7e0b3a..5ab5a1c93439 100644 --- a/third_party/boringssl/src/ssl/tls13_both.cc +++ b/third_party/boringssl/src/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; } @@ -520,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; diff --git a/third_party/boringssl/src/ssl/tls13_client.cc b/third_party/boringssl/src/ssl/tls13_client.cc index bd0f820e8c1e..92e26f22a8c6 100644 --- a/third_party/boringssl/src/ssl/tls13_client.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/ssl/tls13_enc.cc b/third_party/boringssl/src/ssl/tls13_enc.cc index ad023ef8ebee..3de10f480206 100644 --- a/third_party/boringssl/src/ssl/tls13_enc.cc +++ b/third_party/boringssl/src/ssl/tls13_enc.cc @@ -27,6 +27,7 @@ #include #include +#include "../crypto/fipsmodule/tls/internal.h" #include "../crypto/internal.h" #include "internal.h" @@ -95,27 +96,10 @@ static bool hkdf_expand_label(Span out, const EVP_MD *digest, Span secret, Span label, Span hash) { - Span protocol_label = label_to_span("tls13 "); - ScopedCBB cbb; - CBB child; - Array hkdf_label; - if (!CBB_init(cbb.get(), 2 + 1 + protocol_label.size() + label.size() + 1 + - hash.size()) || - !CBB_add_u16(cbb.get(), out.size()) || - !CBB_add_u8_length_prefixed(cbb.get(), &child) || - !CBB_add_bytes(&child, - reinterpret_cast(protocol_label.data()), - protocol_label.size()) || - !CBB_add_bytes(&child, reinterpret_cast(label.data()), - label.size()) || - !CBB_add_u8_length_prefixed(cbb.get(), &child) || - !CBB_add_bytes(&child, hash.data(), hash.size()) || - !CBBFinishArray(cbb.get(), &hkdf_label)) { - return false; - } - - return HKDF_expand(out.data(), out.size(), digest, secret.data(), - secret.size(), hkdf_label.data(), hkdf_label.size()); + return CRYPTO_tls13_hkdf_expand_label( + out.data(), out.size(), digest, secret.data(), secret.size(), + reinterpret_cast(label.data()), label.size(), + hash.data(), hash.size()) == 1; } static const char kTLS13LabelDerived[] = "derived"; diff --git a/third_party/boringssl/src/ssl/tls13_server.cc b/third_party/boringssl/src/ssl/tls13_server.cc index ca436242ae53..c97e3f5502f5 100644 --- a/third_party/boringssl/src/ssl/tls13_server.cc +++ b/third_party/boringssl/src/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; @@ -116,8 +116,11 @@ static const SSL_CIPHER *choose_tls13_cipher( const uint16_t version = ssl_protocol_version(ssl); - return ssl_choose_tls13_cipher(cipher_suites, version, group_id, - ssl->config->only_fips_cipher_suites_in_tls13); + return ssl_choose_tls13_cipher( + cipher_suites, + ssl->config->aes_hw_override ? ssl->config->aes_hw_override_value + : EVP_has_aes_hardware(), + version, group_id, ssl->config->only_fips_cipher_suites_in_tls13); } static bool add_new_session_tickets(SSL_HANDSHAKE *hs, bool *out_sent_tickets) { @@ -790,7 +793,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; diff --git a/third_party/boringssl/src/third_party/fiat/curve25519_64_msvc.h b/third_party/boringssl/src/third_party/fiat/curve25519_64_msvc.h new file mode 100644 index 000000000000..d20ec8538aaf --- /dev/null +++ b/third_party/boringssl/src/third_party/fiat/curve25519_64_msvc.h @@ -0,0 +1,1281 @@ +/* Autogenerated: 'src/ExtractionOCaml/unsaturated_solinas' --inline --static --use-value-barrier --no-wide-int 25519 64 '(auto)' '2^255 - 19' carry_mul carry_square carry add sub opp selectznz to_bytes from_bytes relax carry_scmul121666 */ +/* curve description: 25519 */ +/* machine_wordsize = 64 (from "64") */ +/* requested operations: carry_mul, carry_square, carry, add, sub, opp, selectznz, to_bytes, from_bytes, relax, carry_scmul121666 */ +/* n = 5 (from "(auto)") */ +/* s-c = 2^255 - [(1, 19)] (from "2^255 - 19") */ +/* tight_bounds_multiplier = 1 (from "") */ +/* */ +/* Computed values: */ +/* carry_chain = [0, 1, 2, 3, 4, 0, 1] */ +/* eval z = z[0] + (z[1] << 51) + (z[2] << 102) + (z[3] << 153) + (z[4] << 204) */ +/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */ +/* balance = [0xfffffffffffda, 0xffffffffffffe, 0xffffffffffffe, 0xffffffffffffe, 0xffffffffffffe] */ + +#include +#include +#if defined(_M_X64) +#include +#endif + +typedef unsigned char fiat_25519_uint1; +typedef signed char fiat_25519_int1; + +#define FIAT_25519_FIAT_INLINE inline + +/* The type fiat_25519_loose_field_element is a field element with loose bounds. */ +/* Bounds: [[0x0 ~> 0x18000000000000], [0x0 ~> 0x18000000000000], [0x0 ~> 0x18000000000000], [0x0 ~> 0x18000000000000], [0x0 ~> 0x18000000000000]] */ +typedef uint64_t fiat_25519_loose_field_element[5]; + +/* The type fiat_25519_tight_field_element is a field element with tight bounds. */ +/* Bounds: [[0x0 ~> 0x8000000000000], [0x0 ~> 0x8000000000000], [0x0 ~> 0x8000000000000], [0x0 ~> 0x8000000000000], [0x0 ~> 0x8000000000000]] */ +typedef uint64_t fiat_25519_tight_field_element[5]; + +#if (-1 & 3) != 3 +#error "This code only works on a two's complement system" +#endif + +#define fiat_25519_value_barrier_u64(x) (x) + +/* + * The function fiat_25519_addcarryx_u64 is an addition with carry. + * + * Postconditions: + * out1 = (arg1 + arg2 + arg3) mod 2^64 + * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [0x0 ~> 0xffffffffffffffff] + * arg3: [0x0 ~> 0xffffffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + * out2: [0x0 ~> 0x1] + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_addcarryx_u64(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { +// NOTE: edited after generation +#if defined(_M_X64) + *out2 = _addcarry_u64(arg1, arg2, arg3, out1); +#else + arg2 += arg1; + arg1 = arg2 < arg1; + arg3 += arg2; + arg1 += arg3 < arg2; + *out1 = arg3; + *out2 = arg1; +#endif +} + +/* + * The function fiat_25519_subborrowx_u64 is a subtraction with borrow. + * + * Postconditions: + * out1 = (-arg1 + arg2 + -arg3) mod 2^64 + * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [0x0 ~> 0xffffffffffffffff] + * arg3: [0x0 ~> 0xffffffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + * out2: [0x0 ~> 0x1] + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_subborrowx_u64(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { +#if defined(_M_X64) + *out2 = _subborrow_u64(arg1, arg2, arg3, out1); // NOTE: edited after generation +#else + *out1 = arg2 - arg3 - arg1; + *out2 = (arg2 < arg3) | ((arg2 == arg3) & arg1); +#endif +} + +/* + * The function fiat_25519_addcarryx_u51 is an addition with carry. + * + * Postconditions: + * out1 = (arg1 + arg2 + arg3) mod 2^51 + * out2 = ⌊(arg1 + arg2 + arg3) / 2^51⌋ + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [0x0 ~> 0x7ffffffffffff] + * arg3: [0x0 ~> 0x7ffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0x7ffffffffffff] + * out2: [0x0 ~> 0x1] + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_addcarryx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { + uint64_t x1; + uint64_t x2; + fiat_25519_uint1 x3; + x1 = ((arg1 + arg2) + arg3); + x2 = (x1 & UINT64_C(0x7ffffffffffff)); + x3 = (fiat_25519_uint1)(x1 >> 51); + *out1 = x2; + *out2 = x3; +} + +/* + * The function fiat_25519_subborrowx_u51 is a subtraction with borrow. + * + * Postconditions: + * out1 = (-arg1 + arg2 + -arg3) mod 2^51 + * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^51⌋ + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [0x0 ~> 0x7ffffffffffff] + * arg3: [0x0 ~> 0x7ffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0x7ffffffffffff] + * out2: [0x0 ~> 0x1] + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_subborrowx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { + int64_t x1; + fiat_25519_int1 x2; + uint64_t x3; + x1 = ((int64_t)(arg2 - (int64_t)arg1) - (int64_t)arg3); + x2 = (fiat_25519_int1)(x1 >> 51); + x3 = (x1 & UINT64_C(0x7ffffffffffff)); + *out1 = x3; + *out2 = (fiat_25519_uint1)(0x0 - x2); +} + +/* + * The function fiat_25519_mulx_u64 is a multiplication, returning the full double-width result. + * + * Postconditions: + * out1 = (arg1 * arg2) mod 2^64 + * out2 = ⌊arg1 * arg2 / 2^64⌋ + * + * Input Bounds: + * arg1: [0x0 ~> 0xffffffffffffffff] + * arg2: [0x0 ~> 0xffffffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + * out2: [0x0 ~> 0xffffffffffffffff] + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { +// NOTE: edited after generation +#if defined(_M_X64) + *out1 = _umul128(arg1, arg2, out2); +#elif defined(_M_ARM64) + *out1 = arg1 * arg2; + *out2 = __umulh(arg1, arg2); +#else +#error "This file is intended for MSVC on X64 or ARM64" +#endif +} + +/* + * The function fiat_25519_cmovznz_u64 is a single-word conditional move. + * + * Postconditions: + * out1 = (if arg1 = 0 then arg2 else arg3) + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [0x0 ~> 0xffffffffffffffff] + * arg3: [0x0 ~> 0xffffffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_cmovznz_u64(uint64_t* out1, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { + fiat_25519_uint1 x1; + uint64_t x2; + uint64_t x3; + x1 = (!(!arg1)); + x2 = ((fiat_25519_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); + x3 = ((fiat_25519_value_barrier_u64(x2) & arg3) | (fiat_25519_value_barrier_u64((~x2)) & arg2)); + *out1 = x3; +} + +/* + * The function fiat_25519_carry_mul multiplies two field elements and reduces the result. + * + * Postconditions: + * eval out1 mod m = (eval arg1 * eval arg2) mod m + * + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_carry_mul(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1, const fiat_25519_loose_field_element arg2) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + uint64_t x13; + uint64_t x14; + uint64_t x15; + uint64_t x16; + uint64_t x17; + uint64_t x18; + uint64_t x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + uint64_t x23; + uint64_t x24; + uint64_t x25; + uint64_t x26; + uint64_t x27; + uint64_t x28; + uint64_t x29; + uint64_t x30; + uint64_t x31; + uint64_t x32; + uint64_t x33; + uint64_t x34; + uint64_t x35; + uint64_t x36; + uint64_t x37; + uint64_t x38; + uint64_t x39; + uint64_t x40; + uint64_t x41; + uint64_t x42; + uint64_t x43; + uint64_t x44; + uint64_t x45; + uint64_t x46; + uint64_t x47; + uint64_t x48; + uint64_t x49; + uint64_t x50; + uint64_t x51; + fiat_25519_uint1 x52; + uint64_t x53; + fiat_25519_uint1 x54; + uint64_t x55; + fiat_25519_uint1 x56; + uint64_t x57; + fiat_25519_uint1 x58; + uint64_t x59; + fiat_25519_uint1 x60; + uint64_t x61; + fiat_25519_uint1 x62; + uint64_t x63; + fiat_25519_uint1 x64; + uint64_t x65; + fiat_25519_uint1 x66; + uint64_t x67; + uint64_t x68; + uint64_t x69; + fiat_25519_uint1 x70; + uint64_t x71; + fiat_25519_uint1 x72; + uint64_t x73; + fiat_25519_uint1 x74; + uint64_t x75; + fiat_25519_uint1 x76; + uint64_t x77; + fiat_25519_uint1 x78; + uint64_t x79; + fiat_25519_uint1 x80; + uint64_t x81; + fiat_25519_uint1 x82; + uint64_t x83; + fiat_25519_uint1 x84; + uint64_t x85; + fiat_25519_uint1 x86; + uint64_t x87; + fiat_25519_uint1 x88; + uint64_t x89; + fiat_25519_uint1 x90; + uint64_t x91; + fiat_25519_uint1 x92; + uint64_t x93; + fiat_25519_uint1 x94; + uint64_t x95; + fiat_25519_uint1 x96; + uint64_t x97; + fiat_25519_uint1 x98; + uint64_t x99; + fiat_25519_uint1 x100; + uint64_t x101; + fiat_25519_uint1 x102; + uint64_t x103; + fiat_25519_uint1 x104; + uint64_t x105; + fiat_25519_uint1 x106; + uint64_t x107; + fiat_25519_uint1 x108; + uint64_t x109; + fiat_25519_uint1 x110; + uint64_t x111; + fiat_25519_uint1 x112; + uint64_t x113; + fiat_25519_uint1 x114; + uint64_t x115; + fiat_25519_uint1 x116; + uint64_t x117; + fiat_25519_uint1 x118; + uint64_t x119; + fiat_25519_uint1 x120; + uint64_t x121; + fiat_25519_uint1 x122; + uint64_t x123; + fiat_25519_uint1 x124; + uint64_t x125; + fiat_25519_uint1 x126; + uint64_t x127; + fiat_25519_uint1 x128; + uint64_t x129; + fiat_25519_uint1 x130; + uint64_t x131; + fiat_25519_uint1 x132; + uint64_t x133; + fiat_25519_uint1 x134; + uint64_t x135; + uint64_t x136; + uint64_t x137; + uint64_t x138; + fiat_25519_uint1 x139; + uint64_t x140; + uint64_t x141; + uint64_t x142; + uint64_t x143; + fiat_25519_uint1 x144; + uint64_t x145; + uint64_t x146; + uint64_t x147; + uint64_t x148; + fiat_25519_uint1 x149; + uint64_t x150; + uint64_t x151; + uint64_t x152; + uint64_t x153; + uint64_t x154; + uint64_t x155; + uint64_t x156; + uint64_t x157; + fiat_25519_uint1 x158; + uint64_t x159; + uint64_t x160; + fiat_25519_mulx_u64(&x1, &x2, (arg1[4]), ((arg2[4]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x3, &x4, (arg1[4]), ((arg2[3]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x5, &x6, (arg1[4]), ((arg2[2]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x7, &x8, (arg1[4]), ((arg2[1]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x9, &x10, (arg1[3]), ((arg2[4]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x11, &x12, (arg1[3]), ((arg2[3]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x13, &x14, (arg1[3]), ((arg2[2]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x15, &x16, (arg1[2]), ((arg2[4]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x17, &x18, (arg1[2]), ((arg2[3]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x19, &x20, (arg1[1]), ((arg2[4]) * UINT8_C(0x13))); + fiat_25519_mulx_u64(&x21, &x22, (arg1[4]), (arg2[0])); + fiat_25519_mulx_u64(&x23, &x24, (arg1[3]), (arg2[1])); + fiat_25519_mulx_u64(&x25, &x26, (arg1[3]), (arg2[0])); + fiat_25519_mulx_u64(&x27, &x28, (arg1[2]), (arg2[2])); + fiat_25519_mulx_u64(&x29, &x30, (arg1[2]), (arg2[1])); + fiat_25519_mulx_u64(&x31, &x32, (arg1[2]), (arg2[0])); + fiat_25519_mulx_u64(&x33, &x34, (arg1[1]), (arg2[3])); + fiat_25519_mulx_u64(&x35, &x36, (arg1[1]), (arg2[2])); + fiat_25519_mulx_u64(&x37, &x38, (arg1[1]), (arg2[1])); + fiat_25519_mulx_u64(&x39, &x40, (arg1[1]), (arg2[0])); + fiat_25519_mulx_u64(&x41, &x42, (arg1[0]), (arg2[4])); + fiat_25519_mulx_u64(&x43, &x44, (arg1[0]), (arg2[3])); + fiat_25519_mulx_u64(&x45, &x46, (arg1[0]), (arg2[2])); + fiat_25519_mulx_u64(&x47, &x48, (arg1[0]), (arg2[1])); + fiat_25519_mulx_u64(&x49, &x50, (arg1[0]), (arg2[0])); + fiat_25519_addcarryx_u64(&x51, &x52, 0x0, x13, x7); + fiat_25519_addcarryx_u64(&x53, &x54, x52, x14, x8); + fiat_25519_addcarryx_u64(&x55, &x56, 0x0, x17, x51); + fiat_25519_addcarryx_u64(&x57, &x58, x56, x18, x53); + fiat_25519_addcarryx_u64(&x59, &x60, 0x0, x19, x55); + fiat_25519_addcarryx_u64(&x61, &x62, x60, x20, x57); + fiat_25519_addcarryx_u64(&x63, &x64, 0x0, x49, x59); + fiat_25519_addcarryx_u64(&x65, &x66, x64, x50, x61); + x67 = ((x63 >> 51) | ((x65 << 13) & UINT64_C(0xffffffffffffffff))); + x68 = (x63 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x69, &x70, 0x0, x23, x21); + fiat_25519_addcarryx_u64(&x71, &x72, x70, x24, x22); + fiat_25519_addcarryx_u64(&x73, &x74, 0x0, x27, x69); + fiat_25519_addcarryx_u64(&x75, &x76, x74, x28, x71); + fiat_25519_addcarryx_u64(&x77, &x78, 0x0, x33, x73); + fiat_25519_addcarryx_u64(&x79, &x80, x78, x34, x75); + fiat_25519_addcarryx_u64(&x81, &x82, 0x0, x41, x77); + fiat_25519_addcarryx_u64(&x83, &x84, x82, x42, x79); + fiat_25519_addcarryx_u64(&x85, &x86, 0x0, x25, x1); + fiat_25519_addcarryx_u64(&x87, &x88, x86, x26, x2); + fiat_25519_addcarryx_u64(&x89, &x90, 0x0, x29, x85); + fiat_25519_addcarryx_u64(&x91, &x92, x90, x30, x87); + fiat_25519_addcarryx_u64(&x93, &x94, 0x0, x35, x89); + fiat_25519_addcarryx_u64(&x95, &x96, x94, x36, x91); + fiat_25519_addcarryx_u64(&x97, &x98, 0x0, x43, x93); + fiat_25519_addcarryx_u64(&x99, &x100, x98, x44, x95); + fiat_25519_addcarryx_u64(&x101, &x102, 0x0, x9, x3); + fiat_25519_addcarryx_u64(&x103, &x104, x102, x10, x4); + fiat_25519_addcarryx_u64(&x105, &x106, 0x0, x31, x101); + fiat_25519_addcarryx_u64(&x107, &x108, x106, x32, x103); + fiat_25519_addcarryx_u64(&x109, &x110, 0x0, x37, x105); + fiat_25519_addcarryx_u64(&x111, &x112, x110, x38, x107); + fiat_25519_addcarryx_u64(&x113, &x114, 0x0, x45, x109); + fiat_25519_addcarryx_u64(&x115, &x116, x114, x46, x111); + fiat_25519_addcarryx_u64(&x117, &x118, 0x0, x11, x5); + fiat_25519_addcarryx_u64(&x119, &x120, x118, x12, x6); + fiat_25519_addcarryx_u64(&x121, &x122, 0x0, x15, x117); + fiat_25519_addcarryx_u64(&x123, &x124, x122, x16, x119); + fiat_25519_addcarryx_u64(&x125, &x126, 0x0, x39, x121); + fiat_25519_addcarryx_u64(&x127, &x128, x126, x40, x123); + fiat_25519_addcarryx_u64(&x129, &x130, 0x0, x47, x125); + fiat_25519_addcarryx_u64(&x131, &x132, x130, x48, x127); + fiat_25519_addcarryx_u64(&x133, &x134, 0x0, x67, x129); + x135 = (x134 + x131); + x136 = ((x133 >> 51) | ((x135 << 13) & UINT64_C(0xffffffffffffffff))); + x137 = (x133 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x138, &x139, 0x0, x136, x113); + x140 = (x139 + x115); + x141 = ((x138 >> 51) | ((x140 << 13) & UINT64_C(0xffffffffffffffff))); + x142 = (x138 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x143, &x144, 0x0, x141, x97); + x145 = (x144 + x99); + x146 = ((x143 >> 51) | ((x145 << 13) & UINT64_C(0xffffffffffffffff))); + x147 = (x143 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x148, &x149, 0x0, x146, x81); + x150 = (x149 + x83); + x151 = ((x148 >> 51) | ((x150 << 13) & UINT64_C(0xffffffffffffffff))); + x152 = (x148 & UINT64_C(0x7ffffffffffff)); + x153 = (x151 * UINT8_C(0x13)); + x154 = (x68 + x153); + x155 = (x154 >> 51); + x156 = (x154 & UINT64_C(0x7ffffffffffff)); + x157 = (x155 + x137); + x158 = (fiat_25519_uint1)(x157 >> 51); + x159 = (x157 & UINT64_C(0x7ffffffffffff)); + x160 = (x158 + x142); + out1[0] = x156; + out1[1] = x159; + out1[2] = x160; + out1[3] = x147; + out1[4] = x152; +} + +/* + * The function fiat_25519_carry_square squares a field element and reduces the result. + * + * Postconditions: + * eval out1 mod m = (eval arg1 * eval arg1) mod m + * + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_carry_square(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + uint64_t x13; + uint64_t x14; + uint64_t x15; + uint64_t x16; + uint64_t x17; + uint64_t x18; + uint64_t x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + uint64_t x23; + uint64_t x24; + uint64_t x25; + uint64_t x26; + uint64_t x27; + uint64_t x28; + uint64_t x29; + uint64_t x30; + uint64_t x31; + uint64_t x32; + uint64_t x33; + uint64_t x34; + uint64_t x35; + uint64_t x36; + uint64_t x37; + uint64_t x38; + uint64_t x39; + fiat_25519_uint1 x40; + uint64_t x41; + fiat_25519_uint1 x42; + uint64_t x43; + fiat_25519_uint1 x44; + uint64_t x45; + fiat_25519_uint1 x46; + uint64_t x47; + uint64_t x48; + uint64_t x49; + fiat_25519_uint1 x50; + uint64_t x51; + fiat_25519_uint1 x52; + uint64_t x53; + fiat_25519_uint1 x54; + uint64_t x55; + fiat_25519_uint1 x56; + uint64_t x57; + fiat_25519_uint1 x58; + uint64_t x59; + fiat_25519_uint1 x60; + uint64_t x61; + fiat_25519_uint1 x62; + uint64_t x63; + fiat_25519_uint1 x64; + uint64_t x65; + fiat_25519_uint1 x66; + uint64_t x67; + fiat_25519_uint1 x68; + uint64_t x69; + fiat_25519_uint1 x70; + uint64_t x71; + fiat_25519_uint1 x72; + uint64_t x73; + fiat_25519_uint1 x74; + uint64_t x75; + fiat_25519_uint1 x76; + uint64_t x77; + fiat_25519_uint1 x78; + uint64_t x79; + fiat_25519_uint1 x80; + uint64_t x81; + fiat_25519_uint1 x82; + uint64_t x83; + uint64_t x84; + uint64_t x85; + uint64_t x86; + fiat_25519_uint1 x87; + uint64_t x88; + uint64_t x89; + uint64_t x90; + uint64_t x91; + fiat_25519_uint1 x92; + uint64_t x93; + uint64_t x94; + uint64_t x95; + uint64_t x96; + fiat_25519_uint1 x97; + uint64_t x98; + uint64_t x99; + uint64_t x100; + uint64_t x101; + uint64_t x102; + uint64_t x103; + uint64_t x104; + uint64_t x105; + fiat_25519_uint1 x106; + uint64_t x107; + uint64_t x108; + x1 = ((arg1[4]) * UINT8_C(0x13)); + x2 = (x1 * 0x2); + x3 = ((arg1[4]) * 0x2); + x4 = ((arg1[3]) * UINT8_C(0x13)); + x5 = (x4 * 0x2); + x6 = ((arg1[3]) * 0x2); + x7 = ((arg1[2]) * 0x2); + x8 = ((arg1[1]) * 0x2); + fiat_25519_mulx_u64(&x9, &x10, (arg1[4]), x1); + fiat_25519_mulx_u64(&x11, &x12, (arg1[3]), x2); + fiat_25519_mulx_u64(&x13, &x14, (arg1[3]), x4); + fiat_25519_mulx_u64(&x15, &x16, (arg1[2]), x2); + fiat_25519_mulx_u64(&x17, &x18, (arg1[2]), x5); + fiat_25519_mulx_u64(&x19, &x20, (arg1[2]), (arg1[2])); + fiat_25519_mulx_u64(&x21, &x22, (arg1[1]), x2); + fiat_25519_mulx_u64(&x23, &x24, (arg1[1]), x6); + fiat_25519_mulx_u64(&x25, &x26, (arg1[1]), x7); + fiat_25519_mulx_u64(&x27, &x28, (arg1[1]), (arg1[1])); + fiat_25519_mulx_u64(&x29, &x30, (arg1[0]), x3); + fiat_25519_mulx_u64(&x31, &x32, (arg1[0]), x6); + fiat_25519_mulx_u64(&x33, &x34, (arg1[0]), x7); + fiat_25519_mulx_u64(&x35, &x36, (arg1[0]), x8); + fiat_25519_mulx_u64(&x37, &x38, (arg1[0]), (arg1[0])); + fiat_25519_addcarryx_u64(&x39, &x40, 0x0, x21, x17); + fiat_25519_addcarryx_u64(&x41, &x42, x40, x22, x18); + fiat_25519_addcarryx_u64(&x43, &x44, 0x0, x37, x39); + fiat_25519_addcarryx_u64(&x45, &x46, x44, x38, x41); + x47 = ((x43 >> 51) | ((x45 << 13) & UINT64_C(0xffffffffffffffff))); + x48 = (x43 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x49, &x50, 0x0, x23, x19); + fiat_25519_addcarryx_u64(&x51, &x52, x50, x24, x20); + fiat_25519_addcarryx_u64(&x53, &x54, 0x0, x29, x49); + fiat_25519_addcarryx_u64(&x55, &x56, x54, x30, x51); + fiat_25519_addcarryx_u64(&x57, &x58, 0x0, x25, x9); + fiat_25519_addcarryx_u64(&x59, &x60, x58, x26, x10); + fiat_25519_addcarryx_u64(&x61, &x62, 0x0, x31, x57); + fiat_25519_addcarryx_u64(&x63, &x64, x62, x32, x59); + fiat_25519_addcarryx_u64(&x65, &x66, 0x0, x27, x11); + fiat_25519_addcarryx_u64(&x67, &x68, x66, x28, x12); + fiat_25519_addcarryx_u64(&x69, &x70, 0x0, x33, x65); + fiat_25519_addcarryx_u64(&x71, &x72, x70, x34, x67); + fiat_25519_addcarryx_u64(&x73, &x74, 0x0, x15, x13); + fiat_25519_addcarryx_u64(&x75, &x76, x74, x16, x14); + fiat_25519_addcarryx_u64(&x77, &x78, 0x0, x35, x73); + fiat_25519_addcarryx_u64(&x79, &x80, x78, x36, x75); + fiat_25519_addcarryx_u64(&x81, &x82, 0x0, x47, x77); + x83 = (x82 + x79); + x84 = ((x81 >> 51) | ((x83 << 13) & UINT64_C(0xffffffffffffffff))); + x85 = (x81 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x86, &x87, 0x0, x84, x69); + x88 = (x87 + x71); + x89 = ((x86 >> 51) | ((x88 << 13) & UINT64_C(0xffffffffffffffff))); + x90 = (x86 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x91, &x92, 0x0, x89, x61); + x93 = (x92 + x63); + x94 = ((x91 >> 51) | ((x93 << 13) & UINT64_C(0xffffffffffffffff))); + x95 = (x91 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x96, &x97, 0x0, x94, x53); + x98 = (x97 + x55); + x99 = ((x96 >> 51) | ((x98 << 13) & UINT64_C(0xffffffffffffffff))); + x100 = (x96 & UINT64_C(0x7ffffffffffff)); + x101 = (x99 * UINT8_C(0x13)); + x102 = (x48 + x101); + x103 = (x102 >> 51); + x104 = (x102 & UINT64_C(0x7ffffffffffff)); + x105 = (x103 + x85); + x106 = (fiat_25519_uint1)(x105 >> 51); + x107 = (x105 & UINT64_C(0x7ffffffffffff)); + x108 = (x106 + x90); + out1[0] = x104; + out1[1] = x107; + out1[2] = x108; + out1[3] = x95; + out1[4] = x100; +} + +/* + * The function fiat_25519_carry reduces a field element. + * + * Postconditions: + * eval out1 mod m = eval arg1 mod m + * + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_carry(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + x1 = (arg1[0]); + x2 = ((x1 >> 51) + (arg1[1])); + x3 = ((x2 >> 51) + (arg1[2])); + x4 = ((x3 >> 51) + (arg1[3])); + x5 = ((x4 >> 51) + (arg1[4])); + x6 = ((x1 & UINT64_C(0x7ffffffffffff)) + ((x5 >> 51) * UINT8_C(0x13))); + x7 = ((fiat_25519_uint1)(x6 >> 51) + (x2 & UINT64_C(0x7ffffffffffff))); + x8 = (x6 & UINT64_C(0x7ffffffffffff)); + x9 = (x7 & UINT64_C(0x7ffffffffffff)); + x10 = ((fiat_25519_uint1)(x7 >> 51) + (x3 & UINT64_C(0x7ffffffffffff))); + x11 = (x4 & UINT64_C(0x7ffffffffffff)); + x12 = (x5 & UINT64_C(0x7ffffffffffff)); + out1[0] = x8; + out1[1] = x9; + out1[2] = x10; + out1[3] = x11; + out1[4] = x12; +} + +/* + * The function fiat_25519_add adds two field elements. + * + * Postconditions: + * eval out1 mod m = (eval arg1 + eval arg2) mod m + * + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_add(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1, const fiat_25519_tight_field_element arg2) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + x1 = ((arg1[0]) + (arg2[0])); + x2 = ((arg1[1]) + (arg2[1])); + x3 = ((arg1[2]) + (arg2[2])); + x4 = ((arg1[3]) + (arg2[3])); + x5 = ((arg1[4]) + (arg2[4])); + out1[0] = x1; + out1[1] = x2; + out1[2] = x3; + out1[3] = x4; + out1[4] = x5; +} + +/* + * The function fiat_25519_sub subtracts two field elements. + * + * Postconditions: + * eval out1 mod m = (eval arg1 - eval arg2) mod m + * + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_sub(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1, const fiat_25519_tight_field_element arg2) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + x1 = ((UINT64_C(0xfffffffffffda) + (arg1[0])) - (arg2[0])); + x2 = ((UINT64_C(0xffffffffffffe) + (arg1[1])) - (arg2[1])); + x3 = ((UINT64_C(0xffffffffffffe) + (arg1[2])) - (arg2[2])); + x4 = ((UINT64_C(0xffffffffffffe) + (arg1[3])) - (arg2[3])); + x5 = ((UINT64_C(0xffffffffffffe) + (arg1[4])) - (arg2[4])); + out1[0] = x1; + out1[1] = x2; + out1[2] = x3; + out1[3] = x4; + out1[4] = x5; +} + +/* + * The function fiat_25519_opp negates a field element. + * + * Postconditions: + * eval out1 mod m = -eval arg1 mod m + * + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_opp(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + x1 = (UINT64_C(0xfffffffffffda) - (arg1[0])); + x2 = (UINT64_C(0xffffffffffffe) - (arg1[1])); + x3 = (UINT64_C(0xffffffffffffe) - (arg1[2])); + x4 = (UINT64_C(0xffffffffffffe) - (arg1[3])); + x5 = (UINT64_C(0xffffffffffffe) - (arg1[4])); + out1[0] = x1; + out1[1] = x2; + out1[2] = x3; + out1[3] = x4; + out1[4] = x5; +} + +/* + * The function fiat_25519_selectznz is a multi-limb conditional select. + * + * Postconditions: + * out1 = (if arg1 = 0 then arg2 else arg3) + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * Output Bounds: + * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_selectznz(uint64_t out1[5], fiat_25519_uint1 arg1, const uint64_t arg2[5], const uint64_t arg3[5]) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + fiat_25519_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); + fiat_25519_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); + fiat_25519_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); + fiat_25519_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); + fiat_25519_cmovznz_u64(&x5, arg1, (arg2[4]), (arg3[4])); + out1[0] = x1; + out1[1] = x2; + out1[2] = x3; + out1[3] = x4; + out1[4] = x5; +} + +/* + * The function fiat_25519_to_bytes serializes a field element to bytes in little-endian order. + * + * Postconditions: + * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31] + * + * Output Bounds: + * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_to_bytes(uint8_t out1[32], const fiat_25519_tight_field_element arg1) { + uint64_t x1; + fiat_25519_uint1 x2; + uint64_t x3; + fiat_25519_uint1 x4; + uint64_t x5; + fiat_25519_uint1 x6; + uint64_t x7; + fiat_25519_uint1 x8; + uint64_t x9; + fiat_25519_uint1 x10; + uint64_t x11; + uint64_t x12; + fiat_25519_uint1 x13; + uint64_t x14; + fiat_25519_uint1 x15; + uint64_t x16; + fiat_25519_uint1 x17; + uint64_t x18; + fiat_25519_uint1 x19; + uint64_t x20; + fiat_25519_uint1 x21; + uint64_t x22; + uint64_t x23; + uint64_t x24; + uint64_t x25; + uint8_t x26; + uint64_t x27; + uint8_t x28; + uint64_t x29; + uint8_t x30; + uint64_t x31; + uint8_t x32; + uint64_t x33; + uint8_t x34; + uint64_t x35; + uint8_t x36; + uint8_t x37; + uint64_t x38; + uint8_t x39; + uint64_t x40; + uint8_t x41; + uint64_t x42; + uint8_t x43; + uint64_t x44; + uint8_t x45; + uint64_t x46; + uint8_t x47; + uint64_t x48; + uint8_t x49; + uint8_t x50; + uint64_t x51; + uint8_t x52; + uint64_t x53; + uint8_t x54; + uint64_t x55; + uint8_t x56; + uint64_t x57; + uint8_t x58; + uint64_t x59; + uint8_t x60; + uint64_t x61; + uint8_t x62; + uint64_t x63; + uint8_t x64; + fiat_25519_uint1 x65; + uint64_t x66; + uint8_t x67; + uint64_t x68; + uint8_t x69; + uint64_t x70; + uint8_t x71; + uint64_t x72; + uint8_t x73; + uint64_t x74; + uint8_t x75; + uint64_t x76; + uint8_t x77; + uint8_t x78; + uint64_t x79; + uint8_t x80; + uint64_t x81; + uint8_t x82; + uint64_t x83; + uint8_t x84; + uint64_t x85; + uint8_t x86; + uint64_t x87; + uint8_t x88; + uint64_t x89; + uint8_t x90; + uint8_t x91; + fiat_25519_subborrowx_u51(&x1, &x2, 0x0, (arg1[0]), UINT64_C(0x7ffffffffffed)); + fiat_25519_subborrowx_u51(&x3, &x4, x2, (arg1[1]), UINT64_C(0x7ffffffffffff)); + fiat_25519_subborrowx_u51(&x5, &x6, x4, (arg1[2]), UINT64_C(0x7ffffffffffff)); + fiat_25519_subborrowx_u51(&x7, &x8, x6, (arg1[3]), UINT64_C(0x7ffffffffffff)); + fiat_25519_subborrowx_u51(&x9, &x10, x8, (arg1[4]), UINT64_C(0x7ffffffffffff)); + fiat_25519_cmovznz_u64(&x11, x10, 0x0, UINT64_C(0xffffffffffffffff)); + fiat_25519_addcarryx_u51(&x12, &x13, 0x0, x1, (x11 & UINT64_C(0x7ffffffffffed))); + fiat_25519_addcarryx_u51(&x14, &x15, x13, x3, (x11 & UINT64_C(0x7ffffffffffff))); + fiat_25519_addcarryx_u51(&x16, &x17, x15, x5, (x11 & UINT64_C(0x7ffffffffffff))); + fiat_25519_addcarryx_u51(&x18, &x19, x17, x7, (x11 & UINT64_C(0x7ffffffffffff))); + fiat_25519_addcarryx_u51(&x20, &x21, x19, x9, (x11 & UINT64_C(0x7ffffffffffff))); + x22 = (x20 << 4); + x23 = (x18 * (uint64_t)0x2); + x24 = (x16 << 6); + x25 = (x14 << 3); + x26 = (uint8_t)(x12 & UINT8_C(0xff)); + x27 = (x12 >> 8); + x28 = (uint8_t)(x27 & UINT8_C(0xff)); + x29 = (x27 >> 8); + x30 = (uint8_t)(x29 & UINT8_C(0xff)); + x31 = (x29 >> 8); + x32 = (uint8_t)(x31 & UINT8_C(0xff)); + x33 = (x31 >> 8); + x34 = (uint8_t)(x33 & UINT8_C(0xff)); + x35 = (x33 >> 8); + x36 = (uint8_t)(x35 & UINT8_C(0xff)); + x37 = (uint8_t)(x35 >> 8); + x38 = (x25 + (uint64_t)x37); + x39 = (uint8_t)(x38 & UINT8_C(0xff)); + x40 = (x38 >> 8); + x41 = (uint8_t)(x40 & UINT8_C(0xff)); + x42 = (x40 >> 8); + x43 = (uint8_t)(x42 & UINT8_C(0xff)); + x44 = (x42 >> 8); + x45 = (uint8_t)(x44 & UINT8_C(0xff)); + x46 = (x44 >> 8); + x47 = (uint8_t)(x46 & UINT8_C(0xff)); + x48 = (x46 >> 8); + x49 = (uint8_t)(x48 & UINT8_C(0xff)); + x50 = (uint8_t)(x48 >> 8); + x51 = (x24 + (uint64_t)x50); + x52 = (uint8_t)(x51 & UINT8_C(0xff)); + x53 = (x51 >> 8); + x54 = (uint8_t)(x53 & UINT8_C(0xff)); + x55 = (x53 >> 8); + x56 = (uint8_t)(x55 & UINT8_C(0xff)); + x57 = (x55 >> 8); + x58 = (uint8_t)(x57 & UINT8_C(0xff)); + x59 = (x57 >> 8); + x60 = (uint8_t)(x59 & UINT8_C(0xff)); + x61 = (x59 >> 8); + x62 = (uint8_t)(x61 & UINT8_C(0xff)); + x63 = (x61 >> 8); + x64 = (uint8_t)(x63 & UINT8_C(0xff)); + x65 = (fiat_25519_uint1)(x63 >> 8); + x66 = (x23 + (uint64_t)x65); + x67 = (uint8_t)(x66 & UINT8_C(0xff)); + x68 = (x66 >> 8); + x69 = (uint8_t)(x68 & UINT8_C(0xff)); + x70 = (x68 >> 8); + x71 = (uint8_t)(x70 & UINT8_C(0xff)); + x72 = (x70 >> 8); + x73 = (uint8_t)(x72 & UINT8_C(0xff)); + x74 = (x72 >> 8); + x75 = (uint8_t)(x74 & UINT8_C(0xff)); + x76 = (x74 >> 8); + x77 = (uint8_t)(x76 & UINT8_C(0xff)); + x78 = (uint8_t)(x76 >> 8); + x79 = (x22 + (uint64_t)x78); + x80 = (uint8_t)(x79 & UINT8_C(0xff)); + x81 = (x79 >> 8); + x82 = (uint8_t)(x81 & UINT8_C(0xff)); + x83 = (x81 >> 8); + x84 = (uint8_t)(x83 & UINT8_C(0xff)); + x85 = (x83 >> 8); + x86 = (uint8_t)(x85 & UINT8_C(0xff)); + x87 = (x85 >> 8); + x88 = (uint8_t)(x87 & UINT8_C(0xff)); + x89 = (x87 >> 8); + x90 = (uint8_t)(x89 & UINT8_C(0xff)); + x91 = (uint8_t)(x89 >> 8); + out1[0] = x26; + out1[1] = x28; + out1[2] = x30; + out1[3] = x32; + out1[4] = x34; + out1[5] = x36; + out1[6] = x39; + out1[7] = x41; + out1[8] = x43; + out1[9] = x45; + out1[10] = x47; + out1[11] = x49; + out1[12] = x52; + out1[13] = x54; + out1[14] = x56; + out1[15] = x58; + out1[16] = x60; + out1[17] = x62; + out1[18] = x64; + out1[19] = x67; + out1[20] = x69; + out1[21] = x71; + out1[22] = x73; + out1[23] = x75; + out1[24] = x77; + out1[25] = x80; + out1[26] = x82; + out1[27] = x84; + out1[28] = x86; + out1[29] = x88; + out1[30] = x90; + out1[31] = x91; +} + +/* + * The function fiat_25519_from_bytes deserializes a field element from bytes in little-endian order. + * + * Postconditions: + * eval out1 mod m = bytes_eval arg1 mod m + * + * Input Bounds: + * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_from_bytes(fiat_25519_tight_field_element out1, const uint8_t arg1[32]) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + uint64_t x13; + uint64_t x14; + uint64_t x15; + uint64_t x16; + uint64_t x17; + uint64_t x18; + uint64_t x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + uint64_t x23; + uint64_t x24; + uint64_t x25; + uint64_t x26; + uint64_t x27; + uint64_t x28; + uint64_t x29; + uint64_t x30; + uint64_t x31; + uint8_t x32; + uint64_t x33; + uint64_t x34; + uint64_t x35; + uint64_t x36; + uint64_t x37; + uint64_t x38; + uint64_t x39; + uint8_t x40; + uint64_t x41; + uint64_t x42; + uint64_t x43; + uint64_t x44; + uint64_t x45; + uint64_t x46; + uint64_t x47; + uint8_t x48; + uint64_t x49; + uint64_t x50; + uint64_t x51; + uint64_t x52; + uint64_t x53; + uint64_t x54; + uint64_t x55; + uint64_t x56; + uint8_t x57; + uint64_t x58; + uint64_t x59; + uint64_t x60; + uint64_t x61; + uint64_t x62; + uint64_t x63; + uint64_t x64; + uint8_t x65; + uint64_t x66; + uint64_t x67; + uint64_t x68; + uint64_t x69; + uint64_t x70; + uint64_t x71; + x1 = ((uint64_t)(arg1[31]) << 44); + x2 = ((uint64_t)(arg1[30]) << 36); + x3 = ((uint64_t)(arg1[29]) << 28); + x4 = ((uint64_t)(arg1[28]) << 20); + x5 = ((uint64_t)(arg1[27]) << 12); + x6 = ((uint64_t)(arg1[26]) << 4); + x7 = ((uint64_t)(arg1[25]) << 47); + x8 = ((uint64_t)(arg1[24]) << 39); + x9 = ((uint64_t)(arg1[23]) << 31); + x10 = ((uint64_t)(arg1[22]) << 23); + x11 = ((uint64_t)(arg1[21]) << 15); + x12 = ((uint64_t)(arg1[20]) << 7); + x13 = ((uint64_t)(arg1[19]) << 50); + x14 = ((uint64_t)(arg1[18]) << 42); + x15 = ((uint64_t)(arg1[17]) << 34); + x16 = ((uint64_t)(arg1[16]) << 26); + x17 = ((uint64_t)(arg1[15]) << 18); + x18 = ((uint64_t)(arg1[14]) << 10); + x19 = ((uint64_t)(arg1[13]) << 2); + x20 = ((uint64_t)(arg1[12]) << 45); + x21 = ((uint64_t)(arg1[11]) << 37); + x22 = ((uint64_t)(arg1[10]) << 29); + x23 = ((uint64_t)(arg1[9]) << 21); + x24 = ((uint64_t)(arg1[8]) << 13); + x25 = ((uint64_t)(arg1[7]) << 5); + x26 = ((uint64_t)(arg1[6]) << 48); + x27 = ((uint64_t)(arg1[5]) << 40); + x28 = ((uint64_t)(arg1[4]) << 32); + x29 = ((uint64_t)(arg1[3]) << 24); + x30 = ((uint64_t)(arg1[2]) << 16); + x31 = ((uint64_t)(arg1[1]) << 8); + x32 = (arg1[0]); + x33 = (x31 + (uint64_t)x32); + x34 = (x30 + x33); + x35 = (x29 + x34); + x36 = (x28 + x35); + x37 = (x27 + x36); + x38 = (x26 + x37); + x39 = (x38 & UINT64_C(0x7ffffffffffff)); + x40 = (uint8_t)(x38 >> 51); + x41 = (x25 + (uint64_t)x40); + x42 = (x24 + x41); + x43 = (x23 + x42); + x44 = (x22 + x43); + x45 = (x21 + x44); + x46 = (x20 + x45); + x47 = (x46 & UINT64_C(0x7ffffffffffff)); + x48 = (uint8_t)(x46 >> 51); + x49 = (x19 + (uint64_t)x48); + x50 = (x18 + x49); + x51 = (x17 + x50); + x52 = (x16 + x51); + x53 = (x15 + x52); + x54 = (x14 + x53); + x55 = (x13 + x54); + x56 = (x55 & UINT64_C(0x7ffffffffffff)); + x57 = (uint8_t)(x55 >> 51); + x58 = (x12 + (uint64_t)x57); + x59 = (x11 + x58); + x60 = (x10 + x59); + x61 = (x9 + x60); + x62 = (x8 + x61); + x63 = (x7 + x62); + x64 = (x63 & UINT64_C(0x7ffffffffffff)); + x65 = (uint8_t)(x63 >> 51); + x66 = (x6 + (uint64_t)x65); + x67 = (x5 + x66); + x68 = (x4 + x67); + x69 = (x3 + x68); + x70 = (x2 + x69); + x71 = (x1 + x70); + out1[0] = x39; + out1[1] = x47; + out1[2] = x56; + out1[3] = x64; + out1[4] = x71; +} + +/* + * The function fiat_25519_relax is the identity function converting from tight field elements to loose field elements. + * + * Postconditions: + * out1 = arg1 + * + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_relax(fiat_25519_loose_field_element out1, const fiat_25519_tight_field_element arg1) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + x1 = (arg1[0]); + x2 = (arg1[1]); + x3 = (arg1[2]); + x4 = (arg1[3]); + x5 = (arg1[4]); + out1[0] = x1; + out1[1] = x2; + out1[2] = x3; + out1[3] = x4; + out1[4] = x5; +} + +/* + * The function fiat_25519_carry_scmul_121666 multiplies a field element by 121666 and reduces the result. + * + * Postconditions: + * eval out1 mod m = (121666 * eval arg1) mod m + * + */ +static FIAT_25519_FIAT_INLINE void fiat_25519_carry_scmul_121666(fiat_25519_tight_field_element out1, const fiat_25519_loose_field_element arg1) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + uint64_t x13; + fiat_25519_uint1 x14; + uint64_t x15; + uint64_t x16; + uint64_t x17; + uint64_t x18; + fiat_25519_uint1 x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + uint64_t x23; + fiat_25519_uint1 x24; + uint64_t x25; + uint64_t x26; + uint64_t x27; + uint64_t x28; + fiat_25519_uint1 x29; + uint64_t x30; + uint64_t x31; + uint64_t x32; + uint64_t x33; + uint64_t x34; + fiat_25519_uint1 x35; + uint64_t x36; + uint64_t x37; + fiat_25519_uint1 x38; + uint64_t x39; + uint64_t x40; + fiat_25519_mulx_u64(&x1, &x2, UINT32_C(0x1db42), (arg1[4])); + fiat_25519_mulx_u64(&x3, &x4, UINT32_C(0x1db42), (arg1[3])); + fiat_25519_mulx_u64(&x5, &x6, UINT32_C(0x1db42), (arg1[2])); + fiat_25519_mulx_u64(&x7, &x8, UINT32_C(0x1db42), (arg1[1])); + fiat_25519_mulx_u64(&x9, &x10, UINT32_C(0x1db42), (arg1[0])); + x11 = ((x9 >> 51) | ((x10 << 13) & UINT64_C(0xffffffffffffffff))); + x12 = (x9 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x13, &x14, 0x0, x11, x7); + x15 = (x14 + x8); + x16 = ((x13 >> 51) | ((x15 << 13) & UINT64_C(0xffffffffffffffff))); + x17 = (x13 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x18, &x19, 0x0, x16, x5); + x20 = (x19 + x6); + x21 = ((x18 >> 51) | ((x20 << 13) & UINT64_C(0xffffffffffffffff))); + x22 = (x18 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x23, &x24, 0x0, x21, x3); + x25 = (x24 + x4); + x26 = ((x23 >> 51) | ((x25 << 13) & UINT64_C(0xffffffffffffffff))); + x27 = (x23 & UINT64_C(0x7ffffffffffff)); + fiat_25519_addcarryx_u64(&x28, &x29, 0x0, x26, x1); + x30 = (x29 + x2); + x31 = ((x28 >> 51) | ((x30 << 13) & UINT64_C(0xffffffffffffffff))); + x32 = (x28 & UINT64_C(0x7ffffffffffff)); + x33 = (x31 * UINT8_C(0x13)); + x34 = (x12 + x33); + x35 = (fiat_25519_uint1)(x34 >> 51); + x36 = (x34 & UINT64_C(0x7ffffffffffff)); + x37 = (x35 + x17); + x38 = (fiat_25519_uint1)(x37 >> 51); + x39 = (x37 & UINT64_C(0x7ffffffffffff)); + x40 = (x38 + x22); + out1[0] = x36; + out1[1] = x39; + out1[2] = x40; + out1[3] = x27; + out1[4] = x32; +} diff --git a/third_party/boringssl/src/third_party/fiat/p256_64_msvc.h b/third_party/boringssl/src/third_party/fiat/p256_64_msvc.h new file mode 100644 index 000000000000..8b65a37342a3 --- /dev/null +++ b/third_party/boringssl/src/third_party/fiat/p256_64_msvc.h @@ -0,0 +1,2002 @@ +/* Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' --inline --static --use-value-barrier --no-wide-int p256 64 '2^256 - 2^224 + 2^192 + 2^96 - 1' mul square add sub opp from_montgomery to_montgomery nonzero selectznz to_bytes from_bytes one msat divstep divstep_precomp */ +/* curve description: p256 */ +/* machine_wordsize = 64 (from "64") */ +/* requested operations: mul, square, add, sub, opp, from_montgomery, to_montgomery, nonzero, selectznz, to_bytes, from_bytes, one, msat, divstep, divstep_precomp */ +/* m = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff (from "2^256 - 2^224 + 2^192 + 2^96 - 1") */ +/* */ +/* NOTE: In addition to the bounds specified above each function, all */ +/* functions synthesized for this Montgomery arithmetic require the */ +/* input to be strictly less than the prime modulus (m), and also */ +/* require the input to be in the unique saturated representation. */ +/* All functions also ensure that these two properties are true of */ +/* return values. */ +/* */ +/* Computed values: */ +/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) */ +/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */ +/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in */ +/* if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */ + +#include +#include +#if defined(_M_X64) +#include +#endif + +typedef unsigned char fiat_p256_uint1; +typedef signed char fiat_p256_int1; + +#define FIAT_P256_FIAT_INLINE inline + +/* The type fiat_p256_montgomery_domain_field_element is a field element in the Montgomery domain. */ +/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ +typedef uint64_t fiat_p256_montgomery_domain_field_element[4]; + +/* The type fiat_p256_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */ +/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */ +typedef uint64_t fiat_p256_non_montgomery_domain_field_element[4]; + +#if (-1 & 3) != 3 +#error "This code only works on a two's complement system" +#endif + +#define fiat_p256_value_barrier_u64(x) (x) + + +/* + * The function fiat_p256_addcarryx_u64 is an addition with carry. + * + * Postconditions: + * out1 = (arg1 + arg2 + arg3) mod 2^64 + * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋ + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [0x0 ~> 0xffffffffffffffff] + * arg3: [0x0 ~> 0xffffffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + * out2: [0x0 ~> 0x1] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_addcarryx_u64(uint64_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) { +#if defined(_M_X64) + *out2 = _addcarry_u64(arg1, arg2, arg3, out1); +#else + arg2 += arg1; + arg1 = arg2 < arg1; + arg3 += arg2; + arg1 += arg3 < arg2; + *out1 = arg3; + *out2 = arg1; +#endif +} + +/* + * The function fiat_p256_subborrowx_u64 is a subtraction with borrow. + * + * Postconditions: + * out1 = (-arg1 + arg2 + -arg3) mod 2^64 + * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋ + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [0x0 ~> 0xffffffffffffffff] + * arg3: [0x0 ~> 0xffffffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + * out2: [0x0 ~> 0x1] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_subborrowx_u64(uint64_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) { +#if defined(_M_X64) + *out2 = _subborrow_u64(arg1, arg2, arg3, out1); // NOTE: edited after generation +#else + *out1 = arg2 - arg3 - arg1; + *out2 = (arg2 < arg3) | ((arg2 == arg3) & arg1); +#endif +} + +/* + * The function fiat_p256_mulx_u64 is a multiplication, returning the full double-width result. + * + * Postconditions: + * out1 = (arg1 * arg2) mod 2^64 + * out2 = ⌊arg1 * arg2 / 2^64⌋ + * + * Input Bounds: + * arg1: [0x0 ~> 0xffffffffffffffff] + * arg2: [0x0 ~> 0xffffffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + * out2: [0x0 ~> 0xffffffffffffffff] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) { +// NOTE: edited after generation +#if defined(_M_X64) + *out1 = _umul128(arg1, arg2, out2); +#elif defined(_M_ARM64) + *out1 = arg1 * arg2; + *out2 = __umulh(arg1, arg2); +#else +#error "This file is intended for MSVC on X64 or ARM64" +#endif +} + +/* + * The function fiat_p256_cmovznz_u64 is a single-word conditional move. + * + * Postconditions: + * out1 = (if arg1 = 0 then arg2 else arg3) + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [0x0 ~> 0xffffffffffffffff] + * arg3: [0x0 ~> 0xffffffffffffffff] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_cmovznz_u64(uint64_t* out1, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) { + fiat_p256_uint1 x1; + uint64_t x2; + uint64_t x3; + x1 = (!(!arg1)); + x2 = ((fiat_p256_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); + x3 = ((fiat_p256_value_barrier_u64(x2) & arg3) | (fiat_p256_value_barrier_u64((~x2)) & arg2)); + *out1 = x3; +} + +/* + * The function fiat_p256_mul multiplies two field elements in the Montgomery domain. + * + * Preconditions: + * 0 ≤ eval arg1 < m + * 0 ≤ eval arg2 < m + * Postconditions: + * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m + * 0 ≤ eval out1 < m + * + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_mul(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + uint64_t x13; + fiat_p256_uint1 x14; + uint64_t x15; + fiat_p256_uint1 x16; + uint64_t x17; + fiat_p256_uint1 x18; + uint64_t x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + uint64_t x23; + uint64_t x24; + uint64_t x25; + uint64_t x26; + fiat_p256_uint1 x27; + uint64_t x28; + uint64_t x29; + fiat_p256_uint1 x30; + uint64_t x31; + fiat_p256_uint1 x32; + uint64_t x33; + fiat_p256_uint1 x34; + uint64_t x35; + fiat_p256_uint1 x36; + uint64_t x37; + fiat_p256_uint1 x38; + uint64_t x39; + uint64_t x40; + uint64_t x41; + uint64_t x42; + uint64_t x43; + uint64_t x44; + uint64_t x45; + uint64_t x46; + uint64_t x47; + fiat_p256_uint1 x48; + uint64_t x49; + fiat_p256_uint1 x50; + uint64_t x51; + fiat_p256_uint1 x52; + uint64_t x53; + uint64_t x54; + fiat_p256_uint1 x55; + uint64_t x56; + fiat_p256_uint1 x57; + uint64_t x58; + fiat_p256_uint1 x59; + uint64_t x60; + fiat_p256_uint1 x61; + uint64_t x62; + fiat_p256_uint1 x63; + uint64_t x64; + uint64_t x65; + uint64_t x66; + uint64_t x67; + uint64_t x68; + uint64_t x69; + uint64_t x70; + fiat_p256_uint1 x71; + uint64_t x72; + uint64_t x73; + fiat_p256_uint1 x74; + uint64_t x75; + fiat_p256_uint1 x76; + uint64_t x77; + fiat_p256_uint1 x78; + uint64_t x79; + fiat_p256_uint1 x80; + uint64_t x81; + fiat_p256_uint1 x82; + uint64_t x83; + uint64_t x84; + uint64_t x85; + uint64_t x86; + uint64_t x87; + uint64_t x88; + uint64_t x89; + uint64_t x90; + uint64_t x91; + uint64_t x92; + fiat_p256_uint1 x93; + uint64_t x94; + fiat_p256_uint1 x95; + uint64_t x96; + fiat_p256_uint1 x97; + uint64_t x98; + uint64_t x99; + fiat_p256_uint1 x100; + uint64_t x101; + fiat_p256_uint1 x102; + uint64_t x103; + fiat_p256_uint1 x104; + uint64_t x105; + fiat_p256_uint1 x106; + uint64_t x107; + fiat_p256_uint1 x108; + uint64_t x109; + uint64_t x110; + uint64_t x111; + uint64_t x112; + uint64_t x113; + uint64_t x114; + uint64_t x115; + fiat_p256_uint1 x116; + uint64_t x117; + uint64_t x118; + fiat_p256_uint1 x119; + uint64_t x120; + fiat_p256_uint1 x121; + uint64_t x122; + fiat_p256_uint1 x123; + uint64_t x124; + fiat_p256_uint1 x125; + uint64_t x126; + fiat_p256_uint1 x127; + uint64_t x128; + uint64_t x129; + uint64_t x130; + uint64_t x131; + uint64_t x132; + uint64_t x133; + uint64_t x134; + uint64_t x135; + uint64_t x136; + uint64_t x137; + fiat_p256_uint1 x138; + uint64_t x139; + fiat_p256_uint1 x140; + uint64_t x141; + fiat_p256_uint1 x142; + uint64_t x143; + uint64_t x144; + fiat_p256_uint1 x145; + uint64_t x146; + fiat_p256_uint1 x147; + uint64_t x148; + fiat_p256_uint1 x149; + uint64_t x150; + fiat_p256_uint1 x151; + uint64_t x152; + fiat_p256_uint1 x153; + uint64_t x154; + uint64_t x155; + uint64_t x156; + uint64_t x157; + uint64_t x158; + uint64_t x159; + uint64_t x160; + fiat_p256_uint1 x161; + uint64_t x162; + uint64_t x163; + fiat_p256_uint1 x164; + uint64_t x165; + fiat_p256_uint1 x166; + uint64_t x167; + fiat_p256_uint1 x168; + uint64_t x169; + fiat_p256_uint1 x170; + uint64_t x171; + fiat_p256_uint1 x172; + uint64_t x173; + uint64_t x174; + fiat_p256_uint1 x175; + uint64_t x176; + fiat_p256_uint1 x177; + uint64_t x178; + fiat_p256_uint1 x179; + uint64_t x180; + fiat_p256_uint1 x181; + uint64_t x182; + fiat_p256_uint1 x183; + uint64_t x184; + uint64_t x185; + uint64_t x186; + uint64_t x187; + x1 = (arg1[1]); + x2 = (arg1[2]); + x3 = (arg1[3]); + x4 = (arg1[0]); + fiat_p256_mulx_u64(&x5, &x6, x4, (arg2[3])); + fiat_p256_mulx_u64(&x7, &x8, x4, (arg2[2])); + fiat_p256_mulx_u64(&x9, &x10, x4, (arg2[1])); + fiat_p256_mulx_u64(&x11, &x12, x4, (arg2[0])); + fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9); + fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7); + fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5); + x19 = (x18 + x6); + fiat_p256_mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x26, &x27, 0x0, x25, x22); + x28 = (x27 + x23); + fiat_p256_addcarryx_u64(&x29, &x30, 0x0, x11, x24); + fiat_p256_addcarryx_u64(&x31, &x32, x30, x13, x26); + fiat_p256_addcarryx_u64(&x33, &x34, x32, x15, x28); + fiat_p256_addcarryx_u64(&x35, &x36, x34, x17, x20); + fiat_p256_addcarryx_u64(&x37, &x38, x36, x19, x21); + fiat_p256_mulx_u64(&x39, &x40, x1, (arg2[3])); + fiat_p256_mulx_u64(&x41, &x42, x1, (arg2[2])); + fiat_p256_mulx_u64(&x43, &x44, x1, (arg2[1])); + fiat_p256_mulx_u64(&x45, &x46, x1, (arg2[0])); + fiat_p256_addcarryx_u64(&x47, &x48, 0x0, x46, x43); + fiat_p256_addcarryx_u64(&x49, &x50, x48, x44, x41); + fiat_p256_addcarryx_u64(&x51, &x52, x50, x42, x39); + x53 = (x52 + x40); + fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x31, x45); + fiat_p256_addcarryx_u64(&x56, &x57, x55, x33, x47); + fiat_p256_addcarryx_u64(&x58, &x59, x57, x35, x49); + fiat_p256_addcarryx_u64(&x60, &x61, x59, x37, x51); + fiat_p256_addcarryx_u64(&x62, &x63, x61, x38, x53); + fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x66, &x67, x54, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x68, &x69, x54, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x70, &x71, 0x0, x69, x66); + x72 = (x71 + x67); + fiat_p256_addcarryx_u64(&x73, &x74, 0x0, x54, x68); + fiat_p256_addcarryx_u64(&x75, &x76, x74, x56, x70); + fiat_p256_addcarryx_u64(&x77, &x78, x76, x58, x72); + fiat_p256_addcarryx_u64(&x79, &x80, x78, x60, x64); + fiat_p256_addcarryx_u64(&x81, &x82, x80, x62, x65); + x83 = ((uint64_t)x82 + x63); + fiat_p256_mulx_u64(&x84, &x85, x2, (arg2[3])); + fiat_p256_mulx_u64(&x86, &x87, x2, (arg2[2])); + fiat_p256_mulx_u64(&x88, &x89, x2, (arg2[1])); + fiat_p256_mulx_u64(&x90, &x91, x2, (arg2[0])); + fiat_p256_addcarryx_u64(&x92, &x93, 0x0, x91, x88); + fiat_p256_addcarryx_u64(&x94, &x95, x93, x89, x86); + fiat_p256_addcarryx_u64(&x96, &x97, x95, x87, x84); + x98 = (x97 + x85); + fiat_p256_addcarryx_u64(&x99, &x100, 0x0, x75, x90); + fiat_p256_addcarryx_u64(&x101, &x102, x100, x77, x92); + fiat_p256_addcarryx_u64(&x103, &x104, x102, x79, x94); + fiat_p256_addcarryx_u64(&x105, &x106, x104, x81, x96); + fiat_p256_addcarryx_u64(&x107, &x108, x106, x83, x98); + fiat_p256_mulx_u64(&x109, &x110, x99, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x111, &x112, x99, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x115, &x116, 0x0, x114, x111); + x117 = (x116 + x112); + fiat_p256_addcarryx_u64(&x118, &x119, 0x0, x99, x113); + fiat_p256_addcarryx_u64(&x120, &x121, x119, x101, x115); + fiat_p256_addcarryx_u64(&x122, &x123, x121, x103, x117); + fiat_p256_addcarryx_u64(&x124, &x125, x123, x105, x109); + fiat_p256_addcarryx_u64(&x126, &x127, x125, x107, x110); + x128 = ((uint64_t)x127 + x108); + fiat_p256_mulx_u64(&x129, &x130, x3, (arg2[3])); + fiat_p256_mulx_u64(&x131, &x132, x3, (arg2[2])); + fiat_p256_mulx_u64(&x133, &x134, x3, (arg2[1])); + fiat_p256_mulx_u64(&x135, &x136, x3, (arg2[0])); + fiat_p256_addcarryx_u64(&x137, &x138, 0x0, x136, x133); + fiat_p256_addcarryx_u64(&x139, &x140, x138, x134, x131); + fiat_p256_addcarryx_u64(&x141, &x142, x140, x132, x129); + x143 = (x142 + x130); + fiat_p256_addcarryx_u64(&x144, &x145, 0x0, x120, x135); + fiat_p256_addcarryx_u64(&x146, &x147, x145, x122, x137); + fiat_p256_addcarryx_u64(&x148, &x149, x147, x124, x139); + fiat_p256_addcarryx_u64(&x150, &x151, x149, x126, x141); + fiat_p256_addcarryx_u64(&x152, &x153, x151, x128, x143); + fiat_p256_mulx_u64(&x154, &x155, x144, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x156, &x157, x144, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x158, &x159, x144, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x160, &x161, 0x0, x159, x156); + x162 = (x161 + x157); + fiat_p256_addcarryx_u64(&x163, &x164, 0x0, x144, x158); + fiat_p256_addcarryx_u64(&x165, &x166, x164, x146, x160); + fiat_p256_addcarryx_u64(&x167, &x168, x166, x148, x162); + fiat_p256_addcarryx_u64(&x169, &x170, x168, x150, x154); + fiat_p256_addcarryx_u64(&x171, &x172, x170, x152, x155); + x173 = ((uint64_t)x172 + x153); + fiat_p256_subborrowx_u64(&x174, &x175, 0x0, x165, UINT64_C(0xffffffffffffffff)); + fiat_p256_subborrowx_u64(&x176, &x177, x175, x167, UINT32_C(0xffffffff)); + fiat_p256_subborrowx_u64(&x178, &x179, x177, x169, 0x0); + fiat_p256_subborrowx_u64(&x180, &x181, x179, x171, UINT64_C(0xffffffff00000001)); + fiat_p256_subborrowx_u64(&x182, &x183, x181, x173, 0x0); + fiat_p256_cmovznz_u64(&x184, x183, x174, x165); + fiat_p256_cmovznz_u64(&x185, x183, x176, x167); + fiat_p256_cmovznz_u64(&x186, x183, x178, x169); + fiat_p256_cmovznz_u64(&x187, x183, x180, x171); + out1[0] = x184; + out1[1] = x185; + out1[2] = x186; + out1[3] = x187; +} + +/* + * The function fiat_p256_square squares a field element in the Montgomery domain. + * + * Preconditions: + * 0 ≤ eval arg1 < m + * Postconditions: + * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m + * 0 ≤ eval out1 < m + * + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_square(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + uint64_t x13; + fiat_p256_uint1 x14; + uint64_t x15; + fiat_p256_uint1 x16; + uint64_t x17; + fiat_p256_uint1 x18; + uint64_t x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + uint64_t x23; + uint64_t x24; + uint64_t x25; + uint64_t x26; + fiat_p256_uint1 x27; + uint64_t x28; + uint64_t x29; + fiat_p256_uint1 x30; + uint64_t x31; + fiat_p256_uint1 x32; + uint64_t x33; + fiat_p256_uint1 x34; + uint64_t x35; + fiat_p256_uint1 x36; + uint64_t x37; + fiat_p256_uint1 x38; + uint64_t x39; + uint64_t x40; + uint64_t x41; + uint64_t x42; + uint64_t x43; + uint64_t x44; + uint64_t x45; + uint64_t x46; + uint64_t x47; + fiat_p256_uint1 x48; + uint64_t x49; + fiat_p256_uint1 x50; + uint64_t x51; + fiat_p256_uint1 x52; + uint64_t x53; + uint64_t x54; + fiat_p256_uint1 x55; + uint64_t x56; + fiat_p256_uint1 x57; + uint64_t x58; + fiat_p256_uint1 x59; + uint64_t x60; + fiat_p256_uint1 x61; + uint64_t x62; + fiat_p256_uint1 x63; + uint64_t x64; + uint64_t x65; + uint64_t x66; + uint64_t x67; + uint64_t x68; + uint64_t x69; + uint64_t x70; + fiat_p256_uint1 x71; + uint64_t x72; + uint64_t x73; + fiat_p256_uint1 x74; + uint64_t x75; + fiat_p256_uint1 x76; + uint64_t x77; + fiat_p256_uint1 x78; + uint64_t x79; + fiat_p256_uint1 x80; + uint64_t x81; + fiat_p256_uint1 x82; + uint64_t x83; + uint64_t x84; + uint64_t x85; + uint64_t x86; + uint64_t x87; + uint64_t x88; + uint64_t x89; + uint64_t x90; + uint64_t x91; + uint64_t x92; + fiat_p256_uint1 x93; + uint64_t x94; + fiat_p256_uint1 x95; + uint64_t x96; + fiat_p256_uint1 x97; + uint64_t x98; + uint64_t x99; + fiat_p256_uint1 x100; + uint64_t x101; + fiat_p256_uint1 x102; + uint64_t x103; + fiat_p256_uint1 x104; + uint64_t x105; + fiat_p256_uint1 x106; + uint64_t x107; + fiat_p256_uint1 x108; + uint64_t x109; + uint64_t x110; + uint64_t x111; + uint64_t x112; + uint64_t x113; + uint64_t x114; + uint64_t x115; + fiat_p256_uint1 x116; + uint64_t x117; + uint64_t x118; + fiat_p256_uint1 x119; + uint64_t x120; + fiat_p256_uint1 x121; + uint64_t x122; + fiat_p256_uint1 x123; + uint64_t x124; + fiat_p256_uint1 x125; + uint64_t x126; + fiat_p256_uint1 x127; + uint64_t x128; + uint64_t x129; + uint64_t x130; + uint64_t x131; + uint64_t x132; + uint64_t x133; + uint64_t x134; + uint64_t x135; + uint64_t x136; + uint64_t x137; + fiat_p256_uint1 x138; + uint64_t x139; + fiat_p256_uint1 x140; + uint64_t x141; + fiat_p256_uint1 x142; + uint64_t x143; + uint64_t x144; + fiat_p256_uint1 x145; + uint64_t x146; + fiat_p256_uint1 x147; + uint64_t x148; + fiat_p256_uint1 x149; + uint64_t x150; + fiat_p256_uint1 x151; + uint64_t x152; + fiat_p256_uint1 x153; + uint64_t x154; + uint64_t x155; + uint64_t x156; + uint64_t x157; + uint64_t x158; + uint64_t x159; + uint64_t x160; + fiat_p256_uint1 x161; + uint64_t x162; + uint64_t x163; + fiat_p256_uint1 x164; + uint64_t x165; + fiat_p256_uint1 x166; + uint64_t x167; + fiat_p256_uint1 x168; + uint64_t x169; + fiat_p256_uint1 x170; + uint64_t x171; + fiat_p256_uint1 x172; + uint64_t x173; + uint64_t x174; + fiat_p256_uint1 x175; + uint64_t x176; + fiat_p256_uint1 x177; + uint64_t x178; + fiat_p256_uint1 x179; + uint64_t x180; + fiat_p256_uint1 x181; + uint64_t x182; + fiat_p256_uint1 x183; + uint64_t x184; + uint64_t x185; + uint64_t x186; + uint64_t x187; + x1 = (arg1[1]); + x2 = (arg1[2]); + x3 = (arg1[3]); + x4 = (arg1[0]); + fiat_p256_mulx_u64(&x5, &x6, x4, (arg1[3])); + fiat_p256_mulx_u64(&x7, &x8, x4, (arg1[2])); + fiat_p256_mulx_u64(&x9, &x10, x4, (arg1[1])); + fiat_p256_mulx_u64(&x11, &x12, x4, (arg1[0])); + fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9); + fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7); + fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5); + x19 = (x18 + x6); + fiat_p256_mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x26, &x27, 0x0, x25, x22); + x28 = (x27 + x23); + fiat_p256_addcarryx_u64(&x29, &x30, 0x0, x11, x24); + fiat_p256_addcarryx_u64(&x31, &x32, x30, x13, x26); + fiat_p256_addcarryx_u64(&x33, &x34, x32, x15, x28); + fiat_p256_addcarryx_u64(&x35, &x36, x34, x17, x20); + fiat_p256_addcarryx_u64(&x37, &x38, x36, x19, x21); + fiat_p256_mulx_u64(&x39, &x40, x1, (arg1[3])); + fiat_p256_mulx_u64(&x41, &x42, x1, (arg1[2])); + fiat_p256_mulx_u64(&x43, &x44, x1, (arg1[1])); + fiat_p256_mulx_u64(&x45, &x46, x1, (arg1[0])); + fiat_p256_addcarryx_u64(&x47, &x48, 0x0, x46, x43); + fiat_p256_addcarryx_u64(&x49, &x50, x48, x44, x41); + fiat_p256_addcarryx_u64(&x51, &x52, x50, x42, x39); + x53 = (x52 + x40); + fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x31, x45); + fiat_p256_addcarryx_u64(&x56, &x57, x55, x33, x47); + fiat_p256_addcarryx_u64(&x58, &x59, x57, x35, x49); + fiat_p256_addcarryx_u64(&x60, &x61, x59, x37, x51); + fiat_p256_addcarryx_u64(&x62, &x63, x61, x38, x53); + fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x66, &x67, x54, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x68, &x69, x54, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x70, &x71, 0x0, x69, x66); + x72 = (x71 + x67); + fiat_p256_addcarryx_u64(&x73, &x74, 0x0, x54, x68); + fiat_p256_addcarryx_u64(&x75, &x76, x74, x56, x70); + fiat_p256_addcarryx_u64(&x77, &x78, x76, x58, x72); + fiat_p256_addcarryx_u64(&x79, &x80, x78, x60, x64); + fiat_p256_addcarryx_u64(&x81, &x82, x80, x62, x65); + x83 = ((uint64_t)x82 + x63); + fiat_p256_mulx_u64(&x84, &x85, x2, (arg1[3])); + fiat_p256_mulx_u64(&x86, &x87, x2, (arg1[2])); + fiat_p256_mulx_u64(&x88, &x89, x2, (arg1[1])); + fiat_p256_mulx_u64(&x90, &x91, x2, (arg1[0])); + fiat_p256_addcarryx_u64(&x92, &x93, 0x0, x91, x88); + fiat_p256_addcarryx_u64(&x94, &x95, x93, x89, x86); + fiat_p256_addcarryx_u64(&x96, &x97, x95, x87, x84); + x98 = (x97 + x85); + fiat_p256_addcarryx_u64(&x99, &x100, 0x0, x75, x90); + fiat_p256_addcarryx_u64(&x101, &x102, x100, x77, x92); + fiat_p256_addcarryx_u64(&x103, &x104, x102, x79, x94); + fiat_p256_addcarryx_u64(&x105, &x106, x104, x81, x96); + fiat_p256_addcarryx_u64(&x107, &x108, x106, x83, x98); + fiat_p256_mulx_u64(&x109, &x110, x99, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x111, &x112, x99, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x115, &x116, 0x0, x114, x111); + x117 = (x116 + x112); + fiat_p256_addcarryx_u64(&x118, &x119, 0x0, x99, x113); + fiat_p256_addcarryx_u64(&x120, &x121, x119, x101, x115); + fiat_p256_addcarryx_u64(&x122, &x123, x121, x103, x117); + fiat_p256_addcarryx_u64(&x124, &x125, x123, x105, x109); + fiat_p256_addcarryx_u64(&x126, &x127, x125, x107, x110); + x128 = ((uint64_t)x127 + x108); + fiat_p256_mulx_u64(&x129, &x130, x3, (arg1[3])); + fiat_p256_mulx_u64(&x131, &x132, x3, (arg1[2])); + fiat_p256_mulx_u64(&x133, &x134, x3, (arg1[1])); + fiat_p256_mulx_u64(&x135, &x136, x3, (arg1[0])); + fiat_p256_addcarryx_u64(&x137, &x138, 0x0, x136, x133); + fiat_p256_addcarryx_u64(&x139, &x140, x138, x134, x131); + fiat_p256_addcarryx_u64(&x141, &x142, x140, x132, x129); + x143 = (x142 + x130); + fiat_p256_addcarryx_u64(&x144, &x145, 0x0, x120, x135); + fiat_p256_addcarryx_u64(&x146, &x147, x145, x122, x137); + fiat_p256_addcarryx_u64(&x148, &x149, x147, x124, x139); + fiat_p256_addcarryx_u64(&x150, &x151, x149, x126, x141); + fiat_p256_addcarryx_u64(&x152, &x153, x151, x128, x143); + fiat_p256_mulx_u64(&x154, &x155, x144, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x156, &x157, x144, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x158, &x159, x144, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x160, &x161, 0x0, x159, x156); + x162 = (x161 + x157); + fiat_p256_addcarryx_u64(&x163, &x164, 0x0, x144, x158); + fiat_p256_addcarryx_u64(&x165, &x166, x164, x146, x160); + fiat_p256_addcarryx_u64(&x167, &x168, x166, x148, x162); + fiat_p256_addcarryx_u64(&x169, &x170, x168, x150, x154); + fiat_p256_addcarryx_u64(&x171, &x172, x170, x152, x155); + x173 = ((uint64_t)x172 + x153); + fiat_p256_subborrowx_u64(&x174, &x175, 0x0, x165, UINT64_C(0xffffffffffffffff)); + fiat_p256_subborrowx_u64(&x176, &x177, x175, x167, UINT32_C(0xffffffff)); + fiat_p256_subborrowx_u64(&x178, &x179, x177, x169, 0x0); + fiat_p256_subborrowx_u64(&x180, &x181, x179, x171, UINT64_C(0xffffffff00000001)); + fiat_p256_subborrowx_u64(&x182, &x183, x181, x173, 0x0); + fiat_p256_cmovznz_u64(&x184, x183, x174, x165); + fiat_p256_cmovznz_u64(&x185, x183, x176, x167); + fiat_p256_cmovznz_u64(&x186, x183, x178, x169); + fiat_p256_cmovznz_u64(&x187, x183, x180, x171); + out1[0] = x184; + out1[1] = x185; + out1[2] = x186; + out1[3] = x187; +} + +/* + * The function fiat_p256_add adds two field elements in the Montgomery domain. + * + * Preconditions: + * 0 ≤ eval arg1 < m + * 0 ≤ eval arg2 < m + * Postconditions: + * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m + * 0 ≤ eval out1 < m + * + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_add(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) { + uint64_t x1; + fiat_p256_uint1 x2; + uint64_t x3; + fiat_p256_uint1 x4; + uint64_t x5; + fiat_p256_uint1 x6; + uint64_t x7; + fiat_p256_uint1 x8; + uint64_t x9; + fiat_p256_uint1 x10; + uint64_t x11; + fiat_p256_uint1 x12; + uint64_t x13; + fiat_p256_uint1 x14; + uint64_t x15; + fiat_p256_uint1 x16; + uint64_t x17; + fiat_p256_uint1 x18; + uint64_t x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + fiat_p256_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); + fiat_p256_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); + fiat_p256_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); + fiat_p256_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); + fiat_p256_subborrowx_u64(&x9, &x10, 0x0, x1, UINT64_C(0xffffffffffffffff)); + fiat_p256_subborrowx_u64(&x11, &x12, x10, x3, UINT32_C(0xffffffff)); + fiat_p256_subborrowx_u64(&x13, &x14, x12, x5, 0x0); + fiat_p256_subborrowx_u64(&x15, &x16, x14, x7, UINT64_C(0xffffffff00000001)); + fiat_p256_subborrowx_u64(&x17, &x18, x16, x8, 0x0); + fiat_p256_cmovznz_u64(&x19, x18, x9, x1); + fiat_p256_cmovznz_u64(&x20, x18, x11, x3); + fiat_p256_cmovznz_u64(&x21, x18, x13, x5); + fiat_p256_cmovznz_u64(&x22, x18, x15, x7); + out1[0] = x19; + out1[1] = x20; + out1[2] = x21; + out1[3] = x22; +} + +/* + * The function fiat_p256_sub subtracts two field elements in the Montgomery domain. + * + * Preconditions: + * 0 ≤ eval arg1 < m + * 0 ≤ eval arg2 < m + * Postconditions: + * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m + * 0 ≤ eval out1 < m + * + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_sub(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) { + uint64_t x1; + fiat_p256_uint1 x2; + uint64_t x3; + fiat_p256_uint1 x4; + uint64_t x5; + fiat_p256_uint1 x6; + uint64_t x7; + fiat_p256_uint1 x8; + uint64_t x9; + uint64_t x10; + fiat_p256_uint1 x11; + uint64_t x12; + fiat_p256_uint1 x13; + uint64_t x14; + fiat_p256_uint1 x15; + uint64_t x16; + fiat_p256_uint1 x17; + fiat_p256_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0])); + fiat_p256_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1])); + fiat_p256_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2])); + fiat_p256_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3])); + fiat_p256_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x9); + fiat_p256_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT32_C(0xffffffff))); + fiat_p256_addcarryx_u64(&x14, &x15, x13, x5, 0x0); + fiat_p256_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0xffffffff00000001))); + out1[0] = x10; + out1[1] = x12; + out1[2] = x14; + out1[3] = x16; +} + +/* + * The function fiat_p256_opp negates a field element in the Montgomery domain. + * + * Preconditions: + * 0 ≤ eval arg1 < m + * Postconditions: + * eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m + * 0 ≤ eval out1 < m + * + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_opp(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) { + uint64_t x1; + fiat_p256_uint1 x2; + uint64_t x3; + fiat_p256_uint1 x4; + uint64_t x5; + fiat_p256_uint1 x6; + uint64_t x7; + fiat_p256_uint1 x8; + uint64_t x9; + uint64_t x10; + fiat_p256_uint1 x11; + uint64_t x12; + fiat_p256_uint1 x13; + uint64_t x14; + fiat_p256_uint1 x15; + uint64_t x16; + fiat_p256_uint1 x17; + fiat_p256_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0])); + fiat_p256_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1])); + fiat_p256_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2])); + fiat_p256_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3])); + fiat_p256_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x9); + fiat_p256_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT32_C(0xffffffff))); + fiat_p256_addcarryx_u64(&x14, &x15, x13, x5, 0x0); + fiat_p256_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0xffffffff00000001))); + out1[0] = x10; + out1[1] = x12; + out1[2] = x14; + out1[3] = x16; +} + +/* + * The function fiat_p256_from_montgomery translates a field element out of the Montgomery domain. + * + * Preconditions: + * 0 ≤ eval arg1 < m + * Postconditions: + * eval out1 mod m = (eval arg1 * ((2^64)â»Â¹ mod m)^4) mod m + * 0 ≤ eval out1 < m + * + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_from_montgomery(fiat_p256_non_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + fiat_p256_uint1 x9; + uint64_t x10; + fiat_p256_uint1 x11; + uint64_t x12; + fiat_p256_uint1 x13; + uint64_t x14; + fiat_p256_uint1 x15; + uint64_t x16; + uint64_t x17; + uint64_t x18; + uint64_t x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + fiat_p256_uint1 x23; + uint64_t x24; + fiat_p256_uint1 x25; + uint64_t x26; + fiat_p256_uint1 x27; + uint64_t x28; + fiat_p256_uint1 x29; + uint64_t x30; + fiat_p256_uint1 x31; + uint64_t x32; + fiat_p256_uint1 x33; + uint64_t x34; + fiat_p256_uint1 x35; + uint64_t x36; + fiat_p256_uint1 x37; + uint64_t x38; + uint64_t x39; + uint64_t x40; + uint64_t x41; + uint64_t x42; + uint64_t x43; + uint64_t x44; + fiat_p256_uint1 x45; + uint64_t x46; + fiat_p256_uint1 x47; + uint64_t x48; + fiat_p256_uint1 x49; + uint64_t x50; + fiat_p256_uint1 x51; + uint64_t x52; + fiat_p256_uint1 x53; + uint64_t x54; + fiat_p256_uint1 x55; + uint64_t x56; + fiat_p256_uint1 x57; + uint64_t x58; + fiat_p256_uint1 x59; + uint64_t x60; + uint64_t x61; + uint64_t x62; + uint64_t x63; + uint64_t x64; + uint64_t x65; + uint64_t x66; + fiat_p256_uint1 x67; + uint64_t x68; + fiat_p256_uint1 x69; + uint64_t x70; + fiat_p256_uint1 x71; + uint64_t x72; + fiat_p256_uint1 x73; + uint64_t x74; + fiat_p256_uint1 x75; + uint64_t x76; + uint64_t x77; + fiat_p256_uint1 x78; + uint64_t x79; + fiat_p256_uint1 x80; + uint64_t x81; + fiat_p256_uint1 x82; + uint64_t x83; + fiat_p256_uint1 x84; + uint64_t x85; + fiat_p256_uint1 x86; + uint64_t x87; + uint64_t x88; + uint64_t x89; + uint64_t x90; + x1 = (arg1[0]); + fiat_p256_mulx_u64(&x2, &x3, x1, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x4, &x5, x1, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x6, &x7, x1, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x8, &x9, 0x0, x7, x4); + fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x6); + fiat_p256_addcarryx_u64(&x12, &x13, x11, 0x0, x8); + fiat_p256_addcarryx_u64(&x14, &x15, 0x0, x12, (arg1[1])); + fiat_p256_mulx_u64(&x16, &x17, x14, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x18, &x19, x14, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x20, &x21, x14, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x22, &x23, 0x0, x21, x18); + fiat_p256_addcarryx_u64(&x24, &x25, 0x0, x14, x20); + fiat_p256_addcarryx_u64(&x26, &x27, x25, (x15 + (x13 + (x9 + x5))), x22); + fiat_p256_addcarryx_u64(&x28, &x29, x27, x2, (x23 + x19)); + fiat_p256_addcarryx_u64(&x30, &x31, x29, x3, x16); + fiat_p256_addcarryx_u64(&x32, &x33, 0x0, x26, (arg1[2])); + fiat_p256_addcarryx_u64(&x34, &x35, x33, x28, 0x0); + fiat_p256_addcarryx_u64(&x36, &x37, x35, x30, 0x0); + fiat_p256_mulx_u64(&x38, &x39, x32, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x40, &x41, x32, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x42, &x43, x32, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x44, &x45, 0x0, x43, x40); + fiat_p256_addcarryx_u64(&x46, &x47, 0x0, x32, x42); + fiat_p256_addcarryx_u64(&x48, &x49, x47, x34, x44); + fiat_p256_addcarryx_u64(&x50, &x51, x49, x36, (x45 + x41)); + fiat_p256_addcarryx_u64(&x52, &x53, x51, (x37 + (x31 + x17)), x38); + fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x48, (arg1[3])); + fiat_p256_addcarryx_u64(&x56, &x57, x55, x50, 0x0); + fiat_p256_addcarryx_u64(&x58, &x59, x57, x52, 0x0); + fiat_p256_mulx_u64(&x60, &x61, x54, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x62, &x63, x54, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x66, &x67, 0x0, x65, x62); + fiat_p256_addcarryx_u64(&x68, &x69, 0x0, x54, x64); + fiat_p256_addcarryx_u64(&x70, &x71, x69, x56, x66); + fiat_p256_addcarryx_u64(&x72, &x73, x71, x58, (x67 + x63)); + fiat_p256_addcarryx_u64(&x74, &x75, x73, (x59 + (x53 + x39)), x60); + x76 = (x75 + x61); + fiat_p256_subborrowx_u64(&x77, &x78, 0x0, x70, UINT64_C(0xffffffffffffffff)); + fiat_p256_subborrowx_u64(&x79, &x80, x78, x72, UINT32_C(0xffffffff)); + fiat_p256_subborrowx_u64(&x81, &x82, x80, x74, 0x0); + fiat_p256_subborrowx_u64(&x83, &x84, x82, x76, UINT64_C(0xffffffff00000001)); + fiat_p256_subborrowx_u64(&x85, &x86, x84, 0x0, 0x0); + fiat_p256_cmovznz_u64(&x87, x86, x77, x70); + fiat_p256_cmovznz_u64(&x88, x86, x79, x72); + fiat_p256_cmovznz_u64(&x89, x86, x81, x74); + fiat_p256_cmovznz_u64(&x90, x86, x83, x76); + out1[0] = x87; + out1[1] = x88; + out1[2] = x89; + out1[3] = x90; +} + +/* + * The function fiat_p256_to_montgomery translates a field element into the Montgomery domain. + * + * Preconditions: + * 0 ≤ eval arg1 < m + * Postconditions: + * eval (from_montgomery out1) mod m = eval arg1 mod m + * 0 ≤ eval out1 < m + * + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_to_montgomery(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_non_montgomery_domain_field_element arg1) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + uint64_t x13; + fiat_p256_uint1 x14; + uint64_t x15; + fiat_p256_uint1 x16; + uint64_t x17; + fiat_p256_uint1 x18; + uint64_t x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + uint64_t x23; + uint64_t x24; + uint64_t x25; + fiat_p256_uint1 x26; + uint64_t x27; + fiat_p256_uint1 x28; + uint64_t x29; + fiat_p256_uint1 x30; + uint64_t x31; + fiat_p256_uint1 x32; + uint64_t x33; + fiat_p256_uint1 x34; + uint64_t x35; + fiat_p256_uint1 x36; + uint64_t x37; + uint64_t x38; + uint64_t x39; + uint64_t x40; + uint64_t x41; + uint64_t x42; + uint64_t x43; + uint64_t x44; + uint64_t x45; + fiat_p256_uint1 x46; + uint64_t x47; + fiat_p256_uint1 x48; + uint64_t x49; + fiat_p256_uint1 x50; + uint64_t x51; + fiat_p256_uint1 x52; + uint64_t x53; + fiat_p256_uint1 x54; + uint64_t x55; + fiat_p256_uint1 x56; + uint64_t x57; + fiat_p256_uint1 x58; + uint64_t x59; + uint64_t x60; + uint64_t x61; + uint64_t x62; + uint64_t x63; + uint64_t x64; + uint64_t x65; + fiat_p256_uint1 x66; + uint64_t x67; + fiat_p256_uint1 x68; + uint64_t x69; + fiat_p256_uint1 x70; + uint64_t x71; + fiat_p256_uint1 x72; + uint64_t x73; + fiat_p256_uint1 x74; + uint64_t x75; + fiat_p256_uint1 x76; + uint64_t x77; + uint64_t x78; + uint64_t x79; + uint64_t x80; + uint64_t x81; + uint64_t x82; + uint64_t x83; + uint64_t x84; + uint64_t x85; + fiat_p256_uint1 x86; + uint64_t x87; + fiat_p256_uint1 x88; + uint64_t x89; + fiat_p256_uint1 x90; + uint64_t x91; + fiat_p256_uint1 x92; + uint64_t x93; + fiat_p256_uint1 x94; + uint64_t x95; + fiat_p256_uint1 x96; + uint64_t x97; + fiat_p256_uint1 x98; + uint64_t x99; + uint64_t x100; + uint64_t x101; + uint64_t x102; + uint64_t x103; + uint64_t x104; + uint64_t x105; + fiat_p256_uint1 x106; + uint64_t x107; + fiat_p256_uint1 x108; + uint64_t x109; + fiat_p256_uint1 x110; + uint64_t x111; + fiat_p256_uint1 x112; + uint64_t x113; + fiat_p256_uint1 x114; + uint64_t x115; + fiat_p256_uint1 x116; + uint64_t x117; + uint64_t x118; + uint64_t x119; + uint64_t x120; + uint64_t x121; + uint64_t x122; + uint64_t x123; + uint64_t x124; + uint64_t x125; + fiat_p256_uint1 x126; + uint64_t x127; + fiat_p256_uint1 x128; + uint64_t x129; + fiat_p256_uint1 x130; + uint64_t x131; + fiat_p256_uint1 x132; + uint64_t x133; + fiat_p256_uint1 x134; + uint64_t x135; + fiat_p256_uint1 x136; + uint64_t x137; + fiat_p256_uint1 x138; + uint64_t x139; + uint64_t x140; + uint64_t x141; + uint64_t x142; + uint64_t x143; + uint64_t x144; + uint64_t x145; + fiat_p256_uint1 x146; + uint64_t x147; + fiat_p256_uint1 x148; + uint64_t x149; + fiat_p256_uint1 x150; + uint64_t x151; + fiat_p256_uint1 x152; + uint64_t x153; + fiat_p256_uint1 x154; + uint64_t x155; + fiat_p256_uint1 x156; + uint64_t x157; + fiat_p256_uint1 x158; + uint64_t x159; + fiat_p256_uint1 x160; + uint64_t x161; + fiat_p256_uint1 x162; + uint64_t x163; + fiat_p256_uint1 x164; + uint64_t x165; + fiat_p256_uint1 x166; + uint64_t x167; + uint64_t x168; + uint64_t x169; + uint64_t x170; + x1 = (arg1[1]); + x2 = (arg1[2]); + x3 = (arg1[3]); + x4 = (arg1[0]); + fiat_p256_mulx_u64(&x5, &x6, x4, UINT64_C(0x4fffffffd)); + fiat_p256_mulx_u64(&x7, &x8, x4, UINT64_C(0xfffffffffffffffe)); + fiat_p256_mulx_u64(&x9, &x10, x4, UINT64_C(0xfffffffbffffffff)); + fiat_p256_mulx_u64(&x11, &x12, x4, 0x3); + fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9); + fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7); + fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5); + fiat_p256_mulx_u64(&x19, &x20, x11, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x21, &x22, x11, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x23, &x24, x11, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x25, &x26, 0x0, x24, x21); + fiat_p256_addcarryx_u64(&x27, &x28, 0x0, x11, x23); + fiat_p256_addcarryx_u64(&x29, &x30, x28, x13, x25); + fiat_p256_addcarryx_u64(&x31, &x32, x30, x15, (x26 + x22)); + fiat_p256_addcarryx_u64(&x33, &x34, x32, x17, x19); + fiat_p256_addcarryx_u64(&x35, &x36, x34, (x18 + x6), x20); + fiat_p256_mulx_u64(&x37, &x38, x1, UINT64_C(0x4fffffffd)); + fiat_p256_mulx_u64(&x39, &x40, x1, UINT64_C(0xfffffffffffffffe)); + fiat_p256_mulx_u64(&x41, &x42, x1, UINT64_C(0xfffffffbffffffff)); + fiat_p256_mulx_u64(&x43, &x44, x1, 0x3); + fiat_p256_addcarryx_u64(&x45, &x46, 0x0, x44, x41); + fiat_p256_addcarryx_u64(&x47, &x48, x46, x42, x39); + fiat_p256_addcarryx_u64(&x49, &x50, x48, x40, x37); + fiat_p256_addcarryx_u64(&x51, &x52, 0x0, x29, x43); + fiat_p256_addcarryx_u64(&x53, &x54, x52, x31, x45); + fiat_p256_addcarryx_u64(&x55, &x56, x54, x33, x47); + fiat_p256_addcarryx_u64(&x57, &x58, x56, x35, x49); + fiat_p256_mulx_u64(&x59, &x60, x51, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x61, &x62, x51, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x63, &x64, x51, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x65, &x66, 0x0, x64, x61); + fiat_p256_addcarryx_u64(&x67, &x68, 0x0, x51, x63); + fiat_p256_addcarryx_u64(&x69, &x70, x68, x53, x65); + fiat_p256_addcarryx_u64(&x71, &x72, x70, x55, (x66 + x62)); + fiat_p256_addcarryx_u64(&x73, &x74, x72, x57, x59); + fiat_p256_addcarryx_u64(&x75, &x76, x74, (((uint64_t)x58 + x36) + (x50 + x38)), x60); + fiat_p256_mulx_u64(&x77, &x78, x2, UINT64_C(0x4fffffffd)); + fiat_p256_mulx_u64(&x79, &x80, x2, UINT64_C(0xfffffffffffffffe)); + fiat_p256_mulx_u64(&x81, &x82, x2, UINT64_C(0xfffffffbffffffff)); + fiat_p256_mulx_u64(&x83, &x84, x2, 0x3); + fiat_p256_addcarryx_u64(&x85, &x86, 0x0, x84, x81); + fiat_p256_addcarryx_u64(&x87, &x88, x86, x82, x79); + fiat_p256_addcarryx_u64(&x89, &x90, x88, x80, x77); + fiat_p256_addcarryx_u64(&x91, &x92, 0x0, x69, x83); + fiat_p256_addcarryx_u64(&x93, &x94, x92, x71, x85); + fiat_p256_addcarryx_u64(&x95, &x96, x94, x73, x87); + fiat_p256_addcarryx_u64(&x97, &x98, x96, x75, x89); + fiat_p256_mulx_u64(&x99, &x100, x91, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x101, &x102, x91, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x103, &x104, x91, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x105, &x106, 0x0, x104, x101); + fiat_p256_addcarryx_u64(&x107, &x108, 0x0, x91, x103); + fiat_p256_addcarryx_u64(&x109, &x110, x108, x93, x105); + fiat_p256_addcarryx_u64(&x111, &x112, x110, x95, (x106 + x102)); + fiat_p256_addcarryx_u64(&x113, &x114, x112, x97, x99); + fiat_p256_addcarryx_u64(&x115, &x116, x114, (((uint64_t)x98 + x76) + (x90 + x78)), x100); + fiat_p256_mulx_u64(&x117, &x118, x3, UINT64_C(0x4fffffffd)); + fiat_p256_mulx_u64(&x119, &x120, x3, UINT64_C(0xfffffffffffffffe)); + fiat_p256_mulx_u64(&x121, &x122, x3, UINT64_C(0xfffffffbffffffff)); + fiat_p256_mulx_u64(&x123, &x124, x3, 0x3); + fiat_p256_addcarryx_u64(&x125, &x126, 0x0, x124, x121); + fiat_p256_addcarryx_u64(&x127, &x128, x126, x122, x119); + fiat_p256_addcarryx_u64(&x129, &x130, x128, x120, x117); + fiat_p256_addcarryx_u64(&x131, &x132, 0x0, x109, x123); + fiat_p256_addcarryx_u64(&x133, &x134, x132, x111, x125); + fiat_p256_addcarryx_u64(&x135, &x136, x134, x113, x127); + fiat_p256_addcarryx_u64(&x137, &x138, x136, x115, x129); + fiat_p256_mulx_u64(&x139, &x140, x131, UINT64_C(0xffffffff00000001)); + fiat_p256_mulx_u64(&x141, &x142, x131, UINT32_C(0xffffffff)); + fiat_p256_mulx_u64(&x143, &x144, x131, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x145, &x146, 0x0, x144, x141); + fiat_p256_addcarryx_u64(&x147, &x148, 0x0, x131, x143); + fiat_p256_addcarryx_u64(&x149, &x150, x148, x133, x145); + fiat_p256_addcarryx_u64(&x151, &x152, x150, x135, (x146 + x142)); + fiat_p256_addcarryx_u64(&x153, &x154, x152, x137, x139); + fiat_p256_addcarryx_u64(&x155, &x156, x154, (((uint64_t)x138 + x116) + (x130 + x118)), x140); + fiat_p256_subborrowx_u64(&x157, &x158, 0x0, x149, UINT64_C(0xffffffffffffffff)); + fiat_p256_subborrowx_u64(&x159, &x160, x158, x151, UINT32_C(0xffffffff)); + fiat_p256_subborrowx_u64(&x161, &x162, x160, x153, 0x0); + fiat_p256_subborrowx_u64(&x163, &x164, x162, x155, UINT64_C(0xffffffff00000001)); + fiat_p256_subborrowx_u64(&x165, &x166, x164, x156, 0x0); + fiat_p256_cmovznz_u64(&x167, x166, x157, x149); + fiat_p256_cmovznz_u64(&x168, x166, x159, x151); + fiat_p256_cmovznz_u64(&x169, x166, x161, x153); + fiat_p256_cmovznz_u64(&x170, x166, x163, x155); + out1[0] = x167; + out1[1] = x168; + out1[2] = x169; + out1[3] = x170; +} + +/* + * The function fiat_p256_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise. + * + * Preconditions: + * 0 ≤ eval arg1 < m + * Postconditions: + * out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0 + * + * Input Bounds: + * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_nonzero(uint64_t* out1, const uint64_t arg1[4]) { + uint64_t x1; + x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | (arg1[3])))); + *out1 = x1; +} + +/* + * The function fiat_p256_selectznz is a multi-limb conditional select. + * + * Postconditions: + * out1 = (if arg1 = 0 then arg2 else arg3) + * + * Input Bounds: + * arg1: [0x0 ~> 0x1] + * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * Output Bounds: + * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_selectznz(uint64_t out1[4], fiat_p256_uint1 arg1, const uint64_t arg2[4], const uint64_t arg3[4]) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + fiat_p256_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); + fiat_p256_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); + fiat_p256_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); + fiat_p256_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); + out1[0] = x1; + out1[1] = x2; + out1[2] = x3; + out1[3] = x4; +} + +/* + * The function fiat_p256_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order. + * + * Preconditions: + * 0 ≤ eval arg1 < m + * Postconditions: + * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31] + * + * Input Bounds: + * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * Output Bounds: + * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_to_bytes(uint8_t out1[32], const uint64_t arg1[4]) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint8_t x5; + uint64_t x6; + uint8_t x7; + uint64_t x8; + uint8_t x9; + uint64_t x10; + uint8_t x11; + uint64_t x12; + uint8_t x13; + uint64_t x14; + uint8_t x15; + uint64_t x16; + uint8_t x17; + uint8_t x18; + uint8_t x19; + uint64_t x20; + uint8_t x21; + uint64_t x22; + uint8_t x23; + uint64_t x24; + uint8_t x25; + uint64_t x26; + uint8_t x27; + uint64_t x28; + uint8_t x29; + uint64_t x30; + uint8_t x31; + uint8_t x32; + uint8_t x33; + uint64_t x34; + uint8_t x35; + uint64_t x36; + uint8_t x37; + uint64_t x38; + uint8_t x39; + uint64_t x40; + uint8_t x41; + uint64_t x42; + uint8_t x43; + uint64_t x44; + uint8_t x45; + uint8_t x46; + uint8_t x47; + uint64_t x48; + uint8_t x49; + uint64_t x50; + uint8_t x51; + uint64_t x52; + uint8_t x53; + uint64_t x54; + uint8_t x55; + uint64_t x56; + uint8_t x57; + uint64_t x58; + uint8_t x59; + uint8_t x60; + x1 = (arg1[3]); + x2 = (arg1[2]); + x3 = (arg1[1]); + x4 = (arg1[0]); + x5 = (uint8_t)(x4 & UINT8_C(0xff)); + x6 = (x4 >> 8); + x7 = (uint8_t)(x6 & UINT8_C(0xff)); + x8 = (x6 >> 8); + x9 = (uint8_t)(x8 & UINT8_C(0xff)); + x10 = (x8 >> 8); + x11 = (uint8_t)(x10 & UINT8_C(0xff)); + x12 = (x10 >> 8); + x13 = (uint8_t)(x12 & UINT8_C(0xff)); + x14 = (x12 >> 8); + x15 = (uint8_t)(x14 & UINT8_C(0xff)); + x16 = (x14 >> 8); + x17 = (uint8_t)(x16 & UINT8_C(0xff)); + x18 = (uint8_t)(x16 >> 8); + x19 = (uint8_t)(x3 & UINT8_C(0xff)); + x20 = (x3 >> 8); + x21 = (uint8_t)(x20 & UINT8_C(0xff)); + x22 = (x20 >> 8); + x23 = (uint8_t)(x22 & UINT8_C(0xff)); + x24 = (x22 >> 8); + x25 = (uint8_t)(x24 & UINT8_C(0xff)); + x26 = (x24 >> 8); + x27 = (uint8_t)(x26 & UINT8_C(0xff)); + x28 = (x26 >> 8); + x29 = (uint8_t)(x28 & UINT8_C(0xff)); + x30 = (x28 >> 8); + x31 = (uint8_t)(x30 & UINT8_C(0xff)); + x32 = (uint8_t)(x30 >> 8); + x33 = (uint8_t)(x2 & UINT8_C(0xff)); + x34 = (x2 >> 8); + x35 = (uint8_t)(x34 & UINT8_C(0xff)); + x36 = (x34 >> 8); + x37 = (uint8_t)(x36 & UINT8_C(0xff)); + x38 = (x36 >> 8); + x39 = (uint8_t)(x38 & UINT8_C(0xff)); + x40 = (x38 >> 8); + x41 = (uint8_t)(x40 & UINT8_C(0xff)); + x42 = (x40 >> 8); + x43 = (uint8_t)(x42 & UINT8_C(0xff)); + x44 = (x42 >> 8); + x45 = (uint8_t)(x44 & UINT8_C(0xff)); + x46 = (uint8_t)(x44 >> 8); + x47 = (uint8_t)(x1 & UINT8_C(0xff)); + x48 = (x1 >> 8); + x49 = (uint8_t)(x48 & UINT8_C(0xff)); + x50 = (x48 >> 8); + x51 = (uint8_t)(x50 & UINT8_C(0xff)); + x52 = (x50 >> 8); + x53 = (uint8_t)(x52 & UINT8_C(0xff)); + x54 = (x52 >> 8); + x55 = (uint8_t)(x54 & UINT8_C(0xff)); + x56 = (x54 >> 8); + x57 = (uint8_t)(x56 & UINT8_C(0xff)); + x58 = (x56 >> 8); + x59 = (uint8_t)(x58 & UINT8_C(0xff)); + x60 = (uint8_t)(x58 >> 8); + out1[0] = x5; + out1[1] = x7; + out1[2] = x9; + out1[3] = x11; + out1[4] = x13; + out1[5] = x15; + out1[6] = x17; + out1[7] = x18; + out1[8] = x19; + out1[9] = x21; + out1[10] = x23; + out1[11] = x25; + out1[12] = x27; + out1[13] = x29; + out1[14] = x31; + out1[15] = x32; + out1[16] = x33; + out1[17] = x35; + out1[18] = x37; + out1[19] = x39; + out1[20] = x41; + out1[21] = x43; + out1[22] = x45; + out1[23] = x46; + out1[24] = x47; + out1[25] = x49; + out1[26] = x51; + out1[27] = x53; + out1[28] = x55; + out1[29] = x57; + out1[30] = x59; + out1[31] = x60; +} + +/* + * The function fiat_p256_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order. + * + * Preconditions: + * 0 ≤ bytes_eval arg1 < m + * Postconditions: + * eval out1 mod m = bytes_eval arg1 mod m + * 0 ≤ eval out1 < m + * + * Input Bounds: + * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]] + * Output Bounds: + * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_from_bytes(uint64_t out1[4], const uint8_t arg1[32]) { + uint64_t x1; + uint64_t x2; + uint64_t x3; + uint64_t x4; + uint64_t x5; + uint64_t x6; + uint64_t x7; + uint8_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + uint64_t x13; + uint64_t x14; + uint64_t x15; + uint8_t x16; + uint64_t x17; + uint64_t x18; + uint64_t x19; + uint64_t x20; + uint64_t x21; + uint64_t x22; + uint64_t x23; + uint8_t x24; + uint64_t x25; + uint64_t x26; + uint64_t x27; + uint64_t x28; + uint64_t x29; + uint64_t x30; + uint64_t x31; + uint8_t x32; + uint64_t x33; + uint64_t x34; + uint64_t x35; + uint64_t x36; + uint64_t x37; + uint64_t x38; + uint64_t x39; + uint64_t x40; + uint64_t x41; + uint64_t x42; + uint64_t x43; + uint64_t x44; + uint64_t x45; + uint64_t x46; + uint64_t x47; + uint64_t x48; + uint64_t x49; + uint64_t x50; + uint64_t x51; + uint64_t x52; + uint64_t x53; + uint64_t x54; + uint64_t x55; + uint64_t x56; + uint64_t x57; + uint64_t x58; + uint64_t x59; + uint64_t x60; + x1 = ((uint64_t)(arg1[31]) << 56); + x2 = ((uint64_t)(arg1[30]) << 48); + x3 = ((uint64_t)(arg1[29]) << 40); + x4 = ((uint64_t)(arg1[28]) << 32); + x5 = ((uint64_t)(arg1[27]) << 24); + x6 = ((uint64_t)(arg1[26]) << 16); + x7 = ((uint64_t)(arg1[25]) << 8); + x8 = (arg1[24]); + x9 = ((uint64_t)(arg1[23]) << 56); + x10 = ((uint64_t)(arg1[22]) << 48); + x11 = ((uint64_t)(arg1[21]) << 40); + x12 = ((uint64_t)(arg1[20]) << 32); + x13 = ((uint64_t)(arg1[19]) << 24); + x14 = ((uint64_t)(arg1[18]) << 16); + x15 = ((uint64_t)(arg1[17]) << 8); + x16 = (arg1[16]); + x17 = ((uint64_t)(arg1[15]) << 56); + x18 = ((uint64_t)(arg1[14]) << 48); + x19 = ((uint64_t)(arg1[13]) << 40); + x20 = ((uint64_t)(arg1[12]) << 32); + x21 = ((uint64_t)(arg1[11]) << 24); + x22 = ((uint64_t)(arg1[10]) << 16); + x23 = ((uint64_t)(arg1[9]) << 8); + x24 = (arg1[8]); + x25 = ((uint64_t)(arg1[7]) << 56); + x26 = ((uint64_t)(arg1[6]) << 48); + x27 = ((uint64_t)(arg1[5]) << 40); + x28 = ((uint64_t)(arg1[4]) << 32); + x29 = ((uint64_t)(arg1[3]) << 24); + x30 = ((uint64_t)(arg1[2]) << 16); + x31 = ((uint64_t)(arg1[1]) << 8); + x32 = (arg1[0]); + x33 = (x31 + (uint64_t)x32); + x34 = (x30 + x33); + x35 = (x29 + x34); + x36 = (x28 + x35); + x37 = (x27 + x36); + x38 = (x26 + x37); + x39 = (x25 + x38); + x40 = (x23 + (uint64_t)x24); + x41 = (x22 + x40); + x42 = (x21 + x41); + x43 = (x20 + x42); + x44 = (x19 + x43); + x45 = (x18 + x44); + x46 = (x17 + x45); + x47 = (x15 + (uint64_t)x16); + x48 = (x14 + x47); + x49 = (x13 + x48); + x50 = (x12 + x49); + x51 = (x11 + x50); + x52 = (x10 + x51); + x53 = (x9 + x52); + x54 = (x7 + (uint64_t)x8); + x55 = (x6 + x54); + x56 = (x5 + x55); + x57 = (x4 + x56); + x58 = (x3 + x57); + x59 = (x2 + x58); + x60 = (x1 + x59); + out1[0] = x39; + out1[1] = x46; + out1[2] = x53; + out1[3] = x60; +} + +/* + * The function fiat_p256_set_one returns the field element one in the Montgomery domain. + * + * Postconditions: + * eval (from_montgomery out1) mod m = 1 mod m + * 0 ≤ eval out1 < m + * + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_set_one(fiat_p256_montgomery_domain_field_element out1) { + out1[0] = 0x1; + out1[1] = UINT64_C(0xffffffff00000000); + out1[2] = UINT64_C(0xffffffffffffffff); + out1[3] = UINT32_C(0xfffffffe); +} + +/* + * The function fiat_p256_msat returns the saturated representation of the prime modulus. + * + * Postconditions: + * twos_complement_eval out1 = m + * 0 ≤ eval out1 < m + * + * Output Bounds: + * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_msat(uint64_t out1[5]) { + out1[0] = UINT64_C(0xffffffffffffffff); + out1[1] = UINT32_C(0xffffffff); + out1[2] = 0x0; + out1[3] = UINT64_C(0xffffffff00000001); + out1[4] = 0x0; +} + +/* + * The function fiat_p256_divstep computes a divstep. + * + * Preconditions: + * 0 ≤ eval arg4 < m + * 0 ≤ eval arg5 < m + * Postconditions: + * out1 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then 1 - arg1 else 1 + arg1) + * twos_complement_eval out2 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then twos_complement_eval arg3 else twos_complement_eval arg2) + * twos_complement_eval out3 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then ⌊(twos_complement_eval arg3 - twos_complement_eval arg2) / 2⌋ else ⌊(twos_complement_eval arg3 + (twos_complement_eval arg3 mod 2) * twos_complement_eval arg2) / 2⌋) + * eval (from_montgomery out4) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (2 * eval (from_montgomery arg5)) mod m else (2 * eval (from_montgomery arg4)) mod m) + * eval (from_montgomery out5) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (eval (from_montgomery arg4) - eval (from_montgomery arg4)) mod m else (eval (from_montgomery arg5) + (twos_complement_eval arg3 mod 2) * eval (from_montgomery arg4)) mod m) + * 0 ≤ eval out5 < m + * 0 ≤ eval out5 < m + * 0 ≤ eval out2 < m + * 0 ≤ eval out3 < m + * + * Input Bounds: + * arg1: [0x0 ~> 0xffffffffffffffff] + * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * arg4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * arg5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * Output Bounds: + * out1: [0x0 ~> 0xffffffffffffffff] + * out2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * out3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * out4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + * out5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_divstep(uint64_t* out1, uint64_t out2[5], uint64_t out3[5], uint64_t out4[4], uint64_t out5[4], uint64_t arg1, const uint64_t arg2[5], const uint64_t arg3[5], const uint64_t arg4[4], const uint64_t arg5[4]) { + uint64_t x1; + fiat_p256_uint1 x2; + fiat_p256_uint1 x3; + uint64_t x4; + fiat_p256_uint1 x5; + uint64_t x6; + uint64_t x7; + uint64_t x8; + uint64_t x9; + uint64_t x10; + uint64_t x11; + uint64_t x12; + fiat_p256_uint1 x13; + uint64_t x14; + fiat_p256_uint1 x15; + uint64_t x16; + fiat_p256_uint1 x17; + uint64_t x18; + fiat_p256_uint1 x19; + uint64_t x20; + fiat_p256_uint1 x21; + uint64_t x22; + uint64_t x23; + uint64_t x24; + uint64_t x25; + uint64_t x26; + uint64_t x27; + uint64_t x28; + uint64_t x29; + uint64_t x30; + uint64_t x31; + fiat_p256_uint1 x32; + uint64_t x33; + fiat_p256_uint1 x34; + uint64_t x35; + fiat_p256_uint1 x36; + uint64_t x37; + fiat_p256_uint1 x38; + uint64_t x39; + fiat_p256_uint1 x40; + uint64_t x41; + fiat_p256_uint1 x42; + uint64_t x43; + fiat_p256_uint1 x44; + uint64_t x45; + fiat_p256_uint1 x46; + uint64_t x47; + fiat_p256_uint1 x48; + uint64_t x49; + uint64_t x50; + uint64_t x51; + uint64_t x52; + uint64_t x53; + fiat_p256_uint1 x54; + uint64_t x55; + fiat_p256_uint1 x56; + uint64_t x57; + fiat_p256_uint1 x58; + uint64_t x59; + fiat_p256_uint1 x60; + uint64_t x61; + uint64_t x62; + fiat_p256_uint1 x63; + uint64_t x64; + fiat_p256_uint1 x65; + uint64_t x66; + fiat_p256_uint1 x67; + uint64_t x68; + fiat_p256_uint1 x69; + uint64_t x70; + uint64_t x71; + uint64_t x72; + uint64_t x73; + fiat_p256_uint1 x74; + uint64_t x75; + uint64_t x76; + uint64_t x77; + uint64_t x78; + uint64_t x79; + uint64_t x80; + fiat_p256_uint1 x81; + uint64_t x82; + fiat_p256_uint1 x83; + uint64_t x84; + fiat_p256_uint1 x85; + uint64_t x86; + fiat_p256_uint1 x87; + uint64_t x88; + fiat_p256_uint1 x89; + uint64_t x90; + uint64_t x91; + uint64_t x92; + uint64_t x93; + uint64_t x94; + fiat_p256_uint1 x95; + uint64_t x96; + fiat_p256_uint1 x97; + uint64_t x98; + fiat_p256_uint1 x99; + uint64_t x100; + fiat_p256_uint1 x101; + uint64_t x102; + fiat_p256_uint1 x103; + uint64_t x104; + fiat_p256_uint1 x105; + uint64_t x106; + fiat_p256_uint1 x107; + uint64_t x108; + fiat_p256_uint1 x109; + uint64_t x110; + fiat_p256_uint1 x111; + uint64_t x112; + fiat_p256_uint1 x113; + uint64_t x114; + uint64_t x115; + uint64_t x116; + uint64_t x117; + uint64_t x118; + uint64_t x119; + uint64_t x120; + uint64_t x121; + uint64_t x122; + uint64_t x123; + uint64_t x124; + uint64_t x125; + uint64_t x126; + fiat_p256_addcarryx_u64(&x1, &x2, 0x0, (~arg1), 0x1); + x3 = (fiat_p256_uint1)((fiat_p256_uint1)(x1 >> 63) & (fiat_p256_uint1)((arg3[0]) & 0x1)); + fiat_p256_addcarryx_u64(&x4, &x5, 0x0, (~arg1), 0x1); + fiat_p256_cmovznz_u64(&x6, x3, arg1, x4); + fiat_p256_cmovznz_u64(&x7, x3, (arg2[0]), (arg3[0])); + fiat_p256_cmovznz_u64(&x8, x3, (arg2[1]), (arg3[1])); + fiat_p256_cmovznz_u64(&x9, x3, (arg2[2]), (arg3[2])); + fiat_p256_cmovznz_u64(&x10, x3, (arg2[3]), (arg3[3])); + fiat_p256_cmovznz_u64(&x11, x3, (arg2[4]), (arg3[4])); + fiat_p256_addcarryx_u64(&x12, &x13, 0x0, 0x1, (~(arg2[0]))); + fiat_p256_addcarryx_u64(&x14, &x15, x13, 0x0, (~(arg2[1]))); + fiat_p256_addcarryx_u64(&x16, &x17, x15, 0x0, (~(arg2[2]))); + fiat_p256_addcarryx_u64(&x18, &x19, x17, 0x0, (~(arg2[3]))); + fiat_p256_addcarryx_u64(&x20, &x21, x19, 0x0, (~(arg2[4]))); + fiat_p256_cmovznz_u64(&x22, x3, (arg3[0]), x12); + fiat_p256_cmovznz_u64(&x23, x3, (arg3[1]), x14); + fiat_p256_cmovznz_u64(&x24, x3, (arg3[2]), x16); + fiat_p256_cmovznz_u64(&x25, x3, (arg3[3]), x18); + fiat_p256_cmovznz_u64(&x26, x3, (arg3[4]), x20); + fiat_p256_cmovznz_u64(&x27, x3, (arg4[0]), (arg5[0])); + fiat_p256_cmovznz_u64(&x28, x3, (arg4[1]), (arg5[1])); + fiat_p256_cmovznz_u64(&x29, x3, (arg4[2]), (arg5[2])); + fiat_p256_cmovznz_u64(&x30, x3, (arg4[3]), (arg5[3])); + fiat_p256_addcarryx_u64(&x31, &x32, 0x0, x27, x27); + fiat_p256_addcarryx_u64(&x33, &x34, x32, x28, x28); + fiat_p256_addcarryx_u64(&x35, &x36, x34, x29, x29); + fiat_p256_addcarryx_u64(&x37, &x38, x36, x30, x30); + fiat_p256_subborrowx_u64(&x39, &x40, 0x0, x31, UINT64_C(0xffffffffffffffff)); + fiat_p256_subborrowx_u64(&x41, &x42, x40, x33, UINT32_C(0xffffffff)); + fiat_p256_subborrowx_u64(&x43, &x44, x42, x35, 0x0); + fiat_p256_subborrowx_u64(&x45, &x46, x44, x37, UINT64_C(0xffffffff00000001)); + fiat_p256_subborrowx_u64(&x47, &x48, x46, x38, 0x0); + x49 = (arg4[3]); + x50 = (arg4[2]); + x51 = (arg4[1]); + x52 = (arg4[0]); + fiat_p256_subborrowx_u64(&x53, &x54, 0x0, 0x0, x52); + fiat_p256_subborrowx_u64(&x55, &x56, x54, 0x0, x51); + fiat_p256_subborrowx_u64(&x57, &x58, x56, 0x0, x50); + fiat_p256_subborrowx_u64(&x59, &x60, x58, 0x0, x49); + fiat_p256_cmovznz_u64(&x61, x60, 0x0, UINT64_C(0xffffffffffffffff)); + fiat_p256_addcarryx_u64(&x62, &x63, 0x0, x53, x61); + fiat_p256_addcarryx_u64(&x64, &x65, x63, x55, (x61 & UINT32_C(0xffffffff))); + fiat_p256_addcarryx_u64(&x66, &x67, x65, x57, 0x0); + fiat_p256_addcarryx_u64(&x68, &x69, x67, x59, (x61 & UINT64_C(0xffffffff00000001))); + fiat_p256_cmovznz_u64(&x70, x3, (arg5[0]), x62); + fiat_p256_cmovznz_u64(&x71, x3, (arg5[1]), x64); + fiat_p256_cmovznz_u64(&x72, x3, (arg5[2]), x66); + fiat_p256_cmovznz_u64(&x73, x3, (arg5[3]), x68); + x74 = (fiat_p256_uint1)(x22 & 0x1); + fiat_p256_cmovznz_u64(&x75, x74, 0x0, x7); + fiat_p256_cmovznz_u64(&x76, x74, 0x0, x8); + fiat_p256_cmovznz_u64(&x77, x74, 0x0, x9); + fiat_p256_cmovznz_u64(&x78, x74, 0x0, x10); + fiat_p256_cmovznz_u64(&x79, x74, 0x0, x11); + fiat_p256_addcarryx_u64(&x80, &x81, 0x0, x22, x75); + fiat_p256_addcarryx_u64(&x82, &x83, x81, x23, x76); + fiat_p256_addcarryx_u64(&x84, &x85, x83, x24, x77); + fiat_p256_addcarryx_u64(&x86, &x87, x85, x25, x78); + fiat_p256_addcarryx_u64(&x88, &x89, x87, x26, x79); + fiat_p256_cmovznz_u64(&x90, x74, 0x0, x27); + fiat_p256_cmovznz_u64(&x91, x74, 0x0, x28); + fiat_p256_cmovznz_u64(&x92, x74, 0x0, x29); + fiat_p256_cmovznz_u64(&x93, x74, 0x0, x30); + fiat_p256_addcarryx_u64(&x94, &x95, 0x0, x70, x90); + fiat_p256_addcarryx_u64(&x96, &x97, x95, x71, x91); + fiat_p256_addcarryx_u64(&x98, &x99, x97, x72, x92); + fiat_p256_addcarryx_u64(&x100, &x101, x99, x73, x93); + fiat_p256_subborrowx_u64(&x102, &x103, 0x0, x94, UINT64_C(0xffffffffffffffff)); + fiat_p256_subborrowx_u64(&x104, &x105, x103, x96, UINT32_C(0xffffffff)); + fiat_p256_subborrowx_u64(&x106, &x107, x105, x98, 0x0); + fiat_p256_subborrowx_u64(&x108, &x109, x107, x100, UINT64_C(0xffffffff00000001)); + fiat_p256_subborrowx_u64(&x110, &x111, x109, x101, 0x0); + fiat_p256_addcarryx_u64(&x112, &x113, 0x0, x6, 0x1); + x114 = ((x80 >> 1) | ((x82 << 63) & UINT64_C(0xffffffffffffffff))); + x115 = ((x82 >> 1) | ((x84 << 63) & UINT64_C(0xffffffffffffffff))); + x116 = ((x84 >> 1) | ((x86 << 63) & UINT64_C(0xffffffffffffffff))); + x117 = ((x86 >> 1) | ((x88 << 63) & UINT64_C(0xffffffffffffffff))); + x118 = ((x88 & UINT64_C(0x8000000000000000)) | (x88 >> 1)); + fiat_p256_cmovznz_u64(&x119, x48, x39, x31); + fiat_p256_cmovznz_u64(&x120, x48, x41, x33); + fiat_p256_cmovznz_u64(&x121, x48, x43, x35); + fiat_p256_cmovznz_u64(&x122, x48, x45, x37); + fiat_p256_cmovznz_u64(&x123, x111, x102, x94); + fiat_p256_cmovznz_u64(&x124, x111, x104, x96); + fiat_p256_cmovznz_u64(&x125, x111, x106, x98); + fiat_p256_cmovznz_u64(&x126, x111, x108, x100); + *out1 = x112; + out2[0] = x7; + out2[1] = x8; + out2[2] = x9; + out2[3] = x10; + out2[4] = x11; + out3[0] = x114; + out3[1] = x115; + out3[2] = x116; + out3[3] = x117; + out3[4] = x118; + out4[0] = x119; + out4[1] = x120; + out4[2] = x121; + out4[3] = x122; + out5[0] = x123; + out5[1] = x124; + out5[2] = x125; + out5[3] = x126; +} + +/* + * The function fiat_p256_divstep_precomp returns the precomputed value for Bernstein-Yang-inversion (in montgomery form). + * + * Postconditions: + * eval (from_montgomery out1) = ⌊(m - 1) / 2⌋^(if ⌊log2 m⌋ + 1 < 46 then ⌊(49 * (⌊log2 m⌋ + 1) + 80) / 17⌋ else ⌊(49 * (⌊log2 m⌋ + 1) + 57) / 17⌋) + * 0 ≤ eval out1 < m + * + * Output Bounds: + * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] + */ +static FIAT_P256_FIAT_INLINE void fiat_p256_divstep_precomp(uint64_t out1[4]) { + out1[0] = UINT64_C(0x67ffffffb8000000); + out1[1] = UINT64_C(0xc000000038000000); + out1[2] = UINT64_C(0xd80000007fffffff); + out1[3] = UINT64_C(0x2fffffffffffffff); +} diff --git a/third_party/boringssl/src/tool/CMakeLists.txt b/third_party/boringssl/src/tool/CMakeLists.txt index f98e96e371ee..5047108898a6 100644 --- a/third_party/boringssl/src/tool/CMakeLists.txt +++ b/third_party/boringssl/src/tool/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../include) - add_executable( bssl @@ -21,21 +19,5 @@ add_executable( tool.cc 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() +install_if_enabled(TARGETS bssl DESTINATION ${INSTALL_DESTINATION_DEFAULT}) +target_link_libraries(bssl ssl crypto) diff --git a/third_party/boringssl/src/tool/speed.cc b/third_party/boringssl/src/tool/speed.cc index c12ebb2555c3..794bed7ff2c9 100644 --- a/third_party/boringssl/src/tool/speed.cc +++ b/third_party/boringssl/src/tool/speed.cc @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -28,15 +29,17 @@ #include #include #include -#include +#include #include +#include #include -#include #include -#include #include +#include +#include #include #include +#include #include #include #include @@ -66,17 +69,18 @@ static bool g_print_json = false; // TimeResults represents the results of benchmarking a function. struct TimeResults { // num_calls is the number of function calls done in the time period. - unsigned num_calls; + uint64_t num_calls; // us is the number of microseconds that elapsed in the time period. - unsigned us; + uint64_t us; void Print(const std::string &description) const { if (g_print_json) { PrintJSON(description); } else { - printf("Did %u %s operations in %uus (%.1f ops/sec)\n", num_calls, - description.c_str(), us, - (static_cast(num_calls) / us) * 1000000); + printf( + "Did %" PRIu64 " %s operations in %" PRIu64 "us (%.1f ops/sec)\n", + num_calls, description.c_str(), us, + (static_cast(num_calls) / static_cast(us)) * 1000000); } } @@ -85,10 +89,13 @@ struct TimeResults { if (g_print_json) { PrintJSON(description, bytes_per_call); } else { - printf("Did %u %s operations in %uus (%.1f ops/sec): %.1f MB/s\n", - num_calls, description.c_str(), us, - (static_cast(num_calls) / us) * 1000000, - static_cast(bytes_per_call * num_calls) / us); + printf( + "Did %" PRIu64 " %s operations in %" PRIu64 + "us (%.1f ops/sec): %.1f MB/s\n", + num_calls, description.c_str(), us, + (static_cast(num_calls) / static_cast(us)) * 1000000, + static_cast(bytes_per_call * num_calls) / + static_cast(us)); } } @@ -99,7 +106,8 @@ struct TimeResults { puts(","); } - printf("{\"description\": \"%s\", \"numCalls\": %u, \"microseconds\": %u", + printf("{\"description\": \"%s\", \"numCalls\": %" PRIu64 + ", \"microseconds\": %" PRIu64, description.c_str(), num_calls, us); if (bytes_per_call > 0) { @@ -151,13 +159,13 @@ static bool TimeFunction(TimeResults *results, std::function func) { // for. const uint64_t total_us = g_timeout_seconds * 1000000; uint64_t start = time_now(), now, delta; - unsigned done = 0, iterations_between_time_checks; if (!func()) { return false; } now = time_now(); delta = now - start; + unsigned iterations_between_time_checks; if (delta == 0) { iterations_between_time_checks = 250; } else { @@ -171,6 +179,7 @@ static bool TimeFunction(TimeResults *results, std::function func) { } } + uint64_t done = 0; for (;;) { for (unsigned i = 0; i < iterations_between_time_checks; i++) { if (!func()) { @@ -204,7 +213,7 @@ static bool SpeedRSA(const std::string &selected) { {"RSA 4096", kDERRSAPrivate4096, kDERRSAPrivate4096Len}, }; - for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(kRSAKeys); i++) { + for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kRSAKeys); i++) { const std::string name = kRSAKeys[i].name; bssl::UniquePtr key( @@ -301,9 +310,9 @@ static bool SpeedRSAKeyGen(const std::string &selected) { const std::vector kSizes = {2048, 3072, 4096}; for (int size : kSizes) { const uint64_t start = time_now(); - unsigned num_calls = 0; - unsigned us; - std::vector durations; + uint64_t num_calls = 0; + uint64_t us; + std::vector durations; for (;;) { bssl::UniquePtr rsa(RSA_new()); @@ -336,18 +345,13 @@ static bool SpeedRSAKeyGen(const std::string &selected) { // Distribution information is useful, but doesn't fit into the standard // format used by |g_print_json|. if (!g_print_json) { - // |min| and |max| must be stored in temporary variables to avoid an MSVC - // bug on x86. There, size_t is a typedef for unsigned, but MSVC's printf - // warning tries to retain the distinction and suggest %zu for size_t - // instead of %u. It gets confused if std::vector and - // std::vector are both instantiated. Being typedefs, the two - // instantiations are identical, which somehow breaks the size_t vs - // unsigned metadata. - unsigned min = durations[0]; - unsigned median = n & 1 ? durations[n / 2] + uint64_t min = durations[0]; + uint64_t median = n & 1 ? durations[n / 2] : (durations[n / 2 - 1] + durations[n / 2]) / 2; - unsigned max = durations[n - 1]; - printf(" min: %uus, median: %uus, max: %uus\n", min, median, max); + uint64_t max = durations[n - 1]; + printf(" min: %" PRIu64 "us, median: %" PRIu64 "us, max: %" PRIu64 + "us\n", + min, median, max); } } @@ -954,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; @@ -966,24 +1019,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_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 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_sha512_sswu_draft07( - group, &out, kLabel, sizeof(kLabel), input, sizeof(input)); + 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-512_SSWU_RO_"); + 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; @@ -1060,13 +1127,9 @@ static bool SpeedSipHash(const std::string &selected) { } static TRUST_TOKEN_PRETOKEN *trust_token_pretoken_dup( - TRUST_TOKEN_PRETOKEN *in) { - TRUST_TOKEN_PRETOKEN *out = - (TRUST_TOKEN_PRETOKEN *)OPENSSL_malloc(sizeof(TRUST_TOKEN_PRETOKEN)); - if (out) { - OPENSSL_memcpy(out, in, sizeof(TRUST_TOKEN_PRETOKEN)); - } - return out; + const TRUST_TOKEN_PRETOKEN *in) { + return static_cast( + OPENSSL_memdup(in, sizeof(TRUST_TOKEN_PRETOKEN))); } static bool SpeedTrustToken(std::string name, const TRUST_TOKEN_METHOD *method, @@ -1241,17 +1304,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; @@ -1261,38 +1321,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; } @@ -1445,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/third_party/boringssl/src/tool/transport_common.cc b/third_party/boringssl/src/tool/transport_common.cc index 991c808a236d..e889688565c9 100644 --- a/third_party/boringssl/src/tool/transport_common.cc +++ b/third_party/boringssl/src/tool/transport_common.cc @@ -843,7 +843,7 @@ class SocketLineReader { } if (i == 0) { - *out_code = code; + *out_code = static_cast(code); } else if (code != *out_code) { fprintf(stderr, "Reply code varied within a single reply: was %u, now %u\n", diff --git a/third_party/boringssl/src/util/BUILD.toplevel b/third_party/boringssl/src/util/BUILD.toplevel index 1ec2bdf183cc..206786442400 100644 --- a/third_party/boringssl/src/util/BUILD.toplevel +++ b/third_party/boringssl/src/util/BUILD.toplevel @@ -18,11 +18,7 @@ load( "crypto_headers", "crypto_internal_headers", "crypto_sources", - "crypto_sources_apple_aarch64", - "crypto_sources_apple_x86_64", - "crypto_sources_linux_aarch64", - "crypto_sources_linux_ppc64le", - "crypto_sources_linux_x86_64", + "crypto_sources_asm", "fips_fragments", "ssl_headers", "ssl_internal_headers", @@ -35,47 +31,47 @@ licenses(["notice"]) exports_files(["LICENSE"]) -config_setting( - name = "linux_aarch64", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:aarch64", - ], -) - -config_setting( - name = "linux_x86_64", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:x86_64", - ], -) - -config_setting( - name = "linux_ppc64le", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:ppc", - ], -) - -config_setting( - name = "macos_aarch64", - constraint_values = [ - "@platforms//os:macos", - "@platforms//cpu:aarch64", - ], -) - -config_setting( - name = "macos_x86_64", - constraint_values = [ - "@platforms//os:macos", - "@platforms//cpu:x86_64", - ], -) +# 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", @@ -90,78 +86,59 @@ posix_copts = [ "-Wshadow", "-fno-common", ] - -linux_copts = posix_copts + [ - # This is needed on Linux systems (at least) to get rwlock in pthread, but - # it should not be set on Apple platforms, where it instead disables APIs - # we use. See compat(5) and sys/cdefs.h. - "-D_XOPEN_SOURCE=700", -] - -boringssl_copts = select({ - "@platforms//os:linux": linux_copts, - "@platforms//os:macos": posix_copts, - "@platforms//os:windows": ["-DWIN32_LEAN_AND_MEAN"], - "//conditions:default": [], -}) - -# These selects must be kept in sync. -crypto_sources_asm = select({ - ":linux_aarch64": crypto_sources_linux_aarch64, - ":linux_ppc64le": crypto_sources_linux_ppc64le, - ":linux_x86_64": crypto_sources_linux_x86_64, - ":macos_aarch64": crypto_sources_apple_aarch64, - ":macos_x86_64": crypto_sources_apple_x86_64, - "//conditions:default": [], -}) -boringssl_copts += select({ - ":linux_aarch64": [], - ":linux_ppc64le": [], - ":linux_x86_64": [], - ":macos_aarch64": [], - ":macos_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:macos": 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:macos": posix_copts_cxx, +boringssl_copts = [ + "-DBORINGSSL_IMPLEMENTATION", +] + 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"], linkopts = select({ - # Android supports pthreads, but does not provide a libpthread - # to link against. - "@platforms//os:android": [], - "@platforms//os:macos": [], "@platforms//os:windows": ["-defaultlib:advapi32.lib"], - "//conditions:default": ["-lpthread"], + "//conditions:default": ["-pthread"], }), visibility = ["//visibility:public"], ) diff --git a/third_party/boringssl/src/util/WORKSPACE.toplevel b/third_party/boringssl/src/util/WORKSPACE.toplevel new file mode 100644 index 000000000000..58f81bba0ee8 --- /dev/null +++ b/third_party/boringssl/src/util/WORKSPACE.toplevel @@ -0,0 +1 @@ +workspace(name = "boringssl") diff --git a/third_party/boringssl/src/util/all_tests.go b/third_party/boringssl/src/util/all_tests.go index 4f484f353c28..c0dceba55ea9 100644 --- a/third_party/boringssl/src/util/all_tests.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/ar/ar.go b/third_party/boringssl/src/util/ar/ar.go index 756caf53d8d7..fdc2dd2b18b5 100644 --- a/third_party/boringssl/src/util/ar/ar.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/ar/ar_test.go b/third_party/boringssl/src/util/ar/ar_test.go index ef37d795d22b..31baaf162172 100644 --- a/third_party/boringssl/src/util/ar/ar_test.go +++ b/third_party/boringssl/src/util/ar/ar_test.go @@ -10,14 +10,13 @@ // 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 import ( "bytes" "flag" - "io/ioutil" "os" "path/filepath" "testing" @@ -52,7 +51,7 @@ var arTests = []arTest{ "linux", "libsample.a", map[string]string{ - "foo.c.o": "foo.c.o", + "foo.c.o": "foo.c.o", "bar.cc.o": "bar.cc.o", }, false, @@ -61,7 +60,7 @@ var arTests = []arTest{ "mac", "libsample.a", map[string]string{ - "foo.c.o": "foo.c.o", + "foo.c.o": "foo.c.o", "bar.cc.o": "bar.cc.o", }, true, @@ -70,7 +69,7 @@ var arTests = []arTest{ "windows", "sample.lib", map[string]string{ - "CMakeFiles\\sample.dir\\foo.c.obj": "foo.c.obj", + "CMakeFiles\\sample.dir\\foo.c.obj": "foo.c.obj", "CMakeFiles\\sample.dir\\bar.cc.obj": "bar.cc.obj", }, false, @@ -92,7 +91,7 @@ func TestAR(t *testing.T) { } for file, contentsPath := range test.out { - expected, err := ioutil.ReadFile(test.Path(contentsPath)) + expected, err := os.ReadFile(test.Path(contentsPath)) if err != nil { t.Fatalf("error reading %s: %s", contentsPath, err) } diff --git a/third_party/boringssl/src/util/bot/DEPS b/third_party/boringssl/src/util/bot/DEPS index 1efc55a459af..46d86e3cc0fe 100644 --- a/third_party/boringssl/src/util/bot/DEPS +++ b/third_party/boringssl/src/util/bot/DEPS @@ -25,17 +25,20 @@ vars = { # cipd describe PACKAGE_NAME -version latest # infra/3pp/tools/cmake/linux-amd64 - 'cmake_version': 'version:2@3.23.1', + 'cmake_version': 'version:2@3.25.2.chromium.6', # infra/3pp/tools/go/linux-amd64 - 'go_version': 'version:2@1.18.2', + '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 - 'android_sdk_platform-tools_version': 'g7n_-r6yJd_SGRklujGB1wEt8iyr77FZTUJVS9w6O34C', + 'android_sdk_platform-tools_version': 'RSI3iwryh7URLGRgJHsCvUxj092woTPnKt4pwFcJ6L8C', 'android_ndk_revision': '8388a2be5421311dc75c5f937aae13d821a27f3d', 'libfuzzer_revision': 'debe7d2d1982e540fbd6bd78604bf001753f9e74', - 'libcxx_revision': '79a2e924d96e2fc1e4b937c42efd08898fa472d7', - 'libcxxabi_revision': '9b8228b4a9be26e0881f36089d9a8d62df851acc', + 'libcxx_revision': '7f648d9b44c2876dfc4329256a6c0750e1e77c7f', + 'libcxxabi_revision': 'b74d7716111d7eda5c03cb8f5dfc940e1c2c0030', + 'ninja_version': 'version:2@1.11.1.chromium.6', } deps = { @@ -53,45 +56,31 @@ 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': { + 'boringssl/util/bot/golang': { 'packages': [{ - 'package': 'infra/3pp/tools/cmake/${{platform}}', - 'version': Var('cmake_version'), + 'package': 'infra/3pp/tools/go/${{platform}}', + 'version': Var('go_version'), }], - 'condition': 'host_os == "mac"', 'dep_type': 'cipd', }, - 'boringssl/util/bot/cmake-win32': { + 'boringssl/util/bot/perl-win32': { 'packages': [{ - 'package': 'infra/3pp/tools/cmake/${{platform}}', - 'version': Var('cmake_version'), + 'package': 'infra/3pp/tools/perl/${{platform}}', + 'version': Var('perl_version'), }], 'condition': 'host_os == "win"', 'dep_type': 'cipd', }, - 'boringssl/util/bot/golang': { - 'packages': [{ - 'package': 'infra/3pp/tools/go/${{platform}}', - 'version': Var('go_version'), - }], - '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', @@ -105,6 +94,14 @@ deps = { 'url': Var('chromium_git') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + Var('libcxxabi_revision'), 'condition': 'checkout_libcxx', }, + + 'boringssl/util/bot/ninja': { + 'packages': [{ + 'package': 'infra/3pp/tools/ninja/${{platform}}', + 'version': Var('ninja_version'), + }], + 'dep_type': 'cipd', + } } recursedeps = [ @@ -113,30 +110,6 @@ recursedeps = [ ] hooks = [ - # TODO(https://crbug.com/1180257): Use CIPD for CMake on Windows. - { - '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/third_party/boringssl/src/util/bot/UPDATING b/third_party/boringssl/src/util/bot/UPDATING index 1543ed66f249..bbe27c754c24 100644 --- a/third_party/boringssl/src/util/bot/UPDATING +++ b/third_party/boringssl/src/util/bot/UPDATING @@ -26,20 +26,11 @@ update, place the updated files in their intended location and run: nasm-win32.exe: Update to the appropriate release of NASM, found at https://www.nasm.us/. Use the same version as Chromium, found at - https://chromium.googlesource.com/chromium/src/+/main/third_party/nasm/README.chromium + https://chromium.googlesource.com/chromium/deps/nasm/+/refs/heads/main/README.chromium Extract nasm.exe from the download named nasm-VERSION-win64.zip. The current revision is nasm-2.13.03-win64.zip. - TODO(davidben): The Chromium link currently does not work. It will get - filled in in the future. See https://crbug.com/766721. - -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, @@ -47,6 +38,6 @@ but upload it with the following command. (Note the bucket is different.) upload_to_google_storage.py -b chrome-boringssl-sde sde-linux64.tar.xz sde-win32.tar.xz -The current revision is sde-external-9.0.0-2021-11-07-*.tar.xz. +The current revision is sde-external-9.14.0-2022-10-25-*.tar.xz. When adding new files, remember to update .gitignore. diff --git a/third_party/boringssl/src/util/bot/perl-win32.zip.sha1 b/third_party/boringssl/src/util/bot/perl-win32.zip.sha1 deleted file mode 100644 index ac0c3f00d8aa..000000000000 --- a/third_party/boringssl/src/util/bot/perl-win32.zip.sha1 +++ /dev/null @@ -1 +0,0 @@ -10a112b4d5f4efbbba4e45ccbe1fa50943e106c6 \ No newline at end of file diff --git a/third_party/boringssl/src/util/bot/sde-linux64.tar.xz.sha1 b/third_party/boringssl/src/util/bot/sde-linux64.tar.xz.sha1 index f9ee198358cb..96d3a0dff07a 100644 --- a/third_party/boringssl/src/util/bot/sde-linux64.tar.xz.sha1 +++ b/third_party/boringssl/src/util/bot/sde-linux64.tar.xz.sha1 @@ -1 +1 @@ -8bba6e01a47b2cfd9e7429f77256db540031ff43 \ No newline at end of file +78e7af6ae04e807282d45828ca3c7d12f4eb1d91 \ No newline at end of file diff --git a/third_party/boringssl/src/util/bot/sde-win32.tar.xz.sha1 b/third_party/boringssl/src/util/bot/sde-win32.tar.xz.sha1 index dbaf87fd098c..18553e83f5b4 100644 --- a/third_party/boringssl/src/util/bot/sde-win32.tar.xz.sha1 +++ b/third_party/boringssl/src/util/bot/sde-win32.tar.xz.sha1 @@ -1 +1 @@ -59ef225031e14e5ac257ada61d416f6ea0c9c080 \ No newline at end of file +8d3b079358b548a930046fabb6124c943e1d48fb \ No newline at end of file diff --git a/third_party/boringssl/src/util/bot/update_clang.py b/third_party/boringssl/src/util/bot/update_clang.py index 59b0cad926ee..92ff3ac6003f 100644 --- a/third_party/boringssl/src/util/bot/update_clang.py +++ b/third_party/boringssl/src/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-15-init-10168-gc2a7904a' -CLANG_SUB_REVISION = 2 +CLANG_REVISION = 'llvmorg-16-init-17653-g39da55e8' +CLANG_SUB_REVISION = 3 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION) @@ -94,7 +94,7 @@ def DownloadAndUnpack(url, output_dir): DownloadUrl(url, f) f.seek(0) EnsureDirExists(output_dir) - tarfile.open(mode='r:gz', fileobj=f).extractall(path=output_dir) + tarfile.open(mode='r:*', fileobj=f).extractall(path=output_dir) def ReadStampFile(path=STAMP_FILE): @@ -133,7 +133,7 @@ def CopyFile(src, dst): def UpdateClang(): - cds_file = "clang-%s.tgz" % PACKAGE_VERSION + cds_file = "clang-%s.tar.xz" % PACKAGE_VERSION if sys.platform == 'win32' or sys.platform == 'cygwin': cds_full_url = CDS_URL + '/Win/' + cds_file elif sys.platform.startswith('linux'): diff --git a/third_party/boringssl/src/util/bot/vs_toolchain.py b/third_party/boringssl/src/util/bot/vs_toolchain.py index df4637fb6e14..9e19e22b363f 100644 --- a/third_party/boringssl/src/util/bot/vs_toolchain.py +++ b/third_party/boringssl/src/util/bot/vs_toolchain.py @@ -68,9 +68,12 @@ 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'] + 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) diff --git a/third_party/boringssl/src/util/check_filenames.go b/third_party/boringssl/src/util/check_filenames.go index 886c3f609114..384c19f5100b 100644 --- a/third_party/boringssl/src/util/check_filenames.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/check_imported_libraries.go b/third_party/boringssl/src/util/check_imported_libraries.go index 187e51441fee..f3803f1c1d9b 100644 --- a/third_party/boringssl/src/util/check_imported_libraries.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/check_stack.go b/third_party/boringssl/src/util/check_stack.go new file mode 100644 index 000000000000..ad763e6529f5 --- /dev/null +++ b/third_party/boringssl/src/util/check_stack.go @@ -0,0 +1,47 @@ +// 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. + +//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 + +import ( + "debug/elf" + "fmt" + "os" +) + +func checkStack(path string) { + file, err := elf.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, "Error opening %s: %s\n", path, err) + os.Exit(1) + } + defer file.Close() + + for _, prog := range file.Progs { + if prog.Type == elf.PT_GNU_STACK && prog.Flags&elf.PF_X != 0 { + fmt.Fprintf(os.Stderr, "%s has an executable stack.\n", path) + os.Exit(1) + } + } +} + +func main() { + for _, path := range os.Args[1:] { + checkStack(path) + } +} diff --git a/third_party/boringssl/src/util/compare_benchmarks.go b/third_party/boringssl/src/util/compare_benchmarks.go index fd7fdfb38e92..05e1b5db0d7f 100644 --- a/third_party/boringssl/src/util/compare_benchmarks.go +++ b/third_party/boringssl/src/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. @@ -20,7 +22,6 @@ import ( "encoding/json" "flag" "fmt" - "io/ioutil" "os" ) @@ -63,7 +64,7 @@ func printResult(result Result, baseline *Result) error { } func readResults(path string) ([]Result, error) { - data, err := ioutil.ReadFile(path) + data, err := os.ReadFile(path) if err != nil { return nil, err } diff --git a/third_party/boringssl/src/util/convert_comments.go b/third_party/boringssl/src/util/convert_comments.go index afd070f70be3..df9e3d3ae353 100644 --- a/third_party/boringssl/src/util/convert_comments.go +++ b/third_party/boringssl/src/util/convert_comments.go @@ -12,12 +12,13 @@ // 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 ( "bytes" "fmt" - "io/ioutil" "os" "strings" ) @@ -270,11 +271,11 @@ func convertComments(path string, in []byte) []byte { func main() { for _, arg := range os.Args[1:] { - in, err := ioutil.ReadFile(arg) + in, err := os.ReadFile(arg) if err != nil { panic(err) } - if err := ioutil.WriteFile(arg, convertComments(arg, in), 0666); err != nil { + if err := os.WriteFile(arg, convertComments(arg, in), 0666); err != nil { panic(err) } } diff --git a/third_party/boringssl/src/util/convert_wycheproof.go b/third_party/boringssl/src/util/convert_wycheproof/convert_wycheproof.go similarity index 90% rename from third_party/boringssl/src/util/convert_wycheproof.go rename to third_party/boringssl/src/util/convert_wycheproof/convert_wycheproof.go index 0e9f81b5addf..88a908d85dc2 100644 --- a/third_party/boringssl/src/util/convert_wycheproof.go +++ b/third_party/boringssl/src/util/convert_wycheproof/convert_wycheproof.go @@ -1,26 +1,27 @@ -/* 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. -// convert_wycheproof.go converts Wycheproof test vectors into a format more -// easily consumed by BoringSSL. +//go:build ignore + +// convert_wycheproof converts Wycheproof test vectors into a format more easily +// consumed by BoringSSL. package main import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "sort" "strings" @@ -122,7 +123,7 @@ func printComment(w io.Writer, in string) error { } func convertWycheproof(f io.Writer, jsonPath string) error { - jsonData, err := ioutil.ReadFile(jsonPath) + jsonData, err := os.ReadFile(jsonPath) if err != nil { return err } diff --git a/third_party/boringssl/src/util/diff_asm.go b/third_party/boringssl/src/util/diff_asm.go index 710a42cb692e..5ac1c04bbd8f 100644 --- a/third_party/boringssl/src/util/diff_asm.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/doc.config b/third_party/boringssl/src/util/doc.config index 8de5f1decf55..d6ae92585080 100644 --- a/third_party/boringssl/src/util/doc.config +++ b/third_party/boringssl/src/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", @@ -54,7 +55,8 @@ },{ "Name": "Legacy ASN.1 and X.509 implementation (documentation in progress)", "Headers": [ - "include/openssl/asn1.h" + "include/openssl/asn1.h", + "include/openssl/time.h" ] },{ "Name": "SSL implementation", diff --git a/third_party/boringssl/src/util/doc.go b/third_party/boringssl/src/util/doc.go index 651998eec6a2..4fb73ca0dcec 100644 --- a/third_party/boringssl/src/util/doc.go +++ b/third_party/boringssl/src/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 ( @@ -14,7 +15,6 @@ import ( "flag" "fmt" "html/template" - "io/ioutil" "os" "path/filepath" "regexp" @@ -414,7 +414,7 @@ func (config *Config) parseHeader(path string) (*HeaderFile, error) { break } if line == cppGuard { - return nil, fmt.Errorf("hit ending C++ guard while in section on line %d", lineNo) + return nil, fmt.Errorf("hit ending C++ guard while in section on line %d (possibly missing two empty lines ahead of guard?)", lineNo) } var comment []string @@ -746,11 +746,11 @@ func generateIndex(outPath string, config *Config, headerDescriptions map[string } func copyFile(outPath string, inFilePath string) error { - bytes, err := ioutil.ReadFile(inFilePath) + bytes, err := os.ReadFile(inFilePath) if err != nil { return err } - return ioutil.WriteFile(filepath.Join(outPath, filepath.Base(inFilePath)), bytes, 0666) + return os.WriteFile(filepath.Join(outPath, filepath.Base(inFilePath)), bytes, 0666) } func main() { @@ -772,7 +772,7 @@ func main() { os.Exit(1) } - configBytes, err := ioutil.ReadFile(*configFlag) + configBytes, err := os.ReadFile(*configFlag) if err != nil { fmt.Printf("Failed to open config file: %s\n", err) os.Exit(1) diff --git a/third_party/boringssl/src/util/embed_test_data.go b/third_party/boringssl/src/util/embed_test_data.go index 9fd7de1ef042..ae7135fae451 100644 --- a/third_party/boringssl/src/util/embed_test_data.go +++ b/third_party/boringssl/src/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. @@ -20,7 +22,6 @@ import ( "bytes" "flag" "fmt" - "io/ioutil" "os" "strings" ) @@ -77,7 +78,7 @@ func main() { var files []string if len(*fileList) != 0 { - data, err := ioutil.ReadFile(*fileList) + data, err := os.ReadFile(*fileList) if err != nil { fmt.Fprintf(os.Stderr, "Error reading %s: %s.\n", *fileList, err) os.Exit(1) @@ -127,7 +128,7 @@ func main() { const chunkSize = 8192 for i, arg := range files { - data, err := ioutil.ReadFile(arg) + data, err := os.ReadFile(arg) if err != nil { fmt.Fprintf(os.Stderr, "Error reading %s: %s.\n", arg, err) os.Exit(1) diff --git a/third_party/boringssl/src/util/fetch_ech_config_list.go b/third_party/boringssl/src/util/fetch_ech_config_list.go index badaae293f2c..732d0d3b8a8c 100644 --- a/third_party/boringssl/src/util/fetch_ech_config_list.go +++ b/third_party/boringssl/src/util/fetch_ech_config_list.go @@ -12,13 +12,14 @@ // 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 ( "errors" "flag" "fmt" - "io/ioutil" "log" "net" "os" @@ -379,7 +380,7 @@ func main() { } outFile := path.Join(*outDir, fmt.Sprintf("ech-config-list-%d", echConfigListCount)) - if err = ioutil.WriteFile(outFile, record.ech, 0644); err != nil { + if err = os.WriteFile(outFile, record.ech, 0644); err != nil { log.Printf("Failed to write file: %s\n", err) os.Exit(1) } diff --git a/third_party/boringssl/src/util/fipstools/CMakeLists.txt b/third_party/boringssl/src/util/fipstools/CMakeLists.txt index 63593838dba4..87abf0ab1c43 100644 --- a/third_party/boringssl/src/util/fipstools/CMakeLists.txt +++ b/third_party/boringssl/src/util/fipstools/CMakeLists.txt @@ -1,12 +1,8 @@ -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/third_party/boringssl/src/util/fipstools/acvp/ACVP.md b/third_party/boringssl/src/util/fipstools/acvp/ACVP.md index ba5bdbb26bb4..1fd919f68d43 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/ACVP.md +++ b/third_party/boringssl/src/util/fipstools/acvp/ACVP.md @@ -77,6 +77,8 @@ The other commands are as follows. (Note that you only need to implement the com | ECDSA/sigVer | Curve name, hash name, message, X, Y, R, S | Single-byte validity flag | | FFDH | p, q, g, peer public key, local private key (or empty), local public key (or empty) | Local public key, shared key | | HKDF/<HASH> | key, salt, info, num output bytes | Key | +| HKDFExtract | secret, salt | Key | +| HKDFExpandLabel | Output length, secret, label, transcript hash | Key | | HMAC-SHA-1 | Value to hash, key | Digest | | HMAC-SHA2-224 | Value to hash, key | Digest | | HMAC-SHA2-256 | Value to hash, key | Digest | @@ -104,7 +106,7 @@ The other commands are as follows. (Note that you only need to implement the com | SHA2-384/MCT | Initial seed¹ | Digest | | SHA2-512/MCT | Initial seed¹ | Digest | | SHA2-512/256/MCT | Initial seed¹ | Digest | -| TLSKDF/<1.0\|1.2>/<HASH> | Number output bytes, secret, label, seed1, seed2 | Output | +| TLSKDF/1.2/<HASH> | Number output bytes, secret, label, seed1, seed2 | Output | ¹ The iterated tests would result in excessive numbers of round trips if the module wrapper handled only basic operations. Thus some ACVP logic is pushed down for these tests so that the inner loop can be handled locally. Either read the NIST documentation ([block-ciphers](https://pages.nist.gov/ACVP/draft-celi-acvp-symmetric.html#name-monte-carlo-tests-for-block) [hashes](https://pages.nist.gov/ACVP/draft-celi-acvp-sha.html#name-monte-carlo-tests-for-sha-1)) to understand the iteration count and return values or, probably more fruitfully, see how these functions are handled in the `modulewrapper` directory. @@ -249,6 +251,12 @@ The current list of objects is: ### Running test sessions -In online mode, a given algorithm can be run by using the `-run` option. For example, `-run SHA2-256`. This will fetch a vector set, have the module-under-test answer it, and upload the answer. If you want to just fetch the vector set for later use with the `-json` option (documented above) then you can use `-fetch` instead of `-run`. +In online mode, a given algorithm can be run by using the `-run` option. For example, `-run SHA2-256`. This will fetch a vector set, have the module-under-test answer it, and upload the answer. If you want to just fetch the vector set for later use with the `-json` option (documented above) then you can use `-fetch` instead of `-run`. The `-fetch` option also supports passing `-expected-out ` to fetch and write the expected results, if the server supports that. -The tool doesn't currently support the sorts of operations that a lab would need, like uploading results from a file. +After results have been produced with `-json`, they can be uploaded with `-upload`. So `-run` is effectively these three steps combined: + +``` +./acvptool -fetch SHA2-256 > request +./acvptool -json request > result +./acvptool -upload result +``` diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp.go index 4c7e07c1daa3..c294eb8de55f 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp.go +++ b/third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp.go @@ -28,7 +28,7 @@ import ( "errors" "flag" "fmt" - "io/ioutil" + "io" "log" "net/http" neturl "net/url" @@ -42,12 +42,14 @@ import ( ) var ( - dumpRegcap = flag.Bool("regcap", false, "Print module capabilities JSON to stdout") - configFilename = flag.String("config", "config.json", "Location of the configuration JSON file") - jsonInputFile = flag.String("json", "", "Location of a vector-set input file") - runFlag = flag.String("run", "", "Name of primitive to run tests for") - fetchFlag = flag.String("fetch", "", "Name of primitive to fetch vectors for") - wrapperPath = flag.String("wrapper", "../../../../build/util/fipstools/acvp/modulewrapper/modulewrapper", "Path to the wrapper binary") + dumpRegcap = flag.Bool("regcap", false, "Print module capabilities JSON to stdout") + configFilename = flag.String("config", "config.json", "Location of the configuration JSON file") + jsonInputFile = flag.String("json", "", "Location of a vector-set input file") + uploadInputFile = flag.String("upload", "", "Location of a JSON results file to upload") + runFlag = flag.String("run", "", "Name of primitive to run tests for") + fetchFlag = flag.String("fetch", "", "Name of primitive to fetch vectors for") + expectedOutFlag = flag.String("expected-out", "", "Name of a file to write the expected results to") + wrapperPath = flag.String("wrapper", "../../../../build/util/fipstools/acvp/modulewrapper/modulewrapper", "Path to the wrapper binary") ) type Config struct { @@ -155,7 +157,7 @@ func loadCachedSessionTokens(server *acvp.Server, cachePath string) error { continue } path := filepath.Join(cachePath, name) - contents, err := ioutil.ReadFile(path) + contents, err := os.ReadFile(path) if err != nil { return fmt.Errorf("Failed to read session token cache entry %q: %s", path, err) } @@ -178,12 +180,12 @@ func trimLeadingSlash(s string) string { return s } -// looksLikeHeaderElement returns true iff element looks like it's a header, not -// a test. Some ACVP files contain a header as the first element that should be -// duplicated into the response, and some don't. If the element contains -// a "url" field, or if it's missing an "algorithm" field, then we guess that -// it's a header. -func looksLikeHeaderElement(element json.RawMessage) bool { +// looksLikeVectorSetHeader returns true iff element looks like it's a +// vectorSetHeader, not a test. Some ACVP files contain a header as the first +// element that should be duplicated into the response, and some don't. If the +// element contains a "url" field, or if it's missing an "algorithm" field, +// then we guess that it's a header. +func looksLikeVectorSetHeader(element json.RawMessage) bool { var headerFields struct { URL string `json:"url"` Algorithm string `json:"algorithm"` @@ -197,7 +199,7 @@ func looksLikeHeaderElement(element json.RawMessage) bool { // processFile reads a file containing vector sets, at least in the format // preferred by our lab, and writes the results to stdout. func processFile(filename string, supportedAlgos []map[string]interface{}, middle Middle) error { - jsonBytes, err := ioutil.ReadFile(filename) + jsonBytes, err := os.ReadFile(filename) if err != nil { return err } @@ -213,7 +215,7 @@ func processFile(filename string, supportedAlgos []map[string]interface{}, middl } var header json.RawMessage - if looksLikeHeaderElement(elements[0]) { + if looksLikeVectorSetHeader(elements[0]) { header, elements = elements[0], elements[1:] if len(elements) == 0 { return errors.New("JSON input is empty") @@ -268,6 +270,7 @@ func processFile(filename string, supportedAlgos []map[string]interface{}, middl group := map[string]interface{}{ "vsId": commonFields.ID, "testGroups": replyGroups, + "algorithm": algo, } replyBytes, err := json.MarshalIndent(group, "", " ") if err != nil { @@ -286,12 +289,269 @@ func processFile(filename string, supportedAlgos []map[string]interface{}, middl return nil } +// getVectorsWithRetry fetches the given url from the server and parses it as a +// set of vectors. Any server requested retry is handled. +func getVectorsWithRetry(server *acvp.Server, url string) (out acvp.Vectors, vectorsBytes []byte, err error) { + for { + if vectorsBytes, err = server.GetBytes(url); err != nil { + return out, nil, err + } + + var vectors acvp.Vectors + if err := json.Unmarshal(vectorsBytes, &vectors); err != nil { + return out, nil, err + } + + retry := vectors.Retry + if retry == 0 { + return vectors, vectorsBytes, nil + } + + log.Printf("Server requested %d seconds delay", retry) + if retry > 10 { + retry = 10 + } + time.Sleep(time.Duration(retry) * time.Second) + } +} + +func uploadResult(server *acvp.Server, setURL string, resultData []byte) error { + resultSize := uint64(len(resultData)) + 32 /* for framing overhead */ + if server.SizeLimit == 0 || resultSize < server.SizeLimit { + log.Printf("Result size %d bytes", resultSize) + return server.Post(nil, trimLeadingSlash(setURL)+"/results", resultData) + } + + // The NIST ACVP server no longer requires the large-upload process, + // suggesting that this may no longer be needed. + log.Printf("Result is %d bytes, too much given server limit of %d bytes. Using large-upload process.", resultSize, server.SizeLimit) + largeRequestBytes, err := json.Marshal(acvp.LargeUploadRequest{ + Size: resultSize, + URL: setURL, + }) + if err != nil { + return errors.New("failed to marshal large-upload request: " + err.Error()) + } + + var largeResponse acvp.LargeUploadResponse + if err := server.Post(&largeResponse, "/large", largeRequestBytes); err != nil { + return errors.New("failed to request large-upload endpoint: " + err.Error()) + } + + log.Printf("Directed to large-upload endpoint at %q", largeResponse.URL) + req, err := http.NewRequest("POST", largeResponse.URL, bytes.NewBuffer(resultData)) + if err != nil { + return errors.New("failed to create POST request: " + err.Error()) + } + token := largeResponse.AccessToken + if len(token) == 0 { + token = server.AccessToken + } + req.Header.Add("Authorization", "Bearer "+token) + req.Header.Add("Content-Type", "application/json") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return errors.New("failed writing large upload: " + err.Error()) + } + resp.Body.Close() + if resp.StatusCode != 200 { + return fmt.Errorf("large upload resulted in status code %d", resp.StatusCode) + } + + return nil +} + +func connect(config *Config, sessionTokensCacheDir string) (*acvp.Server, error) { + if len(config.TOTPSecret) == 0 { + return nil, errors.New("config file missing TOTPSecret") + } + totpSecret, err := base64.StdEncoding.DecodeString(config.TOTPSecret) + if err != nil { + return nil, fmt.Errorf("failed to base64-decode TOTP secret from config file: %s. (Note that the secret _itself_ should be in the config, not the name of a file that contains it.)", err) + } + + if len(config.CertPEMFile) == 0 { + return nil, errors.New("config file missing CertPEMFile") + } + certPEM, err := os.ReadFile(config.CertPEMFile) + if err != nil { + return nil, fmt.Errorf("failed to read certificate from %q: %s", config.CertPEMFile, err) + } + block, _ := pem.Decode(certPEM) + certDER := block.Bytes + + if len(config.PrivateKeyDERFile) == 0 && len(config.PrivateKeyFile) == 0 { + return nil, errors.New("config file missing PrivateKeyDERFile and PrivateKeyFile") + } + if len(config.PrivateKeyDERFile) != 0 && len(config.PrivateKeyFile) != 0 { + return nil, errors.New("config file has both PrivateKeyDERFile and PrivateKeyFile. Can only have one.") + } + privateKeyFile := config.PrivateKeyDERFile + if len(config.PrivateKeyFile) > 0 { + privateKeyFile = config.PrivateKeyFile + } + + keyBytes, err := os.ReadFile(privateKeyFile) + if err != nil { + return nil, fmt.Errorf("failed to read private key from %q: %s", privateKeyFile, err) + } + + var keyDER []byte + pemBlock, _ := pem.Decode(keyBytes) + if pemBlock != nil { + keyDER = pemBlock.Bytes + } else { + keyDER = keyBytes + } + + var certKey crypto.PrivateKey + if certKey, err = x509.ParsePKCS1PrivateKey(keyDER); err != nil { + if certKey, err = x509.ParsePKCS8PrivateKey(keyDER); err != nil { + return nil, fmt.Errorf("failed to parse private key from %q: %s", privateKeyFile, err) + } + } + + serverURL := "https://demo.acvts.nist.gov/" + if len(config.ACVPServer) > 0 { + serverURL = config.ACVPServer + } + server := acvp.NewServer(serverURL, config.LogFile, [][]byte{certDER}, certKey, func() string { + return TOTP(totpSecret[:]) + }) + + if len(sessionTokensCacheDir) > 0 { + if err := loadCachedSessionTokens(server, sessionTokensCacheDir); err != nil { + return nil, err + } + } + + return server, nil +} + +func getResultsWithRetry(server *acvp.Server, url string) (bool, error) { +FetchResults: + for { + var results acvp.SessionResults + if err := server.Get(&results, trimLeadingSlash(url)+"/results"); err != nil { + return false, errors.New("failed to fetch session results: " + err.Error()) + } + + if results.Passed { + log.Print("Test passed") + return true, nil + } + + for _, result := range results.Results { + if result.Status == "incomplete" { + log.Print("Server hasn't finished processing results. Waiting 10 seconds.") + time.Sleep(10 * time.Second) + continue FetchResults + } + } + + log.Printf("Server did not accept results: %#v", results) + return false, nil + } +} + +// vectorSetHeader is the first element in the array of JSON elements that makes +// up the on-disk format for a vector set. +type vectorSetHeader struct { + URL string `json:"url,omitempty"` + VectorSetURLs []string `json:"vectorSetUrls,omitempty"` + Time string `json:"time,omitempty"` +} + +func uploadFromFile(file string, config *Config, sessionTokensCacheDir string) { + if len(*jsonInputFile) > 0 { + log.Fatalf("-upload cannot be used with -json") + } + if len(*runFlag) > 0 { + log.Fatalf("-upload cannot be used with -run") + } + if len(*fetchFlag) > 0 { + log.Fatalf("-upload cannot be used with -fetch") + } + if len(*expectedOutFlag) > 0 { + log.Fatalf("-upload cannot be used with -expected-out") + } + if *dumpRegcap { + log.Fatalf("-upload cannot be used with -regcap") + } + + in, err := os.Open(file) + if err != nil { + log.Fatalf("Cannot open input: %s", err) + } + defer in.Close() + + decoder := json.NewDecoder(in) + + var input []json.RawMessage + if err := decoder.Decode(&input); err != nil { + log.Fatalf("Failed to parse input: %s", err) + } + + if len(input) < 2 { + log.Fatalf("Input JSON has fewer than two elements") + } + + var header vectorSetHeader + if err := json.Unmarshal(input[0], &header); err != nil { + log.Fatalf("Failed to parse input header: %s", err) + } + + if numGroups := len(input) - 1; numGroups != len(header.VectorSetURLs) { + log.Fatalf("have %d URLs from header, but only %d result groups", len(header.VectorSetURLs), numGroups) + } + + server, err := connect(config, sessionTokensCacheDir) + if err != nil { + log.Fatal(err) + } + + for i, url := range header.VectorSetURLs { + log.Printf("Uploading result for %q", url) + if err := uploadResult(server, url, input[i+1]); err != nil { + log.Fatalf("Failed to upload: %s", err) + } + } + + if ok, err := getResultsWithRetry(server, header.URL); err != nil { + log.Fatal(err) + } else if !ok { + os.Exit(1) + } +} + func main() { flag.Parse() - var err error - var middle Middle - middle, err = subprocess.New(*wrapperPath) + var config Config + if err := jsonFromFile(&config, *configFilename); err != nil { + log.Fatalf("Failed to load config file: %s", err) + } + + var sessionTokensCacheDir string + if len(config.SessionTokensCache) > 0 { + sessionTokensCacheDir = config.SessionTokensCache + if strings.HasPrefix(sessionTokensCacheDir, "~/") { + home := os.Getenv("HOME") + if len(home) == 0 { + log.Fatal("~ used in config file but $HOME not set") + } + sessionTokensCacheDir = filepath.Join(home, sessionTokensCacheDir[2:]) + } + } + + if len(*uploadInputFile) > 0 { + uploadFromFile(*uploadInputFile, &config, sessionTokensCacheDir) + return + } + + middle, err := subprocess.New(*wrapperPath) if err != nil { log.Fatalf("failed to initialise middle: %s", err) } @@ -342,68 +602,32 @@ func main() { os.Exit(0) } - var config Config - if err := jsonFromFile(&config, *configFilename); err != nil { - log.Fatalf("Failed to load config file: %s", err) - } - - if len(config.TOTPSecret) == 0 { - log.Fatal("Config file missing TOTPSecret") - } - totpSecret, err := base64.StdEncoding.DecodeString(config.TOTPSecret) - if err != nil { - log.Fatalf("Failed to base64-decode TOTP secret from config file: %s. (Note that the secret _itself_ should be in the config, not the name of a file that contains it.)", err) - } - - if len(config.CertPEMFile) == 0 { - log.Fatal("Config file missing CertPEMFile") - } - certPEM, err := ioutil.ReadFile(config.CertPEMFile) - if err != nil { - log.Fatalf("failed to read certificate from %q: %s", config.CertPEMFile, err) - } - block, _ := pem.Decode(certPEM) - certDER := block.Bytes - - if len(config.PrivateKeyDERFile) == 0 && len(config.PrivateKeyFile) == 0 { - log.Fatal("Config file missing PrivateKeyDERFile and PrivateKeyFile") - } - if len(config.PrivateKeyDERFile) != 0 && len(config.PrivateKeyFile) != 0 { - log.Fatal("Config file has both PrivateKeyDERFile and PrivateKeyFile. Can only have one.") - } - privateKeyFile := config.PrivateKeyDERFile - if len(config.PrivateKeyFile) > 0 { - privateKeyFile = config.PrivateKeyFile - } - - keyBytes, err := ioutil.ReadFile(privateKeyFile) - if err != nil { - log.Fatalf("failed to read private key from %q: %s", privateKeyFile, err) - } - - var keyDER []byte - pemBlock, _ := pem.Decode(keyBytes) - if pemBlock != nil { - keyDER = pemBlock.Bytes - } else { - keyDER = keyBytes - } - - var certKey crypto.PrivateKey - if certKey, err = x509.ParsePKCS1PrivateKey(keyDER); err != nil { - if certKey, err = x509.ParsePKCS8PrivateKey(keyDER); err != nil { - log.Fatalf("failed to parse private key from %q: %s", privateKeyFile, err) - } - } - var requestedAlgosFlag string + // The output file to which expected results are written, if requested. + var expectedOut *os.File + // A tee that outputs to both stdout (for vectors) and the file for + // expected results, if any. + var fetchOutputTee io.Writer + if len(*runFlag) > 0 && len(*fetchFlag) > 0 { log.Fatalf("cannot specify both -run and -fetch") } + if len(*expectedOutFlag) > 0 && len(*fetchFlag) == 0 { + log.Fatalf("-expected-out can only be used with -fetch") + } if len(*runFlag) > 0 { requestedAlgosFlag = *runFlag } else { requestedAlgosFlag = *fetchFlag + if len(*expectedOutFlag) > 0 { + if expectedOut, err = os.Create(*expectedOutFlag); err != nil { + log.Fatalf("cannot open %q: %s", *expectedOutFlag, err) + } + fetchOutputTee = io.MultiWriter(os.Stdout, expectedOut) + defer expectedOut.Close() + } else { + fetchOutputTee = os.Stdout + } } runAlgos := make(map[string]bool) @@ -437,27 +661,9 @@ func main() { } } - if len(config.ACVPServer) == 0 { - config.ACVPServer = "https://demo.acvts.nist.gov/" - } - server := acvp.NewServer(config.ACVPServer, config.LogFile, [][]byte{certDER}, certKey, func() string { - return TOTP(totpSecret[:]) - }) - - var sessionTokensCacheDir string - if len(config.SessionTokensCache) > 0 { - sessionTokensCacheDir = config.SessionTokensCache - if strings.HasPrefix(sessionTokensCacheDir, "~/") { - home := os.Getenv("HOME") - if len(home) == 0 { - log.Fatal("~ used in config file but $HOME not set") - } - sessionTokensCacheDir = filepath.Join(home, sessionTokensCacheDir[2:]) - } - - if err := loadCachedSessionTokens(server, sessionTokensCacheDir); err != nil { - log.Fatal(err) - } + server, err := connect(&config, sessionTokensCacheDir) + if err != nil { + log.Fatal(err) } if err := server.Login(); err != nil { @@ -492,164 +698,97 @@ func main() { if token := result.AccessToken; len(token) > 0 { server.PrefixTokens[url] = token if len(sessionTokensCacheDir) > 0 { - ioutil.WriteFile(filepath.Join(sessionTokensCacheDir, neturl.PathEscape(url))+".token", []byte(token), 0600) + os.WriteFile(filepath.Join(sessionTokensCacheDir, neturl.PathEscape(url))+".token", []byte(token), 0600) } } log.Printf("Have vector sets %v", result.VectorSetURLs) if len(*fetchFlag) > 0 { - os.Stdout.WriteString("[\n") - json.NewEncoder(os.Stdout).Encode(map[string]interface{}{ - "url": url, - "vectorSetUrls": result.VectorSetURLs, - "time": time.Now().Format(time.RFC3339), + io.WriteString(fetchOutputTee, "[\n") + json.NewEncoder(fetchOutputTee).Encode(vectorSetHeader{ + URL: url, + VectorSetURLs: result.VectorSetURLs, + Time: time.Now().Format(time.RFC3339), }) } for _, setURL := range result.VectorSetURLs { - firstTime := true - for { - if firstTime { - log.Printf("Fetching test vectors %q", setURL) - firstTime = false - } + log.Printf("Fetching test vectors %q", setURL) - vectorsBytes, err := server.GetBytes(trimLeadingSlash(setURL)) - if err != nil { - log.Fatalf("Failed to fetch vector set %q: %s", setURL, err) - } - - var vectors acvp.Vectors - if err := json.Unmarshal(vectorsBytes, &vectors); err != nil { - log.Fatalf("Failed to parse vector set from %q: %s", setURL, err) - } + vectors, vectorsBytes, err := getVectorsWithRetry(server, trimLeadingSlash(setURL)) + if err != nil { + log.Fatalf("Failed to fetch vector set %q: %s", setURL, err) + } - if retry := vectors.Retry; retry > 0 { - log.Printf("Server requested %d seconds delay", retry) - if retry > 10 { - retry = 10 - } - time.Sleep(time.Duration(retry) * time.Second) - continue - } + if len(*fetchFlag) > 0 { + os.Stdout.WriteString(",\n") + os.Stdout.Write(vectorsBytes) + } - if len(*fetchFlag) > 0 { - os.Stdout.WriteString(",\n") - os.Stdout.Write(vectorsBytes) - break - } + if expectedOut != nil { + log.Printf("Fetching expected results") - replyGroups, err := middle.Process(vectors.Algo, vectorsBytes) + _, expectedResultsBytes, err := getVectorsWithRetry(server, trimLeadingSlash(setURL)+"/expected") if err != nil { - log.Printf("Failed: %s", err) - log.Printf("Deleting test set") - server.Delete(url) - os.Exit(1) + log.Fatalf("Failed to fetch expected results: %s", err) } - headerBytes, err := json.Marshal(acvp.Vectors{ - ID: vectors.ID, - Algo: vectors.Algo, - }) - if err != nil { - log.Printf("Failed to marshal result: %s", err) - log.Printf("Deleting test set") - server.Delete(url) - os.Exit(1) - } + expectedOut.WriteString(",") + expectedOut.Write(expectedResultsBytes) + } - var resultBuf bytes.Buffer - resultBuf.Write(headerBytes[:len(headerBytes)-1]) - resultBuf.WriteString(`,"testGroups":`) - replyBytes, err := json.Marshal(replyGroups) - if err != nil { - log.Printf("Failed to marshal result: %s", err) - log.Printf("Deleting test set") - server.Delete(url) - os.Exit(1) - } - resultBuf.Write(replyBytes) - resultBuf.WriteString("}") - - resultData := resultBuf.Bytes() - resultSize := uint64(len(resultData)) + 32 /* for framing overhead */ - if server.SizeLimit > 0 && resultSize >= server.SizeLimit { - // The NIST ACVP server no longer requires the large-upload process, - // suggesting that it may no longer be needed. - log.Printf("Result is %d bytes, too much given server limit of %d bytes. Using large-upload process.", resultSize, server.SizeLimit) - largeRequestBytes, err := json.Marshal(acvp.LargeUploadRequest{ - Size: resultSize, - URL: setURL, - }) - if err != nil { - log.Printf("Failed to marshal large-upload request: %s", err) - log.Printf("Deleting test set") - server.Delete(url) - os.Exit(1) - } + if len(*fetchFlag) > 0 { + continue + } - var largeResponse acvp.LargeUploadResponse - if err := server.Post(&largeResponse, "/large", largeRequestBytes); err != nil { - log.Fatalf("Failed to request large-upload endpoint: %s", err) - } + replyGroups, err := middle.Process(vectors.Algo, vectorsBytes) + if err != nil { + log.Printf("Failed: %s", err) + log.Printf("Deleting test set") + server.Delete(url) + os.Exit(1) + } - log.Printf("Directed to large-upload endpoint at %q", largeResponse.URL) - client := &http.Client{} - req, err := http.NewRequest("POST", largeResponse.URL, bytes.NewBuffer(resultData)) - if err != nil { - log.Fatalf("Failed to create POST request: %s", err) - } - token := largeResponse.AccessToken - if len(token) == 0 { - token = server.AccessToken - } - req.Header.Add("Authorization", "Bearer "+token) - req.Header.Add("Content-Type", "application/json") - resp, err := client.Do(req) - if err != nil { - log.Fatalf("Failed writing large upload: %s", err) - } - resp.Body.Close() - if resp.StatusCode != 200 { - log.Fatalf("Large upload resulted in status code %d", resp.StatusCode) - } - } else { - log.Printf("Result size %d bytes", resultSize) - if err := server.Post(nil, trimLeadingSlash(setURL)+"/results", resultData); err != nil { - log.Fatalf("Failed to upload results: %s\n", err) - } - } + headerBytes, err := json.Marshal(acvp.Vectors{ + ID: vectors.ID, + Algo: vectors.Algo, + }) + if err != nil { + log.Printf("Failed to marshal result: %s", err) + log.Printf("Deleting test set") + server.Delete(url) + os.Exit(1) + } + + var resultBuf bytes.Buffer + resultBuf.Write(headerBytes[:len(headerBytes)-1]) + resultBuf.WriteString(`,"testGroups":`) + replyBytes, err := json.Marshal(replyGroups) + if err != nil { + log.Printf("Failed to marshal result: %s", err) + log.Printf("Deleting test set") + server.Delete(url) + os.Exit(1) + } + resultBuf.Write(replyBytes) + resultBuf.WriteString("}") - break + if err := uploadResult(server, setURL, resultBuf.Bytes()); err != nil { + log.Printf("Deleting test set") + server.Delete(url) + log.Fatal(err) } } if len(*fetchFlag) > 0 { - os.Stdout.WriteString("]\n") + io.WriteString(fetchOutputTee, "]\n") os.Exit(0) } -FetchResults: - for { - var results acvp.SessionResults - if err := server.Get(&results, trimLeadingSlash(url)+"/results"); err != nil { - log.Fatalf("Failed to fetch session results: %s", err) - } - - if results.Passed { - log.Print("Test passed") - break - } - - for _, result := range results.Results { - if result.Status == "incomplete" { - log.Print("Server hasn't finished processing results. Waiting 10 seconds.") - time.Sleep(10 * time.Second) - continue FetchResults - } - } - - log.Fatalf("Server did not accept results: %#v", results) + if ok, err := getResultsWithRetry(server, url); err != nil { + log.Fatal(err) + } else if !ok { + os.Exit(1) } } diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp/acvp.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp/acvp.go index d70f98c71092..b5a01f0c3508 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp/acvp.go +++ b/third_party/boringssl/src/util/fipstools/acvp/acvptool/acvp/acvp.go @@ -23,7 +23,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net" "net/http" "net/url" @@ -168,12 +167,12 @@ func parseReplyToBytes(in io.Reader) ([]byte, error) { return nil, err } - buf, err := ioutil.ReadAll(decoder.Buffered()) + buf, err := io.ReadAll(decoder.Buffered()) if err != nil { return nil, err } - rest, err := ioutil.ReadAll(in) + rest, err := io.ReadAll(in) if err != nil { return nil, err } diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/interactive.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/interactive.go index ee992f1ed40d..384206cedc34 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/interactive.go +++ b/third_party/boringssl/src/util/fipstools/acvp/acvptool/interactive.go @@ -23,7 +23,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" neturl "net/url" "os" "os/exec" @@ -159,7 +158,7 @@ func (set ServerObjectSet) Action(action string, args []string) error { } set.env.server.PrefixTokens[url] = token if len(set.env.config.SessionTokensCache) > 0 { - ioutil.WriteFile(filepath.Join(set.env.config.SessionTokensCache, neturl.PathEscape(url))+".token", []byte(token), 0600) + os.WriteFile(filepath.Join(set.env.config.SessionTokensCache, neturl.PathEscape(url))+".token", []byte(token), 0600) } } } @@ -205,7 +204,7 @@ func (ServerObject) Search(condition acvp.Query) (Object, error) { } func edit(initialContents string) ([]byte, error) { - tmp, err := ioutil.TempFile("", "acvp*.json") + tmp, err := os.CreateTemp("", "acvp*.json") if err != nil { return nil, err } @@ -231,7 +230,7 @@ func edit(initialContents string) ([]byte, error) { return nil, err } - return ioutil.ReadFile(path) + return os.ReadFile(path) } func (obj ServerObject) Action(action string, args []string) error { diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/hkdf.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/hkdf.go index 21ebca6fb637..b124d790e72b 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/hkdf.go +++ b/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/hkdf.go @@ -19,11 +19,10 @@ import ( "encoding/hex" "encoding/json" "fmt" - "strings" ) // The following structures reflect the JSON of ACVP KAS KDF tests. See -// https://pages.nist.gov/ACVP/draft-hammett-acvp-kas-kdf-twostep.html +// https://pages.nist.gov/ACVP/draft-hammett-acvp-kas-kdf-hkdf.html type hkdfTestVectorSet struct { Groups []hkdfTestGroup `json:"testGroups"` @@ -46,33 +45,21 @@ type hkdfTest struct { type hkdfConfiguration struct { Type string `json:"kdfType"` - AdditionalNonce bool `json:"requiresAdditionalNoncePair"` OutputBits uint32 `json:"l"` + HashName string `json:"hmacAlg"` FixedInfoPattern string `json:"fixedInfoPattern"` FixedInputEncoding string `json:"fixedInfoEncoding"` - KDFMode string `json:"kdfMode"` - MACMode string `json:"macMode"` - CounterLocation string `json:"counterLocation"` - CounterBits uint `json:"counterLen"` } func (c *hkdfConfiguration) extract() (outBytes uint32, hashName string, err error) { - if c.Type != "twoStep" || - c.AdditionalNonce || + if c.Type != "hkdf" || c.FixedInfoPattern != "uPartyInfo||vPartyInfo" || c.FixedInputEncoding != "concatenation" || - c.KDFMode != "feedback" || - c.CounterLocation != "after fixed data" || - c.CounterBits != 8 || c.OutputBits%8 != 0 { - return 0, "", fmt.Errorf("KAS-KDF not configured for HKDF: %#v", c) + return 0, "", fmt.Errorf("KDA not configured for HKDF: %#v", c) } - if !strings.HasPrefix(c.MACMode, "HMAC-") { - return 0, "", fmt.Errorf("MAC mode %q does't start with 'HMAC-'", c.MACMode) - } - - return c.OutputBits / 8, c.MACMode[5:], nil + return c.OutputBits / 8, c.HashName, nil } type hkdfParameters struct { @@ -186,6 +173,9 @@ func (k *hkdf) Process(vectorSet []byte, m Transactable) (interface{}, error) { if err != nil { return nil, fmt.Errorf("HKDF operation failed: %s", err) } + if len(resp[0]) != int(outBytes) { + return nil, fmt.Errorf("HKDF operation resulted in %d bytes but wanted %d", len(resp[0]), outBytes) + } if isValidationTest { passed := bytes.Equal(expected, resp[0]) diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go index 158bae317ce4..84152cf9af6d 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go +++ b/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/subprocess.go @@ -106,10 +106,11 @@ func NewWithIO(cmd *exec.Cmd, in io.WriteCloser, out io.ReadCloser) *Subprocess "ctrDRBG": &drbg{"ctrDRBG", map[string]bool{"AES-128": true, "AES-192": true, "AES-256": true}}, "hmacDRBG": &drbg{"hmacDRBG", map[string]bool{"SHA-1": true, "SHA2-224": true, "SHA2-256": true, "SHA2-384": true, "SHA2-512": true}}, "KDF": &kdfPrimitive{}, - "KAS-KDF": &hkdf{}, + "KDA": &hkdf{}, + "TLS-v1.2": &tlsKDF{}, + "TLS-v1.3": &tls13{}, "CMAC-AES": &keyedMACPrimitive{"CMAC-AES"}, "RSA": &rsa{}, - "kdf-components": &tlsKDF{}, "KAS-ECC-SSC": &kas{}, "KAS-FFC-SSC": &kasDH{}, } diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/tls13.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/tls13.go new file mode 100644 index 000000000000..b8b6e51a5049 --- /dev/null +++ b/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/tls13.go @@ -0,0 +1,240 @@ +// 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. + +package subprocess + +import ( + "crypto/sha256" + "crypto/sha512" + "encoding/hex" + "encoding/json" + "fmt" +) + +// The following structures reflect the JSON of TLS 1.3 tests. See +// https://pages.nist.gov/ACVP/draft-hammett-acvp-kdf-tls-v1.3.html + +type tls13TestVectorSet struct { + Groups []tls13TestGroup `json:"testGroups"` +} + +type tls13TestGroup struct { + ID uint64 `json:"tgId"` + HashFunc string `json:"hmacAlg"` + Tests []tls13Test `json:"tests"` +} + +type tls13Test struct { + ID uint64 `json:"tcId"` + // Although ACVP refers to these as client and server randoms, these + // fields are misnamed and really contain portions of the handshake + // transcript. Concatenated in order, they give the transcript up to + // the named message. In case of HelloRetryRequest, ClientHelloHex + // includes up to the second ClientHello. + ClientHelloHex string `json:"helloClientRandom"` + ServerHelloHex string `json:"helloServerRandom"` + ServerFinishedHex string `json:"finishedServerRandom"` + ClientFinishedHex string `json:"finishedClientRandom"` + DHEInputHex string `json:"dhe"` + PSKInputHex string `json:"psk"` +} + +type tls13TestGroupResponse struct { + ID uint64 `json:"tgId"` + Tests []tls13TestResponse `json:"tests"` +} + +type tls13TestResponse struct { + ID uint64 `json:"tcId"` + ClientEarlyTrafficSecretHex string `json:"clientEarlyTrafficSecret"` + EarlyExporterMasterSecretHex string `json:"earlyExporterMasterSecret"` + ClientHandshakeTrafficSecretHex string `json:"clientHandshakeTrafficSecret"` + ServerHandshakeTrafficSecretHex string `json:"serverHandshakeTrafficSecret"` + ClientApplicationTrafficSecretHex string `json:"clientApplicationTrafficSecret"` + ServerApplicationTrafficSecretHex string `json:"serverApplicationTrafficSecret"` + ExporterMasterSecretHex string `json:"exporterMasterSecret"` + ResumptionMasterSecretHex string `json:"resumptionMasterSecret"` +} + +type tls13 struct{} + +func (k *tls13) Process(vectorSet []byte, m Transactable) (interface{}, error) { + var parsed tls13TestVectorSet + if err := json.Unmarshal(vectorSet, &parsed); err != nil { + return nil, err + } + + var respGroups []tls13TestGroupResponse + for _, group := range parsed.Groups { + groupResp := tls13TestGroupResponse{ID: group.ID} + + for _, test := range group.Tests { + testResp := tls13TestResponse{ID: test.ID} + + clientHello, err := hex.DecodeString(test.ClientHelloHex) + if err != nil { + return nil, err + } + serverHello, err := hex.DecodeString(test.ServerHelloHex) + if err != nil { + return nil, err + } + serverFinished, err := hex.DecodeString(test.ServerFinishedHex) + if err != nil { + return nil, err + } + clientFinished, err := hex.DecodeString(test.ClientFinishedHex) + if err != nil { + return nil, err + } + + // See https://www.rfc-editor.org/rfc/rfc8446#section-7.1 + var hashLen int + var emptyHash []byte + switch group.HashFunc { + case "SHA2-256": + hashLen = 256 / 8 + digest := sha256.Sum256(nil) + emptyHash = digest[:] + case "SHA2-384": + hashLen = 384 / 8 + digest := sha512.Sum384(nil) + emptyHash = digest[:] + default: + return nil, fmt.Errorf("hash function %q is not supported for TLS v1.3", group.HashFunc) + } + hashLenBytes := uint32le(uint32(hashLen)) + + psk, err := hex.DecodeString(test.PSKInputHex) + if err != nil { + return nil, err + } + if len(psk) == 0 { + psk = make([]byte, hashLen) + } + + dhe, err := hex.DecodeString(test.DHEInputHex) + if err != nil { + return nil, err + } + if len(dhe) == 0 { + dhe = make([]byte, hashLen) + } + + zeros := make([]byte, hashLen) + earlySecret, err := m.Transact("HKDFExtract/"+group.HashFunc, 1, psk, zeros) + if err != nil { + return nil, fmt.Errorf("HKDFExtract operation failed: %s", err) + } + + hashedToClientHello, err := m.Transact(group.HashFunc, 1, clientHello) + if err != nil { + return nil, fmt.Errorf("%q operation failed: %s", group.HashFunc, err) + } + hashedToServerHello, err := m.Transact(group.HashFunc, 1, concat(clientHello, serverHello)) + if err != nil { + return nil, fmt.Errorf("%q operation failed: %s", group.HashFunc, err) + } + hashedToServerFinished, err := m.Transact(group.HashFunc, 1, concat(clientHello, serverHello, serverFinished)) + if err != nil { + return nil, fmt.Errorf("%q operation failed: %s", group.HashFunc, err) + } + hashedMessages, err := m.Transact(group.HashFunc, 1, concat(clientHello, serverHello, serverFinished, clientFinished)) + if err != nil { + return nil, fmt.Errorf("%q operation failed: %s", group.HashFunc, err) + } + + clientEarlyTrafficSecret, err := m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, earlySecret[0], []byte("c e traffic"), hashedToClientHello[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + testResp.ClientEarlyTrafficSecretHex = hex.EncodeToString(clientEarlyTrafficSecret[0]) + + earlyExporter, err := m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, earlySecret[0], []byte("e exp master"), hashedToClientHello[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + testResp.EarlyExporterMasterSecretHex = hex.EncodeToString(earlyExporter[0]) + + derivedSecret, err := m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, earlySecret[0], []byte("derived"), emptyHash[:]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + + handshakeSecret, err := m.Transact("HKDFExtract/"+group.HashFunc, 1, dhe, derivedSecret[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExtract operation failed: %s", err) + } + + clientHandshakeTrafficSecret, err := m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, handshakeSecret[0], []byte("c hs traffic"), hashedToServerHello[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + testResp.ClientHandshakeTrafficSecretHex = hex.EncodeToString(clientHandshakeTrafficSecret[0]) + + serverHandshakeTrafficSecret, err := m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, handshakeSecret[0], []byte("s hs traffic"), hashedToServerHello[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + testResp.ServerHandshakeTrafficSecretHex = hex.EncodeToString(serverHandshakeTrafficSecret[0]) + + derivedSecret, err = m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, handshakeSecret[0], []byte("derived"), emptyHash[:]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + + masterSecret, err := m.Transact("HKDFExtract/"+group.HashFunc, 1, zeros, derivedSecret[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExtract operation failed: %s", err) + } + + clientAppTrafficSecret, err := m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, masterSecret[0], []byte("c ap traffic"), hashedToServerFinished[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + testResp.ClientApplicationTrafficSecretHex = hex.EncodeToString(clientAppTrafficSecret[0]) + + serverAppTrafficSecret, err := m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, masterSecret[0], []byte("s ap traffic"), hashedToServerFinished[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + testResp.ServerApplicationTrafficSecretHex = hex.EncodeToString(serverAppTrafficSecret[0]) + + exporterSecret, err := m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, masterSecret[0], []byte("exp master"), hashedToServerFinished[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + testResp.ExporterMasterSecretHex = hex.EncodeToString(exporterSecret[0]) + + resumptionSecret, err := m.Transact("HKDFExpandLabel/"+group.HashFunc, 1, hashLenBytes, masterSecret[0], []byte("res master"), hashedMessages[0]) + if err != nil { + return nil, fmt.Errorf("HKDFExpandLabel operation failed: %s", err) + } + testResp.ResumptionMasterSecretHex = hex.EncodeToString(resumptionSecret[0]) + + groupResp.Tests = append(groupResp.Tests, testResp) + } + respGroups = append(respGroups, groupResp) + } + + return respGroups, nil +} + +func concat(slices ...[]byte) []byte { + var ret []byte + for _, slice := range slices { + ret = append(ret, slice...) + } + return ret +} diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/tlskdf.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/tlskdf.go index 2e2b65d3b1d1..ad27b542f326 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/tlskdf.go +++ b/third_party/boringssl/src/util/fipstools/acvp/acvptool/subprocess/tlskdf.go @@ -35,17 +35,11 @@ type tlsKDFTestGroup struct { } type tlsKDFTest struct { - ID uint64 `json:"tcId"` - PMSHex string `json:"preMasterSecret"` - // ClientHelloRandomHex and ServerHelloRandomHex are used for deriving the - // master secret. ClientRandomHex and ServerRandomHex are used for deriving the - // key block. Having different values for these is not possible in a TLS - // handshake unless you squint at a resumption handshake and somehow rederive - // the master secret from the session information during resumption. - ClientHelloRandomHex string `json:"clientHelloRandom"` - ServerHelloRandomHex string `json:"serverHelloRandom"` - ClientRandomHex string `json:"clientRandom"` - ServerRandomHex string `json:"serverRandom"` + ID uint64 `json:"tcId"` + PMSHex string `json:"preMasterSecret"` + ClientRandomHex string `json:"clientRandom"` + ServerRandomHex string `json:"serverRandom"` + SessionHashHex string `json:"sessionHash"` } type tlsKDFTestGroupResponse struct { @@ -74,35 +68,18 @@ func (k *tlsKDF) Process(vectorSet []byte, m Transactable) (interface{}, error) ID: group.ID, } - var tlsVer string - switch group.TLSVersion { - case "v1.0/1.1": - tlsVer = "1.0" - case "v1.2": - tlsVer = "1.2" - default: - return nil, fmt.Errorf("unknown TLS version %q", group.TLSVersion) - } - - hashIsTLS10 := false switch group.Hash { - case "SHA-1": - hashIsTLS10 = true case "SHA2-256", "SHA2-384", "SHA2-512": break default: return nil, fmt.Errorf("unknown hash %q", group.Hash) } - if (tlsVer == "1.0") != hashIsTLS10 { - return nil, fmt.Errorf("hash %q not permitted with TLS version %q", group.Hash, group.TLSVersion) - } - if group.KeyBlockBits%8 != 0 { return nil, fmt.Errorf("requested key-block length (%d bits) is not a whole number of bytes", group.KeyBlockBits) } - method := "TLSKDF/" + tlsVer + "/" + group.Hash + method := "TLSKDF/1.2/" + group.Hash for _, test := range group.Tests { pms, err := hex.DecodeString(test.PMSHex) @@ -110,35 +87,30 @@ func (k *tlsKDF) Process(vectorSet []byte, m Transactable) (interface{}, error) return nil, err } - clientHelloRandom, err := hex.DecodeString(test.ClientHelloRandomHex) - if err != nil { - return nil, err - } - - serverHelloRandom, err := hex.DecodeString(test.ServerHelloRandomHex) + clientRandom, err := hex.DecodeString(test.ClientRandomHex) if err != nil { return nil, err } - clientRandom, err := hex.DecodeString(test.ClientRandomHex) + serverRandom, err := hex.DecodeString(test.ServerRandomHex) if err != nil { return nil, err } - serverRandom, err := hex.DecodeString(test.ServerRandomHex) + sessionHash, err := hex.DecodeString(test.SessionHashHex) if err != nil { return nil, err } const ( masterSecretLength = 48 - masterSecretLabel = "master secret" + masterSecretLabel = "extended master secret" keyBlockLabel = "key expansion" ) var outLenBytes [4]byte binary.LittleEndian.PutUint32(outLenBytes[:], uint32(masterSecretLength)) - result, err := m.Transact(method, 1, outLenBytes[:], pms, []byte(masterSecretLabel), clientHelloRandom, serverHelloRandom) + result, err := m.Transact(method, 1, outLenBytes[:], pms, []byte(masterSecretLabel), sessionHash, nil) if err != nil { return nil, err } diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/check_expected.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/check_expected.go index 8a120212279f..d02f272983b2 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/check_expected.go +++ b/third_party/boringssl/src/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 ( @@ -21,7 +23,6 @@ import ( "flag" "fmt" "io" - "io/ioutil" "log" "os" "os/exec" @@ -43,6 +44,7 @@ type invocation struct { wrapperPath string inPath string expectedPath string + configPath string } func main() { @@ -86,6 +88,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 @@ -105,6 +116,7 @@ func main() { wrapperPath: wrapper, inPath: test.In, expectedPath: test.Out, + configPath: configFile.Name(), } } @@ -138,7 +150,7 @@ func doTest(test invocation) error { } defer input.Close() - tempFile, err := ioutil.TempFile("", "boringssl-check_expected-") + tempFile, err := os.CreateTemp("", "boringssl-check_expected-") if err != nil { return fmt.Errorf("Failed to create temp file: %s", err) } @@ -150,7 +162,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) @@ -190,7 +202,8 @@ func doTest(test invocation) error { } func writeUpdate(path string, contents []byte) { - if err := ioutil.WriteFile(path, contents, 0644); err != nil { + 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 { log.Printf("Wrote %q", path) diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC-CS3.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC-CS3.bz2 index 9a6c4c041fcd..02d4ddeeb232 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC-CS3.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC-CS3.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC.bz2 index b5a679efe6e9..ae3a9a5ca868 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CBC.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CCM.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CCM.bz2 index a8b6d6ce56d6..3d13d55895ae 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CCM.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CCM.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CTR.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CTR.bz2 index 2962c992e808..967cea857a5b 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CTR.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-CTR.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-ECB.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-ECB.bz2 index 13f52fdd7bcf..28f8e2008305 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-ECB.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-ECB.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GCM.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GCM.bz2 index d50948dac19f..a3d9b5239e74 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GCM.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GCM.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GMAC.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GMAC.bz2 index 0ca163ba9cdb..1d97836d809c 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GMAC.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-GMAC.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KW.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KW.bz2 index 276c35df490f..2904141837d1 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KW.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KW.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KWP.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KWP.bz2 index 69129bc2339c..9714e6db2d27 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KWP.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-KWP.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-XTS.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-XTS.bz2 index a197e2734ccf..3598e133bcab 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-XTS.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-AES-XTS.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-CBC.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-CBC.bz2 deleted file mode 100644 index 4c2832c549bb..000000000000 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-CBC.bz2 and /dev/null differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-ECB.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-ECB.bz2 deleted file mode 100644 index 1128b49975f6..000000000000 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ACVP-TDES-ECB.bz2 and /dev/null differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/CMAC-AES.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/CMAC-AES.bz2 index c97faded8328..f80e50213f9e 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/CMAC-AES.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/CMAC-AES.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ECDSA.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ECDSA.bz2 index 7ee11ad69718..aa5c7030a3ee 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ECDSA.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ECDSA.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HKDF.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HKDF.bz2 new file mode 100644 index 000000000000..791fa7a072cd Binary files /dev/null and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HKDF.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA-1.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA-1.bz2 index c1ae2ad5aed9..a95786d50600 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA-1.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA-1.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-224.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-224.bz2 index 33756def3e33..c8ab1f9cd83f 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-224.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-224.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-256.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-256.bz2 index 43688c8c356a..109083539b05 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-256.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-256.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-384.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-384.bz2 index f6c074d1fa82..5b445a5ae109 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-384.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-384.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512-256.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512-256.bz2 index 698411581aee..1fdfa4288210 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512-256.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512-256.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512.bz2 index f0ab7d6c52fe..3e467241868f 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/HMAC-SHA2-512.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/KAS-KDF.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/KAS-KDF.bz2 deleted file mode 100644 index df3edf565fcb..000000000000 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/KAS-KDF.bz2 and /dev/null differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/KDA.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/KDA.bz2 new file mode 100644 index 000000000000..aabc63b3519b Binary files /dev/null and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/KDA.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/RSA.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/RSA.bz2 index bf22ce55dbe4..2e5e8b158116 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/RSA.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/RSA.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA-1.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA-1.bz2 index c21a83f60d30..bfa98d9204f3 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA-1.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA-1.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-224.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-224.bz2 index 20d0a9080ab0..a2dca779f7f8 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-224.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-224.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-256.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-256.bz2 index 5c99dafb754e..b21ae00a172b 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-256.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-256.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-384.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-384.bz2 index d22e81c6ec13..e3c8b1b35b66 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-384.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-384.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-512.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-512.bz2 index c130659eba7a..2bbc71624bcf 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-512.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/SHA2-512.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/TLS12.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/TLS12.bz2 new file mode 100644 index 000000000000..d83b691619b9 Binary files /dev/null and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/TLS12.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/TLS13.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/TLS13.bz2 new file mode 100644 index 000000000000..7693c5f6c0e3 Binary files /dev/null and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/TLS13.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2 index c3bd2a170b08..60da2b2bd047 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/ctrDRBG.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/hmacDRBG.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/hmacDRBG.bz2 index 286ba0cf0e64..530a813a02ad 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/hmacDRBG.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/hmacDRBG.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/kdf-components.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/kdf-components.bz2 index 93ef1e483b37..f0a4d3aa9158 100644 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/kdf-components.bz2 and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/expected/kdf-components.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/tests.json b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/tests.json index 5765de1791fd..421e25351f91 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/tests.json +++ b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/tests.json @@ -18,16 +18,18 @@ {"Wrapper": "modulewrapper", "In": "vectors/HMAC-SHA2-384.bz2", "Out": "expected/HMAC-SHA2-384.bz2"}, {"Wrapper": "modulewrapper", "In": "vectors/HMAC-SHA2-512.bz2", "Out": "expected/HMAC-SHA2-512.bz2"}, {"Wrapper": "modulewrapper", "In": "vectors/HMAC-SHA2-512-256.bz2", "Out": "expected/HMAC-SHA2-512-256.bz2"}, +{"Wrapper": "modulewrapper", "In": "vectors/HKDF.bz2", "Out": "expected/HKDF.bz2"}, {"Wrapper": "testmodulewrapper", "In": "vectors/hmacDRBG.bz2", "Out": "expected/hmacDRBG.bz2"}, -{"Wrapper": "testmodulewrapper", "In": "vectors/KAS-KDF.bz2", "Out": "expected/KAS-KDF.bz2"}, +{"Wrapper": "testmodulewrapper", "In": "vectors/KDA.bz2", "Out": "expected/KDA.bz2"}, {"Wrapper": "modulewrapper", "In": "vectors/KAS-ECC-SSC.bz2"}, {"Wrapper": "modulewrapper", "In": "vectors/KAS-FFC-SSC.bz2"}, {"Wrapper": "testmodulewrapper", "In": "vectors/KDF.bz2"}, -{"Wrapper": "modulewrapper", "In": "vectors/kdf-components.bz2", "Out": "expected/kdf-components.bz2"}, {"Wrapper": "modulewrapper", "In": "vectors/RSA.bz2", "Out": "expected/RSA.bz2"}, {"Wrapper": "modulewrapper", "In": "vectors/SHA-1.bz2", "Out": "expected/SHA-1.bz2"}, {"Wrapper": "modulewrapper", "In": "vectors/SHA2-224.bz2", "Out": "expected/SHA2-224.bz2"}, {"Wrapper": "modulewrapper", "In": "vectors/SHA2-256.bz2", "Out": "expected/SHA2-256.bz2"}, {"Wrapper": "modulewrapper", "In": "vectors/SHA2-384.bz2", "Out": "expected/SHA2-384.bz2"}, -{"Wrapper": "modulewrapper", "In": "vectors/SHA2-512.bz2", "Out": "expected/SHA2-512.bz2"} +{"Wrapper": "modulewrapper", "In": "vectors/SHA2-512.bz2", "Out": "expected/SHA2-512.bz2"}, +{"Wrapper": "modulewrapper", "In": "vectors/TLS12.bz2", "Out": "expected/TLS12.bz2"}, +{"Wrapper": "modulewrapper", "In": "vectors/TLS13.bz2", "Out": "expected/TLS13.bz2"} ] diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/trim_vectors.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/trim_vectors.go index 53e970e028ad..703f75fd2032 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/trim_vectors.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/HKDF.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/HKDF.bz2 new file mode 100644 index 000000000000..f69a46191aaa Binary files /dev/null and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/HKDF.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/KAS-KDF.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/KAS-KDF.bz2 deleted file mode 100644 index eadbc7e265be..000000000000 Binary files a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/KAS-KDF.bz2 and /dev/null differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/KDA.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/KDA.bz2 new file mode 100644 index 000000000000..a5a8aa8e2ab0 Binary files /dev/null and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/KDA.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/TLS12.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/TLS12.bz2 new file mode 100644 index 000000000000..d1911ab9dde6 Binary files /dev/null and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/TLS12.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/TLS13.bz2 b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/TLS13.bz2 new file mode 100644 index 000000000000..7e8ea080b1dc Binary files /dev/null and b/third_party/boringssl/src/util/fipstools/acvp/acvptool/test/vectors/TLS13.bz2 differ diff --git a/third_party/boringssl/src/util/fipstools/acvp/acvptool/testmodulewrapper/testmodulewrapper.go b/third_party/boringssl/src/util/fipstools/acvp/acvptool/testmodulewrapper/testmodulewrapper.go index afb18046abe0..8c4c97a110da 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/acvptool/testmodulewrapper/testmodulewrapper.go +++ b/third_party/boringssl/src/util/fipstools/acvp/acvptool/testmodulewrapper/testmodulewrapper.go @@ -91,36 +91,20 @@ func getConfig(args [][]byte) error { "number" ] }, { - "algorithm": "KAS-KDF", - "mode": "TwoStep", - "revision": "Sp800-56Cr2", - "capabilities": [{ - "macSaltMethods": [ - "random", - "default" - ], - "fixedInfoPattern": "uPartyInfo||vPartyInfo", - "encoding": [ - "concatenation" - ], - "kdfMode": "feedback", - "macMode": [ - "HMAC-SHA2-256" - ], - "supportedLengths": [{ - "min": 128, - "max": 512, - "increment": 64 - }], - "fixedDataOrder": [ - "after fixed data" - ], - "counterLength": [ - 8 - ], - "requiresEmptyIv": true, - "supportsEmptyIv": true - }], + "algorithm": "KDA", + "mode": "HKDF", + "revision": "Sp800-56Cr1", + "fixedInfoPattern": "uPartyInfo||vPartyInfo", + "encoding": [ + "concatenation" + ], + "hmacAlg": [ + "SHA2-256" + ], + "macSaltMethods": [ + "default", + "random" + ], "l": 256, "z": [256, 384] }, { diff --git a/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/CMakeLists.txt b/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/CMakeLists.txt index f13f6df0f645..7938d39003d0 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/CMakeLists.txt +++ b/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(../../../../include) - if(FIPS) add_executable( modulewrapper @@ -7,9 +5,5 @@ if(FIPS) main.cc modulewrapper.cc ) - install(TARGETS modulewrapper) - - add_dependencies(modulewrapper global_target) - target_link_libraries(modulewrapper crypto) endif() diff --git a/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/main.cc b/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/main.cc index a903361b7f9d..03aead55ea37 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/main.cc +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/modulewrapper.cc b/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/modulewrapper.cc index f65492c00101..f417b64ce70b 100644 --- a/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/modulewrapper.cc +++ b/third_party/boringssl/src/util/fipstools/acvp/modulewrapper/modulewrapper.cc @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -833,20 +834,6 @@ static bool GetConfig(const Span args[], ReplyCallback write_repl }] }] }, - { - "algorithm": "kdf-components", - "revision": "1.0", - "mode": "tls", - "tlsVersion": [ - "v1.0/1.1", - "v1.2" - ], - "hashAlg": [ - "SHA2-256", - "SHA2-384", - "SHA2-512" - ] - }, { "algorithm": "KAS-ECC-SSC", "revision": "Sp800-56Ar3", @@ -885,6 +872,58 @@ static bool GetConfig(const Span args[], ReplyCallback write_repl "FB", "FC" ] + }, + { + "algorithm": "KDA", + "mode": "HKDF", + "revision": "Sp800-56Cr1", + "fixedInfoPattern": "uPartyInfo||vPartyInfo", + "encoding": [ + "concatenation" + ], + "hmacAlg": [ + "SHA2-224", + "SHA2-256", + "SHA2-384", + "SHA2-512", + "SHA2-512/256" + ], + "macSaltMethods": [ + "default", + "random" + ], + "l": 2048, + "z": [ + { + "min": 224, + "max": 65336, + "increment": 8 + } + ] + }, + { + "algorithm": "TLS-v1.2", + "mode": "KDF", + "revision": "RFC7627", + "hashAlg": [ + "SHA2-256", + "SHA2-384", + "SHA2-512" + ] + }, + { + "algorithm": "TLS-v1.3", + "mode": "KDF", + "revision": "RFC8446", + "hmacAlg": [ + "SHA2-256", + "SHA2-384" + ], + "runningMode": [ + "DHE", + "PSK", + "PSK-DHE" + ] } ])"; return write_reply({Span( @@ -1431,6 +1470,73 @@ static bool HMAC(const Span args[], ReplyCallback write_reply) { return write_reply({Span(digest, digest_len)}); } +template +static bool HKDF(const Span args[], ReplyCallback write_reply) { + const EVP_MD *const md = HashFunc(); + const auto key = args[0]; + const auto salt = args[1]; + const auto info = args[2]; + const auto out_len_bytes = args[3]; + + if (out_len_bytes.size() != sizeof(uint32_t)) { + return false; + } + const uint32_t out_len = CRYPTO_load_u32_le(out_len_bytes.data()); + if (out_len > (1 << 24)) { + return false; + } + + std::vector out(out_len); + if (!::HKDF(out.data(), out_len, md, key.data(), key.size(), salt.data(), + salt.size(), info.data(), info.size())) { + return false; + } + return write_reply({out}); +} + +template +static bool HKDFExtract(const Span args[], + ReplyCallback write_reply) { + const EVP_MD *const md = HashFunc(); + const auto secret = args[0]; + const auto salt = args[1]; + + std::vector out(EVP_MD_size(md)); + size_t out_len; + if (!HKDF_extract(out.data(), &out_len, md, secret.data(), secret.size(), + salt.data(), salt.size())) { + return false; + } + assert(out_len == out.size()); + return write_reply({out}); +} + +template +static bool HKDFExpandLabel(const Span args[], + ReplyCallback write_reply) { + const EVP_MD *const md = HashFunc(); + const auto out_len_bytes = args[0]; + const auto secret = args[1]; + const auto label = args[2]; + const auto hash = args[3]; + + if (out_len_bytes.size() != sizeof(uint32_t)) { + return false; + } + const uint32_t out_len = CRYPTO_load_u32_le(out_len_bytes.data()); + if (out_len > (1 << 24)) { + return false; + } + + std::vector out(out_len); + if (!CRYPTO_tls13_hkdf_expand_label(out.data(), out_len, md, secret.data(), + secret.size(), label.data(), label.size(), + hash.data(), hash.size())) { + return false; + } + return write_reply({out}); +} + template static bool DRBG(const Span args[], ReplyCallback write_reply) { const auto out_len_bytes = args[0]; @@ -1558,12 +1664,8 @@ static bool ECDSAKeyVer(const Span args[], ReplyCallback write_re bssl::UniquePtr x(BytesToBIGNUM(args[1])); bssl::UniquePtr y(BytesToBIGNUM(args[2])); - bssl::UniquePtr point(EC_POINT_new(EC_KEY_get0_group(key.get()))); uint8_t reply[1]; - if (!EC_POINT_set_affine_coordinates_GFp(EC_KEY_get0_group(key.get()), - point.get(), x.get(), y.get(), - /*ctx=*/nullptr) || - !EC_KEY_set_public_key(key.get(), point.get()) || + if (!EC_KEY_set_public_key_affine_coordinates(key.get(), x.get(), y.get()) || !EC_KEY_check_fips(key.get())) { reply[0] = 0; } else { @@ -1636,12 +1738,8 @@ static bool ECDSASigVer(const Span args[], ReplyCallback write_re return false; } - bssl::UniquePtr point(EC_POINT_new(EC_KEY_get0_group(key.get()))); uint8_t reply[1]; - if (!EC_POINT_set_affine_coordinates_GFp(EC_KEY_get0_group(key.get()), - point.get(), x.get(), y.get(), - /*ctx=*/nullptr) || - !EC_KEY_set_public_key(key.get(), point.get()) || + if (!EC_KEY_set_public_key_affine_coordinates(key.get(), x.get(), y.get()) || !EC_KEY_check_fips(key.get()) || !ECDSA_do_verify(digest, digest_len, &sig, key.get())) { reply[0] = 0; @@ -1979,6 +2077,15 @@ static constexpr struct { {"3DES-ECB/decrypt", 3, TDES}, {"3DES-CBC/encrypt", 4, TDES_CBC}, {"3DES-CBC/decrypt", 4, TDES_CBC}, + {"HKDF/SHA2-224", 4, HKDF}, + {"HKDF/SHA2-256", 4, HKDF}, + {"HKDF/SHA2-384", 4, HKDF}, + {"HKDF/SHA2-512", 4, HKDF}, + {"HKDF/SHA2-512/256", 4, HKDF}, + {"HKDFExpandLabel/SHA2-256", 4, HKDFExpandLabel}, + {"HKDFExpandLabel/SHA2-384", 4, HKDFExpandLabel}, + {"HKDFExtract/SHA2-256", 2, HKDFExtract}, + {"HKDFExtract/SHA2-384", 2, HKDFExtract}, {"HMAC-SHA-1", 2, HMAC}, {"HMAC-SHA2-224", 2, HMAC}, {"HMAC-SHA2-256", 2, HMAC}, @@ -2016,7 +2123,6 @@ static constexpr struct { {"RSA/sigVer/SHA2-512/pss", 4, RSASigVer}, {"RSA/sigVer/SHA2-512/256/pss", 4, RSASigVer}, {"RSA/sigVer/SHA-1/pss", 4, RSASigVer}, - {"TLSKDF/1.0/SHA-1", 5, TLSKDF}, {"TLSKDF/1.2/SHA2-256", 5, TLSKDF}, {"TLSKDF/1.2/SHA2-384", 5, TLSKDF}, {"TLSKDF/1.2/SHA2-512", 5, TLSKDF}, diff --git a/third_party/boringssl/src/util/fipstools/break-hash.go b/third_party/boringssl/src/util/fipstools/break-hash.go index 8c817d8dbd4f..a4ab8083df9e 100644 --- a/third_party/boringssl/src/util/fipstools/break-hash.go +++ b/third_party/boringssl/src/util/fipstools/break-hash.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 // 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. @@ -24,12 +26,11 @@ import ( "encoding/hex" "errors" "fmt" - "io/ioutil" "os" ) func do(outPath, inPath string) error { - objectBytes, err := ioutil.ReadFile(inPath) + objectBytes, err := os.ReadFile(inPath) if err != nil { return err } @@ -131,7 +132,7 @@ func do(outPath, inPath string) error { fmt.Printf("\nHash of module was: %x\n", hashWas) fmt.Printf("Hash of corrupted module is: %x\n", newHash) - return ioutil.WriteFile(outPath, objectBytes, 0755) + return os.WriteFile(outPath, objectBytes, 0755) } func main() { diff --git a/third_party/boringssl/src/util/fipstools/break-kat.go b/third_party/boringssl/src/util/fipstools/break-kat.go index b500545c7dba..e4d323abcbbd 100644 --- a/third_party/boringssl/src/util/fipstools/break-kat.go +++ b/third_party/boringssl/src/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. @@ -8,7 +10,6 @@ import ( "encoding/hex" "flag" "fmt" - "io/ioutil" "os" "sort" ) @@ -22,10 +23,12 @@ var ( "AES-GCM-decrypt": "35f3058f875760ff09d3120f70c4bc9ed7a86872e13452202176f7371ae04faae1dd391920f5d13953d896785994823c", "DRBG": "c4da0740d505f1ee280b95e58c4931ac6de846a0152fbb4a3f174cf4787a4f1a40c2b50babe14aae530be5886d910a27", "DRBG-reseed": "c7161ca36c2309b716e9859bb96c6d49bdc8352103a18cd24ef42ec97ef46bf446eb1a4576c186e9351803763a7912fe", + "HKDF": "68678504b9b3add17d5967a1a7bd37993fd8a33ce7303071f39c096d1635b3c9", "SHA-1": "132fd9bad5c1826263bafbb699f707a5", "SHA-256": "ff3b857da7236a2baa0f396b51522217", "SHA-512": "212512f8d2ad8322781c6c4d69a9daa1", "TLS-KDF": "abc3657b094c7628a0b282996fe75a75f4984fd94d4ecc2fcf53a2c469a3f731", + "TLS13-KDF": "024a0d80f357f2499a1244dac26dab66fc13ed85fca71dace146211119525874", "RSA-sign": "d2b56e53306f720d7929d8708bf46f1c22300305582b115bedcac722d8aa5ab2", "RSA-verify": "abe2cbc13d6bd39d48db5334ddbf8d070a93bdcb104e2cc5d0ee486ee295f6b31bda126c41890b98b73e70e6b65d82f95c663121755a90744c8d1c21148a1960be0eca446e9ff497f1345c537ef8119b9a4398e95c5c6de2b1c955905c5299d8ce7a3b6ab76380d9babdd15f610237e1f3f2aa1c1f1e770b62fbb596381b2ebdd77ecef9c90d4c92f7b6b05fed2936285fa94826e62055322a33b6f04c74ce69e5d8d737fb838b79d2d48e3daf71387531882531a95ac964d02ea413bf85952982bbc089527daff5b845c9a0f4d14ef1956d9c3acae882d12da66da0f35794f5ee32232333517db9315232a183b991654dbea41615345c885325926744a53915", "ECDSA-sign": "1e35930be860d0942ca7bbd6f6ded87f157e4de24f81ed4b875c0e018e89a81f", @@ -63,7 +66,7 @@ func main() { panic("invalid kat data: " + err.Error()) } - binaryContents, err := ioutil.ReadFile(inPath) + binaryContents, err := os.ReadFile(inPath) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(2) @@ -75,7 +78,17 @@ func main() { os.Exit(3) } - binaryContents[i] ^= 1 + // Zero out the entire value because the compiler may produce code + // where parts of the value are embedded in the instructions. + for j := range testInputValue { + binaryContents[i+j] = 0 + } + + if bytes.Index(binaryContents, testInputValue) >= 0 { + fmt.Fprintln(os.Stderr, "Test input value was still found after erasing it. Second copy?") + os.Exit(4) + } + os.Stdout.Write(binaryContents) } diff --git a/third_party/boringssl/src/util/fipstools/break-tests.sh b/third_party/boringssl/src/util/fipstools/break-tests.sh index f9ae2e8d133b..695b62931bb5 100644 --- a/third_party/boringssl/src/util/fipstools/break-tests.sh +++ b/third_party/boringssl/src/util/fipstools/break-tests.sh @@ -25,139 +25,147 @@ set -e die () { - echo "ERROR: $@" - exit 1 + echo "ERROR: $@" + exit 1 } usage() { - echo "USAGE: $0 [local|device]" - exit 1 + echo "USAGE: $0 [local|device]" + exit 1 } inferred_mode() { - # Try and infer local or device mode based on makefiles and artifacts. - if [ -f Android.bp -o -f external/boringssl/Android.bp ] - then - echo device - elif [ -f CMakeLists.txt -a -d build/crypto -a -d build/ssl ] - then - echo local - else - echo "Unable to infer mode, please specify on the command line." - usage - fi + # Try and infer local or device mode based on makefiles and artifacts. + if [ -f Android.bp -o -f external/boringssl/Android.bp ]; then + echo device + elif [ -f CMakeLists.txt -a -d build/crypto -a -d build/ssl ]; then + echo local + else + echo "Unable to infer mode, please specify on the command line." + usage + fi } # Prefer mode from command line if present. case "$1" in - local|device) - MODE=$1 - ;; + local|device) + MODE=$1 + ;; - "") - MODE=`inferred_mode` - ;; + "") + MODE=`inferred_mode` + ;; - *) - usage - ;; + *) + usage + ;; esac check_directory() { - test -d $1 || die "Directory $1 not found." + test -d "$1" || die "Directory $1 not found." } check_file() { - test -f $1 || die "File $1 not found." + test -f "$1" || die "File $1 not found." } run_test_locally() { - eval "$1" || true + eval "$1" || true } run_test_on_device() { - EXECFILE="$1" - LIBRARY="$2" - adb shell rm -rf $DEVICE_TMP - adb shell mkdir -p $DEVICE_TMP - adb push $EXECFILE $DEVICE_TMP > /dev/null - EXECPATH=$(basename $EXECFILE) - adb push $LIBRARY $DEVICE_TMP > /dev/null - adb shell "LD_LIBRARY_PATH=$DEVICE_TMP $DEVICE_TMP/$EXECPATH" || true + EXECFILE="$1" + LIBRARY="$2" + adb shell rm -rf "$DEVICE_TMP" + adb shell mkdir -p "$DEVICE_TMP" + adb push "$EXECFILE" "$DEVICE_TMP" > /dev/null + EXECPATH=$(basename "$EXECFILE") + adb push "$LIBRARY" "$DEVICE_TMP" > /dev/null + adb shell "LD_LIBRARY_PATH=$DEVICE_TMP" "$DEVICE_TMP/$EXECPATH" || true } device_integrity_break_test() { - go run $BORINGSSL/util/fipstools/break-hash.go $LIBCRYPTO_BIN ./libcrypto.so - $RUN $TEST_FIPS_BIN ./libcrypto.so - rm ./libcrypto.so + go run "$BORINGSSL/util/fipstools/break-hash.go" "$LIBCRYPTO_BIN" ./libcrypto.so + $RUN "$TEST_FIPS_BIN" ./libcrypto.so + rm ./libcrypto.so } local_integrity_break_test() { - go run $BORINGSSL/util/fipstools/break-hash.go $TEST_FIPS_BIN ./break-bin - chmod u+x ./break-bin - $RUN ./break-bin - rm ./break-bin + go run $BORINGSSL/util/fipstools/break-hash.go "$TEST_FIPS_BIN" ./break-bin + chmod u+x ./break-bin + $RUN ./break-bin + rm ./break-bin +} + +local_runtime_break_test() { + BORINGSSL_FIPS_BREAK_TEST=$1 "$RUN" "$TEST_FIPS_BREAK_BIN" } # TODO(prb): make break-hash and break-kat take similar arguments to save having # separate functions for each. device_kat_break_test() { - KAT="$1" - go run $BORINGSSL/util/fipstools/break-kat.go $LIBCRYPTO_BIN $KAT > ./libcrypto.so - $RUN $TEST_FIPS_BIN ./libcrypto.so - rm ./libcrypto.so + KAT="$1" + go run "$BORINGSSL/util/fipstools/break-kat.go" "$LIBCRYPTO_BREAK_BIN" "$KAT" > ./libcrypto.so + $RUN "$TEST_FIPS_BIN" ./libcrypto.so + rm ./libcrypto.so } local_kat_break_test() { - KAT="$1" - go run $BORINGSSL/util/fipstools/break-kat.go $TEST_FIPS_BIN $KAT > ./break-bin - chmod u+x ./break-bin - $RUN ./break-bin - rm ./break-bin + KAT="$1" + go run "$BORINGSSL/util/fipstools/break-kat.go" "$TEST_FIPS_BREAK_BIN" "$KAT" > ./break-bin + chmod u+x ./break-bin + $RUN ./break-bin + rm ./break-bin } pause () { - echo -n "Press " - read + echo -n "Press " + read } -if [ "$MODE" = "local" ] -then - TEST_FIPS_BIN="build/util/fipstools/test_fips" - BORINGSSL=. - RUN=run_test_locally - BREAK_TEST=local_break_test - INTEGRITY_BREAK_TEST=local_integrity_break_test - KAT_BREAK_TEST=local_kat_break_test - if [ ! -f $TEST_FIPS_BIN ]; then - echo "$TEST_FIPS_BIN is missing. Run this script from the top level of a" - echo "BoringSSL checkout and ensure that BoringSSL has been built in" - echo "build/ with -DFIPS_BREAK_TEST=TESTS passed to CMake." - exit 1 - fi +if [ "$MODE" = "local" ]; then + TEST_FIPS_BIN=${TEST_FIPS_BIN:-build/util/fipstools/test_fips} + TEST_FIPS_BREAK_BIN=${TEST_FIPS_BREAK_BIN:-./test_fips_break} + check_file "$TEST_FIPS_BIN" + check_file "$TEST_FIPS_BREAK_BIN" + + BORINGSSL=. + RUN=run_test_locally + BREAK_TEST=local_break_test + INTEGRITY_BREAK_TEST=local_integrity_break_test + KAT_BREAK_TEST=local_kat_break_test + RUNTIME_BREAK_TEST=local_runtime_break_test + if [ ! -f "$TEST_FIPS_BIN" ]; then + echo "$TEST_FIPS_BIN is missing. Run this script from the top level of a" + echo "BoringSSL checkout and ensure that BoringSSL has been built in" + echo "build/ with -DFIPS_BREAK_TEST=TESTS passed to CMake." + exit 1 + fi else # Device mode - test "$ANDROID_BUILD_TOP" || die "'lunch aosp_arm64-eng' first" - check_directory "$ANDROID_PRODUCT_OUT" - - TEST_FIPS_BIN="$ANDROID_PRODUCT_OUT/system/bin/test_fips" - check_file "$TEST_FIPS_BIN" - LIBCRYPTO_BIN="$ANDROID_PRODUCT_OUT/system/lib64/libcrypto.so" - check_file "$LIBCRYPTO_BIN" - - test "$ANDROID_SERIAL" || die "ANDROID_SERIAL not set" - DEVICE_TMP=/data/local/tmp - - BORINGSSL="$ANDROID_BUILD_TOP/external/boringssl/src" - RUN=run_test_on_device - INTEGRITY_BREAK_TEST=device_integrity_break_test - KAT_BREAK_TEST=device_kat_break_test + test "$ANDROID_BUILD_TOP" || die "'lunch aosp_arm64-eng' first" + check_directory "$ANDROID_PRODUCT_OUT" + + TEST_FIPS_BIN="$ANDROID_PRODUCT_OUT/system/bin/test_fips" + check_file "$TEST_FIPS_BIN" + LIBCRYPTO_BIN="$ANDROID_PRODUCT_OUT/system/lib64/libcrypto.so" + LIBCRYPTO_BREAK_BIN="libcrypto.so" + check_file "$LIBCRYPTO_BIN" + check_file "$LIBCRYPTO_BREAK_BIN" + + test "$ANDROID_SERIAL" || die "ANDROID_SERIAL not set" + DEVICE_TMP=/data/local/tmp + + BORINGSSL="$ANDROID_BUILD_TOP/external/boringssl/src" + RUN=run_test_on_device + INTEGRITY_BREAK_TEST=device_integrity_break_test + KAT_BREAK_TEST=device_kat_break_test fi -KATS=$(go run $BORINGSSL/util/fipstools/break-kat.go --list-tests) +KATS=$(go run "$BORINGSSL/util/fipstools/break-kat.go" --list-tests) echo -e '\033[1mNormal output\033[0m' -$RUN $TEST_FIPS_BIN $LIBCRYPTO_BIN +$RUN "$TEST_FIPS_BIN" "$LIBCRYPTO_BIN" pause echo @@ -171,3 +179,13 @@ for kat in $KATS; do $KAT_BREAK_TEST $kat pause done + +if [ "$MODE" = "local" ]; then + # TODO(prb): add support for Android devices. + for runtime_test in ECDSA_PWCT RSA_PWCT CRNG; do + echo + echo -e "\033[1m${runtime_test} failure\033[0m" + $RUNTIME_BREAK_TEST ${runtime_test} + pause + done +fi diff --git a/third_party/boringssl/src/util/fipstools/delocate/delocate.go b/third_party/boringssl/src/util/fipstools/delocate/delocate.go index 84508aa81871..c28be558c2cd 100644 --- a/third_party/boringssl/src/util/fipstools/delocate/delocate.go +++ b/third_party/boringssl/src/util/fipstools/delocate/delocate.go @@ -10,18 +10,20 @@ // 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. package main import ( + "bytes" "errors" "flag" "fmt" - "io/ioutil" "os" + "os/exec" + "path/filepath" "sort" "strconv" "strings" @@ -52,8 +54,7 @@ type stringWriter interface { type processorType int const ( - ppc64le processorType = iota + 1 - x86_64 + x86_64 processorType = iota + 1 aarch64 ) @@ -66,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â€. @@ -76,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. @@ -155,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: @@ -253,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 @@ -313,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 } @@ -627,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) @@ -866,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 @@ -1672,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 @@ -1696,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] @@ -1763,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{}), @@ -1804,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") @@ -1844,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") @@ -1866,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 { @@ -1956,7 +1486,25 @@ func transform(w stringWriter, inputs []inputFile) error { return nil } -func parseInputs(inputs []inputFile) error { +// preprocess runs source through the C preprocessor. +func preprocess(cppCommand []string, path string) ([]byte, error) { + var args []string + args = append(args, cppCommand...) + args = append(args, path) + + cpp := exec.Command(args[0], args[1:]...) + cpp.Stderr = os.Stderr + var result bytes.Buffer + cpp.Stdout = &result + + if err := cpp.Run(); err != nil { + return nil, err + } + + return result.Bytes(), nil +} + +func parseInputs(inputs []inputFile, cppCommand []string) error { for i, input := range inputs { var contents string @@ -1980,7 +1528,14 @@ func parseInputs(inputs []inputFile) error { contents = string(c) } } else { - inBytes, err := ioutil.ReadFile(input.path) + var inBytes []byte + var err error + + if len(cppCommand) > 0 { + inBytes, err = preprocess(cppCommand, input.path) + } else { + inBytes, err = os.ReadFile(input.path) + } if err != nil { return err } @@ -2002,12 +1557,36 @@ func parseInputs(inputs []inputFile) error { return nil } +// includePathFromHeaderFilePath returns an include directory path based on the +// path of a specific header file. It walks up the path and assumes that the +// include files are rooted in a directory called "openssl". +func includePathFromHeaderFilePath(path string) (string, error) { + dir := path + for { + var file string + dir, file = filepath.Split(dir) + + if file == "openssl" { + return dir, nil + } + + if len(dir) == 0 { + break + } + dir = dir[:len(dir)-1] + } + + return "", fmt.Errorf("failed to find 'openssl' path element in header file path %q", path) +} + func main() { // The .a file, if given, is expected to be an archive of textual // assembly sources. That's odd, but CMake really wants to create // archive files so it's the only way that we can make it work. arInput := flag.String("a", "", "Path to a .a file containing assembly sources") outFile := flag.String("o", "", "Path to output assembly") + ccPath := flag.String("cc", "", "Path to the C compiler for preprocessing inputs") + ccFlags := flag.String("cc-flags", "", "Flags for the C compiler when preprocessing") flag.Parse() @@ -2025,18 +1604,52 @@ func main() { }) } + includePaths := make(map[string]struct{}) + for i, path := range flag.Args() { if len(path) == 0 { continue } + // Header files are not processed but their path is remembered + // and passed as -I arguments when invoking the preprocessor. + if strings.HasSuffix(path, ".h") { + dir, err := includePathFromHeaderFilePath(path) + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err) + os.Exit(1) + } + includePaths[dir] = struct{}{} + continue + } + inputs = append(inputs, inputFile{ path: path, index: i + 1, }) } - if err := parseInputs(inputs); err != nil { + var cppCommand []string + if len(*ccPath) > 0 { + cppCommand = append(cppCommand, *ccPath) + cppCommand = append(cppCommand, strings.Fields(*ccFlags)...) + // Some of ccFlags might be superfluous when running the + // preprocessor, but we don't want the compiler complaining that + // "argument unused during compilation". + cppCommand = append(cppCommand, "-Wno-unused-command-line-argument") + // We are preprocessing for assembly output and need to simulate that + // environment for arm_arch.h. + cppCommand = append(cppCommand, "-D__ASSEMBLER__=1") + + for includePath := range includePaths { + cppCommand = append(cppCommand, "-I"+includePath) + } + + // -E requests only preprocessing. + cppCommand = append(cppCommand, "-E") + } + + if err := parseInputs(inputs, cppCommand); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } @@ -2116,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" || @@ -2175,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/third_party/boringssl/src/util/fipstools/delocate/delocate.peg b/third_party/boringssl/src/util/fipstools/delocate/delocate.peg index 82670654f411..9db3e8cfa9b6 100644 --- a/third_party/boringssl/src/util/fipstools/delocate/delocate.peg +++ b/third_party/boringssl/src/util/fipstools/delocate/delocate.peg @@ -12,10 +12,17 @@ # 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. +# 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 {} @@ -77,8 +84,8 @@ RegisterOrConstant <- (('%'[[A-Z]][[A-Z0-9]]*) / ('#' '~'? '(' [0-9] WS? "<<" WS? [0-9] ')' ) / ARMRegister) ![fb:(+\-] -ARMConstantTweak <- ("lsl" / "sxtw" / "sxtb" / "uxtw" / "uxtb" / "lsr" / "ror" / "asr") (WS '#' Offset)? -ARMRegister <- "sp" / ([xwdqs] [0-9] [0-9]?) / "xzr" / "wzr" / ARMVectorRegister / ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')? ) +ARMConstantTweak <- (([us] "xt" [xwhb]) / "lsl" / "lsr" / "ror" / "asr") (WS '#' Offset)? +ARMRegister <- "sp" / ([xwdqshb] [0-9] [0-9]?) / "xzr" / "wzr" / "NZCV" / ARMVectorRegister / ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')? ) ARMVectorRegister <- "v" [0-9] [0-9]? ('.' [0-9]* [bsdhq] ('[' [0-9] [0-9]? ']')? )? # Compilers only output a very limited number of expression forms. Rather than # implement a full expression parser, this enumerate those forms plus a few diff --git a/third_party/boringssl/src/util/fipstools/delocate/delocate.peg.go b/third_party/boringssl/src/util/fipstools/delocate/delocate.peg.go index 6f5c65455cdd..01a1fc2c68ef 100644 --- a/third_party/boringssl/src/util/fipstools/delocate/delocate.peg.go +++ b/third_party/boringssl/src/util/fipstools/delocate/delocate.peg.go @@ -4594,7 +4594,7 @@ func (p *Asm) Init(options ...func(*Asm) error) error { position, tokenIndex = position529, tokenIndex529 return false }, - /* 40 ARMConstantTweak <- <(((('l' / 'L') ('s' / 'S') ('l' / 'L')) / (('s' / 'S') ('x' / 'X') ('t' / 'T') ('w' / 'W')) / (('s' / 'S') ('x' / 'X') ('t' / 'T') ('b' / 'B')) / (('u' / 'U') ('x' / 'X') ('t' / 'T') ('w' / 'W')) / (('u' / 'U') ('x' / 'X') ('t' / 'T') ('b' / 'B')) / (('l' / 'L') ('s' / 'S') ('r' / 'R')) / (('r' / 'R') ('o' / 'O') ('r' / 'R')) / (('a' / 'A') ('s' / 'S') ('r' / 'R'))) (WS '#' Offset)?)> */ + /* 40 ARMConstantTweak <- <(((('u' / 's') (('x' / 'X') ('t' / 'T')) ('x' / 'w' / 'h' / 'b')) / (('l' / 'L') ('s' / 'S') ('l' / 'L')) / (('l' / 'L') ('s' / 'S') ('r' / 'R')) / (('r' / 'R') ('o' / 'O') ('r' / 'R')) / (('a' / 'A') ('s' / 'S') ('r' / 'R'))) (WS '#' Offset)?)> */ func() bool { position570, tokenIndex570 := position, tokenIndex { @@ -4603,14 +4603,14 @@ func (p *Asm) Init(options ...func(*Asm) error) error { position572, tokenIndex572 := position, tokenIndex { position574, tokenIndex574 := position, tokenIndex - if buffer[position] != rune('l') { + if buffer[position] != rune('u') { goto l575 } position++ goto l574 l575: position, tokenIndex = position574, tokenIndex574 - if buffer[position] != rune('L') { + if buffer[position] != rune('s') { goto l573 } position++ @@ -4618,14 +4618,14 @@ func (p *Asm) Init(options ...func(*Asm) error) error { l574: { position576, tokenIndex576 := position, tokenIndex - if buffer[position] != rune('s') { + if buffer[position] != rune('x') { goto l577 } position++ goto l576 l577: position, tokenIndex = position576, tokenIndex576 - if buffer[position] != rune('S') { + if buffer[position] != rune('X') { goto l573 } position++ @@ -4633,158 +4633,157 @@ func (p *Asm) Init(options ...func(*Asm) error) error { l576: { position578, tokenIndex578 := position, tokenIndex - if buffer[position] != rune('l') { + if buffer[position] != rune('t') { goto l579 } position++ goto l578 l579: position, tokenIndex = position578, tokenIndex578 - if buffer[position] != rune('L') { + if buffer[position] != rune('T') { goto l573 } position++ } l578: - goto l572 - l573: - position, tokenIndex = position572, tokenIndex572 { - position581, tokenIndex581 := position, tokenIndex - if buffer[position] != rune('s') { - goto l582 + position580, tokenIndex580 := position, tokenIndex + if buffer[position] != rune('x') { + goto l581 } position++ - goto l581 - l582: - position, tokenIndex = position581, tokenIndex581 - if buffer[position] != rune('S') { - goto l580 + goto l580 + l581: + position, tokenIndex = position580, tokenIndex580 + if buffer[position] != rune('w') { + goto l582 } position++ - } - l581: - { - position583, tokenIndex583 := position, tokenIndex - if buffer[position] != rune('x') { - goto l584 + goto l580 + l582: + position, tokenIndex = position580, tokenIndex580 + if buffer[position] != rune('h') { + goto l583 } position++ - goto l583 - l584: - position, tokenIndex = position583, tokenIndex583 - if buffer[position] != rune('X') { - goto l580 + goto l580 + l583: + position, tokenIndex = position580, tokenIndex580 + if buffer[position] != rune('b') { + goto l573 } position++ } - l583: + l580: + goto l572 + l573: + position, tokenIndex = position572, tokenIndex572 { position585, tokenIndex585 := position, tokenIndex - if buffer[position] != rune('t') { + if buffer[position] != rune('l') { goto l586 } position++ goto l585 l586: position, tokenIndex = position585, tokenIndex585 - if buffer[position] != rune('T') { - goto l580 + if buffer[position] != rune('L') { + goto l584 } position++ } l585: { position587, tokenIndex587 := position, tokenIndex - if buffer[position] != rune('w') { + if buffer[position] != rune('s') { goto l588 } position++ goto l587 l588: position, tokenIndex = position587, tokenIndex587 - if buffer[position] != rune('W') { - goto l580 + if buffer[position] != rune('S') { + goto l584 } position++ } l587: - goto l572 - l580: - position, tokenIndex = position572, tokenIndex572 { - position590, tokenIndex590 := position, tokenIndex - if buffer[position] != rune('s') { - goto l591 + position589, tokenIndex589 := position, tokenIndex + if buffer[position] != rune('l') { + goto l590 } position++ - goto l590 - l591: - position, tokenIndex = position590, tokenIndex590 - if buffer[position] != rune('S') { - goto l589 + goto l589 + l590: + position, tokenIndex = position589, tokenIndex589 + if buffer[position] != rune('L') { + goto l584 } position++ } - l590: + l589: + goto l572 + l584: + position, tokenIndex = position572, tokenIndex572 { position592, tokenIndex592 := position, tokenIndex - if buffer[position] != rune('x') { + if buffer[position] != rune('l') { goto l593 } position++ goto l592 l593: position, tokenIndex = position592, tokenIndex592 - if buffer[position] != rune('X') { - goto l589 + if buffer[position] != rune('L') { + goto l591 } position++ } l592: { position594, tokenIndex594 := position, tokenIndex - if buffer[position] != rune('t') { + if buffer[position] != rune('s') { goto l595 } position++ goto l594 l595: position, tokenIndex = position594, tokenIndex594 - if buffer[position] != rune('T') { - goto l589 + if buffer[position] != rune('S') { + goto l591 } position++ } l594: { position596, tokenIndex596 := position, tokenIndex - if buffer[position] != rune('b') { + if buffer[position] != rune('r') { goto l597 } position++ goto l596 l597: position, tokenIndex = position596, tokenIndex596 - if buffer[position] != rune('B') { - goto l589 + if buffer[position] != rune('R') { + goto l591 } position++ } l596: goto l572 - l589: + l591: position, tokenIndex = position572, tokenIndex572 { position599, tokenIndex599 := position, tokenIndex - if buffer[position] != rune('u') { + if buffer[position] != rune('r') { goto l600 } position++ goto l599 l600: position, tokenIndex = position599, tokenIndex599 - if buffer[position] != rune('U') { + if buffer[position] != rune('R') { goto l598 } position++ @@ -4792,14 +4791,14 @@ func (p *Asm) Init(options ...func(*Asm) error) error { l599: { position601, tokenIndex601 := position, tokenIndex - if buffer[position] != rune('x') { + if buffer[position] != rune('o') { goto l602 } position++ goto l601 l602: position, tokenIndex = position601, tokenIndex601 - if buffer[position] != rune('X') { + if buffer[position] != rune('O') { goto l598 } position++ @@ -4807,110 +4806,110 @@ func (p *Asm) Init(options ...func(*Asm) error) error { l601: { position603, tokenIndex603 := position, tokenIndex - if buffer[position] != rune('t') { + if buffer[position] != rune('r') { goto l604 } position++ goto l603 l604: position, tokenIndex = position603, tokenIndex603 - if buffer[position] != rune('T') { + if buffer[position] != rune('R') { goto l598 } position++ } l603: + goto l572 + l598: + position, tokenIndex = position572, tokenIndex572 { position605, tokenIndex605 := position, tokenIndex - if buffer[position] != rune('w') { + if buffer[position] != rune('a') { goto l606 } position++ goto l605 l606: position, tokenIndex = position605, tokenIndex605 - if buffer[position] != rune('W') { - goto l598 + if buffer[position] != rune('A') { + goto l570 } position++ } l605: - goto l572 - l598: - position, tokenIndex = position572, tokenIndex572 { - position608, tokenIndex608 := position, tokenIndex - if buffer[position] != rune('u') { - goto l609 + position607, tokenIndex607 := position, tokenIndex + if buffer[position] != rune('s') { + goto l608 } position++ - goto l608 - l609: - position, tokenIndex = position608, tokenIndex608 - if buffer[position] != rune('U') { - goto l607 + goto l607 + l608: + position, tokenIndex = position607, tokenIndex607 + if buffer[position] != rune('S') { + goto l570 } position++ } - l608: + l607: { - position610, tokenIndex610 := position, tokenIndex - if buffer[position] != rune('x') { - goto l611 + position609, tokenIndex609 := position, tokenIndex + if buffer[position] != rune('r') { + goto l610 } position++ - goto l610 - l611: - position, tokenIndex = position610, tokenIndex610 - if buffer[position] != rune('X') { - goto l607 + goto l609 + l610: + position, tokenIndex = position609, tokenIndex609 + if buffer[position] != rune('R') { + goto l570 } position++ } - l610: - { - position612, tokenIndex612 := position, tokenIndex - if buffer[position] != rune('t') { - goto l613 - } - position++ - goto l612 - l613: - position, tokenIndex = position612, tokenIndex612 - if buffer[position] != rune('T') { - goto l607 - } - position++ + l609: + } + l572: + { + position611, tokenIndex611 := position, tokenIndex + if !_rules[ruleWS]() { + goto l611 } - l612: - { - position614, tokenIndex614 := position, tokenIndex - if buffer[position] != rune('b') { - goto l615 - } - position++ - goto l614 - l615: - position, tokenIndex = position614, tokenIndex614 - if buffer[position] != rune('B') { - goto l607 - } - position++ + if buffer[position] != rune('#') { + goto l611 } - l614: - goto l572 - l607: - position, tokenIndex = position572, tokenIndex572 + position++ + if !_rules[ruleOffset]() { + goto l611 + } + goto l612 + l611: + position, tokenIndex = position611, tokenIndex611 + } + l612: + add(ruleARMConstantTweak, position571) + } + return true + l570: + position, tokenIndex = position570, tokenIndex570 + return false + }, + /* 41 ARMRegister <- <((('s' / 'S') ('p' / 'P')) / (('x' / 'w' / 'd' / 'q' / 's' / 'h' / 'b') [0-9] [0-9]?) / (('x' / 'X') ('z' / 'Z') ('r' / 'R')) / (('w' / 'W') ('z' / 'Z') ('r' / 'R')) / (('n' / 'N') ('z' / 'Z') ('c' / 'C') ('v' / 'V')) / ARMVectorRegister / ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')?))> */ + func() bool { + position613, tokenIndex613 := position, tokenIndex + { + position614 := position + { + position615, tokenIndex615 := position, tokenIndex { position617, tokenIndex617 := position, tokenIndex - if buffer[position] != rune('l') { + if buffer[position] != rune('s') { goto l618 } position++ goto l617 l618: position, tokenIndex = position617, tokenIndex617 - if buffer[position] != rune('L') { + if buffer[position] != rune('S') { goto l616 } position++ @@ -4918,1603 +4917,1506 @@ func (p *Asm) Init(options ...func(*Asm) error) error { l617: { position619, tokenIndex619 := position, tokenIndex - if buffer[position] != rune('s') { + if buffer[position] != rune('p') { goto l620 } position++ goto l619 l620: position, tokenIndex = position619, tokenIndex619 - if buffer[position] != rune('S') { + if buffer[position] != rune('P') { goto l616 } position++ } l619: + goto l615 + l616: + position, tokenIndex = position615, tokenIndex615 { - position621, tokenIndex621 := position, tokenIndex - if buffer[position] != rune('r') { - goto l622 + position622, tokenIndex622 := position, tokenIndex + if buffer[position] != rune('x') { + goto l623 } position++ - goto l621 - l622: - position, tokenIndex = position621, tokenIndex621 - if buffer[position] != rune('R') { - goto l616 + goto l622 + l623: + position, tokenIndex = position622, tokenIndex622 + if buffer[position] != rune('w') { + goto l624 } position++ - } - l621: - goto l572 - l616: - position, tokenIndex = position572, tokenIndex572 - { - position624, tokenIndex624 := position, tokenIndex - if buffer[position] != rune('r') { + goto l622 + l624: + position, tokenIndex = position622, tokenIndex622 + if buffer[position] != rune('d') { goto l625 } position++ - goto l624 + goto l622 l625: - position, tokenIndex = position624, tokenIndex624 - if buffer[position] != rune('R') { - goto l623 + position, tokenIndex = position622, tokenIndex622 + if buffer[position] != rune('q') { + goto l626 } position++ - } - l624: - { - position626, tokenIndex626 := position, tokenIndex - if buffer[position] != rune('o') { + goto l622 + l626: + position, tokenIndex = position622, tokenIndex622 + if buffer[position] != rune('s') { goto l627 } position++ - goto l626 + goto l622 l627: - position, tokenIndex = position626, tokenIndex626 - if buffer[position] != rune('O') { - goto l623 - } - position++ - } - l626: - { - position628, tokenIndex628 := position, tokenIndex - if buffer[position] != rune('r') { - goto l629 + position, tokenIndex = position622, tokenIndex622 + if buffer[position] != rune('h') { + goto l628 } position++ - goto l628 - l629: - position, tokenIndex = position628, tokenIndex628 - if buffer[position] != rune('R') { - goto l623 + goto l622 + l628: + position, tokenIndex = position622, tokenIndex622 + if buffer[position] != rune('b') { + goto l621 } position++ } - l628: - goto l572 - l623: - position, tokenIndex = position572, tokenIndex572 + l622: + if c := buffer[position]; c < rune('0') || c > rune('9') { + goto l621 + } + position++ { - position630, tokenIndex630 := position, tokenIndex - if buffer[position] != rune('a') { - goto l631 + position629, tokenIndex629 := position, tokenIndex + if c := buffer[position]; c < rune('0') || c > rune('9') { + goto l629 } position++ goto l630 - l631: - position, tokenIndex = position630, tokenIndex630 - if buffer[position] != rune('A') { - goto l570 - } - position++ + l629: + position, tokenIndex = position629, tokenIndex629 } l630: + goto l615 + l621: + position, tokenIndex = position615, tokenIndex615 { position632, tokenIndex632 := position, tokenIndex - if buffer[position] != rune('s') { + if buffer[position] != rune('x') { goto l633 } position++ goto l632 l633: position, tokenIndex = position632, tokenIndex632 - if buffer[position] != rune('S') { - goto l570 + if buffer[position] != rune('X') { + goto l631 } position++ } l632: { position634, tokenIndex634 := position, tokenIndex - if buffer[position] != rune('r') { + if buffer[position] != rune('z') { goto l635 } position++ goto l634 l635: position, tokenIndex = position634, tokenIndex634 - if buffer[position] != rune('R') { - goto l570 + if buffer[position] != rune('Z') { + goto l631 } position++ } l634: - } - l572: - { - position636, tokenIndex636 := position, tokenIndex - if !_rules[ruleWS]() { - goto l636 - } - if buffer[position] != rune('#') { - goto l636 - } - position++ - if !_rules[ruleOffset]() { - goto l636 - } - goto l637 - l636: - position, tokenIndex = position636, tokenIndex636 - } - l637: - add(ruleARMConstantTweak, position571) - } - return true - l570: - position, tokenIndex = position570, tokenIndex570 - return false - }, - /* 41 ARMRegister <- <((('s' / 'S') ('p' / 'P')) / (('x' / 'w' / 'd' / 'q' / 's') [0-9] [0-9]?) / (('x' / 'X') ('z' / 'Z') ('r' / 'R')) / (('w' / 'W') ('z' / 'Z') ('r' / 'R')) / ARMVectorRegister / ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')?))> */ - func() bool { - position638, tokenIndex638 := position, tokenIndex - { - position639 := position - { - position640, tokenIndex640 := position, tokenIndex - { - position642, tokenIndex642 := position, tokenIndex - if buffer[position] != rune('s') { - goto l643 - } - position++ - goto l642 - l643: - position, tokenIndex = position642, tokenIndex642 - if buffer[position] != rune('S') { - goto l641 - } - position++ - } - l642: { - position644, tokenIndex644 := position, tokenIndex - if buffer[position] != rune('p') { - goto l645 + position636, tokenIndex636 := position, tokenIndex + if buffer[position] != rune('r') { + goto l637 } position++ - goto l644 - l645: - position, tokenIndex = position644, tokenIndex644 - if buffer[position] != rune('P') { - goto l641 + goto l636 + l637: + position, tokenIndex = position636, tokenIndex636 + if buffer[position] != rune('R') { + goto l631 } position++ } - l644: - goto l640 - l641: - position, tokenIndex = position640, tokenIndex640 + l636: + goto l615 + l631: + position, tokenIndex = position615, tokenIndex615 { - position647, tokenIndex647 := position, tokenIndex - if buffer[position] != rune('x') { - goto l648 - } - position++ - goto l647 - l648: - position, tokenIndex = position647, tokenIndex647 + position639, tokenIndex639 := position, tokenIndex if buffer[position] != rune('w') { - goto l649 - } - position++ - goto l647 - l649: - position, tokenIndex = position647, tokenIndex647 - if buffer[position] != rune('d') { - goto l650 - } - position++ - goto l647 - l650: - position, tokenIndex = position647, tokenIndex647 - if buffer[position] != rune('q') { - goto l651 - } - position++ - goto l647 - l651: - position, tokenIndex = position647, tokenIndex647 - if buffer[position] != rune('s') { - goto l646 + goto l640 } position++ - } - l647: - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l646 - } - position++ - { - position652, tokenIndex652 := position, tokenIndex - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l652 + goto l639 + l640: + position, tokenIndex = position639, tokenIndex639 + if buffer[position] != rune('W') { + goto l638 } position++ - goto l653 - l652: - position, tokenIndex = position652, tokenIndex652 } - l653: - goto l640 - l646: - position, tokenIndex = position640, tokenIndex640 + l639: { - position655, tokenIndex655 := position, tokenIndex - if buffer[position] != rune('x') { - goto l656 + position641, tokenIndex641 := position, tokenIndex + if buffer[position] != rune('z') { + goto l642 } position++ - goto l655 - l656: - position, tokenIndex = position655, tokenIndex655 - if buffer[position] != rune('X') { - goto l654 + goto l641 + l642: + position, tokenIndex = position641, tokenIndex641 + if buffer[position] != rune('Z') { + goto l638 } position++ } - l655: + l641: { - position657, tokenIndex657 := position, tokenIndex - if buffer[position] != rune('z') { - goto l658 + position643, tokenIndex643 := position, tokenIndex + if buffer[position] != rune('r') { + goto l644 } position++ - goto l657 - l658: - position, tokenIndex = position657, tokenIndex657 - if buffer[position] != rune('Z') { - goto l654 + goto l643 + l644: + position, tokenIndex = position643, tokenIndex643 + if buffer[position] != rune('R') { + goto l638 } position++ } - l657: + l643: + goto l615 + l638: + position, tokenIndex = position615, tokenIndex615 { - position659, tokenIndex659 := position, tokenIndex - if buffer[position] != rune('r') { - goto l660 + position646, tokenIndex646 := position, tokenIndex + if buffer[position] != rune('n') { + goto l647 } position++ - goto l659 - l660: - position, tokenIndex = position659, tokenIndex659 - if buffer[position] != rune('R') { - goto l654 + goto l646 + l647: + position, tokenIndex = position646, tokenIndex646 + if buffer[position] != rune('N') { + goto l645 } position++ } - l659: - goto l640 - l654: - position, tokenIndex = position640, tokenIndex640 + l646: { - position662, tokenIndex662 := position, tokenIndex - if buffer[position] != rune('w') { - goto l663 + position648, tokenIndex648 := position, tokenIndex + if buffer[position] != rune('z') { + goto l649 } position++ - goto l662 - l663: - position, tokenIndex = position662, tokenIndex662 - if buffer[position] != rune('W') { - goto l661 + goto l648 + l649: + position, tokenIndex = position648, tokenIndex648 + if buffer[position] != rune('Z') { + goto l645 } position++ } - l662: + l648: { - position664, tokenIndex664 := position, tokenIndex - if buffer[position] != rune('z') { - goto l665 + position650, tokenIndex650 := position, tokenIndex + if buffer[position] != rune('c') { + goto l651 } position++ - goto l664 - l665: - position, tokenIndex = position664, tokenIndex664 - if buffer[position] != rune('Z') { - goto l661 + goto l650 + l651: + position, tokenIndex = position650, tokenIndex650 + if buffer[position] != rune('C') { + goto l645 } position++ } - l664: + l650: { - position666, tokenIndex666 := position, tokenIndex - if buffer[position] != rune('r') { - goto l667 + position652, tokenIndex652 := position, tokenIndex + if buffer[position] != rune('v') { + goto l653 } position++ - goto l666 - l667: - position, tokenIndex = position666, tokenIndex666 - if buffer[position] != rune('R') { - goto l661 + goto l652 + l653: + position, tokenIndex = position652, tokenIndex652 + if buffer[position] != rune('V') { + goto l645 } position++ } - l666: - goto l640 - l661: - position, tokenIndex = position640, tokenIndex640 + l652: + goto l615 + l645: + position, tokenIndex = position615, tokenIndex615 if !_rules[ruleARMVectorRegister]() { - goto l668 + goto l654 } - goto l640 - l668: - position, tokenIndex = position640, tokenIndex640 + goto l615 + l654: + position, tokenIndex = position615, tokenIndex615 if buffer[position] != rune('{') { - goto l638 + goto l613 } position++ { - position669, tokenIndex669 := position, tokenIndex + position655, tokenIndex655 := position, tokenIndex if !_rules[ruleWS]() { - goto l669 + goto l655 } - goto l670 - l669: - position, tokenIndex = position669, tokenIndex669 + goto l656 + l655: + position, tokenIndex = position655, tokenIndex655 } - l670: + l656: if !_rules[ruleARMVectorRegister]() { - goto l638 + goto l613 } - l671: + l657: { - position672, tokenIndex672 := position, tokenIndex + position658, tokenIndex658 := position, tokenIndex if buffer[position] != rune(',') { - goto l672 + goto l658 } position++ { - position673, tokenIndex673 := position, tokenIndex + position659, tokenIndex659 := position, tokenIndex if !_rules[ruleWS]() { - goto l673 + goto l659 } - goto l674 - l673: - position, tokenIndex = position673, tokenIndex673 + goto l660 + l659: + position, tokenIndex = position659, tokenIndex659 } - l674: + l660: if !_rules[ruleARMVectorRegister]() { - goto l672 + goto l658 } - goto l671 - l672: - position, tokenIndex = position672, tokenIndex672 + goto l657 + l658: + position, tokenIndex = position658, tokenIndex658 } { - position675, tokenIndex675 := position, tokenIndex + position661, tokenIndex661 := position, tokenIndex if !_rules[ruleWS]() { - goto l675 + goto l661 } - goto l676 - l675: - position, tokenIndex = position675, tokenIndex675 + goto l662 + l661: + position, tokenIndex = position661, tokenIndex661 } - l676: + l662: if buffer[position] != rune('}') { - goto l638 + goto l613 } position++ { - position677, tokenIndex677 := position, tokenIndex + position663, tokenIndex663 := position, tokenIndex if buffer[position] != rune('[') { - goto l677 + goto l663 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l677 + goto l663 } position++ { - position679, tokenIndex679 := position, tokenIndex + position665, tokenIndex665 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l679 + goto l665 } position++ - goto l680 - l679: - position, tokenIndex = position679, tokenIndex679 + goto l666 + l665: + position, tokenIndex = position665, tokenIndex665 } - l680: + l666: if buffer[position] != rune(']') { - goto l677 + goto l663 } position++ - goto l678 - l677: - position, tokenIndex = position677, tokenIndex677 + goto l664 + l663: + position, tokenIndex = position663, tokenIndex663 } - l678: + l664: } - l640: - add(ruleARMRegister, position639) + l615: + add(ruleARMRegister, position614) } return true - l638: - position, tokenIndex = position638, tokenIndex638 + l613: + position, tokenIndex = position613, tokenIndex613 return false }, /* 42 ARMVectorRegister <- <(('v' / 'V') [0-9] [0-9]? ('.' [0-9]* ('b' / 's' / 'd' / 'h' / 'q') ('[' [0-9] [0-9]? ']')?)?)> */ func() bool { - position681, tokenIndex681 := position, tokenIndex + position667, tokenIndex667 := position, tokenIndex { - position682 := position + position668 := position { - position683, tokenIndex683 := position, tokenIndex + position669, tokenIndex669 := position, tokenIndex if buffer[position] != rune('v') { - goto l684 + goto l670 } position++ - goto l683 - l684: - position, tokenIndex = position683, tokenIndex683 + goto l669 + l670: + position, tokenIndex = position669, tokenIndex669 if buffer[position] != rune('V') { - goto l681 + goto l667 } position++ } - l683: + l669: if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l681 + goto l667 } position++ { - position685, tokenIndex685 := position, tokenIndex + position671, tokenIndex671 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l685 + goto l671 } position++ - goto l686 - l685: - position, tokenIndex = position685, tokenIndex685 + goto l672 + l671: + position, tokenIndex = position671, tokenIndex671 } - l686: + l672: { - position687, tokenIndex687 := position, tokenIndex + position673, tokenIndex673 := position, tokenIndex if buffer[position] != rune('.') { - goto l687 + goto l673 } position++ - l689: + l675: { - position690, tokenIndex690 := position, tokenIndex + position676, tokenIndex676 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l690 + goto l676 } position++ - goto l689 - l690: - position, tokenIndex = position690, tokenIndex690 + goto l675 + l676: + position, tokenIndex = position676, tokenIndex676 } { - position691, tokenIndex691 := position, tokenIndex + position677, tokenIndex677 := position, tokenIndex if buffer[position] != rune('b') { - goto l692 + goto l678 } position++ - goto l691 - l692: - position, tokenIndex = position691, tokenIndex691 + goto l677 + l678: + position, tokenIndex = position677, tokenIndex677 if buffer[position] != rune('s') { - goto l693 + goto l679 } position++ - goto l691 - l693: - position, tokenIndex = position691, tokenIndex691 + goto l677 + l679: + position, tokenIndex = position677, tokenIndex677 if buffer[position] != rune('d') { - goto l694 + goto l680 } position++ - goto l691 - l694: - position, tokenIndex = position691, tokenIndex691 + goto l677 + l680: + position, tokenIndex = position677, tokenIndex677 if buffer[position] != rune('h') { - goto l695 + goto l681 } position++ - goto l691 - l695: - position, tokenIndex = position691, tokenIndex691 + goto l677 + l681: + position, tokenIndex = position677, tokenIndex677 if buffer[position] != rune('q') { - goto l687 + goto l673 } position++ } - l691: + l677: { - position696, tokenIndex696 := position, tokenIndex + position682, tokenIndex682 := position, tokenIndex if buffer[position] != rune('[') { - goto l696 + goto l682 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l696 + goto l682 } position++ { - position698, tokenIndex698 := position, tokenIndex + position684, tokenIndex684 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l698 + goto l684 } position++ - goto l699 - l698: - position, tokenIndex = position698, tokenIndex698 + goto l685 + l684: + position, tokenIndex = position684, tokenIndex684 } - l699: + l685: if buffer[position] != rune(']') { - goto l696 + goto l682 } position++ - goto l697 - l696: - position, tokenIndex = position696, tokenIndex696 + goto l683 + l682: + position, tokenIndex = position682, tokenIndex682 } - l697: - goto l688 - l687: - position, tokenIndex = position687, tokenIndex687 + l683: + goto l674 + l673: + position, tokenIndex = position673, tokenIndex673 } - l688: - add(ruleARMVectorRegister, position682) + l674: + add(ruleARMVectorRegister, position668) } return true - l681: - position, tokenIndex = position681, tokenIndex681 + l667: + position, tokenIndex = position667, tokenIndex667 return false }, /* 43 MemoryRef <- <((SymbolRef BaseIndexScale) / SymbolRef / Low12BitsSymbolRef / (Offset* BaseIndexScale) / (SegmentRegister Offset BaseIndexScale) / (SegmentRegister BaseIndexScale) / (SegmentRegister Offset) / ARMBaseIndexScale / BaseIndexScale)> */ func() bool { - position700, tokenIndex700 := position, tokenIndex + position686, tokenIndex686 := position, tokenIndex { - position701 := position + position687 := position { - position702, tokenIndex702 := position, tokenIndex + position688, tokenIndex688 := position, tokenIndex if !_rules[ruleSymbolRef]() { - goto l703 + goto l689 } if !_rules[ruleBaseIndexScale]() { - goto l703 + goto l689 } - goto l702 - l703: - position, tokenIndex = position702, tokenIndex702 + goto l688 + l689: + position, tokenIndex = position688, tokenIndex688 if !_rules[ruleSymbolRef]() { - goto l704 + goto l690 } - goto l702 - l704: - position, tokenIndex = position702, tokenIndex702 + goto l688 + l690: + position, tokenIndex = position688, tokenIndex688 if !_rules[ruleLow12BitsSymbolRef]() { - goto l705 + goto l691 } - goto l702 - l705: - position, tokenIndex = position702, tokenIndex702 - l707: + goto l688 + l691: + position, tokenIndex = position688, tokenIndex688 + l693: { - position708, tokenIndex708 := position, tokenIndex + position694, tokenIndex694 := position, tokenIndex if !_rules[ruleOffset]() { - goto l708 + goto l694 } - goto l707 - l708: - position, tokenIndex = position708, tokenIndex708 + goto l693 + l694: + position, tokenIndex = position694, tokenIndex694 } if !_rules[ruleBaseIndexScale]() { - goto l706 + goto l692 } - goto l702 - l706: - position, tokenIndex = position702, tokenIndex702 + goto l688 + l692: + position, tokenIndex = position688, tokenIndex688 if !_rules[ruleSegmentRegister]() { - goto l709 + goto l695 } if !_rules[ruleOffset]() { - goto l709 + goto l695 } if !_rules[ruleBaseIndexScale]() { - goto l709 + goto l695 } - goto l702 - l709: - position, tokenIndex = position702, tokenIndex702 + goto l688 + l695: + position, tokenIndex = position688, tokenIndex688 if !_rules[ruleSegmentRegister]() { - goto l710 + goto l696 } if !_rules[ruleBaseIndexScale]() { - goto l710 + goto l696 } - goto l702 - l710: - position, tokenIndex = position702, tokenIndex702 + goto l688 + l696: + position, tokenIndex = position688, tokenIndex688 if !_rules[ruleSegmentRegister]() { - goto l711 + goto l697 } if !_rules[ruleOffset]() { - goto l711 + goto l697 } - goto l702 - l711: - position, tokenIndex = position702, tokenIndex702 + goto l688 + l697: + position, tokenIndex = position688, tokenIndex688 if !_rules[ruleARMBaseIndexScale]() { - goto l712 + goto l698 } - goto l702 - l712: - position, tokenIndex = position702, tokenIndex702 + goto l688 + l698: + position, tokenIndex = position688, tokenIndex688 if !_rules[ruleBaseIndexScale]() { - goto l700 + goto l686 } } - l702: - add(ruleMemoryRef, position701) + l688: + add(ruleMemoryRef, position687) } return true - l700: - position, tokenIndex = position700, tokenIndex700 + l686: + position, tokenIndex = position686, tokenIndex686 return false }, /* 44 SymbolRef <- <((Offset* '+')? (LocalSymbol / SymbolName) Offset* ('@' Section Offset*)?)> */ func() bool { - position713, tokenIndex713 := position, tokenIndex + position699, tokenIndex699 := position, tokenIndex { - position714 := position + position700 := position { - position715, tokenIndex715 := position, tokenIndex - l717: + position701, tokenIndex701 := position, tokenIndex + l703: { - position718, tokenIndex718 := position, tokenIndex + position704, tokenIndex704 := position, tokenIndex if !_rules[ruleOffset]() { - goto l718 + goto l704 } - goto l717 - l718: - position, tokenIndex = position718, tokenIndex718 + goto l703 + l704: + position, tokenIndex = position704, tokenIndex704 } if buffer[position] != rune('+') { - goto l715 + goto l701 } position++ - goto l716 - l715: - position, tokenIndex = position715, tokenIndex715 + goto l702 + l701: + position, tokenIndex = position701, tokenIndex701 } - l716: + l702: { - position719, tokenIndex719 := position, tokenIndex + position705, tokenIndex705 := position, tokenIndex if !_rules[ruleLocalSymbol]() { - goto l720 + goto l706 } - goto l719 - l720: - position, tokenIndex = position719, tokenIndex719 + goto l705 + l706: + position, tokenIndex = position705, tokenIndex705 if !_rules[ruleSymbolName]() { - goto l713 + goto l699 } } - l719: - l721: + l705: + l707: { - position722, tokenIndex722 := position, tokenIndex + position708, tokenIndex708 := position, tokenIndex if !_rules[ruleOffset]() { - goto l722 + goto l708 } - goto l721 - l722: - position, tokenIndex = position722, tokenIndex722 + goto l707 + l708: + position, tokenIndex = position708, tokenIndex708 } { - position723, tokenIndex723 := position, tokenIndex + position709, tokenIndex709 := position, tokenIndex if buffer[position] != rune('@') { - goto l723 + goto l709 } position++ if !_rules[ruleSection]() { - goto l723 + goto l709 } - l725: + l711: { - position726, tokenIndex726 := position, tokenIndex + position712, tokenIndex712 := position, tokenIndex if !_rules[ruleOffset]() { - goto l726 + goto l712 } - goto l725 - l726: - position, tokenIndex = position726, tokenIndex726 + goto l711 + l712: + position, tokenIndex = position712, tokenIndex712 } - goto l724 - l723: - position, tokenIndex = position723, tokenIndex723 + goto l710 + l709: + position, tokenIndex = position709, tokenIndex709 } - l724: - add(ruleSymbolRef, position714) + l710: + add(ruleSymbolRef, position700) } return true - l713: - position, tokenIndex = position713, tokenIndex713 + l699: + position, tokenIndex = position699, tokenIndex699 return false }, /* 45 Low12BitsSymbolRef <- <(':' ('l' / 'L') ('o' / 'O') '1' '2' ':' (LocalSymbol / SymbolName) Offset?)> */ func() bool { - position727, tokenIndex727 := position, tokenIndex + position713, tokenIndex713 := position, tokenIndex { - position728 := position + position714 := position if buffer[position] != rune(':') { - goto l727 + goto l713 } position++ { - position729, tokenIndex729 := position, tokenIndex + position715, tokenIndex715 := position, tokenIndex if buffer[position] != rune('l') { - goto l730 + goto l716 } position++ - goto l729 - l730: - position, tokenIndex = position729, tokenIndex729 + goto l715 + l716: + position, tokenIndex = position715, tokenIndex715 if buffer[position] != rune('L') { - goto l727 + goto l713 } position++ } - l729: + l715: { - position731, tokenIndex731 := position, tokenIndex + position717, tokenIndex717 := position, tokenIndex if buffer[position] != rune('o') { - goto l732 + goto l718 } position++ - goto l731 - l732: - position, tokenIndex = position731, tokenIndex731 + goto l717 + l718: + position, tokenIndex = position717, tokenIndex717 if buffer[position] != rune('O') { - goto l727 + goto l713 } position++ } - l731: + l717: if buffer[position] != rune('1') { - goto l727 + goto l713 } position++ if buffer[position] != rune('2') { - goto l727 + goto l713 } position++ if buffer[position] != rune(':') { - goto l727 + goto l713 } position++ { - position733, tokenIndex733 := position, tokenIndex + position719, tokenIndex719 := position, tokenIndex if !_rules[ruleLocalSymbol]() { - goto l734 + goto l720 } - goto l733 - l734: - position, tokenIndex = position733, tokenIndex733 + goto l719 + l720: + position, tokenIndex = position719, tokenIndex719 if !_rules[ruleSymbolName]() { - goto l727 + goto l713 } } - l733: + l719: { - position735, tokenIndex735 := position, tokenIndex + position721, tokenIndex721 := position, tokenIndex if !_rules[ruleOffset]() { - goto l735 + goto l721 } - goto l736 - l735: - position, tokenIndex = position735, tokenIndex735 + goto l722 + l721: + position, tokenIndex = position721, tokenIndex721 } - l736: - add(ruleLow12BitsSymbolRef, position728) + l722: + add(ruleLow12BitsSymbolRef, position714) } return true - l727: - position, tokenIndex = position727, tokenIndex727 + l713: + position, tokenIndex = position713, tokenIndex713 return false }, /* 46 ARMBaseIndexScale <- <('[' ARMRegister (',' WS? (('#' Offset (('*' [0-9]+) / ('*' '(' [0-9]+ Operator [0-9]+ ')') / ('+' [0-9]+)*)?) / ARMGOTLow12 / Low12BitsSymbolRef / ARMRegister) (',' WS? ARMConstantTweak)?)? ']' ARMPostincrement?)> */ func() bool { - position737, tokenIndex737 := position, tokenIndex + position723, tokenIndex723 := position, tokenIndex { - position738 := position + position724 := position if buffer[position] != rune('[') { - goto l737 + goto l723 } position++ if !_rules[ruleARMRegister]() { - goto l737 + goto l723 } { - position739, tokenIndex739 := position, tokenIndex + position725, tokenIndex725 := position, tokenIndex if buffer[position] != rune(',') { - goto l739 + goto l725 } position++ { - position741, tokenIndex741 := position, tokenIndex + position727, tokenIndex727 := position, tokenIndex if !_rules[ruleWS]() { - goto l741 + goto l727 } - goto l742 - l741: - position, tokenIndex = position741, tokenIndex741 + goto l728 + l727: + position, tokenIndex = position727, tokenIndex727 } - l742: + l728: { - position743, tokenIndex743 := position, tokenIndex + position729, tokenIndex729 := position, tokenIndex if buffer[position] != rune('#') { - goto l744 + goto l730 } position++ if !_rules[ruleOffset]() { - goto l744 + goto l730 } { - position745, tokenIndex745 := position, tokenIndex + position731, tokenIndex731 := position, tokenIndex { - position747, tokenIndex747 := position, tokenIndex + position733, tokenIndex733 := position, tokenIndex if buffer[position] != rune('*') { - goto l748 + goto l734 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l748 + goto l734 } position++ - l749: + l735: { - position750, tokenIndex750 := position, tokenIndex + position736, tokenIndex736 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l750 + goto l736 } position++ - goto l749 - l750: - position, tokenIndex = position750, tokenIndex750 + goto l735 + l736: + position, tokenIndex = position736, tokenIndex736 } - goto l747 - l748: - position, tokenIndex = position747, tokenIndex747 + goto l733 + l734: + position, tokenIndex = position733, tokenIndex733 if buffer[position] != rune('*') { - goto l751 + goto l737 } position++ if buffer[position] != rune('(') { - goto l751 + goto l737 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l751 + goto l737 } position++ - l752: + l738: { - position753, tokenIndex753 := position, tokenIndex + position739, tokenIndex739 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l753 + goto l739 } position++ - goto l752 - l753: - position, tokenIndex = position753, tokenIndex753 + goto l738 + l739: + position, tokenIndex = position739, tokenIndex739 } if !_rules[ruleOperator]() { - goto l751 + goto l737 } if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l751 + goto l737 } position++ - l754: + l740: { - position755, tokenIndex755 := position, tokenIndex + position741, tokenIndex741 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l755 + goto l741 } position++ - goto l754 - l755: - position, tokenIndex = position755, tokenIndex755 + goto l740 + l741: + position, tokenIndex = position741, tokenIndex741 } if buffer[position] != rune(')') { - goto l751 + goto l737 } position++ - goto l747 - l751: - position, tokenIndex = position747, tokenIndex747 - l756: + goto l733 + l737: + position, tokenIndex = position733, tokenIndex733 + l742: { - position757, tokenIndex757 := position, tokenIndex + position743, tokenIndex743 := position, tokenIndex if buffer[position] != rune('+') { - goto l757 + goto l743 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l757 + goto l743 } position++ - l758: + l744: { - position759, tokenIndex759 := position, tokenIndex + position745, tokenIndex745 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l759 + goto l745 } position++ - goto l758 - l759: - position, tokenIndex = position759, tokenIndex759 + goto l744 + l745: + position, tokenIndex = position745, tokenIndex745 } - goto l756 - l757: - position, tokenIndex = position757, tokenIndex757 + goto l742 + l743: + position, tokenIndex = position743, tokenIndex743 } } - l747: - goto l746 + l733: + goto l732 - position, tokenIndex = position745, tokenIndex745 + position, tokenIndex = position731, tokenIndex731 } - l746: - goto l743 - l744: - position, tokenIndex = position743, tokenIndex743 + l732: + goto l729 + l730: + position, tokenIndex = position729, tokenIndex729 if !_rules[ruleARMGOTLow12]() { - goto l760 + goto l746 } - goto l743 - l760: - position, tokenIndex = position743, tokenIndex743 + goto l729 + l746: + position, tokenIndex = position729, tokenIndex729 if !_rules[ruleLow12BitsSymbolRef]() { - goto l761 + goto l747 } - goto l743 - l761: - position, tokenIndex = position743, tokenIndex743 + goto l729 + l747: + position, tokenIndex = position729, tokenIndex729 if !_rules[ruleARMRegister]() { - goto l739 + goto l725 } } - l743: + l729: { - position762, tokenIndex762 := position, tokenIndex + position748, tokenIndex748 := position, tokenIndex if buffer[position] != rune(',') { - goto l762 + goto l748 } position++ { - position764, tokenIndex764 := position, tokenIndex + position750, tokenIndex750 := position, tokenIndex if !_rules[ruleWS]() { - goto l764 + goto l750 } - goto l765 - l764: - position, tokenIndex = position764, tokenIndex764 + goto l751 + l750: + position, tokenIndex = position750, tokenIndex750 } - l765: + l751: if !_rules[ruleARMConstantTweak]() { - goto l762 + goto l748 } - goto l763 - l762: - position, tokenIndex = position762, tokenIndex762 + goto l749 + l748: + position, tokenIndex = position748, tokenIndex748 } - l763: - goto l740 - l739: - position, tokenIndex = position739, tokenIndex739 + l749: + goto l726 + l725: + position, tokenIndex = position725, tokenIndex725 } - l740: + l726: if buffer[position] != rune(']') { - goto l737 + goto l723 } position++ { - position766, tokenIndex766 := position, tokenIndex + position752, tokenIndex752 := position, tokenIndex if !_rules[ruleARMPostincrement]() { - goto l766 + goto l752 } - goto l767 - l766: - position, tokenIndex = position766, tokenIndex766 + goto l753 + l752: + position, tokenIndex = position752, tokenIndex752 } - l767: - add(ruleARMBaseIndexScale, position738) + l753: + add(ruleARMBaseIndexScale, position724) } return true - l737: - position, tokenIndex = position737, tokenIndex737 + l723: + position, tokenIndex = position723, tokenIndex723 return false }, /* 47 ARMGOTLow12 <- <(':' ('g' / 'G') ('o' / 'O') ('t' / 'T') '_' ('l' / 'L') ('o' / 'O') '1' '2' ':' SymbolName)> */ func() bool { - position768, tokenIndex768 := position, tokenIndex + position754, tokenIndex754 := position, tokenIndex { - position769 := position + position755 := position if buffer[position] != rune(':') { - goto l768 + goto l754 } position++ { - position770, tokenIndex770 := position, tokenIndex + position756, tokenIndex756 := position, tokenIndex if buffer[position] != rune('g') { - goto l771 + goto l757 } position++ - goto l770 - l771: - position, tokenIndex = position770, tokenIndex770 + goto l756 + l757: + position, tokenIndex = position756, tokenIndex756 if buffer[position] != rune('G') { - goto l768 + goto l754 } position++ } - l770: + l756: { - position772, tokenIndex772 := position, tokenIndex + position758, tokenIndex758 := position, tokenIndex if buffer[position] != rune('o') { - goto l773 + goto l759 } position++ - goto l772 - l773: - position, tokenIndex = position772, tokenIndex772 + goto l758 + l759: + position, tokenIndex = position758, tokenIndex758 if buffer[position] != rune('O') { - goto l768 + goto l754 } position++ } - l772: + l758: { - position774, tokenIndex774 := position, tokenIndex + position760, tokenIndex760 := position, tokenIndex if buffer[position] != rune('t') { - goto l775 + goto l761 } position++ - goto l774 - l775: - position, tokenIndex = position774, tokenIndex774 + goto l760 + l761: + position, tokenIndex = position760, tokenIndex760 if buffer[position] != rune('T') { - goto l768 + goto l754 } position++ } - l774: + l760: if buffer[position] != rune('_') { - goto l768 + goto l754 } position++ { - position776, tokenIndex776 := position, tokenIndex + position762, tokenIndex762 := position, tokenIndex if buffer[position] != rune('l') { - goto l777 + goto l763 } position++ - goto l776 - l777: - position, tokenIndex = position776, tokenIndex776 + goto l762 + l763: + position, tokenIndex = position762, tokenIndex762 if buffer[position] != rune('L') { - goto l768 + goto l754 } position++ } - l776: + l762: { - position778, tokenIndex778 := position, tokenIndex + position764, tokenIndex764 := position, tokenIndex if buffer[position] != rune('o') { - goto l779 + goto l765 } position++ - goto l778 - l779: - position, tokenIndex = position778, tokenIndex778 + goto l764 + l765: + position, tokenIndex = position764, tokenIndex764 if buffer[position] != rune('O') { - goto l768 + goto l754 } position++ } - l778: + l764: if buffer[position] != rune('1') { - goto l768 + goto l754 } position++ if buffer[position] != rune('2') { - goto l768 + goto l754 } position++ if buffer[position] != rune(':') { - goto l768 + goto l754 } position++ if !_rules[ruleSymbolName]() { - goto l768 + goto l754 } - add(ruleARMGOTLow12, position769) + add(ruleARMGOTLow12, position755) } return true - l768: - position, tokenIndex = position768, tokenIndex768 + l754: + position, tokenIndex = position754, tokenIndex754 return false }, /* 48 ARMPostincrement <- <'!'> */ func() bool { - position780, tokenIndex780 := position, tokenIndex + position766, tokenIndex766 := position, tokenIndex { - position781 := position + position767 := position if buffer[position] != rune('!') { - goto l780 + goto l766 } position++ - add(ruleARMPostincrement, position781) + add(ruleARMPostincrement, position767) } return true - l780: - position, tokenIndex = position780, tokenIndex780 + l766: + position, tokenIndex = position766, tokenIndex766 return false }, /* 49 BaseIndexScale <- <('(' RegisterOrConstant? WS? (',' WS? RegisterOrConstant WS? (',' [0-9]+)?)? ')')> */ func() bool { - position782, tokenIndex782 := position, tokenIndex + position768, tokenIndex768 := position, tokenIndex { - position783 := position + position769 := position if buffer[position] != rune('(') { - goto l782 + goto l768 } position++ { - position784, tokenIndex784 := position, tokenIndex + position770, tokenIndex770 := position, tokenIndex if !_rules[ruleRegisterOrConstant]() { - goto l784 + goto l770 } - goto l785 - l784: - position, tokenIndex = position784, tokenIndex784 + goto l771 + l770: + position, tokenIndex = position770, tokenIndex770 } - l785: + l771: { - position786, tokenIndex786 := position, tokenIndex + position772, tokenIndex772 := position, tokenIndex if !_rules[ruleWS]() { - goto l786 + goto l772 } - goto l787 - l786: - position, tokenIndex = position786, tokenIndex786 + goto l773 + l772: + position, tokenIndex = position772, tokenIndex772 } - l787: + l773: { - position788, tokenIndex788 := position, tokenIndex + position774, tokenIndex774 := position, tokenIndex if buffer[position] != rune(',') { - goto l788 + goto l774 } position++ { - position790, tokenIndex790 := position, tokenIndex + position776, tokenIndex776 := position, tokenIndex if !_rules[ruleWS]() { - goto l790 + goto l776 } - goto l791 - l790: - position, tokenIndex = position790, tokenIndex790 + goto l777 + l776: + position, tokenIndex = position776, tokenIndex776 } - l791: + l777: if !_rules[ruleRegisterOrConstant]() { - goto l788 + goto l774 } { - position792, tokenIndex792 := position, tokenIndex + position778, tokenIndex778 := position, tokenIndex if !_rules[ruleWS]() { - goto l792 + goto l778 } - goto l793 - l792: - position, tokenIndex = position792, tokenIndex792 + goto l779 + l778: + position, tokenIndex = position778, tokenIndex778 } - l793: + l779: { - position794, tokenIndex794 := position, tokenIndex + position780, tokenIndex780 := position, tokenIndex if buffer[position] != rune(',') { - goto l794 + goto l780 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l794 + goto l780 } position++ - l796: + l782: { - position797, tokenIndex797 := position, tokenIndex + position783, tokenIndex783 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l797 + goto l783 } position++ - goto l796 - l797: - position, tokenIndex = position797, tokenIndex797 + goto l782 + l783: + position, tokenIndex = position783, tokenIndex783 } - goto l795 - l794: - position, tokenIndex = position794, tokenIndex794 + goto l781 + l780: + position, tokenIndex = position780, tokenIndex780 } - l795: - goto l789 - l788: - position, tokenIndex = position788, tokenIndex788 + l781: + goto l775 + l774: + position, tokenIndex = position774, tokenIndex774 } - l789: + l775: if buffer[position] != rune(')') { - goto l782 + goto l768 } position++ - add(ruleBaseIndexScale, position783) + add(ruleBaseIndexScale, position769) } return true - l782: - position, tokenIndex = position782, tokenIndex782 + l768: + position, tokenIndex = position768, tokenIndex768 return false }, /* 50 Operator <- <('+' / '-')> */ func() bool { - position798, tokenIndex798 := position, tokenIndex + position784, tokenIndex784 := position, tokenIndex { - position799 := position + position785 := position { - position800, tokenIndex800 := position, tokenIndex + position786, tokenIndex786 := position, tokenIndex if buffer[position] != rune('+') { - goto l801 + goto l787 } position++ - goto l800 - l801: - position, tokenIndex = position800, tokenIndex800 + goto l786 + l787: + position, tokenIndex = position786, tokenIndex786 if buffer[position] != rune('-') { - goto l798 + goto l784 } position++ } - l800: - add(ruleOperator, position799) + l786: + add(ruleOperator, position785) } return true - l798: - position, tokenIndex = position798, tokenIndex798 + l784: + position, tokenIndex = position784, tokenIndex784 return false }, /* 51 Offset <- <('+'? '-'? (('0' ('b' / 'B') ('0' / '1')+) / ('0' ('x' / 'X') ([0-9] / [0-9] / ([a-f] / [A-F]))+) / [0-9]+))> */ func() bool { - position802, tokenIndex802 := position, tokenIndex + position788, tokenIndex788 := position, tokenIndex { - position803 := position + position789 := position { - position804, tokenIndex804 := position, tokenIndex + position790, tokenIndex790 := position, tokenIndex if buffer[position] != rune('+') { - goto l804 + goto l790 } position++ - goto l805 - l804: - position, tokenIndex = position804, tokenIndex804 + goto l791 + l790: + position, tokenIndex = position790, tokenIndex790 } - l805: + l791: { - position806, tokenIndex806 := position, tokenIndex + position792, tokenIndex792 := position, tokenIndex if buffer[position] != rune('-') { - goto l806 + goto l792 } position++ - goto l807 - l806: - position, tokenIndex = position806, tokenIndex806 + goto l793 + l792: + position, tokenIndex = position792, tokenIndex792 } - l807: + l793: { - position808, tokenIndex808 := position, tokenIndex + position794, tokenIndex794 := position, tokenIndex if buffer[position] != rune('0') { - goto l809 + goto l795 } position++ { - position810, tokenIndex810 := position, tokenIndex + position796, tokenIndex796 := position, tokenIndex if buffer[position] != rune('b') { - goto l811 + goto l797 } position++ - goto l810 - l811: - position, tokenIndex = position810, tokenIndex810 + goto l796 + l797: + position, tokenIndex = position796, tokenIndex796 if buffer[position] != rune('B') { - goto l809 + goto l795 } position++ } - l810: + l796: { - position814, tokenIndex814 := position, tokenIndex + position800, tokenIndex800 := position, tokenIndex if buffer[position] != rune('0') { - goto l815 + goto l801 } position++ - goto l814 - l815: - position, tokenIndex = position814, tokenIndex814 + goto l800 + l801: + position, tokenIndex = position800, tokenIndex800 if buffer[position] != rune('1') { - goto l809 + goto l795 } position++ } - l814: - l812: + l800: + l798: { - position813, tokenIndex813 := position, tokenIndex + position799, tokenIndex799 := position, tokenIndex { - position816, tokenIndex816 := position, tokenIndex + position802, tokenIndex802 := position, tokenIndex if buffer[position] != rune('0') { - goto l817 + goto l803 } position++ - goto l816 - l817: - position, tokenIndex = position816, tokenIndex816 + goto l802 + l803: + position, tokenIndex = position802, tokenIndex802 if buffer[position] != rune('1') { - goto l813 + goto l799 } position++ } - l816: - goto l812 - l813: - position, tokenIndex = position813, tokenIndex813 + l802: + goto l798 + l799: + position, tokenIndex = position799, tokenIndex799 } - goto l808 - l809: - position, tokenIndex = position808, tokenIndex808 + goto l794 + l795: + position, tokenIndex = position794, tokenIndex794 if buffer[position] != rune('0') { - goto l818 + goto l804 } position++ { - position819, tokenIndex819 := position, tokenIndex + position805, tokenIndex805 := position, tokenIndex if buffer[position] != rune('x') { - goto l820 + goto l806 } position++ - goto l819 - l820: - position, tokenIndex = position819, tokenIndex819 + goto l805 + l806: + position, tokenIndex = position805, tokenIndex805 if buffer[position] != rune('X') { - goto l818 + goto l804 } position++ } - l819: + l805: { - position823, tokenIndex823 := position, tokenIndex + position809, tokenIndex809 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l824 + goto l810 } position++ - goto l823 - l824: - position, tokenIndex = position823, tokenIndex823 + goto l809 + l810: + position, tokenIndex = position809, tokenIndex809 if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l825 + goto l811 } position++ - goto l823 - l825: - position, tokenIndex = position823, tokenIndex823 + goto l809 + l811: + position, tokenIndex = position809, tokenIndex809 { - position826, tokenIndex826 := position, tokenIndex + position812, tokenIndex812 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('f') { - goto l827 + goto l813 } position++ - goto l826 - l827: - position, tokenIndex = position826, tokenIndex826 + goto l812 + l813: + position, tokenIndex = position812, tokenIndex812 if c := buffer[position]; c < rune('A') || c > rune('F') { - goto l818 + goto l804 } position++ } - l826: + l812: } - l823: - l821: + l809: + l807: { - position822, tokenIndex822 := position, tokenIndex + position808, tokenIndex808 := position, tokenIndex { - position828, tokenIndex828 := position, tokenIndex + position814, tokenIndex814 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l829 + goto l815 } position++ - goto l828 - l829: - position, tokenIndex = position828, tokenIndex828 + goto l814 + l815: + position, tokenIndex = position814, tokenIndex814 if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l830 + goto l816 } position++ - goto l828 - l830: - position, tokenIndex = position828, tokenIndex828 + goto l814 + l816: + position, tokenIndex = position814, tokenIndex814 { - position831, tokenIndex831 := position, tokenIndex + position817, tokenIndex817 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('f') { - goto l832 + goto l818 } position++ - goto l831 - l832: - position, tokenIndex = position831, tokenIndex831 + goto l817 + l818: + position, tokenIndex = position817, tokenIndex817 if c := buffer[position]; c < rune('A') || c > rune('F') { - goto l822 + goto l808 } position++ } - l831: + l817: } - l828: - goto l821 - l822: - position, tokenIndex = position822, tokenIndex822 + l814: + goto l807 + l808: + position, tokenIndex = position808, tokenIndex808 } - goto l808 - l818: - position, tokenIndex = position808, tokenIndex808 + goto l794 + l804: + position, tokenIndex = position794, tokenIndex794 if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l802 + goto l788 } position++ - l833: + l819: { - position834, tokenIndex834 := position, tokenIndex + position820, tokenIndex820 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l834 + goto l820 } position++ - goto l833 - l834: - position, tokenIndex = position834, tokenIndex834 + goto l819 + l820: + position, tokenIndex = position820, tokenIndex820 } } - l808: - add(ruleOffset, position803) + l794: + add(ruleOffset, position789) } return true - l802: - position, tokenIndex = position802, tokenIndex802 + l788: + position, tokenIndex = position788, tokenIndex788 return false }, /* 52 Section <- <([a-z] / [A-Z] / '@')+> */ func() bool { - position835, tokenIndex835 := position, tokenIndex + position821, tokenIndex821 := position, tokenIndex { - position836 := position + position822 := position { - position839, tokenIndex839 := position, tokenIndex + position825, tokenIndex825 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l840 + goto l826 } position++ - goto l839 - l840: - position, tokenIndex = position839, tokenIndex839 + goto l825 + l826: + position, tokenIndex = position825, tokenIndex825 if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l841 + goto l827 } position++ - goto l839 - l841: - position, tokenIndex = position839, tokenIndex839 + goto l825 + l827: + position, tokenIndex = position825, tokenIndex825 if buffer[position] != rune('@') { - goto l835 + goto l821 } position++ } - l839: - l837: + l825: + l823: { - position838, tokenIndex838 := position, tokenIndex + position824, tokenIndex824 := position, tokenIndex { - position842, tokenIndex842 := position, tokenIndex + position828, tokenIndex828 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l843 + goto l829 } position++ - goto l842 - l843: - position, tokenIndex = position842, tokenIndex842 + goto l828 + l829: + position, tokenIndex = position828, tokenIndex828 if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l844 + goto l830 } position++ - goto l842 - l844: - position, tokenIndex = position842, tokenIndex842 + goto l828 + l830: + position, tokenIndex = position828, tokenIndex828 if buffer[position] != rune('@') { - goto l838 + goto l824 } position++ } - l842: - goto l837 - l838: - position, tokenIndex = position838, tokenIndex838 + l828: + goto l823 + l824: + position, tokenIndex = position824, tokenIndex824 } - add(ruleSection, position836) + add(ruleSection, position822) } return true - l835: - position, tokenIndex = position835, tokenIndex835 + l821: + position, tokenIndex = position821, tokenIndex821 return false }, /* 53 SegmentRegister <- <('%' ([c-g] / 's') ('s' ':'))> */ func() bool { - position845, tokenIndex845 := position, tokenIndex + position831, tokenIndex831 := position, tokenIndex { - position846 := position + position832 := position if buffer[position] != rune('%') { - goto l845 + goto l831 } position++ { - position847, tokenIndex847 := position, tokenIndex + position833, tokenIndex833 := position, tokenIndex if c := buffer[position]; c < rune('c') || c > rune('g') { - goto l848 + goto l834 } position++ - goto l847 - l848: - position, tokenIndex = position847, tokenIndex847 + goto l833 + l834: + position, tokenIndex = position833, tokenIndex833 if buffer[position] != rune('s') { - goto l845 + goto l831 } position++ } - l847: + l833: if buffer[position] != rune('s') { - goto l845 + goto l831 } position++ if buffer[position] != rune(':') { - goto l845 + goto l831 } position++ - add(ruleSegmentRegister, position846) + add(ruleSegmentRegister, position832) } return true - l845: - position, tokenIndex = position845, tokenIndex845 + l831: + position, tokenIndex = position831, tokenIndex831 return false }, } diff --git a/third_party/boringssl/src/util/fipstools/delocate/delocate_test.go b/third_party/boringssl/src/util/fipstools/delocate/delocate_test.go index 43b3ff1c0d0e..e341a3815fef 100644 --- a/third_party/boringssl/src/util/fipstools/delocate/delocate_test.go +++ b/third_party/boringssl/src/util/fipstools/delocate/delocate_test.go @@ -10,14 +10,14 @@ // 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 import ( "bytes" "flag" - "io/ioutil" + "os" "path/filepath" "testing" ) @@ -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"}, @@ -65,7 +60,7 @@ func TestDelocate(t *testing.T) { }) } - if err := parseInputs(inputs); err != nil { + if err := parseInputs(inputs, nil); err != nil { t.Fatalf("parseInputs failed: %s", err) } @@ -75,9 +70,9 @@ func TestDelocate(t *testing.T) { } if *update { - ioutil.WriteFile(test.Path(test.out), buf.Bytes(), 0666) + os.WriteFile(test.Path(test.out), buf.Bytes(), 0666) } else { - expected, err := ioutil.ReadFile(test.Path(test.out)) + expected, err := os.ReadFile(test.Path(test.out)) if err != nil { t.Fatalf("could not read %q: %s", test.Path(test.out), err) } diff --git a/third_party/boringssl/src/util/fipstools/delocate/testdata/aarch64-Basic/in.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/aarch64-Basic/in.s index 3b80125a0a5b..8b45e25fdfe0 100644 --- a/third_party/boringssl/src/util/fipstools/delocate/testdata/aarch64-Basic/in.s +++ b/third_party/boringssl/src/util/fipstools/delocate/testdata/aarch64-Basic/in.s @@ -43,9 +43,41 @@ foo: bl bss_symbol_bss_get - # Regression test for a two-digit index. + // Regression test for a two-digit index. ld1 { v1.b }[10], [x9] + // Ensure that registers aren't interpreted as symbols. + add x0, x0 + add x12, x12 + add w0, x0 + add w12, x12 + add d0, d0 + add d12, d12 + add q0, q0 + add q12, q12 + add s0, s0 + add s12, s12 + add h0, h0 + add h12, h12 + add b0, b0 + add b12, b12 + + // But 'y' is not a register prefix so far, so these should be + // processed as symbols. + add y0, y0 + add y12, y12 + + // Make sure that the magic extension constants are recognised rather + // than being interpreted as symbols. + add w0, w1, b2, uxtb + add w0, w1, b2, uxth + add w0, w1, b2, uxtw + add w0, w1, b2, uxtx + add w0, w1, b2, sxtb + add w0, w1, b2, sxth + add w0, w1, b2, sxtw + add w0, w1, b2, sxtx + local_function: diff --git a/third_party/boringssl/src/util/fipstools/delocate/testdata/aarch64-Basic/out.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/aarch64-Basic/out.s index 96eb77882e71..0b9828f8515e 100644 --- a/third_party/boringssl/src/util/fipstools/delocate/testdata/aarch64-Basic/out.s +++ b/third_party/boringssl/src/util/fipstools/delocate/testdata/aarch64-Basic/out.s @@ -88,9 +88,43 @@ foo: bl bss_symbol_bss_get - # Regression test for a two-digit index. + // Regression test for a two-digit index. ld1 { v1.b }[10], [x9] + // Ensure that registers aren't interpreted as symbols. + add x0, x0 + add x12, x12 + add w0, x0 + add w12, x12 + add d0, d0 + add d12, d12 + add q0, q0 + add q12, q12 + add s0, s0 + add s12, s12 + add h0, h0 + add h12, h12 + add b0, b0 + add b12, b12 + + // But 'y' is not a register prefix so far, so these should be + // processed as symbols. +// WAS add y0, y0 + add bcm_redirector_y0, bcm_redirector_y0 +// WAS add y12, y12 + add bcm_redirector_y12, bcm_redirector_y12 + + // Make sure that the magic extension constants are recognised rather + // than being interpreted as symbols. + add w0, w1, b2, uxtb + add w0, w1, b2, uxth + add w0, w1, b2, uxtw + add w0, w1, b2, uxtx + add w0, w1, b2, sxtb + add w0, w1, b2, sxth + add w0, w1, b2, sxtw + add w0, w1, b2, sxtx + .Llocal_function_local_target: local_function: @@ -115,6 +149,22 @@ bcm_redirector_remote_function: .cfi_endproc .size bcm_redirector_remote_function, .-bcm_redirector_remote_function .p2align 2 +.hidden bcm_redirector_y0 +.type bcm_redirector_y0, @function +bcm_redirector_y0: +.cfi_startproc + b y0 +.cfi_endproc +.size bcm_redirector_y0, .-bcm_redirector_y0 +.p2align 2 +.hidden bcm_redirector_y12 +.type bcm_redirector_y12, @function +bcm_redirector_y12: +.cfi_startproc + b y12 +.cfi_endproc +.size bcm_redirector_y12, .-bcm_redirector_y12 +.p2align 2 .hidden bss_symbol_bss_get .type bss_symbol_bss_get, @function bss_symbol_bss_get: diff --git a/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/in.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/in.s deleted file mode 100644 index af1a182cf522..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-GlobalEntry/out.s deleted file mode 100644 index d75e2c7f1d08..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-LoadToR0/in.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-LoadToR0/in.s deleted file mode 100644 index 81766dc07eef..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-LoadToR0/out.s deleted file mode 100644 index dad7603ab0e8..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-Sample/in.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-Sample/in.s deleted file mode 100644 index 6e7422ab5489..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-Sample/out.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-Sample/out.s deleted file mode 100644 index 798bcf52988d..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-Sample2/in.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-Sample2/in.s deleted file mode 100644 index eb856269bc94..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-Sample2/out.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-Sample2/out.s deleted file mode 100644 index 643974053cb0..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/in.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/in.s deleted file mode 100644 index 94ea211115ae..000000000000 --- a/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s b/third_party/boringssl/src/util/fipstools/delocate/testdata/ppc64le-TOCWithOffset/out.s deleted file mode 100644 index fc55ef2073bd..000000000000 --- a/third_party/boringssl/src/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 diff --git a/third_party/boringssl/src/util/fipstools/fipscommon/const.go b/third_party/boringssl/src/util/fipstools/fipscommon/const.go index f4c0b75d46c8..c709961e14c7 100644 --- a/third_party/boringssl/src/util/fipstools/fipscommon/const.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/fipstools/inject_hash/inject_hash.go b/third_party/boringssl/src/util/fipstools/inject_hash/inject_hash.go index 6f14982bdaa5..9c3083663942 100644 --- a/third_party/boringssl/src/util/fipstools/inject_hash/inject_hash.go +++ b/third_party/boringssl/src/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 @@ -27,7 +27,6 @@ import ( "flag" "fmt" "io" - "io/ioutil" "os" "strings" @@ -78,7 +77,7 @@ func do(outPath, oInput string, arInput string) error { } perm = fi.Mode() - if objectBytes, err = ioutil.ReadFile(oInput); err != nil { + if objectBytes, err = os.ReadFile(oInput); err != nil { return err } isStatic = strings.HasSuffix(oInput, ".o") @@ -245,7 +244,7 @@ func do(outPath, oInput string, arInput string) error { copy(objectBytes[offset:], calculated) - return ioutil.WriteFile(outPath, objectBytes, perm & 0777) + return os.WriteFile(outPath, objectBytes, perm&0777) } func main() { diff --git a/third_party/boringssl/src/util/fipstools/test_fips.c b/third_party/boringssl/src/util/fipstools/test_fips.c index 42ed96b222bb..3a1f7fcebb97 100644 --- a/third_party/boringssl/src/util/fipstools/test_fips.c +++ b/third_party/boringssl/src/util/fipstools/test_fips.c @@ -24,8 +24,9 @@ #include #include #include -#include #include +#include +#include #include #include #include @@ -278,18 +279,43 @@ int main(int argc, char **argv) { hexdump(output, sizeof(output)); CTR_DRBG_clear(&drbg); - /* TLS KDF */ - printf("About to run TLS KDF\n"); - uint8_t tls_output[32]; - if (!CRYPTO_tls1_prf(EVP_sha256(), tls_output, sizeof(tls_output), kAESKey, - sizeof(kAESKey), "foo", 3, kPlaintextSHA256, + /* HKDF */ + printf("About to run HKDF\n"); + uint8_t hkdf_output[32]; + if (!HKDF(hkdf_output, sizeof(hkdf_output), EVP_sha256(), kAESKey, + sizeof(kAESKey), (const uint8_t *)"salt", 4, kPlaintextSHA256, + sizeof(kPlaintextSHA256))) { + fprintf(stderr, "HKDF failed.\n"); + goto err; + } + printf(" got "); + hexdump(hkdf_output, sizeof(hkdf_output)); + + /* TLS v1.2 KDF */ + printf("About to run TLS v1.2 KDF\n"); + uint8_t tls12_output[32]; + if (!CRYPTO_tls1_prf(EVP_sha256(), tls12_output, sizeof(tls12_output), + kAESKey, sizeof(kAESKey), "foo", 3, kPlaintextSHA256, sizeof(kPlaintextSHA256), kPlaintextSHA256, sizeof(kPlaintextSHA256))) { - fprintf(stderr, "TLS KDF failed.\n"); + fprintf(stderr, "TLS v1.2 KDF failed.\n"); + goto err; + } + printf(" got "); + hexdump(tls12_output, sizeof(tls12_output)); + + /* TLS v1.3 KDF */ + printf("About to run TLS v1.3 KDF\n"); + uint8_t tls13_output[32]; + if (!CRYPTO_tls13_hkdf_expand_label( + tls13_output, sizeof(tls13_output), EVP_sha256(), kAESKey, + sizeof(kAESKey), (const uint8_t *)"foo", 3, kPlaintextSHA256, + sizeof(kPlaintextSHA256))) { + fprintf(stderr, "TLS v1.3 KDF failed.\n"); goto err; } printf(" got "); - hexdump(tls_output, sizeof(tls_output)); + hexdump(tls13_output, sizeof(tls13_output)); /* FFDH */ printf("About to compute FFDH key-agreement:\n"); @@ -313,5 +339,6 @@ int main(int argc, char **argv) { err: printf("FAIL\n"); + fflush(stdout); abort(); } diff --git a/third_party/boringssl/src/util/generate_build_files.py b/third_party/boringssl/src/util/generate_build_files.py index 186fb59eda2c..386910b15b7b 100644 --- a/third_party/boringssl/src/util/generate_build_files.py +++ b/third_party/boringssl/src/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'), @@ -32,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'), @@ -60,24 +62,35 @@ def PathOf(x): return x if not PREFIX else os.path.join(PREFIX, x) +LICENSE_TEMPLATE = """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.""".split("\n") + +def LicenseHeader(comment): + lines = [] + for line in LICENSE_TEMPLATE: + if not line: + lines.append(comment) + else: + lines.append("%s %s" % (comment, line)) + lines.append("") + return "\n".join(lines) + + class Android(object): def __init__(self): - self.header = \ -"""# Copyright (C) 2015 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - + self.header = LicenseHeader("#") + """ # This file is created by generate_build_files.py. Do not edit manually. """ @@ -131,7 +144,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' @@ -156,6 +169,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] @@ -163,21 +179,7 @@ def FilterBcmAsm(self, asm, want_bcm): class AndroidCMake(object): def __init__(self): - self.header = \ -"""# Copyright (C) 2019 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - + self.header = LicenseHeader("#") + """ # This file is created by generate_build_files.py. Do not edit manually. # To specify a custom path prefix, set BORINGSSL_ROOT before including this # file, or use list(TRANSFORM ... PREPEND) from CMake 3.12. @@ -256,6 +258,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) @@ -282,21 +301,7 @@ def WriteFiles(self, files, asm_outputs): class Eureka(object): def __init__(self): - self.header = \ -"""# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - + self.header = LicenseHeader("#") + """ # This file is created by generate_build_files.py. Do not edit manually. """ @@ -327,11 +332,7 @@ class GN(object): def __init__(self): self.firstSection = True - self.header = \ -"""# Copyright (c) 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - + self.header = LicenseHeader("#") + """ # This file is created by generate_build_files.py. Do not edit manually. """ @@ -386,11 +387,7 @@ def WriteFiles(self, files, asm_outputs): class GYP(object): def __init__(self): - self.header = \ -"""# Copyright (c) 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - + self.header = LicenseHeader("#") + """ # This file is created by generate_build_files.py. Do not edit manually. """ @@ -421,32 +418,24 @@ def WriteFiles(self, files, asm_outputs): class CMake(object): def __init__(self): - self.header = \ -R'''# Copyright (c) 2019 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - + 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) -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") - if(APPLE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") - endif() - - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fno-common -std=c11") +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() -# 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() @@ -456,77 +445,24 @@ 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") -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le") - set(ARCH "ppc64le") 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() - - # CMake does not add -isysroot and -arch flags to assembly. - if(APPLE) + set(OPENSSL_ASM TRUE) + # 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() @@ -534,9 +470,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() @@ -547,11 +487,9 @@ def __init__(self): set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) endif() -include_directories(src/include) - ''' - def PrintLibrary(self, out, name, files): + def PrintLibrary(self, out, name, files, libs=[]): out.write('add_library(\n') out.write(' %s\n\n' % name) @@ -559,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') @@ -570,7 +510,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): @@ -581,33 +521,40 @@ 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}']) - self.PrintLibrary(cmake, 'ssl', files['ssl']) + files['crypto'] + ['${CRYPTO_SOURCES_ASM_USED}']) + 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( -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) - target_link_libraries(bssl ws2_32) + target_link_libraries(crypto ws2_32) endif() ''') @@ -732,12 +679,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 @@ -764,51 +711,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) @@ -965,8 +889,9 @@ def NotSSLHeaderFiles(path, filename, is_dir): } if __name__ == '__main__': - parser = optparse.OptionParser(usage='Usage: %%prog [--prefix=] [%s]' % - '|'.join(sorted(ALL_PLATFORMS.keys()))) + parser = optparse.OptionParser( + usage='Usage: %%prog [--prefix=] [all|%s]' % + '|'.join(sorted(ALL_PLATFORMS.keys()))) parser.add_option('--prefix', dest='prefix', help='For Bazel, prepend argument to all source files') parser.add_option( @@ -981,12 +906,15 @@ def NotSSLHeaderFiles(path, filename, is_dir): parser.print_help() sys.exit(1) - platforms = [] - for s in args: - platform = ALL_PLATFORMS.get(s) - if platform is None: - parser.print_help() - sys.exit(1) - platforms.append(platform()) + if 'all' in args: + platforms = [platform() for platform in ALL_PLATFORMS.values()] + else: + platforms = [] + for s in args: + platform = ALL_PLATFORMS.get(s) + if platform is None: + parser.print_help() + sys.exit(1) + platforms.append(platform()) sys.exit(main(platforms)) diff --git a/third_party/boringssl/src/util/go_tests.txt b/third_party/boringssl/src/util/go_tests.txt new file mode 100644 index 000000000000..0f43cf6871da --- /dev/null +++ b/third_party/boringssl/src/util/go_tests.txt @@ -0,0 +1,4 @@ +./ssl/test/runner/hpke +./util/ar +./util/fipstools/acvp/acvptool/testmodulewrapper +./util/fipstools/delocate diff --git a/third_party/boringssl/src/util/godeps.go b/third_party/boringssl/src/util/godeps.go index 960faa46be87..56be55944f62 100644 --- a/third_party/boringssl/src/util/godeps.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/make_errors.go b/third_party/boringssl/src/util/make_errors.go index 4e2718b8d9ad..874a001b2943 100644 --- a/third_party/boringssl/src/util/make_errors.go +++ b/third_party/boringssl/src/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 ( @@ -188,28 +190,13 @@ type assignment struct { value int } -type assignmentsSlice []assignment - -func (a assignmentsSlice) Len() int { - return len(a) -} - -func (a assignmentsSlice) Less(i, j int) bool { - return a[i].value < a[j].value -} - -func (a assignmentsSlice) Swap(i, j int) { - a[i], a[j] = a[j], a[i] -} - func outputAssignments(w io.Writer, assignments map[string]int) { - var sorted assignmentsSlice - + sorted := make([]assignment, 0, len(assignments)) for key, value := range assignments { sorted = append(sorted, assignment{key, value}) } - sort.Sort(sorted) + sort.Slice(sorted, func(i, j int) bool { return sorted[i].value < sorted[j].value }) for _, assignment := range sorted { fmt.Fprintf(w, "#define %s %d\n", assignment.key, assignment.value) diff --git a/third_party/boringssl/src/util/make_prefix_headers.go b/third_party/boringssl/src/util/make_prefix_headers.go index b536f14ceaa0..8787654b5c38 100644 --- a/third_party/boringssl/src/util/make_prefix_headers.go +++ b/third_party/boringssl/src/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/third_party/boringssl/src/util/read_symbols.go b/third_party/boringssl/src/util/read_symbols.go index 96c148ab5a91..ab2184c0cc0d 100644 --- a/third_party/boringssl/src/util/read_symbols.go +++ b/third_party/boringssl/src/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 @@ -176,6 +178,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 } diff --git a/third_party/boringssl/src/util/run_android_tests.go b/third_party/boringssl/src/util/run_android_tests.go index 5eae742dabcc..ce878195fc41 100644 --- a/third_party/boringssl/src/util/run_android_tests.go +++ b/third_party/boringssl/src/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 ( @@ -21,7 +23,6 @@ import ( "flag" "fmt" "io" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -232,13 +233,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) } @@ -293,7 +295,7 @@ func main() { } // Stage everything in a temporary directory. - tmpDir, err := ioutil.TempDir("", "boringssl-android") + tmpDir, err := os.MkdirTemp("", "boringssl-android") if err != nil { fmt.Printf("Error making temporary directory: %s\n", err) os.Exit(1) diff --git a/third_party/boringssl/win-aarch64/crypto/chacha/chacha-armv8.S b/third_party/boringssl/win-aarch64/crypto/chacha/chacha-armv8-win.S similarity index 99% rename from third_party/boringssl/win-aarch64/crypto/chacha/chacha-armv8.S rename to third_party/boringssl/win-aarch64/crypto/chacha/chacha-armv8-win.S index 1e4947a7fe57..8a815438dce3 100644 --- a/third_party/boringssl/win-aarch64/crypto/chacha/chacha-armv8.S +++ b/third_party/boringssl/win-aarch64/crypto/chacha/chacha-armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1996,5 +1995,8 @@ Ldone_512_neon: AARCH64_VALIDATE_LINK_REGISTER ret +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S b/third_party/boringssl/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-win.S similarity index 99% rename from third_party/boringssl/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S rename to third_party/boringssl/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-win.S index 9f303328f359..8c22c4d58463 100644 --- a/third_party/boringssl/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8.S +++ b/third_party/boringssl/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -3021,5 +3020,8 @@ Lopen_128_hash_64: b Lopen_128_hash_64 .cfi_endproc +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/aesv8-armx64.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/aesv8-armv8-win.S similarity index 98% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/aesv8-armx64.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/aesv8-armv8-win.S index 62993f91e045..5afdfaba1ea9 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/aesv8-armx64.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/aesv8-armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -809,5 +808,8 @@ Lctr32_done: ret #endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-win.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-win.S new file mode 100644 index 000000000000..89c0cc249ba2 --- /dev/null +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-win.S @@ -0,0 +1,1571 @@ +// This file is generated from a similarly-named Perl script in the BoringSSL +// source tree. Do not edit by hand. + +#if !defined(__has_feature) +#define __has_feature(x) 0 +#endif +#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) +#define OPENSSL_NO_ASM +#endif + +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(BORINGSSL_PREFIX) +#include +#endif +#include +#if __ARM_MAX_ARCH__ >= 8 + +.arch armv8-a+crypto +.text +.globl aes_gcm_enc_kernel + +.def aes_gcm_enc_kernel + .type 32 +.endef +.align 4 +aes_gcm_enc_kernel: + AARCH64_SIGN_LINK_REGISTER + stp x29, x30, [sp, #-128]! + mov x29, sp + stp x19, x20, [sp, #16] + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #32] + stp x23, x24, [sp, #48] + stp d8, d9, [sp, #64] + stp d10, d11, [sp, #80] + stp d12, d13, [sp, #96] + stp d14, d15, [sp, #112] + ldr w17, [x8, #240] + add x19, x8, x17, lsl #4 // borrow input_l1 for last key + ldp x13, x14, [x19] // load round N keys + ldr q31, [x19, #-16] // load round N-1 keys + add x4, x0, x1, lsr #3 // end_input_ptr + lsr x5, x1, #3 // byte_len + mov x15, x5 + ldp x10, x11, [x16] // ctr96_b64, ctr96_t32 + ld1 { v0.16b}, [x16] // special case vector load initial counter so we can start first AES block as quickly as possible + sub x5, x5, #1 // byte_len - 1 + ldr q18, [x8, #0] // load rk0 + and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + ldr q25, [x8, #112] // load rk7 + add x5, x5, x0 + lsr x12, x11, #32 + fmov d2, x10 // CTR block 2 + orr w11, w11, w11 + rev w12, w12 // rev_ctr32 + fmov d1, x10 // CTR block 1 + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 0 - round 0 + add w12, w12, #1 // increment rev_ctr32 + rev w9, w12 // CTR block 1 + fmov d3, x10 // CTR block 3 + orr x9, x11, x9, lsl #32 // CTR block 1 + add w12, w12, #1 // CTR block 1 + ldr q19, [x8, #16] // load rk1 + fmov v1.d[1], x9 // CTR block 1 + rev w9, w12 // CTR block 2 + add w12, w12, #1 // CTR block 2 + orr x9, x11, x9, lsl #32 // CTR block 2 + ldr q20, [x8, #32] // load rk2 + fmov v2.d[1], x9 // CTR block 2 + rev w9, w12 // CTR block 3 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 0 - round 1 + orr x9, x11, x9, lsl #32 // CTR block 3 + fmov v3.d[1], x9 // CTR block 3 + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 1 - round 0 + ldr q21, [x8, #48] // load rk3 + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 0 - round 2 + ldr q24, [x8, #96] // load rk6 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 2 - round 0 + ldr q23, [x8, #80] // load rk5 + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 1 - round 1 + ldr q14, [x3, #80] // load h3l | h3h + ext v14.16b, v14.16b, v14.16b, #8 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 3 - round 0 + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 2 - round 1 + ldr q22, [x8, #64] // load rk4 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 1 - round 2 + ldr q13, [x3, #64] // load h2l | h2h + ext v13.16b, v13.16b, v13.16b, #8 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 3 - round 1 + ldr q30, [x8, #192] // load rk12 + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 2 - round 2 + ldr q15, [x3, #112] // load h4l | h4h + ext v15.16b, v15.16b, v15.16b, #8 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 1 - round 3 + ldr q29, [x8, #176] // load rk11 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 3 - round 2 + ldr q26, [x8, #128] // load rk8 + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 2 - round 3 + add w12, w12, #1 // CTR block 3 + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 0 - round 3 + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 3 - round 3 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 2 - round 4 + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 0 - round 4 + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 1 - round 4 + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 3 - round 4 + cmp x17, #12 // setup flags for AES-128/192/256 check + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 0 - round 5 + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 1 - round 5 + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 3 - round 5 + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 2 - round 5 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 1 - round 6 + trn2 v17.2d, v14.2d, v15.2d // h4l | h3l + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 3 - round 6 + ldr q27, [x8, #144] // load rk9 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 0 - round 6 + ldr q12, [x3, #32] // load h1l | h1h + ext v12.16b, v12.16b, v12.16b, #8 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 2 - round 6 + ldr q28, [x8, #160] // load rk10 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 1 - round 7 + trn1 v9.2d, v14.2d, v15.2d // h4h | h3h + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 0 - round 7 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 2 - round 7 + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 3 - round 7 + trn2 v16.2d, v12.2d, v13.2d // h2l | h1l + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 1 - round 8 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 2 - round 8 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 3 - round 8 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 0 - round 8 + b.lt Lenc_finish_first_blocks // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 1 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 2 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 3 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 0 - round 9 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 1 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 2 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 3 - round 10 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 0 - round 10 + b.eq Lenc_finish_first_blocks // branch if AES-192 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 1 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 2 - round 11 + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 0 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 3 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 1 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 2 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 0 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 3 - round 12 + +Lenc_finish_first_blocks: + cmp x0, x5 // check if we have <= 4 blocks + eor v17.16b, v17.16b, v9.16b // h4k | h3k + aese v2.16b, v31.16b // AES block 2 - round N-1 + trn1 v8.2d, v12.2d, v13.2d // h2h | h1h + aese v1.16b, v31.16b // AES block 1 - round N-1 + aese v0.16b, v31.16b // AES block 0 - round N-1 + aese v3.16b, v31.16b // AES block 3 - round N-1 + eor v16.16b, v16.16b, v8.16b // h2k | h1k + b.ge Lenc_tail // handle tail + + ldp x19, x20, [x0, #16] // AES block 1 - load plaintext + rev w9, w12 // CTR block 4 + ldp x6, x7, [x0, #0] // AES block 0 - load plaintext + ldp x23, x24, [x0, #48] // AES block 3 - load plaintext + ldp x21, x22, [x0, #32] // AES block 2 - load plaintext + add x0, x0, #64 // AES input_ptr update + eor x19, x19, x13 // AES block 1 - round N low + eor x20, x20, x14 // AES block 1 - round N high + fmov d5, x19 // AES block 1 - mov low + eor x6, x6, x13 // AES block 0 - round N low + eor x7, x7, x14 // AES block 0 - round N high + eor x24, x24, x14 // AES block 3 - round N high + fmov d4, x6 // AES block 0 - mov low + cmp x0, x5 // check if we have <= 8 blocks + fmov v4.d[1], x7 // AES block 0 - mov high + eor x23, x23, x13 // AES block 3 - round N low + eor x21, x21, x13 // AES block 2 - round N low + fmov v5.d[1], x20 // AES block 1 - mov high + fmov d6, x21 // AES block 2 - mov low + add w12, w12, #1 // CTR block 4 + orr x9, x11, x9, lsl #32 // CTR block 4 + fmov d7, x23 // AES block 3 - mov low + eor x22, x22, x14 // AES block 2 - round N high + fmov v6.d[1], x22 // AES block 2 - mov high + eor v4.16b, v4.16b, v0.16b // AES block 0 - result + fmov d0, x10 // CTR block 4 + fmov v0.d[1], x9 // CTR block 4 + rev w9, w12 // CTR block 5 + add w12, w12, #1 // CTR block 5 + eor v5.16b, v5.16b, v1.16b // AES block 1 - result + fmov d1, x10 // CTR block 5 + orr x9, x11, x9, lsl #32 // CTR block 5 + fmov v1.d[1], x9 // CTR block 5 + rev w9, w12 // CTR block 6 + st1 { v4.16b}, [x2], #16 // AES block 0 - store result + fmov v7.d[1], x24 // AES block 3 - mov high + orr x9, x11, x9, lsl #32 // CTR block 6 + eor v6.16b, v6.16b, v2.16b // AES block 2 - result + st1 { v5.16b}, [x2], #16 // AES block 1 - store result + add w12, w12, #1 // CTR block 6 + fmov d2, x10 // CTR block 6 + fmov v2.d[1], x9 // CTR block 6 + st1 { v6.16b}, [x2], #16 // AES block 2 - store result + rev w9, w12 // CTR block 7 + orr x9, x11, x9, lsl #32 // CTR block 7 + eor v7.16b, v7.16b, v3.16b // AES block 3 - result + st1 { v7.16b}, [x2], #16 // AES block 3 - store result + b.ge Lenc_prepretail // do prepretail + +Lenc_main_loop: // main loop start + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + rev64 v4.16b, v4.16b // GHASH block 4k (only t0 is free) + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + fmov d3, x10 // CTR block 4k+3 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + fmov v3.d[1], x9 // CTR block 4k+3 + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + ldp x23, x24, [x0, #48] // AES block 4k+7 - load plaintext + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + ldp x21, x22, [x0, #32] // AES block 4k+6 - load plaintext + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + eor v4.16b, v4.16b, v11.16b // PRE 1 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + eor x23, x23, x13 // AES block 4k+7 - round N low + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + mov d10, v17.d[1] // GHASH block 4k - mid + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + eor x22, x22, x14 // AES block 4k+6 - round N high + mov d8, v4.d[1] // GHASH block 4k - mid + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + rev64 v5.16b, v5.16b // GHASH block 4k+1 (t0 and t1 free) + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + rev64 v7.16b, v7.16b // GHASH block 4k+3 (t0, t1, t2 and t3 free) + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + rev64 v6.16b, v6.16b // GHASH block 4k+2 (t0, t1, and t2 free) + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + pmull v6.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + ldp x19, x20, [x0, #16] // AES block 4k+5 - load plaintext + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + mov d4, v7.d[1] // GHASH block 4k+3 - mid + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + eor v4.8b, v4.8b, v7.8b // GHASH block 4k+3 - mid + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor x19, x19, x13 // AES block 4k+5 - round N low + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + eor x21, x21, x13 // AES block 4k+6 - round N low + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + movi v8.8b, #0xc2 + pmull v4.1q, v4.1d, v16.1d // GHASH block 4k+3 - mid + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + cmp x17, #12 // setup flags for AES-128/192/256 check + fmov d5, x19 // AES block 4k+5 - mov low + ldp x6, x7, [x0, #0] // AES block 4k+4 - load plaintext + b.lt Lenc_main_loop_continue // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + b.eq Lenc_main_loop_continue // branch if AES-192 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + +Lenc_main_loop_continue: + shl d8, d8, #56 // mod_constant + eor v11.16b, v11.16b, v6.16b // GHASH block 4k+3 - low + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+3 - mid + add w12, w12, #1 // CTR block 4k+3 + eor v4.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + add x0, x0, #64 // AES input_ptr update + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + rev w9, w12 // CTR block 4k+8 + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor x6, x6, x13 // AES block 4k+4 - round N low + eor v10.16b, v10.16b, v4.16b // MODULO - karatsuba tidy up + eor x7, x7, x14 // AES block 4k+4 - round N high + fmov d4, x6 // AES block 4k+4 - mov low + orr x9, x11, x9, lsl #32 // CTR block 4k+8 + eor v7.16b, v9.16b, v7.16b // MODULO - fold into mid + eor x20, x20, x14 // AES block 4k+5 - round N high + eor x24, x24, x14 // AES block 4k+7 - round N high + add w12, w12, #1 // CTR block 4k+8 + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + fmov v4.d[1], x7 // AES block 4k+4 - mov high + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + fmov d7, x23 // AES block 4k+7 - mov low + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + fmov v5.d[1], x20 // AES block 4k+5 - mov high + fmov d6, x21 // AES block 4k+6 - mov low + cmp x0, x5 // LOOP CONTROL + fmov v6.d[1], x22 // AES block 4k+6 - mov high + pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + eor v4.16b, v4.16b, v0.16b // AES block 4k+4 - result + fmov d0, x10 // CTR block 4k+8 + fmov v0.d[1], x9 // CTR block 4k+8 + rev w9, w12 // CTR block 4k+9 + add w12, w12, #1 // CTR block 4k+9 + eor v5.16b, v5.16b, v1.16b // AES block 4k+5 - result + fmov d1, x10 // CTR block 4k+9 + orr x9, x11, x9, lsl #32 // CTR block 4k+9 + fmov v1.d[1], x9 // CTR block 4k+9 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + rev w9, w12 // CTR block 4k+10 + st1 { v4.16b}, [x2], #16 // AES block 4k+4 - store result + orr x9, x11, x9, lsl #32 // CTR block 4k+10 + eor v11.16b, v11.16b, v9.16b // MODULO - fold into low + fmov v7.d[1], x24 // AES block 4k+7 - mov high + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + st1 { v5.16b}, [x2], #16 // AES block 4k+5 - store result + add w12, w12, #1 // CTR block 4k+10 + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + eor v6.16b, v6.16b, v2.16b // AES block 4k+6 - result + fmov d2, x10 // CTR block 4k+10 + st1 { v6.16b}, [x2], #16 // AES block 4k+6 - store result + fmov v2.d[1], x9 // CTR block 4k+10 + rev w9, w12 // CTR block 4k+11 + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + orr x9, x11, x9, lsl #32 // CTR block 4k+11 + eor v7.16b, v7.16b, v3.16b // AES block 4k+7 - result + st1 { v7.16b}, [x2], #16 // AES block 4k+7 - store result + b.lt Lenc_main_loop + +Lenc_prepretail: // PREPRETAIL + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + rev64 v6.16b, v6.16b // GHASH block 4k+2 (t0, t1, and t2 free) + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + fmov d3, x10 // CTR block 4k+3 + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + rev64 v4.16b, v4.16b // GHASH block 4k (only t0 is free) + fmov v3.d[1], x9 // CTR block 4k+3 + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + eor v4.16b, v4.16b, v11.16b // PRE 1 + rev64 v5.16b, v5.16b // GHASH block 4k+1 (t0 and t1 free) + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + mov d10, v17.d[1] // GHASH block 4k - mid + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + mov d8, v4.d[1] // GHASH block 4k - mid + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + rev64 v7.16b, v7.16b // GHASH block 4k+3 (t0, t1, t2 and t3 free) + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + add w12, w12, #1 // CTR block 4k+3 + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + mov d4, v7.d[1] // GHASH block 4k+3 - mid + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + eor v4.8b, v4.8b, v7.8b // GHASH block 4k+3 - mid + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + pmull v4.1q, v4.1d, v16.1d // GHASH block 4k+3 - mid + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + movi v8.8b, #0xc2 + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + shl d8, d8, #56 // mod_constant + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+3 - mid + pmull v6.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + cmp x17, #12 // setup flags for AES-128/192/256 check + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + eor v11.16b, v11.16b, v6.16b // GHASH block 4k+3 - low + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor v10.16b, v10.16b, v9.16b // karatsuba tidy up + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + pmull v4.1q, v9.1d, v8.1d + ext v9.16b, v9.16b, v9.16b, #8 + eor v10.16b, v10.16b, v11.16b + b.lt Lenc_finish_prepretail // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + b.eq Lenc_finish_prepretail // branch if AES-192 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + +Lenc_finish_prepretail: + eor v10.16b, v10.16b, v4.16b + eor v10.16b, v10.16b, v9.16b + pmull v4.1q, v10.1d, v8.1d + ext v10.16b, v10.16b, v10.16b, #8 + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + eor v11.16b, v11.16b, v4.16b + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + eor v11.16b, v11.16b, v10.16b + +Lenc_tail: // TAIL + ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag + sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process + ldp x6, x7, [x0], #16 // AES block 4k+4 - load plaintext + eor x6, x6, x13 // AES block 4k+4 - round N low + eor x7, x7, x14 // AES block 4k+4 - round N high + cmp x5, #48 + fmov d4, x6 // AES block 4k+4 - mov low + fmov v4.d[1], x7 // AES block 4k+4 - mov high + eor v5.16b, v4.16b, v0.16b // AES block 4k+4 - result + b.gt Lenc_blocks_more_than_3 + cmp x5, #32 + mov v3.16b, v2.16b + movi v11.8b, #0 + movi v9.8b, #0 + sub w12, w12, #1 + mov v2.16b, v1.16b + movi v10.8b, #0 + b.gt Lenc_blocks_more_than_2 + mov v3.16b, v1.16b + sub w12, w12, #1 + cmp x5, #16 + b.gt Lenc_blocks_more_than_1 + sub w12, w12, #1 + b Lenc_blocks_less_than_1 +Lenc_blocks_more_than_3: // blocks left > 3 + st1 { v5.16b}, [x2], #16 // AES final-3 block - store result + ldp x6, x7, [x0], #16 // AES final-2 block - load input low & high + rev64 v4.16b, v5.16b // GHASH final-3 block + eor x6, x6, x13 // AES final-2 block - round N low + eor v4.16b, v4.16b, v8.16b // feed in partial tag + eor x7, x7, x14 // AES final-2 block - round N high + mov d22, v4.d[1] // GHASH final-3 block - mid + fmov d5, x6 // AES final-2 block - mov low + fmov v5.d[1], x7 // AES final-2 block - mov high + eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid + movi v8.8b, #0 // suppress further partial tag feed in + mov d10, v17.d[1] // GHASH final-3 block - mid + pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low + pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high + pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid + eor v5.16b, v5.16b, v1.16b // AES final-2 block - result +Lenc_blocks_more_than_2: // blocks left > 2 + st1 { v5.16b}, [x2], #16 // AES final-2 block - store result + ldp x6, x7, [x0], #16 // AES final-1 block - load input low & high + rev64 v4.16b, v5.16b // GHASH final-2 block + eor x6, x6, x13 // AES final-1 block - round N low + eor v4.16b, v4.16b, v8.16b // feed in partial tag + fmov d5, x6 // AES final-1 block - mov low + eor x7, x7, x14 // AES final-1 block - round N high + fmov v5.d[1], x7 // AES final-1 block - mov high + movi v8.8b, #0 // suppress further partial tag feed in + pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high + mov d22, v4.d[1] // GHASH final-2 block - mid + pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low + eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid + eor v5.16b, v5.16b, v2.16b // AES final-1 block - result + eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high + pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid + eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low + eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid +Lenc_blocks_more_than_1: // blocks left > 1 + st1 { v5.16b}, [x2], #16 // AES final-1 block - store result + rev64 v4.16b, v5.16b // GHASH final-1 block + ldp x6, x7, [x0], #16 // AES final block - load input low & high + eor v4.16b, v4.16b, v8.16b // feed in partial tag + movi v8.8b, #0 // suppress further partial tag feed in + eor x6, x6, x13 // AES final block - round N low + mov d22, v4.d[1] // GHASH final-1 block - mid + pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high + eor x7, x7, x14 // AES final block - round N high + eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid + eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high + ins v22.d[1], v22.d[0] // GHASH final-1 block - mid + fmov d5, x6 // AES final block - mov low + fmov v5.d[1], x7 // AES final block - mov high + pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid + pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low + eor v5.16b, v5.16b, v3.16b // AES final block - result + eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid + eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low +Lenc_blocks_less_than_1: // blocks left <= 1 + and x1, x1, #127 // bit_length %= 128 + mvn x13, xzr // rkN_l = 0xffffffffffffffff + sub x1, x1, #128 // bit_length -= 128 + neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128]) + ld1 { v18.16b}, [x2] // load existing bytes where the possibly partial last block is to be stored + mvn x14, xzr // rkN_h = 0xffffffffffffffff + and x1, x1, #127 // bit_length %= 128 + lsr x14, x14, x1 // rkN_h is mask for top 64b of last block + cmp x1, #64 + csel x6, x13, x14, lt + csel x7, x14, xzr, lt + fmov d0, x6 // ctr0b is mask for last block + fmov v0.d[1], x7 + and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits + rev64 v4.16b, v5.16b // GHASH final block + eor v4.16b, v4.16b, v8.16b // feed in partial tag + bif v5.16b, v18.16b, v0.16b // insert existing bytes in top end of result before storing + pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high + mov d8, v4.d[1] // GHASH final block - mid + rev w9, w12 + pmull v21.1q, v4.1d, v12.1d // GHASH final block - low + eor v9.16b, v9.16b, v20.16b // GHASH final block - high + eor v8.8b, v8.8b, v4.8b // GHASH final block - mid + pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid + eor v11.16b, v11.16b, v21.16b // GHASH final block - low + eor v10.16b, v10.16b, v8.16b // GHASH final block - mid + movi v8.8b, #0xc2 + eor v4.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + shl d8, d8, #56 // mod_constant + eor v10.16b, v10.16b, v4.16b // MODULO - karatsuba tidy up + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + str w9, [x16, #12] // store the updated counter + st1 { v5.16b}, [x2] // store all 16B + eor v11.16b, v11.16b, v9.16b // MODULO - fold into low + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + ldp x19, x20, [sp, #16] + ldp x21, x22, [sp, #32] + ldp x23, x24, [sp, #48] + ldp d8, d9, [sp, #64] + ldp d10, d11, [sp, #80] + ldp d12, d13, [sp, #96] + ldp d14, d15, [sp, #112] + ldp x29, x30, [sp], #128 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl aes_gcm_dec_kernel + +.def aes_gcm_dec_kernel + .type 32 +.endef +.align 4 +aes_gcm_dec_kernel: + AARCH64_SIGN_LINK_REGISTER + stp x29, x30, [sp, #-128]! + mov x29, sp + stp x19, x20, [sp, #16] + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #32] + stp x23, x24, [sp, #48] + stp d8, d9, [sp, #64] + stp d10, d11, [sp, #80] + stp d12, d13, [sp, #96] + stp d14, d15, [sp, #112] + ldr w17, [x8, #240] + add x19, x8, x17, lsl #4 // borrow input_l1 for last key + ldp x13, x14, [x19] // load round N keys + ldr q31, [x19, #-16] // load round N-1 keys + lsr x5, x1, #3 // byte_len + mov x15, x5 + ldp x10, x11, [x16] // ctr96_b64, ctr96_t32 + ldr q26, [x8, #128] // load rk8 + sub x5, x5, #1 // byte_len - 1 + ldr q25, [x8, #112] // load rk7 + and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + add x4, x0, x1, lsr #3 // end_input_ptr + ldr q24, [x8, #96] // load rk6 + lsr x12, x11, #32 + ldr q23, [x8, #80] // load rk5 + orr w11, w11, w11 + ldr q21, [x8, #48] // load rk3 + add x5, x5, x0 + rev w12, w12 // rev_ctr32 + add w12, w12, #1 // increment rev_ctr32 + fmov d3, x10 // CTR block 3 + rev w9, w12 // CTR block 1 + add w12, w12, #1 // CTR block 1 + fmov d1, x10 // CTR block 1 + orr x9, x11, x9, lsl #32 // CTR block 1 + ld1 { v0.16b}, [x16] // special case vector load initial counter so we can start first AES block as quickly as possible + fmov v1.d[1], x9 // CTR block 1 + rev w9, w12 // CTR block 2 + add w12, w12, #1 // CTR block 2 + fmov d2, x10 // CTR block 2 + orr x9, x11, x9, lsl #32 // CTR block 2 + fmov v2.d[1], x9 // CTR block 2 + rev w9, w12 // CTR block 3 + orr x9, x11, x9, lsl #32 // CTR block 3 + ldr q18, [x8, #0] // load rk0 + fmov v3.d[1], x9 // CTR block 3 + add w12, w12, #1 // CTR block 3 + ldr q22, [x8, #64] // load rk4 + ldr q19, [x8, #16] // load rk1 + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 0 - round 0 + ldr q14, [x3, #80] // load h3l | h3h + ext v14.16b, v14.16b, v14.16b, #8 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 3 - round 0 + ldr q15, [x3, #112] // load h4l | h4h + ext v15.16b, v15.16b, v15.16b, #8 + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 1 - round 0 + ldr q13, [x3, #64] // load h2l | h2h + ext v13.16b, v13.16b, v13.16b, #8 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 2 - round 0 + ldr q20, [x8, #32] // load rk2 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 0 - round 1 + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 1 - round 1 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 2 - round 1 + ldr q27, [x8, #144] // load rk9 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 3 - round 1 + ldr q30, [x8, #192] // load rk12 + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 0 - round 2 + ldr q12, [x3, #32] // load h1l | h1h + ext v12.16b, v12.16b, v12.16b, #8 + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 2 - round 2 + ldr q28, [x8, #160] // load rk10 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 3 - round 2 + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 0 - round 3 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 1 - round 2 + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 3 - round 3 + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 0 - round 4 + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 2 - round 3 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 1 - round 3 + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 3 - round 4 + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 2 - round 4 + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 1 - round 4 + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 3 - round 5 + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 0 - round 5 + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 1 - round 5 + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 2 - round 5 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 0 - round 6 + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 3 - round 6 + cmp x17, #12 // setup flags for AES-128/192/256 check + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 1 - round 6 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 2 - round 6 + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 0 - round 7 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 1 - round 7 + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 3 - round 7 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 0 - round 8 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 2 - round 7 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 3 - round 8 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 1 - round 8 + ldr q29, [x8, #176] // load rk11 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 2 - round 8 + b.lt Ldec_finish_first_blocks // branch if AES-128 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 0 - round 9 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 1 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 3 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 2 - round 9 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 0 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 1 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 3 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 2 - round 10 + b.eq Ldec_finish_first_blocks // branch if AES-192 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 0 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 3 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 1 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 2 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 1 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 0 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 2 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 3 - round 12 + +Ldec_finish_first_blocks: + cmp x0, x5 // check if we have <= 4 blocks + trn1 v9.2d, v14.2d, v15.2d // h4h | h3h + trn2 v17.2d, v14.2d, v15.2d // h4l | h3l + trn1 v8.2d, v12.2d, v13.2d // h2h | h1h + trn2 v16.2d, v12.2d, v13.2d // h2l | h1l + eor v17.16b, v17.16b, v9.16b // h4k | h3k + aese v1.16b, v31.16b // AES block 1 - round N-1 + aese v2.16b, v31.16b // AES block 2 - round N-1 + eor v16.16b, v16.16b, v8.16b // h2k | h1k + aese v3.16b, v31.16b // AES block 3 - round N-1 + aese v0.16b, v31.16b // AES block 0 - round N-1 + b.ge Ldec_tail // handle tail + + ldr q4, [x0, #0] // AES block 0 - load ciphertext + ldr q5, [x0, #16] // AES block 1 - load ciphertext + rev w9, w12 // CTR block 4 + eor v0.16b, v4.16b, v0.16b // AES block 0 - result + eor v1.16b, v5.16b, v1.16b // AES block 1 - result + rev64 v5.16b, v5.16b // GHASH block 1 + ldr q7, [x0, #48] // AES block 3 - load ciphertext + mov x7, v0.d[1] // AES block 0 - mov high + mov x6, v0.d[0] // AES block 0 - mov low + rev64 v4.16b, v4.16b // GHASH block 0 + add w12, w12, #1 // CTR block 4 + fmov d0, x10 // CTR block 4 + orr x9, x11, x9, lsl #32 // CTR block 4 + fmov v0.d[1], x9 // CTR block 4 + rev w9, w12 // CTR block 5 + add w12, w12, #1 // CTR block 5 + mov x19, v1.d[0] // AES block 1 - mov low + orr x9, x11, x9, lsl #32 // CTR block 5 + mov x20, v1.d[1] // AES block 1 - mov high + eor x7, x7, x14 // AES block 0 - round N high + eor x6, x6, x13 // AES block 0 - round N low + stp x6, x7, [x2], #16 // AES block 0 - store result + fmov d1, x10 // CTR block 5 + ldr q6, [x0, #32] // AES block 2 - load ciphertext + add x0, x0, #64 // AES input_ptr update + fmov v1.d[1], x9 // CTR block 5 + rev w9, w12 // CTR block 6 + add w12, w12, #1 // CTR block 6 + eor x19, x19, x13 // AES block 1 - round N low + orr x9, x11, x9, lsl #32 // CTR block 6 + eor x20, x20, x14 // AES block 1 - round N high + stp x19, x20, [x2], #16 // AES block 1 - store result + eor v2.16b, v6.16b, v2.16b // AES block 2 - result + cmp x0, x5 // check if we have <= 8 blocks + b.ge Ldec_prepretail // do prepretail + +Ldec_main_loop: // main loop start + mov x21, v2.d[0] // AES block 4k+2 - mov low + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + eor v3.16b, v7.16b, v3.16b // AES block 4k+3 - result + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + mov x22, v2.d[1] // AES block 4k+2 - mov high + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + fmov d2, x10 // CTR block 4k+6 + fmov v2.d[1], x9 // CTR block 4k+6 + eor v4.16b, v4.16b, v11.16b // PRE 1 + rev w9, w12 // CTR block 4k+7 + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + mov x24, v3.d[1] // AES block 4k+3 - mov high + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + mov x23, v3.d[0] // AES block 4k+3 - mov low + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + mov d8, v4.d[1] // GHASH block 4k - mid + fmov d3, x10 // CTR block 4k+7 + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + orr x9, x11, x9, lsl #32 // CTR block 4k+7 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + fmov v3.d[1], x9 // CTR block 4k+7 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + eor x22, x22, x14 // AES block 4k+2 - round N high + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + mov d10, v17.d[1] // GHASH block 4k - mid + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + rev64 v6.16b, v6.16b // GHASH block 4k+2 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + eor x21, x21, x13 // AES block 4k+2 - round N low + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + stp x21, x22, [x2], #16 // AES block 4k+2 - store result + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + rev64 v7.16b, v7.16b // GHASH block 4k+3 + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + eor x23, x23, x13 // AES block 4k+3 - round N low + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + eor x24, x24, x14 // AES block 4k+3 - round N high + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + add w12, w12, #1 // CTR block 4k+7 + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + rev w9, w12 // CTR block 4k+8 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + add w12, w12, #1 // CTR block 4k+8 + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + mov d6, v7.d[1] // GHASH block 4k+3 - mid + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + pmull v4.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + orr x9, x11, x9, lsl #32 // CTR block 4k+8 + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + cmp x17, #12 // setup flags for AES-128/192/256 check + eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid + movi v8.8b, #0xc2 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor v11.16b, v11.16b, v4.16b // GHASH block 4k+3 - low + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + shl d8, d8, #56 // mod_constant + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + eor v10.16b, v10.16b, v6.16b // GHASH block 4k+3 - mid + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + b.lt Ldec_main_loop_continue // branch if AES-128 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + b.eq Ldec_main_loop_continue // branch if AES-192 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + +Ldec_main_loop_continue: + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + ldr q4, [x0, #0] // AES block 4k+4 - load ciphertext + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up + ldr q5, [x0, #16] // AES block 4k+5 - load ciphertext + eor v0.16b, v4.16b, v0.16b // AES block 4k+4 - result + stp x23, x24, [x2], #16 // AES block 4k+3 - store result + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + ldr q7, [x0, #48] // AES block 4k+7 - load ciphertext + ldr q6, [x0, #32] // AES block 4k+6 - load ciphertext + mov x7, v0.d[1] // AES block 4k+4 - mov high + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + add x0, x0, #64 // AES input_ptr update + mov x6, v0.d[0] // AES block 4k+4 - mov low + fmov d0, x10 // CTR block 4k+8 + fmov v0.d[1], x9 // CTR block 4k+8 + pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + eor v1.16b, v5.16b, v1.16b // AES block 4k+5 - result + rev w9, w12 // CTR block 4k+9 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + orr x9, x11, x9, lsl #32 // CTR block 4k+9 + cmp x0, x5 // LOOP CONTROL + add w12, w12, #1 // CTR block 4k+9 + eor x6, x6, x13 // AES block 4k+4 - round N low + eor x7, x7, x14 // AES block 4k+4 - round N high + mov x20, v1.d[1] // AES block 4k+5 - mov high + eor v2.16b, v6.16b, v2.16b // AES block 4k+6 - result + eor v11.16b, v11.16b, v8.16b // MODULO - fold into low + mov x19, v1.d[0] // AES block 4k+5 - mov low + fmov d1, x10 // CTR block 4k+9 + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + fmov v1.d[1], x9 // CTR block 4k+9 + rev w9, w12 // CTR block 4k+10 + add w12, w12, #1 // CTR block 4k+10 + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + orr x9, x11, x9, lsl #32 // CTR block 4k+10 + rev64 v5.16b, v5.16b // GHASH block 4k+5 + eor x20, x20, x14 // AES block 4k+5 - round N high + stp x6, x7, [x2], #16 // AES block 4k+4 - store result + eor x19, x19, x13 // AES block 4k+5 - round N low + stp x19, x20, [x2], #16 // AES block 4k+5 - store result + rev64 v4.16b, v4.16b // GHASH block 4k+4 + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + b.lt Ldec_main_loop + +Ldec_prepretail: // PREPRETAIL + ext v11.16b, v11.16b, v11.16b, #8 // PRE 0 + mov x21, v2.d[0] // AES block 4k+2 - mov low + eor v3.16b, v7.16b, v3.16b // AES block 4k+3 - result + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 0 + mov x22, v2.d[1] // AES block 4k+2 - mov high + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 0 + fmov d2, x10 // CTR block 4k+6 + fmov v2.d[1], x9 // CTR block 4k+6 + rev w9, w12 // CTR block 4k+7 + eor v4.16b, v4.16b, v11.16b // PRE 1 + rev64 v6.16b, v6.16b // GHASH block 4k+2 + orr x9, x11, x9, lsl #32 // CTR block 4k+7 + mov x23, v3.d[0] // AES block 4k+3 - mov low + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 1 + mov x24, v3.d[1] // AES block 4k+3 - mov high + pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low + mov d8, v4.d[1] // GHASH block 4k - mid + fmov d3, x10 // CTR block 4k+7 + pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high + fmov v3.d[1], x9 // CTR block 4k+7 + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 0 + mov d10, v17.d[1] // GHASH block 4k - mid + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 1 + eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid + pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 1 + rev64 v7.16b, v7.16b // GHASH block 4k+3 + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 0 + pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high + pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 1 + mov d4, v5.d[1] // GHASH block 4k+1 - mid + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 2 + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 2 + eor v11.16b, v11.16b, v8.16b // GHASH block 4k+1 - low + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 2 + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 3 + mov d8, v6.d[1] // GHASH block 4k+2 - mid + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 2 + eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid + pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 4 + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 3 + eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid + pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 5 + eor v11.16b, v11.16b, v5.16b // GHASH block 4k+2 - low + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 4 + pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high + eor v10.16b, v10.16b, v4.16b // GHASH block 4k+1 - mid + pmull2 v4.1q, v6.2d, v13.2d // GHASH block 4k+2 - high + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 5 + ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 3 + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 3 + eor v9.16b, v9.16b, v4.16b // GHASH block 4k+2 - high + pmull v4.1q, v7.1d, v12.1d // GHASH block 4k+3 - low + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 4 + mov d6, v7.d[1] // GHASH block 4k+3 - mid + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 4 + pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 5 + eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 5 + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 6 + eor v10.16b, v10.16b, v8.16b // GHASH block 4k+2 - mid + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 6 + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 6 + movi v8.8b, #0xc2 + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 6 + eor v11.16b, v11.16b, v4.16b // GHASH block 4k+3 - low + pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 7 + cmp x17, #12 // setup flags for AES-128/192/256 check + eor v9.16b, v9.16b, v5.16b // GHASH block 4k+3 - high + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 7 + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 7 + eor v10.16b, v10.16b, v6.16b // GHASH block 4k+3 - mid + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 8 + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 7 + eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 8 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 8 + shl d8, d8, #56 // mod_constant + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 8 + b.lt Ldec_finish_prepretail // branch if AES-128 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 9 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 9 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 9 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 10 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 10 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 10 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 10 + b.eq Ldec_finish_prepretail // branch if AES-192 + + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 11 + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 11 + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 11 + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b // AES block 4k+6 - round 12 + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 11 + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b // AES block 4k+5 - round 12 + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b // AES block 4k+4 - round 12 + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b // AES block 4k+7 - round 12 + +Ldec_finish_prepretail: + eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + eor x22, x22, x14 // AES block 4k+2 - round N high + eor x23, x23, x13 // AES block 4k+3 - round N low + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + add w12, w12, #1 // CTR block 4k+7 + eor x21, x21, x13 // AES block 4k+2 - round N low + pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + eor x24, x24, x14 // AES block 4k+3 - round N high + stp x21, x22, [x2], #16 // AES block 4k+2 - store result + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + stp x23, x24, [x2], #16 // AES block 4k+3 - store result + + eor v11.16b, v11.16b, v8.16b // MODULO - fold into low + aese v1.16b, v31.16b // AES block 4k+5 - round N-1 + aese v0.16b, v31.16b // AES block 4k+4 - round N-1 + aese v3.16b, v31.16b // AES block 4k+7 - round N-1 + aese v2.16b, v31.16b // AES block 4k+6 - round N-1 + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + +Ldec_tail: // TAIL + sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process + ld1 { v5.16b}, [x0], #16 // AES block 4k+4 - load ciphertext + eor v0.16b, v5.16b, v0.16b // AES block 4k+4 - result + mov x6, v0.d[0] // AES block 4k+4 - mov low + mov x7, v0.d[1] // AES block 4k+4 - mov high + ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag + cmp x5, #48 + eor x6, x6, x13 // AES block 4k+4 - round N low + eor x7, x7, x14 // AES block 4k+4 - round N high + b.gt Ldec_blocks_more_than_3 + sub w12, w12, #1 + mov v3.16b, v2.16b + movi v10.8b, #0 + movi v11.8b, #0 + cmp x5, #32 + movi v9.8b, #0 + mov v2.16b, v1.16b + b.gt Ldec_blocks_more_than_2 + sub w12, w12, #1 + mov v3.16b, v1.16b + cmp x5, #16 + b.gt Ldec_blocks_more_than_1 + sub w12, w12, #1 + b Ldec_blocks_less_than_1 +Ldec_blocks_more_than_3: // blocks left > 3 + rev64 v4.16b, v5.16b // GHASH final-3 block + ld1 { v5.16b}, [x0], #16 // AES final-2 block - load ciphertext + stp x6, x7, [x2], #16 // AES final-3 block - store result + mov d10, v17.d[1] // GHASH final-3 block - mid + eor v4.16b, v4.16b, v8.16b // feed in partial tag + eor v0.16b, v5.16b, v1.16b // AES final-2 block - result + mov d22, v4.d[1] // GHASH final-3 block - mid + mov x6, v0.d[0] // AES final-2 block - mov low + mov x7, v0.d[1] // AES final-2 block - mov high + eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid + movi v8.8b, #0 // suppress further partial tag feed in + pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high + pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid + eor x6, x6, x13 // AES final-2 block - round N low + pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low + eor x7, x7, x14 // AES final-2 block - round N high +Ldec_blocks_more_than_2: // blocks left > 2 + rev64 v4.16b, v5.16b // GHASH final-2 block + ld1 { v5.16b}, [x0], #16 // AES final-1 block - load ciphertext + eor v4.16b, v4.16b, v8.16b // feed in partial tag + stp x6, x7, [x2], #16 // AES final-2 block - store result + eor v0.16b, v5.16b, v2.16b // AES final-1 block - result + mov d22, v4.d[1] // GHASH final-2 block - mid + pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low + pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high + eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid + mov x6, v0.d[0] // AES final-1 block - mov low + mov x7, v0.d[1] // AES final-1 block - mov high + eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low + movi v8.8b, #0 // suppress further partial tag feed in + pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid + eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high + eor x6, x6, x13 // AES final-1 block - round N low + eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid + eor x7, x7, x14 // AES final-1 block - round N high +Ldec_blocks_more_than_1: // blocks left > 1 + stp x6, x7, [x2], #16 // AES final-1 block - store result + rev64 v4.16b, v5.16b // GHASH final-1 block + ld1 { v5.16b}, [x0], #16 // AES final block - load ciphertext + eor v4.16b, v4.16b, v8.16b // feed in partial tag + movi v8.8b, #0 // suppress further partial tag feed in + mov d22, v4.d[1] // GHASH final-1 block - mid + eor v0.16b, v5.16b, v3.16b // AES final block - result + pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high + eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid + pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low + mov x6, v0.d[0] // AES final block - mov low + ins v22.d[1], v22.d[0] // GHASH final-1 block - mid + mov x7, v0.d[1] // AES final block - mov high + pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid + eor x6, x6, x13 // AES final block - round N low + eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low + eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high + eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid + eor x7, x7, x14 // AES final block - round N high +Ldec_blocks_less_than_1: // blocks left <= 1 + and x1, x1, #127 // bit_length %= 128 + mvn x14, xzr // rkN_h = 0xffffffffffffffff + sub x1, x1, #128 // bit_length -= 128 + mvn x13, xzr // rkN_l = 0xffffffffffffffff + ldp x4, x5, [x2] // load existing bytes we need to not overwrite + neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128]) + and x1, x1, #127 // bit_length %= 128 + lsr x14, x14, x1 // rkN_h is mask for top 64b of last block + cmp x1, #64 + csel x9, x13, x14, lt + csel x10, x14, xzr, lt + fmov d0, x9 // ctr0b is mask for last block + and x6, x6, x9 + mov v0.d[1], x10 + bic x4, x4, x9 // mask out low existing bytes + rev w9, w12 + bic x5, x5, x10 // mask out high existing bytes + orr x6, x6, x4 + and x7, x7, x10 + orr x7, x7, x5 + and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits + rev64 v4.16b, v5.16b // GHASH final block + eor v4.16b, v4.16b, v8.16b // feed in partial tag + pmull v21.1q, v4.1d, v12.1d // GHASH final block - low + mov d8, v4.d[1] // GHASH final block - mid + eor v8.8b, v8.8b, v4.8b // GHASH final block - mid + pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high + pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid + eor v9.16b, v9.16b, v20.16b // GHASH final block - high + eor v11.16b, v11.16b, v21.16b // GHASH final block - low + eor v10.16b, v10.16b, v8.16b // GHASH final block - mid + movi v8.8b, #0xc2 + eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up + shl d8, d8, #56 // mod_constant + eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up + pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment + eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid + eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid + pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low + ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment + eor v11.16b, v11.16b, v8.16b // MODULO - fold into low + stp x6, x7, [x2] + str w9, [x16, #12] // store the updated counter + eor v11.16b, v11.16b, v10.16b // MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + ldp x19, x20, [sp, #16] + ldp x21, x22, [sp, #32] + ldp x23, x24, [sp, #48] + ldp d8, d9, [sp, #64] + ldp d10, d11, [sp, #80] + ldp d12, d13, [sp, #96] + ldp d14, d15, [sp, #112] + ldp x29, x30, [sp], #128 + AARCH64_VALIDATE_LINK_REGISTER + ret + +#endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/armv8-mont.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/armv8-mont-win.S similarity index 99% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/armv8-mont.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/armv8-mont-win.S index e1bee28218a1..9b4a9afc3335 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/armv8-mont.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/armv8-mont-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1437,5 +1436,8 @@ Lmul4x_done: .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 4 +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/bn-armv8-win.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/bn-armv8-win.S new file mode 100644 index 000000000000..50a9ea920ab6 --- /dev/null +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/bn-armv8-win.S @@ -0,0 +1,101 @@ +// This file is generated from a similarly-named Perl script in the BoringSSL +// source tree. Do not edit by hand. + +#if !defined(__has_feature) +#define __has_feature(x) 0 +#endif +#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) +#define OPENSSL_NO_ASM +#endif + +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(BORINGSSL_PREFIX) +#include +#endif +#include + +.text + +// BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, +// size_t num); + +.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 x3 = 2 * x8 + x3. This allows loop + # operations to use CBNZ without clobbering the carry flag. + lsr x8, x3, #1 + and x3, x3, #1 + + cbz x8, Ladd_tail +Ladd_loop: + ldp x4, x5, [x1], #16 + ldp x6, x7, [x2], #16 + sub x8, x8, #1 + adcs x4, x4, x6 + adcs x5, x5, x7 + stp x4, x5, [x0], #16 + cbnz x8, Ladd_loop + +Ladd_tail: + cbz x3, Ladd_exit + ldr x4, [x1], #8 + ldr x6, [x2], #8 + adcs x4, x4, x6 + str x4, [x0], #8 + +Ladd_exit: + cset x0, cs + ret + + +// BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, +// size_t num); + +.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 x3 = 2 * x8 + x3. This allows loop + # operations to use CBNZ without clobbering the carry flag. + lsr x8, x3, #1 + and x3, x3, #1 + + cbz x8, Lsub_tail +Lsub_loop: + ldp x4, x5, [x1], #16 + ldp x6, x7, [x2], #16 + sub x8, x8, #1 + sbcs x4, x4, x6 + sbcs x5, x5, x7 + stp x4, x5, [x0], #16 + cbnz x8, Lsub_loop + +Lsub_tail: + cbz x3, Lsub_exit + ldr x4, [x1], #8 + ldr x6, [x2], #8 + sbcs x4, x4, x6 + str x4, [x0], #8 + +Lsub_exit: + cset x0, cc + ret + +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits +#endif diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/ghash-neon-armv8.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/ghash-neon-armv8-win.S similarity index 97% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/ghash-neon-armv8.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/ghash-neon-armv8-win.S index 6881d0917f76..bee5b0e1a068 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/ghash-neon-armv8.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/ghash-neon-armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -347,5 +346,8 @@ Lmasks: .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,100,101,114,105,118,101,100,32,102,114,111,109,32,65,82,77,118,52,32,118,101,114,115,105,111,110,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/ghashv8-armx64.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/ghashv8-armv8-win.S similarity index 98% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/ghashv8-armx64.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/ghashv8-armv8-win.S index ccf376132bfe..1c463b3b752f 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/ghashv8-armx64.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/ghashv8-armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -579,5 +578,8 @@ Ldone4x: .align 2 .align 2 #endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/p256-armv8-asm.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/p256-armv8-asm-win.S similarity index 96% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/p256-armv8-asm.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/p256-armv8-asm-win.S index cfffc0d8030d..4d9e97029a10 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/p256-armv8-asm.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/p256-armv8-asm-win.S @@ -8,14 +8,13 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif #include "openssl/arm_arch.h" -.text +.section .rodata .align 5 Lpoly: .quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 @@ -31,6 +30,7 @@ LordK: .quad 0xccd1c8aaee00bc4f .byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 +.text // void ecp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], // const BN_ULONG x2[4]); @@ -49,8 +49,10 @@ ecp_nistz256_mul_mont: ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_mul_mont @@ -75,8 +77,10 @@ ecp_nistz256_sqr_mont: ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sqr_mont @@ -100,8 +104,10 @@ ecp_nistz256_div_by_2: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_div_by_2 @@ -124,8 +130,10 @@ ecp_nistz256_mul_by_2: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] mov x8,x14 mov x9,x15 mov x10,x16 @@ -152,8 +160,10 @@ ecp_nistz256_mul_by_3: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] mov x8,x14 mov x9,x15 mov x10,x16 @@ -192,8 +202,10 @@ ecp_nistz256_sub: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sub_from @@ -219,8 +231,10 @@ ecp_nistz256_neg: mov x15,xzr mov x16,xzr mov x17,xzr - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sub_from @@ -630,9 +644,11 @@ Ldouble_shortcut: mov x21,x0 ldp x16,x17,[x1,#48] mov x22,x1 - ldr x12,Lpoly+8 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] mov x8,x14 - ldr x13,Lpoly+24 + ldr x13,[x13,#24] mov x9,x15 ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont mov x10,x16 @@ -778,8 +794,10 @@ ecp_nistz256_point_add: mov x21,x0 mov x22,x1 mov x23,x2 - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] orr x8,x4,x5 orr x10,x6,x7 orr x25,x8,x10 @@ -1032,8 +1050,10 @@ ecp_nistz256_point_add_affine: mov x21,x0 mov x22,x1 mov x23,x2 - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] ldp x4,x5,[x1,#64] // in1_z ldp x6,x7,[x1,#64+16] @@ -1179,7 +1199,8 @@ ecp_nistz256_point_add_affine: ldp x10,x11,[x23,#0+48] stp x14,x15,[x21,#0] stp x16,x17,[x21,#0+16] - adr x23,Lone_mont-64 + adrp x23,Lone_mont-64 + add x23,x23,:lo12:Lone_mont-64 ldp x14,x15,[x22,#32] // in1 cmp x24,#0 // ~, remember? ldp x16,x17,[x22,#32+16] @@ -1240,7 +1261,8 @@ ecp_nistz256_ord_mul_mont: stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr x23,Lord + adrp x23,Lord + add x23,x23,:lo12:Lord ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] @@ -1437,7 +1459,7 @@ ecp_nistz256_ord_mul_mont: //////////////////////////////////////////////////////////////////////// // void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4], -// int rep); +// uint64_t rep); .globl ecp_nistz256_ord_sqr_mont .def ecp_nistz256_ord_sqr_mont @@ -1453,7 +1475,8 @@ ecp_nistz256_ord_sqr_mont: stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr x23,Lord + adrp x23,Lord + add x23,x23,:lo12:Lord ldp x4,x5,[x1] ldp x6,x7,[x1,#16] @@ -1748,5 +1771,8 @@ Lselect_w7_loop: ret +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-win.S similarity index 96% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-win.S index 0a3121fecdea..db796f0de72c 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -315,5 +314,8 @@ Lbeeu_finish: AARCH64_VALIDATE_LINK_REGISTER ret +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha1-armv8.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha1-armv8-win.S similarity index 99% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/sha1-armv8.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/sha1-armv8-win.S index 3c9e4e46c845..8f528ac00601 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha1-armv8.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha1-armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1237,5 +1236,8 @@ Lconst: .byte 83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha256-armv8.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha256-armv8-win.S similarity index 99% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/sha256-armv8.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/sha256-armv8-win.S index 15970afc2932..9af62ec54057 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha256-armv8.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha256-armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1214,5 +1213,8 @@ Loop_hw: ret #endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha512-armv8.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha512-armv8-win.S similarity index 99% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/sha512-armv8.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/sha512-armv8-win.S index b2b5a7e7b42a..8fac36e7283c 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha512-armv8.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/sha512-armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1616,5 +1615,8 @@ Loop_hw: ret #endif +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/fipsmodule/vpaes-armv8.S b/third_party/boringssl/win-aarch64/crypto/fipsmodule/vpaes-armv8-win.S similarity index 99% rename from third_party/boringssl/win-aarch64/crypto/fipsmodule/vpaes-armv8.S rename to third_party/boringssl/win-aarch64/crypto/fipsmodule/vpaes-armv8-win.S index c97ec124cf50..bba4e86fa2bd 100644 --- a/third_party/boringssl/win-aarch64/crypto/fipsmodule/vpaes-armv8.S +++ b/third_party/boringssl/win-aarch64/crypto/fipsmodule/vpaes-armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -1268,5 +1267,8 @@ Lctr32_done: AARCH64_VALIDATE_LINK_REGISTER ret +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-aarch64/crypto/test/trampoline-armv8.S b/third_party/boringssl/win-aarch64/crypto/test/trampoline-armv8-win.S similarity index 97% rename from third_party/boringssl/win-aarch64/crypto/test/trampoline-armv8.S rename to third_party/boringssl/win-aarch64/crypto/test/trampoline-armv8-win.S index 4e17d4b34347..5dbfcfc3fd31 100644 --- a/third_party/boringssl/win-aarch64/crypto/test/trampoline-armv8.S +++ b/third_party/boringssl/win-aarch64/crypto/test/trampoline-armv8-win.S @@ -8,8 +8,7 @@ #define OPENSSL_NO_ASM #endif -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) +#if !defined(OPENSSL_NO_ASM) && defined(__AARCH64EL__) && defined(_WIN32) #if defined(BORINGSSL_PREFIX) #include #endif @@ -756,5 +755,8 @@ abi_test_clobber_v15_upper: fmov v15.d[1], xzr ret +#endif // !OPENSSL_NO_ASM && defined(__AARCH64EL__) && defined(_WIN32) +#if defined(__ELF__) +// See https://www.airs.com/blog/archives/518. +.section .note.GNU-stack,"",%progbits #endif -#endif // !OPENSSL_NO_ASM diff --git a/third_party/boringssl/win-x86/crypto/chacha/chacha-x86.asm b/third_party/boringssl/win-x86/crypto/chacha/chacha-x86-win.asm similarity index 99% rename from third_party/boringssl/win-x86/crypto/chacha/chacha-x86.asm rename to third_party/boringssl/win-x86/crypto/chacha/chacha-x86-win.asm index 34393af7771a..8bd0ce5897e3 100644 --- a/third_party/boringssl/win-x86/crypto/chacha/chacha-x86.asm +++ b/third_party/boringssl/win-x86/crypto/chacha/chacha-x86-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -973,3 +974,7 @@ db 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 db 114,103,62,0 segment .bss common _OPENSSL_ia32cap_P 16 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/aesni-x86.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/aesni-x86-win.asm similarity index 99% rename from third_party/boringssl/win-x86/crypto/fipsmodule/aesni-x86.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/aesni-x86-win.asm index 9ea137565706..19b1d98bea68 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/aesni-x86.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/aesni-x86-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -2459,3 +2460,7 @@ db 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 db 115,108,46,111,114,103,62,0 segment .bss common _OPENSSL_ia32cap_P 16 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/bn-586.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/bn-586-win.asm similarity index 99% rename from third_party/boringssl/win-x86/crypto/fipsmodule/bn-586.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/bn-586-win.asm index 4d1b793aa281..f7ddfa8413d0 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/bn-586.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/bn-586-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -975,3 +976,7 @@ L$025aw_end: ret segment .bss common _OPENSSL_ia32cap_P 16 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/co-586.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/co-586-win.asm similarity index 99% rename from third_party/boringssl/win-x86/crypto/fipsmodule/co-586.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/co-586-win.asm index 7c2afe8389ed..6ad46962c9ff 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/co-586.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/co-586-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -1256,3 +1257,7 @@ L$_bn_sqr_comba4_begin: pop edi pop esi ret +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/ghash-ssse3-x86.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/ghash-ssse3-x86-win.asm similarity index 97% rename from third_party/boringssl/win-x86/crypto/fipsmodule/ghash-ssse3-x86.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/ghash-ssse3-x86-win.asm index e0192fc87441..52108aacc124 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/ghash-ssse3-x86.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/ghash-ssse3-x86-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -290,3 +291,7 @@ db 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 align 16 L$low4_mask: dd 252645135,252645135,252645135,252645135 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/ghash-x86.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/ghash-x86-win.asm similarity index 98% rename from third_party/boringssl/win-x86/crypto/fipsmodule/ghash-x86.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/ghash-x86-win.asm index 3703cb5a075f..3f6c70747713 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/ghash-x86.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/ghash-x86-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -323,3 +324,7 @@ db 71,72,65,83,72,32,102,111,114,32,120,56,54,44,32,67 db 82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112 db 112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62 db 0 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/md5-586.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/md5-586-win.asm similarity index 98% rename from third_party/boringssl/win-x86/crypto/fipsmodule/md5-586.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/md5-586-win.asm index e09bd0c2ebf6..25592b8d46d5 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/md5-586.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/md5-586-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -687,3 +688,7 @@ L$000start: pop edi pop esi ret +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/sha1-586.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/sha1-586-win.asm similarity index 99% rename from third_party/boringssl/win-x86/crypto/fipsmodule/sha1-586.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/sha1-586-win.asm index 4b05c9da5cce..51a890748e07 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/sha1-586.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/sha1-586-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -3804,3 +3805,7 @@ db 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112 db 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 segment .bss common _OPENSSL_ia32cap_P 16 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/sha256-586.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/sha256-586-win.asm similarity index 99% rename from third_party/boringssl/win-x86/crypto/fipsmodule/sha256-586.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/sha256-586-win.asm index 5d6661d08ac1..4e0278b0a14c 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/sha256-586.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/sha256-586-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -5569,3 +5570,7 @@ L$013avx_00_47: ret segment .bss common _OPENSSL_ia32cap_P 16 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/sha512-586.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/sha512-586-win.asm similarity index 99% rename from third_party/boringssl/win-x86/crypto/fipsmodule/sha512-586.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/sha512-586-win.asm index f2c47a7a5683..3603a6dc1313 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/sha512-586.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/sha512-586-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -2839,3 +2840,7 @@ db 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103 db 62,0 segment .bss common _OPENSSL_ia32cap_P 16 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/vpaes-x86.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/vpaes-x86-win.asm similarity index 99% rename from third_party/boringssl/win-x86/crypto/fipsmodule/vpaes-x86.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/vpaes-x86-win.asm index 49f8866b082d..661496e36352 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/vpaes-x86.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/vpaes-x86-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -672,3 +673,7 @@ L$022cbc_abort: pop ebx pop ebp ret +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/fipsmodule/x86-mont.asm b/third_party/boringssl/win-x86/crypto/fipsmodule/x86-mont-win.asm similarity index 98% rename from third_party/boringssl/win-x86/crypto/fipsmodule/x86-mont.asm rename to third_party/boringssl/win-x86/crypto/fipsmodule/x86-mont-win.asm index 14aa98872e78..cd77529cbc8e 100644 --- a/third_party/boringssl/win-x86/crypto/fipsmodule/x86-mont.asm +++ b/third_party/boringssl/win-x86/crypto/fipsmodule/x86-mont-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -483,3 +484,7 @@ db 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 db 111,114,103,62,0 segment .bss common _OPENSSL_ia32cap_P 16 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86/crypto/test/trampoline-x86.asm b/third_party/boringssl/win-x86/crypto/test/trampoline-x86-win.asm similarity index 96% rename from third_party/boringssl/win-x86/crypto/test/trampoline-x86.asm rename to third_party/boringssl/win-x86/crypto/test/trampoline-x86-win.asm index 5fb72c74b0bd..3ef9917afe9e 100644 --- a/third_party/boringssl/win-x86/crypto/test/trampoline-x86.asm +++ b/third_party/boringssl/win-x86/crypto/test/trampoline-x86-win.asm @@ -4,6 +4,7 @@ %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif +%ifidn __OUTPUT_FORMAT__, win32 %ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 @@ -154,3 +155,7 @@ _abi_test_clobber_xmm7: L$_abi_test_clobber_xmm7_begin: pxor xmm7,xmm7 ret +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/chacha/chacha-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/chacha/chacha-x86_64-win.asm similarity index 98% rename from third_party/boringssl/win-x86_64/crypto/chacha/chacha-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/chacha/chacha-x86_64-win.asm index a3c29381e3ca..994b787fb267 100644 --- a/third_party/boringssl/win-x86_64/crypto/chacha/chacha-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/chacha/chacha-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -14,6 +15,7 @@ section .text code align=64 EXTERN OPENSSL_ia32cap_P +section .rdata rdata align=8 ALIGN 64 $L$zero: DD 0,0,0,0 @@ -28,12 +30,12 @@ $L$incy: $L$eight: DD 8,8,8,8,8,8,8,8 $L$rot16: -DB 0x2,0x3,0x0,0x1,0x6,0x7,0x4,0x5,0xa,0xb,0x8,0x9,0xe,0xf,0xc,0xd + DB 0x2,0x3,0x0,0x1,0x6,0x7,0x4,0x5,0xa,0xb,0x8,0x9,0xe,0xf,0xc,0xd $L$rot24: -DB 0x3,0x0,0x1,0x2,0x7,0x4,0x5,0x6,0xb,0x8,0x9,0xa,0xf,0xc,0xd,0xe + DB 0x3,0x0,0x1,0x2,0x7,0x4,0x5,0x6,0xb,0x8,0x9,0xa,0xf,0xc,0xd,0xe $L$sigma: -DB 101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107 -DB 0 + DB 101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107 + DB 0 ALIGN 64 $L$zeroz: DD 0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0 @@ -43,10 +45,12 @@ $L$incz: DD 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 $L$sixteen: DD 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 -DB 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 -DB 95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32 -DB 98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115 -DB 108,46,111,114,103,62,0 + DB 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 + DB 95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32 + DB 98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115 + DB 108,46,111,114,103,62,0 +section .text + global ChaCha20_ctr32 ALIGN 64 @@ -1908,19 +1912,23 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_ChaCha20_ctr32: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase $L$SEH_info_ChaCha20_ssse3: -DB 9,0,0,0 + DB 9,0,0,0 DD ssse3_handler wrt ..imagebase DD $L$ssse3_body wrt ..imagebase,$L$ssse3_epilogue wrt ..imagebase $L$SEH_info_ChaCha20_4x: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$4x_body wrt ..imagebase,$L$4x_epilogue wrt ..imagebase $L$SEH_info_ChaCha20_8x: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$8x_body wrt ..imagebase,$L$8x_epilogue wrt ..imagebase +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-win.asm similarity index 99% rename from third_party/boringssl/win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-win.asm index e711826b141f..0019f3335802 100644 --- a/third_party/boringssl/win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -9,8 +10,7 @@ default rel %ifdef BORINGSSL_PREFIX %include "boringssl_prefix_symbols_nasm.inc" %endif -section .data data align=8 - +section .rdata rdata align=8 ALIGN 16 one: @@ -41,7 +41,7 @@ con1: con2: DD 0x1b,0x1b,0x1b,0x1b con3: -DB -1,-1,-1,-1,-1,-1,-1,-1,4,5,6,7,4,5,6,7 + DB -1,-1,-1,-1,-1,-1,-1,-1,4,5,6,7,4,5,6,7 and_mask: DD 0,0xffffffff,0xffffffff,0xffffffff section .text code align=64 @@ -3275,3 +3275,7 @@ $L$SEH_begin_aes256gcmsiv_kdf: DB 0F3h,0C3h ;repret $L$SEH_end_aes256gcmsiv_kdf: +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.asm b/third_party/boringssl/win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-win.asm similarity index 99% rename from third_party/boringssl/win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-win.asm index 7e3d6dd97749..527762a5ba51 100644 --- a/third_party/boringssl/win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -15,16 +16,17 @@ EXTERN OPENSSL_ia32cap_P chacha20_poly1305_constants: +section .rdata rdata align=8 ALIGN 64 $L$chacha20_consts: -DB 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' -DB 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' + DB 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' + DB 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' $L$rol8: -DB 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 -DB 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 + DB 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 + DB 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 $L$rol16: -DB 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 -DB 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 + DB 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 + DB 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 $L$avx2_init: DD 0,0,0,0 $L$sse_inc: @@ -36,22 +38,24 @@ $L$clamp: DQ 0xFFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFFF ALIGN 16 $L$and_masks: -DB 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff + DB 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 + DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff +section .text + ALIGN 64 @@ -8944,3 +8948,7 @@ $L$seal_avx2_exit: jmp NEAR $L$seal_sse_tail_16 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-win.asm similarity index 54% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-win.asm index 2b51a26849e3..e44dad6d2f1a 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -17,9 +18,9 @@ ALIGN 32 _aesni_ctr32_ghash_6x: vmovdqu xmm2,XMMWORD[32+r11] - sub rdx,6 + sub r8,6 vpxor xmm4,xmm4,xmm4 - vmovdqu xmm15,XMMWORD[((0-128))+rcx] + vmovdqu xmm15,XMMWORD[((0-128))+r9] vpaddb xmm10,xmm1,xmm2 vpaddb xmm11,xmm10,xmm2 vpaddb xmm12,xmm11,xmm2 @@ -33,16 +34,16 @@ ALIGN 32 $L$oop6x: add ebx,100663296 jc NEAR $L$handle_ctr32 - vmovdqu xmm3,XMMWORD[((0-32))+r9] + vmovdqu xmm3,XMMWORD[((0-32))+rsi] vpaddb xmm1,xmm14,xmm2 vpxor xmm10,xmm10,xmm15 vpxor xmm11,xmm11,xmm15 $L$resume_ctr32: - vmovdqu XMMWORD[r8],xmm1 + vmovdqu XMMWORD[rdi],xmm1 vpclmulqdq xmm5,xmm7,xmm3,0x10 vpxor xmm12,xmm12,xmm15 - vmovups xmm2,XMMWORD[((16-128))+rcx] + vmovups xmm2,XMMWORD[((16-128))+r9] vpclmulqdq xmm6,xmm7,xmm3,0x01 @@ -73,7 +74,7 @@ $L$resume_ctr32: setnc r12b vpclmulqdq xmm7,xmm7,xmm3,0x11 vaesenc xmm11,xmm11,xmm2 - vmovdqu xmm3,XMMWORD[((16-32))+r9] + vmovdqu xmm3,XMMWORD[((16-32))+rsi] neg r12 vaesenc xmm12,xmm12,xmm2 vpxor xmm6,xmm6,xmm5 @@ -82,7 +83,7 @@ $L$resume_ctr32: vaesenc xmm13,xmm13,xmm2 vpxor xmm4,xmm1,xmm5 and r12,0x60 - vmovups xmm15,XMMWORD[((32-128))+rcx] + vmovups xmm15,XMMWORD[((32-128))+r9] vpclmulqdq xmm1,xmm0,xmm3,0x10 vaesenc xmm14,xmm14,xmm2 @@ -100,10 +101,10 @@ $L$resume_ctr32: mov QWORD[((32+8))+rsp],r13 vaesenc xmm13,xmm13,xmm15 mov QWORD[((40+8))+rsp],r12 - vmovdqu xmm5,XMMWORD[((48-32))+r9] + vmovdqu xmm5,XMMWORD[((48-32))+rsi] vaesenc xmm14,xmm14,xmm15 - vmovups xmm15,XMMWORD[((48-128))+rcx] + vmovups xmm15,XMMWORD[((48-128))+r9] vpxor xmm6,xmm6,xmm1 vpclmulqdq xmm1,xmm0,xmm5,0x00 vaesenc xmm9,xmm9,xmm15 @@ -118,10 +119,10 @@ $L$resume_ctr32: vaesenc xmm12,xmm12,xmm15 vaesenc xmm13,xmm13,xmm15 vpxor xmm4,xmm4,xmm1 - vmovdqu xmm1,XMMWORD[((64-32))+r9] + vmovdqu xmm1,XMMWORD[((64-32))+rsi] vaesenc xmm14,xmm14,xmm15 - vmovups xmm15,XMMWORD[((64-128))+rcx] + vmovups xmm15,XMMWORD[((64-128))+r9] vpxor xmm6,xmm6,xmm2 vpclmulqdq xmm2,xmm0,xmm1,0x00 vaesenc xmm9,xmm9,xmm15 @@ -140,10 +141,10 @@ $L$resume_ctr32: vaesenc xmm13,xmm13,xmm15 mov QWORD[((56+8))+rsp],r12 vpxor xmm4,xmm4,xmm2 - vmovdqu xmm2,XMMWORD[((96-32))+r9] + vmovdqu xmm2,XMMWORD[((96-32))+rsi] vaesenc xmm14,xmm14,xmm15 - vmovups xmm15,XMMWORD[((80-128))+rcx] + vmovups xmm15,XMMWORD[((80-128))+r9] vpxor xmm6,xmm6,xmm3 vpclmulqdq xmm3,xmm0,xmm2,0x00 vaesenc xmm9,xmm9,xmm15 @@ -162,10 +163,10 @@ $L$resume_ctr32: vaesenc xmm13,xmm13,xmm15 mov QWORD[((72+8))+rsp],r12 vpxor xmm4,xmm4,xmm3 - vmovdqu xmm3,XMMWORD[((112-32))+r9] + vmovdqu xmm3,XMMWORD[((112-32))+rsi] vaesenc xmm14,xmm14,xmm15 - vmovups xmm15,XMMWORD[((96-128))+rcx] + vmovups xmm15,XMMWORD[((96-128))+r9] vpxor xmm6,xmm6,xmm5 vpclmulqdq xmm5,xmm8,xmm3,0x10 vaesenc xmm9,xmm9,xmm15 @@ -186,7 +187,7 @@ $L$resume_ctr32: vaesenc xmm14,xmm14,xmm15 vpxor xmm6,xmm6,xmm1 - vmovups xmm15,XMMWORD[((112-128))+rcx] + vmovups xmm15,XMMWORD[((112-128))+r9] vpslldq xmm5,xmm6,8 vpxor xmm4,xmm4,xmm2 vmovdqu xmm3,XMMWORD[16+r11] @@ -204,11 +205,11 @@ $L$resume_ctr32: vaesenc xmm12,xmm12,xmm15 mov QWORD[((104+8))+rsp],r12 vaesenc xmm13,xmm13,xmm15 - vmovups xmm1,XMMWORD[((128-128))+rcx] + vmovups xmm1,XMMWORD[((128-128))+r9] vaesenc xmm14,xmm14,xmm15 vaesenc xmm9,xmm9,xmm1 - vmovups xmm15,XMMWORD[((144-128))+rcx] + vmovups xmm15,XMMWORD[((144-128))+r9] vaesenc xmm10,xmm10,xmm1 vpsrldq xmm6,xmm6,8 vaesenc xmm11,xmm11,xmm1 @@ -219,8 +220,8 @@ $L$resume_ctr32: vaesenc xmm13,xmm13,xmm1 movbe r12,QWORD[r14] vaesenc xmm14,xmm14,xmm1 - vmovups xmm1,XMMWORD[((160-128))+rcx] - cmp ebp,11 + vmovups xmm1,XMMWORD[((160-128))+r9] + cmp r10d,11 jb NEAR $L$enc_tail vaesenc xmm9,xmm9,xmm15 @@ -235,9 +236,9 @@ $L$resume_ctr32: vaesenc xmm11,xmm11,xmm1 vaesenc xmm12,xmm12,xmm1 vaesenc xmm13,xmm13,xmm1 - vmovups xmm15,XMMWORD[((176-128))+rcx] + vmovups xmm15,XMMWORD[((176-128))+r9] vaesenc xmm14,xmm14,xmm1 - vmovups xmm1,XMMWORD[((192-128))+rcx] + vmovups xmm1,XMMWORD[((192-128))+r9] je NEAR $L$enc_tail vaesenc xmm9,xmm9,xmm15 @@ -252,9 +253,9 @@ $L$resume_ctr32: vaesenc xmm11,xmm11,xmm1 vaesenc xmm12,xmm12,xmm1 vaesenc xmm13,xmm13,xmm1 - vmovups xmm15,XMMWORD[((208-128))+rcx] + vmovups xmm15,XMMWORD[((208-128))+r9] vaesenc xmm14,xmm14,xmm1 - vmovups xmm1,XMMWORD[((224-128))+rcx] + vmovups xmm1,XMMWORD[((224-128))+r9] jmp NEAR $L$enc_tail ALIGN 32 @@ -264,7 +265,7 @@ $L$handle_ctr32: vmovdqu xmm5,XMMWORD[48+r11] vpaddd xmm10,xmm6,XMMWORD[64+r11] vpaddd xmm11,xmm6,xmm5 - vmovdqu xmm3,XMMWORD[((0-32))+r9] + vmovdqu xmm3,XMMWORD[((0-32))+rsi] vpaddd xmm12,xmm10,xmm5 vpshufb xmm10,xmm10,xmm0 vpaddd xmm13,xmm11,xmm5 @@ -286,29 +287,32 @@ $L$enc_tail: vpalignr xmm8,xmm4,xmm4,8 vaesenc xmm10,xmm10,xmm15 vpclmulqdq xmm4,xmm4,xmm3,0x10 - vpxor xmm2,xmm1,XMMWORD[rdi] + vpxor xmm2,xmm1,XMMWORD[rcx] vaesenc xmm11,xmm11,xmm15 - vpxor xmm0,xmm1,XMMWORD[16+rdi] + vpxor xmm0,xmm1,XMMWORD[16+rcx] vaesenc xmm12,xmm12,xmm15 - vpxor xmm5,xmm1,XMMWORD[32+rdi] + vpxor xmm5,xmm1,XMMWORD[32+rcx] vaesenc xmm13,xmm13,xmm15 - vpxor xmm6,xmm1,XMMWORD[48+rdi] + vpxor xmm6,xmm1,XMMWORD[48+rcx] vaesenc xmm14,xmm14,xmm15 - vpxor xmm7,xmm1,XMMWORD[64+rdi] - vpxor xmm3,xmm1,XMMWORD[80+rdi] - vmovdqu xmm1,XMMWORD[r8] + vpxor xmm7,xmm1,XMMWORD[64+rcx] + vpxor xmm3,xmm1,XMMWORD[80+rcx] + vmovdqu xmm1,XMMWORD[rdi] vaesenclast xmm9,xmm9,xmm2 vmovdqu xmm2,XMMWORD[32+r11] vaesenclast xmm10,xmm10,xmm0 vpaddb xmm0,xmm1,xmm2 mov QWORD[((112+8))+rsp],r13 - lea rdi,[96+rdi] + lea rcx,[96+rcx] + + prefetcht0 [512+rcx] + prefetcht0 [576+rcx] vaesenclast xmm11,xmm11,xmm5 vpaddb xmm5,xmm0,xmm2 mov QWORD[((120+8))+rsp],r12 - lea rsi,[96+rsi] - vmovdqu xmm15,XMMWORD[((0-128))+rcx] + lea rdx,[96+rdx] + vmovdqu xmm15,XMMWORD[((0-128))+r9] vaesenclast xmm12,xmm12,xmm6 vpaddb xmm6,xmm5,xmm2 vaesenclast xmm13,xmm13,xmm7 @@ -316,21 +320,21 @@ $L$enc_tail: vaesenclast xmm14,xmm14,xmm3 vpaddb xmm3,xmm7,xmm2 - add r10,0x60 - sub rdx,0x6 + add rax,0x60 + sub r8,0x6 jc NEAR $L$6x_done - vmovups XMMWORD[(-96)+rsi],xmm9 + vmovups XMMWORD[(-96)+rdx],xmm9 vpxor xmm9,xmm1,xmm15 - vmovups XMMWORD[(-80)+rsi],xmm10 + vmovups XMMWORD[(-80)+rdx],xmm10 vmovdqa xmm10,xmm0 - vmovups XMMWORD[(-64)+rsi],xmm11 + vmovups XMMWORD[(-64)+rdx],xmm11 vmovdqa xmm11,xmm5 - vmovups XMMWORD[(-48)+rsi],xmm12 + vmovups XMMWORD[(-48)+rdx],xmm12 vmovdqa xmm12,xmm6 - vmovups XMMWORD[(-32)+rsi],xmm13 + vmovups XMMWORD[(-32)+rdx],xmm13 vmovdqa xmm13,xmm7 - vmovups XMMWORD[(-16)+rsi],xmm14 + vmovups XMMWORD[(-16)+rdx],xmm14 vmovdqa xmm14,xmm3 vmovdqu xmm7,XMMWORD[((32+8))+rsp] jmp NEAR $L$oop6x @@ -346,66 +350,82 @@ global aesni_gcm_decrypt ALIGN 32 aesni_gcm_decrypt: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_aesni_gcm_decrypt: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - xor r10,r10 +$L$SEH_begin_aesni_gcm_decrypt_1: + xor rax,rax - cmp rdx,0x60 + cmp r8,0x60 jb NEAR $L$gcm_dec_abort - lea rax,[rsp] + push rbp - push rbx +$L$SEH_prolog_aesni_gcm_decrypt_2: + mov rbp,rsp - push rbp + push rbx +$L$SEH_prolog_aesni_gcm_decrypt_3: push r12 +$L$SEH_prolog_aesni_gcm_decrypt_4: push r13 +$L$SEH_prolog_aesni_gcm_decrypt_5: push r14 +$L$SEH_prolog_aesni_gcm_decrypt_6: push r15 +$L$SEH_prolog_aesni_gcm_decrypt_7: lea rsp,[((-168))+rsp] - movaps XMMWORD[(-216)+rax],xmm6 - movaps XMMWORD[(-200)+rax],xmm7 - movaps XMMWORD[(-184)+rax],xmm8 - movaps XMMWORD[(-168)+rax],xmm9 - movaps XMMWORD[(-152)+rax],xmm10 - movaps XMMWORD[(-136)+rax],xmm11 - movaps XMMWORD[(-120)+rax],xmm12 - movaps XMMWORD[(-104)+rax],xmm13 - movaps XMMWORD[(-88)+rax],xmm14 - movaps XMMWORD[(-72)+rax],xmm15 -$L$gcm_dec_body: +$L$SEH_prolog_aesni_gcm_decrypt_8: +$L$SEH_prolog_aesni_gcm_decrypt_9: + + + + mov QWORD[16+rbp],rdi +$L$SEH_prolog_aesni_gcm_decrypt_10: + mov QWORD[24+rbp],rsi +$L$SEH_prolog_aesni_gcm_decrypt_11: + mov rdi,QWORD[48+rbp] + mov rsi,QWORD[56+rbp] + + movaps XMMWORD[(-208)+rbp],xmm6 +$L$SEH_prolog_aesni_gcm_decrypt_12: + movaps XMMWORD[(-192)+rbp],xmm7 +$L$SEH_prolog_aesni_gcm_decrypt_13: + movaps XMMWORD[(-176)+rbp],xmm8 +$L$SEH_prolog_aesni_gcm_decrypt_14: + movaps XMMWORD[(-160)+rbp],xmm9 +$L$SEH_prolog_aesni_gcm_decrypt_15: + movaps XMMWORD[(-144)+rbp],xmm10 +$L$SEH_prolog_aesni_gcm_decrypt_16: + movaps XMMWORD[(-128)+rbp],xmm11 +$L$SEH_prolog_aesni_gcm_decrypt_17: + movaps XMMWORD[(-112)+rbp],xmm12 +$L$SEH_prolog_aesni_gcm_decrypt_18: + movaps XMMWORD[(-96)+rbp],xmm13 +$L$SEH_prolog_aesni_gcm_decrypt_19: + movaps XMMWORD[(-80)+rbp],xmm14 +$L$SEH_prolog_aesni_gcm_decrypt_20: + movaps XMMWORD[(-64)+rbp],xmm15 +$L$SEH_prolog_aesni_gcm_decrypt_21: vzeroupper - vmovdqu xmm1,XMMWORD[r8] + vmovdqu xmm1,XMMWORD[rdi] add rsp,-128 - mov ebx,DWORD[12+r8] + mov ebx,DWORD[12+rdi] lea r11,[$L$bswap_mask] - lea r14,[((-128))+rcx] + lea r14,[((-128))+r9] mov r15,0xf80 - vmovdqu xmm8,XMMWORD[r9] + vmovdqu xmm8,XMMWORD[rsi] and rsp,-128 vmovdqu xmm0,XMMWORD[r11] - lea rcx,[128+rcx] - lea r9,[((32+32))+r9] - mov ebp,DWORD[((240-128))+rcx] + lea r9,[128+r9] + lea rsi,[((32+32))+rsi] + mov r10d,DWORD[((240-128))+r9] vpshufb xmm8,xmm8,xmm0 and r14,r15 @@ -417,9 +437,9 @@ $L$gcm_dec_body: sub rsp,r15 $L$dec_no_key_aliasing: - vmovdqu xmm7,XMMWORD[80+rdi] - lea r14,[rdi] - vmovdqu xmm4,XMMWORD[64+rdi] + vmovdqu xmm7,XMMWORD[80+rcx] + mov r14,rcx + vmovdqu xmm4,XMMWORD[64+rcx] @@ -427,16 +447,16 @@ $L$dec_no_key_aliasing: - lea r15,[((-192))+rdx*1+rdi] + lea r15,[((-192))+r8*1+rcx] - vmovdqu xmm5,XMMWORD[48+rdi] - shr rdx,4 - xor r10,r10 - vmovdqu xmm6,XMMWORD[32+rdi] + vmovdqu xmm5,XMMWORD[48+rcx] + shr r8,4 + xor rax,rax + vmovdqu xmm6,XMMWORD[32+rcx] vpshufb xmm7,xmm7,xmm0 - vmovdqu xmm2,XMMWORD[16+rdi] + vmovdqu xmm2,XMMWORD[16+rcx] vpshufb xmm4,xmm4,xmm0 - vmovdqu xmm3,XMMWORD[rdi] + vmovdqu xmm3,XMMWORD[rcx] vpshufb xmm5,xmm5,xmm0 vmovdqu XMMWORD[48+rsp],xmm4 vpshufb xmm6,xmm6,xmm0 @@ -449,57 +469,57 @@ $L$dec_no_key_aliasing: call _aesni_ctr32_ghash_6x - vmovups XMMWORD[(-96)+rsi],xmm9 - vmovups XMMWORD[(-80)+rsi],xmm10 - vmovups XMMWORD[(-64)+rsi],xmm11 - vmovups XMMWORD[(-48)+rsi],xmm12 - vmovups XMMWORD[(-32)+rsi],xmm13 - vmovups XMMWORD[(-16)+rsi],xmm14 + vmovups XMMWORD[(-96)+rdx],xmm9 + vmovups XMMWORD[(-80)+rdx],xmm10 + vmovups XMMWORD[(-64)+rdx],xmm11 + vmovups XMMWORD[(-48)+rdx],xmm12 + vmovups XMMWORD[(-32)+rdx],xmm13 + vmovups XMMWORD[(-16)+rdx],xmm14 vpshufb xmm8,xmm8,XMMWORD[r11] - vmovdqu XMMWORD[(-64)+r9],xmm8 + vmovdqu XMMWORD[(-64)+rsi],xmm8 vzeroupper - movaps xmm6,XMMWORD[((-216))+rax] - movaps xmm7,XMMWORD[((-200))+rax] - movaps xmm8,XMMWORD[((-184))+rax] - movaps xmm9,XMMWORD[((-168))+rax] - movaps xmm10,XMMWORD[((-152))+rax] - movaps xmm11,XMMWORD[((-136))+rax] - movaps xmm12,XMMWORD[((-120))+rax] - movaps xmm13,XMMWORD[((-104))+rax] - movaps xmm14,XMMWORD[((-88))+rax] - movaps xmm15,XMMWORD[((-72))+rax] - mov r15,QWORD[((-48))+rax] + movaps xmm6,XMMWORD[((-208))+rbp] + movaps xmm7,XMMWORD[((-192))+rbp] + movaps xmm8,XMMWORD[((-176))+rbp] + movaps xmm9,XMMWORD[((-160))+rbp] + movaps xmm10,XMMWORD[((-144))+rbp] + movaps xmm11,XMMWORD[((-128))+rbp] + movaps xmm12,XMMWORD[((-112))+rbp] + movaps xmm13,XMMWORD[((-96))+rbp] + movaps xmm14,XMMWORD[((-80))+rbp] + movaps xmm15,XMMWORD[((-64))+rbp] + mov rdi,QWORD[16+rbp] + mov rsi,QWORD[24+rbp] + lea rsp,[((-40))+rbp] - mov r14,QWORD[((-40))+rax] + pop r15 - mov r13,QWORD[((-32))+rax] + pop r14 - mov r12,QWORD[((-24))+rax] + pop r13 - mov rbp,QWORD[((-16))+rax] + pop r12 - mov rbx,QWORD[((-8))+rax] + pop rbx - lea rsp,[rax] + pop rbp $L$gcm_dec_abort: - mov rax,r10 - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret +$L$SEH_end_aesni_gcm_decrypt_22: + -$L$SEH_end_aesni_gcm_decrypt: ALIGN 32 _aesni_ctr32_6x: - vmovdqu xmm4,XMMWORD[((0-128))+rcx] + vmovdqu xmm4,XMMWORD[((0-128))+r9] vmovdqu xmm2,XMMWORD[32+r11] - lea r13,[((-1))+rbp] - vmovups xmm15,XMMWORD[((16-128))+rcx] - lea r12,[((32-128))+rcx] + lea r13,[((-1))+r10] + vmovups xmm15,XMMWORD[((16-128))+r9] + lea r12,[((32-128))+r9] vpxor xmm9,xmm1,xmm4 add ebx,100663296 jc NEAR $L$handle_ctr32_2 @@ -531,18 +551,18 @@ $L$oop_ctr32: vmovdqu xmm3,XMMWORD[r12] vaesenc xmm9,xmm9,xmm15 - vpxor xmm4,xmm3,XMMWORD[rdi] + vpxor xmm4,xmm3,XMMWORD[rcx] vaesenc xmm10,xmm10,xmm15 - vpxor xmm5,xmm3,XMMWORD[16+rdi] + vpxor xmm5,xmm3,XMMWORD[16+rcx] vaesenc xmm11,xmm11,xmm15 - vpxor xmm6,xmm3,XMMWORD[32+rdi] + vpxor xmm6,xmm3,XMMWORD[32+rcx] vaesenc xmm12,xmm12,xmm15 - vpxor xmm8,xmm3,XMMWORD[48+rdi] + vpxor xmm8,xmm3,XMMWORD[48+rcx] vaesenc xmm13,xmm13,xmm15 - vpxor xmm2,xmm3,XMMWORD[64+rdi] + vpxor xmm2,xmm3,XMMWORD[64+rcx] vaesenc xmm14,xmm14,xmm15 - vpxor xmm3,xmm3,XMMWORD[80+rdi] - lea rdi,[96+rdi] + vpxor xmm3,xmm3,XMMWORD[80+rcx] + lea rcx,[96+rcx] vaesenclast xmm9,xmm9,xmm4 vaesenclast xmm10,xmm10,xmm5 @@ -550,13 +570,13 @@ $L$oop_ctr32: vaesenclast xmm12,xmm12,xmm8 vaesenclast xmm13,xmm13,xmm2 vaesenclast xmm14,xmm14,xmm3 - vmovups XMMWORD[rsi],xmm9 - vmovups XMMWORD[16+rsi],xmm10 - vmovups XMMWORD[32+rsi],xmm11 - vmovups XMMWORD[48+rsi],xmm12 - vmovups XMMWORD[64+rsi],xmm13 - vmovups XMMWORD[80+rsi],xmm14 - lea rsi,[96+rsi] + vmovups XMMWORD[rdx],xmm9 + vmovups XMMWORD[16+rdx],xmm10 + vmovups XMMWORD[32+rdx],xmm11 + vmovups XMMWORD[48+rdx],xmm12 + vmovups XMMWORD[64+rdx],xmm13 + vmovups XMMWORD[80+rdx],xmm14 + lea rdx,[96+rdx] DB 0F3h,0C3h ;repret ALIGN 32 @@ -588,69 +608,85 @@ global aesni_gcm_encrypt ALIGN 32 aesni_gcm_encrypt: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_aesni_gcm_encrypt: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - +$L$SEH_begin_aesni_gcm_encrypt_1: %ifdef BORINGSSL_DISPATCH_TEST EXTERN BORINGSSL_function_hit mov BYTE[((BORINGSSL_function_hit+2))],1 %endif - xor r10,r10 + xor rax,rax - cmp rdx,0x60*3 + cmp r8,0x60*3 jb NEAR $L$gcm_enc_abort - lea rax,[rsp] + push rbp - push rbx +$L$SEH_prolog_aesni_gcm_encrypt_2: + mov rbp,rsp - push rbp + push rbx +$L$SEH_prolog_aesni_gcm_encrypt_3: push r12 +$L$SEH_prolog_aesni_gcm_encrypt_4: push r13 +$L$SEH_prolog_aesni_gcm_encrypt_5: push r14 +$L$SEH_prolog_aesni_gcm_encrypt_6: push r15 +$L$SEH_prolog_aesni_gcm_encrypt_7: lea rsp,[((-168))+rsp] - movaps XMMWORD[(-216)+rax],xmm6 - movaps XMMWORD[(-200)+rax],xmm7 - movaps XMMWORD[(-184)+rax],xmm8 - movaps XMMWORD[(-168)+rax],xmm9 - movaps XMMWORD[(-152)+rax],xmm10 - movaps XMMWORD[(-136)+rax],xmm11 - movaps XMMWORD[(-120)+rax],xmm12 - movaps XMMWORD[(-104)+rax],xmm13 - movaps XMMWORD[(-88)+rax],xmm14 - movaps XMMWORD[(-72)+rax],xmm15 -$L$gcm_enc_body: +$L$SEH_prolog_aesni_gcm_encrypt_8: +$L$SEH_prolog_aesni_gcm_encrypt_9: + + + + mov QWORD[16+rbp],rdi +$L$SEH_prolog_aesni_gcm_encrypt_10: + mov QWORD[24+rbp],rsi +$L$SEH_prolog_aesni_gcm_encrypt_11: + mov rdi,QWORD[48+rbp] + mov rsi,QWORD[56+rbp] + + movaps XMMWORD[(-208)+rbp],xmm6 +$L$SEH_prolog_aesni_gcm_encrypt_12: + movaps XMMWORD[(-192)+rbp],xmm7 +$L$SEH_prolog_aesni_gcm_encrypt_13: + movaps XMMWORD[(-176)+rbp],xmm8 +$L$SEH_prolog_aesni_gcm_encrypt_14: + movaps XMMWORD[(-160)+rbp],xmm9 +$L$SEH_prolog_aesni_gcm_encrypt_15: + movaps XMMWORD[(-144)+rbp],xmm10 +$L$SEH_prolog_aesni_gcm_encrypt_16: + movaps XMMWORD[(-128)+rbp],xmm11 +$L$SEH_prolog_aesni_gcm_encrypt_17: + movaps XMMWORD[(-112)+rbp],xmm12 +$L$SEH_prolog_aesni_gcm_encrypt_18: + movaps XMMWORD[(-96)+rbp],xmm13 +$L$SEH_prolog_aesni_gcm_encrypt_19: + movaps XMMWORD[(-80)+rbp],xmm14 +$L$SEH_prolog_aesni_gcm_encrypt_20: + movaps XMMWORD[(-64)+rbp],xmm15 +$L$SEH_prolog_aesni_gcm_encrypt_21: vzeroupper - vmovdqu xmm1,XMMWORD[r8] + vmovdqu xmm1,XMMWORD[rdi] add rsp,-128 - mov ebx,DWORD[12+r8] + mov ebx,DWORD[12+rdi] lea r11,[$L$bswap_mask] - lea r14,[((-128))+rcx] + lea r14,[((-128))+r9] mov r15,0xf80 - lea rcx,[128+rcx] + lea r9,[128+r9] vmovdqu xmm0,XMMWORD[r11] and rsp,-128 - mov ebp,DWORD[((240-128))+rcx] + mov r10d,DWORD[((240-128))+r9] and r14,r15 and r15,rsp @@ -661,7 +697,7 @@ $L$gcm_enc_body: sub rsp,r15 $L$enc_no_key_aliasing: - lea r14,[rsi] + mov r14,rdx @@ -670,9 +706,9 @@ $L$enc_no_key_aliasing: - lea r15,[((-192))+rdx*1+rsi] + lea r15,[((-192))+r8*1+rdx] - shr rdx,4 + shr r8,4 call _aesni_ctr32_6x vpshufb xmm8,xmm9,xmm0 @@ -689,34 +725,34 @@ $L$enc_no_key_aliasing: call _aesni_ctr32_6x - vmovdqu xmm8,XMMWORD[r9] - lea r9,[((32+32))+r9] - sub rdx,12 - mov r10,0x60*2 + vmovdqu xmm8,XMMWORD[rsi] + lea rsi,[((32+32))+rsi] + sub r8,12 + mov rax,0x60*2 vpshufb xmm8,xmm8,xmm0 call _aesni_ctr32_ghash_6x vmovdqu xmm7,XMMWORD[32+rsp] vmovdqu xmm0,XMMWORD[r11] - vmovdqu xmm3,XMMWORD[((0-32))+r9] + vmovdqu xmm3,XMMWORD[((0-32))+rsi] vpunpckhqdq xmm1,xmm7,xmm7 - vmovdqu xmm15,XMMWORD[((32-32))+r9] - vmovups XMMWORD[(-96)+rsi],xmm9 + vmovdqu xmm15,XMMWORD[((32-32))+rsi] + vmovups XMMWORD[(-96)+rdx],xmm9 vpshufb xmm9,xmm9,xmm0 vpxor xmm1,xmm1,xmm7 - vmovups XMMWORD[(-80)+rsi],xmm10 + vmovups XMMWORD[(-80)+rdx],xmm10 vpshufb xmm10,xmm10,xmm0 - vmovups XMMWORD[(-64)+rsi],xmm11 + vmovups XMMWORD[(-64)+rdx],xmm11 vpshufb xmm11,xmm11,xmm0 - vmovups XMMWORD[(-48)+rsi],xmm12 + vmovups XMMWORD[(-48)+rdx],xmm12 vpshufb xmm12,xmm12,xmm0 - vmovups XMMWORD[(-32)+rsi],xmm13 + vmovups XMMWORD[(-32)+rdx],xmm13 vpshufb xmm13,xmm13,xmm0 - vmovups XMMWORD[(-16)+rsi],xmm14 + vmovups XMMWORD[(-16)+rdx],xmm14 vpshufb xmm14,xmm14,xmm0 vmovdqu XMMWORD[16+rsp],xmm9 vmovdqu xmm6,XMMWORD[48+rsp] - vmovdqu xmm0,XMMWORD[((16-32))+r9] + vmovdqu xmm0,XMMWORD[((16-32))+rsi] vpunpckhqdq xmm2,xmm6,xmm6 vpclmulqdq xmm5,xmm7,xmm3,0x00 vpxor xmm2,xmm2,xmm6 @@ -725,19 +761,19 @@ $L$enc_no_key_aliasing: vmovdqu xmm9,XMMWORD[64+rsp] vpclmulqdq xmm4,xmm6,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((48-32))+r9] + vmovdqu xmm3,XMMWORD[((48-32))+rsi] vpxor xmm4,xmm4,xmm5 vpunpckhqdq xmm5,xmm9,xmm9 vpclmulqdq xmm6,xmm6,xmm0,0x11 vpxor xmm5,xmm5,xmm9 vpxor xmm6,xmm6,xmm7 vpclmulqdq xmm2,xmm2,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((80-32))+r9] + vmovdqu xmm15,XMMWORD[((80-32))+rsi] vpxor xmm2,xmm2,xmm1 vmovdqu xmm1,XMMWORD[80+rsp] vpclmulqdq xmm7,xmm9,xmm3,0x00 - vmovdqu xmm0,XMMWORD[((64-32))+r9] + vmovdqu xmm0,XMMWORD[((64-32))+rsi] vpxor xmm7,xmm7,xmm4 vpunpckhqdq xmm4,xmm1,xmm1 vpclmulqdq xmm9,xmm9,xmm3,0x11 @@ -748,19 +784,19 @@ $L$enc_no_key_aliasing: vmovdqu xmm2,XMMWORD[96+rsp] vpclmulqdq xmm6,xmm1,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((96-32))+r9] + vmovdqu xmm3,XMMWORD[((96-32))+rsi] vpxor xmm6,xmm6,xmm7 vpunpckhqdq xmm7,xmm2,xmm2 vpclmulqdq xmm1,xmm1,xmm0,0x11 vpxor xmm7,xmm7,xmm2 vpxor xmm1,xmm1,xmm9 vpclmulqdq xmm4,xmm4,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((128-32))+r9] + vmovdqu xmm15,XMMWORD[((128-32))+rsi] vpxor xmm4,xmm4,xmm5 vpxor xmm8,xmm8,XMMWORD[112+rsp] vpclmulqdq xmm5,xmm2,xmm3,0x00 - vmovdqu xmm0,XMMWORD[((112-32))+r9] + vmovdqu xmm0,XMMWORD[((112-32))+rsi] vpunpckhqdq xmm9,xmm8,xmm8 vpxor xmm5,xmm5,xmm6 vpclmulqdq xmm2,xmm2,xmm3,0x11 @@ -770,17 +806,17 @@ $L$enc_no_key_aliasing: vpxor xmm4,xmm7,xmm4 vpclmulqdq xmm6,xmm8,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((0-32))+r9] + vmovdqu xmm3,XMMWORD[((0-32))+rsi] vpunpckhqdq xmm1,xmm14,xmm14 vpclmulqdq xmm8,xmm8,xmm0,0x11 vpxor xmm1,xmm1,xmm14 vpxor xmm5,xmm6,xmm5 vpclmulqdq xmm9,xmm9,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((32-32))+r9] + vmovdqu xmm15,XMMWORD[((32-32))+rsi] vpxor xmm7,xmm8,xmm2 vpxor xmm6,xmm9,xmm4 - vmovdqu xmm0,XMMWORD[((16-32))+r9] + vmovdqu xmm0,XMMWORD[((16-32))+rsi] vpxor xmm9,xmm7,xmm5 vpclmulqdq xmm4,xmm14,xmm3,0x00 vpxor xmm6,xmm6,xmm9 @@ -794,7 +830,7 @@ $L$enc_no_key_aliasing: vpxor xmm7,xmm7,xmm6 vpclmulqdq xmm5,xmm13,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((48-32))+r9] + vmovdqu xmm3,XMMWORD[((48-32))+rsi] vpxor xmm5,xmm5,xmm4 vpunpckhqdq xmm9,xmm12,xmm12 vpclmulqdq xmm13,xmm13,xmm0,0x11 @@ -802,11 +838,11 @@ $L$enc_no_key_aliasing: vpxor xmm13,xmm13,xmm14 vpalignr xmm14,xmm8,xmm8,8 vpclmulqdq xmm2,xmm2,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((80-32))+r9] + vmovdqu xmm15,XMMWORD[((80-32))+rsi] vpxor xmm2,xmm2,xmm1 vpclmulqdq xmm4,xmm12,xmm3,0x00 - vmovdqu xmm0,XMMWORD[((64-32))+r9] + vmovdqu xmm0,XMMWORD[((64-32))+rsi] vpxor xmm4,xmm4,xmm5 vpunpckhqdq xmm1,xmm11,xmm11 vpclmulqdq xmm12,xmm12,xmm3,0x11 @@ -820,7 +856,7 @@ $L$enc_no_key_aliasing: vxorps xmm8,xmm8,xmm14 vpclmulqdq xmm5,xmm11,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((96-32))+r9] + vmovdqu xmm3,XMMWORD[((96-32))+rsi] vpxor xmm5,xmm5,xmm4 vpunpckhqdq xmm2,xmm10,xmm10 vpclmulqdq xmm11,xmm11,xmm0,0x11 @@ -828,7 +864,7 @@ $L$enc_no_key_aliasing: vpalignr xmm14,xmm8,xmm8,8 vpxor xmm11,xmm11,xmm12 vpclmulqdq xmm1,xmm1,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((128-32))+r9] + vmovdqu xmm15,XMMWORD[((128-32))+rsi] vpxor xmm1,xmm1,xmm9 vxorps xmm14,xmm14,xmm7 @@ -836,7 +872,7 @@ $L$enc_no_key_aliasing: vxorps xmm8,xmm8,xmm14 vpclmulqdq xmm4,xmm10,xmm3,0x00 - vmovdqu xmm0,XMMWORD[((112-32))+r9] + vmovdqu xmm0,XMMWORD[((112-32))+rsi] vpxor xmm4,xmm4,xmm5 vpunpckhqdq xmm9,xmm8,xmm8 vpclmulqdq xmm10,xmm10,xmm3,0x11 @@ -869,165 +905,190 @@ $L$enc_no_key_aliasing: vpxor xmm2,xmm2,xmm7 vpxor xmm8,xmm8,xmm2 vpshufb xmm8,xmm8,XMMWORD[r11] - vmovdqu XMMWORD[(-64)+r9],xmm8 + vmovdqu XMMWORD[(-64)+rsi],xmm8 vzeroupper - movaps xmm6,XMMWORD[((-216))+rax] - movaps xmm7,XMMWORD[((-200))+rax] - movaps xmm8,XMMWORD[((-184))+rax] - movaps xmm9,XMMWORD[((-168))+rax] - movaps xmm10,XMMWORD[((-152))+rax] - movaps xmm11,XMMWORD[((-136))+rax] - movaps xmm12,XMMWORD[((-120))+rax] - movaps xmm13,XMMWORD[((-104))+rax] - movaps xmm14,XMMWORD[((-88))+rax] - movaps xmm15,XMMWORD[((-72))+rax] - mov r15,QWORD[((-48))+rax] + movaps xmm6,XMMWORD[((-208))+rbp] + movaps xmm7,XMMWORD[((-192))+rbp] + movaps xmm8,XMMWORD[((-176))+rbp] + movaps xmm9,XMMWORD[((-160))+rbp] + movaps xmm10,XMMWORD[((-144))+rbp] + movaps xmm11,XMMWORD[((-128))+rbp] + movaps xmm12,XMMWORD[((-112))+rbp] + movaps xmm13,XMMWORD[((-96))+rbp] + movaps xmm14,XMMWORD[((-80))+rbp] + movaps xmm15,XMMWORD[((-64))+rbp] + mov rdi,QWORD[16+rbp] + mov rsi,QWORD[24+rbp] + lea rsp,[((-40))+rbp] - mov r14,QWORD[((-40))+rax] + pop r15 - mov r13,QWORD[((-32))+rax] + pop r14 - mov r12,QWORD[((-24))+rax] + pop r13 - mov rbp,QWORD[((-16))+rax] + pop r12 - mov rbx,QWORD[((-8))+rax] + pop rbx - lea rsp,[rax] + pop rbp $L$gcm_enc_abort: - mov rax,r10 - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret +$L$SEH_end_aesni_gcm_encrypt_22: + -$L$SEH_end_aesni_gcm_encrypt: +section .rdata rdata align=8 ALIGN 64 $L$bswap_mask: -DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 + DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 $L$poly: -DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 $L$one_msb: -DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 $L$two_lsb: -DB 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DB 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 $L$one_lsb: -DB 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -DB 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108 -DB 101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82 -DB 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112 -DB 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 + DB 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DB 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108 + DB 101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82 + DB 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112 + DB 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 ALIGN 64 -EXTERN __imp_RtlVirtualUnwind - -ALIGN 16 -gcm_se_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - mov rax,QWORD[120+r8] - - mov r15,QWORD[((-48))+rax] - mov r14,QWORD[((-40))+rax] - mov r13,QWORD[((-32))+rax] - mov r12,QWORD[((-24))+rax] - mov rbp,QWORD[((-16))+rax] - mov rbx,QWORD[((-8))+rax] - mov QWORD[240+r8],r15 - mov QWORD[232+r8],r14 - mov QWORD[224+r8],r13 - mov QWORD[216+r8],r12 - mov QWORD[160+r8],rbp - mov QWORD[144+r8],rbx - - lea rsi,[((-216))+rax] - lea rdi,[512+r8] - mov ecx,20 - DD 0xa548f3fc - -$L$common_seh_tail: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - +section .text section .pdata rdata align=4 ALIGN 4 - DD $L$SEH_begin_aesni_gcm_decrypt wrt ..imagebase - DD $L$SEH_end_aesni_gcm_decrypt wrt ..imagebase - DD $L$SEH_gcm_dec_info wrt ..imagebase + DD $L$SEH_begin_aesni_gcm_decrypt_1 wrt ..imagebase + DD $L$SEH_end_aesni_gcm_decrypt_22 wrt ..imagebase + DD $L$SEH_info_aesni_gcm_decrypt_0 wrt ..imagebase + + DD $L$SEH_begin_aesni_gcm_encrypt_1 wrt ..imagebase + DD $L$SEH_end_aesni_gcm_encrypt_22 wrt ..imagebase + DD $L$SEH_info_aesni_gcm_encrypt_0 wrt ..imagebase + - DD $L$SEH_begin_aesni_gcm_encrypt wrt ..imagebase - DD $L$SEH_end_aesni_gcm_encrypt wrt ..imagebase - DD $L$SEH_gcm_enc_info wrt ..imagebase section .xdata rdata align=8 -ALIGN 8 -$L$SEH_gcm_dec_info: -DB 9,0,0,0 - DD gcm_se_handler wrt ..imagebase - DD $L$gcm_dec_body wrt ..imagebase,$L$gcm_dec_abort wrt ..imagebase -$L$SEH_gcm_enc_info: -DB 9,0,0,0 - DD gcm_se_handler wrt ..imagebase - DD $L$gcm_enc_body wrt ..imagebase,$L$gcm_enc_abort wrt ..imagebase +ALIGN 4 +$L$SEH_info_aesni_gcm_decrypt_0: + DB 1 + DB $L$SEH_prolog_aesni_gcm_decrypt_21-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 33 + DB 213 + DB $L$SEH_prolog_aesni_gcm_decrypt_21-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 248 + DW 9 + DB $L$SEH_prolog_aesni_gcm_decrypt_20-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 232 + DW 8 + DB $L$SEH_prolog_aesni_gcm_decrypt_19-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 216 + DW 7 + DB $L$SEH_prolog_aesni_gcm_decrypt_18-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 200 + DW 6 + DB $L$SEH_prolog_aesni_gcm_decrypt_17-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 184 + DW 5 + DB $L$SEH_prolog_aesni_gcm_decrypt_16-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 168 + DW 4 + DB $L$SEH_prolog_aesni_gcm_decrypt_15-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 152 + DW 3 + DB $L$SEH_prolog_aesni_gcm_decrypt_14-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 136 + DW 2 + DB $L$SEH_prolog_aesni_gcm_decrypt_13-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 120 + DW 1 + DB $L$SEH_prolog_aesni_gcm_decrypt_12-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 104 + DW 0 + DB $L$SEH_prolog_aesni_gcm_decrypt_11-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 100 + DW 29 + DB $L$SEH_prolog_aesni_gcm_decrypt_10-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 116 + DW 28 + DB $L$SEH_prolog_aesni_gcm_decrypt_9-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 3 + DB $L$SEH_prolog_aesni_gcm_decrypt_8-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 1 + DW 21 + DB $L$SEH_prolog_aesni_gcm_decrypt_7-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 240 + DB $L$SEH_prolog_aesni_gcm_decrypt_6-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 224 + DB $L$SEH_prolog_aesni_gcm_decrypt_5-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 208 + DB $L$SEH_prolog_aesni_gcm_decrypt_4-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 192 + DB $L$SEH_prolog_aesni_gcm_decrypt_3-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 48 + DB $L$SEH_prolog_aesni_gcm_decrypt_2-$L$SEH_begin_aesni_gcm_decrypt_1 + DB 80 + +$L$SEH_info_aesni_gcm_encrypt_0: + DB 1 + DB $L$SEH_prolog_aesni_gcm_encrypt_21-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 33 + DB 213 + DB $L$SEH_prolog_aesni_gcm_encrypt_21-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 248 + DW 9 + DB $L$SEH_prolog_aesni_gcm_encrypt_20-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 232 + DW 8 + DB $L$SEH_prolog_aesni_gcm_encrypt_19-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 216 + DW 7 + DB $L$SEH_prolog_aesni_gcm_encrypt_18-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 200 + DW 6 + DB $L$SEH_prolog_aesni_gcm_encrypt_17-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 184 + DW 5 + DB $L$SEH_prolog_aesni_gcm_encrypt_16-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 168 + DW 4 + DB $L$SEH_prolog_aesni_gcm_encrypt_15-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 152 + DW 3 + DB $L$SEH_prolog_aesni_gcm_encrypt_14-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 136 + DW 2 + DB $L$SEH_prolog_aesni_gcm_encrypt_13-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 120 + DW 1 + DB $L$SEH_prolog_aesni_gcm_encrypt_12-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 104 + DW 0 + DB $L$SEH_prolog_aesni_gcm_encrypt_11-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 100 + DW 29 + DB $L$SEH_prolog_aesni_gcm_encrypt_10-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 116 + DW 28 + DB $L$SEH_prolog_aesni_gcm_encrypt_9-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 3 + DB $L$SEH_prolog_aesni_gcm_encrypt_8-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 1 + DW 21 + DB $L$SEH_prolog_aesni_gcm_encrypt_7-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 240 + DB $L$SEH_prolog_aesni_gcm_encrypt_6-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 224 + DB $L$SEH_prolog_aesni_gcm_encrypt_5-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 208 + DB $L$SEH_prolog_aesni_gcm_encrypt_4-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 192 + DB $L$SEH_prolog_aesni_gcm_encrypt_3-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 48 + DB $L$SEH_prolog_aesni_gcm_encrypt_2-$L$SEH_begin_aesni_gcm_encrypt_1 + DB 80 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-x86_64-win.asm similarity index 77% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-x86_64-win.asm index 342c1523eea2..2a6d23768a93 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/aesni-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -28,12 +29,12 @@ EXTERN BORINGSSL_function_hit lea r8,[32+r8] xorps xmm2,xmm0 $L$oop_enc1_1: -DB 102,15,56,220,209 + DB 102,15,56,220,209 dec eax movups xmm1,XMMWORD[r8] lea r8,[16+r8] jnz NEAR $L$oop_enc1_1 -DB 102,15,56,221,209 + DB 102,15,56,221,209 pxor xmm0,xmm0 pxor xmm1,xmm1 movups XMMWORD[rdx],xmm2 @@ -54,12 +55,12 @@ aes_hw_decrypt: lea r8,[32+r8] xorps xmm2,xmm0 $L$oop_dec1_2: -DB 102,15,56,222,209 + DB 102,15,56,222,209 dec eax movups xmm1,XMMWORD[r8] lea r8,[16+r8] jnz NEAR $L$oop_dec1_2 -DB 102,15,56,223,209 + DB 102,15,56,223,209 pxor xmm0,xmm0 pxor xmm1,xmm1 movups XMMWORD[rdx],xmm2 @@ -82,19 +83,19 @@ _aesni_encrypt2: add rax,16 $L$enc_loop2: -DB 102,15,56,220,209 -DB 102,15,56,220,217 + DB 102,15,56,220,209 + DB 102,15,56,220,217 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 + DB 102,15,56,220,208 + DB 102,15,56,220,216 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop2 -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,221,208 -DB 102,15,56,221,216 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,221,208 + DB 102,15,56,221,216 DB 0F3h,0C3h ;repret @@ -113,19 +114,19 @@ _aesni_decrypt2: add rax,16 $L$dec_loop2: -DB 102,15,56,222,209 -DB 102,15,56,222,217 + DB 102,15,56,222,209 + DB 102,15,56,222,217 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,222,208 -DB 102,15,56,222,216 + DB 102,15,56,222,208 + DB 102,15,56,222,216 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$dec_loop2 -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,223,208 -DB 102,15,56,223,216 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,223,208 + DB 102,15,56,223,216 DB 0F3h,0C3h ;repret @@ -145,23 +146,23 @@ _aesni_encrypt3: add rax,16 $L$enc_loop3: -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 + DB 102,15,56,220,208 + DB 102,15,56,220,216 + DB 102,15,56,220,224 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop3 -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,221,208 -DB 102,15,56,221,216 -DB 102,15,56,221,224 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 + DB 102,15,56,221,208 + DB 102,15,56,221,216 + DB 102,15,56,221,224 DB 0F3h,0C3h ;repret @@ -181,23 +182,23 @@ _aesni_decrypt3: add rax,16 $L$dec_loop3: -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$dec_loop3 -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,223,208 -DB 102,15,56,223,216 -DB 102,15,56,223,224 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,223,208 + DB 102,15,56,223,216 + DB 102,15,56,223,224 DB 0F3h,0C3h ;repret @@ -215,31 +216,31 @@ _aesni_encrypt4: movups xmm0,XMMWORD[32+rcx] lea rcx,[32+rax*1+rcx] neg rax -DB 0x0f,0x1f,0x00 + DB 0x0f,0x1f,0x00 add rax,16 $L$enc_loop4: -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 + DB 102,15,56,220,233 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 + DB 102,15,56,220,208 + DB 102,15,56,220,216 + DB 102,15,56,220,224 + DB 102,15,56,220,232 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop4 -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,221,208 -DB 102,15,56,221,216 -DB 102,15,56,221,224 -DB 102,15,56,221,232 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 + DB 102,15,56,220,233 + DB 102,15,56,221,208 + DB 102,15,56,221,216 + DB 102,15,56,221,224 + DB 102,15,56,221,232 DB 0F3h,0C3h ;repret @@ -257,31 +258,31 @@ _aesni_decrypt4: movups xmm0,XMMWORD[32+rcx] lea rcx,[32+rax*1+rcx] neg rax -DB 0x0f,0x1f,0x00 + DB 0x0f,0x1f,0x00 add rax,16 $L$dec_loop4: -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 -DB 102,15,56,222,232 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 + DB 102,15,56,222,232 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$dec_loop4 -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,223,208 -DB 102,15,56,223,216 -DB 102,15,56,223,224 -DB 102,15,56,223,232 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,223,208 + DB 102,15,56,223,216 + DB 102,15,56,223,224 + DB 102,15,56,223,232 DB 0F3h,0C3h ;repret @@ -295,49 +296,49 @@ _aesni_encrypt6: xorps xmm2,xmm0 pxor xmm3,xmm0 pxor xmm4,xmm0 -DB 102,15,56,220,209 + DB 102,15,56,220,209 lea rcx,[32+rax*1+rcx] neg rax -DB 102,15,56,220,217 + DB 102,15,56,220,217 pxor xmm5,xmm0 pxor xmm6,xmm0 -DB 102,15,56,220,225 + DB 102,15,56,220,225 pxor xmm7,xmm0 movups xmm0,XMMWORD[rax*1+rcx] add rax,16 jmp NEAR $L$enc_loop6_enter ALIGN 16 $L$enc_loop6: -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 $L$enc_loop6_enter: -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 + DB 102,15,56,220,233 + DB 102,15,56,220,241 + DB 102,15,56,220,249 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 -DB 102,15,56,220,240 -DB 102,15,56,220,248 + DB 102,15,56,220,208 + DB 102,15,56,220,216 + DB 102,15,56,220,224 + DB 102,15,56,220,232 + DB 102,15,56,220,240 + DB 102,15,56,220,248 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop6 -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,15,56,221,208 -DB 102,15,56,221,216 -DB 102,15,56,221,224 -DB 102,15,56,221,232 -DB 102,15,56,221,240 -DB 102,15,56,221,248 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 + DB 102,15,56,220,233 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,15,56,221,208 + DB 102,15,56,221,216 + DB 102,15,56,221,224 + DB 102,15,56,221,232 + DB 102,15,56,221,240 + DB 102,15,56,221,248 DB 0F3h,0C3h ;repret @@ -351,49 +352,49 @@ _aesni_decrypt6: xorps xmm2,xmm0 pxor xmm3,xmm0 pxor xmm4,xmm0 -DB 102,15,56,222,209 + DB 102,15,56,222,209 lea rcx,[32+rax*1+rcx] neg rax -DB 102,15,56,222,217 + DB 102,15,56,222,217 pxor xmm5,xmm0 pxor xmm6,xmm0 -DB 102,15,56,222,225 + DB 102,15,56,222,225 pxor xmm7,xmm0 movups xmm0,XMMWORD[rax*1+rcx] add rax,16 jmp NEAR $L$dec_loop6_enter ALIGN 16 $L$dec_loop6: -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 $L$dec_loop6_enter: -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 -DB 102,15,56,222,232 -DB 102,15,56,222,240 -DB 102,15,56,222,248 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 + DB 102,15,56,222,232 + DB 102,15,56,222,240 + DB 102,15,56,222,248 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$dec_loop6 -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 -DB 102,15,56,223,208 -DB 102,15,56,223,216 -DB 102,15,56,223,224 -DB 102,15,56,223,232 -DB 102,15,56,223,240 -DB 102,15,56,223,248 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 + DB 102,15,56,223,208 + DB 102,15,56,223,216 + DB 102,15,56,223,224 + DB 102,15,56,223,232 + DB 102,15,56,223,240 + DB 102,15,56,223,248 DB 0F3h,0C3h ;repret @@ -411,55 +412,55 @@ _aesni_encrypt8: pxor xmm6,xmm0 lea rcx,[32+rax*1+rcx] neg rax -DB 102,15,56,220,209 + DB 102,15,56,220,209 pxor xmm7,xmm0 pxor xmm8,xmm0 -DB 102,15,56,220,217 + DB 102,15,56,220,217 pxor xmm9,xmm0 movups xmm0,XMMWORD[rax*1+rcx] add rax,16 jmp NEAR $L$enc_loop8_inner ALIGN 16 $L$enc_loop8: -DB 102,15,56,220,209 -DB 102,15,56,220,217 + DB 102,15,56,220,209 + DB 102,15,56,220,217 $L$enc_loop8_inner: -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 + DB 102,15,56,220,225 + DB 102,15,56,220,233 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 + DB 102,68,15,56,220,201 $L$enc_loop8_enter: movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 + DB 102,15,56,220,208 + DB 102,15,56,220,216 + DB 102,15,56,220,224 + DB 102,15,56,220,232 + DB 102,15,56,220,240 + DB 102,15,56,220,248 + DB 102,68,15,56,220,192 + DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$enc_loop8 -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 -DB 102,15,56,221,208 -DB 102,15,56,221,216 -DB 102,15,56,221,224 -DB 102,15,56,221,232 -DB 102,15,56,221,240 -DB 102,15,56,221,248 -DB 102,68,15,56,221,192 -DB 102,68,15,56,221,200 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 + DB 102,15,56,220,233 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 + DB 102,68,15,56,220,201 + DB 102,15,56,221,208 + DB 102,15,56,221,216 + DB 102,15,56,221,224 + DB 102,15,56,221,232 + DB 102,15,56,221,240 + DB 102,15,56,221,248 + DB 102,68,15,56,221,192 + DB 102,68,15,56,221,200 DB 0F3h,0C3h ;repret @@ -477,55 +478,55 @@ _aesni_decrypt8: pxor xmm6,xmm0 lea rcx,[32+rax*1+rcx] neg rax -DB 102,15,56,222,209 + DB 102,15,56,222,209 pxor xmm7,xmm0 pxor xmm8,xmm0 -DB 102,15,56,222,217 + DB 102,15,56,222,217 pxor xmm9,xmm0 movups xmm0,XMMWORD[rax*1+rcx] add rax,16 jmp NEAR $L$dec_loop8_inner ALIGN 16 $L$dec_loop8: -DB 102,15,56,222,209 -DB 102,15,56,222,217 + DB 102,15,56,222,209 + DB 102,15,56,222,217 $L$dec_loop8_inner: -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 -DB 102,68,15,56,222,193 -DB 102,68,15,56,222,201 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 + DB 102,68,15,56,222,193 + DB 102,68,15,56,222,201 $L$dec_loop8_enter: movups xmm1,XMMWORD[rax*1+rcx] add rax,32 -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 -DB 102,15,56,222,232 -DB 102,15,56,222,240 -DB 102,15,56,222,248 -DB 102,68,15,56,222,192 -DB 102,68,15,56,222,200 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 + DB 102,15,56,222,232 + DB 102,15,56,222,240 + DB 102,15,56,222,248 + DB 102,68,15,56,222,192 + DB 102,68,15,56,222,200 movups xmm0,XMMWORD[((-16))+rax*1+rcx] jnz NEAR $L$dec_loop8 -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 -DB 102,68,15,56,222,193 -DB 102,68,15,56,222,201 -DB 102,15,56,223,208 -DB 102,15,56,223,216 -DB 102,15,56,223,224 -DB 102,15,56,223,232 -DB 102,15,56,223,240 -DB 102,15,56,223,248 -DB 102,68,15,56,223,192 -DB 102,68,15,56,223,200 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 + DB 102,68,15,56,222,193 + DB 102,68,15,56,222,201 + DB 102,15,56,223,208 + DB 102,15,56,223,216 + DB 102,15,56,223,224 + DB 102,15,56,223,232 + DB 102,15,56,223,240 + DB 102,15,56,223,248 + DB 102,68,15,56,223,192 + DB 102,68,15,56,223,200 DB 0F3h,0C3h ;repret @@ -652,12 +653,12 @@ $L$ecb_enc_one: lea rcx,[32+rcx] xorps xmm2,xmm0 $L$oop_enc1_3: -DB 102,15,56,220,209 + DB 102,15,56,220,209 dec eax movups xmm1,XMMWORD[rcx] lea rcx,[16+rcx] jnz NEAR $L$oop_enc1_3 -DB 102,15,56,221,209 + DB 102,15,56,221,209 movups XMMWORD[rsi],xmm2 jmp NEAR $L$ecb_ret ALIGN 16 @@ -813,12 +814,12 @@ $L$ecb_dec_one: lea rcx,[32+rcx] xorps xmm2,xmm0 $L$oop_dec1_4: -DB 102,15,56,222,209 + DB 102,15,56,222,209 dec eax movups xmm1,XMMWORD[rcx] lea rcx,[16+rcx] jnz NEAR $L$oop_dec1_4 -DB 102,15,56,223,209 + DB 102,15,56,223,209 movups XMMWORD[rsi],xmm2 pxor xmm2,xmm2 jmp NEAR $L$ecb_ret @@ -934,12 +935,12 @@ $L$SEH_begin_aes_hw_ctr32_encrypt_blocks: lea rcx,[32+rcx] xorps xmm2,xmm0 $L$oop_enc1_5: -DB 102,15,56,220,209 + DB 102,15,56,220,209 dec edx movups xmm1,XMMWORD[rcx] lea rcx,[16+rcx] jnz NEAR $L$oop_enc1_5 -DB 102,15,56,221,209 + DB 102,15,56,221,209 pxor xmm0,xmm0 pxor xmm1,xmm1 xorps xmm2,xmm3 @@ -1053,39 +1054,39 @@ ALIGN 16 $L$ctr32_loop6: add r8d,6 movups xmm0,XMMWORD[((-48))+r10*1+rcx] -DB 102,15,56,220,209 + DB 102,15,56,220,209 mov eax,r8d xor eax,ebp -DB 102,15,56,220,217 -DB 0x0f,0x38,0xf1,0x44,0x24,12 + DB 102,15,56,220,217 + DB 0x0f,0x38,0xf1,0x44,0x24,12 lea eax,[1+r8] -DB 102,15,56,220,225 + DB 102,15,56,220,225 xor eax,ebp -DB 0x0f,0x38,0xf1,0x44,0x24,28 -DB 102,15,56,220,233 + DB 0x0f,0x38,0xf1,0x44,0x24,28 + DB 102,15,56,220,233 lea eax,[2+r8] xor eax,ebp -DB 102,15,56,220,241 -DB 0x0f,0x38,0xf1,0x44,0x24,44 + DB 102,15,56,220,241 + DB 0x0f,0x38,0xf1,0x44,0x24,44 lea eax,[3+r8] -DB 102,15,56,220,249 + DB 102,15,56,220,249 movups xmm1,XMMWORD[((-32))+r10*1+rcx] xor eax,ebp -DB 102,15,56,220,208 -DB 0x0f,0x38,0xf1,0x44,0x24,60 + DB 102,15,56,220,208 + DB 0x0f,0x38,0xf1,0x44,0x24,60 lea eax,[4+r8] -DB 102,15,56,220,216 + DB 102,15,56,220,216 xor eax,ebp -DB 0x0f,0x38,0xf1,0x44,0x24,76 -DB 102,15,56,220,224 + DB 0x0f,0x38,0xf1,0x44,0x24,76 + DB 102,15,56,220,224 lea eax,[5+r8] xor eax,ebp -DB 102,15,56,220,232 -DB 0x0f,0x38,0xf1,0x44,0x24,92 + DB 102,15,56,220,232 + DB 0x0f,0x38,0xf1,0x44,0x24,92 mov rax,r10 -DB 102,15,56,220,240 -DB 102,15,56,220,248 + DB 102,15,56,220,240 + DB 102,15,56,220,248 movups xmm0,XMMWORD[((-16))+r10*1+rcx] call $L$enc_loop6 @@ -1134,163 +1135,163 @@ ALIGN 32 $L$ctr32_loop8: add r8d,8 movdqa xmm8,XMMWORD[96+rsp] -DB 102,15,56,220,209 + DB 102,15,56,220,209 mov r9d,r8d movdqa xmm9,XMMWORD[112+rsp] -DB 102,15,56,220,217 + DB 102,15,56,220,217 bswap r9d movups xmm0,XMMWORD[((32-128))+rcx] -DB 102,15,56,220,225 + DB 102,15,56,220,225 xor r9d,ebp nop -DB 102,15,56,220,233 + DB 102,15,56,220,233 mov DWORD[((0+12))+rsp],r9d lea r9,[1+r8] -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 + DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((48-128))+rcx] bswap r9d -DB 102,15,56,220,208 -DB 102,15,56,220,216 + DB 102,15,56,220,208 + DB 102,15,56,220,216 xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,224 -DB 102,15,56,220,232 + DB 0x66,0x90 + DB 102,15,56,220,224 + DB 102,15,56,220,232 mov DWORD[((16+12))+rsp],r9d lea r9,[2+r8] -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 + DB 102,15,56,220,240 + DB 102,15,56,220,248 + DB 102,68,15,56,220,192 + DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((64-128))+rcx] bswap r9d -DB 102,15,56,220,209 -DB 102,15,56,220,217 + DB 102,15,56,220,209 + DB 102,15,56,220,217 xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,225 -DB 102,15,56,220,233 + DB 0x66,0x90 + DB 102,15,56,220,225 + DB 102,15,56,220,233 mov DWORD[((32+12))+rsp],r9d lea r9,[3+r8] -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 + DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((80-128))+rcx] bswap r9d -DB 102,15,56,220,208 -DB 102,15,56,220,216 + DB 102,15,56,220,208 + DB 102,15,56,220,216 xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,224 -DB 102,15,56,220,232 + DB 0x66,0x90 + DB 102,15,56,220,224 + DB 102,15,56,220,232 mov DWORD[((48+12))+rsp],r9d lea r9,[4+r8] -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 + DB 102,15,56,220,240 + DB 102,15,56,220,248 + DB 102,68,15,56,220,192 + DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((96-128))+rcx] bswap r9d -DB 102,15,56,220,209 -DB 102,15,56,220,217 + DB 102,15,56,220,209 + DB 102,15,56,220,217 xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,225 -DB 102,15,56,220,233 + DB 0x66,0x90 + DB 102,15,56,220,225 + DB 102,15,56,220,233 mov DWORD[((64+12))+rsp],r9d lea r9,[5+r8] -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 + DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((112-128))+rcx] bswap r9d -DB 102,15,56,220,208 -DB 102,15,56,220,216 + DB 102,15,56,220,208 + DB 102,15,56,220,216 xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,224 -DB 102,15,56,220,232 + DB 0x66,0x90 + DB 102,15,56,220,224 + DB 102,15,56,220,232 mov DWORD[((80+12))+rsp],r9d lea r9,[6+r8] -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 + DB 102,15,56,220,240 + DB 102,15,56,220,248 + DB 102,68,15,56,220,192 + DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((128-128))+rcx] bswap r9d -DB 102,15,56,220,209 -DB 102,15,56,220,217 + DB 102,15,56,220,209 + DB 102,15,56,220,217 xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,225 -DB 102,15,56,220,233 + DB 0x66,0x90 + DB 102,15,56,220,225 + DB 102,15,56,220,233 mov DWORD[((96+12))+rsp],r9d lea r9,[7+r8] -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 + DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((144-128))+rcx] bswap r9d -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 + DB 102,15,56,220,208 + DB 102,15,56,220,216 + DB 102,15,56,220,224 xor r9d,ebp movdqu xmm10,XMMWORD[rdi] -DB 102,15,56,220,232 + DB 102,15,56,220,232 mov DWORD[((112+12))+rsp],r9d cmp eax,11 -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 + DB 102,15,56,220,240 + DB 102,15,56,220,248 + DB 102,68,15,56,220,192 + DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((160-128))+rcx] jb NEAR $L$ctr32_enc_done -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 + DB 102,15,56,220,233 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 + DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((176-128))+rcx] -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 + DB 102,15,56,220,208 + DB 102,15,56,220,216 + DB 102,15,56,220,224 + DB 102,15,56,220,232 + DB 102,15,56,220,240 + DB 102,15,56,220,248 + DB 102,68,15,56,220,192 + DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((192-128))+rcx] je NEAR $L$ctr32_enc_done -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 + DB 102,15,56,220,233 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 + DB 102,68,15,56,220,201 movups xmm1,XMMWORD[((208-128))+rcx] -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 + DB 102,15,56,220,208 + DB 102,15,56,220,216 + DB 102,15,56,220,224 + DB 102,15,56,220,232 + DB 102,15,56,220,240 + DB 102,15,56,220,248 + DB 102,68,15,56,220,192 + DB 102,68,15,56,220,200 movups xmm0,XMMWORD[((224-128))+rcx] jmp NEAR $L$ctr32_enc_done @@ -1307,35 +1308,35 @@ $L$ctr32_enc_done: movdqu xmm15,XMMWORD[80+rdi] pxor xmm14,xmm0 pxor xmm15,xmm0 -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 + DB 102,15,56,220,209 + DB 102,15,56,220,217 + DB 102,15,56,220,225 + DB 102,15,56,220,233 + DB 102,15,56,220,241 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 + DB 102,68,15,56,220,201 movdqu xmm1,XMMWORD[96+rdi] lea rdi,[128+rdi] -DB 102,65,15,56,221,210 + DB 102,65,15,56,221,210 pxor xmm1,xmm0 movdqu xmm10,XMMWORD[((112-128))+rdi] -DB 102,65,15,56,221,219 + DB 102,65,15,56,221,219 pxor xmm10,xmm0 movdqa xmm11,XMMWORD[rsp] -DB 102,65,15,56,221,228 -DB 102,65,15,56,221,237 + DB 102,65,15,56,221,228 + DB 102,65,15,56,221,237 movdqa xmm12,XMMWORD[16+rsp] movdqa xmm13,XMMWORD[32+rsp] -DB 102,65,15,56,221,246 -DB 102,65,15,56,221,255 + DB 102,65,15,56,221,246 + DB 102,65,15,56,221,255 movdqa xmm14,XMMWORD[48+rsp] movdqa xmm15,XMMWORD[64+rsp] -DB 102,68,15,56,221,193 + DB 102,68,15,56,221,193 movdqa xmm0,XMMWORD[80+rsp] movups xmm1,XMMWORD[((16-128))+rcx] -DB 102,69,15,56,221,202 + DB 102,69,15,56,221,202 movups XMMWORD[rsi],xmm2 movdqa xmm2,xmm11 @@ -1374,19 +1375,19 @@ $L$ctr32_tail: pxor xmm9,xmm9 movups xmm0,XMMWORD[16+rcx] -DB 102,15,56,220,209 -DB 102,15,56,220,217 + DB 102,15,56,220,209 + DB 102,15,56,220,217 lea rcx,[((32-16))+rax*1+rcx] neg rax -DB 102,15,56,220,225 + DB 102,15,56,220,225 add rax,16 movups xmm10,XMMWORD[rdi] -DB 102,15,56,220,233 -DB 102,15,56,220,241 + DB 102,15,56,220,233 + DB 102,15,56,220,241 movups xmm11,XMMWORD[16+rdi] movups xmm12,XMMWORD[32+rdi] -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 + DB 102,15,56,220,249 + DB 102,68,15,56,220,193 call $L$enc_loop8_enter @@ -1417,20 +1418,20 @@ DB 102,68,15,56,220,193 ALIGN 32 $L$ctr32_loop4: -DB 102,15,56,220,209 + DB 102,15,56,220,209 lea rcx,[16+rcx] dec eax -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 + DB 102,15,56,220,217 + DB 102,15,56,220,225 + DB 102,15,56,220,233 movups xmm1,XMMWORD[rcx] jnz NEAR $L$ctr32_loop4 -DB 102,15,56,221,209 -DB 102,15,56,221,217 + DB 102,15,56,221,209 + DB 102,15,56,221,217 movups xmm10,XMMWORD[rdi] movups xmm11,XMMWORD[16+rdi] -DB 102,15,56,221,225 -DB 102,15,56,221,233 + DB 102,15,56,221,225 + DB 102,15,56,221,233 movups xmm12,XMMWORD[32+rdi] movups xmm13,XMMWORD[48+rdi] @@ -1446,16 +1447,16 @@ DB 102,15,56,221,233 ALIGN 32 $L$ctr32_loop3: -DB 102,15,56,220,209 + DB 102,15,56,220,209 lea rcx,[16+rcx] dec eax -DB 102,15,56,220,217 -DB 102,15,56,220,225 + DB 102,15,56,220,217 + DB 102,15,56,220,225 movups xmm1,XMMWORD[rcx] jnz NEAR $L$ctr32_loop3 -DB 102,15,56,221,209 -DB 102,15,56,221,217 -DB 102,15,56,221,225 + DB 102,15,56,221,209 + DB 102,15,56,221,217 + DB 102,15,56,221,225 movups xmm10,XMMWORD[rdi] xorps xmm2,xmm10 @@ -1560,12 +1561,12 @@ $L$cbc_enc_loop: lea rcx,[32+rcx] xorps xmm2,xmm3 $L$oop_enc1_6: -DB 102,15,56,220,209 + DB 102,15,56,220,209 dec eax movups xmm1,XMMWORD[rcx] lea rcx,[16+rcx] jnz NEAR $L$oop_enc1_6 -DB 102,15,56,221,209 + DB 102,15,56,221,209 mov eax,r10d mov rcx,r11 movups XMMWORD[rsi],xmm2 @@ -1611,12 +1612,12 @@ $L$cbc_decrypt: lea rcx,[32+rcx] xorps xmm2,xmm0 $L$oop_dec1_7: -DB 102,15,56,222,209 + DB 102,15,56,222,209 dec r10d movups xmm1,XMMWORD[rcx] lea rcx,[16+rcx] jnz NEAR $L$oop_dec1_7 -DB 102,15,56,223,209 + DB 102,15,56,223,209 pxor xmm0,xmm0 pxor xmm1,xmm1 movdqu XMMWORD[r8],xmm4 @@ -1692,166 +1693,166 @@ $L$cbc_dec_loop8_enter: pxor xmm7,xmm0 pxor xmm8,xmm0 -DB 102,15,56,222,209 + DB 102,15,56,222,209 pxor xmm9,xmm0 movups xmm0,XMMWORD[((32-112))+rcx] -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 -DB 102,68,15,56,222,193 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 + DB 102,68,15,56,222,193 adc rbp,0 and rbp,128 -DB 102,68,15,56,222,201 + DB 102,68,15,56,222,201 add rbp,rdi movups xmm1,XMMWORD[((48-112))+rcx] -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 -DB 102,15,56,222,232 -DB 102,15,56,222,240 -DB 102,15,56,222,248 -DB 102,68,15,56,222,192 -DB 102,68,15,56,222,200 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 + DB 102,15,56,222,232 + DB 102,15,56,222,240 + DB 102,15,56,222,248 + DB 102,68,15,56,222,192 + DB 102,68,15,56,222,200 movups xmm0,XMMWORD[((64-112))+rcx] nop -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 -DB 102,68,15,56,222,193 -DB 102,68,15,56,222,201 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 + DB 102,68,15,56,222,193 + DB 102,68,15,56,222,201 movups xmm1,XMMWORD[((80-112))+rcx] nop -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 -DB 102,15,56,222,232 -DB 102,15,56,222,240 -DB 102,15,56,222,248 -DB 102,68,15,56,222,192 -DB 102,68,15,56,222,200 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 + DB 102,15,56,222,232 + DB 102,15,56,222,240 + DB 102,15,56,222,248 + DB 102,68,15,56,222,192 + DB 102,68,15,56,222,200 movups xmm0,XMMWORD[((96-112))+rcx] nop -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 -DB 102,68,15,56,222,193 -DB 102,68,15,56,222,201 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 + DB 102,68,15,56,222,193 + DB 102,68,15,56,222,201 movups xmm1,XMMWORD[((112-112))+rcx] nop -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 -DB 102,15,56,222,232 -DB 102,15,56,222,240 -DB 102,15,56,222,248 -DB 102,68,15,56,222,192 -DB 102,68,15,56,222,200 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 + DB 102,15,56,222,232 + DB 102,15,56,222,240 + DB 102,15,56,222,248 + DB 102,68,15,56,222,192 + DB 102,68,15,56,222,200 movups xmm0,XMMWORD[((128-112))+rcx] nop -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 -DB 102,68,15,56,222,193 -DB 102,68,15,56,222,201 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 + DB 102,68,15,56,222,193 + DB 102,68,15,56,222,201 movups xmm1,XMMWORD[((144-112))+rcx] cmp eax,11 -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 -DB 102,15,56,222,232 -DB 102,15,56,222,240 -DB 102,15,56,222,248 -DB 102,68,15,56,222,192 -DB 102,68,15,56,222,200 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 + DB 102,15,56,222,232 + DB 102,15,56,222,240 + DB 102,15,56,222,248 + DB 102,68,15,56,222,192 + DB 102,68,15,56,222,200 movups xmm0,XMMWORD[((160-112))+rcx] jb NEAR $L$cbc_dec_done -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 -DB 102,68,15,56,222,193 -DB 102,68,15,56,222,201 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 + DB 102,68,15,56,222,193 + DB 102,68,15,56,222,201 movups xmm1,XMMWORD[((176-112))+rcx] nop -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 -DB 102,15,56,222,232 -DB 102,15,56,222,240 -DB 102,15,56,222,248 -DB 102,68,15,56,222,192 -DB 102,68,15,56,222,200 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 + DB 102,15,56,222,232 + DB 102,15,56,222,240 + DB 102,15,56,222,248 + DB 102,68,15,56,222,192 + DB 102,68,15,56,222,200 movups xmm0,XMMWORD[((192-112))+rcx] je NEAR $L$cbc_dec_done -DB 102,15,56,222,209 -DB 102,15,56,222,217 -DB 102,15,56,222,225 -DB 102,15,56,222,233 -DB 102,15,56,222,241 -DB 102,15,56,222,249 -DB 102,68,15,56,222,193 -DB 102,68,15,56,222,201 + DB 102,15,56,222,209 + DB 102,15,56,222,217 + DB 102,15,56,222,225 + DB 102,15,56,222,233 + DB 102,15,56,222,241 + DB 102,15,56,222,249 + DB 102,68,15,56,222,193 + DB 102,68,15,56,222,201 movups xmm1,XMMWORD[((208-112))+rcx] nop -DB 102,15,56,222,208 -DB 102,15,56,222,216 -DB 102,15,56,222,224 -DB 102,15,56,222,232 -DB 102,15,56,222,240 -DB 102,15,56,222,248 -DB 102,68,15,56,222,192 -DB 102,68,15,56,222,200 + DB 102,15,56,222,208 + DB 102,15,56,222,216 + DB 102,15,56,222,224 + DB 102,15,56,222,232 + DB 102,15,56,222,240 + DB 102,15,56,222,248 + DB 102,68,15,56,222,192 + DB 102,68,15,56,222,200 movups xmm0,XMMWORD[((224-112))+rcx] jmp NEAR $L$cbc_dec_done ALIGN 16 $L$cbc_dec_done: -DB 102,15,56,222,209 -DB 102,15,56,222,217 + DB 102,15,56,222,209 + DB 102,15,56,222,217 pxor xmm10,xmm0 pxor xmm11,xmm0 -DB 102,15,56,222,225 -DB 102,15,56,222,233 + DB 102,15,56,222,225 + DB 102,15,56,222,233 pxor xmm12,xmm0 pxor xmm13,xmm0 -DB 102,15,56,222,241 -DB 102,15,56,222,249 + DB 102,15,56,222,241 + DB 102,15,56,222,249 pxor xmm14,xmm0 pxor xmm15,xmm0 -DB 102,68,15,56,222,193 -DB 102,68,15,56,222,201 + DB 102,68,15,56,222,193 + DB 102,68,15,56,222,201 movdqu xmm1,XMMWORD[80+rdi] -DB 102,65,15,56,223,210 + DB 102,65,15,56,223,210 movdqu xmm10,XMMWORD[96+rdi] pxor xmm1,xmm0 -DB 102,65,15,56,223,219 + DB 102,65,15,56,223,219 pxor xmm10,xmm0 movdqu xmm0,XMMWORD[112+rdi] -DB 102,65,15,56,223,228 + DB 102,65,15,56,223,228 lea rdi,[128+rdi] movdqu xmm11,XMMWORD[rbp] -DB 102,65,15,56,223,237 -DB 102,65,15,56,223,246 + DB 102,65,15,56,223,237 + DB 102,65,15,56,223,246 movdqu xmm12,XMMWORD[16+rbp] movdqu xmm13,XMMWORD[32+rbp] -DB 102,65,15,56,223,255 -DB 102,68,15,56,223,193 + DB 102,65,15,56,223,255 + DB 102,68,15,56,223,193 movdqu xmm14,XMMWORD[48+rbp] movdqu xmm15,XMMWORD[64+rbp] -DB 102,69,15,56,223,202 + DB 102,69,15,56,223,202 movdqa xmm10,xmm0 movdqu xmm1,XMMWORD[80+rbp] movups xmm0,XMMWORD[((-112))+rcx] @@ -2040,12 +2041,12 @@ $L$cbc_dec_one: lea rcx,[32+rcx] xorps xmm2,xmm0 $L$oop_dec1_8: -DB 102,15,56,222,209 + DB 102,15,56,222,209 dec eax movups xmm1,XMMWORD[rcx] lea rcx,[16+rcx] jnz NEAR $L$oop_dec1_8 -DB 102,15,56,223,209 + DB 102,15,56,223,209 xorps xmm2,xmm10 movaps xmm10,xmm11 jmp NEAR $L$cbc_dec_tail_collected @@ -2156,7 +2157,7 @@ global aes_hw_set_decrypt_key ALIGN 16 aes_hw_set_decrypt_key: -DB 0x48,0x83,0xEC,0x08 + DB 0x48,0x83,0xEC,0x08 call __aesni_set_encrypt_key shl edx,4 @@ -2174,8 +2175,8 @@ DB 0x48,0x83,0xEC,0x08 $L$dec_key_inverse: movups xmm0,XMMWORD[r8] movups xmm1,XMMWORD[rcx] -DB 102,15,56,219,192 -DB 102,15,56,219,201 + DB 102,15,56,219,192 + DB 102,15,56,219,201 lea r8,[16+r8] lea rcx,[((-16))+rcx] movups XMMWORD[16+rcx],xmm0 @@ -2184,7 +2185,7 @@ DB 102,15,56,219,201 ja NEAR $L$dec_key_inverse movups xmm0,XMMWORD[r8] -DB 102,15,56,219,192 + DB 102,15,56,219,192 pxor xmm1,xmm1 movups XMMWORD[rcx],xmm0 pxor xmm0,xmm0 @@ -2204,7 +2205,7 @@ __aesni_set_encrypt_key: %ifdef BORINGSSL_DISPATCH_TEST mov BYTE[((BORINGSSL_function_hit+3))],1 %endif -DB 0x48,0x83,0xEC,0x08 + DB 0x48,0x83,0xEC,0x08 mov rax,-1 test rcx,rcx @@ -2231,25 +2232,25 @@ $L$10rounds: je NEAR $L$10rounds_alt movups XMMWORD[r8],xmm0 -DB 102,15,58,223,200,1 + DB 102,15,58,223,200,1 call $L$key_expansion_128_cold -DB 102,15,58,223,200,2 + DB 102,15,58,223,200,2 call $L$key_expansion_128 -DB 102,15,58,223,200,4 + DB 102,15,58,223,200,4 call $L$key_expansion_128 -DB 102,15,58,223,200,8 + DB 102,15,58,223,200,8 call $L$key_expansion_128 -DB 102,15,58,223,200,16 + DB 102,15,58,223,200,16 call $L$key_expansion_128 -DB 102,15,58,223,200,32 + DB 102,15,58,223,200,32 call $L$key_expansion_128 -DB 102,15,58,223,200,64 + DB 102,15,58,223,200,64 call $L$key_expansion_128 -DB 102,15,58,223,200,128 + DB 102,15,58,223,200,128 call $L$key_expansion_128 -DB 102,15,58,223,200,27 + DB 102,15,58,223,200,27 call $L$key_expansion_128 -DB 102,15,58,223,200,54 + DB 102,15,58,223,200,54 call $L$key_expansion_128 movups XMMWORD[rax],xmm0 mov DWORD[80+rax],edx @@ -2268,7 +2269,7 @@ $L$10rounds_alt: ALIGN 16 $L$oop_key128: DB 102,15,56,0,197 -DB 102,15,56,221,196 + DB 102,15,56,221,196 pslld xmm4,1 lea rax,[16+rax] @@ -2290,7 +2291,7 @@ DB 102,15,56,221,196 movdqa xmm4,XMMWORD[$L$key_rcon1b] DB 102,15,56,0,197 -DB 102,15,56,221,196 + DB 102,15,56,221,196 pslld xmm4,1 movdqa xmm3,xmm2 @@ -2306,7 +2307,7 @@ DB 102,15,56,221,196 movdqa xmm2,xmm0 DB 102,15,56,0,197 -DB 102,15,56,221,196 + DB 102,15,56,221,196 movdqa xmm3,xmm2 pslldq xmm2,4 @@ -2331,21 +2332,21 @@ $L$12rounds: je NEAR $L$12rounds_alt movups XMMWORD[r8],xmm0 -DB 102,15,58,223,202,1 + DB 102,15,58,223,202,1 call $L$key_expansion_192a_cold -DB 102,15,58,223,202,2 + DB 102,15,58,223,202,2 call $L$key_expansion_192b -DB 102,15,58,223,202,4 + DB 102,15,58,223,202,4 call $L$key_expansion_192a -DB 102,15,58,223,202,8 + DB 102,15,58,223,202,8 call $L$key_expansion_192b -DB 102,15,58,223,202,16 + DB 102,15,58,223,202,16 call $L$key_expansion_192a -DB 102,15,58,223,202,32 + DB 102,15,58,223,202,32 call $L$key_expansion_192b -DB 102,15,58,223,202,64 + DB 102,15,58,223,202,64 call $L$key_expansion_192a -DB 102,15,58,223,202,128 + DB 102,15,58,223,202,128 call $L$key_expansion_192b movups XMMWORD[rax],xmm0 mov DWORD[48+rax],edx @@ -2365,7 +2366,7 @@ $L$oop_key192: movq QWORD[rax],xmm2 movdqa xmm1,xmm2 DB 102,15,56,0,213 -DB 102,15,56,221,212 + DB 102,15,56,221,212 pslld xmm4,1 lea rax,[24+rax] @@ -2403,31 +2404,31 @@ $L$14rounds: movups XMMWORD[r8],xmm0 movups XMMWORD[16+r8],xmm2 -DB 102,15,58,223,202,1 + DB 102,15,58,223,202,1 call $L$key_expansion_256a_cold -DB 102,15,58,223,200,1 + DB 102,15,58,223,200,1 call $L$key_expansion_256b -DB 102,15,58,223,202,2 + DB 102,15,58,223,202,2 call $L$key_expansion_256a -DB 102,15,58,223,200,2 + DB 102,15,58,223,200,2 call $L$key_expansion_256b -DB 102,15,58,223,202,4 + DB 102,15,58,223,202,4 call $L$key_expansion_256a -DB 102,15,58,223,200,4 + DB 102,15,58,223,200,4 call $L$key_expansion_256b -DB 102,15,58,223,202,8 + DB 102,15,58,223,202,8 call $L$key_expansion_256a -DB 102,15,58,223,200,8 + DB 102,15,58,223,200,8 call $L$key_expansion_256b -DB 102,15,58,223,202,16 + DB 102,15,58,223,202,16 call $L$key_expansion_256a -DB 102,15,58,223,200,16 + DB 102,15,58,223,200,16 call $L$key_expansion_256b -DB 102,15,58,223,202,32 + DB 102,15,58,223,202,32 call $L$key_expansion_256a -DB 102,15,58,223,200,32 + DB 102,15,58,223,200,32 call $L$key_expansion_256b -DB 102,15,58,223,202,64 + DB 102,15,58,223,202,64 call $L$key_expansion_256a movups XMMWORD[rax],xmm0 mov DWORD[16+rax],edx @@ -2447,7 +2448,7 @@ $L$14rounds_alt: ALIGN 16 $L$oop_key256: DB 102,15,56,0,213 -DB 102,15,56,221,212 + DB 102,15,56,221,212 movdqa xmm3,xmm0 pslldq xmm0,4 @@ -2466,7 +2467,7 @@ DB 102,15,56,221,212 pshufd xmm2,xmm0,0xff pxor xmm3,xmm3 -DB 102,15,56,221,211 + DB 102,15,56,221,211 movdqa xmm3,xmm1 pslldq xmm1,4 @@ -2574,9 +2575,10 @@ $L$key_expansion_256b: DB 0F3h,0C3h ;repret +section .rdata rdata align=8 ALIGN 64 $L$bswap_mask: -DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 + DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 $L$increment32: DD 6,6,6,0 $L$increment64: @@ -2584,7 +2586,7 @@ $L$increment64: $L$xts_magic: DD 0x87,0,1,0 $L$increment1: -DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 $L$key_rotate: DD 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d $L$key_rotate192: @@ -2594,11 +2596,13 @@ $L$key_rcon1: $L$key_rcon1b: DD 0x1b,0x1b,0x1b,0x1b -DB 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 -DB 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 -DB 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 -DB 115,108,46,111,114,103,62,0 + DB 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 + DB 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 + DB 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 + DB 115,108,46,111,114,103,62,0 ALIGN 64 +section .text + EXTERN __imp_RtlVirtualUnwind ALIGN 16 @@ -2791,16 +2795,20 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_ecb: -DB 9,0,0,0 + DB 9,0,0,0 DD ecb_ccm64_se_handler wrt ..imagebase DD $L$ecb_enc_body wrt ..imagebase,$L$ecb_enc_ret wrt ..imagebase $L$SEH_info_ctr32: -DB 9,0,0,0 + DB 9,0,0,0 DD ctr_xts_se_handler wrt ..imagebase DD $L$ctr32_body wrt ..imagebase,$L$ctr32_epilogue wrt ..imagebase $L$SEH_info_cbc: -DB 9,0,0,0 + DB 9,0,0,0 DD cbc_se_handler wrt ..imagebase $L$SEH_info_key: -DB 0x01,0x04,0x01,0x00 -DB 0x04,0x02,0x00,0x00 + DB 0x01,0x04,0x01,0x00 + DB 0x04,0x02,0x00,0x00 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-win.asm similarity index 76% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-win.asm index 434ba10ed62c..b3d54e6ae112 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -21,14 +22,13 @@ global gcm_gmult_ssse3 ALIGN 16 gcm_gmult_ssse3: -$L$gmult_seh_begin: +$L$SEH_begin_gcm_gmult_ssse3_1: sub rsp,40 -$L$gmult_seh_allocstack: +$L$SEH_prolog_gcm_gmult_ssse3_2: movdqa XMMWORD[rsp],xmm6 -$L$gmult_seh_save_xmm6: +$L$SEH_prolog_gcm_gmult_ssse3_3: movdqa XMMWORD[16+rsp],xmm10 -$L$gmult_seh_save_xmm10: -$L$gmult_seh_prolog_end: +$L$SEH_prolog_gcm_gmult_ssse3_4: movdqu xmm0,XMMWORD[rcx] movdqa xmm10,XMMWORD[$L$reverse_bytes] movdqa xmm2,XMMWORD[$L$low4_mask] @@ -207,8 +207,8 @@ DB 102,65,15,56,0,210 movdqa xmm10,XMMWORD[16+rsp] add rsp,40 DB 0F3h,0C3h ;repret -$L$gmult_seh_end: +$L$SEH_end_gcm_gmult_ssse3_5: @@ -219,17 +219,16 @@ $L$gmult_seh_end: global gcm_ghash_ssse3 ALIGN 16 gcm_ghash_ssse3: -$L$ghash_seh_begin: +$L$SEH_begin_gcm_ghash_ssse3_1: sub rsp,56 -$L$ghash_seh_allocstack: +$L$SEH_prolog_gcm_ghash_ssse3_2: movdqa XMMWORD[rsp],xmm6 -$L$ghash_seh_save_xmm6: +$L$SEH_prolog_gcm_ghash_ssse3_3: movdqa XMMWORD[16+rsp],xmm10 -$L$ghash_seh_save_xmm10: +$L$SEH_prolog_gcm_ghash_ssse3_4: movdqa XMMWORD[32+rsp],xmm11 -$L$ghash_seh_save_xmm11: -$L$ghash_seh_prolog_end: +$L$SEH_prolog_gcm_ghash_ssse3_5: movdqu xmm0,XMMWORD[rcx] movdqa xmm10,XMMWORD[$L$reverse_bytes] movdqa xmm11,XMMWORD[$L$low4_mask] @@ -431,65 +430,65 @@ DB 102,65,15,56,0,194 movdqa xmm11,XMMWORD[32+rsp] add rsp,56 DB 0F3h,0C3h ;repret -$L$ghash_seh_end: +$L$SEH_end_gcm_ghash_ssse3_6: +section .rdata rdata align=8 ALIGN 16 $L$reverse_bytes: -DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 + DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 $L$low4_mask: DQ 0x0f0f0f0f0f0f0f0f,0x0f0f0f0f0f0f0f0f +section .text + section .pdata rdata align=4 ALIGN 4 - DD $L$gmult_seh_begin wrt ..imagebase - DD $L$gmult_seh_end wrt ..imagebase - DD $L$gmult_seh_info wrt ..imagebase + DD $L$SEH_begin_gcm_gmult_ssse3_1 wrt ..imagebase + DD $L$SEH_end_gcm_gmult_ssse3_5 wrt ..imagebase + DD $L$SEH_info_gcm_gmult_ssse3_0 wrt ..imagebase + + DD $L$SEH_begin_gcm_ghash_ssse3_1 wrt ..imagebase + DD $L$SEH_end_gcm_ghash_ssse3_6 wrt ..imagebase + DD $L$SEH_info_gcm_ghash_ssse3_0 wrt ..imagebase - DD $L$ghash_seh_begin wrt ..imagebase - DD $L$ghash_seh_end wrt ..imagebase - DD $L$ghash_seh_info wrt ..imagebase section .xdata rdata align=8 -ALIGN 8 -$L$gmult_seh_info: -DB 1 -DB $L$gmult_seh_prolog_end-$L$gmult_seh_begin -DB 5 -DB 0 - -DB $L$gmult_seh_save_xmm10-$L$gmult_seh_begin -DB 168 +ALIGN 4 +$L$SEH_info_gcm_gmult_ssse3_0: + DB 1 + DB $L$SEH_prolog_gcm_gmult_ssse3_4-$L$SEH_begin_gcm_gmult_ssse3_1 + DB 5 + DB 0 + DB $L$SEH_prolog_gcm_gmult_ssse3_4-$L$SEH_begin_gcm_gmult_ssse3_1 + DB 168 DW 1 - -DB $L$gmult_seh_save_xmm6-$L$gmult_seh_begin -DB 104 + DB $L$SEH_prolog_gcm_gmult_ssse3_3-$L$SEH_begin_gcm_gmult_ssse3_1 + DB 104 DW 0 - -DB $L$gmult_seh_allocstack-$L$gmult_seh_begin -DB 66 - -ALIGN 8 -$L$ghash_seh_info: -DB 1 -DB $L$ghash_seh_prolog_end-$L$ghash_seh_begin -DB 7 -DB 0 - -DB $L$ghash_seh_save_xmm11-$L$ghash_seh_begin -DB 184 + DB $L$SEH_prolog_gcm_gmult_ssse3_2-$L$SEH_begin_gcm_gmult_ssse3_1 + DB 66 + +$L$SEH_info_gcm_ghash_ssse3_0: + DB 1 + DB $L$SEH_prolog_gcm_ghash_ssse3_5-$L$SEH_begin_gcm_ghash_ssse3_1 + DB 7 + DB 0 + DB $L$SEH_prolog_gcm_ghash_ssse3_5-$L$SEH_begin_gcm_ghash_ssse3_1 + DB 184 DW 2 - -DB $L$ghash_seh_save_xmm10-$L$ghash_seh_begin -DB 168 + DB $L$SEH_prolog_gcm_ghash_ssse3_4-$L$SEH_begin_gcm_ghash_ssse3_1 + DB 168 DW 1 - -DB $L$ghash_seh_save_xmm6-$L$ghash_seh_begin -DB 104 + DB $L$SEH_prolog_gcm_ghash_ssse3_3-$L$SEH_begin_gcm_ghash_ssse3_1 + DB 104 DW 0 - -DB $L$ghash_seh_allocstack-$L$ghash_seh_begin -DB 98 + DB $L$SEH_prolog_gcm_ghash_ssse3_2-$L$SEH_begin_gcm_ghash_ssse3_1 + DB 98 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-x86_64-win.asm similarity index 80% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-x86_64-win.asm index 194ea8df89b1..b2323ee62846 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/ghash-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -17,11 +18,12 @@ global gcm_init_clmul ALIGN 16 gcm_init_clmul: +$L$SEH_begin_gcm_init_clmul_1: $L$_init_clmul: -$L$SEH_begin_gcm_init_clmul: - -DB 0x48,0x83,0xec,0x18 -DB 0x0f,0x29,0x34,0x24 + sub rsp,0x18 +$L$SEH_prolog_gcm_init_clmul_2: + movaps XMMWORD[rsp],xmm6 +$L$SEH_prolog_gcm_init_clmul_3: movdqu xmm2,XMMWORD[rdx] pshufd xmm2,xmm2,78 @@ -173,9 +175,9 @@ DB 102,15,58,15,227,8 movdqu XMMWORD[80+rcx],xmm4 movaps xmm6,XMMWORD[rsp] lea rsp,[24+rsp] -$L$SEH_end_gcm_init_clmul: DB 0F3h,0C3h ;repret +$L$SEH_end_gcm_init_clmul_4: global gcm_gmult_clmul @@ -235,21 +237,31 @@ global gcm_ghash_clmul ALIGN 32 gcm_ghash_clmul: +$L$SEH_begin_gcm_ghash_clmul_1: $L$_ghash_clmul: lea rax,[((-136))+rsp] -$L$SEH_begin_gcm_ghash_clmul: - -DB 0x48,0x8d,0x60,0xe0 -DB 0x0f,0x29,0x70,0xe0 -DB 0x0f,0x29,0x78,0xf0 -DB 0x44,0x0f,0x29,0x00 -DB 0x44,0x0f,0x29,0x48,0x10 -DB 0x44,0x0f,0x29,0x50,0x20 -DB 0x44,0x0f,0x29,0x58,0x30 -DB 0x44,0x0f,0x29,0x60,0x40 -DB 0x44,0x0f,0x29,0x68,0x50 -DB 0x44,0x0f,0x29,0x70,0x60 -DB 0x44,0x0f,0x29,0x78,0x70 + lea rsp,[((-32))+rax] +$L$SEH_prolog_gcm_ghash_clmul_2: + movaps XMMWORD[(-32)+rax],xmm6 +$L$SEH_prolog_gcm_ghash_clmul_3: + movaps XMMWORD[(-16)+rax],xmm7 +$L$SEH_prolog_gcm_ghash_clmul_4: + movaps XMMWORD[rax],xmm8 +$L$SEH_prolog_gcm_ghash_clmul_5: + movaps XMMWORD[16+rax],xmm9 +$L$SEH_prolog_gcm_ghash_clmul_6: + movaps XMMWORD[32+rax],xmm10 +$L$SEH_prolog_gcm_ghash_clmul_7: + movaps XMMWORD[48+rax],xmm11 +$L$SEH_prolog_gcm_ghash_clmul_8: + movaps XMMWORD[64+rax],xmm12 +$L$SEH_prolog_gcm_ghash_clmul_9: + movaps XMMWORD[80+rax],xmm13 +$L$SEH_prolog_gcm_ghash_clmul_10: + movaps XMMWORD[96+rax],xmm14 +$L$SEH_prolog_gcm_ghash_clmul_11: + movaps XMMWORD[112+rax],xmm15 +$L$SEH_prolog_gcm_ghash_clmul_12: movdqa xmm10,XMMWORD[$L$bswap_mask] movdqu xmm0,XMMWORD[rcx] @@ -638,19 +650,20 @@ DB 102,65,15,56,0,194 movaps xmm14,XMMWORD[128+rsp] movaps xmm15,XMMWORD[144+rsp] lea rsp,[168+rsp] -$L$SEH_end_gcm_ghash_clmul: DB 0F3h,0C3h ;repret +$L$SEH_end_gcm_ghash_clmul_13: global gcm_init_avx ALIGN 32 gcm_init_avx: -$L$SEH_begin_gcm_init_avx: - -DB 0x48,0x83,0xec,0x18 -DB 0x0f,0x29,0x34,0x24 +$L$SEH_begin_gcm_init_avx_1: + sub rsp,0x18 +$L$SEH_prolog_gcm_init_avx_2: + movaps XMMWORD[rsp],xmm6 +$L$SEH_prolog_gcm_init_avx_3: vzeroupper vmovdqu xmm2,XMMWORD[rdx] @@ -754,8 +767,8 @@ $L$init_start_avx: vzeroupper movaps xmm6,XMMWORD[rsp] lea rsp,[24+rsp] -$L$SEH_end_gcm_init_avx: DB 0F3h,0C3h ;repret +$L$SEH_end_gcm_init_avx_4: global gcm_gmult_avx @@ -771,20 +784,30 @@ global gcm_ghash_avx ALIGN 32 gcm_ghash_avx: +$L$SEH_begin_gcm_ghash_avx_1: lea rax,[((-136))+rsp] -$L$SEH_begin_gcm_ghash_avx: - -DB 0x48,0x8d,0x60,0xe0 -DB 0x0f,0x29,0x70,0xe0 -DB 0x0f,0x29,0x78,0xf0 -DB 0x44,0x0f,0x29,0x00 -DB 0x44,0x0f,0x29,0x48,0x10 -DB 0x44,0x0f,0x29,0x50,0x20 -DB 0x44,0x0f,0x29,0x58,0x30 -DB 0x44,0x0f,0x29,0x60,0x40 -DB 0x44,0x0f,0x29,0x68,0x50 -DB 0x44,0x0f,0x29,0x70,0x60 -DB 0x44,0x0f,0x29,0x78,0x70 + lea rsp,[((-32))+rax] +$L$SEH_prolog_gcm_ghash_avx_2: + movaps XMMWORD[(-32)+rax],xmm6 +$L$SEH_prolog_gcm_ghash_avx_3: + movaps XMMWORD[(-16)+rax],xmm7 +$L$SEH_prolog_gcm_ghash_avx_4: + movaps XMMWORD[rax],xmm8 +$L$SEH_prolog_gcm_ghash_avx_5: + movaps XMMWORD[16+rax],xmm9 +$L$SEH_prolog_gcm_ghash_avx_6: + movaps XMMWORD[32+rax],xmm10 +$L$SEH_prolog_gcm_ghash_avx_7: + movaps XMMWORD[48+rax],xmm11 +$L$SEH_prolog_gcm_ghash_avx_8: + movaps XMMWORD[64+rax],xmm12 +$L$SEH_prolog_gcm_ghash_avx_9: + movaps XMMWORD[80+rax],xmm13 +$L$SEH_prolog_gcm_ghash_avx_10: + movaps XMMWORD[96+rax],xmm14 +$L$SEH_prolog_gcm_ghash_avx_11: + movaps XMMWORD[112+rax],xmm15 +$L$SEH_prolog_gcm_ghash_avx_12: vzeroupper vmovdqu xmm10,XMMWORD[rcx] @@ -1166,56 +1189,148 @@ $L$tail_no_xor_avx: movaps xmm14,XMMWORD[128+rsp] movaps xmm15,XMMWORD[144+rsp] lea rsp,[168+rsp] -$L$SEH_end_gcm_ghash_avx: DB 0F3h,0C3h ;repret +$L$SEH_end_gcm_ghash_avx_13: +section .rdata rdata align=8 ALIGN 64 $L$bswap_mask: -DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 + DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 $L$0x1c2_polynomial: -DB 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 + DB 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 $L$7_mask: DD 7,0,7,0 ALIGN 64 -DB 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52 -DB 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 -DB 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 -DB 114,103,62,0 + DB 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52 + DB 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 + DB 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 + DB 114,103,62,0 ALIGN 64 +section .text + section .pdata rdata align=4 ALIGN 4 - DD $L$SEH_begin_gcm_init_clmul wrt ..imagebase - DD $L$SEH_end_gcm_init_clmul wrt ..imagebase - DD $L$SEH_info_gcm_init_clmul wrt ..imagebase - - DD $L$SEH_begin_gcm_ghash_clmul wrt ..imagebase - DD $L$SEH_end_gcm_ghash_clmul wrt ..imagebase - DD $L$SEH_info_gcm_ghash_clmul wrt ..imagebase - DD $L$SEH_begin_gcm_init_avx wrt ..imagebase - DD $L$SEH_end_gcm_init_avx wrt ..imagebase - DD $L$SEH_info_gcm_init_clmul wrt ..imagebase - - DD $L$SEH_begin_gcm_ghash_avx wrt ..imagebase - DD $L$SEH_end_gcm_ghash_avx wrt ..imagebase - DD $L$SEH_info_gcm_ghash_clmul wrt ..imagebase + DD $L$SEH_begin_gcm_init_clmul_1 wrt ..imagebase + DD $L$SEH_end_gcm_init_clmul_4 wrt ..imagebase + DD $L$SEH_info_gcm_init_clmul_0 wrt ..imagebase + + DD $L$SEH_begin_gcm_ghash_clmul_1 wrt ..imagebase + DD $L$SEH_end_gcm_ghash_clmul_13 wrt ..imagebase + DD $L$SEH_info_gcm_ghash_clmul_0 wrt ..imagebase + + DD $L$SEH_begin_gcm_init_avx_1 wrt ..imagebase + DD $L$SEH_end_gcm_init_avx_4 wrt ..imagebase + DD $L$SEH_info_gcm_init_avx_0 wrt ..imagebase + + DD $L$SEH_begin_gcm_ghash_avx_1 wrt ..imagebase + DD $L$SEH_end_gcm_ghash_avx_13 wrt ..imagebase + DD $L$SEH_info_gcm_ghash_avx_0 wrt ..imagebase + + section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_gcm_init_clmul: -DB 0x01,0x08,0x03,0x00 -DB 0x08,0x68,0x00,0x00 -DB 0x04,0x22,0x00,0x00 -$L$SEH_info_gcm_ghash_clmul: -DB 0x01,0x33,0x16,0x00 -DB 0x33,0xf8,0x09,0x00 -DB 0x2e,0xe8,0x08,0x00 -DB 0x29,0xd8,0x07,0x00 -DB 0x24,0xc8,0x06,0x00 -DB 0x1f,0xb8,0x05,0x00 -DB 0x1a,0xa8,0x04,0x00 -DB 0x15,0x98,0x03,0x00 -DB 0x10,0x88,0x02,0x00 -DB 0x0c,0x78,0x01,0x00 -DB 0x08,0x68,0x00,0x00 -DB 0x04,0x01,0x15,0x00 +ALIGN 4 +$L$SEH_info_gcm_init_clmul_0: + DB 1 + DB $L$SEH_prolog_gcm_init_clmul_3-$L$SEH_begin_gcm_init_clmul_1 + DB 3 + DB 0 + DB $L$SEH_prolog_gcm_init_clmul_3-$L$SEH_begin_gcm_init_clmul_1 + DB 104 + DW 0 + DB $L$SEH_prolog_gcm_init_clmul_2-$L$SEH_begin_gcm_init_clmul_1 + DB 34 + +$L$SEH_info_gcm_ghash_clmul_0: + DB 1 + DB $L$SEH_prolog_gcm_ghash_clmul_12-$L$SEH_begin_gcm_ghash_clmul_1 + DB 22 + DB 0 + DB $L$SEH_prolog_gcm_ghash_clmul_12-$L$SEH_begin_gcm_ghash_clmul_1 + DB 248 + DW 9 + DB $L$SEH_prolog_gcm_ghash_clmul_11-$L$SEH_begin_gcm_ghash_clmul_1 + DB 232 + DW 8 + DB $L$SEH_prolog_gcm_ghash_clmul_10-$L$SEH_begin_gcm_ghash_clmul_1 + DB 216 + DW 7 + DB $L$SEH_prolog_gcm_ghash_clmul_9-$L$SEH_begin_gcm_ghash_clmul_1 + DB 200 + DW 6 + DB $L$SEH_prolog_gcm_ghash_clmul_8-$L$SEH_begin_gcm_ghash_clmul_1 + DB 184 + DW 5 + DB $L$SEH_prolog_gcm_ghash_clmul_7-$L$SEH_begin_gcm_ghash_clmul_1 + DB 168 + DW 4 + DB $L$SEH_prolog_gcm_ghash_clmul_6-$L$SEH_begin_gcm_ghash_clmul_1 + DB 152 + DW 3 + DB $L$SEH_prolog_gcm_ghash_clmul_5-$L$SEH_begin_gcm_ghash_clmul_1 + DB 136 + DW 2 + DB $L$SEH_prolog_gcm_ghash_clmul_4-$L$SEH_begin_gcm_ghash_clmul_1 + DB 120 + DW 1 + DB $L$SEH_prolog_gcm_ghash_clmul_3-$L$SEH_begin_gcm_ghash_clmul_1 + DB 104 + DW 0 + DB $L$SEH_prolog_gcm_ghash_clmul_2-$L$SEH_begin_gcm_ghash_clmul_1 + DB 1 + DW 21 + +$L$SEH_info_gcm_init_avx_0: + DB 1 + DB $L$SEH_prolog_gcm_init_avx_3-$L$SEH_begin_gcm_init_avx_1 + DB 3 + DB 0 + DB $L$SEH_prolog_gcm_init_avx_3-$L$SEH_begin_gcm_init_avx_1 + DB 104 + DW 0 + DB $L$SEH_prolog_gcm_init_avx_2-$L$SEH_begin_gcm_init_avx_1 + DB 34 + +$L$SEH_info_gcm_ghash_avx_0: + DB 1 + DB $L$SEH_prolog_gcm_ghash_avx_12-$L$SEH_begin_gcm_ghash_avx_1 + DB 22 + DB 0 + DB $L$SEH_prolog_gcm_ghash_avx_12-$L$SEH_begin_gcm_ghash_avx_1 + DB 248 + DW 9 + DB $L$SEH_prolog_gcm_ghash_avx_11-$L$SEH_begin_gcm_ghash_avx_1 + DB 232 + DW 8 + DB $L$SEH_prolog_gcm_ghash_avx_10-$L$SEH_begin_gcm_ghash_avx_1 + DB 216 + DW 7 + DB $L$SEH_prolog_gcm_ghash_avx_9-$L$SEH_begin_gcm_ghash_avx_1 + DB 200 + DW 6 + DB $L$SEH_prolog_gcm_ghash_avx_8-$L$SEH_begin_gcm_ghash_avx_1 + DB 184 + DW 5 + DB $L$SEH_prolog_gcm_ghash_avx_7-$L$SEH_begin_gcm_ghash_avx_1 + DB 168 + DW 4 + DB $L$SEH_prolog_gcm_ghash_avx_6-$L$SEH_begin_gcm_ghash_avx_1 + DB 152 + DW 3 + DB $L$SEH_prolog_gcm_ghash_avx_5-$L$SEH_begin_gcm_ghash_avx_1 + DB 136 + DW 2 + DB $L$SEH_prolog_gcm_ghash_avx_4-$L$SEH_begin_gcm_ghash_avx_1 + DB 120 + DW 1 + DB $L$SEH_prolog_gcm_ghash_avx_3-$L$SEH_begin_gcm_ghash_avx_1 + DB 104 + DW 0 + DB $L$SEH_prolog_gcm_ghash_avx_2-$L$SEH_begin_gcm_ghash_avx_1 + DB 1 + DW 21 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/md5-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/md5-x86_64-win.asm similarity index 99% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/md5-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/md5-x86_64-win.asm index 646201bb5881..003a589eb2db 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/md5-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/md5-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -792,5 +793,9 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_md5_block_asm_data_order: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/p256-x86_64-asm.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/p256-x86_64-asm-win.asm similarity index 97% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/p256-x86_64-asm.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/p256-x86_64-asm-win.asm index 215f5d2a4943..73f536ea35f8 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/p256-x86_64-asm.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/p256-x86_64-asm-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -14,6 +15,7 @@ section .text code align=64 EXTERN OPENSSL_ia32cap_P +section .rdata rdata align=8 ALIGN 64 $L$poly: DQ 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 @@ -32,6 +34,8 @@ $L$ord: DQ 0xf3b9cac2fc632551,0xbce6faada7179e84,0xffffffffffffffff,0xffffffff00000000 $L$ordK: DQ 0xccd1c8aaee00bc4f +section .text + @@ -1072,7 +1076,7 @@ DB 102,72,15,126,210 adox r10,rcx adcx r14,r14 mulx rbp,rcx,rdx -DB 0x67 + DB 0x67 DB 102,72,15,126,218 adox r11,rax adcx r15,r15 @@ -1962,7 +1966,7 @@ __ecp_nistz256_sqr_montx: adcx r13,r13 adox r10,rcx adcx r14,r14 -DB 0x67 + DB 0x67 mulx rbp,rcx,rdx mov rdx,QWORD[((24+128))+rsi] adox r11,rax @@ -1970,7 +1974,7 @@ DB 0x67 adox r12,rcx mov rsi,32 adox r13,rbp -DB 0x67,0x67 + DB 0x67,0x67 mulx rax,rcx,rdx mov rdx,QWORD[(($L$poly+24))] adox r14,rcx @@ -2060,17 +2064,17 @@ ecp_nistz256_select_w5: jnz NEAR $L$avx2_select_w5 lea rax,[((-136))+rsp] $L$SEH_begin_ecp_nistz256_select_w5: -DB 0x48,0x8d,0x60,0xe0 -DB 0x0f,0x29,0x70,0xe0 -DB 0x0f,0x29,0x78,0xf0 -DB 0x44,0x0f,0x29,0x00 -DB 0x44,0x0f,0x29,0x48,0x10 -DB 0x44,0x0f,0x29,0x50,0x20 -DB 0x44,0x0f,0x29,0x58,0x30 -DB 0x44,0x0f,0x29,0x60,0x40 -DB 0x44,0x0f,0x29,0x68,0x50 -DB 0x44,0x0f,0x29,0x70,0x60 -DB 0x44,0x0f,0x29,0x78,0x70 + DB 0x48,0x8d,0x60,0xe0 + DB 0x0f,0x29,0x70,0xe0 + DB 0x0f,0x29,0x78,0xf0 + DB 0x44,0x0f,0x29,0x00 + DB 0x44,0x0f,0x29,0x48,0x10 + DB 0x44,0x0f,0x29,0x50,0x20 + DB 0x44,0x0f,0x29,0x58,0x30 + DB 0x44,0x0f,0x29,0x60,0x40 + DB 0x44,0x0f,0x29,0x68,0x50 + DB 0x44,0x0f,0x29,0x70,0x60 + DB 0x44,0x0f,0x29,0x78,0x70 movdqa xmm0,XMMWORD[$L$One] movd xmm1,r8d @@ -2150,17 +2154,17 @@ ecp_nistz256_select_w7: jnz NEAR $L$avx2_select_w7 lea rax,[((-136))+rsp] $L$SEH_begin_ecp_nistz256_select_w7: -DB 0x48,0x8d,0x60,0xe0 -DB 0x0f,0x29,0x70,0xe0 -DB 0x0f,0x29,0x78,0xf0 -DB 0x44,0x0f,0x29,0x00 -DB 0x44,0x0f,0x29,0x48,0x10 -DB 0x44,0x0f,0x29,0x50,0x20 -DB 0x44,0x0f,0x29,0x58,0x30 -DB 0x44,0x0f,0x29,0x60,0x40 -DB 0x44,0x0f,0x29,0x68,0x50 -DB 0x44,0x0f,0x29,0x70,0x60 -DB 0x44,0x0f,0x29,0x78,0x70 + DB 0x48,0x8d,0x60,0xe0 + DB 0x0f,0x29,0x70,0xe0 + DB 0x0f,0x29,0x78,0xf0 + DB 0x44,0x0f,0x29,0x00 + DB 0x44,0x0f,0x29,0x48,0x10 + DB 0x44,0x0f,0x29,0x50,0x20 + DB 0x44,0x0f,0x29,0x58,0x30 + DB 0x44,0x0f,0x29,0x60,0x40 + DB 0x44,0x0f,0x29,0x68,0x50 + DB 0x44,0x0f,0x29,0x70,0x60 + DB 0x44,0x0f,0x29,0x78,0x70 movdqa xmm8,XMMWORD[$L$One] movd xmm1,r8d @@ -2226,17 +2230,17 @@ $L$avx2_select_w5: lea rax,[((-136))+rsp] mov r11,rsp $L$SEH_begin_ecp_nistz256_avx2_select_w5: -DB 0x48,0x8d,0x60,0xe0 -DB 0xc5,0xf8,0x29,0x70,0xe0 -DB 0xc5,0xf8,0x29,0x78,0xf0 -DB 0xc5,0x78,0x29,0x40,0x00 -DB 0xc5,0x78,0x29,0x48,0x10 -DB 0xc5,0x78,0x29,0x50,0x20 -DB 0xc5,0x78,0x29,0x58,0x30 -DB 0xc5,0x78,0x29,0x60,0x40 -DB 0xc5,0x78,0x29,0x68,0x50 -DB 0xc5,0x78,0x29,0x70,0x60 -DB 0xc5,0x78,0x29,0x78,0x70 + DB 0x48,0x8d,0x60,0xe0 + DB 0xc5,0xf8,0x29,0x70,0xe0 + DB 0xc5,0xf8,0x29,0x78,0xf0 + DB 0xc5,0x78,0x29,0x40,0x00 + DB 0xc5,0x78,0x29,0x48,0x10 + DB 0xc5,0x78,0x29,0x50,0x20 + DB 0xc5,0x78,0x29,0x58,0x30 + DB 0xc5,0x78,0x29,0x60,0x40 + DB 0xc5,0x78,0x29,0x68,0x50 + DB 0xc5,0x78,0x29,0x70,0x60 + DB 0xc5,0x78,0x29,0x78,0x70 vmovdqa ymm0,YMMWORD[$L$Two] vpxor ymm2,ymm2,ymm2 @@ -2316,17 +2320,17 @@ $L$avx2_select_w7: mov r11,rsp lea rax,[((-136))+rsp] $L$SEH_begin_ecp_nistz256_avx2_select_w7: -DB 0x48,0x8d,0x60,0xe0 -DB 0xc5,0xf8,0x29,0x70,0xe0 -DB 0xc5,0xf8,0x29,0x78,0xf0 -DB 0xc5,0x78,0x29,0x40,0x00 -DB 0xc5,0x78,0x29,0x48,0x10 -DB 0xc5,0x78,0x29,0x50,0x20 -DB 0xc5,0x78,0x29,0x58,0x30 -DB 0xc5,0x78,0x29,0x60,0x40 -DB 0xc5,0x78,0x29,0x68,0x50 -DB 0xc5,0x78,0x29,0x70,0x60 -DB 0xc5,0x78,0x29,0x78,0x70 + DB 0x48,0x8d,0x60,0xe0 + DB 0xc5,0xf8,0x29,0x70,0xe0 + DB 0xc5,0xf8,0x29,0x78,0xf0 + DB 0xc5,0x78,0x29,0x40,0x00 + DB 0xc5,0x78,0x29,0x48,0x10 + DB 0xc5,0x78,0x29,0x50,0x20 + DB 0xc5,0x78,0x29,0x58,0x30 + DB 0xc5,0x78,0x29,0x60,0x40 + DB 0xc5,0x78,0x29,0x68,0x50 + DB 0xc5,0x78,0x29,0x70,0x60 + DB 0xc5,0x78,0x29,0x78,0x70 vmovdqa ymm0,YMMWORD[$L$Three] vpxor ymm2,ymm2,ymm2 @@ -2956,7 +2960,7 @@ DB 102,73,15,110,220 DB 102,73,15,126,208 DB 102,73,15,126,217 or r12,r8 -DB 0x3e + DB 0x3e jnz NEAR $L$add_proceedq @@ -4097,7 +4101,7 @@ DB 102,73,15,110,220 DB 102,73,15,126,208 DB 102,73,15,126,217 or r12,r8 -DB 0x3e + DB 0x3e jnz NEAR $L$add_proceedx @@ -4889,96 +4893,100 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_ecp_nistz256_neg: -DB 9,0,0,0 + DB 9,0,0,0 DD short_handler wrt ..imagebase DD $L$neg_body wrt ..imagebase,$L$neg_epilogue wrt ..imagebase $L$SEH_info_ecp_nistz256_ord_mul_mont: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$ord_mul_body wrt ..imagebase,$L$ord_mul_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_ecp_nistz256_ord_sqr_mont: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$ord_sqr_body wrt ..imagebase,$L$ord_sqr_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_ecp_nistz256_ord_mul_montx: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$ord_mulx_body wrt ..imagebase,$L$ord_mulx_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_ecp_nistz256_ord_sqr_montx: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$ord_sqrx_body wrt ..imagebase,$L$ord_sqrx_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_ecp_nistz256_mul_mont: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_ecp_nistz256_sqr_mont: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$sqr_body wrt ..imagebase,$L$sqr_epilogue wrt ..imagebase DD 48,0 $L$SEH_info_ecp_nistz256_select_wX: -DB 0x01,0x33,0x16,0x00 -DB 0x33,0xf8,0x09,0x00 -DB 0x2e,0xe8,0x08,0x00 -DB 0x29,0xd8,0x07,0x00 -DB 0x24,0xc8,0x06,0x00 -DB 0x1f,0xb8,0x05,0x00 -DB 0x1a,0xa8,0x04,0x00 -DB 0x15,0x98,0x03,0x00 -DB 0x10,0x88,0x02,0x00 -DB 0x0c,0x78,0x01,0x00 -DB 0x08,0x68,0x00,0x00 -DB 0x04,0x01,0x15,0x00 + DB 0x01,0x33,0x16,0x00 + DB 0x33,0xf8,0x09,0x00 + DB 0x2e,0xe8,0x08,0x00 + DB 0x29,0xd8,0x07,0x00 + DB 0x24,0xc8,0x06,0x00 + DB 0x1f,0xb8,0x05,0x00 + DB 0x1a,0xa8,0x04,0x00 + DB 0x15,0x98,0x03,0x00 + DB 0x10,0x88,0x02,0x00 + DB 0x0c,0x78,0x01,0x00 + DB 0x08,0x68,0x00,0x00 + DB 0x04,0x01,0x15,0x00 ALIGN 8 $L$SEH_info_ecp_nistz256_avx2_select_wX: -DB 0x01,0x36,0x17,0x0b -DB 0x36,0xf8,0x09,0x00 -DB 0x31,0xe8,0x08,0x00 -DB 0x2c,0xd8,0x07,0x00 -DB 0x27,0xc8,0x06,0x00 -DB 0x22,0xb8,0x05,0x00 -DB 0x1d,0xa8,0x04,0x00 -DB 0x18,0x98,0x03,0x00 -DB 0x13,0x88,0x02,0x00 -DB 0x0e,0x78,0x01,0x00 -DB 0x09,0x68,0x00,0x00 -DB 0x04,0x01,0x15,0x00 -DB 0x00,0xb3,0x00,0x00 + DB 0x01,0x36,0x17,0x0b + DB 0x36,0xf8,0x09,0x00 + DB 0x31,0xe8,0x08,0x00 + DB 0x2c,0xd8,0x07,0x00 + DB 0x27,0xc8,0x06,0x00 + DB 0x22,0xb8,0x05,0x00 + DB 0x1d,0xa8,0x04,0x00 + DB 0x18,0x98,0x03,0x00 + DB 0x13,0x88,0x02,0x00 + DB 0x0e,0x78,0x01,0x00 + DB 0x09,0x68,0x00,0x00 + DB 0x04,0x01,0x15,0x00 + DB 0x00,0xb3,0x00,0x00 ALIGN 8 $L$SEH_info_ecp_nistz256_point_double: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$point_doubleq_body wrt ..imagebase,$L$point_doubleq_epilogue wrt ..imagebase DD 32*5+56,0 $L$SEH_info_ecp_nistz256_point_add: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$point_addq_body wrt ..imagebase,$L$point_addq_epilogue wrt ..imagebase DD 32*18+56,0 $L$SEH_info_ecp_nistz256_point_add_affine: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$add_affineq_body wrt ..imagebase,$L$add_affineq_epilogue wrt ..imagebase DD 32*15+56,0 ALIGN 8 $L$SEH_info_ecp_nistz256_point_doublex: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$point_doublex_body wrt ..imagebase,$L$point_doublex_epilogue wrt ..imagebase DD 32*5+56,0 $L$SEH_info_ecp_nistz256_point_addx: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$point_addx_body wrt ..imagebase,$L$point_addx_epilogue wrt ..imagebase DD 32*18+56,0 $L$SEH_info_ecp_nistz256_point_add_affinex: -DB 9,0,0,0 + DB 9,0,0,0 DD full_handler wrt ..imagebase DD $L$add_affinex_body wrt ..imagebase,$L$add_affinex_epilogue wrt ..imagebase DD 32*15+56,0 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-win.asm similarity index 97% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-win.asm index 563699d59dc6..0488afd830e8 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -337,3 +338,7 @@ $L$beeu_finish: $L$SEH_end_beeu_mod_inverse_vartime: +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/rdrand-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/rdrand-x86_64-win.asm similarity index 86% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/rdrand-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/rdrand-x86_64-win.asm index 89b91de10d1d..2b2e0aab111b 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/rdrand-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/rdrand-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -56,3 +57,7 @@ $L$err: DB 0F3h,0C3h ;repret +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/rsaz-avx2.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/rsaz-avx2-win.asm similarity index 97% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/rsaz-avx2.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/rsaz-avx2-win.asm index 74e2705cb96d..fd41206e65cb 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/rsaz-avx2.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/rsaz-avx2-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -381,9 +382,9 @@ $L$OOP_REDUCE_1024: imul rax,QWORD[((8-128))+r13] vpaddq ymm2,ymm2,ymm14 vpmuludq ymm11,ymm12,YMMWORD[((96-128))+r13] -DB 0x67 + DB 0x67 add r11,rax -DB 0x67 + DB 0x67 mov rax,rdx imul rax,QWORD[((16-128))+r13] shr r10,29 @@ -427,12 +428,12 @@ DB 0x67 vpaddq ymm3,ymm3,ymm14 vpmuludq ymm11,ymm11,ymm13 vmovdqu ymm14,YMMWORD[((192-8-128))+r13] -DB 0x67 + DB 0x67 mov r12,rax imul eax,ecx vpaddq ymm4,ymm4,ymm11 vpmuludq ymm10,ymm10,ymm13 -DB 0xc4,0x41,0x7e,0x6f,0x9d,0x58,0x00,0x00,0x00 + DB 0xc4,0x41,0x7e,0x6f,0x9d,0x58,0x00,0x00,0x00 and eax,0x1fffffff vpaddq ymm5,ymm5,ymm10 vpmuludq ymm14,ymm14,ymm13 @@ -457,12 +458,12 @@ DB 0xc4,0x41,0x7e,0x6f,0x9d,0x58,0x00,0x00,0x00 vpaddq ymm1,ymm1,ymm14 vpmuludq ymm13,ymm13,ymm0 vpmuludq ymm11,ymm11,ymm12 -DB 0xc4,0x41,0x7e,0x6f,0xb5,0xf0,0xff,0xff,0xff + DB 0xc4,0x41,0x7e,0x6f,0xb5,0xf0,0xff,0xff,0xff vpaddq ymm13,ymm13,ymm1 vpaddq ymm2,ymm2,ymm11 vpmuludq ymm10,ymm10,ymm12 vmovdqu ymm11,YMMWORD[((160-16-128))+r13] -DB 0x67 + DB 0x67 vmovq rax,xmm13 vmovdqu YMMWORD[rsp],ymm13 vpaddq ymm3,ymm3,ymm10 @@ -489,7 +490,7 @@ DB 0x67 and eax,0x1fffffff vmovd xmm12,eax vmovdqu ymm11,YMMWORD[((96-24-128))+r13] -DB 0x67 + DB 0x67 vpaddq ymm9,ymm9,ymm10 vpbroadcastq ymm12,xmm12 @@ -504,7 +505,7 @@ DB 0x67 add r9,rax mov rax,rdx imul rax,QWORD[((8-128))+r13] -DB 0x67 + DB 0x67 shr r9,29 mov r11,QWORD[16+rsp] vpaddq ymm2,ymm3,ymm11 @@ -755,7 +756,7 @@ $L$mul_1024_body: -DB 0x67,0x67 + DB 0x67,0x67 mov r15,rsi and r15,4095 add r15,32*10 @@ -771,7 +772,7 @@ DB 0x67,0x67 and r15,4095 add r15,32*10 -DB 0x67,0x67 + DB 0x67,0x67 shr r15,12 jz NEAR $L$mul_1024_no_n_copy @@ -817,7 +818,7 @@ $L$mul_1024_no_n_copy: vpbroadcastq ymm10,QWORD[r13] vmovdqu YMMWORD[rsp],ymm0 xor r9,r9 -DB 0x67 + DB 0x67 xor r10,r10 xor r11,r11 xor r12,r12 @@ -1689,17 +1690,17 @@ rsaz_1024_gather5_avx2: lea rax,[((-136))+rsp] $L$SEH_begin_rsaz_1024_gather5: -DB 0x48,0x8d,0x60,0xe0 -DB 0xc5,0xf8,0x29,0x70,0xe0 -DB 0xc5,0xf8,0x29,0x78,0xf0 -DB 0xc5,0x78,0x29,0x40,0x00 -DB 0xc5,0x78,0x29,0x48,0x10 -DB 0xc5,0x78,0x29,0x50,0x20 -DB 0xc5,0x78,0x29,0x58,0x30 -DB 0xc5,0x78,0x29,0x60,0x40 -DB 0xc5,0x78,0x29,0x68,0x50 -DB 0xc5,0x78,0x29,0x70,0x60 -DB 0xc5,0x78,0x29,0x78,0x70 + DB 0x48,0x8d,0x60,0xe0 + DB 0xc5,0xf8,0x29,0x70,0xe0 + DB 0xc5,0xf8,0x29,0x78,0xf0 + DB 0xc5,0x78,0x29,0x40,0x00 + DB 0xc5,0x78,0x29,0x48,0x10 + DB 0xc5,0x78,0x29,0x50,0x20 + DB 0xc5,0x78,0x29,0x58,0x30 + DB 0xc5,0x78,0x29,0x60,0x40 + DB 0xc5,0x78,0x29,0x68,0x50 + DB 0xc5,0x78,0x29,0x70,0x60 + DB 0xc5,0x78,0x29,0x78,0x70 lea rsp,[((-256))+rsp] and rsp,-32 lea r10,[$L$inc] @@ -1823,6 +1824,7 @@ $L$oop_gather_1024: $L$SEH_end_rsaz_1024_gather5: +section .rdata rdata align=8 ALIGN 64 $L$and_mask: DQ 0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff @@ -1835,6 +1837,8 @@ $L$inc: DD 2,2,2,2,3,3,3,3 DD 4,4,4,4,4,4,4,4 ALIGN 64 +section .text + EXTERN __imp_RtlVirtualUnwind ALIGN 16 @@ -1947,26 +1951,30 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_rsaz_1024_sqr_avx2: -DB 9,0,0,0 + DB 9,0,0,0 DD rsaz_se_handler wrt ..imagebase DD $L$sqr_1024_body wrt ..imagebase,$L$sqr_1024_epilogue wrt ..imagebase,$L$sqr_1024_in_tail wrt ..imagebase DD 0 $L$SEH_info_rsaz_1024_mul_avx2: -DB 9,0,0,0 + DB 9,0,0,0 DD rsaz_se_handler wrt ..imagebase DD $L$mul_1024_body wrt ..imagebase,$L$mul_1024_epilogue wrt ..imagebase,$L$mul_1024_in_tail wrt ..imagebase DD 0 $L$SEH_info_rsaz_1024_gather5: -DB 0x01,0x36,0x17,0x0b -DB 0x36,0xf8,0x09,0x00 -DB 0x31,0xe8,0x08,0x00 -DB 0x2c,0xd8,0x07,0x00 -DB 0x27,0xc8,0x06,0x00 -DB 0x22,0xb8,0x05,0x00 -DB 0x1d,0xa8,0x04,0x00 -DB 0x18,0x98,0x03,0x00 -DB 0x13,0x88,0x02,0x00 -DB 0x0e,0x78,0x01,0x00 -DB 0x09,0x68,0x00,0x00 -DB 0x04,0x01,0x15,0x00 -DB 0x00,0xb3,0x00,0x00 + DB 0x01,0x36,0x17,0x0b + DB 0x36,0xf8,0x09,0x00 + DB 0x31,0xe8,0x08,0x00 + DB 0x2c,0xd8,0x07,0x00 + DB 0x27,0xc8,0x06,0x00 + DB 0x22,0xb8,0x05,0x00 + DB 0x1d,0xa8,0x04,0x00 + DB 0x18,0x98,0x03,0x00 + DB 0x13,0x88,0x02,0x00 + DB 0x0e,0x78,0x01,0x00 + DB 0x09,0x68,0x00,0x00 + DB 0x04,0x01,0x15,0x00 + DB 0x00,0xb3,0x00,0x00 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha1-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha1-x86_64-win.asm similarity index 98% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/sha1-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/sha1-x86_64-win.asm index 1654df1d3696..c842eee83c05 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha1-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha1-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -1322,133 +1323,134 @@ $L$oop_shaext: lea r8,[64+rsi] paddd xmm1,xmm4 cmovne rsi,r8 + prefetcht0 [512+rsi] movdqa xmm8,xmm0 -DB 15,56,201,229 + DB 15,56,201,229 movdqa xmm2,xmm0 -DB 15,58,204,193,0 -DB 15,56,200,213 + DB 15,58,204,193,0 + DB 15,56,200,213 pxor xmm4,xmm6 -DB 15,56,201,238 -DB 15,56,202,231 + DB 15,56,201,238 + DB 15,56,202,231 movdqa xmm1,xmm0 -DB 15,58,204,194,0 -DB 15,56,200,206 + DB 15,58,204,194,0 + DB 15,56,200,206 pxor xmm5,xmm7 -DB 15,56,202,236 -DB 15,56,201,247 + DB 15,56,202,236 + DB 15,56,201,247 movdqa xmm2,xmm0 -DB 15,58,204,193,0 -DB 15,56,200,215 + DB 15,58,204,193,0 + DB 15,56,200,215 pxor xmm6,xmm4 -DB 15,56,201,252 -DB 15,56,202,245 + DB 15,56,201,252 + DB 15,56,202,245 movdqa xmm1,xmm0 -DB 15,58,204,194,0 -DB 15,56,200,204 + DB 15,58,204,194,0 + DB 15,56,200,204 pxor xmm7,xmm5 -DB 15,56,202,254 -DB 15,56,201,229 + DB 15,56,202,254 + DB 15,56,201,229 movdqa xmm2,xmm0 -DB 15,58,204,193,0 -DB 15,56,200,213 + DB 15,58,204,193,0 + DB 15,56,200,213 pxor xmm4,xmm6 -DB 15,56,201,238 -DB 15,56,202,231 + DB 15,56,201,238 + DB 15,56,202,231 movdqa xmm1,xmm0 -DB 15,58,204,194,1 -DB 15,56,200,206 + DB 15,58,204,194,1 + DB 15,56,200,206 pxor xmm5,xmm7 -DB 15,56,202,236 -DB 15,56,201,247 + DB 15,56,202,236 + DB 15,56,201,247 movdqa xmm2,xmm0 -DB 15,58,204,193,1 -DB 15,56,200,215 + DB 15,58,204,193,1 + DB 15,56,200,215 pxor xmm6,xmm4 -DB 15,56,201,252 -DB 15,56,202,245 + DB 15,56,201,252 + DB 15,56,202,245 movdqa xmm1,xmm0 -DB 15,58,204,194,1 -DB 15,56,200,204 + DB 15,58,204,194,1 + DB 15,56,200,204 pxor xmm7,xmm5 -DB 15,56,202,254 -DB 15,56,201,229 + DB 15,56,202,254 + DB 15,56,201,229 movdqa xmm2,xmm0 -DB 15,58,204,193,1 -DB 15,56,200,213 + DB 15,58,204,193,1 + DB 15,56,200,213 pxor xmm4,xmm6 -DB 15,56,201,238 -DB 15,56,202,231 + DB 15,56,201,238 + DB 15,56,202,231 movdqa xmm1,xmm0 -DB 15,58,204,194,1 -DB 15,56,200,206 + DB 15,58,204,194,1 + DB 15,56,200,206 pxor xmm5,xmm7 -DB 15,56,202,236 -DB 15,56,201,247 + DB 15,56,202,236 + DB 15,56,201,247 movdqa xmm2,xmm0 -DB 15,58,204,193,2 -DB 15,56,200,215 + DB 15,58,204,193,2 + DB 15,56,200,215 pxor xmm6,xmm4 -DB 15,56,201,252 -DB 15,56,202,245 + DB 15,56,201,252 + DB 15,56,202,245 movdqa xmm1,xmm0 -DB 15,58,204,194,2 -DB 15,56,200,204 + DB 15,58,204,194,2 + DB 15,56,200,204 pxor xmm7,xmm5 -DB 15,56,202,254 -DB 15,56,201,229 + DB 15,56,202,254 + DB 15,56,201,229 movdqa xmm2,xmm0 -DB 15,58,204,193,2 -DB 15,56,200,213 + DB 15,58,204,193,2 + DB 15,56,200,213 pxor xmm4,xmm6 -DB 15,56,201,238 -DB 15,56,202,231 + DB 15,56,201,238 + DB 15,56,202,231 movdqa xmm1,xmm0 -DB 15,58,204,194,2 -DB 15,56,200,206 + DB 15,58,204,194,2 + DB 15,56,200,206 pxor xmm5,xmm7 -DB 15,56,202,236 -DB 15,56,201,247 + DB 15,56,202,236 + DB 15,56,201,247 movdqa xmm2,xmm0 -DB 15,58,204,193,2 -DB 15,56,200,215 + DB 15,58,204,193,2 + DB 15,56,200,215 pxor xmm6,xmm4 -DB 15,56,201,252 -DB 15,56,202,245 + DB 15,56,201,252 + DB 15,56,202,245 movdqa xmm1,xmm0 -DB 15,58,204,194,3 -DB 15,56,200,204 + DB 15,58,204,194,3 + DB 15,56,200,204 pxor xmm7,xmm5 -DB 15,56,202,254 + DB 15,56,202,254 movdqu xmm4,XMMWORD[rsi] movdqa xmm2,xmm0 -DB 15,58,204,193,3 -DB 15,56,200,213 + DB 15,58,204,193,3 + DB 15,56,200,213 movdqu xmm5,XMMWORD[16+rsi] DB 102,15,56,0,227 movdqa xmm1,xmm0 -DB 15,58,204,194,3 -DB 15,56,200,206 + DB 15,58,204,194,3 + DB 15,56,200,206 movdqu xmm6,XMMWORD[32+rsi] DB 102,15,56,0,235 movdqa xmm2,xmm0 -DB 15,58,204,193,3 -DB 15,56,200,215 + DB 15,58,204,193,3 + DB 15,56,200,215 movdqu xmm7,XMMWORD[48+rsi] DB 102,15,56,0,243 movdqa xmm1,xmm0 -DB 15,58,204,194,3 -DB 65,15,56,200,201 + DB 15,58,204,194,3 + DB 65,15,56,200,201 DB 102,15,56,0,251 paddd xmm0,xmm8 @@ -5553,6 +5555,7 @@ $L$epilogue_avx2: DB 0F3h,0C3h ;repret $L$SEH_end_sha1_block_data_order_avx2: +section .rdata rdata align=8 ALIGN 64 K_XX_XX: DD 0x5a827999,0x5a827999,0x5a827999,0x5a827999 @@ -5565,13 +5568,15 @@ K_XX_XX: DD 0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6 DD 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f DD 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f -DB 0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0 -DB 83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115 -DB 102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44 -DB 32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60 -DB 97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114 -DB 103,62,0 + DB 0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0 + DB 83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115 + DB 102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44 + DB 32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60 + DB 97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114 + DB 103,62,0 ALIGN 64 +section .text + EXTERN __imp_RtlVirtualUnwind ALIGN 16 @@ -5755,20 +5760,24 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_sha1_block_data_order: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase $L$SEH_info_sha1_block_data_order_shaext: -DB 9,0,0,0 + DB 9,0,0,0 DD shaext_handler wrt ..imagebase $L$SEH_info_sha1_block_data_order_ssse3: -DB 9,0,0,0 + DB 9,0,0,0 DD ssse3_handler wrt ..imagebase DD $L$prologue_ssse3 wrt ..imagebase,$L$epilogue_ssse3 wrt ..imagebase $L$SEH_info_sha1_block_data_order_avx: -DB 9,0,0,0 + DB 9,0,0,0 DD ssse3_handler wrt ..imagebase DD $L$prologue_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase $L$SEH_info_sha1_block_data_order_avx2: -DB 9,0,0,0 + DB 9,0,0,0 DD ssse3_handler wrt ..imagebase DD $L$prologue_avx2 wrt ..imagebase,$L$epilogue_avx2 wrt ..imagebase +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha256-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha256-x86_64-win.asm similarity index 97% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/sha256-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/sha256-x86_64-win.asm index 49be6f6b81e6..d1a6a902544e 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha256-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha256-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -1748,6 +1749,7 @@ $L$epilogue: DB 0F3h,0C3h ;repret $L$SEH_end_sha256_block_data_order: +section .rdata rdata align=8 ALIGN 64 K256: @@ -1790,11 +1792,13 @@ K256: DD 0x03020100,0x0b0a0908,0xffffffff,0xffffffff DD 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 DD 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 -DB 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97 -DB 110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54 -DB 52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 -DB 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 -DB 111,114,103,62,0 + DB 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97 + DB 110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54 + DB 52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 + DB 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 + DB 111,114,103,62,0 +section .text + ALIGN 64 sha256_block_data_order_shaext: @@ -1841,169 +1845,169 @@ DB 102,15,56,0,223 paddd xmm0,xmm3 DB 102,15,56,0,231 movdqa xmm10,xmm2 -DB 15,56,203,209 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e nop movdqa xmm9,xmm1 -DB 15,56,203,202 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((32-128))+rcx] paddd xmm0,xmm4 DB 102,15,56,0,239 -DB 15,56,203,209 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e lea rsi,[64+rsi] -DB 15,56,204,220 -DB 15,56,203,202 + DB 15,56,204,220 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((64-128))+rcx] paddd xmm0,xmm5 DB 102,15,56,0,247 -DB 15,56,203,209 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm6 DB 102,15,58,15,253,4 nop paddd xmm3,xmm7 -DB 15,56,204,229 -DB 15,56,203,202 + DB 15,56,204,229 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((96-128))+rcx] paddd xmm0,xmm6 -DB 15,56,205,222 -DB 15,56,203,209 + DB 15,56,205,222 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm3 DB 102,15,58,15,254,4 nop paddd xmm4,xmm7 -DB 15,56,204,238 -DB 15,56,203,202 + DB 15,56,204,238 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((128-128))+rcx] paddd xmm0,xmm3 -DB 15,56,205,227 -DB 15,56,203,209 + DB 15,56,205,227 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm4 DB 102,15,58,15,251,4 nop paddd xmm5,xmm7 -DB 15,56,204,243 -DB 15,56,203,202 + DB 15,56,204,243 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((160-128))+rcx] paddd xmm0,xmm4 -DB 15,56,205,236 -DB 15,56,203,209 + DB 15,56,205,236 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm5 DB 102,15,58,15,252,4 nop paddd xmm6,xmm7 -DB 15,56,204,220 -DB 15,56,203,202 + DB 15,56,204,220 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((192-128))+rcx] paddd xmm0,xmm5 -DB 15,56,205,245 -DB 15,56,203,209 + DB 15,56,205,245 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm6 DB 102,15,58,15,253,4 nop paddd xmm3,xmm7 -DB 15,56,204,229 -DB 15,56,203,202 + DB 15,56,204,229 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((224-128))+rcx] paddd xmm0,xmm6 -DB 15,56,205,222 -DB 15,56,203,209 + DB 15,56,205,222 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm3 DB 102,15,58,15,254,4 nop paddd xmm4,xmm7 -DB 15,56,204,238 -DB 15,56,203,202 + DB 15,56,204,238 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((256-128))+rcx] paddd xmm0,xmm3 -DB 15,56,205,227 -DB 15,56,203,209 + DB 15,56,205,227 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm4 DB 102,15,58,15,251,4 nop paddd xmm5,xmm7 -DB 15,56,204,243 -DB 15,56,203,202 + DB 15,56,204,243 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((288-128))+rcx] paddd xmm0,xmm4 -DB 15,56,205,236 -DB 15,56,203,209 + DB 15,56,205,236 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm5 DB 102,15,58,15,252,4 nop paddd xmm6,xmm7 -DB 15,56,204,220 -DB 15,56,203,202 + DB 15,56,204,220 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((320-128))+rcx] paddd xmm0,xmm5 -DB 15,56,205,245 -DB 15,56,203,209 + DB 15,56,205,245 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm6 DB 102,15,58,15,253,4 nop paddd xmm3,xmm7 -DB 15,56,204,229 -DB 15,56,203,202 + DB 15,56,204,229 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((352-128))+rcx] paddd xmm0,xmm6 -DB 15,56,205,222 -DB 15,56,203,209 + DB 15,56,205,222 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm3 DB 102,15,58,15,254,4 nop paddd xmm4,xmm7 -DB 15,56,204,238 -DB 15,56,203,202 + DB 15,56,204,238 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((384-128))+rcx] paddd xmm0,xmm3 -DB 15,56,205,227 -DB 15,56,203,209 + DB 15,56,205,227 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm4 DB 102,15,58,15,251,4 nop paddd xmm5,xmm7 -DB 15,56,204,243 -DB 15,56,203,202 + DB 15,56,204,243 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((416-128))+rcx] paddd xmm0,xmm4 -DB 15,56,205,236 -DB 15,56,203,209 + DB 15,56,205,236 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e movdqa xmm7,xmm5 DB 102,15,58,15,252,4 -DB 15,56,203,202 + DB 15,56,203,202 paddd xmm6,xmm7 movdqa xmm0,XMMWORD[((448-128))+rcx] paddd xmm0,xmm5 -DB 15,56,203,209 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e -DB 15,56,205,245 + DB 15,56,205,245 movdqa xmm7,xmm8 -DB 15,56,203,202 + DB 15,56,203,202 movdqa xmm0,XMMWORD[((480-128))+rcx] paddd xmm0,xmm6 nop -DB 15,56,203,209 + DB 15,56,203,209 pshufd xmm0,xmm0,0x0e dec rdx nop -DB 15,56,203,202 + DB 15,56,203,202 paddd xmm2,xmm10 paddd xmm1,xmm9 @@ -4400,17 +4404,21 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_sha256_block_data_order: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue wrt ..imagebase,$L$epilogue wrt ..imagebase $L$SEH_info_sha256_block_data_order_shaext: -DB 9,0,0,0 + DB 9,0,0,0 DD shaext_handler wrt ..imagebase $L$SEH_info_sha256_block_data_order_ssse3: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue_ssse3 wrt ..imagebase,$L$epilogue_ssse3 wrt ..imagebase $L$SEH_info_sha256_block_data_order_avx: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha512-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha512-x86_64-win.asm similarity index 99% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/sha512-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/sha512-x86_64-win.asm index 33dc2c2ede27..a85813c0c87b 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha512-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/sha512-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -1744,6 +1745,7 @@ $L$epilogue: DB 0F3h,0C3h ;repret $L$SEH_end_sha512_block_data_order: +section .rdata rdata align=8 ALIGN 64 K512: @@ -1830,11 +1832,13 @@ K512: DQ 0x0001020304050607,0x08090a0b0c0d0e0f DQ 0x0001020304050607,0x08090a0b0c0d0e0f -DB 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97 -DB 110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54 -DB 52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 -DB 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 -DB 111,114,103,62,0 + DB 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97 + DB 110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54 + DB 52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 + DB 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 + DB 111,114,103,62,0 +section .text + ALIGN 64 sha512_block_data_order_avx: @@ -3130,10 +3134,14 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_sha512_block_data_order: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue wrt ..imagebase,$L$epilogue wrt ..imagebase $L$SEH_info_sha512_block_data_order_avx: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$prologue_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/vpaes-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/vpaes-x86_64-win.asm similarity index 97% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/vpaes-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/vpaes-x86_64-win.asm index ccfc870a66a4..593ab402dc32 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/vpaes-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/vpaes-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -1226,6 +1227,7 @@ _vpaes_preheat: +section .rdata rdata align=8 ALIGN 64 _vpaes_consts: $L$k_inv: @@ -1332,13 +1334,15 @@ $L$ctr_add_one: $L$ctr_add_two: DQ 0x0000000000000000,0x0000000200000000 -DB 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105 -DB 111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54 -DB 52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97 -DB 109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32 -DB 85,110,105,118,101,114,115,105,116,121,41,0 + DB 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105 + DB 111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54 + DB 52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97 + DB 109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32 + DB 85,110,105,118,101,114,115,105,116,121,41,0 ALIGN 64 +section .text + EXTERN __imp_RtlVirtualUnwind ALIGN 16 @@ -1447,26 +1451,30 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_vpaes_set_encrypt_key: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$enc_key_body wrt ..imagebase,$L$enc_key_epilogue wrt ..imagebase $L$SEH_info_vpaes_set_decrypt_key: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$dec_key_body wrt ..imagebase,$L$dec_key_epilogue wrt ..imagebase $L$SEH_info_vpaes_encrypt: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$enc_body wrt ..imagebase,$L$enc_epilogue wrt ..imagebase $L$SEH_info_vpaes_decrypt: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$dec_body wrt ..imagebase,$L$dec_epilogue wrt ..imagebase $L$SEH_info_vpaes_cbc_encrypt: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$cbc_body wrt ..imagebase,$L$cbc_epilogue wrt ..imagebase $L$SEH_info_vpaes_ctr32_encrypt_blocks: -DB 9,0,0,0 + DB 9,0,0,0 DD se_handler wrt ..imagebase DD $L$ctr32_body wrt ..imagebase,$L$ctr32_epilogue wrt ..imagebase +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont-win.asm similarity index 97% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont-win.asm index d6d8bdd6d49b..5ea1f2edcda7 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -1046,7 +1047,7 @@ $L$mulx4x_body: mulx r11,rax,QWORD[8+rcx] adcx r10,rax adox r11,r12 -DB 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 + DB 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 mov rdi,QWORD[48+rsp] mov QWORD[((-32))+rbx],r10 adcx r11,rax @@ -1071,7 +1072,7 @@ $L$mulx4x_1st: mulx rax,r12,QWORD[16+rsi] adcx r12,r14 mulx r14,r13,QWORD[24+rsi] -DB 0x67,0x67 + DB 0x67,0x67 mov rdx,r8 adcx r13,rax adcx r14,rbp @@ -1305,11 +1306,11 @@ $L$mulx4x_epilogue: DB 0F3h,0C3h ;repret $L$SEH_end_bn_mulx4x_mont: -DB 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 -DB 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 -DB 54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83 -DB 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 -DB 115,108,46,111,114,103,62,0 + DB 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 + DB 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 + DB 54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83 + DB 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 + DB 115,108,46,111,114,103,62,0 ALIGN 16 EXTERN __imp_RtlVirtualUnwind @@ -1462,20 +1463,24 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_bn_mul_mont: -DB 9,0,0,0 + DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase $L$SEH_info_bn_mul4x_mont: -DB 9,0,0,0 + DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mul4x_body wrt ..imagebase,$L$mul4x_epilogue wrt ..imagebase $L$SEH_info_bn_sqr8x_mont: -DB 9,0,0,0 + DB 9,0,0,0 DD sqr_handler wrt ..imagebase DD $L$sqr8x_prologue wrt ..imagebase,$L$sqr8x_body wrt ..imagebase,$L$sqr8x_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_mulx4x_mont: -DB 9,0,0,0 + DB 9,0,0,0 DD sqr_handler wrt ..imagebase DD $L$mulx4x_prologue wrt ..imagebase,$L$mulx4x_body wrt ..imagebase,$L$mulx4x_epilogue wrt ..imagebase ALIGN 8 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont5.asm b/third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont5-win.asm similarity index 97% rename from third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont5.asm rename to third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont5-win.asm index b60f66234ed7..8583bda113c3 100644 --- a/third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont5.asm +++ b/third_party/boringssl/win-x86_64/crypto/fipsmodule/x86_64-mont5-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -101,7 +102,7 @@ $L$mul_body: movdqa xmm2,xmm1 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 -DB 0x67 + DB 0x67 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 @@ -165,7 +166,7 @@ DB 0x67 movdqa XMMWORD[304+r10],xmm0 paddd xmm3,xmm2 -DB 0x67 + DB 0x67 pcmpeqd xmm2,xmm5 movdqa XMMWORD[320+r10],xmm1 @@ -216,6 +217,7 @@ DB 0x67 por xmm0,xmm2 por xmm1,xmm3 por xmm0,xmm1 + pshufd xmm1,xmm0,0x4e por xmm0,xmm1 lea r12,[256+r12] @@ -339,6 +341,7 @@ $L$outer: por xmm4,xmm2 por xmm5,xmm3 por xmm4,xmm5 + pshufd xmm0,xmm4,0x4e por xmm0,xmm4 lea r12,[256+r12] @@ -484,7 +487,7 @@ $L$SEH_begin_bn_mul4x_mont_gather5: -DB 0x67 + DB 0x67 mov rax,rsp $L$mul4x_enter: @@ -505,7 +508,7 @@ $L$mul4x_enter: $L$mul4x_prologue: -DB 0x67 + DB 0x67 shl r9d,3 lea r10,[r9*2+r9] neg r9 @@ -604,11 +607,11 @@ mul4x_internal: pshufd xmm5,xmm5,0 movdqa xmm4,xmm1 -DB 0x67,0x67 + DB 0x67,0x67 movdqa xmm2,xmm1 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 -DB 0x67 + DB 0x67 movdqa xmm3,xmm4 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 @@ -672,7 +675,7 @@ DB 0x67 movdqa XMMWORD[304+r10],xmm0 paddd xmm3,xmm2 -DB 0x67 + DB 0x67 pcmpeqd xmm2,xmm5 movdqa XMMWORD[320+r10],xmm1 @@ -723,6 +726,7 @@ DB 0x67 por xmm0,xmm2 por xmm1,xmm3 por xmm0,xmm1 + pshufd xmm1,xmm0,0x4e por xmm0,xmm1 lea r12,[256+r12] @@ -930,6 +934,7 @@ $L$outer4x: por xmm4,xmm2 por xmm5,xmm3 por xmm4,xmm5 + pshufd xmm0,xmm4,0x4e por xmm0,xmm4 lea r12,[256+r12] @@ -1533,7 +1538,7 @@ $L$sqr4x_inner: add r13,QWORD[rcx*1+rdi] adc r12,0 -DB 0x67 + DB 0x67 mul r14 add r11,rax mov rax,rbx @@ -1565,7 +1570,7 @@ DB 0x67 cmp rcx,0 jne NEAR $L$sqr4x_inner -DB 0x67 + DB 0x67 mul r15 add r13,rax adc rdx,0 @@ -1758,7 +1763,7 @@ $L$sqr4x_shift_n_add: jnz NEAR $L$sqr4x_shift_n_add lea r12,[r10*2+r14] -DB 0x67 + DB 0x67 shr r10,63 lea r13,[r11*2+rcx] shr r11,63 @@ -1800,7 +1805,7 @@ __bn_sqr8x_reduction: ALIGN 32 $L$8x_reduction_loop: lea rdi,[r9*1+rdi] -DB 0x66 + DB 0x66 mov rbx,QWORD[rdi] mov r9,QWORD[8+rdi] mov r10,QWORD[16+rdi] @@ -1812,7 +1817,7 @@ DB 0x66 mov QWORD[rdx],rax lea rdi,[64+rdi] -DB 0x67 + DB 0x67 mov r8,rbx imul rbx,QWORD[((32+8))+rsp] mov rax,QWORD[rbp] @@ -1896,7 +1901,7 @@ $L$8x_reduce: cmp rbp,QWORD[((0+8))+rsp] jae NEAR $L$8x_no_tail -DB 0x66 + DB 0x66 add r8,QWORD[rdi] adc r9,QWORD[8+rdi] adc r10,QWORD[16+rdi] @@ -2253,9 +2258,9 @@ mulx4x_internal: pshufd xmm5,xmm5,0 movdqa xmm4,xmm1 -DB 0x67 + DB 0x67 movdqa xmm2,xmm1 -DB 0x67 + DB 0x67 paddd xmm1,xmm0 pcmpeqd xmm0,xmm5 movdqa xmm3,xmm4 @@ -2316,7 +2321,7 @@ DB 0x67 pcmpeqd xmm0,xmm5 movdqa XMMWORD[288+r10],xmm3 movdqa xmm3,xmm4 -DB 0x67 + DB 0x67 paddd xmm2,xmm1 pcmpeqd xmm1,xmm5 movdqa XMMWORD[304+r10],xmm0 @@ -2372,6 +2377,7 @@ DB 0x67 por xmm0,xmm2 por xmm1,xmm3 pxor xmm0,xmm1 + pshufd xmm1,xmm0,0x4e por xmm0,xmm1 lea rdi,[256+rdi] @@ -2428,7 +2434,7 @@ $L$mulx4x_1st: mulx rax,r12,QWORD[16+rsi] adcx r12,r14 mulx r14,r13,QWORD[24+rsi] -DB 0x67,0x67 + DB 0x67,0x67 mov rdx,r8 adcx r13,rax adcx r14,rbp @@ -2471,7 +2477,7 @@ ALIGN 32 $L$mulx4x_outer: lea r10,[((16-256))+rbx] pxor xmm4,xmm4 -DB 0x67,0x67 + DB 0x67,0x67 pxor xmm5,xmm5 movdqa xmm0,XMMWORD[((-128))+rdi] movdqa xmm1,XMMWORD[((-112))+rdi] @@ -2522,6 +2528,7 @@ DB 0x67,0x67 por xmm4,xmm2 por xmm5,xmm3 por xmm4,xmm5 + pshufd xmm0,xmm4,0x4e por xmm0,xmm4 lea rdi,[256+rdi] @@ -2856,9 +2863,9 @@ __bn_sqrx8x_internal: jmp NEAR $L$sqr8x_zero_start ALIGN 32 -DB 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 + DB 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 $L$sqrx8x_zero: -DB 0x3e + DB 0x3e movdqa XMMWORD[rdi],xmm0 movdqa XMMWORD[16+rdi],xmm0 movdqa XMMWORD[32+rdi],xmm0 @@ -2892,10 +2899,10 @@ $L$sqrx8x_outer_loop: mulx rax,r9,QWORD[16+rsi] adcx r9,r10 adox r11,rax -DB 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 + DB 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 adcx r10,r11 adox r12,rax -DB 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 + DB 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 adcx r11,r12 adox r13,rax mulx rax,r12,QWORD[40+rsi] @@ -2922,13 +2929,13 @@ DB 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 mulx rbx,r10,QWORD[32+rsi] adcx r9,r11 adox r10,rax -DB 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 + DB 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 adcx r10,r12 adox r11,rbx -DB 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 + DB 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 adcx r11,r13 adox r12,r14 -DB 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 + DB 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 mov rdx,QWORD[16+rsi] adcx r12,rax adox r13,rbx @@ -2946,11 +2953,11 @@ DB 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 mulx rbx,r10,QWORD[40+rsi] adcx r9,r11 adox r10,rax -DB 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 + DB 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 adcx r10,r12 adox r11,r13 -DB 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 -DB 0x3e + DB 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 + DB 0x3e mov rdx,QWORD[24+rsi] adcx r11,rbx adox r12,rax @@ -3002,7 +3009,7 @@ DB 0x3e adcx r12,rax adox r13,rbp -DB 0x67,0x67 + DB 0x67,0x67 mulx r14,r8,r8 adcx r13,r8 adcx r14,rbp @@ -3052,7 +3059,7 @@ $L$sqrx8x_loop: adcx r10,rax adox r11,r12 -DB 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 + DB 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 adcx r11,rax adox r12,r13 @@ -3066,13 +3073,13 @@ DB 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 adcx r13,rax adox r14,r15 -DB 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 + DB 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 mov rdx,QWORD[8+rcx*8+rsi] adcx r14,rax adox r15,rbx adcx r15,rbx -DB 0x67 + DB 0x67 inc rcx jnz NEAR $L$sqrx8x_loop @@ -3082,7 +3089,7 @@ DB 0x67 je NEAR $L$sqrx8x_break sub rbx,QWORD[((16+8))+rsp] -DB 0x66 + DB 0x66 mov rdx,QWORD[((-64))+rsi] adcx r8,QWORD[rdi] adcx r9,QWORD[8+rdi] @@ -3093,7 +3100,7 @@ DB 0x66 adc r14,QWORD[48+rdi] adc r15,QWORD[56+rdi] lea rdi,[64+rdi] -DB 0x67 + DB 0x67 sbb rax,rax xor ebx,ebx mov QWORD[((16+8))+rsp],rax @@ -3159,8 +3166,8 @@ $L$sqrx4x_shift_n_add: mulx rbx,rax,rdx adox r12,r12 adcx rax,r10 -DB 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 -DB 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 + DB 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 + DB 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 adox r13,r13 adcx rbx,r11 mov r11,QWORD[40+rdi] @@ -3194,7 +3201,7 @@ DB 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 adox r10,r10 adcx rax,r12 jrcxz $L$sqrx4x_shift_n_add_break -DB 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 + DB 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 adox r11,r11 adcx rbx,r13 mov r12,QWORD[80+rdi] @@ -3261,7 +3268,7 @@ $L$sqrx8x_reduce: adcx r10,rbx adox r11,r12 -DB 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 + DB 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 mov rax,rdx mov rdx,r8 adcx r11,rbx @@ -3285,7 +3292,7 @@ DB 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 adox r15,rsi adcx r15,rsi -DB 0x67,0x67,0x67 + DB 0x67,0x67,0x67 inc rcx jnz NEAR $L$sqrx8x_reduce @@ -3330,7 +3337,7 @@ $L$sqrx8x_tail: adcx r10,rax adox r11,r12 -DB 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 + DB 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 adcx r11,rax adox r12,r13 @@ -3482,6 +3489,15 @@ bn_scatter5: cmp edx,0 jz NEAR $L$scatter_epilogue + + + + + + + + + lea r8,[r9*8+r8] $L$scatter: mov rax,QWORD[rcx] @@ -3502,9 +3518,9 @@ bn_gather5: $L$SEH_begin_bn_gather5: -DB 0x4c,0x8d,0x14,0x24 + DB 0x4c,0x8d,0x14,0x24 -DB 0x48,0x81,0xec,0x08,0x01,0x00,0x00 + DB 0x48,0x81,0xec,0x08,0x01,0x00,0x00 lea rax,[$L$inc] and rsp,-16 @@ -3649,6 +3665,7 @@ $L$gather: por xmm5,xmm3 por xmm4,xmm5 lea r11,[256+r11] + pshufd xmm0,xmm4,0x4e por xmm0,xmm4 movq QWORD[rcx],xmm0 @@ -3662,16 +3679,19 @@ $L$gather: $L$SEH_end_bn_gather5: +section .rdata rdata align=8 ALIGN 64 $L$inc: DD 0,0,1,1 DD 2,2,2,2 -DB 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 -DB 112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115 -DB 99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111 -DB 114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79 -DB 71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111 -DB 112,101,110,115,115,108,46,111,114,103,62,0 + DB 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 + DB 112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115 + DB 99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111 + DB 114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79 + DB 71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111 + DB 112,101,110,115,115,108,46,111,114,103,62,0 +section .text + EXTERN __imp_RtlVirtualUnwind ALIGN 16 @@ -3802,32 +3822,36 @@ ALIGN 4 section .xdata rdata align=8 ALIGN 8 $L$SEH_info_bn_mul_mont_gather5: -DB 9,0,0,0 + DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mul_body wrt ..imagebase,$L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_mul4x_mont_gather5: -DB 9,0,0,0 + DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mul4x_prologue wrt ..imagebase,$L$mul4x_body wrt ..imagebase,$L$mul4x_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_power5: -DB 9,0,0,0 + DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$power5_prologue wrt ..imagebase,$L$power5_body wrt ..imagebase,$L$power5_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_mulx4x_mont_gather5: -DB 9,0,0,0 + DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$mulx4x_prologue wrt ..imagebase,$L$mulx4x_body wrt ..imagebase,$L$mulx4x_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_powerx5: -DB 9,0,0,0 + DB 9,0,0,0 DD mul_handler wrt ..imagebase DD $L$powerx5_prologue wrt ..imagebase,$L$powerx5_body wrt ..imagebase,$L$powerx5_epilogue wrt ..imagebase ALIGN 8 $L$SEH_info_bn_gather5: -DB 0x01,0x0b,0x03,0x0a -DB 0x0b,0x01,0x21,0x00 -DB 0x04,0xa3,0x00,0x00 + DB 0x01,0x0b,0x03,0x0a + DB 0x0b,0x01,0x21,0x00 + DB 0x04,0xa3,0x00,0x00 ALIGN 8 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/boringssl/win-x86_64/crypto/test/trampoline-x86_64.asm b/third_party/boringssl/win-x86_64/crypto/test/trampoline-x86_64-win.asm similarity index 61% rename from third_party/boringssl/win-x86_64/crypto/test/trampoline-x86_64.asm rename to third_party/boringssl/win-x86_64/crypto/test/trampoline-x86_64-win.asm index 99006695ad46..a63c060fe949 100644 --- a/third_party/boringssl/win-x86_64/crypto/test/trampoline-x86_64.asm +++ b/third_party/boringssl/win-x86_64/crypto/test/trampoline-x86_64-win.asm @@ -1,6 +1,7 @@ ; This file is generated from a similarly-named Perl script in the BoringSSL ; source tree. Do not edit by hand. +%ifidn __OUTPUT_FORMAT__, win64 default rel %define XMMWORD %define YMMWORD @@ -23,8 +24,8 @@ section .text code align=64 global abi_test_trampoline ALIGN 16 abi_test_trampoline: -$L$abi_test_trampoline_seh_begin: +$L$SEH_begin_abi_test_trampoline_1: @@ -36,62 +37,61 @@ $L$abi_test_trampoline_seh_begin: sub rsp,344 -$L$abi_test_trampoline_seh_prolog_alloc: +$L$SEH_prolog_abi_test_trampoline_2: mov QWORD[112+rsp],rbx -$L$abi_test_trampoline_seh_prolog_rbx: +$L$SEH_prolog_abi_test_trampoline_3: mov QWORD[120+rsp],rbp -$L$abi_test_trampoline_seh_prolog_rbp: +$L$SEH_prolog_abi_test_trampoline_4: mov QWORD[128+rsp],rdi -$L$abi_test_trampoline_seh_prolog_rdi: +$L$SEH_prolog_abi_test_trampoline_5: mov QWORD[136+rsp],rsi -$L$abi_test_trampoline_seh_prolog_rsi: +$L$SEH_prolog_abi_test_trampoline_6: mov QWORD[144+rsp],r12 -$L$abi_test_trampoline_seh_prolog_r12: +$L$SEH_prolog_abi_test_trampoline_7: mov QWORD[152+rsp],r13 -$L$abi_test_trampoline_seh_prolog_r13: +$L$SEH_prolog_abi_test_trampoline_8: mov QWORD[160+rsp],r14 -$L$abi_test_trampoline_seh_prolog_r14: +$L$SEH_prolog_abi_test_trampoline_9: mov QWORD[168+rsp],r15 -$L$abi_test_trampoline_seh_prolog_r15: +$L$SEH_prolog_abi_test_trampoline_10: movdqa XMMWORD[176+rsp],xmm6 -$L$abi_test_trampoline_seh_prolog_xmm6: +$L$SEH_prolog_abi_test_trampoline_11: movdqa XMMWORD[192+rsp],xmm7 -$L$abi_test_trampoline_seh_prolog_xmm7: +$L$SEH_prolog_abi_test_trampoline_12: movdqa XMMWORD[208+rsp],xmm8 -$L$abi_test_trampoline_seh_prolog_xmm8: +$L$SEH_prolog_abi_test_trampoline_13: movdqa XMMWORD[224+rsp],xmm9 -$L$abi_test_trampoline_seh_prolog_xmm9: +$L$SEH_prolog_abi_test_trampoline_14: movdqa XMMWORD[240+rsp],xmm10 -$L$abi_test_trampoline_seh_prolog_xmm10: +$L$SEH_prolog_abi_test_trampoline_15: movdqa XMMWORD[256+rsp],xmm11 -$L$abi_test_trampoline_seh_prolog_xmm11: +$L$SEH_prolog_abi_test_trampoline_16: movdqa XMMWORD[272+rsp],xmm12 -$L$abi_test_trampoline_seh_prolog_xmm12: +$L$SEH_prolog_abi_test_trampoline_17: movdqa XMMWORD[288+rsp],xmm13 -$L$abi_test_trampoline_seh_prolog_xmm13: +$L$SEH_prolog_abi_test_trampoline_18: movdqa XMMWORD[304+rsp],xmm14 -$L$abi_test_trampoline_seh_prolog_xmm14: +$L$SEH_prolog_abi_test_trampoline_19: movdqa XMMWORD[320+rsp],xmm15 -$L$abi_test_trampoline_seh_prolog_xmm15: -$L$abi_test_trampoline_seh_prolog_end: +$L$SEH_prolog_abi_test_trampoline_20: mov rbx,QWORD[rdx] mov rbp,QWORD[8+rdx] mov rdi,QWORD[16+rdx] @@ -252,7 +252,7 @@ $L$call_done: DB 0F3h,0C3h ;repret -$L$abi_test_trampoline_seh_end: +$L$SEH_end_abi_test_trampoline_21: global abi_test_clobber_rax @@ -479,10 +479,10 @@ global abi_test_bad_unwind_wrong_register ALIGN 16 abi_test_bad_unwind_wrong_register: -$L$abi_test_bad_unwind_wrong_register_seh_begin: +$L$SEH_begin_abi_test_bad_unwind_wrong_register_1: push r12 -$L$abi_test_bad_unwind_wrong_register_seh_push_r13: +$L$SEH_prolog_abi_test_bad_unwind_wrong_register_2: @@ -490,7 +490,7 @@ $L$abi_test_bad_unwind_wrong_register_seh_push_r13: pop r12 DB 0F3h,0C3h ;repret -$L$abi_test_bad_unwind_wrong_register_seh_end: +$L$SEH_end_abi_test_bad_unwind_wrong_register_3: @@ -502,10 +502,10 @@ global abi_test_bad_unwind_temporary ALIGN 16 abi_test_bad_unwind_temporary: -$L$abi_test_bad_unwind_temporary_seh_begin: +$L$SEH_begin_abi_test_bad_unwind_temporary_1: push r12 -$L$abi_test_bad_unwind_temporary_seh_push_r12: +$L$SEH_prolog_abi_test_bad_unwind_temporary_2: mov rax,r12 inc rax @@ -519,8 +519,8 @@ $L$abi_test_bad_unwind_temporary_seh_push_r12: pop r12 DB 0F3h,0C3h ;repret -$L$abi_test_bad_unwind_temporary_seh_end: +$L$SEH_end_abi_test_bad_unwind_temporary_3: @@ -553,9 +553,9 @@ abi_test_set_direction_flag: global abi_test_bad_unwind_epilog ALIGN 16 abi_test_bad_unwind_epilog: -$L$abi_test_bad_unwind_epilog_seh_begin: +$L$SEH_begin_abi_test_bad_unwind_epilog_1: push r12 -$L$abi_test_bad_unwind_epilog_seh_push_r12: +$L$SEH_prolog_abi_test_bad_unwind_epilog_2: nop @@ -563,120 +563,116 @@ $L$abi_test_bad_unwind_epilog_seh_push_r12: pop r12 nop DB 0F3h,0C3h ;repret -$L$abi_test_bad_unwind_epilog_seh_end: +$L$SEH_end_abi_test_bad_unwind_epilog_3: section .pdata rdata align=4 ALIGN 4 + DD $L$SEH_begin_abi_test_trampoline_1 wrt ..imagebase + DD $L$SEH_end_abi_test_trampoline_21 wrt ..imagebase + DD $L$SEH_info_abi_test_trampoline_0 wrt ..imagebase - DD $L$abi_test_trampoline_seh_begin wrt ..imagebase - DD $L$abi_test_trampoline_seh_end wrt ..imagebase - DD $L$abi_test_trampoline_seh_info wrt ..imagebase + DD $L$SEH_begin_abi_test_bad_unwind_wrong_register_1 wrt ..imagebase + DD $L$SEH_end_abi_test_bad_unwind_wrong_register_3 wrt ..imagebase + DD $L$SEH_info_abi_test_bad_unwind_wrong_register_0 wrt ..imagebase - DD $L$abi_test_bad_unwind_wrong_register_seh_begin wrt ..imagebase - DD $L$abi_test_bad_unwind_wrong_register_seh_end wrt ..imagebase - DD $L$abi_test_bad_unwind_wrong_register_seh_info wrt ..imagebase + DD $L$SEH_begin_abi_test_bad_unwind_temporary_1 wrt ..imagebase + DD $L$SEH_end_abi_test_bad_unwind_temporary_3 wrt ..imagebase + DD $L$SEH_info_abi_test_bad_unwind_temporary_0 wrt ..imagebase - DD $L$abi_test_bad_unwind_temporary_seh_begin wrt ..imagebase - DD $L$abi_test_bad_unwind_temporary_seh_end wrt ..imagebase - DD $L$abi_test_bad_unwind_temporary_seh_info wrt ..imagebase + DD $L$SEH_begin_abi_test_bad_unwind_epilog_1 wrt ..imagebase + DD $L$SEH_end_abi_test_bad_unwind_epilog_3 wrt ..imagebase + DD $L$SEH_info_abi_test_bad_unwind_epilog_0 wrt ..imagebase - DD $L$abi_test_bad_unwind_epilog_seh_begin wrt ..imagebase - DD $L$abi_test_bad_unwind_epilog_seh_end wrt ..imagebase - DD $L$abi_test_bad_unwind_epilog_seh_info wrt ..imagebase section .xdata rdata align=8 -ALIGN 8 -$L$abi_test_trampoline_seh_info: - -DB 1 -DB $L$abi_test_trampoline_seh_prolog_end-$L$abi_test_trampoline_seh_begin -DB 38 -DB 0 -DB $L$abi_test_trampoline_seh_prolog_xmm15-$L$abi_test_trampoline_seh_begin -DB 248 +ALIGN 4 +$L$SEH_info_abi_test_trampoline_0: + DB 1 + DB $L$SEH_prolog_abi_test_trampoline_20-$L$SEH_begin_abi_test_trampoline_1 + DB 38 + DB 0 + DB $L$SEH_prolog_abi_test_trampoline_20-$L$SEH_begin_abi_test_trampoline_1 + DB 248 DW 20 -DB $L$abi_test_trampoline_seh_prolog_xmm14-$L$abi_test_trampoline_seh_begin -DB 232 + DB $L$SEH_prolog_abi_test_trampoline_19-$L$SEH_begin_abi_test_trampoline_1 + DB 232 DW 19 -DB $L$abi_test_trampoline_seh_prolog_xmm13-$L$abi_test_trampoline_seh_begin -DB 216 + DB $L$SEH_prolog_abi_test_trampoline_18-$L$SEH_begin_abi_test_trampoline_1 + DB 216 DW 18 -DB $L$abi_test_trampoline_seh_prolog_xmm12-$L$abi_test_trampoline_seh_begin -DB 200 + DB $L$SEH_prolog_abi_test_trampoline_17-$L$SEH_begin_abi_test_trampoline_1 + DB 200 DW 17 -DB $L$abi_test_trampoline_seh_prolog_xmm11-$L$abi_test_trampoline_seh_begin -DB 184 + DB $L$SEH_prolog_abi_test_trampoline_16-$L$SEH_begin_abi_test_trampoline_1 + DB 184 DW 16 -DB $L$abi_test_trampoline_seh_prolog_xmm10-$L$abi_test_trampoline_seh_begin -DB 168 + DB $L$SEH_prolog_abi_test_trampoline_15-$L$SEH_begin_abi_test_trampoline_1 + DB 168 DW 15 -DB $L$abi_test_trampoline_seh_prolog_xmm9-$L$abi_test_trampoline_seh_begin -DB 152 + DB $L$SEH_prolog_abi_test_trampoline_14-$L$SEH_begin_abi_test_trampoline_1 + DB 152 DW 14 -DB $L$abi_test_trampoline_seh_prolog_xmm8-$L$abi_test_trampoline_seh_begin -DB 136 + DB $L$SEH_prolog_abi_test_trampoline_13-$L$SEH_begin_abi_test_trampoline_1 + DB 136 DW 13 -DB $L$abi_test_trampoline_seh_prolog_xmm7-$L$abi_test_trampoline_seh_begin -DB 120 + DB $L$SEH_prolog_abi_test_trampoline_12-$L$SEH_begin_abi_test_trampoline_1 + DB 120 DW 12 -DB $L$abi_test_trampoline_seh_prolog_xmm6-$L$abi_test_trampoline_seh_begin -DB 104 + DB $L$SEH_prolog_abi_test_trampoline_11-$L$SEH_begin_abi_test_trampoline_1 + DB 104 DW 11 -DB $L$abi_test_trampoline_seh_prolog_r15-$L$abi_test_trampoline_seh_begin -DB 244 + DB $L$SEH_prolog_abi_test_trampoline_10-$L$SEH_begin_abi_test_trampoline_1 + DB 244 DW 21 -DB $L$abi_test_trampoline_seh_prolog_r14-$L$abi_test_trampoline_seh_begin -DB 228 + DB $L$SEH_prolog_abi_test_trampoline_9-$L$SEH_begin_abi_test_trampoline_1 + DB 228 DW 20 -DB $L$abi_test_trampoline_seh_prolog_r13-$L$abi_test_trampoline_seh_begin -DB 212 + DB $L$SEH_prolog_abi_test_trampoline_8-$L$SEH_begin_abi_test_trampoline_1 + DB 212 DW 19 -DB $L$abi_test_trampoline_seh_prolog_r12-$L$abi_test_trampoline_seh_begin -DB 196 + DB $L$SEH_prolog_abi_test_trampoline_7-$L$SEH_begin_abi_test_trampoline_1 + DB 196 DW 18 -DB $L$abi_test_trampoline_seh_prolog_rsi-$L$abi_test_trampoline_seh_begin -DB 100 + DB $L$SEH_prolog_abi_test_trampoline_6-$L$SEH_begin_abi_test_trampoline_1 + DB 100 DW 17 -DB $L$abi_test_trampoline_seh_prolog_rdi-$L$abi_test_trampoline_seh_begin -DB 116 + DB $L$SEH_prolog_abi_test_trampoline_5-$L$SEH_begin_abi_test_trampoline_1 + DB 116 DW 16 -DB $L$abi_test_trampoline_seh_prolog_rbp-$L$abi_test_trampoline_seh_begin -DB 84 + DB $L$SEH_prolog_abi_test_trampoline_4-$L$SEH_begin_abi_test_trampoline_1 + DB 84 DW 15 -DB $L$abi_test_trampoline_seh_prolog_rbx-$L$abi_test_trampoline_seh_begin -DB 52 + DB $L$SEH_prolog_abi_test_trampoline_3-$L$SEH_begin_abi_test_trampoline_1 + DB 52 DW 14 -DB $L$abi_test_trampoline_seh_prolog_alloc-$L$abi_test_trampoline_seh_begin -DB 1 + DB $L$SEH_prolog_abi_test_trampoline_2-$L$SEH_begin_abi_test_trampoline_1 + DB 1 DW 43 - -ALIGN 8 -$L$abi_test_bad_unwind_wrong_register_seh_info: -DB 1 -DB $L$abi_test_bad_unwind_wrong_register_seh_push_r13-$L$abi_test_bad_unwind_wrong_register_seh_begin -DB 1 -DB 0 - -DB $L$abi_test_bad_unwind_wrong_register_seh_push_r13-$L$abi_test_bad_unwind_wrong_register_seh_begin -DB 208 - -ALIGN 8 -$L$abi_test_bad_unwind_temporary_seh_info: -DB 1 -DB $L$abi_test_bad_unwind_temporary_seh_push_r12-$L$abi_test_bad_unwind_temporary_seh_begin -DB 1 -DB 0 - -DB $L$abi_test_bad_unwind_temporary_seh_push_r12-$L$abi_test_bad_unwind_temporary_seh_begin -DB 192 - -ALIGN 8 -$L$abi_test_bad_unwind_epilog_seh_info: -DB 1 -DB $L$abi_test_bad_unwind_epilog_seh_push_r12-$L$abi_test_bad_unwind_epilog_seh_begin -DB 1 -DB 0 - -DB $L$abi_test_bad_unwind_epilog_seh_push_r12-$L$abi_test_bad_unwind_epilog_seh_begin -DB 192 +$L$SEH_info_abi_test_bad_unwind_wrong_register_0: + DB 1 + DB $L$SEH_prolog_abi_test_bad_unwind_wrong_register_2-$L$SEH_begin_abi_test_bad_unwind_wrong_register_1 + DB 1 + DB 0 + DB $L$SEH_prolog_abi_test_bad_unwind_wrong_register_2-$L$SEH_begin_abi_test_bad_unwind_wrong_register_1 + DB 208 + +$L$SEH_info_abi_test_bad_unwind_temporary_0: + DB 1 + DB $L$SEH_prolog_abi_test_bad_unwind_temporary_2-$L$SEH_begin_abi_test_bad_unwind_temporary_1 + DB 1 + DB 0 + DB $L$SEH_prolog_abi_test_bad_unwind_temporary_2-$L$SEH_begin_abi_test_bad_unwind_temporary_1 + DB 192 + +$L$SEH_info_abi_test_bad_unwind_epilog_0: + DB 1 + DB $L$SEH_prolog_abi_test_bad_unwind_epilog_2-$L$SEH_begin_abi_test_bad_unwind_epilog_1 + DB 1 + DB 0 + DB $L$SEH_prolog_abi_test_bad_unwind_epilog_2-$L$SEH_begin_abi_test_bad_unwind_epilog_1 + DB 192 +%else +; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 +ret +%endif diff --git a/third_party/chromium/media/BUILD.gn.chromium b/third_party/chromium/media/BUILD.gn.chromium deleted file mode 100644 index 9a9ea3766a03..000000000000 --- a/third_party/chromium/media/BUILD.gn.chromium +++ /dev/null @@ -1,464 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//build/buildflag_header.gni") -import("//build/config/android/config.gni") -import("//build/config/arm.gni") -import("//build/config/chromecast_build.gni") -import("//build/config/features.gni") -import("//build/config/linux/pkg_config.gni") -import("//build/config/ui.gni") -import("//media/cdm/library_cdm/cdm_paths.gni") -import("//media/media_options.gni") -import("//testing/libfuzzer/fuzzer_test.gni") -import("//testing/test.gni") -import("//third_party/ffmpeg/ffmpeg_options.gni") - -buildflag_header("media_buildflags") { - header = "media_buildflags.h" - - flags = [ - "ALTERNATE_CDM_STORAGE_ID_KEY=\"$alternate_cdm_storage_id_key\"", - "CDM_PLATFORM_SPECIFIC_PATH=\"$cdm_platform_specific_path\"", - "ENABLE_PLATFORM_AC3_EAC3_AUDIO=$enable_platform_ac3_eac3_audio", - "ENABLE_CAST_AUDIO_RENDERER=$enable_cast_audio_renderer", - "ENABLE_CDM_HOST_VERIFICATION=$enable_cdm_host_verification", - "ENABLE_CDM_STORAGE_ID=$enable_cdm_storage_id", - "ENABLE_DAV1D_DECODER=$enable_dav1d_decoder", - "ENABLE_AV1_DECODER=$enable_av1_decoder", - "ENABLE_PLATFORM_DOLBY_VISION=$enable_platform_dolby_vision", - "ENABLE_FFMPEG=$media_use_ffmpeg", - "ENABLE_FFMPEG_VIDEO_DECODERS=$enable_ffmpeg_video_decoders", - "ENABLE_PLATFORM_HEVC=$enable_platform_hevc", - "ENABLE_PLATFORM_HEVC_DECODING=$enable_platform_hevc_decoding", - "ENABLE_PLATFORM_ENCRYPTED_HEVC=$enable_platform_encrypted_hevc", - "ENABLE_HLS_SAMPLE_AES=$enable_hls_sample_aes", - "ENABLE_LIBGAV1_DECODER=$enable_libgav1_decoder", - "ENABLE_LIBRARY_CDMS=$enable_library_cdms", - "ENABLE_LIBVPX=$media_use_libvpx", - "ENABLE_LOGGING_OVERRIDE=$enable_logging_override", - "ENABLE_MEDIA_DRM_STORAGE=$enable_media_drm_storage", - "ENABLE_MEDIA_REMOTING=$enable_media_remoting", - "ENABLE_MEDIA_REMOTING_RPC=$enable_media_remoting_rpc", - "ENABLE_OPENH264=$media_use_openh264", - "ENABLE_PLATFORM_IAMF_AUDIO=$enable_platform_iamf_audio", - "ENABLE_PLATFORM_MPEG_H_AUDIO=$enable_platform_mpeg_h_audio", - "ENABLE_MSE_MPEG2TS_STREAM_PARSER=$enable_mse_mpeg2ts_stream_parser", - "ENABLE_CAST_STREAMING_RENDERER=$enable_cast_streaming_renderer", - "USE_CHROMEOS_MEDIA_ACCELERATION=$use_vaapi||$use_v4l2_codec", - "USE_CHROMEOS_PROTECTED_AV1=$use_chromeos_protected_av1", - "USE_CHROMEOS_PROTECTED_MEDIA=$use_chromeos_protected_media", - "USE_PROPRIETARY_CODECS=$proprietary_codecs", - ] -} - -if (proprietary_codecs && media_use_ffmpeg) { - assert( - ffmpeg_branding != "Chromium", - "proprietary codecs and ffmpeg_branding set to Chromium are incompatible") -} - -# Common configuration for targets in the media directory; these must not be -# exported since things like USE_NEON and USE_CRAS have different meanings -# elsewhere in the code base. -config("media_config") { - defines = [] - if (current_cpu == "arm64" || (current_cpu == "arm" && arm_use_neon)) { - defines += [ "USE_NEON" ] - } - if (use_pulseaudio) { - defines += [ "USE_PULSEAUDIO" ] - if (!link_pulseaudio) { - defines += [ "DLOPEN_PULSEAUDIO" ] - } - } - if (use_cras) { - defines += [ "USE_CRAS" ] - } -} - -# Internal grouping of the configs necessary to support sub-folders having their -# own BUILD.gn files; only targets which roll up into the "media" target should -# include this config. I.e., not "test_support" or "unit_tests" targets. -# -# Without these configs having individual sub-folders take a //media/base DEP -# (or others) can yield incorrectly imported and exported symbols on Windows: -# -# fatal error LNK1169: one or more multiply defined symbols found. -# -config("subcomponent_config") { - visibility = media_subcomponent_deps - if (is_mac) { - visibility += [ "//media/base/mac" ] - } - defines = [ "IS_MEDIA_IMPL" ] - configs = [ - ":media_config", - "//build/config/compiler:wexit_time_destructors", - ] -} - -component("media") { - libs = [] - - deps = [ - "//base", - "//base:i18n", - "//base/third_party/dynamic_annotations", - "//cc/paint", - "//crypto:platform", - "//gpu/command_buffer/client:gles2_interface", - "//gpu/command_buffer/common", - "//third_party/libyuv", - "//ui/events:events_base", - "//ui/gfx", - "//ui/gfx/geometry", - "//ui/gl:gl", - "//url", - ] - - public_configs = [ "//third_party/libwebm:libwebm_config" ] - public_deps = media_subcomponent_deps - public_deps += [ - ":media_buildflags", - ":shared_memory_support", - "//ui/gfx:color_space", - ] - - # This must be included here since it actually depends on //media/base. - if (is_apple) { - public_deps += [ "//media/base/mac" ] - } - - if (use_ozone) { - deps += [ "//ui/ozone" ] - } -} - -# Note: This can't be a static_library since it does not have any sources. -source_set("test_support") { - testonly = true - public_deps = [ - ":media", - "//media/audio:test_support", - "//media/base:test_support", - "//media/base/android:test_support", - "//media/filters:test_support", - "//media/formats:test_support", - "//media/renderers:test_support", - "//media/video:test_support", - ] -} - -# Contains tests for all targets in the "media" folder. -# TODO(xhwang): Move mojo/capture/remoting tests here where applicable. -test("media_unittests") { - use_xvfb = use_xvfb_in_this_config - - deps = [ - "//media/audio:unit_tests", - "//media/base:unit_tests", - "//media/capabilities:unit_tests", - "//media/cast/receiver:unit_tests", - "//media/cdm:unit_tests", - "//media/device_monitors:unit_tests", - "//media/filters:unit_tests", - "//media/formats:unit_tests", - "//media/gpu:unit_tests", - "//media/learning:unit_tests", - "//media/mojo:unit_tests", - "//media/muxers:unit_tests", - "//media/parsers:unit_tests", - "//media/renderers:unit_tests", - "//media/test:pipeline_integration_tests", - "//media/test:run_all_unittests", - "//media/video:unit_tests", - "//media/webrtc:unit_tests", - ] - - data = [ - "test/data/", - "formats/mp4/h264_annex_b_fuzz_corpus/", - ] - - data_deps = [ "//testing/buildbot/filters:media_unittests_filters" ] - - if (media_use_ffmpeg) { - deps += [ "//media/ffmpeg:unit_tests" ] - } - - if (is_android) { - deps += [ - # The test needs the java dependencies to add the java classes for their - # native counterparts to the test apk. - "//gpu/command_buffer/service:android_texture_owner_unittests", - "//media/base/android:media_java", - "//media/base/android:unit_tests", - "//media/gpu:android_video_decode_accelerator_unittests", - "//ui/android:ui_java", - ] - } - - if (is_fuchsia) { - deps += [ - "//media/fuchsia/audio:unittests", - "//media/fuchsia/cdm/service:unittests", - ] - - additional_manifest_fragments = [ - "//build/config/fuchsia/test/audio_capabilities.test-cmx", - - # TODO(crbug.com/1185811): Figure out why - # PaintCanvasVideoRendererWithGLTest.CopyVideoFrameYUVDataToGLTexture - # crashes without "deprecated-ambient-replace-as-executable". - "//build/config/fuchsia/test/jit_capabilities.test-cmx", - - "//build/config/fuchsia/test/vulkan_capabilities.test-cmx", - ] - } - - if (enable_media_remoting) { - deps += [ "//media/remoting:media_remoting_tests" ] - } - - # The test needs OPUS_FIXED_POINT conditional define. - configs += [ "//third_party/opus:opus_config" ] -} - -test("media_perftests") { - configs += [ ":media_config" ] - deps = [ - ":test_support", - "//base/test:test_support", - "//media/base:perftests", - "//media/filters:perftests", - "//media/test:pipeline_integration_perftests", - "//testing/gmock", - "//testing/gtest", - "//testing/perf", - "//third_party/widevine/cdm:headers", - "//ui/gfx:test_support", - ] - if (media_use_ffmpeg) { - # Direct dependency required to inherit config. - deps += [ "//third_party/ffmpeg" ] - } - - # This target should not require the Chrome executable to run. - assert_no_deps = [ "//chrome" ] - - data = [ "test/data/" ] - - data_deps = [ - # Needed for isolate script to execute. - "//testing:run_perf_test", - ] -} - -# The audio subset of media_unittests. This target exists for running only the -# audio tests on the GPU bots (which have audio hardware). -test("audio_unittests") { - deps = [ - ":test_support", - "//base/test:test_support", - "//media/audio:unit_tests", - "//media/test:run_all_unittests", - ] - if (is_android) { - deps += [ - # The test needs the java dependencies to add the java classes for their - # native counterparts to the test apk. - "//media/base/android:media_java", - "//ui/android:ui_java", - ] - } -} - -# Note: Most external components should just depend on //media unless they -# specifically need this pared own target (NaCl, PPAPI, etc). Internal targets -# should just depend on //media/base which will propagate this target to them. -component("shared_memory_support") { - sources = [ - "base/audio_bus.cc", - "base/audio_bus.h", - "base/audio_latency.cc", - "base/audio_latency.h", - "base/audio_parameters.cc", - "base/audio_parameters.h", - "base/audio_point.cc", - "base/audio_point.h", - "base/audio_sample_types.h", - "base/channel_layout.cc", - "base/channel_layout.h", - "base/limits.h", - "base/media_shmem_export.h", - "base/sample_format.cc", - "base/sample_format.h", - "base/vector_math.cc", - "base/vector_math.h", - "base/vector_math_testing.h", - "base/video_types.cc", - "base/video_types.h", - ] - if (is_mac) { - # These need to be included here because audio_latency.cc depends on them. - sources += [ - "base/mac/audio_latency_mac.cc", - "base/mac/audio_latency_mac.h", - ] - } - - # Do not use "subcomponent_config" here since these files are in their own - # component target and thus can't share the standard export macros. - configs += [ ":media_config" ] - defines = [ "MEDIA_SHMEM_IMPLEMENTATION" ] - - if (!is_debug) { - configs -= [ "//build/config/compiler:default_optimization" ] - configs += [ "//build/config/compiler:optimize_max" ] - } - deps = [ - "//base", - "//build:chromeos_buildflags", - "//ui/gfx/geometry", - ] -} - -# TODO(watk): Refactor tests that could be made to run on Android. See -# http://crbug.com/570762 -if (media_use_ffmpeg && !is_android) { - test("ffmpeg_regression_tests") { - configs += [ "//media:media_config" ] - - deps = [ - ":test_support", - "//base/test:test_support", - "//media/ffmpeg:ffmpeg_regression_tests", - "//media/test:pipeline_integration_tests", - "//media/test:run_all_unittests", - "//testing/gmock", - "//testing/gtest", - "//ui/gfx:test_support", - "//ui/gfx/geometry", - ] - } -} - -if (proprietary_codecs) { - fuzzer_test("media_cenc_utils_fuzzer") { - sources = [ "cdm/cenc_utils_fuzzertest.cc" ] - deps = [ ":media" ] - } -} - -fuzzer_test("media_vp9_parser_fuzzer") { - sources = [ "filters/vp9_parser_fuzzertest.cc" ] - deps = [ - ":test_support", - "//base", - ] - libfuzzer_options = [ "max_len = 400000" ] -} - -fuzzer_test("media_vp9_parser_encrypted_fuzzer") { - sources = [ "filters/vp9_parser_encrypted_fuzzertest.cc" ] - deps = [ - ":test_support", - "//base", - "//base/test:test_support", - ] - seed_corpus = "//media/test/data" -} - -fuzzer_test("media_vpx_video_decoder_fuzzer") { - sources = [ "filters/vpx_video_decoder_fuzzertest.cc" ] - deps = [ - ":media", - "//base", - "//base/test:test_support", - ] - libfuzzer_options = [ "max_len = 400000" ] - seed_corpus = "//media/test/data" -} - -fuzzer_test("media_webm_muxer_fuzzer") { - sources = [ "muxers/webm_muxer_fuzzertest.cc" ] - deps = [ - ":media", - "//base", - "//third_party/libwebm", - ] -} - -fuzzer_test("cbcs_decryptor_fuzzer") { - sources = [ "cdm/cbcs_decryptor_fuzzer.cc" ] - deps = [ - ":media", - "//base", - "//crypto", - ] -} - -fuzzer_test("cenc_decryptor_fuzzer") { - sources = [ "cdm/cenc_decryptor_fuzzer.cc" ] - deps = [ - ":media", - "//base", - "//crypto", - ] -} - -fuzzer_test("json_web_key_fuzzer") { - sources = [ "cdm/json_web_key_fuzzer.cc" ] - deps = [ - ":media", - "//base", - ] -} - -if (proprietary_codecs) { - fuzzer_test("media_mp4_avcc_parser_fuzzer") { - sources = [ "formats/mp4/mp4_avcc_parser_fuzzer.cc" ] - deps = [ - ":media", - "//base", - ] - } - - fuzzer_test("media_mp4_box_reader_fuzzer") { - sources = [ "formats/mp4/mp4_box_reader_fuzzer.cc" ] - deps = [ - ":media", - "//base", - ] - libfuzzer_options = [ "max_len=500" ] - dict = "test/mp4.dict" - } -} - -if (enable_mse_mpeg2ts_stream_parser) { - fuzzer_test("media_es_parser_adts_fuzzer") { - sources = [ "formats/mp2t/es_parser_adts_fuzzer.cc" ] - deps = [ - ":media", - "//base", - ] - } - - fuzzer_test("media_es_parser_h264_fuzzer") { - sources = [ "formats/mp2t/es_parser_h264_fuzzer.cc" ] - deps = [ - ":media", - "//base", - ] - } - - fuzzer_test("media_es_parser_mpeg1audio_fuzzer") { - sources = [ "formats/mp2t/es_parser_mpeg1audio_fuzzer.cc" ] - deps = [ - ":media", - "//base", - ] - } -} diff --git a/third_party/khronos/DIR_METADATA b/third_party/khronos/DIR_METADATA new file mode 100644 index 000000000000..e353adfc5e67 --- /dev/null +++ b/third_party/khronos/DIR_METADATA @@ -0,0 +1,4 @@ +monorail: { + component: "Internals>GPU>Internals" +} +team_email: "graphics-dev@chromium.org" diff --git a/third_party/khronos/EGL/eglplatform.h b/third_party/khronos/EGL/eglplatform.h index cf2ce0c4c185..af5ef0c0e96b 100644 --- a/third_party/khronos/EGL/eglplatform.h +++ b/third_party/khronos/EGL/eglplatform.h @@ -102,8 +102,10 @@ typedef intptr_t EGLNativePixmapType; #elif defined(__unix__) /* X11 (tentative) */ -#include -#include +typedef unsigned long XID; +typedef XID Pixmap; +typedef XID Window; +typedef struct _XDisplay Display; typedef Display *EGLNativeDisplayType; typedef Pixmap EGLNativePixmapType; diff --git a/third_party/khronos/GLES2/gl2.h b/third_party/khronos/GLES2/gl2.h index 975c3dc495cd..e43cd5d3ed84 100644 --- a/third_party/khronos/GLES2/gl2.h +++ b/third_party/khronos/GLES2/gl2.h @@ -1,12 +1,12 @@ -#ifndef __gl2_h_ -#define __gl2_h_ 1 +#ifndef __gles2_gl2_h_ +#define __gles2_gl2_h_ 1 #ifdef __cplusplus extern "C" { #endif /* -** Copyright (c) 2013-2017 The Khronos Group Inc. +** Copyright (c) 2013-2018 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the @@ -44,7 +44,7 @@ extern "C" { #define GL_GLES_PROTOTYPES 1 #endif -/* Generated on date 20170325 */ +/* Generated on date 20190911 */ /* Generated C header for: * API: gles2 @@ -62,8 +62,8 @@ extern "C" { typedef khronos_int8_t GLbyte; typedef khronos_float_t GLclampf; typedef khronos_int32_t GLfixed; -typedef short GLshort; -typedef unsigned short GLushort; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; typedef void GLvoid; typedef struct __GLsync *GLsync; typedef khronos_int64_t GLint64; diff --git a/third_party/khronos/GLES2/gl2ext.h b/third_party/khronos/GLES2/gl2ext.h index a8c4a3ac5abb..3472b000661d 100644 --- a/third_party/khronos/GLES2/gl2ext.h +++ b/third_party/khronos/GLES2/gl2ext.h @@ -1,12 +1,12 @@ -#ifndef __gl2ext_h_ -#define __gl2ext_h_ 1 +#ifndef __gles2_gl2ext_h_ +#define __gles2_gl2ext_h_ 1 #ifdef __cplusplus extern "C" { #endif /* -** Copyright (c) 2013-2017 The Khronos Group Inc. +** Copyright (c) 2013-2018 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the @@ -38,7 +38,7 @@ extern "C" { #define GL_APIENTRYP GL_APIENTRY* #endif -/* Generated on date 20170325 */ +/* Generated on date 20190911 */ /* Generated C header for: * API: gles2 @@ -86,8 +86,7 @@ GL_APICALL void GL_APIENTRY glBlendBarrierKHR (void); #ifndef GL_KHR_debug #define GL_KHR_debug 1 -/* Chromium-specific drop const from last argument of GLDEBUGPROCKHR. */ -typedef void (GL_APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef void (GL_APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); /* Chromium-specific commented out GL_SAMPLER. */ //#define GL_SAMPLER 0x82E6 #define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 @@ -132,8 +131,7 @@ typedef void (GL_APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id, #define GL_STACK_UNDERFLOW_KHR 0x0504 typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -/* Chromium-specific drop const from last argument of GLDEBUGPROCKHR. */ -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, void *userParam); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam); typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void); @@ -162,6 +160,16 @@ GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, void **params); #define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 #endif /* GL_KHR_no_error */ +#ifndef GL_KHR_parallel_shader_compile +#define GL_KHR_parallel_shader_compile 1 +#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 +#define GL_COMPLETION_STATUS_KHR 0x91B1 +typedef void(GL_APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC)(GLuint count); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMaxShaderCompilerThreadsKHR(GLuint count); +#endif +#endif /* GL_KHR_parallel_shader_compile */ + #ifndef GL_KHR_robust_buffer_access_behavior #define GL_KHR_robust_buffer_access_behavior 1 #endif /* GL_KHR_robust_buffer_access_behavior */ @@ -190,6 +198,22 @@ GL_APICALL void GL_APIENTRY glGetnUniformuivKHR (GLuint program, GLint location, #endif #endif /* GL_KHR_robustness */ +#ifndef GL_KHR_shader_subgroup +#define GL_KHR_shader_subgroup 1 +#define GL_SUBGROUP_SIZE_KHR 0x9532 +#define GL_SUBGROUP_SUPPORTED_STAGES_KHR 0x9533 +#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534 +#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535 +#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001 +#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002 +#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004 +#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008 +#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010 +#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020 +#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040 +#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080 +#endif /* GL_KHR_shader_subgroup */ + #ifndef GL_KHR_texture_compression_astc_hdr #define GL_KHR_texture_compression_astc_hdr 1 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 @@ -327,12 +351,24 @@ GL_APICALL GLboolean GL_APIENTRY glIsEnablediOES (GLenum target, GLuint index); typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); +typedef void(GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC)( + GLenum mode, + const GLsizei* count, + GLenum type, + const void* const* indices, + GLsizei primcount, + const GLint* basevertex); #ifdef GL_GLEXT_PROTOTYPES GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexOES (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexOES (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); +GL_APICALL void GL_APIENTRY +glMultiDrawElementsBaseVertexEXT(GLenum mode, + const GLsizei* count, + GLenum type, + const void* const* indices, + GLsizei primcount, + const GLint* basevertex); #endif #endif /* GL_OES_draw_elements_base_vertex */ @@ -580,12 +616,10 @@ typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); - // Chromium-specific define to account for issues in gles2_conform_test // TODO (bajones): This symbol should be updated to the correct version in the // conformance test upstream and this hack removed. crbug.com/329708 #define PFNGLFRAMEBUFFERTEXTURE3DOES PFNGLFRAMEBUFFERTEXTURE3DOESPROC - #ifdef GL_GLEXT_PROTOTYPES GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); @@ -800,6 +834,47 @@ GL_APICALL void GL_APIENTRY glGetFloati_vOES (GLenum target, GLuint index, GLflo #define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE #endif /* GL_AMD_compressed_ATC_texture */ +#ifndef GL_AMD_framebuffer_multisample_advanced +#define GL_AMD_framebuffer_multisample_advanced 1 +#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 +#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 +#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 +#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 +#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 +#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 +typedef void(GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC)( + GLenum target, + GLsizei samples, + GLsizei storageSamples, + GLenum internalformat, + GLsizei width, + GLsizei height); +typedef void( + GL_APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC)( + GLuint renderbuffer, + GLsizei samples, + GLsizei storageSamples, + GLenum internalformat, + GLsizei width, + GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY +glRenderbufferStorageMultisampleAdvancedAMD(GLenum target, + GLsizei samples, + GLsizei storageSamples, + GLenum internalformat, + GLsizei width, + GLsizei height); +GL_APICALL void GL_APIENTRY +glNamedRenderbufferStorageMultisampleAdvancedAMD(GLuint renderbuffer, + GLsizei samples, + GLsizei storageSamples, + GLenum internalformat, + GLsizei width, + GLsizei height); +#endif +#endif /* GL_AMD_framebuffer_multisample_advanced */ + #ifndef GL_AMD_performance_monitor #define GL_AMD_performance_monitor 1 #define GL_COUNTER_TYPE_AMD 0x8BC0 @@ -1060,6 +1135,32 @@ GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei #define GL_SHADER_BINARY_DMP 0x9250 #endif /* GL_DMP_shader_binary */ +#ifndef GL_EXT_EGL_image_array +#define GL_EXT_EGL_image_array 1 +#endif /* GL_EXT_EGL_image_array */ + +#ifndef GL_EXT_EGL_image_storage +#define GL_EXT_EGL_image_storage 1 +typedef void(GL_APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC)( + GLenum target, + GLeglImageOES image, + const GLint* attrib_list); +typedef void(GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC)( + GLuint texture, + GLeglImageOES image, + const GLint* attrib_list); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY +glEGLImageTargetTexStorageEXT(GLenum target, + GLeglImageOES image, + const GLint* attrib_list); +GL_APICALL void GL_APIENTRY +glEGLImageTargetTextureStorageEXT(GLuint texture, + GLeglImageOES image, + const GLint* attrib_list); +#endif +#endif /* GL_EXT_EGL_image_storage */ + #ifndef GL_EXT_YUV_target #define GL_EXT_YUV_target 1 #define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 @@ -1131,6 +1232,20 @@ GL_APICALL void GL_APIENTRY glClearTexSubImageEXT (GLuint texture, GLint level, #endif #endif /* GL_EXT_clear_texture */ +#ifndef GL_EXT_clip_control +#define GL_EXT_clip_control 1 +#define GL_LOWER_LEFT_EXT 0x8CA1 +#define GL_UPPER_LEFT_EXT 0x8CA2 +#define GL_NEGATIVE_ONE_TO_ONE_EXT 0x935E +#define GL_ZERO_TO_ONE_EXT 0x935F +#define GL_CLIP_ORIGIN_EXT 0x935C +#define GL_CLIP_DEPTH_MODE_EXT 0x935D +typedef void(GL_APIENTRYP PFNGLCLIPCONTROLEXTPROC)(GLenum origin, GLenum depth); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glClipControlEXT(GLenum origin, GLenum depth); +#endif +#endif /* GL_EXT_clip_control */ + #ifndef GL_EXT_clip_cull_distance #define GL_EXT_clip_cull_distance 1 #define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 @@ -1201,6 +1316,11 @@ GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void); #endif #endif /* GL_EXT_debug_marker */ +#ifndef GL_EXT_depth_clamp +#define GL_EXT_depth_clamp 1 +#define GL_DEPTH_CLAMP_EXT 0x864F +#endif /* GL_EXT_depth_clamp */ + #ifndef GL_EXT_discard_framebuffer #define GL_EXT_discard_framebuffer 1 #define GL_COLOR_EXT 0x1800 @@ -1316,12 +1436,10 @@ GL_APICALL GLboolean GL_APIENTRY glIsEnablediEXT (GLenum target, GLuint index); typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); #ifdef GL_GLEXT_PROTOTYPES GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); #endif #endif /* GL_EXT_draw_elements_base_vertex */ @@ -1345,6 +1463,37 @@ GL_APICALL void GL_APIENTRY glDrawTransformFeedbackInstancedEXT (GLenum mode, GL #endif #endif /* GL_EXT_draw_transform_feedback */ +#ifndef GL_EXT_external_buffer +#define GL_EXT_external_buffer 1 +typedef void* GLeglClientBufferEXT; +typedef void(GL_APIENTRYP PFNGLBUFFERSTORAGEEXTERNALEXTPROC)( + GLenum target, + GLintptr offset, + GLsizeiptr size, + GLeglClientBufferEXT clientBuffer, + GLbitfield flags); +typedef void(GL_APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC)( + GLuint buffer, + GLintptr offset, + GLsizeiptr size, + GLeglClientBufferEXT clientBuffer, + GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY +glBufferStorageExternalEXT(GLenum target, + GLintptr offset, + GLsizeiptr size, + GLeglClientBufferEXT clientBuffer, + GLbitfield flags); +GL_APICALL void GL_APIENTRY +glNamedBufferStorageExternalEXT(GLuint buffer, + GLintptr offset, + GLsizeiptr size, + GLeglClientBufferEXT clientBuffer, + GLbitfield flags); +#endif +#endif /* GL_EXT_external_buffer */ + #ifndef GL_EXT_float_blend #define GL_EXT_float_blend 1 #endif /* GL_EXT_float_blend */ @@ -1423,6 +1572,259 @@ GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr #endif #endif /* GL_EXT_map_buffer_range */ +#ifndef GL_EXT_memory_object +#define GL_EXT_memory_object 1 +#define GL_TEXTURE_TILING_EXT 0x9580 +#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 +#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B +#define GL_NUM_TILING_TYPES_EXT 0x9582 +#define GL_TILING_TYPES_EXT 0x9583 +#define GL_OPTIMAL_TILING_EXT 0x9584 +#define GL_LINEAR_TILING_EXT 0x9585 +#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 +#define GL_DEVICE_UUID_EXT 0x9597 +#define GL_DRIVER_UUID_EXT 0x9598 +#define GL_UUID_SIZE_EXT 16 +typedef void(GL_APIENTRYP PFNGLGETUNSIGNEDBYTEVEXTPROC)(GLenum pname, + GLubyte* data); +typedef void(GL_APIENTRYP PFNGLGETUNSIGNEDBYTEI_VEXTPROC)(GLenum target, + GLuint index, + GLubyte* data); +typedef void(GL_APIENTRYP PFNGLDELETEMEMORYOBJECTSEXTPROC)( + GLsizei n, + const GLuint* memoryObjects); +typedef GLboolean(GL_APIENTRYP PFNGLISMEMORYOBJECTEXTPROC)(GLuint memoryObject); +typedef void(GL_APIENTRYP PFNGLCREATEMEMORYOBJECTSEXTPROC)( + GLsizei n, + GLuint* memoryObjects); +typedef void(GL_APIENTRYP PFNGLMEMORYOBJECTPARAMETERIVEXTPROC)( + GLuint memoryObject, + GLenum pname, + const GLint* params); +typedef void(GL_APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC)( + GLuint memoryObject, + GLenum pname, + GLint* params); +typedef void(GL_APIENTRYP PFNGLTEXSTORAGEMEM2DEXTPROC)(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC)( + GLenum target, + GLsizei samples, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLboolean fixedSampleLocations, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLTEXSTORAGEMEM3DEXTPROC)(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC)( + GLenum target, + GLsizei samples, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLboolean fixedSampleLocations, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLBUFFERSTORAGEMEMEXTPROC)(GLenum target, + GLsizeiptr size, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLTEXTURESTORAGEMEM2DEXTPROC)( + GLuint texture, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC)( + GLuint texture, + GLsizei samples, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLboolean fixedSampleLocations, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLTEXTURESTORAGEMEM3DEXTPROC)( + GLuint texture, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC)( + GLuint texture, + GLsizei samples, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLboolean fixedSampleLocations, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC)(GLuint buffer, + GLsizeiptr size, + GLuint memory, + GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetUnsignedBytevEXT(GLenum pname, GLubyte* data); +GL_APICALL void GL_APIENTRY glGetUnsignedBytei_vEXT(GLenum target, + GLuint index, + GLubyte* data); +GL_APICALL void GL_APIENTRY +glDeleteMemoryObjectsEXT(GLsizei n, const GLuint* memoryObjects); +GL_APICALL GLboolean GL_APIENTRY glIsMemoryObjectEXT(GLuint memoryObject); +GL_APICALL void GL_APIENTRY glCreateMemoryObjectsEXT(GLsizei n, + GLuint* memoryObjects); +GL_APICALL void GL_APIENTRY glMemoryObjectParameterivEXT(GLuint memoryObject, + GLenum pname, + const GLint* params); +GL_APICALL void GL_APIENTRY glGetMemoryObjectParameterivEXT(GLuint memoryObject, + GLenum pname, + GLint* params); +GL_APICALL void GL_APIENTRY glTexStorageMem2DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY +glTexStorageMem2DMultisampleEXT(GLenum target, + GLsizei samples, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLboolean fixedSampleLocations, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY glTexStorageMem3DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY +glTexStorageMem3DMultisampleEXT(GLenum target, + GLsizei samples, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLboolean fixedSampleLocations, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY glBufferStorageMemEXT(GLenum target, + GLsizeiptr size, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem2DEXT(GLuint texture, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY +glTextureStorageMem2DMultisampleEXT(GLuint texture, + GLsizei samples, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLboolean fixedSampleLocations, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem3DEXT(GLuint texture, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY +glTextureStorageMem3DMultisampleEXT(GLuint texture, + GLsizei samples, + GLenum internalFormat, + GLsizei width, + GLsizei height, + GLsizei depth, + GLboolean fixedSampleLocations, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY glNamedBufferStorageMemEXT(GLuint buffer, + GLsizeiptr size, + GLuint memory, + GLuint64 offset); +#endif +#endif /* GL_EXT_memory_object */ + +#ifndef GL_EXT_memory_object_fd +#define GL_EXT_memory_object_fd 1 +#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 +typedef void(GL_APIENTRYP PFNGLIMPORTMEMORYFDEXTPROC)(GLuint memory, + GLuint64 size, + GLenum handleType, + GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportMemoryFdEXT(GLuint memory, + GLuint64 size, + GLenum handleType, + GLint fd); +#endif +#endif /* GL_EXT_memory_object_fd */ + +#ifndef GL_EXT_memory_object_win32 +#define GL_EXT_memory_object_win32 1 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 +#define GL_DEVICE_LUID_EXT 0x9599 +#define GL_DEVICE_NODE_MASK_EXT 0x959A +#define GL_LUID_SIZE_EXT 8 +#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 +#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A +#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B +#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C +typedef void(GL_APIENTRYP PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC)( + GLuint memory, + GLuint64 size, + GLenum handleType, + void* handle); +typedef void(GL_APIENTRYP PFNGLIMPORTMEMORYWIN32NAMEEXTPROC)(GLuint memory, + GLuint64 size, + GLenum handleType, + const void* name); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportMemoryWin32HandleEXT(GLuint memory, + GLuint64 size, + GLenum handleType, + void* handle); +GL_APICALL void GL_APIENTRY glImportMemoryWin32NameEXT(GLuint memory, + GLuint64 size, + GLenum handleType, + const void* name); +#endif +#endif /* GL_EXT_memory_object_win32 */ + #ifndef GL_EXT_multi_draw_arrays #define GL_EXT_multi_draw_arrays 1 typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); @@ -1480,6 +1882,18 @@ GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLi #endif #endif /* GL_EXT_multiview_draw_buffers */ +#ifndef GL_EXT_multiview_tessellation_geometry_shader +#define GL_EXT_multiview_tessellation_geometry_shader 1 +#endif /* GL_EXT_multiview_tessellation_geometry_shader */ + +#ifndef GL_EXT_multiview_texture_multisample +#define GL_EXT_multiview_texture_multisample 1 +#endif /* GL_EXT_multiview_texture_multisample */ + +#ifndef GL_EXT_multiview_timer_query +#define GL_EXT_multiview_timer_query 1 +#endif /* GL_EXT_multiview_timer_query */ + #ifndef GL_EXT_occlusion_query_boolean #define GL_EXT_occlusion_query_boolean 1 #define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F @@ -1588,6 +2002,105 @@ GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #endif /* GL_EXT_sRGB_write_control */ +#ifndef GL_EXT_semaphore +#define GL_EXT_semaphore 1 +#define GL_LAYOUT_GENERAL_EXT 0x958D +#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E +#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F +#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 +#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 +#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 +#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 +#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 +#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 +typedef void(GL_APIENTRYP PFNGLGENSEMAPHORESEXTPROC)(GLsizei n, + GLuint* semaphores); +typedef void(GL_APIENTRYP PFNGLDELETESEMAPHORESEXTPROC)( + GLsizei n, + const GLuint* semaphores); +typedef GLboolean(GL_APIENTRYP PFNGLISSEMAPHOREEXTPROC)(GLuint semaphore); +typedef void(GL_APIENTRYP PFNGLSEMAPHOREPARAMETERUI64VEXTPROC)( + GLuint semaphore, + GLenum pname, + const GLuint64* params); +typedef void(GL_APIENTRYP PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC)( + GLuint semaphore, + GLenum pname, + GLuint64* params); +typedef void(GL_APIENTRYP PFNGLWAITSEMAPHOREEXTPROC)(GLuint semaphore, + GLuint numBufferBarriers, + const GLuint* buffers, + GLuint numTextureBarriers, + const GLuint* textures, + const GLenum* srcLayouts); +typedef void(GL_APIENTRYP PFNGLSIGNALSEMAPHOREEXTPROC)( + GLuint semaphore, + GLuint numBufferBarriers, + const GLuint* buffers, + GLuint numTextureBarriers, + const GLuint* textures, + const GLenum* dstLayouts); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGenSemaphoresEXT(GLsizei n, GLuint* semaphores); +GL_APICALL void GL_APIENTRY glDeleteSemaphoresEXT(GLsizei n, + const GLuint* semaphores); +GL_APICALL GLboolean GL_APIENTRY glIsSemaphoreEXT(GLuint semaphore); +GL_APICALL void GL_APIENTRY +glSemaphoreParameterui64vEXT(GLuint semaphore, + GLenum pname, + const GLuint64* params); +GL_APICALL void GL_APIENTRY glGetSemaphoreParameterui64vEXT(GLuint semaphore, + GLenum pname, + GLuint64* params); +GL_APICALL void GL_APIENTRY glWaitSemaphoreEXT(GLuint semaphore, + GLuint numBufferBarriers, + const GLuint* buffers, + GLuint numTextureBarriers, + const GLuint* textures, + const GLenum* srcLayouts); +GL_APICALL void GL_APIENTRY glSignalSemaphoreEXT(GLuint semaphore, + GLuint numBufferBarriers, + const GLuint* buffers, + GLuint numTextureBarriers, + const GLuint* textures, + const GLenum* dstLayouts); +#endif +#endif /* GL_EXT_semaphore */ + +#ifndef GL_EXT_semaphore_fd +#define GL_EXT_semaphore_fd 1 +typedef void(GL_APIENTRYP PFNGLIMPORTSEMAPHOREFDEXTPROC)(GLuint semaphore, + GLenum handleType, + GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportSemaphoreFdEXT(GLuint semaphore, + GLenum handleType, + GLint fd); +#endif +#endif /* GL_EXT_semaphore_fd */ + +#ifndef GL_EXT_semaphore_win32 +#define GL_EXT_semaphore_win32 1 +#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 +#define GL_D3D12_FENCE_VALUE_EXT 0x9595 +typedef void(GL_APIENTRYP PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC)( + GLuint semaphore, + GLenum handleType, + void* handle); +typedef void(GL_APIENTRYP PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC)( + GLuint semaphore, + GLenum handleType, + const void* name); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportSemaphoreWin32HandleEXT(GLuint semaphore, + GLenum handleType, + void* handle); +GL_APICALL void GL_APIENTRY glImportSemaphoreWin32NameEXT(GLuint semaphore, + GLenum handleType, + const void* name); +#endif +#endif /* GL_EXT_semaphore_win32 */ + #ifndef GL_EXT_separate_shader_objects #define GL_EXT_separate_shader_objects 1 #define GL_ACTIVE_PROGRAM_EXT 0x8259 @@ -1693,6 +2206,14 @@ GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLin #define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 #endif /* GL_EXT_shader_framebuffer_fetch */ +#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent +#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 +typedef void(GL_APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC)(void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierEXT(void); +#endif +#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ + #ifndef GL_EXT_shader_group_vote #define GL_EXT_shader_group_vote 1 #endif /* GL_EXT_shader_group_vote */ @@ -1880,18 +2401,42 @@ GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalf #define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 #endif /* GL_EXT_texture_compression_astc_decode_mode */ +#ifndef GL_EXT_texture_compression_bptc +#define GL_EXT_texture_compression_bptc 1 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F +#endif /* GL_EXT_texture_compression_bptc */ + #ifndef GL_EXT_texture_compression_dxt1 #define GL_EXT_texture_compression_dxt1 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 #endif /* GL_EXT_texture_compression_dxt1 */ +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif /* GL_EXT_texture_compression_rgtc */ + #ifndef GL_EXT_texture_compression_s3tc #define GL_EXT_texture_compression_s3tc 1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 #endif /* GL_EXT_texture_compression_s3tc */ +#ifndef GL_EXT_texture_compression_s3tc_srgb +#define GL_EXT_texture_compression_s3tc_srgb 1 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif /* GL_EXT_texture_compression_s3tc_srgb */ + #ifndef GL_EXT_texture_cube_map_array #define GL_EXT_texture_cube_map_array 1 #define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 @@ -1913,12 +2458,24 @@ GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalf #ifndef GL_EXT_texture_filter_minmax #define GL_EXT_texture_filter_minmax 1 +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 #endif /* GL_EXT_texture_filter_minmax */ #ifndef GL_EXT_texture_format_BGRA8888 #define GL_EXT_texture_format_BGRA8888 1 #endif /* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_sRGB_override +#define GL_EXT_texture_format_sRGB_override 1 +#define GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT 0x8FBF +#endif /* GL_EXT_texture_format_sRGB_override */ + +#ifndef GL_EXT_texture_mirror_clamp_to_edge +#define GL_EXT_texture_mirror_clamp_to_edge 1 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#endif /* GL_EXT_texture_mirror_clamp_to_edge */ + #ifndef GL_EXT_texture_norm16 #define GL_EXT_texture_norm16 1 #define GL_R16_EXT 0x822A @@ -1928,6 +2485,10 @@ GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalf #define GL_RGB16_SNORM_EXT 0x8F9A #endif /* GL_EXT_texture_norm16 */ +#ifndef GL_EXT_texture_query_lod +#define GL_EXT_texture_query_lod 1 +#endif /* GL_EXT_texture_query_lod */ + #ifndef GL_EXT_texture_rg #define GL_EXT_texture_rg 1 #define GL_RED_EXT 0x1903 @@ -1953,6 +2514,10 @@ GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalf #define GL_SKIP_DECODE_EXT 0x8A4A #endif /* GL_EXT_texture_sRGB_decode */ +#ifndef GL_EXT_texture_shadow_lod +#define GL_EXT_texture_shadow_lod 1 +#endif /* GL_EXT_texture_shadow_lod */ + #ifndef GL_EXT_texture_storage #define GL_EXT_texture_storage 1 #define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F @@ -2009,6 +2574,24 @@ GL_APICALL void GL_APIENTRY glTextureViewEXT (GLuint texture, GLenum target, GLu #define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 #endif /* GL_EXT_unpack_subimage */ +#ifndef GL_EXT_win32_keyed_mutex +#define GL_EXT_win32_keyed_mutex 1 +typedef GLboolean(GL_APIENTRYP PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC)( + GLuint memory, + GLuint64 key, + GLuint timeout); +typedef GLboolean(GL_APIENTRYP PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC)( + GLuint memory, + GLuint64 key); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLboolean GL_APIENTRY glAcquireKeyedMutexWin32EXT(GLuint memory, + GLuint64 key, + GLuint timeout); +GL_APICALL GLboolean GL_APIENTRY glReleaseKeyedMutexWin32EXT(GLuint memory, + GLuint64 key); +#endif +#endif /* GL_EXT_win32_keyed_mutex */ + #ifndef GL_EXT_window_rectangles #define GL_EXT_window_rectangles 1 #define GL_INCLUSIVE_EXT 0x8F10 @@ -2111,6 +2694,11 @@ GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, #define GL_CUBIC_MIPMAP_LINEAR_IMG 0x913B #endif /* GL_IMG_texture_filter_cubic */ +#ifndef GL_INTEL_blackhole_render +#define GL_INTEL_blackhole_render 1 +#define GL_BLACKHOLE_RENDER_INTEL 0x83FC +#endif /* GL_INTEL_blackhole_render */ + #ifndef GL_INTEL_conservative_rasterization #define GL_INTEL_conservative_rasterization 1 #define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE @@ -2153,7 +2741,11 @@ typedef void (GL_APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); typedef void (GL_APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); typedef void (GL_APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); typedef void (GL_APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +typedef void(GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC)(GLuint queryHandle, + GLuint flags, + GLsizei dataSize, + void* data, + GLuint* bytesWritten); typedef void (GL_APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); typedef void (GL_APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); #ifdef GL_GLEXT_PROTOTYPES @@ -2164,12 +2756,45 @@ GL_APICALL void GL_APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); GL_APICALL void GL_APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); GL_APICALL void GL_APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); GL_APICALL void GL_APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL(GLuint queryHandle, + GLuint flags, + GLsizei dataSize, + void* data, + GLuint* bytesWritten); GL_APICALL void GL_APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); #endif #endif /* GL_INTEL_performance_query */ +#ifndef GL_MESA_framebuffer_flip_y +#define GL_MESA_framebuffer_flip_y 1 +#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB +typedef void(GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIMESAPROC)(GLenum target, + GLenum pname, + GLint param); +typedef void(GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC)( + GLenum target, + GLenum pname, + GLint* params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferParameteriMESA(GLenum target, + GLenum pname, + GLint param); +GL_APICALL void GL_APIENTRY glGetFramebufferParameterivMESA(GLenum target, + GLenum pname, + GLint* params); +#endif +#endif /* GL_MESA_framebuffer_flip_y */ + +#ifndef GL_MESA_program_binary_formats +#define GL_MESA_program_binary_formats 1 +#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F +#endif /* GL_MESA_program_binary_formats */ + +#ifndef GL_MESA_shader_integer_functions +#define GL_MESA_shader_integer_functions 1 +#endif /* GL_MESA_shader_integer_functions */ + #ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers #define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 #endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ @@ -2270,6 +2895,31 @@ GL_APICALL void GL_APIENTRY glBlendBarrierNV (void); #define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 #endif /* GL_NV_blend_equation_advanced_coherent */ +#ifndef GL_NV_blend_minmax_factor +#define GL_NV_blend_minmax_factor 1 +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D +#endif /* GL_NV_blend_minmax_factor */ + +#ifndef GL_NV_clip_space_w_scaling +#define GL_NV_clip_space_w_scaling 1 +#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C +#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D +#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E +typedef void(GL_APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC)(GLuint index, + GLfloat xcoeff, + GLfloat ycoeff); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glViewportPositionWScaleNV(GLuint index, + GLfloat xcoeff, + GLfloat ycoeff); +#endif +#endif /* GL_NV_clip_space_w_scaling */ + +#ifndef GL_NV_compute_shader_derivatives +#define GL_NV_compute_shader_derivatives 1 +#endif /* GL_NV_compute_shader_derivatives */ + #ifndef GL_NV_conditional_render #define GL_NV_conditional_render 1 #define GL_QUERY_WAIT_NV 0x8E13 @@ -2296,6 +2946,11 @@ GL_APICALL void GL_APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybit #endif #endif /* GL_NV_conservative_raster */ +#ifndef GL_NV_conservative_raster_pre_snap +#define GL_NV_conservative_raster_pre_snap 1 +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 +#endif /* GL_NV_conservative_raster_pre_snap */ + #ifndef GL_NV_conservative_raster_pre_snap_triangles #define GL_NV_conservative_raster_pre_snap_triangles 1 #define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D @@ -2456,6 +3111,10 @@ GL_APICALL void GL_APIENTRY glFragmentCoverageColorNV (GLuint color); #endif #endif /* GL_NV_fragment_coverage_to_color */ +#ifndef GL_NV_fragment_shader_barycentric +#define GL_NV_fragment_shader_barycentric 1 +#endif /* GL_NV_fragment_shader_barycentric */ + #ifndef GL_NV_fragment_shader_interlock #define GL_NV_fragment_shader_interlock 1 #endif /* GL_NV_fragment_shader_interlock */ @@ -2641,6 +3300,137 @@ GL_APICALL void GL_APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum #endif #endif /* GL_NV_internalformat_sample_query */ +#ifndef GL_NV_memory_attachment +#define GL_NV_memory_attachment 1 +#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 +#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 +#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 +#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 +#define GL_MEMORY_ATTACHABLE_NV 0x95A8 +#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 +#define GL_DETACHED_TEXTURES_NV 0x95AA +#define GL_DETACHED_BUFFERS_NV 0x95AB +#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC +#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD +typedef void(GL_APIENTRYP PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC)( + GLuint memory, + GLenum pname, + GLint first, + GLsizei count, + GLuint* params); +typedef void(GL_APIENTRYP PFNGLRESETMEMORYOBJECTPARAMETERNVPROC)(GLuint memory, + GLenum pname); +typedef void(GL_APIENTRYP PFNGLTEXATTACHMEMORYNVPROC)(GLenum target, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLBUFFERATTACHMEMORYNVPROC)(GLenum target, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLTEXTUREATTACHMEMORYNVPROC)(GLuint texture, + GLuint memory, + GLuint64 offset); +typedef void(GL_APIENTRYP PFNGLNAMEDBUFFERATTACHMEMORYNVPROC)(GLuint buffer, + GLuint memory, + GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY +glGetMemoryObjectDetachedResourcesuivNV(GLuint memory, + GLenum pname, + GLint first, + GLsizei count, + GLuint* params); +GL_APICALL void GL_APIENTRY glResetMemoryObjectParameterNV(GLuint memory, + GLenum pname); +GL_APICALL void GL_APIENTRY glTexAttachMemoryNV(GLenum target, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY glBufferAttachMemoryNV(GLenum target, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureAttachMemoryNV(GLuint texture, + GLuint memory, + GLuint64 offset); +GL_APICALL void GL_APIENTRY glNamedBufferAttachMemoryNV(GLuint buffer, + GLuint memory, + GLuint64 offset); +#endif +#endif /* GL_NV_memory_attachment */ + +#ifndef GL_NV_mesh_shader +#define GL_NV_mesh_shader 1 +#define GL_MESH_SHADER_NV 0x9559 +#define GL_TASK_SHADER_NV 0x955A +#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60 +#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61 +#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62 +#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63 +#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64 +#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65 +#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66 +#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67 +#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68 +#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69 +#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A +#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B +#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C +#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D +#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E +#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F +#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2 +#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3 +#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536 +#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537 +#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538 +#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539 +#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A +#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D +#define GL_MAX_MESH_VIEWS_NV 0x9557 +#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF +#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543 +#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B +#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C +#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E +#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F +#define GL_MESH_VERTICES_OUT_NV 0x9579 +#define GL_MESH_PRIMITIVES_OUT_NV 0x957A +#define GL_MESH_OUTPUT_TYPE_NV 0x957B +#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D +#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0 +#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1 +#define GL_MESH_SHADER_BIT_NV 0x00000040 +#define GL_TASK_SHADER_BIT_NV 0x00000080 +#define GL_MESH_SUBROUTINE_NV 0x957C +#define GL_TASK_SUBROUTINE_NV 0x957D +#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E +#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F +typedef void(GL_APIENTRYP PFNGLDRAWMESHTASKSNVPROC)(GLuint first, GLuint count); +typedef void(GL_APIENTRYP PFNGLDRAWMESHTASKSINDIRECTNVPROC)(GLintptr indirect); +typedef void(GL_APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC)( + GLintptr indirect, + GLsizei drawcount, + GLsizei stride); +typedef void(GL_APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC)( + GLintptr indirect, + GLintptr drawcount, + GLsizei maxdrawcount, + GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawMeshTasksNV(GLuint first, GLuint count); +GL_APICALL void GL_APIENTRY glDrawMeshTasksIndirectNV(GLintptr indirect); +GL_APICALL void GL_APIENTRY glMultiDrawMeshTasksIndirectNV(GLintptr indirect, + GLsizei drawcount, + GLsizei stride); +GL_APICALL void GL_APIENTRY +glMultiDrawMeshTasksIndirectCountNV(GLintptr indirect, + GLintptr drawcount, + GLsizei maxdrawcount, + GLsizei stride); +#endif +#endif /* GL_NV_mesh_shader */ + #ifndef GL_NV_non_square_matrices #define GL_NV_non_square_matrices 1 #define GL_FLOAT_MAT2x3_NV 0x8B65 @@ -2667,6 +3457,7 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvNV (GLint location, GLsizei coun #ifndef GL_NV_path_rendering #define GL_NV_path_rendering 1 +typedef double GLdouble; #define GL_PATH_FORMAT_SVG_NV 0x9070 #define GL_PATH_FORMAT_PS_NV 0x9071 #define GL_STANDARD_FONT_NAME_NV 0x9072 @@ -2877,6 +3668,65 @@ typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathNa typedef GLenum (GL_APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); typedef void (GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); +typedef void(GL_APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC)(GLenum mode, + GLdouble left, + GLdouble right, + GLdouble bottom, + GLdouble top, + GLdouble zNear, + GLdouble zFar); +typedef void(GL_APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC)(GLenum mode); +typedef void(GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC)(GLenum mode, + const GLfloat* m); +typedef void(GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC)(GLenum mode, + const GLdouble* m); +typedef void(GL_APIENTRYP PFNGLMATRIXLOADFEXTPROC)(GLenum mode, + const GLfloat* m); +typedef void(GL_APIENTRYP PFNGLMATRIXLOADDEXTPROC)(GLenum mode, + const GLdouble* m); +typedef void(GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC)(GLenum mode, + const GLfloat* m); +typedef void(GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC)(GLenum mode, + const GLdouble* m); +typedef void(GL_APIENTRYP PFNGLMATRIXMULTFEXTPROC)(GLenum mode, + const GLfloat* m); +typedef void(GL_APIENTRYP PFNGLMATRIXMULTDEXTPROC)(GLenum mode, + const GLdouble* m); +typedef void(GL_APIENTRYP PFNGLMATRIXORTHOEXTPROC)(GLenum mode, + GLdouble left, + GLdouble right, + GLdouble bottom, + GLdouble top, + GLdouble zNear, + GLdouble zFar); +typedef void(GL_APIENTRYP PFNGLMATRIXPOPEXTPROC)(GLenum mode); +typedef void(GL_APIENTRYP PFNGLMATRIXPUSHEXTPROC)(GLenum mode); +typedef void(GL_APIENTRYP PFNGLMATRIXROTATEFEXTPROC)(GLenum mode, + GLfloat angle, + GLfloat x, + GLfloat y, + GLfloat z); +typedef void(GL_APIENTRYP PFNGLMATRIXROTATEDEXTPROC)(GLenum mode, + GLdouble angle, + GLdouble x, + GLdouble y, + GLdouble z); +typedef void(GL_APIENTRYP PFNGLMATRIXSCALEFEXTPROC)(GLenum mode, + GLfloat x, + GLfloat y, + GLfloat z); +typedef void(GL_APIENTRYP PFNGLMATRIXSCALEDEXTPROC)(GLenum mode, + GLdouble x, + GLdouble y, + GLdouble z); +typedef void(GL_APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC)(GLenum mode, + GLfloat x, + GLfloat y, + GLfloat z); +typedef void(GL_APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC)(GLenum mode, + GLdouble x, + GLdouble y, + GLdouble z); #ifdef GL_GLEXT_PROTOTYPES GL_APICALL GLuint GL_APIENTRY glGenPathsNV (GLsizei range); GL_APICALL void GL_APIENTRY glDeletePathsNV (GLuint path, GLsizei range); @@ -2935,6 +3785,58 @@ GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLe GL_APICALL GLenum GL_APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); +GL_APICALL void GL_APIENTRY glMatrixFrustumEXT(GLenum mode, + GLdouble left, + GLdouble right, + GLdouble bottom, + GLdouble top, + GLdouble zNear, + GLdouble zFar); +GL_APICALL void GL_APIENTRY glMatrixLoadIdentityEXT(GLenum mode); +GL_APICALL void GL_APIENTRY glMatrixLoadTransposefEXT(GLenum mode, + const GLfloat* m); +GL_APICALL void GL_APIENTRY glMatrixLoadTransposedEXT(GLenum mode, + const GLdouble* m); +GL_APICALL void GL_APIENTRY glMatrixLoadfEXT(GLenum mode, const GLfloat* m); +GL_APICALL void GL_APIENTRY glMatrixLoaddEXT(GLenum mode, const GLdouble* m); +GL_APICALL void GL_APIENTRY glMatrixMultTransposefEXT(GLenum mode, + const GLfloat* m); +GL_APICALL void GL_APIENTRY glMatrixMultTransposedEXT(GLenum mode, + const GLdouble* m); +GL_APICALL void GL_APIENTRY glMatrixMultfEXT(GLenum mode, const GLfloat* m); +GL_APICALL void GL_APIENTRY glMatrixMultdEXT(GLenum mode, const GLdouble* m); +GL_APICALL void GL_APIENTRY glMatrixOrthoEXT(GLenum mode, + GLdouble left, + GLdouble right, + GLdouble bottom, + GLdouble top, + GLdouble zNear, + GLdouble zFar); +GL_APICALL void GL_APIENTRY glMatrixPopEXT(GLenum mode); +GL_APICALL void GL_APIENTRY glMatrixPushEXT(GLenum mode); +GL_APICALL void GL_APIENTRY +glMatrixRotatefEXT(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glMatrixRotatedEXT(GLenum mode, + GLdouble angle, + GLdouble x, + GLdouble y, + GLdouble z); +GL_APICALL void GL_APIENTRY glMatrixScalefEXT(GLenum mode, + GLfloat x, + GLfloat y, + GLfloat z); +GL_APICALL void GL_APIENTRY glMatrixScaledEXT(GLenum mode, + GLdouble x, + GLdouble y, + GLdouble z); +GL_APICALL void GL_APIENTRY glMatrixTranslatefEXT(GLenum mode, + GLfloat x, + GLfloat y, + GLfloat z); +GL_APICALL void GL_APIENTRY glMatrixTranslatedEXT(GLenum mode, + GLdouble x, + GLdouble y, + GLdouble z); #endif #endif /* GL_NV_path_rendering */ @@ -2943,6 +3845,14 @@ GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum pro #define GL_SHARED_EDGE_NV 0xC0 #endif /* GL_NV_path_rendering_shared_edge */ +#ifndef GL_NV_pixel_buffer_object +#define GL_NV_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_NV 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF +#endif /* GL_NV_pixel_buffer_object */ + #ifndef GL_NV_polygon_mode #define GL_NV_polygon_mode 1 #define GL_POLYGON_MODE_NV 0x0B40 @@ -2982,6 +3892,11 @@ GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode); #define GL_NV_read_stencil 1 #endif /* GL_NV_read_stencil */ +#ifndef GL_NV_representative_fragment_test +#define GL_NV_representative_fragment_test 1 +#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F +#endif /* GL_NV_representative_fragment_test */ + #ifndef GL_NV_sRGB_formats #define GL_NV_sRGB_formats 1 #define GL_SLUMINANCE_NV 0x8C46 @@ -3020,6 +3935,28 @@ GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void); #define GL_NV_sample_mask_override_coverage 1 #endif /* GL_NV_sample_mask_override_coverage */ +#ifndef GL_NV_scissor_exclusive +#define GL_NV_scissor_exclusive 1 +#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555 +#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556 +typedef void(GL_APIENTRYP PFNGLSCISSOREXCLUSIVENVPROC)(GLint x, + GLint y, + GLsizei width, + GLsizei height); +typedef void(GL_APIENTRYP PFNGLSCISSOREXCLUSIVEARRAYVNVPROC)(GLuint first, + GLsizei count, + const GLint* v); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glScissorExclusiveNV(GLint x, + GLint y, + GLsizei width, + GLsizei height); +GL_APICALL void GL_APIENTRY glScissorExclusiveArrayvNV(GLuint first, + GLsizei count, + const GLint* v); +#endif +#endif /* GL_NV_scissor_exclusive */ + #ifndef GL_NV_shader_atomic_fp16_vector #define GL_NV_shader_atomic_fp16_vector 1 #endif /* GL_NV_shader_atomic_fp16_vector */ @@ -3028,6 +3965,82 @@ GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void); #define GL_NV_shader_noperspective_interpolation 1 #endif /* GL_NV_shader_noperspective_interpolation */ +#ifndef GL_NV_shader_subgroup_partitioned +#define GL_NV_shader_subgroup_partitioned 1 +#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100 +#endif /* GL_NV_shader_subgroup_partitioned */ + +#ifndef GL_NV_shader_texture_footprint +#define GL_NV_shader_texture_footprint 1 +#endif /* GL_NV_shader_texture_footprint */ + +#ifndef GL_NV_shading_rate_image +#define GL_NV_shading_rate_image 1 +#define GL_SHADING_RATE_IMAGE_NV 0x9563 +#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564 +#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565 +#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569 +#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A +#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B +#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C +#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D +#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E +#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F +#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B +#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C +#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D +#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E +#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F +#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE +#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF +#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0 +typedef void(GL_APIENTRYP PFNGLBINDSHADINGRATEIMAGENVPROC)(GLuint texture); +typedef void(GL_APIENTRYP PFNGLGETSHADINGRATEIMAGEPALETTENVPROC)( + GLuint viewport, + GLuint entry, + GLenum* rate); +typedef void(GL_APIENTRYP PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC)( + GLenum rate, + GLuint samples, + GLuint index, + GLint* location); +typedef void(GL_APIENTRYP PFNGLSHADINGRATEIMAGEBARRIERNVPROC)( + GLboolean synchronize); +typedef void(GL_APIENTRYP PFNGLSHADINGRATEIMAGEPALETTENVPROC)( + GLuint viewport, + GLuint first, + GLsizei count, + const GLenum* rates); +typedef void(GL_APIENTRYP PFNGLSHADINGRATESAMPLEORDERNVPROC)(GLenum order); +typedef void(GL_APIENTRYP PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC)( + GLenum rate, + GLuint samples, + const GLint* locations); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindShadingRateImageNV(GLuint texture); +GL_APICALL void GL_APIENTRY glGetShadingRateImagePaletteNV(GLuint viewport, + GLuint entry, + GLenum* rate); +GL_APICALL void GL_APIENTRY glGetShadingRateSampleLocationivNV(GLenum rate, + GLuint samples, + GLuint index, + GLint* location); +GL_APICALL void GL_APIENTRY glShadingRateImageBarrierNV(GLboolean synchronize); +GL_APICALL void GL_APIENTRY glShadingRateImagePaletteNV(GLuint viewport, + GLuint first, + GLsizei count, + const GLenum* rates); +GL_APICALL void GL_APIENTRY glShadingRateSampleOrderNV(GLenum order); +GL_APICALL void GL_APIENTRY +glShadingRateSampleOrderCustomNV(GLenum rate, + GLuint samples, + const GLint* locations); +#endif +#endif /* GL_NV_shading_rate_image */ + #ifndef GL_NV_shadow_samplers_array #define GL_NV_shadow_samplers_array 1 #define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 @@ -3038,6 +4051,10 @@ GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void); #define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 #endif /* GL_NV_shadow_samplers_cube */ +#ifndef GL_NV_stereo_view_rendering +#define GL_NV_stereo_view_rendering 1 +#endif /* GL_NV_stereo_view_rendering */ + #ifndef GL_NV_texture_border_clamp #define GL_NV_texture_border_clamp 1 #define GL_TEXTURE_BORDER_COLOR_NV 0x1004 @@ -3134,6 +4151,10 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureMultisampleMultiviewOVR (GLenum #endif #endif /* GL_OVR_multiview_multisampled_render_to_texture */ +#ifndef GL_QCOM_YUV_texture_gather +#define GL_QCOM_YUV_texture_gather 1 +#endif /* GL_QCOM_YUV_texture_gather */ + #ifndef GL_QCOM_alpha_test #define GL_QCOM_alpha_test 1 #define GL_ALPHA_TEST_QCOM 0x0BC0 @@ -3231,6 +4252,53 @@ GL_APICALL void GL_APIENTRY glFramebufferFoveationParametersQCOM (GLuint framebu #define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 #endif /* GL_QCOM_perfmon_global_mode */ +#ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent +#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 +#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 +typedef void(GL_APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC)(void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierQCOM(void); +#endif +#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ + +#ifndef GL_QCOM_shader_framebuffer_fetch_rate +#define GL_QCOM_shader_framebuffer_fetch_rate 1 +#endif /* GL_QCOM_shader_framebuffer_fetch_rate */ + +#ifndef GL_QCOM_texture_foveated +#define GL_QCOM_texture_foveated 1 +#define GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM 0x8BFB +#define GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM 0x8BFC +#define GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM 0x8BFD +#define GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM 0x8BFE +#define GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM 0x8BFF +typedef void(GL_APIENTRYP PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC)( + GLuint texture, + GLuint layer, + GLuint focalPoint, + GLfloat focalX, + GLfloat focalY, + GLfloat gainX, + GLfloat gainY, + GLfloat foveaArea); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTextureFoveationParametersQCOM(GLuint texture, + GLuint layer, + GLuint focalPoint, + GLfloat focalX, + GLfloat focalY, + GLfloat gainX, + GLfloat gainY, + GLfloat foveaArea); +#endif +#endif /* GL_QCOM_texture_foveated */ + +#ifndef GL_QCOM_texture_foveated_subsampled_layout +#define GL_QCOM_texture_foveated_subsampled_layout 1 +#define GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM 0x00000004 +#define GL_MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM 0x8FA1 +#endif /* GL_QCOM_texture_foveated_subsampled_layout */ + #ifndef GL_QCOM_tiled_rendering #define GL_QCOM_tiled_rendering 1 #define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 diff --git a/third_party/khronos/GLES3/gl3.h b/third_party/khronos/GLES3/gl3.h index 022a959a5387..532bbbd3e2e0 100644 --- a/third_party/khronos/GLES3/gl3.h +++ b/third_party/khronos/GLES3/gl3.h @@ -1,12 +1,12 @@ -#ifndef __gl3_h_ -#define __gl3_h_ 1 +#ifndef __gles2_gl3_h_ +#define __gles2_gl3_h_ 1 #ifdef __cplusplus extern "C" { #endif /* -** Copyright (c) 2013-2017 The Khronos Group Inc. +** Copyright (c) 2013-2018 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the @@ -44,7 +44,7 @@ extern "C" { #define GL_GLES_PROTOTYPES 1 #endif -/* Generated on date 20170325 */ +/* Generated on date 20180725 */ /* Generated C header for: * API: gles2 diff --git a/third_party/khronos/METADATA b/third_party/khronos/METADATA index 7dd40e8a94a1..aeddad32cb21 100644 --- a/third_party/khronos/METADATA +++ b/third_party/khronos/METADATA @@ -5,12 +5,12 @@ description: third_party { identifier { type: "ChromiumVersion" - value: "66.0.3359.203" # from https://chromereleases.googleblog.com/2018/05/stable-channel-update-for-chrome-os_31.html + value: "96.0.4664.219" # from https://chromereleases.googleblog.com/2022/08/long-term-support-channel-update-for_31.html } identifier { type: "Git" value: "https://chromium.googlesource.com/chromium/src.git" - version: "a5c45940a64a6a427a78537e1e3bb4b7d83b7180" + version: "6a496db5ef7219101beacceca9566367c9cb1a09" } identifier { type: "UpstreamSubdir" diff --git a/third_party/khronos/OWNERS b/third_party/khronos/OWNERS index 6f39d70c6bf9..84f82176d256 100644 --- a/third_party/khronos/OWNERS +++ b/third_party/khronos/OWNERS @@ -1,2 +1,2 @@ kbr@chromium.org -piman@chromium.org +zmo@chromium.org diff --git a/third_party/khronos/README.chromium b/third_party/khronos/README.chromium index aacd6744341b..775ab95696ec 100644 --- a/third_party/khronos/README.chromium +++ b/third_party/khronos/README.chromium @@ -2,7 +2,7 @@ Name: Khronos header files Short Name: khronos_headers URL: http://www.khronos.org/registry Version: unknown -GLES Date: 2017-04-01 +GLES Date: 2018-07-25 EGL Date: 2017-10-13 License: MIT/X11, SGI Free Software License B Security Critical: no @@ -32,6 +32,7 @@ GLES2/gl2ext.h EGL/eglplatform.h - Added EGLNative*Type for Mac. - Added EGLNative*Type for native linux framebuffers. + - Forward declare Xlib types instead of including Xlib headers. EGL/eglext.h - Added support for EGL_EXT_image_flush_external extension - Added support for EGL_ANGLE_stream_producer_d3d_texture diff --git a/third_party/musl/src/starboard/pthread/pthread.c b/third_party/musl/src/starboard/pthread/pthread.c index 0ba8cfef81a8..a6dce8a7fbdd 100644 --- a/third_party/musl/src/starboard/pthread/pthread.c +++ b/third_party/musl/src/starboard/pthread/pthread.c @@ -21,9 +21,10 @@ #include "starboard/common/log.h" #include "starboard/condition_variable.h" #include "starboard/mutex.h" +#include "starboard/once.h" #include "starboard/time.h" -int pthread_mutex_init(pthread_mutex_t *__restrict mutext, const pthread_mutexattr_t *__restrict) { +int pthread_mutex_init(pthread_mutex_t* mutext, const pthread_mutexattr_t*) { if (SbMutexCreate((SbMutex*)mutext->mutex_buffer)) { return 0; } @@ -43,7 +44,6 @@ int pthread_mutex_unlock(pthread_mutex_t* mutex) { return 0; } return EINVAL; - } int pthread_mutex_trylock(pthread_mutex_t* mutex) { @@ -59,30 +59,42 @@ int pthread_mutex_destroy(pthread_mutex_t* mutex) { return 0; } return EINVAL; - } -int pthread_cond_broadcast(pthread_cond_t * cond) { - return SbConditionVariableBroadcast((SbConditionVariable*)cond->cond_buffer)? 0: -1; +int pthread_cond_broadcast(pthread_cond_t* cond) { + return SbConditionVariableBroadcast((SbConditionVariable*)cond->cond_buffer) + ? 0 + : -1; } -int pthread_cond_destroy(pthread_cond_t * cond) { - return SbConditionVariableDestroy((SbConditionVariable*)cond->cond_buffer)? 0: -1; +int pthread_cond_destroy(pthread_cond_t* cond) { + return SbConditionVariableDestroy((SbConditionVariable*)cond->cond_buffer) + ? 0 + : -1; } -int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* attr) { - return SbConditionVariableCreate((SbConditionVariable*)cond->cond_buffer, NULL /* mutex */)? 0: -1; +int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* attr) { + return SbConditionVariableCreate((SbConditionVariable*)cond->cond_buffer, + NULL /* mutex */) + ? 0 + : -1; } -int pthread_cond_signal(pthread_cond_t* cond) { - return SbConditionVariableSignal((SbConditionVariable*)cond->cond_buffer)? 0: -1; +int pthread_cond_signal(pthread_cond_t* cond) { + return SbConditionVariableSignal((SbConditionVariable*)cond->cond_buffer) + ? 0 + : -1; } -int pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t* mutex, const struct timespec* t) { +int pthread_cond_timedwait(pthread_cond_t* cond, + pthread_mutex_t* mutex, + const struct timespec* t) { SbTimeMonotonic now = SbTimeGetMonotonicNow(); - int64_t timeout_duration_microsec = t->tv_sec * 1000000 + t->tv_nsec/1000; + int64_t timeout_duration_microsec = t->tv_sec * 1000000 + t->tv_nsec / 1000; timeout_duration_microsec -= now; - SbConditionVariableResult result = SbConditionVariableWaitTimed((SbConditionVariable*)cond->cond_buffer, (SbMutex*)mutex->mutex_buffer, timeout_duration_microsec); + SbConditionVariableResult result = SbConditionVariableWaitTimed( + (SbConditionVariable*)cond->cond_buffer, (SbMutex*)mutex->mutex_buffer, + timeout_duration_microsec); if (result == kSbConditionVariableSignaled) { return 0; } else if (result == kSbConditionVariableTimedOut) { @@ -91,36 +103,42 @@ int pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t* mutex, const return -1; } -int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex) { - SbConditionVariableResult result = SbConditionVariableWait((SbConditionVariable*)cond->cond_buffer, (SbMutex*)mutex->mutex_buffer); +int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex) { + SbConditionVariableResult result = SbConditionVariableWait( + (SbConditionVariable*)cond->cond_buffer, (SbMutex*)mutex->mutex_buffer); if (result == kSbConditionVariableSignaled) { return 0; } return -1; } -int pthread_condattr_destroy(pthread_condattr_t* attr) { +int pthread_condattr_destroy(pthread_condattr_t* attr) { // Not supported in Starboard 14/15 SB_DCHECK(false); return -1; } -int pthread_condattr_init(pthread_condattr_t* attr) { +int pthread_condattr_init(pthread_condattr_t* attr) { // Not supported in Starboard 14/15 SB_DCHECK(false); return -1; } -int pthread_condattr_getclock(const pthread_condattr_t* attr, clockid_t* clock_id) { +int pthread_condattr_getclock(const pthread_condattr_t* attr, + clockid_t* clock_id) { // Not supported in Starboard 14/15 SB_DCHECK(false); return -1; } -int pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id) { +int pthread_condattr_setclock(pthread_condattr_t* attr, clockid_t clock_id) { // Not supported in Starboard 14/15 SB_DCHECK(false); return -1; } -// + +int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)) { + return SbOnce((SbOnceControl*)once_control->once_buffer, init_routine) ? 0 + : -1; +} #endif // SB_API_VERSION < 16 diff --git a/third_party/musl/src/starboard/pthread/pthread.h b/third_party/musl/src/starboard/pthread/pthread.h index c01525ff2635..f606e48f64f4 100644 --- a/third_party/musl/src/starboard/pthread/pthread.h +++ b/third_party/musl/src/starboard/pthread/pthread.h @@ -44,7 +44,6 @@ typedef union pthread_mutex_t { void* ptr; } pthread_mutex_t; - // Max size of the native mutex attribute type. #define MUSL_PTHREAD_MUTEX_ATTR_MAX_SIZE 40 @@ -59,7 +58,6 @@ typedef union pthread_mutexattr_t { void* ptr; } pthread_mutexattr_t; - // Max size of the native key type. #define MUSL_PTHREAD_KEY_MAX_SIZE 40 @@ -68,13 +66,12 @@ typedef union pthread_mutexattr_t { typedef union pthread_key_t { // Reserved memory in which the implementation should map its // native key type. - uint8_t pthread_key_t[MUSL_PTHREAD_KEY_MAX_SIZE]; + uint8_t pthread_key[MUSL_PTHREAD_KEY_MAX_SIZE]; // Guarantees alignment of the type to a void pointer. void* ptr; } pthread_key_t; - #ifdef __cplusplus #define PTHREAD_COND_INITIALIZER \ {} @@ -105,7 +102,7 @@ typedef union pthread_cond_t { typedef union pthread_condattr_t { // Reserved memory in which the implementation should map its // native conditional attribute type. - uint8_t cond_buffer[MUSL_PTHREAD_COND_MAX_SIZE]; + uint8_t cond_buffer[MUSL_PTHREAD_COND_ATTR_MAX_SIZE]; // Guarantees alignment of the type to a void pointer. void* ptr; @@ -113,29 +110,56 @@ typedef union pthread_condattr_t { typedef int clockid_t; +// Max size of the pthread_once_t type. +#define MUSL_PTHREAD_ONCE_MAX_SIZE 64 + +// An opaque handle to a once control type with +// aligned at void pointer type. +typedef union pthread_once_t { + // Reserved memory in which the implementation should map its + // native once control variable type. + uint8_t once_buffer[MUSL_PTHREAD_ONCE_MAX_SIZE]; + + // Guarantees alignment of the type to a void pointer. + void* ptr; +} pthread_once_t; + +#ifdef __cplusplus +#define PTHREAD_ONCE_INIT \ + {} +#else +#define PTHREAD_ONCE_INIT \ + { 0 } +#endif + int pthread_mutex_destroy(pthread_mutex_t* mutex); -int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* mutex_attr); +int pthread_mutex_init(pthread_mutex_t* mutex, + const pthread_mutexattr_t* mutex_attr); int pthread_mutex_lock(pthread_mutex_t* mutex); int pthread_mutex_unlock(pthread_mutex_t* mutex); int pthread_mutex_trylock(pthread_mutex_t* mutex); int pthread_key_create(pthread_key_t* key, void (*)(void* dtor)); int pthread_key_delete(pthread_key_t key); -void *pthread_getspecific(pthread_key_t key); +void* pthread_getspecific(pthread_key_t key); int pthread_setspecific(pthread_key_t key, const void* value); -int pthread_cond_broadcast(pthread_cond_t * cond); -int pthread_cond_destroy(pthread_cond_t * cond); -int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* attr); -int pthread_cond_signal(pthread_cond_t* cond); -int pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t* mutex, const struct timespec* t); -int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex); +int pthread_cond_broadcast(pthread_cond_t* cond); +int pthread_cond_destroy(pthread_cond_t* cond); +int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* attr); +int pthread_cond_signal(pthread_cond_t* cond); +int pthread_cond_timedwait(pthread_cond_t* cond, + pthread_mutex_t* mutex, + const struct timespec* t); +int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex); int pthread_condattr_destroy(pthread_condattr_t* attr); -int pthread_condattr_getclock(const pthread_condattr_t* attr, clockid_t* clock_id); +int pthread_condattr_getclock(const pthread_condattr_t* attr, + clockid_t* clock_id); int pthread_condattr_init(pthread_condattr_t* attr); -int pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id); +int pthread_condattr_setclock(pthread_condattr_t* attr, clockid_t clock_id); +int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)); #ifdef __cplusplus } // extern "C" diff --git a/third_party/protobuf/src/google/protobuf/stubs/starboard_poem.h b/third_party/protobuf/src/google/protobuf/stubs/starboard_poem.h index 0f1d6a7760b2..9a68c588ad96 100644 --- a/third_party/protobuf/src/google/protobuf/stubs/starboard_poem.h +++ b/third_party/protobuf/src/google/protobuf/stubs/starboard_poem.h @@ -11,7 +11,3 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - -#ifdef STARBOARD -#include "starboard/memory.h" -#endif