Merge branch 'cloudflare:master' into master
This commit is contained in:
		
						commit
						582d496cc8
					
				|  | @ -4,7 +4,7 @@ jobs: | |||
|   check: | ||||
|     strategy: | ||||
|       matrix: | ||||
|         go-version: [1.20.x] | ||||
|         go-version: [1.21.x] | ||||
|         os: [ubuntu-latest, macos-latest, windows-latest] | ||||
|     runs-on: ${{ matrix.os }} | ||||
|     steps: | ||||
|  |  | |||
|  | @ -0,0 +1,8 @@ | |||
| # !/usr/bin/env bash | ||||
| 
 | ||||
| cd /tmp | ||||
| git clone -q https://github.com/cloudflare/go | ||||
| cd go/src | ||||
| # https://github.com/cloudflare/go/tree/34129e47042e214121b6bbff0ded4712debed18e is version go1.21.5-devel-cf | ||||
| git checkout -q 34129e47042e214121b6bbff0ded4712debed18e | ||||
| ./make.bash | ||||
|  | @ -143,7 +143,7 @@ if [[ ! -z "$CODE_SIGN_NAME" ]]; then | |||
|   codesign -s "${CODE_SIGN_NAME}" -f -v --timestamp --options runtime ${BINARY_NAME} | ||||
|    | ||||
|  # notarize the binary | ||||
|  # TODO: https://jira.cfdata.org/browse/TUN-5789 | ||||
|  # TODO: TUN-5789 | ||||
| fi | ||||
| 
 | ||||
| # creating build directory | ||||
|  | @ -169,7 +169,7 @@ if [[ ! -z "$PKG_SIGN_NAME" ]]; then | |||
|       ${PKGNAME} | ||||
| 
 | ||||
|       # notarize the package | ||||
|       # TODO: https://jira.cfdata.org/browse/TUN-5789 | ||||
|       # TODO: TUN-5789 | ||||
| else | ||||
|     pkgbuild --identifier com.cloudflare.${PRODUCT} \ | ||||
|       --version ${VERSION} \ | ||||
|  | @ -0,0 +1,10 @@ | |||
| rm -rf /tmp/go | ||||
| export GOCACHE=/tmp/gocache | ||||
| rm -rf $GOCACHE | ||||
| 
 | ||||
| ./.teamcity/install-cloudflare-go.sh | ||||
| 
 | ||||
| export PATH="/tmp/go/bin:$PATH" | ||||
| go version | ||||
| which go | ||||
| go env | ||||
|  | @ -1,26 +0,0 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| set -euo pipefail | ||||
| 
 | ||||
| if ! VERSION="$(git describe --tags --exact-match 2>/dev/null)" ; then | ||||
|     echo "Skipping public release for an untagged commit." | ||||
|     echo "##teamcity[buildStatus status='SUCCESS' text='Skipped due to lack of tag']" | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [[ "${HOMEBREW_GITHUB_API_TOKEN:-}" == "" ]] ; then | ||||
|     echo "Missing GITHUB_API_TOKEN" | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| # "install" Homebrew | ||||
| git clone https://github.com/Homebrew/brew tmp/homebrew | ||||
| eval "$(tmp/homebrew/bin/brew shellenv)" | ||||
| brew update --force --quiet | ||||
| chmod -R go-w "$(brew --prefix)/share/zsh" | ||||
| 
 | ||||
| git config --global user.name "cloudflare-warp-bot" | ||||
| git config --global user.email "warp-bot@cloudflare.com" | ||||
| 
 | ||||
| # bump formula pr | ||||
| brew bump-formula-pr cloudflared --version="$VERSION" --no-browse --no-audit | ||||
|  | @ -1,66 +0,0 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| set -euo pipefail | ||||
| 
 | ||||
| FILENAME="${PWD}/artifacts/cloudflared-darwin-amd64.tgz" | ||||
| if ! VERSION="$(git describe --tags --exact-match 2>/dev/null)" ; then | ||||
|     echo "Skipping public release for an untagged commit." | ||||
|     echo "##teamcity[buildStatus status='SUCCESS' text='Skipped due to lack of tag']" | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| if [[ ! -f "$FILENAME" ]] ; then | ||||
|     echo "Missing $FILENAME" | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| if [[ "${GITHUB_PRIVATE_KEY_B64:-}" == "" ]] ; then | ||||
|     echo "Missing GITHUB_PRIVATE_KEY_B64" | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| # upload to s3 bucket for use by Homebrew formula | ||||
| s3cmd \ | ||||
|     --acl-public --access_key="$AWS_ACCESS_KEY_ID" --secret_key="$AWS_SECRET_ACCESS_KEY" --host-bucket="%(bucket)s.s3.cfdata.org" \ | ||||
|     put "$FILENAME" "s3://cftunnel-docs/dl/cloudflared-$VERSION-darwin-amd64.tgz" | ||||
| s3cmd \ | ||||
|     --acl-public --access_key="$AWS_ACCESS_KEY_ID" --secret_key="$AWS_SECRET_ACCESS_KEY" --host-bucket="%(bucket)s.s3.cfdata.org" \ | ||||
|     cp "s3://cftunnel-docs/dl/cloudflared-$VERSION-darwin-amd64.tgz" "s3://cftunnel-docs/dl/cloudflared-stable-darwin-amd64.tgz" | ||||
| SHA256=$(sha256sum "$FILENAME" | cut -b1-64) | ||||
| 
 | ||||
| # set up git (note that UserKnownHostsFile is an absolute path so we can cd wherever) | ||||
| mkdir -p tmp | ||||
| ssh-keyscan -t rsa github.com > tmp/github.txt | ||||
| echo "$GITHUB_PRIVATE_KEY_B64" | base64 --decode > tmp/private.key | ||||
| chmod 0400 tmp/private.key | ||||
| export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=$PWD/tmp/github.txt -i $PWD/tmp/private.key -o IdentitiesOnly=yes" | ||||
| 
 | ||||
| # clone Homebrew repo into tmp/homebrew-cloudflare | ||||
| git clone git@github.com:cloudflare/homebrew-cloudflare.git tmp/homebrew-cloudflare     | ||||
| cd tmp/homebrew-cloudflare | ||||
| git checkout -f master | ||||
| git reset --hard origin/master | ||||
| 
 | ||||
| # modify cloudflared.rb | ||||
| URL="https://packages.argotunnel.com/dl/cloudflared-$VERSION-darwin-amd64.tgz" | ||||
| tee cloudflared.rb <<EOF | ||||
| class Cloudflared < Formula | ||||
|   desc 'Cloudflare Tunnel' | ||||
|   homepage 'https://developers.cloudflare.com/cloudflare-one/connections/connect-apps' | ||||
|   url '$URL' | ||||
|   sha256 '$SHA256' | ||||
|   version '$VERSION' | ||||
|   def install | ||||
|     bin.install 'cloudflared' | ||||
|   end | ||||
| end | ||||
| EOF | ||||
| 
 | ||||
| # push cloudflared.rb | ||||
| git add cloudflared.rb | ||||
| git diff | ||||
| git config user.name "cloudflare-warp-bot" | ||||
| git config user.email "warp-bot@cloudflare.com" | ||||
| git commit -m "Release Cloudflare Tunnel $VERSION" | ||||
| 
 | ||||
| git push -v origin master | ||||
|  | @ -0,0 +1,28 @@ | |||
| Set-StrictMode -Version Latest | ||||
| $ErrorActionPreference = "Stop" | ||||
| $ProgressPreference = "SilentlyContinue" | ||||
| 
 | ||||
| # Relative path to working directory | ||||
| $CloudflaredDirectory = "go\src\github.com\cloudflare\cloudflared" | ||||
| 
 | ||||
| cd $CloudflaredDirectory | ||||
| 
 | ||||
| Write-Output "Building for amd64" | ||||
| $env:TARGET_OS = "windows" | ||||
| $env:CGO_ENABLED = 1 | ||||
| $env:TARGET_ARCH = "amd64" | ||||
| $env:Path = "$Env:Temp\go\bin;$($env:Path)" | ||||
| 
 | ||||
| go env | ||||
| go version | ||||
| 
 | ||||
| & make cloudflared | ||||
| if ($LASTEXITCODE -ne 0) { throw "Failed to build cloudflared for amd64" } | ||||
| copy .\cloudflared.exe .\cloudflared-windows-amd64.exe | ||||
| 
 | ||||
| Write-Output "Building for 386" | ||||
| $env:CGO_ENABLED = 0 | ||||
| $env:TARGET_ARCH = "386" | ||||
| make cloudflared | ||||
| if ($LASTEXITCODE -ne 0) { throw "Failed to build cloudflared for 386" } | ||||
| copy .\cloudflared.exe .\cloudflared-windows-386.exe | ||||
|  | @ -0,0 +1,82 @@ | |||
| Set-StrictMode -Version Latest | ||||
| $ErrorActionPreference = "Stop" | ||||
| $ProgressPreference = "SilentlyContinue" | ||||
| 
 | ||||
| $WorkingDirectory = Get-Location | ||||
| $CloudflaredDirectory = "$WorkingDirectory\go\src\github.com\cloudflare\cloudflared" | ||||
| 
 | ||||
| Write-Output "Installing python..." | ||||
| 
 | ||||
| $PythonVersion = "3.10.11" | ||||
| $PythonZipFile = "$env:Temp\python-$PythonVersion-embed-amd64.zip" | ||||
| $PipInstallFile = "$env:Temp\get-pip.py" | ||||
| $PythonZipUrl = "https://www.python.org/ftp/python/$PythonVersion/python-$PythonVersion-embed-amd64.zip" | ||||
| $PythonPath = "$WorkingDirectory\Python" | ||||
| $PythonBinPath = "$PythonPath\python.exe" | ||||
| 
 | ||||
| # Download Python zip file | ||||
| Invoke-WebRequest -Uri $PythonZipUrl -OutFile $PythonZipFile | ||||
| 
 | ||||
| # Download Python pip file | ||||
| Invoke-WebRequest -Uri "https://bootstrap.pypa.io/get-pip.py" -OutFile $PipInstallFile | ||||
| 
 | ||||
| # Extract Python files | ||||
| Expand-Archive $PythonZipFile -DestinationPath $PythonPath -Force | ||||
| 
 | ||||
| # Add Python to PATH | ||||
| $env:Path = "$PythonPath\Scripts;$PythonPath;$($env:Path)" | ||||
| 
 | ||||
| Write-Output "Installed to $PythonPath" | ||||
| 
 | ||||
| # Install pip | ||||
| & $PythonBinPath $PipInstallFile | ||||
| 
 | ||||
| # Add package paths in pythonXX._pth to unblock python -m pip | ||||
| $PythonImportPathFile = "$PythonPath\python310._pth" | ||||
| $ComponentTestsDir = "$CloudflaredDirectory\component-tests\" | ||||
| @($ComponentTestsDir, "Lib\site-packages", $(Get-Content $PythonImportPathFile)) | Set-Content $PythonImportPathFile | ||||
| 
 | ||||
| # Test Python installation | ||||
| & $PythonBinPath --version | ||||
| & $PythonBinPath -m pip --version | ||||
| 
 | ||||
| go env | ||||
| go version | ||||
| 
 | ||||
| $env:TARGET_OS = "windows" | ||||
| $env:CGO_ENABLED = 1 | ||||
| $env:TARGET_ARCH = "amd64" | ||||
| $env:Path = "$Env:Temp\go\bin;$($env:Path)" | ||||
| 
 | ||||
| & $PythonBinPath --version | ||||
| & $PythonBinPath -m pip --version | ||||
| 
 | ||||
| cd $CloudflaredDirectory | ||||
| 
 | ||||
| go env | ||||
| go version | ||||
| 
 | ||||
| Write-Output "Building cloudflared" | ||||
| 
 | ||||
| & make cloudflared | ||||
| if ($LASTEXITCODE -ne 0) { throw "Failed to build cloudflared" } | ||||
| 
 | ||||
| echo $LASTEXITCODE | ||||
| 
 | ||||
| Write-Output "Running unit tests" | ||||
| 
 | ||||
| # Not testing with race detector because of https://github.com/golang/go/issues/61058 | ||||
| # We already test it on other platforms | ||||
| & go test -failfast -mod=vendor ./... | ||||
| if ($LASTEXITCODE -ne 0) { throw "Failed unit tests" } | ||||
| 
 | ||||
| Write-Output "Running component tests" | ||||
| 
 | ||||
| & $PythonBinPath -m pip install --upgrade -r component-tests/requirements.txt | ||||
| & $PythonBinPath component-tests/setup.py --type create | ||||
| & $PythonBinPath -m pytest component-tests -o log_cli=true --log-cli-level=INFO | ||||
| if ($LASTEXITCODE -ne 0) { | ||||
|     & $PythonBinPath component-tests/setup.py --type cleanup | ||||
|     throw "Failed component tests" | ||||
| } | ||||
| & $PythonBinPath component-tests/setup.py --type cleanup | ||||
|  | @ -0,0 +1,16 @@ | |||
| Set-StrictMode -Version Latest | ||||
| $ErrorActionPreference = "Stop" | ||||
| $ProgressPreference = "SilentlyContinue" | ||||
| 
 | ||||
| Write-Output "Downloading cloudflare go..." | ||||
| 
 | ||||
| Set-Location "$Env:Temp" | ||||
| 
 | ||||
| git clone -q https://github.com/cloudflare/go | ||||
| Write-Output "Building go..." | ||||
| cd go/src | ||||
| # https://github.com/cloudflare/go/tree/34129e47042e214121b6bbff0ded4712debed18e is version go1.21.5-devel-cf | ||||
| git checkout -q 34129e47042e214121b6bbff0ded4712debed18e | ||||
| & ./make.bat | ||||
| 
 | ||||
| Write-Output "Installed" | ||||
|  | @ -0,0 +1,20 @@ | |||
| $ErrorActionPreference = "Stop" | ||||
| $ProgressPreference = "SilentlyContinue" | ||||
| $GoMsiVersion = "go1.21.5.windows-amd64.msi" | ||||
|   | ||||
| Write-Output "Downloading go installer..." | ||||
|   | ||||
| Set-Location "$Env:Temp" | ||||
|   | ||||
| (New-Object System.Net.WebClient).DownloadFile( | ||||
|     "https://go.dev/dl/$GoMsiVersion", | ||||
|     "$Env:Temp\$GoMsiVersion" | ||||
| ) | ||||
|   | ||||
| Write-Output "Installing go..." | ||||
| Install-Package "$Env:Temp\$GoMsiVersion" -Force | ||||
|   | ||||
| # Go installer updates global $PATH | ||||
| go env | ||||
|   | ||||
| Write-Output "Installed" | ||||
|  | @ -1,19 +1,21 @@ | |||
| # use a builder image for building cloudflare | ||||
| ARG TARGET_GOOS | ||||
| ARG TARGET_GOARCH | ||||
| FROM golang:1.20.6 as builder | ||||
| FROM golang:1.21.5 as builder | ||||
| ENV GO111MODULE=on \ | ||||
|     CGO_ENABLED=0 \ | ||||
|     TARGET_GOOS=${TARGET_GOOS} \ | ||||
|     TARGET_GOARCH=${TARGET_GOARCH} | ||||
|      | ||||
| 
 | ||||
| WORKDIR /go/src/github.com/cloudflare/cloudflared/ | ||||
| 
 | ||||
| # copy our sources into the builder image | ||||
| COPY . . | ||||
| 
 | ||||
| RUN .teamcity/install-cloudflare-go.sh | ||||
| 
 | ||||
| # compile cloudflared | ||||
| RUN make cloudflared | ||||
| RUN PATH="/tmp/go/bin:$PATH" make cloudflared | ||||
| 
 | ||||
| # use a distroless base image with glibc | ||||
| FROM gcr.io/distroless/base-debian11:nonroot | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| # use a builder image for building cloudflare | ||||
| FROM golang:1.20.6 as builder | ||||
| FROM golang:1.21.5 as builder | ||||
| ENV GO111MODULE=on \ | ||||
|     CGO_ENABLED=0  | ||||
|      | ||||
|  | @ -8,8 +8,10 @@ WORKDIR /go/src/github.com/cloudflare/cloudflared/ | |||
| # copy our sources into the builder image | ||||
| COPY . . | ||||
| 
 | ||||
| RUN .teamcity/install-cloudflare-go.sh | ||||
| 
 | ||||
| # compile cloudflared | ||||
| RUN GOOS=linux GOARCH=amd64 make cloudflared | ||||
| RUN GOOS=linux GOARCH=amd64 PATH="/tmp/go/bin:$PATH" make cloudflared | ||||
| 
 | ||||
| # use a distroless base image with glibc | ||||
| FROM gcr.io/distroless/base-debian11:nonroot | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| # use a builder image for building cloudflare | ||||
| FROM golang:1.20.6 as builder | ||||
| FROM golang:1.21.5 as builder | ||||
| ENV GO111MODULE=on \ | ||||
|     CGO_ENABLED=0  | ||||
|      | ||||
|  | @ -8,8 +8,10 @@ WORKDIR /go/src/github.com/cloudflare/cloudflared/ | |||
| # copy our sources into the builder image | ||||
| COPY . . | ||||
| 
 | ||||
| RUN .teamcity/install-cloudflare-go.sh | ||||
| 
 | ||||
| # compile cloudflared | ||||
| RUN GOOS=linux GOARCH=arm64 make cloudflared | ||||
| RUN GOOS=linux GOARCH=arm64 PATH="/tmp/go/bin:$PATH" make cloudflared | ||||
| 
 | ||||
| # use a distroless base image with glibc | ||||
| FROM gcr.io/distroless/base-debian11:nonroot-arm64 | ||||
|  |  | |||
							
								
								
									
										29
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										29
									
								
								Makefile
								
								
								
								
							|  | @ -1,3 +1,6 @@ | |||
| # The targets cannot be run in parallel
 | ||||
| .NOTPARALLEL: | ||||
| 
 | ||||
| VERSION       := $(shell git describe --tags --always --match "[0-9][0-9][0-9][0-9].*.*") | ||||
| MSI_VERSION   := $(shell git tag -l --sort=v:refname | grep "w" | tail -1 | cut -c2-) | ||||
| #MSI_VERSION expects the format of the tag to be: (wX.X.X). Starts with the w character to not break cfsetup.
 | ||||
|  | @ -49,6 +52,8 @@ PACKAGE_DIR    := $(CURDIR)/packaging | |||
| PREFIX         := /usr | ||||
| INSTALL_BINDIR := $(PREFIX)/bin/ | ||||
| INSTALL_MANDIR := $(PREFIX)/share/man/man1/ | ||||
| CF_GO_PATH     := /tmp/go | ||||
| PATH           := $(CF_GO_PATH)/bin:$(PATH) | ||||
| 
 | ||||
| LOCAL_ARCH ?= $(shell uname -m) | ||||
| ifneq ($(GOARCH),) | ||||
|  | @ -126,7 +131,7 @@ ifeq ($(FIPS), true) | |||
| 	$(info Building cloudflared with go-fips) | ||||
| 	cp -f fips/fips.go.linux-amd64 cmd/cloudflared/fips.go | ||||
| endif | ||||
| 	GOOS=$(TARGET_OS) GOARCH=$(TARGET_ARCH) $(ARM_COMMAND) go build -v -mod=vendor $(GO_BUILD_TAGS) $(LDFLAGS) $(IMPORT_PATH)/cmd/cloudflared | ||||
| 	GOOS=$(TARGET_OS) GOARCH=$(TARGET_ARCH) $(ARM_COMMAND) go build -mod=vendor $(GO_BUILD_TAGS) $(LDFLAGS) $(IMPORT_PATH)/cmd/cloudflared | ||||
| ifeq ($(FIPS), true) | ||||
| 	rm -f cmd/cloudflared/fips.go | ||||
| 	./check-fips.sh cloudflared | ||||
|  | @ -164,10 +169,19 @@ cover: | |||
| test-ssh-server: | ||||
| 	docker-compose -f ssh_server_tests/docker-compose.yml up | ||||
| 
 | ||||
| .PHONY: install-go | ||||
| install-go: | ||||
| 	rm -rf ${CF_GO_PATH} | ||||
| 	./.teamcity/install-cloudflare-go.sh | ||||
| 
 | ||||
| .PHONY: cleanup-go | ||||
| cleanup-go: | ||||
| 	rm -rf ${CF_GO_PATH} | ||||
| 
 | ||||
| cloudflared.1: cloudflared_man_template | ||||
| 	sed -e 's/\$${VERSION}/$(VERSION)/; s/\$${DATE}/$(DATE)/' cloudflared_man_template > cloudflared.1 | ||||
| 
 | ||||
| install: cloudflared cloudflared.1 | ||||
| install: install-go cloudflared cloudflared.1 cleanup-go | ||||
| 	mkdir -p $(DESTDIR)$(INSTALL_BINDIR) $(DESTDIR)$(INSTALL_MANDIR) | ||||
| 	install -m755 cloudflared $(DESTDIR)$(INSTALL_BINDIR)/cloudflared | ||||
| 	install -m644 cloudflared.1 $(DESTDIR)$(INSTALL_MANDIR)/cloudflared.1 | ||||
|  | @ -209,15 +223,6 @@ cloudflared-darwin-amd64.tgz: cloudflared | |||
| 	tar czf cloudflared-darwin-amd64.tgz cloudflared | ||||
| 	rm cloudflared | ||||
| 
 | ||||
| .PHONY: homebrew-upload | ||||
| homebrew-upload: cloudflared-darwin-amd64.tgz | ||||
| 	aws s3 --endpoint-url $(S3_ENDPOINT) cp --acl public-read $$^ $(S3_URI)/cloudflared-$$(VERSION)-$1.tgz | ||||
| 	aws s3 --endpoint-url $(S3_ENDPOINT) cp --acl public-read $(S3_URI)/cloudflared-$$(VERSION)-$1.tgz  $(S3_URI)/cloudflared-stable-$1.tgz | ||||
| 
 | ||||
| .PHONY: homebrew-release | ||||
| homebrew-release: homebrew-upload | ||||
| 	./publish-homebrew-formula.sh cloudflared-darwin-amd64.tgz $(VERSION) homebrew-cloudflare | ||||
| 
 | ||||
| .PHONY: github-release | ||||
| github-release: cloudflared | ||||
| 	python3 github_release.py --path $(EXECUTABLE_PATH) --release-version $(VERSION) | ||||
|  | @ -260,7 +265,7 @@ quic-deps: | |||
| 
 | ||||
| .PHONY: vet | ||||
| vet: | ||||
| 	go vet -v -mod=vendor github.com/cloudflare/cloudflared/... | ||||
| 	go vet -mod=vendor github.com/cloudflare/cloudflared/... | ||||
| 
 | ||||
| .PHONY: fmt | ||||
| fmt: | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ Downloads are available as standalone binaries, a Docker image, and Debian, RPM, | |||
| * Binaries, Debian, and RPM packages for Linux [can be found here](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation#linux) | ||||
| * A Docker image of `cloudflared` is [available on DockerHub](https://hub.docker.com/r/cloudflare/cloudflared) | ||||
| * You can install on Windows machines with the [steps here](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation#windows) | ||||
| * Build from source with the [instructions here](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation#build-from-source) | ||||
| * To build from source, first you need to download the go toolchain by running `./.teamcity/install-cloudflare-go.sh` and follow the output. Then you can run `make cloudflared` | ||||
| 
 | ||||
| User documentation for Cloudflare Tunnel can be found at https://developers.cloudflare.com/cloudflare-one/connections/connect-apps | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,3 +1,36 @@ | |||
| 2024.1.2 | ||||
| - 2024-01-11 TUN-8147: Disable ECN usage due to bugs in detecting if supported | ||||
| - 2024-01-11 TUN-8146: Fix export path for install-go command | ||||
| - 2024-01-11 TUN-8146: Fix Makefile targets should not be run in parallel and install-go script was missing shebang | ||||
| - 2024-01-10 TUN-8140: Remove homebrew scripts | ||||
| 
 | ||||
| 2024.1.1 | ||||
| - 2024-01-10 TUN-8134: Revert installed prefix to /usr | ||||
| - 2024-01-09 TUN-8130: Fix path to install go for mac build | ||||
| - 2024-01-09 TUN-8129: Use the same build command between branch and release builds | ||||
| - 2024-01-09 TUN-8130: Install go tool chain in /tmp on build agents | ||||
| - 2024-01-09 TUN-8134: Install cloudflare go as part of make install | ||||
| - 2024-01-08 TUN-8118: Disable FIPS module to build with go-boring without CGO_ENABLED | ||||
| 
 | ||||
| 2024.1.0 | ||||
| - 2024-01-01 TUN-7934: Update quic-go to a version that queues datagrams for better throughput and drops large datagram | ||||
| - 2023-12-20 TUN-8072: Need to set GOCACHE in mac go installation script | ||||
| - 2023-12-17 TUN-8072: Add script to download cloudflare go for Mac build agents | ||||
| - 2023-12-15 Fix nil pointer dereference segfault when passing "null" config json to cloudflared tunnel ingress validate (#1070) | ||||
| - 2023-12-15 configuration.go: fix developerPortal link (#960) | ||||
| - 2023-12-14 tunnelrpc/pogs: fix dropped test errors (#1106) | ||||
| - 2023-12-14 cmd/cloudflared/updater: fix dropped error (#1055) | ||||
| - 2023-12-14 use os.Executable to discover the path to cloudflared (#1040) | ||||
| - 2023-12-14 Remove extraneous `period` from Path Environment Variable (#1009) | ||||
| - 2023-12-14 Use CLI context when running tunnel (#597) | ||||
| - 2023-12-14 TUN-8066: Define scripts to build on Windows agents | ||||
| - 2023-12-11 TUN-8052: Update go to 1.21.5 | ||||
| - 2023-12-07 TUN-7970: Default to enable post quantum encryption for quic transport | ||||
| - 2023-12-04 TUN-8006: Update quic-go to latest upstream | ||||
| - 2023-11-15 VULN-44842 Add a flag that allows users to not send the Access JWT to stdout | ||||
| - 2023-11-13 TUN-7965: Remove legacy incident status page check | ||||
| - 2023-11-13 AUTH-5682 Org token flow in Access logins should pass CF_AppSession cookie | ||||
| 
 | ||||
| 2023.10.0 | ||||
| - 2023-10-06 TUN-7864: Document cloudflared versions support | ||||
| - 2023-10-03 CUSTESC-33731: Make rule match test report rule in 0-index base | ||||
|  |  | |||
|  | @ -1,3 +1,4 @@ | |||
| #!/bin/bash | ||||
| VERSION=$(git describe --tags --always --match "[0-9][0-9][0-9][0-9].*.*") | ||||
| echo $VERSION | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,9 @@ | |||
| #!/bin/bash | ||||
| VERSION=$(git describe --tags --always --match "[0-9][0-9][0-9][0-9].*.*") | ||||
| echo $VERSION | ||||
| 
 | ||||
| # Avoid depending on C code since we don't need it. | ||||
| # Disable FIPS module in go-boring | ||||
| export GOEXPERIMENT=noboringcrypto | ||||
| export CGO_ENABLED=0 | ||||
| 
 | ||||
| # This controls the directory the built artifacts go into | ||||
|  |  | |||
							
								
								
									
										46
									
								
								cfsetup.yaml
								
								
								
								
							
							
						
						
									
										46
									
								
								cfsetup.yaml
								
								
								
								
							|  | @ -1,5 +1,4 @@ | |||
| pinned_go: &pinned_go go=1.20.6-1 | ||||
| pinned_go_fips: &pinned_go_fips go-boring=1.20.6-1 | ||||
| pinned_go: &pinned_go go-boring=1.21.5-1 | ||||
| 
 | ||||
| build_dir: &build_dir /cfsetup_build | ||||
| default-flavor: bullseye | ||||
|  | @ -10,25 +9,30 @@ buster: &buster | |||
|       - *pinned_go | ||||
|       - build-essential | ||||
|       - gotest-to-teamcity | ||||
|       - fakeroot | ||||
|       - rubygem-fpm | ||||
|       - rpm | ||||
|       - libffi-dev | ||||
|       - reprepro | ||||
|       - createrepo | ||||
|     pre-cache: &build_pre_cache | ||||
|       - export GOCACHE=/cfsetup_build/.cache/go-build | ||||
|       - go install golang.org/x/tools/cmd/goimports@latest | ||||
|     post-cache: | ||||
|       - export GOOS=linux | ||||
|       - export GOARCH=amd64 | ||||
|       - make cloudflared | ||||
|       # TODO: TUN-8126 this is temporary to make sure packages can be built before release | ||||
|       - ./build-packages.sh | ||||
|       # Build binary for component test | ||||
|       - GOOS=linux GOARCH=amd64 make cloudflared | ||||
|   build-fips: | ||||
|     build_dir: *build_dir | ||||
|     builddeps: &build_deps_fips | ||||
|       - *pinned_go_fips | ||||
|       - build-essential | ||||
|       - gotest-to-teamcity | ||||
|     builddeps: *build_deps | ||||
|     pre-cache: *build_pre_cache | ||||
|     post-cache: | ||||
|       - export GOOS=linux | ||||
|       - export GOARCH=amd64 | ||||
|       - export FIPS=true | ||||
|       - make cloudflared | ||||
|       # TODO: TUN-8126 this is temporary to make sure packages can be built before release | ||||
|       - ./build-packages-fips.sh | ||||
|       # Build binary for component test | ||||
|       - GOOS=linux GOARCH=amd64 make cloudflared | ||||
|   cover:  | ||||
|     build_dir: *build_dir | ||||
|     builddeps: *build_deps | ||||
|  | @ -72,7 +76,7 @@ buster: &buster | |||
|   github-fips-release-pkgs: | ||||
|     build_dir: *build_dir | ||||
|     builddeps: | ||||
|       - *pinned_go_fips | ||||
|       - *pinned_go | ||||
|       - build-essential | ||||
|       - fakeroot | ||||
|       - rubygem-fpm | ||||
|  | @ -111,7 +115,7 @@ buster: &buster | |||
|   build-fips-internal-deb: | ||||
|     build_dir: *build_dir | ||||
|     builddeps: &build_fips_deb_deps | ||||
|       - *pinned_go_fips | ||||
|       - *pinned_go | ||||
|       - build-essential | ||||
|       - fakeroot | ||||
|       - rubygem-fpm | ||||
|  | @ -195,7 +199,7 @@ buster: &buster | |||
|       - make test | gotest-to-teamcity | ||||
|   test-fips: | ||||
|     build_dir: *build_dir | ||||
|     builddeps: *build_deps_fips | ||||
|     builddeps: *build_deps | ||||
|     pre-cache: *build_pre_cache | ||||
|     post-cache: | ||||
|       - export GOOS=linux | ||||
|  | @ -227,7 +231,7 @@ buster: &buster | |||
|   component-test-fips: | ||||
|     build_dir: *build_dir | ||||
|     builddeps: | ||||
|       - *pinned_go_fips | ||||
|       - *pinned_go | ||||
|       - python3.7 | ||||
|       - python3-pip | ||||
|       - python3-setuptools | ||||
|  | @ -238,16 +242,6 @@ buster: &buster | |||
|       - component-tests/requirements.txt | ||||
|     pre-cache: *component_test_pre_cache | ||||
|     post-cache: *component_test_post_cache | ||||
|   update-homebrew: | ||||
|     builddeps: | ||||
|       - openssh-client | ||||
|       - s3cmd | ||||
|       - jq | ||||
|       - build-essential | ||||
|       - procps | ||||
|     post-cache: | ||||
|       - .teamcity/update-homebrew.sh | ||||
|       - .teamcity/update-homebrew-core.sh | ||||
|   github-message-release: | ||||
|     build_dir: *build_dir | ||||
|     builddeps: *build_pygithub | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ | |||
|                 <!--Set the cloudflared bin location to the Path Environment Variable--> | ||||
|                 <Environment Id="ENV0" | ||||
|                     Name="PATH" | ||||
|                     Value="[INSTALLDIR]." | ||||
|                     Value="[INSTALLDIR]" | ||||
|                     Permanent="no" | ||||
|                     Part="last" | ||||
|                     Action="create" | ||||
|  |  | |||
|  | @ -478,6 +478,11 @@ func processURL(s string) (*url.URL, error) { | |||
| 
 | ||||
| // cloudflaredPath pulls the full path of cloudflared on disk
 | ||||
| func cloudflaredPath() string { | ||||
| 	path, err := os.Executable() | ||||
| 	if err == nil && isFileThere(path) { | ||||
| 		return path | ||||
| 	} | ||||
| 
 | ||||
| 	for _, p := range strings.Split(os.Getenv("PATH"), ":") { | ||||
| 		path := fmt.Sprintf("%s/%s", p, "cloudflared") | ||||
| 		if isFileThere(path) { | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ package main | |||
| import ( | ||||
| 	"fmt" | ||||
| 	"math/rand" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
|  | @ -49,6 +50,9 @@ var ( | |||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	// FIXME: TUN-8148: Disable QUIC_GO ECN due to bugs in proper detection if supported
 | ||||
| 	os.Setenv("QUIC_GO_DISABLE_ECN", "1") | ||||
| 
 | ||||
| 	rand.Seed(time.Now().UnixNano()) | ||||
| 	metrics.RegisterBuildInfo(BuildType, BuildTime, Version) | ||||
| 	maxprocs.Set() | ||||
|  |  | |||
|  | @ -340,7 +340,7 @@ func StartServer( | |||
| 	logClientOptions(c, log) | ||||
| 
 | ||||
| 	// this context drives the server, when it's cancelled tunnel and all other components (origins, dns, etc...) should stop
 | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	ctx, cancel := context.WithCancel(c.Context) | ||||
| 	defer cancel() | ||||
| 
 | ||||
| 	go waitForSignal(graceShutdownC, log) | ||||
|  |  | |||
|  | @ -33,9 +33,9 @@ import ( | |||
| const secretValue = "*****" | ||||
| 
 | ||||
| var ( | ||||
| 	developerPortal = "https://developers.cloudflare.com/argo-tunnel" | ||||
| 	serviceUrl      = developerPortal + "/reference/service/" | ||||
| 	argumentsUrl    = developerPortal + "/reference/arguments/" | ||||
| 	developerPortal = "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup" | ||||
| 	serviceUrl      = developerPortal + "/tunnel-guide/local/as-a-service/" | ||||
| 	argumentsUrl    = developerPortal + "/tunnel-guide/local/local-management/arguments/" | ||||
| 
 | ||||
| 	secretFlags = [2]*altsrc.StringFlag{credentialsContentsFlag, tunnelTokenFlag} | ||||
| 
 | ||||
|  |  | |||
|  | @ -56,6 +56,9 @@ func (s *WorkersService) Check() (CheckResult, error) { | |||
| 	} | ||||
| 
 | ||||
| 	req, err := http.NewRequest(http.MethodGet, s.url, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	q := req.URL.Query() | ||||
| 	q.Add(OSKeyName, runtime.GOOS) | ||||
| 	q.Add(ArchitectureKeyName, runtime.GOARCH) | ||||
|  |  | |||
|  | @ -1,8 +1,8 @@ | |||
| cloudflare==2.8.15 | ||||
| cloudflare==2.14.3 | ||||
| flaky==3.7.0 | ||||
| pytest==7.3.1 | ||||
| pytest-asyncio==0.21.0 | ||||
| pyyaml==5.4.1 | ||||
| pyyaml==6.0.1 | ||||
| requests==2.28.2 | ||||
| retrying==1.3.4 | ||||
| websockets==11.0.1 | ||||
|  |  | |||
|  | @ -74,7 +74,7 @@ def delete_tunnel(config): | |||
| 
 | ||||
| @retry(stop_max_attempt_number=MAX_RETRIES, wait_fixed=BACKOFF_SECS * 1000) | ||||
| def create_dns(config, hostname, type, content): | ||||
|     cf = CloudFlare.CloudFlare(debug=True, token=get_env("DNS_API_TOKEN")) | ||||
|     cf = CloudFlare.CloudFlare(debug=False, token=get_env("DNS_API_TOKEN")) | ||||
|     cf.zones.dns_records.post( | ||||
|         config["zone_tag"], | ||||
|         data={'name': hostname, 'type': type, 'content': content, 'proxied': True} | ||||
|  | @ -89,7 +89,7 @@ def create_named_dns(config, random_uuid): | |||
| 
 | ||||
| @retry(stop_max_attempt_number=MAX_RETRIES, wait_fixed=BACKOFF_SECS * 1000) | ||||
| def delete_dns(config, hostname): | ||||
|     cf = CloudFlare.CloudFlare(debug=True, token=get_env("DNS_API_TOKEN")) | ||||
|     cf = CloudFlare.CloudFlare(debug=False, token=get_env("DNS_API_TOKEN")) | ||||
|     zone_tag = config["zone_tag"] | ||||
|     dns_records = cf.zones.dns_records.get(zone_tag, params={'name': hostname}) | ||||
|     if len(dns_records) > 0: | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ import platform | |||
| import subprocess | ||||
| from contextlib import contextmanager | ||||
| from time import sleep | ||||
| import sys | ||||
| 
 | ||||
| import pytest | ||||
| 
 | ||||
|  | @ -14,8 +15,14 @@ from retrying import retry | |||
| 
 | ||||
| from constants import METRICS_PORT, MAX_RETRIES, BACKOFF_SECS | ||||
| 
 | ||||
| LOGGER = logging.getLogger(__name__) | ||||
| def configure_logger(): | ||||
|     logger = logging.getLogger(__name__) | ||||
|     logger.setLevel(logging.DEBUG) | ||||
|     handler = logging.StreamHandler(sys.stdout) | ||||
|     logger.addHandler(handler) | ||||
|     return logger | ||||
| 
 | ||||
| LOGGER = configure_logger() | ||||
| 
 | ||||
| def select_platform(plat): | ||||
|     return pytest.mark.skipif( | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ import ( | |||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"net/netip" | ||||
| 	"runtime" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
|  | @ -623,9 +624,19 @@ func createUDPConnForConnIndex(connIndex uint8, localIP net.IP, logger *zerolog. | |||
| 		localIP = net.IPv4zero | ||||
| 	} | ||||
| 
 | ||||
| 	listenNetwork := "udp" | ||||
| 	// https://github.com/quic-go/quic-go/issues/3793 DF bit cannot be set for dual stack listener on OSX
 | ||||
| 	if runtime.GOOS == "darwin" { | ||||
| 		if localIP.To4() != nil { | ||||
| 			listenNetwork = "udp4" | ||||
| 		} else { | ||||
| 			listenNetwork = "udp6" | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// if port was not set yet, it will be zero, so bind will randomly allocate one.
 | ||||
| 	if port, ok := portForConnIndex[connIndex]; ok { | ||||
| 		udpConn, err := net.ListenUDP("udp", &net.UDPAddr{IP: localIP, Port: port}) | ||||
| 		udpConn, err := net.ListenUDP(listenNetwork, &net.UDPAddr{IP: localIP, Port: port}) | ||||
| 		// if there wasn't an error, or if port was 0 (independently of error or not, just return)
 | ||||
| 		if err == nil { | ||||
| 			return udpConn, nil | ||||
|  | @ -635,7 +646,7 @@ func createUDPConnForConnIndex(connIndex uint8, localIP net.IP, logger *zerolog. | |||
| 	} | ||||
| 
 | ||||
| 	// if we reached here, then there was an error or port as not been allocated it.
 | ||||
| 	udpConn, err := net.ListenUDP("udp", &net.UDPAddr{IP: localIP, Port: 0}) | ||||
| 	udpConn, err := net.ListenUDP(listenNetwork, &net.UDPAddr{IP: localIP, Port: 0}) | ||||
| 	if err == nil { | ||||
| 		udpAddr, ok := (udpConn.LocalAddr()).(*net.UDPAddr) | ||||
| 		if !ok { | ||||
|  |  | |||
|  | @ -621,7 +621,7 @@ func serveSession(ctx context.Context, qc *QUICConnection, edgeQUICSession quic. | |||
| 	muxedPayload, err = quicpogs.SuffixType(muxedPayload, quicpogs.DatagramTypeUDP) | ||||
| 	require.NoError(t, err) | ||||
| 
 | ||||
| 	err = edgeQUICSession.SendMessage(muxedPayload) | ||||
| 	err = edgeQUICSession.SendDatagram(muxedPayload) | ||||
| 	require.NoError(t, err) | ||||
| 
 | ||||
| 	readBuffer := make([]byte, len(payload)+1) | ||||
|  |  | |||
|  | @ -1,9 +1,10 @@ | |||
| FROM golang:1.20.6 as builder | ||||
| FROM golang:1.21.5 as builder | ||||
| ENV GO111MODULE=on \ | ||||
|     CGO_ENABLED=0 | ||||
| WORKDIR /go/src/github.com/cloudflare/cloudflared/ | ||||
| RUN apt-get update | ||||
| COPY . . | ||||
| RUN .teamcity/install-cloudflare-go.sh | ||||
| # compile cloudflared | ||||
| RUN make cloudflared | ||||
| RUN PATH="/tmp/go/bin:$PATH" make cloudflared | ||||
| RUN cp /go/src/github.com/cloudflare/cloudflared/cloudflared /usr/local/bin/ | ||||
|  |  | |||
|  | @ -21,9 +21,8 @@ const ( | |||
| type PostQuantumMode uint8 | ||||
| 
 | ||||
| const ( | ||||
| 	PostQuantumDisabled PostQuantumMode = iota | ||||
| 	// Prefer post quantum, but fallback if connection cannot be established
 | ||||
| 	PostQuantumPrefer | ||||
| 	PostQuantumPrefer PostQuantumMode = iota | ||||
| 	// If the user passes the --post-quantum flag, we override
 | ||||
| 	// CurvePreferences to only support hybrid post-quantum key agreements.
 | ||||
| 	PostQuantumStrict | ||||
|  | @ -31,9 +30,8 @@ const ( | |||
| 
 | ||||
| // If the TXT record adds other fields, the umarshal logic will ignore those keys
 | ||||
| // If the TXT record is missing a key, the field will unmarshal to the default Go value
 | ||||
| type featuresRecord struct { | ||||
| 	PostQuantumPercentage int32 `json:"pq"` | ||||
| } | ||||
| // pq was removed in TUN-7970
 | ||||
| type featuresRecord struct{} | ||||
| 
 | ||||
| func NewFeatureSelector(ctx context.Context, accountTag string, staticFeatures StaticFeatures, logger *zerolog.Logger) (*FeatureSelector, error) { | ||||
| 	return newFeatureSelector(ctx, accountTag, logger, newDNSResolver(), staticFeatures, defaultRefreshFreq) | ||||
|  | @ -70,7 +68,7 @@ func newFeatureSelector(ctx context.Context, accountTag string, logger *zerolog. | |||
| 		logger.Err(err).Msg("Failed to fetch features, default to disable") | ||||
| 	} | ||||
| 
 | ||||
| 	go selector.refreshLoop(ctx, refreshFreq) | ||||
| 	// Run refreshLoop next time we have a new feature to rollout
 | ||||
| 
 | ||||
| 	return selector, nil | ||||
| } | ||||
|  | @ -80,13 +78,7 @@ func (fs *FeatureSelector) PostQuantumMode() PostQuantumMode { | |||
| 		return *fs.staticFeatures.PostQuantumMode | ||||
| 	} | ||||
| 
 | ||||
| 	fs.lock.RLock() | ||||
| 	defer fs.lock.RUnlock() | ||||
| 
 | ||||
| 	if fs.features.PostQuantumPercentage > fs.accountHash { | ||||
| 		return PostQuantumPrefer | ||||
| 	} | ||||
| 	return PostQuantumDisabled | ||||
| 	return PostQuantumPrefer | ||||
| } | ||||
| 
 | ||||
| func (fs *FeatureSelector) refreshLoop(ctx context.Context, refreshFreq time.Duration) { | ||||
|  | @ -115,9 +107,6 @@ func (fs *FeatureSelector) refresh(ctx context.Context) error { | |||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	pq_enabled := features.PostQuantumPercentage > fs.accountHash | ||||
| 	fs.logger.Debug().Int32("account_hash", fs.accountHash).Int32("pq_perct", features.PostQuantumPercentage).Bool("pq_enabled", pq_enabled).Msg("Refreshed feature") | ||||
| 
 | ||||
| 	fs.lock.Lock() | ||||
| 	defer fs.lock.Unlock() | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,92 +13,48 @@ import ( | |||
| 
 | ||||
| func TestUnmarshalFeaturesRecord(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		record             []byte | ||||
| 		expectedPercentage int32 | ||||
| 		expectedErr        bool | ||||
| 		record []byte | ||||
| 	}{ | ||||
| 		{ | ||||
| 			record:             []byte(`{"pq":0}`), | ||||
| 			expectedPercentage: 0, | ||||
| 			record: []byte(`{"pq":0}`), | ||||
| 		}, | ||||
| 		{ | ||||
| 			record:             []byte(`{"pq":39}`), | ||||
| 			expectedPercentage: 39, | ||||
| 			record: []byte(`{"pq":39}`), | ||||
| 		}, | ||||
| 		{ | ||||
| 			record:             []byte(`{"pq":100}`), | ||||
| 			expectedPercentage: 100, | ||||
| 			record: []byte(`{"pq":100}`), | ||||
| 		}, | ||||
| 		{ | ||||
| 			record:             []byte(`{}`), | ||||
| 			expectedPercentage: 0, // Unmarshal to default struct if key is not present
 | ||||
| 			record: []byte(`{}`), // Unmarshal to default struct if key is not present
 | ||||
| 		}, | ||||
| 		{ | ||||
| 			record:             []byte(`{"kyber":768}`), | ||||
| 			expectedPercentage: 0, // Unmarshal to default struct if key is not present
 | ||||
| 		}, | ||||
| 		{ | ||||
| 			record:      []byte(`{"pq":"kyber768"}`), | ||||
| 			expectedErr: true, | ||||
| 			record: []byte(`{"kyber":768}`), // Unmarshal to default struct if key is not present
 | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, test := range tests { | ||||
| 		var features featuresRecord | ||||
| 		err := json.Unmarshal(test.record, &features) | ||||
| 		if test.expectedErr { | ||||
| 			require.Error(t, err, test) | ||||
| 		} else { | ||||
| 			require.NoError(t, err) | ||||
| 			require.Equal(t, test.expectedPercentage, features.PostQuantumPercentage, test) | ||||
| 		} | ||||
| 		require.NoError(t, err) | ||||
| 		require.Equal(t, featuresRecord{}, features) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestRefreshFeaturesRecord(t *testing.T) { | ||||
| 	// The hash of the accountTag is 82
 | ||||
| 	accountTag := t.Name() | ||||
| 	threshold := switchThreshold(accountTag) | ||||
| 
 | ||||
| 	percentages := []int32{0, 10, 80, 83, 100} | ||||
| 	refreshFreq := time.Millisecond * 10 | ||||
| 	selector := newTestSelector(t, percentages, nil, refreshFreq) | ||||
| 
 | ||||
| 	for _, percentage := range percentages { | ||||
| 		if percentage > threshold { | ||||
| 			require.Equal(t, PostQuantumPrefer, selector.PostQuantumMode()) | ||||
| 		} else { | ||||
| 			require.Equal(t, PostQuantumDisabled, selector.PostQuantumMode()) | ||||
| 		} | ||||
| 
 | ||||
| 		time.Sleep(refreshFreq + time.Millisecond) | ||||
| 	} | ||||
| 
 | ||||
| 	// Make sure error doesn't override the last fetched features
 | ||||
| 	require.Equal(t, PostQuantumPrefer, selector.PostQuantumMode()) | ||||
| } | ||||
| 
 | ||||
| func TestStaticFeatures(t *testing.T) { | ||||
| 	percentages := []int32{0} | ||||
| 	pqMode := PostQuantumStrict | ||||
| 	selector := newTestSelector(t, percentages, &pqMode, time.Millisecond*10) | ||||
| 	selector := newTestSelector(t, &pqMode, time.Millisecond*10) | ||||
| 	require.Equal(t, PostQuantumStrict, selector.PostQuantumMode()) | ||||
| 
 | ||||
| 	// No StaticFeatures configured
 | ||||
| 	selector = newTestSelector(t, nil, time.Millisecond*10) | ||||
| 	require.Equal(t, PostQuantumPrefer, selector.PostQuantumMode()) | ||||
| } | ||||
| 
 | ||||
| // Verify that if the first refresh fails, the selector will use default features
 | ||||
| func TestFailedRefreshInitToDefault(t *testing.T) { | ||||
| 	selector := newTestSelector(t, []int32{}, nil, time.Second) | ||||
| 	require.Equal(t, featuresRecord{}, selector.features) | ||||
| 	require.Equal(t, PostQuantumDisabled, selector.PostQuantumMode()) | ||||
| } | ||||
| 
 | ||||
| func newTestSelector(t *testing.T, percentages []int32, pqMode *PostQuantumMode, refreshFreq time.Duration) *FeatureSelector { | ||||
| func newTestSelector(t *testing.T, pqMode *PostQuantumMode, refreshFreq time.Duration) *FeatureSelector { | ||||
| 	accountTag := t.Name() | ||||
| 	logger := zerolog.Nop() | ||||
| 
 | ||||
| 	resolver := &mockResolver{ | ||||
| 		percentages: percentages, | ||||
| 	} | ||||
| 	resolver := &mockResolver{} | ||||
| 
 | ||||
| 	staticFeatures := StaticFeatures{ | ||||
| 		PostQuantumMode: pqMode, | ||||
|  | @ -109,20 +65,8 @@ func newTestSelector(t *testing.T, percentages []int32, pqMode *PostQuantumMode, | |||
| 	return selector | ||||
| } | ||||
| 
 | ||||
| type mockResolver struct { | ||||
| 	nextIndex   int | ||||
| 	percentages []int32 | ||||
| } | ||||
| type mockResolver struct{} | ||||
| 
 | ||||
| func (mr *mockResolver) lookupRecord(ctx context.Context) ([]byte, error) { | ||||
| 	if mr.nextIndex >= len(mr.percentages) { | ||||
| 		return nil, fmt.Errorf("no more record to lookup") | ||||
| 	} | ||||
| 
 | ||||
| 	record, err := json.Marshal(featuresRecord{ | ||||
| 		PostQuantumPercentage: mr.percentages[mr.nextIndex], | ||||
| 	}) | ||||
| 	mr.nextIndex++ | ||||
| 
 | ||||
| 	return record, err | ||||
| 	return nil, fmt.Errorf("mockResolver hasn't implement lookupRecord") | ||||
| } | ||||
|  |  | |||
							
								
								
									
										73
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										73
									
								
								go.mod
								
								
								
								
							|  | @ -1,9 +1,8 @@ | |||
| module github.com/cloudflare/cloudflared | ||||
| 
 | ||||
| go 1.20 | ||||
| go 1.21 | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/cloudflare/golibs v0.0.0-20170913112048-333127dbecfc | ||||
| 	github.com/coredns/coredns v1.10.0 | ||||
| 	github.com/coreos/go-oidc/v3 v3.6.0 | ||||
| 	github.com/coreos/go-systemd/v22 v22.5.0 | ||||
|  | @ -16,7 +15,7 @@ require ( | |||
| 	github.com/gobwas/ws v1.0.4 | ||||
| 	github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 | ||||
| 	github.com/google/gopacket v1.1.19 | ||||
| 	github.com/google/uuid v1.3.0 | ||||
| 	github.com/google/uuid v1.3.1 | ||||
| 	github.com/gorilla/websocket v1.4.2 | ||||
| 	github.com/json-iterator/go v1.1.12 | ||||
| 	github.com/mattn/go-colorable v0.1.13 | ||||
|  | @ -25,23 +24,23 @@ require ( | |||
| 	github.com/pkg/errors v0.9.1 | ||||
| 	github.com/prometheus/client_golang v1.13.0 | ||||
| 	github.com/prometheus/client_model v0.2.0 | ||||
| 	github.com/quic-go/quic-go v0.0.0-00010101000000-000000000000 | ||||
| 	github.com/quic-go/quic-go v0.40.1-0.20240101045026-22b7f7744eb6 | ||||
| 	github.com/rs/zerolog v1.20.0 | ||||
| 	github.com/stretchr/testify v1.8.1 | ||||
| 	github.com/stretchr/testify v1.8.4 | ||||
| 	github.com/urfave/cli/v2 v2.3.0 | ||||
| 	go.opentelemetry.io/contrib/propagators v0.22.0 | ||||
| 	go.opentelemetry.io/otel v1.6.3 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3 | ||||
| 	go.opentelemetry.io/otel/sdk v1.6.3 | ||||
| 	go.opentelemetry.io/otel/trace v1.6.3 | ||||
| 	go.opentelemetry.io/proto/otlp v0.15.0 | ||||
| 	go.opentelemetry.io/otel v1.21.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 | ||||
| 	go.opentelemetry.io/otel/sdk v1.21.0 | ||||
| 	go.opentelemetry.io/otel/trace v1.21.0 | ||||
| 	go.opentelemetry.io/proto/otlp v1.0.0 | ||||
| 	go.uber.org/automaxprocs v1.4.0 | ||||
| 	golang.org/x/crypto v0.11.0 | ||||
| 	golang.org/x/net v0.12.0 | ||||
| 	golang.org/x/sync v0.1.0 | ||||
| 	golang.org/x/sys v0.10.0 | ||||
| 	golang.org/x/term v0.10.0 | ||||
| 	google.golang.org/protobuf v1.28.1 | ||||
| 	golang.org/x/crypto v0.16.0 | ||||
| 	golang.org/x/net v0.19.0 | ||||
| 	golang.org/x/sync v0.4.0 | ||||
| 	golang.org/x/sys v0.15.0 | ||||
| 	golang.org/x/term v0.15.0 | ||||
| 	google.golang.org/protobuf v1.31.0 | ||||
| 	gopkg.in/natefinch/lumberjack.v2 v2.0.0 | ||||
| 	gopkg.in/yaml.v3 v3.0.1 | ||||
| 	nhooyr.io/websocket v1.8.7 | ||||
|  | @ -52,8 +51,7 @@ require ( | |||
| 	github.com/BurntSushi/toml v1.2.0 // indirect | ||||
| 	github.com/apparentlymart/go-cidr v1.1.0 // indirect | ||||
| 	github.com/beorn7/perks v1.0.1 // indirect | ||||
| 	github.com/cespare/xxhash/v2 v2.1.2 // indirect | ||||
| 	github.com/cloudflare/circl v1.2.1-0.20220809205628-0a9554f37a47 // indirect | ||||
| 	github.com/cespare/xxhash/v2 v2.2.0 // indirect | ||||
| 	github.com/coredns/caddy v1.1.1 // indirect | ||||
| 	github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
|  | @ -62,15 +60,14 @@ require ( | |||
| 	github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect | ||||
| 	github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect | ||||
| 	github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect | ||||
| 	github.com/go-logr/logr v1.2.3 // indirect | ||||
| 	github.com/go-logr/logr v1.3.0 // indirect | ||||
| 	github.com/go-logr/stdr v1.2.2 // indirect | ||||
| 	github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect | ||||
| 	github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect | ||||
| 	github.com/gobwas/httphead v0.0.0-20200921212729-da3d93bc3c58 // indirect | ||||
| 	github.com/gobwas/pool v0.2.1 // indirect | ||||
| 	github.com/golang/mock v1.6.0 // indirect | ||||
| 	github.com/golang/protobuf v1.5.2 // indirect | ||||
| 	github.com/golang/protobuf v1.5.3 // indirect | ||||
| 	github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect | ||||
| 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect | ||||
| 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect | ||||
| 	github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect | ||||
| 	github.com/klauspost/compress v1.15.11 // indirect | ||||
| 	github.com/kr/text v0.2.0 // indirect | ||||
|  | @ -79,24 +76,24 @@ require ( | |||
| 	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect | ||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||
| 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||
| 	github.com/onsi/ginkgo/v2 v2.4.0 // indirect | ||||
| 	github.com/onsi/gomega v1.23.0 // indirect | ||||
| 	github.com/onsi/ginkgo/v2 v2.9.5 // indirect | ||||
| 	github.com/opentracing/opentracing-go v1.2.0 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/prometheus/common v0.37.0 // indirect | ||||
| 	github.com/prometheus/procfs v0.8.0 // indirect | ||||
| 	github.com/quic-go/qtls-go1-19 v0.3.2 // indirect | ||||
| 	github.com/quic-go/qtls-go1-20 v0.2.2 // indirect | ||||
| 	github.com/quic-go/qtls-go1-20 v0.4.1 // indirect | ||||
| 	github.com/russross/blackfriday/v2 v2.1.0 // indirect | ||||
| 	go.opentelemetry.io/otel/metric v1.21.0 // indirect | ||||
| 	go.uber.org/mock v0.3.0 // indirect | ||||
| 	golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect | ||||
| 	golang.org/x/mod v0.8.0 // indirect | ||||
| 	golang.org/x/oauth2 v0.6.0 // indirect | ||||
| 	golang.org/x/text v0.11.0 // indirect | ||||
| 	golang.org/x/tools v0.6.0 // indirect | ||||
| 	google.golang.org/appengine v1.6.7 // indirect | ||||
| 	google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd // indirect | ||||
| 	google.golang.org/grpc v1.51.0 // indirect | ||||
| 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect | ||||
| 	golang.org/x/mod v0.11.0 // indirect | ||||
| 	golang.org/x/oauth2 v0.13.0 // indirect | ||||
| 	golang.org/x/text v0.14.0 // indirect | ||||
| 	golang.org/x/tools v0.9.1 // indirect | ||||
| 	google.golang.org/appengine v1.6.8 // indirect | ||||
| 	google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect | ||||
| 	google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect | ||||
| 	google.golang.org/grpc v1.60.0 // indirect | ||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||
| ) | ||||
| 
 | ||||
|  | @ -106,9 +103,3 @@ replace github.com/urfave/cli/v2 => github.com/ipostelnik/cli/v2 v2.3.1-0.202103 | |||
| replace github.com/prometheus/golang_client => github.com/prometheus/golang_client v1.12.1 | ||||
| 
 | ||||
| replace gopkg.in/yaml.v3 => gopkg.in/yaml.v3 v3.0.1 | ||||
| 
 | ||||
| replace github.com/quic-go/quic-go => github.com/devincarr/quic-go v0.0.0-20230502200822-d1f4edacbee7 | ||||
| 
 | ||||
| // Post-quantum tunnel RTG-1339 | ||||
| // Branches go1.20 on github.com/cloudflare/qtls-pq | ||||
| replace github.com/quic-go/qtls-go1-20 => github.com/cloudflare/qtls-pq v0.0.0-20230320122459-4ed280d0d633 | ||||
|  |  | |||
							
								
								
									
										210
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										210
									
								
								go.sum
								
								
								
								
							|  | @ -35,43 +35,27 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 | |||
| github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= | ||||
| github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= | ||||
| github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= | ||||
| github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= | ||||
| github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= | ||||
| github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= | ||||
| github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= | ||||
| github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= | ||||
| github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= | ||||
| github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= | ||||
| github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU= | ||||
| github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= | ||||
| github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= | ||||
| github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= | ||||
| github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= | ||||
| github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= | ||||
| github.com/bwesterb/go-ristretto v1.2.2/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= | ||||
| github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= | ||||
| github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= | ||||
| github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= | ||||
| github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= | ||||
| github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= | ||||
| github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= | ||||
| github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | ||||
| github.com/cloudflare/circl v1.2.1-0.20220809205628-0a9554f37a47 h1:YzpECHxZ9TzO7LpnKmPxItSd79lLgrR5heIlnqU4dTU= | ||||
| github.com/cloudflare/circl v1.2.1-0.20220809205628-0a9554f37a47/go.mod h1:qhx8gBILsYlbam7h09SvHDSkjpe3TfLA7b/z4rxJvkE= | ||||
| github.com/cloudflare/golibs v0.0.0-20170913112048-333127dbecfc h1:Dvk3ySBsOm5EviLx6VCyILnafPcQinXGP5jbTdHUJgE= | ||||
| github.com/cloudflare/golibs v0.0.0-20170913112048-333127dbecfc/go.mod h1:HlgKKR8V5a1wroIDDIz3/A+T+9Janfq+7n1P5sEFdi0= | ||||
| github.com/cloudflare/qtls-pq v0.0.0-20230320122459-4ed280d0d633 h1:ZTub2XMOBpxyBiJf6Q+UKqAi07yt1rZmFitriHvFd8M= | ||||
| github.com/cloudflare/qtls-pq v0.0.0-20230320122459-4ed280d0d633/go.mod h1:j/igSUc4PgBMayIsBGjAFu2i7g663rm6kZrKy4htb7E= | ||||
| github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= | ||||
| github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= | ||||
| github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= | ||||
| github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= | ||||
| github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= | ||||
| github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= | ||||
| github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= | ||||
| github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= | ||||
| github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= | ||||
| github.com/coredns/coredns v1.10.0 h1:jCfuWsBjTs0dapkkhISfPCzn5LqvSRtrFtaf/Tjj4DI= | ||||
|  | @ -88,14 +72,9 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 | |||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/devincarr/quic-go v0.0.0-20230502200822-d1f4edacbee7 h1:qxyoKKPXmPsbvT7SZTcvhEgUaZhEttk4f6u8rIawKj0= | ||||
| github.com/devincarr/quic-go v0.0.0-20230502200822-d1f4edacbee7/go.mod h1:+4CVgVppm0FNjpG3UcX8Joi/frKOH7/ciD5yGcwOO1g= | ||||
| github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||
| github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||
| github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= | ||||
| github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= | ||||
| github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= | ||||
| github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= | ||||
| github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | ||||
| github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= | ||||
| github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= | ||||
|  | @ -113,16 +92,17 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo | |||
| github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= | ||||
| github.com/getsentry/sentry-go v0.16.0 h1:owk+S+5XcgJLlGR/3+3s6N4d+uKwqYvh/eS0AIMjPWo= | ||||
| github.com/getsentry/sentry-go v0.16.0/go.mod h1:ZXCloQLj0pG7mja5NK6NPf2V4A88YJ4pNlc2mOHwh6Y= | ||||
| github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||
| github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= | ||||
| github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= | ||||
| github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= | ||||
| github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= | ||||
| github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= | ||||
| github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= | ||||
| github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= | ||||
| github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4= | ||||
| github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= | ||||
| github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= | ||||
| github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= | ||||
| github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= | ||||
| github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= | ||||
| github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= | ||||
|  | @ -137,20 +117,23 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V | |||
| github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= | ||||
| github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= | ||||
| github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= | ||||
| github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= | ||||
| github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||
| github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||||
| github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= | ||||
| github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= | ||||
| github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= | ||||
| github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= | ||||
| github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= | ||||
| github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= | ||||
| github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= | ||||
| github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= | ||||
| github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= | ||||
| github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= | ||||
| github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | ||||
| github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= | ||||
| github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= | ||||
| github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= | ||||
| github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= | ||||
| github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= | ||||
| github.com/gobwas/httphead v0.0.0-20200921212729-da3d93bc3c58 h1:YyrUZvJaU8Q0QsoVo+xLFBgWDTam29PKea6GYmwvSiQ= | ||||
| github.com/gobwas/httphead v0.0.0-20200921212729-da3d93bc3c58/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= | ||||
|  | @ -161,13 +144,14 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E | |||
| github.com/gobwas/ws v1.0.4 h1:5eXU1CZhpQdq5kXbKb+sECH5Ia5KiO6CYzIzdlVx6Bs= | ||||
| github.com/gobwas/ws v1.0.4/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= | ||||
| github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= | ||||
| github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= | ||||
| github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= | ||||
| github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | ||||
| github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4= | ||||
| github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= | ||||
| github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= | ||||
| github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= | ||||
| github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= | ||||
| github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
|  | @ -178,8 +162,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt | |||
| github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= | ||||
| github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= | ||||
| github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= | ||||
| github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= | ||||
| github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= | ||||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
|  | @ -195,8 +177,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD | |||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||
| github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||
| github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | ||||
| github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= | ||||
| github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= | ||||
| github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||
| github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||
|  | @ -209,8 +192,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ | |||
| github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= | ||||
| github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= | ||||
| github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= | ||||
| github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= | ||||
| github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= | ||||
|  | @ -227,17 +210,15 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJY | |||
| github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | ||||
| github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= | ||||
| github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= | ||||
| github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | ||||
| github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= | ||||
| github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | ||||
| github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= | ||||
| github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= | ||||
| github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= | ||||
| github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= | ||||
| github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= | ||||
|  | @ -265,8 +246,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv | |||
| github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= | ||||
| github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||
| github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= | ||||
| github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | ||||
| github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||
| github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
|  | @ -275,6 +256,7 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 | |||
| github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= | ||||
| github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= | ||||
| github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= | ||||
| github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= | ||||
| github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= | ||||
| github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= | ||||
| github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | ||||
|  | @ -295,15 +277,18 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G | |||
| github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | ||||
| github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | ||||
| github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | ||||
| github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs= | ||||
| github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= | ||||
| github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= | ||||
| github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= | ||||
| github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= | ||||
| github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= | ||||
| github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= | ||||
| github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= | ||||
| github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= | ||||
| github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= | ||||
| github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= | ||||
| github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= | ||||
| github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= | ||||
| github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= | ||||
| github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= | ||||
| github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= | ||||
| github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||
|  | @ -335,10 +320,15 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 | |||
| github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= | ||||
| github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= | ||||
| github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= | ||||
| github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= | ||||
| github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= | ||||
| github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= | ||||
| github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= | ||||
| github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= | ||||
| github.com/quic-go/quic-go v0.40.1-0.20231203135336-87ef8ec48d55 h1:I4N3ZRnkZPbDN935Tg8QDf8fRpHp3bZ0U0/L42jBgNE= | ||||
| github.com/quic-go/quic-go v0.40.1-0.20231203135336-87ef8ec48d55/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= | ||||
| github.com/quic-go/quic-go v0.40.1-0.20240101045026-22b7f7744eb6 h1:OI4WiysowCcxLtcZMGBZildo12di3ljcMN4vWdUQpoU= | ||||
| github.com/quic-go/quic-go v0.40.1-0.20240101045026-22b7f7744eb6/go.mod h1:qCkNjqczPEvgsOnxZ0eCD14lv+B2LHlFAB++CNOh9hA= | ||||
| github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= | ||||
| github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= | ||||
| github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= | ||||
| github.com/rs/zerolog v1.20.0 h1:38k9hgtUBdxFwE34yS8rTHmHBa4eN16E4DJlv177LNs= | ||||
| github.com/rs/zerolog v1.20.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= | ||||
|  | @ -349,30 +339,27 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV | |||
| github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= | ||||
| github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | ||||
| github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= | ||||
| github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= | ||||
| github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= | ||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||
| github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= | ||||
| github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= | ||||
| github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= | ||||
| github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= | ||||
| github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ= | ||||
| github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= | ||||
| github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= | ||||
| github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= | ||||
| github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= | ||||
| github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= | ||||
| github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= | ||||
| github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | ||||
| github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | ||||
| go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | ||||
| go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | ||||
| go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||
|  | @ -381,21 +368,23 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | |||
| go.opentelemetry.io/contrib/propagators v0.22.0 h1:KGdv58M2//veiYLIhb31mofaI2LgkIPXXAZVeYVyfd8= | ||||
| go.opentelemetry.io/contrib/propagators v0.22.0/go.mod h1:xGOuXr6lLIF9BXipA4pm6UuOSI0M98U6tsI3khbOiwU= | ||||
| go.opentelemetry.io/otel v1.0.0-RC2/go.mod h1:w1thVQ7qbAy8MHb0IFj8a5Q2QU0l2ksf8u/CN8m3NOM= | ||||
| go.opentelemetry.io/otel v1.6.3 h1:FLOfo8f9JzFVFVyU+MSRJc2HdEAXQgm7pIv2uFKRSZE= | ||||
| go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3 h1:4/UjHWMVVc5VwX/KAtqJOHErKigMCH8NexChMuanb/o= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.3/go.mod h1:UJmXdiVVBaZ63umRUTwJuCMAV//GCMvDiQwn703/GoY= | ||||
| go.opentelemetry.io/otel/sdk v1.6.3 h1:prSHYdwCQOX5DrsEzxowH3nLhoAzEBdZhvrR79scfLs= | ||||
| go.opentelemetry.io/otel/sdk v1.6.3/go.mod h1:A4iWF7HTXa+GWL/AaqESz28VuSBIcZ+0CV+IzJ5NMiQ= | ||||
| go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= | ||||
| go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= | ||||
| go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= | ||||
| go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= | ||||
| go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= | ||||
| go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= | ||||
| go.opentelemetry.io/otel/trace v1.0.0-RC2/go.mod h1:JPQ+z6nNw9mqEGT8o3eoPTdnNI+Aj5JcxEsVGREIAy4= | ||||
| go.opentelemetry.io/otel/trace v1.6.3 h1:IqN4L+5b0mPNjdXIiZ90Ni4Bl5BRkDQywePLWemd9bc= | ||||
| go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= | ||||
| go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | ||||
| go.opentelemetry.io/proto/otlp v0.15.0 h1:h0bKrvdrT/9sBwEJ6iWUqT/N/xPcS66bL4u3isneJ6w= | ||||
| go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= | ||||
| go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= | ||||
| go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= | ||||
| go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= | ||||
| go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= | ||||
| go.uber.org/automaxprocs v1.4.0 h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0= | ||||
| go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= | ||||
| go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= | ||||
| go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= | ||||
| golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
|  | @ -403,9 +392,9 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U | |||
| golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= | ||||
| golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= | ||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= | ||||
| golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= | ||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= | ||||
|  | @ -439,8 +428,9 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB | |||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= | ||||
| golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | ||||
| golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= | ||||
| golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
|  | @ -469,24 +459,24 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ | |||
| golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | ||||
| golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | ||||
| golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | ||||
| golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | ||||
| golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= | ||||
| golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= | ||||
| golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= | ||||
| golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= | ||||
| golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= | ||||
| golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||
| golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= | ||||
| golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | ||||
| golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | ||||
| golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= | ||||
| golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= | ||||
| golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= | ||||
| golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= | ||||
| golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
|  | @ -497,8 +487,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ | |||
| golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= | ||||
| golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= | ||||
| golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
|  | @ -536,31 +527,31 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w | |||
| golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= | ||||
| golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= | ||||
| golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= | ||||
| golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= | ||||
| golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= | ||||
| golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= | ||||
| golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | ||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||||
| golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= | ||||
| golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||
| golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= | ||||
| golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= | ||||
| golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | ||||
| golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
|  | @ -605,10 +596,10 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY | |||
| golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||
| golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||
| golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||
| golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= | ||||
| golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= | ||||
| golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | ||||
| golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= | ||||
| golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
|  | @ -635,8 +626,8 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 | |||
| google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= | ||||
| google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= | ||||
| google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= | ||||
| google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= | ||||
| google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||
| google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
|  | @ -660,16 +651,18 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG | |||
| google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= | ||||
| google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= | ||||
| google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= | ||||
| google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= | ||||
| google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= | ||||
| google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd h1:OjndDrsik+Gt+e6fs45z9AxiewiKyLKYpA45W5Kpkks= | ||||
| google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= | ||||
| google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= | ||||
| google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= | ||||
| google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= | ||||
| google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | ||||
| google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | ||||
|  | @ -682,13 +675,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa | |||
| google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= | ||||
| google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | ||||
| google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | ||||
| google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= | ||||
| google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= | ||||
| google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= | ||||
| google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= | ||||
| google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= | ||||
| google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= | ||||
| google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= | ||||
| google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k= | ||||
| google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= | ||||
| google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | ||||
| google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | ||||
|  | @ -701,10 +689,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj | |||
| google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= | ||||
| google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= | ||||
| google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||
| google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||
| google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= | ||||
| google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= | ||||
| google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
|  |  | |||
|  | @ -85,7 +85,7 @@ type Ingress struct { | |||
| 
 | ||||
| // ParseIngress parses ingress rules, but does not send HTTP requests to the origins.
 | ||||
| func ParseIngress(conf *config.Configuration) (Ingress, error) { | ||||
| 	if len(conf.Ingress) == 0 { | ||||
| 	if conf == nil || len(conf.Ingress) == 0 { | ||||
| 		return Ingress{}, ErrNoIngressRules | ||||
| 	} | ||||
| 	return validateIngress(conf.Ingress, originRequestFromConfig(conf.OriginRequest)) | ||||
|  |  | |||
|  | @ -43,6 +43,11 @@ ingress: | |||
| 	require.Equal(t, "https", s.scheme) | ||||
| } | ||||
| 
 | ||||
| func TestParseIngressNilConfig(t *testing.T) { | ||||
| 	_, err := ParseIngress(nil) | ||||
| 	require.Error(t, err) | ||||
| } | ||||
| 
 | ||||
| func TestParseIngress(t *testing.T) { | ||||
| 	localhost8000 := MustParseURL(t, "https://localhost:8000") | ||||
| 	localhost8001 := MustParseURL(t, "https://localhost:8001") | ||||
|  |  | |||
|  | @ -53,7 +53,7 @@ func (dm *DatagramMuxer) SendToSession(session *packet.Session) error { | |||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "Failed to suffix session ID to datagram, it will be dropped") | ||||
| 	} | ||||
| 	if err := dm.session.SendMessage(payloadWithMetadata); err != nil { | ||||
| 	if err := dm.session.SendDatagram(payloadWithMetadata); err != nil { | ||||
| 		return errors.Wrap(err, "Failed to send datagram back to edge") | ||||
| 	} | ||||
| 	return nil | ||||
|  | @ -64,7 +64,7 @@ func (dm *DatagramMuxer) ServeReceive(ctx context.Context) error { | |||
| 		// Extracts datagram session ID, then sends the session ID and payload to receiver
 | ||||
| 		// which determines how to proxy to the origin. It assumes the datagram session has already been
 | ||||
| 		// registered with receiver through other side channel
 | ||||
| 		msg, err := dm.session.ReceiveMessage() | ||||
| 		msg, err := dm.session.ReceiveDatagram(ctx) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ import ( | |||
| 	"encoding/pem" | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"net" | ||||
| 	"net/netip" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | @ -114,9 +115,8 @@ func TestDatagram(t *testing.T) { | |||
| 
 | ||||
| func testDatagram(t *testing.T, version uint8, sessionToPayloads []*packet.Session, packets []packet.ICMP) { | ||||
| 	quicConfig := &quic.Config{ | ||||
| 		KeepAlivePeriod:      5 * time.Millisecond, | ||||
| 		EnableDatagrams:      true, | ||||
| 		MaxDatagramFrameSize: MaxDatagramFrameSize, | ||||
| 		KeepAlivePeriod: 5 * time.Millisecond, | ||||
| 		EnableDatagrams: true, | ||||
| 	} | ||||
| 	quicListener := newQUICListener(t, quicConfig) | ||||
| 	defer quicListener.Close() | ||||
|  | @ -182,8 +182,12 @@ func testDatagram(t *testing.T, version uint8, sessionToPayloads []*packet.Sessi | |||
| 		} | ||||
| 		ctx, cancel := context.WithCancel(context.Background()) | ||||
| 		defer cancel() | ||||
| 
 | ||||
| 		// https://github.com/quic-go/quic-go/issues/3793 MTU discovery is disabled on OSX for dual stack listeners
 | ||||
| 		udpConn, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4zero, Port: 0}) | ||||
| 		require.NoError(t, err) | ||||
| 		// Establish quic connection
 | ||||
| 		quicSession, err := quic.DialAddrEarly(ctx, quicListener.Addr().String(), tlsClientConfig, quicConfig) | ||||
| 		quicSession, err := quic.DialEarly(ctx, udpConn, quicListener.Addr(), tlsClientConfig, quicConfig) | ||||
| 		require.NoError(t, err) | ||||
| 		defer quicSession.CloseWithError(0, "") | ||||
| 
 | ||||
|  |  | |||
|  | @ -86,7 +86,7 @@ func (dm *DatagramMuxerV2) SendToSession(session *packet.Session) error { | |||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "Failed to suffix datagram type, it will be dropped") | ||||
| 	} | ||||
| 	if err := dm.session.SendMessage(msgWithIDAndType); err != nil { | ||||
| 	if err := dm.session.SendDatagram(msgWithIDAndType); err != nil { | ||||
| 		return errors.Wrap(err, "Failed to send datagram back to edge") | ||||
| 	} | ||||
| 	return nil | ||||
|  | @ -104,7 +104,7 @@ func (dm *DatagramMuxerV2) SendPacket(pk Packet) error { | |||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "Failed to suffix datagram type, it will be dropped") | ||||
| 	} | ||||
| 	if err := dm.session.SendMessage(payloadWithMetadataAndType); err != nil { | ||||
| 	if err := dm.session.SendDatagram(payloadWithMetadataAndType); err != nil { | ||||
| 		return errors.Wrap(err, "Failed to send datagram back to edge") | ||||
| 	} | ||||
| 	return nil | ||||
|  | @ -113,7 +113,7 @@ func (dm *DatagramMuxerV2) SendPacket(pk Packet) error { | |||
| // Demux reads datagrams from the QUIC connection and demuxes depending on whether it's a session or packet
 | ||||
| func (dm *DatagramMuxerV2) ServeReceive(ctx context.Context) error { | ||||
| 	for { | ||||
| 		msg, err := dm.session.ReceiveMessage() | ||||
| 		msg, err := dm.session.ReceiveDatagram(ctx) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  |  | |||
|  | @ -109,63 +109,6 @@ func TestConnectResponseMeta(t *testing.T) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestUnregisterUdpSession(t *testing.T) { | ||||
| 	unregisterMessage := "closed by eyeball" | ||||
| 
 | ||||
| 	var tests = []struct { | ||||
| 		name             string | ||||
| 		sessionRPCServer mockSessionRPCServer | ||||
| 		timeout          time.Duration | ||||
| 	}{ | ||||
| 
 | ||||
| 		{ | ||||
| 			name: "UnregisterUdpSessionTimesout if the RPC server does not respond", | ||||
| 			sessionRPCServer: mockSessionRPCServer{ | ||||
| 				sessionID:         uuid.New(), | ||||
| 				dstIP:             net.IP{172, 16, 0, 1}, | ||||
| 				dstPort:           8000, | ||||
| 				closeIdleAfter:    testCloseIdleAfterHint, | ||||
| 				unregisterMessage: unregisterMessage, | ||||
| 				traceContext:      "1241ce3ecdefc68854e8514e69ba42ca:b38f1bf5eae406f3:0:1", | ||||
| 			}, | ||||
| 			// very very low value so we trigger the timeout every time.
 | ||||
| 			timeout: time.Nanosecond * 1, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for _, test := range tests { | ||||
| 		t.Run(test.name, func(t *testing.T) { | ||||
| 			logger := zerolog.Nop() | ||||
| 			clientStream, serverStream := newMockRPCStreams() | ||||
| 			sessionRegisteredChan := make(chan struct{}) | ||||
| 			go func() { | ||||
| 				protocol, err := DetermineProtocol(serverStream) | ||||
| 				assert.NoError(t, err) | ||||
| 				rpcServerStream, err := NewRPCServerStream(serverStream, protocol) | ||||
| 				assert.NoError(t, err) | ||||
| 				err = rpcServerStream.Serve(test.sessionRPCServer, nil, &logger) | ||||
| 				assert.NoError(t, err) | ||||
| 
 | ||||
| 				serverStream.Close() | ||||
| 				close(sessionRegisteredChan) | ||||
| 			}() | ||||
| 
 | ||||
| 			rpcClientStream, err := NewRPCClientStream(context.Background(), clientStream, test.timeout, &logger) | ||||
| 			assert.NoError(t, err) | ||||
| 
 | ||||
| 			reg, err := rpcClientStream.RegisterUdpSession(context.Background(), test.sessionRPCServer.sessionID, test.sessionRPCServer.dstIP, test.sessionRPCServer.dstPort, testCloseIdleAfterHint, test.sessionRPCServer.traceContext) | ||||
| 			assert.NoError(t, err) | ||||
| 			assert.NoError(t, reg.Err) | ||||
| 
 | ||||
| 			assert.Error(t, rpcClientStream.UnregisterUdpSession(context.Background(), test.sessionRPCServer.sessionID, unregisterMessage)) | ||||
| 
 | ||||
| 			rpcClientStream.Close() | ||||
| 			<-sessionRegisteredChan | ||||
| 		}) | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func TestRegisterUdpSession(t *testing.T) { | ||||
| 	unregisterMessage := "closed by eyeball" | ||||
| 
 | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ type tracerConfig struct { | |||
| 	index uint8 | ||||
| } | ||||
| 
 | ||||
| func NewClientTracer(logger *zerolog.Logger, index uint8) func(context.Context, logging.Perspective, logging.ConnectionID) logging.ConnectionTracer { | ||||
| func NewClientTracer(logger *zerolog.Logger, index uint8) func(context.Context, logging.Perspective, logging.ConnectionID) *logging.ConnectionTracer { | ||||
| 	t := &tracer{ | ||||
| 		logger: logger, | ||||
| 		config: &tracerConfig{ | ||||
|  | @ -32,42 +32,61 @@ func NewClientTracer(logger *zerolog.Logger, index uint8) func(context.Context, | |||
| 	return t.TracerForConnection | ||||
| } | ||||
| 
 | ||||
| func NewServerTracer(logger *zerolog.Logger) logging.Tracer { | ||||
| 	return &tracer{ | ||||
| 		logger: logger, | ||||
| 		config: &tracerConfig{ | ||||
| 			isClient: false, | ||||
| 		}, | ||||
| func NewServerTracer(logger *zerolog.Logger) *logging.Tracer { | ||||
| 	return &logging.Tracer{ | ||||
| 		SentPacket:                   func(net.Addr, *logging.Header, logging.ByteCount, []logging.Frame) {}, | ||||
| 		SentVersionNegotiationPacket: func(_ net.Addr, dest, src logging.ArbitraryLenConnectionID, _ []logging.VersionNumber) {}, | ||||
| 		DroppedPacket:                func(net.Addr, logging.PacketType, logging.ByteCount, logging.PacketDropReason) {}, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (t *tracer) TracerForConnection(_ctx context.Context, _p logging.Perspective, _odcid logging.ConnectionID) logging.ConnectionTracer { | ||||
| func (t *tracer) TracerForConnection(_ctx context.Context, _p logging.Perspective, _odcid logging.ConnectionID) *logging.ConnectionTracer { | ||||
| 	if t.config.isClient { | ||||
| 		return newConnTracer(newClientCollector(t.config.index)) | ||||
| 	} | ||||
| 	return newConnTracer(newServiceCollector()) | ||||
| } | ||||
| 
 | ||||
| func (*tracer) SentPacket(net.Addr, *logging.Header, logging.ByteCount, []logging.Frame) { | ||||
| } | ||||
| func (*tracer) SentVersionNegotiationPacket(_ net.Addr, dest, src logging.ArbitraryLenConnectionID, _ []logging.VersionNumber) { | ||||
| } | ||||
| func (*tracer) DroppedPacket(net.Addr, logging.PacketType, logging.ByteCount, logging.PacketDropReason) { | ||||
| } | ||||
| 
 | ||||
| var _ logging.Tracer = (*tracer)(nil) | ||||
| 
 | ||||
| // connTracer collects connection level metrics
 | ||||
| type connTracer struct { | ||||
| 	metricsCollector MetricsCollector | ||||
| } | ||||
| 
 | ||||
| var _ logging.ConnectionTracer = (*connTracer)(nil) | ||||
| 
 | ||||
| func newConnTracer(metricsCollector MetricsCollector) logging.ConnectionTracer { | ||||
| 	return &connTracer{ | ||||
| func newConnTracer(metricsCollector MetricsCollector) *logging.ConnectionTracer { | ||||
| 	tracer := connTracer{ | ||||
| 		metricsCollector: metricsCollector, | ||||
| 	} | ||||
| 	return &logging.ConnectionTracer{ | ||||
| 		StartedConnection:                tracer.StartedConnection, | ||||
| 		NegotiatedVersion:                tracer.NegotiatedVersion, | ||||
| 		ClosedConnection:                 tracer.ClosedConnection, | ||||
| 		SentTransportParameters:          tracer.SentTransportParameters, | ||||
| 		ReceivedTransportParameters:      tracer.ReceivedTransportParameters, | ||||
| 		RestoredTransportParameters:      tracer.RestoredTransportParameters, | ||||
| 		SentLongHeaderPacket:             tracer.SentLongHeaderPacket, | ||||
| 		SentShortHeaderPacket:            tracer.SentShortHeaderPacket, | ||||
| 		ReceivedVersionNegotiationPacket: tracer.ReceivedVersionNegotiationPacket, | ||||
| 		ReceivedRetry:                    tracer.ReceivedRetry, | ||||
| 		ReceivedLongHeaderPacket:         tracer.ReceivedLongHeaderPacket, | ||||
| 		ReceivedShortHeaderPacket:        tracer.ReceivedShortHeaderPacket, | ||||
| 		BufferedPacket:                   tracer.BufferedPacket, | ||||
| 		DroppedPacket:                    tracer.DroppedPacket, | ||||
| 		UpdatedMetrics:                   tracer.UpdatedMetrics, | ||||
| 		AcknowledgedPacket:               tracer.AcknowledgedPacket, | ||||
| 		LostPacket:                       tracer.LostPacket, | ||||
| 		UpdatedCongestionState:           tracer.UpdatedCongestionState, | ||||
| 		UpdatedPTOCount:                  tracer.UpdatedPTOCount, | ||||
| 		UpdatedKeyFromTLS:                tracer.UpdatedKeyFromTLS, | ||||
| 		UpdatedKey:                       tracer.UpdatedKey, | ||||
| 		DroppedEncryptionLevel:           tracer.DroppedEncryptionLevel, | ||||
| 		DroppedKey:                       tracer.DroppedKey, | ||||
| 		SetLossTimer:                     tracer.SetLossTimer, | ||||
| 		LossTimerExpired:                 tracer.LossTimerExpired, | ||||
| 		LossTimerCanceled:                tracer.LossTimerCanceled, | ||||
| 		ECNStateUpdated:                  tracer.ECNStateUpdated, | ||||
| 		Close:                            tracer.Close, | ||||
| 		Debug:                            tracer.Debug, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) StartedConnection(local, remote net.Addr, srcConnID, destConnID logging.ConnectionID) { | ||||
|  | @ -90,7 +109,7 @@ func (ct *connTracer) BufferedPacket(pt logging.PacketType, size logging.ByteCou | |||
| 	ct.metricsCollector.bufferedPackets(pt) | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) DroppedPacket(pt logging.PacketType, size logging.ByteCount, reason logging.PacketDropReason) { | ||||
| func (ct *connTracer) DroppedPacket(pt logging.PacketType, number logging.PacketNumber, size logging.ByteCount, reason logging.PacketDropReason) { | ||||
| 	ct.metricsCollector.droppedPackets(pt, size, reason) | ||||
| } | ||||
| 
 | ||||
|  | @ -114,10 +133,10 @@ func (ct *connTracer) ReceivedTransportParameters(parameters *logging.TransportP | |||
| func (ct *connTracer) RestoredTransportParameters(parameters *logging.TransportParameters) { | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) SentLongHeaderPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, ack *logging.AckFrame, frames []logging.Frame) { | ||||
| func (ct *connTracer) SentLongHeaderPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, ecn logging.ECN, ack *logging.AckFrame, frames []logging.Frame) { | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) SentShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, ack *logging.AckFrame, frames []logging.Frame) { | ||||
| func (ct *connTracer) SentShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, ecn logging.ECN, ack *logging.AckFrame, frames []logging.Frame) { | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) ReceivedVersionNegotiationPacket(dest, src logging.ArbitraryLenConnectionID, _ []logging.VersionNumber) { | ||||
|  | @ -126,10 +145,10 @@ func (ct *connTracer) ReceivedVersionNegotiationPacket(dest, src logging.Arbitra | |||
| func (ct *connTracer) ReceivedRetry(header *logging.Header) { | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) ReceivedLongHeaderPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, frames []logging.Frame) { | ||||
| func (ct *connTracer) ReceivedLongHeaderPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, ecn logging.ECN, frames []logging.Frame) { | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) ReceivedShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, frames []logging.Frame) { | ||||
| func (ct *connTracer) ReceivedShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, ecn logging.ECN, frames []logging.Frame) { | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) AcknowledgedPacket(level logging.EncryptionLevel, number logging.PacketNumber) { | ||||
|  | @ -162,6 +181,10 @@ func (ct *connTracer) LossTimerExpired(timerType logging.TimerType, level loggin | |||
| func (ct *connTracer) LossTimerCanceled() { | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) ECNStateUpdated(state logging.ECNState, trigger logging.ECNStateTrigger) { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func (ct *connTracer) Close() { | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,12 +1,8 @@ | |||
| package supervisor | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto/tls" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/cloudflare/cloudflared/features" | ||||
| ) | ||||
|  | @ -20,84 +16,6 @@ const ( | |||
| 	PQKexName = "X25519Kyber768Draft00" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	pqtMux       sync.Mutex // protects pqtSubmitted and pqtWaitForMessage
 | ||||
| 	pqtSubmitted bool       // whether an error has already been submitted
 | ||||
| 
 | ||||
| 	// Number of errors to ignore before printing elaborate instructions.
 | ||||
| 	pqtWaitForMessage int | ||||
| ) | ||||
| 
 | ||||
| func handlePQTunnelError(rep error, config *TunnelConfig) { | ||||
| 	needToMessage := false | ||||
| 
 | ||||
| 	pqtMux.Lock() | ||||
| 	needToSubmit := !pqtSubmitted | ||||
| 	if needToSubmit { | ||||
| 		pqtSubmitted = true | ||||
| 	} | ||||
| 	pqtWaitForMessage-- | ||||
| 	if pqtWaitForMessage < 0 { | ||||
| 		pqtWaitForMessage = 5 | ||||
| 		needToMessage = true | ||||
| 	} | ||||
| 	pqtMux.Unlock() | ||||
| 
 | ||||
| 	if needToMessage { | ||||
| 		config.Log.Info().Msgf( | ||||
| 			"\n\n" + | ||||
| 				"===================================================================================\n" + | ||||
| 				"You are hitting an error while using the experimental post-quantum tunnels feature.\n" + | ||||
| 				"\n" + | ||||
| 				"Please check:\n" + | ||||
| 				"\n" + | ||||
| 				"   https://pqtunnels.cloudflareresearch.com\n" + | ||||
| 				"\n" + | ||||
| 				"for known problems.\n" + | ||||
| 				"===================================================================================\n\n", | ||||
| 		) | ||||
| 	} | ||||
| 
 | ||||
| 	if needToSubmit { | ||||
| 		go submitPQTunnelError(rep, config) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func submitPQTunnelError(rep error, config *TunnelConfig) { | ||||
| 	body, err := json.Marshal(struct { | ||||
| 		Group   int    `json:"g"` | ||||
| 		Message string `json:"m"` | ||||
| 		Version string `json:"v"` | ||||
| 	}{ | ||||
| 		Group:   int(PQKex), | ||||
| 		Message: rep.Error(), | ||||
| 		Version: config.ReportedVersion, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		config.Log.Err(err).Msg("Failed to create error report") | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	resp, err := http.Post( | ||||
| 		"https://pqtunnels.cloudflareresearch.com", | ||||
| 		"application/json", | ||||
| 		bytes.NewBuffer(body), | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		config.Log.Err(err).Msg( | ||||
| 			"Failed to submit post-quantum tunnel error report", | ||||
| 		) | ||||
| 		return | ||||
| 	} | ||||
| 	if resp.StatusCode != 200 { | ||||
| 		config.Log.Error().Msgf( | ||||
| 			"Failed to submit post-quantum tunnel error report: status %d", | ||||
| 			resp.StatusCode, | ||||
| 		) | ||||
| 	} | ||||
| 	resp.Body.Close() | ||||
| } | ||||
| 
 | ||||
| func curvePreference(pqMode features.PostQuantumMode, currentCurve []tls.CurveID) ([]tls.CurveID, error) { | ||||
| 	switch pqMode { | ||||
| 	case features.PostQuantumStrict: | ||||
|  | @ -113,15 +31,6 @@ func curvePreference(pqMode features.PostQuantumMode, currentCurve []tls.CurveID | |||
| 			return append([]tls.CurveID{PQKex}, currentCurve...), nil | ||||
| 		} | ||||
| 		return currentCurve, nil | ||||
| 	case features.PostQuantumDisabled: | ||||
| 		curvePref := currentCurve | ||||
| 		// Remove PQ from curve preference
 | ||||
| 		for i, curve := range currentCurve { | ||||
| 			if curve == PQKex { | ||||
| 				curvePref = append(curvePref[:i], curvePref[i+1:]...) | ||||
| 			} | ||||
| 		} | ||||
| 		return curvePref, nil | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("Unexpected post quantum mode") | ||||
| 	} | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ package supervisor | |||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"crypto/tls" | ||||
| 	"errors" | ||||
| 	"net" | ||||
| 	"strings" | ||||
|  | @ -11,8 +10,6 @@ import ( | |||
| 	"github.com/quic-go/quic-go" | ||||
| 	"github.com/rs/zerolog" | ||||
| 
 | ||||
| 	qtls120 "github.com/quic-go/qtls-go1-20" | ||||
| 
 | ||||
| 	"github.com/cloudflare/cloudflared/connection" | ||||
| 	"github.com/cloudflare/cloudflared/edgediscovery" | ||||
| 	"github.com/cloudflare/cloudflared/orchestration" | ||||
|  | @ -81,8 +78,6 @@ func NewSupervisor(config *TunnelConfig, orchestrator *orchestration.Orchestrato | |||
| 
 | ||||
| 	reconnectCredentialManager := newReconnectCredentialManager(connection.MetricsNamespace, connection.TunnelSubsystem, config.HAConnections) | ||||
| 
 | ||||
| 	registerTLSEventLogger(config.Log) | ||||
| 
 | ||||
| 	tracker := tunnelstate.NewConnTracker(config.Log) | ||||
| 	log := NewConnAwareLogger(config.Log, tracker, config.Observer) | ||||
| 
 | ||||
|  | @ -341,26 +336,3 @@ func (s *Supervisor) waitForNextTunnel(index int) bool { | |||
| func (s *Supervisor) unusedIPs() bool { | ||||
| 	return s.edgeIPs.AvailableAddrs() > s.config.HAConnections | ||||
| } | ||||
| 
 | ||||
| func registerTLSEventLogger(logger *zerolog.Logger) { | ||||
| 	qtls120.SetCFEventHandler(func(ev qtls120.CFEvent) { | ||||
| 		logger.Debug().Bool("handshake", ev.IsHandshake()).Str("handshake_duration", ev.Duration().String()).Str("curve", tlsCurveName(ev.KEX())).Msg("QUIC TLS event") | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| func tlsCurveName(curve tls.CurveID) string { | ||||
| 	switch curve { | ||||
| 	case tls.CurveP256: | ||||
| 		return "p256" | ||||
| 	case tls.CurveP384: | ||||
| 		return "p384" | ||||
| 	case tls.CurveP521: | ||||
| 		return "p521" | ||||
| 	case tls.X25519: | ||||
| 		return "X25519" | ||||
| 	case PQKex: | ||||
| 		return PQKexName | ||||
| 	default: | ||||
| 		return "unknown" | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -597,7 +597,6 @@ func (e *EdgeTunnelServer) serveQUIC( | |||
| 		MaxIncomingStreams:      quicpogs.MaxIncomingStreams, | ||||
| 		MaxIncomingUniStreams:   quicpogs.MaxIncomingStreams, | ||||
| 		EnableDatagrams:         true, | ||||
| 		MaxDatagramFrameSize:    quicpogs.MaxDatagramFrameSize, | ||||
| 		Tracer:                  quicpogs.NewClientTracer(connLogger.Logger(), connIndex), | ||||
| 		DisablePathMTUDiscovery: e.config.DisableQUICPathMTUDiscovery, | ||||
| 	} | ||||
|  | @ -617,10 +616,6 @@ func (e *EdgeTunnelServer) serveQUIC( | |||
| 		e.config.UDPUnregisterSessionTimeout, | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		if pqMode == features.PostQuantumStrict || pqMode == features.PostQuantumPrefer { | ||||
| 			handlePQTunnelError(err, e.config) | ||||
| 		} | ||||
| 
 | ||||
| 		connLogger.ConnAwareLogger().Err(err).Msgf("Failed to create new quic connection") | ||||
| 		return err, true | ||||
| 	} | ||||
|  |  | |||
|  | @ -0,0 +1,54 @@ | |||
| //go:build linux || darwin
 | ||||
| 
 | ||||
| package token | ||||
| 
 | ||||
| import ( | ||||
| 	"os" | ||||
| 	"syscall" | ||||
| 	"testing" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| ) | ||||
| 
 | ||||
| func TestSignalHandler(t *testing.T) { | ||||
| 	sigHandler := signalHandler{signals: []os.Signal{syscall.SIGUSR1}} | ||||
| 	handlerRan := false | ||||
| 	done := make(chan struct{}) | ||||
| 	timer := time.NewTimer(time.Second) | ||||
| 	sigHandler.register(func() { | ||||
| 		handlerRan = true | ||||
| 		done <- struct{}{} | ||||
| 	}) | ||||
| 
 | ||||
| 	p, err := os.FindProcess(os.Getpid()) | ||||
| 	require.Nil(t, err) | ||||
| 	p.Signal(syscall.SIGUSR1) | ||||
| 
 | ||||
| 	// Blocks for up to one second to make sure the handler callback runs before the assert.
 | ||||
| 	select { | ||||
| 	case <-done: | ||||
| 		assert.True(t, handlerRan) | ||||
| 	case <-timer.C: | ||||
| 		t.Fail() | ||||
| 	} | ||||
| 	sigHandler.deregister() | ||||
| } | ||||
| 
 | ||||
| func TestSignalHandlerClose(t *testing.T) { | ||||
| 	sigHandler := signalHandler{signals: []os.Signal{syscall.SIGUSR1}} | ||||
| 	done := make(chan struct{}) | ||||
| 	timer := time.NewTimer(time.Second) | ||||
| 	sigHandler.register(func() { done <- struct{}{} }) | ||||
| 	sigHandler.deregister() | ||||
| 
 | ||||
| 	p, err := os.FindProcess(os.Getpid()) | ||||
| 	require.Nil(t, err) | ||||
| 	p.Signal(syscall.SIGUSR1) | ||||
| 	select { | ||||
| 	case <-done: | ||||
| 		t.Fail() | ||||
| 	case <-timer.C: | ||||
| 	} | ||||
| } | ||||
|  | @ -21,11 +21,13 @@ import ( | |||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	keyName               = "token" | ||||
| 	tokenCookie           = "CF_Authorization" | ||||
| 	appDomainHeader       = "CF-Access-Domain" | ||||
| 	appAUDHeader          = "CF-Access-Aud" | ||||
| 	AccessLoginWorkerPath = "/cdn-cgi/access/login" | ||||
| 	keyName                    = "token" | ||||
| 	tokenCookie                = "CF_Authorization" | ||||
| 	appSessionCookie           = "CF_AppSession" | ||||
| 	appDomainHeader            = "CF-Access-Domain" | ||||
| 	appAUDHeader               = "CF-Access-Aud" | ||||
| 	AccessLoginWorkerPath      = "/cdn-cgi/access/login" | ||||
| 	AccessAuthorizedWorkerPath = "/cdn-cgi/access/authorized" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
|  | @ -297,20 +299,41 @@ func GetAppInfo(reqURL *url.URL) (*AppInfo, error) { | |||
| 	return &AppInfo{location.Hostname(), aud, domain}, nil | ||||
| } | ||||
| 
 | ||||
| func handleRedirects(req *http.Request, via []*http.Request, orgToken string) error { | ||||
| 	// attach org token to login request
 | ||||
| 	if strings.Contains(req.URL.Path, AccessLoginWorkerPath) { | ||||
| 		req.AddCookie(&http.Cookie{Name: tokenCookie, Value: orgToken}) | ||||
| 	} | ||||
| 
 | ||||
| 	// attach app session cookie to authorized request
 | ||||
| 	if strings.Contains(req.URL.Path, AccessAuthorizedWorkerPath) { | ||||
| 		// We need to check and see if the CF_APP_SESSION cookie was set
 | ||||
| 		for _, prevReq := range via { | ||||
| 			if prevReq != nil && prevReq.Response != nil { | ||||
| 				for _, c := range prevReq.Response.Cookies() { | ||||
| 					if c.Name == appSessionCookie { | ||||
| 						req.AddCookie(&http.Cookie{Name: appSessionCookie, Value: c.Value}) | ||||
| 						return nil | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	// stop after hitting authorized endpoint since it will contain the app token
 | ||||
| 	if len(via) > 0 && strings.Contains(via[len(via)-1].URL.Path, AccessAuthorizedWorkerPath) { | ||||
| 		return http.ErrUseLastResponse | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // exchangeOrgToken attaches an org token to a request to the appURL and returns an app token. This uses the Access SSO
 | ||||
| // flow to automatically generate and return an app token without the login page.
 | ||||
| func exchangeOrgToken(appURL *url.URL, orgToken string) (string, error) { | ||||
| 	client := &http.Client{ | ||||
| 		CheckRedirect: func(req *http.Request, via []*http.Request) error { | ||||
| 			// attach org token to login request
 | ||||
| 			if strings.Contains(req.URL.Path, AccessLoginWorkerPath) { | ||||
| 				req.AddCookie(&http.Cookie{Name: tokenCookie, Value: orgToken}) | ||||
| 			} | ||||
| 			// stop after hitting authorized endpoint since it will contain the app token
 | ||||
| 			if strings.Contains(via[len(via)-1].URL.Path, "cdn-cgi/access/authorized") { | ||||
| 				return http.ErrUseLastResponse | ||||
| 			} | ||||
| 			return nil | ||||
| 			return handleRedirects(req, via, orgToken) | ||||
| 		}, | ||||
| 		Timeout: time.Second * 7, | ||||
| 	} | ||||
|  |  | |||
|  | @ -1,54 +1,82 @@ | |||
| //go:build linux
 | ||||
| 
 | ||||
| package token | ||||
| 
 | ||||
| import ( | ||||
| 	"os" | ||||
| 	"syscall" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"testing" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| ) | ||||
| 
 | ||||
| func TestSignalHandler(t *testing.T) { | ||||
| 	sigHandler := signalHandler{signals: []os.Signal{syscall.SIGUSR1}} | ||||
| 	handlerRan := false | ||||
| 	done := make(chan struct{}) | ||||
| 	timer := time.NewTimer(time.Second) | ||||
| 	sigHandler.register(func() { | ||||
| 		handlerRan = true | ||||
| 		done <- struct{}{} | ||||
| 	}) | ||||
| func TestHandleRedirects_AttachOrgToken(t *testing.T) { | ||||
| 	req, _ := http.NewRequest("GET", "http://example.com/cdn-cgi/access/login", nil) | ||||
| 	via := []*http.Request{} | ||||
| 	orgToken := "orgTokenValue" | ||||
| 
 | ||||
| 	p, err := os.FindProcess(os.Getpid()) | ||||
| 	require.Nil(t, err) | ||||
| 	p.Signal(syscall.SIGUSR1) | ||||
| 	handleRedirects(req, via, orgToken) | ||||
| 
 | ||||
| 	// Blocks for up to one second to make sure the handler callback runs before the assert.
 | ||||
| 	select { | ||||
| 	case <-done: | ||||
| 		assert.True(t, handlerRan) | ||||
| 	case <-timer.C: | ||||
| 		t.Fail() | ||||
| 	// Check if the orgToken cookie is attached
 | ||||
| 	cookies := req.Cookies() | ||||
| 	found := false | ||||
| 	for _, cookie := range cookies { | ||||
| 		if cookie.Name == tokenCookie && cookie.Value == orgToken { | ||||
| 			found = true | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	sigHandler.deregister() | ||||
| } | ||||
| 
 | ||||
| func TestSignalHandlerClose(t *testing.T) { | ||||
| 	sigHandler := signalHandler{signals: []os.Signal{syscall.SIGUSR1}} | ||||
| 	done := make(chan struct{}) | ||||
| 	timer := time.NewTimer(time.Second) | ||||
| 	sigHandler.register(func() { done <- struct{}{} }) | ||||
| 	sigHandler.deregister() | ||||
| 
 | ||||
| 	p, err := os.FindProcess(os.Getpid()) | ||||
| 	require.Nil(t, err) | ||||
| 	p.Signal(syscall.SIGUSR1) | ||||
| 	select { | ||||
| 	case <-done: | ||||
| 		t.Fail() | ||||
| 	case <-timer.C: | ||||
| 	if !found { | ||||
| 		t.Errorf("OrgToken cookie not attached to the request.") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestHandleRedirects_AttachAppSessionCookie(t *testing.T) { | ||||
| 	req, _ := http.NewRequest("GET", "http://example.com/cdn-cgi/access/authorized", nil) | ||||
| 	via := []*http.Request{ | ||||
| 		{ | ||||
| 			URL: &url.URL{Path: "/cdn-cgi/access/login"}, | ||||
| 			Response: &http.Response{ | ||||
| 				Header: http.Header{"Set-Cookie": {"CF_AppSession=appSessionValue"}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	orgToken := "orgTokenValue" | ||||
| 
 | ||||
| 	err := handleRedirects(req, via, orgToken) | ||||
| 
 | ||||
| 	// Check if the appSessionCookie is attached to the request
 | ||||
| 	cookies := req.Cookies() | ||||
| 	found := false | ||||
| 	for _, cookie := range cookies { | ||||
| 		if cookie.Name == appSessionCookie && cookie.Value == "appSessionValue" { | ||||
| 			found = true | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if !found { | ||||
| 		t.Errorf("AppSessionCookie not attached to the request.") | ||||
| 	} | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		t.Errorf("Expected no error, got %v", err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestHandleRedirects_StopAtAuthorizedEndpoint(t *testing.T) { | ||||
| 	req, _ := http.NewRequest("GET", "http://example.com/cdn-cgi/access/authorized", nil) | ||||
| 	via := []*http.Request{ | ||||
| 		{ | ||||
| 			URL: &url.URL{Path: "other"}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			URL: &url.URL{Path: AccessAuthorizedWorkerPath}, | ||||
| 		}, | ||||
| 	} | ||||
| 	orgToken := "orgTokenValue" | ||||
| 
 | ||||
| 	err := handleRedirects(req, via, orgToken) | ||||
| 
 | ||||
| 	// Check if ErrUseLastResponse is returned
 | ||||
| 	if err != http.ErrUseLastResponse { | ||||
| 		t.Errorf("Expected ErrUseLastResponse, got %v", err) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -132,8 +132,7 @@ func createResourceSpan(spans []*tracepb.Span) *tracepb.ResourceSpans { | |||
| 				SchemaUrl: instrumentSchemaUrl, | ||||
| 			}, | ||||
| 		}, | ||||
| 		InstrumentationLibrarySpans: nil, | ||||
| 		SchemaUrl:                   resourceSchemaUrl, | ||||
| 		SchemaUrl: resourceSchemaUrl, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -118,6 +118,7 @@ func TestSerializeAuthenticationResponse(t *testing.T) { | |||
| 
 | ||||
| 	for i, testCase := range tests { | ||||
| 		_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil)) | ||||
| 		assert.NoError(t, err) | ||||
| 		capnpEntity, err := tunnelrpc.NewAuthenticateResponse(seg) | ||||
| 		if !assert.NoError(t, err) { | ||||
| 			t.Fatal("Couldn't initialize a new message") | ||||
|  |  | |||
|  | @ -38,6 +38,7 @@ func TestTunnelRegistration(t *testing.T) { | |||
| 	} | ||||
| 	for i, testCase := range testCases { | ||||
| 		_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil)) | ||||
| 		assert.NoError(t, err) | ||||
| 		capnpEntity, err := tunnelrpc.NewTunnelRegistration(seg) | ||||
| 		if !assert.NoError(t, err) { | ||||
| 			t.Fatal("Couldn't initialize a new message") | ||||
|  |  | |||
|  | @ -3,8 +3,7 @@ | |||
| [](https://pkg.go.dev/github.com/cespare/xxhash/v2) | ||||
| [](https://github.com/cespare/xxhash/actions/workflows/test.yml) | ||||
| 
 | ||||
| xxhash is a Go implementation of the 64-bit | ||||
| [xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a | ||||
| xxhash is a Go implementation of the 64-bit [xxHash] algorithm, XXH64. This is a | ||||
| high-quality hashing algorithm that is much faster than anything in the Go | ||||
| standard library. | ||||
| 
 | ||||
|  | @ -25,8 +24,11 @@ func (*Digest) WriteString(string) (int, error) | |||
| func (*Digest) Sum64() uint64 | ||||
| ``` | ||||
| 
 | ||||
| This implementation provides a fast pure-Go implementation and an even faster | ||||
| assembly implementation for amd64. | ||||
| The package is written with optimized pure Go and also contains even faster | ||||
| assembly implementations for amd64 and arm64. If desired, the `purego` build tag | ||||
| opts into using the Go code even on those architectures. | ||||
| 
 | ||||
| [xxHash]: http://cyan4973.github.io/xxHash/ | ||||
| 
 | ||||
| ## Compatibility | ||||
| 
 | ||||
|  | @ -45,19 +47,20 @@ I recommend using the latest release of Go. | |||
| Here are some quick benchmarks comparing the pure-Go and assembly | ||||
| implementations of Sum64. | ||||
| 
 | ||||
| | input size | purego | asm | | ||||
| | --- | --- | --- | | ||||
| | 5 B   |  979.66 MB/s |  1291.17 MB/s  | | ||||
| | 100 B | 7475.26 MB/s | 7973.40 MB/s  | | ||||
| | 4 KB  | 17573.46 MB/s | 17602.65 MB/s | | ||||
| | 10 MB | 17131.46 MB/s | 17142.16 MB/s | | ||||
| | input size | purego    | asm       | | ||||
| | ---------- | --------- | --------- | | ||||
| | 4 B        |  1.3 GB/s |  1.2 GB/s | | ||||
| | 16 B       |  2.9 GB/s |  3.5 GB/s | | ||||
| | 100 B      |  6.9 GB/s |  8.1 GB/s | | ||||
| | 4 KB       | 11.7 GB/s | 16.7 GB/s | | ||||
| | 10 MB      | 12.0 GB/s | 17.3 GB/s | | ||||
| 
 | ||||
| These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using | ||||
| the following commands under Go 1.11.2: | ||||
| These numbers were generated on Ubuntu 20.04 with an Intel Xeon Platinum 8252C | ||||
| CPU using the following commands under Go 1.19.2: | ||||
| 
 | ||||
| ``` | ||||
| $ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes' | ||||
| $ go test -benchtime 10s -bench '/xxhash,direct,bytes' | ||||
| benchstat <(go test -tags purego -benchtime 500ms -count 15 -bench 'Sum64$') | ||||
| benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$') | ||||
| ``` | ||||
| 
 | ||||
| ## Projects using this package | ||||
|  |  | |||
|  | @ -0,0 +1,10 @@ | |||
| #!/bin/bash | ||||
| set -eu -o pipefail | ||||
| 
 | ||||
| # Small convenience script for running the tests with various combinations of | ||||
| # arch/tags. This assumes we're running on amd64 and have qemu available. | ||||
| 
 | ||||
| go test ./... | ||||
| go test -tags purego ./... | ||||
| GOARCH=arm64 go test | ||||
| GOARCH=arm64 go test -tags purego | ||||
|  | @ -16,19 +16,11 @@ const ( | |||
| 	prime5 uint64 = 2870177450012600261 | ||||
| ) | ||||
| 
 | ||||
| // NOTE(caleb): I'm using both consts and vars of the primes. Using consts where
 | ||||
| // possible in the Go code is worth a small (but measurable) performance boost
 | ||||
| // by avoiding some MOVQs. Vars are needed for the asm and also are useful for
 | ||||
| // convenience in the Go code in a few places where we need to intentionally
 | ||||
| // avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the
 | ||||
| // result overflows a uint64).
 | ||||
| var ( | ||||
| 	prime1v = prime1 | ||||
| 	prime2v = prime2 | ||||
| 	prime3v = prime3 | ||||
| 	prime4v = prime4 | ||||
| 	prime5v = prime5 | ||||
| ) | ||||
| // Store the primes in an array as well.
 | ||||
| //
 | ||||
| // The consts are used when possible in Go code to avoid MOVs but we need a
 | ||||
| // contiguous array of the assembly code.
 | ||||
| var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5} | ||||
| 
 | ||||
| // Digest implements hash.Hash64.
 | ||||
| type Digest struct { | ||||
|  | @ -50,10 +42,10 @@ func New() *Digest { | |||
| 
 | ||||
| // Reset clears the Digest's state so that it can be reused.
 | ||||
| func (d *Digest) Reset() { | ||||
| 	d.v1 = prime1v + prime2 | ||||
| 	d.v1 = primes[0] + prime2 | ||||
| 	d.v2 = prime2 | ||||
| 	d.v3 = 0 | ||||
| 	d.v4 = -prime1v | ||||
| 	d.v4 = -primes[0] | ||||
| 	d.total = 0 | ||||
| 	d.n = 0 | ||||
| } | ||||
|  | @ -69,21 +61,23 @@ func (d *Digest) Write(b []byte) (n int, err error) { | |||
| 	n = len(b) | ||||
| 	d.total += uint64(n) | ||||
| 
 | ||||
| 	memleft := d.mem[d.n&(len(d.mem)-1):] | ||||
| 
 | ||||
| 	if d.n+n < 32 { | ||||
| 		// This new data doesn't even fill the current block.
 | ||||
| 		copy(d.mem[d.n:], b) | ||||
| 		copy(memleft, b) | ||||
| 		d.n += n | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if d.n > 0 { | ||||
| 		// Finish off the partial block.
 | ||||
| 		copy(d.mem[d.n:], b) | ||||
| 		c := copy(memleft, b) | ||||
| 		d.v1 = round(d.v1, u64(d.mem[0:8])) | ||||
| 		d.v2 = round(d.v2, u64(d.mem[8:16])) | ||||
| 		d.v3 = round(d.v3, u64(d.mem[16:24])) | ||||
| 		d.v4 = round(d.v4, u64(d.mem[24:32])) | ||||
| 		b = b[32-d.n:] | ||||
| 		b = b[c:] | ||||
| 		d.n = 0 | ||||
| 	} | ||||
| 
 | ||||
|  | @ -133,21 +127,20 @@ func (d *Digest) Sum64() uint64 { | |||
| 
 | ||||
| 	h += d.total | ||||
| 
 | ||||
| 	i, end := 0, d.n | ||||
| 	for ; i+8 <= end; i += 8 { | ||||
| 		k1 := round(0, u64(d.mem[i:i+8])) | ||||
| 	b := d.mem[:d.n&(len(d.mem)-1)] | ||||
| 	for ; len(b) >= 8; b = b[8:] { | ||||
| 		k1 := round(0, u64(b[:8])) | ||||
| 		h ^= k1 | ||||
| 		h = rol27(h)*prime1 + prime4 | ||||
| 	} | ||||
| 	if i+4 <= end { | ||||
| 		h ^= uint64(u32(d.mem[i:i+4])) * prime1 | ||||
| 	if len(b) >= 4 { | ||||
| 		h ^= uint64(u32(b[:4])) * prime1 | ||||
| 		h = rol23(h)*prime2 + prime3 | ||||
| 		i += 4 | ||||
| 		b = b[4:] | ||||
| 	} | ||||
| 	for i < end { | ||||
| 		h ^= uint64(d.mem[i]) * prime5 | ||||
| 	for ; len(b) > 0; b = b[1:] { | ||||
| 		h ^= uint64(b[0]) * prime5 | ||||
| 		h = rol11(h) * prime1 | ||||
| 		i++ | ||||
| 	} | ||||
| 
 | ||||
| 	h ^= h >> 33 | ||||
|  |  | |||
|  | @ -1,215 +1,209 @@ | |||
| //go:build !appengine && gc && !purego | ||||
| // +build !appengine | ||||
| // +build gc | ||||
| // +build !purego | ||||
| 
 | ||||
| #include "textflag.h" | ||||
| 
 | ||||
| // Register allocation: | ||||
| // AX	h | ||||
| // SI	pointer to advance through b | ||||
| // DX	n | ||||
| // BX	loop end | ||||
| // R8	v1, k1 | ||||
| // R9	v2 | ||||
| // R10	v3 | ||||
| // R11	v4 | ||||
| // R12	tmp | ||||
| // R13	prime1v | ||||
| // R14	prime2v | ||||
| // DI	prime4v | ||||
| // Registers: | ||||
| #define h      AX | ||||
| #define d      AX | ||||
| #define p      SI // pointer to advance through b | ||||
| #define n      DX | ||||
| #define end    BX // loop end | ||||
| #define v1     R8 | ||||
| #define v2     R9 | ||||
| #define v3     R10 | ||||
| #define v4     R11 | ||||
| #define x      R12 | ||||
| #define prime1 R13 | ||||
| #define prime2 R14 | ||||
| #define prime4 DI | ||||
| 
 | ||||
| // round reads from and advances the buffer pointer in SI. | ||||
| // It assumes that R13 has prime1v and R14 has prime2v. | ||||
| #define round(r) \ | ||||
| 	MOVQ  (SI), R12 \ | ||||
| 	ADDQ  $8, SI    \ | ||||
| 	IMULQ R14, R12  \ | ||||
| 	ADDQ  R12, r    \ | ||||
| 	ROLQ  $31, r    \ | ||||
| 	IMULQ R13, r | ||||
| #define round(acc, x) \ | ||||
| 	IMULQ prime2, x   \ | ||||
| 	ADDQ  x, acc      \ | ||||
| 	ROLQ  $31, acc    \ | ||||
| 	IMULQ prime1, acc | ||||
| 
 | ||||
| // mergeRound applies a merge round on the two registers acc and val. | ||||
| // It assumes that R13 has prime1v, R14 has prime2v, and DI has prime4v. | ||||
| #define mergeRound(acc, val) \ | ||||
| 	IMULQ R14, val \ | ||||
| 	ROLQ  $31, val \ | ||||
| 	IMULQ R13, val \ | ||||
| 	XORQ  val, acc \ | ||||
| 	IMULQ R13, acc \ | ||||
| 	ADDQ  DI, acc | ||||
| // round0 performs the operation x = round(0, x). | ||||
| #define round0(x) \ | ||||
| 	IMULQ prime2, x \ | ||||
| 	ROLQ  $31, x    \ | ||||
| 	IMULQ prime1, x | ||||
| 
 | ||||
| // mergeRound applies a merge round on the two registers acc and x. | ||||
| // It assumes that prime1, prime2, and prime4 have been loaded. | ||||
| #define mergeRound(acc, x) \ | ||||
| 	round0(x)         \ | ||||
| 	XORQ  x, acc      \ | ||||
| 	IMULQ prime1, acc \ | ||||
| 	ADDQ  prime4, acc | ||||
| 
 | ||||
| // blockLoop processes as many 32-byte blocks as possible, | ||||
| // updating v1, v2, v3, and v4. It assumes that there is at least one block | ||||
| // to process. | ||||
| #define blockLoop() \ | ||||
| loop:  \ | ||||
| 	MOVQ +0(p), x  \ | ||||
| 	round(v1, x)   \ | ||||
| 	MOVQ +8(p), x  \ | ||||
| 	round(v2, x)   \ | ||||
| 	MOVQ +16(p), x \ | ||||
| 	round(v3, x)   \ | ||||
| 	MOVQ +24(p), x \ | ||||
| 	round(v4, x)   \ | ||||
| 	ADDQ $32, p    \ | ||||
| 	CMPQ p, end    \ | ||||
| 	JLE  loop | ||||
| 
 | ||||
| // func Sum64(b []byte) uint64 | ||||
| TEXT ·Sum64(SB), NOSPLIT, $0-32 | ||||
| TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 | ||||
| 	// Load fixed primes. | ||||
| 	MOVQ ·prime1v(SB), R13 | ||||
| 	MOVQ ·prime2v(SB), R14 | ||||
| 	MOVQ ·prime4v(SB), DI | ||||
| 	MOVQ ·primes+0(SB), prime1 | ||||
| 	MOVQ ·primes+8(SB), prime2 | ||||
| 	MOVQ ·primes+24(SB), prime4 | ||||
| 
 | ||||
| 	// Load slice. | ||||
| 	MOVQ b_base+0(FP), SI | ||||
| 	MOVQ b_len+8(FP), DX | ||||
| 	LEAQ (SI)(DX*1), BX | ||||
| 	MOVQ b_base+0(FP), p | ||||
| 	MOVQ b_len+8(FP), n | ||||
| 	LEAQ (p)(n*1), end | ||||
| 
 | ||||
| 	// The first loop limit will be len(b)-32. | ||||
| 	SUBQ $32, BX | ||||
| 	SUBQ $32, end | ||||
| 
 | ||||
| 	// Check whether we have at least one block. | ||||
| 	CMPQ DX, $32 | ||||
| 	CMPQ n, $32 | ||||
| 	JLT  noBlocks | ||||
| 
 | ||||
| 	// Set up initial state (v1, v2, v3, v4). | ||||
| 	MOVQ R13, R8 | ||||
| 	ADDQ R14, R8 | ||||
| 	MOVQ R14, R9 | ||||
| 	XORQ R10, R10 | ||||
| 	XORQ R11, R11 | ||||
| 	SUBQ R13, R11 | ||||
| 	MOVQ prime1, v1 | ||||
| 	ADDQ prime2, v1 | ||||
| 	MOVQ prime2, v2 | ||||
| 	XORQ v3, v3 | ||||
| 	XORQ v4, v4 | ||||
| 	SUBQ prime1, v4 | ||||
| 
 | ||||
| 	// Loop until SI > BX. | ||||
| blockLoop: | ||||
| 	round(R8) | ||||
| 	round(R9) | ||||
| 	round(R10) | ||||
| 	round(R11) | ||||
| 	blockLoop() | ||||
| 
 | ||||
| 	CMPQ SI, BX | ||||
| 	JLE  blockLoop | ||||
| 	MOVQ v1, h | ||||
| 	ROLQ $1, h | ||||
| 	MOVQ v2, x | ||||
| 	ROLQ $7, x | ||||
| 	ADDQ x, h | ||||
| 	MOVQ v3, x | ||||
| 	ROLQ $12, x | ||||
| 	ADDQ x, h | ||||
| 	MOVQ v4, x | ||||
| 	ROLQ $18, x | ||||
| 	ADDQ x, h | ||||
| 
 | ||||
| 	MOVQ R8, AX | ||||
| 	ROLQ $1, AX | ||||
| 	MOVQ R9, R12 | ||||
| 	ROLQ $7, R12 | ||||
| 	ADDQ R12, AX | ||||
| 	MOVQ R10, R12 | ||||
| 	ROLQ $12, R12 | ||||
| 	ADDQ R12, AX | ||||
| 	MOVQ R11, R12 | ||||
| 	ROLQ $18, R12 | ||||
| 	ADDQ R12, AX | ||||
| 
 | ||||
| 	mergeRound(AX, R8) | ||||
| 	mergeRound(AX, R9) | ||||
| 	mergeRound(AX, R10) | ||||
| 	mergeRound(AX, R11) | ||||
| 	mergeRound(h, v1) | ||||
| 	mergeRound(h, v2) | ||||
| 	mergeRound(h, v3) | ||||
| 	mergeRound(h, v4) | ||||
| 
 | ||||
| 	JMP afterBlocks | ||||
| 
 | ||||
| noBlocks: | ||||
| 	MOVQ ·prime5v(SB), AX | ||||
| 	MOVQ ·primes+32(SB), h | ||||
| 
 | ||||
| afterBlocks: | ||||
| 	ADDQ DX, AX | ||||
| 	ADDQ n, h | ||||
| 
 | ||||
| 	// Right now BX has len(b)-32, and we want to loop until SI > len(b)-8. | ||||
| 	ADDQ $24, BX | ||||
| 	ADDQ $24, end | ||||
| 	CMPQ p, end | ||||
| 	JG   try4 | ||||
| 
 | ||||
| 	CMPQ SI, BX | ||||
| 	JG   fourByte | ||||
| loop8: | ||||
| 	MOVQ  (p), x | ||||
| 	ADDQ  $8, p | ||||
| 	round0(x) | ||||
| 	XORQ  x, h | ||||
| 	ROLQ  $27, h | ||||
| 	IMULQ prime1, h | ||||
| 	ADDQ  prime4, h | ||||
| 
 | ||||
| wordLoop: | ||||
| 	// Calculate k1. | ||||
| 	MOVQ  (SI), R8 | ||||
| 	ADDQ  $8, SI | ||||
| 	IMULQ R14, R8 | ||||
| 	ROLQ  $31, R8 | ||||
| 	IMULQ R13, R8 | ||||
| 	CMPQ p, end | ||||
| 	JLE  loop8 | ||||
| 
 | ||||
| 	XORQ  R8, AX | ||||
| 	ROLQ  $27, AX | ||||
| 	IMULQ R13, AX | ||||
| 	ADDQ  DI, AX | ||||
| try4: | ||||
| 	ADDQ $4, end | ||||
| 	CMPQ p, end | ||||
| 	JG   try1 | ||||
| 
 | ||||
| 	CMPQ SI, BX | ||||
| 	JLE  wordLoop | ||||
| 	MOVL  (p), x | ||||
| 	ADDQ  $4, p | ||||
| 	IMULQ prime1, x | ||||
| 	XORQ  x, h | ||||
| 
 | ||||
| fourByte: | ||||
| 	ADDQ $4, BX | ||||
| 	CMPQ SI, BX | ||||
| 	JG   singles | ||||
| 	ROLQ  $23, h | ||||
| 	IMULQ prime2, h | ||||
| 	ADDQ  ·primes+16(SB), h | ||||
| 
 | ||||
| 	MOVL  (SI), R8 | ||||
| 	ADDQ  $4, SI | ||||
| 	IMULQ R13, R8 | ||||
| 	XORQ  R8, AX | ||||
| 
 | ||||
| 	ROLQ  $23, AX | ||||
| 	IMULQ R14, AX | ||||
| 	ADDQ  ·prime3v(SB), AX | ||||
| 
 | ||||
| singles: | ||||
| 	ADDQ $4, BX | ||||
| 	CMPQ SI, BX | ||||
| try1: | ||||
| 	ADDQ $4, end | ||||
| 	CMPQ p, end | ||||
| 	JGE  finalize | ||||
| 
 | ||||
| singlesLoop: | ||||
| 	MOVBQZX (SI), R12 | ||||
| 	ADDQ    $1, SI | ||||
| 	IMULQ   ·prime5v(SB), R12 | ||||
| 	XORQ    R12, AX | ||||
| loop1: | ||||
| 	MOVBQZX (p), x | ||||
| 	ADDQ    $1, p | ||||
| 	IMULQ   ·primes+32(SB), x | ||||
| 	XORQ    x, h | ||||
| 	ROLQ    $11, h | ||||
| 	IMULQ   prime1, h | ||||
| 
 | ||||
| 	ROLQ  $11, AX | ||||
| 	IMULQ R13, AX | ||||
| 
 | ||||
| 	CMPQ SI, BX | ||||
| 	JL   singlesLoop | ||||
| 	CMPQ p, end | ||||
| 	JL   loop1 | ||||
| 
 | ||||
| finalize: | ||||
| 	MOVQ  AX, R12 | ||||
| 	SHRQ  $33, R12 | ||||
| 	XORQ  R12, AX | ||||
| 	IMULQ R14, AX | ||||
| 	MOVQ  AX, R12 | ||||
| 	SHRQ  $29, R12 | ||||
| 	XORQ  R12, AX | ||||
| 	IMULQ ·prime3v(SB), AX | ||||
| 	MOVQ  AX, R12 | ||||
| 	SHRQ  $32, R12 | ||||
| 	XORQ  R12, AX | ||||
| 	MOVQ  h, x | ||||
| 	SHRQ  $33, x | ||||
| 	XORQ  x, h | ||||
| 	IMULQ prime2, h | ||||
| 	MOVQ  h, x | ||||
| 	SHRQ  $29, x | ||||
| 	XORQ  x, h | ||||
| 	IMULQ ·primes+16(SB), h | ||||
| 	MOVQ  h, x | ||||
| 	SHRQ  $32, x | ||||
| 	XORQ  x, h | ||||
| 
 | ||||
| 	MOVQ AX, ret+24(FP) | ||||
| 	MOVQ h, ret+24(FP) | ||||
| 	RET | ||||
| 
 | ||||
| // writeBlocks uses the same registers as above except that it uses AX to store | ||||
| // the d pointer. | ||||
| 
 | ||||
| // func writeBlocks(d *Digest, b []byte) int | ||||
| TEXT ·writeBlocks(SB), NOSPLIT, $0-40 | ||||
| TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 | ||||
| 	// Load fixed primes needed for round. | ||||
| 	MOVQ ·prime1v(SB), R13 | ||||
| 	MOVQ ·prime2v(SB), R14 | ||||
| 	MOVQ ·primes+0(SB), prime1 | ||||
| 	MOVQ ·primes+8(SB), prime2 | ||||
| 
 | ||||
| 	// Load slice. | ||||
| 	MOVQ b_base+8(FP), SI | ||||
| 	MOVQ b_len+16(FP), DX | ||||
| 	LEAQ (SI)(DX*1), BX | ||||
| 	SUBQ $32, BX | ||||
| 	MOVQ b_base+8(FP), p | ||||
| 	MOVQ b_len+16(FP), n | ||||
| 	LEAQ (p)(n*1), end | ||||
| 	SUBQ $32, end | ||||
| 
 | ||||
| 	// Load vN from d. | ||||
| 	MOVQ d+0(FP), AX | ||||
| 	MOVQ 0(AX), R8   // v1 | ||||
| 	MOVQ 8(AX), R9   // v2 | ||||
| 	MOVQ 16(AX), R10 // v3 | ||||
| 	MOVQ 24(AX), R11 // v4 | ||||
| 	MOVQ s+0(FP), d | ||||
| 	MOVQ 0(d), v1 | ||||
| 	MOVQ 8(d), v2 | ||||
| 	MOVQ 16(d), v3 | ||||
| 	MOVQ 24(d), v4 | ||||
| 
 | ||||
| 	// We don't need to check the loop condition here; this function is
 | ||||
| 	// always called with at least one block of data to process. | ||||
| blockLoop: | ||||
| 	round(R8) | ||||
| 	round(R9) | ||||
| 	round(R10) | ||||
| 	round(R11) | ||||
| 
 | ||||
| 	CMPQ SI, BX | ||||
| 	JLE  blockLoop | ||||
| 	blockLoop() | ||||
| 
 | ||||
| 	// Copy vN back to d. | ||||
| 	MOVQ R8, 0(AX) | ||||
| 	MOVQ R9, 8(AX) | ||||
| 	MOVQ R10, 16(AX) | ||||
| 	MOVQ R11, 24(AX) | ||||
| 	MOVQ v1, 0(d) | ||||
| 	MOVQ v2, 8(d) | ||||
| 	MOVQ v3, 16(d) | ||||
| 	MOVQ v4, 24(d) | ||||
| 
 | ||||
| 	// The number of bytes written is SI minus the old base pointer. | ||||
| 	SUBQ b_base+8(FP), SI | ||||
| 	MOVQ SI, ret+32(FP) | ||||
| 	// The number of bytes written is p minus the old base pointer. | ||||
| 	SUBQ b_base+8(FP), p | ||||
| 	MOVQ p, ret+32(FP) | ||||
| 
 | ||||
| 	RET | ||||
|  |  | |||
|  | @ -0,0 +1,183 @@ | |||
| //go:build !appengine && gc && !purego | ||||
| // +build !appengine | ||||
| // +build gc | ||||
| // +build !purego | ||||
| 
 | ||||
| #include "textflag.h" | ||||
| 
 | ||||
| // Registers: | ||||
| #define digest	R1 | ||||
| #define h	R2 // return value | ||||
| #define p	R3 // input pointer | ||||
| #define n	R4 // input length | ||||
| #define nblocks	R5 // n / 32 | ||||
| #define prime1	R7 | ||||
| #define prime2	R8 | ||||
| #define prime3	R9 | ||||
| #define prime4	R10 | ||||
| #define prime5	R11 | ||||
| #define v1	R12 | ||||
| #define v2	R13 | ||||
| #define v3	R14 | ||||
| #define v4	R15 | ||||
| #define x1	R20 | ||||
| #define x2	R21 | ||||
| #define x3	R22 | ||||
| #define x4	R23 | ||||
| 
 | ||||
| #define round(acc, x) \ | ||||
| 	MADD prime2, acc, x, acc \ | ||||
| 	ROR  $64-31, acc         \ | ||||
| 	MUL  prime1, acc | ||||
| 
 | ||||
| // round0 performs the operation x = round(0, x). | ||||
| #define round0(x) \ | ||||
| 	MUL prime2, x \ | ||||
| 	ROR $64-31, x \ | ||||
| 	MUL prime1, x | ||||
| 
 | ||||
| #define mergeRound(acc, x) \ | ||||
| 	round0(x)                     \ | ||||
| 	EOR  x, acc                   \ | ||||
| 	MADD acc, prime4, prime1, acc | ||||
| 
 | ||||
| // blockLoop processes as many 32-byte blocks as possible, | ||||
| // updating v1, v2, v3, and v4. It assumes that n >= 32. | ||||
| #define blockLoop() \ | ||||
| 	LSR     $5, n, nblocks  \ | ||||
| 	PCALIGN $16             \ | ||||
| 	loop:                   \ | ||||
| 	LDP.P   16(p), (x1, x2) \ | ||||
| 	LDP.P   16(p), (x3, x4) \ | ||||
| 	round(v1, x1)           \ | ||||
| 	round(v2, x2)           \ | ||||
| 	round(v3, x3)           \ | ||||
| 	round(v4, x4)           \ | ||||
| 	SUB     $1, nblocks     \ | ||||
| 	CBNZ    nblocks, loop | ||||
| 
 | ||||
| // func Sum64(b []byte) uint64 | ||||
| TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32 | ||||
| 	LDP b_base+0(FP), (p, n) | ||||
| 
 | ||||
| 	LDP  ·primes+0(SB), (prime1, prime2) | ||||
| 	LDP  ·primes+16(SB), (prime3, prime4) | ||||
| 	MOVD ·primes+32(SB), prime5 | ||||
| 
 | ||||
| 	CMP  $32, n | ||||
| 	CSEL LT, prime5, ZR, h // if n < 32 { h = prime5 } else { h = 0 } | ||||
| 	BLT  afterLoop | ||||
| 
 | ||||
| 	ADD  prime1, prime2, v1 | ||||
| 	MOVD prime2, v2 | ||||
| 	MOVD $0, v3 | ||||
| 	NEG  prime1, v4 | ||||
| 
 | ||||
| 	blockLoop() | ||||
| 
 | ||||
| 	ROR $64-1, v1, x1 | ||||
| 	ROR $64-7, v2, x2 | ||||
| 	ADD x1, x2 | ||||
| 	ROR $64-12, v3, x3 | ||||
| 	ROR $64-18, v4, x4 | ||||
| 	ADD x3, x4 | ||||
| 	ADD x2, x4, h | ||||
| 
 | ||||
| 	mergeRound(h, v1) | ||||
| 	mergeRound(h, v2) | ||||
| 	mergeRound(h, v3) | ||||
| 	mergeRound(h, v4) | ||||
| 
 | ||||
| afterLoop: | ||||
| 	ADD n, h | ||||
| 
 | ||||
| 	TBZ   $4, n, try8 | ||||
| 	LDP.P 16(p), (x1, x2) | ||||
| 
 | ||||
| 	round0(x1) | ||||
| 
 | ||||
| 	// NOTE: here and below, sequencing the EOR after the ROR (using a | ||||
| 	// rotated register) is worth a small but measurable speedup for small | ||||
| 	// inputs. | ||||
| 	ROR  $64-27, h | ||||
| 	EOR  x1 @> 64-27, h, h
 | ||||
| 	MADD h, prime4, prime1, h | ||||
| 
 | ||||
| 	round0(x2) | ||||
| 	ROR  $64-27, h | ||||
| 	EOR  x2 @> 64-27, h, h
 | ||||
| 	MADD h, prime4, prime1, h | ||||
| 
 | ||||
| try8: | ||||
| 	TBZ    $3, n, try4 | ||||
| 	MOVD.P 8(p), x1 | ||||
| 
 | ||||
| 	round0(x1) | ||||
| 	ROR  $64-27, h | ||||
| 	EOR  x1 @> 64-27, h, h
 | ||||
| 	MADD h, prime4, prime1, h | ||||
| 
 | ||||
| try4: | ||||
| 	TBZ     $2, n, try2 | ||||
| 	MOVWU.P 4(p), x2 | ||||
| 
 | ||||
| 	MUL  prime1, x2 | ||||
| 	ROR  $64-23, h | ||||
| 	EOR  x2 @> 64-23, h, h
 | ||||
| 	MADD h, prime3, prime2, h | ||||
| 
 | ||||
| try2: | ||||
| 	TBZ     $1, n, try1 | ||||
| 	MOVHU.P 2(p), x3 | ||||
| 	AND     $255, x3, x1 | ||||
| 	LSR     $8, x3, x2 | ||||
| 
 | ||||
| 	MUL prime5, x1 | ||||
| 	ROR $64-11, h | ||||
| 	EOR x1 @> 64-11, h, h
 | ||||
| 	MUL prime1, h | ||||
| 
 | ||||
| 	MUL prime5, x2 | ||||
| 	ROR $64-11, h | ||||
| 	EOR x2 @> 64-11, h, h
 | ||||
| 	MUL prime1, h | ||||
| 
 | ||||
| try1: | ||||
| 	TBZ   $0, n, finalize | ||||
| 	MOVBU (p), x4 | ||||
| 
 | ||||
| 	MUL prime5, x4 | ||||
| 	ROR $64-11, h | ||||
| 	EOR x4 @> 64-11, h, h
 | ||||
| 	MUL prime1, h | ||||
| 
 | ||||
| finalize: | ||||
| 	EOR h >> 33, h | ||||
| 	MUL prime2, h | ||||
| 	EOR h >> 29, h | ||||
| 	MUL prime3, h | ||||
| 	EOR h >> 32, h | ||||
| 
 | ||||
| 	MOVD h, ret+24(FP) | ||||
| 	RET | ||||
| 
 | ||||
| // func writeBlocks(d *Digest, b []byte) int | ||||
| TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40 | ||||
| 	LDP ·primes+0(SB), (prime1, prime2) | ||||
| 
 | ||||
| 	// Load state. Assume v[1-4] are stored contiguously. | ||||
| 	MOVD d+0(FP), digest | ||||
| 	LDP  0(digest), (v1, v2) | ||||
| 	LDP  16(digest), (v3, v4) | ||||
| 
 | ||||
| 	LDP b_base+8(FP), (p, n) | ||||
| 
 | ||||
| 	blockLoop() | ||||
| 
 | ||||
| 	// Store updated state. | ||||
| 	STP (v1, v2), 0(digest) | ||||
| 	STP (v3, v4), 16(digest) | ||||
| 
 | ||||
| 	BIC  $31, n | ||||
| 	MOVD n, ret+32(FP) | ||||
| 	RET | ||||
|  | @ -1,3 +1,5 @@ | |||
| //go:build (amd64 || arm64) && !appengine && gc && !purego
 | ||||
| // +build amd64 arm64
 | ||||
| // +build !appengine
 | ||||
| // +build gc
 | ||||
| // +build !purego
 | ||||
|  | @ -1,4 +1,5 @@ | |||
| // +build !amd64 appengine !gc purego
 | ||||
| //go:build (!amd64 && !arm64) || appengine || !gc || purego
 | ||||
| // +build !amd64,!arm64 appengine !gc purego
 | ||||
| 
 | ||||
| package xxhash | ||||
| 
 | ||||
|  | @ -14,10 +15,10 @@ func Sum64(b []byte) uint64 { | |||
| 	var h uint64 | ||||
| 
 | ||||
| 	if n >= 32 { | ||||
| 		v1 := prime1v + prime2 | ||||
| 		v1 := primes[0] + prime2 | ||||
| 		v2 := prime2 | ||||
| 		v3 := uint64(0) | ||||
| 		v4 := -prime1v | ||||
| 		v4 := -primes[0] | ||||
| 		for len(b) >= 32 { | ||||
| 			v1 = round(v1, u64(b[0:8:len(b)])) | ||||
| 			v2 = round(v2, u64(b[8:16:len(b)])) | ||||
|  | @ -36,19 +37,18 @@ func Sum64(b []byte) uint64 { | |||
| 
 | ||||
| 	h += uint64(n) | ||||
| 
 | ||||
| 	i, end := 0, len(b) | ||||
| 	for ; i+8 <= end; i += 8 { | ||||
| 		k1 := round(0, u64(b[i:i+8:len(b)])) | ||||
| 	for ; len(b) >= 8; b = b[8:] { | ||||
| 		k1 := round(0, u64(b[:8])) | ||||
| 		h ^= k1 | ||||
| 		h = rol27(h)*prime1 + prime4 | ||||
| 	} | ||||
| 	if i+4 <= end { | ||||
| 		h ^= uint64(u32(b[i:i+4:len(b)])) * prime1 | ||||
| 	if len(b) >= 4 { | ||||
| 		h ^= uint64(u32(b[:4])) * prime1 | ||||
| 		h = rol23(h)*prime2 + prime3 | ||||
| 		i += 4 | ||||
| 		b = b[4:] | ||||
| 	} | ||||
| 	for ; i < end; i++ { | ||||
| 		h ^= uint64(b[i]) * prime5 | ||||
| 	for ; len(b) > 0; b = b[1:] { | ||||
| 		h ^= uint64(b[0]) * prime5 | ||||
| 		h = rol11(h) * prime1 | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,3 +1,4 @@ | |||
| //go:build appengine
 | ||||
| // +build appengine
 | ||||
| 
 | ||||
| // This file contains the safe implementations of otherwise unsafe-using code.
 | ||||
|  |  | |||
|  | @ -1,3 +1,4 @@ | |||
| //go:build !appengine
 | ||||
| // +build !appengine
 | ||||
| 
 | ||||
| // This file encapsulates usage of unsafe.
 | ||||
|  | @ -11,7 +12,7 @@ import ( | |||
| 
 | ||||
| // In the future it's possible that compiler optimizations will make these
 | ||||
| // XxxString functions unnecessary by realizing that calls such as
 | ||||
| // Sum64([]byte(s)) don't need to copy s. See https://golang.org/issue/2205.
 | ||||
| // Sum64([]byte(s)) don't need to copy s. See https://go.dev/issue/2205.
 | ||||
| // If that happens, even if we keep these functions they can be replaced with
 | ||||
| // the trivial safe code.
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,57 +0,0 @@ | |||
| Copyright (c) 2019 Cloudflare. All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are | ||||
| met: | ||||
| 
 | ||||
|    * Redistributions of source code must retain the above copyright | ||||
| notice, this list of conditions and the following disclaimer. | ||||
|    * Redistributions in binary form must reproduce the above | ||||
| copyright notice, this list of conditions and the following disclaimer | ||||
| in the documentation and/or other materials provided with the | ||||
| distribution. | ||||
|    * Neither the name of Cloudflare 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 COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| ======================================================================== | ||||
| 
 | ||||
| Copyright (c) 2009 The Go Authors. All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are | ||||
| met: | ||||
| 
 | ||||
|    * Redistributions of source code must retain the above copyright | ||||
| notice, this list of conditions and the following disclaimer. | ||||
|    * Redistributions in binary form must reproduce the above | ||||
| copyright notice, this list of conditions and the following disclaimer | ||||
| in the documentation and/or other materials provided with the | ||||
| distribution. | ||||
|    * Neither the name of Google Inc. 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 COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  | @ -1,96 +0,0 @@ | |||
| package x25519 | ||||
| 
 | ||||
| import ( | ||||
| 	fp "github.com/cloudflare/circl/math/fp25519" | ||||
| ) | ||||
| 
 | ||||
| // ladderJoye calculates a fixed-point multiplication with the generator point.
 | ||||
| // The algorithm is the right-to-left Joye's ladder as described
 | ||||
| // in "How to precompute a ladder" in SAC'2017.
 | ||||
| func ladderJoye(k *Key) { | ||||
| 	w := [5]fp.Elt{} // [mu,x1,z1,x2,z2] order must be preserved.
 | ||||
| 	fp.SetOne(&w[1]) // x1 = 1
 | ||||
| 	fp.SetOne(&w[2]) // z1 = 1
 | ||||
| 	w[3] = fp.Elt{   // x2 = G-S
 | ||||
| 		0xbd, 0xaa, 0x2f, 0xc8, 0xfe, 0xe1, 0x94, 0x7e, | ||||
| 		0xf8, 0xed, 0xb2, 0x14, 0xae, 0x95, 0xf0, 0xbb, | ||||
| 		0xe2, 0x48, 0x5d, 0x23, 0xb9, 0xa0, 0xc7, 0xad, | ||||
| 		0x34, 0xab, 0x7c, 0xe2, 0xee, 0xcd, 0xae, 0x1e, | ||||
| 	} | ||||
| 	fp.SetOne(&w[4]) // z2 = 1
 | ||||
| 
 | ||||
| 	const n = 255 | ||||
| 	const h = 3 | ||||
| 	swap := uint(1) | ||||
| 	for s := 0; s < n-h; s++ { | ||||
| 		i := (s + h) / 8 | ||||
| 		j := (s + h) % 8 | ||||
| 		bit := uint((k[i] >> uint(j)) & 1) | ||||
| 		copy(w[0][:], tableGenerator[s*Size:(s+1)*Size]) | ||||
| 		diffAdd(&w, swap^bit) | ||||
| 		swap = bit | ||||
| 	} | ||||
| 	for s := 0; s < h; s++ { | ||||
| 		double(&w[1], &w[2]) | ||||
| 	} | ||||
| 	toAffine((*[fp.Size]byte)(k), &w[1], &w[2]) | ||||
| } | ||||
| 
 | ||||
| // ladderMontgomery calculates a generic scalar point multiplication
 | ||||
| // The algorithm implemented is the left-to-right Montgomery's ladder.
 | ||||
| func ladderMontgomery(k, xP *Key) { | ||||
| 	w := [5]fp.Elt{}      // [x1, x2, z2, x3, z3] order must be preserved.
 | ||||
| 	w[0] = *(*fp.Elt)(xP) // x1 = xP
 | ||||
| 	fp.SetOne(&w[1])      // x2 = 1
 | ||||
| 	w[3] = *(*fp.Elt)(xP) // x3 = xP
 | ||||
| 	fp.SetOne(&w[4])      // z3 = 1
 | ||||
| 
 | ||||
| 	move := uint(0) | ||||
| 	for s := 255 - 1; s >= 0; s-- { | ||||
| 		i := s / 8 | ||||
| 		j := s % 8 | ||||
| 		bit := uint((k[i] >> uint(j)) & 1) | ||||
| 		ladderStep(&w, move^bit) | ||||
| 		move = bit | ||||
| 	} | ||||
| 	toAffine((*[fp.Size]byte)(k), &w[1], &w[2]) | ||||
| } | ||||
| 
 | ||||
| func toAffine(k *[fp.Size]byte, x, z *fp.Elt) { | ||||
| 	fp.Inv(z, z) | ||||
| 	fp.Mul(x, x, z) | ||||
| 	_ = fp.ToBytes(k[:], x) | ||||
| } | ||||
| 
 | ||||
| var lowOrderPoints = [5]fp.Elt{ | ||||
| 	{ /* (0,_,1) point of order 2 on Curve25519 */ | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 	}, | ||||
| 	{ /* (1,_,1) point of order 4 on Curve25519 */ | ||||
| 		0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 	}, | ||||
| 	{ /* (x,_,1) first point of order 8 on Curve25519 */ | ||||
| 		0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae, | ||||
| 		0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a, | ||||
| 		0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd, | ||||
| 		0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00, | ||||
| 	}, | ||||
| 	{ /* (x,_,1) second point of order 8 on Curve25519 */ | ||||
| 		0x5f, 0x9c, 0x95, 0xbc, 0xa3, 0x50, 0x8c, 0x24, | ||||
| 		0xb1, 0xd0, 0xb1, 0x55, 0x9c, 0x83, 0xef, 0x5b, | ||||
| 		0x04, 0x44, 0x5c, 0xc4, 0x58, 0x1c, 0x8e, 0x86, | ||||
| 		0xd8, 0x22, 0x4e, 0xdd, 0xd0, 0x9f, 0x11, 0x57, | ||||
| 	}, | ||||
| 	{ /* (-1,_,1) a point of order 4 on the twist of Curve25519 */ | ||||
| 		0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, | ||||
| 	}, | ||||
| } | ||||
|  | @ -1,30 +0,0 @@ | |||
| //go:build amd64 && !purego
 | ||||
| // +build amd64,!purego
 | ||||
| 
 | ||||
| package x25519 | ||||
| 
 | ||||
| import ( | ||||
| 	fp "github.com/cloudflare/circl/math/fp25519" | ||||
| 	"golang.org/x/sys/cpu" | ||||
| ) | ||||
| 
 | ||||
| var hasBmi2Adx = cpu.X86.HasBMI2 && cpu.X86.HasADX | ||||
| 
 | ||||
| var _ = hasBmi2Adx | ||||
| 
 | ||||
| func double(x, z *fp.Elt)             { doubleAmd64(x, z) } | ||||
| func diffAdd(w *[5]fp.Elt, b uint)    { diffAddAmd64(w, b) } | ||||
| func ladderStep(w *[5]fp.Elt, b uint) { ladderStepAmd64(w, b) } | ||||
| func mulA24(z, x *fp.Elt)             { mulA24Amd64(z, x) } | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func ladderStepAmd64(w *[5]fp.Elt, b uint) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func diffAddAmd64(w *[5]fp.Elt, b uint) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func doubleAmd64(x, z *fp.Elt) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func mulA24Amd64(z, x *fp.Elt) | ||||
|  | @ -1,111 +0,0 @@ | |||
| #define ladderStepLeg          \ | ||||
|     addSub(x2,z2)              \ | ||||
|     addSub(x3,z3)              \ | ||||
|     integerMulLeg(b0,x2,z3)    \ | ||||
|     integerMulLeg(b1,x3,z2)    \ | ||||
|     reduceFromDoubleLeg(t0,b0) \ | ||||
|     reduceFromDoubleLeg(t1,b1) \ | ||||
|     addSub(t0,t1)              \ | ||||
|     cselect(x2,x3,regMove)     \ | ||||
|     cselect(z2,z3,regMove)     \ | ||||
|     integerSqrLeg(b0,t0)       \ | ||||
|     integerSqrLeg(b1,t1)       \ | ||||
|     reduceFromDoubleLeg(x3,b0) \ | ||||
|     reduceFromDoubleLeg(z3,b1) \ | ||||
|     integerMulLeg(b0,x1,z3)    \ | ||||
|     reduceFromDoubleLeg(z3,b0) \ | ||||
|     integerSqrLeg(b0,x2)       \ | ||||
|     integerSqrLeg(b1,z2)       \ | ||||
|     reduceFromDoubleLeg(x2,b0) \ | ||||
|     reduceFromDoubleLeg(z2,b1) \ | ||||
|     subtraction(t0,x2,z2)      \ | ||||
|     multiplyA24Leg(t1,t0)      \ | ||||
|     additionLeg(t1,t1,z2)      \ | ||||
|     integerMulLeg(b0,x2,z2)    \ | ||||
|     integerMulLeg(b1,t0,t1)    \ | ||||
|     reduceFromDoubleLeg(x2,b0) \ | ||||
|     reduceFromDoubleLeg(z2,b1) | ||||
| 
 | ||||
| #define ladderStepBmi2Adx      \ | ||||
|     addSub(x2,z2)              \ | ||||
|     addSub(x3,z3)              \ | ||||
|     integerMulAdx(b0,x2,z3)    \ | ||||
|     integerMulAdx(b1,x3,z2)    \ | ||||
|     reduceFromDoubleAdx(t0,b0) \ | ||||
|     reduceFromDoubleAdx(t1,b1) \ | ||||
|     addSub(t0,t1)              \ | ||||
|     cselect(x2,x3,regMove)     \ | ||||
|     cselect(z2,z3,regMove)     \ | ||||
|     integerSqrAdx(b0,t0)       \ | ||||
|     integerSqrAdx(b1,t1)       \ | ||||
|     reduceFromDoubleAdx(x3,b0) \ | ||||
|     reduceFromDoubleAdx(z3,b1) \ | ||||
|     integerMulAdx(b0,x1,z3)    \ | ||||
|     reduceFromDoubleAdx(z3,b0) \ | ||||
|     integerSqrAdx(b0,x2)       \ | ||||
|     integerSqrAdx(b1,z2)       \ | ||||
|     reduceFromDoubleAdx(x2,b0) \ | ||||
|     reduceFromDoubleAdx(z2,b1) \ | ||||
|     subtraction(t0,x2,z2)      \ | ||||
|     multiplyA24Adx(t1,t0)      \ | ||||
|     additionAdx(t1,t1,z2)      \ | ||||
|     integerMulAdx(b0,x2,z2)    \ | ||||
|     integerMulAdx(b1,t0,t1)    \ | ||||
|     reduceFromDoubleAdx(x2,b0) \ | ||||
|     reduceFromDoubleAdx(z2,b1) | ||||
| 
 | ||||
| #define difAddLeg              \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerMulLeg(b0,z1,ui)    \ | ||||
|     reduceFromDoubleLeg(z1,b0) \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerSqrLeg(b0,x1)       \ | ||||
|     integerSqrLeg(b1,z1)       \ | ||||
|     reduceFromDoubleLeg(x1,b0) \ | ||||
|     reduceFromDoubleLeg(z1,b1) \ | ||||
|     integerMulLeg(b0,x1,z2)    \ | ||||
|     integerMulLeg(b1,z1,x2)    \ | ||||
|     reduceFromDoubleLeg(x1,b0) \ | ||||
|     reduceFromDoubleLeg(z1,b1) | ||||
| 
 | ||||
| #define difAddBmi2Adx          \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerMulAdx(b0,z1,ui)    \ | ||||
|     reduceFromDoubleAdx(z1,b0) \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerSqrAdx(b0,x1)       \ | ||||
|     integerSqrAdx(b1,z1)       \ | ||||
|     reduceFromDoubleAdx(x1,b0) \ | ||||
|     reduceFromDoubleAdx(z1,b1) \ | ||||
|     integerMulAdx(b0,x1,z2)    \ | ||||
|     integerMulAdx(b1,z1,x2)    \ | ||||
|     reduceFromDoubleAdx(x1,b0) \ | ||||
|     reduceFromDoubleAdx(z1,b1) | ||||
| 
 | ||||
| #define doubleLeg              \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerSqrLeg(b0,x1)       \ | ||||
|     integerSqrLeg(b1,z1)       \ | ||||
|     reduceFromDoubleLeg(x1,b0) \ | ||||
|     reduceFromDoubleLeg(z1,b1) \ | ||||
|     subtraction(t0,x1,z1)      \ | ||||
|     multiplyA24Leg(t1,t0)      \ | ||||
|     additionLeg(t1,t1,z1)      \ | ||||
|     integerMulLeg(b0,x1,z1)    \ | ||||
|     integerMulLeg(b1,t0,t1)    \ | ||||
|     reduceFromDoubleLeg(x1,b0) \ | ||||
|     reduceFromDoubleLeg(z1,b1) | ||||
| 
 | ||||
| #define doubleBmi2Adx          \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerSqrAdx(b0,x1)       \ | ||||
|     integerSqrAdx(b1,z1)       \ | ||||
|     reduceFromDoubleAdx(x1,b0) \ | ||||
|     reduceFromDoubleAdx(z1,b1) \ | ||||
|     subtraction(t0,x1,z1)      \ | ||||
|     multiplyA24Adx(t1,t0)      \ | ||||
|     additionAdx(t1,t1,z1)      \ | ||||
|     integerMulAdx(b0,x1,z1)    \ | ||||
|     integerMulAdx(b1,t0,t1)    \ | ||||
|     reduceFromDoubleAdx(x1,b0) \ | ||||
|     reduceFromDoubleAdx(z1,b1) | ||||
|  | @ -1,156 +0,0 @@ | |||
| // +build amd64 | ||||
| 
 | ||||
| #include "textflag.h" | ||||
| 
 | ||||
| // Depends on circl/math/fp25519 package | ||||
| #include "../../math/fp25519/fp_amd64.h" | ||||
| #include "curve_amd64.h" | ||||
| 
 | ||||
| // CTE_A24 is (A+2)/4 from Curve25519 | ||||
| #define CTE_A24 121666 | ||||
| 
 | ||||
| #define Size 32 | ||||
| 
 | ||||
| // multiplyA24Leg multiplies x times CTE_A24 and stores in z | ||||
| // Uses: AX, DX, R8-R13, FLAGS | ||||
| // Instr: x86_64, cmov | ||||
| #define multiplyA24Leg(z,x) \ | ||||
|     MOVL $CTE_A24, AX; MULQ  0+x; MOVQ AX,  R8; MOVQ DX,  R9; \
 | ||||
|     MOVL $CTE_A24, AX; MULQ  8+x; MOVQ AX, R12; MOVQ DX, R10; \
 | ||||
|     MOVL $CTE_A24, AX; MULQ 16+x; MOVQ AX, R13; MOVQ DX, R11; \
 | ||||
|     MOVL $CTE_A24, AX; MULQ 24+x; \
 | ||||
|     ADDQ R12,  R9; \
 | ||||
|     ADCQ R13, R10; \
 | ||||
|     ADCQ  AX, R11; \
 | ||||
|     ADCQ  $0,  DX; \
 | ||||
|     MOVL $38,  AX; /* 2*C = 38 = 2^256 MOD 2^255-19*/ \
 | ||||
|     IMULQ AX, DX; \
 | ||||
|     ADDQ DX, R8; \
 | ||||
|     ADCQ $0,  R9;  MOVQ  R9,  8+z; \
 | ||||
|     ADCQ $0, R10;  MOVQ R10, 16+z; \
 | ||||
|     ADCQ $0, R11;  MOVQ R11, 24+z; \
 | ||||
|     MOVQ $0, DX; \
 | ||||
|     CMOVQCS AX, DX; \
 | ||||
|     ADDQ DX, R8;  MOVQ  R8,   0+z;
 | ||||
| 
 | ||||
| // multiplyA24Adx multiplies x times CTE_A24 and stores in z | ||||
| // Uses: AX, DX, R8-R12, FLAGS | ||||
| // Instr: x86_64, cmov, bmi2 | ||||
| #define multiplyA24Adx(z,x) \ | ||||
|     MOVQ  $CTE_A24, DX; \
 | ||||
|     MULXQ  0+x,  R8, R10; \
 | ||||
|     MULXQ  8+x,  R9, R11;  ADDQ R10,  R9; \
 | ||||
|     MULXQ 16+x, R10,  AX;  ADCQ R11, R10; \
 | ||||
|     MULXQ 24+x, R11, R12;  ADCQ  AX, R11; \
 | ||||
|     ;;;;;;;;;;;;;;;;;;;;;  ADCQ  $0, R12; \
 | ||||
|     MOVL $38,  DX; /* 2*C = 38 = 2^256 MOD 2^255-19*/ \
 | ||||
|     IMULQ DX, R12; \
 | ||||
|     ADDQ R12, R8; \
 | ||||
|     ADCQ $0,  R9;  MOVQ  R9,  8+z; \
 | ||||
|     ADCQ $0, R10;  MOVQ R10, 16+z; \
 | ||||
|     ADCQ $0, R11;  MOVQ R11, 24+z; \
 | ||||
|     MOVQ $0, R12; \
 | ||||
|     CMOVQCS DX, R12; \
 | ||||
|     ADDQ R12, R8;  MOVQ  R8,  0+z;
 | ||||
| 
 | ||||
| #define mulA24Legacy \ | ||||
|     multiplyA24Leg(0(DI),0(SI)) | ||||
| #define mulA24Bmi2Adx \ | ||||
|     multiplyA24Adx(0(DI),0(SI)) | ||||
| 
 | ||||
| // func mulA24Amd64(z, x *fp255.Elt) | ||||
| TEXT ·mulA24Amd64(SB),NOSPLIT,$0-16 | ||||
|     MOVQ z+0(FP), DI | ||||
|     MOVQ x+8(FP), SI | ||||
|     CHECK_BMI2ADX(LMA24, mulA24Legacy, mulA24Bmi2Adx) | ||||
| 
 | ||||
| 
 | ||||
| // func ladderStepAmd64(w *[5]fp255.Elt, b uint) | ||||
| // ladderStepAmd64 calculates a point addition and doubling as follows: | ||||
| // (x2,z2) = 2*(x2,z2) and (x3,z3) = (x2,z2)+(x3,z3) using as a difference (x1,-). | ||||
| //  work  = (x1,x2,z2,x3,z3) are five fp255.Elt of 32 bytes. | ||||
| //  stack = (t0,t1) are two fp.Elt of fp.Size bytes, and | ||||
| //          (b0,b1) are two-double precision fp.Elt of 2*fp.Size bytes. | ||||
| TEXT ·ladderStepAmd64(SB),NOSPLIT,$192-16 | ||||
|     // Parameters | ||||
|     #define regWork DI | ||||
|     #define regMove SI | ||||
|     #define x1 0*Size(regWork) | ||||
|     #define x2 1*Size(regWork) | ||||
|     #define z2 2*Size(regWork) | ||||
|     #define x3 3*Size(regWork) | ||||
|     #define z3 4*Size(regWork) | ||||
|     // Local variables | ||||
|     #define t0 0*Size(SP) | ||||
|     #define t1 1*Size(SP) | ||||
|     #define b0 2*Size(SP) | ||||
|     #define b1 4*Size(SP) | ||||
|     MOVQ w+0(FP), regWork | ||||
|     MOVQ b+8(FP), regMove | ||||
|     CHECK_BMI2ADX(LLADSTEP, ladderStepLeg, ladderStepBmi2Adx) | ||||
|     #undef regWork | ||||
|     #undef regMove | ||||
|     #undef x1 | ||||
|     #undef x2 | ||||
|     #undef z2 | ||||
|     #undef x3 | ||||
|     #undef z3 | ||||
|     #undef t0 | ||||
|     #undef t1 | ||||
|     #undef b0 | ||||
|     #undef b1 | ||||
| 
 | ||||
| // func diffAddAmd64(w *[5]fp255.Elt, b uint) | ||||
| // diffAddAmd64 calculates a differential point addition using a precomputed point. | ||||
| // (x1,z1) = (x1,z1)+(mu) using a difference point (x2,z2) | ||||
| //    w    = (mu,x1,z1,x2,z2) are five fp.Elt, and | ||||
| //   stack = (b0,b1) are two-double precision fp.Elt of 2*fp.Size bytes. | ||||
| TEXT ·diffAddAmd64(SB),NOSPLIT,$128-16 | ||||
|     // Parameters | ||||
|     #define regWork DI | ||||
|     #define regSwap SI | ||||
|     #define ui 0*Size(regWork) | ||||
|     #define x1 1*Size(regWork) | ||||
|     #define z1 2*Size(regWork) | ||||
|     #define x2 3*Size(regWork) | ||||
|     #define z2 4*Size(regWork) | ||||
|     // Local variables | ||||
|     #define b0 0*Size(SP) | ||||
|     #define b1 2*Size(SP) | ||||
|     MOVQ w+0(FP), regWork | ||||
|     MOVQ b+8(FP), regSwap | ||||
|     cswap(x1,x2,regSwap) | ||||
|     cswap(z1,z2,regSwap) | ||||
|     CHECK_BMI2ADX(LDIFADD, difAddLeg, difAddBmi2Adx) | ||||
|     #undef regWork | ||||
|     #undef regSwap | ||||
|     #undef ui | ||||
|     #undef x1 | ||||
|     #undef z1 | ||||
|     #undef x2 | ||||
|     #undef z2 | ||||
|     #undef b0 | ||||
|     #undef b1 | ||||
| 
 | ||||
| // func doubleAmd64(x, z *fp255.Elt) | ||||
| // doubleAmd64 calculates a point doubling (x1,z1) = 2*(x1,z1). | ||||
| //  stack = (t0,t1) are two fp.Elt of fp.Size bytes, and | ||||
| //          (b0,b1) are two-double precision fp.Elt of 2*fp.Size bytes. | ||||
| TEXT ·doubleAmd64(SB),NOSPLIT,$192-16 | ||||
|     // Parameters | ||||
|     #define x1 0(DI) | ||||
|     #define z1 0(SI) | ||||
|     // Local variables | ||||
|     #define t0 0*Size(SP) | ||||
|     #define t1 1*Size(SP) | ||||
|     #define b0 2*Size(SP) | ||||
|     #define b1 4*Size(SP) | ||||
|     MOVQ x+0(FP), DI | ||||
|     MOVQ z+8(FP), SI | ||||
|     CHECK_BMI2ADX(LDOUB,doubleLeg,doubleBmi2Adx) | ||||
|     #undef x1 | ||||
|     #undef z1 | ||||
|     #undef t0 | ||||
|     #undef t1 | ||||
|     #undef b0 | ||||
|     #undef b1 | ||||
|  | @ -1,85 +0,0 @@ | |||
| package x25519 | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"math/bits" | ||||
| 
 | ||||
| 	fp "github.com/cloudflare/circl/math/fp25519" | ||||
| ) | ||||
| 
 | ||||
| func doubleGeneric(x, z *fp.Elt) { | ||||
| 	t0, t1 := &fp.Elt{}, &fp.Elt{} | ||||
| 	fp.AddSub(x, z) | ||||
| 	fp.Sqr(x, x) | ||||
| 	fp.Sqr(z, z) | ||||
| 	fp.Sub(t0, x, z) | ||||
| 	mulA24Generic(t1, t0) | ||||
| 	fp.Add(t1, t1, z) | ||||
| 	fp.Mul(x, x, z) | ||||
| 	fp.Mul(z, t0, t1) | ||||
| } | ||||
| 
 | ||||
| func diffAddGeneric(w *[5]fp.Elt, b uint) { | ||||
| 	mu, x1, z1, x2, z2 := &w[0], &w[1], &w[2], &w[3], &w[4] | ||||
| 	fp.Cswap(x1, x2, b) | ||||
| 	fp.Cswap(z1, z2, b) | ||||
| 	fp.AddSub(x1, z1) | ||||
| 	fp.Mul(z1, z1, mu) | ||||
| 	fp.AddSub(x1, z1) | ||||
| 	fp.Sqr(x1, x1) | ||||
| 	fp.Sqr(z1, z1) | ||||
| 	fp.Mul(x1, x1, z2) | ||||
| 	fp.Mul(z1, z1, x2) | ||||
| } | ||||
| 
 | ||||
| func ladderStepGeneric(w *[5]fp.Elt, b uint) { | ||||
| 	x1, x2, z2, x3, z3 := &w[0], &w[1], &w[2], &w[3], &w[4] | ||||
| 	t0 := &fp.Elt{} | ||||
| 	t1 := &fp.Elt{} | ||||
| 	fp.AddSub(x2, z2) | ||||
| 	fp.AddSub(x3, z3) | ||||
| 	fp.Mul(t0, x2, z3) | ||||
| 	fp.Mul(t1, x3, z2) | ||||
| 	fp.AddSub(t0, t1) | ||||
| 	fp.Cmov(x2, x3, b) | ||||
| 	fp.Cmov(z2, z3, b) | ||||
| 	fp.Sqr(x3, t0) | ||||
| 	fp.Sqr(z3, t1) | ||||
| 	fp.Mul(z3, x1, z3) | ||||
| 	fp.Sqr(x2, x2) | ||||
| 	fp.Sqr(z2, z2) | ||||
| 	fp.Sub(t0, x2, z2) | ||||
| 	mulA24Generic(t1, t0) | ||||
| 	fp.Add(t1, t1, z2) | ||||
| 	fp.Mul(x2, x2, z2) | ||||
| 	fp.Mul(z2, t0, t1) | ||||
| } | ||||
| 
 | ||||
| func mulA24Generic(z, x *fp.Elt) { | ||||
| 	const A24 = 121666 | ||||
| 	const n = 8 | ||||
| 	var xx [4]uint64 | ||||
| 	for i := range xx { | ||||
| 		xx[i] = binary.LittleEndian.Uint64(x[i*n : (i+1)*n]) | ||||
| 	} | ||||
| 
 | ||||
| 	h0, l0 := bits.Mul64(xx[0], A24) | ||||
| 	h1, l1 := bits.Mul64(xx[1], A24) | ||||
| 	h2, l2 := bits.Mul64(xx[2], A24) | ||||
| 	h3, l3 := bits.Mul64(xx[3], A24) | ||||
| 
 | ||||
| 	var c3 uint64 | ||||
| 	l1, c0 := bits.Add64(h0, l1, 0) | ||||
| 	l2, c1 := bits.Add64(h1, l2, c0) | ||||
| 	l3, c2 := bits.Add64(h2, l3, c1) | ||||
| 	l4, _ := bits.Add64(h3, 0, c2) | ||||
| 	_, l4 = bits.Mul64(l4, 38) | ||||
| 	l0, c0 = bits.Add64(l0, l4, 0) | ||||
| 	xx[1], c1 = bits.Add64(l1, 0, c0) | ||||
| 	xx[2], c2 = bits.Add64(l2, 0, c1) | ||||
| 	xx[3], c3 = bits.Add64(l3, 0, c2) | ||||
| 	xx[0], _ = bits.Add64(l0, (-c3)&38, 0) | ||||
| 	for i := range xx { | ||||
| 		binary.LittleEndian.PutUint64(z[i*n:(i+1)*n], xx[i]) | ||||
| 	} | ||||
| } | ||||
|  | @ -1,11 +0,0 @@ | |||
| //go:build !amd64 || purego
 | ||||
| // +build !amd64 purego
 | ||||
| 
 | ||||
| package x25519 | ||||
| 
 | ||||
| import fp "github.com/cloudflare/circl/math/fp25519" | ||||
| 
 | ||||
| func double(x, z *fp.Elt)             { doubleGeneric(x, z) } | ||||
| func diffAdd(w *[5]fp.Elt, b uint)    { diffAddGeneric(w, b) } | ||||
| func ladderStep(w *[5]fp.Elt, b uint) { ladderStepGeneric(w, b) } | ||||
| func mulA24(z, x *fp.Elt)             { mulA24Generic(z, x) } | ||||
|  | @ -1,19 +0,0 @@ | |||
| /* | ||||
| Package x25519 provides Diffie-Hellman functions as specified in RFC-7748. | ||||
| 
 | ||||
| Validation of public keys. | ||||
| 
 | ||||
| The Diffie-Hellman function, as described in RFC-7748 [1], works for any | ||||
| public key. However, if a different protocol requires contributory | ||||
| behaviour [2,3], then the public keys must be validated against low-order | ||||
| points [3,4]. To do that, the Shared function performs this validation | ||||
| internally and returns false when the public key is invalid (i.e., it | ||||
| is a low-order point). | ||||
| 
 | ||||
| References: | ||||
|   - [1] RFC7748 by Langley, Hamburg, Turner (https://rfc-editor.org/rfc/rfc7748.txt)
 | ||||
|   - [2] Curve25519 by Bernstein (https://cr.yp.to/ecdh.html)
 | ||||
|   - [3] Bernstein (https://cr.yp.to/ecdh.html#validate)
 | ||||
|   - [4] Cremers&Jackson (https://eprint.iacr.org/2019/526)
 | ||||
| */ | ||||
| package x25519 | ||||
|  | @ -1,47 +0,0 @@ | |||
| package x25519 | ||||
| 
 | ||||
| import ( | ||||
| 	"crypto/subtle" | ||||
| 
 | ||||
| 	fp "github.com/cloudflare/circl/math/fp25519" | ||||
| ) | ||||
| 
 | ||||
| // Size is the length in bytes of a X25519 key.
 | ||||
| const Size = 32 | ||||
| 
 | ||||
| // Key represents a X25519 key.
 | ||||
| type Key [Size]byte | ||||
| 
 | ||||
| func (k *Key) clamp(in *Key) *Key { | ||||
| 	*k = *in | ||||
| 	k[0] &= 248 | ||||
| 	k[31] = (k[31] & 127) | 64 | ||||
| 	return k | ||||
| } | ||||
| 
 | ||||
| // isValidPubKey verifies if the public key is not a low-order point.
 | ||||
| func (k *Key) isValidPubKey() bool { | ||||
| 	fp.Modp((*fp.Elt)(k)) | ||||
| 	isLowOrder := false | ||||
| 	for _, P := range lowOrderPoints { | ||||
| 		isLowOrder = isLowOrder || subtle.ConstantTimeCompare(P[:], k[:]) != 0 | ||||
| 	} | ||||
| 	return !isLowOrder | ||||
| } | ||||
| 
 | ||||
| // KeyGen obtains a public key given a secret key.
 | ||||
| func KeyGen(public, secret *Key) { | ||||
| 	ladderJoye(public.clamp(secret)) | ||||
| } | ||||
| 
 | ||||
| // Shared calculates Alice's shared key from Alice's secret key and Bob's
 | ||||
| // public key returning true on success. A failure case happens when the public
 | ||||
| // key is a low-order point, thus the shared key is all-zeros and the function
 | ||||
| // returns false.
 | ||||
| func Shared(shared, secret, public *Key) bool { | ||||
| 	validPk := *public | ||||
| 	validPk[31] &= (1 << (255 % 8)) - 1 | ||||
| 	ok := validPk.isValidPubKey() | ||||
| 	ladderMontgomery(shared.clamp(secret), &validPk) | ||||
| 	return ok | ||||
| } | ||||
|  | @ -1,268 +0,0 @@ | |||
| package x25519 | ||||
| 
 | ||||
| import "github.com/cloudflare/circl/math/fp25519" | ||||
| 
 | ||||
| // tableGenerator contains the set of points:
 | ||||
| //
 | ||||
| //	t[i] = (xi+1)/(xi-1),
 | ||||
| //
 | ||||
| // where (xi,yi) = 2^iG and G is the generator point
 | ||||
| // Size = (256)*(256/8) = 8192 bytes.
 | ||||
| var tableGenerator = [256 * fp25519.Size]byte{ | ||||
| 	/* (2^  0)P */ 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, | ||||
| 	/* (2^  1)P */ 0x96, 0xfe, 0xaa, 0x16, 0xf4, 0x20, 0x82, 0x6b, 0x34, 0x6a, 0x56, 0x4f, 0x2b, 0xeb, 0xeb, 0x82, 0x0f, 0x95, 0xa5, 0x75, 0xb0, 0xa5, 0xa9, 0xd5, 0xf4, 0x88, 0x24, 0x4b, 0xcf, 0xb2, 0x42, 0x51, | ||||
| 	/* (2^  2)P */ 0x0c, 0x68, 0x69, 0x00, 0x75, 0xbc, 0xae, 0x6a, 0x41, 0x9c, 0xf9, 0xa0, 0x20, 0x78, 0xcf, 0x89, 0xf4, 0xd0, 0x56, 0x3b, 0x18, 0xd9, 0x58, 0x2a, 0xa4, 0x11, 0x60, 0xe3, 0x80, 0xca, 0x5a, 0x4b, | ||||
| 	/* (2^  3)P */ 0x5d, 0x74, 0x29, 0x8c, 0x34, 0x32, 0x91, 0x32, 0xd7, 0x2f, 0x64, 0xe1, 0x16, 0xe6, 0xa2, 0xf4, 0x34, 0xbc, 0x67, 0xff, 0x03, 0xbb, 0x45, 0x1e, 0x4a, 0x9b, 0x2a, 0xf4, 0xd0, 0x12, 0x69, 0x30, | ||||
| 	/* (2^  4)P */ 0x54, 0x71, 0xaf, 0xe6, 0x07, 0x65, 0x88, 0xff, 0x2f, 0xc8, 0xee, 0xdf, 0x13, 0x0e, 0xf5, 0x04, 0xce, 0xb5, 0xba, 0x2a, 0xe8, 0x2f, 0x51, 0xaa, 0x22, 0xf2, 0xd5, 0x68, 0x1a, 0x25, 0x4e, 0x17, | ||||
| 	/* (2^  5)P */ 0x98, 0x88, 0x02, 0x82, 0x0d, 0x70, 0x96, 0xcf, 0xc5, 0x02, 0x2c, 0x0a, 0x37, 0xe3, 0x43, 0x17, 0xaa, 0x6e, 0xe8, 0xb4, 0x98, 0xec, 0x9e, 0x37, 0x2e, 0x48, 0xe0, 0x51, 0x8a, 0x88, 0x59, 0x0c, | ||||
| 	/* (2^  6)P */ 0x89, 0xd1, 0xb5, 0x99, 0xd6, 0xf1, 0xcb, 0xfb, 0x84, 0xdc, 0x9f, 0x8e, 0xd5, 0xf0, 0xae, 0xac, 0x14, 0x76, 0x1f, 0x23, 0x06, 0x0d, 0xc2, 0xc1, 0x72, 0xf9, 0x74, 0xa2, 0x8d, 0x21, 0x38, 0x29, | ||||
| 	/* (2^  7)P */ 0x18, 0x7f, 0x1d, 0xff, 0xbe, 0x49, 0xaf, 0xf6, 0xc2, 0xc9, 0x7a, 0x38, 0x22, 0x1c, 0x54, 0xcc, 0x6b, 0xc5, 0x15, 0x40, 0xef, 0xc9, 0xfc, 0x96, 0xa9, 0x13, 0x09, 0x69, 0x7c, 0x62, 0xc1, 0x69, | ||||
| 	/* (2^  8)P */ 0x0e, 0xdb, 0x33, 0x47, 0x2f, 0xfd, 0x86, 0x7a, 0xe9, 0x7d, 0x08, 0x9e, 0xf2, 0xc4, 0xb8, 0xfd, 0x29, 0xa2, 0xa2, 0x8e, 0x1a, 0x4b, 0x5e, 0x09, 0x79, 0x7a, 0xb3, 0x29, 0xc8, 0xa7, 0xd7, 0x1a, | ||||
| 	/* (2^  9)P */ 0xc0, 0xa0, 0x7e, 0xd1, 0xca, 0x89, 0x2d, 0x34, 0x51, 0x20, 0xed, 0xcc, 0xa6, 0xdd, 0xbe, 0x67, 0x74, 0x2f, 0xb4, 0x2b, 0xbf, 0x31, 0xca, 0x19, 0xbb, 0xac, 0x80, 0x49, 0xc8, 0xb4, 0xf7, 0x3d, | ||||
| 	/* (2^ 10)P */ 0x83, 0xd8, 0x0a, 0xc8, 0x4d, 0x44, 0xc6, 0xa8, 0x85, 0xab, 0xe3, 0x66, 0x03, 0x44, 0x1e, 0xb9, 0xd8, 0xf6, 0x64, 0x01, 0xa0, 0xcd, 0x15, 0xc2, 0x68, 0xe6, 0x47, 0xf2, 0x6e, 0x7c, 0x86, 0x3d, | ||||
| 	/* (2^ 11)P */ 0x8c, 0x65, 0x3e, 0xcc, 0x2b, 0x58, 0xdd, 0xc7, 0x28, 0x55, 0x0e, 0xee, 0x48, 0x47, 0x2c, 0xfd, 0x71, 0x4f, 0x9f, 0xcc, 0x95, 0x9b, 0xfd, 0xa0, 0xdf, 0x5d, 0x67, 0xb0, 0x71, 0xd8, 0x29, 0x75, | ||||
| 	/* (2^ 12)P */ 0x78, 0xbd, 0x3c, 0x2d, 0xb4, 0x68, 0xf5, 0xb8, 0x82, 0xda, 0xf3, 0x91, 0x1b, 0x01, 0x33, 0x12, 0x62, 0x3b, 0x7c, 0x4a, 0xcd, 0x6c, 0xce, 0x2d, 0x03, 0x86, 0x49, 0x9e, 0x8e, 0xfc, 0xe7, 0x75, | ||||
| 	/* (2^ 13)P */ 0xec, 0xb6, 0xd0, 0xfc, 0xf1, 0x13, 0x4f, 0x2f, 0x45, 0x7a, 0xff, 0x29, 0x1f, 0xca, 0xa8, 0xf1, 0x9b, 0xe2, 0x81, 0x29, 0xa7, 0xc1, 0x49, 0xc2, 0x6a, 0xb5, 0x83, 0x8c, 0xbb, 0x0d, 0xbe, 0x6e, | ||||
| 	/* (2^ 14)P */ 0x22, 0xb2, 0x0b, 0x17, 0x8d, 0xfa, 0x14, 0x71, 0x5f, 0x93, 0x93, 0xbf, 0xd5, 0xdc, 0xa2, 0x65, 0x9a, 0x97, 0x9c, 0xb5, 0x68, 0x1f, 0xc4, 0xbd, 0x89, 0x92, 0xce, 0xa2, 0x79, 0xef, 0x0e, 0x2f, | ||||
| 	/* (2^ 15)P */ 0xce, 0x37, 0x3c, 0x08, 0x0c, 0xbf, 0xec, 0x42, 0x22, 0x63, 0x49, 0xec, 0x09, 0xbc, 0x30, 0x29, 0x0d, 0xac, 0xfe, 0x9c, 0xc1, 0xb0, 0x94, 0xf2, 0x80, 0xbb, 0xfa, 0xed, 0x4b, 0xaa, 0x80, 0x37, | ||||
| 	/* (2^ 16)P */ 0x29, 0xd9, 0xea, 0x7c, 0x3e, 0x7d, 0xc1, 0x56, 0xc5, 0x22, 0x57, 0x2e, 0xeb, 0x4b, 0xcb, 0xe7, 0x5a, 0xe1, 0xbf, 0x2d, 0x73, 0x31, 0xe9, 0x0c, 0xf8, 0x52, 0x10, 0x62, 0xc7, 0x83, 0xb8, 0x41, | ||||
| 	/* (2^ 17)P */ 0x50, 0x53, 0xd2, 0xc3, 0xa0, 0x5c, 0xf7, 0xdb, 0x51, 0xe3, 0xb1, 0x6e, 0x08, 0xbe, 0x36, 0x29, 0x12, 0xb2, 0xa9, 0xb4, 0x3c, 0xe0, 0x36, 0xc9, 0xaa, 0x25, 0x22, 0x32, 0x82, 0xbf, 0x45, 0x1d, | ||||
| 	/* (2^ 18)P */ 0xc5, 0x4c, 0x02, 0x6a, 0x03, 0xb1, 0x1a, 0xe8, 0x72, 0x9a, 0x4c, 0x30, 0x1c, 0x20, 0x12, 0xe2, 0xfc, 0xb1, 0x32, 0x68, 0xba, 0x3f, 0xd7, 0xc5, 0x81, 0x95, 0x83, 0x4d, 0x5a, 0xdb, 0xff, 0x20, | ||||
| 	/* (2^ 19)P */ 0xad, 0x0f, 0x5d, 0xbe, 0x67, 0xd3, 0x83, 0xa2, 0x75, 0x44, 0x16, 0x8b, 0xca, 0x25, 0x2b, 0x6c, 0x2e, 0xf2, 0xaa, 0x7c, 0x46, 0x35, 0x49, 0x9d, 0x49, 0xff, 0x85, 0xee, 0x8e, 0x40, 0x66, 0x51, | ||||
| 	/* (2^ 20)P */ 0x61, 0xe3, 0xb4, 0xfa, 0xa2, 0xba, 0x67, 0x3c, 0xef, 0x5c, 0xf3, 0x7e, 0xc6, 0x33, 0xe4, 0xb3, 0x1c, 0x9b, 0x15, 0x41, 0x92, 0x72, 0x59, 0x52, 0x33, 0xab, 0xb0, 0xd5, 0x92, 0x18, 0x62, 0x6a, | ||||
| 	/* (2^ 21)P */ 0xcb, 0xcd, 0x55, 0x75, 0x38, 0x4a, 0xb7, 0x20, 0x3f, 0x92, 0x08, 0x12, 0x0e, 0xa1, 0x2a, 0x53, 0xd1, 0x1d, 0x28, 0x62, 0x77, 0x7b, 0xa1, 0xea, 0xbf, 0x44, 0x5c, 0xf0, 0x43, 0x34, 0xab, 0x61, | ||||
| 	/* (2^ 22)P */ 0xf8, 0xde, 0x24, 0x23, 0x42, 0x6c, 0x7a, 0x25, 0x7f, 0xcf, 0xe3, 0x17, 0x10, 0x6c, 0x1c, 0x13, 0x57, 0xa2, 0x30, 0xf6, 0x39, 0x87, 0x75, 0x23, 0x80, 0x85, 0xa7, 0x01, 0x7a, 0x40, 0x5a, 0x29, | ||||
| 	/* (2^ 23)P */ 0xd9, 0xa8, 0x5d, 0x6d, 0x24, 0x43, 0xc4, 0xf8, 0x5d, 0xfa, 0x52, 0x0c, 0x45, 0x75, 0xd7, 0x19, 0x3d, 0xf8, 0x1b, 0x73, 0x92, 0xfc, 0xfc, 0x2a, 0x00, 0x47, 0x2b, 0x1b, 0xe8, 0xc8, 0x10, 0x7d, | ||||
| 	/* (2^ 24)P */ 0x0b, 0xa2, 0xba, 0x70, 0x1f, 0x27, 0xe0, 0xc8, 0x57, 0x39, 0xa6, 0x7c, 0x86, 0x48, 0x37, 0x99, 0xbb, 0xd4, 0x7e, 0xcb, 0xb3, 0xef, 0x12, 0x54, 0x75, 0x29, 0xe6, 0x73, 0x61, 0xd3, 0x96, 0x31, | ||||
| 	/* (2^ 25)P */ 0xfc, 0xdf, 0xc7, 0x41, 0xd1, 0xca, 0x5b, 0xde, 0x48, 0xc8, 0x95, 0xb3, 0xd2, 0x8c, 0xcc, 0x47, 0xcb, 0xf3, 0x1a, 0xe1, 0x42, 0xd9, 0x4c, 0xa3, 0xc2, 0xce, 0x4e, 0xd0, 0xf2, 0xdb, 0x56, 0x02, | ||||
| 	/* (2^ 26)P */ 0x7f, 0x66, 0x0e, 0x4b, 0xe9, 0xb7, 0x5a, 0x87, 0x10, 0x0d, 0x85, 0xc0, 0x83, 0xdd, 0xd4, 0xca, 0x9f, 0xc7, 0x72, 0x4e, 0x8f, 0x2e, 0xf1, 0x47, 0x9b, 0xb1, 0x85, 0x8c, 0xbb, 0x87, 0x1a, 0x5f, | ||||
| 	/* (2^ 27)P */ 0xb8, 0x51, 0x7f, 0x43, 0xb6, 0xd0, 0xe9, 0x7a, 0x65, 0x90, 0x87, 0x18, 0x55, 0xce, 0xc7, 0x12, 0xee, 0x7a, 0xf7, 0x5c, 0xfe, 0x09, 0xde, 0x2a, 0x27, 0x56, 0x2c, 0x7d, 0x2f, 0x5a, 0xa0, 0x23, | ||||
| 	/* (2^ 28)P */ 0x9a, 0x16, 0x7c, 0xf1, 0x28, 0xe1, 0x08, 0x59, 0x2d, 0x85, 0xd0, 0x8a, 0xdd, 0x98, 0x74, 0xf7, 0x64, 0x2f, 0x10, 0xab, 0xce, 0xc4, 0xb4, 0x74, 0x45, 0x98, 0x13, 0x10, 0xdd, 0xba, 0x3a, 0x18, | ||||
| 	/* (2^ 29)P */ 0xac, 0xaa, 0x92, 0xaa, 0x8d, 0xba, 0x65, 0xb1, 0x05, 0x67, 0x38, 0x99, 0x95, 0xef, 0xc5, 0xd5, 0xd1, 0x40, 0xfc, 0xf8, 0x0c, 0x8f, 0x2f, 0xbe, 0x14, 0x45, 0x20, 0xee, 0x35, 0xe6, 0x01, 0x27, | ||||
| 	/* (2^ 30)P */ 0x14, 0x65, 0x15, 0x20, 0x00, 0xa8, 0x9f, 0x62, 0xce, 0xc1, 0xa8, 0x64, 0x87, 0x86, 0x23, 0xf2, 0x0e, 0x06, 0x3f, 0x0b, 0xff, 0x4f, 0x89, 0x5b, 0xfa, 0xa3, 0x08, 0xf7, 0x4c, 0x94, 0xd9, 0x60, | ||||
| 	/* (2^ 31)P */ 0x1f, 0x20, 0x7a, 0x1c, 0x1a, 0x00, 0xea, 0xae, 0x63, 0xce, 0xe2, 0x3e, 0x63, 0x6a, 0xf1, 0xeb, 0xe1, 0x07, 0x7a, 0x4c, 0x59, 0x09, 0x77, 0x6f, 0xcb, 0x08, 0x02, 0x0d, 0x15, 0x58, 0xb9, 0x79, | ||||
| 	/* (2^ 32)P */ 0xe7, 0x10, 0xd4, 0x01, 0x53, 0x5e, 0xb5, 0x24, 0x4d, 0xc8, 0xfd, 0xf3, 0xdf, 0x4e, 0xa3, 0xe3, 0xd8, 0x32, 0x40, 0x90, 0xe4, 0x68, 0x87, 0xd8, 0xec, 0xae, 0x3a, 0x7b, 0x42, 0x84, 0x13, 0x13, | ||||
| 	/* (2^ 33)P */ 0x14, 0x4f, 0x23, 0x86, 0x12, 0xe5, 0x05, 0x84, 0x29, 0xc5, 0xb4, 0xad, 0x39, 0x47, 0xdc, 0x14, 0xfd, 0x4f, 0x63, 0x50, 0xb2, 0xb5, 0xa2, 0xb8, 0x93, 0xff, 0xa7, 0xd8, 0x4a, 0xa9, 0xe2, 0x2f, | ||||
| 	/* (2^ 34)P */ 0xdd, 0xfa, 0x43, 0xe8, 0xef, 0x57, 0x5c, 0xec, 0x18, 0x99, 0xbb, 0xf0, 0x40, 0xce, 0x43, 0x28, 0x05, 0x63, 0x3d, 0xcf, 0xd6, 0x61, 0xb5, 0xa4, 0x7e, 0x77, 0xfb, 0xe8, 0xbd, 0x29, 0x36, 0x74, | ||||
| 	/* (2^ 35)P */ 0x8f, 0x73, 0xaf, 0xbb, 0x46, 0xdd, 0x3e, 0x34, 0x51, 0xa6, 0x01, 0xb1, 0x28, 0x18, 0x98, 0xed, 0x7a, 0x79, 0x2c, 0x88, 0x0b, 0x76, 0x01, 0xa4, 0x30, 0x87, 0xc8, 0x8d, 0xe2, 0x23, 0xc2, 0x1f, | ||||
| 	/* (2^ 36)P */ 0x0e, 0xba, 0x0f, 0xfc, 0x91, 0x4e, 0x60, 0x48, 0xa4, 0x6f, 0x2c, 0x05, 0x8f, 0xf7, 0x37, 0xb6, 0x9c, 0x23, 0xe9, 0x09, 0x3d, 0xac, 0xcc, 0x91, 0x7c, 0x68, 0x7a, 0x43, 0xd4, 0xee, 0xf7, 0x23, | ||||
| 	/* (2^ 37)P */ 0x00, 0xd8, 0x9b, 0x8d, 0x11, 0xb1, 0x73, 0x51, 0xa7, 0xd4, 0x89, 0x31, 0xb6, 0x41, 0xd6, 0x29, 0x86, 0xc5, 0xbb, 0x88, 0x79, 0x17, 0xbf, 0xfd, 0xf5, 0x1d, 0xd8, 0xca, 0x4f, 0x89, 0x59, 0x29, | ||||
| 	/* (2^ 38)P */ 0x99, 0xc8, 0xbb, 0xb4, 0xf3, 0x8e, 0xbc, 0xae, 0xb9, 0x92, 0x69, 0xb2, 0x5a, 0x99, 0x48, 0x41, 0xfb, 0x2c, 0xf9, 0x34, 0x01, 0x0b, 0xe2, 0x24, 0xe8, 0xde, 0x05, 0x4a, 0x89, 0x58, 0xd1, 0x40, | ||||
| 	/* (2^ 39)P */ 0xf6, 0x76, 0xaf, 0x85, 0x11, 0x0b, 0xb0, 0x46, 0x79, 0x7a, 0x18, 0x73, 0x78, 0xc7, 0xba, 0x26, 0x5f, 0xff, 0x8f, 0xab, 0x95, 0xbf, 0xc0, 0x3d, 0xd7, 0x24, 0x55, 0x94, 0xd8, 0x8b, 0x60, 0x2a, | ||||
| 	/* (2^ 40)P */ 0x02, 0x63, 0x44, 0xbd, 0x88, 0x95, 0x44, 0x26, 0x9c, 0x43, 0x88, 0x03, 0x1c, 0xc2, 0x4b, 0x7c, 0xb2, 0x11, 0xbd, 0x83, 0xf3, 0xa4, 0x98, 0x8e, 0xb9, 0x76, 0xd8, 0xc9, 0x7b, 0x8d, 0x21, 0x26, | ||||
| 	/* (2^ 41)P */ 0x8a, 0x17, 0x7c, 0x99, 0x42, 0x15, 0x08, 0xe3, 0x6f, 0x60, 0xb6, 0x6f, 0xa8, 0x29, 0x2d, 0x3c, 0x74, 0x93, 0x27, 0xfa, 0x36, 0x77, 0x21, 0x5c, 0xfa, 0xb1, 0xfe, 0x4a, 0x73, 0x05, 0xde, 0x7d, | ||||
| 	/* (2^ 42)P */ 0xab, 0x2b, 0xd4, 0x06, 0x39, 0x0e, 0xf1, 0x3b, 0x9c, 0x64, 0x80, 0x19, 0x3e, 0x80, 0xf7, 0xe4, 0x7a, 0xbf, 0x95, 0x95, 0xf8, 0x3b, 0x05, 0xe6, 0x30, 0x55, 0x24, 0xda, 0x38, 0xaf, 0x4f, 0x39, | ||||
| 	/* (2^ 43)P */ 0xf4, 0x28, 0x69, 0x89, 0x58, 0xfb, 0x8e, 0x7a, 0x3c, 0x11, 0x6a, 0xcc, 0xe9, 0x78, 0xc7, 0xfb, 0x6f, 0x59, 0xaf, 0x30, 0xe3, 0x0c, 0x67, 0x72, 0xf7, 0x6c, 0x3d, 0x1d, 0xa8, 0x22, 0xf2, 0x48, | ||||
| 	/* (2^ 44)P */ 0xa7, 0xca, 0x72, 0x0d, 0x41, 0xce, 0x1f, 0xf0, 0x95, 0x55, 0x3b, 0x21, 0xc7, 0xec, 0x20, 0x5a, 0x83, 0x14, 0xfa, 0xc1, 0x65, 0x11, 0xc2, 0x7b, 0x41, 0xa7, 0xa8, 0x1d, 0xe3, 0x9a, 0xf8, 0x07, | ||||
| 	/* (2^ 45)P */ 0xf9, 0x0f, 0x83, 0xc6, 0xb4, 0xc2, 0xd2, 0x05, 0x93, 0x62, 0x31, 0xc6, 0x0f, 0x33, 0x3e, 0xd4, 0x04, 0xa9, 0xd3, 0x96, 0x0a, 0x59, 0xa5, 0xa5, 0xb6, 0x33, 0x53, 0xa6, 0x91, 0xdb, 0x5e, 0x70, | ||||
| 	/* (2^ 46)P */ 0xf7, 0xa5, 0xb9, 0x0b, 0x5e, 0xe1, 0x8e, 0x04, 0x5d, 0xaf, 0x0a, 0x9e, 0xca, 0xcf, 0x40, 0x32, 0x0b, 0xa4, 0xc4, 0xed, 0xce, 0x71, 0x4b, 0x8f, 0x6d, 0x4a, 0x54, 0xde, 0xa3, 0x0d, 0x1c, 0x62, | ||||
| 	/* (2^ 47)P */ 0x91, 0x40, 0x8c, 0xa0, 0x36, 0x28, 0x87, 0x92, 0x45, 0x14, 0xc9, 0x10, 0xb0, 0x75, 0x83, 0xce, 0x94, 0x63, 0x27, 0x4f, 0x52, 0xeb, 0x72, 0x8a, 0x35, 0x36, 0xc8, 0x7e, 0xfa, 0xfc, 0x67, 0x26, | ||||
| 	/* (2^ 48)P */ 0x2a, 0x75, 0xe8, 0x45, 0x33, 0x17, 0x4c, 0x7f, 0xa5, 0x79, 0x70, 0xee, 0xfe, 0x47, 0x1b, 0x06, 0x34, 0xff, 0x86, 0x9f, 0xfa, 0x9a, 0xdd, 0x25, 0x9c, 0xc8, 0x5d, 0x42, 0xf5, 0xce, 0x80, 0x37, | ||||
| 	/* (2^ 49)P */ 0xe9, 0xb4, 0x3b, 0x51, 0x5a, 0x03, 0x46, 0x1a, 0xda, 0x5a, 0x57, 0xac, 0x79, 0xf3, 0x1e, 0x3e, 0x50, 0x4b, 0xa2, 0x5f, 0x1c, 0x5f, 0x8c, 0xc7, 0x22, 0x9f, 0xfd, 0x34, 0x76, 0x96, 0x1a, 0x32, | ||||
| 	/* (2^ 50)P */ 0xfa, 0x27, 0x6e, 0x82, 0xb8, 0x07, 0x67, 0x94, 0xd0, 0x6f, 0x50, 0x4c, 0xd6, 0x84, 0xca, 0x3d, 0x36, 0x14, 0xe9, 0x75, 0x80, 0x21, 0x89, 0xc1, 0x84, 0x84, 0x3b, 0x9b, 0x16, 0x84, 0x92, 0x6d, | ||||
| 	/* (2^ 51)P */ 0xdf, 0x2d, 0x3f, 0x38, 0x40, 0xe8, 0x67, 0x3a, 0x75, 0x9b, 0x4f, 0x0c, 0xa3, 0xc9, 0xee, 0x33, 0x47, 0xef, 0x83, 0xa7, 0x6f, 0xc8, 0xc7, 0x3e, 0xc4, 0xfb, 0xc9, 0xba, 0x9f, 0x44, 0xec, 0x26, | ||||
| 	/* (2^ 52)P */ 0x7d, 0x9e, 0x9b, 0xa0, 0xcb, 0x38, 0x0f, 0x5c, 0x8c, 0x47, 0xa3, 0x62, 0xc7, 0x8c, 0x16, 0x81, 0x1c, 0x12, 0xfc, 0x06, 0xd3, 0xb0, 0x23, 0x3e, 0xdd, 0xdc, 0xef, 0xa5, 0xa0, 0x8a, 0x23, 0x5a, | ||||
| 	/* (2^ 53)P */ 0xff, 0x43, 0xea, 0xc4, 0x21, 0x61, 0xa2, 0x1b, 0xb5, 0x32, 0x88, 0x7c, 0x7f, 0xc7, 0xf8, 0x36, 0x9a, 0xf9, 0xdc, 0x0a, 0x0b, 0xea, 0xfb, 0x88, 0xf9, 0xeb, 0x5b, 0xc2, 0x8e, 0x93, 0xa9, 0x5c, | ||||
| 	/* (2^ 54)P */ 0xa0, 0xcd, 0xfc, 0x51, 0x5e, 0x6a, 0x43, 0xd5, 0x3b, 0x89, 0xcd, 0xc2, 0x97, 0x47, 0xbc, 0x1d, 0x08, 0x4a, 0x22, 0xd3, 0x65, 0x6a, 0x34, 0x19, 0x66, 0xf4, 0x9a, 0x9b, 0xe4, 0x34, 0x50, 0x0f, | ||||
| 	/* (2^ 55)P */ 0x6e, 0xb9, 0xe0, 0xa1, 0x67, 0x39, 0x3c, 0xf2, 0x88, 0x4d, 0x7a, 0x86, 0xfa, 0x08, 0x8b, 0xe5, 0x79, 0x16, 0x34, 0xa7, 0xc6, 0xab, 0x2f, 0xfb, 0x46, 0x69, 0x02, 0xb6, 0x1e, 0x38, 0x75, 0x2a, | ||||
| 	/* (2^ 56)P */ 0xac, 0x20, 0x94, 0xc1, 0xe4, 0x3b, 0x0a, 0xc8, 0xdc, 0xb6, 0xf2, 0x81, 0xc6, 0xf6, 0xb1, 0x66, 0x88, 0x33, 0xe9, 0x61, 0x67, 0x03, 0xf7, 0x7c, 0xc4, 0xa4, 0x60, 0xa6, 0xd8, 0xbb, 0xab, 0x25, | ||||
| 	/* (2^ 57)P */ 0x98, 0x51, 0xfd, 0x14, 0xba, 0x12, 0xea, 0x91, 0xa9, 0xff, 0x3c, 0x4a, 0xfc, 0x50, 0x49, 0x68, 0x28, 0xad, 0xf5, 0x30, 0x21, 0x84, 0x26, 0xf8, 0x41, 0xa4, 0x01, 0x53, 0xf7, 0x88, 0xa9, 0x3e, | ||||
| 	/* (2^ 58)P */ 0x6f, 0x8c, 0x5f, 0x69, 0x9a, 0x10, 0x78, 0xc9, 0xf3, 0xc3, 0x30, 0x05, 0x4a, 0xeb, 0x46, 0x17, 0x95, 0x99, 0x45, 0xb4, 0x77, 0x6d, 0x4d, 0x44, 0xc7, 0x5c, 0x4e, 0x05, 0x8c, 0x2b, 0x95, 0x75, | ||||
| 	/* (2^ 59)P */ 0xaa, 0xd6, 0xf4, 0x15, 0x79, 0x3f, 0x70, 0xa3, 0xd8, 0x47, 0x26, 0x2f, 0x20, 0x46, 0xc3, 0x66, 0x4b, 0x64, 0x1d, 0x81, 0xdf, 0x69, 0x14, 0xd0, 0x1f, 0xd7, 0xa5, 0x81, 0x7d, 0xa4, 0xfe, 0x77, | ||||
| 	/* (2^ 60)P */ 0x81, 0xa3, 0x7c, 0xf5, 0x9e, 0x52, 0xe9, 0xc5, 0x1a, 0x88, 0x2f, 0xce, 0xb9, 0xb4, 0xee, 0x6e, 0xd6, 0x9b, 0x00, 0xe8, 0x28, 0x1a, 0xe9, 0xb6, 0xec, 0x3f, 0xfc, 0x9a, 0x3e, 0xbe, 0x80, 0x4b, | ||||
| 	/* (2^ 61)P */ 0xc5, 0xd2, 0xae, 0x26, 0xc5, 0x73, 0x37, 0x7e, 0x9d, 0xa4, 0xc9, 0x53, 0xb4, 0xfc, 0x4a, 0x1b, 0x4d, 0xb2, 0xff, 0xba, 0xd7, 0xbd, 0x20, 0xa9, 0x0e, 0x40, 0x2d, 0x12, 0x9f, 0x69, 0x54, 0x7c, | ||||
| 	/* (2^ 62)P */ 0xc8, 0x4b, 0xa9, 0x4f, 0xe1, 0xc8, 0x46, 0xef, 0x5e, 0xed, 0x52, 0x29, 0xce, 0x74, 0xb0, 0xe0, 0xd5, 0x85, 0xd8, 0xdb, 0xe1, 0x50, 0xa4, 0xbe, 0x2c, 0x71, 0x0f, 0x32, 0x49, 0x86, 0xb6, 0x61, | ||||
| 	/* (2^ 63)P */ 0xd1, 0xbd, 0xcc, 0x09, 0x73, 0x5f, 0x48, 0x8a, 0x2d, 0x1a, 0x4d, 0x7d, 0x0d, 0x32, 0x06, 0xbd, 0xf4, 0xbe, 0x2d, 0x32, 0x73, 0x29, 0x23, 0x25, 0x70, 0xf7, 0x17, 0x8c, 0x75, 0xc4, 0x5d, 0x44, | ||||
| 	/* (2^ 64)P */ 0x3c, 0x93, 0xc8, 0x7c, 0x17, 0x34, 0x04, 0xdb, 0x9f, 0x05, 0xea, 0x75, 0x21, 0xe8, 0x6f, 0xed, 0x34, 0xdb, 0x53, 0xc0, 0xfd, 0xbe, 0xfe, 0x1e, 0x99, 0xaf, 0x5d, 0xc6, 0x67, 0xe8, 0xdb, 0x4a, | ||||
| 	/* (2^ 65)P */ 0xdf, 0x09, 0x06, 0xa9, 0xa2, 0x71, 0xcd, 0x3a, 0x50, 0x40, 0xd0, 0x6d, 0x85, 0x91, 0xe9, 0xe5, 0x3c, 0xc2, 0x57, 0x81, 0x68, 0x9b, 0xc6, 0x1e, 0x4d, 0xfe, 0x5c, 0x88, 0xf6, 0x27, 0x74, 0x69, | ||||
| 	/* (2^ 66)P */ 0x51, 0xa8, 0xe1, 0x65, 0x9b, 0x7b, 0xbe, 0xd7, 0xdd, 0x36, 0xc5, 0x22, 0xd5, 0x28, 0x3d, 0xa0, 0x45, 0xb6, 0xd2, 0x8f, 0x65, 0x9d, 0x39, 0x28, 0xe1, 0x41, 0x26, 0x7c, 0xe1, 0xb7, 0xe5, 0x49, | ||||
| 	/* (2^ 67)P */ 0xa4, 0x57, 0x04, 0x70, 0x98, 0x3a, 0x8c, 0x6f, 0x78, 0x67, 0xbb, 0x5e, 0xa2, 0xf0, 0x78, 0x50, 0x0f, 0x96, 0x82, 0xc3, 0xcb, 0x3c, 0x3c, 0xd1, 0xb1, 0x84, 0xdf, 0xa7, 0x58, 0x32, 0x00, 0x2e, | ||||
| 	/* (2^ 68)P */ 0x1c, 0x6a, 0x29, 0xe6, 0x9b, 0xf3, 0xd1, 0x8a, 0xb2, 0xbf, 0x5f, 0x2a, 0x65, 0xaa, 0xee, 0xc1, 0xcb, 0xf3, 0x26, 0xfd, 0x73, 0x06, 0xee, 0x33, 0xcc, 0x2c, 0x9d, 0xa6, 0x73, 0x61, 0x25, 0x59, | ||||
| 	/* (2^ 69)P */ 0x41, 0xfc, 0x18, 0x4e, 0xaa, 0x07, 0xea, 0x41, 0x1e, 0xa5, 0x87, 0x7c, 0x52, 0x19, 0xfc, 0xd9, 0x6f, 0xca, 0x31, 0x58, 0x80, 0xcb, 0xaa, 0xbd, 0x4f, 0x69, 0x16, 0xc9, 0x2d, 0x65, 0x5b, 0x44, | ||||
| 	/* (2^ 70)P */ 0x15, 0x23, 0x17, 0xf2, 0xa7, 0xa3, 0x92, 0xce, 0x64, 0x99, 0x1b, 0xe1, 0x2d, 0x28, 0xdc, 0x1e, 0x4a, 0x31, 0x4c, 0xe0, 0xaf, 0x3a, 0x82, 0xa1, 0x86, 0xf5, 0x7c, 0x43, 0x94, 0x2d, 0x0a, 0x79, | ||||
| 	/* (2^ 71)P */ 0x09, 0xe0, 0xf6, 0x93, 0xfb, 0x47, 0xc4, 0x71, 0x76, 0x52, 0x84, 0x22, 0x67, 0xa5, 0x22, 0x89, 0x69, 0x51, 0x4f, 0x20, 0x3b, 0x90, 0x70, 0xbf, 0xfe, 0x19, 0xa3, 0x1b, 0x89, 0x89, 0x7a, 0x2f, | ||||
| 	/* (2^ 72)P */ 0x0c, 0x14, 0xe2, 0x77, 0xb5, 0x8e, 0xa0, 0x02, 0xf4, 0xdc, 0x7b, 0x42, 0xd4, 0x4e, 0x9a, 0xed, 0xd1, 0x3c, 0x32, 0xe4, 0x44, 0xec, 0x53, 0x52, 0x5b, 0x35, 0xe9, 0x14, 0x3c, 0x36, 0x88, 0x3e, | ||||
| 	/* (2^ 73)P */ 0x8c, 0x0b, 0x11, 0x77, 0x42, 0xc1, 0x66, 0xaa, 0x90, 0x33, 0xa2, 0x10, 0x16, 0x39, 0xe0, 0x1a, 0xa2, 0xc2, 0x3f, 0xc9, 0x12, 0xbd, 0x30, 0x20, 0xab, 0xc7, 0x55, 0x95, 0x57, 0x41, 0xe1, 0x3e, | ||||
| 	/* (2^ 74)P */ 0x41, 0x7d, 0x6e, 0x6d, 0x3a, 0xde, 0x14, 0x92, 0xfe, 0x7e, 0xf1, 0x07, 0x86, 0xd8, 0xcd, 0x3c, 0x17, 0x12, 0xe1, 0xf8, 0x88, 0x12, 0x4f, 0x67, 0xd0, 0x93, 0x9f, 0x32, 0x0f, 0x25, 0x82, 0x56, | ||||
| 	/* (2^ 75)P */ 0x6e, 0x39, 0x2e, 0x6d, 0x13, 0x0b, 0xf0, 0x6c, 0xbf, 0xde, 0x14, 0x10, 0x6f, 0xf8, 0x4c, 0x6e, 0x83, 0x4e, 0xcc, 0xbf, 0xb5, 0xb1, 0x30, 0x59, 0xb6, 0x16, 0xba, 0x8a, 0xb4, 0x69, 0x70, 0x04, | ||||
| 	/* (2^ 76)P */ 0x93, 0x07, 0xb2, 0x69, 0xab, 0xe4, 0x4c, 0x0d, 0x9e, 0xfb, 0xd0, 0x97, 0x1a, 0xb9, 0x4d, 0xb2, 0x1d, 0xd0, 0x00, 0x4e, 0xf5, 0x50, 0xfa, 0xcd, 0xb5, 0xdd, 0x8b, 0x36, 0x85, 0x10, 0x1b, 0x22, | ||||
| 	/* (2^ 77)P */ 0xd2, 0xd8, 0xe3, 0xb1, 0x68, 0x94, 0xe5, 0xe7, 0x93, 0x2f, 0x12, 0xbd, 0x63, 0x65, 0xc5, 0x53, 0x09, 0x3f, 0x66, 0xe0, 0x03, 0xa9, 0xe8, 0xee, 0x42, 0x3d, 0xbe, 0xcb, 0x62, 0xa6, 0xef, 0x61, | ||||
| 	/* (2^ 78)P */ 0x2a, 0xab, 0x6e, 0xde, 0xdd, 0xdd, 0xf8, 0x2c, 0x31, 0xf2, 0x35, 0x14, 0xd5, 0x0a, 0xf8, 0x9b, 0x73, 0x49, 0xf0, 0xc9, 0xce, 0xda, 0xea, 0x5d, 0x27, 0x9b, 0xd2, 0x41, 0x5d, 0x5b, 0x27, 0x29, | ||||
| 	/* (2^ 79)P */ 0x4f, 0xf1, 0xeb, 0x95, 0x08, 0x0f, 0xde, 0xcf, 0xa7, 0x05, 0x49, 0x05, 0x6b, 0xb9, 0xaa, 0xb9, 0xfd, 0x20, 0xc4, 0xa1, 0xd9, 0x0d, 0xe8, 0xca, 0xc7, 0xbb, 0x73, 0x16, 0x2f, 0xbf, 0x63, 0x0a, | ||||
| 	/* (2^ 80)P */ 0x8c, 0xbc, 0x8f, 0x95, 0x11, 0x6e, 0x2f, 0x09, 0xad, 0x2f, 0x82, 0x04, 0xe8, 0x81, 0x2a, 0x67, 0x17, 0x25, 0xd5, 0x60, 0x15, 0x35, 0xc8, 0xca, 0xf8, 0x92, 0xf1, 0xc8, 0x22, 0x77, 0x3f, 0x6f, | ||||
| 	/* (2^ 81)P */ 0xb7, 0x94, 0xe8, 0xc2, 0xcc, 0x90, 0xba, 0xf8, 0x0d, 0x9f, 0xff, 0x38, 0xa4, 0x57, 0x75, 0x2c, 0x59, 0x23, 0xe5, 0x5a, 0x85, 0x1d, 0x4d, 0x89, 0x69, 0x3d, 0x74, 0x7b, 0x15, 0x22, 0xe1, 0x68, | ||||
| 	/* (2^ 82)P */ 0xf3, 0x19, 0xb9, 0xcf, 0x70, 0x55, 0x7e, 0xd8, 0xb9, 0x8d, 0x79, 0x95, 0xcd, 0xde, 0x2c, 0x3f, 0xce, 0xa2, 0xc0, 0x10, 0x47, 0x15, 0x21, 0x21, 0xb2, 0xc5, 0x6d, 0x24, 0x15, 0xa1, 0x66, 0x3c, | ||||
| 	/* (2^ 83)P */ 0x72, 0xcb, 0x4e, 0x29, 0x62, 0xc5, 0xed, 0xcb, 0x16, 0x0b, 0x28, 0x6a, 0xc3, 0x43, 0x71, 0xba, 0x67, 0x8b, 0x07, 0xd4, 0xef, 0xc2, 0x10, 0x96, 0x1e, 0x4b, 0x6a, 0x94, 0x5d, 0x73, 0x44, 0x61, | ||||
| 	/* (2^ 84)P */ 0x50, 0x33, 0x5b, 0xd7, 0x1e, 0x11, 0x6f, 0x53, 0x1b, 0xd8, 0x41, 0x20, 0x8c, 0xdb, 0x11, 0x02, 0x3c, 0x41, 0x10, 0x0e, 0x00, 0xb1, 0x3c, 0xf9, 0x76, 0x88, 0x9e, 0x03, 0x3c, 0xfd, 0x9d, 0x14, | ||||
| 	/* (2^ 85)P */ 0x5b, 0x15, 0x63, 0x6b, 0xe4, 0xdd, 0x79, 0xd4, 0x76, 0x79, 0x83, 0x3c, 0xe9, 0x15, 0x6e, 0xb6, 0x38, 0xe0, 0x13, 0x1f, 0x3b, 0xe4, 0xfd, 0xda, 0x35, 0x0b, 0x4b, 0x2e, 0x1a, 0xda, 0xaf, 0x5f, | ||||
| 	/* (2^ 86)P */ 0x81, 0x75, 0x19, 0x17, 0xdf, 0xbb, 0x00, 0x36, 0xc2, 0xd2, 0x3c, 0xbe, 0x0b, 0x05, 0x72, 0x39, 0x86, 0xbe, 0xd5, 0xbd, 0x6d, 0x90, 0x38, 0x59, 0x0f, 0x86, 0x9b, 0x3f, 0xe4, 0xe5, 0xfc, 0x34, | ||||
| 	/* (2^ 87)P */ 0x02, 0x4d, 0xd1, 0x42, 0xcd, 0xa4, 0xa8, 0x75, 0x65, 0xdf, 0x41, 0x34, 0xc5, 0xab, 0x8d, 0x82, 0xd3, 0x31, 0xe1, 0xd2, 0xed, 0xab, 0xdc, 0x33, 0x5f, 0xd2, 0x14, 0xb8, 0x6f, 0xd7, 0xba, 0x3e, | ||||
| 	/* (2^ 88)P */ 0x0f, 0xe1, 0x70, 0x6f, 0x56, 0x6f, 0x90, 0xd4, 0x5a, 0x0f, 0x69, 0x51, 0xaa, 0xf7, 0x12, 0x5d, 0xf2, 0xfc, 0xce, 0x76, 0x6e, 0xb1, 0xad, 0x45, 0x99, 0x29, 0x23, 0xad, 0xae, 0x68, 0xf7, 0x01, | ||||
| 	/* (2^ 89)P */ 0xbd, 0xfe, 0x48, 0x62, 0x7b, 0xc7, 0x6c, 0x2b, 0xfd, 0xaf, 0x3a, 0xec, 0x28, 0x06, 0xd3, 0x3c, 0x6a, 0x48, 0xef, 0xd4, 0x80, 0x0b, 0x1c, 0xce, 0x23, 0x6c, 0xf6, 0xa6, 0x2e, 0xff, 0x3b, 0x4c, | ||||
| 	/* (2^ 90)P */ 0x5f, 0xeb, 0xea, 0x4a, 0x09, 0xc4, 0x2e, 0x3f, 0xa7, 0x2c, 0x37, 0x6e, 0x28, 0x9b, 0xb1, 0x61, 0x1d, 0x70, 0x2a, 0xde, 0x66, 0xa9, 0xef, 0x5e, 0xef, 0xe3, 0x55, 0xde, 0x65, 0x05, 0xb2, 0x23, | ||||
| 	/* (2^ 91)P */ 0x57, 0x85, 0xd5, 0x79, 0x52, 0xca, 0x01, 0xe3, 0x4f, 0x87, 0xc2, 0x27, 0xce, 0xd4, 0xb2, 0x07, 0x67, 0x1d, 0xcf, 0x9d, 0x8a, 0xcd, 0x32, 0xa5, 0x56, 0xff, 0x2b, 0x3f, 0xe2, 0xfe, 0x52, 0x2a, | ||||
| 	/* (2^ 92)P */ 0x3d, 0x66, 0xd8, 0x7c, 0xb3, 0xef, 0x24, 0x86, 0x94, 0x75, 0xbd, 0xff, 0x20, 0xac, 0xc7, 0xbb, 0x45, 0x74, 0xd3, 0x82, 0x9c, 0x5e, 0xb8, 0x57, 0x66, 0xec, 0xa6, 0x86, 0xcb, 0x52, 0x30, 0x7b, | ||||
| 	/* (2^ 93)P */ 0x1e, 0xe9, 0x25, 0x25, 0xad, 0xf0, 0x82, 0x34, 0xa0, 0xdc, 0x8e, 0xd2, 0x43, 0x80, 0xb6, 0x2c, 0x3a, 0x00, 0x1b, 0x2e, 0x05, 0x6d, 0x4f, 0xaf, 0x0a, 0x1b, 0x78, 0x29, 0x25, 0x8c, 0x5f, 0x18, | ||||
| 	/* (2^ 94)P */ 0xd6, 0xe0, 0x0c, 0xd8, 0x5b, 0xde, 0x41, 0xaa, 0xd6, 0xe9, 0x53, 0x68, 0x41, 0xb2, 0x07, 0x94, 0x3a, 0x4c, 0x7f, 0x35, 0x6e, 0xc3, 0x3e, 0x56, 0xce, 0x7b, 0x29, 0x0e, 0xdd, 0xb8, 0xc4, 0x4c, | ||||
| 	/* (2^ 95)P */ 0x0e, 0x73, 0xb8, 0xff, 0x52, 0x1a, 0xfc, 0xa2, 0x37, 0x8e, 0x05, 0x67, 0x6e, 0xf1, 0x11, 0x18, 0xe1, 0x4e, 0xdf, 0xcd, 0x66, 0xa3, 0xf9, 0x10, 0x99, 0xf0, 0xb9, 0xa0, 0xc4, 0xa0, 0xf4, 0x72, | ||||
| 	/* (2^ 96)P */ 0xa7, 0x4e, 0x3f, 0x66, 0x6f, 0xc0, 0x16, 0x8c, 0xba, 0x0f, 0x97, 0x4e, 0xf7, 0x3a, 0x3b, 0x69, 0x45, 0xc3, 0x9e, 0xd6, 0xf1, 0xe7, 0x02, 0x21, 0x89, 0x80, 0x8a, 0x96, 0xbc, 0x3c, 0xa5, 0x0b, | ||||
| 	/* (2^ 97)P */ 0x37, 0x55, 0xa1, 0xfe, 0xc7, 0x9d, 0x3d, 0xca, 0x93, 0x64, 0x53, 0x51, 0xbb, 0x24, 0x68, 0x4c, 0xb1, 0x06, 0x40, 0x84, 0x14, 0x63, 0x88, 0xb9, 0x60, 0xcc, 0x54, 0xb4, 0x2a, 0xa7, 0xd2, 0x40, | ||||
| 	/* (2^ 98)P */ 0x75, 0x09, 0x57, 0x12, 0xb7, 0xa1, 0x36, 0x59, 0x57, 0xa6, 0xbd, 0xde, 0x48, 0xd6, 0xb9, 0x91, 0xea, 0x30, 0x43, 0xb6, 0x4b, 0x09, 0x44, 0x33, 0xd0, 0x51, 0xee, 0x12, 0x0d, 0xa1, 0x6b, 0x00, | ||||
| 	/* (2^ 99)P */ 0x58, 0x5d, 0xde, 0xf5, 0x68, 0x84, 0x22, 0x19, 0xb0, 0x05, 0xcc, 0x38, 0x4c, 0x2f, 0xb1, 0x0e, 0x90, 0x19, 0x60, 0xd5, 0x9d, 0x9f, 0x03, 0xa1, 0x0b, 0x0e, 0xff, 0x4f, 0xce, 0xd4, 0x02, 0x45, | ||||
| 	/* (2^100)P */ 0x89, 0xc1, 0x37, 0x68, 0x10, 0x54, 0x20, 0xeb, 0x3c, 0xb9, 0xd3, 0x6d, 0x4c, 0x54, 0xf6, 0xd0, 0x4f, 0xd7, 0x16, 0xc4, 0x64, 0x70, 0x72, 0x40, 0xf0, 0x2e, 0x50, 0x4b, 0x11, 0xc6, 0x15, 0x6e, | ||||
| 	/* (2^101)P */ 0x6b, 0xa7, 0xb1, 0xcf, 0x98, 0xa3, 0xf2, 0x4d, 0xb1, 0xf6, 0xf2, 0x19, 0x74, 0x6c, 0x25, 0x11, 0x43, 0x60, 0x6e, 0x06, 0x62, 0x79, 0x49, 0x4a, 0x44, 0x5b, 0x35, 0x41, 0xab, 0x3a, 0x5b, 0x70, | ||||
| 	/* (2^102)P */ 0xd8, 0xb1, 0x97, 0xd7, 0x36, 0xf5, 0x5e, 0x36, 0xdb, 0xf0, 0xdd, 0x22, 0xd6, 0x6b, 0x07, 0x00, 0x88, 0x5a, 0x57, 0xe0, 0xb0, 0x33, 0xbf, 0x3b, 0x4d, 0xca, 0xe4, 0xc8, 0x05, 0xaa, 0x77, 0x37, | ||||
| 	/* (2^103)P */ 0x5f, 0xdb, 0x78, 0x55, 0xc8, 0x45, 0x27, 0x39, 0xe2, 0x5a, 0xae, 0xdb, 0x49, 0x41, 0xda, 0x6f, 0x67, 0x98, 0xdc, 0x8a, 0x0b, 0xb0, 0xf0, 0xb1, 0xa3, 0x1d, 0x6f, 0xd3, 0x37, 0x34, 0x96, 0x09, | ||||
| 	/* (2^104)P */ 0x53, 0x38, 0xdc, 0xa5, 0x90, 0x4e, 0x82, 0x7e, 0xbd, 0x5c, 0x13, 0x1f, 0x64, 0xf6, 0xb5, 0xcc, 0xcc, 0x8f, 0xce, 0x87, 0x6c, 0xd8, 0x36, 0x67, 0x9f, 0x24, 0x04, 0x66, 0xe2, 0x3c, 0x5f, 0x62, | ||||
| 	/* (2^105)P */ 0x3f, 0xf6, 0x02, 0x95, 0x05, 0xc8, 0x8a, 0xaf, 0x69, 0x14, 0x35, 0x2e, 0x0a, 0xe7, 0x05, 0x0c, 0x05, 0x63, 0x4b, 0x76, 0x9c, 0x2e, 0x29, 0x35, 0xc3, 0x3a, 0xe2, 0xc7, 0x60, 0x43, 0x39, 0x1a, | ||||
| 	/* (2^106)P */ 0x64, 0x32, 0x18, 0x51, 0x32, 0xd5, 0xc6, 0xd5, 0x4f, 0xb7, 0xc2, 0x43, 0xbd, 0x5a, 0x06, 0x62, 0x9b, 0x3f, 0x97, 0x3b, 0xd0, 0xf5, 0xfb, 0xb5, 0x5e, 0x6e, 0x20, 0x61, 0x36, 0xda, 0xa3, 0x13, | ||||
| 	/* (2^107)P */ 0xe5, 0x94, 0x5d, 0x72, 0x37, 0x58, 0xbd, 0xc6, 0xc5, 0x16, 0x50, 0x20, 0x12, 0x09, 0xe3, 0x18, 0x68, 0x3c, 0x03, 0x70, 0x15, 0xce, 0x88, 0x20, 0x87, 0x79, 0x83, 0x5c, 0x49, 0x1f, 0xba, 0x7f, | ||||
| 	/* (2^108)P */ 0x9d, 0x07, 0xf9, 0xf2, 0x23, 0x74, 0x8c, 0x5a, 0xc5, 0x3f, 0x02, 0x34, 0x7b, 0x15, 0x35, 0x17, 0x51, 0xb3, 0xfa, 0xd2, 0x9a, 0xb4, 0xf9, 0xe4, 0x3c, 0xe3, 0x78, 0xc8, 0x72, 0xff, 0x91, 0x66, | ||||
| 	/* (2^109)P */ 0x3e, 0xff, 0x5e, 0xdc, 0xde, 0x2a, 0x2c, 0x12, 0xf4, 0x6c, 0x95, 0xd8, 0xf1, 0x4b, 0xdd, 0xf8, 0xda, 0x5b, 0x9e, 0x9e, 0x5d, 0x20, 0x86, 0xeb, 0x43, 0xc7, 0x75, 0xd9, 0xb9, 0x92, 0x9b, 0x04, | ||||
| 	/* (2^110)P */ 0x5a, 0xc0, 0xf6, 0xb0, 0x30, 0x97, 0x37, 0xa5, 0x53, 0xa5, 0xf3, 0xc6, 0xac, 0xff, 0xa0, 0x72, 0x6d, 0xcd, 0x0d, 0xb2, 0x34, 0x2c, 0x03, 0xb0, 0x4a, 0x16, 0xd5, 0x88, 0xbc, 0x9d, 0x0e, 0x47, | ||||
| 	/* (2^111)P */ 0x47, 0xc0, 0x37, 0xa2, 0x0c, 0xf1, 0x9c, 0xb1, 0xa2, 0x81, 0x6c, 0x1f, 0x71, 0x66, 0x54, 0xb6, 0x43, 0x0b, 0xd8, 0x6d, 0xd1, 0x1b, 0x32, 0xb3, 0x8e, 0xbe, 0x5f, 0x0c, 0x60, 0x4f, 0xc1, 0x48, | ||||
| 	/* (2^112)P */ 0x03, 0xc8, 0xa6, 0x4a, 0x26, 0x1c, 0x45, 0x66, 0xa6, 0x7d, 0xfa, 0xa4, 0x04, 0x39, 0x6e, 0xb6, 0x95, 0x83, 0x12, 0xb3, 0xb0, 0x19, 0x5f, 0xd4, 0x10, 0xbc, 0xc9, 0xc3, 0x27, 0x26, 0x60, 0x31, | ||||
| 	/* (2^113)P */ 0x0d, 0xe1, 0xe4, 0x32, 0x48, 0xdc, 0x20, 0x31, 0xf7, 0x17, 0xc7, 0x56, 0x67, 0xc4, 0x20, 0xeb, 0x94, 0x02, 0x28, 0x67, 0x3f, 0x2e, 0xf5, 0x00, 0x09, 0xc5, 0x30, 0x47, 0xc1, 0x4f, 0x6d, 0x56, | ||||
| 	/* (2^114)P */ 0x06, 0x72, 0x83, 0xfd, 0x40, 0x5d, 0x3a, 0x7e, 0x7a, 0x54, 0x59, 0x71, 0xdc, 0x26, 0xe9, 0xc1, 0x95, 0x60, 0x8d, 0xa6, 0xfb, 0x30, 0x67, 0x21, 0xa7, 0xce, 0x69, 0x3f, 0x84, 0xc3, 0xe8, 0x22, | ||||
| 	/* (2^115)P */ 0x2b, 0x4b, 0x0e, 0x93, 0xe8, 0x74, 0xd0, 0x33, 0x16, 0x58, 0xd1, 0x84, 0x0e, 0x35, 0xe4, 0xb6, 0x65, 0x23, 0xba, 0xd6, 0x6a, 0xc2, 0x34, 0x55, 0xf3, 0xf3, 0xf1, 0x89, 0x2f, 0xc1, 0x73, 0x77, | ||||
| 	/* (2^116)P */ 0xaa, 0x62, 0x79, 0xa5, 0x4d, 0x40, 0xba, 0x8c, 0x56, 0xce, 0x99, 0x19, 0xa8, 0x97, 0x98, 0x5b, 0xfc, 0x92, 0x16, 0x12, 0x2f, 0x86, 0x8e, 0x50, 0x91, 0xc2, 0x93, 0xa0, 0x7f, 0x90, 0x81, 0x3a, | ||||
| 	/* (2^117)P */ 0x10, 0xa5, 0x25, 0x47, 0xff, 0xd0, 0xde, 0x0d, 0x03, 0xc5, 0x3f, 0x67, 0x10, 0xcc, 0xd8, 0x10, 0x89, 0x4e, 0x1f, 0x9f, 0x1c, 0x15, 0x9d, 0x5b, 0x4c, 0xa4, 0x09, 0xcb, 0xd5, 0xc1, 0xa5, 0x32, | ||||
| 	/* (2^118)P */ 0xfb, 0x41, 0x05, 0xb9, 0x42, 0xa4, 0x0a, 0x1e, 0xdb, 0x85, 0xb4, 0xc1, 0x7c, 0xeb, 0x85, 0x5f, 0xe5, 0xf2, 0x9d, 0x8a, 0xce, 0x95, 0xe5, 0xbe, 0x36, 0x22, 0x42, 0x22, 0xc7, 0x96, 0xe4, 0x25, | ||||
| 	/* (2^119)P */ 0xb9, 0xe5, 0x0f, 0xcd, 0x46, 0x3c, 0xdf, 0x5e, 0x88, 0x33, 0xa4, 0xd2, 0x7e, 0x5a, 0xe7, 0x34, 0x52, 0xe3, 0x61, 0xd7, 0x11, 0xde, 0x88, 0xe4, 0x5c, 0x54, 0x85, 0xa0, 0x01, 0x8a, 0x87, 0x0e, | ||||
| 	/* (2^120)P */ 0x04, 0xbb, 0x21, 0xe0, 0x77, 0x3c, 0x49, 0xba, 0x9a, 0x89, 0xdf, 0xc7, 0x43, 0x18, 0x4d, 0x2b, 0x67, 0x0d, 0xe8, 0x7a, 0x48, 0x7a, 0xa3, 0x9e, 0x94, 0x17, 0xe4, 0x11, 0x80, 0x95, 0xa9, 0x67, | ||||
| 	/* (2^121)P */ 0x65, 0xb0, 0x97, 0x66, 0x1a, 0x05, 0x58, 0x4b, 0xd4, 0xa6, 0x6b, 0x8d, 0x7d, 0x3f, 0xe3, 0x47, 0xc1, 0x46, 0xca, 0x83, 0xd4, 0xa8, 0x4d, 0xbb, 0x0d, 0xdb, 0xc2, 0x81, 0xa1, 0xca, 0xbe, 0x68, | ||||
| 	/* (2^122)P */ 0xa5, 0x9a, 0x98, 0x0b, 0xe9, 0x80, 0x89, 0x8d, 0x9b, 0xc9, 0x93, 0x2c, 0x4a, 0xb1, 0x5e, 0xf9, 0xa2, 0x73, 0x6e, 0x79, 0xc4, 0xc7, 0xc6, 0x51, 0x69, 0xb5, 0xef, 0xb5, 0x63, 0x83, 0x22, 0x6e, | ||||
| 	/* (2^123)P */ 0xc8, 0x24, 0xd6, 0x2d, 0xb0, 0xc0, 0xbb, 0xc6, 0xee, 0x70, 0x81, 0xec, 0x7d, 0xb4, 0x7e, 0x77, 0xa9, 0xaf, 0xcf, 0x04, 0xa0, 0x15, 0xde, 0x3c, 0x9b, 0xbf, 0x60, 0x71, 0x08, 0xbc, 0xc6, 0x1d, | ||||
| 	/* (2^124)P */ 0x02, 0x40, 0xc3, 0xee, 0x43, 0xe0, 0x07, 0x2e, 0x7f, 0xdc, 0x68, 0x7a, 0x67, 0xfc, 0xe9, 0x18, 0x9a, 0x5b, 0xd1, 0x8b, 0x18, 0x03, 0xda, 0xd8, 0x53, 0x82, 0x56, 0x00, 0xbb, 0xc3, 0xfb, 0x48, | ||||
| 	/* (2^125)P */ 0xe1, 0x4c, 0x65, 0xfb, 0x4c, 0x7d, 0x54, 0x57, 0xad, 0xe2, 0x58, 0xa0, 0x82, 0x5b, 0x56, 0xd3, 0x78, 0x44, 0x15, 0xbf, 0x0b, 0xaf, 0x3e, 0xf6, 0x18, 0xbb, 0xdf, 0x14, 0xf1, 0x1e, 0x53, 0x47, | ||||
| 	/* (2^126)P */ 0x87, 0xc5, 0x78, 0x42, 0x0a, 0x63, 0xec, 0xe1, 0xf3, 0x83, 0x8e, 0xca, 0x46, 0xd5, 0x07, 0x55, 0x2b, 0x0c, 0xdc, 0x3a, 0xc6, 0x35, 0xe1, 0x85, 0x4e, 0x84, 0x82, 0x56, 0xa8, 0xef, 0xa7, 0x0a, | ||||
| 	/* (2^127)P */ 0x15, 0xf6, 0xe1, 0xb3, 0xa8, 0x1b, 0x69, 0x72, 0xfa, 0x3f, 0xbe, 0x1f, 0x70, 0xe9, 0xb4, 0x32, 0x68, 0x78, 0xbb, 0x39, 0x2e, 0xd9, 0xb6, 0x97, 0xe8, 0x39, 0x2e, 0xa0, 0xde, 0x53, 0xfe, 0x2c, | ||||
| 	/* (2^128)P */ 0xb0, 0x52, 0xcd, 0x85, 0xcd, 0x92, 0x73, 0x68, 0x31, 0x98, 0xe2, 0x10, 0xc9, 0x66, 0xff, 0x27, 0x06, 0x2d, 0x83, 0xa9, 0x56, 0x45, 0x13, 0x97, 0xa0, 0xf8, 0x84, 0x0a, 0x36, 0xb0, 0x9b, 0x26, | ||||
| 	/* (2^129)P */ 0x5c, 0xf8, 0x43, 0x76, 0x45, 0x55, 0x6e, 0x70, 0x1b, 0x7d, 0x59, 0x9b, 0x8c, 0xa4, 0x34, 0x37, 0x72, 0xa4, 0xef, 0xc6, 0xe8, 0x91, 0xee, 0x7a, 0xe0, 0xd9, 0xa9, 0x98, 0xc1, 0xab, 0xd6, 0x5c, | ||||
| 	/* (2^130)P */ 0x1a, 0xe4, 0x3c, 0xcb, 0x06, 0xde, 0x04, 0x0e, 0x38, 0xe1, 0x02, 0x34, 0x89, 0xeb, 0xc6, 0xd8, 0x72, 0x37, 0x6e, 0x68, 0xbb, 0x59, 0x46, 0x90, 0xc8, 0xa8, 0x6b, 0x74, 0x71, 0xc3, 0x15, 0x72, | ||||
| 	/* (2^131)P */ 0xd9, 0xa2, 0xe4, 0xea, 0x7e, 0xa9, 0x12, 0xfd, 0xc5, 0xf2, 0x94, 0x63, 0x51, 0xb7, 0x14, 0x95, 0x94, 0xf2, 0x08, 0x92, 0x80, 0xd5, 0x6f, 0x26, 0xb9, 0x26, 0x9a, 0x61, 0x85, 0x70, 0x84, 0x5c, | ||||
| 	/* (2^132)P */ 0xea, 0x94, 0xd6, 0xfe, 0x10, 0x54, 0x98, 0x52, 0x54, 0xd2, 0x2e, 0x4a, 0x93, 0x5b, 0x90, 0x3c, 0x67, 0xe4, 0x3b, 0x2d, 0x69, 0x47, 0xbb, 0x10, 0xe1, 0xe9, 0xe5, 0x69, 0x2d, 0x3d, 0x3b, 0x06, | ||||
| 	/* (2^133)P */ 0xeb, 0x7d, 0xa5, 0xdd, 0xee, 0x26, 0x27, 0x47, 0x91, 0x18, 0xf4, 0x10, 0xae, 0xc4, 0xb6, 0xef, 0x14, 0x76, 0x30, 0x7b, 0x91, 0x41, 0x16, 0x2b, 0x7c, 0x5b, 0xf4, 0xc4, 0x4f, 0x55, 0x7c, 0x11, | ||||
| 	/* (2^134)P */ 0x12, 0x88, 0x9d, 0x8f, 0x11, 0xf3, 0x7c, 0xc0, 0x39, 0x79, 0x01, 0x50, 0x20, 0xd8, 0xdb, 0x01, 0x27, 0x28, 0x1b, 0x17, 0xf4, 0x03, 0xe8, 0xd7, 0xea, 0x25, 0xd2, 0x87, 0x74, 0xe8, 0x15, 0x10, | ||||
| 	/* (2^135)P */ 0x4d, 0xcc, 0x3a, 0xd2, 0xfe, 0xe3, 0x8d, 0xc5, 0x2d, 0xbe, 0xa7, 0x94, 0xc2, 0x91, 0xdb, 0x50, 0x57, 0xf4, 0x9c, 0x1c, 0x3d, 0xd4, 0x94, 0x0b, 0x4a, 0x52, 0x37, 0x6e, 0xfa, 0x40, 0x16, 0x6b, | ||||
| 	/* (2^136)P */ 0x09, 0x0d, 0xda, 0x5f, 0x6c, 0x34, 0x2f, 0x69, 0x51, 0x31, 0x4d, 0xfa, 0x59, 0x1c, 0x0b, 0x20, 0x96, 0xa2, 0x77, 0x07, 0x76, 0x6f, 0xc4, 0xb8, 0xcf, 0xfb, 0xfd, 0x3f, 0x5f, 0x39, 0x38, 0x4b, | ||||
| 	/* (2^137)P */ 0x71, 0xd6, 0x54, 0xbe, 0x00, 0x5e, 0xd2, 0x18, 0xa6, 0xab, 0xc8, 0xbe, 0x82, 0x05, 0xd5, 0x60, 0x82, 0xb9, 0x78, 0x3b, 0x26, 0x8f, 0xad, 0x87, 0x32, 0x04, 0xda, 0x9c, 0x4e, 0xf6, 0xfd, 0x50, | ||||
| 	/* (2^138)P */ 0xf0, 0xdc, 0x78, 0xc5, 0xaa, 0x67, 0xf5, 0x90, 0x3b, 0x13, 0xa3, 0xf2, 0x0e, 0x9b, 0x1e, 0xef, 0x71, 0xde, 0xd9, 0x42, 0x92, 0xba, 0xeb, 0x0e, 0xc7, 0x01, 0x31, 0xf0, 0x9b, 0x3c, 0x47, 0x15, | ||||
| 	/* (2^139)P */ 0x95, 0x80, 0xb7, 0x56, 0xae, 0xe8, 0x77, 0x7c, 0x8e, 0x07, 0x6f, 0x6e, 0x66, 0xe7, 0x78, 0xb6, 0x1f, 0xba, 0x48, 0x53, 0x61, 0xb9, 0xa0, 0x2d, 0x0b, 0x3f, 0x73, 0xff, 0xc1, 0x31, 0xf9, 0x7c, | ||||
| 	/* (2^140)P */ 0x6c, 0x36, 0x0a, 0x0a, 0xf5, 0x57, 0xb3, 0x26, 0x32, 0xd7, 0x87, 0x2b, 0xf4, 0x8c, 0x70, 0xe9, 0xc0, 0xb2, 0x1c, 0xf9, 0xa5, 0xee, 0x3a, 0xc1, 0x4c, 0xbb, 0x43, 0x11, 0x99, 0x0c, 0xd9, 0x35, | ||||
| 	/* (2^141)P */ 0xdc, 0xd9, 0xa0, 0xa9, 0x04, 0xc4, 0xc1, 0x47, 0x51, 0xd2, 0x72, 0x19, 0x45, 0x58, 0x9e, 0x65, 0x31, 0x8c, 0xb3, 0x73, 0xc4, 0xa8, 0x75, 0x38, 0x24, 0x1f, 0x56, 0x79, 0xd3, 0x9e, 0xbd, 0x1f, | ||||
| 	/* (2^142)P */ 0x8d, 0xc2, 0x1e, 0xd4, 0x6f, 0xbc, 0xfa, 0x11, 0xca, 0x2d, 0x2a, 0xcd, 0xe3, 0xdf, 0xf8, 0x7e, 0x95, 0x45, 0x40, 0x8c, 0x5d, 0x3b, 0xe7, 0x72, 0x27, 0x2f, 0xb7, 0x54, 0x49, 0xfa, 0x35, 0x61, | ||||
| 	/* (2^143)P */ 0x9c, 0xb6, 0x24, 0xde, 0xa2, 0x32, 0xfc, 0xcc, 0x88, 0x5d, 0x09, 0x1f, 0x8c, 0x69, 0x55, 0x3f, 0x29, 0xf9, 0xc3, 0x5a, 0xed, 0x50, 0x33, 0xbe, 0xeb, 0x7e, 0x47, 0xca, 0x06, 0xf8, 0x9b, 0x5e, | ||||
| 	/* (2^144)P */ 0x68, 0x9f, 0x30, 0x3c, 0xb6, 0x8f, 0xce, 0xe9, 0xf4, 0xf9, 0xe1, 0x65, 0x35, 0xf6, 0x76, 0x53, 0xf1, 0x93, 0x63, 0x5a, 0xb3, 0xcf, 0xaf, 0xd1, 0x06, 0x35, 0x62, 0xe5, 0xed, 0xa1, 0x32, 0x66, | ||||
| 	/* (2^145)P */ 0x4c, 0xed, 0x2d, 0x0c, 0x39, 0x6c, 0x7d, 0x0b, 0x1f, 0xcb, 0x04, 0xdf, 0x81, 0x32, 0xcb, 0x56, 0xc7, 0xc3, 0xec, 0x49, 0x12, 0x5a, 0x30, 0x66, 0x2a, 0xa7, 0x8c, 0xa3, 0x60, 0x8b, 0x58, 0x5d, | ||||
| 	/* (2^146)P */ 0x2d, 0xf4, 0xe5, 0xe8, 0x78, 0xbf, 0xec, 0xa6, 0xec, 0x3e, 0x8a, 0x3c, 0x4b, 0xb4, 0xee, 0x86, 0x04, 0x16, 0xd2, 0xfb, 0x48, 0x9c, 0x21, 0xec, 0x31, 0x67, 0xc3, 0x17, 0xf5, 0x1a, 0xaf, 0x1a, | ||||
| 	/* (2^147)P */ 0xe7, 0xbd, 0x69, 0x67, 0x83, 0xa2, 0x06, 0xc3, 0xdb, 0x2a, 0x1e, 0x2b, 0x62, 0x80, 0x82, 0x20, 0xa6, 0x94, 0xff, 0xfb, 0x1f, 0xf5, 0x27, 0x80, 0x6b, 0xf2, 0x24, 0x11, 0xce, 0xa1, 0xcf, 0x76, | ||||
| 	/* (2^148)P */ 0xb6, 0xab, 0x22, 0x24, 0x56, 0x00, 0xeb, 0x18, 0xc3, 0x29, 0x8c, 0x8f, 0xd5, 0xc4, 0x77, 0xf3, 0x1a, 0x56, 0x31, 0xf5, 0x07, 0xc2, 0xbb, 0x4d, 0x27, 0x8a, 0x12, 0x82, 0xf0, 0xb7, 0x53, 0x02, | ||||
| 	/* (2^149)P */ 0xe0, 0x17, 0x2c, 0xb6, 0x1c, 0x09, 0x1f, 0x3d, 0xa9, 0x28, 0x46, 0xd6, 0xab, 0xe1, 0x60, 0x48, 0x53, 0x42, 0x9d, 0x30, 0x36, 0x74, 0xd1, 0x52, 0x76, 0xe5, 0xfa, 0x3e, 0xe1, 0x97, 0x6f, 0x35, | ||||
| 	/* (2^150)P */ 0x5b, 0x53, 0x50, 0xa1, 0x1a, 0xe1, 0x51, 0xd3, 0xcc, 0x78, 0xd8, 0x1d, 0xbb, 0x45, 0x6b, 0x3e, 0x98, 0x2c, 0xd9, 0xbe, 0x28, 0x61, 0x77, 0x0c, 0xb8, 0x85, 0x28, 0x03, 0x93, 0xae, 0x34, 0x1d, | ||||
| 	/* (2^151)P */ 0xc3, 0xa4, 0x5b, 0xa8, 0x8c, 0x48, 0xa0, 0x4b, 0xce, 0xe6, 0x9c, 0x3c, 0xc3, 0x48, 0x53, 0x98, 0x70, 0xa7, 0xbd, 0x97, 0x6f, 0x4c, 0x12, 0x66, 0x4a, 0x12, 0x54, 0x06, 0x29, 0xa0, 0x81, 0x0f, | ||||
| 	/* (2^152)P */ 0xfd, 0x86, 0x9b, 0x56, 0xa6, 0x9c, 0xd0, 0x9e, 0x2d, 0x9a, 0xaf, 0x18, 0xfd, 0x09, 0x10, 0x81, 0x0a, 0xc2, 0xd8, 0x93, 0x3f, 0xd0, 0x08, 0xff, 0x6b, 0xf2, 0xae, 0x9f, 0x19, 0x48, 0xa1, 0x52, | ||||
| 	/* (2^153)P */ 0x73, 0x1b, 0x8d, 0x2d, 0xdc, 0xf9, 0x03, 0x3e, 0x70, 0x1a, 0x96, 0x73, 0x18, 0x80, 0x05, 0x42, 0x70, 0x59, 0xa3, 0x41, 0xf0, 0x87, 0xd9, 0xc0, 0x49, 0xd5, 0xc0, 0xa1, 0x15, 0x1f, 0xaa, 0x07, | ||||
| 	/* (2^154)P */ 0x24, 0x72, 0xd2, 0x8c, 0xe0, 0x6c, 0xd4, 0xdf, 0x39, 0x42, 0x4e, 0x93, 0x4f, 0x02, 0x0a, 0x6d, 0x59, 0x7b, 0x89, 0x99, 0x63, 0x7a, 0x8a, 0x80, 0xa2, 0x95, 0x3d, 0xe1, 0xe9, 0x56, 0x45, 0x0a, | ||||
| 	/* (2^155)P */ 0x45, 0x30, 0xc1, 0xe9, 0x1f, 0x99, 0x1a, 0xd2, 0xb8, 0x51, 0x77, 0xfe, 0x48, 0x85, 0x0e, 0x9b, 0x35, 0x00, 0xf3, 0x4b, 0xcb, 0x43, 0xa6, 0x5d, 0x21, 0xf7, 0x40, 0x39, 0xd6, 0x28, 0xdb, 0x77, | ||||
| 	/* (2^156)P */ 0x11, 0x90, 0xdc, 0x4a, 0x61, 0xeb, 0x5e, 0xfc, 0xeb, 0x11, 0xc4, 0xe8, 0x9a, 0x41, 0x29, 0x52, 0x74, 0xcf, 0x1d, 0x7d, 0x78, 0xe7, 0xc3, 0x9e, 0xb5, 0x4c, 0x6e, 0x21, 0x3e, 0x05, 0x0d, 0x34, | ||||
| 	/* (2^157)P */ 0xb4, 0xf2, 0x8d, 0xb4, 0x39, 0xaf, 0xc7, 0xca, 0x94, 0x0a, 0xa1, 0x71, 0x28, 0xec, 0xfa, 0xc0, 0xed, 0x75, 0xa5, 0x5c, 0x24, 0x69, 0x0a, 0x14, 0x4c, 0x3a, 0x27, 0x34, 0x71, 0xc3, 0xf1, 0x0c, | ||||
| 	/* (2^158)P */ 0xa5, 0xb8, 0x24, 0xc2, 0x6a, 0x30, 0xee, 0xc8, 0xb0, 0x30, 0x49, 0xcb, 0x7c, 0xee, 0xea, 0x57, 0x4f, 0xe7, 0xcb, 0xaa, 0xbd, 0x06, 0xe8, 0xa1, 0x7d, 0x65, 0xeb, 0x2e, 0x74, 0x62, 0x9a, 0x7d, | ||||
| 	/* (2^159)P */ 0x30, 0x48, 0x6c, 0x54, 0xef, 0xb6, 0xb6, 0x9e, 0x2e, 0x6e, 0xb3, 0xdd, 0x1f, 0xca, 0x5c, 0x88, 0x05, 0x71, 0x0d, 0xef, 0x83, 0xf3, 0xb9, 0xe6, 0x12, 0x04, 0x2e, 0x9d, 0xef, 0x4f, 0x65, 0x58, | ||||
| 	/* (2^160)P */ 0x26, 0x8e, 0x0e, 0xbe, 0xff, 0xc4, 0x05, 0xa9, 0x6e, 0x81, 0x31, 0x9b, 0xdf, 0xe5, 0x2d, 0x94, 0xe1, 0x88, 0x2e, 0x80, 0x3f, 0x72, 0x7d, 0x49, 0x8d, 0x40, 0x2f, 0x60, 0xea, 0x4d, 0x68, 0x30, | ||||
| 	/* (2^161)P */ 0x34, 0xcb, 0xe6, 0xa3, 0x78, 0xa2, 0xe5, 0x21, 0xc4, 0x1d, 0x15, 0x5b, 0x6f, 0x6e, 0xfb, 0xae, 0x15, 0xca, 0x77, 0x9d, 0x04, 0x8e, 0x0b, 0xb3, 0x81, 0x89, 0xb9, 0x53, 0xcf, 0xc9, 0xc3, 0x28, | ||||
| 	/* (2^162)P */ 0x2a, 0xdd, 0x6c, 0x55, 0x21, 0xb7, 0x7f, 0x28, 0x74, 0x22, 0x02, 0x97, 0xa8, 0x7c, 0x31, 0x0d, 0x58, 0x32, 0x54, 0x3a, 0x42, 0xc7, 0x68, 0x74, 0x2f, 0x64, 0xb5, 0x4e, 0x46, 0x11, 0x7f, 0x4a, | ||||
| 	/* (2^163)P */ 0xa6, 0x3a, 0x19, 0x4d, 0x77, 0xa4, 0x37, 0xa2, 0xa1, 0x29, 0x21, 0xa9, 0x6e, 0x98, 0x65, 0xd8, 0x88, 0x1a, 0x7c, 0xf8, 0xec, 0x15, 0xc5, 0x24, 0xeb, 0xf5, 0x39, 0x5f, 0x57, 0x03, 0x40, 0x60, | ||||
| 	/* (2^164)P */ 0x27, 0x9b, 0x0a, 0x57, 0x89, 0xf1, 0xb9, 0x47, 0x78, 0x4b, 0x5e, 0x46, 0xde, 0xce, 0x98, 0x2b, 0x20, 0x5c, 0xb8, 0xdb, 0x51, 0xf5, 0x6d, 0x02, 0x01, 0x19, 0xe2, 0x47, 0x10, 0xd9, 0xfc, 0x74, | ||||
| 	/* (2^165)P */ 0xa3, 0xbf, 0xc1, 0x23, 0x0a, 0xa9, 0xe2, 0x13, 0xf6, 0x19, 0x85, 0x47, 0x4e, 0x07, 0xb0, 0x0c, 0x44, 0xcf, 0xf6, 0x3a, 0xbe, 0xcb, 0xf1, 0x5f, 0xbe, 0x2d, 0x81, 0xbe, 0x38, 0x54, 0xfe, 0x67, | ||||
| 	/* (2^166)P */ 0xb0, 0x05, 0x0f, 0xa4, 0x4f, 0xf6, 0x3c, 0xd1, 0x87, 0x37, 0x28, 0x32, 0x2f, 0xfb, 0x4d, 0x05, 0xea, 0x2a, 0x0d, 0x7f, 0x5b, 0x91, 0x73, 0x41, 0x4e, 0x0d, 0x61, 0x1f, 0x4f, 0x14, 0x2f, 0x48, | ||||
| 	/* (2^167)P */ 0x34, 0x82, 0x7f, 0xb4, 0x01, 0x02, 0x21, 0xf6, 0x90, 0xb9, 0x70, 0x9e, 0x92, 0xe1, 0x0a, 0x5d, 0x7c, 0x56, 0x49, 0xb0, 0x55, 0xf4, 0xd7, 0xdc, 0x01, 0x6f, 0x91, 0xf0, 0xf1, 0xd0, 0x93, 0x7e, | ||||
| 	/* (2^168)P */ 0xfa, 0xb4, 0x7d, 0x8a, 0xf1, 0xcb, 0x79, 0xdd, 0x2f, 0xc6, 0x74, 0x6f, 0xbf, 0x91, 0x83, 0xbe, 0xbd, 0x91, 0x82, 0x4b, 0xd1, 0x45, 0x71, 0x02, 0x05, 0x17, 0xbf, 0x2c, 0xea, 0x73, 0x5a, 0x58, | ||||
| 	/* (2^169)P */ 0xb2, 0x0d, 0x8a, 0x92, 0x3e, 0xa0, 0x5c, 0x48, 0xe7, 0x57, 0x28, 0x74, 0xa5, 0x01, 0xfc, 0x10, 0xa7, 0x51, 0xd5, 0xd6, 0xdb, 0x2e, 0x48, 0x2f, 0x8a, 0xdb, 0x8f, 0x04, 0xb5, 0x33, 0x04, 0x0f, | ||||
| 	/* (2^170)P */ 0x47, 0x62, 0xdc, 0xd7, 0x8d, 0x2e, 0xda, 0x60, 0x9a, 0x81, 0xd4, 0x8c, 0xd3, 0xc9, 0xb4, 0x88, 0x97, 0x66, 0xf6, 0x01, 0xc0, 0x3a, 0x03, 0x13, 0x75, 0x7d, 0x36, 0x3b, 0xfe, 0x24, 0x3b, 0x27, | ||||
| 	/* (2^171)P */ 0xd4, 0xb9, 0xb3, 0x31, 0x6a, 0xf6, 0xe8, 0xc6, 0xd5, 0x49, 0xdf, 0x94, 0xa4, 0x14, 0x15, 0x28, 0xa7, 0x3d, 0xb2, 0xc8, 0xdf, 0x6f, 0x72, 0xd1, 0x48, 0xe5, 0xde, 0x03, 0xd1, 0xe7, 0x3a, 0x4b, | ||||
| 	/* (2^172)P */ 0x7e, 0x9d, 0x4b, 0xce, 0x19, 0x6e, 0x25, 0xc6, 0x1c, 0xc6, 0xe3, 0x86, 0xf1, 0x5c, 0x5c, 0xff, 0x45, 0xc1, 0x8e, 0x4b, 0xa3, 0x3c, 0xc6, 0xac, 0x74, 0x65, 0xe6, 0xfe, 0x88, 0x18, 0x62, 0x74, | ||||
| 	/* (2^173)P */ 0x1e, 0x0a, 0x29, 0x45, 0x96, 0x40, 0x6f, 0x95, 0x2e, 0x96, 0x3a, 0x26, 0xe3, 0xf8, 0x0b, 0xef, 0x7b, 0x64, 0xc2, 0x5e, 0xeb, 0x50, 0x6a, 0xed, 0x02, 0x75, 0xca, 0x9d, 0x3a, 0x28, 0x94, 0x06, | ||||
| 	/* (2^174)P */ 0xd1, 0xdc, 0xa2, 0x43, 0x36, 0x96, 0x9b, 0x76, 0x53, 0x53, 0xfc, 0x09, 0xea, 0xc8, 0xb7, 0x42, 0xab, 0x7e, 0x39, 0x13, 0xee, 0x2a, 0x00, 0x4f, 0x3a, 0xd6, 0xb7, 0x19, 0x2c, 0x5e, 0x00, 0x63, | ||||
| 	/* (2^175)P */ 0xea, 0x3b, 0x02, 0x63, 0xda, 0x36, 0x67, 0xca, 0xb7, 0x99, 0x2a, 0xb1, 0x6d, 0x7f, 0x6c, 0x96, 0xe1, 0xc5, 0x37, 0xc5, 0x90, 0x93, 0xe0, 0xac, 0xee, 0x89, 0xaa, 0xa1, 0x63, 0x60, 0x69, 0x0b, | ||||
| 	/* (2^176)P */ 0xe5, 0x56, 0x8c, 0x28, 0x97, 0x3e, 0xb0, 0xeb, 0xe8, 0x8b, 0x8c, 0x93, 0x9f, 0x9f, 0x2a, 0x43, 0x71, 0x7f, 0x71, 0x5b, 0x3d, 0xa9, 0xa5, 0xa6, 0x97, 0x9d, 0x8f, 0xe1, 0xc3, 0xb4, 0x5f, 0x1a, | ||||
| 	/* (2^177)P */ 0xce, 0xcd, 0x60, 0x1c, 0xad, 0xe7, 0x94, 0x1c, 0xa0, 0xc4, 0x02, 0xfc, 0x43, 0x2a, 0x20, 0xee, 0x20, 0x6a, 0xc4, 0x67, 0xd8, 0xe4, 0xaf, 0x8d, 0x58, 0x7b, 0xc2, 0x8a, 0x3c, 0x26, 0x10, 0x0a, | ||||
| 	/* (2^178)P */ 0x4a, 0x2a, 0x43, 0xe4, 0xdf, 0xa9, 0xde, 0xd0, 0xc5, 0x77, 0x92, 0xbe, 0x7b, 0xf8, 0x6a, 0x85, 0x1a, 0xc7, 0x12, 0xc2, 0xac, 0x72, 0x84, 0xce, 0x91, 0x1e, 0xbb, 0x9b, 0x6d, 0x1b, 0x15, 0x6f, | ||||
| 	/* (2^179)P */ 0x6a, 0xd5, 0xee, 0x7c, 0x52, 0x6c, 0x77, 0x26, 0xec, 0xfa, 0xf8, 0xfb, 0xb7, 0x1c, 0x21, 0x7d, 0xcc, 0x09, 0x46, 0xfd, 0xa6, 0x66, 0xae, 0x37, 0x42, 0x0c, 0x77, 0xd2, 0x02, 0xb7, 0x81, 0x1f, | ||||
| 	/* (2^180)P */ 0x92, 0x83, 0xc5, 0xea, 0x57, 0xb0, 0xb0, 0x2f, 0x9d, 0x4e, 0x74, 0x29, 0xfe, 0x89, 0xdd, 0xe1, 0xf8, 0xb4, 0xbe, 0x17, 0xeb, 0xf8, 0x64, 0xc9, 0x1e, 0xd4, 0xa2, 0xc9, 0x73, 0x10, 0x57, 0x29, | ||||
| 	/* (2^181)P */ 0x54, 0xe2, 0xc0, 0x81, 0x89, 0xa1, 0x48, 0xa9, 0x30, 0x28, 0xb2, 0x65, 0x9b, 0x36, 0xf6, 0x2d, 0xc6, 0xd3, 0xcf, 0x5f, 0xd7, 0xb2, 0x3e, 0xa3, 0x1f, 0xa0, 0x99, 0x41, 0xec, 0xd6, 0x8c, 0x07, | ||||
| 	/* (2^182)P */ 0x2f, 0x0d, 0x90, 0xad, 0x41, 0x4a, 0x58, 0x4a, 0x52, 0x4c, 0xc7, 0xe2, 0x78, 0x2b, 0x14, 0x32, 0x78, 0xc9, 0x31, 0x84, 0x33, 0xe8, 0xc4, 0x68, 0xc2, 0x9f, 0x68, 0x08, 0x90, 0xea, 0x69, 0x7f, | ||||
| 	/* (2^183)P */ 0x65, 0x82, 0xa3, 0x46, 0x1e, 0xc8, 0xf2, 0x52, 0xfd, 0x32, 0xa8, 0x04, 0x2d, 0x07, 0x78, 0xfd, 0x94, 0x9e, 0x35, 0x25, 0xfa, 0xd5, 0xd7, 0x8c, 0xd2, 0x29, 0xcc, 0x54, 0x74, 0x1b, 0xe7, 0x4d, | ||||
| 	/* (2^184)P */ 0xc9, 0x6a, 0xda, 0x1e, 0xad, 0x60, 0xeb, 0x42, 0x3a, 0x9c, 0xc0, 0xdb, 0xdf, 0x37, 0xad, 0x0a, 0x91, 0xc1, 0x3c, 0xe3, 0x71, 0x4b, 0x00, 0x81, 0x3c, 0x80, 0x22, 0x51, 0x34, 0xbe, 0xe6, 0x44, | ||||
| 	/* (2^185)P */ 0xdb, 0x20, 0x19, 0xba, 0x88, 0x83, 0xfe, 0x03, 0x08, 0xb0, 0x0d, 0x15, 0x32, 0x7c, 0xd5, 0xf5, 0x29, 0x0c, 0xf6, 0x1a, 0x28, 0xc4, 0xc8, 0x49, 0xee, 0x1a, 0x70, 0xde, 0x18, 0xb5, 0xed, 0x21, | ||||
| 	/* (2^186)P */ 0x99, 0xdc, 0x06, 0x8f, 0x41, 0x3e, 0xb6, 0x7f, 0xb8, 0xd7, 0x66, 0xc1, 0x99, 0x0d, 0x46, 0xa4, 0x83, 0x0a, 0x52, 0xce, 0x48, 0x52, 0xdd, 0x24, 0x58, 0x83, 0x92, 0x2b, 0x71, 0xad, 0xc3, 0x5e, | ||||
| 	/* (2^187)P */ 0x0f, 0x93, 0x17, 0xbd, 0x5f, 0x2a, 0x02, 0x15, 0xe3, 0x70, 0x25, 0xd8, 0x77, 0x4a, 0xf6, 0xa4, 0x12, 0x37, 0x78, 0x15, 0x69, 0x8d, 0xbc, 0x12, 0xbb, 0x0a, 0x62, 0xfc, 0xc0, 0x94, 0x81, 0x49, | ||||
| 	/* (2^188)P */ 0x82, 0x6c, 0x68, 0x55, 0xd2, 0xd9, 0xa2, 0x38, 0xf0, 0x21, 0x3e, 0x19, 0xd9, 0x6b, 0x5c, 0x78, 0x84, 0x54, 0x4a, 0xb2, 0x1a, 0xc8, 0xd5, 0xe4, 0x89, 0x09, 0xe2, 0xb2, 0x60, 0x78, 0x30, 0x56, | ||||
| 	/* (2^189)P */ 0xc4, 0x74, 0x4d, 0x8b, 0xf7, 0x55, 0x9d, 0x42, 0x31, 0x01, 0x35, 0x43, 0x46, 0x83, 0xf1, 0x22, 0xff, 0x1f, 0xc7, 0x98, 0x45, 0xc2, 0x60, 0x1e, 0xef, 0x83, 0x99, 0x97, 0x14, 0xf0, 0xf2, 0x59, | ||||
| 	/* (2^190)P */ 0x44, 0x4a, 0x49, 0xeb, 0x56, 0x7d, 0xa4, 0x46, 0x8e, 0xa1, 0x36, 0xd6, 0x54, 0xa8, 0x22, 0x3e, 0x3b, 0x1c, 0x49, 0x74, 0x52, 0xe1, 0x46, 0xb3, 0xe7, 0xcd, 0x90, 0x53, 0x4e, 0xfd, 0xea, 0x2c, | ||||
| 	/* (2^191)P */ 0x75, 0x66, 0x0d, 0xbe, 0x38, 0x85, 0x8a, 0xba, 0x23, 0x8e, 0x81, 0x50, 0xbb, 0x74, 0x90, 0x4b, 0xc3, 0x04, 0xd3, 0x85, 0x90, 0xb8, 0xda, 0xcb, 0xc4, 0x92, 0x61, 0xe5, 0xe0, 0x4f, 0xa2, 0x61, | ||||
| 	/* (2^192)P */ 0xcb, 0x5b, 0x52, 0xdb, 0xe6, 0x15, 0x76, 0xcb, 0xca, 0xe4, 0x67, 0xa5, 0x35, 0x8c, 0x7d, 0xdd, 0x69, 0xdd, 0xfc, 0xca, 0x3a, 0x15, 0xb4, 0xe6, 0x66, 0x97, 0x3c, 0x7f, 0x09, 0x8e, 0x66, 0x2d, | ||||
| 	/* (2^193)P */ 0xf0, 0x5e, 0xe5, 0x5c, 0x26, 0x7e, 0x7e, 0xa5, 0x67, 0xb9, 0xd4, 0x7c, 0x52, 0x4e, 0x9f, 0x5d, 0xe5, 0xd1, 0x2f, 0x49, 0x06, 0x36, 0xc8, 0xfb, 0xae, 0xf7, 0xc3, 0xb7, 0xbe, 0x52, 0x0d, 0x09, | ||||
| 	/* (2^194)P */ 0x7c, 0x4d, 0x7b, 0x1e, 0x5a, 0x51, 0xb9, 0x09, 0xc0, 0x44, 0xda, 0x99, 0x25, 0x6a, 0x26, 0x1f, 0x04, 0x55, 0xc5, 0xe2, 0x48, 0x95, 0xc4, 0xa1, 0xcc, 0x15, 0x6f, 0x12, 0x87, 0x42, 0xf0, 0x7e, | ||||
| 	/* (2^195)P */ 0x15, 0xef, 0x30, 0xbd, 0x9d, 0x65, 0xd1, 0xfe, 0x7b, 0x27, 0xe0, 0xc4, 0xee, 0xb9, 0x4a, 0x8b, 0x91, 0x32, 0xdf, 0xa5, 0x36, 0x62, 0x4d, 0x88, 0x88, 0xf7, 0x5c, 0xbf, 0xa6, 0x6e, 0xd9, 0x1f, | ||||
| 	/* (2^196)P */ 0x9a, 0x0d, 0x19, 0x1f, 0x98, 0x61, 0xa1, 0x42, 0xc1, 0x52, 0x60, 0x7e, 0x50, 0x49, 0xd8, 0x61, 0xd5, 0x2c, 0x5a, 0x28, 0xbf, 0x13, 0xe1, 0x9f, 0xd8, 0x85, 0xad, 0xdb, 0x76, 0xd6, 0x22, 0x7c, | ||||
| 	/* (2^197)P */ 0x7d, 0xd2, 0xfb, 0x2b, 0xed, 0x70, 0xe7, 0x82, 0xa5, 0xf5, 0x96, 0xe9, 0xec, 0xb2, 0x05, 0x4c, 0x50, 0x01, 0x90, 0xb0, 0xc2, 0xa9, 0x40, 0xcd, 0x64, 0xbf, 0xd9, 0x13, 0x92, 0x31, 0x95, 0x58, | ||||
| 	/* (2^198)P */ 0x08, 0x2e, 0xea, 0x3f, 0x70, 0x5d, 0xcc, 0xe7, 0x8c, 0x18, 0xe2, 0x58, 0x12, 0x49, 0x0c, 0xb5, 0xf0, 0x5b, 0x20, 0x48, 0xaa, 0x0b, 0xe3, 0xcc, 0x62, 0x2d, 0xa3, 0xcf, 0x9c, 0x65, 0x7c, 0x53, | ||||
| 	/* (2^199)P */ 0x88, 0xc0, 0xcf, 0x98, 0x3a, 0x62, 0xb6, 0x37, 0xa4, 0xac, 0xd6, 0xa4, 0x1f, 0xed, 0x9b, 0xfe, 0xb0, 0xd1, 0xa8, 0x56, 0x8e, 0x9b, 0xd2, 0x04, 0x75, 0x95, 0x51, 0x0b, 0xc4, 0x71, 0x5f, 0x72, | ||||
| 	/* (2^200)P */ 0xe6, 0x9c, 0x33, 0xd0, 0x9c, 0xf8, 0xc7, 0x28, 0x8b, 0xc1, 0xdd, 0x69, 0x44, 0xb1, 0x67, 0x83, 0x2c, 0x65, 0xa1, 0xa6, 0x83, 0xda, 0x3a, 0x88, 0x17, 0x6c, 0x4d, 0x03, 0x74, 0x19, 0x5f, 0x58, | ||||
| 	/* (2^201)P */ 0x88, 0x91, 0xb1, 0xf1, 0x66, 0xb2, 0xcf, 0x89, 0x17, 0x52, 0xc3, 0xe7, 0x63, 0x48, 0x3b, 0xe6, 0x6a, 0x52, 0xc0, 0xb4, 0xa6, 0x9d, 0x8c, 0xd8, 0x35, 0x46, 0x95, 0xf0, 0x9d, 0x5c, 0x03, 0x3e, | ||||
| 	/* (2^202)P */ 0x9d, 0xde, 0x45, 0xfb, 0x12, 0x54, 0x9d, 0xdd, 0x0d, 0xf4, 0xcf, 0xe4, 0x32, 0x45, 0x68, 0xdd, 0x1c, 0x67, 0x1d, 0x15, 0x9b, 0x99, 0x5c, 0x4b, 0x90, 0xf6, 0xe7, 0x11, 0xc8, 0x2c, 0x8c, 0x2d, | ||||
| 	/* (2^203)P */ 0x40, 0x5d, 0x05, 0x90, 0x1d, 0xbe, 0x54, 0x7f, 0x40, 0xaf, 0x4a, 0x46, 0xdf, 0xc5, 0x64, 0xa4, 0xbe, 0x17, 0xe9, 0xf0, 0x24, 0x96, 0x97, 0x33, 0x30, 0x6b, 0x35, 0x27, 0xc5, 0x8d, 0x01, 0x2c, | ||||
| 	/* (2^204)P */ 0xd4, 0xb3, 0x30, 0xe3, 0x24, 0x50, 0x41, 0xa5, 0xd3, 0x52, 0x16, 0x69, 0x96, 0x3d, 0xff, 0x73, 0xf1, 0x59, 0x9b, 0xef, 0xc4, 0x42, 0xec, 0x94, 0x5a, 0x8e, 0xd0, 0x18, 0x16, 0x20, 0x47, 0x07, | ||||
| 	/* (2^205)P */ 0x53, 0x1c, 0x41, 0xca, 0x8a, 0xa4, 0x6c, 0x4d, 0x19, 0x61, 0xa6, 0xcf, 0x2f, 0x5f, 0x41, 0x66, 0xff, 0x27, 0xe2, 0x51, 0x00, 0xd4, 0x4d, 0x9c, 0xeb, 0xf7, 0x02, 0x9a, 0xc0, 0x0b, 0x81, 0x59, | ||||
| 	/* (2^206)P */ 0x1d, 0x10, 0xdc, 0xb3, 0x71, 0xb1, 0x7e, 0x2a, 0x8e, 0xf6, 0xfe, 0x9f, 0xb9, 0x5a, 0x1c, 0x44, 0xea, 0x59, 0xb3, 0x93, 0x9b, 0x5c, 0x02, 0x32, 0x2f, 0x11, 0x9d, 0x1e, 0xa7, 0xe0, 0x8c, 0x5e, | ||||
| 	/* (2^207)P */ 0xfd, 0x03, 0x95, 0x42, 0x92, 0xcb, 0xcc, 0xbf, 0x55, 0x5d, 0x09, 0x2f, 0x75, 0xba, 0x71, 0xd2, 0x1e, 0x09, 0x2d, 0x97, 0x5e, 0xad, 0x5e, 0x34, 0xba, 0x03, 0x31, 0xa8, 0x11, 0xdf, 0xc8, 0x18, | ||||
| 	/* (2^208)P */ 0x4c, 0x0f, 0xed, 0x9a, 0x9a, 0x94, 0xcd, 0x90, 0x7e, 0xe3, 0x60, 0x66, 0xcb, 0xf4, 0xd1, 0xc5, 0x0b, 0x2e, 0xc5, 0x56, 0x2d, 0xc5, 0xca, 0xb8, 0x0d, 0x8e, 0x80, 0xc5, 0x00, 0xe4, 0x42, 0x6e, | ||||
| 	/* (2^209)P */ 0x23, 0xfd, 0xae, 0xee, 0x66, 0x69, 0xb4, 0xa3, 0xca, 0xcd, 0x9e, 0xe3, 0x0b, 0x1f, 0x4f, 0x0c, 0x1d, 0xa5, 0x83, 0xd6, 0xc9, 0xc8, 0x9d, 0x18, 0x1b, 0x35, 0x09, 0x4c, 0x05, 0x7f, 0xf2, 0x51, | ||||
| 	/* (2^210)P */ 0x82, 0x06, 0x32, 0x2a, 0xcd, 0x7c, 0x48, 0x4c, 0x96, 0x1c, 0xdf, 0xb3, 0x5b, 0xa9, 0x7e, 0x58, 0xe8, 0xb8, 0x5c, 0x55, 0x9e, 0xf7, 0xcc, 0xc8, 0x3d, 0xd7, 0x06, 0xa2, 0x29, 0xc8, 0x7d, 0x54, | ||||
| 	/* (2^211)P */ 0x06, 0x9b, 0xc3, 0x80, 0xcd, 0xa6, 0x22, 0xb8, 0xc6, 0xd4, 0x00, 0x20, 0x73, 0x54, 0x6d, 0xe9, 0x4d, 0x3b, 0x46, 0x91, 0x6f, 0x5b, 0x53, 0x28, 0x1d, 0x6e, 0x48, 0xe2, 0x60, 0x46, 0x8f, 0x22, | ||||
| 	/* (2^212)P */ 0xbf, 0x3a, 0x8d, 0xde, 0x38, 0x95, 0x79, 0x98, 0x6e, 0xca, 0xeb, 0x45, 0x00, 0x33, 0xd8, 0x8c, 0x38, 0xe7, 0x21, 0x82, 0x00, 0x2a, 0x95, 0x79, 0xbb, 0xd2, 0x5c, 0x53, 0xa7, 0xe1, 0x22, 0x43, | ||||
| 	/* (2^213)P */ 0x1c, 0x80, 0xd1, 0x19, 0x18, 0xc1, 0x14, 0xb1, 0xc7, 0x5e, 0x3f, 0x4f, 0xd8, 0xe4, 0x16, 0x20, 0x4c, 0x0f, 0x26, 0x09, 0xf4, 0x2d, 0x0e, 0xdd, 0x66, 0x72, 0x5f, 0xae, 0xc0, 0x62, 0xc3, 0x5e, | ||||
| 	/* (2^214)P */ 0xee, 0xb4, 0xb2, 0xb8, 0x18, 0x2b, 0x46, 0xc0, 0xfb, 0x1a, 0x4d, 0x27, 0x50, 0xd9, 0xc8, 0x7c, 0xd2, 0x02, 0x6b, 0x43, 0x05, 0x71, 0x5f, 0xf2, 0xd3, 0xcc, 0xf9, 0xbf, 0xdc, 0xf8, 0xbb, 0x43, | ||||
| 	/* (2^215)P */ 0xdf, 0xe9, 0x39, 0xa0, 0x67, 0x17, 0xad, 0xb6, 0x83, 0x35, 0x9d, 0xf6, 0xa8, 0x4d, 0x71, 0xb0, 0xf5, 0x31, 0x29, 0xb4, 0x18, 0xfa, 0x55, 0x5e, 0x61, 0x09, 0xc6, 0x33, 0x8f, 0x55, 0xd5, 0x4e, | ||||
| 	/* (2^216)P */ 0xdd, 0xa5, 0x47, 0xc6, 0x01, 0x79, 0xe3, 0x1f, 0x57, 0xd3, 0x81, 0x80, 0x1f, 0xdf, 0x3d, 0x59, 0xa6, 0xd7, 0x3f, 0x81, 0xfd, 0xa4, 0x49, 0x02, 0x61, 0xaf, 0x9c, 0x4e, 0x27, 0xca, 0xac, 0x69, | ||||
| 	/* (2^217)P */ 0xc9, 0x21, 0x07, 0x33, 0xea, 0xa3, 0x7b, 0x04, 0xa0, 0x1e, 0x7e, 0x0e, 0xc2, 0x3f, 0x42, 0x83, 0x60, 0x4a, 0x31, 0x01, 0xaf, 0xc0, 0xf4, 0x1d, 0x27, 0x95, 0x28, 0x89, 0xab, 0x2d, 0xa6, 0x09, | ||||
| 	/* (2^218)P */ 0x00, 0xcb, 0xc6, 0x9c, 0xa4, 0x25, 0xb3, 0xa5, 0xb6, 0x6c, 0xb5, 0x54, 0xc6, 0x5d, 0x4b, 0xe9, 0xa0, 0x94, 0xc9, 0xad, 0x79, 0x87, 0xe2, 0x3b, 0xad, 0x4a, 0x3a, 0xba, 0xf8, 0xe8, 0x96, 0x42, | ||||
| 	/* (2^219)P */ 0xab, 0x1e, 0x45, 0x1e, 0x76, 0x89, 0x86, 0x32, 0x4a, 0x59, 0x59, 0xff, 0x8b, 0x59, 0x4d, 0x2e, 0x4a, 0x08, 0xa7, 0xd7, 0x53, 0x68, 0xb9, 0x49, 0xa8, 0x20, 0x14, 0x60, 0x19, 0xa3, 0x80, 0x49, | ||||
| 	/* (2^220)P */ 0x42, 0x2c, 0x55, 0x2f, 0xe1, 0xb9, 0x65, 0x95, 0x96, 0xfe, 0x00, 0x71, 0xdb, 0x18, 0x53, 0x8a, 0xd7, 0xd0, 0xad, 0x43, 0x4d, 0x0b, 0xc9, 0x05, 0xda, 0x4e, 0x5d, 0x6a, 0xd6, 0x4c, 0x8b, 0x53, | ||||
| 	/* (2^221)P */ 0x9f, 0x03, 0x9f, 0xe8, 0xc3, 0x4f, 0xe9, 0xf4, 0x45, 0x80, 0x61, 0x6f, 0xf2, 0x9a, 0x2c, 0x59, 0x50, 0x95, 0x4b, 0xfd, 0xb5, 0x6e, 0xa3, 0x08, 0x19, 0x14, 0xed, 0xc2, 0xf6, 0xfa, 0xff, 0x25, | ||||
| 	/* (2^222)P */ 0x54, 0xd3, 0x79, 0xcc, 0x59, 0x44, 0x43, 0x34, 0x6b, 0x47, 0xd5, 0xb1, 0xb4, 0xbf, 0xec, 0xee, 0x99, 0x5d, 0x61, 0x61, 0xa0, 0x34, 0xeb, 0xdd, 0x73, 0xb7, 0x64, 0xeb, 0xcc, 0xce, 0x29, 0x51, | ||||
| 	/* (2^223)P */ 0x20, 0x35, 0x99, 0x94, 0x58, 0x21, 0x43, 0xee, 0x3b, 0x0b, 0x4c, 0xf1, 0x7c, 0x9c, 0x2f, 0x77, 0xd5, 0xda, 0xbe, 0x06, 0xe3, 0xfc, 0xe2, 0xd2, 0x97, 0x6a, 0xf0, 0x46, 0xb5, 0x42, 0x5f, 0x71, | ||||
| 	/* (2^224)P */ 0x1a, 0x5f, 0x5b, 0xda, 0xce, 0xcd, 0x4e, 0x43, 0xa9, 0x41, 0x97, 0xa4, 0x15, 0x71, 0xa1, 0x0d, 0x2e, 0xad, 0xed, 0x73, 0x7c, 0xd7, 0x0b, 0x68, 0x41, 0x90, 0xdd, 0x4e, 0x35, 0x02, 0x7c, 0x48, | ||||
| 	/* (2^225)P */ 0xc4, 0xd9, 0x0e, 0xa7, 0xf3, 0xef, 0xef, 0xb8, 0x02, 0xe3, 0x57, 0xe8, 0xa3, 0x2a, 0xa3, 0x56, 0xa0, 0xa5, 0xa2, 0x48, 0xbd, 0x68, 0x3a, 0xdf, 0x44, 0xc4, 0x76, 0x31, 0xb7, 0x50, 0xf6, 0x07, | ||||
| 	/* (2^226)P */ 0xb1, 0xcc, 0xe0, 0x26, 0x16, 0x9b, 0x8b, 0xe3, 0x36, 0xfb, 0x09, 0x8b, 0xc1, 0x53, 0xe0, 0x79, 0x64, 0x49, 0xf9, 0xc9, 0x19, 0x03, 0xd9, 0x56, 0xc4, 0xf5, 0x9f, 0xac, 0xe7, 0x41, 0xa9, 0x1c, | ||||
| 	/* (2^227)P */ 0xbb, 0xa0, 0x2f, 0x16, 0x29, 0xdf, 0xc4, 0x49, 0x05, 0x33, 0xb3, 0x82, 0x32, 0xcf, 0x88, 0x84, 0x7d, 0x43, 0xbb, 0xca, 0x14, 0xda, 0xdf, 0x95, 0x86, 0xad, 0xd5, 0x64, 0x82, 0xf7, 0x91, 0x33, | ||||
| 	/* (2^228)P */ 0x5d, 0x09, 0xb5, 0xe2, 0x6a, 0xe0, 0x9a, 0x72, 0x46, 0xa9, 0x59, 0x32, 0xd7, 0x58, 0x8a, 0xd5, 0xed, 0x21, 0x39, 0xd1, 0x62, 0x42, 0x83, 0xe9, 0x92, 0xb5, 0x4b, 0xa5, 0xfa, 0xda, 0xfe, 0x27, | ||||
| 	/* (2^229)P */ 0xbb, 0x48, 0xad, 0x29, 0xb8, 0xc5, 0x9d, 0xa9, 0x60, 0xe2, 0x9e, 0x49, 0x42, 0x57, 0x02, 0x5f, 0xfd, 0x13, 0x75, 0x5d, 0xcd, 0x8e, 0x2c, 0x80, 0x38, 0xd9, 0x6d, 0x3f, 0xef, 0xb3, 0xce, 0x78, | ||||
| 	/* (2^230)P */ 0x94, 0x5d, 0x13, 0x8a, 0x4f, 0xf4, 0x42, 0xc3, 0xa3, 0xdd, 0x8c, 0x82, 0x44, 0xdb, 0x9e, 0x7b, 0xe7, 0xcf, 0x37, 0x05, 0x1a, 0xd1, 0x36, 0x94, 0xc8, 0xb4, 0x1a, 0xec, 0x64, 0xb1, 0x64, 0x50, | ||||
| 	/* (2^231)P */ 0xfc, 0xb2, 0x7e, 0xd3, 0xcf, 0xec, 0x20, 0x70, 0xfc, 0x25, 0x0d, 0xd9, 0x3e, 0xea, 0x31, 0x1f, 0x34, 0xbb, 0xa1, 0xdf, 0x7b, 0x0d, 0x93, 0x1b, 0x44, 0x30, 0x11, 0x48, 0x7a, 0x46, 0x44, 0x53, | ||||
| 	/* (2^232)P */ 0xfb, 0x6d, 0x5e, 0xf2, 0x70, 0x31, 0x07, 0x70, 0xc8, 0x4c, 0x11, 0x50, 0x1a, 0xdc, 0x85, 0xe3, 0x00, 0x4f, 0xfc, 0xc8, 0x8a, 0x69, 0x48, 0x23, 0xd8, 0x40, 0xdd, 0x84, 0x52, 0xa5, 0x77, 0x2a, | ||||
| 	/* (2^233)P */ 0xe4, 0x6c, 0x8c, 0xc9, 0xe0, 0xaf, 0x06, 0xfe, 0xe4, 0xd6, 0xdf, 0xdd, 0x96, 0xdf, 0x35, 0xc2, 0xd3, 0x1e, 0xbf, 0x33, 0x1e, 0xd0, 0x28, 0x14, 0xaf, 0xbd, 0x00, 0x93, 0xec, 0x68, 0x57, 0x78, | ||||
| 	/* (2^234)P */ 0x3b, 0xb6, 0xde, 0x91, 0x7a, 0xe5, 0x02, 0x97, 0x80, 0x8b, 0xce, 0xe5, 0xbf, 0xb8, 0xbd, 0x61, 0xac, 0x58, 0x1d, 0x3d, 0x6f, 0x42, 0x5b, 0x64, 0xbc, 0x57, 0xa5, 0x27, 0x22, 0xa8, 0x04, 0x48, | ||||
| 	/* (2^235)P */ 0x01, 0x26, 0x4d, 0xb4, 0x8a, 0x04, 0x57, 0x8e, 0x35, 0x69, 0x3a, 0x4b, 0x1a, 0x50, 0xd6, 0x68, 0x93, 0xc2, 0xe1, 0xf9, 0xc3, 0x9e, 0x9c, 0xc3, 0xe2, 0x63, 0xde, 0xd4, 0x57, 0xf2, 0x72, 0x41, | ||||
| 	/* (2^236)P */ 0x01, 0x64, 0x0c, 0x33, 0x50, 0xb4, 0x68, 0xd3, 0x91, 0x23, 0x8f, 0x41, 0x17, 0x30, 0x0d, 0x04, 0x0d, 0xd9, 0xb7, 0x90, 0x60, 0xbb, 0x34, 0x2c, 0x1f, 0xd5, 0xdf, 0x8f, 0x22, 0x49, 0xf6, 0x16, | ||||
| 	/* (2^237)P */ 0xf5, 0x8e, 0x92, 0x2b, 0x8e, 0x81, 0xa6, 0xbe, 0x72, 0x1e, 0xc1, 0xcd, 0x91, 0xcf, 0x8c, 0xe2, 0xcd, 0x36, 0x7a, 0xe7, 0x68, 0xaa, 0x4a, 0x59, 0x0f, 0xfd, 0x7f, 0x6c, 0x80, 0x34, 0x30, 0x31, | ||||
| 	/* (2^238)P */ 0x65, 0xbd, 0x49, 0x22, 0xac, 0x27, 0x9d, 0x8a, 0x12, 0x95, 0x8e, 0x01, 0x64, 0xb4, 0xa3, 0x19, 0xc7, 0x7e, 0xb3, 0x52, 0xf3, 0xcf, 0x6c, 0xc2, 0x21, 0x7b, 0x79, 0x1d, 0x34, 0x68, 0x6f, 0x05, | ||||
| 	/* (2^239)P */ 0x27, 0x23, 0xfd, 0x7e, 0x75, 0xd6, 0x79, 0x5e, 0x15, 0xfe, 0x3a, 0x55, 0xb6, 0xbc, 0xbd, 0xfa, 0x60, 0x5a, 0xaf, 0x6e, 0x2c, 0x22, 0xe7, 0xd3, 0x3b, 0x74, 0xae, 0x4d, 0x6d, 0xc7, 0x46, 0x70, | ||||
| 	/* (2^240)P */ 0x55, 0x4a, 0x8d, 0xb1, 0x72, 0xe8, 0x0b, 0x66, 0x96, 0x14, 0x4e, 0x57, 0x18, 0x25, 0x99, 0x19, 0xbb, 0xdc, 0x2b, 0x30, 0x3a, 0x05, 0x03, 0xc1, 0x8e, 0x8e, 0x21, 0x0b, 0x80, 0xe9, 0xd8, 0x3e, | ||||
| 	/* (2^241)P */ 0x3e, 0xe0, 0x75, 0xfa, 0x39, 0x92, 0x0b, 0x7b, 0x83, 0xc0, 0x33, 0x46, 0x68, 0xfb, 0xe9, 0xef, 0x93, 0x77, 0x1a, 0x39, 0xbe, 0x5f, 0xa3, 0x98, 0x34, 0xfe, 0xd0, 0xe2, 0x0f, 0x51, 0x65, 0x60, | ||||
| 	/* (2^242)P */ 0x0c, 0xad, 0xab, 0x48, 0x85, 0x66, 0xcb, 0x55, 0x27, 0xe5, 0x87, 0xda, 0x48, 0x45, 0x58, 0xb4, 0xdd, 0xc1, 0x07, 0x01, 0xea, 0xec, 0x43, 0x2c, 0x35, 0xde, 0x72, 0x93, 0x80, 0x28, 0x60, 0x52, | ||||
| 	/* (2^243)P */ 0x1f, 0x3b, 0x21, 0xf9, 0x6a, 0xc5, 0x15, 0x34, 0xdb, 0x98, 0x7e, 0x01, 0x4d, 0x1a, 0xee, 0x5b, 0x9b, 0x70, 0xcf, 0xb5, 0x05, 0xb1, 0xf6, 0x13, 0xb6, 0x9a, 0xb2, 0x82, 0x34, 0x0e, 0xf2, 0x5f, | ||||
| 	/* (2^244)P */ 0x90, 0x6c, 0x2e, 0xcc, 0x75, 0x9c, 0xa2, 0x0a, 0x06, 0xe2, 0x70, 0x3a, 0xca, 0x73, 0x7d, 0xfc, 0x15, 0xc5, 0xb5, 0xc4, 0x8f, 0xc3, 0x9f, 0x89, 0x07, 0xc2, 0xff, 0x24, 0xb1, 0x86, 0x03, 0x25, | ||||
| 	/* (2^245)P */ 0x56, 0x2b, 0x3d, 0xae, 0xd5, 0x28, 0xea, 0x54, 0xce, 0x60, 0xde, 0xd6, 0x9d, 0x14, 0x13, 0x99, 0xc1, 0xd6, 0x06, 0x8f, 0xc5, 0x4f, 0x69, 0x16, 0xc7, 0x8f, 0x01, 0xeb, 0x75, 0x39, 0xb2, 0x46, | ||||
| 	/* (2^246)P */ 0xe2, 0xb4, 0xb7, 0xb4, 0x0f, 0x6a, 0x0a, 0x47, 0xde, 0x53, 0x72, 0x8f, 0x5a, 0x47, 0x92, 0x5d, 0xdb, 0x3a, 0xbd, 0x2f, 0xb5, 0xe5, 0xee, 0xab, 0x68, 0x69, 0x80, 0xa0, 0x01, 0x08, 0xa2, 0x7f, | ||||
| 	/* (2^247)P */ 0xd2, 0x14, 0x77, 0x9f, 0xf1, 0xfa, 0xf3, 0x76, 0xc3, 0x60, 0x46, 0x2f, 0xc1, 0x40, 0xe8, 0xb3, 0x4e, 0x74, 0x12, 0xf2, 0x8d, 0xcd, 0xb4, 0x0f, 0xd2, 0x2d, 0x3a, 0x1d, 0x25, 0x5a, 0x06, 0x4b, | ||||
| 	/* (2^248)P */ 0x4a, 0xcd, 0x77, 0x3d, 0x38, 0xde, 0xeb, 0x5c, 0xb1, 0x9c, 0x2c, 0x88, 0xdf, 0x39, 0xdf, 0x6a, 0x59, 0xf7, 0x9a, 0xb0, 0x2e, 0x24, 0xdd, 0xa2, 0x22, 0x64, 0x5f, 0x0e, 0xe5, 0xc0, 0x47, 0x31, | ||||
| 	/* (2^249)P */ 0xdb, 0x50, 0x13, 0x1d, 0x10, 0xa5, 0x4c, 0x16, 0x62, 0xc9, 0x3f, 0xc3, 0x79, 0x34, 0xd1, 0xf8, 0x08, 0xda, 0xe5, 0x13, 0x4d, 0xce, 0x40, 0xe6, 0xba, 0xf8, 0x61, 0x50, 0xc4, 0xe0, 0xde, 0x4b, | ||||
| 	/* (2^250)P */ 0xc9, 0xb1, 0xed, 0xa4, 0xc1, 0x6d, 0xc4, 0xd7, 0x8a, 0xd9, 0x7f, 0x43, 0xb6, 0xd7, 0x14, 0x55, 0x0b, 0xc0, 0xa1, 0xb2, 0x6b, 0x2f, 0x94, 0x58, 0x0e, 0x71, 0x70, 0x1d, 0xab, 0xb2, 0xff, 0x2d, | ||||
| 	/* (2^251)P */ 0x68, 0x6d, 0x8b, 0xc1, 0x2f, 0xcf, 0xdf, 0xcc, 0x67, 0x61, 0x80, 0xb7, 0xa8, 0xcb, 0xeb, 0xa8, 0xe3, 0x37, 0x29, 0x5e, 0xf9, 0x97, 0x06, 0x98, 0x8c, 0x6e, 0x12, 0xd0, 0x1c, 0xba, 0xfb, 0x02, | ||||
| 	/* (2^252)P */ 0x65, 0x45, 0xff, 0xad, 0x60, 0xc3, 0x98, 0xcb, 0x19, 0x15, 0xdb, 0x4b, 0xd2, 0x01, 0x71, 0x44, 0xd5, 0x15, 0xfb, 0x75, 0x74, 0xc8, 0xc4, 0x98, 0x7d, 0xa2, 0x22, 0x6e, 0x6d, 0xc7, 0xf8, 0x05, | ||||
| 	/* (2^253)P */ 0x94, 0xf4, 0xb9, 0xfe, 0xdf, 0xe5, 0x69, 0xab, 0x75, 0x6b, 0x40, 0x18, 0x9d, 0xc7, 0x09, 0xae, 0x1d, 0x2d, 0xa4, 0x94, 0xfb, 0x45, 0x9b, 0x19, 0x84, 0xfa, 0x2a, 0xae, 0xeb, 0x0a, 0x71, 0x79, | ||||
| 	/* (2^254)P */ 0xdf, 0xd2, 0x34, 0xf3, 0xa7, 0xed, 0xad, 0xa6, 0xb4, 0x57, 0x2a, 0xaf, 0x51, 0x9c, 0xde, 0x7b, 0xa8, 0xea, 0xdc, 0x86, 0x4f, 0xc6, 0x8f, 0xa9, 0x7b, 0xd0, 0x0e, 0xc2, 0x35, 0x03, 0xbe, 0x6b, | ||||
| 	/* (2^255)P */ 0x44, 0x43, 0x98, 0x53, 0xbe, 0xdc, 0x7f, 0x66, 0xa8, 0x49, 0x59, 0x00, 0x1c, 0xbc, 0x72, 0x07, 0x8e, 0xd6, 0xbe, 0x4e, 0x9f, 0xa4, 0x07, 0xba, 0xbf, 0x30, 0xdf, 0xba, 0x85, 0xb0, 0xa7, 0x1f, | ||||
| } | ||||
|  | @ -1,104 +0,0 @@ | |||
| package x448 | ||||
| 
 | ||||
| import ( | ||||
| 	fp "github.com/cloudflare/circl/math/fp448" | ||||
| ) | ||||
| 
 | ||||
| // ladderJoye calculates a fixed-point multiplication with the generator point.
 | ||||
| // The algorithm is the right-to-left Joye's ladder as described
 | ||||
| // in "How to precompute a ladder" in SAC'2017.
 | ||||
| func ladderJoye(k *Key) { | ||||
| 	w := [5]fp.Elt{} // [mu,x1,z1,x2,z2] order must be preserved.
 | ||||
| 	w[1] = fp.Elt{   // x1 = S
 | ||||
| 		0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 	} | ||||
| 	fp.SetOne(&w[2]) // z1 = 1
 | ||||
| 	w[3] = fp.Elt{   // x2 = G-S
 | ||||
| 		0x20, 0x27, 0x9d, 0xc9, 0x7d, 0x19, 0xb1, 0xac, | ||||
| 		0xf8, 0xba, 0x69, 0x1c, 0xff, 0x33, 0xac, 0x23, | ||||
| 		0x51, 0x1b, 0xce, 0x3a, 0x64, 0x65, 0xbd, 0xf1, | ||||
| 		0x23, 0xf8, 0xc1, 0x84, 0x9d, 0x45, 0x54, 0x29, | ||||
| 		0x67, 0xb9, 0x81, 0x1c, 0x03, 0xd1, 0xcd, 0xda, | ||||
| 		0x7b, 0xeb, 0xff, 0x1a, 0x88, 0x03, 0xcf, 0x3a, | ||||
| 		0x42, 0x44, 0x32, 0x01, 0x25, 0xb7, 0xfa, 0xf0, | ||||
| 	} | ||||
| 	fp.SetOne(&w[4]) // z2 = 1
 | ||||
| 
 | ||||
| 	const n = 448 | ||||
| 	const h = 2 | ||||
| 	swap := uint(1) | ||||
| 	for s := 0; s < n-h; s++ { | ||||
| 		i := (s + h) / 8 | ||||
| 		j := (s + h) % 8 | ||||
| 		bit := uint((k[i] >> uint(j)) & 1) | ||||
| 		copy(w[0][:], tableGenerator[s*Size:(s+1)*Size]) | ||||
| 		diffAdd(&w, swap^bit) | ||||
| 		swap = bit | ||||
| 	} | ||||
| 	for s := 0; s < h; s++ { | ||||
| 		double(&w[1], &w[2]) | ||||
| 	} | ||||
| 	toAffine((*[fp.Size]byte)(k), &w[1], &w[2]) | ||||
| } | ||||
| 
 | ||||
| // ladderMontgomery calculates a generic scalar point multiplication
 | ||||
| // The algorithm implemented is the left-to-right Montgomery's ladder.
 | ||||
| func ladderMontgomery(k, xP *Key) { | ||||
| 	w := [5]fp.Elt{}      // [x1, x2, z2, x3, z3] order must be preserved.
 | ||||
| 	w[0] = *(*fp.Elt)(xP) // x1 = xP
 | ||||
| 	fp.SetOne(&w[1])      // x2 = 1
 | ||||
| 	w[3] = *(*fp.Elt)(xP) // x3 = xP
 | ||||
| 	fp.SetOne(&w[4])      // z3 = 1
 | ||||
| 
 | ||||
| 	move := uint(0) | ||||
| 	for s := 448 - 1; s >= 0; s-- { | ||||
| 		i := s / 8 | ||||
| 		j := s % 8 | ||||
| 		bit := uint((k[i] >> uint(j)) & 1) | ||||
| 		ladderStep(&w, move^bit) | ||||
| 		move = bit | ||||
| 	} | ||||
| 	toAffine((*[fp.Size]byte)(k), &w[1], &w[2]) | ||||
| } | ||||
| 
 | ||||
| func toAffine(k *[fp.Size]byte, x, z *fp.Elt) { | ||||
| 	fp.Inv(z, z) | ||||
| 	fp.Mul(x, x, z) | ||||
| 	_ = fp.ToBytes(k[:], x) | ||||
| } | ||||
| 
 | ||||
| var lowOrderPoints = [3]fp.Elt{ | ||||
| 	{ /* (0,_,1) point of order 2 on Curve448 */ | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 	}, | ||||
| 	{ /* (1,_,1) a point of order 4 on the twist of Curve448 */ | ||||
| 		0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
| 	}, | ||||
| 	{ /* (-1,_,1) point of order 4 on Curve448 */ | ||||
| 		0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 	}, | ||||
| } | ||||
|  | @ -1,30 +0,0 @@ | |||
| //go:build amd64 && !purego
 | ||||
| // +build amd64,!purego
 | ||||
| 
 | ||||
| package x448 | ||||
| 
 | ||||
| import ( | ||||
| 	fp "github.com/cloudflare/circl/math/fp448" | ||||
| 	"golang.org/x/sys/cpu" | ||||
| ) | ||||
| 
 | ||||
| var hasBmi2Adx = cpu.X86.HasBMI2 && cpu.X86.HasADX | ||||
| 
 | ||||
| var _ = hasBmi2Adx | ||||
| 
 | ||||
| func double(x, z *fp.Elt)             { doubleAmd64(x, z) } | ||||
| func diffAdd(w *[5]fp.Elt, b uint)    { diffAddAmd64(w, b) } | ||||
| func ladderStep(w *[5]fp.Elt, b uint) { ladderStepAmd64(w, b) } | ||||
| func mulA24(z, x *fp.Elt)             { mulA24Amd64(z, x) } | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func doubleAmd64(x, z *fp.Elt) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func diffAddAmd64(w *[5]fp.Elt, b uint) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func ladderStepAmd64(w *[5]fp.Elt, b uint) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func mulA24Amd64(z, x *fp.Elt) | ||||
|  | @ -1,111 +0,0 @@ | |||
| #define ladderStepLeg          \ | ||||
|     addSub(x2,z2)              \ | ||||
|     addSub(x3,z3)              \ | ||||
|     integerMulLeg(b0,x2,z3)    \ | ||||
|     integerMulLeg(b1,x3,z2)    \ | ||||
|     reduceFromDoubleLeg(t0,b0) \ | ||||
|     reduceFromDoubleLeg(t1,b1) \ | ||||
|     addSub(t0,t1)              \ | ||||
|     cselect(x2,x3,regMove)     \ | ||||
|     cselect(z2,z3,regMove)     \ | ||||
|     integerSqrLeg(b0,t0)       \ | ||||
|     integerSqrLeg(b1,t1)       \ | ||||
|     reduceFromDoubleLeg(x3,b0) \ | ||||
|     reduceFromDoubleLeg(z3,b1) \ | ||||
|     integerMulLeg(b0,x1,z3)    \ | ||||
|     reduceFromDoubleLeg(z3,b0) \ | ||||
|     integerSqrLeg(b0,x2)       \ | ||||
|     integerSqrLeg(b1,z2)       \ | ||||
|     reduceFromDoubleLeg(x2,b0) \ | ||||
|     reduceFromDoubleLeg(z2,b1) \ | ||||
|     subtraction(t0,x2,z2)      \ | ||||
|     multiplyA24Leg(t1,t0)      \ | ||||
|     additionLeg(t1,t1,z2)      \ | ||||
|     integerMulLeg(b0,x2,z2)    \ | ||||
|     integerMulLeg(b1,t0,t1)    \ | ||||
|     reduceFromDoubleLeg(x2,b0) \ | ||||
|     reduceFromDoubleLeg(z2,b1) | ||||
| 
 | ||||
| #define ladderStepBmi2Adx      \ | ||||
|     addSub(x2,z2)              \ | ||||
|     addSub(x3,z3)              \ | ||||
|     integerMulAdx(b0,x2,z3)    \ | ||||
|     integerMulAdx(b1,x3,z2)    \ | ||||
|     reduceFromDoubleAdx(t0,b0) \ | ||||
|     reduceFromDoubleAdx(t1,b1) \ | ||||
|     addSub(t0,t1)              \ | ||||
|     cselect(x2,x3,regMove)     \ | ||||
|     cselect(z2,z3,regMove)     \ | ||||
|     integerSqrAdx(b0,t0)       \ | ||||
|     integerSqrAdx(b1,t1)       \ | ||||
|     reduceFromDoubleAdx(x3,b0) \ | ||||
|     reduceFromDoubleAdx(z3,b1) \ | ||||
|     integerMulAdx(b0,x1,z3)    \ | ||||
|     reduceFromDoubleAdx(z3,b0) \ | ||||
|     integerSqrAdx(b0,x2)       \ | ||||
|     integerSqrAdx(b1,z2)       \ | ||||
|     reduceFromDoubleAdx(x2,b0) \ | ||||
|     reduceFromDoubleAdx(z2,b1) \ | ||||
|     subtraction(t0,x2,z2)      \ | ||||
|     multiplyA24Adx(t1,t0)      \ | ||||
|     additionAdx(t1,t1,z2)      \ | ||||
|     integerMulAdx(b0,x2,z2)    \ | ||||
|     integerMulAdx(b1,t0,t1)    \ | ||||
|     reduceFromDoubleAdx(x2,b0) \ | ||||
|     reduceFromDoubleAdx(z2,b1) | ||||
| 
 | ||||
| #define difAddLeg              \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerMulLeg(b0,z1,ui)    \ | ||||
|     reduceFromDoubleLeg(z1,b0) \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerSqrLeg(b0,x1)       \ | ||||
|     integerSqrLeg(b1,z1)       \ | ||||
|     reduceFromDoubleLeg(x1,b0) \ | ||||
|     reduceFromDoubleLeg(z1,b1) \ | ||||
|     integerMulLeg(b0,x1,z2)    \ | ||||
|     integerMulLeg(b1,z1,x2)    \ | ||||
|     reduceFromDoubleLeg(x1,b0) \ | ||||
|     reduceFromDoubleLeg(z1,b1) | ||||
| 
 | ||||
| #define difAddBmi2Adx          \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerMulAdx(b0,z1,ui)    \ | ||||
|     reduceFromDoubleAdx(z1,b0) \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerSqrAdx(b0,x1)       \ | ||||
|     integerSqrAdx(b1,z1)       \ | ||||
|     reduceFromDoubleAdx(x1,b0) \ | ||||
|     reduceFromDoubleAdx(z1,b1) \ | ||||
|     integerMulAdx(b0,x1,z2)    \ | ||||
|     integerMulAdx(b1,z1,x2)    \ | ||||
|     reduceFromDoubleAdx(x1,b0) \ | ||||
|     reduceFromDoubleAdx(z1,b1) | ||||
| 
 | ||||
| #define doubleLeg              \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerSqrLeg(b0,x1)       \ | ||||
|     integerSqrLeg(b1,z1)       \ | ||||
|     reduceFromDoubleLeg(x1,b0) \ | ||||
|     reduceFromDoubleLeg(z1,b1) \ | ||||
|     subtraction(t0,x1,z1)      \ | ||||
|     multiplyA24Leg(t1,t0)      \ | ||||
|     additionLeg(t1,t1,z1)      \ | ||||
|     integerMulLeg(b0,x1,z1)    \ | ||||
|     integerMulLeg(b1,t0,t1)    \ | ||||
|     reduceFromDoubleLeg(x1,b0) \ | ||||
|     reduceFromDoubleLeg(z1,b1) | ||||
| 
 | ||||
| #define doubleBmi2Adx          \ | ||||
|     addSub(x1,z1)              \ | ||||
|     integerSqrAdx(b0,x1)       \ | ||||
|     integerSqrAdx(b1,z1)       \ | ||||
|     reduceFromDoubleAdx(x1,b0) \ | ||||
|     reduceFromDoubleAdx(z1,b1) \ | ||||
|     subtraction(t0,x1,z1)      \ | ||||
|     multiplyA24Adx(t1,t0)      \ | ||||
|     additionAdx(t1,t1,z1)      \ | ||||
|     integerMulAdx(b0,x1,z1)    \ | ||||
|     integerMulAdx(b1,t0,t1)    \ | ||||
|     reduceFromDoubleAdx(x1,b0) \ | ||||
|     reduceFromDoubleAdx(z1,b1) | ||||
|  | @ -1,193 +0,0 @@ | |||
| // +build amd64 | ||||
| 
 | ||||
| #include "textflag.h" | ||||
| 
 | ||||
| // Depends on circl/math/fp448 package | ||||
| #include "../../math/fp448/fp_amd64.h" | ||||
| #include "curve_amd64.h" | ||||
| 
 | ||||
| // CTE_A24 is (A+2)/4 from Curve448 | ||||
| #define CTE_A24 39082 | ||||
| 
 | ||||
| #define Size 56 | ||||
| 
 | ||||
| // multiplyA24Leg multiplies x times CTE_A24 and stores in z | ||||
| // Uses: AX, DX, R8-R15, FLAGS | ||||
| // Instr: x86_64, cmov, adx | ||||
| #define multiplyA24Leg(z,x) \ | ||||
|     MOVQ $CTE_A24, R15; \
 | ||||
|     MOVQ  0+x, AX; MULQ R15; MOVQ AX,  R8; ;;;;;;;;;;;;  MOVQ DX,  R9; \
 | ||||
|     MOVQ  8+x, AX; MULQ R15; ADDQ AX,  R9; ADCQ $0, DX;  MOVQ DX, R10; \
 | ||||
|     MOVQ 16+x, AX; MULQ R15; ADDQ AX, R10; ADCQ $0, DX;  MOVQ DX, R11; \
 | ||||
|     MOVQ 24+x, AX; MULQ R15; ADDQ AX, R11; ADCQ $0, DX;  MOVQ DX, R12; \
 | ||||
|     MOVQ 32+x, AX; MULQ R15; ADDQ AX, R12; ADCQ $0, DX;  MOVQ DX, R13; \
 | ||||
|     MOVQ 40+x, AX; MULQ R15; ADDQ AX, R13; ADCQ $0, DX;  MOVQ DX, R14; \
 | ||||
|     MOVQ 48+x, AX; MULQ R15; ADDQ AX, R14; ADCQ $0, DX; \
 | ||||
|     MOVQ DX,  AX; \
 | ||||
|     SHLQ $32, AX; \
 | ||||
|     ADDQ DX,  R8; MOVQ $0, DX; \
 | ||||
|     ADCQ $0,  R9; \
 | ||||
|     ADCQ $0, R10; \
 | ||||
|     ADCQ AX, R11; \
 | ||||
|     ADCQ $0, R12; \
 | ||||
|     ADCQ $0, R13; \
 | ||||
|     ADCQ $0, R14; \
 | ||||
|     ADCQ $0,  DX; \
 | ||||
|     MOVQ DX,  AX; \
 | ||||
|     SHLQ $32, AX; \
 | ||||
|     ADDQ DX,  R8; \
 | ||||
|     ADCQ $0,  R9; \
 | ||||
|     ADCQ $0, R10; \
 | ||||
|     ADCQ AX, R11; \
 | ||||
|     ADCQ $0, R12; \
 | ||||
|     ADCQ $0, R13; \
 | ||||
|     ADCQ $0, R14; \
 | ||||
|     MOVQ  R8,  0+z; \
 | ||||
|     MOVQ  R9,  8+z; \
 | ||||
|     MOVQ R10, 16+z; \
 | ||||
|     MOVQ R11, 24+z; \
 | ||||
|     MOVQ R12, 32+z; \
 | ||||
|     MOVQ R13, 40+z; \
 | ||||
|     MOVQ R14, 48+z;
 | ||||
| 
 | ||||
| // multiplyA24Adx multiplies x times CTE_A24 and stores in z | ||||
| // Uses: AX, DX, R8-R14, FLAGS | ||||
| // Instr: x86_64, bmi2 | ||||
| #define multiplyA24Adx(z,x) \ | ||||
|     MOVQ $CTE_A24, DX; \
 | ||||
|     MULXQ  0+x, R8,  R9; \
 | ||||
|     MULXQ  8+x, AX, R10;  ADDQ AX,  R9; \
 | ||||
|     MULXQ 16+x, AX, R11;  ADCQ AX, R10; \
 | ||||
|     MULXQ 24+x, AX, R12;  ADCQ AX, R11; \
 | ||||
|     MULXQ 32+x, AX, R13;  ADCQ AX, R12; \
 | ||||
|     MULXQ 40+x, AX, R14;  ADCQ AX, R13; \
 | ||||
|     MULXQ 48+x, AX,  DX;  ADCQ AX, R14; \
 | ||||
|     ;;;;;;;;;;;;;;;;;;;;  ADCQ $0,  DX; \
 | ||||
|     MOVQ DX,  AX; \
 | ||||
|     SHLQ $32, AX; \
 | ||||
|     ADDQ DX,  R8; MOVQ $0, DX; \
 | ||||
|     ADCQ $0,  R9; \
 | ||||
|     ADCQ $0, R10; \
 | ||||
|     ADCQ AX, R11; \
 | ||||
|     ADCQ $0, R12; \
 | ||||
|     ADCQ $0, R13; \
 | ||||
|     ADCQ $0, R14; \
 | ||||
|     ADCQ $0,  DX; \
 | ||||
|     MOVQ DX,  AX; \
 | ||||
|     SHLQ $32, AX; \
 | ||||
|     ADDQ DX,  R8; \
 | ||||
|     ADCQ $0,  R9; \
 | ||||
|     ADCQ $0, R10; \
 | ||||
|     ADCQ AX, R11; \
 | ||||
|     ADCQ $0, R12; \
 | ||||
|     ADCQ $0, R13; \
 | ||||
|     ADCQ $0, R14; \
 | ||||
|     MOVQ  R8,  0+z; \
 | ||||
|     MOVQ  R9,  8+z; \
 | ||||
|     MOVQ R10, 16+z; \
 | ||||
|     MOVQ R11, 24+z; \
 | ||||
|     MOVQ R12, 32+z; \
 | ||||
|     MOVQ R13, 40+z; \
 | ||||
|     MOVQ R14, 48+z;
 | ||||
| 
 | ||||
| #define mulA24Legacy \ | ||||
|     multiplyA24Leg(0(DI),0(SI)) | ||||
| #define mulA24Bmi2Adx \ | ||||
|     multiplyA24Adx(0(DI),0(SI)) | ||||
| 
 | ||||
| // func mulA24Amd64(z, x *fp448.Elt) | ||||
| TEXT ·mulA24Amd64(SB),NOSPLIT,$0-16 | ||||
|     MOVQ z+0(FP), DI | ||||
|     MOVQ x+8(FP), SI | ||||
|     CHECK_BMI2ADX(LMA24, mulA24Legacy, mulA24Bmi2Adx) | ||||
| 
 | ||||
| // func ladderStepAmd64(w *[5]fp448.Elt, b uint) | ||||
| // ladderStepAmd64 calculates a point addition and doubling as follows: | ||||
| // (x2,z2) = 2*(x2,z2) and (x3,z3) = (x2,z2)+(x3,z3) using as a difference (x1,-). | ||||
| //    w    = {x1,x2,z2,x3,z4} are five fp255.Elt of 56 bytes. | ||||
| //  stack  = (t0,t1) are two fp.Elt of fp.Size bytes, and | ||||
| //           (b0,b1) are two-double precision fp.Elt of 2*fp.Size bytes. | ||||
| TEXT ·ladderStepAmd64(SB),NOSPLIT,$336-16 | ||||
|     // Parameters | ||||
|     #define regWork DI | ||||
|     #define regMove SI | ||||
|     #define x1 0*Size(regWork) | ||||
|     #define x2 1*Size(regWork) | ||||
|     #define z2 2*Size(regWork) | ||||
|     #define x3 3*Size(regWork) | ||||
|     #define z3 4*Size(regWork) | ||||
|     // Local variables | ||||
|     #define t0 0*Size(SP) | ||||
|     #define t1 1*Size(SP) | ||||
|     #define b0 2*Size(SP) | ||||
|     #define b1 4*Size(SP) | ||||
|     MOVQ w+0(FP), regWork | ||||
|     MOVQ b+8(FP), regMove | ||||
|     CHECK_BMI2ADX(LLADSTEP, ladderStepLeg, ladderStepBmi2Adx) | ||||
|     #undef regWork | ||||
|     #undef regMove | ||||
|     #undef x1 | ||||
|     #undef x2 | ||||
|     #undef z2 | ||||
|     #undef x3 | ||||
|     #undef z3 | ||||
|     #undef t0 | ||||
|     #undef t1 | ||||
|     #undef b0 | ||||
|     #undef b1 | ||||
| 
 | ||||
| // func diffAddAmd64(work *[5]fp.Elt, swap uint) | ||||
| // diffAddAmd64 calculates a differential point addition using a precomputed point. | ||||
| // (x1,z1) = (x1,z1)+(mu) using a difference point (x2,z2) | ||||
| //    work = {mu,x1,z1,x2,z2} are five fp448.Elt of 56 bytes, and | ||||
| //   stack = (b0,b1) are two-double precision fp.Elt of 2*fp.Size bytes. | ||||
| // This is Equation 7 at https://eprint.iacr.org/2017/264. | ||||
| TEXT ·diffAddAmd64(SB),NOSPLIT,$224-16 | ||||
|     // Parameters | ||||
|     #define regWork DI | ||||
|     #define regSwap SI | ||||
|     #define ui 0*Size(regWork) | ||||
|     #define x1 1*Size(regWork) | ||||
|     #define z1 2*Size(regWork) | ||||
|     #define x2 3*Size(regWork) | ||||
|     #define z2 4*Size(regWork) | ||||
|     // Local variables | ||||
|     #define b0 0*Size(SP) | ||||
|     #define b1 2*Size(SP) | ||||
|     MOVQ w+0(FP), regWork | ||||
|     MOVQ b+8(FP), regSwap | ||||
|     cswap(x1,x2,regSwap) | ||||
|     cswap(z1,z2,regSwap) | ||||
|     CHECK_BMI2ADX(LDIFADD, difAddLeg, difAddBmi2Adx) | ||||
|     #undef regWork | ||||
|     #undef regSwap | ||||
|     #undef ui | ||||
|     #undef x1 | ||||
|     #undef z1 | ||||
|     #undef x2 | ||||
|     #undef z2 | ||||
|     #undef b0 | ||||
|     #undef b1 | ||||
| 
 | ||||
| // func doubleAmd64(x, z *fp448.Elt) | ||||
| // doubleAmd64 calculates a point doubling (x1,z1) = 2*(x1,z1). | ||||
| //  stack = (t0,t1) are two fp.Elt of fp.Size bytes, and | ||||
| //          (b0,b1) are two-double precision fp.Elt of 2*fp.Size bytes. | ||||
| TEXT ·doubleAmd64(SB),NOSPLIT,$336-16 | ||||
|     // Parameters | ||||
|     #define x1 0(DI) | ||||
|     #define z1 0(SI) | ||||
|     // Local variables | ||||
|     #define t0 0*Size(SP) | ||||
|     #define t1 1*Size(SP) | ||||
|     #define b0 2*Size(SP) | ||||
|     #define b1 4*Size(SP) | ||||
|     MOVQ x+0(FP), DI | ||||
|     MOVQ z+8(FP), SI | ||||
|     CHECK_BMI2ADX(LDOUB,doubleLeg,doubleBmi2Adx) | ||||
|     #undef x1 | ||||
|     #undef z1 | ||||
|     #undef t0 | ||||
|     #undef t1 | ||||
|     #undef b0 | ||||
|     #undef b1 | ||||
|  | @ -1,100 +0,0 @@ | |||
| package x448 | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"math/bits" | ||||
| 
 | ||||
| 	"github.com/cloudflare/circl/math/fp448" | ||||
| ) | ||||
| 
 | ||||
| func doubleGeneric(x, z *fp448.Elt) { | ||||
| 	t0, t1 := &fp448.Elt{}, &fp448.Elt{} | ||||
| 	fp448.AddSub(x, z) | ||||
| 	fp448.Sqr(x, x) | ||||
| 	fp448.Sqr(z, z) | ||||
| 	fp448.Sub(t0, x, z) | ||||
| 	mulA24Generic(t1, t0) | ||||
| 	fp448.Add(t1, t1, z) | ||||
| 	fp448.Mul(x, x, z) | ||||
| 	fp448.Mul(z, t0, t1) | ||||
| } | ||||
| 
 | ||||
| func diffAddGeneric(w *[5]fp448.Elt, b uint) { | ||||
| 	mu, x1, z1, x2, z2 := &w[0], &w[1], &w[2], &w[3], &w[4] | ||||
| 	fp448.Cswap(x1, x2, b) | ||||
| 	fp448.Cswap(z1, z2, b) | ||||
| 	fp448.AddSub(x1, z1) | ||||
| 	fp448.Mul(z1, z1, mu) | ||||
| 	fp448.AddSub(x1, z1) | ||||
| 	fp448.Sqr(x1, x1) | ||||
| 	fp448.Sqr(z1, z1) | ||||
| 	fp448.Mul(x1, x1, z2) | ||||
| 	fp448.Mul(z1, z1, x2) | ||||
| } | ||||
| 
 | ||||
| func ladderStepGeneric(w *[5]fp448.Elt, b uint) { | ||||
| 	x1, x2, z2, x3, z3 := &w[0], &w[1], &w[2], &w[3], &w[4] | ||||
| 	t0 := &fp448.Elt{} | ||||
| 	t1 := &fp448.Elt{} | ||||
| 	fp448.AddSub(x2, z2) | ||||
| 	fp448.AddSub(x3, z3) | ||||
| 	fp448.Mul(t0, x2, z3) | ||||
| 	fp448.Mul(t1, x3, z2) | ||||
| 	fp448.AddSub(t0, t1) | ||||
| 	fp448.Cmov(x2, x3, b) | ||||
| 	fp448.Cmov(z2, z3, b) | ||||
| 	fp448.Sqr(x3, t0) | ||||
| 	fp448.Sqr(z3, t1) | ||||
| 	fp448.Mul(z3, x1, z3) | ||||
| 	fp448.Sqr(x2, x2) | ||||
| 	fp448.Sqr(z2, z2) | ||||
| 	fp448.Sub(t0, x2, z2) | ||||
| 	mulA24Generic(t1, t0) | ||||
| 	fp448.Add(t1, t1, z2) | ||||
| 	fp448.Mul(x2, x2, z2) | ||||
| 	fp448.Mul(z2, t0, t1) | ||||
| } | ||||
| 
 | ||||
| func mulA24Generic(z, x *fp448.Elt) { | ||||
| 	const A24 = 39082 | ||||
| 	const n = 8 | ||||
| 	var xx [7]uint64 | ||||
| 	for i := range xx { | ||||
| 		xx[i] = binary.LittleEndian.Uint64(x[i*n : (i+1)*n]) | ||||
| 	} | ||||
| 	h0, l0 := bits.Mul64(xx[0], A24) | ||||
| 	h1, l1 := bits.Mul64(xx[1], A24) | ||||
| 	h2, l2 := bits.Mul64(xx[2], A24) | ||||
| 	h3, l3 := bits.Mul64(xx[3], A24) | ||||
| 	h4, l4 := bits.Mul64(xx[4], A24) | ||||
| 	h5, l5 := bits.Mul64(xx[5], A24) | ||||
| 	h6, l6 := bits.Mul64(xx[6], A24) | ||||
| 
 | ||||
| 	l1, c0 := bits.Add64(h0, l1, 0) | ||||
| 	l2, c1 := bits.Add64(h1, l2, c0) | ||||
| 	l3, c2 := bits.Add64(h2, l3, c1) | ||||
| 	l4, c3 := bits.Add64(h3, l4, c2) | ||||
| 	l5, c4 := bits.Add64(h4, l5, c3) | ||||
| 	l6, c5 := bits.Add64(h5, l6, c4) | ||||
| 	l7, _ := bits.Add64(h6, 0, c5) | ||||
| 
 | ||||
| 	l0, c0 = bits.Add64(l0, l7, 0) | ||||
| 	l1, c1 = bits.Add64(l1, 0, c0) | ||||
| 	l2, c2 = bits.Add64(l2, 0, c1) | ||||
| 	l3, c3 = bits.Add64(l3, l7<<32, c2) | ||||
| 	l4, c4 = bits.Add64(l4, 0, c3) | ||||
| 	l5, c5 = bits.Add64(l5, 0, c4) | ||||
| 	l6, l7 = bits.Add64(l6, 0, c5) | ||||
| 
 | ||||
| 	xx[0], c0 = bits.Add64(l0, l7, 0) | ||||
| 	xx[1], c1 = bits.Add64(l1, 0, c0) | ||||
| 	xx[2], c2 = bits.Add64(l2, 0, c1) | ||||
| 	xx[3], c3 = bits.Add64(l3, l7<<32, c2) | ||||
| 	xx[4], c4 = bits.Add64(l4, 0, c3) | ||||
| 	xx[5], c5 = bits.Add64(l5, 0, c4) | ||||
| 	xx[6], _ = bits.Add64(l6, 0, c5) | ||||
| 
 | ||||
| 	for i := range xx { | ||||
| 		binary.LittleEndian.PutUint64(z[i*n:(i+1)*n], xx[i]) | ||||
| 	} | ||||
| } | ||||
|  | @ -1,11 +0,0 @@ | |||
| //go:build !amd64 || purego
 | ||||
| // +build !amd64 purego
 | ||||
| 
 | ||||
| package x448 | ||||
| 
 | ||||
| import fp "github.com/cloudflare/circl/math/fp448" | ||||
| 
 | ||||
| func double(x, z *fp.Elt)             { doubleGeneric(x, z) } | ||||
| func diffAdd(w *[5]fp.Elt, b uint)    { diffAddGeneric(w, b) } | ||||
| func ladderStep(w *[5]fp.Elt, b uint) { ladderStepGeneric(w, b) } | ||||
| func mulA24(z, x *fp.Elt)             { mulA24Generic(z, x) } | ||||
|  | @ -1,19 +0,0 @@ | |||
| /* | ||||
| Package x448 provides Diffie-Hellman functions as specified in RFC-7748. | ||||
| 
 | ||||
| Validation of public keys. | ||||
| 
 | ||||
| The Diffie-Hellman function, as described in RFC-7748 [1], works for any | ||||
| public key. However, if a different protocol requires contributory | ||||
| behaviour [2,3], then the public keys must be validated against low-order | ||||
| points [3,4]. To do that, the Shared function performs this validation | ||||
| internally and returns false when the public key is invalid (i.e., it | ||||
| is a low-order point). | ||||
| 
 | ||||
| References: | ||||
|   - [1] RFC7748 by Langley, Hamburg, Turner (https://rfc-editor.org/rfc/rfc7748.txt)
 | ||||
|   - [2] Curve25519 by Bernstein (https://cr.yp.to/ecdh.html)
 | ||||
|   - [3] Bernstein (https://cr.yp.to/ecdh.html#validate)
 | ||||
|   - [4] Cremers&Jackson (https://eprint.iacr.org/2019/526)
 | ||||
| */ | ||||
| package x448 | ||||
|  | @ -1,46 +0,0 @@ | |||
| package x448 | ||||
| 
 | ||||
| import ( | ||||
| 	"crypto/subtle" | ||||
| 
 | ||||
| 	fp "github.com/cloudflare/circl/math/fp448" | ||||
| ) | ||||
| 
 | ||||
| // Size is the length in bytes of a X448 key.
 | ||||
| const Size = 56 | ||||
| 
 | ||||
| // Key represents a X448 key.
 | ||||
| type Key [Size]byte | ||||
| 
 | ||||
| func (k *Key) clamp(in *Key) *Key { | ||||
| 	*k = *in | ||||
| 	k[0] &= 252 | ||||
| 	k[55] |= 128 | ||||
| 	return k | ||||
| } | ||||
| 
 | ||||
| // isValidPubKey verifies if the public key is not a low-order point.
 | ||||
| func (k *Key) isValidPubKey() bool { | ||||
| 	fp.Modp((*fp.Elt)(k)) | ||||
| 	isLowOrder := false | ||||
| 	for _, P := range lowOrderPoints { | ||||
| 		isLowOrder = isLowOrder || subtle.ConstantTimeCompare(P[:], k[:]) != 0 | ||||
| 	} | ||||
| 	return !isLowOrder | ||||
| } | ||||
| 
 | ||||
| // KeyGen obtains a public key given a secret key.
 | ||||
| func KeyGen(public, secret *Key) { | ||||
| 	ladderJoye(public.clamp(secret)) | ||||
| } | ||||
| 
 | ||||
| // Shared calculates Alice's shared key from Alice's secret key and Bob's
 | ||||
| // public key returning true on success. A failure case happens when the public
 | ||||
| // key is a low-order point, thus the shared key is all-zeros and the function
 | ||||
| // returns false.
 | ||||
| func Shared(shared, secret, public *Key) bool { | ||||
| 	validPk := *public | ||||
| 	ok := validPk.isValidPubKey() | ||||
| 	ladderMontgomery(shared.clamp(secret), &validPk) | ||||
| 	return ok | ||||
| } | ||||
|  | @ -1,460 +0,0 @@ | |||
| package x448 | ||||
| 
 | ||||
| import fp "github.com/cloudflare/circl/math/fp448" | ||||
| 
 | ||||
| // tableGenerator contains the set of points:
 | ||||
| //
 | ||||
| //	t[i] = (xi+1)/(xi-1),
 | ||||
| //
 | ||||
| // where (xi,yi) = 2^iG and G is the generator point
 | ||||
| // Size = (448)*(448/8) = 25088 bytes.
 | ||||
| var tableGenerator = [448 * fp.Size]byte{ | ||||
| 	/* (2^  0)P */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, | ||||
| 	/* (2^  1)P */ 0x37, 0xfa, 0xaa, 0x0d, 0x86, 0xa6, 0x24, 0xe9, 0x6c, 0x95, 0x08, 0x34, 0xba, 0x1a, 0x81, 0x3a, 0xae, 0x01, 0xa5, 0xa7, 0x05, 0x85, 0x96, 0x00, 0x06, 0x5a, 0xd7, 0xff, 0xee, 0x8e, 0x8f, 0x94, 0xd2, 0xdc, 0xd7, 0xfc, 0xe7, 0xe5, 0x99, 0x1d, 0x05, 0x46, 0x43, 0xe8, 0xbc, 0x12, 0xb7, 0xeb, 0x30, 0x5e, 0x7a, 0x85, 0x68, 0xed, 0x9d, 0x28, | ||||
| 	/* (2^  2)P */ 0xf1, 0x7d, 0x08, 0x2b, 0x32, 0x4a, 0x62, 0x80, 0x36, 0xe7, 0xa4, 0x76, 0x5a, 0x2a, 0x1e, 0xf7, 0x9e, 0x3c, 0x40, 0x46, 0x9a, 0x1b, 0x61, 0xc1, 0xbf, 0x1a, 0x1b, 0xae, 0x91, 0x80, 0xa3, 0x76, 0x6c, 0xd4, 0x8f, 0xa4, 0xee, 0x26, 0x39, 0x23, 0xa4, 0x80, 0xf4, 0x66, 0x92, 0xe4, 0xe1, 0x18, 0x76, 0xc5, 0xe2, 0x19, 0x87, 0xd5, 0xc3, 0xe8, | ||||
| 	/* (2^  3)P */ 0xfb, 0xc9, 0xf0, 0x07, 0xf2, 0x93, 0xd8, 0x50, 0x36, 0xed, 0xfb, 0xbd, 0xb2, 0xd3, 0xfc, 0xdf, 0xd5, 0x2a, 0x6e, 0x26, 0x09, 0xce, 0xd4, 0x07, 0x64, 0x9f, 0x40, 0x74, 0xad, 0x98, 0x2f, 0x1c, 0xb6, 0xdc, 0x2d, 0x42, 0xff, 0xbf, 0x97, 0xd8, 0xdb, 0xef, 0x99, 0xca, 0x73, 0x99, 0x1a, 0x04, 0x3b, 0x56, 0x2c, 0x1f, 0x87, 0x9d, 0x9f, 0x03, | ||||
| 	/* (2^  4)P */ 0x4c, 0x35, 0x97, 0xf7, 0x81, 0x2c, 0x84, 0xa6, 0xe0, 0xcb, 0xce, 0x37, 0x4c, 0x21, 0x1c, 0x67, 0xfa, 0xab, 0x18, 0x4d, 0xef, 0xd0, 0xf0, 0x44, 0xa9, 0xfb, 0xc0, 0x8e, 0xda, 0x57, 0xa1, 0xd8, 0xeb, 0x87, 0xf4, 0x17, 0xea, 0x66, 0x0f, 0x16, 0xea, 0xcd, 0x5f, 0x3e, 0x88, 0xea, 0x09, 0x68, 0x40, 0xdf, 0x43, 0xcc, 0x54, 0x61, 0x58, 0xaa, | ||||
| 	/* (2^  5)P */ 0x8d, 0xe7, 0x59, 0xd7, 0x5e, 0x63, 0x37, 0xa7, 0x3f, 0xd1, 0x49, 0x85, 0x01, 0xdd, 0x5e, 0xb3, 0xe6, 0x29, 0xcb, 0x25, 0x93, 0xdd, 0x08, 0x96, 0x83, 0x52, 0x76, 0x85, 0xf5, 0x5d, 0x02, 0xbf, 0xe9, 0x6d, 0x15, 0x27, 0xc1, 0x09, 0xd1, 0x14, 0x4d, 0x6e, 0xe8, 0xaf, 0x59, 0x58, 0x34, 0x9d, 0x2a, 0x99, 0x85, 0x26, 0xbe, 0x4b, 0x1e, 0xb9, | ||||
| 	/* (2^  6)P */ 0x8d, 0xce, 0x94, 0xe2, 0x18, 0x56, 0x0d, 0x82, 0x8e, 0xdf, 0x85, 0x01, 0x8f, 0x93, 0x3c, 0xc6, 0xbd, 0x61, 0xfb, 0xf4, 0x22, 0xc5, 0x16, 0x87, 0xd1, 0xb1, 0x9e, 0x09, 0xc5, 0x83, 0x2e, 0x4a, 0x07, 0x88, 0xee, 0xe0, 0x29, 0x8d, 0x2e, 0x1f, 0x88, 0xad, 0xfd, 0x18, 0x93, 0xb7, 0xed, 0x42, 0x86, 0x78, 0xf0, 0xb8, 0x70, 0xbe, 0x01, 0x67, | ||||
| 	/* (2^  7)P */ 0xdf, 0x62, 0x2d, 0x94, 0xc7, 0x35, 0x23, 0xda, 0x27, 0xbb, 0x2b, 0xdb, 0x30, 0x80, 0x68, 0x16, 0xa3, 0xae, 0xd7, 0xd2, 0xa7, 0x7c, 0xbf, 0x6a, 0x1d, 0x83, 0xde, 0x96, 0x0a, 0x43, 0xb6, 0x30, 0x37, 0xd6, 0xee, 0x63, 0x59, 0x9a, 0xbf, 0xa3, 0x30, 0x6c, 0xaf, 0x0c, 0xee, 0x3d, 0xcb, 0x35, 0x4b, 0x55, 0x5f, 0x84, 0x85, 0xcb, 0x4f, 0x1e, | ||||
| 	/* (2^  8)P */ 0x9d, 0x04, 0x68, 0x89, 0xa4, 0xa9, 0x0d, 0x87, 0xc1, 0x70, 0xf1, 0xeb, 0xfb, 0x47, 0x0a, 0xf0, 0xde, 0x67, 0xb7, 0x94, 0xcd, 0x36, 0x43, 0xa5, 0x49, 0x43, 0x67, 0xc3, 0xee, 0x3c, 0x6b, 0xec, 0xd0, 0x1a, 0xf4, 0xad, 0xef, 0x06, 0x4a, 0xe8, 0x46, 0x24, 0xd7, 0x93, 0xbf, 0xf0, 0xe3, 0x81, 0x61, 0xec, 0xea, 0x64, 0xfe, 0x67, 0xeb, 0xc7, | ||||
| 	/* (2^  9)P */ 0x95, 0x45, 0x79, 0xcf, 0x2c, 0xfd, 0x9b, 0xfe, 0x84, 0x46, 0x4b, 0x8f, 0xa1, 0xcf, 0xc3, 0x04, 0x94, 0x78, 0xdb, 0xc9, 0xa6, 0x01, 0x75, 0xa4, 0xb4, 0x93, 0x72, 0x43, 0xa7, 0x7d, 0xda, 0x31, 0x38, 0x54, 0xab, 0x4e, 0x3f, 0x89, 0xa6, 0xab, 0x57, 0xc0, 0x16, 0x65, 0xdb, 0x92, 0x96, 0xe4, 0xc8, 0xae, 0xe7, 0x4c, 0x7a, 0xeb, 0xbb, 0x5a, | ||||
| 	/* (2^ 10)P */ 0xbe, 0xfe, 0x86, 0xc3, 0x97, 0xe0, 0x6a, 0x18, 0x20, 0x21, 0xca, 0x22, 0x55, 0xa1, 0xeb, 0xf5, 0x74, 0xe5, 0xc9, 0x59, 0xa7, 0x92, 0x65, 0x15, 0x08, 0x71, 0xd1, 0x09, 0x7e, 0x83, 0xfc, 0xbc, 0x5a, 0x93, 0x38, 0x0d, 0x43, 0x42, 0xfd, 0x76, 0x30, 0xe8, 0x63, 0x60, 0x09, 0x8d, 0x6c, 0xd3, 0xf8, 0x56, 0x3d, 0x68, 0x47, 0xab, 0xa0, 0x1d, | ||||
| 	/* (2^ 11)P */ 0x38, 0x50, 0x1c, 0xb1, 0xac, 0x88, 0x8f, 0x38, 0xe3, 0x69, 0xe6, 0xfc, 0x4f, 0x8f, 0xe1, 0x9b, 0xb1, 0x1a, 0x09, 0x39, 0x19, 0xdf, 0xcd, 0x98, 0x7b, 0x64, 0x42, 0xf6, 0x11, 0xea, 0xc7, 0xe8, 0x92, 0x65, 0x00, 0x2c, 0x75, 0xb5, 0x94, 0x1e, 0x5b, 0xa6, 0x66, 0x81, 0x77, 0xf3, 0x39, 0x94, 0xac, 0xbd, 0xe4, 0x2a, 0x66, 0x84, 0x9c, 0x60, | ||||
| 	/* (2^ 12)P */ 0xb5, 0xb6, 0xd9, 0x03, 0x67, 0xa4, 0xa8, 0x0a, 0x4a, 0x2b, 0x9d, 0xfa, 0x13, 0xe1, 0x99, 0x25, 0x4a, 0x5c, 0x67, 0xb9, 0xb2, 0xb7, 0xdd, 0x1e, 0xaf, 0xeb, 0x63, 0x41, 0xb6, 0xb9, 0xa0, 0x87, 0x0a, 0xe0, 0x06, 0x07, 0xaa, 0x97, 0xf8, 0xf9, 0x38, 0x4f, 0xdf, 0x0c, 0x40, 0x7c, 0xc3, 0x98, 0xa9, 0x74, 0xf1, 0x5d, 0xda, 0xd1, 0xc0, 0x0a, | ||||
| 	/* (2^ 13)P */ 0xf2, 0x0a, 0xab, 0xab, 0x94, 0x50, 0xf0, 0xa3, 0x6f, 0xc6, 0x66, 0xba, 0xa6, 0xdc, 0x44, 0xdd, 0xd6, 0x08, 0xf4, 0xd3, 0xed, 0xb1, 0x40, 0x93, 0xee, 0xf6, 0xb8, 0x8e, 0xb4, 0x7c, 0xb9, 0x82, 0xc9, 0x9d, 0x45, 0x3b, 0x8e, 0x10, 0xcb, 0x70, 0x1e, 0xba, 0x3c, 0x62, 0x50, 0xda, 0xa9, 0x93, 0xb5, 0xd7, 0xd0, 0x6f, 0x29, 0x52, 0x95, 0xae, | ||||
| 	/* (2^ 14)P */ 0x14, 0x68, 0x69, 0x23, 0xa8, 0x44, 0x87, 0x9e, 0x22, 0x91, 0xe8, 0x92, 0xdf, 0xf7, 0xae, 0xba, 0x1c, 0x96, 0xe1, 0xc3, 0x94, 0xed, 0x6c, 0x95, 0xae, 0x96, 0xa7, 0x15, 0x9f, 0xf1, 0x17, 0x11, 0x92, 0x42, 0xd5, 0xcd, 0x18, 0xe7, 0xa9, 0xb5, 0x2f, 0xcd, 0xde, 0x6c, 0xc9, 0x7d, 0xfc, 0x7e, 0xbd, 0x7f, 0x10, 0x3d, 0x01, 0x00, 0x8d, 0x95, | ||||
| 	/* (2^ 15)P */ 0x3b, 0x76, 0x72, 0xae, 0xaf, 0x84, 0xf2, 0xf7, 0xd1, 0x6d, 0x13, 0x9c, 0x47, 0xe1, 0xb7, 0xa3, 0x19, 0x16, 0xee, 0x75, 0x45, 0xf6, 0x1a, 0x7b, 0x78, 0x49, 0x79, 0x05, 0x86, 0xf0, 0x7f, 0x9f, 0xfc, 0xc4, 0xbd, 0x86, 0xf3, 0x41, 0xa7, 0xfe, 0x01, 0xd5, 0x67, 0x16, 0x10, 0x5b, 0xa5, 0x16, 0xf3, 0x7f, 0x60, 0xce, 0xd2, 0x0c, 0x8e, 0x4b, | ||||
| 	/* (2^ 16)P */ 0x4a, 0x07, 0x99, 0x4a, 0x0f, 0x74, 0x91, 0x14, 0x68, 0xb9, 0x48, 0xb7, 0x44, 0x77, 0x9b, 0x4a, 0xe0, 0x68, 0x0e, 0x43, 0x4d, 0x98, 0x98, 0xbf, 0xa8, 0x3a, 0xb7, 0x6d, 0x2a, 0x9a, 0x77, 0x5f, 0x62, 0xf5, 0x6b, 0x4a, 0xb7, 0x7d, 0xe5, 0x09, 0x6b, 0xc0, 0x8b, 0x9c, 0x88, 0x37, 0x33, 0xf2, 0x41, 0xac, 0x22, 0x1f, 0xcf, 0x3b, 0x82, 0x34, | ||||
| 	/* (2^ 17)P */ 0x00, 0xc3, 0x78, 0x42, 0x32, 0x2e, 0xdc, 0xda, 0xb1, 0x96, 0x21, 0xa4, 0xe4, 0xbb, 0xe9, 0x9d, 0xbb, 0x0f, 0x93, 0xed, 0x26, 0x3d, 0xb5, 0xdb, 0x94, 0x31, 0x37, 0x07, 0xa2, 0xb2, 0xd5, 0x99, 0x0d, 0x93, 0xe1, 0xce, 0x3f, 0x0b, 0x96, 0x82, 0x47, 0xfe, 0x60, 0x6f, 0x8f, 0x61, 0x88, 0xd7, 0x05, 0x95, 0x0b, 0x46, 0x06, 0xb7, 0x32, 0x06, | ||||
| 	/* (2^ 18)P */ 0x44, 0xf5, 0x34, 0xdf, 0x2f, 0x9c, 0x5d, 0x9f, 0x53, 0x5c, 0x42, 0x8f, 0xc9, 0xdc, 0xd8, 0x40, 0xa2, 0xe7, 0x6a, 0x4a, 0x05, 0xf7, 0x86, 0x77, 0x2b, 0xae, 0x37, 0xed, 0x48, 0xfb, 0xf7, 0x62, 0x7c, 0x17, 0x59, 0x92, 0x41, 0x61, 0x93, 0x38, 0x30, 0xd1, 0xef, 0x54, 0x54, 0x03, 0x17, 0x57, 0x91, 0x15, 0x11, 0x33, 0xb5, 0xfa, 0xfb, 0x17, | ||||
| 	/* (2^ 19)P */ 0x29, 0xbb, 0xd4, 0xb4, 0x9c, 0xf1, 0x72, 0x94, 0xce, 0x6a, 0x29, 0xa8, 0x89, 0x18, 0x19, 0xf7, 0xb7, 0xcc, 0xee, 0x9a, 0x02, 0xe3, 0xc0, 0xb1, 0xe0, 0xee, 0x83, 0x78, 0xb4, 0x9e, 0x07, 0x87, 0xdf, 0xb0, 0x82, 0x26, 0x4e, 0xa4, 0x0c, 0x33, 0xaf, 0x40, 0x59, 0xb6, 0xdd, 0x52, 0x45, 0xf0, 0xb4, 0xf6, 0xe8, 0x4e, 0x4e, 0x79, 0x1a, 0x5d, | ||||
| 	/* (2^ 20)P */ 0x27, 0x33, 0x4d, 0x4c, 0x6b, 0x4f, 0x75, 0xb1, 0xbc, 0x1f, 0xab, 0x5b, 0x2b, 0xf0, 0x1c, 0x57, 0x86, 0xdd, 0xfd, 0x60, 0xb0, 0x8c, 0xe7, 0x9a, 0xe5, 0x5c, 0xeb, 0x11, 0x3a, 0xda, 0x22, 0x25, 0x99, 0x06, 0x8d, 0xf4, 0xaf, 0x29, 0x7a, 0xc9, 0xe5, 0xd2, 0x16, 0x9e, 0xd4, 0x63, 0x1d, 0x64, 0xa6, 0x47, 0x96, 0x37, 0x6f, 0x93, 0x2c, 0xcc, | ||||
| 	/* (2^ 21)P */ 0xc1, 0x94, 0x74, 0x86, 0x75, 0xf2, 0x91, 0x58, 0x23, 0x85, 0x63, 0x76, 0x54, 0xc7, 0xb4, 0x8c, 0xbc, 0x4e, 0xc4, 0xa7, 0xba, 0xa0, 0x55, 0x26, 0x71, 0xd5, 0x33, 0x72, 0xc9, 0xad, 0x1e, 0xf9, 0x5d, 0x78, 0x70, 0x93, 0x4e, 0x85, 0xfc, 0x39, 0x06, 0x73, 0x76, 0xff, 0xe8, 0x64, 0x69, 0x42, 0x45, 0xb2, 0x69, 0xb5, 0x32, 0xe7, 0x2c, 0xde, | ||||
| 	/* (2^ 22)P */ 0xde, 0x16, 0xd8, 0x33, 0x49, 0x32, 0xe9, 0x0e, 0x3a, 0x60, 0xee, 0x2e, 0x24, 0x75, 0xe3, 0x9c, 0x92, 0x07, 0xdb, 0xad, 0x92, 0xf5, 0x11, 0xdf, 0xdb, 0xb0, 0x17, 0x5c, 0xd6, 0x1a, 0x70, 0x00, 0xb7, 0xe2, 0x18, 0xec, 0xdc, 0xc2, 0x02, 0x93, 0xb3, 0xc8, 0x3f, 0x4f, 0x1b, 0x96, 0xe6, 0x33, 0x8c, 0xfb, 0xcc, 0xa5, 0x4e, 0xe8, 0xe7, 0x11, | ||||
| 	/* (2^ 23)P */ 0x05, 0x7a, 0x74, 0x52, 0xf8, 0xdf, 0x0d, 0x7c, 0x6a, 0x1a, 0x4e, 0x9a, 0x02, 0x1d, 0xae, 0x77, 0xf8, 0x8e, 0xf9, 0xa2, 0x38, 0x54, 0x50, 0xb2, 0x2c, 0x08, 0x9d, 0x9b, 0x9f, 0xfb, 0x2b, 0x06, 0xde, 0x9d, 0xc2, 0x03, 0x0b, 0x22, 0x2b, 0x10, 0x5b, 0x3a, 0x73, 0x29, 0x8e, 0x3e, 0x37, 0x08, 0x2c, 0x3b, 0xf8, 0x80, 0xc1, 0x66, 0x1e, 0x98, | ||||
| 	/* (2^ 24)P */ 0xd8, 0xd6, 0x3e, 0xcd, 0x63, 0x8c, 0x2b, 0x41, 0x81, 0xc0, 0x0c, 0x06, 0x87, 0xd6, 0xe7, 0x92, 0xfe, 0xf1, 0x0c, 0x4a, 0x84, 0x5b, 0xaf, 0x40, 0x53, 0x6f, 0x60, 0xd6, 0x6b, 0x76, 0x4b, 0xc2, 0xad, 0xc9, 0xb6, 0xb6, 0x6a, 0xa2, 0xb3, 0xf5, 0xf5, 0xc2, 0x55, 0x83, 0xb2, 0xd3, 0xe9, 0x41, 0x6c, 0x63, 0x51, 0xb8, 0x81, 0x74, 0xc8, 0x2c, | ||||
| 	/* (2^ 25)P */ 0xb2, 0xaf, 0x1c, 0xee, 0x07, 0xb0, 0x58, 0xa8, 0x2c, 0x6a, 0xc9, 0x2d, 0x62, 0x28, 0x75, 0x0c, 0x40, 0xb6, 0x11, 0x33, 0x96, 0x80, 0x28, 0x6d, 0xd5, 0x9e, 0x87, 0x90, 0x01, 0x66, 0x1d, 0x1c, 0xf8, 0xb4, 0x92, 0xac, 0x38, 0x18, 0x05, 0xc2, 0x4c, 0x4b, 0x54, 0x7d, 0x80, 0x46, 0x87, 0x2d, 0x99, 0x8e, 0x70, 0x80, 0x69, 0x71, 0x8b, 0xed, | ||||
| 	/* (2^ 26)P */ 0x37, 0xa7, 0x6b, 0x71, 0x36, 0x75, 0x8e, 0xff, 0x0f, 0x42, 0xda, 0x5a, 0x46, 0xa6, 0x97, 0x79, 0x7e, 0x30, 0xb3, 0x8f, 0xc7, 0x3a, 0xa0, 0xcb, 0x1d, 0x9c, 0x78, 0x77, 0x36, 0xc2, 0xe7, 0xf4, 0x2f, 0x29, 0x07, 0xb1, 0x07, 0xfd, 0xed, 0x1b, 0x39, 0x77, 0x06, 0x38, 0x77, 0x0f, 0x50, 0x31, 0x12, 0xbf, 0x92, 0xbf, 0x72, 0x79, 0x54, 0xa9, | ||||
| 	/* (2^ 27)P */ 0xbd, 0x4d, 0x46, 0x6b, 0x1a, 0x80, 0x46, 0x2d, 0xed, 0xfd, 0x64, 0x6d, 0x94, 0xbc, 0x4a, 0x6e, 0x0c, 0x12, 0xf6, 0x12, 0xab, 0x54, 0x88, 0xd3, 0x85, 0xac, 0x51, 0xae, 0x6f, 0xca, 0xc4, 0xb7, 0xec, 0x22, 0x54, 0x6d, 0x80, 0xb2, 0x1c, 0x63, 0x33, 0x76, 0x6b, 0x8e, 0x6d, 0x59, 0xcd, 0x73, 0x92, 0x5f, 0xff, 0xad, 0x10, 0x35, 0x70, 0x5f, | ||||
| 	/* (2^ 28)P */ 0xb3, 0x84, 0xde, 0xc8, 0x04, 0x43, 0x63, 0xfa, 0x29, 0xd9, 0xf0, 0x69, 0x65, 0x5a, 0x0c, 0xe8, 0x2e, 0x0b, 0xfe, 0xb0, 0x7a, 0x42, 0xb3, 0xc3, 0xfc, 0xe6, 0xb8, 0x92, 0x29, 0xae, 0xed, 0xec, 0xd5, 0xe8, 0x4a, 0xa1, 0xbd, 0x3b, 0xd3, 0xc0, 0x07, 0xab, 0x65, 0x65, 0x35, 0x9a, 0xa6, 0x5e, 0x78, 0x18, 0x76, 0x1c, 0x15, 0x49, 0xe6, 0x75, | ||||
| 	/* (2^ 29)P */ 0x45, 0xb3, 0x92, 0xa9, 0xc3, 0xb8, 0x11, 0x68, 0x64, 0x3a, 0x83, 0x5d, 0xa8, 0x94, 0x6a, 0x9d, 0xaa, 0x27, 0x9f, 0x98, 0x5d, 0xc0, 0x29, 0xf0, 0xc0, 0x4b, 0x14, 0x3c, 0x05, 0xe7, 0xf8, 0xbd, 0x38, 0x22, 0x96, 0x75, 0x65, 0x5e, 0x0d, 0x3f, 0xbb, 0x6f, 0xe8, 0x3f, 0x96, 0x76, 0x9f, 0xba, 0xd9, 0x44, 0x92, 0x96, 0x22, 0xe7, 0x52, 0xe7, | ||||
| 	/* (2^ 30)P */ 0xf4, 0xa3, 0x95, 0x90, 0x47, 0xdf, 0x7d, 0xdc, 0xf4, 0x13, 0x87, 0x67, 0x7d, 0x4f, 0x9d, 0xa0, 0x00, 0x46, 0x72, 0x08, 0xc3, 0xa2, 0x7a, 0x3e, 0xe7, 0x6d, 0x52, 0x7c, 0x11, 0x36, 0x50, 0x83, 0x89, 0x64, 0xcb, 0x1f, 0x08, 0x83, 0x46, 0xcb, 0xac, 0xa6, 0xd8, 0x9c, 0x1b, 0xe8, 0x05, 0x47, 0xc7, 0x26, 0x06, 0x83, 0x39, 0xe9, 0xb1, 0x1c, | ||||
| 	/* (2^ 31)P */ 0x11, 0xe8, 0xc8, 0x42, 0xbf, 0x30, 0x9c, 0xa3, 0xf1, 0x85, 0x96, 0x95, 0x4f, 0x4f, 0x52, 0xa2, 0xf5, 0x8b, 0x68, 0x24, 0x16, 0xac, 0x9b, 0xa9, 0x27, 0x28, 0x0e, 0x84, 0x03, 0x46, 0x22, 0x5f, 0xf7, 0x0d, 0xa6, 0x85, 0x88, 0xc1, 0x45, 0x4b, 0x85, 0x1a, 0x10, 0x7f, 0xc9, 0x94, 0x20, 0xb0, 0x04, 0x28, 0x12, 0x30, 0xb9, 0xe6, 0x40, 0x6b, | ||||
| 	/* (2^ 32)P */ 0xac, 0x1b, 0x57, 0xb6, 0x42, 0xdb, 0x81, 0x8d, 0x76, 0xfd, 0x9b, 0x1c, 0x29, 0x30, 0xd5, 0x3a, 0xcc, 0x53, 0xd9, 0x26, 0x7a, 0x0f, 0x9c, 0x2e, 0x79, 0xf5, 0x62, 0xeb, 0x61, 0x9d, 0x9b, 0x80, 0x39, 0xcd, 0x60, 0x2e, 0x1f, 0x08, 0x22, 0xbc, 0x19, 0xb3, 0x2a, 0x43, 0x44, 0xf2, 0x4e, 0x66, 0xf4, 0x36, 0xa6, 0xa7, 0xbc, 0xa4, 0x15, 0x7e, | ||||
| 	/* (2^ 33)P */ 0xc1, 0x90, 0x8a, 0xde, 0xff, 0x78, 0xc3, 0x73, 0x16, 0xee, 0x76, 0xa0, 0x84, 0x60, 0x8d, 0xe6, 0x82, 0x0f, 0xde, 0x4e, 0xc5, 0x99, 0x34, 0x06, 0x90, 0x44, 0x55, 0xf8, 0x91, 0xd8, 0xe1, 0xe4, 0x2c, 0x8a, 0xde, 0x94, 0x1e, 0x78, 0x25, 0x3d, 0xfd, 0xd8, 0x59, 0x7d, 0xaf, 0x6e, 0xbe, 0x96, 0xbe, 0x3c, 0x16, 0x23, 0x0f, 0x4c, 0xa4, 0x28, | ||||
| 	/* (2^ 34)P */ 0xba, 0x11, 0x35, 0x57, 0x03, 0xb6, 0xf4, 0x24, 0x89, 0xb8, 0x5a, 0x0d, 0x50, 0x9c, 0xaa, 0x51, 0x7f, 0xa4, 0x0e, 0xfc, 0x71, 0xb3, 0x3b, 0xf1, 0x96, 0x50, 0x23, 0x15, 0xf5, 0xf5, 0xd4, 0x23, 0xdc, 0x8b, 0x26, 0x9e, 0xae, 0xb7, 0x50, 0xcd, 0xc4, 0x25, 0xf6, 0x75, 0x40, 0x9c, 0x37, 0x79, 0x33, 0x60, 0xd4, 0x4b, 0x13, 0x32, 0xee, 0xe2, | ||||
| 	/* (2^ 35)P */ 0x43, 0xb8, 0x56, 0x59, 0xf0, 0x68, 0x23, 0xb3, 0xea, 0x70, 0x58, 0x4c, 0x1e, 0x5a, 0x16, 0x54, 0x03, 0xb2, 0xf4, 0x73, 0xb6, 0xd9, 0x5c, 0x9c, 0x6f, 0xcf, 0x82, 0x2e, 0x54, 0x15, 0x46, 0x2c, 0xa3, 0xda, 0x4e, 0x87, 0xf5, 0x2b, 0xba, 0x91, 0xa3, 0xa0, 0x89, 0xba, 0x48, 0x2b, 0xfa, 0x64, 0x02, 0x7f, 0x78, 0x03, 0xd1, 0xe8, 0x3b, 0xe9, | ||||
| 	/* (2^ 36)P */ 0x15, 0xa4, 0x71, 0xd4, 0x0c, 0x24, 0xe9, 0x07, 0xa1, 0x43, 0xf4, 0x7f, 0xbb, 0xa2, 0xa6, 0x6b, 0xfa, 0xb7, 0xea, 0x58, 0xd1, 0x96, 0xb0, 0x24, 0x5c, 0xc7, 0x37, 0x4e, 0x60, 0x0f, 0x40, 0xf2, 0x2f, 0x44, 0x70, 0xea, 0x80, 0x63, 0xfe, 0xfc, 0x46, 0x59, 0x12, 0x27, 0xb5, 0x27, 0xfd, 0xb7, 0x73, 0x0b, 0xca, 0x8b, 0xc2, 0xd3, 0x71, 0x08, | ||||
| 	/* (2^ 37)P */ 0x26, 0x0e, 0xd7, 0x52, 0x6f, 0xf1, 0xf2, 0x9d, 0xb8, 0x3d, 0xbd, 0xd4, 0x75, 0x97, 0xd8, 0xbf, 0xa8, 0x86, 0x96, 0xa5, 0x80, 0xa0, 0x45, 0x75, 0xf6, 0x77, 0x71, 0xdb, 0x77, 0x96, 0x55, 0x99, 0x31, 0xd0, 0x4f, 0x34, 0xf4, 0x35, 0x39, 0x41, 0xd3, 0x7d, 0xf7, 0xe2, 0x74, 0xde, 0xbe, 0x5b, 0x1f, 0x39, 0x10, 0x21, 0xa3, 0x4d, 0x3b, 0xc8, | ||||
| 	/* (2^ 38)P */ 0x04, 0x00, 0x2a, 0x45, 0xb2, 0xaf, 0x9b, 0x18, 0x6a, 0xeb, 0x96, 0x28, 0xa4, 0x77, 0xd0, 0x13, 0xcf, 0x17, 0x65, 0xe8, 0xc5, 0x81, 0x28, 0xad, 0x39, 0x7a, 0x0b, 0xaa, 0x55, 0x2b, 0xf3, 0xfc, 0x86, 0x40, 0xad, 0x0d, 0x1e, 0x28, 0xa2, 0x2d, 0xc5, 0xd6, 0x04, 0x15, 0xa2, 0x30, 0x3d, 0x12, 0x8e, 0xd6, 0xb5, 0xf7, 0x69, 0xbb, 0x84, 0x20, | ||||
| 	/* (2^ 39)P */ 0xd7, 0x7a, 0x77, 0x2c, 0xfb, 0x81, 0x80, 0xe9, 0x1e, 0xc6, 0x36, 0x31, 0x79, 0xc3, 0x7c, 0xa9, 0x57, 0x6b, 0xb5, 0x70, 0xfb, 0xe4, 0xa1, 0xff, 0xfd, 0x21, 0xa5, 0x7c, 0xfa, 0x44, 0xba, 0x0d, 0x96, 0x3d, 0xc4, 0x5c, 0x39, 0x52, 0x87, 0xd7, 0x22, 0x0f, 0x52, 0x88, 0x91, 0x87, 0x96, 0xac, 0xfa, 0x3b, 0xdf, 0xdc, 0x83, 0x8c, 0x99, 0x29, | ||||
| 	/* (2^ 40)P */ 0x98, 0x6b, 0x3a, 0x8d, 0x83, 0x17, 0xe1, 0x62, 0xd8, 0x80, 0x4c, 0x97, 0xce, 0x6b, 0xaa, 0x10, 0xa7, 0xc4, 0xe9, 0xeb, 0xa5, 0xfb, 0xc9, 0xdd, 0x2d, 0xeb, 0xfc, 0x9a, 0x71, 0xcd, 0x68, 0x6e, 0xc0, 0x35, 0x64, 0x62, 0x1b, 0x95, 0x12, 0xe8, 0x53, 0xec, 0xf0, 0xf4, 0x86, 0x86, 0x78, 0x18, 0xc4, 0xc6, 0xbc, 0x5a, 0x59, 0x8f, 0x7c, 0x7e, | ||||
| 	/* (2^ 41)P */ 0x7f, 0xd7, 0x1e, 0xc5, 0x83, 0xdc, 0x1f, 0xbe, 0x0b, 0xcf, 0x2e, 0x01, 0x01, 0xed, 0xac, 0x17, 0x3b, 0xed, 0xa4, 0x30, 0x96, 0x0e, 0x14, 0x7e, 0x19, 0x2b, 0xa5, 0x67, 0x1e, 0xb3, 0x34, 0x03, 0xa8, 0xbb, 0x0a, 0x7d, 0x08, 0x2d, 0xd5, 0x53, 0x19, 0x6f, 0x13, 0xd5, 0xc0, 0x90, 0x8a, 0xcc, 0xc9, 0x5c, 0xab, 0x24, 0xd7, 0x03, 0xf6, 0x57, | ||||
| 	/* (2^ 42)P */ 0x49, 0xcb, 0xb4, 0x96, 0x5f, 0xa6, 0xf8, 0x71, 0x6f, 0x59, 0xad, 0x05, 0x24, 0x2d, 0xaf, 0x67, 0xa8, 0xbe, 0x95, 0xdf, 0x0d, 0x28, 0x5a, 0x7f, 0x6e, 0x87, 0x8c, 0x6e, 0x67, 0x0c, 0xf4, 0xe0, 0x1c, 0x30, 0xc2, 0x66, 0xae, 0x20, 0xa1, 0x34, 0xec, 0x9c, 0xbc, 0xae, 0x3d, 0xa1, 0x28, 0x28, 0x95, 0x1d, 0xc9, 0x3a, 0xa8, 0xfd, 0xfc, 0xa1, | ||||
| 	/* (2^ 43)P */ 0xe2, 0x2b, 0x9d, 0xed, 0x02, 0x99, 0x67, 0xbb, 0x2e, 0x16, 0x62, 0x05, 0x70, 0xc7, 0x27, 0xb9, 0x1c, 0x3f, 0xf2, 0x11, 0x01, 0xd8, 0x51, 0xa4, 0x18, 0x92, 0xa9, 0x5d, 0xfb, 0xa9, 0xe4, 0x42, 0xba, 0x38, 0x34, 0x1a, 0x4a, 0xc5, 0x6a, 0x37, 0xde, 0xa7, 0x0c, 0xb4, 0x7e, 0x7f, 0xde, 0xa6, 0xee, 0xcd, 0x55, 0x57, 0x05, 0x06, 0xfd, 0x5d, | ||||
| 	/* (2^ 44)P */ 0x2f, 0x32, 0xcf, 0x2e, 0x2c, 0x7b, 0xbe, 0x9a, 0x0c, 0x57, 0x35, 0xf8, 0x87, 0xda, 0x9c, 0xec, 0x48, 0xf2, 0xbb, 0xe2, 0xda, 0x10, 0x58, 0x20, 0xc6, 0xd3, 0x87, 0xe9, 0xc7, 0x26, 0xd1, 0x9a, 0x46, 0x87, 0x90, 0xda, 0xdc, 0xde, 0xc3, 0xb3, 0xf2, 0xe8, 0x6f, 0x4a, 0xe6, 0xe8, 0x9d, 0x98, 0x36, 0x20, 0x03, 0x47, 0x15, 0x3f, 0x64, 0x59, | ||||
| 	/* (2^ 45)P */ 0xd4, 0x71, 0x49, 0x0a, 0x67, 0x97, 0xaa, 0x3f, 0xf4, 0x1b, 0x3a, 0x6e, 0x5e, 0x17, 0xcc, 0x0a, 0x8f, 0x81, 0x6a, 0x41, 0x38, 0x77, 0x40, 0x8a, 0x11, 0x42, 0x62, 0xd2, 0x50, 0x32, 0x79, 0x78, 0x28, 0xc2, 0x2e, 0x10, 0x01, 0x94, 0x30, 0x4f, 0x7f, 0x18, 0x17, 0x56, 0x85, 0x4e, 0xad, 0xf7, 0xcb, 0x87, 0x3c, 0x3f, 0x50, 0x2c, 0xc0, 0xba, | ||||
| 	/* (2^ 46)P */ 0xbc, 0x30, 0x8e, 0x65, 0x8e, 0x57, 0x5b, 0x38, 0x7a, 0xd4, 0x95, 0x52, 0x7a, 0x32, 0x59, 0x69, 0xcd, 0x9d, 0x47, 0x34, 0x5b, 0x55, 0xa5, 0x24, 0x60, 0xdd, 0xc0, 0xc1, 0x62, 0x73, 0x44, 0xae, 0x4c, 0x9c, 0x65, 0x55, 0x1b, 0x9d, 0x8a, 0x29, 0xb0, 0x1a, 0x52, 0xa8, 0xf1, 0xe6, 0x9a, 0xb3, 0xf6, 0xa3, 0xc9, 0x0a, 0x70, 0x7d, 0x0f, 0xee, | ||||
| 	/* (2^ 47)P */ 0x77, 0xd3, 0xe5, 0x8e, 0xfa, 0x00, 0xeb, 0x1b, 0x7f, 0xdc, 0x68, 0x3f, 0x92, 0xbd, 0xb7, 0x0b, 0xb7, 0xb5, 0x24, 0xdf, 0xc5, 0x67, 0x53, 0xd4, 0x36, 0x79, 0xc4, 0x7b, 0x57, 0xbc, 0x99, 0x97, 0x60, 0xef, 0xe4, 0x01, 0xa1, 0xa7, 0xaa, 0x12, 0x36, 0x29, 0xb1, 0x03, 0xc2, 0x83, 0x1c, 0x2b, 0x83, 0xef, 0x2e, 0x2c, 0x23, 0x92, 0xfd, 0xd1, | ||||
| 	/* (2^ 48)P */ 0x94, 0xef, 0x03, 0x59, 0xfa, 0x8a, 0x18, 0x76, 0xee, 0x58, 0x08, 0x4d, 0x44, 0xce, 0xf1, 0x52, 0x33, 0x49, 0xf6, 0x69, 0x71, 0xe3, 0xa9, 0xbc, 0x86, 0xe3, 0x43, 0xde, 0x33, 0x7b, 0x90, 0x8b, 0x3e, 0x7d, 0xd5, 0x4a, 0xf0, 0x23, 0x99, 0xa6, 0xea, 0x5f, 0x08, 0xe5, 0xb9, 0x49, 0x8b, 0x0d, 0x6a, 0x21, 0xab, 0x07, 0x62, 0xcd, 0xc4, 0xbe, | ||||
| 	/* (2^ 49)P */ 0x61, 0xbf, 0x70, 0x14, 0xfa, 0x4e, 0x9e, 0x7c, 0x0c, 0xf8, 0xb2, 0x48, 0x71, 0x62, 0x83, 0xd6, 0xd1, 0xdc, 0x9c, 0x29, 0x66, 0xb1, 0x34, 0x9c, 0x8d, 0xe6, 0x88, 0xaf, 0xbe, 0xdc, 0x4d, 0xeb, 0xb0, 0xe7, 0x28, 0xae, 0xb2, 0x05, 0x56, 0xc6, 0x0e, 0x10, 0x26, 0xab, 0x2c, 0x59, 0x72, 0x03, 0x66, 0xfe, 0x8f, 0x2c, 0x51, 0x2d, 0xdc, 0xae, | ||||
| 	/* (2^ 50)P */ 0xdc, 0x63, 0xf1, 0x8b, 0x5c, 0x65, 0x0b, 0xf1, 0xa6, 0x22, 0xe2, 0xd9, 0xdb, 0x49, 0xb1, 0x3c, 0x47, 0xc2, 0xfe, 0xac, 0x86, 0x07, 0x52, 0xec, 0xb0, 0x08, 0x69, 0xfb, 0xd1, 0x06, 0xdc, 0x48, 0x5c, 0x3d, 0xb2, 0x4d, 0xb8, 0x1a, 0x4e, 0xda, 0xb9, 0xc1, 0x2b, 0xab, 0x4b, 0x62, 0x81, 0x21, 0x9a, 0xfc, 0x3d, 0x39, 0x83, 0x11, 0x36, 0xeb, | ||||
| 	/* (2^ 51)P */ 0x94, 0xf3, 0x17, 0xef, 0xf9, 0x60, 0x54, 0xc3, 0xd7, 0x27, 0x35, 0xc5, 0x98, 0x5e, 0xf6, 0x63, 0x6c, 0xa0, 0x4a, 0xd3, 0xa3, 0x98, 0xd9, 0x42, 0xe3, 0xf1, 0xf8, 0x81, 0x96, 0xa9, 0xea, 0x6d, 0x4b, 0x8e, 0x33, 0xca, 0x94, 0x0d, 0xa0, 0xf7, 0xbb, 0x64, 0xa3, 0x36, 0x6f, 0xdc, 0x5a, 0x94, 0x42, 0xca, 0x06, 0xb2, 0x2b, 0x9a, 0x9f, 0x71, | ||||
| 	/* (2^ 52)P */ 0xec, 0xdb, 0xa6, 0x1f, 0xdf, 0x15, 0x36, 0xa3, 0xda, 0x8a, 0x7a, 0xb6, 0xa7, 0xe3, 0xaf, 0x52, 0xe0, 0x8d, 0xe8, 0xf2, 0x44, 0x20, 0xeb, 0xa1, 0x20, 0xc4, 0x65, 0x3c, 0x7c, 0x6c, 0x49, 0xed, 0x2f, 0x66, 0x23, 0x68, 0x61, 0x91, 0x40, 0x9f, 0x50, 0x19, 0xd1, 0x84, 0xa7, 0xe2, 0xed, 0x34, 0x37, 0xe3, 0xe4, 0x11, 0x7f, 0x87, 0x55, 0x0f, | ||||
| 	/* (2^ 53)P */ 0xb3, 0xa1, 0x0f, 0xb0, 0x48, 0xc0, 0x4d, 0x96, 0xa7, 0xcf, 0x5a, 0x81, 0xb8, 0x4a, 0x46, 0xef, 0x0a, 0xd3, 0x40, 0x7e, 0x02, 0xe3, 0x63, 0xaa, 0x50, 0xd1, 0x2a, 0x37, 0x22, 0x4a, 0x7f, 0x4f, 0xb6, 0xf9, 0x01, 0x82, 0x78, 0x3d, 0x93, 0x14, 0x11, 0x8a, 0x90, 0x60, 0xcd, 0x45, 0x4e, 0x7b, 0x42, 0xb9, 0x3e, 0x6e, 0x68, 0x1f, 0x36, 0x41, | ||||
| 	/* (2^ 54)P */ 0x13, 0x73, 0x0e, 0x4f, 0x79, 0x93, 0x9e, 0x29, 0x70, 0x7b, 0x4a, 0x59, 0x1a, 0x9a, 0xf4, 0x55, 0x08, 0xf0, 0xdb, 0x17, 0x58, 0xec, 0x64, 0xad, 0x7f, 0x29, 0xeb, 0x3f, 0x85, 0x4e, 0x60, 0x28, 0x98, 0x1f, 0x73, 0x4e, 0xe6, 0xa8, 0xab, 0xd5, 0xd6, 0xfc, 0xa1, 0x36, 0x6d, 0x15, 0xc6, 0x13, 0x83, 0xa0, 0xc2, 0x6e, 0xd9, 0xdb, 0xc9, 0xcc, | ||||
| 	/* (2^ 55)P */ 0xff, 0xd8, 0x52, 0xa3, 0xdc, 0x99, 0xcf, 0x3e, 0x19, 0xb3, 0x68, 0xd0, 0xb5, 0x0d, 0xb8, 0xee, 0x3f, 0xef, 0x6e, 0xc0, 0x38, 0x28, 0x44, 0x92, 0x78, 0x91, 0x1a, 0x08, 0x78, 0x6c, 0x65, 0x24, 0xf3, 0xa2, 0x3d, 0xf2, 0xe5, 0x79, 0x62, 0x69, 0x29, 0xf4, 0x22, 0xc5, 0xdb, 0x6a, 0xae, 0xf4, 0x44, 0xa3, 0x6f, 0xc7, 0x86, 0xab, 0xef, 0xef, | ||||
| 	/* (2^ 56)P */ 0xbf, 0x54, 0x9a, 0x09, 0x5d, 0x17, 0xd0, 0xde, 0xfb, 0xf5, 0xca, 0xff, 0x13, 0x20, 0x88, 0x82, 0x3a, 0xe2, 0xd0, 0x3b, 0xfb, 0x05, 0x76, 0xd1, 0xc0, 0x02, 0x71, 0x3b, 0x94, 0xe8, 0xc9, 0x84, 0xcf, 0xa4, 0xe9, 0x28, 0x7b, 0xf5, 0x09, 0xc3, 0x2b, 0x22, 0x40, 0xf1, 0x68, 0x24, 0x24, 0x7d, 0x9f, 0x6e, 0xcd, 0xfe, 0xb0, 0x19, 0x61, 0xf5, | ||||
| 	/* (2^ 57)P */ 0xe8, 0x63, 0x51, 0xb3, 0x95, 0x6b, 0x7b, 0x74, 0x92, 0x52, 0x45, 0xa4, 0xed, 0xea, 0x0e, 0x0d, 0x2b, 0x01, 0x1e, 0x2c, 0xbc, 0x91, 0x06, 0x69, 0xdb, 0x1f, 0xb5, 0x77, 0x1d, 0x56, 0xf5, 0xb4, 0x02, 0x80, 0x49, 0x56, 0x12, 0xce, 0x86, 0x05, 0xc9, 0xd9, 0xae, 0xf3, 0x6d, 0xe6, 0x3f, 0x40, 0x52, 0xe9, 0x49, 0x2b, 0x31, 0x06, 0x86, 0x14, | ||||
| 	/* (2^ 58)P */ 0xf5, 0x09, 0x3b, 0xd2, 0xff, 0xdf, 0x11, 0xa5, 0x1c, 0x99, 0xe8, 0x1b, 0xa4, 0x2c, 0x7d, 0x8e, 0xc8, 0xf7, 0x03, 0x46, 0xfa, 0xb6, 0xde, 0x73, 0x91, 0x7e, 0x5a, 0x7a, 0xd7, 0x9a, 0x5b, 0x80, 0x24, 0x62, 0x5e, 0x92, 0xf1, 0xa3, 0x45, 0xa3, 0x43, 0x92, 0x8a, 0x2a, 0x5b, 0x0c, 0xb4, 0xc8, 0xad, 0x1c, 0xb6, 0x6c, 0x5e, 0x81, 0x18, 0x91, | ||||
| 	/* (2^ 59)P */ 0x96, 0xb3, 0xca, 0x2b, 0xe3, 0x7a, 0x59, 0x72, 0x17, 0x74, 0x29, 0x21, 0xe7, 0x78, 0x07, 0xad, 0xda, 0xb6, 0xcd, 0xf9, 0x27, 0x4d, 0xc8, 0xf2, 0x98, 0x22, 0xca, 0xf2, 0x33, 0x74, 0x7a, 0xdd, 0x1e, 0x71, 0xec, 0xe3, 0x3f, 0xe2, 0xa2, 0xd2, 0x38, 0x75, 0xb0, 0xd0, 0x0a, 0xcf, 0x7d, 0x36, 0xdc, 0x49, 0x38, 0x25, 0x34, 0x4f, 0x20, 0x9a, | ||||
| 	/* (2^ 60)P */ 0x2b, 0x6e, 0x04, 0x0d, 0x4f, 0x3d, 0x3b, 0x24, 0xf6, 0x4e, 0x5e, 0x0a, 0xbd, 0x48, 0x96, 0xba, 0x81, 0x8f, 0x39, 0x82, 0x13, 0xe6, 0x72, 0xf3, 0x0f, 0xb6, 0x94, 0xf4, 0xc5, 0x90, 0x74, 0x91, 0xa8, 0xf2, 0xc9, 0xca, 0x9a, 0x4d, 0x98, 0xf2, 0xdf, 0x52, 0x4e, 0x97, 0x2f, 0xeb, 0x84, 0xd3, 0xaf, 0xc2, 0xcc, 0xfb, 0x4c, 0x26, 0x4b, 0xe4, | ||||
| 	/* (2^ 61)P */ 0x12, 0x9e, 0xfb, 0x9d, 0x78, 0x79, 0x99, 0xdd, 0xb3, 0x0b, 0x2e, 0x56, 0x41, 0x8e, 0x3f, 0x39, 0xb8, 0x97, 0x89, 0x53, 0x9b, 0x8a, 0x3c, 0x40, 0x9d, 0xa4, 0x6c, 0x2e, 0x31, 0x71, 0xc6, 0x0a, 0x41, 0xd4, 0x95, 0x06, 0x5e, 0xc1, 0xab, 0xc2, 0x14, 0xc4, 0xc7, 0x15, 0x08, 0x3a, 0xad, 0x7a, 0xb4, 0x62, 0xa3, 0x0c, 0x90, 0xf4, 0x47, 0x08, | ||||
| 	/* (2^ 62)P */ 0x7f, 0xec, 0x09, 0x82, 0xf5, 0x94, 0x09, 0x93, 0x32, 0xd3, 0xdc, 0x56, 0x80, 0x7b, 0x5b, 0x22, 0x80, 0x6a, 0x96, 0x72, 0xb1, 0xc2, 0xd9, 0xa1, 0x8b, 0x66, 0x42, 0x16, 0xe2, 0x07, 0xb3, 0x2d, 0xf1, 0x75, 0x35, 0x72, 0xc7, 0x98, 0xbe, 0x63, 0x3b, 0x20, 0x75, 0x05, 0xc1, 0x3e, 0x31, 0x5a, 0xf7, 0xaa, 0xae, 0x4b, 0xdb, 0x1d, 0xd0, 0x74, | ||||
| 	/* (2^ 63)P */ 0x36, 0x5c, 0x74, 0xe6, 0x5d, 0x59, 0x3f, 0x15, 0x4b, 0x4d, 0x4e, 0x67, 0x41, 0xfe, 0x98, 0x1f, 0x49, 0x76, 0x91, 0x0f, 0x9b, 0xf4, 0xaf, 0x86, 0xaf, 0x66, 0x19, 0xed, 0x46, 0xf1, 0x05, 0x9a, 0xcc, 0xd1, 0x14, 0x1f, 0x82, 0x12, 0x8e, 0xe6, 0xf4, 0xc3, 0x42, 0x5c, 0x4e, 0x33, 0x93, 0xbe, 0x30, 0xe7, 0x64, 0xa9, 0x35, 0x00, 0x4d, 0xf9, | ||||
| 	/* (2^ 64)P */ 0x1f, 0xc1, 0x1e, 0xb7, 0xe3, 0x7c, 0xfa, 0xa3, 0x6b, 0x76, 0xaf, 0x9c, 0x05, 0x85, 0x4a, 0xa9, 0xfb, 0xe3, 0x7e, 0xf2, 0x49, 0x56, 0xdc, 0x2f, 0x57, 0x10, 0xba, 0x37, 0xb2, 0x62, 0xf5, 0x6b, 0xe5, 0x8f, 0x0a, 0x87, 0xd1, 0x6a, 0xcb, 0x9d, 0x07, 0xd0, 0xf6, 0x38, 0x99, 0x2c, 0x61, 0x4a, 0x4e, 0xd8, 0xd2, 0x88, 0x29, 0x99, 0x11, 0x95, | ||||
| 	/* (2^ 65)P */ 0x6f, 0xdc, 0xd5, 0xd6, 0xd6, 0xa7, 0x4c, 0x46, 0x93, 0x65, 0x62, 0x23, 0x95, 0x32, 0x9c, 0xde, 0x40, 0x41, 0x68, 0x2c, 0x18, 0x4e, 0x5a, 0x8c, 0xc0, 0xc5, 0xc5, 0xea, 0x5c, 0x45, 0x0f, 0x60, 0x78, 0x39, 0xb6, 0x36, 0x23, 0x12, 0xbc, 0x21, 0x9a, 0xf8, 0x91, 0xac, 0xc4, 0x70, 0xdf, 0x85, 0x8e, 0x3c, 0xec, 0x22, 0x04, 0x98, 0xa8, 0xaa, | ||||
| 	/* (2^ 66)P */ 0xcc, 0x52, 0x10, 0x5b, 0x4b, 0x6c, 0xc5, 0xfa, 0x3e, 0xd4, 0xf8, 0x1c, 0x04, 0x14, 0x48, 0x33, 0xd9, 0xfc, 0x5f, 0xb0, 0xa5, 0x48, 0x8c, 0x45, 0x8a, 0xee, 0x3e, 0xa7, 0xc1, 0x2e, 0x34, 0xca, 0xf6, 0xc9, 0xeb, 0x10, 0xbb, 0xe1, 0x59, 0x84, 0x25, 0xe8, 0x81, 0x70, 0xc0, 0x09, 0x42, 0xa7, 0x3b, 0x0d, 0x33, 0x00, 0xb5, 0x77, 0xbe, 0x25, | ||||
| 	/* (2^ 67)P */ 0xcd, 0x1f, 0xbc, 0x7d, 0xef, 0xe5, 0xca, 0x91, 0xaf, 0xa9, 0x59, 0x6a, 0x09, 0xca, 0xd6, 0x1b, 0x3d, 0x55, 0xde, 0xa2, 0x6a, 0x80, 0xd6, 0x95, 0x47, 0xe4, 0x5f, 0x68, 0x54, 0x08, 0xdf, 0x29, 0xba, 0x2a, 0x02, 0x84, 0xe8, 0xe9, 0x00, 0x77, 0x99, 0x36, 0x03, 0xf6, 0x4a, 0x3e, 0x21, 0x81, 0x7d, 0xb8, 0xa4, 0x8a, 0xa2, 0x05, 0xef, 0xbc, | ||||
| 	/* (2^ 68)P */ 0x7c, 0x59, 0x5f, 0x66, 0xd9, 0xb7, 0x83, 0x43, 0x8a, 0xa1, 0x8d, 0x51, 0x70, 0xba, 0xf2, 0x9b, 0x95, 0xc0, 0x4b, 0x4c, 0xa0, 0x14, 0xd3, 0xa4, 0x5d, 0x4a, 0x37, 0x36, 0x97, 0x31, 0x1e, 0x12, 0xe7, 0xbb, 0x08, 0x67, 0xa5, 0x23, 0xd7, 0xfb, 0x97, 0xd8, 0x6a, 0x03, 0xb1, 0xf8, 0x7f, 0xda, 0x58, 0xd9, 0x3f, 0x73, 0x4a, 0x53, 0xe1, 0x7b, | ||||
| 	/* (2^ 69)P */ 0x55, 0x83, 0x98, 0x78, 0x6c, 0x56, 0x5e, 0xed, 0xf7, 0x23, 0x3e, 0x4c, 0x7d, 0x09, 0x2d, 0x09, 0x9c, 0x58, 0x8b, 0x32, 0xca, 0xfe, 0xbf, 0x47, 0x03, 0xeb, 0x4d, 0xe7, 0xeb, 0x9c, 0x83, 0x05, 0x68, 0xaa, 0x80, 0x89, 0x44, 0xf9, 0xd4, 0xdc, 0xdb, 0xb1, 0xdb, 0x77, 0xac, 0xf9, 0x2a, 0xae, 0x35, 0xac, 0x74, 0xb5, 0x95, 0x62, 0x18, 0x85, | ||||
| 	/* (2^ 70)P */ 0xab, 0x82, 0x7e, 0x10, 0xd7, 0xe6, 0x57, 0xd1, 0x66, 0x12, 0x31, 0x9c, 0x9c, 0xa6, 0x27, 0x59, 0x71, 0x2e, 0xeb, 0xa0, 0x68, 0xc5, 0x87, 0x51, 0xf4, 0xca, 0x3f, 0x98, 0x56, 0xb0, 0x89, 0xb1, 0xc7, 0x7b, 0x46, 0xb3, 0xae, 0x36, 0xf2, 0xee, 0x15, 0x1a, 0x60, 0xf4, 0x50, 0x76, 0x4f, 0xc4, 0x53, 0x0d, 0x36, 0x4d, 0x31, 0xb1, 0x20, 0x51, | ||||
| 	/* (2^ 71)P */ 0xf7, 0x1d, 0x8c, 0x1b, 0x5e, 0xe5, 0x02, 0x6f, 0xc5, 0xa5, 0xe0, 0x5f, 0xc6, 0xb6, 0x63, 0x43, 0xaf, 0x3c, 0x19, 0x6c, 0xf4, 0xaf, 0xa4, 0x33, 0xb1, 0x0a, 0x37, 0x3d, 0xd9, 0x4d, 0xe2, 0x29, 0x24, 0x26, 0x94, 0x7c, 0x02, 0xe4, 0xe2, 0xf2, 0xbe, 0xbd, 0xac, 0x1b, 0x48, 0xb8, 0xdd, 0xe9, 0x0d, 0x9a, 0x50, 0x1a, 0x98, 0x71, 0x6e, 0xdc, | ||||
| 	/* (2^ 72)P */ 0x9f, 0x40, 0xb1, 0xb3, 0x66, 0x28, 0x6c, 0xfe, 0xa6, 0x7d, 0xf8, 0x3e, 0xb8, 0xf3, 0xde, 0x52, 0x76, 0x52, 0xa3, 0x92, 0x98, 0x23, 0xab, 0x4f, 0x88, 0x97, 0xfc, 0x22, 0xe1, 0x6b, 0x67, 0xcd, 0x13, 0x95, 0xda, 0x65, 0xdd, 0x3b, 0x67, 0x3f, 0x5f, 0x4c, 0xf2, 0x8a, 0xad, 0x98, 0xa7, 0x94, 0x24, 0x45, 0x87, 0x11, 0x7c, 0x75, 0x79, 0x85, | ||||
| 	/* (2^ 73)P */ 0x70, 0xbf, 0xf9, 0x3b, 0xa9, 0x44, 0x57, 0x72, 0x96, 0xc9, 0xa4, 0x98, 0x65, 0xbf, 0x87, 0xb3, 0x3a, 0x39, 0x12, 0xde, 0xe5, 0x39, 0x01, 0x4f, 0xf7, 0xc0, 0x71, 0x52, 0x36, 0x85, 0xb3, 0x18, 0xf8, 0x14, 0xc0, 0x6d, 0xae, 0x9e, 0x4f, 0xb0, 0x72, 0x87, 0xac, 0x5c, 0xd1, 0x6c, 0x41, 0x6c, 0x90, 0x9d, 0x22, 0x81, 0xe4, 0x2b, 0xea, 0xe5, | ||||
| 	/* (2^ 74)P */ 0xfc, 0xea, 0x1a, 0x65, 0xd9, 0x49, 0x6a, 0x39, 0xb5, 0x96, 0x72, 0x7b, 0x32, 0xf1, 0xd0, 0xe9, 0x45, 0xd9, 0x31, 0x55, 0xc7, 0x34, 0xe9, 0x5a, 0xec, 0x73, 0x0b, 0x03, 0xc4, 0xb3, 0xe6, 0xc9, 0x5e, 0x0a, 0x17, 0xfe, 0x53, 0x66, 0x7f, 0x21, 0x18, 0x74, 0x54, 0x1b, 0xc9, 0x49, 0x16, 0xd2, 0x48, 0xaf, 0x5b, 0x47, 0x7b, 0xeb, 0xaa, 0xc9, | ||||
| 	/* (2^ 75)P */ 0x47, 0x04, 0xf5, 0x5a, 0x87, 0x77, 0x9e, 0x21, 0x34, 0x4e, 0x83, 0x88, 0xaf, 0x02, 0x1d, 0xb0, 0x5a, 0x1d, 0x1d, 0x7d, 0x8d, 0x2c, 0xd3, 0x8d, 0x63, 0xa9, 0x45, 0xfb, 0x15, 0x6d, 0x86, 0x45, 0xcd, 0x38, 0x0e, 0xf7, 0x37, 0x79, 0xed, 0x6d, 0x5a, 0xbc, 0x32, 0xcc, 0x66, 0xf1, 0x3a, 0xb2, 0x87, 0x6f, 0x70, 0x71, 0xd9, 0xf2, 0xfa, 0x7b, | ||||
| 	/* (2^ 76)P */ 0x68, 0x07, 0xdc, 0x61, 0x40, 0xe4, 0xec, 0x32, 0xc8, 0xbe, 0x66, 0x30, 0x54, 0x80, 0xfd, 0x13, 0x7a, 0xef, 0xae, 0xed, 0x2e, 0x00, 0x6d, 0x3f, 0xbd, 0xfc, 0x91, 0x24, 0x53, 0x7f, 0x63, 0x9d, 0x2e, 0xe3, 0x76, 0xe0, 0xf3, 0xe1, 0x8f, 0x7a, 0xc4, 0x77, 0x0c, 0x91, 0xc0, 0xc2, 0x18, 0x6b, 0x04, 0xad, 0xb6, 0x70, 0x9a, 0x64, 0xc5, 0x82, | ||||
| 	/* (2^ 77)P */ 0x7f, 0xea, 0x13, 0xd8, 0x9e, 0xfc, 0x5b, 0x06, 0xb5, 0x4f, 0xda, 0x38, 0xe0, 0x9c, 0xd2, 0x3a, 0xc1, 0x1c, 0x62, 0x70, 0x7f, 0xc6, 0x24, 0x0a, 0x47, 0x04, 0x01, 0xc4, 0x55, 0x09, 0xd1, 0x7a, 0x07, 0xba, 0xa3, 0x80, 0x4f, 0xc1, 0x65, 0x36, 0x6d, 0xc0, 0x10, 0xcf, 0x94, 0xa9, 0xa2, 0x01, 0x44, 0xd1, 0xf9, 0x1c, 0x4c, 0xfb, 0xf8, 0x99, | ||||
| 	/* (2^ 78)P */ 0x6c, 0xb9, 0x6b, 0xee, 0x43, 0x5b, 0xb9, 0xbb, 0xee, 0x2e, 0x52, 0xc1, 0xc6, 0xb9, 0x61, 0xd2, 0x93, 0xa5, 0xaf, 0x52, 0xf4, 0xa4, 0x1a, 0x51, 0x61, 0xa7, 0xcb, 0x9e, 0xbb, 0x56, 0x65, 0xe2, 0xbf, 0x75, 0xb9, 0x9c, 0x50, 0x96, 0x60, 0x81, 0x74, 0x47, 0xc0, 0x04, 0x88, 0x71, 0x76, 0x39, 0x9a, 0xa7, 0xb1, 0x4e, 0x43, 0x15, 0xe0, 0xbb, | ||||
| 	/* (2^ 79)P */ 0xbb, 0xce, 0xe2, 0xbb, 0xf9, 0x17, 0x0f, 0x82, 0x40, 0xad, 0x73, 0xe3, 0xeb, 0x3b, 0x06, 0x1a, 0xcf, 0x8e, 0x6e, 0x28, 0xb8, 0x26, 0xd9, 0x5b, 0xb7, 0xb3, 0xcf, 0xb4, 0x6a, 0x1c, 0xbf, 0x7f, 0xb8, 0xb5, 0x79, 0xcf, 0x45, 0x68, 0x7d, 0xc5, 0xeb, 0xf3, 0xbe, 0x39, 0x40, 0xfc, 0x07, 0x90, 0x7a, 0x62, 0xad, 0x86, 0x08, 0x71, 0x25, 0xe1, | ||||
| 	/* (2^ 80)P */ 0x9b, 0x46, 0xac, 0xef, 0xc1, 0x4e, 0xa1, 0x97, 0x95, 0x76, 0xf9, 0x1b, 0xc2, 0xb2, 0x6a, 0x41, 0xea, 0x80, 0x3d, 0xe9, 0x08, 0x52, 0x5a, 0xe3, 0xf2, 0x08, 0xc5, 0xea, 0x39, 0x3f, 0x44, 0x71, 0x4d, 0xea, 0x0d, 0x05, 0x23, 0xe4, 0x2e, 0x3c, 0x89, 0xfe, 0x12, 0x8a, 0x95, 0x42, 0x0a, 0x68, 0xea, 0x5a, 0x28, 0x06, 0x9e, 0xe3, 0x5f, 0xe0, | ||||
| 	/* (2^ 81)P */ 0x00, 0x61, 0x6c, 0x98, 0x9b, 0xe7, 0xb9, 0x06, 0x1c, 0xc5, 0x1b, 0xed, 0xbe, 0xc8, 0xb3, 0xea, 0x87, 0xf0, 0xc4, 0x24, 0x7d, 0xbb, 0x5d, 0xa4, 0x1d, 0x7a, 0x16, 0x00, 0x55, 0x94, 0x67, 0x78, 0xbd, 0x58, 0x02, 0x82, 0x90, 0x53, 0x76, 0xd4, 0x72, 0x99, 0x51, 0x6f, 0x7b, 0xcf, 0x80, 0x30, 0x31, 0x3b, 0x01, 0xc7, 0xc1, 0xef, 0xe6, 0x42, | ||||
| 	/* (2^ 82)P */ 0xe2, 0x35, 0xaf, 0x4b, 0x79, 0xc6, 0x12, 0x24, 0x99, 0xc0, 0x68, 0xb0, 0x43, 0x3e, 0xe5, 0xef, 0xe2, 0x29, 0xea, 0xb8, 0xb3, 0xbc, 0x6a, 0x53, 0x2c, 0x69, 0x18, 0x5a, 0xf9, 0x15, 0xae, 0x66, 0x58, 0x18, 0xd3, 0x2d, 0x4b, 0x00, 0xfd, 0x84, 0xab, 0x4f, 0xae, 0x70, 0x6b, 0x9e, 0x9a, 0xdf, 0x83, 0xfd, 0x2e, 0x3c, 0xcf, 0xf8, 0x88, 0x5b, | ||||
| 	/* (2^ 83)P */ 0xa4, 0x90, 0x31, 0x85, 0x13, 0xcd, 0xdf, 0x64, 0xc9, 0xa1, 0x0b, 0xe7, 0xb6, 0x73, 0x8a, 0x1b, 0x22, 0x78, 0x4c, 0xd4, 0xae, 0x48, 0x18, 0x00, 0x00, 0xa8, 0x9f, 0x06, 0xf9, 0xfb, 0x2d, 0xc3, 0xb1, 0x2a, 0xbc, 0x13, 0x99, 0x57, 0xaf, 0xf0, 0x8d, 0x61, 0x54, 0x29, 0xd5, 0xf2, 0x72, 0x00, 0x96, 0xd1, 0x85, 0x12, 0x8a, 0xf0, 0x23, 0xfb, | ||||
| 	/* (2^ 84)P */ 0x69, 0xc7, 0xdb, 0xd9, 0x92, 0x75, 0x08, 0x9b, 0xeb, 0xa5, 0x93, 0xd1, 0x1a, 0xf4, 0xf5, 0xaf, 0xe6, 0xc4, 0x4a, 0x0d, 0x35, 0x26, 0x39, 0x9d, 0xd3, 0x17, 0x3e, 0xae, 0x2d, 0xbf, 0x73, 0x9f, 0xb7, 0x74, 0x91, 0xd1, 0xd8, 0x5c, 0x14, 0xf9, 0x75, 0xdf, 0xeb, 0xc2, 0x22, 0xd8, 0x14, 0x8d, 0x86, 0x23, 0x4d, 0xd1, 0x2d, 0xdb, 0x6b, 0x42, | ||||
| 	/* (2^ 85)P */ 0x8c, 0xda, 0xc6, 0xf8, 0x71, 0xba, 0x2b, 0x06, 0x78, 0xae, 0xcc, 0x3a, 0xe3, 0xe3, 0xa1, 0x8b, 0xe2, 0x34, 0x6d, 0x28, 0x9e, 0x46, 0x13, 0x4d, 0x9e, 0xa6, 0x73, 0x49, 0x65, 0x79, 0x88, 0xb9, 0x3a, 0xd1, 0x6d, 0x2f, 0x48, 0x2b, 0x0a, 0x7f, 0x58, 0x20, 0x37, 0xf4, 0x0e, 0xbb, 0x4a, 0x95, 0x58, 0x0c, 0x88, 0x30, 0xc4, 0x74, 0xdd, 0xfd, | ||||
| 	/* (2^ 86)P */ 0x6d, 0x13, 0x4e, 0x89, 0x2d, 0xa9, 0xa3, 0xed, 0x09, 0xe3, 0x0e, 0x71, 0x3e, 0x4a, 0xab, 0x90, 0xde, 0x03, 0xeb, 0x56, 0x46, 0x60, 0x06, 0xf5, 0x71, 0xe5, 0xee, 0x9b, 0xef, 0xff, 0xc4, 0x2c, 0x9f, 0x37, 0x48, 0x45, 0x94, 0x12, 0x41, 0x81, 0x15, 0x70, 0x91, 0x99, 0x5e, 0x56, 0x6b, 0xf4, 0xa6, 0xc9, 0xf5, 0x69, 0x9d, 0x78, 0x37, 0x57, | ||||
| 	/* (2^ 87)P */ 0xf3, 0x51, 0x57, 0x7e, 0x43, 0x6f, 0xc6, 0x67, 0x59, 0x0c, 0xcf, 0x94, 0xe6, 0x3d, 0xb5, 0x07, 0xc9, 0x77, 0x48, 0xc9, 0x68, 0x0d, 0x98, 0x36, 0x62, 0x35, 0x38, 0x1c, 0xf5, 0xc5, 0xec, 0x66, 0x78, 0xfe, 0x47, 0xab, 0x26, 0xd6, 0x44, 0xb6, 0x06, 0x0f, 0x89, 0xe3, 0x19, 0x40, 0x1a, 0xe7, 0xd8, 0x65, 0x55, 0xf7, 0x1a, 0xfc, 0xa3, 0x0e, | ||||
| 	/* (2^ 88)P */ 0x0e, 0x30, 0xa6, 0xb7, 0x58, 0x60, 0x62, 0x2a, 0x6c, 0x13, 0xa8, 0x14, 0x9b, 0xb8, 0xf2, 0x70, 0xd8, 0xb1, 0x71, 0x88, 0x8c, 0x18, 0x31, 0x25, 0x93, 0x90, 0xb4, 0xc7, 0x49, 0xd8, 0xd4, 0xdb, 0x1e, 0x1e, 0x7f, 0xaa, 0xba, 0xc9, 0xf2, 0x5d, 0xa9, 0x3a, 0x43, 0xb4, 0x5c, 0xee, 0x7b, 0xc7, 0x97, 0xb7, 0x66, 0xd7, 0x23, 0xd9, 0x22, 0x59, | ||||
| 	/* (2^ 89)P */ 0x28, 0x19, 0xa6, 0xf9, 0x89, 0x20, 0x78, 0xd4, 0x6d, 0xcb, 0x79, 0x8f, 0x61, 0x6f, 0xb2, 0x5c, 0x4f, 0xa6, 0x54, 0x84, 0x95, 0x24, 0x36, 0x64, 0xcb, 0x39, 0xe7, 0x8f, 0x97, 0x9c, 0x5c, 0x3c, 0xfb, 0x51, 0x11, 0x01, 0x17, 0xdb, 0xc9, 0x9b, 0x51, 0x03, 0x9a, 0xe9, 0xe5, 0x24, 0x1e, 0xf5, 0xda, 0xe0, 0x48, 0x02, 0x23, 0xd0, 0x2c, 0x81, | ||||
| 	/* (2^ 90)P */ 0x42, 0x1b, 0xe4, 0x91, 0x85, 0x2a, 0x0c, 0xd2, 0x28, 0x66, 0x57, 0x9e, 0x33, 0x8d, 0x25, 0x71, 0x10, 0x65, 0x76, 0xa2, 0x8c, 0x21, 0x86, 0x81, 0x15, 0xc2, 0x27, 0xeb, 0x54, 0x2d, 0x4f, 0x6c, 0xe6, 0xd6, 0x24, 0x9c, 0x1a, 0x12, 0xb8, 0x81, 0xe2, 0x0a, 0xf3, 0xd3, 0xf0, 0xd3, 0xe1, 0x74, 0x1f, 0x9b, 0x11, 0x47, 0xd0, 0xcf, 0xb6, 0x54, | ||||
| 	/* (2^ 91)P */ 0x26, 0x45, 0xa2, 0x10, 0xd4, 0x2d, 0xae, 0xc0, 0xb0, 0xe8, 0x86, 0xb3, 0xc7, 0xea, 0x70, 0x87, 0x61, 0xb5, 0xa5, 0x55, 0xbe, 0x88, 0x1d, 0x7a, 0xd9, 0x6f, 0xeb, 0x83, 0xe2, 0x44, 0x7f, 0x98, 0x04, 0xd6, 0x50, 0x9d, 0xa7, 0x86, 0x66, 0x09, 0x63, 0xe1, 0xed, 0x72, 0xb1, 0xe4, 0x1d, 0x3a, 0xfd, 0x47, 0xce, 0x1c, 0xaa, 0x3b, 0x8f, 0x1b, | ||||
| 	/* (2^ 92)P */ 0xf4, 0x3c, 0x4a, 0xb6, 0xc2, 0x9c, 0xe0, 0x2e, 0xb7, 0x38, 0xea, 0x61, 0x35, 0x97, 0x10, 0x90, 0xae, 0x22, 0x48, 0xb3, 0xa9, 0xc6, 0x7a, 0xbb, 0x23, 0xf2, 0xf8, 0x1b, 0xa7, 0xa1, 0x79, 0xcc, 0xc4, 0xf8, 0x08, 0x76, 0x8a, 0x5a, 0x1c, 0x1b, 0xc5, 0x33, 0x91, 0xa9, 0xb8, 0xb9, 0xd3, 0xf8, 0x49, 0xcd, 0xe5, 0x82, 0x43, 0xf7, 0xca, 0x68, | ||||
| 	/* (2^ 93)P */ 0x38, 0xba, 0xae, 0x44, 0xfe, 0x57, 0x64, 0x56, 0x7c, 0x0e, 0x9c, 0xca, 0xff, 0xa9, 0x82, 0xbb, 0x38, 0x4a, 0xa7, 0xf7, 0x47, 0xab, 0xbe, 0x6d, 0x23, 0x0b, 0x8a, 0xed, 0xc2, 0xb9, 0x8f, 0xf1, 0xec, 0x91, 0x44, 0x73, 0x64, 0xba, 0xd5, 0x8f, 0x37, 0x38, 0x0d, 0xd5, 0xf8, 0x73, 0x57, 0xb6, 0xc2, 0x45, 0xdc, 0x25, 0xb2, 0xb6, 0xea, 0xd9, | ||||
| 	/* (2^ 94)P */ 0xbf, 0xe9, 0x1a, 0x40, 0x4d, 0xcc, 0xe6, 0x1d, 0x70, 0x1a, 0x65, 0xcc, 0x34, 0x2c, 0x37, 0x2c, 0x2d, 0x6b, 0x6d, 0xe5, 0x2f, 0x19, 0x9e, 0xe4, 0xe1, 0xaa, 0xd4, 0xab, 0x54, 0xf4, 0xa8, 0xe4, 0x69, 0x2d, 0x8e, 0x4d, 0xd7, 0xac, 0xb0, 0x5b, 0xfe, 0xe3, 0x26, 0x07, 0xc3, 0xf8, 0x1b, 0x43, 0xa8, 0x1d, 0x64, 0xa5, 0x25, 0x88, 0xbb, 0x77, | ||||
| 	/* (2^ 95)P */ 0x92, 0xcd, 0x6e, 0xa0, 0x79, 0x04, 0x18, 0xf4, 0x11, 0x58, 0x48, 0xb5, 0x3c, 0x7b, 0xd1, 0xcc, 0xd3, 0x14, 0x2c, 0xa0, 0xdd, 0x04, 0x44, 0x11, 0xb3, 0x6d, 0x2f, 0x0d, 0xf5, 0x2a, 0x75, 0x5d, 0x1d, 0xda, 0x86, 0x8d, 0x7d, 0x6b, 0x32, 0x68, 0xb6, 0x6c, 0x64, 0x9e, 0xde, 0x80, 0x88, 0xce, 0x08, 0xbf, 0x0b, 0xe5, 0x8e, 0x4f, 0x1d, 0xfb, | ||||
| 	/* (2^ 96)P */ 0xaf, 0xe8, 0x85, 0xbf, 0x7f, 0x37, 0x8d, 0x66, 0x7c, 0xd5, 0xd3, 0x96, 0xa5, 0x81, 0x67, 0x95, 0xff, 0x48, 0xde, 0xde, 0xd7, 0x7a, 0x46, 0x34, 0xb1, 0x13, 0x70, 0x29, 0xed, 0x87, 0x90, 0xb0, 0x40, 0x2c, 0xa6, 0x43, 0x6e, 0xb6, 0xbc, 0x48, 0x8a, 0xc1, 0xae, 0xb8, 0xd4, 0xe2, 0xc0, 0x32, 0xb2, 0xa6, 0x2a, 0x8f, 0xb5, 0x16, 0x9e, 0xc3, | ||||
| 	/* (2^ 97)P */ 0xff, 0x4d, 0xd2, 0xd6, 0x74, 0xef, 0x2c, 0x96, 0xc1, 0x11, 0xa8, 0xb8, 0xfe, 0x94, 0x87, 0x3e, 0xa0, 0xfb, 0x57, 0xa3, 0xfc, 0x7a, 0x7e, 0x6a, 0x59, 0x6c, 0x54, 0xbb, 0xbb, 0xa2, 0x25, 0x38, 0x1b, 0xdf, 0x5d, 0x7b, 0x94, 0x14, 0xde, 0x07, 0x6e, 0xd3, 0xab, 0x02, 0x26, 0x74, 0x16, 0x12, 0xdf, 0x2e, 0x2a, 0xa7, 0xb0, 0xe8, 0x29, 0xc0, | ||||
| 	/* (2^ 98)P */ 0x6a, 0x38, 0x0b, 0xd3, 0xba, 0x45, 0x23, 0xe0, 0x04, 0x3b, 0x83, 0x39, 0xc5, 0x11, 0xe6, 0xcf, 0x39, 0x0a, 0xb3, 0xb0, 0x3b, 0x27, 0x29, 0x63, 0x1c, 0xf3, 0x00, 0xe6, 0xd2, 0x55, 0x21, 0x1f, 0x84, 0x97, 0x9f, 0x01, 0x49, 0x43, 0x30, 0x5f, 0xe0, 0x1d, 0x24, 0xc4, 0x4e, 0xa0, 0x2b, 0x0b, 0x12, 0x55, 0xc3, 0x27, 0xae, 0x08, 0x83, 0x7c, | ||||
| 	/* (2^ 99)P */ 0x5d, 0x1a, 0xb7, 0xa9, 0xf5, 0xfd, 0xec, 0xad, 0xb7, 0x87, 0x02, 0x5f, 0x0d, 0x30, 0x4d, 0xe2, 0x65, 0x87, 0xa4, 0x41, 0x45, 0x1d, 0x67, 0xe0, 0x30, 0x5c, 0x13, 0x87, 0xf6, 0x2e, 0x08, 0xc1, 0xc7, 0x12, 0x45, 0xc8, 0x9b, 0xad, 0xb8, 0xd5, 0x57, 0xbb, 0x5c, 0x48, 0x3a, 0xe1, 0x91, 0x5e, 0xf6, 0x4d, 0x8a, 0x63, 0x75, 0x69, 0x0c, 0x01, | ||||
| 	/* (2^100)P */ 0x8f, 0x53, 0x2d, 0xa0, 0x71, 0x3d, 0xfc, 0x45, 0x10, 0x96, 0xcf, 0x56, 0xf9, 0xbb, 0x40, 0x3c, 0x86, 0x52, 0x76, 0xbe, 0x84, 0xf9, 0xa6, 0x9d, 0x3d, 0x27, 0xbe, 0xb4, 0x00, 0x49, 0x94, 0xf5, 0x5d, 0xe1, 0x62, 0x85, 0x66, 0xe5, 0xb8, 0x20, 0x2c, 0x09, 0x7d, 0x9d, 0x3d, 0x6e, 0x74, 0x39, 0xab, 0xad, 0xa0, 0x90, 0x97, 0x5f, 0xbb, 0xa7, | ||||
| 	/* (2^101)P */ 0xdb, 0x2d, 0x99, 0x08, 0x16, 0x46, 0x83, 0x7a, 0xa8, 0xea, 0x3d, 0x28, 0x5b, 0x49, 0xfc, 0xb9, 0x6d, 0x00, 0x9e, 0x54, 0x4f, 0x47, 0x64, 0x9b, 0x58, 0x4d, 0x07, 0x0c, 0x6f, 0x29, 0x56, 0x0b, 0x00, 0x14, 0x85, 0x96, 0x41, 0x04, 0xb9, 0x5c, 0xa4, 0xf6, 0x16, 0x73, 0x6a, 0xc7, 0x62, 0x0c, 0x65, 0x2f, 0x93, 0xbf, 0xf7, 0xb9, 0xb7, 0xf1, | ||||
| 	/* (2^102)P */ 0xeb, 0x6d, 0xb3, 0x46, 0x32, 0xd2, 0xcb, 0x08, 0x94, 0x14, 0xbf, 0x3f, 0xc5, 0xcb, 0x5f, 0x9f, 0x8a, 0x89, 0x0c, 0x1b, 0x45, 0xad, 0x4c, 0x50, 0xb4, 0xe1, 0xa0, 0x6b, 0x11, 0x92, 0xaf, 0x1f, 0x00, 0xcc, 0xe5, 0x13, 0x7e, 0xe4, 0x2e, 0xa0, 0x57, 0xf3, 0xa7, 0x84, 0x79, 0x7a, 0xc2, 0xb7, 0xb7, 0xfc, 0x5d, 0xa5, 0xa9, 0x64, 0xcc, 0xd8, | ||||
| 	/* (2^103)P */ 0xa9, 0xc4, 0x12, 0x8b, 0x34, 0x78, 0x3e, 0x38, 0xfd, 0x3f, 0x87, 0xfa, 0x88, 0x94, 0xd5, 0xd9, 0x7f, 0xeb, 0x58, 0xff, 0xb9, 0x45, 0xdb, 0xa1, 0xed, 0x22, 0x28, 0x1d, 0x00, 0x6d, 0x79, 0x85, 0x7a, 0x75, 0x5d, 0xf0, 0xb1, 0x9e, 0x47, 0x28, 0x8c, 0x62, 0xdf, 0xfb, 0x4c, 0x7b, 0xc5, 0x1a, 0x42, 0x95, 0xef, 0x9a, 0xb7, 0x27, 0x7e, 0xda, | ||||
| 	/* (2^104)P */ 0xca, 0xd5, 0xc0, 0x17, 0xa1, 0x66, 0x79, 0x9c, 0x2a, 0xb7, 0x0a, 0xfe, 0x62, 0xe4, 0x26, 0x78, 0x90, 0xa7, 0xcb, 0xb0, 0x4f, 0x6d, 0xf9, 0x8f, 0xf7, 0x7d, 0xac, 0xb8, 0x78, 0x1f, 0x41, 0xea, 0x97, 0x1e, 0x62, 0x97, 0x43, 0x80, 0x58, 0x80, 0xb6, 0x69, 0x7d, 0xee, 0x16, 0xd2, 0xa1, 0x81, 0xd7, 0xb1, 0x27, 0x03, 0x48, 0xda, 0xab, 0xec, | ||||
| 	/* (2^105)P */ 0x5b, 0xed, 0x40, 0x8e, 0x8c, 0xc1, 0x66, 0x90, 0x7f, 0x0c, 0xb2, 0xfc, 0xbd, 0x16, 0xac, 0x7d, 0x4c, 0x6a, 0xf9, 0xae, 0xe7, 0x4e, 0x11, 0x12, 0xe9, 0xbe, 0x17, 0x09, 0xc6, 0xc1, 0x5e, 0xb5, 0x7b, 0x50, 0x5c, 0x27, 0xfb, 0x80, 0xab, 0x01, 0xfa, 0x5b, 0x9b, 0x75, 0x16, 0x6e, 0xb2, 0x5c, 0x8c, 0x2f, 0xa5, 0x6a, 0x1a, 0x68, 0xa6, 0x90, | ||||
| 	/* (2^106)P */ 0x75, 0xfe, 0xb6, 0x96, 0x96, 0x87, 0x4c, 0x12, 0xa9, 0xd1, 0xd8, 0x03, 0xa3, 0xc1, 0x15, 0x96, 0xe8, 0xa0, 0x75, 0x82, 0xa0, 0x6d, 0xea, 0x54, 0xdc, 0x5f, 0x0d, 0x7e, 0xf6, 0x70, 0xb5, 0xdc, 0x7a, 0xf6, 0xc4, 0xd4, 0x21, 0x49, 0xf5, 0xd4, 0x14, 0x6d, 0x48, 0x1d, 0x7c, 0x99, 0x42, 0xdf, 0x78, 0x6b, 0x9d, 0xb9, 0x30, 0x3c, 0xd0, 0x29, | ||||
| 	/* (2^107)P */ 0x85, 0xd6, 0xd8, 0xf3, 0x91, 0x74, 0xdd, 0xbd, 0x72, 0x96, 0x10, 0xe4, 0x76, 0x02, 0x5a, 0x72, 0x67, 0xd3, 0x17, 0x72, 0x14, 0x9a, 0x20, 0x5b, 0x0f, 0x8d, 0xed, 0x6d, 0x4e, 0xe3, 0xd9, 0x82, 0xc2, 0x99, 0xee, 0x39, 0x61, 0x69, 0x8a, 0x24, 0x01, 0x92, 0x15, 0xe7, 0xfc, 0xf9, 0x4d, 0xac, 0xf1, 0x30, 0x49, 0x01, 0x0b, 0x6e, 0x0f, 0x20, | ||||
| 	/* (2^108)P */ 0xd8, 0x25, 0x94, 0x5e, 0x43, 0x29, 0xf5, 0xcc, 0xe8, 0xe3, 0x55, 0x41, 0x3c, 0x9f, 0x58, 0x5b, 0x00, 0xeb, 0xc5, 0xdf, 0xcf, 0xfb, 0xfd, 0x6e, 0x92, 0xec, 0x99, 0x30, 0xd6, 0x05, 0xdd, 0x80, 0x7a, 0x5d, 0x6d, 0x16, 0x85, 0xd8, 0x9d, 0x43, 0x65, 0xd8, 0x2c, 0x33, 0x2f, 0x5c, 0x41, 0xea, 0xb7, 0x95, 0x77, 0xf2, 0x9e, 0x59, 0x09, 0xe8, | ||||
| 	/* (2^109)P */ 0x00, 0xa0, 0x03, 0x80, 0xcd, 0x60, 0xe5, 0x17, 0xd4, 0x15, 0x99, 0xdd, 0x4f, 0xbf, 0x66, 0xb8, 0xc0, 0xf5, 0xf9, 0xfc, 0x6d, 0x42, 0x18, 0x34, 0x1c, 0x7d, 0x5b, 0xb5, 0x09, 0xd0, 0x99, 0x57, 0x81, 0x0b, 0x62, 0xb3, 0xa2, 0xf9, 0x0b, 0xae, 0x95, 0xb8, 0xc2, 0x3b, 0x0d, 0x5b, 0x00, 0xf1, 0xed, 0xbc, 0x05, 0x9d, 0x61, 0xbc, 0x73, 0x9d, | ||||
| 	/* (2^110)P */ 0xd4, 0xdb, 0x29, 0xe5, 0x85, 0xe9, 0xc6, 0x89, 0x2a, 0xa8, 0x54, 0xab, 0xb3, 0x7f, 0x88, 0xc0, 0x4d, 0xe0, 0xd1, 0x74, 0x6e, 0xa3, 0xa7, 0x39, 0xd5, 0xcc, 0xa1, 0x8a, 0xcb, 0x5b, 0x34, 0xad, 0x92, 0xb4, 0xd8, 0xd5, 0x17, 0xf6, 0x77, 0x18, 0x9e, 0xaf, 0x45, 0x3b, 0x03, 0xe2, 0xf8, 0x52, 0x60, 0xdc, 0x15, 0x20, 0x9e, 0xdf, 0xd8, 0x5d, | ||||
| 	/* (2^111)P */ 0x02, 0xc1, 0xac, 0x1a, 0x15, 0x8e, 0x6c, 0xf5, 0x1e, 0x1e, 0xba, 0x7e, 0xc2, 0xda, 0x7d, 0x02, 0xda, 0x43, 0xae, 0x04, 0x70, 0x28, 0x54, 0x78, 0x94, 0xf5, 0x4f, 0x07, 0x84, 0x8f, 0xed, 0xaa, 0xc0, 0xb8, 0xcd, 0x7f, 0x7e, 0x33, 0xa3, 0xbe, 0x21, 0x29, 0xc8, 0x56, 0x34, 0xc0, 0x76, 0x87, 0x8f, 0xc7, 0x73, 0x58, 0x90, 0x16, 0xfc, 0xd6, | ||||
| 	/* (2^112)P */ 0xb8, 0x3f, 0xe1, 0xdf, 0x3a, 0x91, 0x25, 0x0c, 0xf6, 0x47, 0xa8, 0x89, 0xc4, 0xc6, 0x61, 0xec, 0x86, 0x2c, 0xfd, 0xbe, 0xa4, 0x6f, 0xc2, 0xd4, 0x46, 0x19, 0x70, 0x5d, 0x09, 0x02, 0x86, 0xd3, 0x4b, 0xe9, 0x16, 0x7b, 0xf0, 0x0d, 0x6c, 0xff, 0x91, 0x05, 0xbf, 0x55, 0xb4, 0x00, 0x8d, 0xe5, 0x6d, 0x68, 0x20, 0x90, 0x12, 0xb5, 0x5c, 0x32, | ||||
| 	/* (2^113)P */ 0x80, 0x45, 0xc8, 0x51, 0x87, 0xba, 0x1c, 0x5c, 0xcf, 0x5f, 0x4b, 0x3c, 0x9e, 0x3b, 0x36, 0xd2, 0x26, 0xa2, 0x7f, 0xab, 0xb7, 0xbf, 0xda, 0x68, 0x23, 0x8f, 0xc3, 0xa0, 0xfd, 0xad, 0xf1, 0x56, 0x3b, 0xd0, 0x75, 0x2b, 0x44, 0x61, 0xd8, 0xf4, 0xf1, 0x05, 0x49, 0x53, 0x07, 0xee, 0x47, 0xef, 0xc0, 0x7c, 0x9d, 0xe4, 0x15, 0x88, 0xc5, 0x47, | ||||
| 	/* (2^114)P */ 0x2d, 0xb5, 0x09, 0x80, 0xb9, 0xd3, 0xd8, 0xfe, 0x4c, 0xd2, 0xa6, 0x6e, 0xd3, 0x75, 0xcf, 0xb0, 0x99, 0xcb, 0x50, 0x8d, 0xe9, 0x67, 0x9b, 0x20, 0xe8, 0x57, 0xd8, 0x14, 0x85, 0x73, 0x6a, 0x74, 0xe0, 0x99, 0xf0, 0x6b, 0x6e, 0x59, 0x30, 0x31, 0x33, 0x96, 0x5f, 0xa1, 0x0c, 0x1b, 0xf4, 0xca, 0x09, 0xe1, 0x9b, 0xb5, 0xcf, 0x6d, 0x0b, 0xeb, | ||||
| 	/* (2^115)P */ 0x1a, 0xde, 0x50, 0xa9, 0xac, 0x3e, 0x10, 0x43, 0x4f, 0x82, 0x4f, 0xc0, 0xfe, 0x3f, 0x33, 0xd2, 0x64, 0x86, 0x50, 0xa9, 0x51, 0x76, 0x5e, 0x50, 0x97, 0x6c, 0x73, 0x8d, 0x77, 0xa3, 0x75, 0x03, 0xbc, 0xc9, 0xfb, 0x50, 0xd9, 0x6d, 0x16, 0xad, 0x5d, 0x32, 0x3d, 0xac, 0x44, 0xdf, 0x51, 0xf7, 0x19, 0xd4, 0x0b, 0x57, 0x78, 0x0b, 0x81, 0x4e, | ||||
| 	/* (2^116)P */ 0x32, 0x24, 0xf1, 0x6c, 0x55, 0x62, 0x1d, 0xb3, 0x1f, 0xda, 0xfa, 0x6a, 0x8f, 0x98, 0x01, 0x16, 0xde, 0x44, 0x50, 0x0d, 0x2e, 0x6c, 0x0b, 0xa2, 0xd3, 0x74, 0x0e, 0xa9, 0xbf, 0x8d, 0xa9, 0xc8, 0xc8, 0x2f, 0x62, 0xc1, 0x35, 0x5e, 0xfd, 0x3a, 0xb3, 0x83, 0x2d, 0xee, 0x4e, 0xfd, 0x5c, 0x5e, 0xad, 0x85, 0xa5, 0x10, 0xb5, 0x4f, 0x34, 0xa7, | ||||
| 	/* (2^117)P */ 0xd1, 0x58, 0x6f, 0xe6, 0x54, 0x2c, 0xc2, 0xcd, 0xcf, 0x83, 0xdc, 0x88, 0x0c, 0xb9, 0xb4, 0x62, 0x18, 0x89, 0x65, 0x28, 0xe9, 0x72, 0x4b, 0x65, 0xcf, 0xd6, 0x90, 0x88, 0xd7, 0x76, 0x17, 0x4f, 0x74, 0x64, 0x1e, 0xcb, 0xd3, 0xf5, 0x4b, 0xaa, 0x2e, 0x4d, 0x2d, 0x7c, 0x13, 0x1f, 0xfd, 0xd9, 0x60, 0x83, 0x7e, 0xda, 0x64, 0x1c, 0xdc, 0x9f, | ||||
| 	/* (2^118)P */ 0xad, 0xef, 0xac, 0x1b, 0xc1, 0x30, 0x5a, 0x15, 0xc9, 0x1f, 0xac, 0xf1, 0xca, 0x44, 0x95, 0x95, 0xea, 0xf2, 0x22, 0xe7, 0x8d, 0x25, 0xf0, 0xff, 0xd8, 0x71, 0xf7, 0xf8, 0x8f, 0x8f, 0xcd, 0xf4, 0x1e, 0xfe, 0x6c, 0x68, 0x04, 0xb8, 0x78, 0xa1, 0x5f, 0xa6, 0x5d, 0x5e, 0xf9, 0x8d, 0xea, 0x80, 0xcb, 0xf3, 0x17, 0xa6, 0x03, 0xc9, 0x38, 0xd5, | ||||
| 	/* (2^119)P */ 0x79, 0x14, 0x31, 0xc3, 0x38, 0xe5, 0xaa, 0xbf, 0x17, 0xa3, 0x04, 0x4e, 0x80, 0x59, 0x9c, 0x9f, 0x19, 0x39, 0xe4, 0x2d, 0x23, 0x54, 0x4a, 0x7f, 0x3e, 0xf3, 0xd9, 0xc7, 0xba, 0x6c, 0x8f, 0x6b, 0xfa, 0x34, 0xb5, 0x23, 0x17, 0x1d, 0xff, 0x1d, 0xea, 0x1f, 0xd7, 0xba, 0x61, 0xb2, 0xe0, 0x38, 0x6a, 0xe9, 0xcf, 0x48, 0x5d, 0x6a, 0x10, 0x9c, | ||||
| 	/* (2^120)P */ 0xc8, 0xbb, 0x13, 0x1c, 0x3f, 0x3c, 0x34, 0xfd, 0xac, 0x37, 0x52, 0x44, 0x25, 0xa8, 0xde, 0x1d, 0x63, 0xf4, 0x81, 0x9a, 0xbe, 0x0b, 0x74, 0x2e, 0xc8, 0x51, 0x16, 0xd3, 0xac, 0x4a, 0xaf, 0xe2, 0x5f, 0x3a, 0x89, 0x32, 0xd1, 0x9b, 0x7c, 0x90, 0x0d, 0xac, 0xdc, 0x8b, 0x73, 0x45, 0x45, 0x97, 0xb1, 0x90, 0x2c, 0x1b, 0x31, 0xca, 0xb1, 0x94, | ||||
| 	/* (2^121)P */ 0x07, 0x28, 0xdd, 0x10, 0x14, 0xa5, 0x95, 0x7e, 0xf3, 0xe4, 0xd4, 0x14, 0xb4, 0x7e, 0x76, 0xdb, 0x42, 0xd6, 0x94, 0x3e, 0xeb, 0x44, 0x64, 0x88, 0x0d, 0xec, 0xc1, 0x21, 0xf0, 0x79, 0xe0, 0x83, 0x67, 0x55, 0x53, 0xc2, 0xf6, 0xc5, 0xc5, 0x89, 0x39, 0xe8, 0x42, 0xd0, 0x17, 0xbd, 0xff, 0x35, 0x59, 0x0e, 0xc3, 0x06, 0x86, 0xd4, 0x64, 0xcf, | ||||
| 	/* (2^122)P */ 0x91, 0xa8, 0xdb, 0x57, 0x9b, 0xe2, 0x96, 0x31, 0x10, 0x6e, 0xd7, 0x9a, 0x97, 0xb3, 0xab, 0xb5, 0x15, 0x66, 0xbe, 0xcc, 0x6d, 0x9a, 0xac, 0x06, 0xb3, 0x0d, 0xaa, 0x4b, 0x9c, 0x96, 0x79, 0x6c, 0x34, 0xee, 0x9e, 0x53, 0x4d, 0x6e, 0xbd, 0x88, 0x02, 0xbf, 0x50, 0x54, 0x12, 0x5d, 0x01, 0x02, 0x46, 0xc6, 0x74, 0x02, 0x8c, 0x24, 0xae, 0xb1, | ||||
| 	/* (2^123)P */ 0xf5, 0x22, 0xea, 0xac, 0x7d, 0x9c, 0x33, 0x8a, 0xa5, 0x36, 0x79, 0x6a, 0x4f, 0xa4, 0xdc, 0xa5, 0x73, 0x64, 0xc4, 0x6f, 0x43, 0x02, 0x3b, 0x94, 0x66, 0xd2, 0x4b, 0x4f, 0xf6, 0x45, 0x33, 0x5d, 0x10, 0x33, 0x18, 0x1e, 0xa3, 0xfc, 0xf7, 0xd2, 0xb8, 0xc8, 0xa7, 0xe0, 0x76, 0x8a, 0xcd, 0xff, 0x4f, 0x99, 0x34, 0x47, 0x84, 0x91, 0x96, 0x9f, | ||||
| 	/* (2^124)P */ 0x8a, 0x48, 0x3b, 0x48, 0x4a, 0xbc, 0xac, 0xe2, 0x80, 0xd6, 0xd2, 0x35, 0xde, 0xd0, 0x56, 0x42, 0x33, 0xb3, 0x56, 0x5a, 0xcd, 0xb8, 0x3d, 0xb5, 0x25, 0xc1, 0xed, 0xff, 0x87, 0x0b, 0x79, 0xff, 0xf2, 0x62, 0xe1, 0x76, 0xc6, 0xa2, 0x0f, 0xa8, 0x9b, 0x0d, 0xcc, 0x3f, 0x3d, 0x35, 0x27, 0x8d, 0x0b, 0x74, 0xb0, 0xc3, 0x78, 0x8c, 0xcc, 0xc8, | ||||
| 	/* (2^125)P */ 0xfc, 0x9a, 0x0c, 0xa8, 0x49, 0x42, 0xb8, 0xdf, 0xcf, 0xb3, 0x19, 0xa6, 0x64, 0x57, 0xfe, 0xe8, 0xf8, 0xa6, 0x4b, 0x86, 0xa1, 0xd5, 0x83, 0x7f, 0x14, 0x99, 0x18, 0x0c, 0x7d, 0x5b, 0xf7, 0x3d, 0xf9, 0x4b, 0x79, 0xb1, 0x86, 0x30, 0xb4, 0x5e, 0x6a, 0xe8, 0x9d, 0xfa, 0x8a, 0x41, 0xc4, 0x30, 0xfc, 0x56, 0x74, 0x14, 0x42, 0xc8, 0x96, 0x0e, | ||||
| 	/* (2^126)P */ 0xdf, 0x66, 0xec, 0xbc, 0x44, 0xdb, 0x19, 0xce, 0xd4, 0xb5, 0x49, 0x40, 0x07, 0x49, 0xe0, 0x3a, 0x61, 0x10, 0xfb, 0x7d, 0xba, 0xb1, 0xe0, 0x28, 0x5b, 0x99, 0x59, 0x96, 0xa2, 0xee, 0xe0, 0x23, 0x37, 0x39, 0x1f, 0xe6, 0x57, 0x9f, 0xf8, 0xf8, 0xdc, 0x74, 0xf6, 0x8f, 0x4f, 0x5e, 0x51, 0xa4, 0x12, 0xac, 0xbe, 0xe4, 0xf3, 0xd1, 0xf0, 0x24, | ||||
| 	/* (2^127)P */ 0x1e, 0x3e, 0x9a, 0x5f, 0xdf, 0x9f, 0xd6, 0x4e, 0x8a, 0x28, 0xc3, 0xcd, 0x96, 0x9d, 0x57, 0xc7, 0x61, 0x81, 0x90, 0xff, 0xae, 0xb1, 0x4f, 0xc2, 0x96, 0x8b, 0x1a, 0x18, 0xf4, 0x50, 0xcb, 0x31, 0xe1, 0x57, 0xf4, 0x90, 0xa8, 0xea, 0xac, 0xe7, 0x61, 0x98, 0xb6, 0x15, 0xc1, 0x7b, 0x29, 0xa4, 0xc3, 0x18, 0xef, 0xb9, 0xd8, 0xdf, 0xf6, 0xac, | ||||
| 	/* (2^128)P */ 0xca, 0xa8, 0x6c, 0xf1, 0xb4, 0xca, 0xfe, 0x31, 0xee, 0x48, 0x38, 0x8b, 0x0e, 0xbb, 0x7a, 0x30, 0xaa, 0xf9, 0xee, 0x27, 0x53, 0x24, 0xdc, 0x2e, 0x15, 0xa6, 0x48, 0x8f, 0xa0, 0x7e, 0xf1, 0xdc, 0x93, 0x87, 0x39, 0xeb, 0x7f, 0x38, 0x92, 0x92, 0x4c, 0x29, 0xe9, 0x57, 0xd8, 0x59, 0xfc, 0xe9, 0x9c, 0x44, 0xc0, 0x65, 0xcf, 0xac, 0x4b, 0xdc, | ||||
| 	/* (2^129)P */ 0xa3, 0xd0, 0x37, 0x8f, 0x86, 0x2f, 0xc6, 0x47, 0x55, 0x46, 0x65, 0x26, 0x4b, 0x91, 0xe2, 0x18, 0x5c, 0x4f, 0x23, 0xc1, 0x37, 0x29, 0xb9, 0xc1, 0x27, 0xc5, 0x3c, 0xbf, 0x7e, 0x23, 0xdb, 0x73, 0x99, 0xbd, 0x1b, 0xb2, 0x31, 0x68, 0x3a, 0xad, 0xb7, 0xb0, 0x10, 0xc5, 0xe5, 0x11, 0x51, 0xba, 0xa7, 0x60, 0x66, 0x54, 0xf0, 0x08, 0xd7, 0x69, | ||||
| 	/* (2^130)P */ 0x89, 0x41, 0x79, 0xcc, 0xeb, 0x0a, 0xf5, 0x4b, 0xa3, 0x4c, 0xce, 0x52, 0xb0, 0xa7, 0xe4, 0x41, 0x75, 0x7d, 0x04, 0xbb, 0x09, 0x4c, 0x50, 0x9f, 0xdf, 0xea, 0x74, 0x61, 0x02, 0xad, 0xb4, 0x9d, 0xb7, 0x05, 0xb9, 0xea, 0xeb, 0x91, 0x35, 0xe7, 0x49, 0xea, 0xd3, 0x4f, 0x3c, 0x60, 0x21, 0x7a, 0xde, 0xc7, 0xe2, 0x5a, 0xee, 0x8e, 0x93, 0xc7, | ||||
| 	/* (2^131)P */ 0x00, 0xe8, 0xed, 0xd0, 0xb3, 0x0d, 0xaf, 0xb2, 0xde, 0x2c, 0xf6, 0x00, 0xe2, 0xea, 0x6d, 0xf8, 0x0e, 0xd9, 0x67, 0x59, 0xa9, 0x50, 0xbb, 0x17, 0x8f, 0xff, 0xb1, 0x9f, 0x17, 0xb6, 0xf2, 0xb5, 0xba, 0x80, 0xf7, 0x0f, 0xba, 0xd5, 0x09, 0x43, 0xaa, 0x4e, 0x3a, 0x67, 0x6a, 0x89, 0x9b, 0x18, 0x65, 0x35, 0xf8, 0x3a, 0x49, 0x91, 0x30, 0x51, | ||||
| 	/* (2^132)P */ 0x8d, 0x25, 0xe9, 0x0e, 0x7d, 0x50, 0x76, 0xe4, 0x58, 0x7e, 0xb9, 0x33, 0xe6, 0x65, 0x90, 0xc2, 0x50, 0x9d, 0x50, 0x2e, 0x11, 0xad, 0xd5, 0x43, 0x52, 0x32, 0x41, 0x4f, 0x7b, 0xb6, 0xa0, 0xec, 0x81, 0x75, 0x36, 0x7c, 0x77, 0x85, 0x59, 0x70, 0xe4, 0xf9, 0xef, 0x66, 0x8d, 0x35, 0xc8, 0x2a, 0x6e, 0x5b, 0xc6, 0x0d, 0x0b, 0x29, 0x60, 0x68, | ||||
| 	/* (2^133)P */ 0xf8, 0xce, 0xb0, 0x3a, 0x56, 0x7d, 0x51, 0x9a, 0x25, 0x73, 0xea, 0xdd, 0xe4, 0xe0, 0x0e, 0xf0, 0x07, 0xc0, 0x31, 0x00, 0x73, 0x35, 0xd0, 0x39, 0xc4, 0x9b, 0xb7, 0x95, 0xe0, 0x62, 0x70, 0x36, 0x0b, 0xcb, 0xa0, 0x42, 0xde, 0x51, 0xcf, 0x41, 0xe0, 0xb8, 0xb4, 0xc0, 0xe5, 0x46, 0x99, 0x9f, 0x02, 0x7f, 0x14, 0x8c, 0xc1, 0x4e, 0xef, 0xe8, | ||||
| 	/* (2^134)P */ 0x10, 0x01, 0x57, 0x0a, 0xbe, 0x8b, 0x18, 0xc8, 0xca, 0x00, 0x28, 0x77, 0x4a, 0x9a, 0xc7, 0x55, 0x2a, 0xcc, 0x0c, 0x7b, 0xb9, 0xe9, 0xc8, 0x97, 0x7c, 0x02, 0xe3, 0x09, 0x2f, 0x62, 0x30, 0xb8, 0x40, 0x09, 0x65, 0xe9, 0x55, 0x63, 0xb5, 0x07, 0xca, 0x9f, 0x00, 0xdf, 0x9d, 0x5c, 0xc7, 0xee, 0x57, 0xa5, 0x90, 0x15, 0x1e, 0x22, 0xa0, 0x12, | ||||
| 	/* (2^135)P */ 0x71, 0x2d, 0xc9, 0xef, 0x27, 0xb9, 0xd8, 0x12, 0x43, 0x6b, 0xa8, 0xce, 0x3b, 0x6d, 0x6e, 0x91, 0x43, 0x23, 0xbc, 0x32, 0xb3, 0xbf, 0xe1, 0xc7, 0x39, 0xcf, 0x7c, 0x42, 0x4c, 0xb1, 0x30, 0xe2, 0xdd, 0x69, 0x06, 0xe5, 0xea, 0xf0, 0x2a, 0x16, 0x50, 0x71, 0xca, 0x92, 0xdf, 0xc1, 0xcc, 0xec, 0xe6, 0x54, 0x07, 0xf3, 0x18, 0x8d, 0xd8, 0x29, | ||||
| 	/* (2^136)P */ 0x98, 0x51, 0x48, 0x8f, 0xfa, 0x2e, 0x5e, 0x67, 0xb0, 0xc6, 0x17, 0x12, 0xb6, 0x7d, 0xc9, 0xad, 0x81, 0x11, 0xad, 0x0c, 0x1c, 0x2d, 0x45, 0xdf, 0xac, 0x66, 0xbd, 0x08, 0x6f, 0x7c, 0xc7, 0x06, 0x6e, 0x19, 0x08, 0x39, 0x64, 0xd7, 0xe4, 0xd1, 0x11, 0x5f, 0x1c, 0xf4, 0x67, 0xc3, 0x88, 0x6a, 0xe6, 0x07, 0xa3, 0x83, 0xd7, 0xfd, 0x2a, 0xf9, | ||||
| 	/* (2^137)P */ 0x87, 0xed, 0xeb, 0xd9, 0xdf, 0xff, 0x43, 0x8b, 0xaa, 0x20, 0x58, 0xb0, 0xb4, 0x6b, 0x14, 0xb8, 0x02, 0xc5, 0x40, 0x20, 0x22, 0xbb, 0xf7, 0xb4, 0xf3, 0x05, 0x1e, 0x4d, 0x94, 0xff, 0xe3, 0xc5, 0x22, 0x82, 0xfe, 0xaf, 0x90, 0x42, 0x98, 0x6b, 0x76, 0x8b, 0x3e, 0x89, 0x3f, 0x42, 0x2a, 0xa7, 0x26, 0x00, 0xda, 0x5c, 0xa2, 0x2b, 0xec, 0xdd, | ||||
| 	/* (2^138)P */ 0x5c, 0x21, 0x16, 0x0d, 0x46, 0xb8, 0xd0, 0xa7, 0x88, 0xe7, 0x25, 0xcb, 0x3e, 0x50, 0x73, 0x61, 0xe7, 0xaf, 0x5a, 0x3f, 0x47, 0x8b, 0x3d, 0x97, 0x79, 0x2c, 0xe6, 0x6d, 0x95, 0x74, 0x65, 0x70, 0x36, 0xfd, 0xd1, 0x9e, 0x13, 0x18, 0x63, 0xb1, 0x2d, 0x0b, 0xb5, 0x36, 0x3e, 0xe7, 0x35, 0x42, 0x3b, 0xe6, 0x1f, 0x4d, 0x9d, 0x59, 0xa2, 0x43, | ||||
| 	/* (2^139)P */ 0x8c, 0x0c, 0x7c, 0x24, 0x9e, 0xe0, 0xf8, 0x05, 0x1c, 0x9e, 0x1f, 0x31, 0xc0, 0x70, 0xb3, 0xfb, 0x4e, 0xf8, 0x0a, 0x57, 0xb7, 0x49, 0xb5, 0x73, 0xa1, 0x5f, 0x9b, 0x6a, 0x07, 0x6c, 0x87, 0x71, 0x87, 0xd4, 0xbe, 0x98, 0x1e, 0x98, 0xee, 0x52, 0xc1, 0x7b, 0x95, 0x0f, 0x28, 0x32, 0x36, 0x28, 0xd0, 0x3a, 0x0f, 0x7d, 0x2a, 0xa9, 0x62, 0xb9, | ||||
| 	/* (2^140)P */ 0x97, 0xe6, 0x18, 0x77, 0xf9, 0x34, 0xac, 0xbc, 0xe0, 0x62, 0x9f, 0x42, 0xde, 0xbd, 0x2f, 0xf7, 0x1f, 0xb7, 0x14, 0x52, 0x8a, 0x79, 0xb2, 0x3f, 0xd2, 0x95, 0x71, 0x01, 0xe8, 0xaf, 0x8c, 0xa4, 0xa4, 0xa7, 0x27, 0xf3, 0x5c, 0xdf, 0x3e, 0x57, 0x7a, 0xf1, 0x76, 0x49, 0xe6, 0x42, 0x3f, 0x8f, 0x1e, 0x63, 0x4a, 0x65, 0xb5, 0x41, 0xf5, 0x02, | ||||
| 	/* (2^141)P */ 0x72, 0x85, 0xc5, 0x0b, 0xe1, 0x47, 0x64, 0x02, 0xc5, 0x4d, 0x81, 0x69, 0xb2, 0xcf, 0x0f, 0x6c, 0xd4, 0x6d, 0xd0, 0xc7, 0xb4, 0x1c, 0xd0, 0x32, 0x59, 0x89, 0xe2, 0xe0, 0x96, 0x8b, 0x12, 0x98, 0xbf, 0x63, 0x7a, 0x4c, 0x76, 0x7e, 0x58, 0x17, 0x8f, 0x5b, 0x0a, 0x59, 0x65, 0x75, 0xbc, 0x61, 0x1f, 0xbe, 0xc5, 0x6e, 0x0a, 0x57, 0x52, 0x70, | ||||
| 	/* (2^142)P */ 0x92, 0x1c, 0x77, 0xbb, 0x62, 0x02, 0x6c, 0x25, 0x9c, 0x66, 0x07, 0x83, 0xab, 0xcc, 0x80, 0x5d, 0xd2, 0x76, 0x0c, 0xa4, 0xc5, 0xb4, 0x8a, 0x68, 0x23, 0x31, 0x32, 0x29, 0x8a, 0x47, 0x92, 0x12, 0x80, 0xb3, 0xfa, 0x18, 0xe4, 0x8d, 0xc0, 0x4d, 0xfe, 0x97, 0x5f, 0x72, 0x41, 0xb5, 0x5c, 0x7a, 0xbd, 0xf0, 0xcf, 0x5e, 0x97, 0xaa, 0x64, 0x32, | ||||
| 	/* (2^143)P */ 0x35, 0x3f, 0x75, 0xc1, 0x7a, 0x75, 0x7e, 0xa9, 0xc6, 0x0b, 0x4e, 0x32, 0x62, 0xec, 0xe3, 0x5c, 0xfb, 0x01, 0x43, 0xb6, 0xd4, 0x5b, 0x75, 0xd2, 0xee, 0x7f, 0x5d, 0x23, 0x2b, 0xb3, 0x54, 0x34, 0x4c, 0xd3, 0xb4, 0x32, 0x84, 0x81, 0xb5, 0x09, 0x76, 0x19, 0xda, 0x58, 0xda, 0x7c, 0xdb, 0x2e, 0xdd, 0x4c, 0x8e, 0xdd, 0x5d, 0x89, 0x10, 0x10, | ||||
| 	/* (2^144)P */ 0x57, 0x25, 0x6a, 0x08, 0x37, 0x92, 0xa8, 0xdf, 0x24, 0xef, 0x8f, 0x33, 0x34, 0x52, 0xa4, 0x4c, 0xf0, 0x77, 0x9f, 0x69, 0x77, 0xd5, 0x8f, 0xd2, 0x9a, 0xb3, 0xb6, 0x1d, 0x2d, 0xa6, 0xf7, 0x1f, 0xda, 0xd7, 0xcb, 0x75, 0x11, 0xc3, 0x6b, 0xc0, 0x38, 0xb1, 0xd5, 0x2d, 0x96, 0x84, 0x16, 0xfa, 0x26, 0xb9, 0xcc, 0x3f, 0x16, 0x47, 0x23, 0x74, | ||||
| 	/* (2^145)P */ 0x9b, 0x61, 0x2a, 0x1c, 0xdd, 0x39, 0xa5, 0xfa, 0x1c, 0x7d, 0x63, 0x50, 0xca, 0xe6, 0x9d, 0xfa, 0xb7, 0xc4, 0x4c, 0x6a, 0x97, 0x5f, 0x36, 0x4e, 0x47, 0xdd, 0x17, 0xf7, 0xf9, 0x19, 0xce, 0x75, 0x17, 0xad, 0xce, 0x2a, 0xf3, 0xfe, 0x27, 0x8f, 0x3e, 0x48, 0xc0, 0x60, 0x87, 0x24, 0x19, 0xae, 0x59, 0xe4, 0x5a, 0x00, 0x2a, 0xba, 0xa2, 0x1f, | ||||
| 	/* (2^146)P */ 0x26, 0x88, 0x42, 0x60, 0x9f, 0x6e, 0x2c, 0x7c, 0x39, 0x0f, 0x47, 0x6a, 0x0e, 0x02, 0xbb, 0x4b, 0x34, 0x29, 0x55, 0x18, 0x36, 0xcf, 0x3b, 0x47, 0xf1, 0x2e, 0xfc, 0x6e, 0x94, 0xff, 0xe8, 0x6b, 0x06, 0xd2, 0xba, 0x77, 0x5e, 0x60, 0xd7, 0x19, 0xef, 0x02, 0x9d, 0x3a, 0xc2, 0xb7, 0xa9, 0xd8, 0x57, 0xee, 0x7e, 0x2b, 0xf2, 0x6d, 0x28, 0xda, | ||||
| 	/* (2^147)P */ 0xdf, 0xd9, 0x92, 0x11, 0x98, 0x23, 0xe2, 0x45, 0x2f, 0x74, 0x70, 0xee, 0x0e, 0x55, 0x65, 0x79, 0x86, 0x38, 0x17, 0x92, 0x85, 0x87, 0x99, 0x50, 0xd9, 0x7c, 0xdb, 0xa1, 0x10, 0xec, 0x30, 0xb7, 0x40, 0xa3, 0x23, 0x9b, 0x0e, 0x27, 0x49, 0x29, 0x03, 0x94, 0xff, 0x53, 0xdc, 0xd7, 0xed, 0x49, 0xa9, 0x5a, 0x3b, 0xee, 0xd7, 0xc7, 0x65, 0xaf, | ||||
| 	/* (2^148)P */ 0xa0, 0xbd, 0xbe, 0x03, 0xee, 0x0c, 0xbe, 0x32, 0x00, 0x7b, 0x52, 0xcb, 0x92, 0x29, 0xbf, 0xa0, 0xc6, 0xd9, 0xd2, 0xd6, 0x15, 0xe8, 0x3a, 0x75, 0x61, 0x65, 0x56, 0xae, 0xad, 0x3c, 0x2a, 0x64, 0x14, 0x3f, 0x8e, 0xc1, 0x2d, 0x0c, 0x8d, 0x20, 0xdb, 0x58, 0x4b, 0xe5, 0x40, 0x15, 0x4b, 0xdc, 0xa8, 0xbd, 0xef, 0x08, 0xa7, 0xd1, 0xf4, 0xb0, | ||||
| 	/* (2^149)P */ 0xa9, 0x0f, 0x05, 0x94, 0x66, 0xac, 0x1f, 0x65, 0x3f, 0xe1, 0xb8, 0xe1, 0x34, 0x5e, 0x1d, 0x8f, 0xe3, 0x93, 0x03, 0x15, 0xff, 0xb6, 0x65, 0xb6, 0x6e, 0xc0, 0x2f, 0xd4, 0x2e, 0xb9, 0x2c, 0x13, 0x3c, 0x99, 0x1c, 0xb5, 0x87, 0xba, 0x79, 0xcb, 0xf0, 0x18, 0x06, 0x86, 0x04, 0x14, 0x25, 0x09, 0xcd, 0x1c, 0x14, 0xda, 0x35, 0xd0, 0x38, 0x3b, | ||||
| 	/* (2^150)P */ 0x1b, 0x04, 0xa3, 0x27, 0xb4, 0xd3, 0x37, 0x48, 0x1e, 0x8f, 0x69, 0xd3, 0x5a, 0x2f, 0x20, 0x02, 0x36, 0xbe, 0x06, 0x7b, 0x6b, 0x6c, 0x12, 0x5b, 0x80, 0x74, 0x44, 0xe6, 0xf8, 0xf5, 0x95, 0x59, 0x29, 0xab, 0x51, 0x47, 0x83, 0x28, 0xe0, 0xad, 0xde, 0xaa, 0xd3, 0xb1, 0x1a, 0xcb, 0xa3, 0xcd, 0x8b, 0x6a, 0xb1, 0xa7, 0x0a, 0xd1, 0xf9, 0xbe, | ||||
| 	/* (2^151)P */ 0xce, 0x2f, 0x85, 0xca, 0x74, 0x6d, 0x49, 0xb8, 0xce, 0x80, 0x44, 0xe0, 0xda, 0x5b, 0xcf, 0x2f, 0x79, 0x74, 0xfe, 0xb4, 0x2c, 0x99, 0x20, 0x6e, 0x09, 0x04, 0xfb, 0x6d, 0x57, 0x5b, 0x95, 0x0c, 0x45, 0xda, 0x4f, 0x7f, 0x63, 0xcc, 0x85, 0x5a, 0x67, 0x50, 0x68, 0x71, 0xb4, 0x67, 0xb1, 0x2e, 0xc1, 0x1c, 0xdc, 0xff, 0x2a, 0x7c, 0x10, 0x5e, | ||||
| 	/* (2^152)P */ 0xa6, 0xde, 0xf3, 0xd4, 0x22, 0x30, 0x24, 0x9e, 0x0b, 0x30, 0x54, 0x59, 0x7e, 0xa2, 0xeb, 0x89, 0x54, 0x65, 0x3e, 0x40, 0xd1, 0xde, 0xe6, 0xee, 0x4d, 0xbf, 0x5e, 0x40, 0x1d, 0xee, 0x4f, 0x68, 0xd9, 0xa7, 0x2f, 0xb3, 0x64, 0xb3, 0xf5, 0xc8, 0xd3, 0xaa, 0x70, 0x70, 0x3d, 0xef, 0xd3, 0x95, 0x54, 0xdb, 0x3e, 0x94, 0x95, 0x92, 0x1f, 0x45, | ||||
| 	/* (2^153)P */ 0x22, 0x80, 0x1d, 0x9d, 0x96, 0xa5, 0x78, 0x6f, 0xe0, 0x1e, 0x1b, 0x66, 0x42, 0xc8, 0xae, 0x9e, 0x46, 0x45, 0x08, 0x41, 0xdf, 0x80, 0xae, 0x6f, 0xdb, 0x15, 0x5a, 0x21, 0x31, 0x7a, 0xd0, 0xf2, 0x54, 0x15, 0x88, 0xd3, 0x0f, 0x7f, 0x14, 0x5a, 0x14, 0x97, 0xab, 0xf4, 0x58, 0x6a, 0x9f, 0xea, 0x74, 0xe5, 0x6b, 0x90, 0x59, 0x2b, 0x48, 0xd9, | ||||
| 	/* (2^154)P */ 0x12, 0x24, 0x04, 0xf5, 0x50, 0xc2, 0x8c, 0xb0, 0x7c, 0x46, 0x98, 0xd5, 0x24, 0xad, 0xf6, 0x72, 0xdc, 0x82, 0x1a, 0x60, 0xc1, 0xeb, 0x48, 0xef, 0x7f, 0x6e, 0xe6, 0xcc, 0xdb, 0x7b, 0xae, 0xbe, 0x5e, 0x1e, 0x5c, 0xe6, 0x0a, 0x70, 0xdf, 0xa4, 0xa3, 0x85, 0x1b, 0x1b, 0x7f, 0x72, 0xb9, 0x96, 0x6f, 0xdc, 0x03, 0x76, 0x66, 0xfb, 0xa0, 0x33, | ||||
| 	/* (2^155)P */ 0x37, 0x40, 0xbb, 0xbc, 0x68, 0x58, 0x86, 0xca, 0xbb, 0xa5, 0x24, 0x76, 0x3d, 0x48, 0xd1, 0xad, 0xb4, 0xa8, 0xcf, 0xc3, 0xb6, 0xa8, 0xba, 0x1a, 0x3a, 0xbe, 0x33, 0x75, 0x04, 0x5c, 0x13, 0x8c, 0x0d, 0x70, 0x8d, 0xa6, 0x4e, 0x2a, 0xeb, 0x17, 0x3c, 0x22, 0xdd, 0x3e, 0x96, 0x40, 0x11, 0x9e, 0x4e, 0xae, 0x3d, 0xf8, 0x91, 0xd7, 0x50, 0xc8, | ||||
| 	/* (2^156)P */ 0xd8, 0xca, 0xde, 0x19, 0xcf, 0x00, 0xe4, 0x73, 0x18, 0x7f, 0x9b, 0x9f, 0xf4, 0x5b, 0x49, 0x49, 0x99, 0xdc, 0xa4, 0x46, 0x21, 0xb5, 0xd7, 0x3e, 0xb7, 0x47, 0x1b, 0xa9, 0x9f, 0x4c, 0x69, 0x7d, 0xec, 0x33, 0xd6, 0x1c, 0x51, 0x7f, 0x47, 0x74, 0x7a, 0x6c, 0xf3, 0xd2, 0x2e, 0xbf, 0xdf, 0x6c, 0x9e, 0x77, 0x3b, 0x34, 0xf6, 0x73, 0x80, 0xed, | ||||
| 	/* (2^157)P */ 0x16, 0xfb, 0x16, 0xc3, 0xc2, 0x83, 0xe4, 0xf4, 0x03, 0x7f, 0x52, 0xb0, 0x67, 0x51, 0x7b, 0x24, 0x5a, 0x51, 0xd3, 0xb6, 0x4e, 0x59, 0x76, 0xcd, 0x08, 0x7b, 0x1d, 0x7a, 0x9c, 0x65, 0xae, 0xce, 0xaa, 0xd2, 0x1c, 0x85, 0x66, 0x68, 0x06, 0x15, 0xa8, 0x06, 0xe6, 0x16, 0x37, 0xf4, 0x49, 0x9e, 0x0f, 0x50, 0x37, 0xb1, 0xb2, 0x93, 0x70, 0x43, | ||||
| 	/* (2^158)P */ 0x18, 0x3a, 0x16, 0xe5, 0x8d, 0xc8, 0x35, 0xd6, 0x7b, 0x09, 0xec, 0x61, 0x5f, 0x5c, 0x2a, 0x19, 0x96, 0x2e, 0xc3, 0xfd, 0xab, 0xe6, 0x23, 0xae, 0xab, 0xc5, 0xcb, 0xb9, 0x7b, 0x2d, 0x34, 0x51, 0xb9, 0x41, 0x9e, 0x7d, 0xca, 0xda, 0x25, 0x45, 0x14, 0xb0, 0xc7, 0x4d, 0x26, 0x2b, 0xfe, 0x43, 0xb0, 0x21, 0x5e, 0xfa, 0xdc, 0x7c, 0xf9, 0x5a, | ||||
| 	/* (2^159)P */ 0x94, 0xad, 0x42, 0x17, 0xf5, 0xcd, 0x1c, 0x0d, 0xf6, 0x41, 0xd2, 0x55, 0xbb, 0x50, 0xf1, 0xc6, 0xbc, 0xa6, 0xc5, 0x3a, 0xfd, 0x9b, 0x75, 0x3e, 0xf6, 0x1a, 0xa7, 0xb2, 0x6e, 0x64, 0x12, 0xdc, 0x3c, 0xe5, 0xf6, 0xfc, 0x3b, 0xfa, 0x43, 0x81, 0xd4, 0xa5, 0xee, 0xf5, 0x9c, 0x47, 0x2f, 0xd0, 0x9c, 0xde, 0xa1, 0x48, 0x91, 0x9a, 0x34, 0xc1, | ||||
| 	/* (2^160)P */ 0x37, 0x1b, 0xb3, 0x88, 0xc9, 0x98, 0x4e, 0xfb, 0x84, 0x4f, 0x2b, 0x0a, 0xb6, 0x8f, 0x35, 0x15, 0xcd, 0x61, 0x7a, 0x5f, 0x5c, 0xa0, 0xca, 0x23, 0xa0, 0x93, 0x1f, 0xcc, 0x3c, 0x39, 0x3a, 0x24, 0xa7, 0x49, 0xad, 0x8d, 0x59, 0xcc, 0x94, 0x5a, 0x16, 0xf5, 0x70, 0xe8, 0x52, 0x1e, 0xee, 0x20, 0x30, 0x17, 0x7e, 0xf0, 0x4c, 0x93, 0x06, 0x5a, | ||||
| 	/* (2^161)P */ 0x81, 0xba, 0x3b, 0xd7, 0x3e, 0xb4, 0x32, 0x3a, 0x22, 0x39, 0x2a, 0xfc, 0x19, 0xd9, 0xd2, 0xf6, 0xc5, 0x79, 0x6c, 0x0e, 0xde, 0xda, 0x01, 0xff, 0x52, 0xfb, 0xb6, 0x95, 0x4e, 0x7a, 0x10, 0xb8, 0x06, 0x86, 0x3c, 0xcd, 0x56, 0xd6, 0x15, 0xbf, 0x6e, 0x3e, 0x4f, 0x35, 0x5e, 0xca, 0xbc, 0xa5, 0x95, 0xa2, 0xdf, 0x2d, 0x1d, 0xaf, 0x59, 0xf9, | ||||
| 	/* (2^162)P */ 0x69, 0xe5, 0xe2, 0xfa, 0xc9, 0x7f, 0xdd, 0x09, 0xf5, 0x6b, 0x4e, 0x2e, 0xbe, 0xb4, 0xbf, 0x3e, 0xb2, 0xf2, 0x81, 0x30, 0xe1, 0x07, 0xa8, 0x0d, 0x2b, 0xd2, 0x5a, 0x55, 0xbe, 0x4b, 0x86, 0x5d, 0xb0, 0x5e, 0x7c, 0x8f, 0xc1, 0x3c, 0x81, 0x4c, 0xf7, 0x6d, 0x7d, 0xe6, 0x4f, 0x8a, 0x85, 0xc2, 0x2f, 0x28, 0xef, 0x8c, 0x69, 0xc2, 0xc2, 0x1a, | ||||
| 	/* (2^163)P */ 0xd9, 0xe4, 0x0e, 0x1e, 0xc2, 0xf7, 0x2f, 0x9f, 0xa1, 0x40, 0xfe, 0x46, 0x16, 0xaf, 0x2e, 0xd1, 0xec, 0x15, 0x9b, 0x61, 0x92, 0xce, 0xfc, 0x10, 0x43, 0x1d, 0x00, 0xf6, 0xbe, 0x20, 0x80, 0x80, 0x6f, 0x3c, 0x16, 0x94, 0x59, 0xba, 0x03, 0x53, 0x6e, 0xb6, 0xdd, 0x25, 0x7b, 0x86, 0xbf, 0x96, 0xf4, 0x2f, 0xa1, 0x96, 0x8d, 0xf9, 0xb3, 0x29, | ||||
| 	/* (2^164)P */ 0x3b, 0x04, 0x60, 0x6e, 0xce, 0xab, 0xd2, 0x63, 0x18, 0x53, 0x88, 0x16, 0x4a, 0x6a, 0xab, 0x72, 0x03, 0x68, 0xa5, 0xd4, 0x0d, 0xb2, 0x82, 0x81, 0x1f, 0x2b, 0x5c, 0x75, 0xe8, 0xd2, 0x1d, 0x7f, 0xe7, 0x1b, 0x35, 0x02, 0xde, 0xec, 0xbd, 0xcb, 0xc7, 0x01, 0xd3, 0x95, 0x61, 0xfe, 0xb2, 0x7a, 0x66, 0x09, 0x4c, 0x6d, 0xfd, 0x39, 0xf7, 0x52, | ||||
| 	/* (2^165)P */ 0x42, 0xc1, 0x5f, 0xf8, 0x35, 0x52, 0xc1, 0xfe, 0xc5, 0x11, 0x80, 0x1c, 0x11, 0x46, 0x31, 0x11, 0xbe, 0xd0, 0xc4, 0xb6, 0x07, 0x13, 0x38, 0xa0, 0x8d, 0x65, 0xf0, 0x56, 0x9e, 0x16, 0xbf, 0x9d, 0xcd, 0x51, 0x34, 0xf9, 0x08, 0x48, 0x7b, 0x76, 0x0c, 0x7b, 0x30, 0x07, 0xa8, 0x76, 0xaf, 0xa3, 0x29, 0x38, 0xb0, 0x58, 0xde, 0x72, 0x4b, 0x45, | ||||
| 	/* (2^166)P */ 0xd4, 0x16, 0xa7, 0xc0, 0xb4, 0x9f, 0xdf, 0x1a, 0x37, 0xc8, 0x35, 0xed, 0xc5, 0x85, 0x74, 0x64, 0x09, 0x22, 0xef, 0xe9, 0x0c, 0xaf, 0x12, 0x4c, 0x9e, 0xf8, 0x47, 0x56, 0xe0, 0x7f, 0x4e, 0x24, 0x6b, 0x0c, 0xe7, 0xad, 0xc6, 0x47, 0x1d, 0xa4, 0x0d, 0x86, 0x89, 0x65, 0xe8, 0x5f, 0x71, 0xc7, 0xe9, 0xcd, 0xec, 0x6c, 0x62, 0xc7, 0xe3, 0xb3, | ||||
| 	/* (2^167)P */ 0xb5, 0xea, 0x86, 0xe3, 0x15, 0x18, 0x3f, 0x6d, 0x7b, 0x05, 0x95, 0x15, 0x53, 0x26, 0x1c, 0xeb, 0xbe, 0x7e, 0x16, 0x42, 0x4b, 0xa2, 0x3d, 0xdd, 0x0e, 0xff, 0xba, 0x67, 0xb5, 0xae, 0x7a, 0x17, 0xde, 0x23, 0xad, 0x14, 0xcc, 0xd7, 0xaf, 0x57, 0x01, 0xe0, 0xdd, 0x48, 0xdd, 0xd7, 0xe3, 0xdf, 0xe9, 0x2d, 0xda, 0x67, 0xa4, 0x9f, 0x29, 0x04, | ||||
| 	/* (2^168)P */ 0x16, 0x53, 0xe6, 0x9c, 0x4e, 0xe5, 0x1e, 0x70, 0x81, 0x25, 0x02, 0x9b, 0x47, 0x6d, 0xd2, 0x08, 0x73, 0xbe, 0x0a, 0xf1, 0x7b, 0xeb, 0x24, 0xeb, 0x38, 0x23, 0x5c, 0xb6, 0x3e, 0xce, 0x1e, 0xe3, 0xbc, 0x82, 0x35, 0x1f, 0xaf, 0x3a, 0x3a, 0xe5, 0x4e, 0xc1, 0xca, 0xbf, 0x47, 0xb4, 0xbb, 0xbc, 0x5f, 0xea, 0xc6, 0xca, 0xf3, 0xa0, 0xa2, 0x73, | ||||
| 	/* (2^169)P */ 0xef, 0xa4, 0x7a, 0x4e, 0xe4, 0xc7, 0xb6, 0x43, 0x2e, 0xa5, 0xe4, 0xa5, 0xba, 0x1e, 0xa5, 0xfe, 0x9e, 0xce, 0xa9, 0x80, 0x04, 0xcb, 0x4f, 0xd8, 0x74, 0x05, 0x48, 0xfa, 0x99, 0x11, 0x5d, 0x97, 0x3b, 0x07, 0x0d, 0xdd, 0xe6, 0xb1, 0x74, 0x87, 0x1a, 0xd3, 0x26, 0xb7, 0x8f, 0xe1, 0x63, 0x3d, 0xec, 0x53, 0x93, 0xb0, 0x81, 0x78, 0x34, 0xa4, | ||||
| 	/* (2^170)P */ 0xe1, 0xe7, 0xd4, 0x58, 0x9d, 0x0e, 0x8b, 0x65, 0x66, 0x37, 0x16, 0x48, 0x6f, 0xaa, 0x42, 0x37, 0x77, 0xad, 0xb1, 0x56, 0x48, 0xdf, 0x65, 0x36, 0x30, 0xb8, 0x00, 0x12, 0xd8, 0x32, 0x28, 0x7f, 0xc1, 0x71, 0xeb, 0x93, 0x0f, 0x48, 0x04, 0xe1, 0x5a, 0x6a, 0x96, 0xc1, 0xca, 0x89, 0x6d, 0x1b, 0x82, 0x4c, 0x18, 0x6d, 0x55, 0x4b, 0xea, 0xfd, | ||||
| 	/* (2^171)P */ 0x62, 0x1a, 0x53, 0xb4, 0xb1, 0xbe, 0x6f, 0x15, 0x18, 0x88, 0xd4, 0x66, 0x61, 0xc7, 0x12, 0x69, 0x02, 0xbd, 0x03, 0x23, 0x2b, 0xef, 0xf9, 0x54, 0xa4, 0x85, 0xa8, 0xe3, 0xb7, 0xbd, 0xa9, 0xa3, 0xf3, 0x2a, 0xdd, 0xf1, 0xd4, 0x03, 0x0f, 0xa9, 0xa1, 0xd8, 0xa3, 0xcd, 0xb2, 0x71, 0x90, 0x4b, 0x35, 0x62, 0xf2, 0x2f, 0xce, 0x67, 0x1f, 0xaa, | ||||
| 	/* (2^172)P */ 0x9e, 0x1e, 0xcd, 0x43, 0x7e, 0x87, 0x37, 0x94, 0x3a, 0x97, 0x4c, 0x7e, 0xee, 0xc9, 0x37, 0x85, 0xf1, 0xd9, 0x4f, 0xbf, 0xf9, 0x6f, 0x39, 0x9a, 0x39, 0x87, 0x2e, 0x25, 0x84, 0x42, 0xc3, 0x80, 0xcb, 0x07, 0x22, 0xae, 0x30, 0xd5, 0x50, 0xa1, 0x23, 0xcc, 0x31, 0x81, 0x9d, 0xf1, 0x30, 0xd9, 0x2b, 0x73, 0x41, 0x16, 0x50, 0xab, 0x2d, 0xa2, | ||||
| 	/* (2^173)P */ 0xa4, 0x69, 0x4f, 0xa1, 0x4e, 0xb9, 0xbf, 0x14, 0xe8, 0x2b, 0x04, 0x93, 0xb7, 0x6e, 0x9f, 0x7d, 0x73, 0x0a, 0xc5, 0x14, 0xb8, 0xde, 0x8c, 0xc1, 0xfe, 0xc0, 0xa7, 0xa4, 0xcc, 0x42, 0x42, 0x81, 0x15, 0x65, 0x8a, 0x80, 0xb9, 0xde, 0x1f, 0x60, 0x33, 0x0e, 0xcb, 0xfc, 0xe0, 0xdb, 0x83, 0xa1, 0xe5, 0xd0, 0x16, 0x86, 0x2c, 0xe2, 0x87, 0xed, | ||||
| 	/* (2^174)P */ 0x7a, 0xc0, 0xeb, 0x6b, 0xf6, 0x0d, 0x4c, 0x6d, 0x1e, 0xdb, 0xab, 0xe7, 0x19, 0x45, 0xc6, 0xe3, 0xb2, 0x06, 0xbb, 0xbc, 0x70, 0x99, 0x83, 0x33, 0xeb, 0x28, 0xc8, 0x77, 0xf6, 0x4d, 0x01, 0xb7, 0x59, 0xa0, 0xd2, 0xb3, 0x2a, 0x72, 0x30, 0xe7, 0x11, 0x39, 0xb6, 0x41, 0x29, 0x65, 0x5a, 0x14, 0xb9, 0x86, 0x08, 0xe0, 0x7d, 0x32, 0x8c, 0xf0, | ||||
| 	/* (2^175)P */ 0x5c, 0x11, 0x30, 0x9e, 0x05, 0x27, 0xf5, 0x45, 0x0f, 0xb3, 0xc9, 0x75, 0xc3, 0xd7, 0xe1, 0x82, 0x3b, 0x8e, 0x87, 0x23, 0x00, 0x15, 0x19, 0x07, 0xd9, 0x21, 0x53, 0xc7, 0xf1, 0xa3, 0xbf, 0x70, 0x64, 0x15, 0x18, 0xca, 0x23, 0x9e, 0xd3, 0x08, 0xc3, 0x2a, 0x8b, 0xe5, 0x83, 0x04, 0x89, 0x14, 0xfd, 0x28, 0x25, 0x1c, 0xe3, 0x26, 0xa7, 0x22, | ||||
| 	/* (2^176)P */ 0xdc, 0xd4, 0x75, 0x60, 0x99, 0x94, 0xea, 0x09, 0x8e, 0x8a, 0x3c, 0x1b, 0xf9, 0xbd, 0x33, 0x0d, 0x51, 0x3d, 0x12, 0x6f, 0x4e, 0x72, 0xe0, 0x17, 0x20, 0xe9, 0x75, 0xe6, 0x3a, 0xb2, 0x13, 0x83, 0x4e, 0x7a, 0x08, 0x9e, 0xd1, 0x04, 0x5f, 0x6b, 0x42, 0x0b, 0x76, 0x2a, 0x2d, 0x77, 0x53, 0x6c, 0x65, 0x6d, 0x8e, 0x25, 0x3c, 0xb6, 0x8b, 0x69, | ||||
| 	/* (2^177)P */ 0xb9, 0x49, 0x28, 0xd0, 0xdc, 0x6c, 0x8f, 0x4c, 0xc9, 0x14, 0x8a, 0x38, 0xa3, 0xcb, 0xc4, 0x9d, 0x53, 0xcf, 0xe9, 0xe3, 0xcf, 0xe0, 0xb1, 0xf2, 0x1b, 0x4c, 0x7f, 0x83, 0x2a, 0x7a, 0xe9, 0x8b, 0x3b, 0x86, 0x61, 0x30, 0xe9, 0x99, 0xbd, 0xba, 0x19, 0x6e, 0x65, 0x2a, 0x12, 0x3e, 0x9c, 0xa8, 0xaf, 0xc3, 0xcf, 0xf8, 0x1f, 0x77, 0x86, 0xea, | ||||
| 	/* (2^178)P */ 0x30, 0xde, 0xe7, 0xff, 0x54, 0xf7, 0xa2, 0x59, 0xf6, 0x0b, 0xfb, 0x7a, 0xf2, 0x39, 0xf0, 0xdb, 0x39, 0xbc, 0xf0, 0xfa, 0x60, 0xeb, 0x6b, 0x4f, 0x47, 0x17, 0xc8, 0x00, 0x65, 0x6d, 0x25, 0x1c, 0xd0, 0x48, 0x56, 0x53, 0x45, 0x11, 0x30, 0x02, 0x49, 0x20, 0x27, 0xac, 0xf2, 0x4c, 0xac, 0x64, 0x3d, 0x52, 0xb8, 0x89, 0xe0, 0x93, 0x16, 0x0f, | ||||
| 	/* (2^179)P */ 0x84, 0x09, 0xba, 0x40, 0xb2, 0x2f, 0xa3, 0xa8, 0xc2, 0xba, 0x46, 0x33, 0x05, 0x9d, 0x62, 0xad, 0xa1, 0x3c, 0x33, 0xef, 0x0d, 0xeb, 0xf0, 0x77, 0x11, 0x5a, 0xb0, 0x21, 0x9c, 0xdf, 0x55, 0x24, 0x25, 0x35, 0x51, 0x61, 0x92, 0xf0, 0xb1, 0xce, 0xf5, 0xd4, 0x7b, 0x6c, 0x21, 0x9d, 0x56, 0x52, 0xf8, 0xa1, 0x4c, 0xe9, 0x27, 0x55, 0xac, 0x91, | ||||
| 	/* (2^180)P */ 0x03, 0x3e, 0x30, 0xd2, 0x0a, 0xfa, 0x7d, 0x82, 0x3d, 0x1f, 0x8b, 0xcb, 0xb6, 0x04, 0x5c, 0xcc, 0x8b, 0xda, 0xe2, 0x68, 0x74, 0x08, 0x8c, 0x44, 0x83, 0x57, 0x6d, 0x6f, 0x80, 0xb0, 0x7e, 0xa9, 0x82, 0x91, 0x7b, 0x4c, 0x37, 0x97, 0xd1, 0x63, 0xd1, 0xbd, 0x45, 0xe6, 0x8a, 0x86, 0xd6, 0x89, 0x54, 0xfd, 0xd2, 0xb1, 0xd7, 0x54, 0xad, 0xaf, | ||||
| 	/* (2^181)P */ 0x8b, 0x33, 0x62, 0x49, 0x9f, 0x63, 0xf9, 0x87, 0x42, 0x58, 0xbf, 0xb3, 0xe6, 0x68, 0x02, 0x60, 0x5c, 0x76, 0x62, 0xf7, 0x61, 0xd7, 0x36, 0x31, 0xf7, 0x9c, 0xb5, 0xe5, 0x13, 0x6c, 0xea, 0x78, 0xae, 0xcf, 0xde, 0xbf, 0xb6, 0xeb, 0x4f, 0xc8, 0x2a, 0xb4, 0x9a, 0x9f, 0xf3, 0xd1, 0x6a, 0xec, 0x0c, 0xbd, 0x85, 0x98, 0x40, 0x06, 0x1c, 0x2a, | ||||
| 	/* (2^182)P */ 0x74, 0x3b, 0xe7, 0x81, 0xd5, 0xae, 0x54, 0x56, 0x03, 0xe8, 0x97, 0x16, 0x76, 0xcf, 0x24, 0x96, 0x96, 0x5b, 0xcc, 0x09, 0xab, 0x23, 0x6f, 0x54, 0xae, 0x8f, 0xe4, 0x12, 0xcb, 0xfd, 0xbc, 0xac, 0x93, 0x45, 0x3d, 0x68, 0x08, 0x22, 0x59, 0xc6, 0xf0, 0x47, 0x19, 0x8c, 0x79, 0x93, 0x1e, 0x0e, 0x30, 0xb0, 0x94, 0xfb, 0x17, 0x1d, 0x5a, 0x12, | ||||
| 	/* (2^183)P */ 0x85, 0xff, 0x40, 0x18, 0x85, 0xff, 0x44, 0x37, 0x69, 0x23, 0x4d, 0x34, 0xe1, 0xeb, 0xa3, 0x1b, 0x55, 0x40, 0xc1, 0x64, 0xf4, 0xd4, 0x13, 0x0a, 0x9f, 0xb9, 0x19, 0xfc, 0x88, 0x7d, 0xc0, 0x72, 0xcf, 0x69, 0x2f, 0xd2, 0x0c, 0x82, 0x0f, 0xda, 0x08, 0xba, 0x0f, 0xaa, 0x3b, 0xe9, 0xe5, 0x83, 0x7a, 0x06, 0xe8, 0x1b, 0x38, 0x43, 0xc3, 0x54, | ||||
| 	/* (2^184)P */ 0x14, 0xaa, 0xb3, 0x6e, 0xe6, 0x28, 0xee, 0xc5, 0x22, 0x6c, 0x7c, 0xf9, 0xa8, 0x71, 0xcc, 0xfe, 0x68, 0x7e, 0xd3, 0xb8, 0x37, 0x96, 0xca, 0x0b, 0xd9, 0xb6, 0x06, 0xa9, 0xf6, 0x71, 0xe8, 0x31, 0xf7, 0xd8, 0xf1, 0x5d, 0xab, 0xb9, 0xf0, 0x5c, 0x98, 0xcf, 0x22, 0xa2, 0x2a, 0xf6, 0xd0, 0x59, 0xf0, 0x9d, 0xd9, 0x6a, 0x4f, 0x59, 0x57, 0xad, | ||||
| 	/* (2^185)P */ 0xd7, 0x2b, 0x3d, 0x38, 0x4c, 0x2e, 0x23, 0x4d, 0x49, 0xa2, 0x62, 0x62, 0xf9, 0x0f, 0xde, 0x08, 0xf3, 0x86, 0x71, 0xb6, 0xc7, 0xf9, 0x85, 0x9c, 0x33, 0xa1, 0xcf, 0x16, 0xaa, 0x60, 0xb9, 0xb7, 0xea, 0xed, 0x01, 0x1c, 0x59, 0xdb, 0x3f, 0x3f, 0x97, 0x2e, 0xf0, 0x09, 0x9f, 0x10, 0x85, 0x5f, 0x53, 0x39, 0xf3, 0x13, 0x40, 0x56, 0x95, 0xf9, | ||||
| 	/* (2^186)P */ 0xb4, 0xe3, 0xda, 0xc6, 0x1f, 0x78, 0x8e, 0xac, 0xd4, 0x20, 0x1d, 0xa0, 0xbf, 0x4c, 0x09, 0x16, 0xa7, 0x30, 0xb5, 0x8d, 0x9e, 0xa1, 0x5f, 0x6d, 0x52, 0xf4, 0x71, 0xb6, 0x32, 0x2d, 0x21, 0x51, 0xc6, 0xfc, 0x2f, 0x08, 0xf4, 0x13, 0x6c, 0x55, 0xba, 0x72, 0x81, 0x24, 0x49, 0x0e, 0x4f, 0x06, 0x36, 0x39, 0x6a, 0xc5, 0x81, 0xfc, 0xeb, 0xb2, | ||||
| 	/* (2^187)P */ 0x7d, 0x8d, 0xc8, 0x6c, 0xea, 0xb4, 0xb9, 0xe8, 0x40, 0xc9, 0x69, 0xc9, 0x30, 0x05, 0xfd, 0x34, 0x46, 0xfd, 0x94, 0x05, 0x16, 0xf5, 0x4b, 0x13, 0x3d, 0x24, 0x1a, 0xd6, 0x64, 0x2b, 0x9c, 0xe2, 0xa5, 0xd9, 0x98, 0xe0, 0xe8, 0xf4, 0xbc, 0x2c, 0xbd, 0xa2, 0x56, 0xe3, 0x9e, 0x14, 0xdb, 0xbf, 0x05, 0xbf, 0x9a, 0x13, 0x5d, 0xf7, 0x91, 0xa3, | ||||
| 	/* (2^188)P */ 0x8b, 0xcb, 0x27, 0xf3, 0x15, 0x26, 0x05, 0x40, 0x0f, 0xa6, 0x15, 0x13, 0x71, 0x95, 0xa2, 0xc6, 0x38, 0x04, 0x67, 0xf8, 0x9a, 0x83, 0x06, 0xaa, 0x25, 0x36, 0x72, 0x01, 0x6f, 0x74, 0x5f, 0xe5, 0x6e, 0x44, 0x99, 0xce, 0x13, 0xbc, 0x82, 0xc2, 0x0d, 0xa4, 0x98, 0x50, 0x38, 0xf3, 0xa2, 0xc5, 0xe5, 0x24, 0x1f, 0x6f, 0x56, 0x3e, 0x07, 0xb2, | ||||
| 	/* (2^189)P */ 0xbd, 0x0f, 0x32, 0x60, 0x07, 0xb1, 0xd7, 0x0b, 0x11, 0x07, 0x57, 0x02, 0x89, 0xe8, 0x8b, 0xe8, 0x5a, 0x1f, 0xee, 0x54, 0x6b, 0xff, 0xb3, 0x04, 0x07, 0x57, 0x13, 0x0b, 0x94, 0xa8, 0x4d, 0x81, 0xe2, 0x17, 0x16, 0x45, 0xd4, 0x4b, 0xf7, 0x7e, 0x64, 0x66, 0x20, 0xe8, 0x0b, 0x26, 0xfd, 0xa9, 0x8a, 0x47, 0x52, 0x89, 0x14, 0xd0, 0xd1, 0xa1, | ||||
| 	/* (2^190)P */ 0xdc, 0x03, 0xe6, 0x20, 0x44, 0x47, 0x8f, 0x04, 0x16, 0x24, 0x22, 0xc1, 0x55, 0x5c, 0xbe, 0x43, 0xc3, 0x92, 0xc5, 0x54, 0x3d, 0x5d, 0xd1, 0x05, 0x9c, 0xc6, 0x7c, 0xbf, 0x23, 0x84, 0x1a, 0xba, 0x4f, 0x1f, 0xfc, 0xa1, 0xae, 0x1a, 0x64, 0x02, 0x51, 0xf1, 0xcb, 0x7a, 0x20, 0xce, 0xb2, 0x34, 0x3c, 0xca, 0xe0, 0xe4, 0xba, 0x22, 0xd4, 0x7b, | ||||
| 	/* (2^191)P */ 0xca, 0xfd, 0xca, 0xd7, 0xde, 0x61, 0xae, 0xf0, 0x79, 0x0c, 0x20, 0xab, 0xbc, 0x6f, 0x4d, 0x61, 0xf0, 0xc7, 0x9c, 0x8d, 0x4b, 0x52, 0xf3, 0xb9, 0x48, 0x63, 0x0b, 0xb6, 0xd2, 0x25, 0x9a, 0x96, 0x72, 0xc1, 0x6b, 0x0c, 0xb5, 0xfb, 0x71, 0xaa, 0xad, 0x47, 0x5b, 0xe7, 0xc0, 0x0a, 0x55, 0xb2, 0xd4, 0x16, 0x2f, 0xb1, 0x01, 0xfd, 0xce, 0x27, | ||||
| 	/* (2^192)P */ 0x64, 0x11, 0x4b, 0xab, 0x57, 0x09, 0xc6, 0x49, 0x4a, 0x37, 0xc3, 0x36, 0xc4, 0x7b, 0x81, 0x1f, 0x42, 0xed, 0xbb, 0xe0, 0xa0, 0x8d, 0x51, 0xe6, 0xca, 0x8b, 0xb9, 0xcd, 0x99, 0x2d, 0x91, 0x53, 0xa9, 0x47, 0xcb, 0x32, 0xc7, 0xa4, 0x92, 0xec, 0x46, 0x74, 0x44, 0x6d, 0x71, 0x9f, 0x6d, 0x0c, 0x69, 0xa4, 0xf8, 0xbe, 0x9f, 0x7f, 0xa0, 0xd7, | ||||
| 	/* (2^193)P */ 0x5f, 0x33, 0xb6, 0x91, 0xc8, 0xa5, 0x3f, 0x5d, 0x7f, 0x38, 0x6e, 0x74, 0x20, 0x4a, 0xd6, 0x2b, 0x98, 0x2a, 0x41, 0x4b, 0x83, 0x64, 0x0b, 0x92, 0x7a, 0x06, 0x1e, 0xc6, 0x2c, 0xf6, 0xe4, 0x91, 0xe5, 0xb1, 0x2e, 0x6e, 0x4e, 0xa8, 0xc8, 0x14, 0x32, 0x57, 0x44, 0x1c, 0xe4, 0xb9, 0x7f, 0x54, 0x51, 0x08, 0x81, 0xaa, 0x4e, 0xce, 0xa1, 0x5d, | ||||
| 	/* (2^194)P */ 0x5c, 0xd5, 0x9b, 0x5e, 0x7c, 0xb5, 0xb1, 0x52, 0x73, 0x00, 0x41, 0x56, 0x79, 0x08, 0x7e, 0x07, 0x28, 0x06, 0xa6, 0xfb, 0x7f, 0x69, 0xbd, 0x7a, 0x3c, 0xae, 0x9f, 0x39, 0xbb, 0x54, 0xa2, 0x79, 0xb9, 0x0e, 0x7f, 0xbb, 0xe0, 0xe6, 0xb7, 0x27, 0x64, 0x38, 0x45, 0xdb, 0x84, 0xe4, 0x61, 0x72, 0x3f, 0xe2, 0x24, 0xfe, 0x7a, 0x31, 0x9a, 0xc9, | ||||
| 	/* (2^195)P */ 0xa1, 0xd2, 0xa4, 0xee, 0x24, 0x96, 0xe5, 0x5b, 0x79, 0x78, 0x3c, 0x7b, 0x82, 0x3b, 0x8b, 0x58, 0x0b, 0xa3, 0x63, 0x2d, 0xbc, 0x75, 0x46, 0xe8, 0x83, 0x1a, 0xc0, 0x2a, 0x92, 0x61, 0xa8, 0x75, 0x37, 0x3c, 0xbf, 0x0f, 0xef, 0x8f, 0x6c, 0x97, 0x75, 0x10, 0x05, 0x7a, 0xde, 0x23, 0xe8, 0x2a, 0x35, 0xeb, 0x41, 0x64, 0x7d, 0xcf, 0xe0, 0x52, | ||||
| 	/* (2^196)P */ 0x4a, 0xd0, 0x49, 0x93, 0xae, 0xf3, 0x24, 0x8c, 0xe1, 0x09, 0x98, 0x45, 0xd8, 0xb9, 0xfe, 0x8e, 0x8c, 0xa8, 0x2c, 0xc9, 0x9f, 0xce, 0x01, 0xdc, 0x38, 0x11, 0xab, 0x85, 0xb9, 0xe8, 0x00, 0x51, 0xfd, 0x82, 0xe1, 0x9b, 0x4e, 0xfc, 0xb5, 0x2a, 0x0f, 0x8b, 0xda, 0x4e, 0x02, 0xca, 0xcc, 0xe3, 0x91, 0xc4, 0xe0, 0xcf, 0x7b, 0xd6, 0xe6, 0x6a, | ||||
| 	/* (2^197)P */ 0xfe, 0x11, 0xd7, 0xaa, 0xe3, 0x0c, 0x52, 0x2e, 0x04, 0xe0, 0xe0, 0x61, 0xc8, 0x05, 0xd7, 0x31, 0x4c, 0xc3, 0x9b, 0x2d, 0xce, 0x59, 0xbe, 0x12, 0xb7, 0x30, 0x21, 0xfc, 0x81, 0xb8, 0x5e, 0x57, 0x73, 0xd0, 0xad, 0x8e, 0x9e, 0xe4, 0xeb, 0xcd, 0xcf, 0xd2, 0x0f, 0x01, 0x35, 0x16, 0xed, 0x7a, 0x43, 0x8e, 0x42, 0xdc, 0xea, 0x4c, 0xa8, 0x7c, | ||||
| 	/* (2^198)P */ 0x37, 0x26, 0xcc, 0x76, 0x0b, 0xe5, 0x76, 0xdd, 0x3e, 0x19, 0x3c, 0xc4, 0x6c, 0x7f, 0xd0, 0x03, 0xc1, 0xb8, 0x59, 0x82, 0xca, 0x36, 0xc1, 0xe4, 0xc8, 0xb2, 0x83, 0x69, 0x9c, 0xc5, 0x9d, 0x12, 0x82, 0x1c, 0xea, 0xb2, 0x84, 0x9f, 0xf3, 0x52, 0x6b, 0xbb, 0xd8, 0x81, 0x56, 0x83, 0x04, 0x66, 0x05, 0x22, 0x49, 0x37, 0x93, 0xb1, 0xfd, 0xd5, | ||||
| 	/* (2^199)P */ 0xaf, 0x96, 0xbf, 0x03, 0xbe, 0xe6, 0x5d, 0x78, 0x19, 0xba, 0x37, 0x46, 0x0a, 0x2b, 0x52, 0x7c, 0xd8, 0x51, 0x9e, 0x3d, 0x29, 0x42, 0xdb, 0x0e, 0x31, 0x20, 0x94, 0xf8, 0x43, 0x9a, 0x2d, 0x22, 0xd3, 0xe3, 0xa1, 0x79, 0x68, 0xfb, 0x2d, 0x7e, 0xd6, 0x79, 0xda, 0x0b, 0xc6, 0x5b, 0x76, 0x68, 0xf0, 0xfe, 0x72, 0x59, 0xbb, 0xa1, 0x9c, 0x74, | ||||
| 	/* (2^200)P */ 0x0a, 0xd9, 0xec, 0xc5, 0xbd, 0xf0, 0xda, 0xcf, 0x82, 0xab, 0x46, 0xc5, 0x32, 0x13, 0xdc, 0x5b, 0xac, 0xc3, 0x53, 0x9a, 0x7f, 0xef, 0xa5, 0x40, 0x5a, 0x1f, 0xc1, 0x12, 0x91, 0x54, 0x83, 0x6a, 0xb0, 0x9a, 0x85, 0x4d, 0xbf, 0x36, 0x8e, 0xd3, 0xa2, 0x2b, 0xe5, 0xd6, 0xc6, 0xe1, 0x58, 0x5b, 0x82, 0x9b, 0xc8, 0xf2, 0x03, 0xba, 0xf5, 0x92, | ||||
| 	/* (2^201)P */ 0xfb, 0x21, 0x7e, 0xde, 0xe7, 0xb4, 0xc0, 0x56, 0x86, 0x3a, 0x5b, 0x78, 0xf8, 0xf0, 0xf4, 0xe7, 0x5c, 0x00, 0xd2, 0xd7, 0xd6, 0xf8, 0x75, 0x5e, 0x0f, 0x3e, 0xd1, 0x4b, 0x77, 0xd8, 0xad, 0xb0, 0xc9, 0x8b, 0x59, 0x7d, 0x30, 0x76, 0x64, 0x7a, 0x76, 0xd9, 0x51, 0x69, 0xfc, 0xbd, 0x8e, 0xb5, 0x55, 0xe0, 0xd2, 0x07, 0x15, 0xa9, 0xf7, 0xa4, | ||||
| 	/* (2^202)P */ 0xaa, 0x2d, 0x2f, 0x2b, 0x3c, 0x15, 0xdd, 0xcd, 0xe9, 0x28, 0x82, 0x4f, 0xa2, 0xaa, 0x31, 0x48, 0xcc, 0xfa, 0x07, 0x73, 0x8a, 0x34, 0x74, 0x0d, 0xab, 0x1a, 0xca, 0xd2, 0xbf, 0x3a, 0xdb, 0x1a, 0x5f, 0x50, 0x62, 0xf4, 0x6b, 0x83, 0x38, 0x43, 0x96, 0xee, 0x6b, 0x39, 0x1e, 0xf0, 0x17, 0x80, 0x1e, 0x9b, 0xed, 0x2b, 0x2f, 0xcc, 0x65, 0xf7, | ||||
| 	/* (2^203)P */ 0x03, 0xb3, 0x23, 0x9c, 0x0d, 0xd1, 0xeb, 0x7e, 0x34, 0x17, 0x8a, 0x4c, 0xde, 0x54, 0x39, 0xc4, 0x11, 0x82, 0xd3, 0xa4, 0x00, 0x32, 0x95, 0x9c, 0xa6, 0x64, 0x76, 0x6e, 0xd6, 0x53, 0x27, 0xb4, 0x6a, 0x14, 0x8c, 0x54, 0xf6, 0x58, 0x9e, 0x22, 0x4a, 0x55, 0x18, 0x77, 0xd0, 0x08, 0x6b, 0x19, 0x8a, 0xb5, 0xe7, 0x19, 0xb8, 0x60, 0x92, 0xb1, | ||||
| 	/* (2^204)P */ 0x66, 0xec, 0xf3, 0x12, 0xde, 0x67, 0x7f, 0xd4, 0x5b, 0xf6, 0x70, 0x64, 0x0a, 0xb5, 0xc2, 0xf9, 0xb3, 0x64, 0xab, 0x56, 0x46, 0xc7, 0x93, 0xc2, 0x8b, 0x2d, 0xd0, 0xd6, 0x39, 0x3b, 0x1f, 0xcd, 0xb3, 0xac, 0xcc, 0x2c, 0x27, 0x6a, 0xbc, 0xb3, 0x4b, 0xa8, 0x3c, 0x69, 0x20, 0xe2, 0x18, 0x35, 0x17, 0xe1, 0x8a, 0xd3, 0x11, 0x74, 0xaa, 0x4d, | ||||
| 	/* (2^205)P */ 0x96, 0xc4, 0x16, 0x7e, 0xfd, 0xf5, 0xd0, 0x7d, 0x1f, 0x32, 0x1b, 0xdb, 0xa6, 0xfd, 0x51, 0x75, 0x4d, 0xd7, 0x00, 0xe5, 0x7f, 0x58, 0x5b, 0xeb, 0x4b, 0x6a, 0x78, 0xfe, 0xe5, 0xd6, 0x8f, 0x99, 0x17, 0xca, 0x96, 0x45, 0xf7, 0x52, 0xdf, 0x84, 0x06, 0x77, 0xb9, 0x05, 0x63, 0x5d, 0xe9, 0x91, 0xb1, 0x4b, 0x82, 0x5a, 0xdb, 0xd7, 0xca, 0x69, | ||||
| 	/* (2^206)P */ 0x02, 0xd3, 0x38, 0x38, 0x87, 0xea, 0xbd, 0x9f, 0x11, 0xca, 0xf3, 0x21, 0xf1, 0x9b, 0x35, 0x97, 0x98, 0xff, 0x8e, 0x6d, 0x3d, 0xd6, 0xb2, 0xfa, 0x68, 0xcb, 0x7e, 0x62, 0x85, 0xbb, 0xc7, 0x5d, 0xee, 0x32, 0x30, 0x2e, 0x71, 0x96, 0x63, 0x43, 0x98, 0xc4, 0xa7, 0xde, 0x60, 0xb2, 0xd9, 0x43, 0x4a, 0xfa, 0x97, 0x2d, 0x5f, 0x21, 0xd4, 0xfe, | ||||
| 	/* (2^207)P */ 0x3b, 0x20, 0x29, 0x07, 0x07, 0xb5, 0x78, 0xc3, 0xc7, 0xab, 0x56, 0xba, 0x40, 0xde, 0x1d, 0xcf, 0xc3, 0x00, 0x56, 0x21, 0x0c, 0xc8, 0x42, 0xd9, 0x0e, 0xcd, 0x02, 0x7c, 0x07, 0xb9, 0x11, 0xd7, 0x96, 0xaf, 0xff, 0xad, 0xc5, 0xba, 0x30, 0x6d, 0x82, 0x3a, 0xbf, 0xef, 0x7b, 0xf7, 0x0a, 0x74, 0xbd, 0x31, 0x0c, 0xe4, 0xec, 0x1a, 0xe5, 0xc5, | ||||
| 	/* (2^208)P */ 0xcc, 0xf2, 0x28, 0x16, 0x12, 0xbf, 0xef, 0x85, 0xbc, 0xf7, 0xcb, 0x9f, 0xdb, 0xa8, 0xb2, 0x49, 0x53, 0x48, 0xa8, 0x24, 0xa8, 0x68, 0x8d, 0xbb, 0x21, 0x0a, 0x5a, 0xbd, 0xb2, 0x91, 0x61, 0x47, 0xc4, 0x43, 0x08, 0xa6, 0x19, 0xef, 0x8e, 0x88, 0x39, 0xc6, 0x33, 0x30, 0xf3, 0x0e, 0xc5, 0x92, 0x66, 0xd6, 0xfe, 0xc5, 0x12, 0xd9, 0x4c, 0x2d, | ||||
| 	/* (2^209)P */ 0x30, 0x34, 0x07, 0xbf, 0x9c, 0x5a, 0x4e, 0x65, 0xf1, 0x39, 0x35, 0x38, 0xae, 0x7b, 0x55, 0xac, 0x6a, 0x92, 0x24, 0x7e, 0x50, 0xd3, 0xba, 0x78, 0x51, 0xfe, 0x4d, 0x32, 0x05, 0x11, 0xf5, 0x52, 0xf1, 0x31, 0x45, 0x39, 0x98, 0x7b, 0x28, 0x56, 0xc3, 0x5d, 0x4f, 0x07, 0x6f, 0x84, 0xb8, 0x1a, 0x58, 0x0b, 0xc4, 0x7c, 0xc4, 0x8d, 0x32, 0x8e, | ||||
| 	/* (2^210)P */ 0x7e, 0xaf, 0x98, 0xce, 0xc5, 0x2b, 0x9d, 0xf6, 0xfa, 0x2c, 0xb6, 0x2a, 0x5a, 0x1d, 0xc0, 0x24, 0x8d, 0xa4, 0xce, 0xb1, 0x12, 0x01, 0xf9, 0x79, 0xc6, 0x79, 0x38, 0x0c, 0xd4, 0x07, 0xc9, 0xf7, 0x37, 0xa1, 0x0b, 0xfe, 0x72, 0xec, 0x5d, 0xd6, 0xb0, 0x1c, 0x70, 0xbe, 0x70, 0x01, 0x13, 0xe0, 0x86, 0x95, 0xc7, 0x2e, 0x12, 0x3b, 0xe6, 0xa6, | ||||
| 	/* (2^211)P */ 0x24, 0x82, 0x67, 0xe0, 0x14, 0x7b, 0x56, 0x08, 0x38, 0x44, 0xdb, 0xa0, 0x3a, 0x05, 0x47, 0xb2, 0xc0, 0xac, 0xd1, 0xcc, 0x3f, 0x82, 0xb8, 0x8a, 0x88, 0xbc, 0xf5, 0x33, 0xa1, 0x35, 0x0f, 0xf6, 0xe2, 0xef, 0x6c, 0xf7, 0x37, 0x9e, 0xe8, 0x10, 0xca, 0xb0, 0x8e, 0x80, 0x86, 0x00, 0x23, 0xd0, 0x4a, 0x76, 0x9f, 0xf7, 0x2c, 0x52, 0x15, 0x0e, | ||||
| 	/* (2^212)P */ 0x5e, 0x49, 0xe1, 0x2c, 0x9a, 0x01, 0x76, 0xa6, 0xb3, 0x07, 0x5b, 0xa4, 0x07, 0xef, 0x1d, 0xc3, 0x6a, 0xbb, 0x64, 0xbe, 0x71, 0x15, 0x6e, 0x32, 0x31, 0x46, 0x9a, 0x9e, 0x8f, 0x45, 0x73, 0xce, 0x0b, 0x94, 0x1a, 0x52, 0x07, 0xf4, 0x50, 0x30, 0x49, 0x53, 0x50, 0xfb, 0x71, 0x1f, 0x5a, 0x03, 0xa9, 0x76, 0xf2, 0x8f, 0x42, 0xff, 0xed, 0xed, | ||||
| 	/* (2^213)P */ 0xed, 0x08, 0xdb, 0x91, 0x1c, 0xee, 0xa2, 0xb4, 0x47, 0xa2, 0xfa, 0xcb, 0x03, 0xd1, 0xff, 0x8c, 0xad, 0x64, 0x50, 0x61, 0xcd, 0xfc, 0x88, 0xa0, 0x31, 0x95, 0x30, 0xb9, 0x58, 0xdd, 0xd7, 0x43, 0xe4, 0x46, 0xc2, 0x16, 0xd9, 0x72, 0x4a, 0x56, 0x51, 0x70, 0x85, 0xf1, 0xa1, 0x80, 0x40, 0xd5, 0xba, 0x67, 0x81, 0xda, 0xcd, 0x03, 0xea, 0x51, | ||||
| 	/* (2^214)P */ 0x42, 0x50, 0xf0, 0xef, 0x37, 0x61, 0x72, 0x85, 0xe1, 0xf1, 0xff, 0x6f, 0x3d, 0xe8, 0x7b, 0x21, 0x5c, 0xe5, 0x50, 0x03, 0xde, 0x00, 0xc1, 0xf7, 0x3a, 0x55, 0x12, 0x1c, 0x9e, 0x1e, 0xce, 0xd1, 0x2f, 0xaf, 0x05, 0x70, 0x5b, 0x47, 0xf2, 0x04, 0x7a, 0x89, 0xbc, 0x78, 0xa6, 0x65, 0x6c, 0xaa, 0x3c, 0xa2, 0x3c, 0x8b, 0x5c, 0xa9, 0x22, 0x48, | ||||
| 	/* (2^215)P */ 0x7e, 0x8c, 0x8f, 0x2f, 0x60, 0xe3, 0x5a, 0x94, 0xd4, 0xce, 0xdd, 0x9d, 0x83, 0x3b, 0x77, 0x78, 0x43, 0x1d, 0xfd, 0x8f, 0xc8, 0xe8, 0x02, 0x90, 0xab, 0xf6, 0xc9, 0xfc, 0xf1, 0x63, 0xaa, 0x5f, 0x42, 0xf1, 0x78, 0x34, 0x64, 0x16, 0x75, 0x9c, 0x7d, 0xd0, 0xe4, 0x74, 0x5a, 0xa8, 0xfb, 0xcb, 0xac, 0x20, 0xa3, 0xc2, 0xa6, 0x20, 0xf8, 0x1b, | ||||
| 	/* (2^216)P */ 0x00, 0x4f, 0x1e, 0x56, 0xb5, 0x34, 0xb2, 0x87, 0x31, 0xe5, 0xee, 0x8d, 0xf1, 0x41, 0x67, 0xb7, 0x67, 0x3a, 0x54, 0x86, 0x5c, 0xf0, 0x0b, 0x37, 0x2f, 0x1b, 0x92, 0x5d, 0x58, 0x93, 0xdc, 0xd8, 0x58, 0xcc, 0x9e, 0x67, 0xd0, 0x97, 0x3a, 0xaf, 0x49, 0x39, 0x2d, 0x3b, 0xd8, 0x98, 0xfb, 0x76, 0x6b, 0xe7, 0xaf, 0xc3, 0x45, 0x44, 0x53, 0x94, | ||||
| 	/* (2^217)P */ 0x30, 0xbd, 0x90, 0x75, 0xd3, 0xbd, 0x3b, 0x58, 0x27, 0x14, 0x9f, 0x6b, 0xd4, 0x31, 0x99, 0xcd, 0xde, 0x3a, 0x21, 0x1e, 0xb4, 0x02, 0xe4, 0x33, 0x04, 0x02, 0xb0, 0x50, 0x66, 0x68, 0x90, 0xdd, 0x7b, 0x69, 0x31, 0xd9, 0xcf, 0x68, 0x73, 0xf1, 0x60, 0xdd, 0xc8, 0x1d, 0x5d, 0xe3, 0xd6, 0x5b, 0x2a, 0xa4, 0xea, 0xc4, 0x3f, 0x08, 0xcd, 0x9c, | ||||
| 	/* (2^218)P */ 0x6b, 0x1a, 0xbf, 0x55, 0xc1, 0x1b, 0x0c, 0x05, 0x09, 0xdf, 0xf5, 0x5e, 0xa3, 0x77, 0x95, 0xe9, 0xdf, 0x19, 0xdd, 0xc7, 0x94, 0xcb, 0x06, 0x73, 0xd0, 0x88, 0x02, 0x33, 0x94, 0xca, 0x7a, 0x2f, 0x8e, 0x3d, 0x72, 0x61, 0x2d, 0x4d, 0xa6, 0x61, 0x1f, 0x32, 0x5e, 0x87, 0x53, 0x36, 0x11, 0x15, 0x20, 0xb3, 0x5a, 0x57, 0x51, 0x93, 0x20, 0xd8, | ||||
| 	/* (2^219)P */ 0xb7, 0x56, 0xf4, 0xab, 0x7d, 0x0c, 0xfb, 0x99, 0x1a, 0x30, 0x29, 0xb0, 0x75, 0x2a, 0xf8, 0x53, 0x71, 0x23, 0xbd, 0xa7, 0xd8, 0x0a, 0xe2, 0x27, 0x65, 0xe9, 0x74, 0x26, 0x98, 0x4a, 0x69, 0x19, 0xb2, 0x4d, 0x0a, 0x17, 0x98, 0xb2, 0xa9, 0x57, 0x4e, 0xf6, 0x86, 0xc8, 0x01, 0xa4, 0xc6, 0x98, 0xad, 0x5a, 0x90, 0x2c, 0x05, 0x46, 0x64, 0xb7, | ||||
| 	/* (2^220)P */ 0x7b, 0x91, 0xdf, 0xfc, 0xf8, 0x1c, 0x8c, 0x15, 0x9e, 0xf7, 0xd5, 0xa8, 0xe8, 0xe7, 0xe3, 0xa3, 0xb0, 0x04, 0x74, 0xfa, 0x78, 0xfb, 0x26, 0xbf, 0x67, 0x42, 0xf9, 0x8c, 0x9b, 0xb4, 0x69, 0x5b, 0x02, 0x13, 0x6d, 0x09, 0x6c, 0xd6, 0x99, 0x61, 0x7b, 0x89, 0x4a, 0x67, 0x75, 0xa3, 0x98, 0x13, 0x23, 0x1d, 0x18, 0x24, 0x0e, 0xef, 0x41, 0x79, | ||||
| 	/* (2^221)P */ 0x86, 0x33, 0xab, 0x08, 0xcb, 0xbf, 0x1e, 0x76, 0x3c, 0x0b, 0xbd, 0x30, 0xdb, 0xe9, 0xa3, 0x35, 0x87, 0x1b, 0xe9, 0x07, 0x00, 0x66, 0x7f, 0x3b, 0x35, 0x0c, 0x8a, 0x3f, 0x61, 0xbc, 0xe0, 0xae, 0xf6, 0xcc, 0x54, 0xe1, 0x72, 0x36, 0x2d, 0xee, 0x93, 0x24, 0xf8, 0xd7, 0xc5, 0xf9, 0xcb, 0xb0, 0xe5, 0x88, 0x0d, 0x23, 0x4b, 0x76, 0x15, 0xa2, | ||||
| 	/* (2^222)P */ 0x37, 0xdb, 0x83, 0xd5, 0x6d, 0x06, 0x24, 0x37, 0x1b, 0x15, 0x85, 0x15, 0xe2, 0xc0, 0x4e, 0x02, 0xa9, 0x6d, 0x0a, 0x3a, 0x94, 0x4a, 0x6f, 0x49, 0x00, 0x01, 0x72, 0xbb, 0x60, 0x14, 0x35, 0xae, 0xb4, 0xc6, 0x01, 0x0a, 0x00, 0x9e, 0xc3, 0x58, 0xc5, 0xd1, 0x5e, 0x30, 0x73, 0x96, 0x24, 0x85, 0x9d, 0xf0, 0xf9, 0xec, 0x09, 0xd3, 0xe7, 0x70, | ||||
| 	/* (2^223)P */ 0xf3, 0xbd, 0x96, 0x87, 0xe9, 0x71, 0xbd, 0xd6, 0xa2, 0x45, 0xeb, 0x0a, 0xcd, 0x2c, 0xf1, 0x72, 0xa6, 0x31, 0xa9, 0x6f, 0x09, 0xa1, 0x5e, 0xdd, 0xc8, 0x8d, 0x0d, 0xbc, 0x5a, 0x8d, 0xb1, 0x2c, 0x9a, 0xcc, 0x37, 0x74, 0xc2, 0xa9, 0x4e, 0xd6, 0xc0, 0x3c, 0xa0, 0x23, 0xb0, 0xa0, 0x77, 0x14, 0x80, 0x45, 0x71, 0x6a, 0x2d, 0x41, 0xc3, 0x82, | ||||
| 	/* (2^224)P */ 0x37, 0x44, 0xec, 0x8a, 0x3e, 0xc1, 0x0c, 0xa9, 0x12, 0x9c, 0x08, 0x88, 0xcb, 0xd9, 0xf8, 0xba, 0x00, 0xd6, 0xc3, 0xdf, 0xef, 0x7a, 0x44, 0x7e, 0x25, 0x69, 0xc9, 0xc1, 0x46, 0xe5, 0x20, 0x9e, 0xcc, 0x0b, 0x05, 0x3e, 0xf4, 0x78, 0x43, 0x0c, 0xa6, 0x2f, 0xc1, 0xfa, 0x70, 0xb2, 0x3c, 0x31, 0x7a, 0x63, 0x58, 0xab, 0x17, 0xcf, 0x4c, 0x4f, | ||||
| 	/* (2^225)P */ 0x2b, 0x08, 0x31, 0x59, 0x75, 0x8b, 0xec, 0x0a, 0xa9, 0x79, 0x70, 0xdd, 0xf1, 0x11, 0xc3, 0x11, 0x1f, 0xab, 0x37, 0xaa, 0x26, 0xea, 0x53, 0xc4, 0x79, 0xa7, 0x91, 0x00, 0xaa, 0x08, 0x42, 0xeb, 0x8b, 0x8b, 0xe8, 0xc3, 0x2f, 0xb8, 0x78, 0x90, 0x38, 0x0e, 0x8a, 0x42, 0x0c, 0x0f, 0xbf, 0x3e, 0xf8, 0xd8, 0x07, 0xcf, 0x6a, 0x34, 0xc9, 0xfa, | ||||
| 	/* (2^226)P */ 0x11, 0xe0, 0x76, 0x4d, 0x23, 0xc5, 0xa6, 0xcc, 0x9f, 0x9a, 0x2a, 0xde, 0x3a, 0xb5, 0x92, 0x39, 0x19, 0x8a, 0xf1, 0x8d, 0xf9, 0x4d, 0xc9, 0xb4, 0x39, 0x9f, 0x57, 0xd8, 0x72, 0xab, 0x1d, 0x61, 0x6a, 0xb2, 0xff, 0x52, 0xba, 0x54, 0x0e, 0xfb, 0x83, 0x30, 0x8a, 0xf7, 0x3b, 0xf4, 0xd8, 0xae, 0x1a, 0x94, 0x3a, 0xec, 0x63, 0xfe, 0x6e, 0x7c, | ||||
| 	/* (2^227)P */ 0xdc, 0x70, 0x8e, 0x55, 0x44, 0xbf, 0xd2, 0x6a, 0xa0, 0x14, 0x61, 0x89, 0xd5, 0x55, 0x45, 0x3c, 0xf6, 0x40, 0x0d, 0x83, 0x85, 0x44, 0xb4, 0x62, 0x56, 0xfe, 0x60, 0xd7, 0x07, 0x1d, 0x47, 0x30, 0x3b, 0x73, 0xa4, 0xb5, 0xb7, 0xea, 0xac, 0xda, 0xf1, 0x17, 0xaa, 0x60, 0xdf, 0xe9, 0x84, 0xda, 0x31, 0x32, 0x61, 0xbf, 0xd0, 0x7e, 0x8a, 0x02, | ||||
| 	/* (2^228)P */ 0xb9, 0x51, 0xb3, 0x89, 0x21, 0x5d, 0xa2, 0xfe, 0x79, 0x2a, 0xb3, 0x2a, 0x3b, 0xe6, 0x6f, 0x2b, 0x22, 0x03, 0xea, 0x7b, 0x1f, 0xaf, 0x85, 0xc3, 0x38, 0x55, 0x5b, 0x8e, 0xb4, 0xaa, 0x77, 0xfe, 0x03, 0x6e, 0xda, 0x91, 0x24, 0x0c, 0x48, 0x39, 0x27, 0x43, 0x16, 0xd2, 0x0a, 0x0d, 0x43, 0xa3, 0x0e, 0xca, 0x45, 0xd1, 0x7f, 0xf5, 0xd3, 0x16, | ||||
| 	/* (2^229)P */ 0x3d, 0x32, 0x9b, 0x38, 0xf8, 0x06, 0x93, 0x78, 0x5b, 0x50, 0x2b, 0x06, 0xd8, 0x66, 0xfe, 0xab, 0x9b, 0x58, 0xc7, 0xd1, 0x4d, 0xd5, 0xf8, 0x3b, 0x10, 0x7e, 0x85, 0xde, 0x58, 0x4e, 0xdf, 0x53, 0xd9, 0x58, 0xe0, 0x15, 0x81, 0x9f, 0x1a, 0x78, 0xfc, 0x9f, 0x10, 0xc2, 0x23, 0xd6, 0x78, 0xd1, 0x9d, 0xd2, 0xd5, 0x1c, 0x53, 0xe2, 0xc9, 0x76, | ||||
| 	/* (2^230)P */ 0x98, 0x1e, 0x38, 0x7b, 0x71, 0x18, 0x4b, 0x15, 0xaf, 0xa1, 0xa6, 0x98, 0xcb, 0x26, 0xa3, 0xc8, 0x07, 0x46, 0xda, 0x3b, 0x70, 0x65, 0xec, 0x7a, 0x2b, 0x34, 0x94, 0xa8, 0xb6, 0x14, 0xf8, 0x1a, 0xce, 0xf7, 0xc8, 0x60, 0xf3, 0x88, 0xf4, 0x33, 0x60, 0x7b, 0xd1, 0x02, 0xe7, 0xda, 0x00, 0x4a, 0xea, 0xd2, 0xfd, 0x88, 0xd2, 0x99, 0x28, 0xf3, | ||||
| 	/* (2^231)P */ 0x28, 0x24, 0x1d, 0x26, 0xc2, 0xeb, 0x8b, 0x3b, 0xb4, 0x6b, 0xbe, 0x6b, 0x77, 0xff, 0xf3, 0x21, 0x3b, 0x26, 0x6a, 0x8c, 0x8e, 0x2a, 0x44, 0xa8, 0x01, 0x2b, 0x71, 0xea, 0x64, 0x30, 0xfd, 0xfd, 0x95, 0xcb, 0x39, 0x38, 0x48, 0xfa, 0x96, 0x97, 0x8c, 0x2f, 0x33, 0xca, 0x03, 0xe6, 0xd7, 0x94, 0x55, 0x6c, 0xc3, 0xb3, 0xa8, 0xf7, 0xae, 0x8c, | ||||
| 	/* (2^232)P */ 0xea, 0x62, 0x8a, 0xb4, 0xeb, 0x74, 0xf7, 0xb8, 0xae, 0xc5, 0x20, 0x71, 0x06, 0xd6, 0x7c, 0x62, 0x9b, 0x69, 0x74, 0xef, 0xa7, 0x6d, 0xd6, 0x8c, 0x37, 0xb9, 0xbf, 0xcf, 0xeb, 0xe4, 0x2f, 0x04, 0x02, 0x21, 0x7d, 0x75, 0x6b, 0x92, 0x48, 0xf8, 0x70, 0xad, 0x69, 0xe2, 0xea, 0x0e, 0x88, 0x67, 0x72, 0xcc, 0x2d, 0x10, 0xce, 0x2d, 0xcf, 0x65, | ||||
| 	/* (2^233)P */ 0x49, 0xf3, 0x57, 0x64, 0xe5, 0x5c, 0xc5, 0x65, 0x49, 0x97, 0xc4, 0x8a, 0xcc, 0xa9, 0xca, 0x94, 0x7b, 0x86, 0x88, 0xb6, 0x51, 0x27, 0x69, 0xa5, 0x0f, 0x8b, 0x06, 0x59, 0xa0, 0x94, 0xef, 0x63, 0x1a, 0x01, 0x9e, 0x4f, 0xd2, 0x5a, 0x93, 0xc0, 0x7c, 0xe6, 0x61, 0x77, 0xb6, 0xf5, 0x40, 0xd9, 0x98, 0x43, 0x5b, 0x56, 0x68, 0xe9, 0x37, 0x8f, | ||||
| 	/* (2^234)P */ 0xee, 0x87, 0xd2, 0x05, 0x1b, 0x39, 0x89, 0x10, 0x07, 0x6d, 0xe8, 0xfd, 0x8b, 0x4d, 0xb2, 0xa7, 0x7b, 0x1e, 0xa0, 0x6c, 0x0d, 0x3d, 0x3d, 0x49, 0xba, 0x61, 0x36, 0x1f, 0xc2, 0x84, 0x4a, 0xcc, 0x87, 0xa9, 0x1b, 0x23, 0x04, 0xe2, 0x3e, 0x97, 0xe1, 0xdb, 0xd5, 0x5a, 0xe8, 0x41, 0x6b, 0xe5, 0x5a, 0xa1, 0x99, 0xe5, 0x7b, 0xa7, 0xe0, 0x3b, | ||||
| 	/* (2^235)P */ 0xea, 0xa3, 0x6a, 0xdd, 0x77, 0x7f, 0x77, 0x41, 0xc5, 0x6a, 0xe4, 0xaf, 0x11, 0x5f, 0x88, 0xa5, 0x10, 0xee, 0xd0, 0x8c, 0x0c, 0xb4, 0xa5, 0x2a, 0xd0, 0xd8, 0x1d, 0x47, 0x06, 0xc0, 0xd5, 0xce, 0x51, 0x54, 0x9b, 0x2b, 0xe6, 0x2f, 0xe7, 0xe7, 0x31, 0x5f, 0x5c, 0x23, 0x81, 0x3e, 0x03, 0x93, 0xaa, 0x2d, 0x71, 0x84, 0xa0, 0x89, 0x32, 0xa6, | ||||
| 	/* (2^236)P */ 0x55, 0xa3, 0x13, 0x92, 0x4e, 0x93, 0x7d, 0xec, 0xca, 0x57, 0xfb, 0x37, 0xae, 0xd2, 0x18, 0x2e, 0x54, 0x05, 0x6c, 0xd1, 0x28, 0xca, 0x90, 0x40, 0x82, 0x2e, 0x79, 0xc6, 0x5a, 0xc7, 0xdd, 0x84, 0x93, 0xdf, 0x15, 0xb8, 0x1f, 0xb1, 0xf9, 0xaf, 0x2c, 0xe5, 0x32, 0xcd, 0xc2, 0x99, 0x6d, 0xac, 0x85, 0x5c, 0x63, 0xd3, 0xe2, 0xff, 0x24, 0xda, | ||||
| 	/* (2^237)P */ 0x2d, 0x8d, 0xfd, 0x65, 0xcc, 0xe5, 0x02, 0xa0, 0xe5, 0xb9, 0xec, 0x59, 0x09, 0x50, 0x27, 0xb7, 0x3d, 0x2a, 0x79, 0xb2, 0x76, 0x5d, 0x64, 0x95, 0xf8, 0xc5, 0xaf, 0x8a, 0x62, 0x11, 0x5c, 0x56, 0x1c, 0x05, 0x64, 0x9e, 0x5e, 0xbd, 0x54, 0x04, 0xe6, 0x9e, 0xab, 0xe6, 0x22, 0x7e, 0x42, 0x54, 0xb5, 0xa5, 0xd0, 0x8d, 0x28, 0x6b, 0x0f, 0x0b, | ||||
| 	/* (2^238)P */ 0x2d, 0xb2, 0x8c, 0x59, 0x10, 0x37, 0x84, 0x3b, 0x9b, 0x65, 0x1b, 0x0f, 0x10, 0xf9, 0xea, 0x60, 0x1b, 0x02, 0xf5, 0xee, 0x8b, 0xe6, 0x32, 0x7d, 0x10, 0x7f, 0x5f, 0x8c, 0x72, 0x09, 0x4e, 0x1f, 0x29, 0xff, 0x65, 0xcb, 0x3e, 0x3a, 0xd2, 0x96, 0x50, 0x1e, 0xea, 0x64, 0x99, 0xb5, 0x4c, 0x7a, 0x69, 0xb8, 0x95, 0xae, 0x48, 0xc0, 0x7c, 0xb1, | ||||
| 	/* (2^239)P */ 0xcd, 0x7c, 0x4f, 0x3e, 0xea, 0xf3, 0x90, 0xcb, 0x12, 0x76, 0xd1, 0x17, 0xdc, 0x0d, 0x13, 0x0f, 0xfd, 0x4d, 0xb5, 0x1f, 0xe4, 0xdd, 0xf2, 0x4d, 0x58, 0xea, 0xa5, 0x66, 0x92, 0xcf, 0xe5, 0x54, 0xea, 0x9b, 0x35, 0x83, 0x1a, 0x44, 0x8e, 0x62, 0x73, 0x45, 0x98, 0xa3, 0x89, 0x95, 0x52, 0x93, 0x1a, 0x8d, 0x63, 0x0f, 0xc2, 0x57, 0x3c, 0xb1, | ||||
| 	/* (2^240)P */ 0x72, 0xb4, 0xdf, 0x51, 0xb7, 0xf6, 0x52, 0xa2, 0x14, 0x56, 0xe5, 0x0a, 0x2e, 0x75, 0x81, 0x02, 0xee, 0x93, 0x48, 0x0a, 0x92, 0x4e, 0x0c, 0x0f, 0xdf, 0x09, 0x89, 0x99, 0xf6, 0xf9, 0x22, 0xa2, 0x32, 0xf8, 0xb0, 0x76, 0x0c, 0xb2, 0x4d, 0x6e, 0xbe, 0x83, 0x35, 0x61, 0x44, 0xd2, 0x58, 0xc7, 0xdd, 0x14, 0xcf, 0xc3, 0x4b, 0x7c, 0x07, 0xee, | ||||
| 	/* (2^241)P */ 0x8b, 0x03, 0xee, 0xcb, 0xa7, 0x2e, 0x28, 0xbd, 0x97, 0xd1, 0x4c, 0x2b, 0xd1, 0x92, 0x67, 0x5b, 0x5a, 0x12, 0xbf, 0x29, 0x17, 0xfc, 0x50, 0x09, 0x74, 0x76, 0xa2, 0xd4, 0x82, 0xfd, 0x2c, 0x0c, 0x90, 0xf7, 0xe7, 0xe5, 0x9a, 0x2c, 0x16, 0x40, 0xb9, 0x6c, 0xd9, 0xe0, 0x22, 0x9e, 0xf8, 0xdd, 0x73, 0xe4, 0x7b, 0x9e, 0xbe, 0x4f, 0x66, 0x22, | ||||
| 	/* (2^242)P */ 0xa4, 0x10, 0xbe, 0xb8, 0x83, 0x3a, 0x77, 0x8e, 0xea, 0x0a, 0xc4, 0x97, 0x3e, 0xb6, 0x6c, 0x81, 0xd7, 0x65, 0xd9, 0xf7, 0xae, 0xe6, 0xbe, 0xab, 0x59, 0x81, 0x29, 0x4b, 0xff, 0xe1, 0x0f, 0xc3, 0x2b, 0xad, 0x4b, 0xef, 0xc4, 0x50, 0x9f, 0x88, 0x31, 0xf2, 0xde, 0x80, 0xd6, 0xf4, 0x20, 0x9c, 0x77, 0x9b, 0xbe, 0xbe, 0x08, 0xf5, 0xf0, 0x95, | ||||
| 	/* (2^243)P */ 0x0e, 0x7c, 0x7b, 0x7c, 0xb3, 0xd8, 0x83, 0xfc, 0x8c, 0x75, 0x51, 0x74, 0x1b, 0xe1, 0x6d, 0x11, 0x05, 0x46, 0x24, 0x0d, 0xa4, 0x2b, 0x32, 0xfd, 0x2c, 0x4e, 0x21, 0xdf, 0x39, 0x6b, 0x96, 0xfc, 0xff, 0x92, 0xfc, 0x35, 0x0d, 0x9a, 0x4b, 0xc0, 0x70, 0x46, 0x32, 0x7d, 0xc0, 0xc4, 0x04, 0xe0, 0x2d, 0x83, 0xa7, 0x00, 0xc7, 0xcb, 0xb4, 0x8f, | ||||
| 	/* (2^244)P */ 0xa9, 0x5a, 0x7f, 0x0e, 0xdd, 0x2c, 0x85, 0xaa, 0x4d, 0xac, 0xde, 0xb3, 0xb6, 0xaf, 0xe6, 0xd1, 0x06, 0x7b, 0x2c, 0xa4, 0x01, 0x19, 0x22, 0x7d, 0x78, 0xf0, 0x3a, 0xea, 0x89, 0xfe, 0x21, 0x61, 0x6d, 0xb8, 0xfe, 0xa5, 0x2a, 0xab, 0x0d, 0x7b, 0x51, 0x39, 0xb6, 0xde, 0xbc, 0xf0, 0xc5, 0x48, 0xd7, 0x09, 0x82, 0x6e, 0x66, 0x75, 0xc5, 0xcd, | ||||
| 	/* (2^245)P */ 0xee, 0xdf, 0x2b, 0x6c, 0xa8, 0xde, 0x61, 0xe1, 0x27, 0xfa, 0x2a, 0x0f, 0x68, 0xe7, 0x7a, 0x9b, 0x13, 0xe9, 0x56, 0xd2, 0x1c, 0x3d, 0x2f, 0x3c, 0x7a, 0xf6, 0x6f, 0x45, 0xee, 0xe8, 0xf4, 0xa0, 0xa6, 0xe8, 0xa5, 0x27, 0xee, 0xf2, 0x85, 0xa9, 0xd5, 0x0e, 0xa9, 0x26, 0x60, 0xfe, 0xee, 0xc7, 0x59, 0x99, 0x5e, 0xa3, 0xdf, 0x23, 0x36, 0xd5, | ||||
| 	/* (2^246)P */ 0x15, 0x66, 0x6f, 0xd5, 0x78, 0xa4, 0x0a, 0xf7, 0xb1, 0xe8, 0x75, 0x6b, 0x48, 0x7d, 0xa6, 0x4d, 0x3d, 0x36, 0x9b, 0xc7, 0xcc, 0x68, 0x9a, 0xfe, 0x2f, 0x39, 0x2a, 0x51, 0x31, 0x39, 0x7d, 0x73, 0x6f, 0xc8, 0x74, 0x72, 0x6f, 0x6e, 0xda, 0x5f, 0xad, 0x48, 0xc8, 0x40, 0xe1, 0x06, 0x01, 0x36, 0xa1, 0x88, 0xc8, 0x99, 0x9c, 0xd1, 0x11, 0x8f, | ||||
| 	/* (2^247)P */ 0xab, 0xc5, 0xcb, 0xcf, 0xbd, 0x73, 0x21, 0xd0, 0x82, 0xb1, 0x2e, 0x2d, 0xd4, 0x36, 0x1b, 0xed, 0xa9, 0x8a, 0x26, 0x79, 0xc4, 0x17, 0xae, 0xe5, 0x09, 0x0a, 0x0c, 0xa4, 0x21, 0xa0, 0x6e, 0xdd, 0x62, 0x8e, 0x44, 0x62, 0xcc, 0x50, 0xff, 0x93, 0xb3, 0x9a, 0x72, 0x8c, 0x3f, 0xa1, 0xa6, 0x4d, 0x87, 0xd5, 0x1c, 0x5a, 0xc0, 0x0b, 0x1a, 0xd6, | ||||
| 	/* (2^248)P */ 0x67, 0x36, 0x6a, 0x1f, 0x96, 0xe5, 0x80, 0x20, 0xa9, 0xe8, 0x0b, 0x0e, 0x21, 0x29, 0x3f, 0xc8, 0x0a, 0x6d, 0x27, 0x47, 0xca, 0xd9, 0x05, 0x55, 0xbf, 0x11, 0xcf, 0x31, 0x7a, 0x37, 0xc7, 0x90, 0xa9, 0xf4, 0x07, 0x5e, 0xd5, 0xc3, 0x92, 0xaa, 0x95, 0xc8, 0x23, 0x2a, 0x53, 0x45, 0xe3, 0x3a, 0x24, 0xe9, 0x67, 0x97, 0x3a, 0x82, 0xf9, 0xa6, | ||||
| 	/* (2^249)P */ 0x92, 0x9e, 0x6d, 0x82, 0x67, 0xe9, 0xf9, 0x17, 0x96, 0x2c, 0xa7, 0xd3, 0x89, 0xf9, 0xdb, 0xd8, 0x20, 0xc6, 0x2e, 0xec, 0x4a, 0x76, 0x64, 0xbf, 0x27, 0x40, 0xe2, 0xb4, 0xdf, 0x1f, 0xa0, 0xef, 0x07, 0x80, 0xfb, 0x8e, 0x12, 0xf8, 0xb8, 0xe1, 0xc6, 0xdf, 0x7c, 0x69, 0x35, 0x5a, 0xe1, 0x8e, 0x5d, 0x69, 0x84, 0x56, 0xb6, 0x31, 0x1c, 0x0b, | ||||
| 	/* (2^250)P */ 0xd6, 0x94, 0x5c, 0xef, 0xbb, 0x46, 0x45, 0x44, 0x5b, 0xa1, 0xae, 0x03, 0x65, 0xdd, 0xb5, 0x66, 0x88, 0x35, 0x29, 0x95, 0x16, 0x54, 0xa6, 0xf5, 0xc9, 0x78, 0x34, 0xe6, 0x0f, 0xc4, 0x2b, 0x5b, 0x79, 0x51, 0x68, 0x48, 0x3a, 0x26, 0x87, 0x05, 0x70, 0xaf, 0x8b, 0xa6, 0xc7, 0x2e, 0xb3, 0xa9, 0x10, 0x01, 0xb0, 0xb9, 0x31, 0xfd, 0xdc, 0x80, | ||||
| 	/* (2^251)P */ 0x25, 0xf2, 0xad, 0xd6, 0x75, 0xa3, 0x04, 0x05, 0x64, 0x8a, 0x97, 0x60, 0x27, 0x2a, 0xe5, 0x6d, 0xb0, 0x73, 0xf4, 0x07, 0x2a, 0x9d, 0xe9, 0x46, 0xb4, 0x1c, 0x51, 0xf8, 0x63, 0x98, 0x7e, 0xe5, 0x13, 0x51, 0xed, 0x98, 0x65, 0x98, 0x4f, 0x8f, 0xe7, 0x7e, 0x72, 0xd7, 0x64, 0x11, 0x2f, 0xcd, 0x12, 0xf8, 0xc4, 0x63, 0x52, 0x0f, 0x7f, 0xc4, | ||||
| 	/* (2^252)P */ 0x5c, 0xd9, 0x85, 0x63, 0xc7, 0x8a, 0x65, 0x9a, 0x25, 0x83, 0x31, 0x73, 0x49, 0xf0, 0x93, 0x96, 0x70, 0x67, 0x6d, 0xb1, 0xff, 0x95, 0x54, 0xe4, 0xf8, 0x15, 0x6c, 0x5f, 0xbd, 0xf6, 0x0f, 0x38, 0x7b, 0x68, 0x7d, 0xd9, 0x3d, 0xf0, 0xa9, 0xa0, 0xe4, 0xd1, 0xb6, 0x34, 0x6d, 0x14, 0x16, 0xc2, 0x4c, 0x30, 0x0e, 0x67, 0xd3, 0xbe, 0x2e, 0xc0, | ||||
| 	/* (2^253)P */ 0x06, 0x6b, 0x52, 0xc8, 0x14, 0xcd, 0xae, 0x03, 0x93, 0xea, 0xc1, 0xf2, 0xf6, 0x8b, 0xc5, 0xb6, 0xdc, 0x82, 0x42, 0x29, 0x94, 0xe0, 0x25, 0x6c, 0x3f, 0x9f, 0x5d, 0xe4, 0x96, 0xf6, 0x8e, 0x3f, 0xf9, 0x72, 0xc4, 0x77, 0x60, 0x8b, 0xa4, 0xf9, 0xa8, 0xc3, 0x0a, 0x81, 0xb1, 0x97, 0x70, 0x18, 0xab, 0xea, 0x37, 0x8a, 0x08, 0xc7, 0xe2, 0x95, | ||||
| 	/* (2^254)P */ 0x94, 0x49, 0xd9, 0x5f, 0x76, 0x72, 0x82, 0xad, 0x2d, 0x50, 0x1a, 0x7a, 0x5b, 0xe6, 0x95, 0x1e, 0x95, 0x65, 0x87, 0x1c, 0x52, 0xd7, 0x44, 0xe6, 0x9b, 0x56, 0xcd, 0x6f, 0x05, 0xff, 0x67, 0xc5, 0xdb, 0xa2, 0xac, 0xe4, 0xa2, 0x28, 0x63, 0x5f, 0xfb, 0x0c, 0x3b, 0xf1, 0x87, 0xc3, 0x36, 0x78, 0x3f, 0x77, 0xfa, 0x50, 0x85, 0xf9, 0xd7, 0x82, | ||||
| 	/* (2^255)P */ 0x64, 0xc0, 0xe0, 0xd8, 0x2d, 0xed, 0xcb, 0x6a, 0xfd, 0xcd, 0xbc, 0x7e, 0x9f, 0xc8, 0x85, 0xe9, 0xc1, 0x7c, 0x0f, 0xe5, 0x18, 0xea, 0xd4, 0x51, 0xad, 0x59, 0x13, 0x75, 0xd9, 0x3d, 0xd4, 0x8a, 0xb2, 0xbe, 0x78, 0x52, 0x2b, 0x52, 0x94, 0x37, 0x41, 0xd6, 0xb4, 0xb6, 0x45, 0x20, 0x76, 0xe0, 0x1f, 0x31, 0xdb, 0xb1, 0xa1, 0x43, 0xf0, 0x18, | ||||
| 	/* (2^256)P */ 0x74, 0xa9, 0xa4, 0xa9, 0xdd, 0x6e, 0x3e, 0x68, 0xe5, 0xc3, 0x2e, 0x92, 0x17, 0xa4, 0xcb, 0x80, 0xb1, 0xf0, 0x06, 0x93, 0xef, 0xe6, 0x00, 0xe6, 0x3b, 0xb1, 0x32, 0x65, 0x7b, 0x83, 0xb6, 0x8a, 0x49, 0x1b, 0x14, 0x89, 0xee, 0xba, 0xf5, 0x6a, 0x8d, 0x36, 0xef, 0xb0, 0xd8, 0xb2, 0x16, 0x99, 0x17, 0x35, 0x02, 0x16, 0x55, 0x58, 0xdd, 0x82, | ||||
| 	/* (2^257)P */ 0x36, 0x95, 0xe8, 0xf4, 0x36, 0x42, 0xbb, 0xc5, 0x3e, 0xfa, 0x30, 0x84, 0x9e, 0x59, 0xfd, 0xd2, 0x95, 0x42, 0xf8, 0x64, 0xd9, 0xb9, 0x0e, 0x9f, 0xfa, 0xd0, 0x7b, 0x20, 0x31, 0x77, 0x48, 0x29, 0x4d, 0xd0, 0x32, 0x57, 0x56, 0x30, 0xa6, 0x17, 0x53, 0x04, 0xbf, 0x08, 0x28, 0xec, 0xb8, 0x46, 0xc1, 0x03, 0x89, 0xdc, 0xed, 0xa0, 0x35, 0x53, | ||||
| 	/* (2^258)P */ 0xc5, 0x7f, 0x9e, 0xd8, 0xc5, 0xba, 0x5f, 0x68, 0xc8, 0x23, 0x75, 0xea, 0x0d, 0xd9, 0x5a, 0xfd, 0x61, 0x1a, 0xa3, 0x2e, 0x45, 0x63, 0x14, 0x55, 0x86, 0x21, 0x29, 0xbe, 0xef, 0x5e, 0x50, 0xe5, 0x18, 0x59, 0xe7, 0xe3, 0xce, 0x4d, 0x8c, 0x15, 0x8f, 0x89, 0x66, 0x44, 0x52, 0x3d, 0xfa, 0xc7, 0x9a, 0x59, 0x90, 0x8e, 0xc0, 0x06, 0x3f, 0xc9, | ||||
| 	/* (2^259)P */ 0x8e, 0x04, 0xd9, 0x16, 0x50, 0x1d, 0x8c, 0x9f, 0xd5, 0xe3, 0xce, 0xfd, 0x47, 0x04, 0x27, 0x4d, 0xc2, 0xfa, 0x71, 0xd9, 0x0b, 0xb8, 0x65, 0xf4, 0x11, 0xf3, 0x08, 0xee, 0x81, 0xc8, 0x67, 0x99, 0x0b, 0x8d, 0x77, 0xa3, 0x4f, 0xb5, 0x9b, 0xdb, 0x26, 0xf1, 0x97, 0xeb, 0x04, 0x54, 0xeb, 0x80, 0x08, 0x1d, 0x1d, 0xf6, 0x3d, 0x1f, 0x5a, 0xb8, | ||||
| 	/* (2^260)P */ 0xb7, 0x9c, 0x9d, 0xee, 0xb9, 0x5c, 0xad, 0x0d, 0x9e, 0xfd, 0x60, 0x3c, 0x27, 0x4e, 0xa2, 0x95, 0xfb, 0x64, 0x7e, 0x79, 0x64, 0x87, 0x10, 0xb4, 0x73, 0xe0, 0x9d, 0x46, 0x4d, 0x3d, 0xee, 0x83, 0xe4, 0x16, 0x88, 0x97, 0xe6, 0x4d, 0xba, 0x70, 0xb6, 0x96, 0x7b, 0xff, 0x4b, 0xc8, 0xcf, 0x72, 0x83, 0x3e, 0x5b, 0x24, 0x2e, 0x57, 0xf1, 0x82, | ||||
| 	/* (2^261)P */ 0x30, 0x71, 0x40, 0x51, 0x4f, 0x44, 0xbb, 0xc7, 0xf0, 0x54, 0x6e, 0x9d, 0xeb, 0x15, 0xad, 0xf8, 0x61, 0x43, 0x5a, 0xef, 0xc0, 0xb1, 0x57, 0xae, 0x03, 0x40, 0xe8, 0x68, 0x6f, 0x03, 0x20, 0x4f, 0x8a, 0x51, 0x2a, 0x9e, 0xd2, 0x45, 0xaf, 0xb4, 0xf5, 0xd4, 0x95, 0x7f, 0x3d, 0x3d, 0xb7, 0xb6, 0x28, 0xc5, 0x08, 0x8b, 0x44, 0xd6, 0x3f, 0xe7, | ||||
| 	/* (2^262)P */ 0xa9, 0x52, 0x04, 0x67, 0xcb, 0x20, 0x63, 0xf8, 0x18, 0x01, 0x44, 0x21, 0x6a, 0x8a, 0x83, 0x48, 0xd4, 0xaf, 0x23, 0x0f, 0x35, 0x8d, 0xe5, 0x5a, 0xc4, 0x7c, 0x55, 0x46, 0x19, 0x5f, 0x35, 0xe0, 0x5d, 0x97, 0x4c, 0x2d, 0x04, 0xed, 0x59, 0xd4, 0xb0, 0xb2, 0xc6, 0xe3, 0x51, 0xe1, 0x38, 0xc6, 0x30, 0x49, 0x8f, 0xae, 0x61, 0x64, 0xce, 0xa8, | ||||
| 	/* (2^263)P */ 0x9b, 0x64, 0x83, 0x3c, 0xd3, 0xdf, 0xb9, 0x27, 0xe7, 0x5b, 0x7f, 0xeb, 0xf3, 0x26, 0xcf, 0xb1, 0x8f, 0xaf, 0x26, 0xc8, 0x48, 0xce, 0xa1, 0xac, 0x7d, 0x10, 0x34, 0x28, 0xe1, 0x1f, 0x69, 0x03, 0x64, 0x77, 0x61, 0xdd, 0x4a, 0x9b, 0x18, 0x47, 0xf8, 0xca, 0x63, 0xc9, 0x03, 0x2d, 0x20, 0x2a, 0x69, 0x6e, 0x42, 0xd0, 0xe7, 0xaa, 0xb5, 0xf3, | ||||
| 	/* (2^264)P */ 0xea, 0x31, 0x0c, 0x57, 0x0f, 0x3e, 0xe3, 0x35, 0xd8, 0x30, 0xa5, 0x6f, 0xdd, 0x95, 0x43, 0xc6, 0x66, 0x07, 0x4f, 0x34, 0xc3, 0x7e, 0x04, 0x10, 0x2d, 0xc4, 0x1c, 0x94, 0x52, 0x2e, 0x5b, 0x9a, 0x65, 0x2f, 0x91, 0xaa, 0x4f, 0x3c, 0xdc, 0x23, 0x18, 0xe1, 0x4f, 0x85, 0xcd, 0xf4, 0x8c, 0x51, 0xf7, 0xab, 0x4f, 0xdc, 0x15, 0x5c, 0x9e, 0xc5, | ||||
| 	/* (2^265)P */ 0x54, 0x57, 0x23, 0x17, 0xe7, 0x82, 0x2f, 0x04, 0x7d, 0xfe, 0xe7, 0x1f, 0xa2, 0x57, 0x79, 0xe9, 0x58, 0x9b, 0xbe, 0xc6, 0x16, 0x4a, 0x17, 0x50, 0x90, 0x4a, 0x34, 0x70, 0x87, 0x37, 0x01, 0x26, 0xd8, 0xa3, 0x5f, 0x07, 0x7c, 0xd0, 0x7d, 0x05, 0x8a, 0x93, 0x51, 0x2f, 0x99, 0xea, 0xcf, 0x00, 0xd8, 0xc7, 0xe6, 0x9b, 0x8c, 0x62, 0x45, 0x87, | ||||
| 	/* (2^266)P */ 0xc3, 0xfd, 0x29, 0x66, 0xe7, 0x30, 0x29, 0x77, 0xe0, 0x0d, 0x63, 0x5b, 0xe6, 0x90, 0x1a, 0x1e, 0x99, 0xc2, 0xa7, 0xab, 0xff, 0xa7, 0xbd, 0x79, 0x01, 0x97, 0xfd, 0x27, 0x1b, 0x43, 0x2b, 0xe6, 0xfe, 0x5e, 0xf1, 0xb9, 0x35, 0x38, 0x08, 0x25, 0x55, 0x90, 0x68, 0x2e, 0xc3, 0x67, 0x39, 0x9f, 0x2b, 0x2c, 0x70, 0x48, 0x8c, 0x47, 0xee, 0x56, | ||||
| 	/* (2^267)P */ 0xf7, 0x32, 0x70, 0xb5, 0xe6, 0x42, 0xfd, 0x0a, 0x39, 0x9b, 0x07, 0xfe, 0x0e, 0xf4, 0x47, 0xba, 0x6a, 0x3f, 0xf5, 0x2c, 0x15, 0xf3, 0x60, 0x3f, 0xb1, 0x83, 0x7b, 0x2e, 0x34, 0x58, 0x1a, 0x6e, 0x4a, 0x49, 0x05, 0x45, 0xca, 0xdb, 0x00, 0x01, 0x0c, 0x42, 0x5e, 0x60, 0x40, 0x5f, 0xd9, 0xc7, 0x3a, 0x9e, 0x1c, 0x8d, 0xab, 0x11, 0x55, 0x65, | ||||
| 	/* (2^268)P */ 0x87, 0x40, 0xb7, 0x0d, 0xaa, 0x34, 0x89, 0x90, 0x75, 0x6d, 0xa2, 0xfe, 0x3b, 0x6d, 0x5c, 0x39, 0x98, 0x10, 0x9e, 0x15, 0xc5, 0x35, 0xa2, 0x27, 0x23, 0x0a, 0x2d, 0x60, 0xe2, 0xa8, 0x7f, 0x3e, 0x77, 0x8f, 0xcc, 0x44, 0xcc, 0x30, 0x28, 0xe2, 0xf0, 0x04, 0x8c, 0xee, 0xe4, 0x5f, 0x68, 0x8c, 0xdf, 0x70, 0xbf, 0x31, 0xee, 0x2a, 0xfc, 0xce, | ||||
| 	/* (2^269)P */ 0x92, 0xf2, 0xa0, 0xd9, 0x58, 0x3b, 0x7c, 0x1a, 0x99, 0x46, 0x59, 0x54, 0x60, 0x06, 0x8d, 0x5e, 0xf0, 0x22, 0xa1, 0xed, 0x92, 0x8a, 0x4d, 0x76, 0x95, 0x05, 0x0b, 0xff, 0xfc, 0x9a, 0xd1, 0xcc, 0x05, 0xb9, 0x5e, 0x99, 0xe8, 0x2a, 0x76, 0x7b, 0xfd, 0xa6, 0xe2, 0xd1, 0x1a, 0xd6, 0x76, 0x9f, 0x2f, 0x0e, 0xd1, 0xa8, 0x77, 0x5a, 0x40, 0x5a, | ||||
| 	/* (2^270)P */ 0xff, 0xf9, 0x3f, 0xa9, 0xa6, 0x6c, 0x6d, 0x03, 0x8b, 0xa7, 0x10, 0x5d, 0x3f, 0xec, 0x3e, 0x1c, 0x0b, 0x6b, 0xa2, 0x6a, 0x22, 0xa9, 0x28, 0xd0, 0x66, 0xc9, 0xc2, 0x3d, 0x47, 0x20, 0x7d, 0xa6, 0x1d, 0xd8, 0x25, 0xb5, 0xf2, 0xf9, 0x70, 0x19, 0x6b, 0xf8, 0x43, 0x36, 0xc5, 0x1f, 0xe4, 0x5a, 0x4c, 0x13, 0xe4, 0x6d, 0x08, 0x0b, 0x1d, 0xb1, | ||||
| 	/* (2^271)P */ 0x3f, 0x20, 0x9b, 0xfb, 0xec, 0x7d, 0x31, 0xc5, 0xfc, 0x88, 0x0b, 0x30, 0xed, 0x36, 0xc0, 0x63, 0xb1, 0x7d, 0x10, 0xda, 0xb6, 0x2e, 0xad, 0xf3, 0xec, 0x94, 0xe7, 0xec, 0xb5, 0x9c, 0xfe, 0xf5, 0x35, 0xf0, 0xa2, 0x2d, 0x7f, 0xca, 0x6b, 0x67, 0x1a, 0xf6, 0xb3, 0xda, 0x09, 0x2a, 0xaa, 0xdf, 0xb1, 0xca, 0x9b, 0xfb, 0xeb, 0xb3, 0xcd, 0xc0, | ||||
| 	/* (2^272)P */ 0xcd, 0x4d, 0x89, 0x00, 0xa4, 0x3b, 0x48, 0xf0, 0x76, 0x91, 0x35, 0xa5, 0xf8, 0xc9, 0xb6, 0x46, 0xbc, 0xf6, 0x9a, 0x45, 0x47, 0x17, 0x96, 0x80, 0x5b, 0x3a, 0x28, 0x33, 0xf9, 0x5a, 0xef, 0x43, 0x07, 0xfe, 0x3b, 0xf4, 0x8e, 0x19, 0xce, 0xd2, 0x94, 0x4b, 0x6d, 0x8e, 0x67, 0x20, 0xc7, 0x4f, 0x2f, 0x59, 0x8e, 0xe1, 0xa1, 0xa9, 0xf9, 0x0e, | ||||
| 	/* (2^273)P */ 0xdc, 0x7b, 0xb5, 0x50, 0x2e, 0xe9, 0x7e, 0x8b, 0x78, 0xa1, 0x38, 0x96, 0x22, 0xc3, 0x61, 0x67, 0x6d, 0xc8, 0x58, 0xed, 0x41, 0x1d, 0x5d, 0x86, 0x98, 0x7f, 0x2f, 0x1b, 0x8d, 0x3e, 0xaa, 0xc1, 0xd2, 0x0a, 0xf3, 0xbf, 0x95, 0x04, 0xf3, 0x10, 0x3c, 0x2b, 0x7f, 0x90, 0x46, 0x04, 0xaa, 0x6a, 0xa9, 0x35, 0x76, 0xac, 0x49, 0xb5, 0x00, 0x45, | ||||
| 	/* (2^274)P */ 0xb1, 0x93, 0x79, 0x84, 0x4a, 0x2a, 0x30, 0x78, 0x16, 0xaa, 0xc5, 0x74, 0x06, 0xce, 0xa5, 0xa7, 0x32, 0x86, 0xe0, 0xf9, 0x10, 0xd2, 0x58, 0x76, 0xfb, 0x66, 0x49, 0x76, 0x3a, 0x90, 0xba, 0xb5, 0xcc, 0x99, 0xcd, 0x09, 0xc1, 0x9a, 0x74, 0x23, 0xdf, 0x0c, 0xfe, 0x99, 0x52, 0x80, 0xa3, 0x7c, 0x1c, 0x71, 0x5f, 0x2c, 0x49, 0x57, 0xf4, 0xf9, | ||||
| 	/* (2^275)P */ 0x6d, 0xbf, 0x52, 0xe6, 0x25, 0x98, 0xed, 0xcf, 0xe3, 0xbc, 0x08, 0xa2, 0x1a, 0x90, 0xae, 0xa0, 0xbf, 0x07, 0x15, 0xad, 0x0a, 0x9f, 0x3e, 0x47, 0x44, 0xc2, 0x10, 0x46, 0xa6, 0x7a, 0x9e, 0x2f, 0x57, 0xbc, 0xe2, 0xf0, 0x1d, 0xd6, 0x9a, 0x06, 0xed, 0xfc, 0x54, 0x95, 0x92, 0x15, 0xa2, 0xf7, 0x8d, 0x6b, 0xef, 0xb2, 0x05, 0xed, 0x5c, 0x63, | ||||
| 	/* (2^276)P */ 0xbc, 0x0b, 0x27, 0x3a, 0x3a, 0xf8, 0xe1, 0x48, 0x02, 0x7e, 0x27, 0xe6, 0x81, 0x62, 0x07, 0x73, 0x74, 0xe5, 0x52, 0xd7, 0xf8, 0x26, 0xca, 0x93, 0x4d, 0x3e, 0x9b, 0x55, 0x09, 0x8e, 0xe3, 0xd7, 0xa6, 0xe3, 0xb6, 0x2a, 0xa9, 0xb3, 0xb0, 0xa0, 0x8c, 0x01, 0xbb, 0x07, 0x90, 0x78, 0x6d, 0x6d, 0xe9, 0xf0, 0x7a, 0x90, 0xbd, 0xdc, 0x0c, 0x36, | ||||
| 	/* (2^277)P */ 0x7f, 0x20, 0x12, 0x0f, 0x40, 0x00, 0x53, 0xd8, 0x0c, 0x27, 0x47, 0x47, 0x22, 0x80, 0xfb, 0x62, 0xe4, 0xa7, 0xf7, 0xbd, 0x42, 0xa5, 0xc3, 0x2b, 0xb2, 0x7f, 0x50, 0xcc, 0xe2, 0xfb, 0xd5, 0xc0, 0x63, 0xdd, 0x24, 0x5f, 0x7c, 0x08, 0x91, 0xbf, 0x6e, 0x47, 0x44, 0xd4, 0x6a, 0xc0, 0xc3, 0x09, 0x39, 0x27, 0xdd, 0xc7, 0xca, 0x06, 0x29, 0x55, | ||||
| 	/* (2^278)P */ 0x76, 0x28, 0x58, 0xb0, 0xd2, 0xf3, 0x0f, 0x04, 0xe9, 0xc9, 0xab, 0x66, 0x5b, 0x75, 0x51, 0xdc, 0xe5, 0x8f, 0xe8, 0x1f, 0xdb, 0x03, 0x0f, 0xb0, 0x7d, 0xf9, 0x20, 0x64, 0x89, 0xe9, 0xdc, 0xe6, 0x24, 0xc3, 0xd5, 0xd2, 0x41, 0xa6, 0xe4, 0xe3, 0xc4, 0x79, 0x7c, 0x0f, 0xa1, 0x61, 0x2f, 0xda, 0xa4, 0xc9, 0xfd, 0xad, 0x5c, 0x65, 0x6a, 0xf3, | ||||
| 	/* (2^279)P */ 0xd5, 0xab, 0x72, 0x7a, 0x3b, 0x59, 0xea, 0xcf, 0xd5, 0x17, 0xd2, 0xb2, 0x5f, 0x2d, 0xab, 0xad, 0x9e, 0x88, 0x64, 0x55, 0x96, 0x6e, 0xf3, 0x44, 0xa9, 0x11, 0xf5, 0xf8, 0x3a, 0xf1, 0xcd, 0x79, 0x4c, 0x99, 0x6d, 0x23, 0x6a, 0xa0, 0xc2, 0x1a, 0x19, 0x45, 0xb5, 0xd8, 0x95, 0x2f, 0x49, 0xe9, 0x46, 0x39, 0x26, 0x60, 0x04, 0x15, 0x8b, 0xcc, | ||||
| 	/* (2^280)P */ 0x66, 0x0c, 0xf0, 0x54, 0x41, 0x02, 0x91, 0xab, 0xe5, 0x85, 0x8a, 0x44, 0xa6, 0x34, 0x96, 0x32, 0xc0, 0xdf, 0x6c, 0x41, 0x39, 0xd4, 0xc6, 0xe1, 0xe3, 0x81, 0xb0, 0x4c, 0x34, 0x4f, 0xe5, 0xf4, 0x35, 0x46, 0x1f, 0xeb, 0x75, 0xfd, 0x43, 0x37, 0x50, 0x99, 0xab, 0xad, 0xb7, 0x8c, 0xa1, 0x57, 0xcb, 0xe6, 0xce, 0x16, 0x2e, 0x85, 0xcc, 0xf9, | ||||
| 	/* (2^281)P */ 0x63, 0xd1, 0x3f, 0x9e, 0xa2, 0x17, 0x2e, 0x1d, 0x3e, 0xce, 0x48, 0x2d, 0xbb, 0x8f, 0x69, 0xc9, 0xa6, 0x3d, 0x4e, 0xfe, 0x09, 0x56, 0xb3, 0x02, 0x5f, 0x99, 0x97, 0x0c, 0x54, 0xda, 0x32, 0x97, 0x9b, 0xf4, 0x95, 0xf1, 0xad, 0xe3, 0x2b, 0x04, 0xa7, 0x9b, 0x3f, 0xbb, 0xe7, 0x87, 0x2e, 0x1f, 0x8b, 0x4b, 0x7a, 0xa4, 0x43, 0x0c, 0x0f, 0x35, | ||||
| 	/* (2^282)P */ 0x05, 0xdc, 0xe0, 0x2c, 0xa1, 0xc1, 0xd0, 0xf1, 0x1f, 0x4e, 0xc0, 0x6c, 0x35, 0x7b, 0xca, 0x8f, 0x8b, 0x02, 0xb1, 0xf7, 0xd6, 0x2e, 0xe7, 0x93, 0x80, 0x85, 0x18, 0x88, 0x19, 0xb9, 0xb4, 0x4a, 0xbc, 0xeb, 0x5a, 0x78, 0x38, 0xed, 0xc6, 0x27, 0x2a, 0x74, 0x76, 0xf0, 0x1b, 0x79, 0x92, 0x2f, 0xd2, 0x81, 0x98, 0xdf, 0xa9, 0x50, 0x19, 0xeb, | ||||
| 	/* (2^283)P */ 0xb5, 0xe7, 0xb4, 0x11, 0x3a, 0x81, 0xb6, 0xb4, 0xf8, 0xa2, 0xb3, 0x6c, 0xfc, 0x9d, 0xe0, 0xc0, 0xe0, 0x59, 0x7f, 0x05, 0x37, 0xef, 0x2c, 0xa9, 0x3a, 0x24, 0xac, 0x7b, 0x25, 0xa0, 0x55, 0xd2, 0x44, 0x82, 0x82, 0x6e, 0x64, 0xa3, 0x58, 0xc8, 0x67, 0xae, 0x26, 0xa7, 0x0f, 0x42, 0x63, 0xe1, 0x93, 0x01, 0x52, 0x19, 0xaf, 0x49, 0x3e, 0x33, | ||||
| 	/* (2^284)P */ 0x05, 0x85, 0xe6, 0x66, 0xaf, 0x5f, 0xdf, 0xbf, 0x9d, 0x24, 0x62, 0x60, 0x90, 0xe2, 0x4c, 0x7d, 0x4e, 0xc3, 0x74, 0x5d, 0x4f, 0x53, 0xf3, 0x63, 0x13, 0xf4, 0x74, 0x28, 0x6b, 0x7d, 0x57, 0x0c, 0x9d, 0x84, 0xa7, 0x1a, 0xff, 0xa0, 0x79, 0xdf, 0xfc, 0x65, 0x98, 0x8e, 0x22, 0x0d, 0x62, 0x7e, 0xf2, 0x34, 0x60, 0x83, 0x05, 0x14, 0xb1, 0xc1, | ||||
| 	/* (2^285)P */ 0x64, 0x22, 0xcc, 0xdf, 0x5c, 0xbc, 0x88, 0x68, 0x4c, 0xd9, 0xbc, 0x0e, 0xc9, 0x8b, 0xb4, 0x23, 0x52, 0xad, 0xb0, 0xb3, 0xf1, 0x17, 0xd8, 0x15, 0x04, 0x6b, 0x99, 0xf0, 0xc4, 0x7d, 0x48, 0x22, 0x4a, 0xf8, 0x6f, 0xaa, 0x88, 0x0d, 0xc5, 0x5e, 0xa9, 0x1c, 0x61, 0x3d, 0x95, 0xa9, 0x7b, 0x6a, 0x79, 0x33, 0x0a, 0x2b, 0x99, 0xe3, 0x4e, 0x48, | ||||
| 	/* (2^286)P */ 0x6b, 0x9b, 0x6a, 0x2a, 0xf1, 0x60, 0x31, 0xb4, 0x73, 0xd1, 0x87, 0x45, 0x9c, 0x15, 0x58, 0x4b, 0x91, 0x6d, 0x94, 0x1c, 0x41, 0x11, 0x4a, 0x83, 0xec, 0xaf, 0x65, 0xbc, 0x34, 0xaa, 0x26, 0xe2, 0xaf, 0xed, 0x46, 0x05, 0x4e, 0xdb, 0xc6, 0x4e, 0x10, 0x28, 0x4e, 0x72, 0xe5, 0x31, 0xa3, 0x20, 0xd7, 0xb1, 0x96, 0x64, 0xf6, 0xce, 0x08, 0x08, | ||||
| 	/* (2^287)P */ 0x16, 0xa9, 0x5c, 0x9f, 0x9a, 0xb4, 0xb8, 0xc8, 0x32, 0x78, 0xc0, 0x3a, 0xd9, 0x5f, 0x94, 0xac, 0x3a, 0x42, 0x1f, 0x43, 0xd6, 0x80, 0x47, 0x2c, 0xdc, 0x76, 0x27, 0xfa, 0x50, 0xe5, 0xa1, 0xe4, 0xc3, 0xcb, 0x61, 0x31, 0xe1, 0x2e, 0xde, 0x81, 0x3b, 0x77, 0x1c, 0x39, 0x3c, 0xdb, 0xda, 0x87, 0x4b, 0x84, 0x12, 0xeb, 0xdd, 0x54, 0xbf, 0xe7, | ||||
| 	/* (2^288)P */ 0xbf, 0xcb, 0x73, 0x21, 0x3d, 0x7e, 0x13, 0x8c, 0xa6, 0x34, 0x21, 0x2b, 0xa5, 0xe4, 0x9f, 0x8e, 0x9c, 0x01, 0x9c, 0x43, 0xd9, 0xc7, 0xb9, 0xf1, 0xbe, 0x7f, 0x45, 0x51, 0x97, 0xa1, 0x8e, 0x01, 0xf8, 0xbd, 0xd2, 0xbf, 0x81, 0x3a, 0x8b, 0xab, 0xe4, 0x89, 0xb7, 0xbd, 0xf2, 0xcd, 0xa9, 0x8a, 0x8a, 0xde, 0xfb, 0x8a, 0x55, 0x12, 0x7b, 0x17, | ||||
| 	/* (2^289)P */ 0x1b, 0x95, 0x58, 0x4d, 0xe6, 0x51, 0x31, 0x52, 0x1c, 0xd8, 0x15, 0x84, 0xb1, 0x0d, 0x36, 0x25, 0x88, 0x91, 0x46, 0x71, 0x42, 0x56, 0xe2, 0x90, 0x08, 0x9e, 0x77, 0x1b, 0xee, 0x22, 0x3f, 0xec, 0xee, 0x8c, 0x7b, 0x2e, 0x79, 0xc4, 0x6c, 0x07, 0xa1, 0x7e, 0x52, 0xf5, 0x26, 0x5c, 0x84, 0x2a, 0x50, 0x6e, 0x82, 0xb3, 0x76, 0xda, 0x35, 0x16, | ||||
| 	/* (2^290)P */ 0x0a, 0x6f, 0x99, 0x87, 0xc0, 0x7d, 0x8a, 0xb2, 0xca, 0xae, 0xe8, 0x65, 0x98, 0x0f, 0xb3, 0x44, 0xe1, 0xdc, 0x52, 0x79, 0x75, 0xec, 0x8f, 0x95, 0x87, 0x45, 0xd1, 0x32, 0x18, 0x55, 0x15, 0xce, 0x64, 0x9b, 0x08, 0x4f, 0x2c, 0xea, 0xba, 0x1c, 0x57, 0x06, 0x63, 0xc8, 0xb1, 0xfd, 0xc5, 0x67, 0xe7, 0x1f, 0x87, 0x9e, 0xde, 0x72, 0x7d, 0xec, | ||||
| 	/* (2^291)P */ 0x36, 0x8b, 0x4d, 0x2c, 0xc2, 0x46, 0xe8, 0x96, 0xac, 0x0b, 0x8c, 0xc5, 0x09, 0x10, 0xfc, 0xf2, 0xda, 0xea, 0x22, 0xb2, 0xd3, 0x89, 0xeb, 0xb2, 0x85, 0x0f, 0xff, 0x59, 0x50, 0x2c, 0x99, 0x5a, 0x1f, 0xec, 0x2a, 0x6f, 0xec, 0xcf, 0xe9, 0xce, 0x12, 0x6b, 0x19, 0xd8, 0xde, 0x9b, 0xce, 0x0e, 0x6a, 0xaa, 0xe1, 0x32, 0xea, 0x4c, 0xfe, 0x92, | ||||
| 	/* (2^292)P */ 0x5f, 0x17, 0x70, 0x53, 0x26, 0x03, 0x0b, 0xab, 0xd1, 0xc1, 0x42, 0x0b, 0xab, 0x2b, 0x3d, 0x31, 0xa4, 0xd5, 0x2b, 0x5e, 0x00, 0xd5, 0x9a, 0x22, 0x34, 0xe0, 0x53, 0x3f, 0x59, 0x7f, 0x2c, 0x6d, 0x72, 0x9a, 0xa4, 0xbe, 0x3d, 0x42, 0x05, 0x1b, 0xf2, 0x7f, 0x88, 0x56, 0xd1, 0x7c, 0x7d, 0x6b, 0x9f, 0x43, 0xfe, 0x65, 0x19, 0xae, 0x9c, 0x4c, | ||||
| 	/* (2^293)P */ 0xf3, 0x7c, 0x20, 0xa9, 0xfc, 0xf2, 0xf2, 0x3b, 0x3c, 0x57, 0x41, 0x94, 0xe5, 0xcc, 0x6a, 0x37, 0x5d, 0x09, 0xf2, 0xab, 0xc2, 0xca, 0x60, 0x38, 0x6b, 0x7a, 0xe1, 0x78, 0x2b, 0xc1, 0x1d, 0xe8, 0xfd, 0xbc, 0x3d, 0x5c, 0xa2, 0xdb, 0x49, 0x20, 0x79, 0xe6, 0x1b, 0x9b, 0x65, 0xd9, 0x6d, 0xec, 0x57, 0x1d, 0xd2, 0xe9, 0x90, 0xeb, 0x43, 0x7b, | ||||
| 	/* (2^294)P */ 0x2a, 0x8b, 0x2e, 0x19, 0x18, 0x10, 0xb8, 0x83, 0xe7, 0x7d, 0x2d, 0x9a, 0x3a, 0xe5, 0xd1, 0xe4, 0x7c, 0x38, 0xe5, 0x59, 0x2a, 0x6e, 0xd9, 0x01, 0x29, 0x3d, 0x23, 0xf7, 0x52, 0xba, 0x61, 0x04, 0x9a, 0xde, 0xc4, 0x31, 0x50, 0xeb, 0x1b, 0xaa, 0xde, 0x39, 0x58, 0xd8, 0x1b, 0x1e, 0xfc, 0x57, 0x9a, 0x28, 0x43, 0x9e, 0x97, 0x5e, 0xaa, 0xa3, | ||||
| 	/* (2^295)P */ 0x97, 0x0a, 0x74, 0xc4, 0x39, 0x99, 0x6b, 0x40, 0xc7, 0x3e, 0x8c, 0xa7, 0xb1, 0x4e, 0x9a, 0x59, 0x6e, 0x1c, 0xfe, 0xfc, 0x2a, 0x5e, 0x73, 0x2b, 0x8c, 0xa9, 0x71, 0xf5, 0xda, 0x6b, 0x15, 0xab, 0xf7, 0xbe, 0x2a, 0x44, 0x5f, 0xba, 0xae, 0x67, 0x93, 0xc5, 0x86, 0xc1, 0xb8, 0xdf, 0xdc, 0xcb, 0xd7, 0xff, 0xb1, 0x71, 0x7c, 0x6f, 0x88, 0xf8, | ||||
| 	/* (2^296)P */ 0x3f, 0x89, 0xb1, 0xbf, 0x24, 0x16, 0xac, 0x56, 0xfe, 0xdf, 0x94, 0x71, 0xbf, 0xd6, 0x57, 0x0c, 0xb4, 0x77, 0x37, 0xaa, 0x2a, 0x70, 0x76, 0x49, 0xaf, 0x0c, 0x97, 0x8e, 0x78, 0x2a, 0x67, 0xc9, 0x3b, 0x3d, 0x5b, 0x01, 0x2f, 0xda, 0xd5, 0xa8, 0xde, 0x02, 0xa9, 0xac, 0x76, 0x00, 0x0b, 0x46, 0xc6, 0x2d, 0xdc, 0x08, 0xf4, 0x10, 0x2c, 0xbe, | ||||
| 	/* (2^297)P */ 0xcb, 0x07, 0xf9, 0x91, 0xc6, 0xd5, 0x3e, 0x54, 0x63, 0xae, 0xfc, 0x10, 0xbe, 0x3a, 0x20, 0x73, 0x4e, 0x65, 0x0e, 0x2d, 0x86, 0x77, 0x83, 0x9d, 0xe2, 0x0a, 0xe9, 0xac, 0x22, 0x52, 0x76, 0xd4, 0x6e, 0xfa, 0xe0, 0x09, 0xef, 0x78, 0x82, 0x9f, 0x26, 0xf9, 0x06, 0xb5, 0xe7, 0x05, 0x0e, 0xf2, 0x46, 0x72, 0x93, 0xd3, 0x24, 0xbd, 0x87, 0x60, | ||||
| 	/* (2^298)P */ 0x14, 0x55, 0x84, 0x7b, 0x6c, 0x60, 0x80, 0x73, 0x8c, 0xbe, 0x2d, 0xd6, 0x69, 0xd6, 0x17, 0x26, 0x44, 0x9f, 0x88, 0xa2, 0x39, 0x7c, 0x89, 0xbc, 0x6d, 0x9e, 0x46, 0xb6, 0x68, 0x66, 0xea, 0xdc, 0x31, 0xd6, 0x21, 0x51, 0x9f, 0x28, 0x28, 0xaf, 0x9e, 0x47, 0x2c, 0x4c, 0x8f, 0xf3, 0xaf, 0x1f, 0xe4, 0xab, 0xac, 0xe9, 0x0c, 0x91, 0x3a, 0x61, | ||||
| 	/* (2^299)P */ 0xb0, 0x37, 0x55, 0x4b, 0xe9, 0xc3, 0xb1, 0xce, 0x42, 0xe6, 0xc5, 0x11, 0x7f, 0x2c, 0x11, 0xfc, 0x4e, 0x71, 0x17, 0x00, 0x74, 0x7f, 0xbf, 0x07, 0x4d, 0xfd, 0x40, 0xb2, 0x87, 0xb0, 0xef, 0x1f, 0x35, 0x2c, 0x2d, 0xd7, 0xe1, 0xe4, 0xad, 0x0e, 0x7f, 0x63, 0x66, 0x62, 0x23, 0x41, 0xf6, 0xc1, 0x14, 0xa6, 0xd7, 0xa9, 0x11, 0x56, 0x9d, 0x1b, | ||||
| 	/* (2^300)P */ 0x02, 0x82, 0x42, 0x18, 0x4f, 0x1b, 0xc9, 0x5d, 0x78, 0x5f, 0xee, 0xed, 0x01, 0x49, 0x8f, 0xf2, 0xa0, 0xe2, 0x6e, 0xbb, 0x6b, 0x04, 0x8d, 0xb2, 0x41, 0xae, 0xc8, 0x1b, 0x59, 0x34, 0xb8, 0x2a, 0xdb, 0x1f, 0xd2, 0x52, 0xdf, 0x3f, 0x35, 0x00, 0x8b, 0x61, 0xbc, 0x97, 0xa0, 0xc4, 0x77, 0xd1, 0xe4, 0x2c, 0x59, 0x68, 0xff, 0x30, 0xf2, 0xe2, | ||||
| 	/* (2^301)P */ 0x79, 0x08, 0xb1, 0xdb, 0x55, 0xae, 0xd0, 0xed, 0xda, 0xa0, 0xec, 0x6c, 0xae, 0x68, 0xf2, 0x0b, 0x61, 0xb3, 0xf5, 0x21, 0x69, 0x87, 0x0b, 0x03, 0xea, 0x8a, 0x15, 0xd9, 0x7e, 0xca, 0xf7, 0xcd, 0xf3, 0x33, 0xb3, 0x4c, 0x5b, 0x23, 0x4e, 0x6f, 0x90, 0xad, 0x91, 0x4b, 0x4f, 0x46, 0x37, 0xe5, 0xe8, 0xb7, 0xeb, 0xd5, 0xca, 0x34, 0x4e, 0x23, | ||||
| 	/* (2^302)P */ 0x09, 0x02, 0xdd, 0xfd, 0x70, 0xac, 0x56, 0x80, 0x36, 0x5e, 0x49, 0xd0, 0x3f, 0xc2, 0xe0, 0xba, 0x46, 0x7f, 0x5c, 0xf7, 0xc5, 0xbd, 0xd5, 0x55, 0x7d, 0x3f, 0xd5, 0x7d, 0x06, 0xdf, 0x27, 0x20, 0x4f, 0xe9, 0x30, 0xec, 0x1b, 0xa0, 0x0c, 0xd4, 0x2c, 0xe1, 0x2b, 0x65, 0x73, 0xea, 0x75, 0x35, 0xe8, 0xe6, 0x56, 0xd6, 0x07, 0x15, 0x99, 0xdf, | ||||
| 	/* (2^303)P */ 0x4e, 0x10, 0xb7, 0xd0, 0x63, 0x8c, 0xcf, 0x16, 0x00, 0x7c, 0x58, 0xdf, 0x86, 0xdc, 0x4e, 0xca, 0x9c, 0x40, 0x5a, 0x42, 0xfd, 0xec, 0x98, 0xa4, 0x42, 0x53, 0xae, 0x16, 0x9d, 0xfd, 0x75, 0x5a, 0x12, 0x56, 0x1e, 0xc6, 0x57, 0xcc, 0x79, 0x27, 0x96, 0x00, 0xcf, 0x80, 0x4f, 0x8a, 0x36, 0x5c, 0xbb, 0xe9, 0x12, 0xdb, 0xb6, 0x2b, 0xad, 0x96, | ||||
| 	/* (2^304)P */ 0x92, 0x32, 0x1f, 0xfd, 0xc6, 0x02, 0x94, 0x08, 0x1b, 0x60, 0x6a, 0x9f, 0x8b, 0xd6, 0xc8, 0xad, 0xd5, 0x1b, 0x27, 0x4e, 0xa4, 0x4d, 0x4a, 0x00, 0x10, 0x5f, 0x86, 0x11, 0xf5, 0xe3, 0x14, 0x32, 0x43, 0xee, 0xb9, 0xc7, 0xab, 0xf4, 0x6f, 0xe5, 0x66, 0x0c, 0x06, 0x0d, 0x96, 0x79, 0x28, 0xaf, 0x45, 0x2b, 0x56, 0xbe, 0xe4, 0x4a, 0x52, 0xd6, | ||||
| 	/* (2^305)P */ 0x15, 0x16, 0x69, 0xef, 0x60, 0xca, 0x82, 0x25, 0x0f, 0xc6, 0x30, 0xa0, 0x0a, 0xd1, 0x83, 0x29, 0xcd, 0xb6, 0x89, 0x6c, 0xf5, 0xb2, 0x08, 0x38, 0xe6, 0xca, 0x6b, 0x19, 0x93, 0xc6, 0x5f, 0x75, 0x8e, 0x60, 0x34, 0x23, 0xc4, 0x13, 0x17, 0x69, 0x55, 0xcc, 0x72, 0x9c, 0x2b, 0x6c, 0x80, 0xf4, 0x4b, 0x8b, 0xb6, 0x97, 0x65, 0x07, 0xb6, 0xfb, | ||||
| 	/* (2^306)P */ 0x01, 0x99, 0x74, 0x28, 0xa6, 0x67, 0xa3, 0xe5, 0x25, 0xfb, 0xdf, 0x82, 0x93, 0xe7, 0x35, 0x74, 0xce, 0xe3, 0x15, 0x1c, 0x1d, 0x79, 0x52, 0x84, 0x08, 0x04, 0x2f, 0x5c, 0xb8, 0xcd, 0x7f, 0x89, 0xb0, 0x39, 0x93, 0x63, 0xc9, 0x5d, 0x06, 0x01, 0x59, 0xf7, 0x7e, 0xf1, 0x4c, 0x3d, 0x12, 0x8d, 0x69, 0x1d, 0xb7, 0x21, 0x5e, 0x88, 0x82, 0xa2, | ||||
| 	/* (2^307)P */ 0x8e, 0x69, 0xaf, 0x9a, 0x41, 0x0d, 0x9d, 0xcf, 0x8e, 0x8d, 0x5c, 0x51, 0x6e, 0xde, 0x0e, 0x48, 0x23, 0x89, 0xe5, 0x37, 0x80, 0xd6, 0x9d, 0x72, 0x32, 0x26, 0x38, 0x2d, 0x63, 0xa0, 0xfa, 0xd3, 0x40, 0xc0, 0x8c, 0x68, 0x6f, 0x2b, 0x1e, 0x9a, 0x39, 0x51, 0x78, 0x74, 0x9a, 0x7b, 0x4a, 0x8f, 0x0c, 0xa0, 0x88, 0x60, 0xa5, 0x21, 0xcd, 0xc7, | ||||
| 	/* (2^308)P */ 0x3a, 0x7f, 0x73, 0x14, 0xbf, 0x89, 0x6a, 0x4c, 0x09, 0x5d, 0xf2, 0x93, 0x20, 0x2d, 0xc4, 0x29, 0x86, 0x06, 0x95, 0xab, 0x22, 0x76, 0x4c, 0x54, 0xe1, 0x7e, 0x80, 0x6d, 0xab, 0x29, 0x61, 0x87, 0x77, 0xf6, 0xc0, 0x3e, 0xda, 0xab, 0x65, 0x7e, 0x39, 0x12, 0xa1, 0x6b, 0x42, 0xf7, 0xc5, 0x97, 0x77, 0xec, 0x6f, 0x22, 0xbe, 0x44, 0xc7, 0x03, | ||||
| 	/* (2^309)P */ 0xa5, 0x23, 0x90, 0x41, 0xa3, 0xc5, 0x3e, 0xe0, 0xa5, 0x32, 0x49, 0x1f, 0x39, 0x78, 0xb1, 0xd8, 0x24, 0xea, 0xd4, 0x87, 0x53, 0x42, 0x51, 0xf4, 0xd9, 0x46, 0x25, 0x2f, 0x62, 0xa9, 0x90, 0x9a, 0x4a, 0x25, 0x8a, 0xd2, 0x10, 0xe7, 0x3c, 0xbc, 0x58, 0x8d, 0x16, 0x14, 0x96, 0xa4, 0x6f, 0xf8, 0x12, 0x69, 0x91, 0x73, 0xe2, 0xfa, 0xf4, 0x57, | ||||
| 	/* (2^310)P */ 0x51, 0x45, 0x3f, 0x96, 0xdc, 0x97, 0x38, 0xa6, 0x01, 0x63, 0x09, 0xea, 0xc2, 0x13, 0x30, 0xb0, 0x00, 0xb8, 0x0a, 0xce, 0xd1, 0x8f, 0x3e, 0x69, 0x62, 0x46, 0x33, 0x9c, 0xbf, 0x4b, 0xcb, 0x0c, 0x90, 0x1c, 0x45, 0xcf, 0x37, 0x5b, 0xf7, 0x4b, 0x5e, 0x95, 0xc3, 0x28, 0x9f, 0x08, 0x83, 0x53, 0x74, 0xab, 0x0c, 0xb4, 0xc0, 0xa1, 0xbc, 0x89, | ||||
| 	/* (2^311)P */ 0x06, 0xb1, 0x51, 0x15, 0x65, 0x60, 0x21, 0x17, 0x7a, 0x20, 0x65, 0xee, 0x12, 0x35, 0x4d, 0x46, 0xf4, 0xf8, 0xd0, 0xb1, 0xca, 0x09, 0x30, 0x08, 0x89, 0x23, 0x3b, 0xe7, 0xab, 0x8b, 0x77, 0xa6, 0xad, 0x25, 0xdd, 0xea, 0x3c, 0x7d, 0xa5, 0x24, 0xb3, 0xe8, 0xfa, 0xfb, 0xc9, 0xf2, 0x71, 0xe9, 0xfa, 0xf2, 0xdc, 0x54, 0xdd, 0x55, 0x2e, 0x2f, | ||||
| 	/* (2^312)P */ 0x7f, 0x96, 0x96, 0xfb, 0x52, 0x86, 0xcf, 0xea, 0x62, 0x18, 0xf1, 0x53, 0x1f, 0x61, 0x2a, 0x9f, 0x8c, 0x51, 0xca, 0x2c, 0xde, 0x6d, 0xce, 0xab, 0x58, 0x32, 0x0b, 0x33, 0x9b, 0x99, 0xb4, 0x5c, 0x88, 0x2a, 0x76, 0xcc, 0x3e, 0x54, 0x1e, 0x9d, 0xa2, 0x89, 0xe4, 0x19, 0xba, 0x80, 0xc8, 0x39, 0x32, 0x7f, 0x0f, 0xc7, 0x84, 0xbb, 0x43, 0x56, | ||||
| 	/* (2^313)P */ 0x9b, 0x07, 0xb4, 0x42, 0xa9, 0xa0, 0x78, 0x4f, 0x28, 0x70, 0x2b, 0x7e, 0x61, 0xe0, 0xdd, 0x02, 0x98, 0xfc, 0xed, 0x31, 0x80, 0xf1, 0x15, 0x52, 0x89, 0x23, 0xcd, 0x5d, 0x2b, 0xc5, 0x19, 0x32, 0xfb, 0x70, 0x50, 0x7a, 0x97, 0x6b, 0x42, 0xdb, 0xca, 0xdb, 0xc4, 0x59, 0x99, 0xe0, 0x12, 0x1f, 0x17, 0xba, 0x8b, 0xf0, 0xc4, 0x38, 0x5d, 0x27, | ||||
| 	/* (2^314)P */ 0x29, 0x1d, 0xdc, 0x2b, 0xf6, 0x5b, 0x04, 0x61, 0x36, 0x76, 0xa0, 0x56, 0x36, 0x6e, 0xd7, 0x24, 0x4d, 0xe7, 0xef, 0x44, 0xd2, 0xd5, 0x07, 0xcd, 0xc4, 0x9d, 0x80, 0x48, 0xc3, 0x38, 0xcf, 0xd8, 0xa3, 0xdd, 0xb2, 0x5e, 0xb5, 0x70, 0x15, 0xbb, 0x36, 0x85, 0x8a, 0xd7, 0xfb, 0x56, 0x94, 0x73, 0x9c, 0x81, 0xbe, 0xb1, 0x44, 0x28, 0xf1, 0x37, | ||||
| 	/* (2^315)P */ 0xbf, 0xcf, 0x5c, 0xd2, 0xe2, 0xea, 0xc2, 0xcd, 0x70, 0x7a, 0x9d, 0xcb, 0x81, 0xc1, 0xe9, 0xf1, 0x56, 0x71, 0x52, 0xf7, 0x1b, 0x87, 0xc6, 0xd8, 0xcc, 0xb2, 0x69, 0xf3, 0xb0, 0xbd, 0xba, 0x83, 0x12, 0x26, 0xc4, 0xce, 0x72, 0xde, 0x3b, 0x21, 0x28, 0x9e, 0x5a, 0x94, 0xf5, 0x04, 0xa3, 0xc8, 0x0f, 0x5e, 0xbc, 0x71, 0xf9, 0x0d, 0xce, 0xf5, | ||||
| 	/* (2^316)P */ 0x93, 0x97, 0x00, 0x85, 0xf4, 0xb4, 0x40, 0xec, 0xd9, 0x2b, 0x6c, 0xd6, 0x63, 0x9e, 0x93, 0x0a, 0x5a, 0xf4, 0xa7, 0x9a, 0xe3, 0x3c, 0xf0, 0x55, 0xd1, 0x96, 0x6c, 0xf5, 0x2a, 0xce, 0xd7, 0x95, 0x72, 0xbf, 0xc5, 0x0c, 0xce, 0x79, 0xa2, 0x0a, 0x78, 0xe0, 0x72, 0xd0, 0x66, 0x28, 0x05, 0x75, 0xd3, 0x23, 0x09, 0x91, 0xed, 0x7e, 0xc4, 0xbc, | ||||
| 	/* (2^317)P */ 0x77, 0xc2, 0x9a, 0xf7, 0xa6, 0xe6, 0x18, 0xb4, 0xe7, 0xf6, 0xda, 0xec, 0x44, 0x6d, 0xfb, 0x08, 0xee, 0x65, 0xa8, 0x92, 0x85, 0x1f, 0xba, 0x38, 0x93, 0x20, 0x5c, 0x4d, 0xd2, 0x18, 0x0f, 0x24, 0xbe, 0x1a, 0x96, 0x44, 0x7d, 0xeb, 0xb3, 0xda, 0x95, 0xf4, 0xaf, 0x6c, 0x06, 0x0f, 0x47, 0x37, 0xc8, 0x77, 0x63, 0xe1, 0x29, 0xef, 0xff, 0xa5, | ||||
| 	/* (2^318)P */ 0x16, 0x12, 0xd9, 0x47, 0x90, 0x22, 0x9b, 0x05, 0xf2, 0xa5, 0x9a, 0xae, 0x83, 0x98, 0xb5, 0xac, 0xab, 0x29, 0xaa, 0xdc, 0x5f, 0xde, 0xcd, 0xf7, 0x42, 0xad, 0x3b, 0x96, 0xd6, 0x3e, 0x6e, 0x52, 0x47, 0xb1, 0xab, 0x51, 0xde, 0x49, 0x7c, 0x87, 0x8d, 0x86, 0xe2, 0x70, 0x13, 0x21, 0x51, 0x1c, 0x0c, 0x25, 0xc1, 0xb0, 0xe6, 0x19, 0xcf, 0x12, | ||||
| 	/* (2^319)P */ 0xf0, 0xbc, 0x97, 0x8f, 0x4b, 0x2f, 0xd1, 0x1f, 0x8c, 0x57, 0xed, 0x3c, 0xf4, 0x26, 0x19, 0xbb, 0x60, 0xca, 0x24, 0xc5, 0xd9, 0x97, 0xe2, 0x5f, 0x76, 0x49, 0x39, 0x7e, 0x2d, 0x12, 0x21, 0x98, 0xda, 0xe6, 0xdb, 0xd2, 0xd8, 0x9f, 0x18, 0xd8, 0x83, 0x6c, 0xba, 0x89, 0x8d, 0x29, 0xfa, 0x46, 0x33, 0x8c, 0x28, 0xdf, 0x6a, 0xb3, 0x69, 0x28, | ||||
| 	/* (2^320)P */ 0x86, 0x17, 0xbc, 0xd6, 0x7c, 0xba, 0x1e, 0x83, 0xbb, 0x84, 0xb5, 0x8c, 0xad, 0xdf, 0xa1, 0x24, 0x81, 0x70, 0x40, 0x0f, 0xad, 0xad, 0x3b, 0x23, 0xd0, 0x93, 0xa0, 0x49, 0x5c, 0x4b, 0x51, 0xbe, 0x20, 0x49, 0x4e, 0xda, 0x2d, 0xd3, 0xad, 0x1b, 0x74, 0x08, 0x41, 0xf0, 0xef, 0x19, 0xe9, 0x45, 0x5d, 0x02, 0xae, 0x26, 0x25, 0xd9, 0xd1, 0xc2, | ||||
| 	/* (2^321)P */ 0x48, 0x81, 0x3e, 0xb2, 0x83, 0xf8, 0x4d, 0xb3, 0xd0, 0x4c, 0x75, 0xb3, 0xa0, 0x52, 0x26, 0xf2, 0xaf, 0x5d, 0x36, 0x70, 0x72, 0xd6, 0xb7, 0x88, 0x08, 0x69, 0xbd, 0x15, 0x25, 0xb1, 0x45, 0x1b, 0xb7, 0x0b, 0x5f, 0x71, 0x5d, 0x83, 0x49, 0xb9, 0x84, 0x3b, 0x7c, 0xc1, 0x50, 0x93, 0x05, 0x53, 0xe0, 0x61, 0xea, 0xc1, 0xef, 0xdb, 0x82, 0x97, | ||||
| 	/* (2^322)P */ 0x00, 0xd5, 0xc3, 0x3a, 0x4d, 0x8a, 0x23, 0x7a, 0xef, 0xff, 0x37, 0xef, 0xf3, 0xbc, 0xa9, 0xb6, 0xae, 0xd7, 0x3a, 0x7b, 0xfd, 0x3e, 0x8e, 0x9b, 0xab, 0x44, 0x54, 0x60, 0x28, 0x6c, 0xbf, 0x15, 0x24, 0x4a, 0x56, 0x60, 0x7f, 0xa9, 0x7a, 0x28, 0x59, 0x2c, 0x8a, 0xd1, 0x7d, 0x6b, 0x00, 0xfd, 0xa5, 0xad, 0xbc, 0x19, 0x3f, 0xcb, 0x73, 0xe0, | ||||
| 	/* (2^323)P */ 0xcf, 0x9e, 0x66, 0x06, 0x4d, 0x2b, 0xf5, 0x9c, 0xc2, 0x9d, 0x9e, 0xed, 0x5a, 0x5c, 0x2d, 0x00, 0xbf, 0x29, 0x90, 0x88, 0xe4, 0x5d, 0xfd, 0xe2, 0xf0, 0x38, 0xec, 0x4d, 0x26, 0xea, 0x54, 0xf0, 0x3c, 0x84, 0x10, 0x6a, 0xf9, 0x66, 0x9c, 0xe7, 0x21, 0xfd, 0x0f, 0xc7, 0x13, 0x50, 0x81, 0xb6, 0x50, 0xf9, 0x04, 0x7f, 0xa4, 0x37, 0x85, 0x14, | ||||
| 	/* (2^324)P */ 0xdb, 0x87, 0x49, 0xc7, 0xa8, 0x39, 0x0c, 0x32, 0x98, 0x0c, 0xb9, 0x1a, 0x1b, 0x4d, 0xe0, 0x8a, 0x9a, 0x8e, 0x8f, 0xab, 0x5a, 0x17, 0x3d, 0x04, 0x21, 0xce, 0x3e, 0x2c, 0xf9, 0xa3, 0x97, 0xe4, 0x77, 0x95, 0x0e, 0xb6, 0xa5, 0x15, 0xad, 0x3a, 0x1e, 0x46, 0x53, 0x17, 0x09, 0x83, 0x71, 0x4e, 0x86, 0x38, 0xd5, 0x23, 0x44, 0x16, 0x8d, 0xc8, | ||||
| 	/* (2^325)P */ 0x05, 0x5e, 0x99, 0x08, 0xbb, 0xc3, 0xc0, 0xb7, 0x6c, 0x12, 0xf2, 0xf3, 0xf4, 0x7c, 0x6a, 0x4d, 0x9e, 0xeb, 0x3d, 0xb9, 0x63, 0x94, 0xce, 0x81, 0xd8, 0x11, 0xcb, 0x55, 0x69, 0x4a, 0x20, 0x0b, 0x4c, 0x2e, 0x14, 0xb8, 0xd4, 0x6a, 0x7c, 0xf0, 0xed, 0xfc, 0x8f, 0xef, 0xa0, 0xeb, 0x6c, 0x01, 0xe2, 0xdc, 0x10, 0x22, 0xa2, 0x01, 0x85, 0x64, | ||||
| 	/* (2^326)P */ 0x58, 0xe1, 0x9c, 0x27, 0x55, 0xc6, 0x25, 0xa6, 0x7d, 0x67, 0x88, 0x65, 0x99, 0x6c, 0xcb, 0xdb, 0x27, 0x4f, 0x44, 0x29, 0xf5, 0x4a, 0x23, 0x10, 0xbc, 0x03, 0x3f, 0x36, 0x1e, 0xef, 0xb0, 0xba, 0x75, 0xe8, 0x74, 0x5f, 0x69, 0x3e, 0x26, 0x40, 0xb4, 0x2f, 0xdc, 0x43, 0xbf, 0xa1, 0x8b, 0xbd, 0xca, 0x6e, 0xc1, 0x6e, 0x21, 0x79, 0xa0, 0xd0, | ||||
| 	/* (2^327)P */ 0x78, 0x93, 0x4a, 0x2d, 0x22, 0x6e, 0x6e, 0x7d, 0x74, 0xd2, 0x66, 0x58, 0xce, 0x7b, 0x1d, 0x97, 0xb1, 0xf2, 0xda, 0x1c, 0x79, 0xfb, 0xba, 0xd1, 0xc0, 0xc5, 0x6e, 0xc9, 0x11, 0x89, 0xd2, 0x41, 0x8d, 0x70, 0xb9, 0xcc, 0xea, 0x6a, 0xb3, 0x45, 0xb6, 0x05, 0x2e, 0xf2, 0x17, 0xf1, 0x27, 0xb8, 0xed, 0x06, 0x1f, 0xdb, 0x9d, 0x1f, 0x69, 0x28, | ||||
| 	/* (2^328)P */ 0x93, 0x12, 0xa8, 0x11, 0xe1, 0x92, 0x30, 0x8d, 0xac, 0xe1, 0x1c, 0x60, 0x7c, 0xed, 0x2d, 0x2e, 0xd3, 0x03, 0x5c, 0x9c, 0xc5, 0xbd, 0x64, 0x4a, 0x8c, 0xba, 0x76, 0xfe, 0xc6, 0xc1, 0xea, 0xc2, 0x4f, 0xbe, 0x70, 0x3d, 0x64, 0xcf, 0x8e, 0x18, 0xcb, 0xcd, 0x57, 0xa7, 0xf7, 0x36, 0xa9, 0x6b, 0x3e, 0xb8, 0x69, 0xee, 0x47, 0xa2, 0x7e, 0xb2, | ||||
| 	/* (2^329)P */ 0x96, 0xaf, 0x3a, 0xf5, 0xed, 0xcd, 0xaf, 0xf7, 0x82, 0xaf, 0x59, 0x62, 0x0b, 0x36, 0x85, 0xf9, 0xaf, 0xd6, 0x38, 0xff, 0x87, 0x2e, 0x1d, 0x6c, 0x8b, 0xaf, 0x3b, 0xdf, 0x28, 0xa2, 0xd6, 0x4d, 0x80, 0x92, 0xc3, 0x0f, 0x34, 0xa8, 0xae, 0x69, 0x5d, 0x7b, 0x9d, 0xbc, 0xf5, 0xfd, 0x1d, 0xb1, 0x96, 0x55, 0x86, 0xe1, 0x5c, 0xb6, 0xac, 0xb9, | ||||
| 	/* (2^330)P */ 0x50, 0x9e, 0x37, 0x28, 0x7d, 0xa8, 0x33, 0x63, 0xda, 0x3f, 0x20, 0x98, 0x0e, 0x09, 0xa8, 0x77, 0x3b, 0x7a, 0xfc, 0x16, 0x85, 0x44, 0x64, 0x77, 0x65, 0x68, 0x92, 0x41, 0xc6, 0x1f, 0xdf, 0x27, 0xf9, 0xec, 0xa0, 0x61, 0x22, 0xea, 0x19, 0xe7, 0x75, 0x8b, 0x4e, 0xe5, 0x0f, 0xb7, 0xf7, 0xd2, 0x53, 0xf4, 0xdd, 0x4a, 0xaa, 0x78, 0x40, 0xb7, | ||||
| 	/* (2^331)P */ 0xd4, 0x89, 0xe3, 0x79, 0xba, 0xb6, 0xc3, 0xda, 0xe6, 0x78, 0x65, 0x7d, 0x6e, 0x22, 0x62, 0xb1, 0x3d, 0xea, 0x90, 0x84, 0x30, 0x5e, 0xd4, 0x39, 0x84, 0x78, 0xd9, 0x75, 0xd6, 0xce, 0x2a, 0x11, 0x29, 0x69, 0xa4, 0x5e, 0xaa, 0x2a, 0x98, 0x5a, 0xe5, 0x91, 0x8f, 0xb2, 0xfb, 0xda, 0x97, 0xe8, 0x83, 0x6f, 0x04, 0xb9, 0x5d, 0xaf, 0xe1, 0x9b, | ||||
| 	/* (2^332)P */ 0x8b, 0xe4, 0xe1, 0x48, 0x9c, 0xc4, 0x83, 0x89, 0xdf, 0x65, 0xd3, 0x35, 0x55, 0x13, 0xf4, 0x1f, 0x36, 0x92, 0x33, 0x38, 0xcb, 0xed, 0x15, 0xe6, 0x60, 0x2d, 0x25, 0xf5, 0x36, 0x60, 0x3a, 0x37, 0x9b, 0x71, 0x9d, 0x42, 0xb0, 0x14, 0xc8, 0xba, 0x62, 0xa3, 0x49, 0xb0, 0x88, 0xc1, 0x72, 0x73, 0xdd, 0x62, 0x40, 0xa9, 0x62, 0x88, 0x99, 0xca, | ||||
| 	/* (2^333)P */ 0x47, 0x7b, 0xea, 0xda, 0x46, 0x2f, 0x45, 0xc6, 0xe3, 0xb4, 0x4d, 0x8d, 0xac, 0x0b, 0x54, 0x22, 0x06, 0x31, 0x16, 0x66, 0x3e, 0xe4, 0x38, 0x12, 0xcd, 0xf3, 0xe7, 0x99, 0x37, 0xd9, 0x62, 0x24, 0x4b, 0x05, 0xf2, 0x58, 0xe6, 0x29, 0x4b, 0x0d, 0xf6, 0xc1, 0xba, 0xa0, 0x1e, 0x0f, 0xcb, 0x1f, 0xc6, 0x2b, 0x19, 0xfc, 0x82, 0x01, 0xd0, 0x86, | ||||
| 	/* (2^334)P */ 0xa2, 0xae, 0x77, 0x20, 0xfb, 0xa8, 0x18, 0xb4, 0x61, 0xef, 0xe8, 0x52, 0x79, 0xbb, 0x86, 0x90, 0x5d, 0x2e, 0x76, 0xed, 0x66, 0x60, 0x5d, 0x00, 0xb5, 0xa4, 0x00, 0x40, 0x89, 0xec, 0xd1, 0xd2, 0x0d, 0x26, 0xb9, 0x30, 0xb2, 0xd2, 0xb8, 0xe8, 0x0e, 0x56, 0xf9, 0x67, 0x94, 0x2e, 0x62, 0xe1, 0x79, 0x48, 0x2b, 0xa9, 0xfa, 0xea, 0xdb, 0x28, | ||||
| 	/* (2^335)P */ 0x35, 0xf1, 0xb0, 0x43, 0xbd, 0x27, 0xef, 0x18, 0x44, 0xa2, 0x04, 0xb4, 0x69, 0xa1, 0x97, 0x1f, 0x8c, 0x04, 0x82, 0x9b, 0x00, 0x6d, 0xf8, 0xbf, 0x7d, 0xc1, 0x5b, 0xab, 0xe8, 0xb2, 0x34, 0xbd, 0xaf, 0x7f, 0xb2, 0x0d, 0xf3, 0xed, 0xfc, 0x5b, 0x50, 0xee, 0xe7, 0x4a, 0x20, 0xd9, 0xf5, 0xc6, 0x9a, 0x97, 0x6d, 0x07, 0x2f, 0xb9, 0x31, 0x02, | ||||
| 	/* (2^336)P */ 0xf9, 0x54, 0x4a, 0xc5, 0x61, 0x7e, 0x1d, 0xa6, 0x0e, 0x1a, 0xa8, 0xd3, 0x8c, 0x36, 0x7d, 0xf1, 0x06, 0xb1, 0xac, 0x93, 0xcd, 0xe9, 0x8f, 0x61, 0x6c, 0x5d, 0x03, 0x23, 0xdf, 0x85, 0x53, 0x39, 0x63, 0x5e, 0xeb, 0xf3, 0xd3, 0xd3, 0x75, 0x97, 0x9b, 0x62, 0x9b, 0x01, 0xb3, 0x19, 0xd8, 0x2b, 0x36, 0xf2, 0x2c, 0x2c, 0x6f, 0x36, 0xc6, 0x3c, | ||||
| 	/* (2^337)P */ 0x05, 0x74, 0x43, 0x10, 0xb6, 0xb0, 0xf8, 0xbf, 0x02, 0x46, 0x9a, 0xee, 0xc1, 0xaf, 0xc1, 0xe5, 0x5a, 0x2e, 0xbb, 0xe1, 0xdc, 0xc6, 0xce, 0x51, 0x29, 0x50, 0xbf, 0x1b, 0xde, 0xff, 0xba, 0x4d, 0x8d, 0x8b, 0x7e, 0xe7, 0xbd, 0x5b, 0x8f, 0xbe, 0xe3, 0x75, 0x71, 0xff, 0x37, 0x05, 0x5a, 0x10, 0xeb, 0x54, 0x7e, 0x44, 0x72, 0x2c, 0xd4, 0xfc, | ||||
| 	/* (2^338)P */ 0x03, 0x12, 0x1c, 0xb2, 0x08, 0x90, 0xa1, 0x2d, 0x50, 0xa0, 0xad, 0x7f, 0x8d, 0xa6, 0x97, 0xc1, 0xbd, 0xdc, 0xc3, 0xa7, 0xad, 0x31, 0xdf, 0xb8, 0x03, 0x84, 0xc3, 0xb9, 0x29, 0x3d, 0x92, 0x2e, 0xc3, 0x90, 0x07, 0xe8, 0xa7, 0xc7, 0xbc, 0x61, 0xe9, 0x3e, 0xa0, 0x35, 0xda, 0x1d, 0xab, 0x48, 0xfe, 0x50, 0xc9, 0x25, 0x59, 0x23, 0x69, 0x3f, | ||||
| 	/* (2^339)P */ 0x8e, 0x91, 0xab, 0x6b, 0x91, 0x4f, 0x89, 0x76, 0x67, 0xad, 0xb2, 0x65, 0x9d, 0xad, 0x02, 0x36, 0xdc, 0xac, 0x96, 0x93, 0x97, 0x21, 0x14, 0xd0, 0xe8, 0x11, 0x60, 0x1e, 0xeb, 0x96, 0x06, 0xf2, 0x53, 0xf2, 0x6d, 0xb7, 0x93, 0x6f, 0x26, 0x91, 0x23, 0xe3, 0x34, 0x04, 0x92, 0x91, 0x37, 0x08, 0x50, 0xd6, 0x28, 0x09, 0x27, 0xa1, 0x0c, 0x00, | ||||
| 	/* (2^340)P */ 0x1f, 0xbb, 0x21, 0x26, 0x33, 0xcb, 0xa4, 0xd1, 0xee, 0x85, 0xf9, 0xd9, 0x3c, 0x90, 0xc3, 0xd1, 0x26, 0xa2, 0x25, 0x93, 0x43, 0x61, 0xed, 0x91, 0x6e, 0x54, 0x03, 0x2e, 0x42, 0x9d, 0xf7, 0xa6, 0x02, 0x0f, 0x2f, 0x9c, 0x7a, 0x8d, 0x12, 0xc2, 0x18, 0xfc, 0x41, 0xff, 0x85, 0x26, 0x1a, 0x44, 0x55, 0x0b, 0x89, 0xab, 0x6f, 0x62, 0x33, 0x8c, | ||||
| 	/* (2^341)P */ 0xe0, 0x3c, 0x5d, 0x70, 0x64, 0x87, 0x81, 0x35, 0xf2, 0x37, 0xa6, 0x24, 0x3e, 0xe0, 0x62, 0xd5, 0x71, 0xe7, 0x93, 0xfb, 0xac, 0xc3, 0xe7, 0xc7, 0x04, 0xe2, 0x70, 0xd3, 0x29, 0x5b, 0x21, 0xbf, 0xf4, 0x26, 0x5d, 0xf3, 0x95, 0xb4, 0x2a, 0x6a, 0x07, 0x55, 0xa6, 0x4b, 0x3b, 0x15, 0xf2, 0x25, 0x8a, 0x95, 0x3f, 0x63, 0x2f, 0x7a, 0x23, 0x96, | ||||
| 	/* (2^342)P */ 0x0d, 0x3d, 0xd9, 0x13, 0xa7, 0xb3, 0x5e, 0x67, 0xf7, 0x02, 0x23, 0xee, 0x84, 0xff, 0x99, 0xda, 0xb9, 0x53, 0xf8, 0xf0, 0x0e, 0x39, 0x2f, 0x3c, 0x64, 0x34, 0xe3, 0x09, 0xfd, 0x2b, 0x33, 0xc7, 0xfe, 0x62, 0x2b, 0x84, 0xdf, 0x2b, 0xd2, 0x7c, 0x26, 0x01, 0x70, 0x66, 0x5b, 0x85, 0xc2, 0xbe, 0x88, 0x37, 0xf1, 0x30, 0xac, 0xb8, 0x76, 0xa3, | ||||
| 	/* (2^343)P */ 0x6e, 0x01, 0xf0, 0x55, 0x35, 0xe4, 0xbd, 0x43, 0x62, 0x9d, 0xd6, 0x11, 0xef, 0x6f, 0xb8, 0x8c, 0xaa, 0x98, 0x87, 0xc6, 0x6d, 0xc4, 0xcc, 0x74, 0x92, 0x53, 0x4a, 0xdf, 0xe4, 0x08, 0x89, 0x17, 0xd0, 0x0f, 0xf4, 0x00, 0x60, 0x78, 0x08, 0x44, 0xb5, 0xda, 0x18, 0xed, 0x98, 0xc8, 0x61, 0x3d, 0x39, 0xdb, 0xcf, 0x1d, 0x49, 0x40, 0x65, 0x75, | ||||
| 	/* (2^344)P */ 0x8e, 0x10, 0xae, 0x5f, 0x06, 0xd2, 0x95, 0xfd, 0x20, 0x16, 0x49, 0x5b, 0x57, 0xbe, 0x22, 0x8b, 0x43, 0xfb, 0xe6, 0xcc, 0x26, 0xa5, 0x5d, 0xd3, 0x68, 0xc5, 0xf9, 0x5a, 0x86, 0x24, 0x87, 0x27, 0x05, 0xfd, 0xe2, 0xff, 0xb3, 0xa3, 0x7b, 0x37, 0x59, 0xc5, 0x4e, 0x14, 0x94, 0xf9, 0x3b, 0xcb, 0x7c, 0xed, 0xca, 0x1d, 0xb2, 0xac, 0x05, 0x4a, | ||||
| 	/* (2^345)P */ 0xf4, 0xd1, 0x81, 0xeb, 0x89, 0xbf, 0xfe, 0x1e, 0x41, 0x92, 0x29, 0xee, 0xe1, 0x43, 0xf5, 0x86, 0x1d, 0x2f, 0xbb, 0x1e, 0x84, 0x5d, 0x7b, 0x8d, 0xd5, 0xda, 0xee, 0x1e, 0x8a, 0xd0, 0x27, 0xf2, 0x60, 0x51, 0x59, 0x82, 0xf4, 0x84, 0x2b, 0x5b, 0x14, 0x2d, 0x81, 0x82, 0x3e, 0x2b, 0xb4, 0x6d, 0x51, 0x4f, 0xc5, 0xcb, 0xbf, 0x74, 0xe3, 0xb4, | ||||
| 	/* (2^346)P */ 0x19, 0x2f, 0x22, 0xb3, 0x04, 0x5f, 0x81, 0xca, 0x05, 0x60, 0xb9, 0xaa, 0xee, 0x0e, 0x2f, 0x48, 0x38, 0xf9, 0x91, 0xb4, 0x66, 0xe4, 0x57, 0x28, 0x54, 0x10, 0xe9, 0x61, 0x9d, 0xd4, 0x90, 0x75, 0xb1, 0x39, 0x23, 0xb6, 0xfc, 0x82, 0xe0, 0xfa, 0xbb, 0x5c, 0x6e, 0xc3, 0x44, 0x13, 0x00, 0x83, 0x55, 0x9e, 0x8e, 0x10, 0x61, 0x81, 0x91, 0x04, | ||||
| 	/* (2^347)P */ 0x5f, 0x2a, 0xd7, 0x81, 0xd9, 0x9c, 0xbb, 0x79, 0xbc, 0x62, 0x56, 0x98, 0x03, 0x5a, 0x18, 0x85, 0x2a, 0x9c, 0xd0, 0xfb, 0xd2, 0xb1, 0xaf, 0xef, 0x0d, 0x24, 0xc5, 0xfa, 0x39, 0xbb, 0x6b, 0xed, 0xa4, 0xdf, 0xe4, 0x87, 0xcd, 0x41, 0xd3, 0x72, 0x32, 0xc6, 0x28, 0x21, 0xb1, 0xba, 0x8b, 0xa3, 0x91, 0x79, 0x76, 0x22, 0x25, 0x10, 0x61, 0xd1, | ||||
| 	/* (2^348)P */ 0x73, 0xb5, 0x32, 0x97, 0xdd, 0xeb, 0xdd, 0x22, 0x22, 0xf1, 0x33, 0x3c, 0x77, 0x56, 0x7d, 0x6b, 0x48, 0x2b, 0x05, 0x81, 0x03, 0x03, 0x91, 0x9a, 0xe3, 0x5e, 0xd4, 0xee, 0x3f, 0xf8, 0xbb, 0x50, 0x21, 0x32, 0x4c, 0x4a, 0x58, 0x49, 0xde, 0x0c, 0xde, 0x30, 0x82, 0x3d, 0x92, 0xf0, 0x6c, 0xcc, 0x32, 0x3e, 0xd2, 0x78, 0x8a, 0x6e, 0x2c, 0xd0, | ||||
| 	/* (2^349)P */ 0xf0, 0xf7, 0xa1, 0x0b, 0xc1, 0x74, 0x85, 0xa8, 0xe9, 0xdd, 0x48, 0xa1, 0xc0, 0x16, 0xd8, 0x2b, 0x61, 0x08, 0xc2, 0x2b, 0x30, 0x26, 0x79, 0xce, 0x9e, 0xfd, 0x39, 0xd7, 0x81, 0xa4, 0x63, 0x8c, 0xd5, 0x74, 0xa0, 0x88, 0xfa, 0x03, 0x30, 0xe9, 0x7f, 0x2b, 0xc6, 0x02, 0xc9, 0x5e, 0xe4, 0xd5, 0x4d, 0x92, 0xd0, 0xf6, 0xf2, 0x5b, 0x79, 0x08, | ||||
| 	/* (2^350)P */ 0x34, 0x89, 0x81, 0x43, 0xd1, 0x94, 0x2c, 0x10, 0x54, 0x9b, 0xa0, 0xe5, 0x44, 0xe8, 0xc2, 0x2f, 0x3e, 0x0e, 0x74, 0xae, 0xba, 0xe2, 0xac, 0x85, 0x6b, 0xd3, 0x5c, 0x97, 0xf7, 0x90, 0xf1, 0x12, 0xc0, 0x03, 0xc8, 0x1f, 0x37, 0x72, 0x8c, 0x9b, 0x9c, 0x17, 0x96, 0x9d, 0xc7, 0xbf, 0xa3, 0x3f, 0x44, 0x3d, 0x87, 0x81, 0xbd, 0x81, 0xa6, 0x5f, | ||||
| 	/* (2^351)P */ 0xe4, 0xff, 0x78, 0x62, 0x82, 0x5b, 0x76, 0x58, 0xf5, 0x5b, 0xa6, 0xc4, 0x53, 0x11, 0x3b, 0x7b, 0xaa, 0x67, 0xf8, 0xea, 0x3b, 0x5d, 0x9a, 0x2e, 0x04, 0xeb, 0x4a, 0x24, 0xfb, 0x56, 0xf0, 0xa8, 0xd4, 0x14, 0xed, 0x0f, 0xfd, 0xc5, 0x26, 0x17, 0x2a, 0xf0, 0xb9, 0x13, 0x8c, 0xbd, 0x65, 0x14, 0x24, 0x95, 0x27, 0x12, 0x63, 0x2a, 0x09, 0x18, | ||||
| 	/* (2^352)P */ 0xe1, 0x5c, 0xe7, 0xe0, 0x00, 0x6a, 0x96, 0xf2, 0x49, 0x6a, 0x39, 0xa5, 0xe0, 0x17, 0x79, 0x4a, 0x63, 0x07, 0x62, 0x09, 0x61, 0x1b, 0x6e, 0xa9, 0xb5, 0x62, 0xb7, 0xde, 0xdf, 0x80, 0x4c, 0x5a, 0x99, 0x73, 0x59, 0x9d, 0xfb, 0xb1, 0x5e, 0xbe, 0xb8, 0xb7, 0x63, 0x93, 0xe8, 0xad, 0x5e, 0x1f, 0xae, 0x59, 0x1c, 0xcd, 0xb4, 0xc2, 0xb3, 0x8a, | ||||
| 	/* (2^353)P */ 0x78, 0x53, 0xa1, 0x4c, 0x70, 0x9c, 0x63, 0x7e, 0xb3, 0x12, 0x40, 0x5f, 0xbb, 0x23, 0xa7, 0xf7, 0x77, 0x96, 0x5b, 0x4d, 0x91, 0x10, 0x52, 0x85, 0x9e, 0xa5, 0x38, 0x0b, 0xfd, 0x25, 0x01, 0x4b, 0xfa, 0x4d, 0xd3, 0x3f, 0x78, 0x74, 0x42, 0xff, 0x62, 0x2d, 0x27, 0xdc, 0x9d, 0xd1, 0x29, 0x76, 0x2e, 0x78, 0xb3, 0x35, 0xfa, 0x15, 0xd5, 0x38, | ||||
| 	/* (2^354)P */ 0x8b, 0xc7, 0x43, 0xce, 0xf0, 0x5e, 0xf1, 0x0d, 0x02, 0x38, 0xe8, 0x82, 0xc9, 0x25, 0xad, 0x2d, 0x27, 0xa4, 0x54, 0x18, 0xb2, 0x30, 0x73, 0xa4, 0x41, 0x08, 0xe4, 0x86, 0xe6, 0x8c, 0xe9, 0x2a, 0x34, 0xb3, 0xd6, 0x61, 0x8f, 0x66, 0x26, 0x08, 0xb6, 0x06, 0x33, 0xaa, 0x12, 0xac, 0x72, 0xec, 0x2e, 0x52, 0xa3, 0x25, 0x3e, 0xd7, 0x62, 0xe8, | ||||
| 	/* (2^355)P */ 0xc4, 0xbb, 0x89, 0xc8, 0x40, 0xcc, 0x84, 0xec, 0x4a, 0xd9, 0xc4, 0x55, 0x78, 0x00, 0xcf, 0xd8, 0xe9, 0x24, 0x59, 0xdc, 0x5e, 0xf0, 0x66, 0xa1, 0x83, 0xae, 0x97, 0x18, 0xc5, 0x54, 0x27, 0xa2, 0x21, 0x52, 0x03, 0x31, 0x5b, 0x11, 0x67, 0xf6, 0x12, 0x00, 0x87, 0x2f, 0xff, 0x59, 0x70, 0x8f, 0x6d, 0x71, 0xab, 0xab, 0x24, 0xb8, 0xba, 0x35, | ||||
| 	/* (2^356)P */ 0x69, 0x43, 0xa7, 0x14, 0x06, 0x96, 0xe9, 0xc2, 0xe3, 0x2b, 0x45, 0x22, 0xc0, 0xd0, 0x2f, 0x34, 0xd1, 0x01, 0x99, 0xfc, 0x99, 0x38, 0xa1, 0x25, 0x2e, 0x59, 0x6c, 0x27, 0xc9, 0xeb, 0x7b, 0xdc, 0x4e, 0x26, 0x68, 0xba, 0xfa, 0xec, 0x02, 0x05, 0x64, 0x80, 0x30, 0x20, 0x5c, 0x26, 0x7f, 0xaf, 0x95, 0x17, 0x3d, 0x5c, 0x9e, 0x96, 0x96, 0xaf, | ||||
| 	/* (2^357)P */ 0xa6, 0xba, 0x21, 0x29, 0x32, 0xe2, 0x98, 0xde, 0x9b, 0x6d, 0x0b, 0x44, 0x91, 0xa8, 0x3e, 0xd4, 0xb8, 0x04, 0x6c, 0xf6, 0x04, 0x39, 0xbd, 0x52, 0x05, 0x15, 0x27, 0x78, 0x8e, 0x55, 0xac, 0x79, 0xc5, 0xe6, 0x00, 0x7f, 0x90, 0xa2, 0xdd, 0x07, 0x13, 0xe0, 0x24, 0x70, 0x5c, 0x0f, 0x4d, 0xa9, 0xf9, 0xae, 0xcb, 0x34, 0x10, 0x9d, 0x89, 0x9d, | ||||
| 	/* (2^358)P */ 0x12, 0xe0, 0xb3, 0x9f, 0xc4, 0x96, 0x1d, 0xcf, 0xed, 0x99, 0x64, 0x28, 0x8d, 0xc7, 0x31, 0x82, 0xee, 0x5e, 0x75, 0x48, 0xff, 0x3a, 0xf2, 0x09, 0x34, 0x03, 0x93, 0x52, 0x19, 0xb2, 0xc5, 0x81, 0x93, 0x45, 0x5e, 0x59, 0x21, 0x2b, 0xec, 0x89, 0xba, 0x36, 0x6e, 0xf9, 0x82, 0x75, 0x7e, 0x82, 0x3f, 0xaa, 0xe2, 0xe3, 0x3b, 0x94, 0xfd, 0x98, | ||||
| 	/* (2^359)P */ 0x7c, 0xdb, 0x75, 0x31, 0x61, 0xfb, 0x15, 0x28, 0x94, 0xd7, 0xc3, 0x5a, 0xa9, 0xa1, 0x0a, 0x66, 0x0f, 0x2b, 0x13, 0x3e, 0x42, 0xb5, 0x28, 0x3a, 0xca, 0x83, 0xf3, 0x61, 0x22, 0xf4, 0x40, 0xc5, 0xdf, 0xe7, 0x31, 0x9f, 0x7e, 0x51, 0x75, 0x06, 0x9d, 0x51, 0xc8, 0xe7, 0x9f, 0xc3, 0x71, 0x4f, 0x3d, 0x5b, 0xfb, 0xe9, 0x8e, 0x08, 0x40, 0x8e, | ||||
| 	/* (2^360)P */ 0xf7, 0x31, 0xad, 0x50, 0x5d, 0x25, 0x93, 0x73, 0x68, 0xf6, 0x7c, 0x89, 0x5a, 0x3d, 0x9f, 0x9b, 0x05, 0x82, 0xe7, 0x70, 0x4b, 0x19, 0xaa, 0xcf, 0xff, 0xde, 0x50, 0x8f, 0x2f, 0x69, 0xd3, 0xf0, 0x99, 0x51, 0x6b, 0x9d, 0xb6, 0x56, 0x6f, 0xf8, 0x4c, 0x74, 0x8b, 0x4c, 0x91, 0xf9, 0xa9, 0xb1, 0x3e, 0x07, 0xdf, 0x0b, 0x27, 0x8a, 0xb1, 0xed, | ||||
| 	/* (2^361)P */ 0xfb, 0x67, 0xd9, 0x48, 0xd2, 0xe4, 0x44, 0x9b, 0x43, 0x15, 0x8a, 0xeb, 0x00, 0x53, 0xad, 0x25, 0xc7, 0x7e, 0x19, 0x30, 0x87, 0xb7, 0xd5, 0x5f, 0x04, 0xf8, 0xaa, 0xdd, 0x57, 0xae, 0x34, 0x75, 0xe2, 0x84, 0x4b, 0x54, 0x60, 0x37, 0x95, 0xe4, 0xd3, 0xec, 0xac, 0xef, 0x47, 0x31, 0xa3, 0xc8, 0x31, 0x22, 0xdb, 0x26, 0xe7, 0x6a, 0xb5, 0xad, | ||||
| 	/* (2^362)P */ 0x44, 0x09, 0x5c, 0x95, 0xe4, 0x72, 0x3c, 0x1a, 0xd1, 0xac, 0x42, 0x51, 0x99, 0x6f, 0xfa, 0x1f, 0xf2, 0x22, 0xbe, 0xff, 0x7b, 0x66, 0xf5, 0x6c, 0xb3, 0x66, 0xc7, 0x4d, 0x78, 0x31, 0x83, 0x80, 0xf5, 0x41, 0xe9, 0x7f, 0xbe, 0xf7, 0x23, 0x49, 0x6b, 0x84, 0x4e, 0x7e, 0x47, 0x07, 0x6e, 0x74, 0xdf, 0xe5, 0x9d, 0x9e, 0x56, 0x2a, 0xc0, 0xbc, | ||||
| 	/* (2^363)P */ 0xac, 0x10, 0x80, 0x8c, 0x7c, 0xfa, 0x83, 0xdf, 0xb3, 0xd0, 0xc4, 0xbe, 0xfb, 0x9f, 0xac, 0xc9, 0xc3, 0x40, 0x95, 0x0b, 0x09, 0x23, 0xda, 0x63, 0x67, 0xcf, 0xe7, 0x9f, 0x7d, 0x7b, 0x6b, 0xe2, 0xe6, 0x6d, 0xdb, 0x87, 0x9e, 0xa6, 0xff, 0x6d, 0xab, 0xbd, 0xfb, 0x54, 0x84, 0x68, 0xcf, 0x89, 0xf1, 0xd0, 0xe2, 0x85, 0x61, 0xdc, 0x22, 0xd1, | ||||
| 	/* (2^364)P */ 0xa8, 0x48, 0xfb, 0x8c, 0x6a, 0x63, 0x01, 0x72, 0x43, 0x43, 0xeb, 0x21, 0xa3, 0x00, 0x8a, 0xc0, 0x87, 0x51, 0x9e, 0x86, 0x75, 0x16, 0x79, 0xf9, 0x6b, 0x11, 0x80, 0x62, 0xc2, 0x9d, 0xb8, 0x8c, 0x30, 0x8e, 0x8d, 0x03, 0x52, 0x7e, 0x31, 0x59, 0x38, 0xf9, 0x25, 0xc7, 0x0f, 0xc7, 0xa8, 0x2b, 0x5c, 0x80, 0xfa, 0x90, 0xa2, 0x63, 0xca, 0xe7, | ||||
| 	/* (2^365)P */ 0xf1, 0x5d, 0xb5, 0xd9, 0x20, 0x10, 0x7d, 0x0f, 0xc5, 0x50, 0x46, 0x07, 0xff, 0x02, 0x75, 0x2b, 0x4a, 0xf3, 0x39, 0x91, 0x72, 0xb7, 0xd5, 0xcc, 0x38, 0xb8, 0xe7, 0x36, 0x26, 0x5e, 0x11, 0x97, 0x25, 0xfb, 0x49, 0x68, 0xdc, 0xb4, 0x46, 0x87, 0x5c, 0xc2, 0x7f, 0xaa, 0x7d, 0x36, 0x23, 0xa6, 0xc6, 0x53, 0xec, 0xbc, 0x57, 0x47, 0xc1, 0x2b, | ||||
| 	/* (2^366)P */ 0x25, 0x5d, 0x7d, 0x95, 0xda, 0x0b, 0x8f, 0x78, 0x1e, 0x19, 0x09, 0xfa, 0x67, 0xe0, 0xa0, 0x17, 0x24, 0x76, 0x6c, 0x30, 0x1f, 0x62, 0x3d, 0xbe, 0x45, 0x70, 0xcc, 0xb6, 0x1e, 0x68, 0x06, 0x25, 0x68, 0x16, 0x1a, 0x33, 0x3f, 0x90, 0xc7, 0x78, 0x2d, 0x98, 0x3c, 0x2f, 0xb9, 0x2d, 0x94, 0x0b, 0xfb, 0x49, 0x56, 0x30, 0xd7, 0xc1, 0xe6, 0x48, | ||||
| 	/* (2^367)P */ 0x7a, 0xd1, 0xe0, 0x8e, 0x67, 0xfc, 0x0b, 0x50, 0x1f, 0x84, 0x98, 0xfa, 0xaf, 0xae, 0x2e, 0x31, 0x27, 0xcf, 0x3f, 0xf2, 0x6e, 0x8d, 0x81, 0x8f, 0xd2, 0x5f, 0xde, 0xd3, 0x5e, 0xe9, 0xe7, 0x13, 0x48, 0x83, 0x5a, 0x4e, 0x84, 0xd1, 0x58, 0xcf, 0x6b, 0x84, 0xdf, 0x13, 0x1d, 0x91, 0x85, 0xe8, 0xcb, 0x29, 0x79, 0xd2, 0xca, 0xac, 0x6a, 0x93, | ||||
| 	/* (2^368)P */ 0x53, 0x82, 0xce, 0x61, 0x96, 0x88, 0x6f, 0xe1, 0x4a, 0x4c, 0x1e, 0x30, 0x73, 0xe8, 0x74, 0xde, 0x40, 0x2b, 0xe0, 0xc4, 0xb5, 0xd8, 0x7c, 0x15, 0xe7, 0xe1, 0xb1, 0xe0, 0xd6, 0x88, 0xb1, 0x6a, 0x57, 0x19, 0x6a, 0x22, 0x66, 0x57, 0xf6, 0x8d, 0xfd, 0xc0, 0xf2, 0xa3, 0x03, 0x56, 0xfb, 0x2e, 0x75, 0x5e, 0xc7, 0x8e, 0x22, 0x96, 0x5c, 0x06, | ||||
| 	/* (2^369)P */ 0x98, 0x7e, 0xbf, 0x3e, 0xbf, 0x24, 0x9d, 0x15, 0xd3, 0xf6, 0xd3, 0xd2, 0xf0, 0x11, 0xf2, 0xdb, 0x36, 0x23, 0x38, 0xf7, 0x1d, 0x71, 0x20, 0xd2, 0x54, 0x7f, 0x1e, 0x24, 0x8f, 0xe2, 0xaa, 0xf7, 0x3f, 0x6b, 0x41, 0x4e, 0xdc, 0x0e, 0xec, 0xe8, 0x35, 0x0a, 0x08, 0x6d, 0x89, 0x5b, 0x32, 0x91, 0x01, 0xb6, 0xe0, 0x2c, 0xc6, 0xa1, 0xbe, 0xb4, | ||||
| 	/* (2^370)P */ 0x29, 0xf2, 0x1e, 0x1c, 0xdc, 0x68, 0x8a, 0x43, 0x87, 0x2c, 0x48, 0xb3, 0x9e, 0xed, 0xd2, 0x82, 0x46, 0xac, 0x2f, 0xef, 0x93, 0x34, 0x37, 0xca, 0x64, 0x8d, 0xc9, 0x06, 0x90, 0xbb, 0x78, 0x0a, 0x3c, 0x4c, 0xcf, 0x35, 0x7a, 0x0f, 0xf7, 0xa7, 0xf4, 0x2f, 0x45, 0x69, 0x3f, 0xa9, 0x5d, 0xce, 0x7b, 0x8a, 0x84, 0xc3, 0xae, 0xf4, 0xda, 0xd5, | ||||
| 	/* (2^371)P */ 0xca, 0xba, 0x95, 0x43, 0x05, 0x7b, 0x06, 0xd9, 0x5c, 0x0a, 0x18, 0x5f, 0x6a, 0x6a, 0xce, 0xc0, 0x3d, 0x95, 0x51, 0x0e, 0x1a, 0xbe, 0x85, 0x7a, 0xf2, 0x69, 0xec, 0xc0, 0x8c, 0xca, 0xa3, 0x32, 0x0a, 0x76, 0x50, 0xc6, 0x76, 0x61, 0x00, 0x89, 0xbf, 0x6e, 0x0f, 0x48, 0x90, 0x31, 0x93, 0xec, 0x34, 0x70, 0xf0, 0xc3, 0x8d, 0xf0, 0x0f, 0xb5, | ||||
| 	/* (2^372)P */ 0xbe, 0x23, 0xe2, 0x18, 0x99, 0xf1, 0xed, 0x8a, 0xf6, 0xc9, 0xac, 0xb8, 0x1e, 0x9a, 0x3c, 0x15, 0xae, 0xd7, 0x6d, 0xb3, 0x04, 0xee, 0x5b, 0x0d, 0x1e, 0x79, 0xb7, 0xf9, 0xf9, 0x8d, 0xad, 0xf9, 0x8f, 0x5a, 0x6a, 0x7b, 0xd7, 0x9b, 0xca, 0x62, 0xfe, 0x9c, 0xc0, 0x6f, 0x6d, 0x9d, 0x76, 0xa3, 0x69, 0xb9, 0x4c, 0xa1, 0xc4, 0x0c, 0x76, 0xaa, | ||||
| 	/* (2^373)P */ 0x1c, 0x06, 0xfe, 0x3f, 0x45, 0x70, 0xcd, 0x97, 0xa9, 0xa2, 0xb1, 0xd3, 0xf2, 0xa5, 0x0c, 0x49, 0x2c, 0x75, 0x73, 0x1f, 0xcf, 0x00, 0xaf, 0xd5, 0x2e, 0xde, 0x0d, 0x8f, 0x8f, 0x7c, 0xc4, 0x58, 0xce, 0xd4, 0xf6, 0x24, 0x19, 0x2e, 0xd8, 0xc5, 0x1d, 0x1a, 0x3f, 0xb8, 0x4f, 0xbc, 0x7d, 0xbd, 0x68, 0xe3, 0x81, 0x98, 0x1b, 0xa8, 0xc9, 0xd9, | ||||
| 	/* (2^374)P */ 0x39, 0x95, 0x78, 0x24, 0x6c, 0x38, 0xe4, 0xe7, 0xd0, 0x8d, 0xb9, 0x38, 0x71, 0x5e, 0xc1, 0x62, 0x80, 0xcc, 0xcb, 0x8c, 0x97, 0xca, 0xf8, 0xb9, 0xd9, 0x9c, 0xce, 0x72, 0x7b, 0x70, 0xee, 0x5f, 0xea, 0xa2, 0xdf, 0xa9, 0x14, 0x10, 0xf9, 0x6e, 0x59, 0x9f, 0x9c, 0xe0, 0x0c, 0xb2, 0x07, 0x97, 0xcd, 0xd2, 0x89, 0x16, 0xfd, 0x9c, 0xa8, 0xa5, | ||||
| 	/* (2^375)P */ 0x5a, 0x61, 0xf1, 0x59, 0x7c, 0x38, 0xda, 0xe2, 0x85, 0x99, 0x68, 0xe9, 0xc9, 0xf7, 0x32, 0x7e, 0xc4, 0xca, 0xb7, 0x11, 0x08, 0x69, 0x2b, 0x66, 0x02, 0xf7, 0x2e, 0x18, 0xc3, 0x8e, 0xe1, 0xf9, 0xc5, 0x19, 0x9a, 0x0a, 0x9c, 0x07, 0xba, 0xc7, 0x9c, 0x03, 0x34, 0x89, 0x99, 0x67, 0x0b, 0x16, 0x4b, 0x07, 0x36, 0x16, 0x36, 0x2c, 0xe2, 0xa1, | ||||
| 	/* (2^376)P */ 0x70, 0x10, 0x91, 0x27, 0xa8, 0x24, 0x8e, 0x29, 0x04, 0x6f, 0x79, 0x1f, 0xd3, 0xa5, 0x68, 0xd3, 0x0b, 0x7d, 0x56, 0x4d, 0x14, 0x57, 0x7b, 0x2e, 0x00, 0x9f, 0x9a, 0xfd, 0x6c, 0x63, 0x18, 0x81, 0xdb, 0x9d, 0xb7, 0xd7, 0xa4, 0x1e, 0xe8, 0x40, 0xf1, 0x4c, 0xa3, 0x01, 0xd5, 0x4b, 0x75, 0xea, 0xdd, 0x97, 0xfd, 0x5b, 0xb2, 0x66, 0x6a, 0x24, | ||||
| 	/* (2^377)P */ 0x72, 0x11, 0xfe, 0x73, 0x1b, 0xd3, 0xea, 0x7f, 0x93, 0x15, 0x15, 0x05, 0xfe, 0x40, 0xe8, 0x28, 0xd8, 0x50, 0x47, 0x66, 0xfa, 0xb7, 0xb5, 0x04, 0xba, 0x35, 0x1e, 0x32, 0x9f, 0x5f, 0x32, 0xba, 0x3d, 0xd1, 0xed, 0x9a, 0x76, 0xca, 0xa3, 0x3e, 0x77, 0xd8, 0xd8, 0x7c, 0x5f, 0x68, 0x42, 0xb5, 0x86, 0x7f, 0x3b, 0xc9, 0xc1, 0x89, 0x64, 0xda, | ||||
| 	/* (2^378)P */ 0xd5, 0xd4, 0x17, 0x31, 0xfc, 0x6a, 0xfd, 0xb8, 0xe8, 0xe5, 0x3e, 0x39, 0x06, 0xe4, 0xd1, 0x90, 0x2a, 0xca, 0xf6, 0x54, 0x6c, 0x1b, 0x2f, 0x49, 0x97, 0xb1, 0x2a, 0x82, 0x43, 0x3d, 0x1f, 0x8b, 0xe2, 0x47, 0xc5, 0x24, 0xa8, 0xd5, 0x53, 0x29, 0x7d, 0xc6, 0x87, 0xa6, 0x25, 0x3a, 0x64, 0xdd, 0x71, 0x08, 0x9e, 0xcd, 0xe9, 0x45, 0xc7, 0xba, | ||||
| 	/* (2^379)P */ 0x37, 0x72, 0x6d, 0x13, 0x7a, 0x8d, 0x04, 0x31, 0xe6, 0xe3, 0x9e, 0x36, 0x71, 0x3e, 0xc0, 0x1e, 0xe3, 0x71, 0xd3, 0x49, 0x4e, 0x4a, 0x36, 0x42, 0x68, 0x68, 0x61, 0xc7, 0x3c, 0xdb, 0x81, 0x49, 0xf7, 0x91, 0x4d, 0xea, 0x4c, 0x4f, 0x98, 0xc6, 0x7e, 0x60, 0x84, 0x4b, 0x6a, 0x37, 0xbb, 0x52, 0xf7, 0xce, 0x02, 0xe4, 0xad, 0xd1, 0x3c, 0xa7, | ||||
| 	/* (2^380)P */ 0x51, 0x06, 0x2d, 0xf8, 0x08, 0xe8, 0xf1, 0x0c, 0xe5, 0xa9, 0xac, 0x29, 0x73, 0x3b, 0xed, 0x98, 0x5f, 0x55, 0x08, 0x38, 0x51, 0x44, 0x36, 0x5d, 0xea, 0xc3, 0xb8, 0x0e, 0xa0, 0x4f, 0xd2, 0x79, 0xe9, 0x98, 0xc3, 0xf5, 0x00, 0xb9, 0x26, 0x27, 0x42, 0xa8, 0x07, 0xc1, 0x12, 0x31, 0xc1, 0xc3, 0x3c, 0x3b, 0x7a, 0x72, 0x97, 0xc2, 0x70, 0x3a, | ||||
| 	/* (2^381)P */ 0xf4, 0xb2, 0xba, 0x32, 0xbc, 0xa9, 0x2f, 0x87, 0xc7, 0x3c, 0x45, 0xcd, 0xae, 0xe2, 0x13, 0x6d, 0x3a, 0xf2, 0xf5, 0x66, 0x97, 0x29, 0xaf, 0x53, 0x9f, 0xda, 0xea, 0x14, 0xdf, 0x04, 0x98, 0x19, 0x95, 0x9e, 0x2a, 0x00, 0x5c, 0x9d, 0x1d, 0xf0, 0x39, 0x23, 0xff, 0xfc, 0xca, 0x36, 0xb7, 0xde, 0xdf, 0x37, 0x78, 0x52, 0x21, 0xfa, 0x19, 0x10, | ||||
| 	/* (2^382)P */ 0x50, 0x20, 0x73, 0x74, 0x62, 0x21, 0xf2, 0xf7, 0x9b, 0x66, 0x85, 0x34, 0x74, 0xd4, 0x9d, 0x60, 0xd7, 0xbc, 0xc8, 0x46, 0x3b, 0xb8, 0x80, 0x42, 0x15, 0x0a, 0x6c, 0x35, 0x1a, 0x69, 0xf0, 0x1d, 0x4b, 0x29, 0x54, 0x5a, 0x9a, 0x48, 0xec, 0x9f, 0x37, 0x74, 0x91, 0xd0, 0xd1, 0x9e, 0x00, 0xc2, 0x76, 0x56, 0xd6, 0xa0, 0x15, 0x14, 0x83, 0x59, | ||||
| 	/* (2^383)P */ 0xc2, 0xf8, 0x22, 0x20, 0x23, 0x07, 0xbd, 0x1d, 0x6f, 0x1e, 0x8c, 0x56, 0x06, 0x6a, 0x4b, 0x9f, 0xe2, 0xa9, 0x92, 0x46, 0x4b, 0x46, 0x59, 0xd7, 0xe1, 0xda, 0x14, 0x98, 0x07, 0x65, 0x7e, 0x28, 0x20, 0xf2, 0x9d, 0x4f, 0x36, 0x5c, 0x92, 0xe0, 0x9d, 0xfe, 0x3e, 0xda, 0xe4, 0x47, 0x19, 0x3c, 0x00, 0x7f, 0x22, 0xf2, 0x9e, 0x51, 0xae, 0x4d, | ||||
| 	/* (2^384)P */ 0xbe, 0x8c, 0x1b, 0x10, 0xb6, 0xad, 0xcc, 0xcc, 0xd8, 0x5e, 0x21, 0xa6, 0xfb, 0xf1, 0xf6, 0xbd, 0x0a, 0x24, 0x67, 0xb4, 0x57, 0x7a, 0xbc, 0xe8, 0xe9, 0xff, 0xee, 0x0a, 0x1f, 0xee, 0xbd, 0xc8, 0x44, 0xed, 0x2b, 0xbb, 0x55, 0x1f, 0xdd, 0x7c, 0xb3, 0xeb, 0x3f, 0x63, 0xa1, 0x28, 0x91, 0x21, 0xab, 0x71, 0xc6, 0x4c, 0xd0, 0xe9, 0xb0, 0x21, | ||||
| 	/* (2^385)P */ 0xad, 0xc9, 0x77, 0x2b, 0xee, 0x89, 0xa4, 0x7b, 0xfd, 0xf9, 0xf6, 0x14, 0xe4, 0xed, 0x1a, 0x16, 0x9b, 0x78, 0x41, 0x43, 0xa8, 0x83, 0x72, 0x06, 0x2e, 0x7c, 0xdf, 0xeb, 0x7e, 0xdd, 0xd7, 0x8b, 0xea, 0x9a, 0x2b, 0x03, 0xba, 0x57, 0xf3, 0xf1, 0xd9, 0xe5, 0x09, 0xc5, 0x98, 0x61, 0x1c, 0x51, 0x6d, 0x5d, 0x6e, 0xfb, 0x5e, 0x95, 0x9f, 0xb5, | ||||
| 	/* (2^386)P */ 0x23, 0xe2, 0x1e, 0x95, 0xa3, 0x5e, 0x42, 0x10, 0xc7, 0xc3, 0x70, 0xbf, 0x4b, 0x6b, 0x83, 0x36, 0x93, 0xb7, 0x68, 0x47, 0x88, 0x3a, 0x10, 0x88, 0x48, 0x7f, 0x8c, 0xae, 0x54, 0x10, 0x02, 0xa4, 0x52, 0x8f, 0x8d, 0xf7, 0x26, 0x4f, 0x50, 0xc3, 0x6a, 0xe2, 0x4e, 0x3b, 0x4c, 0xb9, 0x8a, 0x14, 0x15, 0x6d, 0x21, 0x29, 0xb3, 0x6e, 0x4e, 0xd0, | ||||
| 	/* (2^387)P */ 0x4c, 0x8a, 0x18, 0x3f, 0xb7, 0x20, 0xfd, 0x3e, 0x54, 0xca, 0x68, 0x3c, 0xea, 0x6f, 0xf4, 0x6b, 0xa2, 0xbd, 0x01, 0xbd, 0xfe, 0x08, 0xa8, 0xd8, 0xc2, 0x20, 0x36, 0x05, 0xcd, 0xe9, 0xf3, 0x9e, 0xfa, 0x85, 0x66, 0x8f, 0x4b, 0x1d, 0x8c, 0x64, 0x4f, 0xb8, 0xc6, 0x0f, 0x5b, 0x57, 0xd8, 0x24, 0x19, 0x5a, 0x14, 0x4b, 0x92, 0xd3, 0x96, 0xbc, | ||||
| 	/* (2^388)P */ 0xa9, 0x3f, 0xc9, 0x6c, 0xca, 0x64, 0x1e, 0x6f, 0xdf, 0x65, 0x7f, 0x9a, 0x47, 0x6b, 0x8a, 0x60, 0x31, 0xa6, 0x06, 0xac, 0x69, 0x30, 0xe6, 0xea, 0x63, 0x42, 0x26, 0x5f, 0xdb, 0xd0, 0xf2, 0x8e, 0x34, 0x0a, 0x3a, 0xeb, 0xf3, 0x79, 0xc8, 0xb7, 0x60, 0x56, 0x5c, 0x37, 0x95, 0x71, 0xf8, 0x7f, 0x49, 0x3e, 0x9e, 0x01, 0x26, 0x1e, 0x80, 0x9f, | ||||
| 	/* (2^389)P */ 0xf8, 0x16, 0x9a, 0xaa, 0xb0, 0x28, 0xb5, 0x8e, 0xd0, 0x60, 0xe5, 0x26, 0xa9, 0x47, 0xc4, 0x5c, 0xa9, 0x39, 0xfe, 0x0a, 0xd8, 0x07, 0x2b, 0xb3, 0xce, 0xf1, 0xea, 0x1a, 0xf4, 0x7b, 0x98, 0x31, 0x3d, 0x13, 0x29, 0x80, 0xe8, 0x0d, 0xcf, 0x56, 0x39, 0x86, 0x50, 0x0c, 0xb3, 0x18, 0xf4, 0xc5, 0xca, 0xf2, 0x6f, 0xcd, 0x8d, 0xd5, 0x02, 0xb0, | ||||
| 	/* (2^390)P */ 0xbf, 0x39, 0x3f, 0xac, 0x6d, 0x1a, 0x6a, 0xe4, 0x42, 0x24, 0xd6, 0x41, 0x9d, 0xb9, 0x5b, 0x46, 0x73, 0x93, 0x76, 0xaa, 0xb7, 0x37, 0x36, 0xa6, 0x09, 0xe5, 0x04, 0x3b, 0x66, 0xc4, 0x29, 0x3e, 0x41, 0xc2, 0xcb, 0xe5, 0x17, 0xd7, 0x34, 0x67, 0x1d, 0x2c, 0x12, 0xec, 0x24, 0x7a, 0x40, 0xa2, 0x45, 0x41, 0xf0, 0x75, 0xed, 0x43, 0x30, 0xc9, | ||||
| 	/* (2^391)P */ 0x80, 0xf6, 0x47, 0x5b, 0xad, 0x54, 0x02, 0xbc, 0xdd, 0xa4, 0xb2, 0xd7, 0x42, 0x95, 0xf2, 0x0d, 0x1b, 0xef, 0x37, 0xa7, 0xb4, 0x34, 0x04, 0x08, 0x71, 0x1b, 0xd3, 0xdf, 0xa1, 0xf0, 0x2b, 0xfa, 0xc0, 0x1f, 0xf3, 0x44, 0xb5, 0xc6, 0x47, 0x3d, 0x65, 0x67, 0x45, 0x4d, 0x2f, 0xde, 0x52, 0x73, 0xfc, 0x30, 0x01, 0x6b, 0xc1, 0x03, 0xd8, 0xd7, | ||||
| 	/* (2^392)P */ 0x1c, 0x67, 0x55, 0x3e, 0x01, 0x17, 0x0f, 0x3e, 0xe5, 0x34, 0x58, 0xfc, 0xcb, 0x71, 0x24, 0x74, 0x5d, 0x36, 0x1e, 0x89, 0x2a, 0x63, 0xf8, 0xf8, 0x9f, 0x50, 0x9f, 0x32, 0x92, 0x29, 0xd8, 0x1a, 0xec, 0x76, 0x57, 0x6c, 0x67, 0x12, 0x6a, 0x6e, 0xef, 0x97, 0x1f, 0xc3, 0x77, 0x60, 0x3c, 0x22, 0xcb, 0xc7, 0x04, 0x1a, 0x89, 0x2d, 0x10, 0xa6, | ||||
| 	/* (2^393)P */ 0x12, 0xf5, 0xa9, 0x26, 0x16, 0xd9, 0x3c, 0x65, 0x5d, 0x83, 0xab, 0xd1, 0x70, 0x6b, 0x1c, 0xdb, 0xe7, 0x86, 0x0d, 0xfb, 0xe7, 0xf8, 0x2a, 0x58, 0x6e, 0x7a, 0x66, 0x13, 0x53, 0x3a, 0x6f, 0x8d, 0x43, 0x5f, 0x14, 0x23, 0x14, 0xff, 0x3d, 0x52, 0x7f, 0xee, 0xbd, 0x7a, 0x34, 0x8b, 0x35, 0x24, 0xc3, 0x7a, 0xdb, 0xcf, 0x22, 0x74, 0x9a, 0x8f, | ||||
| 	/* (2^394)P */ 0xdb, 0x20, 0xfc, 0xe5, 0x39, 0x4e, 0x7d, 0x78, 0xee, 0x0b, 0xbf, 0x1d, 0x80, 0xd4, 0x05, 0x4f, 0xb9, 0xd7, 0x4e, 0x94, 0x88, 0x9a, 0x50, 0x78, 0x1a, 0x70, 0x8c, 0xcc, 0x25, 0xb6, 0x61, 0x09, 0xdc, 0x7b, 0xea, 0x3f, 0x7f, 0xea, 0x2a, 0x0d, 0x47, 0x1c, 0x8e, 0xa6, 0x5b, 0xd2, 0xa3, 0x61, 0x93, 0x3c, 0x68, 0x9f, 0x8b, 0xea, 0xb0, 0xcb, | ||||
| 	/* (2^395)P */ 0xff, 0x54, 0x02, 0x19, 0xae, 0x8b, 0x4c, 0x2c, 0x3a, 0xe0, 0xe4, 0xac, 0x87, 0xf7, 0x51, 0x45, 0x41, 0x43, 0xdc, 0xaa, 0xcd, 0xcb, 0xdc, 0x40, 0xe3, 0x44, 0x3b, 0x1d, 0x9e, 0x3d, 0xb9, 0x82, 0xcc, 0x7a, 0xc5, 0x12, 0xf8, 0x1e, 0xdd, 0xdb, 0x8d, 0xb0, 0x2a, 0xe8, 0xe6, 0x6c, 0x94, 0x3b, 0xb7, 0x2d, 0xba, 0x79, 0x3b, 0xb5, 0x86, 0xfb, | ||||
| 	/* (2^396)P */ 0x82, 0x88, 0x13, 0xdd, 0x6c, 0xcd, 0x85, 0x2b, 0x90, 0x86, 0xb7, 0xac, 0x16, 0xa6, 0x6e, 0x6a, 0x94, 0xd8, 0x1e, 0x4e, 0x41, 0x0f, 0xce, 0x81, 0x6a, 0xa8, 0x26, 0x56, 0x43, 0x52, 0x52, 0xe6, 0xff, 0x88, 0xcf, 0x47, 0x05, 0x1d, 0xff, 0xf3, 0xa0, 0x10, 0xb2, 0x97, 0x87, 0xeb, 0x47, 0xbb, 0xfa, 0x1f, 0xe8, 0x4c, 0xce, 0xc4, 0xcd, 0x93, | ||||
| 	/* (2^397)P */ 0xf4, 0x11, 0xf5, 0x8d, 0x89, 0x29, 0x79, 0xb3, 0x59, 0x0b, 0x29, 0x7d, 0x9c, 0x12, 0x4a, 0x65, 0x72, 0x3a, 0xf9, 0xec, 0x37, 0x18, 0x86, 0xef, 0x44, 0x07, 0x25, 0x74, 0x76, 0x53, 0xed, 0x51, 0x01, 0xc6, 0x28, 0xc5, 0xc3, 0x4a, 0x0f, 0x99, 0xec, 0xc8, 0x40, 0x5a, 0x83, 0x30, 0x79, 0xa2, 0x3e, 0x63, 0x09, 0x2d, 0x6f, 0x23, 0x54, 0x1c, | ||||
| 	/* (2^398)P */ 0x5c, 0x6f, 0x3b, 0x1c, 0x30, 0x77, 0x7e, 0x87, 0x66, 0x83, 0x2e, 0x7e, 0x85, 0x50, 0xfd, 0xa0, 0x7a, 0xc2, 0xf5, 0x0f, 0xc1, 0x64, 0xe7, 0x0b, 0xbd, 0x59, 0xa7, 0xe7, 0x65, 0x53, 0xc3, 0xf5, 0x55, 0x5b, 0xe1, 0x82, 0x30, 0x5a, 0x61, 0xcd, 0xa0, 0x89, 0x32, 0xdb, 0x87, 0xfc, 0x21, 0x8a, 0xab, 0x6d, 0x82, 0xa8, 0x42, 0x81, 0x4f, 0xf2, | ||||
| 	/* (2^399)P */ 0xb3, 0xeb, 0x88, 0x18, 0xf6, 0x56, 0x96, 0xbf, 0xba, 0x5d, 0x71, 0xa1, 0x5a, 0xd1, 0x04, 0x7b, 0xd5, 0x46, 0x01, 0x74, 0xfe, 0x15, 0x25, 0xb7, 0xff, 0x0c, 0x24, 0x47, 0xac, 0xfd, 0xab, 0x47, 0x32, 0xe1, 0x6a, 0x4e, 0xca, 0xcf, 0x7f, 0xdd, 0xf8, 0xd2, 0x4b, 0x3b, 0xf5, 0x17, 0xba, 0xba, 0x8b, 0xa1, 0xec, 0x28, 0x3f, 0x97, 0xab, 0x2a, | ||||
| 	/* (2^400)P */ 0x51, 0x38, 0xc9, 0x5e, 0xc6, 0xb3, 0x64, 0xf2, 0x24, 0x4d, 0x04, 0x7d, 0xc8, 0x39, 0x0c, 0x4a, 0xc9, 0x73, 0x74, 0x1b, 0x5c, 0xb2, 0xc5, 0x41, 0x62, 0xa0, 0x4c, 0x6d, 0x8d, 0x91, 0x9a, 0x7b, 0x88, 0xab, 0x9c, 0x7e, 0x23, 0xdb, 0x6f, 0xb5, 0x72, 0xd6, 0x47, 0x40, 0xef, 0x22, 0x58, 0x62, 0x19, 0x6c, 0x38, 0xba, 0x5b, 0x00, 0x30, 0x9f, | ||||
| 	/* (2^401)P */ 0x65, 0xbb, 0x3b, 0x9b, 0xe9, 0xae, 0xbf, 0xbe, 0xe4, 0x13, 0x95, 0xf3, 0xe3, 0x77, 0xcb, 0xe4, 0x9a, 0x22, 0xb5, 0x4a, 0x08, 0x9d, 0xb3, 0x9e, 0x27, 0xe0, 0x15, 0x6c, 0x9f, 0x7e, 0x9a, 0x5e, 0x15, 0x45, 0x25, 0x8d, 0x01, 0x0a, 0xd2, 0x2b, 0xbd, 0x48, 0x06, 0x0d, 0x18, 0x97, 0x4b, 0xdc, 0xbc, 0xf0, 0xcd, 0xb2, 0x52, 0x3c, 0xac, 0xf5, | ||||
| 	/* (2^402)P */ 0x3e, 0xed, 0x47, 0x6b, 0x5c, 0xf6, 0x76, 0xd0, 0xe9, 0x15, 0xa3, 0xcb, 0x36, 0x00, 0x21, 0xa3, 0x79, 0x20, 0xa5, 0x3e, 0x88, 0x03, 0xcb, 0x7e, 0x63, 0xbb, 0xed, 0xa9, 0x13, 0x35, 0x16, 0xaf, 0x2e, 0xb4, 0x70, 0x14, 0x93, 0xfb, 0xc4, 0x9b, 0xd8, 0xb1, 0xbe, 0x43, 0xd1, 0x85, 0xb8, 0x97, 0xef, 0xea, 0x88, 0xa1, 0x25, 0x52, 0x62, 0x75, | ||||
| 	/* (2^403)P */ 0x8e, 0x4f, 0xaa, 0x23, 0x62, 0x7e, 0x2b, 0x37, 0x89, 0x00, 0x11, 0x30, 0xc5, 0x33, 0x4a, 0x89, 0x8a, 0xe2, 0xfc, 0x5c, 0x6a, 0x75, 0xe5, 0xf7, 0x02, 0x4a, 0x9b, 0xf7, 0xb5, 0x6a, 0x85, 0x31, 0xd3, 0x5a, 0xcf, 0xc3, 0xf8, 0xde, 0x2f, 0xcf, 0xb5, 0x24, 0xf4, 0xe3, 0xa1, 0xad, 0x42, 0xae, 0x09, 0xb9, 0x2e, 0x04, 0x2d, 0x01, 0x22, 0x3f, | ||||
| 	/* (2^404)P */ 0x41, 0x16, 0xfb, 0x7d, 0x50, 0xfd, 0xb5, 0xba, 0x88, 0x24, 0xba, 0xfd, 0x3d, 0xb2, 0x90, 0x15, 0xb7, 0xfa, 0xa2, 0xe1, 0x4c, 0x7d, 0xb9, 0xc6, 0xff, 0x81, 0x57, 0xb6, 0xc2, 0x9e, 0xcb, 0xc4, 0x35, 0xbd, 0x01, 0xb7, 0xaa, 0xce, 0xd0, 0xe9, 0xb5, 0xd6, 0x72, 0xbf, 0xd2, 0xee, 0xc7, 0xac, 0x94, 0xff, 0x29, 0x57, 0x02, 0x49, 0x09, 0xad, | ||||
| 	/* (2^405)P */ 0x27, 0xa5, 0x78, 0x1b, 0xbf, 0x6b, 0xaf, 0x0b, 0x8c, 0xd9, 0xa8, 0x37, 0xb0, 0x67, 0x18, 0xb6, 0xc7, 0x05, 0x8a, 0x67, 0x03, 0x30, 0x62, 0x6e, 0x56, 0x82, 0xa9, 0x54, 0x3e, 0x0c, 0x4e, 0x07, 0xe1, 0x5a, 0x38, 0xed, 0xfa, 0xc8, 0x55, 0x6b, 0x08, 0xa3, 0x6b, 0x64, 0x2a, 0x15, 0xd6, 0x39, 0x6f, 0x47, 0x99, 0x42, 0x3f, 0x33, 0x84, 0x8f, | ||||
| 	/* (2^406)P */ 0xbc, 0x45, 0x29, 0x81, 0x0e, 0xa4, 0xc5, 0x72, 0x3a, 0x10, 0xe1, 0xc4, 0x1e, 0xda, 0xc3, 0xfe, 0xb0, 0xce, 0xd2, 0x13, 0x34, 0x67, 0x21, 0xc6, 0x7e, 0xf9, 0x8c, 0xff, 0x39, 0x50, 0xae, 0x92, 0x60, 0x35, 0x2f, 0x8b, 0x6e, 0xc9, 0xc1, 0x27, 0x3a, 0x94, 0x66, 0x3e, 0x26, 0x84, 0x93, 0xc8, 0x6c, 0xcf, 0xd2, 0x03, 0xa1, 0x10, 0xcf, 0xb7, | ||||
| 	/* (2^407)P */ 0x64, 0xda, 0x19, 0xf6, 0xc5, 0x73, 0x17, 0x44, 0x88, 0x81, 0x07, 0x0d, 0x34, 0xb2, 0x75, 0xf9, 0xd9, 0xe2, 0xe0, 0x8b, 0x71, 0xcf, 0x72, 0x34, 0x83, 0xb4, 0xce, 0xfc, 0xd7, 0x29, 0x09, 0x5a, 0x98, 0xbf, 0x14, 0xac, 0x77, 0x55, 0x38, 0x47, 0x5b, 0x0f, 0x40, 0x24, 0xe5, 0xa5, 0xa6, 0xac, 0x2d, 0xa6, 0xff, 0x9c, 0x73, 0xfe, 0x5c, 0x7e, | ||||
| 	/* (2^408)P */ 0x1e, 0x33, 0xcc, 0x68, 0xb2, 0xbc, 0x8c, 0x93, 0xaf, 0xcc, 0x38, 0xf8, 0xd9, 0x16, 0x72, 0x50, 0xac, 0xd9, 0xb5, 0x0b, 0x9a, 0xbe, 0x46, 0x7a, 0xf1, 0xee, 0xf1, 0xad, 0xec, 0x5b, 0x59, 0x27, 0x9c, 0x05, 0xa3, 0x87, 0xe0, 0x37, 0x2c, 0x83, 0xce, 0xb3, 0x65, 0x09, 0x8e, 0xc3, 0x9c, 0xbf, 0x6a, 0xa2, 0x00, 0xcc, 0x12, 0x36, 0xc5, 0x95, | ||||
| 	/* (2^409)P */ 0x36, 0x11, 0x02, 0x14, 0x9c, 0x3c, 0xeb, 0x2f, 0x23, 0x5b, 0x6b, 0x2b, 0x08, 0x54, 0x53, 0xac, 0xb2, 0xa3, 0xe0, 0x26, 0x62, 0x3c, 0xe4, 0xe1, 0x81, 0xee, 0x13, 0x3e, 0xa4, 0x97, 0xef, 0xf9, 0x92, 0x27, 0x01, 0xce, 0x54, 0x8b, 0x3e, 0x31, 0xbe, 0xa7, 0x88, 0xcf, 0x47, 0x99, 0x3c, 0x10, 0x6f, 0x60, 0xb3, 0x06, 0x4e, 0xee, 0x1b, 0xf0, | ||||
| 	/* (2^410)P */ 0x59, 0x49, 0x66, 0xcf, 0x22, 0xe6, 0xf6, 0x73, 0xfe, 0xa3, 0x1c, 0x09, 0xfa, 0x5f, 0x65, 0xa8, 0xf0, 0x82, 0xc2, 0xef, 0x16, 0x63, 0x6e, 0x79, 0x69, 0x51, 0x39, 0x07, 0x65, 0xc4, 0x81, 0xec, 0x73, 0x0f, 0x15, 0x93, 0xe1, 0x30, 0x33, 0xe9, 0x37, 0x86, 0x42, 0x4c, 0x1f, 0x9b, 0xad, 0xee, 0x3f, 0xf1, 0x2a, 0x8e, 0x6a, 0xa3, 0xc8, 0x35, | ||||
| 	/* (2^411)P */ 0x1e, 0x49, 0xf1, 0xdd, 0xd2, 0x9c, 0x8e, 0x78, 0xb2, 0x06, 0xe4, 0x6a, 0xab, 0x3a, 0xdc, 0xcd, 0xf4, 0xeb, 0xe1, 0xe7, 0x2f, 0xaa, 0xeb, 0x40, 0x31, 0x9f, 0xb9, 0xab, 0x13, 0xa9, 0x78, 0xbf, 0x38, 0x89, 0x0e, 0x85, 0x14, 0x8b, 0x46, 0x76, 0x14, 0xda, 0xcf, 0x33, 0xc8, 0x79, 0xd3, 0xd5, 0xa3, 0x6a, 0x69, 0x45, 0x70, 0x34, 0xc3, 0xe9, | ||||
| 	/* (2^412)P */ 0x5e, 0xe7, 0x78, 0xe9, 0x24, 0xcc, 0xe9, 0xf4, 0xc8, 0x6b, 0xe0, 0xfb, 0x3a, 0xbe, 0xcc, 0x42, 0x4a, 0x00, 0x22, 0xf8, 0xe6, 0x32, 0xbe, 0x6d, 0x18, 0x55, 0x60, 0xe9, 0x72, 0x69, 0x50, 0x56, 0xca, 0x04, 0x18, 0x38, 0xa1, 0xee, 0xd8, 0x38, 0x3c, 0xa7, 0x70, 0xe2, 0xb9, 0x4c, 0xa0, 0xc8, 0x89, 0x72, 0xcf, 0x49, 0x7f, 0xdf, 0xbc, 0x67, | ||||
| 	/* (2^413)P */ 0x1d, 0x17, 0xcb, 0x0b, 0xbd, 0xb2, 0x36, 0xe3, 0xa8, 0x99, 0x31, 0xb6, 0x26, 0x9c, 0x0c, 0x74, 0xaf, 0x4d, 0x24, 0x61, 0xcf, 0x31, 0x7b, 0xed, 0xdd, 0xc3, 0xf6, 0x32, 0x70, 0xfe, 0x17, 0xf6, 0x51, 0x37, 0x65, 0xce, 0x5d, 0xaf, 0xa5, 0x2f, 0x2a, 0xfe, 0x00, 0x71, 0x7c, 0x50, 0xbe, 0x21, 0xc7, 0xed, 0xc6, 0xfc, 0x67, 0xcf, 0x9c, 0xdd, | ||||
| 	/* (2^414)P */ 0x26, 0x3e, 0xf8, 0xbb, 0xd0, 0xb1, 0x01, 0xd8, 0xeb, 0x0b, 0x62, 0x87, 0x35, 0x4c, 0xde, 0xca, 0x99, 0x9c, 0x6d, 0xf7, 0xb6, 0xf0, 0x57, 0x0a, 0x52, 0x29, 0x6a, 0x3f, 0x26, 0x31, 0x04, 0x07, 0x2a, 0xc9, 0xfa, 0x9b, 0x0e, 0x62, 0x8e, 0x72, 0xf2, 0xad, 0xce, 0xb6, 0x35, 0x7a, 0xc1, 0xae, 0x35, 0xc7, 0xa3, 0x14, 0xcf, 0x0c, 0x28, 0xb7, | ||||
| 	/* (2^415)P */ 0xa6, 0xf1, 0x32, 0x3a, 0x20, 0xd2, 0x24, 0x97, 0xcf, 0x5d, 0x37, 0x99, 0xaf, 0x33, 0x7a, 0x5b, 0x7a, 0xcc, 0x4e, 0x41, 0x38, 0xb1, 0x4e, 0xad, 0xc9, 0xd9, 0x71, 0x7e, 0xb2, 0xf5, 0xd5, 0x01, 0x6c, 0x4d, 0xfd, 0xa1, 0xda, 0x03, 0x38, 0x9b, 0x3d, 0x92, 0x92, 0xf2, 0xca, 0xbf, 0x1f, 0x24, 0xa4, 0xbb, 0x30, 0x6a, 0x74, 0x56, 0xc8, 0xce, | ||||
| 	/* (2^416)P */ 0x27, 0xf4, 0xed, 0xc9, 0xc3, 0xb1, 0x79, 0x85, 0xbe, 0xf6, 0xeb, 0xf3, 0x55, 0xc7, 0xaa, 0xa6, 0xe9, 0x07, 0x5d, 0xf4, 0xeb, 0xa6, 0x81, 0xe3, 0x0e, 0xcf, 0xa3, 0xc1, 0xef, 0xe7, 0x34, 0xb2, 0x03, 0x73, 0x8a, 0x91, 0xf1, 0xad, 0x05, 0xc7, 0x0b, 0x43, 0x99, 0x12, 0x31, 0xc8, 0xc7, 0xc5, 0xa4, 0x3d, 0xcd, 0xe5, 0x4e, 0x6d, 0x24, 0xdd, | ||||
| 	/* (2^417)P */ 0x61, 0x54, 0xd0, 0x95, 0x2c, 0x45, 0x75, 0xac, 0xb5, 0x1a, 0x9d, 0x11, 0xeb, 0xed, 0x6b, 0x57, 0xa3, 0xe6, 0xcd, 0x77, 0xd4, 0x83, 0x8e, 0x39, 0xf1, 0x0f, 0x98, 0xcb, 0x40, 0x02, 0x6e, 0x10, 0x82, 0x9e, 0xb4, 0x93, 0x76, 0xd7, 0x97, 0xa3, 0x53, 0x12, 0x86, 0xc6, 0x15, 0x78, 0x73, 0x93, 0xe7, 0x7f, 0xcf, 0x1f, 0xbf, 0xcd, 0xd2, 0x7a, | ||||
| 	/* (2^418)P */ 0xc2, 0x21, 0xdc, 0xd5, 0x69, 0xff, 0xca, 0x49, 0x3a, 0xe1, 0xc3, 0x69, 0x41, 0x56, 0xc1, 0x76, 0x63, 0x24, 0xbd, 0x64, 0x1b, 0x3d, 0x92, 0xf9, 0x13, 0x04, 0x25, 0xeb, 0x27, 0xa6, 0xef, 0x39, 0x3a, 0x80, 0xe0, 0xf8, 0x27, 0xee, 0xc9, 0x49, 0x77, 0xef, 0x3f, 0x29, 0x3d, 0x5e, 0xe6, 0x66, 0x83, 0xd1, 0xf6, 0xfe, 0x9d, 0xbc, 0xf1, 0x96, | ||||
| 	/* (2^419)P */ 0x6b, 0xc6, 0x99, 0x26, 0x3c, 0xf3, 0x63, 0xf9, 0xc7, 0x29, 0x8c, 0x52, 0x62, 0x2d, 0xdc, 0x8a, 0x66, 0xce, 0x2c, 0xa7, 0xe4, 0xf0, 0xd7, 0x37, 0x17, 0x1e, 0xe4, 0xa3, 0x53, 0x7b, 0x29, 0x8e, 0x60, 0x99, 0xf9, 0x0c, 0x7c, 0x6f, 0xa2, 0xcc, 0x9f, 0x80, 0xdd, 0x5e, 0x46, 0xaa, 0x0d, 0x6c, 0xc9, 0x6c, 0xf7, 0x78, 0x5b, 0x38, 0xe3, 0x24, | ||||
| 	/* (2^420)P */ 0x4b, 0x75, 0x6a, 0x2f, 0x08, 0xe1, 0x72, 0x76, 0xab, 0x82, 0x96, 0xdf, 0x3b, 0x1f, 0x9b, 0xd8, 0xed, 0xdb, 0xcd, 0x15, 0x09, 0x5a, 0x1e, 0xb7, 0xc5, 0x26, 0x72, 0x07, 0x0c, 0x50, 0xcd, 0x3b, 0x4d, 0x3f, 0xa2, 0x67, 0xc2, 0x02, 0x61, 0x2e, 0x68, 0xe9, 0x6f, 0xf0, 0x21, 0x2a, 0xa7, 0x3b, 0x88, 0x04, 0x11, 0x64, 0x49, 0x0d, 0xb4, 0x46, | ||||
| 	/* (2^421)P */ 0x63, 0x85, 0xf3, 0xc5, 0x2b, 0x5a, 0x9f, 0xf0, 0x17, 0xcb, 0x45, 0x0a, 0xf3, 0x6e, 0x7e, 0xb0, 0x7c, 0xbc, 0xf0, 0x4f, 0x3a, 0xb0, 0xbc, 0x36, 0x36, 0x52, 0x51, 0xcb, 0xfe, 0x9a, 0xcb, 0xe8, 0x7e, 0x4b, 0x06, 0x7f, 0xaa, 0x35, 0xc8, 0x0e, 0x7a, 0x30, 0xa3, 0xb1, 0x09, 0xbb, 0x86, 0x4c, 0xbe, 0xb8, 0xbd, 0xe0, 0x32, 0xa5, 0xd4, 0xf7, | ||||
| 	/* (2^422)P */ 0x7d, 0x50, 0x37, 0x68, 0x4e, 0x22, 0xb2, 0x2c, 0xd5, 0x0f, 0x2b, 0x6d, 0xb1, 0x51, 0xf2, 0x82, 0xe9, 0x98, 0x7c, 0x50, 0xc7, 0x96, 0x7e, 0x0e, 0xdc, 0xb1, 0x0e, 0xb2, 0x63, 0x8c, 0x30, 0x37, 0x72, 0x21, 0x9c, 0x61, 0xc2, 0xa7, 0x33, 0xd9, 0xb2, 0x63, 0x93, 0xd1, 0x6b, 0x6a, 0x73, 0xa5, 0x58, 0x80, 0xff, 0x04, 0xc7, 0x83, 0x21, 0x29, | ||||
| 	/* (2^423)P */ 0x29, 0x04, 0xbc, 0x99, 0x39, 0xc9, 0x58, 0xc9, 0x6b, 0x17, 0xe8, 0x90, 0xb3, 0xe6, 0xa9, 0xb6, 0x28, 0x9b, 0xcb, 0x3b, 0x28, 0x90, 0x68, 0x71, 0xff, 0xcf, 0x08, 0x78, 0xc9, 0x8d, 0xa8, 0x4e, 0x43, 0xd1, 0x1c, 0x9e, 0xa4, 0xe3, 0xdf, 0xbf, 0x92, 0xf4, 0xf9, 0x41, 0xba, 0x4d, 0x1c, 0xf9, 0xdd, 0x74, 0x76, 0x1c, 0x6e, 0x3e, 0x94, 0x87, | ||||
| 	/* (2^424)P */ 0xe4, 0xda, 0xc5, 0xd7, 0xfb, 0x87, 0xc5, 0x4d, 0x6b, 0x19, 0xaa, 0xb9, 0xbc, 0x8c, 0xf2, 0x8a, 0xd8, 0x5d, 0xdb, 0x4d, 0xef, 0xa6, 0xf2, 0x65, 0xf1, 0x22, 0x9c, 0xf1, 0x46, 0x30, 0x71, 0x7c, 0xe4, 0x53, 0x8e, 0x55, 0x2e, 0x9c, 0x9a, 0x31, 0x2a, 0xc3, 0xab, 0x0f, 0xde, 0xe4, 0xbe, 0xd8, 0x96, 0x50, 0x6e, 0x0c, 0x54, 0x49, 0xe6, 0xec, | ||||
| 	/* (2^425)P */ 0x3c, 0x1d, 0x5a, 0xa5, 0xda, 0xad, 0xdd, 0xc2, 0xae, 0xac, 0x6f, 0x86, 0x75, 0x31, 0x91, 0x64, 0x45, 0x9d, 0xa4, 0xf0, 0x81, 0xf1, 0x0e, 0xba, 0x74, 0xaf, 0x7b, 0xcd, 0x6f, 0xfe, 0xac, 0x4e, 0xdb, 0x4e, 0x45, 0x35, 0x36, 0xc5, 0xc0, 0x6c, 0x3d, 0x64, 0xf4, 0xd8, 0x07, 0x62, 0xd1, 0xec, 0xf3, 0xfc, 0x93, 0xc9, 0x28, 0x0c, 0x2c, 0xf3, | ||||
| 	/* (2^426)P */ 0x0c, 0x69, 0x2b, 0x5c, 0xb6, 0x41, 0x69, 0xf1, 0xa4, 0xf1, 0x5b, 0x75, 0x4c, 0x42, 0x8b, 0x47, 0xeb, 0x69, 0xfb, 0xa8, 0xe6, 0xf9, 0x7b, 0x48, 0x50, 0xaf, 0xd3, 0xda, 0xb2, 0x35, 0x10, 0xb5, 0x5b, 0x40, 0x90, 0x39, 0xc9, 0x07, 0x06, 0x73, 0x26, 0x20, 0x95, 0x01, 0xa4, 0x2d, 0xf0, 0xe7, 0x2e, 0x00, 0x7d, 0x41, 0x09, 0x68, 0x13, 0xc4, | ||||
| 	/* (2^427)P */ 0xbe, 0x38, 0x78, 0xcf, 0xc9, 0x4f, 0x36, 0xca, 0x09, 0x61, 0x31, 0x3c, 0x57, 0x2e, 0xec, 0x17, 0xa4, 0x7d, 0x19, 0x2b, 0x9b, 0x5b, 0xbe, 0x8f, 0xd6, 0xc5, 0x2f, 0x86, 0xf2, 0x64, 0x76, 0x17, 0x00, 0x6e, 0x1a, 0x8c, 0x67, 0x1b, 0x68, 0xeb, 0x15, 0xa2, 0xd6, 0x09, 0x91, 0xdd, 0x23, 0x0d, 0x98, 0xb2, 0x10, 0x19, 0x55, 0x9b, 0x63, 0xf2, | ||||
| 	/* (2^428)P */ 0x51, 0x1f, 0x93, 0xea, 0x2a, 0x3a, 0xfa, 0x41, 0xc0, 0x57, 0xfb, 0x74, 0xa6, 0x65, 0x09, 0x56, 0x14, 0xb6, 0x12, 0xaa, 0xb3, 0x1a, 0x8d, 0x3b, 0x76, 0x91, 0x7a, 0x23, 0x56, 0x9c, 0x6a, 0xc0, 0xe0, 0x3c, 0x3f, 0xb5, 0x1a, 0xf4, 0x57, 0x71, 0x93, 0x2b, 0xb1, 0xa7, 0x70, 0x57, 0x22, 0x80, 0xf5, 0xb8, 0x07, 0x77, 0x87, 0x0c, 0xbe, 0x83, | ||||
| 	/* (2^429)P */ 0x07, 0x9b, 0x0e, 0x52, 0x38, 0x63, 0x13, 0x86, 0x6a, 0xa6, 0xb4, 0xd2, 0x60, 0x68, 0x9a, 0x99, 0x82, 0x0a, 0x04, 0x5f, 0x89, 0x7a, 0x1a, 0x2a, 0xae, 0x2d, 0x35, 0x0c, 0x1e, 0xad, 0xef, 0x4f, 0x9a, 0xfc, 0xc8, 0xd9, 0xcf, 0x9d, 0x48, 0x71, 0xa5, 0x55, 0x79, 0x73, 0x39, 0x1b, 0xd8, 0x73, 0xec, 0x9b, 0x03, 0x16, 0xd8, 0x82, 0xf7, 0x67, | ||||
| 	/* (2^430)P */ 0x52, 0x67, 0x42, 0x21, 0xc9, 0x40, 0x78, 0x82, 0x2b, 0x95, 0x2d, 0x20, 0x92, 0xd1, 0xe2, 0x61, 0x25, 0xb0, 0xc6, 0x9c, 0x20, 0x59, 0x8e, 0x28, 0x6f, 0xf3, 0xfd, 0xd3, 0xc1, 0x32, 0x43, 0xc9, 0xa6, 0x08, 0x7a, 0x77, 0x9c, 0x4c, 0x8c, 0x33, 0x71, 0x13, 0x69, 0xe3, 0x52, 0x30, 0xa7, 0xf5, 0x07, 0x67, 0xac, 0xad, 0x46, 0x8a, 0x26, 0x25, | ||||
| 	/* (2^431)P */ 0xda, 0x86, 0xc4, 0xa2, 0x71, 0x56, 0xdd, 0xd2, 0x48, 0xd3, 0xde, 0x42, 0x63, 0x01, 0xa7, 0x2c, 0x92, 0x83, 0x6f, 0x2e, 0xd8, 0x1e, 0x3f, 0xc1, 0xc5, 0x42, 0x4e, 0x34, 0x19, 0x54, 0x6e, 0x35, 0x2c, 0x51, 0x2e, 0xfd, 0x0f, 0x9a, 0x45, 0x66, 0x5e, 0x4a, 0x83, 0xda, 0x0a, 0x53, 0x68, 0x63, 0xfa, 0xce, 0x47, 0x20, 0xd3, 0x34, 0xba, 0x0d, | ||||
| 	/* (2^432)P */ 0xd0, 0xe9, 0x64, 0xa4, 0x61, 0x4b, 0x86, 0xe5, 0x93, 0x6f, 0xda, 0x0e, 0x31, 0x7e, 0x6e, 0xe3, 0xc6, 0x73, 0xd8, 0xa3, 0x08, 0x57, 0x52, 0xcd, 0x51, 0x63, 0x1d, 0x9f, 0x93, 0x00, 0x62, 0x91, 0x26, 0x21, 0xa7, 0xdd, 0x25, 0x0f, 0x09, 0x0d, 0x35, 0xad, 0xcf, 0x11, 0x8e, 0x6e, 0xe8, 0xae, 0x1d, 0x95, 0xcb, 0x88, 0xf8, 0x70, 0x7b, 0x91, | ||||
| 	/* (2^433)P */ 0x0c, 0x19, 0x5c, 0xd9, 0x8d, 0xda, 0x9d, 0x2c, 0x90, 0x54, 0x65, 0xe8, 0xb6, 0x35, 0x50, 0xae, 0xea, 0xae, 0x43, 0xb7, 0x1e, 0x99, 0x8b, 0x4c, 0x36, 0x4e, 0xe4, 0x1e, 0xc4, 0x64, 0x43, 0xb6, 0xeb, 0xd4, 0xe9, 0x60, 0x22, 0xee, 0xcf, 0xb8, 0x52, 0x1b, 0xf0, 0x04, 0xce, 0xbc, 0x2b, 0xf0, 0xbe, 0xcd, 0x44, 0x74, 0x1e, 0x1f, 0x63, 0xf9, | ||||
| 	/* (2^434)P */ 0xe1, 0x3f, 0x95, 0x94, 0xb2, 0xb6, 0x31, 0xa9, 0x1b, 0xdb, 0xfd, 0x0e, 0xdb, 0xdd, 0x1a, 0x22, 0x78, 0x60, 0x9f, 0x75, 0x5f, 0x93, 0x06, 0x0c, 0xd8, 0xbb, 0xa2, 0x85, 0x2b, 0x5e, 0xc0, 0x9b, 0xa8, 0x5d, 0xaf, 0x93, 0x91, 0x91, 0x47, 0x41, 0x1a, 0xfc, 0xb4, 0x51, 0x85, 0xad, 0x69, 0x4d, 0x73, 0x69, 0xd5, 0x4e, 0x82, 0xfb, 0x66, 0xcb, | ||||
| 	/* (2^435)P */ 0x7c, 0xbe, 0xc7, 0x51, 0xc4, 0x74, 0x6e, 0xab, 0xfd, 0x41, 0x4f, 0x76, 0x4f, 0x24, 0x03, 0xd6, 0x2a, 0xb7, 0x42, 0xb4, 0xda, 0x41, 0x2c, 0x82, 0x48, 0x4c, 0x7f, 0x6f, 0x25, 0x5d, 0x36, 0xd4, 0x69, 0xf5, 0xef, 0x02, 0x81, 0xea, 0x6f, 0x19, 0x69, 0xe8, 0x6f, 0x5b, 0x2f, 0x14, 0x0e, 0x6f, 0x89, 0xb4, 0xb5, 0xd8, 0xae, 0xef, 0x7b, 0x87, | ||||
| 	/* (2^436)P */ 0xe9, 0x91, 0xa0, 0x8b, 0xc9, 0xe0, 0x01, 0x90, 0x37, 0xc1, 0x6f, 0xdc, 0x5e, 0xf7, 0xbf, 0x43, 0x00, 0xaa, 0x10, 0x76, 0x76, 0x18, 0x6e, 0x19, 0x1e, 0x94, 0x50, 0x11, 0x0a, 0xd1, 0xe2, 0xdb, 0x08, 0x21, 0xa0, 0x1f, 0xdb, 0x54, 0xfe, 0xea, 0x6e, 0xa3, 0x68, 0x56, 0x87, 0x0b, 0x22, 0x4e, 0x66, 0xf3, 0x82, 0x82, 0x00, 0xcd, 0xd4, 0x12, | ||||
| 	/* (2^437)P */ 0x25, 0x8e, 0x24, 0x77, 0x64, 0x4c, 0xe0, 0xf8, 0x18, 0xc0, 0xdc, 0xc7, 0x1b, 0x35, 0x65, 0xde, 0x67, 0x41, 0x5e, 0x6f, 0x90, 0x82, 0xa7, 0x2e, 0x6d, 0xf1, 0x47, 0xb4, 0x92, 0x9c, 0xfd, 0x6a, 0x9a, 0x41, 0x36, 0x20, 0x24, 0x58, 0xc3, 0x59, 0x07, 0x9a, 0xfa, 0x9f, 0x03, 0xcb, 0xc7, 0x69, 0x37, 0x60, 0xe1, 0xab, 0x13, 0x72, 0xee, 0xa2, | ||||
| 	/* (2^438)P */ 0x74, 0x78, 0xfb, 0x13, 0xcb, 0x8e, 0x37, 0x1a, 0xf6, 0x1d, 0x17, 0x83, 0x06, 0xd4, 0x27, 0x06, 0x21, 0xe8, 0xda, 0xdf, 0x6b, 0xf3, 0x83, 0x6b, 0x34, 0x8a, 0x8c, 0xee, 0x01, 0x05, 0x5b, 0xed, 0xd3, 0x1b, 0xc9, 0x64, 0x83, 0xc9, 0x49, 0xc2, 0x57, 0x1b, 0xdd, 0xcf, 0xf1, 0x9d, 0x63, 0xee, 0x1c, 0x0d, 0xa0, 0x0a, 0x73, 0x1f, 0x5b, 0x32, | ||||
| 	/* (2^439)P */ 0x29, 0xce, 0x1e, 0xc0, 0x6a, 0xf5, 0xeb, 0x99, 0x5a, 0x39, 0x23, 0xe9, 0xdd, 0xac, 0x44, 0x88, 0xbc, 0x80, 0x22, 0xde, 0x2c, 0xcb, 0xa8, 0x3b, 0xff, 0xf7, 0x6f, 0xc7, 0x71, 0x72, 0xa8, 0xa3, 0xf6, 0x4d, 0xc6, 0x75, 0xda, 0x80, 0xdc, 0xd9, 0x30, 0xd9, 0x07, 0x50, 0x5a, 0x54, 0x7d, 0xda, 0x39, 0x6f, 0x78, 0x94, 0xbf, 0x25, 0x98, 0xdc, | ||||
| 	/* (2^440)P */ 0x01, 0x26, 0x62, 0x44, 0xfb, 0x0f, 0x11, 0x72, 0x73, 0x0a, 0x16, 0xc7, 0x16, 0x9c, 0x9b, 0x37, 0xd8, 0xff, 0x4f, 0xfe, 0x57, 0xdb, 0xae, 0xef, 0x7d, 0x94, 0x30, 0x04, 0x70, 0x83, 0xde, 0x3c, 0xd4, 0xb5, 0x70, 0xda, 0xa7, 0x55, 0xc8, 0x19, 0xe1, 0x36, 0x15, 0x61, 0xe7, 0x3b, 0x7d, 0x85, 0xbb, 0xf3, 0x42, 0x5a, 0x94, 0xf4, 0x53, 0x2a, | ||||
| 	/* (2^441)P */ 0x14, 0x60, 0xa6, 0x0b, 0x83, 0xe1, 0x23, 0x77, 0xc0, 0xce, 0x50, 0xed, 0x35, 0x8d, 0x98, 0x99, 0x7d, 0xf5, 0x8d, 0xce, 0x94, 0x25, 0xc8, 0x0f, 0x6d, 0xfa, 0x4a, 0xa4, 0x3a, 0x1f, 0x66, 0xfb, 0x5a, 0x64, 0xaf, 0x8b, 0x54, 0x54, 0x44, 0x3f, 0x5b, 0x88, 0x61, 0xe4, 0x48, 0x45, 0x26, 0x20, 0xbe, 0x0d, 0x06, 0xbb, 0x65, 0x59, 0xe1, 0x36, | ||||
| 	/* (2^442)P */ 0xb7, 0x98, 0xce, 0xa3, 0xe3, 0xee, 0x11, 0x1b, 0x9e, 0x24, 0x59, 0x75, 0x31, 0x37, 0x44, 0x6f, 0x6b, 0x9e, 0xec, 0xb7, 0x44, 0x01, 0x7e, 0xab, 0xbb, 0x69, 0x5d, 0x11, 0xb0, 0x30, 0x64, 0xea, 0x91, 0xb4, 0x7a, 0x8c, 0x02, 0x4c, 0xb9, 0x10, 0xa7, 0xc7, 0x79, 0xe6, 0xdc, 0x77, 0xe3, 0xc8, 0xef, 0x3e, 0xf9, 0x38, 0x81, 0xce, 0x9a, 0xb2, | ||||
| 	/* (2^443)P */ 0x91, 0x12, 0x76, 0xd0, 0x10, 0xb4, 0xaf, 0xe1, 0x89, 0x3a, 0x93, 0x6b, 0x5c, 0x19, 0x5f, 0x24, 0xed, 0x04, 0x92, 0xc7, 0xf0, 0x00, 0x08, 0xc1, 0x92, 0xff, 0x90, 0xdb, 0xb2, 0xbf, 0xdf, 0x49, 0xcd, 0xbd, 0x5c, 0x6e, 0xbf, 0x16, 0xbb, 0x61, 0xf9, 0x20, 0x33, 0x35, 0x93, 0x11, 0xbc, 0x59, 0x69, 0xce, 0x18, 0x9f, 0xf8, 0x7b, 0xa1, 0x6e, | ||||
| 	/* (2^444)P */ 0xa1, 0xf4, 0xaf, 0xad, 0xf8, 0xe6, 0x99, 0xd2, 0xa1, 0x4d, 0xde, 0x56, 0xc9, 0x7b, 0x0b, 0x11, 0x3e, 0xbf, 0x89, 0x1a, 0x9a, 0x90, 0xe5, 0xe2, 0xa6, 0x37, 0x88, 0xa1, 0x68, 0x59, 0xae, 0x8c, 0xec, 0x02, 0x14, 0x8d, 0xb7, 0x2e, 0x25, 0x75, 0x7f, 0x76, 0x1a, 0xd3, 0x4d, 0xad, 0x8a, 0x00, 0x6c, 0x96, 0x49, 0xa4, 0xc3, 0x2e, 0x5c, 0x7b, | ||||
| 	/* (2^445)P */ 0x26, 0x53, 0xf7, 0xda, 0xa8, 0x01, 0x14, 0xb1, 0x63, 0xe3, 0xc3, 0x89, 0x88, 0xb0, 0x85, 0x40, 0x2b, 0x26, 0x9a, 0x10, 0x1a, 0x70, 0x33, 0xf4, 0x50, 0x9d, 0x4d, 0xd8, 0x64, 0xc6, 0x0f, 0xe1, 0x17, 0xc8, 0x10, 0x4b, 0xfc, 0xa0, 0xc9, 0xba, 0x2c, 0x98, 0x09, 0xf5, 0x84, 0xb6, 0x7c, 0x4e, 0xa3, 0xe3, 0x81, 0x1b, 0x32, 0x60, 0x02, 0xdd, | ||||
| 	/* (2^446)P */ 0xa3, 0xe5, 0x86, 0xd4, 0x43, 0xa8, 0xd1, 0x98, 0x9d, 0x9d, 0xdb, 0x04, 0xcf, 0x6e, 0x35, 0x05, 0x30, 0x53, 0x3b, 0xbc, 0x90, 0x00, 0x4a, 0xc5, 0x40, 0x2a, 0x0f, 0xde, 0x1a, 0xd7, 0x36, 0x27, 0x44, 0x62, 0xa6, 0xac, 0x9d, 0xd2, 0x70, 0x69, 0x14, 0x39, 0x9b, 0xd1, 0xc3, 0x0a, 0x3a, 0x82, 0x0e, 0xf1, 0x94, 0xd7, 0x42, 0x94, 0xd5, 0x7d, | ||||
| 	/* (2^447)P */ 0x04, 0xc0, 0x6e, 0x12, 0x90, 0x70, 0xf9, 0xdf, 0xf7, 0xc9, 0x86, 0xc0, 0xe6, 0x92, 0x8b, 0x0a, 0xa1, 0xc1, 0x3b, 0xcc, 0x33, 0xb7, 0xf0, 0xeb, 0x51, 0x50, 0x80, 0x20, 0x69, 0x1c, 0x4f, 0x89, 0x05, 0x1e, 0xe4, 0x7a, 0x0a, 0xc2, 0xf0, 0xf5, 0x78, 0x91, 0x76, 0x34, 0x45, 0xdc, 0x24, 0x53, 0x24, 0x98, 0xe2, 0x73, 0x6f, 0xe6, 0x46, 0x67, | ||||
| } | ||||
|  | @ -1,140 +0,0 @@ | |||
| package conv | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // BytesLe2Hex returns an hexadecimal string of a number stored in a
 | ||||
| // little-endian order slice x.
 | ||||
| func BytesLe2Hex(x []byte) string { | ||||
| 	b := &strings.Builder{} | ||||
| 	b.Grow(2*len(x) + 2) | ||||
| 	fmt.Fprint(b, "0x") | ||||
| 	if len(x) == 0 { | ||||
| 		fmt.Fprint(b, "00") | ||||
| 	} | ||||
| 	for i := len(x) - 1; i >= 0; i-- { | ||||
| 		fmt.Fprintf(b, "%02x", x[i]) | ||||
| 	} | ||||
| 	return b.String() | ||||
| } | ||||
| 
 | ||||
| // BytesLe2BigInt converts a little-endian slice x into a big-endian
 | ||||
| // math/big.Int.
 | ||||
| func BytesLe2BigInt(x []byte) *big.Int { | ||||
| 	n := len(x) | ||||
| 	b := new(big.Int) | ||||
| 	if len(x) > 0 { | ||||
| 		y := make([]byte, n) | ||||
| 		for i := 0; i < n; i++ { | ||||
| 			y[n-1-i] = x[i] | ||||
| 		} | ||||
| 		b.SetBytes(y) | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
| 
 | ||||
| // BytesBe2Uint64Le converts a big-endian slice x to a little-endian slice of uint64.
 | ||||
| func BytesBe2Uint64Le(x []byte) []uint64 { | ||||
| 	l := len(x) | ||||
| 	z := make([]uint64, (l+7)/8) | ||||
| 	blocks := l / 8 | ||||
| 	for i := 0; i < blocks; i++ { | ||||
| 		z[i] = binary.BigEndian.Uint64(x[l-8*(i+1):]) | ||||
| 	} | ||||
| 	remBytes := l % 8 | ||||
| 	for i := 0; i < remBytes; i++ { | ||||
| 		z[blocks] |= uint64(x[l-1-8*blocks-i]) << uint(8*i) | ||||
| 	} | ||||
| 	return z | ||||
| } | ||||
| 
 | ||||
| // BigInt2BytesLe stores a positive big.Int number x into a little-endian slice z.
 | ||||
| // The slice is modified if the bitlength of x <= 8*len(z) (padding with zeros).
 | ||||
| // If x does not fit in the slice or is negative, z is not modified.
 | ||||
| func BigInt2BytesLe(z []byte, x *big.Int) { | ||||
| 	xLen := (x.BitLen() + 7) >> 3 | ||||
| 	zLen := len(z) | ||||
| 	if zLen >= xLen && x.Sign() >= 0 { | ||||
| 		y := x.Bytes() | ||||
| 		for i := 0; i < xLen; i++ { | ||||
| 			z[i] = y[xLen-1-i] | ||||
| 		} | ||||
| 		for i := xLen; i < zLen; i++ { | ||||
| 			z[i] = 0 | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Uint64Le2BigInt converts a little-endian slice x into a big number.
 | ||||
| func Uint64Le2BigInt(x []uint64) *big.Int { | ||||
| 	n := len(x) | ||||
| 	b := new(big.Int) | ||||
| 	var bi big.Int | ||||
| 	for i := n - 1; i >= 0; i-- { | ||||
| 		bi.SetUint64(x[i]) | ||||
| 		b.Lsh(b, 64) | ||||
| 		b.Add(b, &bi) | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
| 
 | ||||
| // Uint64Le2BytesLe converts a little-endian slice x to a little-endian slice of bytes.
 | ||||
| func Uint64Le2BytesLe(x []uint64) []byte { | ||||
| 	b := make([]byte, 8*len(x)) | ||||
| 	n := len(x) | ||||
| 	for i := 0; i < n; i++ { | ||||
| 		binary.LittleEndian.PutUint64(b[i*8:], x[i]) | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
| 
 | ||||
| // Uint64Le2BytesBe converts a little-endian slice x to a big-endian slice of bytes.
 | ||||
| func Uint64Le2BytesBe(x []uint64) []byte { | ||||
| 	b := make([]byte, 8*len(x)) | ||||
| 	n := len(x) | ||||
| 	for i := 0; i < n; i++ { | ||||
| 		binary.BigEndian.PutUint64(b[i*8:], x[n-1-i]) | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
| 
 | ||||
| // Uint64Le2Hex returns an hexadecimal string of a number stored in a
 | ||||
| // little-endian order slice x.
 | ||||
| func Uint64Le2Hex(x []uint64) string { | ||||
| 	b := new(strings.Builder) | ||||
| 	b.Grow(16*len(x) + 2) | ||||
| 	fmt.Fprint(b, "0x") | ||||
| 	if len(x) == 0 { | ||||
| 		fmt.Fprint(b, "00") | ||||
| 	} | ||||
| 	for i := len(x) - 1; i >= 0; i-- { | ||||
| 		fmt.Fprintf(b, "%016x", x[i]) | ||||
| 	} | ||||
| 	return b.String() | ||||
| } | ||||
| 
 | ||||
| // BigInt2Uint64Le stores a positive big.Int number x into a little-endian slice z.
 | ||||
| // The slice is modified if the bitlength of x <= 8*len(z) (padding with zeros).
 | ||||
| // If x does not fit in the slice or is negative, z is not modified.
 | ||||
| func BigInt2Uint64Le(z []uint64, x *big.Int) { | ||||
| 	xLen := (x.BitLen() + 63) >> 6 // number of 64-bit words
 | ||||
| 	zLen := len(z) | ||||
| 	if zLen >= xLen && x.Sign() > 0 { | ||||
| 		var y, yi big.Int | ||||
| 		y.Set(x) | ||||
| 		two64 := big.NewInt(1) | ||||
| 		two64.Lsh(two64, 64).Sub(two64, big.NewInt(1)) | ||||
| 		for i := 0; i < xLen; i++ { | ||||
| 			yi.And(&y, two64) | ||||
| 			z[i] = yi.Uint64() | ||||
| 			y.Rsh(&y, 64) | ||||
| 		} | ||||
| 	} | ||||
| 	for i := xLen; i < zLen; i++ { | ||||
| 		z[i] = 0 | ||||
| 	} | ||||
| } | ||||
|  | @ -1,62 +0,0 @@ | |||
| // Copyright 2014 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| // Package sha3 implements the SHA-3 fixed-output-length hash functions and
 | ||||
| // the SHAKE variable-output-length hash functions defined by FIPS-202.
 | ||||
| //
 | ||||
| // Both types of hash function use the "sponge" construction and the Keccak
 | ||||
| // permutation. For a detailed specification see http://keccak.noekeon.org/
 | ||||
| //
 | ||||
| // # Guidance
 | ||||
| //
 | ||||
| // If you aren't sure what function you need, use SHAKE256 with at least 64
 | ||||
| // bytes of output. The SHAKE instances are faster than the SHA3 instances;
 | ||||
| // the latter have to allocate memory to conform to the hash.Hash interface.
 | ||||
| //
 | ||||
| // If you need a secret-key MAC (message authentication code), prepend the
 | ||||
| // secret key to the input, hash with SHAKE256 and read at least 32 bytes of
 | ||||
| // output.
 | ||||
| //
 | ||||
| // # Security strengths
 | ||||
| //
 | ||||
| // The SHA3-x (x equals 224, 256, 384, or 512) functions have a security
 | ||||
| // strength against preimage attacks of x bits. Since they only produce "x"
 | ||||
| // bits of output, their collision-resistance is only "x/2" bits.
 | ||||
| //
 | ||||
| // The SHAKE-256 and -128 functions have a generic security strength of 256 and
 | ||||
| // 128 bits against all attacks, provided that at least 2x bits of their output
 | ||||
| // is used.  Requesting more than 64 or 32 bytes of output, respectively, does
 | ||||
| // not increase the collision-resistance of the SHAKE functions.
 | ||||
| //
 | ||||
| // # The sponge construction
 | ||||
| //
 | ||||
| // A sponge builds a pseudo-random function from a public pseudo-random
 | ||||
| // permutation, by applying the permutation to a state of "rate + capacity"
 | ||||
| // bytes, but hiding "capacity" of the bytes.
 | ||||
| //
 | ||||
| // A sponge starts out with a zero state. To hash an input using a sponge, up
 | ||||
| // to "rate" bytes of the input are XORed into the sponge's state. The sponge
 | ||||
| // is then "full" and the permutation is applied to "empty" it. This process is
 | ||||
| // repeated until all the input has been "absorbed". The input is then padded.
 | ||||
| // The digest is "squeezed" from the sponge in the same way, except that output
 | ||||
| // is copied out instead of input being XORed in.
 | ||||
| //
 | ||||
| // A sponge is parameterized by its generic security strength, which is equal
 | ||||
| // to half its capacity; capacity + rate is equal to the permutation's width.
 | ||||
| // Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means
 | ||||
| // that the security strength of a sponge instance is equal to (1600 - bitrate) / 2.
 | ||||
| //
 | ||||
| // # Recommendations
 | ||||
| //
 | ||||
| // The SHAKE functions are recommended for most new uses. They can produce
 | ||||
| // output of arbitrary length. SHAKE256, with an output length of at least
 | ||||
| // 64 bytes, provides 256-bit security against all attacks.  The Keccak team
 | ||||
| // recommends it for most applications upgrading from SHA2-512. (NIST chose a
 | ||||
| // much stronger, but much slower, sponge instance for SHA3-512.)
 | ||||
| //
 | ||||
| // The SHA-3 functions are "drop-in" replacements for the SHA-2 functions.
 | ||||
| // They produce output of the same length, with the same security strengths
 | ||||
| // against all attacks. This means, in particular, that SHA3-256 only has
 | ||||
| // 128-bit collision resistance, because its output length is 32 bytes.
 | ||||
| package sha3 | ||||
|  | @ -1,69 +0,0 @@ | |||
| // Copyright 2014 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package sha3 | ||||
| 
 | ||||
| // This file provides functions for creating instances of the SHA-3
 | ||||
| // and SHAKE hash functions, as well as utility functions for hashing
 | ||||
| // bytes.
 | ||||
| 
 | ||||
| // New224 creates a new SHA3-224 hash.
 | ||||
| // Its generic security strength is 224 bits against preimage attacks,
 | ||||
| // and 112 bits against collision attacks.
 | ||||
| func New224() State { | ||||
| 	return State{rate: 144, outputLen: 28, dsbyte: 0x06} | ||||
| } | ||||
| 
 | ||||
| // New256 creates a new SHA3-256 hash.
 | ||||
| // Its generic security strength is 256 bits against preimage attacks,
 | ||||
| // and 128 bits against collision attacks.
 | ||||
| func New256() State { | ||||
| 	return State{rate: 136, outputLen: 32, dsbyte: 0x06} | ||||
| } | ||||
| 
 | ||||
| // New384 creates a new SHA3-384 hash.
 | ||||
| // Its generic security strength is 384 bits against preimage attacks,
 | ||||
| // and 192 bits against collision attacks.
 | ||||
| func New384() State { | ||||
| 	return State{rate: 104, outputLen: 48, dsbyte: 0x06} | ||||
| } | ||||
| 
 | ||||
| // New512 creates a new SHA3-512 hash.
 | ||||
| // Its generic security strength is 512 bits against preimage attacks,
 | ||||
| // and 256 bits against collision attacks.
 | ||||
| func New512() State { | ||||
| 	return State{rate: 72, outputLen: 64, dsbyte: 0x06} | ||||
| } | ||||
| 
 | ||||
| // Sum224 returns the SHA3-224 digest of the data.
 | ||||
| func Sum224(data []byte) (digest [28]byte) { | ||||
| 	h := New224() | ||||
| 	_, _ = h.Write(data) | ||||
| 	h.Sum(digest[:0]) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Sum256 returns the SHA3-256 digest of the data.
 | ||||
| func Sum256(data []byte) (digest [32]byte) { | ||||
| 	h := New256() | ||||
| 	_, _ = h.Write(data) | ||||
| 	h.Sum(digest[:0]) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Sum384 returns the SHA3-384 digest of the data.
 | ||||
| func Sum384(data []byte) (digest [48]byte) { | ||||
| 	h := New384() | ||||
| 	_, _ = h.Write(data) | ||||
| 	h.Sum(digest[:0]) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Sum512 returns the SHA3-512 digest of the data.
 | ||||
| func Sum512(data []byte) (digest [64]byte) { | ||||
| 	h := New512() | ||||
| 	_, _ = h.Write(data) | ||||
| 	h.Sum(digest[:0]) | ||||
| 	return | ||||
| } | ||||
|  | @ -1,385 +0,0 @@ | |||
| // Copyright 2014 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| //go:build !amd64 || appengine || gccgo
 | ||||
| // +build !amd64 appengine gccgo
 | ||||
| 
 | ||||
| package sha3 | ||||
| 
 | ||||
| // KeccakF1600 applies the Keccak permutation to a 1600b-wide
 | ||||
| // state represented as a slice of 25 uint64s.
 | ||||
| func KeccakF1600(a *[25]uint64) { | ||||
| 	// Implementation translated from Keccak-inplace.c
 | ||||
| 	// in the keccak reference code.
 | ||||
| 	var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 | ||||
| 
 | ||||
| 	for i := 0; i < 24; i += 4 { | ||||
| 		// Combines the 5 steps in each round into 2 steps.
 | ||||
| 		// Unrolls 4 rounds per loop and spreads some steps across rounds.
 | ||||
| 
 | ||||
| 		// Round 1
 | ||||
| 		bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] | ||||
| 		bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] | ||||
| 		bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] | ||||
| 		bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] | ||||
| 		bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] | ||||
| 		d0 = bc4 ^ (bc1<<1 | bc1>>63) | ||||
| 		d1 = bc0 ^ (bc2<<1 | bc2>>63) | ||||
| 		d2 = bc1 ^ (bc3<<1 | bc3>>63) | ||||
| 		d3 = bc2 ^ (bc4<<1 | bc4>>63) | ||||
| 		d4 = bc3 ^ (bc0<<1 | bc0>>63) | ||||
| 
 | ||||
| 		bc0 = a[0] ^ d0 | ||||
| 		t = a[6] ^ d1 | ||||
| 		bc1 = t<<44 | t>>(64-44) | ||||
| 		t = a[12] ^ d2 | ||||
| 		bc2 = t<<43 | t>>(64-43) | ||||
| 		t = a[18] ^ d3 | ||||
| 		bc3 = t<<21 | t>>(64-21) | ||||
| 		t = a[24] ^ d4 | ||||
| 		bc4 = t<<14 | t>>(64-14) | ||||
| 		a[0] = bc0 ^ (bc2 &^ bc1) ^ RC[i] | ||||
| 		a[6] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[12] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[18] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[24] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[10] ^ d0 | ||||
| 		bc2 = t<<3 | t>>(64-3) | ||||
| 		t = a[16] ^ d1 | ||||
| 		bc3 = t<<45 | t>>(64-45) | ||||
| 		t = a[22] ^ d2 | ||||
| 		bc4 = t<<61 | t>>(64-61) | ||||
| 		t = a[3] ^ d3 | ||||
| 		bc0 = t<<28 | t>>(64-28) | ||||
| 		t = a[9] ^ d4 | ||||
| 		bc1 = t<<20 | t>>(64-20) | ||||
| 		a[10] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[16] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[22] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[3] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[9] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[20] ^ d0 | ||||
| 		bc4 = t<<18 | t>>(64-18) | ||||
| 		t = a[1] ^ d1 | ||||
| 		bc0 = t<<1 | t>>(64-1) | ||||
| 		t = a[7] ^ d2 | ||||
| 		bc1 = t<<6 | t>>(64-6) | ||||
| 		t = a[13] ^ d3 | ||||
| 		bc2 = t<<25 | t>>(64-25) | ||||
| 		t = a[19] ^ d4 | ||||
| 		bc3 = t<<8 | t>>(64-8) | ||||
| 		a[20] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[1] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[7] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[13] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[19] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[5] ^ d0 | ||||
| 		bc1 = t<<36 | t>>(64-36) | ||||
| 		t = a[11] ^ d1 | ||||
| 		bc2 = t<<10 | t>>(64-10) | ||||
| 		t = a[17] ^ d2 | ||||
| 		bc3 = t<<15 | t>>(64-15) | ||||
| 		t = a[23] ^ d3 | ||||
| 		bc4 = t<<56 | t>>(64-56) | ||||
| 		t = a[4] ^ d4 | ||||
| 		bc0 = t<<27 | t>>(64-27) | ||||
| 		a[5] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[11] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[17] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[23] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[4] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[15] ^ d0 | ||||
| 		bc3 = t<<41 | t>>(64-41) | ||||
| 		t = a[21] ^ d1 | ||||
| 		bc4 = t<<2 | t>>(64-2) | ||||
| 		t = a[2] ^ d2 | ||||
| 		bc0 = t<<62 | t>>(64-62) | ||||
| 		t = a[8] ^ d3 | ||||
| 		bc1 = t<<55 | t>>(64-55) | ||||
| 		t = a[14] ^ d4 | ||||
| 		bc2 = t<<39 | t>>(64-39) | ||||
| 		a[15] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[21] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[2] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[8] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[14] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		// Round 2
 | ||||
| 		bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] | ||||
| 		bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] | ||||
| 		bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] | ||||
| 		bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] | ||||
| 		bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] | ||||
| 		d0 = bc4 ^ (bc1<<1 | bc1>>63) | ||||
| 		d1 = bc0 ^ (bc2<<1 | bc2>>63) | ||||
| 		d2 = bc1 ^ (bc3<<1 | bc3>>63) | ||||
| 		d3 = bc2 ^ (bc4<<1 | bc4>>63) | ||||
| 		d4 = bc3 ^ (bc0<<1 | bc0>>63) | ||||
| 
 | ||||
| 		bc0 = a[0] ^ d0 | ||||
| 		t = a[16] ^ d1 | ||||
| 		bc1 = t<<44 | t>>(64-44) | ||||
| 		t = a[7] ^ d2 | ||||
| 		bc2 = t<<43 | t>>(64-43) | ||||
| 		t = a[23] ^ d3 | ||||
| 		bc3 = t<<21 | t>>(64-21) | ||||
| 		t = a[14] ^ d4 | ||||
| 		bc4 = t<<14 | t>>(64-14) | ||||
| 		a[0] = bc0 ^ (bc2 &^ bc1) ^ RC[i+1] | ||||
| 		a[16] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[7] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[23] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[14] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[20] ^ d0 | ||||
| 		bc2 = t<<3 | t>>(64-3) | ||||
| 		t = a[11] ^ d1 | ||||
| 		bc3 = t<<45 | t>>(64-45) | ||||
| 		t = a[2] ^ d2 | ||||
| 		bc4 = t<<61 | t>>(64-61) | ||||
| 		t = a[18] ^ d3 | ||||
| 		bc0 = t<<28 | t>>(64-28) | ||||
| 		t = a[9] ^ d4 | ||||
| 		bc1 = t<<20 | t>>(64-20) | ||||
| 		a[20] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[11] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[2] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[18] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[9] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[15] ^ d0 | ||||
| 		bc4 = t<<18 | t>>(64-18) | ||||
| 		t = a[6] ^ d1 | ||||
| 		bc0 = t<<1 | t>>(64-1) | ||||
| 		t = a[22] ^ d2 | ||||
| 		bc1 = t<<6 | t>>(64-6) | ||||
| 		t = a[13] ^ d3 | ||||
| 		bc2 = t<<25 | t>>(64-25) | ||||
| 		t = a[4] ^ d4 | ||||
| 		bc3 = t<<8 | t>>(64-8) | ||||
| 		a[15] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[6] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[22] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[13] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[4] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[10] ^ d0 | ||||
| 		bc1 = t<<36 | t>>(64-36) | ||||
| 		t = a[1] ^ d1 | ||||
| 		bc2 = t<<10 | t>>(64-10) | ||||
| 		t = a[17] ^ d2 | ||||
| 		bc3 = t<<15 | t>>(64-15) | ||||
| 		t = a[8] ^ d3 | ||||
| 		bc4 = t<<56 | t>>(64-56) | ||||
| 		t = a[24] ^ d4 | ||||
| 		bc0 = t<<27 | t>>(64-27) | ||||
| 		a[10] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[1] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[17] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[8] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[24] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[5] ^ d0 | ||||
| 		bc3 = t<<41 | t>>(64-41) | ||||
| 		t = a[21] ^ d1 | ||||
| 		bc4 = t<<2 | t>>(64-2) | ||||
| 		t = a[12] ^ d2 | ||||
| 		bc0 = t<<62 | t>>(64-62) | ||||
| 		t = a[3] ^ d3 | ||||
| 		bc1 = t<<55 | t>>(64-55) | ||||
| 		t = a[19] ^ d4 | ||||
| 		bc2 = t<<39 | t>>(64-39) | ||||
| 		a[5] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[21] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[12] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[3] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[19] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		// Round 3
 | ||||
| 		bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] | ||||
| 		bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] | ||||
| 		bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] | ||||
| 		bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] | ||||
| 		bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] | ||||
| 		d0 = bc4 ^ (bc1<<1 | bc1>>63) | ||||
| 		d1 = bc0 ^ (bc2<<1 | bc2>>63) | ||||
| 		d2 = bc1 ^ (bc3<<1 | bc3>>63) | ||||
| 		d3 = bc2 ^ (bc4<<1 | bc4>>63) | ||||
| 		d4 = bc3 ^ (bc0<<1 | bc0>>63) | ||||
| 
 | ||||
| 		bc0 = a[0] ^ d0 | ||||
| 		t = a[11] ^ d1 | ||||
| 		bc1 = t<<44 | t>>(64-44) | ||||
| 		t = a[22] ^ d2 | ||||
| 		bc2 = t<<43 | t>>(64-43) | ||||
| 		t = a[8] ^ d3 | ||||
| 		bc3 = t<<21 | t>>(64-21) | ||||
| 		t = a[19] ^ d4 | ||||
| 		bc4 = t<<14 | t>>(64-14) | ||||
| 		a[0] = bc0 ^ (bc2 &^ bc1) ^ RC[i+2] | ||||
| 		a[11] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[22] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[8] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[19] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[15] ^ d0 | ||||
| 		bc2 = t<<3 | t>>(64-3) | ||||
| 		t = a[1] ^ d1 | ||||
| 		bc3 = t<<45 | t>>(64-45) | ||||
| 		t = a[12] ^ d2 | ||||
| 		bc4 = t<<61 | t>>(64-61) | ||||
| 		t = a[23] ^ d3 | ||||
| 		bc0 = t<<28 | t>>(64-28) | ||||
| 		t = a[9] ^ d4 | ||||
| 		bc1 = t<<20 | t>>(64-20) | ||||
| 		a[15] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[1] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[12] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[23] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[9] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[5] ^ d0 | ||||
| 		bc4 = t<<18 | t>>(64-18) | ||||
| 		t = a[16] ^ d1 | ||||
| 		bc0 = t<<1 | t>>(64-1) | ||||
| 		t = a[2] ^ d2 | ||||
| 		bc1 = t<<6 | t>>(64-6) | ||||
| 		t = a[13] ^ d3 | ||||
| 		bc2 = t<<25 | t>>(64-25) | ||||
| 		t = a[24] ^ d4 | ||||
| 		bc3 = t<<8 | t>>(64-8) | ||||
| 		a[5] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[16] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[2] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[13] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[24] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[20] ^ d0 | ||||
| 		bc1 = t<<36 | t>>(64-36) | ||||
| 		t = a[6] ^ d1 | ||||
| 		bc2 = t<<10 | t>>(64-10) | ||||
| 		t = a[17] ^ d2 | ||||
| 		bc3 = t<<15 | t>>(64-15) | ||||
| 		t = a[3] ^ d3 | ||||
| 		bc4 = t<<56 | t>>(64-56) | ||||
| 		t = a[14] ^ d4 | ||||
| 		bc0 = t<<27 | t>>(64-27) | ||||
| 		a[20] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[6] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[17] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[3] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[14] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[10] ^ d0 | ||||
| 		bc3 = t<<41 | t>>(64-41) | ||||
| 		t = a[21] ^ d1 | ||||
| 		bc4 = t<<2 | t>>(64-2) | ||||
| 		t = a[7] ^ d2 | ||||
| 		bc0 = t<<62 | t>>(64-62) | ||||
| 		t = a[18] ^ d3 | ||||
| 		bc1 = t<<55 | t>>(64-55) | ||||
| 		t = a[4] ^ d4 | ||||
| 		bc2 = t<<39 | t>>(64-39) | ||||
| 		a[10] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[21] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[7] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[18] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[4] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		// Round 4
 | ||||
| 		bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] | ||||
| 		bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] | ||||
| 		bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] | ||||
| 		bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] | ||||
| 		bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] | ||||
| 		d0 = bc4 ^ (bc1<<1 | bc1>>63) | ||||
| 		d1 = bc0 ^ (bc2<<1 | bc2>>63) | ||||
| 		d2 = bc1 ^ (bc3<<1 | bc3>>63) | ||||
| 		d3 = bc2 ^ (bc4<<1 | bc4>>63) | ||||
| 		d4 = bc3 ^ (bc0<<1 | bc0>>63) | ||||
| 
 | ||||
| 		bc0 = a[0] ^ d0 | ||||
| 		t = a[1] ^ d1 | ||||
| 		bc1 = t<<44 | t>>(64-44) | ||||
| 		t = a[2] ^ d2 | ||||
| 		bc2 = t<<43 | t>>(64-43) | ||||
| 		t = a[3] ^ d3 | ||||
| 		bc3 = t<<21 | t>>(64-21) | ||||
| 		t = a[4] ^ d4 | ||||
| 		bc4 = t<<14 | t>>(64-14) | ||||
| 		a[0] = bc0 ^ (bc2 &^ bc1) ^ RC[i+3] | ||||
| 		a[1] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[2] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[3] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[4] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[5] ^ d0 | ||||
| 		bc2 = t<<3 | t>>(64-3) | ||||
| 		t = a[6] ^ d1 | ||||
| 		bc3 = t<<45 | t>>(64-45) | ||||
| 		t = a[7] ^ d2 | ||||
| 		bc4 = t<<61 | t>>(64-61) | ||||
| 		t = a[8] ^ d3 | ||||
| 		bc0 = t<<28 | t>>(64-28) | ||||
| 		t = a[9] ^ d4 | ||||
| 		bc1 = t<<20 | t>>(64-20) | ||||
| 		a[5] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[6] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[7] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[8] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[9] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[10] ^ d0 | ||||
| 		bc4 = t<<18 | t>>(64-18) | ||||
| 		t = a[11] ^ d1 | ||||
| 		bc0 = t<<1 | t>>(64-1) | ||||
| 		t = a[12] ^ d2 | ||||
| 		bc1 = t<<6 | t>>(64-6) | ||||
| 		t = a[13] ^ d3 | ||||
| 		bc2 = t<<25 | t>>(64-25) | ||||
| 		t = a[14] ^ d4 | ||||
| 		bc3 = t<<8 | t>>(64-8) | ||||
| 		a[10] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[11] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[12] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[13] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[14] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[15] ^ d0 | ||||
| 		bc1 = t<<36 | t>>(64-36) | ||||
| 		t = a[16] ^ d1 | ||||
| 		bc2 = t<<10 | t>>(64-10) | ||||
| 		t = a[17] ^ d2 | ||||
| 		bc3 = t<<15 | t>>(64-15) | ||||
| 		t = a[18] ^ d3 | ||||
| 		bc4 = t<<56 | t>>(64-56) | ||||
| 		t = a[19] ^ d4 | ||||
| 		bc0 = t<<27 | t>>(64-27) | ||||
| 		a[15] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[16] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[17] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[18] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[19] = bc4 ^ (bc1 &^ bc0) | ||||
| 
 | ||||
| 		t = a[20] ^ d0 | ||||
| 		bc3 = t<<41 | t>>(64-41) | ||||
| 		t = a[21] ^ d1 | ||||
| 		bc4 = t<<2 | t>>(64-2) | ||||
| 		t = a[22] ^ d2 | ||||
| 		bc0 = t<<62 | t>>(64-62) | ||||
| 		t = a[23] ^ d3 | ||||
| 		bc1 = t<<55 | t>>(64-55) | ||||
| 		t = a[24] ^ d4 | ||||
| 		bc2 = t<<39 | t>>(64-39) | ||||
| 		a[20] = bc0 ^ (bc2 &^ bc1) | ||||
| 		a[21] = bc1 ^ (bc3 &^ bc2) | ||||
| 		a[22] = bc2 ^ (bc4 &^ bc3) | ||||
| 		a[23] = bc3 ^ (bc0 &^ bc4) | ||||
| 		a[24] = bc4 ^ (bc1 &^ bc0) | ||||
| 	} | ||||
| } | ||||
|  | @ -1,14 +0,0 @@ | |||
| // Copyright 2015 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| //go:build amd64 && !appengine && !gccgo
 | ||||
| // +build amd64,!appengine,!gccgo
 | ||||
| 
 | ||||
| package sha3 | ||||
| 
 | ||||
| // This function is implemented in keccakf_amd64.s.
 | ||||
| 
 | ||||
| //go:noescape
 | ||||
| 
 | ||||
| func KeccakF1600(state *[25]uint64) | ||||
|  | @ -1,390 +0,0 @@ | |||
| // Copyright 2015 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build amd64,!appengine,!gccgo | ||||
| 
 | ||||
| // This code was translated into a form compatible with 6a from the public | ||||
| // domain sources at https://github.com/gvanas/KeccakCodePackage | ||||
| 
 | ||||
| // Offsets in state | ||||
| #define _ba  (0*8) | ||||
| #define _be  (1*8) | ||||
| #define _bi  (2*8) | ||||
| #define _bo  (3*8) | ||||
| #define _bu  (4*8) | ||||
| #define _ga  (5*8) | ||||
| #define _ge  (6*8) | ||||
| #define _gi  (7*8) | ||||
| #define _go  (8*8) | ||||
| #define _gu  (9*8) | ||||
| #define _ka (10*8) | ||||
| #define _ke (11*8) | ||||
| #define _ki (12*8) | ||||
| #define _ko (13*8) | ||||
| #define _ku (14*8) | ||||
| #define _ma (15*8) | ||||
| #define _me (16*8) | ||||
| #define _mi (17*8) | ||||
| #define _mo (18*8) | ||||
| #define _mu (19*8) | ||||
| #define _sa (20*8) | ||||
| #define _se (21*8) | ||||
| #define _si (22*8) | ||||
| #define _so (23*8) | ||||
| #define _su (24*8) | ||||
| 
 | ||||
| // Temporary registers | ||||
| #define rT1  AX | ||||
| 
 | ||||
| // Round vars | ||||
| #define rpState DI | ||||
| #define rpStack SP | ||||
| 
 | ||||
| #define rDa BX | ||||
| #define rDe CX | ||||
| #define rDi DX | ||||
| #define rDo R8 | ||||
| #define rDu R9 | ||||
| 
 | ||||
| #define rBa R10 | ||||
| #define rBe R11 | ||||
| #define rBi R12 | ||||
| #define rBo R13 | ||||
| #define rBu R14 | ||||
| 
 | ||||
| #define rCa SI | ||||
| #define rCe BP | ||||
| #define rCi rBi | ||||
| #define rCo rBo | ||||
| #define rCu R15 | ||||
| 
 | ||||
| #define MOVQ_RBI_RCE MOVQ rBi, rCe | ||||
| #define XORQ_RT1_RCA XORQ rT1, rCa | ||||
| #define XORQ_RT1_RCE XORQ rT1, rCe | ||||
| #define XORQ_RBA_RCU XORQ rBa, rCu | ||||
| #define XORQ_RBE_RCU XORQ rBe, rCu | ||||
| #define XORQ_RDU_RCU XORQ rDu, rCu | ||||
| #define XORQ_RDA_RCA XORQ rDa, rCa | ||||
| #define XORQ_RDE_RCE XORQ rDe, rCe | ||||
| 
 | ||||
| #define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \ | ||||
| 	/* Prepare round */    \ | ||||
| 	MOVQ rCe, rDa;         \
 | ||||
| 	ROLQ $1, rDa;          \
 | ||||
| 	                       \ | ||||
| 	MOVQ _bi(iState), rCi; \
 | ||||
| 	XORQ _gi(iState), rDi; \
 | ||||
| 	XORQ rCu, rDa;         \
 | ||||
| 	XORQ _ki(iState), rCi; \
 | ||||
| 	XORQ _mi(iState), rDi; \
 | ||||
| 	XORQ rDi, rCi;         \
 | ||||
| 	                       \ | ||||
| 	MOVQ rCi, rDe;         \
 | ||||
| 	ROLQ $1, rDe;          \
 | ||||
| 	                       \ | ||||
| 	MOVQ _bo(iState), rCo; \
 | ||||
| 	XORQ _go(iState), rDo; \
 | ||||
| 	XORQ rCa, rDe;         \
 | ||||
| 	XORQ _ko(iState), rCo; \
 | ||||
| 	XORQ _mo(iState), rDo; \
 | ||||
| 	XORQ rDo, rCo;         \
 | ||||
| 	                       \ | ||||
| 	MOVQ rCo, rDi;         \
 | ||||
| 	ROLQ $1, rDi;          \
 | ||||
| 	                       \ | ||||
| 	MOVQ rCu, rDo;         \
 | ||||
| 	XORQ rCe, rDi;         \
 | ||||
| 	ROLQ $1, rDo;          \
 | ||||
| 	                       \ | ||||
| 	MOVQ rCa, rDu;         \
 | ||||
| 	XORQ rCi, rDo;         \
 | ||||
| 	ROLQ $1, rDu;          \
 | ||||
| 	                       \ | ||||
| 	/* Result b */         \ | ||||
| 	MOVQ _ba(iState), rBa; \
 | ||||
| 	MOVQ _ge(iState), rBe; \
 | ||||
| 	XORQ rCo, rDu;         \
 | ||||
| 	MOVQ _ki(iState), rBi; \
 | ||||
| 	MOVQ _mo(iState), rBo; \
 | ||||
| 	MOVQ _su(iState), rBu; \
 | ||||
| 	XORQ rDe, rBe;         \
 | ||||
| 	ROLQ $44, rBe;         \
 | ||||
| 	XORQ rDi, rBi;         \
 | ||||
| 	XORQ rDa, rBa;         \
 | ||||
| 	ROLQ $43, rBi;         \
 | ||||
| 	                       \ | ||||
| 	MOVQ rBe, rCa;         \
 | ||||
| 	MOVQ rc, rT1;          \
 | ||||
| 	ORQ  rBi, rCa;         \
 | ||||
| 	XORQ rBa, rT1;         \
 | ||||
| 	XORQ rT1, rCa;         \
 | ||||
| 	MOVQ rCa, _ba(oState); \
 | ||||
| 	                       \ | ||||
| 	XORQ rDu, rBu;         \
 | ||||
| 	ROLQ $14, rBu;         \
 | ||||
| 	MOVQ rBa, rCu;         \
 | ||||
| 	ANDQ rBe, rCu;         \
 | ||||
| 	XORQ rBu, rCu;         \
 | ||||
| 	MOVQ rCu, _bu(oState); \
 | ||||
| 	                       \ | ||||
| 	XORQ rDo, rBo;         \
 | ||||
| 	ROLQ $21, rBo;         \
 | ||||
| 	MOVQ rBo, rT1;         \
 | ||||
| 	ANDQ rBu, rT1;         \
 | ||||
| 	XORQ rBi, rT1;         \
 | ||||
| 	MOVQ rT1, _bi(oState); \
 | ||||
| 	                       \ | ||||
| 	NOTQ rBi;              \
 | ||||
| 	ORQ  rBa, rBu;         \
 | ||||
| 	ORQ  rBo, rBi;         \
 | ||||
| 	XORQ rBo, rBu;         \
 | ||||
| 	XORQ rBe, rBi;         \
 | ||||
| 	MOVQ rBu, _bo(oState); \
 | ||||
| 	MOVQ rBi, _be(oState); \
 | ||||
| 	B_RBI_RCE;             \
 | ||||
| 	                       \ | ||||
| 	/* Result g */         \ | ||||
| 	MOVQ _gu(iState), rBe; \
 | ||||
| 	XORQ rDu, rBe;         \
 | ||||
| 	MOVQ _ka(iState), rBi; \
 | ||||
| 	ROLQ $20, rBe;         \
 | ||||
| 	XORQ rDa, rBi;         \
 | ||||
| 	ROLQ $3, rBi;          \
 | ||||
| 	MOVQ _bo(iState), rBa; \
 | ||||
| 	MOVQ rBe, rT1;         \
 | ||||
| 	ORQ  rBi, rT1;         \
 | ||||
| 	XORQ rDo, rBa;         \
 | ||||
| 	MOVQ _me(iState), rBo; \
 | ||||
| 	MOVQ _si(iState), rBu; \
 | ||||
| 	ROLQ $28, rBa;         \
 | ||||
| 	XORQ rBa, rT1;         \
 | ||||
| 	MOVQ rT1, _ga(oState); \
 | ||||
| 	G_RT1_RCA;             \
 | ||||
| 	                       \ | ||||
| 	XORQ rDe, rBo;         \
 | ||||
| 	ROLQ $45, rBo;         \
 | ||||
| 	MOVQ rBi, rT1;         \
 | ||||
| 	ANDQ rBo, rT1;         \
 | ||||
| 	XORQ rBe, rT1;         \
 | ||||
| 	MOVQ rT1, _ge(oState); \
 | ||||
| 	G_RT1_RCE;             \
 | ||||
| 	                       \ | ||||
| 	XORQ rDi, rBu;         \
 | ||||
| 	ROLQ $61, rBu;         \
 | ||||
| 	MOVQ rBu, rT1;         \
 | ||||
| 	ORQ  rBa, rT1;         \
 | ||||
| 	XORQ rBo, rT1;         \
 | ||||
| 	MOVQ rT1, _go(oState); \
 | ||||
| 	                       \ | ||||
| 	ANDQ rBe, rBa;         \
 | ||||
| 	XORQ rBu, rBa;         \
 | ||||
| 	MOVQ rBa, _gu(oState); \
 | ||||
| 	NOTQ rBu;              \
 | ||||
| 	G_RBA_RCU;             \
 | ||||
| 	                       \ | ||||
| 	ORQ  rBu, rBo;         \
 | ||||
| 	XORQ rBi, rBo;         \
 | ||||
| 	MOVQ rBo, _gi(oState); \
 | ||||
| 	                       \ | ||||
| 	/* Result k */         \ | ||||
| 	MOVQ _be(iState), rBa; \
 | ||||
| 	MOVQ _gi(iState), rBe; \
 | ||||
| 	MOVQ _ko(iState), rBi; \
 | ||||
| 	MOVQ _mu(iState), rBo; \
 | ||||
| 	MOVQ _sa(iState), rBu; \
 | ||||
| 	XORQ rDi, rBe;         \
 | ||||
| 	ROLQ $6, rBe;          \
 | ||||
| 	XORQ rDo, rBi;         \
 | ||||
| 	ROLQ $25, rBi;         \
 | ||||
| 	MOVQ rBe, rT1;         \
 | ||||
| 	ORQ  rBi, rT1;         \
 | ||||
| 	XORQ rDe, rBa;         \
 | ||||
| 	ROLQ $1, rBa;          \
 | ||||
| 	XORQ rBa, rT1;         \
 | ||||
| 	MOVQ rT1, _ka(oState); \
 | ||||
| 	K_RT1_RCA;             \
 | ||||
| 	                       \ | ||||
| 	XORQ rDu, rBo;         \
 | ||||
| 	ROLQ $8, rBo;          \
 | ||||
| 	MOVQ rBi, rT1;         \
 | ||||
| 	ANDQ rBo, rT1;         \
 | ||||
| 	XORQ rBe, rT1;         \
 | ||||
| 	MOVQ rT1, _ke(oState); \
 | ||||
| 	K_RT1_RCE;             \
 | ||||
| 	                       \ | ||||
| 	XORQ rDa, rBu;         \
 | ||||
| 	ROLQ $18, rBu;         \
 | ||||
| 	NOTQ rBo;              \
 | ||||
| 	MOVQ rBo, rT1;         \
 | ||||
| 	ANDQ rBu, rT1;         \
 | ||||
| 	XORQ rBi, rT1;         \
 | ||||
| 	MOVQ rT1, _ki(oState); \
 | ||||
| 	                       \ | ||||
| 	MOVQ rBu, rT1;         \
 | ||||
| 	ORQ  rBa, rT1;         \
 | ||||
| 	XORQ rBo, rT1;         \
 | ||||
| 	MOVQ rT1, _ko(oState); \
 | ||||
| 	                       \ | ||||
| 	ANDQ rBe, rBa;         \
 | ||||
| 	XORQ rBu, rBa;         \
 | ||||
| 	MOVQ rBa, _ku(oState); \
 | ||||
| 	K_RBA_RCU;             \
 | ||||
| 	                       \ | ||||
| 	/* Result m */         \ | ||||
| 	MOVQ _ga(iState), rBe; \
 | ||||
| 	XORQ rDa, rBe;         \
 | ||||
| 	MOVQ _ke(iState), rBi; \
 | ||||
| 	ROLQ $36, rBe;         \
 | ||||
| 	XORQ rDe, rBi;         \
 | ||||
| 	MOVQ _bu(iState), rBa; \
 | ||||
| 	ROLQ $10, rBi;         \
 | ||||
| 	MOVQ rBe, rT1;         \
 | ||||
| 	MOVQ _mi(iState), rBo; \
 | ||||
| 	ANDQ rBi, rT1;         \
 | ||||
| 	XORQ rDu, rBa;         \
 | ||||
| 	MOVQ _so(iState), rBu; \
 | ||||
| 	ROLQ $27, rBa;         \
 | ||||
| 	XORQ rBa, rT1;         \
 | ||||
| 	MOVQ rT1, _ma(oState); \
 | ||||
| 	M_RT1_RCA;             \
 | ||||
| 	                       \ | ||||
| 	XORQ rDi, rBo;         \
 | ||||
| 	ROLQ $15, rBo;         \
 | ||||
| 	MOVQ rBi, rT1;         \
 | ||||
| 	ORQ  rBo, rT1;         \
 | ||||
| 	XORQ rBe, rT1;         \
 | ||||
| 	MOVQ rT1, _me(oState); \
 | ||||
| 	M_RT1_RCE;             \
 | ||||
| 	                       \ | ||||
| 	XORQ rDo, rBu;         \
 | ||||
| 	ROLQ $56, rBu;         \
 | ||||
| 	NOTQ rBo;              \
 | ||||
| 	MOVQ rBo, rT1;         \
 | ||||
| 	ORQ  rBu, rT1;         \
 | ||||
| 	XORQ rBi, rT1;         \
 | ||||
| 	MOVQ rT1, _mi(oState); \
 | ||||
| 	                       \ | ||||
| 	ORQ  rBa, rBe;         \
 | ||||
| 	XORQ rBu, rBe;         \
 | ||||
| 	MOVQ rBe, _mu(oState); \
 | ||||
| 	                       \ | ||||
| 	ANDQ rBa, rBu;         \
 | ||||
| 	XORQ rBo, rBu;         \
 | ||||
| 	MOVQ rBu, _mo(oState); \
 | ||||
| 	M_RBE_RCU;             \
 | ||||
| 	                       \ | ||||
| 	/* Result s */         \ | ||||
| 	MOVQ _bi(iState), rBa; \
 | ||||
| 	MOVQ _go(iState), rBe; \
 | ||||
| 	MOVQ _ku(iState), rBi; \
 | ||||
| 	XORQ rDi, rBa;         \
 | ||||
| 	MOVQ _ma(iState), rBo; \
 | ||||
| 	ROLQ $62, rBa;         \
 | ||||
| 	XORQ rDo, rBe;         \
 | ||||
| 	MOVQ _se(iState), rBu; \
 | ||||
| 	ROLQ $55, rBe;         \
 | ||||
| 	                       \ | ||||
| 	XORQ rDu, rBi;         \
 | ||||
| 	MOVQ rBa, rDu;         \
 | ||||
| 	XORQ rDe, rBu;         \
 | ||||
| 	ROLQ $2, rBu;          \
 | ||||
| 	ANDQ rBe, rDu;         \
 | ||||
| 	XORQ rBu, rDu;         \
 | ||||
| 	MOVQ rDu, _su(oState); \
 | ||||
| 	                       \ | ||||
| 	ROLQ $39, rBi;         \
 | ||||
| 	S_RDU_RCU;             \
 | ||||
| 	NOTQ rBe;              \
 | ||||
| 	XORQ rDa, rBo;         \
 | ||||
| 	MOVQ rBe, rDa;         \
 | ||||
| 	ANDQ rBi, rDa;         \
 | ||||
| 	XORQ rBa, rDa;         \
 | ||||
| 	MOVQ rDa, _sa(oState); \
 | ||||
| 	S_RDA_RCA;             \
 | ||||
| 	                       \ | ||||
| 	ROLQ $41, rBo;         \
 | ||||
| 	MOVQ rBi, rDe;         \
 | ||||
| 	ORQ  rBo, rDe;         \
 | ||||
| 	XORQ rBe, rDe;         \
 | ||||
| 	MOVQ rDe, _se(oState); \
 | ||||
| 	S_RDE_RCE;             \
 | ||||
| 	                       \ | ||||
| 	MOVQ rBo, rDi;         \
 | ||||
| 	MOVQ rBu, rDo;         \
 | ||||
| 	ANDQ rBu, rDi;         \
 | ||||
| 	ORQ  rBa, rDo;         \
 | ||||
| 	XORQ rBi, rDi;         \
 | ||||
| 	XORQ rBo, rDo;         \
 | ||||
| 	MOVQ rDi, _si(oState); \
 | ||||
| 	MOVQ rDo, _so(oState)  \ | ||||
| 
 | ||||
| // func KeccakF1600(state *[25]uint64) | ||||
| TEXT ·KeccakF1600(SB), 0, $200-8 | ||||
| 	MOVQ state+0(FP), rpState | ||||
| 
 | ||||
| 	// Convert the user state into an internal state | ||||
| 	NOTQ _be(rpState) | ||||
| 	NOTQ _bi(rpState) | ||||
| 	NOTQ _go(rpState) | ||||
| 	NOTQ _ki(rpState) | ||||
| 	NOTQ _mi(rpState) | ||||
| 	NOTQ _sa(rpState) | ||||
| 
 | ||||
| 	// Execute the KeccakF permutation | ||||
| 	MOVQ _ba(rpState), rCa | ||||
| 	MOVQ _be(rpState), rCe | ||||
| 	MOVQ _bu(rpState), rCu | ||||
| 
 | ||||
| 	XORQ _ga(rpState), rCa | ||||
| 	XORQ _ge(rpState), rCe | ||||
| 	XORQ _gu(rpState), rCu | ||||
| 
 | ||||
| 	XORQ _ka(rpState), rCa | ||||
| 	XORQ _ke(rpState), rCe | ||||
| 	XORQ _ku(rpState), rCu | ||||
| 
 | ||||
| 	XORQ _ma(rpState), rCa | ||||
| 	XORQ _me(rpState), rCe | ||||
| 	XORQ _mu(rpState), rCu | ||||
| 
 | ||||
| 	XORQ _sa(rpState), rCa | ||||
| 	XORQ _se(rpState), rCe | ||||
| 	MOVQ _si(rpState), rDi | ||||
| 	MOVQ _so(rpState), rDo | ||||
| 	XORQ _su(rpState), rCu | ||||
| 
 | ||||
| 	mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) | ||||
| 	mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP) | ||||
| 
 | ||||
| 	// Revert the internal state to the user state | ||||
| 	NOTQ _be(rpState) | ||||
| 	NOTQ _bi(rpState) | ||||
| 	NOTQ _go(rpState) | ||||
| 	NOTQ _ki(rpState) | ||||
| 	NOTQ _mi(rpState) | ||||
| 	NOTQ _sa(rpState) | ||||
| 
 | ||||
| 	RET | ||||
|  | @ -1,29 +0,0 @@ | |||
| package sha3 | ||||
| 
 | ||||
| // RC stores the round constants for use in the ι step.
 | ||||
| var RC = [24]uint64{ | ||||
| 	0x0000000000000001, | ||||
| 	0x0000000000008082, | ||||
| 	0x800000000000808A, | ||||
| 	0x8000000080008000, | ||||
| 	0x000000000000808B, | ||||
| 	0x0000000080000001, | ||||
| 	0x8000000080008081, | ||||
| 	0x8000000000008009, | ||||
| 	0x000000000000008A, | ||||
| 	0x0000000000000088, | ||||
| 	0x0000000080008009, | ||||
| 	0x000000008000000A, | ||||
| 	0x000000008000808B, | ||||
| 	0x800000000000008B, | ||||
| 	0x8000000000008089, | ||||
| 	0x8000000000008003, | ||||
| 	0x8000000000008002, | ||||
| 	0x8000000000000080, | ||||
| 	0x000000000000800A, | ||||
| 	0x800000008000000A, | ||||
| 	0x8000000080008081, | ||||
| 	0x8000000000008080, | ||||
| 	0x0000000080000001, | ||||
| 	0x8000000080008008, | ||||
| } | ||||
|  | @ -1,195 +0,0 @@ | |||
| // Copyright 2014 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package sha3 | ||||
| 
 | ||||
| // spongeDirection indicates the direction bytes are flowing through the sponge.
 | ||||
| type spongeDirection int | ||||
| 
 | ||||
| const ( | ||||
| 	// spongeAbsorbing indicates that the sponge is absorbing input.
 | ||||
| 	spongeAbsorbing spongeDirection = iota | ||||
| 	// spongeSqueezing indicates that the sponge is being squeezed.
 | ||||
| 	spongeSqueezing | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// maxRate is the maximum size of the internal buffer. SHAKE-256
 | ||||
| 	// currently needs the largest buffer.
 | ||||
| 	maxRate = 168 | ||||
| ) | ||||
| 
 | ||||
| func (d *State) buf() []byte { | ||||
| 	return d.storage.asBytes()[d.bufo:d.bufe] | ||||
| } | ||||
| 
 | ||||
| type State struct { | ||||
| 	// Generic sponge components.
 | ||||
| 	a    [25]uint64 // main state of the hash
 | ||||
| 	rate int        // the number of bytes of state to use
 | ||||
| 
 | ||||
| 	bufo int // offset of buffer in storage
 | ||||
| 	bufe int // end of buffer in storage
 | ||||
| 
 | ||||
| 	// dsbyte contains the "domain separation" bits and the first bit of
 | ||||
| 	// the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the
 | ||||
| 	// SHA-3 and SHAKE functions by appending bitstrings to the message.
 | ||||
| 	// Using a little-endian bit-ordering convention, these are "01" for SHA-3
 | ||||
| 	// and "1111" for SHAKE, or 00000010b and 00001111b, respectively. Then the
 | ||||
| 	// padding rule from section 5.1 is applied to pad the message to a multiple
 | ||||
| 	// of the rate, which involves adding a "1" bit, zero or more "0" bits, and
 | ||||
| 	// a final "1" bit. We merge the first "1" bit from the padding into dsbyte,
 | ||||
| 	// giving 00000110b (0x06) and 00011111b (0x1f).
 | ||||
| 	// [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf
 | ||||
| 	//     "Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and
 | ||||
| 	//      Extendable-Output Functions (May 2014)"
 | ||||
| 	dsbyte byte | ||||
| 
 | ||||
| 	storage storageBuf | ||||
| 
 | ||||
| 	// Specific to SHA-3 and SHAKE.
 | ||||
| 	outputLen int             // the default output size in bytes
 | ||||
| 	state     spongeDirection // whether the sponge is absorbing or squeezing
 | ||||
| } | ||||
| 
 | ||||
| // BlockSize returns the rate of sponge underlying this hash function.
 | ||||
| func (d *State) BlockSize() int { return d.rate } | ||||
| 
 | ||||
| // Size returns the output size of the hash function in bytes.
 | ||||
| func (d *State) Size() int { return d.outputLen } | ||||
| 
 | ||||
| // Reset clears the internal state by zeroing the sponge state and
 | ||||
| // the byte buffer, and setting Sponge.state to absorbing.
 | ||||
| func (d *State) Reset() { | ||||
| 	// Zero the permutation's state.
 | ||||
| 	for i := range d.a { | ||||
| 		d.a[i] = 0 | ||||
| 	} | ||||
| 	d.state = spongeAbsorbing | ||||
| 	d.bufo = 0 | ||||
| 	d.bufe = 0 | ||||
| } | ||||
| 
 | ||||
| func (d *State) clone() *State { | ||||
| 	ret := *d | ||||
| 	return &ret | ||||
| } | ||||
| 
 | ||||
| // permute applies the KeccakF-1600 permutation. It handles
 | ||||
| // any input-output buffering.
 | ||||
| func (d *State) permute() { | ||||
| 	switch d.state { | ||||
| 	case spongeAbsorbing: | ||||
| 		// If we're absorbing, we need to xor the input into the state
 | ||||
| 		// before applying the permutation.
 | ||||
| 		xorIn(d, d.buf()) | ||||
| 		d.bufe = 0 | ||||
| 		d.bufo = 0 | ||||
| 		KeccakF1600(&d.a) | ||||
| 	case spongeSqueezing: | ||||
| 		// If we're squeezing, we need to apply the permutation before
 | ||||
| 		// copying more output.
 | ||||
| 		KeccakF1600(&d.a) | ||||
| 		d.bufe = d.rate | ||||
| 		d.bufo = 0 | ||||
| 		copyOut(d, d.buf()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // pads appends the domain separation bits in dsbyte, applies
 | ||||
| // the multi-bitrate 10..1 padding rule, and permutes the state.
 | ||||
| func (d *State) padAndPermute(dsbyte byte) { | ||||
| 	// Pad with this instance's domain-separator bits. We know that there's
 | ||||
| 	// at least one byte of space in d.buf() because, if it were full,
 | ||||
| 	// permute would have been called to empty it. dsbyte also contains the
 | ||||
| 	// first one bit for the padding. See the comment in the state struct.
 | ||||
| 	zerosStart := d.bufe + 1 | ||||
| 	d.bufe = d.rate | ||||
| 	buf := d.buf() | ||||
| 	buf[zerosStart-1] = dsbyte | ||||
| 	for i := zerosStart; i < d.rate; i++ { | ||||
| 		buf[i] = 0 | ||||
| 	} | ||||
| 	// This adds the final one bit for the padding. Because of the way that
 | ||||
| 	// bits are numbered from the LSB upwards, the final bit is the MSB of
 | ||||
| 	// the last byte.
 | ||||
| 	buf[d.rate-1] ^= 0x80 | ||||
| 	// Apply the permutation
 | ||||
| 	d.permute() | ||||
| 	d.state = spongeSqueezing | ||||
| 	d.bufe = d.rate | ||||
| 	copyOut(d, buf) | ||||
| } | ||||
| 
 | ||||
| // Write absorbs more data into the hash's state. It produces an error
 | ||||
| // if more data is written to the ShakeHash after writing
 | ||||
| func (d *State) Write(p []byte) (written int, err error) { | ||||
| 	if d.state != spongeAbsorbing { | ||||
| 		panic("sha3: write to sponge after read") | ||||
| 	} | ||||
| 	written = len(p) | ||||
| 
 | ||||
| 	for len(p) > 0 { | ||||
| 		bufl := d.bufe - d.bufo | ||||
| 		if bufl == 0 && len(p) >= d.rate { | ||||
| 			// The fast path; absorb a full "rate" bytes of input and apply the permutation.
 | ||||
| 			xorIn(d, p[:d.rate]) | ||||
| 			p = p[d.rate:] | ||||
| 			KeccakF1600(&d.a) | ||||
| 		} else { | ||||
| 			// The slow path; buffer the input until we can fill the sponge, and then xor it in.
 | ||||
| 			todo := d.rate - bufl | ||||
| 			if todo > len(p) { | ||||
| 				todo = len(p) | ||||
| 			} | ||||
| 			d.bufe += todo | ||||
| 			buf := d.buf() | ||||
| 			copy(buf[bufl:], p[:todo]) | ||||
| 			p = p[todo:] | ||||
| 
 | ||||
| 			// If the sponge is full, apply the permutation.
 | ||||
| 			if d.bufe == d.rate { | ||||
| 				d.permute() | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return written, nil | ||||
| } | ||||
| 
 | ||||
| // Read squeezes an arbitrary number of bytes from the sponge.
 | ||||
| func (d *State) Read(out []byte) (n int, err error) { | ||||
| 	// If we're still absorbing, pad and apply the permutation.
 | ||||
| 	if d.state == spongeAbsorbing { | ||||
| 		d.padAndPermute(d.dsbyte) | ||||
| 	} | ||||
| 
 | ||||
| 	n = len(out) | ||||
| 
 | ||||
| 	// Now, do the squeezing.
 | ||||
| 	for len(out) > 0 { | ||||
| 		buf := d.buf() | ||||
| 		n := copy(out, buf) | ||||
| 		d.bufo += n | ||||
| 		out = out[n:] | ||||
| 
 | ||||
| 		// Apply the permutation if we've squeezed the sponge dry.
 | ||||
| 		if d.bufo == d.bufe { | ||||
| 			d.permute() | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Sum applies padding to the hash state and then squeezes out the desired
 | ||||
| // number of output bytes.
 | ||||
| func (d *State) Sum(in []byte) []byte { | ||||
| 	// Make a copy of the original hash so that caller can keep writing
 | ||||
| 	// and summing.
 | ||||
| 	dup := d.clone() | ||||
| 	hash := make([]byte, dup.outputLen) | ||||
| 	_, _ = dup.Read(hash) | ||||
| 	return append(in, hash...) | ||||
| } | ||||
|  | @ -1,33 +0,0 @@ | |||
| // Copyright 2017 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| // +build !gccgo,!appengine | ||||
| 
 | ||||
| #include "textflag.h" | ||||
| 
 | ||||
| // func kimd(function code, chain *[200]byte, src []byte) | ||||
| TEXT ·kimd(SB), NOFRAME|NOSPLIT, $0-40 | ||||
| 	MOVD function+0(FP), R0 | ||||
| 	MOVD chain+8(FP), R1 | ||||
| 	LMG  src+16(FP), R2, R3 // R2=base, R3=len | ||||
| 
 | ||||
| continue: | ||||
| 	WORD $0xB93E0002 // KIMD --, R2 | ||||
| 	BVS  continue    // continue if interrupted | ||||
| 	MOVD $0, R0      // reset R0 for pre-go1.8 compilers | ||||
| 	RET | ||||
| 
 | ||||
| // func klmd(function code, chain *[200]byte, dst, src []byte) | ||||
| TEXT ·klmd(SB), NOFRAME|NOSPLIT, $0-64 | ||||
| 	// TODO: SHAKE support | ||||
| 	MOVD function+0(FP), R0 | ||||
| 	MOVD chain+8(FP), R1 | ||||
| 	LMG  dst+16(FP), R2, R3 // R2=base, R3=len | ||||
| 	LMG  src+40(FP), R4, R5 // R4=base, R5=len | ||||
| 
 | ||||
| continue: | ||||
| 	WORD $0xB93F0024 // KLMD R2, R4 | ||||
| 	BVS  continue    // continue if interrupted | ||||
| 	MOVD $0, R0      // reset R0 for pre-go1.8 compilers | ||||
| 	RET | ||||
|  | @ -1,79 +0,0 @@ | |||
| // Copyright 2014 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| package sha3 | ||||
| 
 | ||||
| // This file defines the ShakeHash interface, and provides
 | ||||
| // functions for creating SHAKE and cSHAKE instances, as well as utility
 | ||||
| // functions for hashing bytes to arbitrary-length output.
 | ||||
| //
 | ||||
| //
 | ||||
| // SHAKE implementation is based on FIPS PUB 202 [1]
 | ||||
| // cSHAKE implementations is based on NIST SP 800-185 [2]
 | ||||
| //
 | ||||
| // [1] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf
 | ||||
| // [2] https://doi.org/10.6028/NIST.SP.800-185
 | ||||
| 
 | ||||
| import ( | ||||
| 	"io" | ||||
| ) | ||||
| 
 | ||||
| // ShakeHash defines the interface to hash functions that
 | ||||
| // support arbitrary-length output.
 | ||||
| type ShakeHash interface { | ||||
| 	// Write absorbs more data into the hash's state. It panics if input is
 | ||||
| 	// written to it after output has been read from it.
 | ||||
| 	io.Writer | ||||
| 
 | ||||
| 	// Read reads more output from the hash; reading affects the hash's
 | ||||
| 	// state. (ShakeHash.Read is thus very different from Hash.Sum)
 | ||||
| 	// It never returns an error.
 | ||||
| 	io.Reader | ||||
| 
 | ||||
| 	// Clone returns a copy of the ShakeHash in its current state.
 | ||||
| 	Clone() ShakeHash | ||||
| 
 | ||||
| 	// Reset resets the ShakeHash to its initial state.
 | ||||
| 	Reset() | ||||
| } | ||||
| 
 | ||||
| // Consts for configuring initial SHA-3 state
 | ||||
| const ( | ||||
| 	dsbyteShake = 0x1f | ||||
| 	rate128     = 168 | ||||
| 	rate256     = 136 | ||||
| ) | ||||
| 
 | ||||
| // Clone returns copy of SHAKE context within its current state.
 | ||||
| func (d *State) Clone() ShakeHash { | ||||
| 	return d.clone() | ||||
| } | ||||
| 
 | ||||
| // NewShake128 creates a new SHAKE128 variable-output-length ShakeHash.
 | ||||
| // Its generic security strength is 128 bits against all attacks if at
 | ||||
| // least 32 bytes of its output are used.
 | ||||
| func NewShake128() State { | ||||
| 	return State{rate: rate128, dsbyte: dsbyteShake} | ||||
| } | ||||
| 
 | ||||
| // NewShake256 creates a new SHAKE256 variable-output-length ShakeHash.
 | ||||
| // Its generic security strength is 256 bits against all attacks if
 | ||||
| // at least 64 bytes of its output are used.
 | ||||
| func NewShake256() State { | ||||
| 	return State{rate: rate256, dsbyte: dsbyteShake} | ||||
| } | ||||
| 
 | ||||
| // ShakeSum128 writes an arbitrary-length digest of data into hash.
 | ||||
| func ShakeSum128(hash, data []byte) { | ||||
| 	h := NewShake128() | ||||
| 	_, _ = h.Write(data) | ||||
| 	_, _ = h.Read(hash) | ||||
| } | ||||
| 
 | ||||
| // ShakeSum256 writes an arbitrary-length digest of data into hash.
 | ||||
| func ShakeSum256(hash, data []byte) { | ||||
| 	h := NewShake256() | ||||
| 	_, _ = h.Write(data) | ||||
| 	_, _ = h.Read(hash) | ||||
| } | ||||
|  | @ -1,15 +0,0 @@ | |||
| // Copyright 2015 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| //go:build (!amd64 && !386 && !ppc64le) || appengine
 | ||||
| // +build !amd64,!386,!ppc64le appengine
 | ||||
| 
 | ||||
| package sha3 | ||||
| 
 | ||||
| // A storageBuf is an aligned array of maxRate bytes.
 | ||||
| type storageBuf [maxRate]byte | ||||
| 
 | ||||
| func (b *storageBuf) asBytes() *[maxRate]byte { | ||||
| 	return (*[maxRate]byte)(b) | ||||
| } | ||||
|  | @ -1,33 +0,0 @@ | |||
| // Copyright 2015 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| //go:build (!amd64 || appengine) && (!386 || appengine) && (!ppc64le || appengine)
 | ||||
| // +build !amd64 appengine
 | ||||
| // +build !386 appengine
 | ||||
| // +build !ppc64le appengine
 | ||||
| 
 | ||||
| package sha3 | ||||
| 
 | ||||
| import "encoding/binary" | ||||
| 
 | ||||
| // xorIn xors the bytes in buf into the state; it
 | ||||
| // makes no non-portable assumptions about memory layout
 | ||||
| // or alignment.
 | ||||
| func xorIn(d *State, buf []byte) { | ||||
| 	n := len(buf) / 8 | ||||
| 
 | ||||
| 	for i := 0; i < n; i++ { | ||||
| 		a := binary.LittleEndian.Uint64(buf) | ||||
| 		d.a[i] ^= a | ||||
| 		buf = buf[8:] | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // copyOut copies ulint64s to a byte buffer.
 | ||||
| func copyOut(d *State, b []byte) { | ||||
| 	for i := 0; len(b) >= 8; i++ { | ||||
| 		binary.LittleEndian.PutUint64(b, d.a[i]) | ||||
| 		b = b[8:] | ||||
| 	} | ||||
| } | ||||
|  | @ -1,61 +0,0 @@ | |||
| // Copyright 2015 The Go Authors. All rights reserved.
 | ||||
| // Use of this source code is governed by a BSD-style
 | ||||
| // license that can be found in the LICENSE file.
 | ||||
| 
 | ||||
| //go:build (amd64 || 386 || ppc64le) && !appengine
 | ||||
| // +build amd64 386 ppc64le
 | ||||
| // +build !appengine
 | ||||
| 
 | ||||
| package sha3 | ||||
| 
 | ||||
| import "unsafe" | ||||
| 
 | ||||
| // A storageBuf is an aligned array of maxRate bytes.
 | ||||
| type storageBuf [maxRate / 8]uint64 | ||||
| 
 | ||||
| func (b *storageBuf) asBytes() *[maxRate]byte { | ||||
| 	return (*[maxRate]byte)(unsafe.Pointer(b)) | ||||
| } | ||||
| 
 | ||||
| // xorInuses unaligned reads and writes to update d.a to contain d.a
 | ||||
| // XOR buf.
 | ||||
| func xorIn(d *State, buf []byte) { | ||||
| 	n := len(buf) | ||||
| 	bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))[: n/8 : n/8] | ||||
| 	if n >= 72 { | ||||
| 		d.a[0] ^= bw[0] | ||||
| 		d.a[1] ^= bw[1] | ||||
| 		d.a[2] ^= bw[2] | ||||
| 		d.a[3] ^= bw[3] | ||||
| 		d.a[4] ^= bw[4] | ||||
| 		d.a[5] ^= bw[5] | ||||
| 		d.a[6] ^= bw[6] | ||||
| 		d.a[7] ^= bw[7] | ||||
| 		d.a[8] ^= bw[8] | ||||
| 	} | ||||
| 	if n >= 104 { | ||||
| 		d.a[9] ^= bw[9] | ||||
| 		d.a[10] ^= bw[10] | ||||
| 		d.a[11] ^= bw[11] | ||||
| 		d.a[12] ^= bw[12] | ||||
| 	} | ||||
| 	if n >= 136 { | ||||
| 		d.a[13] ^= bw[13] | ||||
| 		d.a[14] ^= bw[14] | ||||
| 		d.a[15] ^= bw[15] | ||||
| 		d.a[16] ^= bw[16] | ||||
| 	} | ||||
| 	if n >= 144 { | ||||
| 		d.a[17] ^= bw[17] | ||||
| 	} | ||||
| 	if n >= 168 { | ||||
| 		d.a[18] ^= bw[18] | ||||
| 		d.a[19] ^= bw[19] | ||||
| 		d.a[20] ^= bw[20] | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func copyOut(d *State, buf []byte) { | ||||
| 	ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) | ||||
| 	copy(buf, ab[:]) | ||||
| } | ||||
|  | @ -1,335 +0,0 @@ | |||
| // Package hybrid defines several hybrid classical/quantum KEMs.
 | ||||
| //
 | ||||
| // KEMs are combined by simple concatenation of shared secrets, cipher texts,
 | ||||
| // public keys, etc, see
 | ||||
| //
 | ||||
| //	https://datatracker.ietf.org/doc/draft-ietf-tls-hybrid-design/
 | ||||
| //	https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Cr2.pdf
 | ||||
| //
 | ||||
| // Note that this is only fine if the shared secret is used in its entirety
 | ||||
| // in a next step, such as being hashed or used as key.
 | ||||
| //
 | ||||
| // For deriving a KEM keypair deterministically and encapsulating
 | ||||
| // deterministically, we expand a single seed to both using SHAKE256,
 | ||||
| // so that a non-uniform seed (such as a shared secret generated by a hybrid
 | ||||
| // KEM where one of the KEMs is weak) doesn't impact just one of the KEMs.
 | ||||
| //
 | ||||
| // Of our XOF (SHAKE256), we desire two security properties:
 | ||||
| //
 | ||||
| //  1. The internal state of the XOF should be big enough so that we
 | ||||
| //     do not loose entropy.
 | ||||
| //  2. From one of the new seeds, we shouldn't be able to derive
 | ||||
| //     the other or the original seed.
 | ||||
| //
 | ||||
| // SHAKE256, and all siblings in the SHA3 family, have a 200B internal
 | ||||
| // state, so (1) is fine if our seeds are less than 200B.
 | ||||
| // If SHAKE256 is computationally indistinguishable from a random
 | ||||
| // sponge, then it affords us 256b security against (2) by the
 | ||||
| // flat sponge claim [https://keccak.team/files/SpongeFunctions.pdf].
 | ||||
| // None of the implemented schemes claim more than 256b security
 | ||||
| // and so SHAKE256 will do fine.
 | ||||
| package hybrid | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 
 | ||||
| 	"github.com/cloudflare/circl/internal/sha3" | ||||
| 	"github.com/cloudflare/circl/kem" | ||||
| 	"github.com/cloudflare/circl/kem/kyber/kyber1024" | ||||
| 	"github.com/cloudflare/circl/kem/kyber/kyber512" | ||||
| 	"github.com/cloudflare/circl/kem/kyber/kyber768" | ||||
| ) | ||||
| 
 | ||||
| var ErrUninitialized = errors.New("public or private key not initialized") | ||||
| 
 | ||||
| // Returns the hybrid KEM of Kyber512 and X25519.
 | ||||
| func Kyber512X25519() kem.Scheme { return kyber512X } | ||||
| 
 | ||||
| // Returns the hybrid KEM of Kyber768 and X25519.
 | ||||
| func Kyber768X25519() kem.Scheme { return kyber768X } | ||||
| 
 | ||||
| // Returns the hybrid KEM of Kyber768 and X448.
 | ||||
| func Kyber768X448() kem.Scheme { return kyber768X4 } | ||||
| 
 | ||||
| // Returns the hybrid KEM of Kyber1024 and X448.
 | ||||
| func Kyber1024X448() kem.Scheme { return kyber1024X } | ||||
| 
 | ||||
| var kyber512X kem.Scheme = &scheme{ | ||||
| 	"Kyber512-X25519", | ||||
| 	x25519Kem, | ||||
| 	kyber512.Scheme(), | ||||
| } | ||||
| 
 | ||||
| var kyber768X kem.Scheme = &scheme{ | ||||
| 	"Kyber768-X25519", | ||||
| 	x25519Kem, | ||||
| 	kyber768.Scheme(), | ||||
| } | ||||
| 
 | ||||
| var kyber768X4 kem.Scheme = &scheme{ | ||||
| 	"Kyber768-X448", | ||||
| 	x448Kem, | ||||
| 	kyber768.Scheme(), | ||||
| } | ||||
| 
 | ||||
| var kyber1024X kem.Scheme = &scheme{ | ||||
| 	"Kyber1024-X448", | ||||
| 	x448Kem, | ||||
| 	kyber1024.Scheme(), | ||||
| } | ||||
| 
 | ||||
| // Public key of a hybrid KEM.
 | ||||
| type publicKey struct { | ||||
| 	scheme *scheme | ||||
| 	first  kem.PublicKey | ||||
| 	second kem.PublicKey | ||||
| } | ||||
| 
 | ||||
| // Private key of a hybrid KEM.
 | ||||
| type privateKey struct { | ||||
| 	scheme *scheme | ||||
| 	first  kem.PrivateKey | ||||
| 	second kem.PrivateKey | ||||
| } | ||||
| 
 | ||||
| // Scheme for a hybrid KEM.
 | ||||
| type scheme struct { | ||||
| 	name   string | ||||
| 	first  kem.Scheme | ||||
| 	second kem.Scheme | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) Name() string { return sch.name } | ||||
| func (sch *scheme) PublicKeySize() int { | ||||
| 	return sch.first.PublicKeySize() + sch.second.PublicKeySize() | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) PrivateKeySize() int { | ||||
| 	return sch.first.PrivateKeySize() + sch.second.PrivateKeySize() | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) SeedSize() int { | ||||
| 	first := sch.first.SeedSize() | ||||
| 	second := sch.second.SeedSize() | ||||
| 	ret := second | ||||
| 	if first > second { | ||||
| 		ret = first | ||||
| 	} | ||||
| 	return ret | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) SharedKeySize() int { | ||||
| 	return sch.first.SharedKeySize() + sch.second.SharedKeySize() | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) CiphertextSize() int { | ||||
| 	return sch.first.CiphertextSize() + sch.second.CiphertextSize() | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) EncapsulationSeedSize() int { | ||||
| 	first := sch.first.EncapsulationSeedSize() | ||||
| 	second := sch.second.EncapsulationSeedSize() | ||||
| 	ret := second | ||||
| 	if first > second { | ||||
| 		ret = first | ||||
| 	} | ||||
| 	return ret | ||||
| } | ||||
| 
 | ||||
| func (sk *privateKey) Scheme() kem.Scheme { return sk.scheme } | ||||
| func (pk *publicKey) Scheme() kem.Scheme  { return pk.scheme } | ||||
| 
 | ||||
| func (sk *privateKey) MarshalBinary() ([]byte, error) { | ||||
| 	if sk.first == nil || sk.second == nil { | ||||
| 		return nil, ErrUninitialized | ||||
| 	} | ||||
| 	first, err := sk.first.MarshalBinary() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	second, err := sk.second.MarshalBinary() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return append(first, second...), nil | ||||
| } | ||||
| 
 | ||||
| func (sk *privateKey) Equal(other kem.PrivateKey) bool { | ||||
| 	oth, ok := other.(*privateKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if sk.first == nil && sk.second == nil && oth.first == nil && oth.second == nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	if sk.first == nil || sk.second == nil || oth.first == nil || oth.second == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	return sk.first.Equal(oth.first) && sk.second.Equal(oth.second) | ||||
| } | ||||
| 
 | ||||
| func (sk *privateKey) Public() kem.PublicKey { | ||||
| 	return &publicKey{sk.scheme, sk.first.Public(), sk.second.Public()} | ||||
| } | ||||
| 
 | ||||
| func (pk *publicKey) Equal(other kem.PublicKey) bool { | ||||
| 	oth, ok := other.(*publicKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if pk.first == nil && pk.second == nil && oth.first == nil && oth.second == nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	if pk.first == nil || pk.second == nil || oth.first == nil || oth.second == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	return pk.first.Equal(oth.first) && pk.second.Equal(oth.second) | ||||
| } | ||||
| 
 | ||||
| func (pk *publicKey) MarshalBinary() ([]byte, error) { | ||||
| 	if pk.first == nil || pk.second == nil { | ||||
| 		return nil, ErrUninitialized | ||||
| 	} | ||||
| 	first, err := pk.first.MarshalBinary() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	second, err := pk.second.MarshalBinary() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return append(first, second...), nil | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { | ||||
| 	pk1, sk1, err := sch.first.GenerateKeyPair() | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	pk2, sk2, err := sch.second.GenerateKeyPair() | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return &publicKey{sch, pk1, pk2}, &privateKey{sch, sk1, sk2}, nil | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { | ||||
| 	if len(seed) != sch.SeedSize() { | ||||
| 		panic(kem.ErrSeedSize) | ||||
| 	} | ||||
| 	h := sha3.NewShake256() | ||||
| 	_, _ = h.Write(seed) | ||||
| 	first := make([]byte, sch.first.SeedSize()) | ||||
| 	second := make([]byte, sch.second.SeedSize()) | ||||
| 	_, _ = h.Read(first) | ||||
| 	_, _ = h.Read(second) | ||||
| 
 | ||||
| 	pk1, sk1 := sch.first.DeriveKeyPair(first) | ||||
| 	pk2, sk2 := sch.second.DeriveKeyPair(second) | ||||
| 
 | ||||
| 	return &publicKey{sch, pk1, pk2}, &privateKey{sch, sk1, sk2} | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { | ||||
| 	pub, ok := pk.(*publicKey) | ||||
| 	if !ok { | ||||
| 		return nil, nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 
 | ||||
| 	ct1, ss1, err := sch.first.Encapsulate(pub.first) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	ct2, ss2, err := sch.second.Encapsulate(pub.second) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return append(ct1, ct2...), append(ss1, ss2...), nil | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) EncapsulateDeterministically( | ||||
| 	pk kem.PublicKey, seed []byte, | ||||
| ) (ct, ss []byte, err error) { | ||||
| 	if len(seed) != sch.EncapsulationSeedSize() { | ||||
| 		return nil, nil, kem.ErrSeedSize | ||||
| 	} | ||||
| 
 | ||||
| 	h := sha3.NewShake256() | ||||
| 	_, _ = h.Write(seed) | ||||
| 	first := make([]byte, sch.first.EncapsulationSeedSize()) | ||||
| 	second := make([]byte, sch.second.EncapsulationSeedSize()) | ||||
| 	_, _ = h.Read(first) | ||||
| 	_, _ = h.Read(second) | ||||
| 
 | ||||
| 	pub, ok := pk.(*publicKey) | ||||
| 	if !ok { | ||||
| 		return nil, nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 
 | ||||
| 	ct1, ss1, err := sch.first.EncapsulateDeterministically(pub.first, first) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	ct2, ss2, err := sch.second.EncapsulateDeterministically(pub.second, second) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	return append(ct1, ct2...), append(ss1, ss2...), nil | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { | ||||
| 	if len(ct) != sch.CiphertextSize() { | ||||
| 		return nil, kem.ErrCiphertextSize | ||||
| 	} | ||||
| 
 | ||||
| 	priv, ok := sk.(*privateKey) | ||||
| 	if !ok { | ||||
| 		return nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 
 | ||||
| 	firstSize := sch.first.CiphertextSize() | ||||
| 	ss1, err := sch.first.Decapsulate(priv.first, ct[:firstSize]) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	ss2, err := sch.second.Decapsulate(priv.second, ct[firstSize:]) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return append(ss1, ss2...), nil | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { | ||||
| 	if len(buf) != sch.PublicKeySize() { | ||||
| 		return nil, kem.ErrPubKeySize | ||||
| 	} | ||||
| 	firstSize := sch.first.PublicKeySize() | ||||
| 	pk1, err := sch.first.UnmarshalBinaryPublicKey(buf[:firstSize]) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	pk2, err := sch.second.UnmarshalBinaryPublicKey(buf[firstSize:]) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &publicKey{sch, pk1, pk2}, nil | ||||
| } | ||||
| 
 | ||||
| func (sch *scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { | ||||
| 	if len(buf) != sch.PrivateKeySize() { | ||||
| 		return nil, kem.ErrPrivKeySize | ||||
| 	} | ||||
| 	firstSize := sch.first.PrivateKeySize() | ||||
| 	sk1, err := sch.first.UnmarshalBinaryPrivateKey(buf[:firstSize]) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	sk2, err := sch.second.UnmarshalBinaryPrivateKey(buf[firstSize:]) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &privateKey{sch, sk1, sk2}, nil | ||||
| } | ||||
|  | @ -1,208 +0,0 @@ | |||
| package hybrid | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	cryptoRand "crypto/rand" | ||||
| 	"crypto/subtle" | ||||
| 
 | ||||
| 	"github.com/cloudflare/circl/dh/x25519" | ||||
| 	"github.com/cloudflare/circl/dh/x448" | ||||
| 	"github.com/cloudflare/circl/internal/sha3" | ||||
| 	"github.com/cloudflare/circl/kem" | ||||
| ) | ||||
| 
 | ||||
| type xPublicKey struct { | ||||
| 	scheme *xScheme | ||||
| 	key    []byte | ||||
| } | ||||
| type xPrivateKey struct { | ||||
| 	scheme *xScheme | ||||
| 	key    []byte | ||||
| } | ||||
| type xScheme struct { | ||||
| 	size int | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	x25519Kem = &xScheme{x25519.Size} | ||||
| 	x448Kem   = &xScheme{x448.Size} | ||||
| ) | ||||
| 
 | ||||
| func (sch *xScheme) Name() string { | ||||
| 	switch sch.size { | ||||
| 	case x25519.Size: | ||||
| 		return "X25519" | ||||
| 	case x448.Size: | ||||
| 		return "X448" | ||||
| 	} | ||||
| 	panic(kem.ErrTypeMismatch) | ||||
| } | ||||
| 
 | ||||
| func (sch *xScheme) PublicKeySize() int         { return sch.size } | ||||
| func (sch *xScheme) PrivateKeySize() int        { return sch.size } | ||||
| func (sch *xScheme) SeedSize() int              { return sch.size } | ||||
| func (sch *xScheme) SharedKeySize() int         { return sch.size } | ||||
| func (sch *xScheme) CiphertextSize() int        { return sch.size } | ||||
| func (sch *xScheme) EncapsulationSeedSize() int { return sch.size } | ||||
| 
 | ||||
| func (sk *xPrivateKey) Scheme() kem.Scheme { return sk.scheme } | ||||
| func (pk *xPublicKey) Scheme() kem.Scheme  { return pk.scheme } | ||||
| 
 | ||||
| func (sk *xPrivateKey) MarshalBinary() ([]byte, error) { | ||||
| 	ret := make([]byte, len(sk.key)) | ||||
| 	copy(ret, sk.key) | ||||
| 	return ret, nil | ||||
| } | ||||
| 
 | ||||
| func (sk *xPrivateKey) Equal(other kem.PrivateKey) bool { | ||||
| 	oth, ok := other.(*xPrivateKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if oth.scheme != sk.scheme { | ||||
| 		return false | ||||
| 	} | ||||
| 	return subtle.ConstantTimeCompare(oth.key, sk.key) == 1 | ||||
| } | ||||
| 
 | ||||
| func (sk *xPrivateKey) Public() kem.PublicKey { | ||||
| 	pk := xPublicKey{sk.scheme, make([]byte, sk.scheme.size)} | ||||
| 	switch sk.scheme.size { | ||||
| 	case x25519.Size: | ||||
| 		var sk2, pk2 x25519.Key | ||||
| 		copy(sk2[:], sk.key) | ||||
| 		x25519.KeyGen(&pk2, &sk2) | ||||
| 		copy(pk.key, pk2[:]) | ||||
| 	case x448.Size: | ||||
| 		var sk2, pk2 x448.Key | ||||
| 		copy(sk2[:], sk.key) | ||||
| 		x448.KeyGen(&pk2, &sk2) | ||||
| 		copy(pk.key, pk2[:]) | ||||
| 	} | ||||
| 	return &pk | ||||
| } | ||||
| 
 | ||||
| func (pk *xPublicKey) Equal(other kem.PublicKey) bool { | ||||
| 	oth, ok := other.(*xPublicKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if oth.scheme != pk.scheme { | ||||
| 		return false | ||||
| 	} | ||||
| 	return bytes.Equal(oth.key, pk.key) | ||||
| } | ||||
| 
 | ||||
| func (pk *xPublicKey) MarshalBinary() ([]byte, error) { | ||||
| 	ret := make([]byte, pk.scheme.size) | ||||
| 	copy(ret, pk.key) | ||||
| 	return ret, nil | ||||
| } | ||||
| 
 | ||||
| func (sch *xScheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { | ||||
| 	seed := make([]byte, sch.SeedSize()) | ||||
| 	_, err := cryptoRand.Read(seed) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	pk, sk := sch.DeriveKeyPair(seed) | ||||
| 	return pk, sk, nil | ||||
| } | ||||
| 
 | ||||
| func (sch *xScheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { | ||||
| 	if len(seed) != sch.SeedSize() { | ||||
| 		panic(kem.ErrSeedSize) | ||||
| 	} | ||||
| 	sk := xPrivateKey{scheme: sch, key: make([]byte, sch.size)} | ||||
| 
 | ||||
| 	h := sha3.NewShake256() | ||||
| 	_, _ = h.Write(seed) | ||||
| 	_, _ = h.Read(sk.key) | ||||
| 
 | ||||
| 	return sk.Public(), &sk | ||||
| } | ||||
| 
 | ||||
| func (sch *xScheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { | ||||
| 	seed := make([]byte, sch.EncapsulationSeedSize()) | ||||
| 	_, err = cryptoRand.Read(seed) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	return sch.EncapsulateDeterministically(pk, seed) | ||||
| } | ||||
| 
 | ||||
| func (pk *xPublicKey) X(sk *xPrivateKey) []byte { | ||||
| 	if pk.scheme != sk.scheme { | ||||
| 		panic(kem.ErrTypeMismatch) | ||||
| 	} | ||||
| 
 | ||||
| 	switch pk.scheme.size { | ||||
| 	case x25519.Size: | ||||
| 		var ss2, pk2, sk2 x25519.Key | ||||
| 		copy(pk2[:], pk.key) | ||||
| 		copy(sk2[:], sk.key) | ||||
| 		x25519.Shared(&ss2, &sk2, &pk2) | ||||
| 		return ss2[:] | ||||
| 	case x448.Size: | ||||
| 		var ss2, pk2, sk2 x448.Key | ||||
| 		copy(pk2[:], pk.key) | ||||
| 		copy(sk2[:], sk.key) | ||||
| 		x448.Shared(&ss2, &sk2, &pk2) | ||||
| 		return ss2[:] | ||||
| 	} | ||||
| 	panic(kem.ErrTypeMismatch) | ||||
| } | ||||
| 
 | ||||
| func (sch *xScheme) EncapsulateDeterministically( | ||||
| 	pk kem.PublicKey, seed []byte, | ||||
| ) (ct, ss []byte, err error) { | ||||
| 	if len(seed) != sch.EncapsulationSeedSize() { | ||||
| 		return nil, nil, kem.ErrSeedSize | ||||
| 	} | ||||
| 	pub, ok := pk.(*xPublicKey) | ||||
| 	if !ok || pub.scheme != sch { | ||||
| 		return nil, nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 
 | ||||
| 	pk2, sk2 := sch.DeriveKeyPair(seed) | ||||
| 	ss = pub.X(sk2.(*xPrivateKey)) | ||||
| 	ct, _ = pk2.MarshalBinary() | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (sch *xScheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { | ||||
| 	if len(ct) != sch.CiphertextSize() { | ||||
| 		return nil, kem.ErrCiphertextSize | ||||
| 	} | ||||
| 
 | ||||
| 	priv, ok := sk.(*xPrivateKey) | ||||
| 	if !ok || priv.scheme != sch { | ||||
| 		return nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 
 | ||||
| 	pk, err := sch.UnmarshalBinaryPublicKey(ct) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	ss := pk.(*xPublicKey).X(priv) | ||||
| 	return ss, nil | ||||
| } | ||||
| 
 | ||||
| func (sch *xScheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { | ||||
| 	if len(buf) != sch.PublicKeySize() { | ||||
| 		return nil, kem.ErrPubKeySize | ||||
| 	} | ||||
| 	ret := xPublicKey{sch, make([]byte, sch.size)} | ||||
| 	copy(ret.key, buf) | ||||
| 	return &ret, nil | ||||
| } | ||||
| 
 | ||||
| func (sch *xScheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { | ||||
| 	if len(buf) != sch.PrivateKeySize() { | ||||
| 		return nil, kem.ErrPrivKeySize | ||||
| 	} | ||||
| 	ret := xPrivateKey{sch, make([]byte, sch.size)} | ||||
| 	copy(ret.key, buf) | ||||
| 	return &ret, nil | ||||
| } | ||||
|  | @ -1,118 +0,0 @@ | |||
| // Package kem provides a unified interface for KEM schemes.
 | ||||
| //
 | ||||
| // A register of schemes is available in the package
 | ||||
| //
 | ||||
| //	github.com/cloudflare/circl/kem/schemes
 | ||||
| package kem | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding" | ||||
| 	"errors" | ||||
| ) | ||||
| 
 | ||||
| // A KEM public key
 | ||||
| type PublicKey interface { | ||||
| 	// Returns the scheme for this public key
 | ||||
| 	Scheme() Scheme | ||||
| 
 | ||||
| 	encoding.BinaryMarshaler | ||||
| 	Equal(PublicKey) bool | ||||
| } | ||||
| 
 | ||||
| // A KEM private key
 | ||||
| type PrivateKey interface { | ||||
| 	// Returns the scheme for this private key
 | ||||
| 	Scheme() Scheme | ||||
| 
 | ||||
| 	encoding.BinaryMarshaler | ||||
| 	Equal(PrivateKey) bool | ||||
| 	Public() PublicKey | ||||
| } | ||||
| 
 | ||||
| // A Scheme represents a specific instance of a KEM.
 | ||||
| type Scheme interface { | ||||
| 	// Name of the scheme
 | ||||
| 	Name() string | ||||
| 
 | ||||
| 	// GenerateKeyPair creates a new key pair.
 | ||||
| 	GenerateKeyPair() (PublicKey, PrivateKey, error) | ||||
| 
 | ||||
| 	// Encapsulate generates a shared key ss for the public key and
 | ||||
| 	// encapsulates it into a ciphertext ct.
 | ||||
| 	Encapsulate(pk PublicKey) (ct, ss []byte, err error) | ||||
| 
 | ||||
| 	// Returns the shared key encapsulated in ciphertext ct for the
 | ||||
| 	// private key sk.
 | ||||
| 	Decapsulate(sk PrivateKey, ct []byte) ([]byte, error) | ||||
| 
 | ||||
| 	// Unmarshals a PublicKey from the provided buffer.
 | ||||
| 	UnmarshalBinaryPublicKey([]byte) (PublicKey, error) | ||||
| 
 | ||||
| 	// Unmarshals a PrivateKey from the provided buffer.
 | ||||
| 	UnmarshalBinaryPrivateKey([]byte) (PrivateKey, error) | ||||
| 
 | ||||
| 	// Size of encapsulated keys.
 | ||||
| 	CiphertextSize() int | ||||
| 
 | ||||
| 	// Size of established shared keys.
 | ||||
| 	SharedKeySize() int | ||||
| 
 | ||||
| 	// Size of packed private keys.
 | ||||
| 	PrivateKeySize() int | ||||
| 
 | ||||
| 	// Size of packed public keys.
 | ||||
| 	PublicKeySize() int | ||||
| 
 | ||||
| 	// DeriveKeyPair deterministicallly derives a pair of keys from a seed.
 | ||||
| 	// Panics if the length of seed is not equal to the value returned by
 | ||||
| 	// SeedSize.
 | ||||
| 	DeriveKeyPair(seed []byte) (PublicKey, PrivateKey) | ||||
| 
 | ||||
| 	// Size of seed used in DeriveKey
 | ||||
| 	SeedSize() int | ||||
| 
 | ||||
| 	// EncapsulateDeterministically generates a shared key ss for the public
 | ||||
| 	// key deterministically from the given seed and encapsulates it into
 | ||||
| 	// a ciphertext ct. If unsure, you're better off using Encapsulate().
 | ||||
| 	EncapsulateDeterministically(pk PublicKey, seed []byte) ( | ||||
| 		ct, ss []byte, err error) | ||||
| 
 | ||||
| 	// Size of seed used in EncapsulateDeterministically().
 | ||||
| 	EncapsulationSeedSize() int | ||||
| } | ||||
| 
 | ||||
| // AuthScheme represents a KEM that supports authenticated key encapsulation.
 | ||||
| type AuthScheme interface { | ||||
| 	Scheme | ||||
| 	AuthEncapsulate(pkr PublicKey, sks PrivateKey) (ct, ss []byte, err error) | ||||
| 	AuthEncapsulateDeterministically(pkr PublicKey, sks PrivateKey, seed []byte) (ct, ss []byte, err error) | ||||
| 	AuthDecapsulate(skr PrivateKey, ct []byte, pks PublicKey) ([]byte, error) | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	// ErrTypeMismatch is the error used if types of, for instance, private
 | ||||
| 	// and public keys don't match
 | ||||
| 	ErrTypeMismatch = errors.New("types mismatch") | ||||
| 
 | ||||
| 	// ErrSeedSize is the error used if the provided seed is of the wrong
 | ||||
| 	// size.
 | ||||
| 	ErrSeedSize = errors.New("wrong seed size") | ||||
| 
 | ||||
| 	// ErrPubKeySize is the error used if the provided public key is of
 | ||||
| 	// the wrong size.
 | ||||
| 	ErrPubKeySize = errors.New("wrong size for public key") | ||||
| 
 | ||||
| 	// ErrCiphertextSize is the error used if the provided ciphertext
 | ||||
| 	// is of the wrong size.
 | ||||
| 	ErrCiphertextSize = errors.New("wrong size for ciphertext") | ||||
| 
 | ||||
| 	// ErrPrivKeySize is the error used if the provided private key is of
 | ||||
| 	// the wrong size.
 | ||||
| 	ErrPrivKeySize = errors.New("wrong size for private key") | ||||
| 
 | ||||
| 	// ErrPubKey is the error used if the provided public key is invalid.
 | ||||
| 	ErrPubKey = errors.New("invalid public key") | ||||
| 
 | ||||
| 	// ErrCipherText is the error used if the provided ciphertext is invalid.
 | ||||
| 	ErrCipherText = errors.New("invalid ciphertext") | ||||
| ) | ||||
|  | @ -1,402 +0,0 @@ | |||
| // Code generated from pkg.templ.go. DO NOT EDIT.
 | ||||
| 
 | ||||
| // Package kyber1024 implements the IND-CCA2 secure key encapsulation mechanism
 | ||||
| // Kyber1024.CCAKEM as submitted to round 3 of the NIST PQC competition and
 | ||||
| // described in
 | ||||
| //
 | ||||
| // https://pq-crystals.org/kyber/data/kyber-specification-round3.pdf
 | ||||
| package kyber1024 | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto/subtle" | ||||
| 	"io" | ||||
| 
 | ||||
| 	cryptoRand "crypto/rand" | ||||
| 	"github.com/cloudflare/circl/internal/sha3" | ||||
| 	"github.com/cloudflare/circl/kem" | ||||
| 	cpapke "github.com/cloudflare/circl/pke/kyber/kyber1024" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// Size of seed for NewKeyFromSeed
 | ||||
| 	KeySeedSize = cpapke.KeySeedSize + 32 | ||||
| 
 | ||||
| 	// Size of seed for EncapsulateTo.
 | ||||
| 	EncapsulationSeedSize = 32 | ||||
| 
 | ||||
| 	// Size of the established shared key.
 | ||||
| 	SharedKeySize = 32 | ||||
| 
 | ||||
| 	// Size of the encapsulated shared key.
 | ||||
| 	CiphertextSize = cpapke.CiphertextSize | ||||
| 
 | ||||
| 	// Size of a packed public key.
 | ||||
| 	PublicKeySize = cpapke.PublicKeySize | ||||
| 
 | ||||
| 	// Size of a packed private key.
 | ||||
| 	PrivateKeySize = cpapke.PrivateKeySize + cpapke.PublicKeySize + 64 | ||||
| ) | ||||
| 
 | ||||
| // Type of a Kyber1024.CCAKEM public key
 | ||||
| type PublicKey struct { | ||||
| 	pk *cpapke.PublicKey | ||||
| 
 | ||||
| 	hpk [32]byte // H(pk)
 | ||||
| } | ||||
| 
 | ||||
| // Type of a Kyber1024.CCAKEM private key
 | ||||
| type PrivateKey struct { | ||||
| 	sk  *cpapke.PrivateKey | ||||
| 	pk  *cpapke.PublicKey | ||||
| 	hpk [32]byte // H(pk)
 | ||||
| 	z   [32]byte | ||||
| } | ||||
| 
 | ||||
| // NewKeyFromSeed derives a public/private keypair deterministically
 | ||||
| // from the given seed.
 | ||||
| //
 | ||||
| // Panics if seed is not of length KeySeedSize.
 | ||||
| func NewKeyFromSeed(seed []byte) (*PublicKey, *PrivateKey) { | ||||
| 	var sk PrivateKey | ||||
| 	var pk PublicKey | ||||
| 
 | ||||
| 	if len(seed) != KeySeedSize { | ||||
| 		panic("seed must be of length KeySeedSize") | ||||
| 	} | ||||
| 
 | ||||
| 	pk.pk, sk.sk = cpapke.NewKeyFromSeed(seed[:cpapke.KeySeedSize]) | ||||
| 	sk.pk = pk.pk | ||||
| 	copy(sk.z[:], seed[cpapke.KeySeedSize:]) | ||||
| 
 | ||||
| 	// Compute H(pk)
 | ||||
| 	var ppk [cpapke.PublicKeySize]byte | ||||
| 	sk.pk.Pack(ppk[:]) | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(ppk[:]) | ||||
| 	h.Read(sk.hpk[:]) | ||||
| 	copy(pk.hpk[:], sk.hpk[:]) | ||||
| 
 | ||||
| 	return &pk, &sk | ||||
| } | ||||
| 
 | ||||
| // GenerateKeyPair generates public and private keys using entropy from rand.
 | ||||
| // If rand is nil, crypto/rand.Reader will be used.
 | ||||
| func GenerateKeyPair(rand io.Reader) (*PublicKey, *PrivateKey, error) { | ||||
| 	var seed [KeySeedSize]byte | ||||
| 	if rand == nil { | ||||
| 		rand = cryptoRand.Reader | ||||
| 	} | ||||
| 	_, err := io.ReadFull(rand, seed[:]) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	pk, sk := NewKeyFromSeed(seed[:]) | ||||
| 	return pk, sk, nil | ||||
| } | ||||
| 
 | ||||
| // EncapsulateTo generates a shared key and ciphertext that contains it
 | ||||
| // for the public key using randomness from seed and writes the shared key
 | ||||
| // to ss and ciphertext to ct.
 | ||||
| //
 | ||||
| // Panics if ss, ct or seed are not of length SharedKeySize, CiphertextSize
 | ||||
| // and EncapsulationSeedSize respectively.
 | ||||
| //
 | ||||
| // seed may be nil, in which case crypto/rand.Reader is used to generate one.
 | ||||
| func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { | ||||
| 	if seed == nil { | ||||
| 		seed = make([]byte, EncapsulationSeedSize) | ||||
| 		cryptoRand.Read(seed[:]) | ||||
| 	} else { | ||||
| 		if len(seed) != EncapsulationSeedSize { | ||||
| 			panic("seed must be of length EncapsulationSeedSize") | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if len(ct) != CiphertextSize { | ||||
| 		panic("ct must be of length CiphertextSize") | ||||
| 	} | ||||
| 
 | ||||
| 	if len(ss) != SharedKeySize { | ||||
| 		panic("ss must be of length SharedKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	// m = H(seed)
 | ||||
| 	var m [32]byte | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(seed[:]) | ||||
| 	h.Read(m[:]) | ||||
| 
 | ||||
| 	// (K', r) = G(m ‖ H(pk))
 | ||||
| 	var kr [64]byte | ||||
| 	g := sha3.New512() | ||||
| 	g.Write(m[:]) | ||||
| 	g.Write(pk.hpk[:]) | ||||
| 	g.Read(kr[:]) | ||||
| 
 | ||||
| 	// c = Kyber.CPAPKE.Enc(pk, m, r)
 | ||||
| 	pk.pk.EncryptTo(ct, m[:], kr[32:]) | ||||
| 
 | ||||
| 	// Compute H(c) and put in second slot of kr, which will be (K', H(c)).
 | ||||
| 	h.Reset() | ||||
| 	h.Write(ct[:CiphertextSize]) | ||||
| 	h.Read(kr[32:]) | ||||
| 
 | ||||
| 	// K = KDF(K' ‖ H(c))
 | ||||
| 	kdf := sha3.NewShake256() | ||||
| 	kdf.Write(kr[:]) | ||||
| 	kdf.Read(ss[:SharedKeySize]) | ||||
| } | ||||
| 
 | ||||
| // DecapsulateTo computes the shared key which is encapsulated in ct
 | ||||
| // for the private key.
 | ||||
| //
 | ||||
| // Panics if ct or ss are not of length CiphertextSize and SharedKeySize
 | ||||
| // respectively.
 | ||||
| func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { | ||||
| 	if len(ct) != CiphertextSize { | ||||
| 		panic("ct must be of length CiphertextSize") | ||||
| 	} | ||||
| 
 | ||||
| 	if len(ss) != SharedKeySize { | ||||
| 		panic("ss must be of length SharedKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	// m' = Kyber.CPAPKE.Dec(sk, ct)
 | ||||
| 	var m2 [32]byte | ||||
| 	sk.sk.DecryptTo(m2[:], ct) | ||||
| 
 | ||||
| 	// (K'', r') = G(m' ‖ H(pk))
 | ||||
| 	var kr2 [64]byte | ||||
| 	g := sha3.New512() | ||||
| 	g.Write(m2[:]) | ||||
| 	g.Write(sk.hpk[:]) | ||||
| 	g.Read(kr2[:]) | ||||
| 
 | ||||
| 	// c' = Kyber.CPAPKE.Enc(pk, m', r')
 | ||||
| 	var ct2 [CiphertextSize]byte | ||||
| 	sk.pk.EncryptTo(ct2[:], m2[:], kr2[32:]) | ||||
| 
 | ||||
| 	// Compute H(c) and put in second slot of kr2, which will be (K'', H(c)).
 | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(ct[:CiphertextSize]) | ||||
| 	h.Read(kr2[32:]) | ||||
| 
 | ||||
| 	// Replace K'' by  z in the first slot of kr2 if c ≠ c'.
 | ||||
| 	subtle.ConstantTimeCopy( | ||||
| 		1-subtle.ConstantTimeCompare(ct, ct2[:]), | ||||
| 		kr2[:32], | ||||
| 		sk.z[:], | ||||
| 	) | ||||
| 
 | ||||
| 	// K = KDF(K''/z, H(c))
 | ||||
| 	kdf := sha3.NewShake256() | ||||
| 	kdf.Write(kr2[:]) | ||||
| 	kdf.Read(ss[:SharedKeySize]) | ||||
| } | ||||
| 
 | ||||
| // Packs sk to buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PrivateKeySize.
 | ||||
| func (sk *PrivateKey) Pack(buf []byte) { | ||||
| 	if len(buf) != PrivateKeySize { | ||||
| 		panic("buf must be of length PrivateKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	sk.sk.Pack(buf[:cpapke.PrivateKeySize]) | ||||
| 	buf = buf[cpapke.PrivateKeySize:] | ||||
| 	sk.pk.Pack(buf[:cpapke.PublicKeySize]) | ||||
| 	buf = buf[cpapke.PublicKeySize:] | ||||
| 	copy(buf, sk.hpk[:]) | ||||
| 	buf = buf[32:] | ||||
| 	copy(buf, sk.z[:]) | ||||
| } | ||||
| 
 | ||||
| // Unpacks sk from buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PrivateKeySize.
 | ||||
| func (sk *PrivateKey) Unpack(buf []byte) { | ||||
| 	if len(buf) != PrivateKeySize { | ||||
| 		panic("buf must be of length PrivateKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	sk.sk = new(cpapke.PrivateKey) | ||||
| 	sk.sk.Unpack(buf[:cpapke.PrivateKeySize]) | ||||
| 	buf = buf[cpapke.PrivateKeySize:] | ||||
| 	sk.pk = new(cpapke.PublicKey) | ||||
| 	sk.pk.Unpack(buf[:cpapke.PublicKeySize]) | ||||
| 	buf = buf[cpapke.PublicKeySize:] | ||||
| 	copy(sk.hpk[:], buf[:32]) | ||||
| 	copy(sk.z[:], buf[32:]) | ||||
| } | ||||
| 
 | ||||
| // Packs pk to buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PublicKeySize.
 | ||||
| func (pk *PublicKey) Pack(buf []byte) { | ||||
| 	if len(buf) != PublicKeySize { | ||||
| 		panic("buf must be of length PublicKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	pk.pk.Pack(buf) | ||||
| } | ||||
| 
 | ||||
| // Unpacks pk from buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PublicKeySize.
 | ||||
| func (pk *PublicKey) Unpack(buf []byte) { | ||||
| 	if len(buf) != PublicKeySize { | ||||
| 		panic("buf must be of length PublicKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	pk.pk = new(cpapke.PublicKey) | ||||
| 	pk.pk.Unpack(buf) | ||||
| 
 | ||||
| 	// Compute cached H(pk)
 | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(buf) | ||||
| 	h.Read(pk.hpk[:]) | ||||
| } | ||||
| 
 | ||||
| // Boilerplate down below for the KEM scheme API.
 | ||||
| 
 | ||||
| type scheme struct{} | ||||
| 
 | ||||
| var sch kem.Scheme = &scheme{} | ||||
| 
 | ||||
| // Scheme returns a KEM interface.
 | ||||
| func Scheme() kem.Scheme { return sch } | ||||
| 
 | ||||
| func (*scheme) Name() string               { return "Kyber1024" } | ||||
| func (*scheme) PublicKeySize() int         { return PublicKeySize } | ||||
| func (*scheme) PrivateKeySize() int        { return PrivateKeySize } | ||||
| func (*scheme) SeedSize() int              { return KeySeedSize } | ||||
| func (*scheme) SharedKeySize() int         { return SharedKeySize } | ||||
| func (*scheme) CiphertextSize() int        { return CiphertextSize } | ||||
| func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } | ||||
| 
 | ||||
| func (sk *PrivateKey) Scheme() kem.Scheme { return sch } | ||||
| func (pk *PublicKey) Scheme() kem.Scheme  { return sch } | ||||
| 
 | ||||
| func (sk *PrivateKey) MarshalBinary() ([]byte, error) { | ||||
| 	var ret [PrivateKeySize]byte | ||||
| 	sk.Pack(ret[:]) | ||||
| 	return ret[:], nil | ||||
| } | ||||
| 
 | ||||
| func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { | ||||
| 	oth, ok := other.(*PrivateKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if sk.pk == nil && oth.pk == nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	if sk.pk == nil || oth.pk == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	if !bytes.Equal(sk.hpk[:], oth.hpk[:]) || | ||||
| 		!bytes.Equal(sk.z[:], oth.z[:]) { | ||||
| 		return false | ||||
| 	} | ||||
| 	return sk.sk.Equal(oth.sk) | ||||
| } | ||||
| 
 | ||||
| func (pk *PublicKey) Equal(other kem.PublicKey) bool { | ||||
| 	oth, ok := other.(*PublicKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if pk.pk == nil && oth.pk == nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	if pk.pk == nil || oth.pk == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	return bytes.Equal(pk.hpk[:], oth.hpk[:]) | ||||
| } | ||||
| 
 | ||||
| func (sk *PrivateKey) Public() kem.PublicKey { | ||||
| 	pk := new(PublicKey) | ||||
| 	pk.pk = sk.pk | ||||
| 	copy(pk.hpk[:], sk.hpk[:]) | ||||
| 	return pk | ||||
| } | ||||
| 
 | ||||
| func (pk *PublicKey) MarshalBinary() ([]byte, error) { | ||||
| 	var ret [PublicKeySize]byte | ||||
| 	pk.Pack(ret[:]) | ||||
| 	return ret[:], nil | ||||
| } | ||||
| 
 | ||||
| func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { | ||||
| 	return GenerateKeyPair(cryptoRand.Reader) | ||||
| } | ||||
| 
 | ||||
| func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { | ||||
| 	if len(seed) != KeySeedSize { | ||||
| 		panic(kem.ErrSeedSize) | ||||
| 	} | ||||
| 	return NewKeyFromSeed(seed[:]) | ||||
| } | ||||
| 
 | ||||
| func (*scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { | ||||
| 	ct = make([]byte, CiphertextSize) | ||||
| 	ss = make([]byte, SharedKeySize) | ||||
| 
 | ||||
| 	pub, ok := pk.(*PublicKey) | ||||
| 	if !ok { | ||||
| 		return nil, nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 	pub.EncapsulateTo(ct, ss, nil) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (*scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) ( | ||||
| 	ct, ss []byte, err error) { | ||||
| 	if len(seed) != EncapsulationSeedSize { | ||||
| 		return nil, nil, kem.ErrSeedSize | ||||
| 	} | ||||
| 
 | ||||
| 	ct = make([]byte, CiphertextSize) | ||||
| 	ss = make([]byte, SharedKeySize) | ||||
| 
 | ||||
| 	pub, ok := pk.(*PublicKey) | ||||
| 	if !ok { | ||||
| 		return nil, nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 	pub.EncapsulateTo(ct, ss, seed) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { | ||||
| 	if len(ct) != CiphertextSize { | ||||
| 		return nil, kem.ErrCiphertextSize | ||||
| 	} | ||||
| 
 | ||||
| 	priv, ok := sk.(*PrivateKey) | ||||
| 	if !ok { | ||||
| 		return nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 	ss := make([]byte, SharedKeySize) | ||||
| 	priv.DecapsulateTo(ss, ct) | ||||
| 	return ss, nil | ||||
| } | ||||
| 
 | ||||
| func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { | ||||
| 	if len(buf) != PublicKeySize { | ||||
| 		return nil, kem.ErrPubKeySize | ||||
| 	} | ||||
| 	var ret PublicKey | ||||
| 	ret.Unpack(buf) | ||||
| 	return &ret, nil | ||||
| } | ||||
| 
 | ||||
| func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { | ||||
| 	if len(buf) != PrivateKeySize { | ||||
| 		return nil, kem.ErrPrivKeySize | ||||
| 	} | ||||
| 	var ret PrivateKey | ||||
| 	ret.Unpack(buf) | ||||
| 	return &ret, nil | ||||
| } | ||||
|  | @ -1,402 +0,0 @@ | |||
| // Code generated from pkg.templ.go. DO NOT EDIT.
 | ||||
| 
 | ||||
| // Package kyber512 implements the IND-CCA2 secure key encapsulation mechanism
 | ||||
| // Kyber512.CCAKEM as submitted to round 3 of the NIST PQC competition and
 | ||||
| // described in
 | ||||
| //
 | ||||
| // https://pq-crystals.org/kyber/data/kyber-specification-round3.pdf
 | ||||
| package kyber512 | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto/subtle" | ||||
| 	"io" | ||||
| 
 | ||||
| 	cryptoRand "crypto/rand" | ||||
| 	"github.com/cloudflare/circl/internal/sha3" | ||||
| 	"github.com/cloudflare/circl/kem" | ||||
| 	cpapke "github.com/cloudflare/circl/pke/kyber/kyber512" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// Size of seed for NewKeyFromSeed
 | ||||
| 	KeySeedSize = cpapke.KeySeedSize + 32 | ||||
| 
 | ||||
| 	// Size of seed for EncapsulateTo.
 | ||||
| 	EncapsulationSeedSize = 32 | ||||
| 
 | ||||
| 	// Size of the established shared key.
 | ||||
| 	SharedKeySize = 32 | ||||
| 
 | ||||
| 	// Size of the encapsulated shared key.
 | ||||
| 	CiphertextSize = cpapke.CiphertextSize | ||||
| 
 | ||||
| 	// Size of a packed public key.
 | ||||
| 	PublicKeySize = cpapke.PublicKeySize | ||||
| 
 | ||||
| 	// Size of a packed private key.
 | ||||
| 	PrivateKeySize = cpapke.PrivateKeySize + cpapke.PublicKeySize + 64 | ||||
| ) | ||||
| 
 | ||||
| // Type of a Kyber512.CCAKEM public key
 | ||||
| type PublicKey struct { | ||||
| 	pk *cpapke.PublicKey | ||||
| 
 | ||||
| 	hpk [32]byte // H(pk)
 | ||||
| } | ||||
| 
 | ||||
| // Type of a Kyber512.CCAKEM private key
 | ||||
| type PrivateKey struct { | ||||
| 	sk  *cpapke.PrivateKey | ||||
| 	pk  *cpapke.PublicKey | ||||
| 	hpk [32]byte // H(pk)
 | ||||
| 	z   [32]byte | ||||
| } | ||||
| 
 | ||||
| // NewKeyFromSeed derives a public/private keypair deterministically
 | ||||
| // from the given seed.
 | ||||
| //
 | ||||
| // Panics if seed is not of length KeySeedSize.
 | ||||
| func NewKeyFromSeed(seed []byte) (*PublicKey, *PrivateKey) { | ||||
| 	var sk PrivateKey | ||||
| 	var pk PublicKey | ||||
| 
 | ||||
| 	if len(seed) != KeySeedSize { | ||||
| 		panic("seed must be of length KeySeedSize") | ||||
| 	} | ||||
| 
 | ||||
| 	pk.pk, sk.sk = cpapke.NewKeyFromSeed(seed[:cpapke.KeySeedSize]) | ||||
| 	sk.pk = pk.pk | ||||
| 	copy(sk.z[:], seed[cpapke.KeySeedSize:]) | ||||
| 
 | ||||
| 	// Compute H(pk)
 | ||||
| 	var ppk [cpapke.PublicKeySize]byte | ||||
| 	sk.pk.Pack(ppk[:]) | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(ppk[:]) | ||||
| 	h.Read(sk.hpk[:]) | ||||
| 	copy(pk.hpk[:], sk.hpk[:]) | ||||
| 
 | ||||
| 	return &pk, &sk | ||||
| } | ||||
| 
 | ||||
| // GenerateKeyPair generates public and private keys using entropy from rand.
 | ||||
| // If rand is nil, crypto/rand.Reader will be used.
 | ||||
| func GenerateKeyPair(rand io.Reader) (*PublicKey, *PrivateKey, error) { | ||||
| 	var seed [KeySeedSize]byte | ||||
| 	if rand == nil { | ||||
| 		rand = cryptoRand.Reader | ||||
| 	} | ||||
| 	_, err := io.ReadFull(rand, seed[:]) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	pk, sk := NewKeyFromSeed(seed[:]) | ||||
| 	return pk, sk, nil | ||||
| } | ||||
| 
 | ||||
| // EncapsulateTo generates a shared key and ciphertext that contains it
 | ||||
| // for the public key using randomness from seed and writes the shared key
 | ||||
| // to ss and ciphertext to ct.
 | ||||
| //
 | ||||
| // Panics if ss, ct or seed are not of length SharedKeySize, CiphertextSize
 | ||||
| // and EncapsulationSeedSize respectively.
 | ||||
| //
 | ||||
| // seed may be nil, in which case crypto/rand.Reader is used to generate one.
 | ||||
| func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { | ||||
| 	if seed == nil { | ||||
| 		seed = make([]byte, EncapsulationSeedSize) | ||||
| 		cryptoRand.Read(seed[:]) | ||||
| 	} else { | ||||
| 		if len(seed) != EncapsulationSeedSize { | ||||
| 			panic("seed must be of length EncapsulationSeedSize") | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if len(ct) != CiphertextSize { | ||||
| 		panic("ct must be of length CiphertextSize") | ||||
| 	} | ||||
| 
 | ||||
| 	if len(ss) != SharedKeySize { | ||||
| 		panic("ss must be of length SharedKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	// m = H(seed)
 | ||||
| 	var m [32]byte | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(seed[:]) | ||||
| 	h.Read(m[:]) | ||||
| 
 | ||||
| 	// (K', r) = G(m ‖ H(pk))
 | ||||
| 	var kr [64]byte | ||||
| 	g := sha3.New512() | ||||
| 	g.Write(m[:]) | ||||
| 	g.Write(pk.hpk[:]) | ||||
| 	g.Read(kr[:]) | ||||
| 
 | ||||
| 	// c = Kyber.CPAPKE.Enc(pk, m, r)
 | ||||
| 	pk.pk.EncryptTo(ct, m[:], kr[32:]) | ||||
| 
 | ||||
| 	// Compute H(c) and put in second slot of kr, which will be (K', H(c)).
 | ||||
| 	h.Reset() | ||||
| 	h.Write(ct[:CiphertextSize]) | ||||
| 	h.Read(kr[32:]) | ||||
| 
 | ||||
| 	// K = KDF(K' ‖ H(c))
 | ||||
| 	kdf := sha3.NewShake256() | ||||
| 	kdf.Write(kr[:]) | ||||
| 	kdf.Read(ss[:SharedKeySize]) | ||||
| } | ||||
| 
 | ||||
| // DecapsulateTo computes the shared key which is encapsulated in ct
 | ||||
| // for the private key.
 | ||||
| //
 | ||||
| // Panics if ct or ss are not of length CiphertextSize and SharedKeySize
 | ||||
| // respectively.
 | ||||
| func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { | ||||
| 	if len(ct) != CiphertextSize { | ||||
| 		panic("ct must be of length CiphertextSize") | ||||
| 	} | ||||
| 
 | ||||
| 	if len(ss) != SharedKeySize { | ||||
| 		panic("ss must be of length SharedKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	// m' = Kyber.CPAPKE.Dec(sk, ct)
 | ||||
| 	var m2 [32]byte | ||||
| 	sk.sk.DecryptTo(m2[:], ct) | ||||
| 
 | ||||
| 	// (K'', r') = G(m' ‖ H(pk))
 | ||||
| 	var kr2 [64]byte | ||||
| 	g := sha3.New512() | ||||
| 	g.Write(m2[:]) | ||||
| 	g.Write(sk.hpk[:]) | ||||
| 	g.Read(kr2[:]) | ||||
| 
 | ||||
| 	// c' = Kyber.CPAPKE.Enc(pk, m', r')
 | ||||
| 	var ct2 [CiphertextSize]byte | ||||
| 	sk.pk.EncryptTo(ct2[:], m2[:], kr2[32:]) | ||||
| 
 | ||||
| 	// Compute H(c) and put in second slot of kr2, which will be (K'', H(c)).
 | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(ct[:CiphertextSize]) | ||||
| 	h.Read(kr2[32:]) | ||||
| 
 | ||||
| 	// Replace K'' by  z in the first slot of kr2 if c ≠ c'.
 | ||||
| 	subtle.ConstantTimeCopy( | ||||
| 		1-subtle.ConstantTimeCompare(ct, ct2[:]), | ||||
| 		kr2[:32], | ||||
| 		sk.z[:], | ||||
| 	) | ||||
| 
 | ||||
| 	// K = KDF(K''/z, H(c))
 | ||||
| 	kdf := sha3.NewShake256() | ||||
| 	kdf.Write(kr2[:]) | ||||
| 	kdf.Read(ss[:SharedKeySize]) | ||||
| } | ||||
| 
 | ||||
| // Packs sk to buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PrivateKeySize.
 | ||||
| func (sk *PrivateKey) Pack(buf []byte) { | ||||
| 	if len(buf) != PrivateKeySize { | ||||
| 		panic("buf must be of length PrivateKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	sk.sk.Pack(buf[:cpapke.PrivateKeySize]) | ||||
| 	buf = buf[cpapke.PrivateKeySize:] | ||||
| 	sk.pk.Pack(buf[:cpapke.PublicKeySize]) | ||||
| 	buf = buf[cpapke.PublicKeySize:] | ||||
| 	copy(buf, sk.hpk[:]) | ||||
| 	buf = buf[32:] | ||||
| 	copy(buf, sk.z[:]) | ||||
| } | ||||
| 
 | ||||
| // Unpacks sk from buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PrivateKeySize.
 | ||||
| func (sk *PrivateKey) Unpack(buf []byte) { | ||||
| 	if len(buf) != PrivateKeySize { | ||||
| 		panic("buf must be of length PrivateKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	sk.sk = new(cpapke.PrivateKey) | ||||
| 	sk.sk.Unpack(buf[:cpapke.PrivateKeySize]) | ||||
| 	buf = buf[cpapke.PrivateKeySize:] | ||||
| 	sk.pk = new(cpapke.PublicKey) | ||||
| 	sk.pk.Unpack(buf[:cpapke.PublicKeySize]) | ||||
| 	buf = buf[cpapke.PublicKeySize:] | ||||
| 	copy(sk.hpk[:], buf[:32]) | ||||
| 	copy(sk.z[:], buf[32:]) | ||||
| } | ||||
| 
 | ||||
| // Packs pk to buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PublicKeySize.
 | ||||
| func (pk *PublicKey) Pack(buf []byte) { | ||||
| 	if len(buf) != PublicKeySize { | ||||
| 		panic("buf must be of length PublicKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	pk.pk.Pack(buf) | ||||
| } | ||||
| 
 | ||||
| // Unpacks pk from buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PublicKeySize.
 | ||||
| func (pk *PublicKey) Unpack(buf []byte) { | ||||
| 	if len(buf) != PublicKeySize { | ||||
| 		panic("buf must be of length PublicKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	pk.pk = new(cpapke.PublicKey) | ||||
| 	pk.pk.Unpack(buf) | ||||
| 
 | ||||
| 	// Compute cached H(pk)
 | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(buf) | ||||
| 	h.Read(pk.hpk[:]) | ||||
| } | ||||
| 
 | ||||
| // Boilerplate down below for the KEM scheme API.
 | ||||
| 
 | ||||
| type scheme struct{} | ||||
| 
 | ||||
| var sch kem.Scheme = &scheme{} | ||||
| 
 | ||||
| // Scheme returns a KEM interface.
 | ||||
| func Scheme() kem.Scheme { return sch } | ||||
| 
 | ||||
| func (*scheme) Name() string               { return "Kyber512" } | ||||
| func (*scheme) PublicKeySize() int         { return PublicKeySize } | ||||
| func (*scheme) PrivateKeySize() int        { return PrivateKeySize } | ||||
| func (*scheme) SeedSize() int              { return KeySeedSize } | ||||
| func (*scheme) SharedKeySize() int         { return SharedKeySize } | ||||
| func (*scheme) CiphertextSize() int        { return CiphertextSize } | ||||
| func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } | ||||
| 
 | ||||
| func (sk *PrivateKey) Scheme() kem.Scheme { return sch } | ||||
| func (pk *PublicKey) Scheme() kem.Scheme  { return sch } | ||||
| 
 | ||||
| func (sk *PrivateKey) MarshalBinary() ([]byte, error) { | ||||
| 	var ret [PrivateKeySize]byte | ||||
| 	sk.Pack(ret[:]) | ||||
| 	return ret[:], nil | ||||
| } | ||||
| 
 | ||||
| func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { | ||||
| 	oth, ok := other.(*PrivateKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if sk.pk == nil && oth.pk == nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	if sk.pk == nil || oth.pk == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	if !bytes.Equal(sk.hpk[:], oth.hpk[:]) || | ||||
| 		!bytes.Equal(sk.z[:], oth.z[:]) { | ||||
| 		return false | ||||
| 	} | ||||
| 	return sk.sk.Equal(oth.sk) | ||||
| } | ||||
| 
 | ||||
| func (pk *PublicKey) Equal(other kem.PublicKey) bool { | ||||
| 	oth, ok := other.(*PublicKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if pk.pk == nil && oth.pk == nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	if pk.pk == nil || oth.pk == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	return bytes.Equal(pk.hpk[:], oth.hpk[:]) | ||||
| } | ||||
| 
 | ||||
| func (sk *PrivateKey) Public() kem.PublicKey { | ||||
| 	pk := new(PublicKey) | ||||
| 	pk.pk = sk.pk | ||||
| 	copy(pk.hpk[:], sk.hpk[:]) | ||||
| 	return pk | ||||
| } | ||||
| 
 | ||||
| func (pk *PublicKey) MarshalBinary() ([]byte, error) { | ||||
| 	var ret [PublicKeySize]byte | ||||
| 	pk.Pack(ret[:]) | ||||
| 	return ret[:], nil | ||||
| } | ||||
| 
 | ||||
| func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { | ||||
| 	return GenerateKeyPair(cryptoRand.Reader) | ||||
| } | ||||
| 
 | ||||
| func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { | ||||
| 	if len(seed) != KeySeedSize { | ||||
| 		panic(kem.ErrSeedSize) | ||||
| 	} | ||||
| 	return NewKeyFromSeed(seed[:]) | ||||
| } | ||||
| 
 | ||||
| func (*scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { | ||||
| 	ct = make([]byte, CiphertextSize) | ||||
| 	ss = make([]byte, SharedKeySize) | ||||
| 
 | ||||
| 	pub, ok := pk.(*PublicKey) | ||||
| 	if !ok { | ||||
| 		return nil, nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 	pub.EncapsulateTo(ct, ss, nil) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (*scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) ( | ||||
| 	ct, ss []byte, err error) { | ||||
| 	if len(seed) != EncapsulationSeedSize { | ||||
| 		return nil, nil, kem.ErrSeedSize | ||||
| 	} | ||||
| 
 | ||||
| 	ct = make([]byte, CiphertextSize) | ||||
| 	ss = make([]byte, SharedKeySize) | ||||
| 
 | ||||
| 	pub, ok := pk.(*PublicKey) | ||||
| 	if !ok { | ||||
| 		return nil, nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 	pub.EncapsulateTo(ct, ss, seed) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { | ||||
| 	if len(ct) != CiphertextSize { | ||||
| 		return nil, kem.ErrCiphertextSize | ||||
| 	} | ||||
| 
 | ||||
| 	priv, ok := sk.(*PrivateKey) | ||||
| 	if !ok { | ||||
| 		return nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 	ss := make([]byte, SharedKeySize) | ||||
| 	priv.DecapsulateTo(ss, ct) | ||||
| 	return ss, nil | ||||
| } | ||||
| 
 | ||||
| func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { | ||||
| 	if len(buf) != PublicKeySize { | ||||
| 		return nil, kem.ErrPubKeySize | ||||
| 	} | ||||
| 	var ret PublicKey | ||||
| 	ret.Unpack(buf) | ||||
| 	return &ret, nil | ||||
| } | ||||
| 
 | ||||
| func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { | ||||
| 	if len(buf) != PrivateKeySize { | ||||
| 		return nil, kem.ErrPrivKeySize | ||||
| 	} | ||||
| 	var ret PrivateKey | ||||
| 	ret.Unpack(buf) | ||||
| 	return &ret, nil | ||||
| } | ||||
|  | @ -1,402 +0,0 @@ | |||
| // Code generated from pkg.templ.go. DO NOT EDIT.
 | ||||
| 
 | ||||
| // Package kyber768 implements the IND-CCA2 secure key encapsulation mechanism
 | ||||
| // Kyber768.CCAKEM as submitted to round 3 of the NIST PQC competition and
 | ||||
| // described in
 | ||||
| //
 | ||||
| // https://pq-crystals.org/kyber/data/kyber-specification-round3.pdf
 | ||||
| package kyber768 | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto/subtle" | ||||
| 	"io" | ||||
| 
 | ||||
| 	cryptoRand "crypto/rand" | ||||
| 	"github.com/cloudflare/circl/internal/sha3" | ||||
| 	"github.com/cloudflare/circl/kem" | ||||
| 	cpapke "github.com/cloudflare/circl/pke/kyber/kyber768" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// Size of seed for NewKeyFromSeed
 | ||||
| 	KeySeedSize = cpapke.KeySeedSize + 32 | ||||
| 
 | ||||
| 	// Size of seed for EncapsulateTo.
 | ||||
| 	EncapsulationSeedSize = 32 | ||||
| 
 | ||||
| 	// Size of the established shared key.
 | ||||
| 	SharedKeySize = 32 | ||||
| 
 | ||||
| 	// Size of the encapsulated shared key.
 | ||||
| 	CiphertextSize = cpapke.CiphertextSize | ||||
| 
 | ||||
| 	// Size of a packed public key.
 | ||||
| 	PublicKeySize = cpapke.PublicKeySize | ||||
| 
 | ||||
| 	// Size of a packed private key.
 | ||||
| 	PrivateKeySize = cpapke.PrivateKeySize + cpapke.PublicKeySize + 64 | ||||
| ) | ||||
| 
 | ||||
| // Type of a Kyber768.CCAKEM public key
 | ||||
| type PublicKey struct { | ||||
| 	pk *cpapke.PublicKey | ||||
| 
 | ||||
| 	hpk [32]byte // H(pk)
 | ||||
| } | ||||
| 
 | ||||
| // Type of a Kyber768.CCAKEM private key
 | ||||
| type PrivateKey struct { | ||||
| 	sk  *cpapke.PrivateKey | ||||
| 	pk  *cpapke.PublicKey | ||||
| 	hpk [32]byte // H(pk)
 | ||||
| 	z   [32]byte | ||||
| } | ||||
| 
 | ||||
| // NewKeyFromSeed derives a public/private keypair deterministically
 | ||||
| // from the given seed.
 | ||||
| //
 | ||||
| // Panics if seed is not of length KeySeedSize.
 | ||||
| func NewKeyFromSeed(seed []byte) (*PublicKey, *PrivateKey) { | ||||
| 	var sk PrivateKey | ||||
| 	var pk PublicKey | ||||
| 
 | ||||
| 	if len(seed) != KeySeedSize { | ||||
| 		panic("seed must be of length KeySeedSize") | ||||
| 	} | ||||
| 
 | ||||
| 	pk.pk, sk.sk = cpapke.NewKeyFromSeed(seed[:cpapke.KeySeedSize]) | ||||
| 	sk.pk = pk.pk | ||||
| 	copy(sk.z[:], seed[cpapke.KeySeedSize:]) | ||||
| 
 | ||||
| 	// Compute H(pk)
 | ||||
| 	var ppk [cpapke.PublicKeySize]byte | ||||
| 	sk.pk.Pack(ppk[:]) | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(ppk[:]) | ||||
| 	h.Read(sk.hpk[:]) | ||||
| 	copy(pk.hpk[:], sk.hpk[:]) | ||||
| 
 | ||||
| 	return &pk, &sk | ||||
| } | ||||
| 
 | ||||
| // GenerateKeyPair generates public and private keys using entropy from rand.
 | ||||
| // If rand is nil, crypto/rand.Reader will be used.
 | ||||
| func GenerateKeyPair(rand io.Reader) (*PublicKey, *PrivateKey, error) { | ||||
| 	var seed [KeySeedSize]byte | ||||
| 	if rand == nil { | ||||
| 		rand = cryptoRand.Reader | ||||
| 	} | ||||
| 	_, err := io.ReadFull(rand, seed[:]) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 	pk, sk := NewKeyFromSeed(seed[:]) | ||||
| 	return pk, sk, nil | ||||
| } | ||||
| 
 | ||||
| // EncapsulateTo generates a shared key and ciphertext that contains it
 | ||||
| // for the public key using randomness from seed and writes the shared key
 | ||||
| // to ss and ciphertext to ct.
 | ||||
| //
 | ||||
| // Panics if ss, ct or seed are not of length SharedKeySize, CiphertextSize
 | ||||
| // and EncapsulationSeedSize respectively.
 | ||||
| //
 | ||||
| // seed may be nil, in which case crypto/rand.Reader is used to generate one.
 | ||||
| func (pk *PublicKey) EncapsulateTo(ct, ss []byte, seed []byte) { | ||||
| 	if seed == nil { | ||||
| 		seed = make([]byte, EncapsulationSeedSize) | ||||
| 		cryptoRand.Read(seed[:]) | ||||
| 	} else { | ||||
| 		if len(seed) != EncapsulationSeedSize { | ||||
| 			panic("seed must be of length EncapsulationSeedSize") | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if len(ct) != CiphertextSize { | ||||
| 		panic("ct must be of length CiphertextSize") | ||||
| 	} | ||||
| 
 | ||||
| 	if len(ss) != SharedKeySize { | ||||
| 		panic("ss must be of length SharedKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	// m = H(seed)
 | ||||
| 	var m [32]byte | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(seed[:]) | ||||
| 	h.Read(m[:]) | ||||
| 
 | ||||
| 	// (K', r) = G(m ‖ H(pk))
 | ||||
| 	var kr [64]byte | ||||
| 	g := sha3.New512() | ||||
| 	g.Write(m[:]) | ||||
| 	g.Write(pk.hpk[:]) | ||||
| 	g.Read(kr[:]) | ||||
| 
 | ||||
| 	// c = Kyber.CPAPKE.Enc(pk, m, r)
 | ||||
| 	pk.pk.EncryptTo(ct, m[:], kr[32:]) | ||||
| 
 | ||||
| 	// Compute H(c) and put in second slot of kr, which will be (K', H(c)).
 | ||||
| 	h.Reset() | ||||
| 	h.Write(ct[:CiphertextSize]) | ||||
| 	h.Read(kr[32:]) | ||||
| 
 | ||||
| 	// K = KDF(K' ‖ H(c))
 | ||||
| 	kdf := sha3.NewShake256() | ||||
| 	kdf.Write(kr[:]) | ||||
| 	kdf.Read(ss[:SharedKeySize]) | ||||
| } | ||||
| 
 | ||||
| // DecapsulateTo computes the shared key which is encapsulated in ct
 | ||||
| // for the private key.
 | ||||
| //
 | ||||
| // Panics if ct or ss are not of length CiphertextSize and SharedKeySize
 | ||||
| // respectively.
 | ||||
| func (sk *PrivateKey) DecapsulateTo(ss, ct []byte) { | ||||
| 	if len(ct) != CiphertextSize { | ||||
| 		panic("ct must be of length CiphertextSize") | ||||
| 	} | ||||
| 
 | ||||
| 	if len(ss) != SharedKeySize { | ||||
| 		panic("ss must be of length SharedKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	// m' = Kyber.CPAPKE.Dec(sk, ct)
 | ||||
| 	var m2 [32]byte | ||||
| 	sk.sk.DecryptTo(m2[:], ct) | ||||
| 
 | ||||
| 	// (K'', r') = G(m' ‖ H(pk))
 | ||||
| 	var kr2 [64]byte | ||||
| 	g := sha3.New512() | ||||
| 	g.Write(m2[:]) | ||||
| 	g.Write(sk.hpk[:]) | ||||
| 	g.Read(kr2[:]) | ||||
| 
 | ||||
| 	// c' = Kyber.CPAPKE.Enc(pk, m', r')
 | ||||
| 	var ct2 [CiphertextSize]byte | ||||
| 	sk.pk.EncryptTo(ct2[:], m2[:], kr2[32:]) | ||||
| 
 | ||||
| 	// Compute H(c) and put in second slot of kr2, which will be (K'', H(c)).
 | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(ct[:CiphertextSize]) | ||||
| 	h.Read(kr2[32:]) | ||||
| 
 | ||||
| 	// Replace K'' by  z in the first slot of kr2 if c ≠ c'.
 | ||||
| 	subtle.ConstantTimeCopy( | ||||
| 		1-subtle.ConstantTimeCompare(ct, ct2[:]), | ||||
| 		kr2[:32], | ||||
| 		sk.z[:], | ||||
| 	) | ||||
| 
 | ||||
| 	// K = KDF(K''/z, H(c))
 | ||||
| 	kdf := sha3.NewShake256() | ||||
| 	kdf.Write(kr2[:]) | ||||
| 	kdf.Read(ss[:SharedKeySize]) | ||||
| } | ||||
| 
 | ||||
| // Packs sk to buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PrivateKeySize.
 | ||||
| func (sk *PrivateKey) Pack(buf []byte) { | ||||
| 	if len(buf) != PrivateKeySize { | ||||
| 		panic("buf must be of length PrivateKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	sk.sk.Pack(buf[:cpapke.PrivateKeySize]) | ||||
| 	buf = buf[cpapke.PrivateKeySize:] | ||||
| 	sk.pk.Pack(buf[:cpapke.PublicKeySize]) | ||||
| 	buf = buf[cpapke.PublicKeySize:] | ||||
| 	copy(buf, sk.hpk[:]) | ||||
| 	buf = buf[32:] | ||||
| 	copy(buf, sk.z[:]) | ||||
| } | ||||
| 
 | ||||
| // Unpacks sk from buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PrivateKeySize.
 | ||||
| func (sk *PrivateKey) Unpack(buf []byte) { | ||||
| 	if len(buf) != PrivateKeySize { | ||||
| 		panic("buf must be of length PrivateKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	sk.sk = new(cpapke.PrivateKey) | ||||
| 	sk.sk.Unpack(buf[:cpapke.PrivateKeySize]) | ||||
| 	buf = buf[cpapke.PrivateKeySize:] | ||||
| 	sk.pk = new(cpapke.PublicKey) | ||||
| 	sk.pk.Unpack(buf[:cpapke.PublicKeySize]) | ||||
| 	buf = buf[cpapke.PublicKeySize:] | ||||
| 	copy(sk.hpk[:], buf[:32]) | ||||
| 	copy(sk.z[:], buf[32:]) | ||||
| } | ||||
| 
 | ||||
| // Packs pk to buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PublicKeySize.
 | ||||
| func (pk *PublicKey) Pack(buf []byte) { | ||||
| 	if len(buf) != PublicKeySize { | ||||
| 		panic("buf must be of length PublicKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	pk.pk.Pack(buf) | ||||
| } | ||||
| 
 | ||||
| // Unpacks pk from buf.
 | ||||
| //
 | ||||
| // Panics if buf is not of size PublicKeySize.
 | ||||
| func (pk *PublicKey) Unpack(buf []byte) { | ||||
| 	if len(buf) != PublicKeySize { | ||||
| 		panic("buf must be of length PublicKeySize") | ||||
| 	} | ||||
| 
 | ||||
| 	pk.pk = new(cpapke.PublicKey) | ||||
| 	pk.pk.Unpack(buf) | ||||
| 
 | ||||
| 	// Compute cached H(pk)
 | ||||
| 	h := sha3.New256() | ||||
| 	h.Write(buf) | ||||
| 	h.Read(pk.hpk[:]) | ||||
| } | ||||
| 
 | ||||
| // Boilerplate down below for the KEM scheme API.
 | ||||
| 
 | ||||
| type scheme struct{} | ||||
| 
 | ||||
| var sch kem.Scheme = &scheme{} | ||||
| 
 | ||||
| // Scheme returns a KEM interface.
 | ||||
| func Scheme() kem.Scheme { return sch } | ||||
| 
 | ||||
| func (*scheme) Name() string               { return "Kyber768" } | ||||
| func (*scheme) PublicKeySize() int         { return PublicKeySize } | ||||
| func (*scheme) PrivateKeySize() int        { return PrivateKeySize } | ||||
| func (*scheme) SeedSize() int              { return KeySeedSize } | ||||
| func (*scheme) SharedKeySize() int         { return SharedKeySize } | ||||
| func (*scheme) CiphertextSize() int        { return CiphertextSize } | ||||
| func (*scheme) EncapsulationSeedSize() int { return EncapsulationSeedSize } | ||||
| 
 | ||||
| func (sk *PrivateKey) Scheme() kem.Scheme { return sch } | ||||
| func (pk *PublicKey) Scheme() kem.Scheme  { return sch } | ||||
| 
 | ||||
| func (sk *PrivateKey) MarshalBinary() ([]byte, error) { | ||||
| 	var ret [PrivateKeySize]byte | ||||
| 	sk.Pack(ret[:]) | ||||
| 	return ret[:], nil | ||||
| } | ||||
| 
 | ||||
| func (sk *PrivateKey) Equal(other kem.PrivateKey) bool { | ||||
| 	oth, ok := other.(*PrivateKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if sk.pk == nil && oth.pk == nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	if sk.pk == nil || oth.pk == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	if !bytes.Equal(sk.hpk[:], oth.hpk[:]) || | ||||
| 		!bytes.Equal(sk.z[:], oth.z[:]) { | ||||
| 		return false | ||||
| 	} | ||||
| 	return sk.sk.Equal(oth.sk) | ||||
| } | ||||
| 
 | ||||
| func (pk *PublicKey) Equal(other kem.PublicKey) bool { | ||||
| 	oth, ok := other.(*PublicKey) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	if pk.pk == nil && oth.pk == nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	if pk.pk == nil || oth.pk == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	return bytes.Equal(pk.hpk[:], oth.hpk[:]) | ||||
| } | ||||
| 
 | ||||
| func (sk *PrivateKey) Public() kem.PublicKey { | ||||
| 	pk := new(PublicKey) | ||||
| 	pk.pk = sk.pk | ||||
| 	copy(pk.hpk[:], sk.hpk[:]) | ||||
| 	return pk | ||||
| } | ||||
| 
 | ||||
| func (pk *PublicKey) MarshalBinary() ([]byte, error) { | ||||
| 	var ret [PublicKeySize]byte | ||||
| 	pk.Pack(ret[:]) | ||||
| 	return ret[:], nil | ||||
| } | ||||
| 
 | ||||
| func (*scheme) GenerateKeyPair() (kem.PublicKey, kem.PrivateKey, error) { | ||||
| 	return GenerateKeyPair(cryptoRand.Reader) | ||||
| } | ||||
| 
 | ||||
| func (*scheme) DeriveKeyPair(seed []byte) (kem.PublicKey, kem.PrivateKey) { | ||||
| 	if len(seed) != KeySeedSize { | ||||
| 		panic(kem.ErrSeedSize) | ||||
| 	} | ||||
| 	return NewKeyFromSeed(seed[:]) | ||||
| } | ||||
| 
 | ||||
| func (*scheme) Encapsulate(pk kem.PublicKey) (ct, ss []byte, err error) { | ||||
| 	ct = make([]byte, CiphertextSize) | ||||
| 	ss = make([]byte, SharedKeySize) | ||||
| 
 | ||||
| 	pub, ok := pk.(*PublicKey) | ||||
| 	if !ok { | ||||
| 		return nil, nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 	pub.EncapsulateTo(ct, ss, nil) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (*scheme) EncapsulateDeterministically(pk kem.PublicKey, seed []byte) ( | ||||
| 	ct, ss []byte, err error) { | ||||
| 	if len(seed) != EncapsulationSeedSize { | ||||
| 		return nil, nil, kem.ErrSeedSize | ||||
| 	} | ||||
| 
 | ||||
| 	ct = make([]byte, CiphertextSize) | ||||
| 	ss = make([]byte, SharedKeySize) | ||||
| 
 | ||||
| 	pub, ok := pk.(*PublicKey) | ||||
| 	if !ok { | ||||
| 		return nil, nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 	pub.EncapsulateTo(ct, ss, seed) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (*scheme) Decapsulate(sk kem.PrivateKey, ct []byte) ([]byte, error) { | ||||
| 	if len(ct) != CiphertextSize { | ||||
| 		return nil, kem.ErrCiphertextSize | ||||
| 	} | ||||
| 
 | ||||
| 	priv, ok := sk.(*PrivateKey) | ||||
| 	if !ok { | ||||
| 		return nil, kem.ErrTypeMismatch | ||||
| 	} | ||||
| 	ss := make([]byte, SharedKeySize) | ||||
| 	priv.DecapsulateTo(ss, ct) | ||||
| 	return ss, nil | ||||
| } | ||||
| 
 | ||||
| func (*scheme) UnmarshalBinaryPublicKey(buf []byte) (kem.PublicKey, error) { | ||||
| 	if len(buf) != PublicKeySize { | ||||
| 		return nil, kem.ErrPubKeySize | ||||
| 	} | ||||
| 	var ret PublicKey | ||||
| 	ret.Unpack(buf) | ||||
| 	return &ret, nil | ||||
| } | ||||
| 
 | ||||
| func (*scheme) UnmarshalBinaryPrivateKey(buf []byte) (kem.PrivateKey, error) { | ||||
| 	if len(buf) != PrivateKeySize { | ||||
| 		return nil, kem.ErrPrivKeySize | ||||
| 	} | ||||
| 	var ret PrivateKey | ||||
| 	ret.Unpack(buf) | ||||
| 	return &ret, nil | ||||
| } | ||||
|  | @ -1,205 +0,0 @@ | |||
| // Package fp25519 provides prime field arithmetic over GF(2^255-19).
 | ||||
| package fp25519 | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 
 | ||||
| 	"github.com/cloudflare/circl/internal/conv" | ||||
| ) | ||||
| 
 | ||||
| // Size in bytes of an element.
 | ||||
| const Size = 32 | ||||
| 
 | ||||
| // Elt is a prime field element.
 | ||||
| type Elt [Size]byte | ||||
| 
 | ||||
| func (e Elt) String() string { return conv.BytesLe2Hex(e[:]) } | ||||
| 
 | ||||
| // p is the prime modulus 2^255-19.
 | ||||
| var p = Elt{ | ||||
| 	0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||||
| 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, | ||||
| } | ||||
| 
 | ||||
| // P returns the prime modulus 2^255-19.
 | ||||
| func P() Elt { return p } | ||||
| 
 | ||||
| // ToBytes stores in b the little-endian byte representation of x.
 | ||||
| func ToBytes(b []byte, x *Elt) error { | ||||
| 	if len(b) != Size { | ||||
| 		return errors.New("wrong size") | ||||
| 	} | ||||
| 	Modp(x) | ||||
| 	copy(b, x[:]) | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // IsZero returns true if x is equal to 0.
 | ||||
| func IsZero(x *Elt) bool { Modp(x); return *x == Elt{} } | ||||
| 
 | ||||
| // SetOne assigns x=1.
 | ||||
| func SetOne(x *Elt) { *x = Elt{}; x[0] = 1 } | ||||
| 
 | ||||
| // Neg calculates z = -x.
 | ||||
| func Neg(z, x *Elt) { Sub(z, &p, x) } | ||||
| 
 | ||||
| // InvSqrt calculates z = sqrt(x/y) iff x/y is a quadratic-residue, which is
 | ||||
| // indicated by returning isQR = true. Otherwise, when x/y is a quadratic
 | ||||
| // non-residue, z will have an undetermined value and isQR = false.
 | ||||
| func InvSqrt(z, x, y *Elt) (isQR bool) { | ||||
| 	sqrtMinusOne := &Elt{ | ||||
| 		0xb0, 0xa0, 0x0e, 0x4a, 0x27, 0x1b, 0xee, 0xc4, | ||||
| 		0x78, 0xe4, 0x2f, 0xad, 0x06, 0x18, 0x43, 0x2f, | ||||
| 		0xa7, 0xd7, 0xfb, 0x3d, 0x99, 0x00, 0x4d, 0x2b, | ||||
| 		0x0b, 0xdf, 0xc1, 0x4f, 0x80, 0x24, 0x83, 0x2b, | ||||
| 	} | ||||
| 	t0, t1, t2, t3 := &Elt{}, &Elt{}, &Elt{}, &Elt{} | ||||
| 
 | ||||
| 	Mul(t0, x, y)   // t0 = u*v
 | ||||
| 	Sqr(t1, y)      // t1 = v^2
 | ||||
| 	Mul(t2, t0, t1) // t2 = u*v^3
 | ||||
| 	Sqr(t0, t1)     // t0 = v^4
 | ||||
| 	Mul(t1, t0, t2) // t1 = u*v^7
 | ||||
| 
 | ||||
| 	var Tab [4]*Elt | ||||
| 	Tab[0] = &Elt{} | ||||
| 	Tab[1] = &Elt{} | ||||
| 	Tab[2] = t3 | ||||
| 	Tab[3] = t1 | ||||
| 
 | ||||
| 	*Tab[0] = *t1 | ||||
| 	Sqr(Tab[0], Tab[0]) | ||||
| 	Sqr(Tab[1], Tab[0]) | ||||
| 	Sqr(Tab[1], Tab[1]) | ||||
| 	Mul(Tab[1], Tab[1], Tab[3]) | ||||
| 	Mul(Tab[0], Tab[0], Tab[1]) | ||||
| 	Sqr(Tab[0], Tab[0]) | ||||
| 	Mul(Tab[0], Tab[0], Tab[1]) | ||||
| 	Sqr(Tab[1], Tab[0]) | ||||
| 	for i := 0; i < 4; i++ { | ||||
| 		Sqr(Tab[1], Tab[1]) | ||||
| 	} | ||||
| 	Mul(Tab[1], Tab[1], Tab[0]) | ||||
| 	Sqr(Tab[2], Tab[1]) | ||||
| 	for i := 0; i < 4; i++ { | ||||
| 		Sqr(Tab[2], Tab[2]) | ||||
| 	} | ||||
| 	Mul(Tab[2], Tab[2], Tab[0]) | ||||
| 	Sqr(Tab[1], Tab[2]) | ||||
| 	for i := 0; i < 14; i++ { | ||||
| 		Sqr(Tab[1], Tab[1]) | ||||
| 	} | ||||
| 	Mul(Tab[1], Tab[1], Tab[2]) | ||||
| 	Sqr(Tab[2], Tab[1]) | ||||
| 	for i := 0; i < 29; i++ { | ||||
| 		Sqr(Tab[2], Tab[2]) | ||||
| 	} | ||||
| 	Mul(Tab[2], Tab[2], Tab[1]) | ||||
| 	Sqr(Tab[1], Tab[2]) | ||||
| 	for i := 0; i < 59; i++ { | ||||
| 		Sqr(Tab[1], Tab[1]) | ||||
| 	} | ||||
| 	Mul(Tab[1], Tab[1], Tab[2]) | ||||
| 	for i := 0; i < 5; i++ { | ||||
| 		Sqr(Tab[1], Tab[1]) | ||||
| 	} | ||||
| 	Mul(Tab[1], Tab[1], Tab[0]) | ||||
| 	Sqr(Tab[2], Tab[1]) | ||||
| 	for i := 0; i < 124; i++ { | ||||
| 		Sqr(Tab[2], Tab[2]) | ||||
| 	} | ||||
| 	Mul(Tab[2], Tab[2], Tab[1]) | ||||
| 	Sqr(Tab[2], Tab[2]) | ||||
| 	Sqr(Tab[2], Tab[2]) | ||||
| 	Mul(Tab[2], Tab[2], Tab[3]) | ||||
| 
 | ||||
| 	Mul(z, t3, t2) // z = xy^(p+3)/8 = xy^3*(xy^7)^(p-5)/8
 | ||||
| 	// Checking whether y z^2 == x
 | ||||
| 	Sqr(t0, z)     // t0 = z^2
 | ||||
| 	Mul(t0, t0, y) // t0 = yz^2
 | ||||
| 	Sub(t1, t0, x) // t1 = t0-u
 | ||||
| 	Add(t2, t0, x) // t2 = t0+u
 | ||||
| 	if IsZero(t1) { | ||||
| 		return true | ||||
| 	} else if IsZero(t2) { | ||||
| 		Mul(z, z, sqrtMinusOne) // z = z*sqrt(-1)
 | ||||
| 		return true | ||||
| 	} else { | ||||
| 		return false | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Inv calculates z = 1/x mod p.
 | ||||
| func Inv(z, x *Elt) { | ||||
| 	x0, x1, x2 := &Elt{}, &Elt{}, &Elt{} | ||||
| 	Sqr(x1, x) | ||||
| 	Sqr(x0, x1) | ||||
| 	Sqr(x0, x0) | ||||
| 	Mul(x0, x0, x) | ||||
| 	Mul(z, x0, x1) | ||||
| 	Sqr(x1, z) | ||||
| 	Mul(x0, x0, x1) | ||||
| 	Sqr(x1, x0) | ||||
| 	for i := 0; i < 4; i++ { | ||||
| 		Sqr(x1, x1) | ||||
| 	} | ||||
| 	Mul(x0, x0, x1) | ||||
| 	Sqr(x1, x0) | ||||
| 	for i := 0; i < 9; i++ { | ||||
| 		Sqr(x1, x1) | ||||
| 	} | ||||
| 	Mul(x1, x1, x0) | ||||
| 	Sqr(x2, x1) | ||||
| 	for i := 0; i < 19; i++ { | ||||
| 		Sqr(x2, x2) | ||||
| 	} | ||||
| 	Mul(x2, x2, x1) | ||||
| 	for i := 0; i < 10; i++ { | ||||
| 		Sqr(x2, x2) | ||||
| 	} | ||||
| 	Mul(x2, x2, x0) | ||||
| 	Sqr(x0, x2) | ||||
| 	for i := 0; i < 49; i++ { | ||||
| 		Sqr(x0, x0) | ||||
| 	} | ||||
| 	Mul(x0, x0, x2) | ||||
| 	Sqr(x1, x0) | ||||
| 	for i := 0; i < 99; i++ { | ||||
| 		Sqr(x1, x1) | ||||
| 	} | ||||
| 	Mul(x1, x1, x0) | ||||
| 	for i := 0; i < 50; i++ { | ||||
| 		Sqr(x1, x1) | ||||
| 	} | ||||
| 	Mul(x1, x1, x2) | ||||
| 	for i := 0; i < 5; i++ { | ||||
| 		Sqr(x1, x1) | ||||
| 	} | ||||
| 	Mul(z, z, x1) | ||||
| } | ||||
| 
 | ||||
| // Cmov assigns y to x if n is 1.
 | ||||
| func Cmov(x, y *Elt, n uint) { cmov(x, y, n) } | ||||
| 
 | ||||
| // Cswap interchanges x and y if n is 1.
 | ||||
| func Cswap(x, y *Elt, n uint) { cswap(x, y, n) } | ||||
| 
 | ||||
| // Add calculates z = x+y mod p.
 | ||||
| func Add(z, x, y *Elt) { add(z, x, y) } | ||||
| 
 | ||||
| // Sub calculates z = x-y mod p.
 | ||||
| func Sub(z, x, y *Elt) { sub(z, x, y) } | ||||
| 
 | ||||
| // AddSub calculates (x,y) = (x+y mod p, x-y mod p).
 | ||||
| func AddSub(x, y *Elt) { addsub(x, y) } | ||||
| 
 | ||||
| // Mul calculates z = x*y mod p.
 | ||||
| func Mul(z, x, y *Elt) { mul(z, x, y) } | ||||
| 
 | ||||
| // Sqr calculates z = x^2 mod p.
 | ||||
| func Sqr(z, x *Elt) { sqr(z, x) } | ||||
| 
 | ||||
| // Modp ensures that z is between [0,p-1].
 | ||||
| func Modp(z *Elt) { modp(z) } | ||||
|  | @ -1,45 +0,0 @@ | |||
| //go:build amd64 && !purego
 | ||||
| // +build amd64,!purego
 | ||||
| 
 | ||||
| package fp25519 | ||||
| 
 | ||||
| import ( | ||||
| 	"golang.org/x/sys/cpu" | ||||
| ) | ||||
| 
 | ||||
| var hasBmi2Adx = cpu.X86.HasBMI2 && cpu.X86.HasADX | ||||
| 
 | ||||
| var _ = hasBmi2Adx | ||||
| 
 | ||||
| func cmov(x, y *Elt, n uint)  { cmovAmd64(x, y, n) } | ||||
| func cswap(x, y *Elt, n uint) { cswapAmd64(x, y, n) } | ||||
| func add(z, x, y *Elt)        { addAmd64(z, x, y) } | ||||
| func sub(z, x, y *Elt)        { subAmd64(z, x, y) } | ||||
| func addsub(x, y *Elt)        { addsubAmd64(x, y) } | ||||
| func mul(z, x, y *Elt)        { mulAmd64(z, x, y) } | ||||
| func sqr(z, x *Elt)           { sqrAmd64(z, x) } | ||||
| func modp(z *Elt)             { modpAmd64(z) } | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func cmovAmd64(x, y *Elt, n uint) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func cswapAmd64(x, y *Elt, n uint) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func addAmd64(z, x, y *Elt) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func subAmd64(z, x, y *Elt) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func addsubAmd64(x, y *Elt) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func mulAmd64(z, x, y *Elt) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func sqrAmd64(z, x *Elt) | ||||
| 
 | ||||
| //go:noescape
 | ||||
| func modpAmd64(z *Elt) | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue