From ea3524614d7dd95b3e02a47cab57a5b29b684ab5 Mon Sep 17 00:00:00 2001 From: ston1th Date: Mon, 15 Apr 2024 00:47:09 +0200 Subject: [PATCH] added encryption --- go.mod | 2 + go.sum | 44 + stego.go | 276 +- testdata/encrypted.png | Bin 0 -> 630009 bytes vendor/golang.org/x/crypto/LICENSE | 27 + vendor/golang.org/x/crypto/PATENTS | 22 + .../x/crypto/chacha20/chacha_arm64.go | 16 + .../x/crypto/chacha20/chacha_arm64.s | 307 ++ .../x/crypto/chacha20/chacha_generic.go | 398 +++ .../x/crypto/chacha20/chacha_noasm.go | 13 + .../x/crypto/chacha20/chacha_ppc64le.go | 16 + .../x/crypto/chacha20/chacha_ppc64le.s | 443 +++ .../x/crypto/chacha20/chacha_s390x.go | 27 + .../x/crypto/chacha20/chacha_s390x.s | 224 ++ vendor/golang.org/x/crypto/chacha20/xor.go | 42 + .../chacha20poly1305/chacha20poly1305.go | 98 + .../chacha20poly1305_amd64.go | 86 + .../chacha20poly1305/chacha20poly1305_amd64.s | 2715 +++++++++++++++++ .../chacha20poly1305_generic.go | 81 + .../chacha20poly1305_noasm.go | 15 + .../chacha20poly1305/xchacha20poly1305.go | 86 + vendor/golang.org/x/crypto/hkdf/hkdf.go | 95 + .../x/crypto/internal/alias/alias.go | 31 + .../x/crypto/internal/alias/alias_purego.go | 34 + .../x/crypto/internal/poly1305/mac_noasm.go | 9 + .../x/crypto/internal/poly1305/poly1305.go | 99 + .../x/crypto/internal/poly1305/sum_amd64.go | 47 + .../x/crypto/internal/poly1305/sum_amd64.s | 108 + .../x/crypto/internal/poly1305/sum_generic.go | 312 ++ .../x/crypto/internal/poly1305/sum_ppc64le.go | 47 + .../x/crypto/internal/poly1305/sum_ppc64le.s | 179 ++ .../x/crypto/internal/poly1305/sum_s390x.go | 76 + .../x/crypto/internal/poly1305/sum_s390x.s | 503 +++ vendor/golang.org/x/sys/LICENSE | 27 + vendor/golang.org/x/sys/PATENTS | 22 + vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s | 17 + vendor/golang.org/x/sys/cpu/byteorder.go | 66 + vendor/golang.org/x/sys/cpu/cpu.go | 290 ++ vendor/golang.org/x/sys/cpu/cpu_aix.go | 33 + vendor/golang.org/x/sys/cpu/cpu_arm.go | 73 + vendor/golang.org/x/sys/cpu/cpu_arm64.go | 172 ++ vendor/golang.org/x/sys/cpu/cpu_arm64.s | 31 + vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 11 + vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go | 21 + vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 15 + .../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 11 + .../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 22 + vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c | 37 + vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go | 31 + vendor/golang.org/x/sys/cpu/cpu_linux.go | 15 + vendor/golang.org/x/sys/cpu/cpu_linux_arm.go | 39 + .../golang.org/x/sys/cpu/cpu_linux_arm64.go | 111 + .../golang.org/x/sys/cpu/cpu_linux_mips64x.go | 22 + .../golang.org/x/sys/cpu/cpu_linux_noinit.go | 9 + .../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 30 + .../golang.org/x/sys/cpu/cpu_linux_s390x.go | 40 + vendor/golang.org/x/sys/cpu/cpu_loong64.go | 12 + vendor/golang.org/x/sys/cpu/cpu_mips64x.go | 15 + vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 11 + .../golang.org/x/sys/cpu/cpu_netbsd_arm64.go | 173 ++ .../golang.org/x/sys/cpu/cpu_openbsd_arm64.go | 65 + .../golang.org/x/sys/cpu/cpu_openbsd_arm64.s | 11 + vendor/golang.org/x/sys/cpu/cpu_other_arm.go | 9 + .../golang.org/x/sys/cpu/cpu_other_arm64.go | 9 + .../golang.org/x/sys/cpu/cpu_other_mips64x.go | 11 + .../golang.org/x/sys/cpu/cpu_other_ppc64x.go | 12 + .../golang.org/x/sys/cpu/cpu_other_riscv64.go | 11 + vendor/golang.org/x/sys/cpu/cpu_ppc64x.go | 16 + vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 11 + vendor/golang.org/x/sys/cpu/cpu_s390x.go | 172 ++ vendor/golang.org/x/sys/cpu/cpu_s390x.s | 57 + vendor/golang.org/x/sys/cpu/cpu_wasm.go | 17 + vendor/golang.org/x/sys/cpu/cpu_x86.go | 151 + vendor/golang.org/x/sys/cpu/cpu_x86.s | 26 + vendor/golang.org/x/sys/cpu/cpu_zos.go | 10 + vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go | 25 + vendor/golang.org/x/sys/cpu/endian_big.go | 10 + vendor/golang.org/x/sys/cpu/endian_little.go | 10 + vendor/golang.org/x/sys/cpu/hwcap_linux.go | 71 + vendor/golang.org/x/sys/cpu/parse.go | 43 + .../x/sys/cpu/proc_cpuinfo_linux.go | 53 + vendor/golang.org/x/sys/cpu/runtime_auxv.go | 16 + .../x/sys/cpu/runtime_auxv_go121.go | 18 + .../golang.org/x/sys/cpu/syscall_aix_gccgo.go | 26 + .../x/sys/cpu/syscall_aix_ppc64_gc.go | 35 + vendor/modules.txt | 9 + 86 files changed, 8704 insertions(+), 34 deletions(-) create mode 100644 go.sum create mode 100644 testdata/encrypted.png create mode 100644 vendor/golang.org/x/crypto/LICENSE create mode 100644 vendor/golang.org/x/crypto/PATENTS create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_arm64.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_arm64.s create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_generic.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_noasm.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_s390x.go create mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_s390x.s create mode 100644 vendor/golang.org/x/crypto/chacha20/xor.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go create mode 100644 vendor/golang.org/x/crypto/hkdf/hkdf.go create mode 100644 vendor/golang.org/x/crypto/internal/alias/alias.go create mode 100644 vendor/golang.org/x/crypto/internal/alias/alias_purego.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/poly1305.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go create mode 100644 vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s create mode 100644 vendor/golang.org/x/sys/LICENSE create mode 100644 vendor/golang.org/x/sys/PATENTS create mode 100644 vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s create mode 100644 vendor/golang.org/x/sys/cpu/byteorder.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_aix.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_loong64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mipsx.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_riscv64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_wasm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_zos.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/endian_big.go create mode 100644 vendor/golang.org/x/sys/cpu/endian_little.go create mode 100644 vendor/golang.org/x/sys/cpu/hwcap_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/parse.go create mode 100644 vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/runtime_auxv.go create mode 100644 vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go create mode 100644 vendor/modules.txt diff --git a/go.mod b/go.mod index c413313..ba0c715 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module main go 1.14 + +require golang.org/x/crypto v0.22.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b620d97 --- /dev/null +++ b/go.sum @@ -0,0 +1,44 @@ +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/stego.go b/stego.go index c45df43..8011dc0 100644 --- a/stego.go +++ b/stego.go @@ -3,7 +3,11 @@ package main import ( + "crypto/cipher" + "crypto/rand" + "crypto/sha256" "encoding/binary" + "encoding/hex" "errors" "flag" "fmt" @@ -12,55 +16,221 @@ import ( _ "image/gif" _ "image/jpeg" "image/png" - "io/ioutil" + "io" + "math" "os" + + "golang.org/x/crypto/chacha20" + "golang.org/x/crypto/chacha20poly1305" + "golang.org/x/crypto/hkdf" ) -const offset = 4 +const ( + KeySize = chacha20poly1305.KeySize + NonceSize = chacha20poly1305.NonceSize + Overhead = chacha20poly1305.Overhead + + ChunkSize = 512 + FullSize = ChunkSize + Overhead +) + +func deriveKey(key, nonce []byte, info string, length int) (k []byte) { + h := hkdf.New(sha256.New, key, nonce, []byte(info)) + k = make([]byte, length) + if _, err := io.ReadFull(h, k); err != nil { + panic("crypto: internal error: failed to read from HKDF: " + err.Error()) + } + return +} + +const encodedSizeLen = 4 func encodeLen(l int) []byte { - b := make([]byte, offset) + b := make([]byte, encodedSizeLen) binary.LittleEndian.PutUint32(b, uint32(l)) return b } -func getLen(p image.Image) int { - z := make([]byte, offset) - for i := 0; i < offset; i++ { - pix := color.NRGBAModel.Convert(p.At(i, 0)).(color.NRGBA) - z[i] = (pix.R << 6) - z[i] |= (pix.G << 6) >> 2 - z[i] |= (pix.B << 6) >> 4 - z[i] |= (pix.A << 6) >> 6 - } - return int(binary.LittleEndian.Uint32(z)) -} - -func unseal(p image.Image) (b []byte) { +func extract(p image.Image, i, j, size int) (int, int, []byte) { + b := make([]byte, size) rect := p.Bounds() - l := getLen(p) c := 0 - for i := 0; i < rect.Max.Y; i++ { - for j := 0; j < rect.Max.X; j++ { - if i == 0 && j == 0 { - j = offset + for ; i < rect.Max.Y; i++ { + for ; j < rect.Max.X; j++ { + if c == size { + return i, j, b } pix := color.NRGBAModel.Convert(p.At(j, i)).(color.NRGBA) z := (pix.R << 6) z |= (pix.G << 6) >> 2 z |= (pix.B << 6) >> 4 z |= (pix.A << 6) >> 6 - if c == l { - return - } - b = append(b, z) + b[c] = z c++ } + j = 0 + } + return i, j, b +} + +func bytesToLen(b []byte) int { + return int(binary.LittleEndian.Uint32(b)) +} + +func Size(s int) int { + return s + int(math.Ceil(float64(s)/ChunkSize)*Overhead) +} + +func unseal(p image.Image, key []byte) (b []byte) { + if key != nil { + i, j, nonce := extract(p, 0, 0, NonceSize) + k := deriveKey(key, nonce, infoEncryption, KeySize) + s := NewAEADStream(k).Decrypt() + i, j, firstBlock := extract(p, i, j, FullSize) + dec := make([]byte, ChunkSize) + s.XORKeyStream(dec, firstBlock) + l := bytesToLen(dec[:encodedSizeLen]) + encodedSizeLen - ChunkSize + _, _, data := extract(p, i, j, Size(l)) + b = make([]byte, l) + s.XORKeyStream(b, data) + return append(dec[encodedSizeLen:], b...) + } + i, j, lbuf := extract(p, 0, 0, encodedSizeLen) + _, _, b = extract(p, i, j, bytesToLen(lbuf)) + return +} + +const ( + infoEncryption = "ChaCha20-Poly1305 encryption key" + infoFiller = "ChaCha20-Poly1305 randomness filler" + infoFillerNonce = "ChaCha20-Poly1305 filler nonce" + infoFillerStart = "RandomnessFiller" +) + +func filler(key, nonce []byte, l int) (r []byte) { + k := deriveKey(key, nonce, infoFiller, KeySize) + n := deriveKey(key, nonce, infoFillerNonce, NonceSize) + c, err := chacha20.NewUnauthenticatedCipher(k, n) + if err != nil { + panic(err) + } + var a, b [ChunkSize]byte + copy(a[:], []byte(infoFillerStart)) + for len(r) < l { + c.XORKeyStream(b[:], a[:]) + r = append(r, b[:]...) + a = b } return } -func seal(p image.Image, s []byte) (image.Image, error) { +type AEADStream struct { + c cipher.AEAD + nonce [NonceSize]byte + counter uint64 +} + +func NewAEADStream(key []byte) *AEADStream { + c, err := chacha20poly1305.New(key) + if err != nil { + panic(err) + } + return &AEADStream{c: c} +} +func (aead *AEADStream) Encrypt() cipher.Stream { + return &Encrypt{aead} +} +func (aead *AEADStream) Decrypt() cipher.Stream { + return &Decrypt{aead} +} +func (aead *AEADStream) NonceSize() int { + return aead.c.NonceSize() +} +func (aead *AEADStream) Overhead() int { + return aead.c.Overhead() +} +func (aead *AEADStream) Seal(dst, _, plaintext, additionalData []byte) []byte { + aead.inc() + b := aead.c.Seal(dst, aead.nonce[:], plaintext, additionalData) + return b +} +func (aead *AEADStream) Open(dst, _, ciphertext, additionalData []byte) ([]byte, error) { + aead.inc() + b, err := aead.c.Open(dst, aead.nonce[:], ciphertext, additionalData) + return b, err +} +func (aead *AEADStream) inc() { + put(&aead.nonce, aead.counter) + aead.counter++ +} + +func put(nonce *[NonceSize]byte, n uint64) { + binary.BigEndian.PutUint64((*nonce)[3:11], n) +} + +type Encrypt struct { + cipher.AEAD +} + +func h(b []byte, v ...any) { + fmt.Print(hex.EncodeToString(b) + " ") + fmt.Println(v...) +} + +func (e *Encrypt) XORKeyStream(dst, src []byte) { + size := ChunkSize + var buffer []byte + var a [FullSize]byte + for len(src) > 0 { + if len(src) < size { + size = len(src) + } + b := src[:size] + src = src[size:] + buf := e.Seal(a[:0], nil, b, nil) + buffer = append(buffer, buf...) + } + copy(dst, buffer) +} + +type Decrypt struct { + cipher.AEAD +} + +func (d *Decrypt) XORKeyStream(dst, src []byte) { + size := FullSize + var buffer []byte + var a [ChunkSize]byte + for len(src) > 0 { + if len(src) < size { + size = len(src) + } + b := src[:size] + src = src[size:] + buf, err := d.Open(a[:0], nil, b, nil) + if err != nil { + panic(err) + } + buffer = append(buffer, buf...) + } + copy(dst, buffer) +} + +func encrypt(data, key []byte, max int) (enc []byte, err error) { + nonce := make([]byte, NonceSize) + _, err = io.ReadFull(rand.Reader, nonce) + if err != nil { + return + } + k := deriveKey(key, nonce, infoEncryption, KeySize) + s := NewAEADStream(k).Encrypt() + enc = make([]byte, Size(len(data))) + s.XORKeyStream(enc, data) + enc = append(append(nonce, enc...), filler(key, nonce, max)...)[:max] + return +} + +func seal(p image.Image, s, key []byte) (img image.Image, err error) { rect := p.Bounds() n := image.NewNRGBA(rect) c := 0 @@ -70,14 +240,22 @@ func seal(p image.Image, s []byte) (image.Image, error) { if l > max { return nil, errors.New("not enough space in image") } + if key != nil { + arr, err = encrypt(arr, key, max) + if err != nil { + return + } + l = max + } for i := 0; i < rect.Max.Y; i++ { for j := 0; j < rect.Max.X; j++ { pix := color.NRGBAModel.Convert(p.At(j, i)).(color.NRGBA) if c < l { - r := (pix.R &^ 3) | (arr[c] >> 6) - g := (pix.G &^ 3) | (arr[c]<<2)>>6 - b := (pix.B &^ 3) | (arr[c]<<4)>>6 - a := (pix.A &^ 3) | (arr[c]<<6)>>6 + z := arr[c] + r := (pix.R &^ 3) | (z >> 6) + g := (pix.G &^ 3) | (z<<2)>>6 + b := (pix.B &^ 3) | (z<<4)>>6 + a := (pix.A &^ 3) | (z<<6)>>6 n.Set(j, i, color.NRGBA{r, g, b, a}) c++ } else { @@ -91,21 +269,51 @@ func seal(p image.Image, s []byte) (image.Image, error) { var ( inFile string outFile string + keyFile string secret string ) +func readKey() (b []byte, err error) { + if keyFile != "" { + if keyFile == "-" { + b, err = io.ReadAll(os.Stdin) + } else { + b, err = os.ReadFile(keyFile) + } + } else { + if k := os.Getenv(EnvKey); k != "" { + b = []byte(k) + } else { + return nil, nil + } + } + if err != nil { + return + } + return hex.DecodeString(string(b)) +} + func errf(err error) { fmt.Fprintln(os.Stderr, err) os.Exit(1) } +const EnvKey = "STEGO_KEY" + func main() { flag.StringVar(&inFile, "in", "-", "input file (default: stdin)") + flag.StringVar(&keyFile, "key", "", "key file; used for encryption") flag.StringVar(&outFile, "out", "-", "output file, always png (default: stdout)") flag.StringVar(&secret, "secret", "", "secret file to hide") flag.Parse() + if inFile == "-" && keyFile == "-" { + errf(errors.New("can not read input and key files from stdin")) + } + key, err := readKey() + if err != nil { + errf(err) + } var ( - err error in = os.Stdin out = os.Stdout ) @@ -126,11 +334,11 @@ func main() { errf(err) } if secret != "" { - b, err := ioutil.ReadFile(secret) + b, err := os.ReadFile(secret) if err != nil { errf(err) } - n, err := seal(p, b) + n, err := seal(p, b, key) if err != nil { errf(err) } @@ -140,7 +348,7 @@ func main() { } return } - _, err = out.Write(unseal(p)) + _, err = out.Write(unseal(p, key)) if err != nil { errf(err) } diff --git a/testdata/encrypted.png b/testdata/encrypted.png new file mode 100644 index 0000000000000000000000000000000000000000..bac545f365a1f2ec6a9082d2e9466f8737449f6f GIT binary patch literal 630009 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%0DM+Bnm1rDb97OyzW*|f?7?+i|RS9!-vIo$% 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 z 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%0AWC$zlBBm9(z1eEo?#; zBX>|V_R@e*KC;#aN|<<9z53%L?fxx$4Q%BF8{Lw&_?Ar_j->gwMme$a)a_#1UUAov zgZ}~KohiM+h>Nw_19IxOGwp6CDI@v(K)n3`4UW~FNG11SFL6pT&s-am!2z-_N@GLb zg*dTkn8%IHp|0NSQjk z9mU}W!y%Du-`Vyta=t#``l}C?9zE-uh;aLk;(V}}AIZfV7TQUam_nl!j{MNrjc;kS zWpjm8M#EmINbMKKPNY=meyz1QZUqAVrm=1XX#l!)JE7CmHWV$H89$5N<9;G zp=29klNHihkQGMoER3 zOda|-pX9}e#AsiMVrGZI)cIC7x(swxG2;=zwfuO1X=dn7%xpDC7a5|VlE}bT7n6Vd z`#=AqDvi!&E-@Qpg0>Q@n;{&TO2RmgUA|J4wSamfJa%IX6R3+GFnD0jTWO4&vUlAY z!(wAoZIc$2lv#$L{xGx9#^H2FTwWa}&DF->`dyflhWh!nId1RT2vlt~sz);2*d088 z4V2AD2txcSP6V(awHn2Z8}rImy;)gv<9_V6&8QA7<8U%2E?L)gL)skWwX}3o9S7cP zwV)BgTh|D7T&;?SwBHOvoV~q@@B6k4h}BT5XAY&SW}$jgG=4D%Jjf-|hLmap(5z%b z10^l=V6cLg#Tyu^xwgcJoT^1qNe$g+F{NY*Sm4r8WUa{{Gf6He(V-`68*FMPcW1%AgZ|4x3*YeVyT$6qXWDnN^=9PY z2&ELhtZLDj%|Buq(?uJ-RU_W^1t~cz0&0xFRpr%M_)*v6p6D);Jl92g_zD2V!wZ`wP>jguN^Scjnjhxw zjz{~WnQQsR>Gr(0`01vX^u`lSM+@6;==$_m_VB&Q^Qt6M#PrR*oe(f_Y9N`?P+=H| zQ*Q8!un%T;rGa6J`3bAOz`ab6<&jcypvEf9AcrHT>Hy5-OZ(5F^yM9r9wndK`}t_; zbZA|)<6J8dwFmSvXIJ^ru(8Ps5px_>;kyw6%UA}_9CL;Q5 z>G-}MuhO+J@tMs9isNKkT&>uh#r2tG*p=!#csy{mQGH8tq~dID|4pB`0Bxz&!}NxnUB3s*TgX{W)Vd7aG^SWL5xjNs^oH@e0k9*8R?@k zT{CP5WT8^vsA9QG`G&Ig#zE89lj!mM0c9A-+@y|LVVNbzMi`ZMH)sH$H4$$cN&_L! zy8*_qy|R1Np_e^@LnfvH;w#1)L2}e#c_y!)wZ6SK&7S@9gVnfkzi+dQMt)puq!C<= zmFq>68>vv*A3(iu(a{9ehHu`@_a_n-U;Uap>&va0ird{!zxt7p&J(2#Ivwr*t9qC}$ybn2>#oD$J|Lw+W#&%4;R z*}5;n42&c=j*izoVFpmeSx^Hx67mk-yrsN1cG=(#iJ8u0ko)m~uii{_dpg-^G)%Km zybV@lW49!&dy&GXz44qgC^SYLYx_OoYAdr6eYRRit#;kpu3G|joV5kl#nkO&ZZM&} zU(cX6d{-FJE9L$RL0VcKgKD=13-u3#Fq^^{0 zw34dXveHt<_7JpOjJJN*R!OrOw4h4lfneQ1X>t^V;Uu&m>?T@JK`RrrBm}K}Y_@lR z(q<)3t^POAq&yY_+^am-4pfwGi5bY#E@nOptEe^lQ5&Z1*J%ly6o?9fx6S|QI4{Tc%etO2Zb3nG&6v!8p+|L|Wov7K43P&``xJX@Mpuw)D`-W`6wmmaPr*3A9R$ytNt%&L%JlxzO`VBNh#`=QuQ=xMgX*$5Io2Vl? zyt%i#+avDolQ{K;^^v>kd#r3`L^w12Y9qb2AQ>H{;RZB+``_3%fNmpXy_Vc4+F%Vs4lRLQm zY-MUGD}dvZReOtYe!wO#WG}a{4WnC;@39jy(P8U3cqGMFzto9v?;-=30jUdJ--U6%#PF%Zz;fCjD36n zPVX#VAbkFo==PRsGGe<@%|&HRtYx$PAz5zBIj!12Fmtr=i(4Ll{Dr-_J>YOKV_%pa zKUvzYvOn##T@z?~qxG934+lq+F5vRkbezDPs1+WCLkJ!*FvKdOF(5PQ7vxl0b!k<< zJ#0_YyuOGU6VzMf?NxnP>#K}^VOELOl7zTQQbWzI)%pRHAC((r@r|^pvQzFS$yK>! z=ivLz3b!J|l!;oca)Yt2R9bd#lx=;a?eW3%d6kq_j{C+*H-$S<$dB9`|HgsHk-2$- zdQW`$K)S7LIkji9R@fV`(oB}{!j&p=xxx4UY=;# z5oM*uZfb+Ma0I$JM7=+q=pdT^N~!9 z$+HT3bbHE>xm4Gs>-(H(pY5+`%TY^#NB2HqbBBHf8+uum?xSFJ*T$w>?Dbj4#ycrM zx{Oby%4{JiT7cvlsO5IV5$Y;}QLDZ!8^OjXzT=3D#@tB)QR6kJuP(fG<6On$Klt6> z`zH(%>xx{?3}+^qKwF|JUd`?78WI@>s<5^sVxg5x2UjbLn1*#X9Rty}FgY>r!KLp> zr9ef&LBm+Z!NEIH)=J)U_f8{=6lftmy@RtSkAXXV0E++G? z_n&srzIm`d>ms#n4D@5iT8Z6=w3)@px+7H`8tYIo?{w<6(2+z9QjB9xqmNnIt)9wB!a?r~zj5`@&bh zZ}z5N{K#bf`QK}+N>W}-pTCu*{yk#(fpy(%{cytk_G*XQQ8fS3cK>%!qbM(p5$~|O zS=Bp|ZNXAUQmyc|W8DU9J9G@S%eTS;O~GRyZU}2;Uaxe)KxN@>)p|HhG}Tos3vxD- zA+~yfhHHlXk?rwX%f)Q*&N6w#?isf05N_=Be&*v{B9fu;9ZgS9%ylF>syd3W^M%NJ zQp_mJqYa+m4hOJno9Gcs@0)m%rym@4cDR`b3#U6B{nBWQktC5}X6=l|v9AjdaxL-& zbKa;NN5dKn_F{<#$n~>P_iqp8!U#I9P#@ukuZTnC?&-Rt=!aTCf#?>9V_P64bF&yGcqUs;bl^fCcY->4L*jCClVcmhSirHni zGGubmwP3ZjXI)W{->L8$!YWppQckUCe3Z(01JY+&w;M{H;aEt=DADpmaWkq+r~i9 zsq5PpH)v(0nn%E8^WkKio>`7FZB;-o-^1P9Qb`qh-N6dYeq>OtwSsCR-u5eV=mhdr7rb87$RqeXi z%pt(YilGacH~gB|c5e08R5N!Sar8NSl)Vz*O~o}9L#?2rCF()CtEq(7Ji(!5Tgz8Vxt!f}A2WwfP>%vp%MJTCla|LK2; z|M$CM+8gVLBb4}bqPng&_!&DXu~t0}g0vU1D&*tDRBGdCOf*=aHO<7C~uCc zEBzHj28tyVbsU_>nl^K8;8Gi@E)c%e1`wnYpYDR4#sk0o>J8nUVm)}!&CFz$!2q2X|O<76bO0XINH9q zqE<{%jjdt((uXpFQ%g!pIkEZKjFSac=6Hmw2~l&`rS=n0rkOoljV=rOK^-Ro9~r$v zKDHgjathkrgw!c%9}($JeS(uR)U@B-A7K2YXoKwyB((r@fGE-8Y40ASWXVJw0ujc2fU#plKu_%UG7x_N35JX&wV6Z&sJ9)yi1wNaqHW9LQlM6=&0N z!tmqw7-FS^!0NVZ&W*PWRTkZ_aX6~Q z2NZX!E*WR1RBHm35o=w=?JfIdDyM^S5_R;z*-zw`Sv{VRiD@fe!lftEZD-!EM)OQ1 z7R7o;QlDsrk$Z$~{%rMpBDXwHifw@=lEaQX-w}BSd8`)cYT^=6dcB6l@hv%R!MPZ@ zH&UN}qr0EUUN)-RqwVWYLFvqTCm5$UO8Eh>BU~;FcFa^;p{LR|swUx<2>LSy_Li7* zVvB=WiiF+*rfrQi>xpe&Nb?G}4lME+Yyp)#b52V8nFXoJc*AWimB_+WsNx2i&giZF z`wFHT$}cZQzL@c?<#Q$5e*?a|L2U$J-5bs#-FIHpBhJ<4_jmT@t9Nv~6HpKew$b+K zO!@JGy%wb9hU75Ocz3K11t(80LPhBUEe{dJBIm^#l>Br5JSNs@a$` z_3ug!bzgc5U(F45sbn6l_eS=gI0!qHn@>xr{;=Tbzs-nMDF_jA(mGOMyq74 zD(0k+(TI1L?~=17UV3|&xzSuMEeRRNiEX=Bdi=!symiN4mo6wRk8Zs$qY*?lR}k(7 z1-+-bJkatNf1&x>#dMjSH;f1P-YZwAMGzb)<3!*6pa0bU;A~yFVd56 z0Wr699#wTw(&M2UD>$E|z2X4QTz%;Wrb+?9 z6#!?3jU<2gqo4f~X|d(B_Z>7^DtkihhXR6hS;>ZhXkXN>S1@UJyhmdsa726M8pT|z z;qbk)Dt51%jjGMv0BS&DY00WLp$s;-YBEe5VxX3@`z$FG8c*imAs4O?q*CiF-ox>;i^R9&9oxdD*IV!y#3nlkHqsaAd>GhuVjI{@W`OX zHq-X`rK_24I@MY)7#Ed14u%-vZZe(eN!d;X2pJhSG_ zb_fm5QHYgzOl15Ht5zu=pUkc+a6FQKJ5j7`BYz?qomslIFq}DCrf`AP7Sisbvd{KP zECDAgC`75-yWZiRMuOBMh2dM8}C}| zC{HU%y@4ygfd)nOCvneAc732;x%>elD^XN19ihvwEbUbq%1d_aN}ToG#O3f_y=Ako zp^w&Siwse}yny@$mO*7vNhk;{_H3q>q&$(9*!c`=5VEJet5&Ly2x+(Kc8-ZvLxSa7 zBYs4|jGCx{d(hsH|7T`56KZ8m8J2fOZF@75)aSN=G(QXQ{5R|mN6tp%9$yT@Omtq@ z_#P=gD#r=oE?~Gh;O48hJRF?4bR}JWYvt*R^Z6P1xq+iwjBg{n3r2k5y4+fh1IRYi zd}HBehQw;#iiuRQR2wUYFtgUuo#?FWW;vte+KP;nI>LOUx@BwS(%{)?A?uS6q*nIM z;2Zdteo0>XnSNytVc}N(v58T)GI!LfR-^-quU6*+4ab4(?k%vN>E)mQ87&XJ6%jn$n;Tm?ba1@G zQH2d^Hbh?1jDPW;|5x(ch4{L6*Fio6i&bDQLRcm5#ft8)ZiM{m$aZ&oWAo`q!8;5x+i^0x zfAfV+(}C{iidl9FUD_@i+Y!8c=G_m*dX>6%%T}T=l7_YykHlEe60{g0)V-})m!Gc1 zg95YKm2(K1d1hx14T#Xr#8ErHSI&D2ewgnvp53fT#bDK$NGtWsY@?YoqLRopn9-0p z0$7f$4UnKvbrTKP%^Y#wkK|}$1VDBt{fE4gIA)bwpeS{B^!_H$h@?l3UL*2I)Pew1-N(&Fv{j`rx>*ayBYqr#w5E&hh5yMnS65~<_)coA< zjSE%5^M%hzbpG*=aQebq9B&cnLgHDIDc3~W#c7DUEqO|{_nt&gDDH-+J}SO=M|^W@ z=rRRX4F~4JzaD!kF;JF(DO-{7tQ|O#>&!@pH1rNxsg^4j}NxyBRmU- zH;E2jsD>|%asjkboiAu`%54W|xRUz8{32%lN{XX-&7^stu%oGe%LREGrBRf-NhP#&b z?(?U?o@^r4=1&{0jYFCMzHof zyUU=`mFNOe^@g0SdWY?4Lkz1@33N`uzz??TosoUwX^J*}IZM31)#-HPaaOILzr%8V z;B85|<{M@?keuFHodBOV0?&e0GMvH1nK8^5CWaq(_|*OKDW{4?gHW^WsvJn6np)Ji z;3i5$NrRGea1GU4Ms>4z&Q@$Nan+DEHVK4&bnA>u=C0dA)|fWeh8Y@R67HS}4P5u6 zDy0!8B`5Hn*c95Bs*FJ`11!WvOYeYm;i!7~C@;VIEn~|lmjb)IF!2a$AR{<(r)d6; z%^go9%Ndvd=EQrW+4$z9Hl%8gK8BUd~F{7ENWh>Id){u z*rGFDk|j4#m_}|HmE+OIaUju^eM?5-BvQ5euixM_18?6%nx(5QD+M7ft~ayQ#-S~? zBx98`J7L;6{XbYya)S=tQUM%rmD z0Y(dxAG>69rEDG|+AwqbVt@Ga-}@tWOqCj%b&UbTLuk!QmqT5yn^o5bPpLPYx7x9U zKJk%qr3&sk0l^Dp^29!q@dO!_@N8B|7|!*(tPrgMe3pjhCL;LBWIna-0v^xBX^odyi7TpIH% zjN}Gz-jJC%3^O_1Ol)B03|B-I4mysEx@o`H(ZCgjbBpUB-1e*Z#)eIOdo(G%@6nuR z+MzbOMkA=EL}}|MB$5TSYR0A~@#(B~89~EF-~24l{BQib@Z0w)%U|;T>p=Ye4ugB9 z^6)LaeE5d&3@rx&AJtpWGsh)p&og{kgJx_g*=Fh7_;o9Ap}^g}L@#2s>*{ zl4*abc2!22NA-bhxQVDQtK@63%SB8gDBh14?Lu@mJ-5f97EFPvCAFsur}2&Xw>Nh8 zjoE38GHj37b2M5m;0C7RXrc?}LZqy~G@9CEOuGcvD$qa_?`XgLl0QCu#>3NqqXWiC zF@_rpN0ot-_Ffxp%w{k@q=v}YS%h%|nqqFNdU0$aweq-=3rEZ2gyI>)c2Ci+y5AhB z(t8dMPj>n6nRz=IoldB?5lZiHoPGSEs(d@OmpK`y2E28!i+<`(o9>oE*)$kCYK8R8c#ex#}B>*ewqi zbP>88{rGB8|hMJ2G-uEQi0JP8!NL5M?p zWu~D~2W{oBi>Rw#$x|Tg&u|imh57R9Zw=4SsF@&zyI%l?k?75dhbftxJ>2mI5)xki z?9cJ^o89twpb$pzX(m5-_(_0%o!8Iu!IM$N9slxw_^0}(|Lh}|EmK+-3r>1Rx(89Z zo~zcygl?!M2^eGe-Jg-_ZoV=2b)`Ot)_^||YGLY9_hmDJqiOV1R1NHG^i0=O%YWwQSeA~kZLYW6r5SNvm9HD8na!1Dz!xcH(J}Bkj5@fVFXleRGf|2 zx-UH?2NcJUWSSb=35^w)(jr&#xQ7o_6IBLD_lykPl2&*#lvLLCE zJLm4tv~y_u(x^d}!C7Cbc(UluTEa>J730%|^$H?_%C3v%uxm$n+UA6b< zaki+QvTy5MiHi1psm{UgO5_u4@5-EJqU2kRQsn_kqC)H|Y&FyXLUM$VtwF!o7=|gi{Hm+AZqY)Lt+Vfi@_2_DbYaxBut;g8=cQ*gzNPWT?iY%k?ezt;RZ}J@6nN$x}mc5_8 zXfWbJESAV_XYhQZ>+>@n|DRu|;sln7XfJgP%I@Z5Bep({icFG&w>k{u*_nm0%ZJyi zYIRrSEHo5QN}I|#G0hDGOf-A49J6iV1U~;Qw&MlQFVPG~mE+2M|6?2X7szcgzZ}Wg zZ#lbx>UQDnxj?c`7XUfBo+(lGNWA{6oRt|S>5nM5|6Ux$~ z(dKSR^%+iQVH$KFAY&P^U%&15|Lga^RcAAFm~1`Xau|c^>}Xmtv+SzFL@lh$Rw=`m z8rJU_gM*YA?)qYK<5|;$VfH=I4ciAEoffnp36xgo=^Qr9k$@e7T|LrJ6$` z2`7`^dCS8WV&mbRjdwTf>WcdC8(Loit%OkmstI#d0zcV*vCK(L3 zw=}v1rj901R~fY0f|w00?}?+@Qe90}w`b-xVMpi_O;ikXe648KP(PT31Voj|Pv)h- zM3ijnZo}4nKD*Qpy*iW>a^!W_L=LT(D43kG3ubvommefY795-y9CHVoO6`9*P_7M7 z!pWff@?z`Xe9z^2AtkRlkyOWa9JwnF(@a3TA&QPKfA+uY(_gN(vZK>s;=|fYPU<7v|%Uq}2B6aX{qcD>u@YDp_=%;U;Y`Bbt*i2fL}>907BP zc7GG-aGWXJ1)Qw3!mdtC3Y@yM^oeq9E1{rz6xw!T>SlP%Lo4#$H^c#o1-uou;Hew! zTR`_L2B?r&pWJd?vsyTKf?Pp~YsY6LA>(M(uG~sC`z{CwwQA-aNvbeb?Y0=%xYTTL z146kx};>ep{B>u(H=y=TM6n*G%$APQzD?3fK0x;f-^ag4rqbL!fbWtLv+$gyr zxJo&5KUuRrvqBaYVs3E1uE5@wXg3f^7j(*nJO}FFUq@bTBe{v7HCfq>H9GAAhc0pQ zu6pyZlKRM0E!3N)x^r>~W|CNZgfFF!n<*mPzVT|J9%MVIxU8@mIqd{5#>1@iqrd-_ z4?q3}^7M&PXls51?|;qP4?zSXk@GJ$fj1d%5>e-^cgxH3=N}Pi@B8$8w(HjEG4x~FEzebS^frQ-XtZVLx#CK z$o@%-kjd)V=L=mz(zx6}XxB7>iW?2r)Xmz5;RC4!$YdySWVcqVz7Q8rCRbD%m@+iK z{0r9g_u6Oao{i*PAU-%gjI87~@neO_)Y(@fH+4{O9l-V3c)w+}&yev*xoyLt0p*@_ zg!88=;huyWUlZ!u+-cRuGDFE$OOq4e&6!Vc-|F-emfJV?dYT=Leg~DauHXNP)=wX8 zZ|{8$6mO1@XpsGCTYjVa?Kj}Kk_I91CknH(S+2cPQfnZs*>pFUdN#MAElj~m4dUt3 z)hv5de}nd1Rm6O+>U$%?Mv<+H><6)-Q5n^)pC`G%I1qd=XF{3#_!n}Et6Ey7V^6|~ zRbh@|X0G1Ag-tD6AfYNA#x42^d}H;RArj2=O5(e}xm~~gD_lQb$@Z$1N0yrbbKsU2 zjZcC)zNHw>dj04B8-Ms~296PtC-DbYK2|&21-iR&I!U*Og!6@R+S&Od zN~yFr(nm{g{R<)L5SY4QQ5VeE`?Q$L8__7>9ohwviHXY9?5J8XFl%C37MN>Qsl2Lc zO2ajY*gH197^^Ua*Q+A8S0Yyl+{knV^gx=fs9iVWb>v%YCn-XV)n2V|8D5KKfBXNj z^e(-cWZ8At+IyczM0~IN%B;%j>aM29hDD2jAq^}W9C+-J0n0G`XGBZ?MTTL(h6g4* zqDMAIGDHe8$tJtS?&_{bR=)1N-zy@{V{hY}+vrheW#0RJ5$Ei+);W8x)uVwCD>X!x z)Dxbet3$(AafOukEH;x1qsgDVdGn{Ji4miP&A@7_rb0dYxd9DHr(->CklUa6k%A=_ zgOQ7X59ERZsi>jxtVBEpqD$gg3I<_~Q3>M#6x+gXTtBPd?%-`@Cxyk2XzU5DJKCDb zVwERuq_9fmz$1YR#4f755h~6~lP_^>->`d2I~$EGG5JPrSt{4Yn6x1Z3aoHM;=)bb zFKg=5E-i^08AzwLY3Cj#+8(;AiOsm}ISY+ZkG|&-Ox5VcmY4|bnY%)30)=jbEo5O5 zfok2C5rY zJFk|1nW_Bb&;%jba>C{B9nGs^xOFt_E9GaS#RlC^Om#Wo`pJ|0)ExUTv^>U^2`2-91#4%Xor;^VmhXc{IqQ;ffZA>ldJQtyv!Rai# zJkxskjAU+1-huol%We;e3>_D8%L5xdS++=FDJa~;VI+55c;zc>6@)65r>mq_!qy;Ux2Fpo#B)7E;P0g2Ik>f?a$ zo@{njwJ_;Kn$Ct{!`A*UdXSvP>nHH-E5+iCU81BbYBpk@z zITP}TW37C+-P`uH$MB`ccG_9oB*ytI&EJ26%MYI@eO!^<7Z~rnj-eWzKXt2eZ0}iK zMRt6K4?Cl&d$j{txpcQG2ddd>5UEhg4Zr8gpjma59>-h!*saUk79lRoEXGuAZN!L- zI^2UOu%L$aW?fV4mYX;bf$L*^)!1i3=@GpO_MmFiO>=zr{AmgRMXO~D(mq!4LOn&M z_tgKcX_|;FSL!i=JYYF~i{Iq5{{7GK_-od(AA5ST z?0ns959BxAI7SK~arbq171K0o+&NBqz&C&S|IlCj`8PT*W-DC@2#w+pxrLfof_cR5 z$r3uK0>t6{QP)-BePq>a(M@7itvaQE#*|cZZ4nVN0*Jq#T%|ADCjH#>E&y*GfRn4a&RmMKLz#(8uRwpiXicfo&z4 z+DmFeumRYr^kT7egMM_t?PsVljqL~afv;Ait75!xHiG$T zrTzU;gfK%ZdH|Eg_C5#dra#Ka>X=Gq@I|=~LayfKL@95X>}st%`(dP_g&o!Enwm9& z{EL6|kN=e-lHcwa&S0sL$PKU=q08EMdfTFn@fu4ZDtNi0v+mT#kr!aC;Mhc~^qzn` z8#(8D$X`(q+(r-G!>O8+31izXnvLaZ;s^61nYi{uGov4)9L$x)8a<|$zzLKR$i>yT z2Fq>rhLz0*^PI$88W|~I2cx#xg;3WCJtQ(EG-k)8h?Qblh2~P4Jxd zZwA+euo=z9+6@|nm{J%UrGs;9lno__c5};>txgk|yXSvD%u35@zVWSwopJh zuS~wy{%h1gJ*BCk;)}76tGP*EMIiDo9U7!4pg6Iiumg0xP5h1NOOgj zs-_TWUsnruw;6x%U;pRu8R^>O&yQAJ!B5=p6mIV=*$s^Q9=I3@^uky3v3r5(T#2G1%dnM+;<6$y3Dxb4 zN@dcy=ccmT(6D?G=E-dLIj-x)&fm=(aDZ9hg*UiiqUxUEcb^%h)XkjSVq9$2W$|oF zQH~o4uWpGC8^Y2g{odU16W5&7ce|4ei?MrH7WP(8nMG%#X*Ig}u_(=;6T_`PklwKc zimZOF`lKW|>2)pavQx4rNFuNe8 zysD=53{$IOiuof`Y{=+LP1tHAJ)K&C*0p*rxzCteIll$hL12IjEA2kJrJEbGVIL58 zjrgpZ-hXe$)0xw9gIcyMcdy_+XKo)7x+mj%;oTa?_~1H(>Li7LIoMe}6^Cca?cF&@deMaCfK@CyK9b%)6C(_DA`!r&u z%W+n7j`FI?{bI03sdmFK8eJn5mFhw{fooeJ;&^PV$cV!jX}GBxtGB~ptTGc zmr%HqQMfacB&Y*?DyTH}{>{{rD_6>W7L}AsM)if&-KzYHKls_dETUu=(}wSe#8|49 zd6uSjxoxIlK%nlsX@p{RuEtE#R=RUjw>A!y)m-3vzCas6WlyCka8>wm;^><=Urnb0 zF(zS*2vO0qy1SQ}aAUJ3OfIyd906M4W#Y7A<5Y-d70MthFslobmZB8GOVS!M`z9?2?B=365W9xG zR85A^$NDTmU3VfUILYAN-KtR6V+YOo$#`9@U%_eZJAiL0dGS4&c^-XMf(+*aRn%J10d&viK;!kA^iBi`llp~tUUh` z*LRJKZF!o`s>#v%?U`-2CHHD%)vK-F5w6FI>1PLybg}af!s~idLtwGzYkht+T*e!0 z?;X*?cKTGfs^b_3Ak8e%lgdhKoNUjD@*-M1!BU270v8zBGw706qR($^czA_}y;>X& z@WJozWu;o|6-;1dV_~)qeEWV zErP?2EZ*K=gA8MDE)Ze4k~WnD1>d|Ocm4>yo(;Sq(JN_fYZX+P$v%HTItlFh-pn8E z@-9ohKhV%NwHE>?I)(9yJ< z7#6IK1H$9c^7u>~4k*cba#>@|nmy4KO7d**O;9um>tN!#Er@9{EDhMML?o(XqIg|< z*N&Xuql}-k%~#_qOa8RLJHoVK8*c~O-A&A!JB0W|eEy*2W0La^Yqz21yF0QS)#%RT zQdFK^o0}r@P!NMb0x=|-w+pm!j-0VVO!Y`eq>4(Q2Eq(0)!LpW=TY;OjC{9PC(6`x zTfbjw3Zk<0-Y40x@@z`6#{l(VA=<$CrXFFextmrkxqVbpt2 zC2JhOY1dRtB;71XI8dw6OkOJ|>bWhf{$Sbgkptj#Gvtltw*@t&h=SR1+cfXOq`;QC!D z93w!Pt&k-c9|CAC90*uvA_VRy9^AIx3Iw-usY1OUx0pE+7E^Fu&D@BgAAu@qVK`nJ z&^354s-=+~D!CxjZ0e`RPDpZhFz&YvndHSfl$D#16l+gJfVr3f{Ob1tKL4k0dWWh# ze?#l=0J$3>^n~@g^1S`h;?8Su7u2_(_=?Z>uPj^dWd&WeDZZ0&9UC^Vn~mm_sxEEQ3*PKU+-+1G8^WaA z2U}}xc*Na@+A?u*V)<&Rl-_7f(XkJrRRV_+vAlbSr|)L6Fxl&UvPebFDG|j<XUB9PXSRdb4E+t@`wt6?k zw$`xKE7M`8zRYYqV?FvlHml33^}~0x){Pbsafb=l8OD#MQbIl<%1ifC3A zWD~e@>cJMWy=5DQn#+~lyc#ZNlS64UiMFt!7N%F>9sXI{lWHjDV&jLL?Ds2qx zCd_n4;qgpb9)Y+sla2Ni*`~g9W^*@?>)h>Rd*V%6xYF8N=hr2H*9zGO*ojbuD9u9a z85TA_P^t%VJE1x`8o$_4t2y!Rj%2riqJmegHRYQugBR#FwJi&=X{PMbp22H)J& z6Epgmul8=4>SRT<2G-2I_gut~6-_28F$iqlHQW&@=9#6EOWkS5j8^uHR^AK<=AEGT z5lMvPwF3a)JHK#Ak%&}8f#i+qvz-3=Z|IT-D^1^7;o!5fFetn_&Lm}FT zZVm??ZZ;hEcVM@WI_p+i%MVAZYcd%;$5%HNZZ{Z4vo&wzSN{NCK%l?(U)cZk7hiMH z+5xR$lp9B`raDf6@|q1z=@$@NHOZ-a03?JaUoEdEu5qy8)sF2sqe|0>)p`U(6rF63 zT&@PoEF4tF$o)LotMtzPMj&h;VyF9^*N5$a$8pAVcT1kD73bKKTGo+py_)s&V23pZ z9f05YpAW)u?uX>9cGq$xDGc3zD}@&kOJ-LqG!Qdsf2<*h zlocFCL(ROnjXG0v(Zi~C7q1Xv?@I`I<~RuZG17*K#^^cLD_nIXA+dO_J#~abt+IpH znTrSz4%W1}xxjUu3Gh^8t%mg_++w{N`wiC~iRGyg6~h22msa(e{HXOrJ|@c^ug(fu3tCBy2~9-lthyLU#AV7qam#_Xi7mThN;`%1$hnwhX%AK46A zb?i;66xt>#+FK{{qt&&TaC`oHqPW0DuaA6S`~QAPa9dj4OE}dS60?uJOIT@um5fCq zxmBnPM6Rqz=arix=i3AG{?z=OLf0h)(thz)b<%NpmRX<%<+CU zl7TpTx+a3G`w%U#sQY4JO-@t5?;bslglC)RXG|LQ5Pd zRHfBL8njq;h4j;r*2h7fvO_s|&fA~bE4NbEt}^&Lb()Z~+LSWtwh-yIH*8s-zL2K5 z>X0($=wNwEkxo#HAkiL4>#`>+iI6@~-Mu3BQMuOd6)uWZk9aLo#{}ZNEhVr!F6P70 zY+z7{lq`e%fPSu(%!*x%C~}o#O+H)J-eS%h-{+tS!k291O2$=%WdX$l;O=hi)vJZ# z%`5obq<#m~^Lwn{e!%s~8o$SM3+-0W3!wHn^6lpqZ%fls$hmD^aF2JrGG>fwRnp5D`J_-Dx*e<^tP2D~A(haZ8iO-xfX+e95Y)IwE;r3++E{P)&`_+v z!-e*%)w+<7k%d}eH71dMy>3>2XXP)}PovqCotdR>>_CRvlv@v}u@KP&OIwO4YxgBF z0~uDL>gD+D&+GD=E2{=nWQ;>pzjdJ7dy#du_2<9l^QV>S%{{h0(s(lwjXgM?tQ5|V zC(VyXx-ONyOiiO<^TmV39g|HHpFW)F-~F3Ev%mYUK->sQPIFzwH+4K5#D|FWa_S_l zPv~~W({!2RJm&`5mXT4GM0%Y;;|_7_S$g|JG;x{z5Xr<@tqD09i;XsiRW=staDPYn z@{EzmZl;kwyB8W?Gu`Zb_wx~Jw5e*h{Vm!LX)P5h>`CfE@UHiuV#}Z~s^rQ=jbb=x z=E59=(Nmb))=GH77_$DioNX(OlXvltb%y}+dw_yiVtLT>W!byg29_; zDUkp6r~lc%Vs`2)v05@EVc$TQh`e*0)Q1jl0NPT(* zB{~{M$D9p=2t2p_4~wIagCoC*+S@3k{cou19FqsRRuqZN)g;mt?hG9qkq?zLu|`#g z8?HUtYBnQh2np@qTb0I>xz9f?D_p&Dp`BSy$d{`)RKt=uUn^!E)M`P>%u9;2tf`OR zEv?>l#Yw#t#rmjad;6=QaAQ|_BuFMw2Zz$WiHRy2fVlN#bGT|RQPM(oxm?vVaVm<* zflozx2fex3e(%57^X)(TV=dQD6qw=bC)m3qpQbMnCXmO8@^7Cl@t(`bh`AEUjO!;y z_02{_FOcJjuji!lhyPfddn9~#*6SQ7-0hUl73t~3N7^V)O8c0xzCGhij#f|Ip=@U0#_Y;Wk{vp{1stu*i@LBqO$$r)wh>YPbZ?z8i{QraA7v_;*1(<4ZeJKFWv z7c2>)(@49`9wV)c)f0)=n_FR0kLpbPe4%2YkxHuLo}7#?VW-Q|_tR?H13HJE2kvYM zudIIj7W(NUo-PB0jU%Q(4<6>3%n#nQQ9)fud^8>plvqgKpN#TsWvL{$U(&QQbq@u; zY+9YgoC`K&u!-!NJ-MV-wrWlJV==Bs=41fVOtPP-XRgb(0kN&g(+4Tw{RHX1IW8z>Xfc&JCv-+i!3!6YH?i-8h(iK2eATC2vUHeNU(Fzoz9AFekDwY|XtIu=(sY zPrD7#R!De<-~RPq+yD7L{Ut8Stf`XN8DkGIf=FEyH84q^tA}AjE*7f!C6mU*5%J-` zMuF107z$Vh*mQfZZaxAu2nVTl$?%dX6TmsJgdQ4f;cnY)4>r-!G!3|UeM`6ZqwNpT zreO=B!i~668KLWmNMb{O$uCw()@YcE8{#@skJG0@)dh-{tT!gK_tT}0HdU=$8?$15 zabNKLh#zVayr8?hY2_M!K%&U23M+;f?D*yeDzxtPAD~j)$ z1kr7&=oM|zs!lBYV&VZK3Z|s{yQYB538Yr{lHp%Wc@lB+0vQL}G_skLLtSd|p1c!c zM$bjEajV3sy<93Xk>}d)dLV(dR!Hz{KAMizTsF30B&R(9LEYMON$NOR%!(=$qMawMd-7+T8-BBGAYkH z4*mMEr&KxDkF13i+%Jx;ffq?A(C+NfcBT@SqOFcafOy)nT(3R4H^iWc1!E&q!E=xo z29Fp(O`wL6a?0ems`Ru^&rShzWWpnB4C;!|ET*~?X6`phq#S|NmZAp_mHyzL-s;^S z{SixEnDY^KoUO#qO+Jgv_MYfBZ1Zs>{^|`vdL-r*>D?YSM(hp+&L8>m?T^iEln4LL z{Ib~TZ4vqG9b%Yt-W_|pQd<`CLPO{wOK@-;POB)a`aKj!U0?ZC{= zl!Bj8ZAa$kptO489RL<-ECD)Mw9zUdH06G z=>!Xf6GaPBb@hS$v#RiWi0rLQN-J&Pk0(xkZ(%-*Zi-T>#G#PJ8#Lmm1!QgC37dt$ zLU*wFsMwK6EB;|iSaNmY%-Ijbwo*^}I2V=82^b#O>e}!4X)&hLTg^jc=q(}5yv%~` zF=|h&$=KSC^o8S>x7d7Mb?^iGy9X9`w)*}p=65Hm%MI1I<#6jQ`kC~34}Q2q-3tZJ z?1x~)W6$N_x>{-K#iG^q9ZFO2rlyO7)l8)fl#G$eNEAc2o+ar{)jg5J%Yl<)I2ozf z+$st~m~5?p@9AK~8myv{k5H|HxdtMB1LLMWy`?^r)Rc~Pf5YAt?hIU6wMY3=t&~MA zFvX-zDW{?wLaS3f9lcr{sb|S+L(WWE*upkTKe@;gPGA2$U*FG=An-n7xOFCnS7hh6 zNWc7^)`mAzuLX}3U|#I%=fFqn}PY^W{aCGXg@%`7YjX0Ia{0r zIh7`ps0q+kdA%vos21Ex8UkGKTJr^-K}Dicx>Aopxn^Zo8U_Nz^(0DlgHoBfn-)Y* zl#9Y^BP?*1sqiYS9@>Xx%=*i z-Y~Z}@{3S(Am81KG)54wPSjn&jY+K_=~hfbLwv5XR@1;?@Z6ad?RuwYsl}x9V{z7! zmCBZoFR;<~v)Hm0)8#Cw3UZn0`AMxuk}osWq)l4@Lp9&1R5Ej3O)5kap@zkr9{?A@ z)<~7IOBJ~YGK+cFesArE8YpJ)+V-m~RbjREU>Aea412K_Rv3)|+n$>lx;KIK*ovm; z3ODMImTalAIuz1YWE@dB9?ig<(rkhat7Wj`x@H5XmyjeA#m|0!lIdr!$kN#;DWxWs zZeP=oKbU^{X!9H`{q(0a?4$9AUt;~fX#UC1OdgD7`H1xGV)dv03CKT@yj|(|ZZVcX z+fCLmw&$KTIxk_*7A`aAta`3d;K*WHu%0tNuh9}!dbr)tmtPIG(=*9*WBq2Mv_iI0 zvS?PRCr^52yABiKlE{W^LmiMd5j3xKefNk@s~T_a=w`>->V;iPzfV5A-qTIIS`CFw z38}0`>w>m%G_=3y0c64DOzS19@(wr%ue%-9<3*S6exOshB@NL=81}bYwzyHZ&g3?O zVLMUPwqFv|BG+>=NoT6dnac5^ejjMJspK2Uj|$swn9Bst3uWgFV6bL$c_r{hb#svV z94M40q{E#V-P2l(Q|ev#6;uRrm3zcqdS^>@5zwf&EOPd7ih!iQTMt|w?+ZR13+i&WB$y8Qi% z6Xzw9+F}G@mWvkJBg`VYy@FO}{`$!C=AOE>ZmJxO2#(d4Y&DR$nfeJ=Sees&ZbeLO z>o}(^#^-0HawN548C#~6jjl(gU8Bu!kZ1v4g>C#u2wzmJ=YH^ay%Y?xQuRA6F9U4U z&C9Q9sDg02rQKIIb@vdv|A^Ze{PNN2+syNalhvjQ8z|Wm;6^q7ip$L{qCIh_XV~sl zzg`PGTg{$P7puz(eVKs9OYX`b*(Kz~tHs91J-Z>oBvZg(6uEckSp#?9L`~J|2tE9T zTO}ZEHJ~TCa4-`SYeK?Ex?75CKPRAiR;mnfnTWLu#omO_+W<=KjzTV~?*S)k1AZuk zEE#wjjN2OQrr|=qPZ3ds${#Mqy zA^+-zb~lbfR9a47)AFlN_N%}8fj+)F<60cAZqfl}+t(X8+%fwfJ&?aUP}mxojQaS^ zGylc^^5^*aebvf_9@Wz$;tThQZ>L;ZRm>m>{ceO=#z1m>E6*}BX-R@%#WpBT|eW0Gb zpd)3iyWX`Fdhd3sa zxDjxnrqzhI>U?g>0YhWUVT3s)@I*|ayd|?2i$!zoXIK@J9Z7y{v{{-`z@ zXI{A*UG?;>tlVC%URPd*p>aDsKhBi%)t0niF1h=7gd~3#K4)r&?>Q!7xrp)O_jnVq^)$IQfUj$_k#(-5p-bz%z-51)t3)A{NX>NVg0pb z+Za#x81Rjh4cC@q)^zv`K_5{L_n69pZ@>A$j*o^g?qs{$pmD7DeCn$w?jLl# zxuVKM;oMW$sJ%2IPgxa}Th;JnPfzFI)2-=DCV4l)jlR<}2^(8swXT!=PBiySa4O-N?TykR^x8OeCl(Fxa!Ux-zL2M_znH^r?2^bBjoGMsTGSH$d)UiUMfNo z%>(gu=0d(&(-65wH?l7?orf<#%MH7DV$drc^m|Lw4Mu=62g91Vj0X#s3nxFBUx}8n zea$0$kG(Q8TzT=gTxTUpN40IF8uzGWMK~#&KOthzZTI5*(M(jxAE?v|uTAitp2$rV zTy{+|L6)o0=xzJsfcwuU3)=xQ-Lou@Y#+YE}Y(#i%T7HeBlH($Z;_vD8J2d8C) z@epb7*T%+;N|ClUQ>wDA3z$_CwZ&TPrJbX)ZkWk}dap#asMBgjqXbjp7_=9d8aa24;KzD_p-> zI1ht`FYe&=Y~}rb#K-^e_xSjmRlk3CmggVNI>&>JW5zh_$w$xb_JO8XJ012nI^0e` z+h4`;+rRs3{qz6*=lpa|>|(1-Tefw5ajFfhssm^u^D_2l`H4#}plZHvt zaqgLGmKN@5%G1Pg+>+!4%d!|b=9;J?5YpB4F>5C~8*hY1t#){Gt9QGBZ(e!Z?RVrw z*o_QXg}{rYButK!u_8H7q77dOAr2tTy`-S`R|a867_nN`&`qF8v#pKZ@c^OBR9bDx zu;R(LcbT&_R5SA`gHkCAJi7m9D-7*@S)|faIH^`H6+Lh-_t`XNSCxt;z`IsB8jB+C zhukNk%ElsG)i+E6q>1!s;FUNipq~2G&~?!zI}-N1O6na0wGxVWmH*+Z|MXu=H_WP3 zn#%0coQ)SbN$uN;!lgnDG<_w~o&72(Bte4F%Fg+I)lg`J;2G*&w^?itRkil{aiX>T6)w|D%w8V>DPEP% zQpdrlQTB$Xg_Zg^Zl9erUDu`**p;?LK=knu7p;6>CB(+)<8L24+KYDG%Ma^5X%4|iA+DBdcynBQI{EW+X zrEokkeRt8bzvbzxFPo}@9T&?`azFdR=<*g?M$1p0h7HWQV*YxO$1F%!u{c(~dx-V0 zA9!gTZmIC*nj+y0Z#^r@Wt2Kl%1M2#NSiH9qwCE-EYEyAM}B&HV%iv{*FQGNpUCM< zc^%Z>O}u^097`o!=YCp@<*bobkaTZp3Ju_BGR~KNLz;(ZTA0@#zP9V9Gc7Jq9D{i; zv<(>;2AXF8b7t_UJw^>zfn4y zZiHnK;QWMBt~e$~-~QrJzI*?u?;el*>C@4kzxf{5ckl7>oS^HoU9MM)%Zc<@tX_a^ zUTM3nHpMEh(#n)qD@SL=PImjFkw5c;j{1m)=Oc&vszE>{h_34>UV$IpeWaiM=+>sg zPqf-o<3Gr85EWnD>dA8=Y4vv4snkZsMpW^X&r0iTO?lGdc19Yhy&28HBCc3>6Uuou zn>Oro;@f8`D&;oFCuo(|`Ca zEZ*DZ5IA^G_0vDp(VNw){;R)wG?Abs&8VrswWk`2MmG@g6(I~V-uPC=&H>TVQz8VR+G%3i$ajH z{K?P$$)9p;thHf0v$y>Jv-D=Wwk=7PkTvc;yVdOGH20hv-OZbkQBjpe`^XbNfOtZD z4XC~X3GoZ?fCQz21cXXTfeMtVB1s}LB5r@0-LJjYnw`6w8FJtGa&@)OZr1eaW;TYq z*%;-IlBQ_Js9{-4Ey9Knvn;@UgX{#uViuW!+J-4-74cA2APb${RP#4rb=7i`?8VJa zeOn$5p!XD5@nuV69Za>b2cp^PY_AJ|qHI_eyntZ`(3I#RlH`DMl4NL%-n@+nDwdt6 z8dMSye1ll!8W0u*ENKAZ$?_~{;{pq;wn~FEXERKkQV%H$>YBjRSGiao7-X4&kx{{+ z)7k|>Y1g?05tyq>G!^x*Yy8vXU%+v`G*On z{gt_2TvG_oO7kP;@il~ot?7>lhXbwa6->K5ZPrJXN$BCuw1l(kk+^H2+wQ1^01z@p zFrD%qAy1~Uz&^zgBUq348iLGR89$HN)Vqbke?!;%Bm1R4`5blBOsgotq+gdfbO=W177 z3f#K(pn1fzI+P{Tk`Hz`h<*5*A26R6*#7E01Z*v-Owmhzk?#`0mkfms) zD&&U)y6r}rE04p^0fzm1;P48;ZcL9K^>}J*NrCEp?5;EA9(eOk>Gc){cQz>q(RIjm zoHvu2SF=cwd~N$xs;Yd5wpLTHSlAm1GB%)`0K8HuV3mtx6fLYQEZ~%&b_@esRYSEp z|4}$C`YIRXu}VRr764IAS)6rMyFY3+;tb>qfdMv+P#g7}qv|WGr3BfF=}W08U|i}- zsgVQ~`9q<CEpOmPx5UD-Q_+sna*ZDa4QTifk-bj4s@8>%-v zup^r@5+}^;(FD=_K}Uoo*QpO!zqVr4uCD)Yf{kbNDWOS{ zNO?AMjGQ(lyc9WrtPVJqMUJE?VGOOwwD1H#HZ3}h!U+(vCQIk6Q#OQ-EPx@Ecyk_< z0bMq9p`fX>-rLbWXkg47!y zOl4CCU)`UoQwwQET-d&rg4Q+#fHUPQr z>uj%EGUaB~Xan(bHs0+ZPK&aqD(nfZ(553u-NqC*c>9Mx*%U6dyShN{TYzaar)KRo znA>f+^I((~)7%ls1X(u)k(f3W1vK20>TAARu!CdCA17&pOA0J4z@1XzUKfujZqIL_ieRV-Qcftb9y^O@eUU)a4pEIoEWEqskHR~w> zJj)Ce3urm>F|vOC^nh`@ttS@y6mg{;;#;rHrpIRR*so|gM1$6W=mnjgpH&~f%bQc|l!KT@VuA8802D=?Fff<{c4+SLh4N9ZwJiNcWv&c0A%G=qcNL8fz2i7_-%p zf$cR=T1nPS>(~KawIH;CI0k!wOS}E?3BLO{;oToc`{o~R=N!Ln@92$rja_j4Cf3}PQTnIXIaJ88cxFnz! z$eYzmT`oUSz=O9WlQ{yc=Bial6bpGFGl$@IN+ELrEf%`MZVjAON3udA%(JGH4f2A| z-~CSGxW%RgM2)aKjby7p+#>4Dk9PCd-`Mw`GCiKv`Uu<MK_UTWJGG^Oekei%$y7@TWNEf@Su z)C6_q*_*yTQ%Rc;SIl!nY3r3f5HU4FXPPoNkJa@xMI=L&ya=gd?8u46mAbI0YIoa? zX>)yn*Ox7JA;WGkfTlrb2@B}T*#S-h009*n%wE8;0|_rCebi*Y&Y`b1grjNOGS~T? zhACuC+OWV`U%FBl0lifMQod4ZE@$IHosR%!S_mC%^p5|DqrU?p%3dplLSbWDeTuitDr#erLul6@o7sq&E4vR2V)$mMU)} z-qopvdeO8ewy1h$Y|BP40s>_gBS=;fT2Me$#_Hw22%004 zu!7SDYY7Cfwi+q8M|Jf`FoFUz+6*Gmgs+V#flj~$e&z@`WwZqh*2K2B z5@%JN(PTy90xAk9mjz*H%$FBwuFAF&M(u`|d0h02u#}QpUR#ymU}1q0UG}01fb|@t zN2{LJ&Rbj)CNygsu4Z8cOJ*$}E0MU2v^cQ>Cc1#i2?@ox&JQ!CRgIAVmW8$JN@A`` zg@{=S@*qq2GE$cD-EUgG{Ox}XG<}B|I%sx#aBwib{T;5)3hDiCt-sg+KmP;jKQK(^ zhQe2u)};fiw+CF7Yl^RX>2(A3Y1V2%VYWhWLp@SU{y(|BvA&x%_w zu)W$9;Kdk4X&88O<*aoB$@Bn_J1jvcJP@(ehDUlnS5>Y>6Ni>aq=jW2Ej`}x`NRgU zgB>%3>t53;^@xwUKt>&ih*21kHa|mN7DO5Gd=4<5CLF9$?KeF12^xF_5)L*GtvTJB zlZo>nnsh^X%@$8)kM{@s=EDgd6tr&!x_Z~kn}0GukAuCDM{b)LhGwtb0_Y{;77{g$ z0bgv;HG9Q*GS}^SeLmvd{Rv}czy8=xii^kfwtq#_48&)+r0X7?J zTn`Rs(2k7!8@`)g$=x0B&9mvvjl#{z@$uo&=EpNlkw6x-<(Sb;t9su6?Y^)fC+u6W zEh|C8>Upy9-7jE-h7Lc?aQBJf?)DqFyxyDIdzcR=INUx!=L!JuxNhFtLH2Zad_?#9 zt@-QL{KY#oZs6115x)8EiJl&Qw9CyF`P~)hGFlJ>)TCJMJnPcj-frz;_W3g+=>ZxvH!D4|3 zsHOB*U1O)!qPPk_RyL157fM80wfeQQlF!U_rB2j#L6Z{Ru~f+#>4a!G7E-0P|H4TI zph$I`tj2ydC?H_5QjkKuk`O8|_4v)-Sh`c>{myW_r}bfmbqJQ9zr*`K-sn&N<`zHC z$j3#r84B$t;L9GUO4~4WZ3Eq~g>LI{|J4=kzxYDC>z#%DKz%4&X|@a-xV!m?|M!3W zFY%8bGcX0qY#7i{Jv0$RN1oXwquL_Tk}G+55vEnh3;=zjFJ3GjEo*gMZCXYj9J(|c z14Aj*O4$m}qNX80(7B}EP=1_18xLp`{VD3e7uFj^V*&u9@U9@P4TvGs~AvS`T1M0x0 zg%{R-n*pn5T*=!SfH-4qOo3#H0+C}7*OAWvU@P!{{`GJF1%hh9St{p(fXI|y9<6zq zbjv~nkkP!DYWZLYZCvUSa8KeE;3%qn>!42Z2WJj5a}opa#Gyn@M-35mI|B^WubaFl z19_3w6=r5pWbOgmvd}>b9T%6Y79nFxMycd@V|K_T6ceEF-b`nx9mOFs){a3jNVyi@ zB{d{|OZYfi*+_1gVOhZ}5y!N`EHlJ0K^0D#vx-SU?$Eb@%xb}H5GkO`YdwgoipWI9 zB~+(GO&5^jT-6-Q(q#?A)tD+{+IsV41GgQyRZQ4{TNj`(5EptyiamN@6f7*LHYQc$ zAWzCn9XBA$3hay`ZA+jdX@c4yP^CVlfG0~)D6T>&5z=C1z3^B6WQQ03{=Z|oWZ>@S zi0*)V^8-$|Z8fdAOBuu+DZ!RP4$y#*bh&&c^VZOc4&3zy!|n>H6zA>E+`h*(U*qR> zV~1}a@SEFD`gj-dl;)D`m|wRbertUaLSwrMo`!adTR%eD?rDuD(Csyzp26;Z`b>ri zr?%7kqlfd4KN)@DY~Ac>RJD(P{I}HR3~#@9MMR@Q-ov`AcymAD!@O3G_5RHUbn}`+ znoPZrjTzB`ZC_<*|9p%6tJmuK0qEiHF+D|FXM{YBrB+x-E1_PJUHwvi9R7*H)?pPTzg2%iX!2({}j-$Jppu zW?2955BT|aPx|>!6OCyFa30*&lh1+|7gt8hv5*n%Lytq)>M)R9UF~7>#el>6SJZy7 zp@vI+TCCuObs_k}U;PjEum1Z_G{y``1Y1OyQeosxjlWPhT@yfJBp*7<(@OOk@yLc}IuW`a;9_dRM`<$OR_scMcc5J)OT5fSnV zjypD;tYjPTEl6BmycBYwpsKd|+N5Z4G>|Q!n+d5(&R5&wf_7~U6%1w7lI09hNg*5M z!Z+7~hK+fm+W#koakp6eKF$h+Y6t|NOVxY;JeM^fSHP|FR^@FAD$HWlB@hM795Bpk z!pQ&W*Z<_d1jk5GEfv^P9f=H-vt~b_Ga(A7iVW=%t0tb~2{jA=kRhm}tO}eJ7Z7L* z)=e`e0ra6Zs9Q;ING0*5n*6H*a9GWUj>@_#^GnlR+Z*u&$#)RKmIzm?CdX>EKfr)r zjxuO5lg6ruK8_TkVl~QkgSmAilJeM~nlrH`gme&?BWEJDafAt49HZ9JKh5Rk0xub0 z%E@f=nmV7b1<*WrjH#f*6Y4)|^E+}%tQFhrs+Nm?>98HPFe{?Vq8zOzh9Cs1>wwPB z)|10!&ESUCa$Z51uvvt_oT@2!7fRY8Z;DG>Ps<88!nO)`x;hxsMrY=+j#sZ;hjuo? zc`*V5)quQ;K=5p)@cvh37ysU$0X7$m;fQwsolf_R^3@g6zExg6Q2Ox^*Y;~1-VlUv zLY(e#nzlgiuB4L*>Gl(h|1Tn6cG&-B7JqY~sgtMux+uRaT%?z^SBEOx#p_6RgPUxw6Lu&wrZr%-F_Tl`=+(sn_uw$vbAs(P@%7bC`?X;CsW>HSinq_j*qjZF`0%- zYN$Z}S=|y@Gb&#MR0eF{{25ZWwb@!a&kg?Y>DHb;{RH#<102Vt1d}b9F(+s7`3&2O zYuqZR*MnKN!xRaho{l=+-txoEsK5Wy2mJKYk9_<2v)=#iTln<5N4Wp^nYPYLXqS@5 zKz&EYPY?L`nB{5yL_dG?1~0z+6-b)N9TWPEH}|gP_U#+%FR#tvgnIKM9={tQJ((G_ zq<+RGZvdK0a<6-^VTWi>h)V{cq56YCp^0g!y-3jy^? zd}NXelfaTJ3=_jkmt9Hs291z=@j0Pj3WbQ3XA#KNIHr6m)J)}l*TH#p7AR7chpFa* zC&NM}#}h1%e`oVYp?O&lp1!yI)WSI*ar&Fz*FDj40~*cQsEdkSm85#BVUOke z3uVuXU|`JIl$+L~oFKRY+A^uNr5b7?SFhH&>CDusr8>|+6pyt74z;Tau-;lrw30;z zq=67TWSh}!LnV=wysO%P!o(OOR0V!(R&Ue zkd>>#4_Z@46UvKC;MKX+B2>vri#d^Rb_H>$=m@;u6U|3!u~AXPR)whGXd(m|l`*im zP&@CMCR-Z~(9lYW!@;1u*WBvq9$0)SZb}Ea=*z z_l3~`ZP4Oz1r3hu6qP)blwS=clu;T*oP#G^&err`r>xX2Ex5Fzd4!~>{m@~~5s1CA zb2zONkVcHV9nkp+Avsf*S$$jByw#>kjmDcEmIwu>S*g*k_D`T$P>6FPb%ab&^MZ)Z zYcpnMOa_}^tM$<3Xp|Y1M+?;0F$U_!v#gp#gXa{pYNM7H&y`77u>9yiXOB(W13vxl zmZsP2-@le72+`qpyc{kp#%pxHYBbDG2KNgc?sm5QG9Ydigzp~VaMRoP+iTjp3H&!F zKKyiq)V{aopZya3_^rwFnT7Y3zq*q4{ubmM)jOb07dhAtye!f#Yu)^k1H@&nCu>=} zQq~u_XWvk-sz-Hj{`O8+|AyKgV4H+kr0`gv&9%}HIKZqam0UrpX@!1GAO-%S77UAm ztu4)^xx5 zf@+V#r+CC=39`&{ZCEXA$m)=e=y_ccVz3-f2#+U?9wb1++ubEhH&19j>HRtKFUjO_ zAqtPlnkHi2bZX~?+_E(cXI-?1rw7K*_Yw2;m)6-LVJJXz0315NzK0l(=*a=K(dLOM zHE8Fj5$1<%-`=dyknv_W>9!4c^+r&aJDAgoSKr+j-6Xo54mNacJ)1iLlFSA8_5ATP zf{X;sPd`Dk+oRj`_UU1N!c6hh>sAb97+07XlV3!Yh^16miN)m5?GEUjv0BNu^G01GE^TC<=t zqy|jI76A2iAUZo|2^9!Bki3wmPEwfAnU+06CHp8gg6jyRGYFLA&1%p9urOP;#0b2g zW={l-gTmshW%1FmU<9k4s#>LB(Mqgrt2!%bvNbE_r;nDt{|xJtFs5kmd~2us3GaXS zK=+68^NlSjp<;_$na#QYT~COIsDT;qc|uUYt|JYXd*j^>`=4D{`^6XFF9yP^nv0Ku)V#5D0Ss_%xC0(dv0Rl*(8j&8&{N)yjmp@NjcVhYb7^G;}I>MZ1et_``yO28xZSyWIR)L ztszHaj0nl=G}pTcswNb!tL{v@zK3KpfZHIhr97NT+CkSfLzSGDRo8Y0eqI550F!9u zw~%6O%r=mrp7bCU_PsO4(NvrPE+o(hSPPg|#X{4QX%li)?ri`_GZ_>#$5LPbQ^BxJ z3!)Lpp*9&P;Zi|Nqz((n^XNs7s4iEJ~~Sf$q9m^7MkNx*Y1Ma?cV72vHG+ydn^<`Iv^Vfv@>fcbCt%c zBY$KDo_#_3+yM3gohVtTorbJwHF5*RMlGxnYg@ylz`bXy-c=n$8`1kqLAYa0p=3dz zq^7=AOf8w*A;S(NF`zAIWZ;P;#TFnPQ3GLEHa6x5pyh*bwHZo6c!UGf~rN)igFHXRG!@;Bj3AEF+7U3uyUxC{3ML&Pp^VARct2%+(SpBZ_wjs5;4> zyq|2B!tZ?z?jSlI1$e+%5PTrb7?{)uv;yf;P zd}#4*42rN&%Z$fovUrTT`}u~dJn&NXz=~^RYMLy#Yp|t^&skx9I?G|~z;+q74Z@%i zl(%ZF;YF+D+@dk9$f@Mb3saj3&Wo;nV2q~11;O{!iNcx}^XCZ1aW&|-JOpn$9&Ne2 zvalWzt#_HSfObmy-ljrqJ1|yWD5Wqm4(gYBgnE&}WA6K*yyN{RFB10^4H85!h$f$>;X8HxCngo_=MP0C$km%n;X^F z+P&J_a=*fwB4pm1=2d@uV*K?_vkm|BOB~)K_ix?;<%7r%KjP`}8RJ=jy4gDG0R=I- zchGKHtX3UAU8!0xl4k%dI?b%rc3y!qqCzHX!izbNdL_xY7On{a2opBIR0%xU z%Q5acLBhTYu2t`H7r^NZmYr&K?l%yp=siN#9#9kInCcxks%LMD2z3OY;N7T^^~L+* zbW7vSXVLSCr~6Lg@yVv=PcYpXJU`BOe~4NtH{*<@vJ4$)P(Y3|sBKDeL~gx-+nBeJ zn=T-4F7*1{CG_v#Lem@imX!wNQap?q$LGjD{PkbS|MJ&IjPhKyEk+L`7m{*xvW+6DkqK&-z&cqVb3cDTW5 ziXzxys<$s528!_JXFs!jOVm)1z6Th(hI~FE`>IBva1(q?0dqU2NcsE885I}*?Vav_gZ1H%AuYYrDo zxvD-Qd(kOgP!o@+dqtsSL zLIhmFthZ{yA_>izNddgBfQzkK7UV>fVj+`G9m<3NAhf$+x0qP=)|4E_V2MFjtRrg# zJc^}><}INYRX-)LFjGZ(39xlqeRTo7wKS8nmZaG#zyu+5R6Zaw7>&_*$5?ORHV#}A zbljI5$mCe7WwH>d%UWJZ$O|NDjDtbaq?8JGzCz273hh7uVBP_yzB7U|*cw4;Uf1C)LB zUc!q8@#qvxsg)$vz%Mk_lm##VPPt@sDB+G4t6CSK;u?YmA>bt%%!(2PLIH+zp(uvc zjl#Eu{i=AzBojJB=qXia#_>5ScqB~E0^rdhVHnKvA;P)@FgFp+85N^SE&+{-mw$=A zHE_qjv-SR-;@hva9~x@(5!RazDD&6iE;G7qkM8CNOb?>|pI;#z6X>@yJ$^W0?%s%d z-!Xi+<;<&|4n4Ww{zi6m1N<=R=MM(UsJe6m%YBq)NYGuhJm(H%G;A)EXTMcDc?-j$ zYrE&YEHXy1^l;|ScS-u!Z?UI{&UuK_$qHo-)dye|$+1v2)6Qc!JX3B(+~$IDJwk5w z)M+kj4P!nd-Jan`X{g(VD%{lAggLcrotZ9;nT;gd3vpATHa+Roy+J?TVTuHExWaZ> zG@MtQ`!8@akc74ax%BGK3&AQlNdQ;!Jw6!2j+#8f!>aIb^F)XHRrbGr!&m7nemLV4 z-eY+Bh&g6E%~^F(x_^%F_u4%(g9z#B;Glky;z9t#y9qM*9%dcelRl8Cb|`g}M6 zxee^zeTkVTFw2@Dk=aR}hgaxNBNHZwPbWCowLIoXx(hID5~3zfrwG$J+vD9cJ{)gw z!3g`!FHyahr-wT{-rm8iNv~eNgT_St#f824;tJC;!}0h5p3f%$_Rxivj`#PtW`)L{ zkt9p#cYJ%em*9}2f264-Fj*`EP+@SIqKGKE4lO2-`)}_VD1*8kbPAS8DF9mceoNc0 zTiacB;_X0B-yP`q-BAS{csX0}Z-_Px#_dq{Xw2wQ;sWNT`aYz1g9 zv67qY$+7?hhcz)vYYErtCtLo5i7D$dbu>VESIGcOyp@8yVy6v9nlp)qO7fw$61sql z6RLJ%CR_@2LNTWSR>~#ftwgAle}}p13m~}K3h)9h8gM>CwNiA%^#T?hC-6#iMp?zk zw?^24=|tkmy23aj0zsBUMh>E2FqFuo&$qgM`Vr5c4i*n9jTGhi#=-gXJ?rC9Qf-W_ zciIM7!H1v%VuZvwWOE8g=&`(G^GJQ@0NYl>&O7tH zt5X6#MNn;-_k;308(eN7JdSvDqIpfQcp-G1wq$5(pmw6Rdu7|pfSU%aYrK)2arIY7 z@yxStEf^Z71xAQfzIWhEsoz+5(GaS);D}ipV^~)%uvNuv4CYf+jsS8--Uv*LG%DLt z2Q#xX=zI&3iLy*3Nt@zO4RTPTW-;(6tW-se(Lplx^%$z&_X{M2SqO$4Dgz*nP-3?M*X(zbp@IY=Lw;s#VZ0 z0Tv38s}iDuO00@q5uyfbU`-2o$L3B)b>2e;G?qlZ^O8@5Oj#OdoQRc?KzhM`DG9{j zx#Q}1wIn7r)AZypfBL_)`Ne-ot{aiZk0!SZs{eC!TSrb8%RhZj>$)@et=JWlj^G}!&SgNExTl-oOd{yx*)w1MaG2-G;? zCKJSsiUZq{(J7N|W@oJvHe10v0q-45=QEvWg3k|P5cb&i)wWXsXC`-P?R95OXOy@j zI3;oUMC2nZq=u`aw?_cnsEbb+ulJV5K+A_mmO#g2*1QAX9VxnNuykW2q-mZZu!oBls>7GcBebVrE3|69Bgzp{TDgF6#RV6e7F#|MiPxwnu3A%GM7jp!Jrnx=Wd$h4YE58pjt z3eMa{t-IXd`THmBfoNSV4=ip$SJEm(Mc!DAog;!9MEpoDB2;xm^@K1>^(n}ip@rJf&3QGG>g|i_ zXY)xEDAbcy5o8LD_&8$X9vV84m9p$g!FSkTLJ_J3!yJ>PjG2+``6%m$zqR=fvyI~k z&+}r(&nH+{qw`w6Et{_@rB$cQGDP;yNe+=61rS6Du0ftMEeOi8DNi77r?`K04c+St z3vW8?E`xENN!iTT2@}QS7-aMRda?sPiSOFqsil1Ezn8(!V1fu$fTVI;@;Yb zGHeIv8_zqRHDxhJJ;-#@>Vss9;RKi)g=QqO9fP{2>@Z}W1+7Jnk&p#NJO;<6bx1n_ z_JhoT(60hQ9@wpb60pFqoRc)(<6>5!2$!nbI&<2C+EH1Or3mUEqn*vxPCQxu~iwuR?8a4&q*s8$-iOX80Gi(pF>D5mV zo7Q|Om5IQ`85Zx*&1gWafF|Ims7_6sGiT9!R5BDr%`dJ>nhcw349h`<7fieZ;uVoI z)v=slvP1{8uGODgH)T;3)^R0IUI$riZVCFF>ybNFubv*wMo1E{uzu)>VO&kv0Jk0R zqAJcqSPG~gvF+ZN!b$mDz3zdN0XYRN_(wfyTR`7bI4VX`+BmeO3BVu}ld33E?>b0P zFa?6P1ZyI5Rl3>%RD}eRlDb|z`Hd4qZ8YG+bF%frk^G-sAWV0vHwTE}ExD^}M)(KO z`xB1z2Hju$3c{Af-~LGR!%Xq@uYeC{pyM5kpR?I7ubA~w)6turMt(ZBuzvN%e!&yw zZ)RH-kB6iZu`652)_JC;^G0QBE~9F2L`?^AnQ-ew;%0!XE5>9tKacqM*n;c54Xxt_ z7QlK;1ll%c?qWyH>A}nuCf&js8yv8rsR98&@>$7e$UJ}_730Uxkiw;e4dX>VQlW@^ z&agCF3wg!^?P!FPaoAvx6S5Oos3TjQIXv6yJJZw5Vp-ewZwNYXa$Ze+4_3hG^i0kT zx@=lND9@ynAJ6)5p825Ox?gQ=*DJKnS(A2jUNYLKusVcCx0NHce0%y<_hAq1uCt*q zpwNNO4i0&iWfUC30K1>PhR%e{lcC>WmsXW8fJLv>Z8n%6R&{$o*qGY6p--O$=EH$D zUSR151K(ii8U#Ek+=@MY{E^1Phy~_Woz}LsJpoV;^ zKmnr<>UBnS4W+D71qQ7lJKv+a-kQLL0@r+~aVj`ps}j8SQW9e!`K}VbELEVM0d2h} zIo_*0e8S_m2Ri@o!JeNxJ|3Q6GPC7Wh|`58In&++oO-Z!Dh$mDPT6eu|5Hyrt-tW_)YOSuSwS+iA*QL;|cd#LVwxjw^T2IY* z(aHAF4Ytpo>wcTfjRTRErqIV*Vg$0pL}_+-^%sAJzx+RcN^!ZMkN%6_!!Q5wUzuJM z=EGS#cL7V0C=|ZhUX*e=2@QkQB-aPf8Vh{yD3D<;D{ZbG>3TfS=~(0BsTna0dsmzp zDZ$Q5;U2w4SEN`+noj`ss=3hq#^n0)QMno&{18li2F8&nz11RnUgKIoCxPQaiP?Hs zph5wRye>_$-grVBwx#oD)}>I^P{1T%k(Ai#R9m(kh!}6~kDs*M{c%S3EEwT@Jwc&>bsH6 zVnK8SFBZ#|ot+HzYDy3AR9P`;bFvO9Yaz=$kq296>Wi01rjr( z%(kQ6F=CuGQ3Z*i9xzI$dt05D$p{W!eTrOEm8A{a(DCqAM{{C17QWaR_5o!z>QX|5 zfwmO(MmiVAzK>-#p+O55NyWkrl;)z%g1zaB!(0Sijhapi5GOXKW2NgU_QN|{=*O8`=WgMYph>yt#seV_UaDn!%+{X zC*;O^2CeA77CO-zy}!%mKN{%iZpHC@ukp=}yk|_MC*w2vtGdJ2MC+|}NLYt!UgEuB zSrIw64qfg$S(iai53lHOzcOE4VCM#ds%@sq4F|);rj5V(>8<7@jN~+IDka$#$|o>V zk#56j8rUPMX~ZcD-5wLd?nwK%fkWE_0fir=CJIxGdR9%k#Wce+c3ulZz5qq!O! zg(%)-dLum@=ar^1+vBSz7&ir%-KciaA;%N*>#uFQy+M{s>#qmd+<0``$I#aYeOQ&^ zldaJ0$<|Ll<>{NRb;ittU8Cfgn6Ai9*0dBJr3_?k@4I(_j9_aC3_l#ZC! zMY-$g;)8G7{K>EI>hPv)wB}y9+`e4dwMysKY?*YWB2rSR?5QuX*m=Hr@k8>w>X*m2R>SPJeW4PjC_LOy9h=x1X}PI(K1; znOmu}dGKZmYBc2$nWQEPNXnKC{)6l5@qFZ6vNKZ{-JD(#FVd+H5q- z#s)jmR2(xm+fywvD=D$Z)Xew_dV`_TJzASYtXF{9IziB^Rsn+b5}abBv#n($D^t@% z1NE%a=gLJW_aq&;Hc3>XH7){j>`)Xw6WqS(`M1%roOxYWwcDT3tH1dg=Ql6u;j4-6 z@0^xO^}E?lS=8K0-ub3VGK4*f&fq0g#H{rP<{-sq6%CzPNrW9qAaC8ylc$~HMrnNZ zA+8^bZJu8l%Nr7Bu%RO-s^&Tb2VKIw3eL5*wt92twCP=or%2w%M=!gg5oYdUT z8|4TbTl%I}!4GTEegl_R#FUzdAT%S&P^k(`lsmCvl*FUA$wC7b$VwayDR>sjMk!h9 zFInS6&1q7Eh*-@ZBzZzul*lR7plP@(lK?u5m-&Elu6X)fIN20EbF~<-h#aNB@vb4Nc`RwT^9BQ?o|S@P#*? zD=hKNXu2>GsUlOECY0V+0P^jJwYj3X2;7k**f{=xqM!fIxdPJ?8-=^PpWFB)S>GaQWf(dkW@^R z9V%dmyBp@EAaH`Tu}TMD3cHxK5O`#^HBX>^D>YELwU~&r=sNNm1)E+iCT6c_{?h_l zi?xO#rcwg}LcedXkSrpx(v`HnlVxToYc`5T*b4vub2xBu;kxcFIJ?>|*!{pU-224i zo}GPd{Q6*Px#s+0uiZGZOn*b=x1jmOw;)dh{`k3_ewE4HR8Zz9eKzC%b=DjOD{p9s z(Ejd-H@6#B&Q>liQPQ6AFtsPK&c+(zn4qX^xx@r(`@W&lbv(*s6E664H)~YTaJfgf zAJGP+xR4K{^;f|h0+5ZwopIy~_|sW}PnJZ0dMPPc^P==mEWZ4j4tI(WdUQR|iLof@ z$`JC7L$2(h*H9riMKaj{@j#gw?<`tJ)rr?_ZxWJtEt=+u@5`P}1$1{fT2~l1TW6OSTfTCcFnx~o zH?M3u6iQ^!{(>(q_xgD33?=gGJL6S~o=V2)CW&6QSP`L?6^^xAIUe#UdXlP=k_4}M_Z`%m8I?>&w5?H^s!cfNIj3;zxBm*3d= zR&alJFp@pO%?*wHmizag=;ql4vCPeRPy5mu=}E07eARSD;ogE}lnRKAE5Q`bp2*p| zCwF0EE+E>nYDNhI6R+>4ILx;OKH@F;HjBMza?QV9%~QQrtq-c+$t5$p&bJr%W}{wd zk%lIeLoSnLLqV3J%+2X6Wvj=hScguF=0FhiD0AQJe__SkZh)E7K;VL=ozi57Spqy( z1{Yh8FL8SL8@v0k(1X2deh z#5JgQ2^G{jt%<@RY&SH9Uj2T=c(Jp7cR}Ox-YzaL?DER-c+qnZu`oK4ePx?YwA__- zjr{4K{lECP|HD6{zxwMV9gA7Vy_QU<`7@^@`QBqY)^!;Wyte{k8H{ozGn$|)tguP_ z-m(?zwvUAKqQSZ*T0ah5G3O}MC8k`Hmgb^doYSnrhvNZGoOQ~)31p9NF7(m9$Mw^| z+aBDzK;|B}6w!>p$eCgxf{?OtCHB^NCJw!Uld)&^fKpLJs#_2_BXV%Usf?y+21Ag= zbExE=eN9`e))%2!VnLA_d^DNF#fmUnUX{CD-Dk3zbxLJ)$%+{@--wh^&m5PYSFQ-N z1GF?zez2>EK;WE8TBr!DxRL8h3KnWApE)s^E2z693y?f%Yaz&LBaq)!7LZP!d?~aB zhF{2<6C!owy85Ta^iJZ|%IbPZNbel4#w@mqq8Yd{3SjDhdeNB7Vzv^Ur(j9lb~I8W zUf0I8OICCvDV+^2%;RN_QjHqvAQ z+_l$rN|0RFa)L``UoZ5*Ef@FxGotlBs2$EU`^RLDMhsmCcmAuAUj|tp zKeByyCXKf`-Ff2Y-zE+Rbhy*IB~tV(()l9uqK9Lqm&r_CJf(}>L{g62U3XZ94?(X# zL$KHI?upIu7QUkDP7pInzwdd)k-k_vrPJ4xZINNPDi`ZS^^03sl)YVE2Zm#yP|2D| zGO(kw72Xv$PYnN{OaB4)`6W$ZTe6+#es$2oI&6x#8rQD1*`l-r}X@p5Oo zM=kxJpGhY>u%8|kn%~H=?iB}}PjApCXBYcI`#}+~;$fcY_A6&Oya$BNR_?g4Ve&?A zQ=&JA6<@!4Sw=tLa6HlN;of*u#Pk}Q%S*TnJ-z3sz@<`;o0@jwIm~#c%BaS@bTZ`t3Uk(-G6Sptg6RZm1oep z3F_A@$TPup7+h1TQy2TDU0_!ZzBS;VwEn9l7!4~(yJE5LwJ*y%bae5UhbvFr{z9)t z2ilC-UxIe*jrXP%QJKr80;Kefe)cE-UVi!~pOwG))lu#qL{BTI7oxH*B%vnch2R1P zu6JsMV*!*=X_1>*TVGdAE6!7gh!hIrZiWVF>TszqDjtSGAg4vm8w>5ql2=|uOPQKw zOliZ^(pBuGqaW;YyT#^m1i4Ff!^$n?;!#EU(!_kEN&6_Jm3i|BnhzE?k0E+ys>@r0t6+0C`I5u;nu5S`LjFAX)HoF{6DjVXJe7A44;ktl6PNd<9 zvY)K=JeapNCJKEdY0qa{hP_s>|!$b zNa|R}v!R?ktA`2f$c@n^MuZoVjC8EfY!~_Y#bb#Vi+f*yz2`m#XD(6 zCF__(D~(X7Y(RNw4Jf8&n@pMrk~UDwiHJMs=|sk@zX#-$Jd)T-hGB!5SIe6VM#pBa zPE_O(yU_{_p6T!z=U1d<^F+h8XPZ7X{X&7=1^eB-%G=j`da0`W-W&yX>rrw&8xiIo z?d^l#+v|GIz{^1|_iq@_#8w>eP0{0*U zDtbiko`Qw|tPjmnG{wES^T8@O479wo%BP5X?ekA8gnsokr z(qXrkN;i&awcwe~4~w~O(`=uYpcuU4Z9mwL|L_m+(eI9U_U-rV(UTea`WJfs`PcN- z>ru0ejMF`?Uwj1jz30?zNAvL;<+pFd-+ZWRF6Kj1H$&EY&MCaJ#Z`rK#TMZrO_^P# z=6|zHtR6K1z>77hc4XzcU$!^zxMW(`nHit8K|DjHej6e4aC{(M0+Jm-+^cJz>IwMsNJQdME>?`r`oR_(2f^4RubF+#U9+s%N zP%|?WcFoPT_+9COM{gb3?h$oTqT-=q0U`ixl+#(vdqHu9`p9iABFf5jk5UG6s|*CB`DDH8 zbY9NbAaE=vjQyx|SX=EI(}Hp1Ij@EkCXOXnfFLAP>Ndd#lXbCO-|@}UOYE+@a=qP4 zmv4c%0kfIoS&KT>61B3oLc4ZPAqTT=M7N%_xD`yD#F__sK}U&GO{S9J($pmKXN^sz zk8vP&JJuD7Zbq7wpOBc?~-8x7_ z{jUxc(sU4-APAV02;xcptLH!d?TIl((8E3J&(O0WicmSj2x zxOIhRRmf;;D{aF_>%)v*x+Z`XUB_6B#AO!g6~R+zx@le0Wu~zw=OZcan}ngb3~^*^ zg^L^ECF>drNJ}%mFRr5Rg(y;GI;bDuv_}OkIS6D8Xi!(%xGLJpw$H}F!!-FAadBLFDoGv_hNMEn^!<ITDu{)}{FKwD1Xj*D;4cNHC1Chcj*QncxZ%@zy)nX%&H31@9q~iBt zSs?k8OXpVrnH|;N!!RM^ZUmN0kPZ9w-qLtgk)dSGsyfK}aK`Pg-_m)zNB{m6?buXk z0o=&48fk_4#9U_OllE8>lXM-1n;W{=Ivm0k9Y|<4!RijpVe{?lukg(`FJ(HN^oviw z72*r<~_)Gi9AiT!q6fA=r+ z{?+UHT^8h$&(p~$GUaTzeDN*1e)gW-{`OOjtJ9K-m_pCXTi)M%%XAW6bg2voSsa3N z`r^?ZfB2vNJ$&zv_WV0P`aqxW&d`@H>HcpY?B!3t;nQs7#$>~L-^2FD@6mV@X(Kfo znpur9URCqE5*X#w47IZB6-EGqoj5{Tk+nDDiPBo2+dILndj%;j=8-nG4!nRf~ukv?*K?RWj{3`lU6gR#ZWq zuX(>x8!=&Ou7MhjYA(ou;G?N`Adb{@Rn{}Ht+uR+`%iv?pZ)P);LG2zOpDnXSL)fp zD;aIJ6f~L<6NioiVks0v%qqHoNkC7DyKx6&<}QTd*-?1$K0?hKZs7i=$L6}@-Sa2< zWbb%?9k}0b)NgjemsgN28*eI#kD9iFoRia^{%?Ow|M;JLircq~%uSGo*`@kDB+e0& zW;hoRde5$AXbKdD0`se4j+7**NF$D?x==$CQnSwq=!+ufdw8ppU7ySX4q4TH6rb{#Ov9}>XN9rs35&@cM2Lb-rm8F zJySQ->r--RBDh2k%B6R(ydp@kxGZE8G?M{7LSp>^EBugcCeT(RwPDlkh@1WD_FjMsQWgQ+78$W+#>Ja({nQW8kgTud$y@=3g~S>^SI zV<8c;B~$c?%FHF~)_3!oQ>kGFmS;Hjwx$f%ljO)Y##Ix0ZmvZnnv~ha38@Fi7*LbO zX@44Wsa!Dw=Ndybrpgjw03AJ14?6-`Si=x>c>Quq&sb-!kiw z>IGdd_6X+_3dDR`VJYeTy;8_``gQ5;=)G=PaD}6G8NzO>lG)+tz`4e|w_4!^w0mQpA~`<=w>GaTdSbYMxhQB!s@> zvKZAgu-ZyR&!r!?GCq1ow(v$V`~|MeF* z#V_^A^Y4S_2RVQG8@&AGugm_~cX9KbEA-oIig%ym*MIr1Otlw3?#s>1`#4TnH_iO2 zfo!AH2>xa5RsK1$4UsZq%Y`tbT|lCVYZJ0rQaVHA3@HTvOy_6Pi(AHOKyf7-*9 zTdcqMg6_XO*_U5TT;`2#pI_n8i)Xg^;WOS2nWT6#JDY91@Cwy*gp0n+<|vj5@Im5_ zlyaa>_L@sHpcn44VhSexN}5cuW~et}4X~08;@L?-#?fMpeAp->Fug0I8ci9kM?eC_ zIKg#nTvk{OA#e)kxc)y{$BsEmnF9Fx zHW0jPvfY+o$sOwXL7d*|@h3mU=RYHP^_8RM4FclI#X9E<)RB~9DUMnlzm0d*EF@&I zCY%J)^-xkU+tQ|0U?<8xoz3SX4FT! z3-gZ(`t1PU?X=mXr(jld%_z!84|7vd?(gw&U zuISdBYapDoI=EEq;6DlUi5qq8B4(&xHw{|C#{CXngN;AVS*_sV)L_9 zh?86jgjEyw=<;M!k;WN|RZwjz|LqTd?;n~`tD7?e2m!1aTJedlT$&SgQEjix6_iw# z-kHE#&Bb6Mugp0|46WHOQfVkTH?tth1riD|IbyFwKEsL-`;Oo$3RB}$^ZKalW*GNE zl{HY|h-iX6*>Xf7P~}?nuW3S95VOFBB{FOalUo(LA?iI`Y34W}$%M#;#onB|UqSEzRhq=P0VOPm2Otwohr z<5pwRL{^#V8fgrwx$EB1`bH2Z|ax7d1PrYn)hZ&0-%$0>m6)FRj-H!TPP*UQAVBC_GhgY-C zM>?+^cXbQRX}1M7+pA`}vZQ(g*hD8N55PL2%$cGo9rMU{Zy#_#!0y8jdEYnjE4aui zn*tuU#D_zTXoxn{Kq7BX2`5dkVT9TVZ{AF}Ki=`(%P;jI9^`yH^K`2emzl%_-OUy4 zh91`BT!Hm$Y89oDBX`l6Q*W*d#A`9xcI@2+Up~1m-Lv=G+;4jL4CC+qn0DW~;nQFL zYdU>)#^%XWUUTC6FF)3oU;Pq8cPWpqUYOqBS~|>hf0*&&4}KR{&v&%E{>svq5BT!e zU)sgxcM-O`WThy!~y#*^Rs(#2)?L?_%?vOCC0p zfr2s5AYCaJwwzZ6U0O5Xt02)mHOdoLGF2fryR~LhZgctB39*r_5lNclp9xp?=FM7P z@R^o58kgP@6P)w#8&a{AxF)QrSRrBcgE~Z}m8hZ}_?oGTxcZl)5W_bzqfIaOk!9W+hM#p%jKE)X|6;1ZGZOzXp)z4_(O`ORP5K+L7zMp z+U*?ggX#dIUev;6C&aLRykhB&Fv_3|w#yxfAIs~He}g~y@Bi3-^V)b>Yiu?$F4%4j zMoc9oa~8#FXx0X8xbGj+KnrZO!b7g9z=8yhd1aMk%pEdU(p3x#;D@>>rXpV8YBDt* zH-nCTq#3ipZIGpY{m4zW!5O;kK-+$>7f-kJbo9L6c03MRy87ee%xS!^Vv3p&Gt@*u z9Wqhhlk=;hrW%H#x%SsHt0-2_v7=1h$j;nUiw0{i_z@dIJfrd$k3CkqBe)$^%+H)y zX@k&}x=*d7PJ?5pQd7)YGsx8gSh2F1`a-f0m!UT*iY%-yq5jv5a_hCTilHe&c*8Ny zB@A04ogm&3>x#&o`HG_?sA;q9Cu!C{tmZR|4F-xv+F3JtGtW|Y-4iFB;1jb`>)wgf zW97 zS}J5euW-!9jx4TV=L?WQt2JpM3S(eeTadA23v4^oWB|WLT{;rC)_bxip&BJ4)?NrV zhWyz~85;=aGR=;4`No=(==w;~?izkKi(5an{7tcZu_w2=B3`~mx;u(KdSclD<8PDQ z-8wyOZqU<_hd3i%UmIpsnkR|4G(Bx;ySbzJ#dk0t?lEgAL%iei;zQ`0GkA$K%||_) z95Z|BpKZ-@w$4P)hco=e1{`{|(wb{&EsOa)!LBZWDHWU#RJoKbx8Th)Ou7`CBPGAH zZuB-VaZXe*D@~`QuIpvgq?i}eP%i^pibwLPr&4-&iL~Z|Auk0W?lyZKIsw5{ZRLJC zYTj%aaX}b*BtIh(C{0|-@kqZ-p!dJ?J#2?tyt;~uZGY9<{?VTEVL*1x&7*|rK|$VeJf!c z4_}JoogS7qy8H0EBD+WBH-Gsr$(Ajj@4v+E{om)^)5q$%OgV`i-+qNfi~8Q9YkGFQ@bCRcdwTEhexM&b5yNF@8VzGH+Vc6! zU*pgJr+;F9{tM!j%!d6|y*d#bN=gFu%1wa3bH%NdF%g1WN|A>ec44Ei%{8YM%4KOK zQcJx-S4oLVX$U5^QHy}iTsIaAA|kOSW1d>4c*k;eN$1aAYfdON35B!=*#X<9*L2bQ zLOV1^QIt_~pyDu~pKoQZRKg9gctkQsZtn{Dg>~4IpBF2AUz0b27-9~_X$FRYr6kGC zqVH&O-f@)PoURqySwAMrS()9olx3k#LTi)vxnfLkfujhoW1Io)nRiWco~Sr)K?*qvDn&S3GDc^*u29#JHacxYTTf$VB~tdJHEJ76Vsb`6 zT>!u~8}lCTq!T>~uYt;5+T4DsKSnyKP=#Y*Ysv&$gRcNVAZu?HmkPBB>M9LGs$_U2 zq+&)TGGgJBvZkrfY0gL{be<=a?h41lnad$-AV|Bcwt|KY$CS-A9riu(bXF=J^$>4d zYjEVL$Dh1hL~YO1gNzty(XsDiz^!zDOHjOcuarQcxCM8${%s}%$e#G2kc3Ymm0 zR}``gJvcf(uckE;Qb`cXWZi~UT$^}G0gzN_=-8x$-J+_CAe~o)HaU^>=|_>r%g3@`nxhouo&d#^5?DgTk)wt*L3Qe=Ql;Lzs%XwwTFyC!?GkSXb{&Twd z?%%QX?qf=Kuhc#No^`h3)o;H>fBD32zjgA_6-M_@!w+n`gK&d;?;}8C>@%=0QLz)eV| zB$U_&#aaDe#VRqWd)>Ulta<%+h61&&u)wzl6lPjAolZ8*XL<9<&+yql|CE05(-|+% zp2po?`~9T}&n#u2!4A~(NHHI^au-LysGtQMX^Ifvk!7JU?ywsJ+|3gU)6ICeDl+PXMg%X{xkZM z|B!H6SFG?DEVlH9!tDECODeX}$YpJh+9sott%d3)_)dr_;2*af=S1dFaR4+=T(ThS zgis>0HB_)Y$#9<_7 zXQ~+ZogsQM;|*&(f^u$h{9Kf=uCVOEj#U2Z-}%u$qBez6kAxB$K~>_KYyvo!!E_)L zT@;DA^!03a)TSR!=g-MXx{XmGK7i+@0Es#fjctkjN}aNF4?)B z$QF7xaudn8vyc-jKdzM33OdU5#ujNHD%F)1G2vpA+G`t^WHlkOidV^PE`g#Wquf)g z?P*~%YYipqQVFNhoH~wL+HCN=x>o<2EH>30=^T8DTAN*w%IkG#KulaiO6#eUJ6+2DQt?|s}ZjBRrUGj;HI43jWoMe^#pZaV_J1sJh z)Q>&Pn2y4Inhc!*?D)7Zs4OiWcQ((SyD%Gdftd%ZTbQRkNzKB+fl^@(OQVHaQU|HH z56n6zbDDUb3sK5yVM$>#L;Qslj>NX(l+Ri_7ieZ0I?!~mWC6vkjkwtMCeqCm@!)jC z=q{m)3#`g5P;yP{*zS~HTxR>?`5yaWwCjDrZBgF7-r4oH&#~+mSdSNWdOl)&_<+tX z-c={c`{T}zFP_`=_R_w6^+Jj&TQO)>^6bp{jj`)xN`)-#l}}c5wmPSi2N$~f=wov{ z%k{5*Zn*o9PcJrn`|LL;Skd*9-_V<k zg{AN#;bOhv-~RLy``&+amp}gWJv}*bn129CK(@dBGrs-mfLG7=xSa%{b6DTGz}XMK zN9*@at>*(Z#ZTW^wgndil>Lt9xl>J!3$j^Qa5ulT)0OoAFG(CJm!{1iOa){`El{qY zMBW~RF4*Wmq8@3ox1WFE0UaA(YCas`X3fp;mV8Bg4qR(lXwt9bSWz(r+onxIxr*oO zi&HRzdwby8`fS1H>xFIB zM&}njkLyx;4|FQxT>Y9#CIi}2q)vI!8Cj_W7&3b3*_om9oX3@3e)jM2&;H&Y$iMwn zvMD>E0`0O&a*n(UP>XeQiIiltJh2>);7(+ek=&Aroi~Y83lCYBDJ;iw*xpi##u7$r zN-QcyeyOEcU2_BnbKR0H^sLqXpl?XvO3coYg95>Qd!u#VUN0HlytrEDTQt zvoieBGBv*+b6U%Q63Y%Qu$86)q0M&JQKX^{m8wcfTwgrPjQT<*W?H~r6Os33mGig3 zP34@WQcumzWH^CptpS?)4v}!q(ad#(I9scSnwdIhMG_75?{Yz<^uo%iHH4U&Lo-~3 z6SGL>dx!cuKKO=YRlPWqTIQIVtxP;>^e5!=mdFJhR7(g4NfU~5gJ4uM*8}-bieCZ8 z3Fw2y!$dSBiYe>DJSWN8(5|Su-obNb(P)UGhsrw7Psx{?La9>QtgTnTZYV3MFC7E5 zM&Gje0xqvuZ77v?tIXmiZ=Md8d!w9DH?R^r6pCyz!(_!gk#@S5lJ>=Bk;DR`$y_FQ zCuF&3ph?hobUYM9&NffrzCw2m=8|dY2XTE+olCoII~JpnXR>*=z8xhy@WPWWlJWs*HHXT7s52q4=nEUuzO0Clo5T-zH*jczgD+61-1sP?vd+Q z-Tar5pO_^&QG9nr%Y4Jz=X1$-AIj-jul9Pj!>=-L;}Ujp$F9D9X1%_oesPD(>IANa zLs&t7`O5qU11;|aygI*UZ@yw#-#oLcN%Wv>@7P{Cbp^i2oCj>~EFo*N+dRnfaAR02 zvaZnWZ%G%bb6%N0GR=e2!(q#>UT!shNOc1hwrg&bA0WbQkgR*;AxaNn#Q|j-~HAUO&8#{;aQD zjILjOg_lo$qozaCB}u!a-T`IG>VqI2X3R2U?CO8)032~N;Z2ls@8Lxm-+vdw7_fWt zIac=`lH9+8>Ew?ZI8e5-3wi=u4MO@FLnF!NZT!I#E9{vr*U<`t4C*L`Q8OHUz0zo zVaSqsp%$YF9c*US(h-%&M79!Or*NB^$F01bve#sRLOg)`g{qr?$)<6T6-Msq=D6kCS8wda℘8{qd16_ZcS-H`1*t4P2J6 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 z%0D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%0Du5VL_t*E5ba?x zzjdZ0Mj0t5>J0FxwS&Be!4=KO7miTwylXjU7Rg@tK$vFVT9wA^t=uh!1fksjapd5w zskKmv1wJB5_v-q3#fSS3V)WwYum22febVi?TBHTX>x+MS|DNPRJUd}NUEH~hluN|L z4|@nNMDyiK;wk%ath%ja>!aDeUO7xNjycn7c!$3_P5v)Z_5bo+#CJ1M)K`}pJU^ZN zh9VRhSK7an4q)foViI~ zh5<+u*ZaY?L^<}1hDoh-;opm1>)e+`8_MpadO%~+AO|W3+Lc@=5*Yy_&~5UE7H^$w zPV8RQ#=&tGqI#o1ar9(`c^V^(H3eT%=EH?GD31FsCLLirGo=wby4L3NEIv<>Pf_q% z*zZT>A3r^CT@P#oJ2sX3y82y-9v)Ek*Us?CbY?0pWp~yvTMIlIsk=tA`a&u*X}(DC zgR8JumkU;K)DbM|jk_2LY$>v18$Ln7OMff1#*_QrC?jGtPdIbnSuEVZ)9fuwGzPnu z3vs4iNeOv2nq|zENni6btRhmH2{?br$|sV?C$DsY=1D_J4l%c>YtVz^n`e+Oa6TY8 z!I&T^I*B01(fUurX`nX zBF7ZR)(b5z7Z3;P6m5ZQAJie-*EglmOCORY($GOrJY3#_a`H|3X9!wIUFrC|B${iq za=$U^150qG*z6Q%G6(e7_^yUV?(sCcpWZV3&O+{1A2={`@@p@NfZqAw1Ua9%6D@rt zqNDcjz%yCLKGVZT_<;vtA02-tI3hTV=`ZUKA?#}K|Azybfyt#duO4Xh3r{0k$WvG2p*nRKjk6a`!u!TSoTuYprp0;ga$x{6j3%Z2PSnm! zooo4AX#T^LnyIdxuR0l+jr}ljwwqXIe9kmrMK@;(?6Sj04|7HUsDX&$1wLpaJ83d$ zyC5Fi0pE?Cp+aDn&ILvYmAP6kLfR{KC%eo=(AWRxw)PPR0??HPLemDSeSKw&SWAw= zI9!V>*5T)0*;>(M^qDoEIYP|1DWok>pP7TZcE#ci0(-7xzM}48 zUYWb7K@-uBJ-ETWen z6k2hic~qxdf8=>%I=8i-+?U zZ|Qk@V_g-UfAJ;ebTU4O$tpl6#<2o*$LWi=x;DYj(P`Z`KjmI~cZ9SsX@R{~-Yf`{ zbDN$0`JLVAq`&>s;`eo;Ps;x5|GUZWJ_frp1RCg>+|R6LM`2m|^FADG6eVz@2h~zc zUpEUM%}k(mJ8Tb1ZGZ9Y)6W)iCY~F`n3U21*NsK*R_oZQW33O$t~^o_lr1hyOK}(3 zJRFV|XT{-IW1|!jSvoj%uHG5D9KxfDxRvby9S3#c+j(e)u$M5*Q67(-VS%zWq~?&o z!wbWhsT{QzWW#Z|AFoPVMGiCVMLkv<&8p3b)T(qz>!m}T6T+~M%?o*F*1RNAt}NG+&P$wD&dCtgX9m(-TqKDU>UsR8M1GDG&}duEVN( zSPCa~hpjYnxw#ihH{t|zNK6h$7|x7Z#YL}hnTEA34||q_5~@SuNF@=;(8vhkjBpC- z>4|xo&0Q4b0438ZnUX{w1jq~=oV@&u8iV`(5RVI)ovbq%n%_FTnW&}a9vA0K==!73 z$#Mu7BeYBw?SZ2SUViw=-~Y+DtIpPm!_n-_qCo-*7Z@56j?bRUjo2EEt@-xo6ZVh)Y7ZkdYA&V+DEQ<#zEH*Nh5#$kbB@*?FMaW$hWOdRFH|#Huy=Vi7x-{k zppFD1go>qj*H3W_1$JRLQ?ih^<}7!wFl72qM^N|5v@^4=FL zHJzYw_!xL7k-RnQ3R>bmf|^`TMv+bPJbKb(IZ^D3iw~HF5wSxeCjI%ui}~k$6cR}U zt>{v;jww5#){f4ASl#*>a77OXbTuFjAWdy4>QM6*sA^=Q4v%hrg!1TKoU{$?%8$75##4h1m=_(}x z(Gki6B$YekU{Bme$76LXKT~Z44p(puO!@*VS7#E17i+bV<1t=Z>&35E>khlDwu+0V zKruQrKtksf7QJn&cRJBf{MfJTY@Sl52uOHUf?h9U;Wefue`U|c_E8V zCMQN~{TrV=N>Gl`L!OMKknXEkjnwL^Y7(>TurL!(ldxnB>16IiYpHBfD5W#yH&6cV z%@f*vb6+21tJt(O4f6?Mp7HY^zSsMYAMN_X_q5iJBHumH^woDGo8SSDO<0>=eOTcKAoIH!|Cl8G`;r^Rij-O01v#)7!dp zJUUaY&bQ$}2YD85(+VpjVfs8Sm2*Uk5wJVL7dna=45w=Mn8?SOd1-#Geffs3KQ1S%p(oQu_mRzq9d?u-+_;} zos^W)e6ccTq!4wQlCcJ_4b)`9CYdM(-(%%w61Pj0H6xZ z#OG{VZEVxXT^u`6Ig*D6IxP5cRl2UGJ_QTe@u<1uEH&RrVx*>OfBgBQTO^OPGSneYYF5e;P-W!a9`A*3dy#6IoNyI8xZ7>2LZ%T8H1#^gh|=*ZmH5z=T0p;83xx(BrJ|#Yyueh!OqzVr8tAU_IiO~s3D`h6>Kj4 zIbP6=Yp*_5WP_QwHtl!9hH&;?AQtPgwf`P+P;Lh|GDzGA>aP#_?0QzO&QsKez~tt_Y^Wgi#=^Z;ej!40FW4OEop>uSXC=agyuE(p!x~M~Tm5i-@XOEl z&eM#O)9I`KXrvq8w&MF3nP?Pj_<>twCsWoOl13`Sf82d{y(_hHS~-Bmer}|6Ba<*Z&@7cfEY` zXCB*ExPLgH^~R?!eu0H2v^~>SfAaWzK}hWJEe2BlK zn?9Kx50B@WzIwB$r_0#zcmE&h!Km09)Q}b~g^fI}`K$0^3$KQRa z?Z~pHOcfOzPn^zAs^(zJGK(%z9Xps&N+aVpQA{kKzv=K=jP6Cu&$+m;%Y4#i%r67{b1;ffgtjNTS>uJGv78JMn(M_ zcJf}(p=Y*QSMH?PuRD=uNIAT=0Ch6!YQ6$q6)lVo3=1>s=R?cRy`v{F=R6t^MRt){ zIx!DptI9nJ=Sh8HlbDE81?R+aikugQEM1@~ci`-S}_)kGe%%9@Okcx$w4>P#wdHiuYPsMkNcHc=_-_wmP(S6U0*>j zBy4mb1R!|Q`EBw%N2ZiC)Nwja!jX0v2d?6kNk-IBqWLL|GjL^KzgM!lYbO{=@aH#A zzO5vjW)T6ml)Oyupc43S7mG%X89QIx#JW~Ad3&L0hf*(xL0M77X=UjZG7_aZFi(;8 z)(gL~wJNSkEhZxaKb-@S3vbQnD9t;ys1NSK-DG+~NP#F4+|FYsR`v}Z0)=H3uo*wU z(OKDh`E(IFxVYB@Pcytt!xO26$&o7gyil_l^e7gUxov$B!Yd`uN@!t1Km>*06`4Yg ze$Ytzk$pN@7j`!6??0R7bX4n0A++5(meeDUCU*0JtcHZ@q`NpzZeB?CI!=iSB_d9= zl}V{9!nL4r*J;TDmoZf6>zzF9&WvGB&9y1df$IJd=EY6xaLgqRDo7MMuJjsEE8Bry zs|9KV=B{GNbz@I(tHeyh-U+Q#YwfCCh>mQYkyX=1u9HPYwB4y+0eAk;F(g7rVz&5lmx#!vHh>_wG)c8) zK56ugq*whlssD@qhhFq1y-3~DBQ_f(K!7Nqsz*~UA8(>|Gi-$giQ5&bJNGj%S#cpR@#K>u7S4Ggp zt_oM36FwlsQxq!={*p-AB|+$}LTK2vj&~aO1P$dv~$5@0!-A3Td ztS%rpV~`bb2MzmTP7oSaZ=}N~1my$utF(Q`V$*ZGA^@d0U`sheV0A53o034^>!&Wc zTuZ-Kg1U(;AEA_|-oUv$B|X>8&evUt41^=ni&rM+gt~6{SdfaY=@#t+pWLd&Bs} zSLCKqq_zZZ7~M&|C-lc#KE1iK!|PuI)r#9z^$1Gify5u*=r+Be>sfh-1mTMK>h=!* z({F!;(?Q|!{Uct=s`*sx{BY)f`9J>*Pv3k4m$&~6pPp75*x7Hty0@7=;k6|Nh=Oi} zi5m|q%yTuDE0O>pv@=nO*pz$(TLf#~y9ak#&Kl{~mOuUrgp8P5qR!I59Fls5kr0Oy z@E9zz0w6)>?9{;2*p4gZ^{QDJSUs%CD<3@tQPU+E_`X)Cb>9SG#Q@&gG5Xx?Jqv19 z*lR*JCWPygB2}!(n?L9&v7D0vaaHAyzR2s~sjmla{ z9YYui9kHUDVBfM{tKw>Bc(;s{&EqwDJnw}2D!8nIyR;;^D`J9_cG#oZ4ou)8>0GS> zps5O0$I27n_1rg5suEyuq}jFHkC1|eauv{XFJ3hOWM2{J3`Hj_-0eI8VB{*`uO8`5K|8}3 zhKe}OEe)ybGPVP@cV42$#t%gn(&FS&oUY&gpv%@fK(JcwYkgEny?(|mBeug{ieb@b z-v;`;TH{DX4RhnYAxOIIqNHR!FIAk5tlT1162p z8z)D#K2p3&Lj&r8z%`H+g8?&yAyWBpmCWrWC#&HIWhX-_hLO>&NbHnUt8l~$ zDu&QCe|k0a{WgCBqN){r7h_^pGxGr1B)e!91hr8H5DT^$IYbu_%L=6J@R?dkC}~4##XGM6x*DX^d*lM9j0jX0fYOk91qX(J6^)WX1_O?a z6`}4MkeKm*KY#sC$_?=V_MM98%=utBSB_S!WQEWjj$0{JD0L@_N1G8*wkvQXIFQpA z8x%syXx6Y)ZU0DxZf??m-arhKPv~Pn)*{g{1849ZRy$%pm>bl3phjopJk<7iom1EM z`~x7K!E3;l&QKz;T&-XDwfw_!OrZ zj!NaC~zIkAM2UC5Emxwmqfx;wf#}oO#2-w&V+vyC>a$ z!h{u0w-dN{FxoN{{D_pnE*~zu+O9DkyX7v%3BmP8ioH#z7bkO?NcRSmis>*b z&jS@ky?go&j=)gDJ>+!7T&{5YI^g#9qy6#8^uu>Qz&HQ*pW*RiLB3)9{qJw#!(Tqr z->$twi^y!`u-`{(EqJKhVA!_ z4c-7d)KW*UrEcZNZyhY@`^S#pj#?oDpcDE+Y2ACFZFgibj=av z*%01@7{f%3AV9F(n5lse8pWW|1`C13&o->7MG<+ZDE%HWcj380*a!Y#6XU+yo_brF z{6J))6dWK=XwyiIbs|>K!_3mEE_H);^{qf9P_;g0fTfWo?Gx2#jc-Q>#tC4avG!ZM zY9;qUL=YKBwnvdLK87r zglS~z+H=62F*)#kQhV_2ogK8M)EG1dVj@8Z(+JnCKv{E(Pe{4FZV%4`Xrf61Y$>6M zSsgtdx^hfcWW^D782kkB#Sx^-N*7cNWWJ?qh2xtydineS*6?K|Gut$d9%&vRUw4B; zB=*tr!g^j-xI0ZY`Vr1gtK~T0JVv-I#f~SnuYdbBz4&Sd@5jDf;x>e8)$}kowyAP? zgla@CGOk$~*}z6!+Q${E&zD~?8nwho(E=B%)nT9oq3^+rDEdfyi)}?<*GSxffXQ6H zR@qHpz`#gZ5gj?zJ{{W6yA&L{y{9xNvjcKSC@^#ZA#1$LZA>(n(Lkw%t^~$$QB!9v zCy4p(0l-i|v_k?&H8Iko!P&NTJO zgZ6;x*;+`dDw%GIxstS4u2p1}u6+xAa1PLD1YmM#QaMCcog-)fT#Mi)jUE(=VbU91 zspMjO_Zq_85nHKAYOGoyl9GgsDL62n4Y*?HY5=PdcM(7XM<^kv>i{93cL&MZ<*2DE zUw8t;Vv$UtY)l%I%ULbWC}l7x0;)mG-IFzhB+o4w=_aLBt9o)iE9EPj+P(a;sHnWMpQJLsmOZ$j6oQ@r$z$A19b^E+Ou9C z7u>8{hiD`sO}nHPDh*t2AQcoUF@SA0ct^+k`}WcJc)H`m;WZpz|3c^aWO~lMr@;4) z<1kQwf$X~5vQ2vV>wCTY^p>99eFqxI>eB(%hbM46i`x_}B!I&}{&s@HJlJqEB99aK z<6v)p{7Cs6)$9T3)hj&w<~LM81ur}N*MI&IKmGg@es%v+e|i7Qe&>35$T)xb249lr zzx=u2k8d;X5#dXR`12qC%I9lP@+R!boUUlwMn+^z3JxmVmZYi~tC6m)2>Su^22cZ2 zt*X)oTopWkHbxo-z@aMzpNO6^<}f#A2jH3NIH2gJ;}j@R5UK5SR>YLm71VGH{kBO; zk_m}?6>jW&>*{yG${N&JcL?bFyk_C~ZrMbxc}K+}eZ$CF9?0$4ws#JTKbQexQZ#xw ziYIALOrlnuo&{44f>+l)LMo_;5^hjeMW_*|Uc1Y8>i3z->pas+j603C@-1D;Kzm>N zC4PUdx*O}~>a7nmyU9{5m`zMkNo@g^0X%OiwQ5S)v_kJhm>58=49;~+KiW*jGN5rK znY>yd*|qjHwk`>$Rdrv%z;i`2zV75DqAmiquSl1x1*_neb8p*2DkSH<0rxI~qnNpo zw%UMDv96-hz#o}M@C>dh7zChQ%ym7FslyJoE1G4r{Mcte*eS*_pr)lEM5>=Y%9bNi zz1R>Vs0xG=iaXrWPU^pLSw*{?lKl0=ABp{6W1 zk=3n63cWcDIQIJ*nw`^>%qBn@#c5-5UeNYb06k0layXCX?juq@!^j*w6k**h*ysgSTHt00l^U|WylJKVYa-kkdwDi zchPQr3#61gXRt=H@_>{JF15p6GX>TRrW#bGFye|>yxO8r1Tlb0=!VP$kSd~kp#lPX zI}nyzu@bEw2*)lbMae>%%#gC# ze54pBzynASFy{=3sS6(1U?A-&@<@G!uL=Rx7NAPHD?>J@r7LH$0v4<2fTbPM?nmu_ zi9t;QcH2YD3K)RfAG#K2C4=&8djp$R1!!5tZw_9|koWELDMb*(^(@rECqM=)M%%m!umgUJ@aSH`-P-=Q*@e>WUdhLU%wV z0vASdbq5(d2cAqg1!pJm26j9q{qtB6tCK_~yT~qM$s^%qK^uSHCc< zQ;Tt=%V#Y>&{$@HGdR4XYf59fg(VFKhIkFQZ){v-Y*8N>Dgr&!<=W}Q#b zxoeVLf!)p&n-ryKt2V;g*tIR{(MolXyX%*q^3Wn+R}{@z78$Xxb8HtQvJ7 zI@h$sz9U)#4~4uIt?cJPj`t@VY6hKVbs#E)aMcVKFx;<8 z?_IxtssLGVGa@0gRE_g`wQDJcN{tYhV#Ug}Yx<0^A{52OwtXsuDlcW~YV!X1! zf(3%n(?VJW2ds@O%NMC0*#L9wwmz?bX~O64K-JlmMQhdEG21#66*v(EeOr9$pB)swV}8no-KT&zf( zJ!V@lk4~RGa{xk1y<^v1x3m%`%;I8T7t9V0iMk>n;K&G*f_bVc<}kp98a<@-Vs0tj z*wOq7dtGE*3)jyJKrPxxVhF)JGUd8jqYQrZFoM(lA!&B0of%vjhr=+vy(-@t~((O4K(n^L4$WDs@j9osDT0+NR%m>?S(6Q9vwhcrZS=Ah6Z3l zIA1_B6P1nQ*8VkRECs6-Ekd;A7G|4PF|B(w3jBQKR6k+2?*Sm*%rGlbmd2pXi7E*mFV^HijEoci3rgIRZql z*zL%;3)>m9(b~|_4z(_z`w@0fHd3y1j#6jqSjS-k}W+y3d~1uB;5;(0N0JV5)`DX5$^uKoMy( z;1#t!401%Oy@ULG(8+LRYwW9wHsAo35}A0*bwg<+T#ZU~u!z|8Y~81PDaM~$e1bJx zhC`SeML`;>F^+I|_X0g7`qN*(lOHQl+Sn@WEpr$*pi&dCKVU2HG9>u&7hl=UZKUn{ z4?XL_`HJU4U9+CKF~`!A#$W+tS)j3zcsk+1jd;1NreTE3zFA7S1({)QPiBPV?JP#a zorih4h4J-~*xlipud1O!Bs1L&KmYs|_F6&F*(n}yq+8rzrQ?f}9*-|+SsrjW-glR( z^ZJ3PRtwI-IH84!2;(H}lhWv@J}xAA2adtUc#nB`Qaa7Rj$vW1iipS4hWq$SJYSyR z;bGHMAMkT-C?P|riK!}G*S>IJvnRe@t35aeJRi)IOmjOFMC}Ve64n0ym=q@{n^+@9 z4UI@G&qHGENEqVm8O(d@Sfna8T-epKtYAhG$eEQ1&B&&@Qx?IOfgq8jlTj@ z1ZE;$vbB2IIBh}#y(}oT!r;`*7xZybO;`4{g6q3}m55p0fUK@4ToiJs-P6wisqq$P zr9l!%Ma={V=Zb!M38pKI8O%mQ%wmNIld&0x_C;+vGVN0JcIX#njT+f*O1wK;!CLmf zyol7AK@uW@Xc`lgB_Y6J(C%m@MHCho4P1+E4>XVHm=#xpu1aUU+eT3tP9M}p7^^z}~j z5nNpXX#m0vln3;q*_w9q5?DtElrIQz0?HczHnQ4p9s1y$INuAQIA%X2^(>lY0M!gN z0g+FrSv7md)lj`Xx9OE*BV9L#~)g@GYv|9AH=#oz)k>S z3_DmuhSh;YGAa(ScGVZa0R28z*^&3{rwxoo#C1WVh*fseET%b=px1n_GgFln{2BTOw%-QDx>;tPHE_DA^Z1A#z7sn!@f@y@t2VkV~B`D6gq&=q?9 z>;DLTc?;)<2aL|+<>L;^aTw-CY+h#CFOOTGEU*T}&zckT2AZ90M< z9DzD};Wjw@a#F-w`26+Q-{&jmKi}@=$`e)-GdN9 zl9s6y9YZS^^la5>>=44u1Srf&4ZAg=4yLtqZHni`=gGE|L4`>YP@E$kN5*NG)bdWO zt{p!}g5=yF$}LOI<|5eS0Wt+(r_hpn#O^E8f(t|g1eo^#-N!Wt@4a`MWFpNwZp89MGIR?ex;S&EfEQ+)`C(SKR0V6 zNWFqsC6%gc4am!nP_6+kIol7P+9?Y#;D|PohA=`R?4JD8jSCU`D}Q$8H|(qo(Wrgq zj9vB>1qWbTQ|{JmcgN6J5L}=3#z#9ri9|fzID2{`Bqgd=kT8M|p@T2$CX!+?IPmj9 zz4s6r(GgGA>jvX7FfrSbgvOJ%>(iOTFm|w5f|>_H9!5)0Ab8KHuJ5le7;QYvG|dB? zQ{%cyvh)iTR8>)GzuOQz zaoVxwo(Xxx9aX&rUoq*3ToD_OB-cQ(gOmvdzXIt*CVTHDLG7#W*jbk!yNYVVKn@i^ znZTV)X@S!6H1-=2;JO1DS*e~}dtBb({f*My8-}@Gb{F( z$7bDMTYEk--#rP%Dtippi0{;=3p#uj>8rnzs_xfMEs>f$T`+yV*#7;Qu0KD>`TOtr zyYF}X%eNo#Pv7qLFW>I)<3m#ZALlp!D|B-OMVAVchCFJ^cLk)k)(4H%sCa;~R>Me; zR%(bu*>_3;JoJ$*IO>kR5)6?6$3DnoI0hV`GDl|-o`B;-+~T7o@+U%1UExaE0dY4l zkE~%e*Bz7q-4sdjLcWB?=*-uMb?)ZN#?oF;LgE3z2WlSzJ4-YrWN>>Tl^rov5DwN7 zX=7X}Co0z~Ra0GarpFa<-BGi(9Bo+U8Msua-r+C;4PV~V-7kI#>$>94?-tvx8?Tyd zRM+AJ)?KUsq8|c`F2L=Lhat}P>h_3FKfR;Jr>o5_SlM@5Ghs%Ah?#K+W=mx(FH8deO)zgE9AXUwg#rjiuB0jR>n+5ip+6sSTrM~Cajg|JV6S1YBEa3eyFi;w~8(kyq z;!%e|*X3eqA;_1dv$E?YH{fH}7R%QH*Rp9llUdh36<*R6M5U{+U$!f3n`xccC~sT} zVIvuo7NlZiJ@E}D`HI})qRaU(F|3B}9-uz9Y@w}UwWJuQ_B@DsPrNE2H8wed=th)^ zCMqTg5T!yDU|$Ja`6%g%Iz%Ln09nLx?o;DbQcKOWTOd~#&}D&j6MNV;`2JBEpod}! zC+CqP*;XCG9I$qM20*SWh;zWfQ&|gDHXGTfrmO=3xiACEb8~h&65PHxQOOz3`?Ib? zrP2-Jr{jdnw$soGcARZ58#0KUuS()nZ>N#m4sg6x^rIN_fu)L_A3jG(ZSQuq6J5B?qy}&?Dp;WB<4qFj89RX&l@OarxD`7U*H@v=h9pP8M`L!MI z1BTofe6m`l!PRblpDS{KtgzNT)AE=c(JEHGXW1K*m2Nm?d!-F*>k*k(A9NA=Uya0!{^0XHz4> zoVDseH^%}mUwJ#d2<+yTU)X%4ZqMHD18736yI~E~CFrprH6|_@l%G2V*cX+Cu8@hb z!QKK@yEia6Lj;OsDvC59KJU79(JjD62G*8_q5V#4#XX}i4XCgi!i-2)pvqimFfSRU z7V{-rkN>=w)q?4I#kzRZkB?f?8MO#1lE3^ql($IheTTAPF15gz*nuvGkq*C0TRdO{;qaTXU>Z=kL=uW4| zfVE+;1vRgReu_3b!lV)$_-4u2T8)-OjJ1FQ! z4+|KS%Z|GUCGa+Zvec@W1pPdjxr$h|A!nWE3HMxE;kI%)8?^%ML`&W&Ifo82Od6jj zZM~Y3vvy!*Uv1BoMxLz3UHO`cM-RFtkXR8k!oXsBt!lo(ghJK47N^kt`dx(pQKe)U z!r0id;3AZ=YK#-9t+p(|UcMM?*&5)@M2d2MH{mr8MzUil4se?3^6@J3$oM1~PPWk{ z1~^v1hW?)3p4E*3tFN}|5uQFRxQRlz7%U=sbR)$e{Amu#yTS;894;8AAg$aCuArZ0 zOCLU{I~*ms3yzNfc^)7&M!O1MQ{ zf_B~Ux0jv+p;$PLJ(B324Gc4nt_>7Q==Y1M(3c9Vyug8o0%Ov zZkLQQZL(hxdCyiLlT&OzPU+*hFI4sY^zE~O8~aW@9~9=}$sp~f?parz>wr_-^=Wq& z!ik}>P-D=0Hi3Y}0(gjE*d7|1Z^#otV&lz`JLuZhV7Q-EGZGAl3?o?Cg?%sfFohfB ziGc&^UT2{Cr{^9#-CHd?SBkRh6AAc!ed^2J=QPzLY^{bvN4Rh$Vib{`k-G#vcJU1L z2&o}r>T`^U5lC0H(vZZFGwtTHG2kKI~OG(sPLwKIZwAkVCN?vhUit2%AZH3Q`f zNC^m*{^FmC88`&1%M(&ObeBUY-JYIOYQ@#lZheALoMWnzk)`1)?yF30AfVEMRFP3| zIyekOs1qXQ(olfabLw)}s19{HS>U|~b@vS&1dT^^?FTpk14H+n;#Tw6BxGbQ-I_q* z&^rsz*dv1yB~$VUJ{dVN(2g3Ni*RHvuy*iaRXW*fuj+zrmGiDQ*1%e41}Sw z32AC;_$k>hqw+Y4us=UW~OB1lr<#pJ+85BF4I_X>jn4vyjBN5)l;9Ew8P91C$IqRU4o^(r)Z+ z*)jx*K!Kr8C73f#MjF^^108d~XaxWyh9#nC!tOLC zO0^hfU0_oJb&f>~$huo_1)XKMd?@s8&H5yWAJhRygG6ehA30x>)m&k4K#4s#4p>F7 zu{C1CIs_Zox_?b?bvTCNxXb8)V}b$n_IN`%FIbWw6Kd?{G9J4)ktv3t3W6r7qN`+n zifAe}dWRGghY->Es9`)(aYsy#AJiQu)S zTfSUPEkbNXF)*rmd#VjDFz#CIm-k0{`Ky<9dO5H+MSb`gzy;EqTa>52nXU=b3~BbzO9O#Kll85HTJAAQ@Suz*1Xw4xh%Lk(mtUc14qqu6}{N!4nfHbv>XVWTFk_QM0O3r2ocJK~Qw}ZXaDhe3qW1>c}0H`)?=Ub$QDH(ZvX{i`khhhR>`pbrD>C}{y-A9o{5KR%Y+At%~ z_L+Ea*3fy}&V<7Ngo(kkIjCU5NP_`|C<;4cVrw*=x&?CrG6$$n?SWy@u2gG64TXrH zy9F+f?PvN1Yt>an24>r}c)`4~R@X8oT3&bEE8yA!CV_0|;4Vyj?B4`0!j|M7P= z{^Qs7=IdX;U;dB(U0q{=gVC$kzt)%ka03rd|7y8?vOOD0A#8p88(Nx;gY;kD=ta1 zx;^1%x!`zO@chGHp#I@2Q|HXjo)Mx=Hx9n|-7ig&LUyY;h~$G~q6)SJyOt-bSF;D& z==I$}lP+}o;w%05@H5JNR$}NE=aP=eMZjdPGQMp>&l z59(bDFyGtgJd0V0G~EYSo)jxAl4_#hCLqa;wP9eV+gf|~>VOCtDte-p4{)9%xm97o zY(ZT&h;G%&Yh~AfLd~S;EKUYk2;2EVib`6cri$Y<8ZT90fCdQIdxn$?hv;le)$T?I zQMuoJ3=gtZpUpQ)tA+_;}mxYAFW0b>7HD z498KXbOBd9=)tvACIfamAWEB)7zum;yoJHszFSv7H-}Rzy56DhiTlx9YN0usOO>mg zfM!_k}^%2Ps~yn?F@=NsCA%oau65#)paQlzl0b z-6nQLNY{u{2<80Q zoO-j#cX5kt`2>sw;dDgj23XEnT)a|+2--lJm`Z!T3kjn@7^U$$#HYtDnM^`b#{qmJ zWaWfAR6tpf)k{WY+E-h#!Z1SbmL*NdB3NvK=XH$2g?Ec?fY8UgcS|`M=POn8efX~8 z;aPP-3RDoV;llR94Z=EsML=rQ8$`Pk zsqRdThp+=piU_+R1N1gAK6^PpDU#W7<-Yi?&^6~<0_uS3%zbbj56V`% z$e`kgjXNSi?lM(dfJbi=pN#=A{DVtZ=&(fPLTaqN%VMkSMaQ8dBDTa)Q%*qp+Rt+FcK%^dn(y?_3(1S($xgt{-3_sx94BTdUuj zqg|#1kACm><;5R<4|jj*1>L=Qt`GmuKfrhY z>pQ~X2UIR!*|Xn!gBSige*5-=`Y_=1l&rVIId7U5p4Y*4yK746iNdSbu;2Wa^`2<4 zt%X9w+dDl!B@wSGTcjAeUmcQyx64dn8ej%q=cP>?ODIed0T-!m7eobJg69K|7QM4M z<=*N`x!Sy_Mn4N5?{vJq!K>d5{P68JSYft14z}LEw{1JI*MM_4kzA5NCS2}U8=fcH zzl@D(Q`*G_3i0&xM0nUN{QLuP7;L=0vCIkgAHU`o&!1PsEB4M)k=&wE4cjAa^Tl{5 z^msn&gUOUz${VYe1X>KmKN;yH@6HSE#sH?= zw>o!P!FK}rSZH29(kV{T?qn((#si^-L0=qiv6n9VWovR2LopY*TfBypC=8#&yL%8k z@!hk2wuor}auN#x4p}vI`yXzkr|Mw7c+k~>26w=g9OC_>*;Lr?UR7>EPaUYLg~sxa zuecXBm6v4 znKP~K2?-+?j#VfMk=W#m6-%W2L=;U-*Sf|CoX_0uX>Cs`-dxK;V`QTWm#X3BAauDm zmK&1ii7p@R$qiRpw?~Bi(Q@h)kDBfoVHyZi7pg+oU6HG2RP3}!CL!k4Ur?gxE)3Xe z6(6e7wqT7ry3@jstD27_D{A!sEbLIuD`9ciZj!|~l2>lPf=cl4Nv$pkIZo<*Alq8< z31XZTXEI}tWg+Ztg?(=MD5E@(24o&K(ddX#c6Fe{z4NV9u|rWV0%M`4kBe=&vYj5( zZm%e@GtGg0vbxqM@%;!(*}ECt*O`P$DU^_LtQ)OvCsepLE`v*@a!#ncSt&}?dv-jz zbAd(ywRKGUO0{xHse6@JIhprYR@OpJ9F0~f`=Q3m1xp!3OR_jZa~FrZ&?P@Jv5Rp? zEGb%U&twmTTv2FXX<^+f@4($)o#wMuV+{i%nL}ga7t*d&AYCKBT9C@&>RDR_-M@;h zVK_zgJ8CEZIWmvMlT{H?(HpG@-dqa9nIg5BL_wO!v|6Ro| zzFYKtcDyaX`DAtTNy72UT4GKQ*@lMdOT`e5y`zSFou9*MQFKqc~?O>H682ur;znt;IM8-ZbDL7S(B z5@2qV5|5bjy{dnuRSgvP2+7cbkhOt`6S^1VX z8QiCuXW~k&DJNsQa7fwW$0Gn9!Z?1^#0L?0pzZZmaAfa8tC!Y|8FhlYt~fQ2UklfbM~+lw5H2@(v^RIDPeJ{P7pR!us)p{OGTR8g8CR zdix;Z7^@A!mlIe0_<#?8^6&6nedPJYGrGOvI)3pQeEnMS@)<&Mbo;~a*uHxE_34^waxC9r2Cd+V;4@H@Q&)Z zI;6FjJ9=m-60oVqK*cpY3E~MxrR9s+Rsmmasm@Y>x(cbU%j67eg&l)gW~=4YC9dUS zwpp_IlUNJOI3Py{+ZJx9PW?_CpDJ9S8ddYARI1R@5Izm{c5mcTA%DFm?-hO!9B(J8 zmM9wGU_?Pj0Sbnj!HD<$B<*T$YgU1S@7i~TstOH+XCvzDQR|FhPL^EDmlvVfg6<>E z;w?;9Y7-IFi@ANFZeb|iwzb$ej?B-OTJ^&IBG%HBpI`9J0l8qK{W(?%g}we0)p0 zcfX?ZaZpzjE3z#GlzGDhw1~nw2!*o2!BMHD%4K1Sk*TgNZD7vzFJ#x9(Qak&t8xJ@ z_sY4j<*ky%g-=QG2cGkVdUa`cvY*Iv*0h|&$(0u0cxgdideIqkBpSCF>voiL zm(wH8v@zCz-7TSh5G{>eVYN&_jFfHzGP9?#AvKs<7nrW>&Fj|4zM4QtoLM@V@qs%!&W&({mMmdwqFh$9*_j8qr-idUsbPaRSTe107J> zPl&n;csAy-yQo!N#EMsMmD%l3dYAtw%wSs=qFDR6YHh5tIOsfMt!jqpqMk`r&eD0aG{>8?xtqAq7(9J=G9mq23a6KoWxuuS7&Z;mrvo>rQ3ZIeXz zo|!OFVYO0?`mP_V)ds>mnWPaQFgv4XufC@*zIe^^$M-tABQ1|lq;{h5^%1(UJ$&^J z5AQ$7vYhqMOJUShJQqDf;WV#}=WSrSkc0vA`2!x`y~F(eWY9gH-QHk)_JVGH@&!$M zZ;lSUzFl;F_YE5UI_~zh8nYd)%{$L2Kd_odI(d5g>z~uSWm_K$KmGPQ*HH_dN?C%2FZw$mM-x?-dTNG(Jct$h=E!2oDj-_z$#HIJsU>T z(Rg3YjFVTMwd(Ki|#K`THx*%LzNy6RLLKBcv?lGr*Ya5{6% z)(e8PQKp7)d|SQFOjo9Du_Zx~3wVCS=6$bi$WMw?RYvNiP#BJm$02eog|5el>DucE z!>t*vQ{gF83l4NWMBHMeuo~Ds_7g-Wua(rjlz|RCJxRv>G+o`r>+GA4G#NX(c}0KM@hM z5quXMhuf*rd=_iqVK(Gi;XoXAMj=;nyMdjFZCkPV(s0*>T#JbCGz=rwTq)H>pS`)Y zFTUKj8oxoFHG6{Rfw+AP0$!?>GE-d@+el;@kn6_0UDVLUTun-a zkr!>_&V_thSSV`IOrqSiGP$>JCh9WpZB%Gz*QOF1U|-v0W3g&$-}A2BL#J3Zm5CZi zNJ1(`QWBYTZzR=cw+Gz5HjKyqPDsLmiE}?+X`nTf1jB|}iP6||N@k)29V+QU%+dw5 zYPZTVh7VdxVJ{tA8#?NJpilj!g+P@g_x4gFTYL5-OYG`m8BZul%^K0TB$VaRavA9I zFx&aj=>5A7{QjFqeEZF6KmTo__wP5nn>{_TVtz=*HgM)Pez8m7Fo}6(OxJ_$4J61o zwDsts3{EKNjRQAA5K~sLA_&`B5@@UR7v~l2eNy)WFerjURG4KY ziE4+~&`wp6!dTRNFrHVfC3m5BbKcX{ZbWP#FW#`QBQM!NiZC2_t&t=UTt8W_#?z5X zcEn>fX9Kbf2nkdo40YGSM)wZj8k9X#t&tl`^a5yT7(Y|q`c5ykoKi2FwI3{71D@b> z9%zBXczn$-e)?nm{ICCzzxe&nY??0g=l}E{>OcMOenooyg<&_aHlocJyM1$uAOBbX zDL?)E|HLnUUTBs84ZwJF*9%T;&KyK}HwL@v1rOcM2)=4}e}Xq+8PL*8UQX#Y`8}y3i(-=t4Np??Gv_{DD!c(r_5< z@cEZCegDp`UbX$r=KY!6DIK>0;x*7{{<&QRBz$Ghb=(SkZP)@_uVtZK5U7^hl zifBXw2O9>!IfqTm;xw9bnd-xe_oqTxdhUQ!rM*PsVYB1i$XBD)4{v8vj}9qmD_zyq zrv@K$FKmc|!is0-VG#wk3mr@pst654rAo|7y%|+QuQKl`9>LgWVV$%x$jfLc7cu$N zx9h5*AI_1{blB186{iB`Qjp8csSy@!>o=h~&qho>8+OM%QUd}-&Fv!b)kLHTX>sQF zUZ+DO@z*r+isA!TaiHDEz9A4%V8`UmRVfc#UF`l!KF_^`Nu)AWHraLgK;o^oaiDI} zp9))qdPpx2TsfMzBtz5mDAlH)nAZ8*<_58PfNI6_p+Ia%N`(*Hbm3L{gMW zN~%1-7v-D`NRCnz?QS+(hIOE-=H^FA7@1of4ZY|XZe&PSi1RHvU>oRwe4qnGwTo0Lo^yj6B3*EKL6P1-xc^ zTuKWH4ft|!3<(v>Q-Z_@*^0Gw5FL6G`<4eD_o4$6KV>owf*{1BpG-?4-a-R37Dkqv zs}bM--g64mHP`olPPEQ69G=m(EcE!42^MJG6j+|H+XoDbaqrw7@%trJ5-M9a3d>?lOkcdmxSXi2@Yz!7t{#7aA^ znJlN7ls9r1H0K6v)aqKS=N@7%jUg78iPylDa}_2^2m!=fLr7O$9$jdmoCZ>!KWXaM z#A*SOHY%d3i?*DtM$?qy)sS&m=##Kmr6T9~3h7-1y zAG->MbsJ}j-2wxKhFB^X8OQ@$%k#+aNXXI^2(8O*>jo>qmZYp@;+hg;8#u2IoHJWm z8%W#m__WI7w-5C8VWSWCYVSWT^iTVB=iek9l z0sF%MiO@iWV~i|+>+W~|o+n3TEsbV&r!<*N$VIbM%rc8Pn0JEGNVjX(0jvNyYCq%e zT`+;Mv)U#kdDZUtU1irkNSPYab$vi28igZfYT-h7+EyknCm z^Kj@wyST7=2df*g6Y7o5P-UxRy{G&UeJ`CZ%;^fq8&&HC_DW@A+styVoajLLEIJR@ z7ld?PUjUnyYSPxC`F<)Cz|edc>d}+)w$wwIm7vZb3SXkb!MhzO}xK-X;=Ge zTIUBWNR-sEqoG>f?AhmEnCC)|jS&YA%&KEG&LNQBg#4c&o^E@icB%GWP`4EO_4x!BdK z@5$}&z92sVF)%&->^Jo8=Reo^{D5J9Yv;?O9PXZLt@q^jJDskE-t&u6jgN|}{r6-D zdy~t1eE4wIHCOgjHQ;N${p=N8T^-mxXWLB#(SV`e;&lEEt?Oo7%+xgsAsl-(F&TWr zo*V5N!pH)qnTZNINNd>F$i~rRU9w#kMRm?rg?eS%$|i@ypf9fn9sz!TBCIPKYfv6` zqBVn~BNqd0Yc(wl^+DaxqH~7VPyQ#&USss#xG2NmhJ)2*V?UTFMM&_UK!+*W^=K`z zcR88Hsz`0Oo7y!oE5mHj;ow2ZP|^iNlcjFWk<5}a5u##-28f3%FVPC`MsP_6TDR_# zF5`|T&X^?fgo>dhUrlU1w!fGR^npIR+m1#KiR#CsLhEEa?Y})==W3s)_s-ndN zsV)X6Mxy%B8mCYqqSJ+{usPb;R&CSJv@yBk4!yFvwy(?N)wowU?J@yluO*<`nE>sa z)#sz)vnk5;wdwWiolQTu=IQnedVc+quf{8se5T7h_pSh33(>`D2`uP(i`|WtitDz- zEQAWHlI9IQ3bwA{vXK^{eHgfGiI%D~9bbmXrB*k2bq#9~jDDHL^Y_ljLvU4_t zU~oa^)1uvx$2$w-fsCT1OR^yj{8TT@tLv_@zOi*i4bEh+Was;AzAn5U#@SE(wY0EnD95xnS*4< zv>S}CkB$y;G8)K2oLC@cB9Om+c=h*sS9P~bj$LNg?e>-r(aPn_<8Gh^O2%%2W#+(G z=1QT_uiPRSX)sV61s=*~Lfy;^nY!dd2xqR@)M#no18tBh zn051=zk%;egQMdg{z%{a!RPe)r!UCTAKNef+5b%c$NzM1@6MhM&!6e#+uzvZZ#OJj zan_9e?JdIah5h>ep5Fe)Z}ogiRvfbxw)s>k2+ZwwjWN>mX9pz*Het$XqkL-YQfbWz zF*uDo-+&HZPLH m&J_YufB=cW++8!C_tIK6!Ic_ALtJi^^~?_0nyrM(6qN&7H-- z=KT?=K1q~)MPi(P`xfJMfb1M&aO8(;UC;0F^z?+au@NgcJuZ~1(OgV-VZ`zF8STIP z61TSp)Kp1gvHcgfI_{?~a{l3$zcQgaSuYFLe738bJM#yFlN(N_ch-**@{Y@- z{tNZ5U)gl?26|GCLo%P0bAII0CiDkC`NAka=vX#NInV;o`1}Qq!wsK4e22%XHnOue z>)_FQggL4r8}GfVo6oj$!r^dDsGIGEK*O$@ZA?!O3qR4W`+(0mHX=-_p#2!_*|j6T z^Yry^H)L_-8cL_oUEzqGA+yOi3Dv5O!0M?nXG)$x<}9lMTa}{H2nZ9c5b3(`9GtV9 zQUeLrcusek@XSN0W;&ttZF9wz(KT}2)&NT7XG6r3Bjl1P_yKiJ-QrvtGtFjNRJ=GF zyAIik;C7z`OPFaI1^W?pAVFKG`;yrCphIxvW98sN-*vE@QMsQ-Q^`t5)hrTQ4Ho>u zsU^Jz)U6m{GOvY%QX4j2;vKom1-^OjHZ@)D$9s+`(jfqO%BW%|TVib(U zjJguSV6rXT!n_GtON>~S7Ay^ECDjV9MNNH|oo$pxhlyIAN2zG*zk~>OOm1pivV{oG z*m=0s1GO+k*H~jqRlS@esA2DdJlk9S?Db$*Zz4@EpX2K0C9d6(99BA|tmKR_E7i#x z74-H?Dn*RAZmHl(f+-u1jpQ}*Qu;1}!76g&@5zzWi=h{V(2N*pHSTz5`J(8je^_3u8%G+EQtBEg7!Iy`9&Y zMj5q?Z522wr!)Iew9Ai&(WEzQmagx{!)TTZQOX^(0SzJU+LQ#&Ruhhjw@+u$sx(QRV^NGS@43BdR3o6-e1JD4TB} zx7*{cP#P@Hmqz|c9Ak6ceb8!R=B!B2>TAG$sI)&q4_6cUJxCg+k*XbH_)L_7kuBB% zVcnQYQFX-BDe0o!jKhY01YqLO4~xXN(AXeofsgk)zcbFk&KVS9Lx)5lAF_wAE>cwg-O<4T*V;sRVrq;Apd=F^hQbjdG@8WN;XWTu_ryberqY1|$ZaBH5KQ;$1K&?Z%Jn zaW>{?A}fP-1Yf)RqDrNJ#_SBSt2}js6039rS7!w8O%HI?Aw3$OM1USvL@=n0UWvOO-}>yGUIMM(EfTNo3(2ytn&%e zFjy(ZC1*7$QnGQ-st<2Z>~{@A_%3T3B$;rPmtTHqG*^E3c;;d6ZM+_-3oT2gdR}>p zk*ElDryErsj*~{&QPvar!!75$^7--s)3ob}iG4AtN7VTVAKu=}WnH^!7KO;W9!cw zMki){`ly!P8n%!BpZFIyaMR8(&;0JgJGx{Ti?`h{bG^@&+$}AqpJ_e3z_eF5zS77C zdOCg0m$?`_1spXT1(LwM*pxwT3>Ex}G15H08~Miit_P^fWZJHnB2i-W})%dy)1*S#@S7TZkKtcJ*++%#4KAJpeYBnMdOOT>+@e7k9dAn_~!EirWZTAe*U}mW_R1&)#?A+MAE=z^? ztlmcy-+nYIhJ&3R6>$W=e0jjDpS;%8;?uX^G%yLvGoNUOGCxqQj3RrZh(^qiwec(> zH(XPl_C^yaZ%k}sKhkRq-R06|RINjM>mE6pfg`B0v7V`s^3@#awwaXP_(fS4qVE4# zNrkQbvD(@_*K2#rBsws2S~3_F7D=si-4=6Qs4i1)Nf%}!6XdxAfVj@I2F>sEO};ID{5(xp`hx9 zMr_cJ0-&0*q@4Nj1bV!Gq_*s3E`9L z5t&u1jm89O(3B!`14GsrfVXOX=)FTIOE%gzxUdtlbGJ3{-kCFHDH&o5EWF?$FI>Y& zz5cIdOmgU3CZh1#RC zYvWJdO3c&glzQ8{C5BT^>I+_f@gs1$VB1cbByd=j($fR^;f6?B5GLBivAcCPIyK`= zyW_2C3!Gdu?r!w_@guM259;HMNvPnRlNev1ULN(`SNBv#$2(ssgkU$Xo`Kf0P{`)| z1|Ik3o*%Kh3RJ1uhkx@k`|8hrt=-u?8pquW;C!KaIy3R4>s)|oB=!T3`@I<*>HWK} zG}l7DZmijXXm989g|4q0v-6d&-;iA0BLDhpe!724c702`gHU|&3US%&+i!kNd0S;j z3`*K^J4Q`PG1yQZIo|!ivYn_WTyZ!a2>Go1@B~_-Qbr?|iCMD^;~u2B5qi4b?fAn} z(m`XRdAyNmyc*>691&^==;g4e1Q4lx8OjycGLA#xi} z;#^F}ggmRl967Hv&_JbTLrd%Xfzm}SP_ZQ!^Xeo?0#|3dNhu{qx~4{)O&fmmN{29Z z+iviLp;X&Q5xTh15fOzX2EgywlW92|TclCVvw?RV1d9};)1n>d#7M3|`JAN0TVq-Uyn2CaV}m8+Ws}UA zM98wiwmeHzws!YCFrx((UX2@qi-Ax?bttS-d(EQo+NK(@wWuG-NhV*DULE#UKwVir zJU=LSWZh;g=gr(0xzTAk2IMUfv&X~31Bpaq&XU#Cm6fN%q?8LSYrv-5o|dYKkrR

6)6;j5p@D?R>t&&}JxII8&aU@EgM4DNHW!hR&-jp3}?K7tNLY%zy z-cmmn<+=goQ~M}o zrtGRQ0-G-!+WYAtcwkpHYrq+snuzqHgZ^E-5!iRnI<2r|704}bEL=)=E-+mR^2|Ug zSnj`}^&INEU%#~vA1dB{eQ)ocDnH(zQ30FRjYDj!xECvOm_fE7X8=X|H+-MuZ~o(d{4@I1FDf3^!8EYl++FeRc!!7kGcG6PMF}si z2Ky`j`QN15H?QpJ-~R%C@|#EAlxo-=(Dg$}tl>b&U~V9i95D?+$5%Vvawba^AMfw= zVXi_s(MF)_nX-QKpZ*6U+ROQpXgxpJ?&XnoS6}FS{?5|VN|A!( zJR2WJ@<*|7*t4&D{_TJK_j>wx!F>8?S1*4;H!pqwOHXw3`heRXyfC7(oPP6;>UpQz z{hz|$J;T+PcNlb{?cGOy_w0$ZkuWMrXaJ>}@ZBws$3MY7qNwKng+vH6Fh`Ht5p=yiQEGxfZ(n z%prb$8Vh#}EqVhiY4z(b!*M)b(K|5A98N zj*JgdwShxWrK`QC-pgo-Ds!V(Sntnz+L*^{wX|h&<4D^&SFQo2u|zQ&)R5EJ=;*n- z=Isv?xA_U6koc>wA9YzO)?C>dAD2o41#a(Q z2ve6oAC1f#c#1&0j&>MhFHnwdpc0%7gU6K=+ZHr3O~Yg+|IJ_i8-I7)1tSa%v9O79 z1h9*3sVvIbY$PYk`D`)>3Nrg{MAA)BSop$Wt2TJW)s-}IQq#In*n3)+Y|C0H#lYo~ zc?f2l3bSu%1T3sAWpL0HH?vS%WKl@+-Zqr4gA zg19I6J<-&rd10coVcD1-&a;(zBJlwsPMppk>cg6)@leT$N{m&CQjCndAN@eXx>;T> z+=8REK;|M{-%XUYsHh5*Nm1=|S*#?H)BI8Q$1B>6M>bx`lzZXf`Q4+g5ASLB>;^s# z&_EoIS9<;CGh7{B($$MMboKcw#9grA+0lkKR~$xwk1X4FPx!^Z{Fl1DzhLy&EHqXh zJ@R&<>o?c7_s{8)HgbNjWlbFGR(*^z+&MT5*d8`IpAxpTAlwT5;P3orc4d)*`+(~& ze#-Xl8%rluwoG6B**E-~pZzI5`|%qZpTE{YZ|wB+YuZFCpEp>_G@wz$o!OQoA~j}i zEGu@-gw56S`NAJAjOCKBw6Wtst+GfhHpYOP$z!^9_W0cy553TJ>wdA$S95TLrJ8F< zePnG(&W1qcyfOPiLLN>@Ypq;~xx(2X&WfiN?7J;qSFl+MqGvPN8>6CC9u2rK}6fG28pi)|@2@MDIT9OcrcGO6>GhGY$ zDVPg0clR-Iq+4Zi=psdu*H6}>@kq6??L<_q)~JcevT{~Y5sgqW91OaGd?0IUJ@g<- zV+-6Q+=5pNf{{J8K=8)IT41qd+ToKbS_7%h^EMZ&T=Y{KL^qIYbCZRs`mCUsh(CK_hxZ}A7MEY zF-xgRuBus#GN+7@fhp`zQlmj)#jHyrTjaiju&uM59~W!$`};q7DKB5$VO<`?=7os^ zZD!c=rnFgm&un8PVdcqtBm`yGMN=$lWjY+W#pEiH8-77=vmPi)-)`gTcZ7+p-JXIw z9*D%q4YXh-3_EIInsQRE$~g)(peXA}#S7P(8#9!Qp?kSo?vgQP*&r>SYgD6IL_BG~ zOQuw2wj#E1wsN^}CTqdhyecJ$W-USHY)dAtOjMnRTUM0HQuAirmH>MKij7$8=EV!z z-GRd}vX=nj1sr##x(H__&Bd&iHfsSXs2I&@66L;YW$YPU{Q(COZ2HMlrcKh^KhoP` zn8>Q@!`E_}t+^jC_=Z**i%f-(Gu5ZfF7F@zf0o{~*Ro`}4qFkC!ye8#cc@!kV^6Q& zBv~Y3QiLo+hAGN`hi|rM!+*x4^nd)xFbtTmYzT%y0kTBvacaJyyQ{nA=}zaIJ!EEt zk$G7k9`LH`-m_2c%!suzBG$62*Dvt?`8D3Yc+0O|tn}j9jefjY39aoC)_TRLS04c1 z5f391o3kxt4y5F_Y<{jpQQH)vuV=q5@NFV<(&}0`5gJ^C{Lw%D&;MBZ5ynAwJ4b;G zu7ld-%yJUfhYF_2I)*LN_e3&L433(^ml~~wIOmnqO09s4SeZ=g za?>6KvK0&z$ai(;u=!5f+#)kWVh7U5EQ=9m0`A(L>#?r?y&hra!p%Dv$^BAr1VmCBQ6qEiwqSqX_tj+aUD0$qdXZ;myDMxAy$6zvom23cIMAi!($TWx2d0)sGlXPPy}u zQa+OJoUTaJwBM)2)>H_ykgj4Rr*w9Hk50eb(CNh!bldy<$xj~BlB2o9E$`jN%Cl?y z)$`{#*(AF7ogY(oc4GY%`1R}Olx|XE+`Jx{Nv(IDkXDpzH1?JL8^)d4x-e$;SdTS` zZFQza;wZ&h?||argN|fT`*>W17U4pk3NIGANX;@}Hd}JLwYM@)fO$r%-w(u&kZggc zLdA<(%}mp6O)$+cd|H&e69uijI!7hVHQB-DgQmKm2HTmhrU%5MHFs5NBmdXcfZ(P+3<)%_73E1m>DRb-_Y``^;8|NVzAe%(I|oIg+&)RZQVR z@!@D3&7iF(h$|CS9jyjf@5PJ)0z)hqNb4q92$})*Y{6-vgD4N+;<&*8odg`Iro9?J z$O*fZ%=uhHon4$by8q~0cb_T6-BTLJ3pyWMS=NJ1%Pl8z%}Fd*P;Nu_fi8VO% zPH4SdX>-5J9>#!{xrxa1-QG`F*i8)r5R76>rNP((zjNs?-32xd_Hg^`(*R(F*tr+uis!D0v4GZ)^kTPTq~2%UZu-eeRk|tpIA2d+~h5^EZpVyG@)bICFtl zG84`4l|x5DAM0r(O2str%H*87E}|EqF0w@lh)U!tdr8*_-8VANR!?%HvH4-LN~KH z5xFC=Z5Vt@*;jr)YAaK?5h5p0-dWl`w0Q5F^2tjhJ&?S4ZPTwl$cOJ2yP1wO%|`1! z87RnMC3XEs2DOI|e@5Nrb^TrX#XtI~ZB8e;{mo1L>;Lc)&pu3)T&%DcV_!kbh`|x% zvd1EkL_{|#lxQ|kq{@)|=&W-c$=dOr-t+1CQ#-%7Pv8IWYb>e2JLR&h7B?RGKY6GiXR`auqjO-D0og%U!l#*!NNGA+ngX?T)-bb zVsmoK7e9NX=ci25i@(y#S64<1ny-_6yh;4}^)sBG7dm-*VQzdt%kyV+eY^$IfxECZ zqy;XzJ1bZ(v>^u$ux$vGa;6WHLUXdUE|V6u&~fjGYk+xh2IaWH{@tzJU5~FyVSpLQ^5{gCTnymTn4Dz0WcF$n`= z*ccBckpmT|hRAkYax)8MP`mA(4wE(xRu`^7)K`XHu?3`_smKfB=9F}OZ*e#$PBVPZ z5{4a#Pul9_-t)?xt=?0*K9Y>mq^j?(FpV9KRAf-(Be~ebQmJC;QW6U~9I{a)M}Rlq zD>Ou?DyL;n&LU}ANJLG;33HxXr46oPqXa5Ftq9E84t$e4D@!ro|tMcb%3rP(-V#+1>O6l6Qv1B6kV!PnE9>bw0jDF?y2u_^a{YSXiwsP3~;Yegm zCDgaUrcD#OlW9&Ex}=;79gapmP9!m6xt*Il>tV?h`k~?%T@Nf>AL)2Zc78JQ=bw!j z9^WJT{+F<@F@-RvqQ~T@NmH}ug~ePD6E!I;Myiwo8E1#CD_s1khUJ!vDW~T0Ug=;* zRNpT%s{{jP(IoJ(=XEZC!Th{fMQ^P|p+x2S0vt7|_Zl29<<=ixHakz!t{l+sQ{nXZsF9?M*emU?6+Yt!HB!m|t7&h4yFEF4kb*w{K}Wj|3`XDY|c zss(kS^6knM#18j2cCpLScacIoDlyf}$ZUzM2*8tBW;B;C1t=ezY<|VhQZcmyt4)L= z?LMp$Pm?RM(o>~@PFq(&D{I3BWUFfeF7pvZGnK~vZ&CI~nm)|*=DY9l!}pVY|3kvJ zuV=a0D^I29awyG`e1KULp?>f<8DRbBBxOR^p|w9s{j(MXEAV}26E$LqEnBfQOW|HQ zC}pX8d<|;LAV!1DySMhw%CZe)Ipnr{BEU^Uc0F zST)^lE~zGNS}DU80khLKOc~hx>Sgt=f=~)}u+8~B3J`Kbhm-S9NXxCgc<~W)YLh0W z%;=dVQ>WsHHeHYH*%!8?J@+(nju|LT;YmdfShJ_?gD1`3=k4p)%4;5gq z^NvqD^U5{IeEp~Y zr=?YS_w=XO%7%ChMLBWk$*AeHc$RKwYr4egr)Ovr0Xhl0LGyYrKa5})2|zMV=;F`> z5a;iIMUTFEpxsLR^3Q&Om*2nOci;bDIt=2?G~bSR{p(*_Paov;izgJ;v+|p-|D3Q? zO0rUPu&wjp!9zH5*X6qR(Dx&**F@J>N>e>}enU)|++i{(>ku=>A<{-z-ptC&A)AR< z?kM-(a#`7NB^YWVb?bFNyz{1{l^L2~QMeq< zVoajFV_)gRlqtK;P;M<(_FurEV@N8fxeCoCa9~?jcqn37^>*UBMmYkBl6B+8TnI2E z1YaYpYS*r9ldR5JAFm6qasU8;07*naR1IbcdRWPgUOkAyva&$i)#FM#)PwA^nDI!f z)DPGgd}mlzgiTM952bl)a8h0uDZapG)hr`8E@YXSA|82ZoiDBnS}HlKXE1EcXohHR zQYhj&NSTp|nwgbD!b)4IiA6itl-9ViBQZlqVpNE_p4du}-ruq8;m%rCV+9L|1EEV)?p_lUGcJCvDa4MHc{8Iw-zGFmH4^RnKgL9rZSGb4eT*5 z(ZbVH5u45T(emv1=KW0(5tw7@IY~_)!3mpbS#rfku$h&*N{kZe^$hkXV1}^yJ~j(tJf(d$Y@rW_>UF;!)PZa(brhGKKbLPOz#{bLQ{2 zELJL`Q3*;1IwP|g$@$`_=a`SS)RYrDiZvgHXtW!tq||z-gr$jGnK(l~lIJ7Uw0Y-5 zH!)2W$qwY%2%#7kN1`jZDKAz4JyiaQJ7cA_^}`f#tcTJ_*Gg0KZkXm-Ok*pX_`?AZ zM%U)?nbuY^Rjzy5@}APn)cUaJmC~FvCBfOivO5D@@2wxkiXDlrapf~%;!#_HI53B(*>l*>7m{ z1!Sgi6mGZiP%62D5^1Oq&qWKUJ1L?8mp}UbfAl9>3Yi3>;3!7dU-ptRzCfO;*#m}g$el{QMs6=|uM=GobtuOLH5W7yi}tVbA6 zv3dLnKD>ENmoMJ4*436KIM_6+E5mhKjJwF2C%a1iC?!>yR?KyK6-AnlG~Rne+ee?_ z@|$1s^~aA?d<2l-S7GBw)8)IedH8^X8_h}&wHe(uB6Mer%?_N1T_1QCPR(t$bW9T^ zMBSZqEOKJ&%eVO3UwqqIp3fdW=F_vsrZ|9_kB)1KVqqIB(3YYS?QefzKaSQ7JuOqA zZeWykW=EZ=SEEwIt+R0keR%&u!+nS2u(RXk13drsZ|vjcNACQo?bmnMZcj<<++IC@ zL;CTVUHtvu;@y18*B`#I%C&;AIcKsag6{X`D&Xn|+60G>A7-q@?&|C|)0`H?tXu<* zA0l6Ls%{hb!<%bGllfLNVUE66osx-jlnb@yuYm(*jnwL*wl?z|2j#3zsnXAidtFZ% ziY9-no>rAY+WeM{dTMHnlqXQS8=DimhQqVKVYTR5OCfeFxW5tWA9{p~Pi%Mb83oPwaJ-Qet%>E#r8GHbrl^Qq*)Z3ihiB|I zV{0=v&OCO(j_Zuw_LC+$bo1d#_+(3#68XWE{j?yE@G>_8Y_?pQ$CHQ37mi$S6~ z%@trnLT?L*#~yn1A>qlx0gpaE=k56g);Dj+;0+ztGq0f>K{$tGF!N9`0TVT;3Ax)p#Y#KXYfZPRoa&-h{7I>v*qmUCaY{sV6q>It zZGSW4@}uI_H?R1IS1Z2%=4jW4iJP2uPKd3$z}ax>c$0zXmBgERC(`_+k|KEFGzJV* z2%S*Z{KlDdsaR-5;b^f!wjfl}-GqWsW%9)GM}P2N{R?uPlC^3NIf^ZIVL;OY&g7ba zN+HKqnWJ~;aMxFF3G~SC+9$iX|fV3L<$^A!4)#Z@3d5ANEHjEefHZw zliO#1i+}yUe9do<0Tts+)5;uGI~jS&YtyK2&UMD9%z|SeACeyD*!ELRCXyAyXz(t| z$(IiRZ1v{*U(<^ZHZpYZFeXE^@{TYB)*-!1c-k9_!e$-Xa@fl{u?B08M+N|Xw7U`%u3tD2Ez zl0pLjC9Z))0&iW>v(X{%SG>QPk=@3)EP`B&dXQtmk`g;Eyl~J?SFRDDOvhG(09rt$ zzYF5bXJd7lxp!nMX--EY3QaHw2v&53l4BPu18~&F<|-y*5fg=`s1g}XfY1fxj``fz z+@NZy^^i8-appobW>iXfH)vU$ zsO(n?ZQyg8OQg&Lv8a`j>zV>Cawx5Th?N zc597NS%P*TvY_>37b)g_Y;{r-2g@E_+PngGL2z+T5gy(H?=I*RXQt`KKHf~^xaqMwiIJWRycT`jw?HOy(vqxC5Tk` z`evo^o=0AbHi14CS)IW9Ezi>P{&s=TDNWNAUp%@`pFQ-{pPFGdqxA}Taj2^^x4Y7g z`o2@c+yZ~92t`?2Ac|6n2=w+Ay6GA51SL;g7clUhU12ss{a<26S9g$aBA43k${{Ee zWFx6HG`f|rwvt*TNr1#H1zOEHFC}xEh+%f%&_nV<>YQ@3OD>hdQ_0!X4V1i+dPj1V zpyDX2z={i7+eGV$I0cw-pS1i}89LZIvTiI~^(n2dzt07Z~$eGcU z&r?x8@z_O1Ke~$dXcLJ;*O`kj=SPTFXg4tB3h=U3=A~c&2jReGWdiZGX@RRd68#;} z*PPVZ$V68_>Y6}EUUL0Rv<@R%8O5s{KJrWhmFr388@4GGIjphN4c|Sy$B#b!9ro!Z z-hcbXe)qrrhcrIw@$LWiXZG*DIapeg7H;N!AR5T(F4ftDB4XE=8rSbXcJ-ixDH&zg zWJADlLy?G7GR}VVV-jcd`kQa`!}T>O9Qj~v-aMxaCytE?E-F9#{8JkGQ>=5Q=n#~K`>DJ;HCE5t2 zMC;m<>QTdR&+dKkDaQL33_sGVfAxQ%V6=Yt1RvgBf@zPF(+=a=XR!H-%WTbHf;zJP z0*lgfaS7VxnUnKMm9 z=qt%~R#yTMl~t24L8Wh@5~%brnSph4+S&xkvT{wPKG=|qjVBPcVs36a^t9Mr z@DGj*Oa1az_Y{gEZ$vnOv{SU^gJoiClMP2x^2{0lIw<;{Yt(clX>tY^2j$*a)6^_l ztsg2ES9DbQIhiLl$;_2<(_rF+GS8aKNP@4V$3QdlQVDqCyJ1a7#NOb^bZt-z%Ciw| zTRD#_Nnf==7PX?mvJf&`rPpl)LOEF`;fgCF^^)wwPrQB55kEe&^Y|rUxuVPcE!8ya zP}!2TZiLPy@_s|79U*7ZtE-9Q!yQFhVO>uwj&I&il#*HJm54Itm9-xor>rc~LL8i` z8FyI``<~WIWA>GhRq#|;Z*Fj$$U^Y8pBH=j#i@P%^phr2puQ0H^;;O1ykI45X+NGY z&ADPDu!h)1iaDodwC6YqcfsPS7WGDooN7`rNY+-8am*&8i6yKO7`{+2AP25Hwlzmn zo-I*@E{PGn1rfM5Dw8WzW3yI8QtoFq9-4=TE~>>t?9L3@G(^fdiz2Bn-1fMxMq1gD z2+5k&dw~m{#=bM(69+%S>|oSK5@W+LbIF<3lAy&C@(kBI>jTrH$6kl?Q}~k}72Qyc zuhd5TNc_yG$Tc~u+>Q)F7D|%{Zi_YCS&ElR^ha^IGH4}NBBi=jQJHkov_FWE7F^FL z>(P!kS2SH0I=*%%d`7izjiV!7ImBch| zVF>J&MT=Ccj_XCABA2Rw2b7g^(bhMy9*?$;fny1b zF4<@ubv@f4N@wFpoiawBE91w|XOQ{h$A}{Ka>-l!Zw8o#l0A(qv>sx-eFNXXXo) zUcC6$P*b}ToLxLLw;SpB<{7{K_EoFtZDNOI-d7gV`gnUXJH2#Z}H-r zuc7&h!Y8L77fsMxzWRYNfIj(;eixfB&V?~+diw+3eD?;6WZn*EmKLJ@%}12!gA9-E zBaDwNmn)Vq7~8@Wjr_VT%jLD~50`p!vE%;nC)R}%wz>!CNaJ>Ap)c?%ruz>vzxxiC zZ;WoP-=KdGE#CXF=(`24-oB7jy4I|4x{dPa@BN;xA1>+qlNtW(XLNY+%wB)Iq_i4r z2-Z=d<|SZ4B@T3Zy{DzF6BuWufIzGy5u%O_iio5|xW-36&FB*=LTM zXeAj*Pq4M_*A>Uq#{W>yqwih)5u55Mlu{E$yAn$v)^(+^9y)mHHWe5j?tC)LTP!nZ zWbP~JT}ebDe1|p;w@Rhfo{%#4Y2w&NCcAZfBy5+A3zh7RyM$-3phGj>Q}g zZRA`+VS=dCv|F;m1#a4J#LPp(5Kw32xR_XEE&*_pks4S9DBgsU6b_(fA=+qZ1us;n zusDKEi_{ce-@2`9yODELpTSyXtKul;)y(&;f2qd(R!Egt52m%?Rsw-$BH8Iq45wQL zo^H%{Pq>4_diAEVc1}5|B3PeY6Y~;v6@bg_ae>bZ?d}go-dRYdZ!d35^8)9h5b>Su zam{u61N$zTccqQIbzI96h>cT17!##v!LdB8(!QGCU;{%4=!9c$_nz4uXeI zM&5i9+m`NnUzd;Jf?9>%DJV7Cd!*8Q#vRu);eFk53`HU>Gn9Jac3ZuW3AG_tsW`qQ zlziZHo3UOV%nl!TxiY?e^%0kEvpxIESNP^R;pMwqyuUnvkg4-f&t_)>k@!G^Dp>$I z63DQ%*$VM;tFe!;x*|isP%0P-GyWs28yHV;eb`vO5ZBkLRuyoTzfKL zzH8@J^>EU)Zt43cPwA_F@E_aR>6XWuJOJ;>Drq0vxA=5Tczu zyvI*I`w^n9=6p|YU%sZxOGjycgR3`}#$Cr{f5kPFcK4s!@bgoi-+iO+{=;A3#V=p+ zyqeWR7q`}bH5h0^Uz z9JHm?Qe)~0U0;7k$rtP014{Oe_~|+M`#&|mB)ob1ijR}$!~Si#Ievqa@Fk8P{zf)G z`rKlCL~mX{+EqJM@SYPlDu;yFMXNL@v&iV79KqvI*`x7vOtxw%n0AJ6%U%o*J&P`Zios|Ho=# zlDUn-<GCJ_VM2R9NINjab!kg4w zWcyi>)p6J~?~7KHXK7jqWSXrX9CD6&dcWgRSeFbr9?U}2CeF4l1-G+dw;iyQm7aca z&z^jB&n$g}Xe3RS&}D_?$cfd)juD+R>v5o2?R=`%^bmde6IbVphZ7*Kd znO)yC#n+-ysOcPnOIj>aXA2eBP#6E$BGjip| zY$2!+q|(zlwT5z7!Db{b-oq*yEXU@^M@u2|3Bz`1E`FgD8YJC0VshYMOY2ne`(m_Q zVe%VIS9_Z#g=OO~40>|v?c$5U#@z{pT{QCs=YriCTNEP+tR(^1Lahw|D7carbz7LT=7h=4H9j0X>tLC^1fxD8&x^TnBd}Cs z65y1IO2z!#6{9(sdSa6Q?)U%jUz);boha9s6(TH*%0^9zzh;zXiPD8OQ}5bn9>8a3 zWb+LuZnz>M*?>a<+9jE&Rq!kzTMrAb#@sq5qo>XV+W2B2csaAhHnFRy32r!Hq1nha z`?q$b>g(di=8tKbz#2xXV4MtOmb8ZL;H7y66sN8B-5k!;wT^0Q^P7ns{^AY&`PZ*an>a_sqfDWO zkIq|~wOMhN^+>shR*V2Br{koHF}ty|LaRRf{662m|0$hp?pfH}r`Vm?w19+mGSHv} zs=n*sWM?P49ew)bQ~mt6e+OqzPn*cY<@4|G;;)}!IUdP{E&JUD<#5F}uioLX%ofK7 zkhJo3KA2mhi5HyR+v1DA|63Y10cFj6`|i@#2{f;(<^)(4^!;EAXWOs7khoEr-an`J zfA%YS@!ea#-OpN*$U$t;A7}_f zSQ<_xMx=`IvP7?cm;N|j)ZeP9zUnESg4|M$aT+e_08N2ZdTVMX#UVVIDw=3UX z?U_U2`=>uPoxaBX-}=u?U%#U3cUNTVLX5hFvX*1rwq%P6ud-rM&$+2_*VkT?jA7Gz zyXdH~y@Vb~+rSzn@#wu^o-@_`GKe&pRZyZDiaem=RLDh8UPa=dr38j976Fp2;~G5H zWl_~g6g}LkOP>iGh+Myc1cz0P!XVVa^O9!sZKTwZGXYC;k+;=6nHeuB7mGC$ zNAr?k^GchZDKXi&i_m?h&;io?cQQp=D~D|LY#XSlj~LhAMe3r5I&SrBw76gu=P+bN zk;QJc0o~FKh0pQ~bCpFqxG2r|i=88%Ruu0l9cRs@+5K`i!X>5RRhXK4646}W_X(lm z9r8e0%yEajllnGl<}(XJlex|4NL@l3l?bujI##UE#9Vf3<~L z3Cfx250kp3NI%v^aG2&9m8ay6 z_+*F{w~>=$9Iq#y%S=P(u&ygrkmxJ!J0vT4{+kj^uH{M9{r{O}&sT;JcD;qpG zW(pJ)m<`%P%R(f*A%MH0#Hj-0147SQ@dFK;dh!r-prVJm&o$M9=$(06tl9bIr0q+= zk&(g*q4^7~#zsB+jZodx6o68QLS1hU%3(yPVSFa7$zkXM%4{6!_b9jM0?9B86kRdT z$`$X0l3BIlhy+FE>q&7qCa`(Xv0%G%{NS}ZhAloLu`pf!W9j))UGawKs?XucREzA0Qa zD-w28I9K%4<}Vg2HRFel?+7G*EQD_ zbCykeHl)NxtLaLJ=!~Y@3VpyBsH_R8sG82=9MN>;GYww&BhFdv2lu((ZOu~! zR3nD7M|8e>Y!4oMB@a#?;mL!Cc=+R=;Pan<#r*?sF&*jVSAUBizWyccZ^-&_XSpmD zCDY-<-sYe@>>k_2$s>C6@-51tVl>aY?arS5^zY&RqY(i`K7RXL-(Br3>k%wF#IZxT z*zoz6U()c&mW{8mfAPYe|Kb-|^_)WI^|;Q&jxAh7^fFq?Ykg#n<4|gnEcw{lp1m8b z=pG@C>?%rkO2fsD`jdf%`;YDT<}LYM$L+#$7^E!68eBMRH)@m9zxdT}sJyzR_2pu} zdiU0XW7>ZD32%o-^!Cj&zR4ixhO%BB`QGCv$RA$W`R_cDe)zGy{`$|cEX7Qm?P{Pv zr#g0(nP75G5zyA!xbkh`L0HG_AiGnC!}Xmv$F!Dq-A`SORY6PVnixn81GFxNz{rU? z<;pm``oRk`E4Oa`LM#kK;^mluB~uaRHiWKCKt*{;&5s}yr>=18>xiV7Bv{DY%F^*z z=&&X_8AMCnU+HL}FkKx|-A)MV;6q2Pt$9g^gSYd0U2Bqx-19aL7Bo}W_1K|ZCt2di z23T;3-O`bwsO3U_%@kuWcrjYD6>hHO&3|;^h!q~2&A{D4&E1cdpz2rl9MoH(q>4g2 zmacN50*;=2+Eb#=gpOPTKpqCTtM`EQP*Ejv6+{ti0)@(kJMy%*jA%}d#N}WXdxQY6 zTZnRB0fc#-nyh$YVOJ8oPRQ(FsSAsg-eaCMBEOZBcGk`odu-rm|`Fz9rpI zULrb9m0-6nOM=v(3@zE>$p|;!Aa1w3!BOiI!3SDP{yU*C=5;lyP&F>i;R4&U-ah}# zQMcPte7I3Jbl@24(Is*l(mUg2uHcShA(8=WyTi_vRjX4cOlwh$P}~yk=13}3w4xba z*;2|#hxa_a+vCI4QJ;Ue(u?OG@$BVFhfT*AXn~O=su8Si zBKf2LL&VU*2Dj}yO2>`rKmLfD*{mxavt=6fgf|FiUFJ-Q^x zmDn*eUn1gLa;aO(t&PoIsyR(HhngXY*)$IlFfYPD5TM^f@CONc6eK`zGlGO6DMI2v zy|KEhs;h3@EpKLiTSWL`HgHb@4K%7MZ{F{Va6fjAyV*G*!o-1X)riegx+04LGpPk} zR0!miym4+&?gm16K%;V^CnE{gzGu>+eL~#4_2!W^bFIz_JapXS=JOu{?_bl$Kblb1 zH~5?X{g-6Jh9b{&^3fjN8Sc+Ba!O*|^`%;^D-&hg+J#<^X2i$7u!}A=bQTHyLZ3i^WB+j5PNpJv!DL_pW>rWH{=Jw-EY6f%kLjB zYb!b1rm(Qx6uJ8Fb6o%Q$Ef$eq0^Ud>Z@OUhd0Ly#bK-Eyii@ytz_5Z$*NS@J-ab8 zCErLHgwH7vua&0Vl?~J*!6?K{kKlBs7OtGSs~uln9~)_+-byk=$ZT9J8K}^(yXqMN zU%hxk_m%8$n)v?hSNiGm!M1<&C+60`Z(e;>PY-8dsw$o_-Rv-2ev8eY{W;O&J%9K0 zcT_C%6(EX`LwW95^cyPR9cxR2}BuzJ#So( zt-!D+44OgCTegBJGP{k_u@YNgJ|5P7ve*@A19~>p+;~*LesGMro9`Hv3O^Bv5seHg zo{4CqLKks4n8j5CjcDc4kE6jGX)4mtgqwnA$ck!9sWc3ph645OVx|c;ISK9mNlAHB z5fV&e(^k?%I9V|&5w!Tz!DQA_j6i>oM9HYeOK;Yx0XY!<$`nf|71E$oJjDeg$8$o6E5*T}k~oP-YN1vwS9n))<^4Bk-N&J&bH za6MHiP7rSg)N{h&xLTY-<9H-h_~o2yTQs&b&8qz4pFZc!v%R`^-=nhUN`o!SOxbTS z#+4*SVm(;O8$lsn8^1xhH#OICY^z>Ww5qh~ z9F&Vt_d<4k{?U9kcn_lPmKoTkYSnop#|W;F#DQ5eX7ls=;rF=wfV2w7D{+ z%!IM`n)p%`Tb9tRs|sy48};3ZG&4)Z!XMeNzCniLwXskH=xJ%Z+@@IZ?AGYnhkLvF zXpi`wml&M-05%K8DBTdr3#ig+)N^5H(;`y(C2KcrX;p=C$(fZ}LC< z%YXM*Rh@BOz`H9{Tg68Kw-On;_lVWs4?P1yM*`ifZw~#9hiqt5Vez()u z-3&sW+pZ!cBWSG{T)?o2G+IBk9&Vp;Di;&KK6%wcjGHzSC9K(Mt(50N<8~s0uT+w`?G|A_5q~laK+!mD8^7Rgfzv_$Ix3%Rft~rX|o5M<{GOV8|I5Jh#2N zlvY=mt_HT{#9XD~W(qd2h&A3_bPEIbwfl<<9qM zLgr%X2J_32GaG~^=-O0Xf zP5Qlq`!93v zbkJ2@E8kd@ZDTbUdYoJsAeb5E45eTEvvX_58PcUaEY1{2Nc*Uc?;~Dgd!)vWjXDzo zyfu*$w5|(>7-_o77(d*rtJkD=@9c89SW+gfi3e2L3u}n2>MVM9ES%0sqp&1q8+q;i zODQMg?AUKXgBV8hn%2T81Jj=P{!pns?ZX2YLNvHVhi$N*{p1;qSGR`CTjueWQa&T6 zk>MX!T-I%C6Zx#wB*yE!V{9t!DbRWitnS}jdMqUMV=b`#h@%b7}~r@W@PrIHg6 zHi%-VYi2lr{M19f+T?j7NK`bRb2Tecf>9(o*0d#U~O+k9b8 zb>>~r``l9oYn0)JX$Xxto5mQsRj3TYJ|$!(76Q)g^S|PzI5Mj z2@>H6oA`l&@lMk$O4;4#$b&p_H?u%^n%iZ8R){@j6@@a z+S?6P(#&Bqbemk_rlJD(d#Nyzd9vR0gj-cQ0ojAeQBAYjQQ7jg<}u>-pZ!qxKXA0U z-P-x>SN8Y+%iq#>Z&r&}YHz>%j!acf%SlHYY3Y^_KwS>17%*~>TolvLps_HOexjme zN}N`%ZXk(@`!Y7CBs?Vir3BVN5a(BbiH5BD=pk8kO;Tj?!pWVH*UV*|t(*%N3vf*4$APzDZ_hsXfj0_{3S9pI-p#i)P9NY3ApeUZp@dWge7I_tWTY+WTH?q?itlCHtsj?05P$_=}}?5n9iL)a|;Ao(#*i zk!RnOxq+^)CpsTz>fyty@17dWg6TG5Q?l(wZp)vJ2eDd}E^||^j^mPWP8q=^+Foy2 zw4zJ{IjC;-6T1*GrZW*6xEQ<;yQcj@Fxe1#E*~+T(1)?yul86DOkvlwgbkQwh?|-X+%f_$Y-KBsA(pq#4~a)qS-RDI<)~$5x0n@8mTF4Rije5 z-^PT&sg^2{Qa7q9&PmCxEpCS6r{Bhfy9=Hb5>(AHvFZv7k=%NL*3sAzuhRW3u+Ctj z86gg^MAT1~JScbnpQiJiN#mrwA78K=l#@8}wa*!L>u0ab^UAce7iEEKEgE1Prjed~ z>~(zp%*GD}j#Hn3v7QCQjvJvdab}G@KHV27b0oFJsGIIqQJ?;F8N zr8v#`K+Ew!hx1nF-@o9OFOPWfD%ss3@#VY#(PQf~ZL8^f`(S&i7z0S8^d`-kiHoi3 z&MQ~(+ASA*ZOJBZJc!uHfQiyX-Q<}Y$Za>HE$frjba(8ohD;ZdabgYHTjcye9EV2H zN0Wd5XaDVAHZCuIPcF}15~ zRe~KCZN!_FnyrK=xzAOb4P(%o$=MVg?b@eyM3FbfgRu-w-7qlwQH2-D>Zqq(4`e!f zuq>$k4x(-P?nBmgc}E{ykk2mIA=HvZhaXZmBuiwypYG_lnt-<15k0ffcFt%N9BomJ~Q?fX2 ziPp@s2~A!gLKggJ)9obJw;T0t+`pn03HlzlfzISz8 zbRjKXkB=wop6art>nm@!H_v%<`w@1}ZgtviF>VyaUYjhlynFd8eD}>Gj<1h&){4jD zYNC#z+(iwwV~QNe_*@lT42*(ZwcC>)FhYOp};qqw6Ws7}(ak zM{I6KjB&sgb1zb&o}fkHMy4Jj&<9f*PQozo{5WGt%8Pj#dc#c6%@oB4YgLV14Wu+H zd!e?@h0U^}8#&i*i-|clbx4zA>+|bFCuylN#5WA>OE?% zN^!$*4VG-RqCJb5tcW#XXKh92Gc~wvy4D7@(f62nlc!imlM0jUkTxdX1UCA%WxyO@ zIhx6e#1j}R5xN@Y#`?rSuJII@}0dsRJ{KEO0Vxue7BUR>k|RpdZO+7kvCCn+w`}nnfH`aBG+RndZ1>{ z-pm&m`5TscR&frz8_flWadhfxrp}&Ft!QB$#L8?;HP?j;`7|N7{V*qs;#h~h#i1J? zk^E2p^56a?~c8XWdpVdt89E;_|vVQ94u7RRA?F!l~zT+xPV)uDkvv8D^) z`hjXc-m4&SQfqq$-QiCfIoXlO3hJ#Zu^S;5YoB@r7Dv=%8pKuv9><%?Km7xdVc=T! z^yUBa3p+eaw0-Y=#OHeq?jv3fukq!#ixx9G9WEmMcv2uu85mXaW80G!cGncz#w6vi zxvInNJy=?3zrChi+-hTm*8Q<7=F7sh@k-f%!^GRsaJ$*+xW8d5s!pU2L7607j)|P} zl+TAANTK;cOF6>m!t>>V%kdi=&)?bd?mK$<@@szh?mPbG+wXNb5S>nol`MKXv;`c* z!?69}7Vm%doOYjlK;wI4=dVw=fBljV2~^~a?bUncRwH$pr<-f8nym-g^u(zi>4w=J zX|vs1yxG|x9_Q1MO-IUlR&RYqqN!r|t*_HKp*yvm3hZ*?aXXMTuE$q)zI(J%?s;?l z%<_eJxxeV~@!Y+;A2QRGs(t)}AJF!hn*Znv@NZw}yW<@`|H;o~eRt&7=dbD~Kl>En z>JRwEul}AM?oLG1Z>~_5(%uCj`lep7T2Pm3PmQal^nB~=d?}Qi*?g)EGmKMXY}FQO zUo&fv%r!_iVTY9VQn0RQZ{O+!Fb0W3f+ue-G)8E>_ivuTm|R6Bl0uBo$g*J}?j~j) zYrWkMbUvK5vv)YX)#Vk_NzrJLgcjUd()+*1jv03N-6 z!YOJM5@a(O8ak?KZfFD%?i_%PMa0{dSChB;d?9(??6>7$piEtf_I+QT$!DC%`)GwYR&%YiZ*|6 zh5gN~`7Of@lZvMX?DpgZ*navEeTJP#Di3{JmP7Z8GA;hepx6vnU``)dbA*-)QFXe^ zE7xV!%YCK$3*-3W9Y4IC>#LI>70>`~L`ttl#Z_=NPLW;Yev+}y+1#{)4qMS&)Q#L0 zH?`e_bf7Rglfn{)22GVEXVzU*4`KMKq7yJ*NRbpQVmVTBvj%CKPmNMS9I^%4q8w+H z|NdY7yT9zA#_J=M;#fM|E7%uuv^B)Yz}o7UvU5zRPm{yS$hi{dw)h><*!L}@CbJ`; z^@45?Fso9^bUr5o0oNkttl-)^-Z?>x8yWWAh@wTe3b~=5DmJoZ4QynkDjpoYGPhlK z>;??Xg{%(5wRg_;5DUtshlpr>P`VJO7@8zRnzNA~ne)j^cf#4J+*S@>{0MH0S}wxh z{`IeMA)!y7?<`7U{}=ySmw)&b|MKgXIP240RG2n;|L|5=4K+NuP|DF#2y^;k<7BL|AlOR@>8fp9PaLT_t8goyt}i*-J?9eV!Qs+zo7K}3;Xs}f*%BH7>zfvRX5Yv zKwl`jjcMq&L=vOJ^Xq`a+{=aJ3^esUW2&(O5vhzjY6VOhYj%Qap$Cv{8nM|Bv9NjP z$a63=LGb+K`W7~_RIN)DNT*zmG&*#*>e0bN8)3xF?K51sV#?N21nbK16Ps)V?*&H` zH;53ZR#Wl(uBxRn^kBPGV;{TQ22a!N)I;xv%|y5Rs6Kk~Wl`@oNX{XeVr6NnNz*L6 zKGqa3E@&wWi%k$a_ef+1r?ys@MXN#CJ%#F#?_CXnRr<8FF;?*& z?Z1d$S5Gf5q>PoG$nkR;+MpIT1GN;<0J+Z3uoN)2kmvU2NeE5(WuQ-K2qj3U1nl5r^XqxU!T>CZlbkr=&t$*Tuwut0bENas|1w|OTK6}-#>R#Mk1LNs#-{-o1||T71loLpo9wta%2!0jce)sG^wpl z201JiLx2pGp{@~X67=NGiR5W0-Ds=0BKBHo?R>anV)niBnlSb>^utJ8*Sy zR86SIs#i;cxS%Gk6#-|Yy%DR4J6@9`T^}i*ik8EL^6|irZ&$s0z3{6yl@D`*xe;QS z_OaT26KQkhZInPRXX>s~ETm22u4KDdNSh+g0gci3C81^#6k+f-Zi8854%fRb)Fs!p z-%))aWaXoeO*Z!!e_9HyrEqXX*-a8l(drA!zyH&J^H*JQE}2}MYUYKVIgJvH{EEs| zT>&N6R-s32Ku{eQSIBGZ_oXg2E}PAGq@YbE8T7Ie(Ul!b<;!W-%#LEI6s~qOY`Af% zDn4L4F^!SPO_TcR3N|u3=Z&YeD>}q|ZT~3hjLW4h4kO#JRMRFu;Ct>05sG18q7=!< zk=jwU$7IanC0I$7N)r|)RrAulQNrgNrQ2&hzOH!jAN~`4|NA%Q>Jjf}L`RWa|46!?@kpS~Bl^G_Y{6 zXltJBtgHET;bG_D_W|>(H}){ks4LsK%yQt+$I6J<#!VnHN2p{?47s5vL6IMXPKSf# z)wGnt90wv7beR|4>?YprqL$iFK#AK243%vI9fFs;*WX#=oIbusj}I?wT^1@@si~DX z?cpQYy37>SlWYRnS}9yls_>0lqN&;ad$*cvH=(j&+)}xmDBD^$!&7OT z61njf%fn0UB+)#bzJFo0!p7Z1yzx8^6OY3l*W(sP`<`!~e*%B^PWk#me04*Ymlbz+ zzvnkEUSe6)g1)Bb|KjHu9-_VahhNacB_S=!x~#RIvz1~)6>wB`>ey6uE5e_C=;?4# zOXM1Vtld9JjW^e%$EEPbRhn07H3`WoSy7aX7@TiY7} zrh|#it(=t}WYtQN_R1sdo6>J=+5)Ne^pkGXMyNpYM0AGoPFX5*qb@xO-$Pw(utMk- z(3waap?&?VV!kab4{EBCJo-4YhTizz6q(VeibCysNe?jeO(sJywAW3;K9jrsAzkht z@bK~lt;Zuu9I&;5$F^*TkufKWoN2vSSJdO)SI0(FmDh7CQ0UVklP}sh&+#GCW3Jjn zV+wX5rB@#FVox)qYmjyZT0iKJ3`cYmJ%B_*=TjqT)~f>%&%K!}xV z0~rJ^Ak$9e9hIeb8}^9}nlE&EOgKHRG(TSK?q#v#n=>7gGnCA3V%={?xgOaz(`hGSo5kvHJ?&TVv7W%YXOT&;HU53+Ga6DVJ6(8&m3iv$c9guKgG-)E>9V;MM%# zD0aZo=r8*sn4h{mz6399PZy(y_n58OHKy%Od+qj-+0^Xg81El4J&!sYmk{; zlVY+cxq(?g9IgoN(wmxwWT-TCgO5J0(|wIo+xQ@awuG8eww@ubvkHym$|}{ihH|7P zg@unzG;_)qDsUE}a=zNr`9S#PU;mB1eKGL2$A6%o{$PjUN1xN*{m=gg|HGSN2p$fF z{J3REvT4|$@?xbJRT)f?L@V^N%(5PnDJiWuTMUu>-m{Tw5{{O%XrgZT#ud4{{|Xq( z<7?bk?l+O^a-lp|xDwP+pl8=x3^(ud?X#Pj%gX#TR7O=RmD$>FqVrkJNuZ2Hu~rgx zjWp=Axx#WhQCbtYF*QoG92UDAPE;=|WV6TSYC}zQu5V|m*3(+J&zF@!OD=XUk4D9T z%~2d3t*bI;qj`Ry;pzta?Uw3ESxeSh80nNqh;(zkA-UNS_jW8czg$qgZ!Z<;SWt3C zIyGwVaP{mN>74EQgDrWNEKIj_?RQ`w?Nq9qzy4a2C+6_n9>4yce)qfAZKLX(5Auh9 z_64R-erj)i`3t#!{i++(&=4fWu^*eQ*?L@8niI%Z8j0}!E$Q(wu`LxPI?gy#CB~Hl z9geCF7n{8||8VS_OEW`Dg3U@!(X^UnBa-eys%>4%-bK2cXF6ZjDl&4hi%AA>IveC9 zw1`$ccPGS{E{2rNl&C4?vR2#sLYr$(JI=O6!OmBplzy4FYDQ|x_4Ek6%&5Y$8-X2h zpXnZ+MU!!(vCcBoq#Tl z5B39BE!{rH;KbK6Gj9kD(X;fc2LvK5wTWmHF^a7m=-GTm4_u-K&~6|a(a-3aJxN{q z_$6i69f47EPo0F{TDJ}>h5Psq6WKy+v;c5KT+DILej(>Jnrk8Pkzrmvtxp}{){1VG ztO*{Y+CP3U>r8~ryA{N-RX|hm?ZYE93WNcz^iofA^dyuiwjaCA=BCeSeepfLxLbi` zG0(>L_if)_NXc7O=@Xi6l)BNv({6-T*2`sOjf0K6(50aLB)vX~orq3Wev0(zYoFD{Fg3DjC7d5()=q zTP&zYC5No86U%Nk=~t@e4CyRAAkPsAE0u*C|2IUkg|`j7E2rA?F{o%CX)_s^d(m^C zxpEn}=Ty`fu#}68rnX|+JO5R)MHjkPpD6b`7Hk3{k&RJ^$5ujvGA)ESF`qBAnvg95 zFV3c&@aE$!#t%0%?Dp0;Z7b%~O(}hMIquDC)tds1iV}S3q!iQ}smalk9zaRxE$}tL zTAf@7^>Wd)5aqjjp5M;;?m+x_XZBbOb}{&^v+Mny#tqxxy@d^vH1!`G*R^d!G=4_C z@xH+-q#=+|B1*%+eeAL6V+4eam?KBs@a}MrCRElMIF+_q1J#mEwKT@`G;Ojq3^Z}* zseuuZ9QfhkMDGqqoiC4+j%JxnYf?)MJgRon8~4PU$^2rVjesI`+s@&N_nQ&JbfrNC ztD{&2X_x@16|t=gq|P+jQ{!B%SmySCIg!TRNfERW%zm&Cs`}0&+vBcQa0acW(zBSA z`bkeVI31vrn}%qVvON%E>1ac!t5Ksm;*iEYBrFuflLaEF{Y;%)slD^}a&m+huThrQ zV&k;Or$7I~hOH;e1aNqBhsz3CVb zZ?55|K;CV6GX~aE7W2J{t9!sv5=sEdat683Gi+fKkGqZ3Cc(p*!^X%EuzvpyUVZx? zRj(K(SMuWPWBu#@{Dxk9b%*JXe}wmc_9wL|$FvIHUuw<2{RPJ7d;Y=aKQ!Hqs7Ab| zS?N+NUFNnBEnli4Cn}d@QL1@2wc=ze!QAN)QHLt(Y)-S*y0R6|d_VUfun4JS2IWB$ ziZW%M#tjD=`<-uGg*B=9t<%C8Hcdo%X+;%!K3c0ob^ubjuv12|VsjE|_?NA+)lwad zhGHDn6@iSl8^>;7A)9S-MpG-bbD>KvtbT)%q%LzY3QK`SUNObLV{Di*A;^$u^TEBP|_Ynd;*$Sff znwP{}jrTp^QyZSo^U( z^`t`Ilr~k9WG-JiMZuhq4ztxYQIBo5Sh=k1cp}aTC2nNl_DTzw7SMWbzn@XYp0L;U zi*_Hj(a;T`RDuGn$W5H9SMC?_Nkmpp)~c=68Ndo(A-su=Unx7Vp9=(A%VC7bg;VGj z*3^d1O}I=G5JI6KfZy%mCa+$&lQZ#9LxrmA zmdCJG{3|T5)mGm#HzLRA&iw6pF{3)|*Hd++HH(#6`#7YQBzeu0lIbNY<#(#*Mi7<- zGDZ%lw(+ZOjCeDOSliOAh%Z&0jMg&_y%B3*VWUt|w=f}bG`Uc(d{rL@SY0j8nMys9 zWyiIe%sI7PNh_-&E#@O3s8`!LjFTX!VMNk6Hk>FmdsBXVchZM92R^>3wyZ14{jn#g zl{Ir-vaN@uF?`q<)h^ClQ26N7rWt;FHXXpxHT5nOh#(;_`-$vo1W!yDg38L!HKR}< z^IKaM)e=3^GHXf%y(B3dAhppU52}i$(4he|30tLF-Kw>msSz%f)m$d4?3vHra$_qz zs5&z@cBggo$=F@awU&*p!tg0+M#H0{hA@KYgff1B^Vjci|Ns4;n8%%kO_r*vUwvEo zZ~xb?^sC3L9^5uA#8w;jd-WSe=8O;qn)707t8CSoKc5>Nw>Wt-cr?h9Em?#kU1m;b zvN`eT@l@MlaNhT+j$9Y&Ckb_By*x_sirQqh<4UPuoW|aH=HN7JHe8(|)K+i^JPkB* zd^&o|m6yO4B#43QysjK}17B@#X}{T^?xHF+`6{@ak2YVbUQQ>QxzaQeHallO`1mJi zifUfe=5=n=6moORaeG6a$kuwaoG)0h67gQwy9-{u_*QjLlidK>Mzqayk+s&#g=HLp zX#+*(Qq)i?$(l$24BL&}eDa679|PMZsvkD6xY&OD2*(%SuuEp-50>s8`OP;MJAVJt zZa=N|`M>&O`r@abnV29{hr@5b!_BSP=YReqi#Z@45491tI^S7d%&fLj)c{}XSfv-U zYQ1m4Bwyf|fb&sI5A1xuKLpjD9?{f|Q2^|6GOkCF#>-hzTEQ)IE$0*b#C7mq=XsS9 zCUa|Tl2q3vbID9qNUJzh^Hk?XkD;Ur8GIkBkK@EzD%Vj|Yqyd%tG){DtdS)fZ)vw@ z>_%AABffFiR>*Rtr7etUV&RFyd}*bu6^v@?_+SGa+Wu8kqTEOYZM@*ReV?6j8mSfS zij*m?=c=C6Ba`I=H86f^M6C^#U~bpgyoSdID?Xy%RnpLpe(U)jg|7)RqT!*PAJ`oL zNT{JnL2=A+6wS$`dUhrCW3PVR?=wnWP$eSgLYQI6RV7q0tk5v@x?Ia@sw)|!n?>a4 z(4Du}R#-q@t%oX6w)P9OBKPqeVC*%D=k9sdSb_Oe`-wih^q!{z<>WkDncBl(?hStp zal7-7Rc&=3bCHFsu^FnZriNfbx>j`BSJ7pQ68bf5PbFjNy-Y-cNNm=K!iJ#?9|nGQ z4f*U}{~`a^|II(wX-Ar!*EJM27i;n!J!^~_!Z}-Nwl#y)p!KNI-u>g6c;0SlIbYh6 z?pNlGEscq>Bd*F#LU9)Y#d}fllKh1!7~=APem&~XO(aTYPtJfY{Nl<(h!)vs4aCk3 z93A(I7mk8htp@6+foLM97(?p>qGHty#Rn7%TIFJEH*O<5Sxq_Pq#|J^-5rH8rjbvbH8{Rq6lKaHO<^h~9y#Z9_ z9&KdWg)CR$`g!o&jgLMW&5i0T>?sR)pi0b6&uX_D zEW@AR^=}h~Y2m96p4VU_@%E;E^W~keA9^&C3)NiMayq_6UUCCml;r}ajhxI-Rg&PL zsfoowWLcT9>TdH4n@^r2!P~JgEqO*3Ps=JK%h@)&s50(R$FWCM_CDn7j3B2!#Vk0Q!UudiP4K%b8_7#UH9tB|wLr3PQ;+4C$Pc4#Xi%&xu?31O zuwc@IV(X&${;bP+MY?}s<9=5^{`3=zZlrlWt2Rb=I;!%9xE0fN?$?VBgEJ=8k~z7qGJvlN{6=;@_~vzc2eiv+1AH}O|trZ+inY}N!&=lZo&|*{tHcS z)+AYTWQQGhkBED3X4cmI^|t{ZfNy{q4QDiq$xIxQCZqnbUihFV%0^E#Qj(D-nIuwU z5C`kG^io~9+g%InI#Ao0dOhs#L#79%w!(RZ zqEcxEalK)^HMx=S2({s1PwipLa%ePyQR394v=EmpZJE7j08POpCbMBeS@6x>;`Wx!s zXYIcv6kVA(`AQx5cKXD1C#TzL#K8w_?kmARc>uIzAUYU?$a(>c3sG7Obt9y0_~iBP z!7+Ax;nFgLb*uBMqvqKHL^{bE^%XJPA6A z2XdW!#?ilibF*Lki@)T*{@cF-9TG3Z@Tnm}Mr)Zf>vqeX%GhW{5NAf~|DiGkJ%*0( zk@vko@+UWgw9Fh%ckB?GthgGP-fl|S725Y_;`Q*FbUVX!5-ppy))oC_Sn)cNncjrB z`mE+#Yo^rs;WlEh0yBd*6Dm+yxFxsLF`n6nK^_XH;Lb8j^2w)AOi4cFv?Nh)6VkYA zk4#4=!h$&5dOC4BI*DjRuy(5>#0qF*NlFCx^|6y8k7!JzX>RIe-z#$`be3AxsqMZ@ z8_Rq!ni?<5(Ws9;SJXL5Vxjh+9bAe|-%G91yGf$NCt7Q`tzTkbGzY65={lO^)# zLhdx8PF~5xEE$(IBVSg#oS)H3rOS4qd^0cG#@MrqZG^R<>8GY@WgqudiIsb_%l}7X;6U0#qoMvcrYo1_XhpIAY_EcD)vvj%Z@s6E)J($MGuRnZFy&zFyx=YWV ze)Wy>G@}zgc_1853#1g9(u2*NdeV;MGjC?f5=Ypdi-LH8Nc6y>)nhNsgSA4mSd~i*6ZxpEf$onFosEiep_pd0 z+m%Wc-(D^*ana?(xP!0{LA1GE)Fw79*0A}3KYo0R(-#Xry?Mj)DO!yIVRFM(tX!U1 z(}`;?^x-$(Q)xkJ{sCY8{O5S{^aezc^6f??^rB_n7c5gklH&a-Z1_mzj=UZ4Q~UPkKZP7m{PMo}w%ss&@gzU_ z@+8BYB~5UHnQqYf10sk#9Yv(8)`VRJHYJTTj0 z$`pkWKi+t0&7?HfS+wMvCq7_SBZ*o06eZ0&A{lim+c_W4BwhIgC9dg_cKgWdCHY!b z7mGMP-sA2N?QTk(7?8Mol`gKMdlMNa;T(wK9Z;={BrCmG^MSOg2_4XQ8d%u{+lW>2 zUhKqtTr_TQj$<6oTXtz`9u5{eP9jsVaSJ5k*(o+niP)@B%Y$x>mre5IO(#@#<_%(6 zhsy3hiev7TfK)c9Mdhj^`NKL1sBUo_$kLd+@!Ghv3oYK63X?CWGYQ?PQyBXncKcx5 z-&?$+FcTv!EQ@xLf~<+E6+*kBzp7|-i2-Jft212qC%AzV_dG$ zm?Us#h>Y;MVUE?+wz*f2hM?qFy2`;cNBa6#5B_KW^zZnmkC8^SK{yGb&@krRi4Mm& zjEy?@)~j1<)wPi7P92FY#%N)gIVK`rgice^(_BsTHoCtP)RluYkK%Ilwq20+mrewT zp&Einpg>qAREl(zo#r_jR|hBOnHx-#XS#YW!N+)&97R({(rPkGe|G3hjRO04Kbo1# zMWcS;&_DdpMjUl3t86qm(E;O=tc#Le39Md2Mm#Q*LA>R{Iz1wB<++2*)*PM6l+^=+ zG(CP3HT{xyh;ZV30kfI=29LbQ<<dq_Jm5cEAf2Hga9UD5K+Wy`d_|6m`^fwvc9twcv9 zS^{`x$I3VIiG1Tf+W6h|5BpZ*>a4Q61??SOOv$GXIljn zFxiCp6i|I3sf`Q|uwrE4L7m7x$p`^Ugy}Y74%o=NHj4xgv53GaVjm{_p)>t@qsGl; zW@il;%EmhHAmTb1p5OWugxXHdzT3ka_`}z)fww=>_Vx$b>*{UW__NoagAa>xJW@fk zm{gRaWv#s53VWL_ObcnZHJ=YheqBwu|J1@F{FsZ6jQn)P&y9@N;7f&uN03yvLMvo2NY^1z( zCGKclY&Gv{MEei-n}_y-xEid>oL#+ZK`*AGZ5^42M!pAn?UG)R-4xNFk{}o{HJ@An zOXCm&Fai;79!1?-<=DvyGGIpvVj`QNS|g9yy%$qmDNuvZNXG=bvdh(xcd#txp~0Du z+Dz1T<7#5U*5Q5ls+wu54&=nuC)P$l1IqBCB;)?t3;F1{^q}Z4rvy>MvohOO>goGI^Jps%i5hE|~MxjzyMx$)f>LG12{ z!?{pyl?ss{k46g9sgwCftEIpLcR9qp@Ymctx5*D$P;SPR9%=8uz1y%z6waLJ!H!2A z-V)?lkvoHRwvE|S!(hv|CTHmJhDQbh*g$tW)W;BgML8ngW4nQ~(howV&=LE`ql~*C38aeH1?Lwv3 z3WsmCNXeNl?<;*cA86Yu>cVuq6F%IXbefWfkVag(P(+u}O{C)rb2vJdAiaM3JUOSx z;TWAga0*H@HF^vg6R*lCA@#DhHLthoc5!dHdCOOizSk@pSPm2engvI$HuMI&oM zNe%*S)DnoM8B=LOwGEH&ysq9#XLIHm#%q_5BXC72%boFbMz6FfZ(_*8(}~oC%eKk5 zdz~9>7NQu&{4KMX@xe?_y(&U`X^0D`66tj}ixs9#ovMXUfyMemv@r%qk@4IA6RCZ` ztGikE`88eN5_#Kbdi|9hKYR2oXS8kiC=2?B+*$iPFE$B7bU5`1hdbui6LkrtQ$QBE?^u$7f}dY5Xcn;ipz z37mJs`rY@ou5ZPT!DXJfx0%+9 zbydx+iCu36IURV1V19h``SF1jPD~>Wg4MQ>d64Tz9G6FruTM6|UQ#-zh~_Qu`o5VL zXNiOnC^!eREsG*K<%_3NBC-r$*bhf$UJkGgsN3d!S)(xQKyoc?u3}wi?k}6mAxKKW z?x!23*w@s}$u`48UZ>`5!~oCGu6BdKk4NS-5p|NfXKC}D`Sjq?+qjRV^T=kQm|vW^ z)Bi>zYiAacxLE6yJOXwIV?=NqAZ#0XnZ0F&qqrn<;0V60PN7*iJi=@J6zsz@*ZHVC zCu)(n&L?-z_!PD>p`}ybM$ir_#i;A`{w!-V>cFfn3}&|ytpipQx3J$l&MJl`B*=z`02m=8+`tYFELNS#G-80 zob5=L7STc^m4-GiZYWApcsJ(h9<<(8*UlDmW}ar3qGK52C6d+FQ04_jlT|t4*kCR< zu2GyZdCLwvrcZeZt?=lsI~<&DABc5AFxW1EwQdwO^KOEo!Yanl%G{zI`Xat;%ze|P zVfcX1ZXWg(+T14j6yDsQX`qUk3<1&llXJ46cqE=p<~yUU@H8-lcn-};lj|*0q{!(m zxCG;5Ongj)#e7ZI=$}1fr^Awj!eGWb8|SEIGT?U8$)_h!k?`(z)~6aa~He8dctLyJftrjs4>e zwW_Udz{()a!)PN!73hlvB9DQ4nc!io9m(TdwJU_y6^$%o9u&&~JWV4(HO!-)V$I}s ztuB&WhCQh|1r^cc-gmet#P1z`^QpsK5}09hso2&`QxP{AZf|7T39!ID+ zVZ=6emc?@?z!&N-9+BDNrcwmu*H`3!{NMa`{*GUNG28v?pSZ*wkH7p2fBKVGRJI~z zZ@lkkWXhg~alIjgq-)LQn%zuw350xhYS+$LH@W}%3x0b2Mz=rwp$orps)1{!LYbC0 zD@yU}hwtIS+LxHf%;JS7F!%^N91^)Uh$oH@Biv=oG|S-;ZLgzEqPWmy-)M!C2Xo3B zM|7rL-5}QTs@sn*^zQrL)Ajs49q%6Tz;}F12N182*~q3!8dT*jTAUJRjePsfGe7_F zyKx@-#m|2wUw-}Pa@`E)m-jv&PVji(yN6^aIZ-%1vW!XeS+*bE;{Cg4>r9lL)pj*S zqF{>`92`iV9u~X*;tfg5wEgxO>v^@(lIZ24`-c~imNcdVRau=*CuBa+2wX3Q>V=yY z|Ls3Q|NYQwg3I8)_<%0|wM#e@!I#12SoA<&q(vCwN(*d2JSgT^Km+ml*-U{%WRg|JmQr(}^V;dDpu8zQH+z?`Ayy_y5dOBQMpY5+SANZI9SIp-Q5W zl~|1KkC9apG#4_6`fcqGktM3PypEXT<@CT#yTtj_Wj58AsguQ=*|}7wH2FwoO2A>* zDMjql(Jew_JSydiG8G^ica>lGXqq!}VT7(kTSMhyK_lhbc~&Bek!+Bm#GKE=6I+Hu zgHzYHUM>)BU^=^Z-joYP6XJ!aPU^aSAdM4pxtPAskab5b69?aiKgt@2%8j5QLY5?a zSXg54umq)LqWO+Ie32x~45SI*GO%=0C?Qrzuf%_;j3n1cp+ibL+H7)It|I$uxfQ ziYUy~mW4WX5>Lb_I!UCKCeq?qHBilt+hwy&4qjb}YF0fYwu?bRg$Y@>n*_5^2#Td+ zs4N`f0&h)2VsyUB&=n{b3t7zyL5$cw7!L_%#gz!S_o{& zo+fyj`Ug5Q#e*P#!Zf?}efD_tV5~7FG~0-cl;C!;D_UG!aOS-%ZYBt|X$?`tSGVCF zvyoZoh0~fHK%WjRrG-1T{iwrotdS8n;NF$ylOX!Y8=wrZCZ(z)FeQv=$tM5{l&)l* za#*$>pGp4kum3Im@DCsD{;NOdS3kQ$3^Ts`dE>+Wds^;}-X#P$dbAGIi_618>wb~L z@;J=ZEdaST))+9yWbtson^$k>?YrOe`;S+yfkv~nb0mE+hY~*=?;!^F4~6?zZ@Kyn z4SpyHIg;9HN8xc~t-5iT6q=k`-cV3z-+@*txUfl8Ki%D%9FC*^D#W8P4fi#%Jp1$e zE4};ecjWW|U;N2W_3JmU{UM!ryH&n@c<1Z&251I(cKED2XM4Wx#01Q7$NZ4=v)5lb zs?vJ9cJ}ThPjr09^z_vmdh_)!=;`#jFL>r{$N5^N#ws2_TpBmeBm5)CjOqRkAYu|x z%@-|ISRU@YoC~!rtKKiecvWg6_bcYlzs0MENA(b-R-EUr|Gyt~i;I8t@C^z# zjwCd5@#%}tb*8TID&~hTM@zOJdO=*sC}?YNOotKNv!to(ijHYW5vWsNITN-HdFzd8 zf;&%yo0_zJ*mS~Hw+5MFfdO2LD!)5BZo3_(Bk8`=Mkdq4g0SBx(Tui!@BhDhxWw6N zSD2$ad0Z>vuuRT8QA-QvG2yb%7&`LieZ{wys7oUE0)=qpi8)596d5!zT?&Oaubsld z483UH(4RxtcIE)L)Com`gwVh4TGUL0tTDntEF@M|gU37QGQr!*I1no3VaP`P$NP(E zm|68lvoW+d377tkc2^uo0UJ3XX3o7Z1~D9tu4@HpFYyV{E7Q#E*_?P&(qR-)~@xBX0^mltkglRAlwkyqb#UxJ8JleMTxQHtTt zV|bugc7x2$^-TS@oQm}2I3lhMnZsB|`-sDXXA?_?b@Q}d$m)i$#1Y7-s^;51I;F;; zax0{xA@4YhW-3=0PYzwZb(9LTODLTVNoZB8JGUqZ?$&F6e-4|njA49ksIA(iW=eIKj~-WC#0uY{qzN5=vvz_ z#>HuJNb*`5D)j|V1THWO!_lErG1KFiA~G&!oupt^!^YOhUnlrkyj{+Axm~?xL(YdG zjM+sFDOsBPzABh_%)gFl^?bdc|D&+51SFDHJcP~D6gW|~WhTr?;1Vo^+F1)1-Mw|u zdCR_guMmWKUdIPzXq>z_h2{Z);}l_Z@X&d(Co9h0A!b~e<_#?zodnDcX}E7QAI7wW zk=uTDY~@9bm#zU6wp-O3Y>Tq!)@8TM{q?#$0$B}#i;u2aO^1oo{3zoHt!}(Y#9lKz zgyHP9wI;3y->)mZoOMjA+DM%>*sXOv57d2RcslRqsc`U*S~ZNB+SINd^va@*V9H&} z;!>E}i&15#%8VI($9?)k6OES2eYKI z|MaiycmM8pUi3mFN2u?JcN4Kxnsg-FV=Mq+nmsViq#+vfec)G*pL^S`dimiU^7(4g zib?GS#C4ins$G2dn@`IT#W&PjRZSVxI$j;fB4P3HuN8K3^uN)g$HVN0$0t4< zBPC+QX_onvNUGEE^trd8xGxf8uZ84QHqRdezW?DZe*c@_=;VgiUwp-1e(~Bre|V#{ zGHxH=3&jT-jstZQs*zn`TP{*5Ask!|6FbSl%k@Xl;hs1Y@aZcYj|-lD^@z`Y_7%ST z`PU;b_VVu6XjifJQtABu#b_M%MXoWMPc-hPVNqIB9ACfjhc~ZX*9-CeBVzgJ^|tf% z`)7Us>tA=xPhWoZr}A)I5at5~0jJZk1FNL4(d)nX8~XD8Cm0RZUOAkCy!!k|L?_k# zJ>hUH zP|#31m@-Vfoi|SFijE`(=2Wf_=@|F1mk3N0tliYo^&=$BVy(eU!7W?d3OI~rfnj}3 zBl@^1O^JuIOD6}-%_bMCRVZvkF+tGA{Yzk_W@T`NvQ-Ydj{yK5Nyd?|W~)BB_s3XT z*&0c`XVdJQ31M6rG{jsS`p`dz5r$uVhm50;;$DfYFxw8d5NvaYH*Ez@nZaZvbm|ag+Ey?|{2|6KJ;wY+5ohwaIMFihRJ{cZJ3CJV z+%Os+s4Gx(!bMh7*X{yx(`>_Rm+~h&=@1uv^L6lF{`3Eqe);XA&-YK>DHwD7=8h5T-a%>D4UQT6T2bR2McN68$?MJ58hwuB!V%DF zEk1Z~M{P`UAWZ3%Ei-eP0?BE{d^*wcdZOcJU&-N%&uKmqd^s6H9MSP^D|Hp$dNp@p z8At7%mqnPBu}>2!NKT`%qd(5Rr#gf1YG_(~e_7eKLhbp5_Ns#hM;1!v=fF*q=9O zIaAA3qAR)IJoC}}`YoM)^nKgu!)-JkbUK4!rd^8hdWG?W$GEdKRon=-ZAUF^x7tKI zL@6O36@hyt>9qER-Hz^|c`4C(UmRM|G)bJUOp;8e&C8KVDX8ggmOqS)9&RU!O-0DN z%yXGsJRN<=61Yys*$qlk0=S(iwUv^rCd=%v%;dABSa|*&-HON$KSun1Z46s{4w)(3 z6IWyM$osx)?8JE6M-}&MGMClk^Mf_G) ztIucJEd$dBt{ptIOk)Pr=+{@xxx757i$&zo&!Tb?UBbtDHZ+ z!@7RpHhd(-%gfHlgmgT*&{bc5{xu$c@hy3{Qoel;%bTnpSGs=uqkjMY{3rR{Z-0m1 z{Kvny-LH6<77e-b6rgvtE9t27{sDL2JlW@e_A8C~))h%tUVaRU6bRep>RMa>$vzp6 ziSA0P-_4Ma4iIhXTQNo!X=4)iQKfP0iNxCR z(L-xEC81@B8b=D)&!LGl%7JsVq7H zQVE)2<9;bZ!^o|%uHmMUiAEG__Tl45%g9o%GO;bw=mCTTO0>b3SKzioTLb1vR3iLV zk@60r$hMq3j;61B9{reiN2Jq4emr4Y611!7zT(4-nkJ@caZWRu_2qaZ)=YsK=>c8! zjTBz(Cn-C--5%-dKuj z)SHbNf8R$w0->-_Knx~#OP0_6>Kp&dUwn@G@*^K4$Y#|&cCrd1CDOHwyW6u9HiO?< z=r4gOMmf!srPIlLyQy`^mq%L5j+jm($PJw&+iuX8kt?7)jc%;itQR!snA_hihN5xA z0tLzU>f=lxbTJ4f?nIV7q?38<41#<{W}bsm-ifdi%VNL)7wR?FDZ2!AUT?UC2cnXl zOdTOp=S0r;HgbFBh0yBg?`Vi#gSqDHZBv*{00~LisW6eWgF|S)$AFNIVgy zFk3t=c6>Tgn$6@OI>!b{fzv@u;yqG-KQ!Z$x&4j+hIWbUf#8in z%^v;5598En0s)>Hsc^*<0!JMUrNq>jixIzbK+>nDKH5 zFO&-SFh6kFKGJqRdz>c-2~8-yTyZ!oypA*Mq%@mR&5|{b07o>K+h+YoRv5G@$NOXw zAM_}b*c8d9nJ$+s+IGfX>@-d6u_1+{S17G}M&iKR-mGflqD*1Z5x^uq;hIHYynn{a;jJ;LFD zvMJHJ(Pg{&Jogn_aeQC_3%9cAu547ARt{ct<)WFkZ7186Q+mSTo3ChoO>XPvSQ#=i z_75MZoR#ClpIG@A?ZaD@-@p66d^#QR`Qyp&!bAs&B+o0a-~A5rL*UPT_9dfqogt`u z#rsQfO^N3F2kN!KFnevqgIizfJO=DJYc7qpNKl5}-!VdYJ(hQLiT1VkF z4D$M8vvN~A-OZdn1>-~8#iw%fQm(_@*3Xx&6xgq82VV=iYf6)QOun?}DTur0K@_^a z$SX6niqIs(Ucemn)stsw?w1c(FPXIiL?g^I5d8;>UTA_rCiqC5iwn5yoqt%6PO=i( zZSz(#HChS0`9+4Q#}bF`;C7{9^3$F{(;Y%(-!Eqi+u0;PCnXet3Lx>jeq zaf@S8;*(#T?Pee@Six+Nm4$gDU^A~Pd0n}wj_7dSZ^YE~ymbxYT;Vb-etSLa8tdwc ziDc}z^^@k1qngZI`$JXl4By}&b|X*h;Kfn8(w#d}I@@FvNgv)M`u4y3m-hOpZG^abN=Is(VD0KYiIXd*Q`LK?tT0v8?G&$Tg))_JRuv7PtoSRD9E2QQQl4haW8XuhYqXy6b0Du5V zL_t(WqR(2{nnVhzz|_r`@%I)~k(-2if0}0&X?i$W~AR)oNp$ zf*?MFbia8k7vm=(saF)-n6_&3{z8Yx2R|HUo2Mhva&S5Hr7*irufQYf@*W}7jvOjs zC+7k~l+H>F3wdALVR8|(=+$DUhfz@>U42=@YChuUjD;p|+!XC2tNO4@_U9M0ebx59 z^Of9Ti{czDris0tZLZ)6LpLMMM8ELO;B&} zx>wm6Va-4h;~a!(-bw@zaxY4yTBk?Y8D+DD%ZpZYWWU@Re7 z3KOL%4buqbg(w*L>h|G%aoa9le*4}hCU-~Yk#^AJOm`Hf1fK(l63vriqMh1QsEuPi zb!r=YeWBa?7pneZJfE1CBs9&)N&8lz`&w0ObxkuRF+wBeu)%Bt-zq2_xlwej8;#32 zPcTXTDRAWKB;F-IVIwB5V49fhqAlKy0CNwj$pRPI9GxXC=**ULL;u9Fsrv^!>aYLJ z_x_)M_mO__PyXC~_RC-R`MM&<{+T-GZMCH0m|#2~B-Nc5fm#f#x2)ARgp=5m6uGWw z(}77{L#SPvBQ`O%-KMUV;)?6F!RM3P9?W1A4-CjgQI1_W@YdO4We)Q_@#(?&L{2p$ zUtS6<5^WJ+oB*38c@1;2ZH@$==6 zc=-8i`s!yt>*Ni~UF6cMrBoPg;|9?O!4G#&7AAq0A{Ln9?Lxg==8IZ+`%F5K$H$50CuV=n!|#20^D{D?)uv?Ao3H5g z*RLqufzAc?{sU~ievqI3$)C{Ae)==K)ZH$(;@3{jNFiUmf~Hw?Be&~|qf{y%{s_Kh zuj|!IxsBf7+MI#emf+r2lC3$YMBn>5m<4gZ^DeS#?tmIQ6~&g<;k@OYD6hLFV-m02 zKDkeIwL)6qH)~vDKyx=bP42mn_DUQk#QDVW^%KpnU%T9kIm<}g?^@vL=@IuwM)KhE z{j9|&(220Ue1u;s@3$KrrFwQkph_}LK1Ttm`Tc|RA`A$ISA*3};!fELhjN4DJ@)5+<07+L!$A4WI7DZ|fatB3v`KBe0*AE?wW z)X6J%HIby=(#VqVkTH(N!iCi$QOkXQYb%+p7AEI%R~7up2Kzp+Eft zq)h0{zrVPLo4Yj{`9n?nA{@O-=%Tk%%LE!nmKp{VjUMUlSn>4dpUYqT+0Vgqp#IU1 zL_z{(n`BEP#vj_+h#>!XIm^v%HgP9|5$SO?l5wYQk_y@_Vr^`sW$rZZHH$IAEtj9o8l&^L|APUCg*(MRU3F8iG#6xcCiHs43 zdDNKTr6kP~nuY$$5(VL@t7#)g-MsK@2|~H4m9@I=#akucKM?Juk=g7t&lY2rPHu5L zh#b4zcM4YN)`?RqYNX7ud5jT}5}Onx2YewtR&nEmsET4Mw2ee=%3QU^gLQ$kHd6y@ z3=w>qHJ-XaR&psgECDiqnoVtKb6`=r-Kekq+PZQH9`nRH&CXUgDRm#7OIRjkZQABx z;MmoiSl&1{mt2gBU$hmbGE9`;n#hSQGmIJ<4&VTnw%9ZuB{oBy?tERF->%9nFYeMv zt0AQR;Es^8(b{Gy;eZJ@wPTz?#LY?Kg9A}y(`hwGRZ5u(s3my2Z+4t*317+C054W=z$tgB(o3m^$R5qh9 zM~R1tdNq2wdxH2u)bFWwz2jnYjQ-hI_q5!-LVSJdAk)Q_PKOh6*=*k~WM#Of(e3&S zPtH{vk?`oj33C!grAbbF{qe0IPX}(ou2DIcA|Jp1k>38{xA^TJ{z3EYEtT(o!);Te zWy1V$Btk=cy!X4u*S?kNmk(FpUv4zN61h9P;+H?Za}}3XD|G+=X!^5e%aY?t3|{UY z!`^4QH!~}1AW%gT1`^=+k(8*ZC918>*!`$~ER*R)FKv8i8pRgOBsQl4P^c+0?>+aN zJw$}N%Oa9`OQ6o(=j<5V*NSjo%jJ35=>GgHx0m;JbR*Izbezp)f_h-gNA*BGu5?iA zl-zx}`snCd8jcTd+)@FaRytm0PoF*7+qYl1&&jC}KVP2_=4hOmxe%7MFkB>3f?>+BEku>< zm`{A)UR?LPd4Q}bAWo$1-3#mW2hFYLzQpI_p@Rx^K+tj&P02BIb#||Qr`vCS4So8K zy+jHm4kPB22R8H6z9p5i_UcYP<$_e zsk5qj*K#xHDOlPUi*>k)IQt!J>`5lo)RPP>l?{G~XsLsd?5?Z0sUyywrcOc|<>nAx zjAG-kj#C2eLAcdjWq2bGzm)GOT<$g1?-BaKAAwlGBktXM9Gu74O{Q$z|Ngq0LGdN4z3$bT-laE)z zs}WCZqY!{iAO;eXK|HGr(?X`=gv&r6dYqMv-5OkJwqawsH`374Eh$BI>Oju|qICom z(`DiZdb_8qC<-^@V#@Njz0h{4tjIWz(l;K=q(cbPE_UO zKw+AWsA3rM>0-ca&ZW8f5n^h2X3_^3FV6&Np8P6^pMv)HMjfIqI!ZN~ADotFnV1cu zm2vVZ3`s{eE~eMjwFMs?XG79yLG5E!Z^jfXQgZ+-Z8dGyfdETDw7-y}O(eO2_vFk( z%~Z8ek9)-X-Dh*d;VdC1icOt*vR37s1&8@a52wO$hSPlHI2+3Y`QZ)wJXMbqD0)(s z4@d@NCX&p;85A&49AeeGM=z8xY3r{Qn-jStuI^=A{6MvNiw_p|g{!`JpJcxq)_bwr zJJ5$`^SX6tR}pCF(pU<~!@j$(1=)kGK@6kmA&JZfOnD|t?A0o?=ls|-aHD-Pj#@^$ zX@|vBDq7vGZ|SzLR15kPjTUG+vZr-r+zZp?)W;J+H|hX_MtdiF<3h#&jy3tNUby4qY8}j51Sm;@V7vtK%G!xpY8W<7+ILN4x;V9Do zIgX(}T!+_RI~+V7W*&Nlo*ZT9^_rwetuyj4xC1+~ART&CwG=bB-62h6s8Iw`?mG`> zSBgZ5At@?rhRjD!qx)v~G&rwpTA#_&4ID9M!CC3tEFimAoBhOgU?Ob@cej1w+R4u3So#(HNAb z(LGQWM#@>7&Gj&I$Y=It_jbM66eleAn+JU|jtn}S-Np%Fayaz(_Uuz)OM3;|BILV@ z^q}&wyyJdbiS9ce(*vE~96Uya76`PORrurK?B@>2t2(V$x7*Sqr24ej%M0WEZ+|Dh z{^x(tZ@>9KKdk@a>+_GaKUb=at=xaW@p7Su_=fM-E7rm`iK8=LUGBVoct)Jh&RSfr z@0`=oKqR;Q#{E;w8N3uOJ1a%-xce^*F3NU&&tAibfOL6UJqul^4C^-qwqlGBwR zzxX3MsM2Z+`IPj>AN~vd`0L;5qDso{#TO}2UC%O%Y0GoL{{64{P9jxJ!d59n^4S|5 z(g_rmi3`oVd%m2&c@zReDbreArIB|41T%99?&rYdJ0#7{A+nz)oALy^_N7kF`2O$Q`E2gn6`ds(^<3f9esoUDwFOeCl=vBVm2ns$RB>?MCPJ{)Pw)71>TqC&&nC=|y zJ}k!R9=UBz>iXpPaOd^i6D>E9(mE7Nque!78B?oKOy}rJ71-9}c#n^web0ES?%2r# zJVv3o6G9+_{@=OB3S-A)J2#QSi04u{-!}^L(Zg`8b&5W&d8n^Z8@_)= z*wt;hlO06V*k~*6_X<2r$`lWfkRf43zPys!=UJ1Y0d?3x>Tvq1+aj79tQ>h1*P9~5 zhRF*?HRO8rj-IyCbbYybD`G6cLOj?pkCp4@4V>Ai7J;ulyyCDb{60XtsSd*!ZwuHa zMu+hTE657*nxzLU-N_OJpt*pe06E~%Yrcy;@ z6hZG|`&Mn+H-s=7QzXd>q?wS6?)&ECosuljwjv+0$N9iWiRD%1mQJV}d#!hb{7T~7 zD4otUKfE1nMeFl|dTpTGf!0LLnv`a?RkGc7i=2E)v&{1wiE2QY=rYZij{WyHTWPny}dw6#lC arVY6As7E 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 V7vg)-_rw4I002ovPDHLkV1hAoA%*|| literal 0 HcmV?d00001 diff --git a/vendor/golang.org/x/crypto/LICENSE b/vendor/golang.org/x/crypto/LICENSE new file mode 100644 index 0000000..6a66aea --- /dev/null +++ b/vendor/golang.org/x/crypto/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/vendor/golang.org/x/crypto/PATENTS b/vendor/golang.org/x/crypto/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/vendor/golang.org/x/crypto/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go new file mode 100644 index 0000000..661ea13 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go @@ -0,0 +1,16 @@ +// Copyright 2018 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 gc && !purego + +package chacha20 + +const bufSize = 256 + +//go:noescape +func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamBlocks(dst, src []byte) { + xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s new file mode 100644 index 0000000..7dd2638 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s @@ -0,0 +1,307 @@ +// Copyright 2018 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 gc && !purego + +#include "textflag.h" + +#define NUM_ROUNDS 10 + +// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) +TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 + MOVD dst+0(FP), R1 + MOVD src+24(FP), R2 + MOVD src_len+32(FP), R3 + MOVD key+48(FP), R4 + MOVD nonce+56(FP), R6 + MOVD counter+64(FP), R7 + + MOVD $·constants(SB), R10 + MOVD $·incRotMatrix(SB), R11 + + MOVW (R7), R20 + + AND $~255, R3, R13 + ADD R2, R13, R12 // R12 for block end + AND $255, R3, R13 +loop: + MOVD $NUM_ROUNDS, R21 + VLD1 (R11), [V30.S4, V31.S4] + + // load contants + // VLD4R (R10), [V0.S4, V1.S4, V2.S4, V3.S4] + WORD $0x4D60E940 + + // load keys + // VLD4R 16(R4), [V4.S4, V5.S4, V6.S4, V7.S4] + WORD $0x4DFFE884 + // VLD4R 16(R4), [V8.S4, V9.S4, V10.S4, V11.S4] + WORD $0x4DFFE888 + SUB $32, R4 + + // load counter + nonce + // VLD1R (R7), [V12.S4] + WORD $0x4D40C8EC + + // VLD3R (R6), [V13.S4, V14.S4, V15.S4] + WORD $0x4D40E8CD + + // update counter + VADD V30.S4, V12.S4, V12.S4 + +chacha: + // V0..V3 += V4..V7 + // V12..V15 <<<= ((V12..V15 XOR V0..V3), 16) + VADD V0.S4, V4.S4, V0.S4 + VADD V1.S4, V5.S4, V1.S4 + VADD V2.S4, V6.S4, V2.S4 + VADD V3.S4, V7.S4, V3.S4 + VEOR V12.B16, V0.B16, V12.B16 + VEOR V13.B16, V1.B16, V13.B16 + VEOR V14.B16, V2.B16, V14.B16 + VEOR V15.B16, V3.B16, V15.B16 + VREV32 V12.H8, V12.H8 + VREV32 V13.H8, V13.H8 + VREV32 V14.H8, V14.H8 + VREV32 V15.H8, V15.H8 + // V8..V11 += V12..V15 + // V4..V7 <<<= ((V4..V7 XOR V8..V11), 12) + VADD V8.S4, V12.S4, V8.S4 + VADD V9.S4, V13.S4, V9.S4 + VADD V10.S4, V14.S4, V10.S4 + VADD V11.S4, V15.S4, V11.S4 + VEOR V8.B16, V4.B16, V16.B16 + VEOR V9.B16, V5.B16, V17.B16 + VEOR V10.B16, V6.B16, V18.B16 + VEOR V11.B16, V7.B16, V19.B16 + VSHL $12, V16.S4, V4.S4 + VSHL $12, V17.S4, V5.S4 + VSHL $12, V18.S4, V6.S4 + VSHL $12, V19.S4, V7.S4 + VSRI $20, V16.S4, V4.S4 + VSRI $20, V17.S4, V5.S4 + VSRI $20, V18.S4, V6.S4 + VSRI $20, V19.S4, V7.S4 + + // V0..V3 += V4..V7 + // V12..V15 <<<= ((V12..V15 XOR V0..V3), 8) + VADD V0.S4, V4.S4, V0.S4 + VADD V1.S4, V5.S4, V1.S4 + VADD V2.S4, V6.S4, V2.S4 + VADD V3.S4, V7.S4, V3.S4 + VEOR V12.B16, V0.B16, V12.B16 + VEOR V13.B16, V1.B16, V13.B16 + VEOR V14.B16, V2.B16, V14.B16 + VEOR V15.B16, V3.B16, V15.B16 + VTBL V31.B16, [V12.B16], V12.B16 + VTBL V31.B16, [V13.B16], V13.B16 + VTBL V31.B16, [V14.B16], V14.B16 + VTBL V31.B16, [V15.B16], V15.B16 + + // V8..V11 += V12..V15 + // V4..V7 <<<= ((V4..V7 XOR V8..V11), 7) + VADD V12.S4, V8.S4, V8.S4 + VADD V13.S4, V9.S4, V9.S4 + VADD V14.S4, V10.S4, V10.S4 + VADD V15.S4, V11.S4, V11.S4 + VEOR V8.B16, V4.B16, V16.B16 + VEOR V9.B16, V5.B16, V17.B16 + VEOR V10.B16, V6.B16, V18.B16 + VEOR V11.B16, V7.B16, V19.B16 + VSHL $7, V16.S4, V4.S4 + VSHL $7, V17.S4, V5.S4 + VSHL $7, V18.S4, V6.S4 + VSHL $7, V19.S4, V7.S4 + VSRI $25, V16.S4, V4.S4 + VSRI $25, V17.S4, V5.S4 + VSRI $25, V18.S4, V6.S4 + VSRI $25, V19.S4, V7.S4 + + // V0..V3 += V5..V7, V4 + // V15,V12-V14 <<<= ((V15,V12-V14 XOR V0..V3), 16) + VADD V0.S4, V5.S4, V0.S4 + VADD V1.S4, V6.S4, V1.S4 + VADD V2.S4, V7.S4, V2.S4 + VADD V3.S4, V4.S4, V3.S4 + VEOR V15.B16, V0.B16, V15.B16 + VEOR V12.B16, V1.B16, V12.B16 + VEOR V13.B16, V2.B16, V13.B16 + VEOR V14.B16, V3.B16, V14.B16 + VREV32 V12.H8, V12.H8 + VREV32 V13.H8, V13.H8 + VREV32 V14.H8, V14.H8 + VREV32 V15.H8, V15.H8 + + // V10 += V15; V5 <<<= ((V10 XOR V5), 12) + // ... + VADD V15.S4, V10.S4, V10.S4 + VADD V12.S4, V11.S4, V11.S4 + VADD V13.S4, V8.S4, V8.S4 + VADD V14.S4, V9.S4, V9.S4 + VEOR V10.B16, V5.B16, V16.B16 + VEOR V11.B16, V6.B16, V17.B16 + VEOR V8.B16, V7.B16, V18.B16 + VEOR V9.B16, V4.B16, V19.B16 + VSHL $12, V16.S4, V5.S4 + VSHL $12, V17.S4, V6.S4 + VSHL $12, V18.S4, V7.S4 + VSHL $12, V19.S4, V4.S4 + VSRI $20, V16.S4, V5.S4 + VSRI $20, V17.S4, V6.S4 + VSRI $20, V18.S4, V7.S4 + VSRI $20, V19.S4, V4.S4 + + // V0 += V5; V15 <<<= ((V0 XOR V15), 8) + // ... + VADD V5.S4, V0.S4, V0.S4 + VADD V6.S4, V1.S4, V1.S4 + VADD V7.S4, V2.S4, V2.S4 + VADD V4.S4, V3.S4, V3.S4 + VEOR V0.B16, V15.B16, V15.B16 + VEOR V1.B16, V12.B16, V12.B16 + VEOR V2.B16, V13.B16, V13.B16 + VEOR V3.B16, V14.B16, V14.B16 + VTBL V31.B16, [V12.B16], V12.B16 + VTBL V31.B16, [V13.B16], V13.B16 + VTBL V31.B16, [V14.B16], V14.B16 + VTBL V31.B16, [V15.B16], V15.B16 + + // V10 += V15; V5 <<<= ((V10 XOR V5), 7) + // ... + VADD V15.S4, V10.S4, V10.S4 + VADD V12.S4, V11.S4, V11.S4 + VADD V13.S4, V8.S4, V8.S4 + VADD V14.S4, V9.S4, V9.S4 + VEOR V10.B16, V5.B16, V16.B16 + VEOR V11.B16, V6.B16, V17.B16 + VEOR V8.B16, V7.B16, V18.B16 + VEOR V9.B16, V4.B16, V19.B16 + VSHL $7, V16.S4, V5.S4 + VSHL $7, V17.S4, V6.S4 + VSHL $7, V18.S4, V7.S4 + VSHL $7, V19.S4, V4.S4 + VSRI $25, V16.S4, V5.S4 + VSRI $25, V17.S4, V6.S4 + VSRI $25, V18.S4, V7.S4 + VSRI $25, V19.S4, V4.S4 + + SUB $1, R21 + CBNZ R21, chacha + + // VLD4R (R10), [V16.S4, V17.S4, V18.S4, V19.S4] + WORD $0x4D60E950 + + // VLD4R 16(R4), [V20.S4, V21.S4, V22.S4, V23.S4] + WORD $0x4DFFE894 + VADD V30.S4, V12.S4, V12.S4 + VADD V16.S4, V0.S4, V0.S4 + VADD V17.S4, V1.S4, V1.S4 + VADD V18.S4, V2.S4, V2.S4 + VADD V19.S4, V3.S4, V3.S4 + // VLD4R 16(R4), [V24.S4, V25.S4, V26.S4, V27.S4] + WORD $0x4DFFE898 + // restore R4 + SUB $32, R4 + + // load counter + nonce + // VLD1R (R7), [V28.S4] + WORD $0x4D40C8FC + // VLD3R (R6), [V29.S4, V30.S4, V31.S4] + WORD $0x4D40E8DD + + VADD V20.S4, V4.S4, V4.S4 + VADD V21.S4, V5.S4, V5.S4 + VADD V22.S4, V6.S4, V6.S4 + VADD V23.S4, V7.S4, V7.S4 + VADD V24.S4, V8.S4, V8.S4 + VADD V25.S4, V9.S4, V9.S4 + VADD V26.S4, V10.S4, V10.S4 + VADD V27.S4, V11.S4, V11.S4 + VADD V28.S4, V12.S4, V12.S4 + VADD V29.S4, V13.S4, V13.S4 + VADD V30.S4, V14.S4, V14.S4 + VADD V31.S4, V15.S4, V15.S4 + + VZIP1 V1.S4, V0.S4, V16.S4 + VZIP2 V1.S4, V0.S4, V17.S4 + VZIP1 V3.S4, V2.S4, V18.S4 + VZIP2 V3.S4, V2.S4, V19.S4 + VZIP1 V5.S4, V4.S4, V20.S4 + VZIP2 V5.S4, V4.S4, V21.S4 + VZIP1 V7.S4, V6.S4, V22.S4 + VZIP2 V7.S4, V6.S4, V23.S4 + VZIP1 V9.S4, V8.S4, V24.S4 + VZIP2 V9.S4, V8.S4, V25.S4 + VZIP1 V11.S4, V10.S4, V26.S4 + VZIP2 V11.S4, V10.S4, V27.S4 + VZIP1 V13.S4, V12.S4, V28.S4 + VZIP2 V13.S4, V12.S4, V29.S4 + VZIP1 V15.S4, V14.S4, V30.S4 + VZIP2 V15.S4, V14.S4, V31.S4 + VZIP1 V18.D2, V16.D2, V0.D2 + VZIP2 V18.D2, V16.D2, V4.D2 + VZIP1 V19.D2, V17.D2, V8.D2 + VZIP2 V19.D2, V17.D2, V12.D2 + VLD1.P 64(R2), [V16.B16, V17.B16, V18.B16, V19.B16] + + VZIP1 V22.D2, V20.D2, V1.D2 + VZIP2 V22.D2, V20.D2, V5.D2 + VZIP1 V23.D2, V21.D2, V9.D2 + VZIP2 V23.D2, V21.D2, V13.D2 + VLD1.P 64(R2), [V20.B16, V21.B16, V22.B16, V23.B16] + VZIP1 V26.D2, V24.D2, V2.D2 + VZIP2 V26.D2, V24.D2, V6.D2 + VZIP1 V27.D2, V25.D2, V10.D2 + VZIP2 V27.D2, V25.D2, V14.D2 + VLD1.P 64(R2), [V24.B16, V25.B16, V26.B16, V27.B16] + VZIP1 V30.D2, V28.D2, V3.D2 + VZIP2 V30.D2, V28.D2, V7.D2 + VZIP1 V31.D2, V29.D2, V11.D2 + VZIP2 V31.D2, V29.D2, V15.D2 + VLD1.P 64(R2), [V28.B16, V29.B16, V30.B16, V31.B16] + VEOR V0.B16, V16.B16, V16.B16 + VEOR V1.B16, V17.B16, V17.B16 + VEOR V2.B16, V18.B16, V18.B16 + VEOR V3.B16, V19.B16, V19.B16 + VST1.P [V16.B16, V17.B16, V18.B16, V19.B16], 64(R1) + VEOR V4.B16, V20.B16, V20.B16 + VEOR V5.B16, V21.B16, V21.B16 + VEOR V6.B16, V22.B16, V22.B16 + VEOR V7.B16, V23.B16, V23.B16 + VST1.P [V20.B16, V21.B16, V22.B16, V23.B16], 64(R1) + VEOR V8.B16, V24.B16, V24.B16 + VEOR V9.B16, V25.B16, V25.B16 + VEOR V10.B16, V26.B16, V26.B16 + VEOR V11.B16, V27.B16, V27.B16 + VST1.P [V24.B16, V25.B16, V26.B16, V27.B16], 64(R1) + VEOR V12.B16, V28.B16, V28.B16 + VEOR V13.B16, V29.B16, V29.B16 + VEOR V14.B16, V30.B16, V30.B16 + VEOR V15.B16, V31.B16, V31.B16 + VST1.P [V28.B16, V29.B16, V30.B16, V31.B16], 64(R1) + + ADD $4, R20 + MOVW R20, (R7) // update counter + + CMP R2, R12 + BGT loop + + RET + + +DATA ·constants+0x00(SB)/4, $0x61707865 +DATA ·constants+0x04(SB)/4, $0x3320646e +DATA ·constants+0x08(SB)/4, $0x79622d32 +DATA ·constants+0x0c(SB)/4, $0x6b206574 +GLOBL ·constants(SB), NOPTR|RODATA, $32 + +DATA ·incRotMatrix+0x00(SB)/4, $0x00000000 +DATA ·incRotMatrix+0x04(SB)/4, $0x00000001 +DATA ·incRotMatrix+0x08(SB)/4, $0x00000002 +DATA ·incRotMatrix+0x0c(SB)/4, $0x00000003 +DATA ·incRotMatrix+0x10(SB)/4, $0x02010003 +DATA ·incRotMatrix+0x14(SB)/4, $0x06050407 +DATA ·incRotMatrix+0x18(SB)/4, $0x0A09080B +DATA ·incRotMatrix+0x1c(SB)/4, $0x0E0D0C0F +GLOBL ·incRotMatrix(SB), NOPTR|RODATA, $32 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_generic.go b/vendor/golang.org/x/crypto/chacha20/chacha_generic.go new file mode 100644 index 0000000..93eb5ae --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_generic.go @@ -0,0 +1,398 @@ +// Copyright 2016 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 chacha20 implements the ChaCha20 and XChaCha20 encryption algorithms +// as specified in RFC 8439 and draft-irtf-cfrg-xchacha-01. +package chacha20 + +import ( + "crypto/cipher" + "encoding/binary" + "errors" + "math/bits" + + "golang.org/x/crypto/internal/alias" +) + +const ( + // KeySize is the size of the key used by this cipher, in bytes. + KeySize = 32 + + // NonceSize is the size of the nonce used with the standard variant of this + // cipher, in bytes. + // + // Note that this is too short to be safely generated at random if the same + // key is reused more than 2³² times. + NonceSize = 12 + + // NonceSizeX is the size of the nonce used with the XChaCha20 variant of + // this cipher, in bytes. + NonceSizeX = 24 +) + +// Cipher is a stateful instance of ChaCha20 or XChaCha20 using a particular key +// and nonce. A *Cipher implements the cipher.Stream interface. +type Cipher struct { + // The ChaCha20 state is 16 words: 4 constant, 8 of key, 1 of counter + // (incremented after each block), and 3 of nonce. + key [8]uint32 + counter uint32 + nonce [3]uint32 + + // The last len bytes of buf are leftover key stream bytes from the previous + // XORKeyStream invocation. The size of buf depends on how many blocks are + // computed at a time by xorKeyStreamBlocks. + buf [bufSize]byte + len int + + // overflow is set when the counter overflowed, no more blocks can be + // generated, and the next XORKeyStream call should panic. + overflow bool + + // The counter-independent results of the first round are cached after they + // are computed the first time. + precompDone bool + p1, p5, p9, p13 uint32 + p2, p6, p10, p14 uint32 + p3, p7, p11, p15 uint32 +} + +var _ cipher.Stream = (*Cipher)(nil) + +// NewUnauthenticatedCipher creates a new ChaCha20 stream cipher with the given +// 32 bytes key and a 12 or 24 bytes nonce. If a nonce of 24 bytes is provided, +// the XChaCha20 construction will be used. It returns an error if key or nonce +// have any other length. +// +// Note that ChaCha20, like all stream ciphers, is not authenticated and allows +// attackers to silently tamper with the plaintext. For this reason, it is more +// appropriate as a building block than as a standalone encryption mechanism. +// Instead, consider using package golang.org/x/crypto/chacha20poly1305. +func NewUnauthenticatedCipher(key, nonce []byte) (*Cipher, error) { + // This function is split into a wrapper so that the Cipher allocation will + // be inlined, and depending on how the caller uses the return value, won't + // escape to the heap. + c := &Cipher{} + return newUnauthenticatedCipher(c, key, nonce) +} + +func newUnauthenticatedCipher(c *Cipher, key, nonce []byte) (*Cipher, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20: wrong key size") + } + if len(nonce) == NonceSizeX { + // XChaCha20 uses the ChaCha20 core to mix 16 bytes of the nonce into a + // derived key, allowing it to operate on a nonce of 24 bytes. See + // draft-irtf-cfrg-xchacha-01, Section 2.3. + key, _ = HChaCha20(key, nonce[0:16]) + cNonce := make([]byte, NonceSize) + copy(cNonce[4:12], nonce[16:24]) + nonce = cNonce + } else if len(nonce) != NonceSize { + return nil, errors.New("chacha20: wrong nonce size") + } + + key, nonce = key[:KeySize], nonce[:NonceSize] // bounds check elimination hint + c.key = [8]uint32{ + binary.LittleEndian.Uint32(key[0:4]), + binary.LittleEndian.Uint32(key[4:8]), + binary.LittleEndian.Uint32(key[8:12]), + binary.LittleEndian.Uint32(key[12:16]), + binary.LittleEndian.Uint32(key[16:20]), + binary.LittleEndian.Uint32(key[20:24]), + binary.LittleEndian.Uint32(key[24:28]), + binary.LittleEndian.Uint32(key[28:32]), + } + c.nonce = [3]uint32{ + binary.LittleEndian.Uint32(nonce[0:4]), + binary.LittleEndian.Uint32(nonce[4:8]), + binary.LittleEndian.Uint32(nonce[8:12]), + } + return c, nil +} + +// The constant first 4 words of the ChaCha20 state. +const ( + j0 uint32 = 0x61707865 // expa + j1 uint32 = 0x3320646e // nd 3 + j2 uint32 = 0x79622d32 // 2-by + j3 uint32 = 0x6b206574 // te k +) + +const blockSize = 64 + +// quarterRound is the core of ChaCha20. It shuffles the bits of 4 state words. +// It's executed 4 times for each of the 20 ChaCha20 rounds, operating on all 16 +// words each round, in columnar or diagonal groups of 4 at a time. +func quarterRound(a, b, c, d uint32) (uint32, uint32, uint32, uint32) { + a += b + d ^= a + d = bits.RotateLeft32(d, 16) + c += d + b ^= c + b = bits.RotateLeft32(b, 12) + a += b + d ^= a + d = bits.RotateLeft32(d, 8) + c += d + b ^= c + b = bits.RotateLeft32(b, 7) + return a, b, c, d +} + +// SetCounter sets the Cipher counter. The next invocation of XORKeyStream will +// behave as if (64 * counter) bytes had been encrypted so far. +// +// To prevent accidental counter reuse, SetCounter panics if counter is less +// than the current value. +// +// Note that the execution time of XORKeyStream is not independent of the +// counter value. +func (s *Cipher) SetCounter(counter uint32) { + // Internally, s may buffer multiple blocks, which complicates this + // implementation slightly. When checking whether the counter has rolled + // back, we must use both s.counter and s.len to determine how many blocks + // we have already output. + outputCounter := s.counter - uint32(s.len)/blockSize + if s.overflow || counter < outputCounter { + panic("chacha20: SetCounter attempted to rollback counter") + } + + // In the general case, we set the new counter value and reset s.len to 0, + // causing the next call to XORKeyStream to refill the buffer. However, if + // we're advancing within the existing buffer, we can save work by simply + // setting s.len. + if counter < s.counter { + s.len = int(s.counter-counter) * blockSize + } else { + s.counter = counter + s.len = 0 + } +} + +// XORKeyStream XORs each byte in the given slice with a byte from the +// cipher's key stream. Dst and src must overlap entirely or not at all. +// +// If len(dst) < len(src), XORKeyStream will panic. It is acceptable +// to pass a dst bigger than src, and in that case, XORKeyStream will +// only update dst[:len(src)] and will not touch the rest of dst. +// +// Multiple calls to XORKeyStream behave as if the concatenation of +// the src buffers was passed in a single run. That is, Cipher +// maintains state and does not reset at each XORKeyStream call. +func (s *Cipher) XORKeyStream(dst, src []byte) { + if len(src) == 0 { + return + } + if len(dst) < len(src) { + panic("chacha20: output smaller than input") + } + dst = dst[:len(src)] + if alias.InexactOverlap(dst, src) { + panic("chacha20: invalid buffer overlap") + } + + // First, drain any remaining key stream from a previous XORKeyStream. + if s.len != 0 { + keyStream := s.buf[bufSize-s.len:] + if len(src) < len(keyStream) { + keyStream = keyStream[:len(src)] + } + _ = src[len(keyStream)-1] // bounds check elimination hint + for i, b := range keyStream { + dst[i] = src[i] ^ b + } + s.len -= len(keyStream) + dst, src = dst[len(keyStream):], src[len(keyStream):] + } + if len(src) == 0 { + return + } + + // If we'd need to let the counter overflow and keep generating output, + // panic immediately. If instead we'd only reach the last block, remember + // not to generate any more output after the buffer is drained. + numBlocks := (uint64(len(src)) + blockSize - 1) / blockSize + if s.overflow || uint64(s.counter)+numBlocks > 1<<32 { + panic("chacha20: counter overflow") + } else if uint64(s.counter)+numBlocks == 1<<32 { + s.overflow = true + } + + // xorKeyStreamBlocks implementations expect input lengths that are a + // multiple of bufSize. Platform-specific ones process multiple blocks at a + // time, so have bufSizes that are a multiple of blockSize. + + full := len(src) - len(src)%bufSize + if full > 0 { + s.xorKeyStreamBlocks(dst[:full], src[:full]) + } + dst, src = dst[full:], src[full:] + + // If using a multi-block xorKeyStreamBlocks would overflow, use the generic + // one that does one block at a time. + const blocksPerBuf = bufSize / blockSize + if uint64(s.counter)+blocksPerBuf > 1<<32 { + s.buf = [bufSize]byte{} + numBlocks := (len(src) + blockSize - 1) / blockSize + buf := s.buf[bufSize-numBlocks*blockSize:] + copy(buf, src) + s.xorKeyStreamBlocksGeneric(buf, buf) + s.len = len(buf) - copy(dst, buf) + return + } + + // If we have a partial (multi-)block, pad it for xorKeyStreamBlocks, and + // keep the leftover keystream for the next XORKeyStream invocation. + if len(src) > 0 { + s.buf = [bufSize]byte{} + copy(s.buf[:], src) + s.xorKeyStreamBlocks(s.buf[:], s.buf[:]) + s.len = bufSize - copy(dst, s.buf[:]) + } +} + +func (s *Cipher) xorKeyStreamBlocksGeneric(dst, src []byte) { + if len(dst) != len(src) || len(dst)%blockSize != 0 { + panic("chacha20: internal error: wrong dst and/or src length") + } + + // To generate each block of key stream, the initial cipher state + // (represented below) is passed through 20 rounds of shuffling, + // alternatively applying quarterRounds by columns (like 1, 5, 9, 13) + // or by diagonals (like 1, 6, 11, 12). + // + // 0:cccccccc 1:cccccccc 2:cccccccc 3:cccccccc + // 4:kkkkkkkk 5:kkkkkkkk 6:kkkkkkkk 7:kkkkkkkk + // 8:kkkkkkkk 9:kkkkkkkk 10:kkkkkkkk 11:kkkkkkkk + // 12:bbbbbbbb 13:nnnnnnnn 14:nnnnnnnn 15:nnnnnnnn + // + // c=constant k=key b=blockcount n=nonce + var ( + c0, c1, c2, c3 = j0, j1, j2, j3 + c4, c5, c6, c7 = s.key[0], s.key[1], s.key[2], s.key[3] + c8, c9, c10, c11 = s.key[4], s.key[5], s.key[6], s.key[7] + _, c13, c14, c15 = s.counter, s.nonce[0], s.nonce[1], s.nonce[2] + ) + + // Three quarters of the first round don't depend on the counter, so we can + // calculate them here, and reuse them for multiple blocks in the loop, and + // for future XORKeyStream invocations. + if !s.precompDone { + s.p1, s.p5, s.p9, s.p13 = quarterRound(c1, c5, c9, c13) + s.p2, s.p6, s.p10, s.p14 = quarterRound(c2, c6, c10, c14) + s.p3, s.p7, s.p11, s.p15 = quarterRound(c3, c7, c11, c15) + s.precompDone = true + } + + // A condition of len(src) > 0 would be sufficient, but this also + // acts as a bounds check elimination hint. + for len(src) >= 64 && len(dst) >= 64 { + // The remainder of the first column round. + fcr0, fcr4, fcr8, fcr12 := quarterRound(c0, c4, c8, s.counter) + + // The second diagonal round. + x0, x5, x10, x15 := quarterRound(fcr0, s.p5, s.p10, s.p15) + x1, x6, x11, x12 := quarterRound(s.p1, s.p6, s.p11, fcr12) + x2, x7, x8, x13 := quarterRound(s.p2, s.p7, fcr8, s.p13) + x3, x4, x9, x14 := quarterRound(s.p3, fcr4, s.p9, s.p14) + + // The remaining 18 rounds. + for i := 0; i < 9; i++ { + // Column round. + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + // Diagonal round. + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) + } + + // Add back the initial state to generate the key stream, then + // XOR the key stream with the source and write out the result. + addXor(dst[0:4], src[0:4], x0, c0) + addXor(dst[4:8], src[4:8], x1, c1) + addXor(dst[8:12], src[8:12], x2, c2) + addXor(dst[12:16], src[12:16], x3, c3) + addXor(dst[16:20], src[16:20], x4, c4) + addXor(dst[20:24], src[20:24], x5, c5) + addXor(dst[24:28], src[24:28], x6, c6) + addXor(dst[28:32], src[28:32], x7, c7) + addXor(dst[32:36], src[32:36], x8, c8) + addXor(dst[36:40], src[36:40], x9, c9) + addXor(dst[40:44], src[40:44], x10, c10) + addXor(dst[44:48], src[44:48], x11, c11) + addXor(dst[48:52], src[48:52], x12, s.counter) + addXor(dst[52:56], src[52:56], x13, c13) + addXor(dst[56:60], src[56:60], x14, c14) + addXor(dst[60:64], src[60:64], x15, c15) + + s.counter += 1 + + src, dst = src[blockSize:], dst[blockSize:] + } +} + +// HChaCha20 uses the ChaCha20 core to generate a derived key from a 32 bytes +// key and a 16 bytes nonce. It returns an error if key or nonce have any other +// length. It is used as part of the XChaCha20 construction. +func HChaCha20(key, nonce []byte) ([]byte, error) { + // This function is split into a wrapper so that the slice allocation will + // be inlined, and depending on how the caller uses the return value, won't + // escape to the heap. + out := make([]byte, 32) + return hChaCha20(out, key, nonce) +} + +func hChaCha20(out, key, nonce []byte) ([]byte, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20: wrong HChaCha20 key size") + } + if len(nonce) != 16 { + return nil, errors.New("chacha20: wrong HChaCha20 nonce size") + } + + x0, x1, x2, x3 := j0, j1, j2, j3 + x4 := binary.LittleEndian.Uint32(key[0:4]) + x5 := binary.LittleEndian.Uint32(key[4:8]) + x6 := binary.LittleEndian.Uint32(key[8:12]) + x7 := binary.LittleEndian.Uint32(key[12:16]) + x8 := binary.LittleEndian.Uint32(key[16:20]) + x9 := binary.LittleEndian.Uint32(key[20:24]) + x10 := binary.LittleEndian.Uint32(key[24:28]) + x11 := binary.LittleEndian.Uint32(key[28:32]) + x12 := binary.LittleEndian.Uint32(nonce[0:4]) + x13 := binary.LittleEndian.Uint32(nonce[4:8]) + x14 := binary.LittleEndian.Uint32(nonce[8:12]) + x15 := binary.LittleEndian.Uint32(nonce[12:16]) + + for i := 0; i < 10; i++ { + // Diagonal round. + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + // Column round. + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) + } + + _ = out[31] // bounds check elimination hint + binary.LittleEndian.PutUint32(out[0:4], x0) + binary.LittleEndian.PutUint32(out[4:8], x1) + binary.LittleEndian.PutUint32(out[8:12], x2) + binary.LittleEndian.PutUint32(out[12:16], x3) + binary.LittleEndian.PutUint32(out[16:20], x12) + binary.LittleEndian.PutUint32(out[20:24], x13) + binary.LittleEndian.PutUint32(out[24:28], x14) + binary.LittleEndian.PutUint32(out[28:32], x15) + return out, nil +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go new file mode 100644 index 0000000..db42e66 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go @@ -0,0 +1,13 @@ +// Copyright 2018 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 (!arm64 && !s390x && !ppc64le) || !gc || purego + +package chacha20 + +const bufSize = blockSize + +func (s *Cipher) xorKeyStreamBlocks(dst, src []byte) { + s.xorKeyStreamBlocksGeneric(dst, src) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go new file mode 100644 index 0000000..3a4287f --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go @@ -0,0 +1,16 @@ +// Copyright 2019 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 gc && !purego + +package chacha20 + +const bufSize = 256 + +//go:noescape +func chaCha20_ctr32_vsx(out, inp *byte, len int, key *[8]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamBlocks(dst, src []byte) { + chaCha20_ctr32_vsx(&dst[0], &src[0], len(src), &c.key, &c.counter) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s new file mode 100644 index 0000000..c672ccf --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s @@ -0,0 +1,443 @@ +// Copyright 2019 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. + +// Based on CRYPTOGAMS code with the following comment: +// # ==================================================================== +// # Written by Andy Polyakov for the OpenSSL +// # project. The module is, however, dual licensed under OpenSSL and +// # CRYPTOGAMS licenses depending on where you obtain it. For further +// # details see http://www.openssl.org/~appro/cryptogams/. +// # ==================================================================== + +// Code for the perl script that generates the ppc64 assembler +// can be found in the cryptogams repository at the link below. It is based on +// the original from openssl. + +// https://github.com/dot-asm/cryptogams/commit/a60f5b50ed908e91 + +// The differences in this and the original implementation are +// due to the calling conventions and initialization of constants. + +//go:build gc && !purego + +#include "textflag.h" + +#define OUT R3 +#define INP R4 +#define LEN R5 +#define KEY R6 +#define CNT R7 +#define TMP R15 + +#define CONSTBASE R16 +#define BLOCKS R17 + +// for VPERMXOR +#define MASK R18 + +DATA consts<>+0x00(SB)/8, $0x3320646e61707865 +DATA consts<>+0x08(SB)/8, $0x6b20657479622d32 +DATA consts<>+0x10(SB)/8, $0x0000000000000001 +DATA consts<>+0x18(SB)/8, $0x0000000000000000 +DATA consts<>+0x20(SB)/8, $0x0000000000000004 +DATA consts<>+0x28(SB)/8, $0x0000000000000000 +DATA consts<>+0x30(SB)/8, $0x0a0b08090e0f0c0d +DATA consts<>+0x38(SB)/8, $0x0203000106070405 +DATA consts<>+0x40(SB)/8, $0x090a0b080d0e0f0c +DATA consts<>+0x48(SB)/8, $0x0102030005060704 +DATA consts<>+0x50(SB)/8, $0x6170786561707865 +DATA consts<>+0x58(SB)/8, $0x6170786561707865 +DATA consts<>+0x60(SB)/8, $0x3320646e3320646e +DATA consts<>+0x68(SB)/8, $0x3320646e3320646e +DATA consts<>+0x70(SB)/8, $0x79622d3279622d32 +DATA consts<>+0x78(SB)/8, $0x79622d3279622d32 +DATA consts<>+0x80(SB)/8, $0x6b2065746b206574 +DATA consts<>+0x88(SB)/8, $0x6b2065746b206574 +DATA consts<>+0x90(SB)/8, $0x0000000100000000 +DATA consts<>+0x98(SB)/8, $0x0000000300000002 +DATA consts<>+0xa0(SB)/8, $0x5566774411223300 +DATA consts<>+0xa8(SB)/8, $0xddeeffcc99aabb88 +DATA consts<>+0xb0(SB)/8, $0x6677445522330011 +DATA consts<>+0xb8(SB)/8, $0xeeffccddaabb8899 +GLOBL consts<>(SB), RODATA, $0xc0 + +//func chaCha20_ctr32_vsx(out, inp *byte, len int, key *[8]uint32, counter *uint32) +TEXT ·chaCha20_ctr32_vsx(SB),NOSPLIT,$64-40 + MOVD out+0(FP), OUT + MOVD inp+8(FP), INP + MOVD len+16(FP), LEN + MOVD key+24(FP), KEY + MOVD counter+32(FP), CNT + + // Addressing for constants + MOVD $consts<>+0x00(SB), CONSTBASE + MOVD $16, R8 + MOVD $32, R9 + MOVD $48, R10 + MOVD $64, R11 + SRD $6, LEN, BLOCKS + // for VPERMXOR + MOVD $consts<>+0xa0(SB), MASK + MOVD $16, R20 + // V16 + LXVW4X (CONSTBASE)(R0), VS48 + ADD $80,CONSTBASE + + // Load key into V17,V18 + LXVW4X (KEY)(R0), VS49 + LXVW4X (KEY)(R8), VS50 + + // Load CNT, NONCE into V19 + LXVW4X (CNT)(R0), VS51 + + // Clear V27 + VXOR V27, V27, V27 + + // V28 + LXVW4X (CONSTBASE)(R11), VS60 + + // Load mask constants for VPERMXOR + LXVW4X (MASK)(R0), V20 + LXVW4X (MASK)(R20), V21 + + // splat slot from V19 -> V26 + VSPLTW $0, V19, V26 + + VSLDOI $4, V19, V27, V19 + VSLDOI $12, V27, V19, V19 + + VADDUWM V26, V28, V26 + + MOVD $10, R14 + MOVD R14, CTR + PCALIGN $16 +loop_outer_vsx: + // V0, V1, V2, V3 + LXVW4X (R0)(CONSTBASE), VS32 + LXVW4X (R8)(CONSTBASE), VS33 + LXVW4X (R9)(CONSTBASE), VS34 + LXVW4X (R10)(CONSTBASE), VS35 + + // splat values from V17, V18 into V4-V11 + VSPLTW $0, V17, V4 + VSPLTW $1, V17, V5 + VSPLTW $2, V17, V6 + VSPLTW $3, V17, V7 + VSPLTW $0, V18, V8 + VSPLTW $1, V18, V9 + VSPLTW $2, V18, V10 + VSPLTW $3, V18, V11 + + // VOR + VOR V26, V26, V12 + + // splat values from V19 -> V13, V14, V15 + VSPLTW $1, V19, V13 + VSPLTW $2, V19, V14 + VSPLTW $3, V19, V15 + + // splat const values + VSPLTISW $-16, V27 + VSPLTISW $12, V28 + VSPLTISW $8, V29 + VSPLTISW $7, V30 + PCALIGN $16 +loop_vsx: + VADDUWM V0, V4, V0 + VADDUWM V1, V5, V1 + VADDUWM V2, V6, V2 + VADDUWM V3, V7, V3 + + VPERMXOR V12, V0, V21, V12 + VPERMXOR V13, V1, V21, V13 + VPERMXOR V14, V2, V21, V14 + VPERMXOR V15, V3, V21, V15 + + VADDUWM V8, V12, V8 + VADDUWM V9, V13, V9 + VADDUWM V10, V14, V10 + VADDUWM V11, V15, V11 + + VXOR V4, V8, V4 + VXOR V5, V9, V5 + VXOR V6, V10, V6 + VXOR V7, V11, V7 + + VRLW V4, V28, V4 + VRLW V5, V28, V5 + VRLW V6, V28, V6 + VRLW V7, V28, V7 + + VADDUWM V0, V4, V0 + VADDUWM V1, V5, V1 + VADDUWM V2, V6, V2 + VADDUWM V3, V7, V3 + + VPERMXOR V12, V0, V20, V12 + VPERMXOR V13, V1, V20, V13 + VPERMXOR V14, V2, V20, V14 + VPERMXOR V15, V3, V20, V15 + + VADDUWM V8, V12, V8 + VADDUWM V9, V13, V9 + VADDUWM V10, V14, V10 + VADDUWM V11, V15, V11 + + VXOR V4, V8, V4 + VXOR V5, V9, V5 + VXOR V6, V10, V6 + VXOR V7, V11, V7 + + VRLW V4, V30, V4 + VRLW V5, V30, V5 + VRLW V6, V30, V6 + VRLW V7, V30, V7 + + VADDUWM V0, V5, V0 + VADDUWM V1, V6, V1 + VADDUWM V2, V7, V2 + VADDUWM V3, V4, V3 + + VPERMXOR V15, V0, V21, V15 + VPERMXOR V12, V1, V21, V12 + VPERMXOR V13, V2, V21, V13 + VPERMXOR V14, V3, V21, V14 + + VADDUWM V10, V15, V10 + VADDUWM V11, V12, V11 + VADDUWM V8, V13, V8 + VADDUWM V9, V14, V9 + + VXOR V5, V10, V5 + VXOR V6, V11, V6 + VXOR V7, V8, V7 + VXOR V4, V9, V4 + + VRLW V5, V28, V5 + VRLW V6, V28, V6 + VRLW V7, V28, V7 + VRLW V4, V28, V4 + + VADDUWM V0, V5, V0 + VADDUWM V1, V6, V1 + VADDUWM V2, V7, V2 + VADDUWM V3, V4, V3 + + VPERMXOR V15, V0, V20, V15 + VPERMXOR V12, V1, V20, V12 + VPERMXOR V13, V2, V20, V13 + VPERMXOR V14, V3, V20, V14 + + VADDUWM V10, V15, V10 + VADDUWM V11, V12, V11 + VADDUWM V8, V13, V8 + VADDUWM V9, V14, V9 + + VXOR V5, V10, V5 + VXOR V6, V11, V6 + VXOR V7, V8, V7 + VXOR V4, V9, V4 + + VRLW V5, V30, V5 + VRLW V6, V30, V6 + VRLW V7, V30, V7 + VRLW V4, V30, V4 + BDNZ loop_vsx + + VADDUWM V12, V26, V12 + + VMRGEW V0, V1, V27 + VMRGEW V2, V3, V28 + + VMRGOW V0, V1, V0 + VMRGOW V2, V3, V2 + + VMRGEW V4, V5, V29 + VMRGEW V6, V7, V30 + + XXPERMDI VS32, VS34, $0, VS33 + XXPERMDI VS32, VS34, $3, VS35 + XXPERMDI VS59, VS60, $0, VS32 + XXPERMDI VS59, VS60, $3, VS34 + + VMRGOW V4, V5, V4 + VMRGOW V6, V7, V6 + + VMRGEW V8, V9, V27 + VMRGEW V10, V11, V28 + + XXPERMDI VS36, VS38, $0, VS37 + XXPERMDI VS36, VS38, $3, VS39 + XXPERMDI VS61, VS62, $0, VS36 + XXPERMDI VS61, VS62, $3, VS38 + + VMRGOW V8, V9, V8 + VMRGOW V10, V11, V10 + + VMRGEW V12, V13, V29 + VMRGEW V14, V15, V30 + + XXPERMDI VS40, VS42, $0, VS41 + XXPERMDI VS40, VS42, $3, VS43 + XXPERMDI VS59, VS60, $0, VS40 + XXPERMDI VS59, VS60, $3, VS42 + + VMRGOW V12, V13, V12 + VMRGOW V14, V15, V14 + + VSPLTISW $4, V27 + VADDUWM V26, V27, V26 + + XXPERMDI VS44, VS46, $0, VS45 + XXPERMDI VS44, VS46, $3, VS47 + XXPERMDI VS61, VS62, $0, VS44 + XXPERMDI VS61, VS62, $3, VS46 + + VADDUWM V0, V16, V0 + VADDUWM V4, V17, V4 + VADDUWM V8, V18, V8 + VADDUWM V12, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + // Bottom of loop + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + + VXOR V27, V0, V27 + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(R10) + ADD $64, OUT + BEQ done_vsx + + VADDUWM V1, V16, V0 + VADDUWM V5, V17, V4 + VADDUWM V9, V18, V8 + VADDUWM V13, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + VXOR V27, V0, V27 + + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(V10) + ADD $64, OUT + BEQ done_vsx + + VADDUWM V2, V16, V0 + VADDUWM V6, V17, V4 + VADDUWM V10, V18, V8 + VADDUWM V14, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + + VXOR V27, V0, V27 + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(R10) + ADD $64, OUT + BEQ done_vsx + + VADDUWM V3, V16, V0 + VADDUWM V7, V17, V4 + VADDUWM V11, V18, V8 + VADDUWM V15, V19, V12 + + CMPU LEN, $64 + BLT tail_vsx + + LXVW4X (INP)(R0), VS59 + LXVW4X (INP)(R8), VS60 + LXVW4X (INP)(R9), VS61 + LXVW4X (INP)(R10), VS62 + + VXOR V27, V0, V27 + VXOR V28, V4, V28 + VXOR V29, V8, V29 + VXOR V30, V12, V30 + + STXVW4X VS59, (OUT)(R0) + STXVW4X VS60, (OUT)(R8) + ADD $64, INP + STXVW4X VS61, (OUT)(R9) + ADD $-64, LEN + STXVW4X VS62, (OUT)(R10) + ADD $64, OUT + + MOVD $10, R14 + MOVD R14, CTR + BNE loop_outer_vsx + +done_vsx: + // Increment counter by number of 64 byte blocks + MOVD (CNT), R14 + ADD BLOCKS, R14 + MOVD R14, (CNT) + RET + +tail_vsx: + ADD $32, R1, R11 + MOVD LEN, CTR + + // Save values on stack to copy from + STXVW4X VS32, (R11)(R0) + STXVW4X VS36, (R11)(R8) + STXVW4X VS40, (R11)(R9) + STXVW4X VS44, (R11)(R10) + ADD $-1, R11, R12 + ADD $-1, INP + ADD $-1, OUT + PCALIGN $16 +looptail_vsx: + // Copying the result to OUT + // in bytes. + MOVBZU 1(R12), KEY + MOVBZU 1(INP), TMP + XOR KEY, TMP, KEY + MOVBU KEY, 1(OUT) + BDNZ looptail_vsx + + // Clear the stack values + STXVW4X VS48, (R11)(R0) + STXVW4X VS48, (R11)(R8) + STXVW4X VS48, (R11)(R9) + STXVW4X VS48, (R11)(R10) + BR done_vsx diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go new file mode 100644 index 0000000..683ccfd --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go @@ -0,0 +1,27 @@ +// Copyright 2018 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 gc && !purego + +package chacha20 + +import "golang.org/x/sys/cpu" + +var haveAsm = cpu.S390X.HasVX + +const bufSize = 256 + +// xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only +// be called when the vector facility is available. Implementation in asm_s390x.s. +// +//go:noescape +func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) + +func (c *Cipher) xorKeyStreamBlocks(dst, src []byte) { + if cpu.S390X.HasVX { + xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter) + } else { + c.xorKeyStreamBlocksGeneric(dst, src) + } +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s new file mode 100644 index 0000000..1eda91a --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s @@ -0,0 +1,224 @@ +// Copyright 2018 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 gc && !purego + +#include "go_asm.h" +#include "textflag.h" + +// This is an implementation of the ChaCha20 encryption algorithm as +// specified in RFC 7539. It uses vector instructions to compute +// 4 keystream blocks in parallel (256 bytes) which are then XORed +// with the bytes in the input slice. + +GLOBL ·constants<>(SB), RODATA|NOPTR, $32 +// BSWAP: swap bytes in each 4-byte element +DATA ·constants<>+0x00(SB)/4, $0x03020100 +DATA ·constants<>+0x04(SB)/4, $0x07060504 +DATA ·constants<>+0x08(SB)/4, $0x0b0a0908 +DATA ·constants<>+0x0c(SB)/4, $0x0f0e0d0c +// J0: [j0, j1, j2, j3] +DATA ·constants<>+0x10(SB)/4, $0x61707865 +DATA ·constants<>+0x14(SB)/4, $0x3320646e +DATA ·constants<>+0x18(SB)/4, $0x79622d32 +DATA ·constants<>+0x1c(SB)/4, $0x6b206574 + +#define BSWAP V5 +#define J0 V6 +#define KEY0 V7 +#define KEY1 V8 +#define NONCE V9 +#define CTR V10 +#define M0 V11 +#define M1 V12 +#define M2 V13 +#define M3 V14 +#define INC V15 +#define X0 V16 +#define X1 V17 +#define X2 V18 +#define X3 V19 +#define X4 V20 +#define X5 V21 +#define X6 V22 +#define X7 V23 +#define X8 V24 +#define X9 V25 +#define X10 V26 +#define X11 V27 +#define X12 V28 +#define X13 V29 +#define X14 V30 +#define X15 V31 + +#define NUM_ROUNDS 20 + +#define ROUND4(a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3) \ + VAF a1, a0, a0 \ + VAF b1, b0, b0 \ + VAF c1, c0, c0 \ + VAF d1, d0, d0 \ + VX a0, a2, a2 \ + VX b0, b2, b2 \ + VX c0, c2, c2 \ + VX d0, d2, d2 \ + VERLLF $16, a2, a2 \ + VERLLF $16, b2, b2 \ + VERLLF $16, c2, c2 \ + VERLLF $16, d2, d2 \ + VAF a2, a3, a3 \ + VAF b2, b3, b3 \ + VAF c2, c3, c3 \ + VAF d2, d3, d3 \ + VX a3, a1, a1 \ + VX b3, b1, b1 \ + VX c3, c1, c1 \ + VX d3, d1, d1 \ + VERLLF $12, a1, a1 \ + VERLLF $12, b1, b1 \ + VERLLF $12, c1, c1 \ + VERLLF $12, d1, d1 \ + VAF a1, a0, a0 \ + VAF b1, b0, b0 \ + VAF c1, c0, c0 \ + VAF d1, d0, d0 \ + VX a0, a2, a2 \ + VX b0, b2, b2 \ + VX c0, c2, c2 \ + VX d0, d2, d2 \ + VERLLF $8, a2, a2 \ + VERLLF $8, b2, b2 \ + VERLLF $8, c2, c2 \ + VERLLF $8, d2, d2 \ + VAF a2, a3, a3 \ + VAF b2, b3, b3 \ + VAF c2, c3, c3 \ + VAF d2, d3, d3 \ + VX a3, a1, a1 \ + VX b3, b1, b1 \ + VX c3, c1, c1 \ + VX d3, d1, d1 \ + VERLLF $7, a1, a1 \ + VERLLF $7, b1, b1 \ + VERLLF $7, c1, c1 \ + VERLLF $7, d1, d1 + +#define PERMUTE(mask, v0, v1, v2, v3) \ + VPERM v0, v0, mask, v0 \ + VPERM v1, v1, mask, v1 \ + VPERM v2, v2, mask, v2 \ + VPERM v3, v3, mask, v3 + +#define ADDV(x, v0, v1, v2, v3) \ + VAF x, v0, v0 \ + VAF x, v1, v1 \ + VAF x, v2, v2 \ + VAF x, v3, v3 + +#define XORV(off, dst, src, v0, v1, v2, v3) \ + VLM off(src), M0, M3 \ + PERMUTE(BSWAP, v0, v1, v2, v3) \ + VX v0, M0, M0 \ + VX v1, M1, M1 \ + VX v2, M2, M2 \ + VX v3, M3, M3 \ + VSTM M0, M3, off(dst) + +#define SHUFFLE(a, b, c, d, t, u, v, w) \ + VMRHF a, c, t \ // t = {a[0], c[0], a[1], c[1]} + VMRHF b, d, u \ // u = {b[0], d[0], b[1], d[1]} + VMRLF a, c, v \ // v = {a[2], c[2], a[3], c[3]} + VMRLF b, d, w \ // w = {b[2], d[2], b[3], d[3]} + VMRHF t, u, a \ // a = {a[0], b[0], c[0], d[0]} + VMRLF t, u, b \ // b = {a[1], b[1], c[1], d[1]} + VMRHF v, w, c \ // c = {a[2], b[2], c[2], d[2]} + VMRLF v, w, d // d = {a[3], b[3], c[3], d[3]} + +// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) +TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 + MOVD $·constants<>(SB), R1 + MOVD dst+0(FP), R2 // R2=&dst[0] + LMG src+24(FP), R3, R4 // R3=&src[0] R4=len(src) + MOVD key+48(FP), R5 // R5=key + MOVD nonce+56(FP), R6 // R6=nonce + MOVD counter+64(FP), R7 // R7=counter + + // load BSWAP and J0 + VLM (R1), BSWAP, J0 + + // setup + MOVD $95, R0 + VLM (R5), KEY0, KEY1 + VLL R0, (R6), NONCE + VZERO M0 + VLEIB $7, $32, M0 + VSRLB M0, NONCE, NONCE + + // initialize counter values + VLREPF (R7), CTR + VZERO INC + VLEIF $1, $1, INC + VLEIF $2, $2, INC + VLEIF $3, $3, INC + VAF INC, CTR, CTR + VREPIF $4, INC + +chacha: + VREPF $0, J0, X0 + VREPF $1, J0, X1 + VREPF $2, J0, X2 + VREPF $3, J0, X3 + VREPF $0, KEY0, X4 + VREPF $1, KEY0, X5 + VREPF $2, KEY0, X6 + VREPF $3, KEY0, X7 + VREPF $0, KEY1, X8 + VREPF $1, KEY1, X9 + VREPF $2, KEY1, X10 + VREPF $3, KEY1, X11 + VLR CTR, X12 + VREPF $1, NONCE, X13 + VREPF $2, NONCE, X14 + VREPF $3, NONCE, X15 + + MOVD $(NUM_ROUNDS/2), R1 + +loop: + ROUND4(X0, X4, X12, X8, X1, X5, X13, X9, X2, X6, X14, X10, X3, X7, X15, X11) + ROUND4(X0, X5, X15, X10, X1, X6, X12, X11, X2, X7, X13, X8, X3, X4, X14, X9) + + ADD $-1, R1 + BNE loop + + // decrement length + ADD $-256, R4 + + // rearrange vectors + SHUFFLE(X0, X1, X2, X3, M0, M1, M2, M3) + ADDV(J0, X0, X1, X2, X3) + SHUFFLE(X4, X5, X6, X7, M0, M1, M2, M3) + ADDV(KEY0, X4, X5, X6, X7) + SHUFFLE(X8, X9, X10, X11, M0, M1, M2, M3) + ADDV(KEY1, X8, X9, X10, X11) + VAF CTR, X12, X12 + SHUFFLE(X12, X13, X14, X15, M0, M1, M2, M3) + ADDV(NONCE, X12, X13, X14, X15) + + // increment counters + VAF INC, CTR, CTR + + // xor keystream with plaintext + XORV(0*64, R2, R3, X0, X4, X8, X12) + XORV(1*64, R2, R3, X1, X5, X9, X13) + XORV(2*64, R2, R3, X2, X6, X10, X14) + XORV(3*64, R2, R3, X3, X7, X11, X15) + + // increment pointers + MOVD $256(R2), R2 + MOVD $256(R3), R3 + + CMPBNE R4, $0, chacha + + VSTEF $0, CTR, (R7) + RET diff --git a/vendor/golang.org/x/crypto/chacha20/xor.go b/vendor/golang.org/x/crypto/chacha20/xor.go new file mode 100644 index 0000000..c2d0485 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20/xor.go @@ -0,0 +1,42 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found src the LICENSE file. + +package chacha20 + +import "runtime" + +// Platforms that have fast unaligned 32-bit little endian accesses. +const unaligned = runtime.GOARCH == "386" || + runtime.GOARCH == "amd64" || + runtime.GOARCH == "arm64" || + runtime.GOARCH == "ppc64le" || + runtime.GOARCH == "s390x" + +// addXor reads a little endian uint32 from src, XORs it with (a + b) and +// places the result in little endian byte order in dst. +func addXor(dst, src []byte, a, b uint32) { + _, _ = src[3], dst[3] // bounds check elimination hint + if unaligned { + // The compiler should optimize this code into + // 32-bit unaligned little endian loads and stores. + // TODO: delete once the compiler does a reliably + // good job with the generic code below. + // See issue #25111 for more details. + v := uint32(src[0]) + v |= uint32(src[1]) << 8 + v |= uint32(src[2]) << 16 + v |= uint32(src[3]) << 24 + v ^= a + b + dst[0] = byte(v) + dst[1] = byte(v >> 8) + dst[2] = byte(v >> 16) + dst[3] = byte(v >> 24) + } else { + a += b + dst[0] = src[0] ^ byte(a) + dst[1] = src[1] ^ byte(a>>8) + dst[2] = src[2] ^ byte(a>>16) + dst[3] = src[3] ^ byte(a>>24) + } +} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go new file mode 100644 index 0000000..93da732 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go @@ -0,0 +1,98 @@ +// Copyright 2016 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 chacha20poly1305 implements the ChaCha20-Poly1305 AEAD and its +// extended nonce variant XChaCha20-Poly1305, as specified in RFC 8439 and +// draft-irtf-cfrg-xchacha-01. +package chacha20poly1305 // import "golang.org/x/crypto/chacha20poly1305" + +import ( + "crypto/cipher" + "errors" +) + +const ( + // KeySize is the size of the key used by this AEAD, in bytes. + KeySize = 32 + + // NonceSize is the size of the nonce used with the standard variant of this + // AEAD, in bytes. + // + // Note that this is too short to be safely generated at random if the same + // key is reused more than 2³² times. + NonceSize = 12 + + // NonceSizeX is the size of the nonce used with the XChaCha20-Poly1305 + // variant of this AEAD, in bytes. + NonceSizeX = 24 + + // Overhead is the size of the Poly1305 authentication tag, and the + // difference between a ciphertext length and its plaintext. + Overhead = 16 +) + +type chacha20poly1305 struct { + key [KeySize]byte +} + +// New returns a ChaCha20-Poly1305 AEAD that uses the given 256-bit key. +func New(key []byte) (cipher.AEAD, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20poly1305: bad key length") + } + ret := new(chacha20poly1305) + copy(ret.key[:], key) + return ret, nil +} + +func (c *chacha20poly1305) NonceSize() int { + return NonceSize +} + +func (c *chacha20poly1305) Overhead() int { + return Overhead +} + +func (c *chacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Seal") + } + + if uint64(len(plaintext)) > (1<<38)-64 { + panic("chacha20poly1305: plaintext too large") + } + + return c.seal(dst, nonce, plaintext, additionalData) +} + +var errOpen = errors.New("chacha20poly1305: message authentication failed") + +func (c *chacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Open") + } + if len(ciphertext) < 16 { + return nil, errOpen + } + if uint64(len(ciphertext)) > (1<<38)-48 { + panic("chacha20poly1305: ciphertext too large") + } + + return c.open(dst, nonce, ciphertext, additionalData) +} + +// sliceForAppend takes a slice and a requested number of bytes. It returns a +// slice with the contents of the given slice followed by that many bytes and a +// second slice that aliases into it and contains only the extra bytes. If the +// original slice has sufficient capacity then no allocation is performed. +func sliceForAppend(in []byte, n int) (head, tail []byte) { + if total := len(in) + n; cap(in) >= total { + head = in[:total] + } else { + head = make([]byte, total) + copy(head, in) + } + tail = head[len(in):] + return +} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go new file mode 100644 index 0000000..50695a1 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go @@ -0,0 +1,86 @@ +// Copyright 2016 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 gc && !purego + +package chacha20poly1305 + +import ( + "encoding/binary" + + "golang.org/x/crypto/internal/alias" + "golang.org/x/sys/cpu" +) + +//go:noescape +func chacha20Poly1305Open(dst []byte, key []uint32, src, ad []byte) bool + +//go:noescape +func chacha20Poly1305Seal(dst []byte, key []uint32, src, ad []byte) + +var ( + useAVX2 = cpu.X86.HasAVX2 && cpu.X86.HasBMI2 +) + +// setupState writes a ChaCha20 input matrix to state. See +// https://tools.ietf.org/html/rfc7539#section-2.3. +func setupState(state *[16]uint32, key *[32]byte, nonce []byte) { + state[0] = 0x61707865 + state[1] = 0x3320646e + state[2] = 0x79622d32 + state[3] = 0x6b206574 + + state[4] = binary.LittleEndian.Uint32(key[0:4]) + state[5] = binary.LittleEndian.Uint32(key[4:8]) + state[6] = binary.LittleEndian.Uint32(key[8:12]) + state[7] = binary.LittleEndian.Uint32(key[12:16]) + state[8] = binary.LittleEndian.Uint32(key[16:20]) + state[9] = binary.LittleEndian.Uint32(key[20:24]) + state[10] = binary.LittleEndian.Uint32(key[24:28]) + state[11] = binary.LittleEndian.Uint32(key[28:32]) + + state[12] = 0 + state[13] = binary.LittleEndian.Uint32(nonce[0:4]) + state[14] = binary.LittleEndian.Uint32(nonce[4:8]) + state[15] = binary.LittleEndian.Uint32(nonce[8:12]) +} + +func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte { + if !cpu.X86.HasSSSE3 { + return c.sealGeneric(dst, nonce, plaintext, additionalData) + } + + var state [16]uint32 + setupState(&state, &c.key, nonce) + + ret, out := sliceForAppend(dst, len(plaintext)+16) + if alias.InexactOverlap(out, plaintext) { + panic("chacha20poly1305: invalid buffer overlap") + } + chacha20Poly1305Seal(out[:], state[:], plaintext, additionalData) + return ret +} + +func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + if !cpu.X86.HasSSSE3 { + return c.openGeneric(dst, nonce, ciphertext, additionalData) + } + + var state [16]uint32 + setupState(&state, &c.key, nonce) + + ciphertext = ciphertext[:len(ciphertext)-16] + ret, out := sliceForAppend(dst, len(ciphertext)) + if alias.InexactOverlap(out, ciphertext) { + panic("chacha20poly1305: invalid buffer overlap") + } + if !chacha20Poly1305Open(out, state[:], ciphertext, additionalData) { + for i := range out { + out[i] = 0 + } + return nil, errOpen + } + + return ret, nil +} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s new file mode 100644 index 0000000..731d2ac --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s @@ -0,0 +1,2715 @@ +// Copyright 2016 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. + +// This file was originally from https://golang.org/cl/24717 by Vlad Krasnov of CloudFlare. + +//go:build gc && !purego + +#include "textflag.h" +// General register allocation +#define oup DI +#define inp SI +#define inl BX +#define adp CX // free to reuse, after we hash the additional data +#define keyp R8 // free to reuse, when we copy the key to stack +#define itr2 R9 // general iterator +#define itr1 CX // general iterator +#define acc0 R10 +#define acc1 R11 +#define acc2 R12 +#define t0 R13 +#define t1 R14 +#define t2 R15 +#define t3 R8 +// Register and stack allocation for the SSE code +#define rStore (0*16)(BP) +#define sStore (1*16)(BP) +#define state1Store (2*16)(BP) +#define state2Store (3*16)(BP) +#define tmpStore (4*16)(BP) +#define ctr0Store (5*16)(BP) +#define ctr1Store (6*16)(BP) +#define ctr2Store (7*16)(BP) +#define ctr3Store (8*16)(BP) +#define A0 X0 +#define A1 X1 +#define A2 X2 +#define B0 X3 +#define B1 X4 +#define B2 X5 +#define C0 X6 +#define C1 X7 +#define C2 X8 +#define D0 X9 +#define D1 X10 +#define D2 X11 +#define T0 X12 +#define T1 X13 +#define T2 X14 +#define T3 X15 +#define A3 T0 +#define B3 T1 +#define C3 T2 +#define D3 T3 +// Register and stack allocation for the AVX2 code +#define rsStoreAVX2 (0*32)(BP) +#define state1StoreAVX2 (1*32)(BP) +#define state2StoreAVX2 (2*32)(BP) +#define ctr0StoreAVX2 (3*32)(BP) +#define ctr1StoreAVX2 (4*32)(BP) +#define ctr2StoreAVX2 (5*32)(BP) +#define ctr3StoreAVX2 (6*32)(BP) +#define tmpStoreAVX2 (7*32)(BP) // 256 bytes on stack +#define AA0 Y0 +#define AA1 Y5 +#define AA2 Y6 +#define AA3 Y7 +#define BB0 Y14 +#define BB1 Y9 +#define BB2 Y10 +#define BB3 Y11 +#define CC0 Y12 +#define CC1 Y13 +#define CC2 Y8 +#define CC3 Y15 +#define DD0 Y4 +#define DD1 Y1 +#define DD2 Y2 +#define DD3 Y3 +#define TT0 DD3 +#define TT1 AA3 +#define TT2 BB3 +#define TT3 CC3 +// ChaCha20 constants +DATA ·chacha20Constants<>+0x00(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x04(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x08(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x0c(SB)/4, $0x6b206574 +DATA ·chacha20Constants<>+0x10(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x14(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x18(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x1c(SB)/4, $0x6b206574 +// <<< 16 with PSHUFB +DATA ·rol16<>+0x00(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A +DATA ·rol16<>+0x10(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x18(SB)/8, $0x0D0C0F0E09080B0A +// <<< 8 with PSHUFB +DATA ·rol8<>+0x00(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x08(SB)/8, $0x0E0D0C0F0A09080B +DATA ·rol8<>+0x10(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x18(SB)/8, $0x0E0D0C0F0A09080B + +DATA ·avx2InitMask<>+0x00(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x08(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x10(SB)/8, $0x1 +DATA ·avx2InitMask<>+0x18(SB)/8, $0x0 + +DATA ·avx2IncMask<>+0x00(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x08(SB)/8, $0x0 +DATA ·avx2IncMask<>+0x10(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x18(SB)/8, $0x0 +// Poly1305 key clamp +DATA ·polyClampMask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·polyClampMask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +DATA ·polyClampMask<>+0x10(SB)/8, $0xFFFFFFFFFFFFFFFF +DATA ·polyClampMask<>+0x18(SB)/8, $0xFFFFFFFFFFFFFFFF + +DATA ·sseIncMask<>+0x00(SB)/8, $0x1 +DATA ·sseIncMask<>+0x08(SB)/8, $0x0 +// To load/store the last < 16 bytes in a buffer +DATA ·andMask<>+0x00(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x08(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x10(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0x18(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x20(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0x28(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x30(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0x38(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x40(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0x48(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x50(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0x58(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x60(SB)/8, $0x00ffffffffffffff +DATA ·andMask<>+0x68(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x70(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x78(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x80(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x88(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x90(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x98(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0xa0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xa8(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0xb0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xb8(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0xc0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xc8(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0xd0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xd8(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0xe0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xe8(SB)/8, $0x00ffffffffffffff + +GLOBL ·chacha20Constants<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol16<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol8<>(SB), (NOPTR+RODATA), $32 +GLOBL ·sseIncMask<>(SB), (NOPTR+RODATA), $16 +GLOBL ·avx2IncMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·avx2InitMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·polyClampMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·andMask<>(SB), (NOPTR+RODATA), $240 +// No PALIGNR in Go ASM yet (but VPALIGNR is present). +#define shiftB0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X3, X3 +#define shiftB1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x04 // PALIGNR $4, X4, X4 +#define shiftB2Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X5, X5 +#define shiftB3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X13, X13 +#define shiftC0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X6, X6 +#define shiftC1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x08 // PALIGNR $8, X7, X7 +#define shiftC2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc0; BYTE $0x08 // PALIGNR $8, X8, X8 +#define shiftC3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X14, X14 +#define shiftD0Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x0c // PALIGNR $12, X9, X9 +#define shiftD1Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x0c // PALIGNR $12, X10, X10 +#define shiftD2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X11, X11 +#define shiftD3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x0c // PALIGNR $12, X15, X15 +#define shiftB0Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X3, X3 +#define shiftB1Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x0c // PALIGNR $12, X4, X4 +#define shiftB2Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X5, X5 +#define shiftB3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X13, X13 +#define shiftC0Right shiftC0Left +#define shiftC1Right shiftC1Left +#define shiftC2Right shiftC2Left +#define shiftC3Right shiftC3Left +#define shiftD0Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x04 // PALIGNR $4, X9, X9 +#define shiftD1Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x04 // PALIGNR $4, X10, X10 +#define shiftD2Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X11, X11 +#define shiftD3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x04 // PALIGNR $4, X15, X15 + +// Some macros + +// ROL rotates the uint32s in register R left by N bits, using temporary T. +#define ROL(N, R, T) \ + MOVO R, T; PSLLL $(N), T; PSRLL $(32-(N)), R; PXOR T, R + +// ROL16 rotates the uint32s in register R left by 16, using temporary T if needed. +#ifdef GOAMD64_v2 +#define ROL16(R, T) PSHUFB ·rol16<>(SB), R +#else +#define ROL16(R, T) ROL(16, R, T) +#endif + +// ROL8 rotates the uint32s in register R left by 8, using temporary T if needed. +#ifdef GOAMD64_v2 +#define ROL8(R, T) PSHUFB ·rol8<>(SB), R +#else +#define ROL8(R, T) ROL(8, R, T) +#endif + +#define chachaQR(A, B, C, D, T) \ + PADDD B, A; PXOR A, D; ROL16(D, T) \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $12, T; PSRLL $20, B; PXOR T, B \ + PADDD B, A; PXOR A, D; ROL8(D, T) \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $7, T; PSRLL $25, B; PXOR T, B + +#define chachaQR_AVX2(A, B, C, D, T) \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol16<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $12, B, T; VPSRLD $20, B, B; VPXOR T, B, B \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol8<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $7, B, T; VPSRLD $25, B, B; VPXOR T, B, B + +#define polyAdd(S) ADDQ S, acc0; ADCQ 8+S, acc1; ADCQ $1, acc2 +#define polyMulStage1 MOVQ (0*8)(BP), AX; MOVQ AX, t2; MULQ acc0; MOVQ AX, t0; MOVQ DX, t1; MOVQ (0*8)(BP), AX; MULQ acc1; IMULQ acc2, t2; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2 MOVQ (1*8)(BP), AX; MOVQ AX, t3; MULQ acc0; ADDQ AX, t1; ADCQ $0, DX; MOVQ DX, acc0; MOVQ (1*8)(BP), AX; MULQ acc1; ADDQ AX, t2; ADCQ $0, DX +#define polyMulStage3 IMULQ acc2, t3; ADDQ acc0, t2; ADCQ DX, t3 +#define polyMulReduceStage MOVQ t0, acc0; MOVQ t1, acc1; MOVQ t2, acc2; ANDQ $3, acc2; MOVQ t2, t0; ANDQ $-4, t0; MOVQ t3, t1; SHRQ $2, t3, t2; SHRQ $2, t3; ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $0, acc2; ADDQ t2, acc0; ADCQ t3, acc1; ADCQ $0, acc2 + +#define polyMulStage1_AVX2 MOVQ (0*8)(BP), DX; MOVQ DX, t2; MULXQ acc0, t0, t1; IMULQ acc2, t2; MULXQ acc1, AX, DX; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2_AVX2 MOVQ (1*8)(BP), DX; MULXQ acc0, acc0, AX; ADDQ acc0, t1; MULXQ acc1, acc1, t3; ADCQ acc1, t2; ADCQ $0, t3 +#define polyMulStage3_AVX2 IMULQ acc2, DX; ADDQ AX, t2; ADCQ DX, t3 + +#define polyMul polyMulStage1; polyMulStage2; polyMulStage3; polyMulReduceStage +#define polyMulAVX2 polyMulStage1_AVX2; polyMulStage2_AVX2; polyMulStage3_AVX2; polyMulReduceStage +// ---------------------------------------------------------------------------- +TEXT polyHashADInternal<>(SB), NOSPLIT, $0 + // adp points to beginning of additional data + // itr2 holds ad length + XORQ acc0, acc0 + XORQ acc1, acc1 + XORQ acc2, acc2 + CMPQ itr2, $13 + JNE hashADLoop + +openFastTLSAD: + // Special treatment for the TLS case of 13 bytes + MOVQ (adp), acc0 + MOVQ 5(adp), acc1 + SHRQ $24, acc1 + MOVQ $1, acc2 + polyMul + RET + +hashADLoop: + // Hash in 16 byte chunks + CMPQ itr2, $16 + JB hashADTail + polyAdd(0(adp)) + LEAQ (1*16)(adp), adp + SUBQ $16, itr2 + polyMul + JMP hashADLoop + +hashADTail: + CMPQ itr2, $0 + JE hashADDone + + // Hash last < 16 byte tail + XORQ t0, t0 + XORQ t1, t1 + XORQ t2, t2 + ADDQ itr2, adp + +hashADTailLoop: + SHLQ $8, t0, t1 + SHLQ $8, t0 + MOVB -1(adp), t2 + XORQ t2, t0 + DECQ adp + DECQ itr2 + JNE hashADTailLoop + +hashADTailFinish: + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Finished AD +hashADDone: + RET + +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Open(dst, key, src, ad []byte) bool +TEXT ·chacha20Poly1305Open(SB), 0, $288-97 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + // Check for AVX2 support + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Open_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE openSSE128 // About 16% faster + + // For long buffers, prepare the poly key first + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + MOVO D0, T1 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + MOVO D0, ctr3Store + MOVQ $10, itr2 + +openSSEPreparePolyKey: + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + DECQ itr2 + JNE openSSEPreparePolyKey + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore; MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSEMainLoop: + CMPQ inl, $256 + JB openSSEMainLoopDone + + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + + // There are 10 ChaCha20 iterations of 2QR each, so for 6 iterations we hash 2 blocks, and for the remaining 4 only 1 block - for a total of 16 + MOVQ $4, itr1 + MOVQ inp, itr2 + +openSSEInternalLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(itr2)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(itr2), itr2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr1 + JGE openSSEInternalLoop + + polyAdd(0(itr2)) + polyMul + LEAQ (2*8)(itr2), itr2 + + CMPQ itr1, $-6 + JG openSSEInternalLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Load - xor - store + MOVO D3, tmpStore + MOVOU (0*16)(inp), D3; PXOR D3, A0; MOVOU A0, (0*16)(oup) + MOVOU (1*16)(inp), D3; PXOR D3, B0; MOVOU B0, (1*16)(oup) + MOVOU (2*16)(inp), D3; PXOR D3, C0; MOVOU C0, (2*16)(oup) + MOVOU (3*16)(inp), D3; PXOR D3, D0; MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), D0; PXOR D0, A1; MOVOU A1, (4*16)(oup) + MOVOU (5*16)(inp), D0; PXOR D0, B1; MOVOU B1, (5*16)(oup) + MOVOU (6*16)(inp), D0; PXOR D0, C1; MOVOU C1, (6*16)(oup) + MOVOU (7*16)(inp), D0; PXOR D0, D1; MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), D0; PXOR D0, A2; MOVOU A2, (8*16)(oup) + MOVOU (9*16)(inp), D0; PXOR D0, B2; MOVOU B2, (9*16)(oup) + MOVOU (10*16)(inp), D0; PXOR D0, C2; MOVOU C2, (10*16)(oup) + MOVOU (11*16)(inp), D0; PXOR D0, D2; MOVOU D2, (11*16)(oup) + MOVOU (12*16)(inp), D0; PXOR D0, A3; MOVOU A3, (12*16)(oup) + MOVOU (13*16)(inp), D0; PXOR D0, B3; MOVOU B3, (13*16)(oup) + MOVOU (14*16)(inp), D0; PXOR D0, C3; MOVOU C3, (14*16)(oup) + MOVOU (15*16)(inp), D0; PXOR tmpStore, D0; MOVOU D0, (15*16)(oup) + LEAQ 256(inp), inp + LEAQ 256(oup), oup + SUBQ $256, inl + JMP openSSEMainLoop + +openSSEMainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $64 + JBE openSSETail64 + CMPQ inl, $128 + JBE openSSETail128 + CMPQ inl, $192 + JBE openSSETail192 + JMP openSSETail256 + +openSSEFinalize: + // Hash in the PT, AAD lengths + ADDQ ad_len+80(FP), acc0; ADCQ src_len+56(FP), acc1; ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally, constant time compare to the tag at the end of the message + XORQ AX, AX + MOVQ $1, DX + XORQ (0*8)(inp), acc0 + XORQ (1*8)(inp), acc1 + ORQ acc1, acc0 + CMOVQEQ DX, AX + + // Return true iff tags are equal + MOVB AX, ret+96(FP) + RET + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 129 bytes +openSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +openSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE openSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore; MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSE128Open: + CMPQ inl, $16 + JB openSSETail16 + SUBQ $16, inl + + // Load for hashing + polyAdd(0(inp)) + + // Load for decryption + MOVOU (inp), T0; PXOR T0, A1; MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP openSSE128Open + +openSSETail16: + TESTQ inl, inl + JE openSSEFinalize + + // We can safely load the CT from the end, because it is padded with the MAC + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVOU (inp), T0 + ADDQ inl, inp + PAND -16(t0)(itr2*1), T0 + MOVO T0, 0+tmpStore + MOVQ T0, t0 + MOVQ 8+tmpStore, t1 + PXOR A1, T0 + + // We can only store one byte at a time, since plaintext can be shorter than 16 bytes +openSSETail16Store: + MOVQ T0, t3 + MOVB t3, (oup) + PSRLDQ $1, T0 + INCQ oup + DECQ inl + JNE openSSETail16Store + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + JMP openSSEFinalize + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of ciphertext +openSSETail64: + // Need to decrypt up to 64 bytes - prepare single block + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + XORQ itr2, itr2 + MOVQ inl, itr1 + CMPQ itr1, $16 + JB openSSETail64LoopB + +openSSETail64LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + SUBQ $16, itr1 + +openSSETail64LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + + CMPQ itr1, $16 + JAE openSSETail64LoopA + + CMPQ itr2, $160 + JNE openSSETail64LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0; PADDL state2Store, C0; PADDL ctr0Store, D0 + +openSSETail64DecLoop: + CMPQ inl, $16 + JB openSSETail64DecLoopDone + SUBQ $16, inl + MOVOU (inp), T0 + PXOR T0, A0 + MOVOU A0, (oup) + LEAQ 16(inp), inp + LEAQ 16(oup), oup + MOVO B0, A0 + MOVO C0, B0 + MOVO D0, C0 + JMP openSSETail64DecLoop + +openSSETail64DecLoopDone: + MOVO A0, A1 + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openSSETail128: + // Need to decrypt up to 128 bytes - prepare two blocks + MOVO ·chacha20Constants<>(SB), A1; MOVO state1Store, B1; MOVO state2Store, C1; MOVO ctr3Store, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr0Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr1Store + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSETail128LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + CMPQ itr2, itr1 + JB openSSETail128LoopA + + CMPQ itr2, $160 + JNE openSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr1Store, D0; PADDL ctr0Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + + SUBQ $64, inl + LEAQ 64(inp), inp + LEAQ 64(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of ciphertext +openSSETail192: + // Need to decrypt up to 192 bytes - prepare three blocks + MOVO ·chacha20Constants<>(SB), A2; MOVO state1Store, B2; MOVO state2Store, C2; MOVO ctr3Store, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr0Store + MOVO A2, A1; MOVO B2, B1; MOVO C2, C1; MOVO D2, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr2Store + + MOVQ inl, itr1 + MOVQ $160, itr2 + CMPQ itr1, $160 + CMOVQGT itr2, itr1 + ANDQ $-16, itr1 + XORQ itr2, itr2 + +openSSLTail192LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSLTail192LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + CMPQ itr2, itr1 + JB openSSLTail192LoopA + + CMPQ itr2, $160 + JNE openSSLTail192LoopB + + CMPQ inl, $176 + JB openSSLTail192Store + + polyAdd(160(inp)) + polyMul + + CMPQ inl, $192 + JB openSSLTail192Store + + polyAdd(176(inp)) + polyMul + +openSSLTail192Store: + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr2Store, D0; PADDL ctr1Store, D1; PADDL ctr0Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A2; PXOR T1, B2; PXOR T2, C2; PXOR T3, D2 + MOVOU A2, (0*16)(oup); MOVOU B2, (1*16)(oup); MOVOU C2, (2*16)(oup); MOVOU D2, (3*16)(oup) + + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + SUBQ $128, inl + LEAQ 128(inp), inp + LEAQ 128(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openSSETail256: + // Need to decrypt up to 256 bytes - prepare four blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + XORQ itr2, itr2 + +openSSETail256Loop: + // This loop inteleaves 8 ChaCha quarter rounds with 1 poly multiplication + polyAdd(0(inp)(itr2*1)) + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulStage3 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + ADDQ $2*8, itr2 + CMPQ itr2, $160 + JB openSSETail256Loop + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail256HashLoop: + polyAdd(0(inp)(itr2*1)) + polyMul + ADDQ $2*8, itr2 + CMPQ itr2, itr1 + JB openSSETail256HashLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + LEAQ 192(inp), inp + LEAQ 192(oup), oup + SUBQ $192, inl + MOVO A3, A0 + MOVO B3, B0 + MOVO C3, C0 + MOVO tmpStore, D0 + + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Open_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimization, for very short buffers + CMPQ inl, $192 + JBE openAVX2192 + CMPQ inl, $320 + JBE openAVX2320 + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, state2StoreAVX2 + VMOVDQA DD0, ctr3StoreAVX2 + MOVQ $10, itr2 + +openAVX2PreparePolyKey: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + DECQ itr2 + JNE openAVX2PreparePolyKey + + VPADDD ·chacha20Constants<>(SB), AA0, AA0 + VPADDD state1StoreAVX2, BB0, BB0 + VPADDD state2StoreAVX2, CC0, CC0 + VPADDD ctr3StoreAVX2, DD0, DD0 + + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for the first 64 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + + // Hash AD + first 64 bytes + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +openAVX2InitialHash64: + polyAdd(0(inp)(itr1*1)) + polyMulAVX2 + ADDQ $16, itr1 + CMPQ itr1, $64 + JNE openAVX2InitialHash64 + + // Decrypt the first 64 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), BB0, BB0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU BB0, (1*32)(oup) + LEAQ (2*32)(inp), inp + LEAQ (2*32)(oup), oup + SUBQ $64, inl + +openAVX2MainLoop: + CMPQ inl, $512 + JB openAVX2MainLoopDone + + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + +openAVX2InternalLoop: + // Lets just say this spaghetti loop interleaves 2 quarter rounds with 3 poly multiplications + // Effectively per 512 bytes of stream we hash 480 bytes of ciphertext + polyAdd(0*8(inp)(itr1*1)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(inp)(itr1*1)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(inp)(itr1*1)) + LEAQ (6*8)(itr1), itr1 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + CMPQ itr1, $480 + JNE openAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(480(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(496(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + LEAQ (32*16)(oup), oup + SUBQ $(32*16), inl + JMP openAVX2MainLoop + +openAVX2MainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $128 + JBE openAVX2Tail128 + CMPQ inl, $256 + JBE openAVX2Tail256 + CMPQ inl, $384 + JBE openAVX2Tail384 + JMP openAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +openAVX2192: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +openAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE openAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +openAVX2ShortOpen: + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openAVX2ShortOpenLoop: + CMPQ inl, $32 + JB openAVX2ShortTail32 + SUBQ $32, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + polyAdd(2*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP openAVX2ShortOpenLoop + +openAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2ShortDone + + SUBQ $16, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2ShortDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +openAVX2320: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +openAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE openAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP openAVX2ShortOpen + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD1 + VMOVDQA DD1, DD0 + + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + TESTQ itr1, itr1 + JE openAVX2Tail128LoopB + +openAVX2Tail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMulAVX2 + +openAVX2Tail128LoopB: + ADDQ $16, itr2 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail128LoopA + CMPQ itr2, $160 + JNE openAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC1, CC1 + VPADDD DD0, DD1, DD1 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + +openAVX2TailLoop: + CMPQ inl, $32 + JB openAVX2Tail + SUBQ $32, inl + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + JMP openAVX2TailLoop + +openAVX2Tail: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2TailDone + SUBQ $16, inl + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2TailDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare four blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + + // Compute the number of iterations that will hash data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $128, itr1 + SHRQ $4, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + +openAVX2Tail256LoopA: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail256LoopA + + CMPQ itr2, $10 + JNE openAVX2Tail256LoopB + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + + // Hash the remainder of data (if any) +openAVX2Tail256Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail256HashEnd + polyAdd (0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail256Hash + +// Store 128 bytes safely, then go to store loop +openAVX2Tail256HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, AA2; VPERM2I128 $0x02, CC0, DD0, BB2; VPERM2I128 $0x13, AA0, BB0, CC2; VPERM2I128 $0x13, CC0, DD0, DD2 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + + VPXOR (0*32)(inp), AA2, AA2; VPXOR (1*32)(inp), BB2, BB2; VPXOR (2*32)(inp), CC2, CC2; VPXOR (3*32)(inp), DD2, DD2 + VMOVDQU AA2, (0*32)(oup); VMOVDQU BB2, (1*32)(oup); VMOVDQU CC2, (2*32)(oup); VMOVDQU DD2, (3*32)(oup) + LEAQ (4*32)(inp), inp + LEAQ (4*32)(oup), oup + SUBQ $4*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +openAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare six blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, ctr0StoreAVX2 + VMOVDQA DD1, ctr1StoreAVX2 + VMOVDQA DD2, ctr2StoreAVX2 + + // Compute the number of iterations that will hash two blocks of data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $256, itr1 + SHRQ $4, itr1 + ADDQ $6, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail384LoopB: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + +openAVX2Tail384LoopA: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + + CMPQ itr2, itr1 + JB openAVX2Tail384LoopB + + CMPQ itr2, $10 + JNE openAVX2Tail384LoopA + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + +openAVX2Tail384Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail384HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail384Hash + +// Store 256 bytes safely, then go to store loop +openAVX2Tail384HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0; VPERM2I128 $0x02, CC0, DD0, TT1; VPERM2I128 $0x13, AA0, BB0, TT2; VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0; VPERM2I128 $0x02, CC1, DD1, TT1; VPERM2I128 $0x13, AA1, BB1, TT2; VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + LEAQ (8*32)(inp), inp + LEAQ (8*32)(oup), oup + SUBQ $8*32, inl + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +openAVX2Tail512: + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + MOVQ inp, itr2 + +openAVX2Tail512LoopB: + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ (2*8)(itr2), itr2 + +openAVX2Tail512LoopA: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(itr2)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(itr2)) + polyMulAVX2 + LEAQ (4*8)(itr2), itr2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + INCQ itr1 + CMPQ itr1, $4 + JLT openAVX2Tail512LoopB + + CMPQ itr1, $10 + JNE openAVX2Tail512LoopA + + MOVQ inl, itr1 + SUBQ $384, itr1 + ANDQ $-16, itr1 + +openAVX2Tail512HashLoop: + TESTQ itr1, itr1 + JE openAVX2Tail512HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + SUBQ $16, itr1 + JMP openAVX2Tail512HashLoop + +openAVX2Tail512HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + LEAQ (12*32)(inp), inp + LEAQ (12*32)(oup), oup + SUBQ $12*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Seal(dst, key, src, ad []byte) +TEXT ·chacha20Poly1305Seal(SB), 0, $288-96 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Seal_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE sealSSE128 // About 15% faster + + // In the seal case - prepare the poly key + 3 blocks of stream in the first iteration + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + + // Load state, increment counter blocks + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + MOVQ $10, itr2 + +sealSSEIntroLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JNE sealSSEIntroLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore + MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (4*16)(oup); MOVOU B2, (5*16)(oup); MOVOU C2, (6*16)(oup); MOVOU D2, (7*16)(oup) + + MOVQ $128, itr1 + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVO A3, A1; MOVO B3, B1; MOVO C3, C1; MOVO D3, D1 + + CMPQ inl, $64 + JBE sealSSE128SealHash + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (8*16)(oup); MOVOU B3, (9*16)(oup); MOVOU C3, (10*16)(oup); MOVOU D3, (11*16)(oup) + + ADDQ $64, itr1 + SUBQ $64, inl + LEAQ 64(inp), inp + + MOVQ $2, itr1 + MOVQ $8, itr2 + + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + CMPQ inl, $192 + JBE sealSSETail192 + +sealSSEMainLoop: + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + +sealSSEInnerLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(oup)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(oup), oup + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JGE sealSSEInnerLoop + polyAdd(0(oup)) + polyMul + LEAQ (2*8)(oup), oup + DECQ itr1 + JG sealSSEInnerLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVO tmpStore, D3 + + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + ADDQ $192, inp + MOVQ $192, itr1 + SUBQ $192, inl + MOVO A3, A1 + MOVO B3, B1 + MOVO C3, C1 + MOVO D3, D1 + CMPQ inl, $64 + JBE sealSSE128SealHash + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (12*16)(oup); MOVOU B3, (13*16)(oup); MOVOU C3, (14*16)(oup); MOVOU D3, (15*16)(oup) + LEAQ 64(inp), inp + SUBQ $64, inl + MOVQ $6, itr1 + MOVQ $4, itr2 + CMPQ inl, $192 + JG sealSSEMainLoop + + MOVQ inl, itr1 + TESTQ inl, inl + JE sealSSE128SealHash + MOVQ $6, itr1 + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + JMP sealSSETail192 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of plaintext +sealSSETail64: + // Need to encrypt up to 64 bytes - prepare single block, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A1 + MOVO state1Store, B1 + MOVO state2Store, C1 + MOVO ctr3Store, D1 + PADDL ·sseIncMask<>(SB), D1 + MOVO D1, ctr0Store + +sealSSETail64LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail64LoopB: + chachaQR(A1, B1, C1, D1, T1) + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A1, B1, C1, D1, T1) + shiftB1Right; shiftC1Right; shiftD1Right + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + DECQ itr1 + JG sealSSETail64LoopA + + DECQ itr2 + JGE sealSSETail64LoopB + PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B1 + PADDL state2Store, C1 + PADDL ctr0Store, D1 + + JMP sealSSE128Seal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of plaintext +sealSSETail128: + // Need to encrypt up to 128 bytes - prepare two blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + +sealSSETail128LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail128LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + DECQ itr1 + JG sealSSETail128LoopA + + DECQ itr2 + JGE sealSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr0Store, D0; PADDL ctr1Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + + MOVQ $64, itr1 + LEAQ 64(inp), inp + SUBQ $64, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of plaintext +sealSSETail192: + // Need to encrypt up to 192 bytes - prepare three blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr2Store + +sealSSETail192LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail192LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + DECQ itr1 + JG sealSSETail192LoopA + + DECQ itr2 + JGE sealSSETail192LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr0Store, D0; PADDL ctr1Store, D1; PADDL ctr2Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + MOVO A2, A1 + MOVO B2, B1 + MOVO C2, C1 + MOVO D2, D1 + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special seal optimization for buffers smaller than 129 bytes +sealSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +sealSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE sealSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore + MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealSSE128SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealSSE128Seal + polyAdd(0(oup)) + polyMul + + SUBQ $16, itr1 + ADDQ $16, oup + + JMP sealSSE128SealHash + +sealSSE128Seal: + CMPQ inl, $16 + JB sealSSETail + SUBQ $16, inl + + // Load for decryption + MOVOU (inp), T0 + PXOR T0, A1 + MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + + // Extract for hashing + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP sealSSE128Seal + +sealSSETail: + TESTQ inl, inl + JE sealSSEFinalize + + // We can only load the PT one byte at a time to avoid read after end of buffer + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVQ inl, itr1 + LEAQ -1(inp)(inl*1), inp + XORQ t2, t2 + XORQ t3, t3 + XORQ AX, AX + +sealSSETailLoadLoop: + SHLQ $8, t2, t3 + SHLQ $8, t2 + MOVB (inp), AX + XORQ AX, t2 + LEAQ -1(inp), inp + DECQ itr1 + JNE sealSSETailLoadLoop + MOVQ t2, 0+tmpStore + MOVQ t3, 8+tmpStore + PXOR 0+tmpStore, A1 + MOVOU A1, (oup) + MOVOU -16(t0)(itr2*1), T0 + PAND T0, A1 + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + ADDQ inl, oup + +sealSSEFinalize: + // Hash in the buffer lengths + ADDQ ad_len+80(FP), acc0 + ADCQ src_len+56(FP), acc1 + ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally store the tag at the end of the message + MOVQ acc0, (0*8)(oup) + MOVQ acc1, (1*8)(oup) + RET + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Seal_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimizations, for very short buffers + CMPQ inl, $192 + JBE seal192AVX2 // 33% faster + CMPQ inl, $320 + JBE seal320AVX2 // 17% faster + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3; VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3; VMOVDQA CC0, state2StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD0, DD1; VMOVDQA DD0, ctr0StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD1, DD2; VMOVDQA DD1, ctr1StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD2, DD3; VMOVDQA DD2, ctr2StoreAVX2 + VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr2 + +sealAVX2IntroLoop: + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr2 + JNE sealAVX2IntroLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + + VPERM2I128 $0x13, CC0, DD0, CC0 // Stream bytes 96 - 127 + VPERM2I128 $0x02, AA0, BB0, DD0 // The Poly1305 key + VPERM2I128 $0x13, AA0, BB0, AA0 // Stream bytes 64 - 95 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), DD0, DD0 + VMOVDQA DD0, rsStoreAVX2 + + // Hash AD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + // Can store at least 320 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), CC0, CC0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU CC0, (1*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (2*32)(inp), AA0, AA0; VPXOR (3*32)(inp), BB0, BB0; VPXOR (4*32)(inp), CC0, CC0; VPXOR (5*32)(inp), DD0, DD0 + VMOVDQU AA0, (2*32)(oup); VMOVDQU BB0, (3*32)(oup); VMOVDQU CC0, (4*32)(oup); VMOVDQU DD0, (5*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (6*32)(inp), AA0, AA0; VPXOR (7*32)(inp), BB0, BB0; VPXOR (8*32)(inp), CC0, CC0; VPXOR (9*32)(inp), DD0, DD0 + VMOVDQU AA0, (6*32)(oup); VMOVDQU BB0, (7*32)(oup); VMOVDQU CC0, (8*32)(oup); VMOVDQU DD0, (9*32)(oup) + + MOVQ $320, itr1 + SUBQ $320, inl + LEAQ 320(inp), inp + + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, CC3, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, CC3, DD3, DD0 + CMPQ inl, $128 + JBE sealAVX2SealHash + + VPXOR (0*32)(inp), AA0, AA0; VPXOR (1*32)(inp), BB0, BB0; VPXOR (2*32)(inp), CC0, CC0; VPXOR (3*32)(inp), DD0, DD0 + VMOVDQU AA0, (10*32)(oup); VMOVDQU BB0, (11*32)(oup); VMOVDQU CC0, (12*32)(oup); VMOVDQU DD0, (13*32)(oup) + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVQ $8, itr1 + MOVQ $2, itr2 + + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + CMPQ inl, $512 + JBE sealAVX2Tail512 + + // We have 448 bytes to hash, but main loop hashes 512 bytes at a time - perform some rounds, before the main loop + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + + SUBQ $16, oup // Adjust the pointer + MOVQ $9, itr1 + JMP sealAVX2InternalLoopStart + +sealAVX2MainLoop: + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr1 + +sealAVX2InternalLoop: + polyAdd(0*8(oup)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + +sealAVX2InternalLoopStart: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(oup)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(oup)) + LEAQ (6*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr1 + JNE sealAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(-2*8(oup)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + SUBQ $(32*16), inl + CMPQ inl, $512 + JG sealAVX2MainLoop + + // Tail can only hash 480 bytes + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ 32(oup), oup + + MOVQ $10, itr1 + MOVQ $0, itr2 + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + JMP sealAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +seal192AVX2: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +sealAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE sealAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +sealAVX2ShortSeal: + // Hash aad + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealAVX2SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealAVX2ShortSealLoop + polyAdd(0(oup)) + polyMul + SUBQ $16, itr1 + ADDQ $16, oup + JMP sealAVX2SealHash + +sealAVX2ShortSealLoop: + CMPQ inl, $32 + JB sealAVX2ShortTail32 + SUBQ $32, inl + + // Load for encryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + + // Now can hash + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP sealAVX2ShortSealLoop + +sealAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB sealAVX2ShortDone + + SUBQ $16, inl + + // Load for encryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + + // Hash + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +sealAVX2ShortDone: + VZEROUPPER + JMP sealSSETail + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +seal320AVX2: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +sealAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE sealAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP sealAVX2ShortSeal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +sealAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0 + VMOVDQA state1StoreAVX2, BB0 + VMOVDQA state2StoreAVX2, CC0 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VMOVDQA DD0, DD1 + +sealAVX2Tail128LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail128LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $4, DD0, DD0, DD0 + DECQ itr1 + JG sealAVX2Tail128LoopA + DECQ itr2 + JGE sealAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA1 + VPADDD state1StoreAVX2, BB0, BB1 + VPADDD state2StoreAVX2, CC0, CC1 + VPADDD DD1, DD0, DD1 + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + JMP sealAVX2ShortSealLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +sealAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + +sealAVX2Tail256LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr1 + JG sealAVX2Tail256LoopA + DECQ itr2 + JGE sealAVX2Tail256LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +sealAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, TT1; VMOVDQA DD1, TT2; VMOVDQA DD2, TT3 + +sealAVX2Tail384LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail384LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr1 + JG sealAVX2Tail384LoopA + DECQ itr2 + JGE sealAVX2Tail384LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1; VPADDD TT3, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0 + VPERM2I128 $0x02, CC1, DD1, TT1 + VPERM2I128 $0x13, AA1, BB1, TT2 + VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + MOVQ $256, itr1 + LEAQ 256(inp), inp + SUBQ $256, inl + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +sealAVX2Tail512: + // Need to decrypt up to 512 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + +sealAVX2Tail512LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail512LoopB: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(oup)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + + DECQ itr1 + JG sealAVX2Tail512LoopA + DECQ itr2 + JGE sealAVX2Tail512LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3 + VPXOR (0*32)(inp), CC3, CC3 + VMOVDQU CC3, (0*32)(oup) + VPERM2I128 $0x02, CC0, DD0, CC3 + VPXOR (1*32)(inp), CC3, CC3 + VMOVDQU CC3, (1*32)(oup) + VPERM2I128 $0x13, AA0, BB0, CC3 + VPXOR (2*32)(inp), CC3, CC3 + VMOVDQU CC3, (2*32)(oup) + VPERM2I128 $0x13, CC0, DD0, CC3 + VPXOR (3*32)(inp), CC3, CC3 + VMOVDQU CC3, (3*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + + MOVQ $384, itr1 + LEAQ 384(inp), inp + SUBQ $384, inl + VPERM2I128 $0x02, AA3, BB3, AA0 + VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0 + VPERM2I128 $0x13, AA3, BB3, CC0 + VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + JMP sealAVX2SealHash diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go new file mode 100644 index 0000000..6313898 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go @@ -0,0 +1,81 @@ +// Copyright 2016 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 chacha20poly1305 + +import ( + "encoding/binary" + + "golang.org/x/crypto/chacha20" + "golang.org/x/crypto/internal/alias" + "golang.org/x/crypto/internal/poly1305" +) + +func writeWithPadding(p *poly1305.MAC, b []byte) { + p.Write(b) + if rem := len(b) % 16; rem != 0 { + var buf [16]byte + padLen := 16 - rem + p.Write(buf[:padLen]) + } +} + +func writeUint64(p *poly1305.MAC, n int) { + var buf [8]byte + binary.LittleEndian.PutUint64(buf[:], uint64(n)) + p.Write(buf[:]) +} + +func (c *chacha20poly1305) sealGeneric(dst, nonce, plaintext, additionalData []byte) []byte { + ret, out := sliceForAppend(dst, len(plaintext)+poly1305.TagSize) + ciphertext, tag := out[:len(plaintext)], out[len(plaintext):] + if alias.InexactOverlap(out, plaintext) { + panic("chacha20poly1305: invalid buffer overlap") + } + + var polyKey [32]byte + s, _ := chacha20.NewUnauthenticatedCipher(c.key[:], nonce) + s.XORKeyStream(polyKey[:], polyKey[:]) + s.SetCounter(1) // set the counter to 1, skipping 32 bytes + s.XORKeyStream(ciphertext, plaintext) + + p := poly1305.New(&polyKey) + writeWithPadding(p, additionalData) + writeWithPadding(p, ciphertext) + writeUint64(p, len(additionalData)) + writeUint64(p, len(plaintext)) + p.Sum(tag[:0]) + + return ret +} + +func (c *chacha20poly1305) openGeneric(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + tag := ciphertext[len(ciphertext)-16:] + ciphertext = ciphertext[:len(ciphertext)-16] + + var polyKey [32]byte + s, _ := chacha20.NewUnauthenticatedCipher(c.key[:], nonce) + s.XORKeyStream(polyKey[:], polyKey[:]) + s.SetCounter(1) // set the counter to 1, skipping 32 bytes + + p := poly1305.New(&polyKey) + writeWithPadding(p, additionalData) + writeWithPadding(p, ciphertext) + writeUint64(p, len(additionalData)) + writeUint64(p, len(ciphertext)) + + ret, out := sliceForAppend(dst, len(ciphertext)) + if alias.InexactOverlap(out, ciphertext) { + panic("chacha20poly1305: invalid buffer overlap") + } + if !p.Verify(tag) { + for i := range out { + out[i] = 0 + } + return nil, errOpen + } + + s.XORKeyStream(out, ciphertext) + return ret, nil +} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go new file mode 100644 index 0000000..34e6ab1 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go @@ -0,0 +1,15 @@ +// Copyright 2016 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 || !gc || purego + +package chacha20poly1305 + +func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte { + return c.sealGeneric(dst, nonce, plaintext, additionalData) +} + +func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + return c.openGeneric(dst, nonce, ciphertext, additionalData) +} diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go b/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go new file mode 100644 index 0000000..1cebfe9 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go @@ -0,0 +1,86 @@ +// Copyright 2018 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 chacha20poly1305 + +import ( + "crypto/cipher" + "errors" + + "golang.org/x/crypto/chacha20" +) + +type xchacha20poly1305 struct { + key [KeySize]byte +} + +// NewX returns a XChaCha20-Poly1305 AEAD that uses the given 256-bit key. +// +// XChaCha20-Poly1305 is a ChaCha20-Poly1305 variant that takes a longer nonce, +// suitable to be generated randomly without risk of collisions. It should be +// preferred when nonce uniqueness cannot be trivially ensured, or whenever +// nonces are randomly generated. +func NewX(key []byte) (cipher.AEAD, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20poly1305: bad key length") + } + ret := new(xchacha20poly1305) + copy(ret.key[:], key) + return ret, nil +} + +func (*xchacha20poly1305) NonceSize() int { + return NonceSizeX +} + +func (*xchacha20poly1305) Overhead() int { + return Overhead +} + +func (x *xchacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte { + if len(nonce) != NonceSizeX { + panic("chacha20poly1305: bad nonce length passed to Seal") + } + + // XChaCha20-Poly1305 technically supports a 64-bit counter, so there is no + // size limit. However, since we reuse the ChaCha20-Poly1305 implementation, + // the second half of the counter is not available. This is unlikely to be + // an issue because the cipher.AEAD API requires the entire message to be in + // memory, and the counter overflows at 256 GB. + if uint64(len(plaintext)) > (1<<38)-64 { + panic("chacha20poly1305: plaintext too large") + } + + c := new(chacha20poly1305) + hKey, _ := chacha20.HChaCha20(x.key[:], nonce[0:16]) + copy(c.key[:], hKey) + + // The first 4 bytes of the final nonce are unused counter space. + cNonce := make([]byte, NonceSize) + copy(cNonce[4:12], nonce[16:24]) + + return c.seal(dst, cNonce[:], plaintext, additionalData) +} + +func (x *xchacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + if len(nonce) != NonceSizeX { + panic("chacha20poly1305: bad nonce length passed to Open") + } + if len(ciphertext) < 16 { + return nil, errOpen + } + if uint64(len(ciphertext)) > (1<<38)-48 { + panic("chacha20poly1305: ciphertext too large") + } + + c := new(chacha20poly1305) + hKey, _ := chacha20.HChaCha20(x.key[:], nonce[0:16]) + copy(c.key[:], hKey) + + // The first 4 bytes of the final nonce are unused counter space. + cNonce := make([]byte, NonceSize) + copy(cNonce[4:12], nonce[16:24]) + + return c.open(dst, cNonce[:], ciphertext, additionalData) +} diff --git a/vendor/golang.org/x/crypto/hkdf/hkdf.go b/vendor/golang.org/x/crypto/hkdf/hkdf.go new file mode 100644 index 0000000..f4ded5f --- /dev/null +++ b/vendor/golang.org/x/crypto/hkdf/hkdf.go @@ -0,0 +1,95 @@ +// 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 hkdf implements the HMAC-based Extract-and-Expand Key Derivation +// Function (HKDF) as defined in RFC 5869. +// +// HKDF is a cryptographic key derivation function (KDF) with the goal of +// expanding limited input keying material into one or more cryptographically +// strong secret keys. +package hkdf // import "golang.org/x/crypto/hkdf" + +import ( + "crypto/hmac" + "errors" + "hash" + "io" +) + +// Extract generates a pseudorandom key for use with Expand from an input secret +// and an optional independent salt. +// +// Only use this function if you need to reuse the extracted key with multiple +// Expand invocations and different context values. Most common scenarios, +// including the generation of multiple keys, should use New instead. +func Extract(hash func() hash.Hash, secret, salt []byte) []byte { + if salt == nil { + salt = make([]byte, hash().Size()) + } + extractor := hmac.New(hash, salt) + extractor.Write(secret) + return extractor.Sum(nil) +} + +type hkdf struct { + expander hash.Hash + size int + + info []byte + counter byte + + prev []byte + buf []byte +} + +func (f *hkdf) Read(p []byte) (int, error) { + // Check whether enough data can be generated + need := len(p) + remains := len(f.buf) + int(255-f.counter+1)*f.size + if remains < need { + return 0, errors.New("hkdf: entropy limit reached") + } + // Read any leftover from the buffer + n := copy(p, f.buf) + p = p[n:] + + // Fill the rest of the buffer + for len(p) > 0 { + if f.counter > 1 { + f.expander.Reset() + } + f.expander.Write(f.prev) + f.expander.Write(f.info) + f.expander.Write([]byte{f.counter}) + f.prev = f.expander.Sum(f.prev[:0]) + f.counter++ + + // Copy the new batch into p + f.buf = f.prev + n = copy(p, f.buf) + p = p[n:] + } + // Save leftovers for next run + f.buf = f.buf[n:] + + return need, nil +} + +// Expand returns a Reader, from which keys can be read, using the given +// pseudorandom key and optional context info, skipping the extraction step. +// +// The pseudorandomKey should have been generated by Extract, or be a uniformly +// random or pseudorandom cryptographically strong key. See RFC 5869, Section +// 3.3. Most common scenarios will want to use New instead. +func Expand(hash func() hash.Hash, pseudorandomKey, info []byte) io.Reader { + expander := hmac.New(hash, pseudorandomKey) + return &hkdf{expander, expander.Size(), info, 1, nil, nil} +} + +// New returns a Reader, from which keys can be read, using the given hash, +// secret, salt and context info. Salt and info can be nil. +func New(hash func() hash.Hash, secret, salt, info []byte) io.Reader { + prk := Extract(hash, secret, salt) + return Expand(hash, prk, info) +} diff --git a/vendor/golang.org/x/crypto/internal/alias/alias.go b/vendor/golang.org/x/crypto/internal/alias/alias.go new file mode 100644 index 0000000..551ff0c --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/alias/alias.go @@ -0,0 +1,31 @@ +// Copyright 2018 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 !purego + +// Package alias implements memory aliasing tests. +package alias + +import "unsafe" + +// AnyOverlap reports whether x and y share memory at any (not necessarily +// corresponding) index. The memory beyond the slice length is ignored. +func AnyOverlap(x, y []byte) bool { + return len(x) > 0 && len(y) > 0 && + uintptr(unsafe.Pointer(&x[0])) <= uintptr(unsafe.Pointer(&y[len(y)-1])) && + uintptr(unsafe.Pointer(&y[0])) <= uintptr(unsafe.Pointer(&x[len(x)-1])) +} + +// InexactOverlap reports whether x and y share memory at any non-corresponding +// index. The memory beyond the slice length is ignored. Note that x and y can +// have different lengths and still not have any inexact overlap. +// +// InexactOverlap can be used to implement the requirements of the crypto/cipher +// AEAD, Block, BlockMode and Stream interfaces. +func InexactOverlap(x, y []byte) bool { + if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { + return false + } + return AnyOverlap(x, y) +} diff --git a/vendor/golang.org/x/crypto/internal/alias/alias_purego.go b/vendor/golang.org/x/crypto/internal/alias/alias_purego.go new file mode 100644 index 0000000..6fe61b5 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/alias/alias_purego.go @@ -0,0 +1,34 @@ +// Copyright 2018 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 purego + +// Package alias implements memory aliasing tests. +package alias + +// This is the Google App Engine standard variant based on reflect +// because the unsafe package and cgo are disallowed. + +import "reflect" + +// AnyOverlap reports whether x and y share memory at any (not necessarily +// corresponding) index. The memory beyond the slice length is ignored. +func AnyOverlap(x, y []byte) bool { + return len(x) > 0 && len(y) > 0 && + reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() && + reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer() +} + +// InexactOverlap reports whether x and y share memory at any non-corresponding +// index. The memory beyond the slice length is ignored. Note that x and y can +// have different lengths and still not have any inexact overlap. +// +// InexactOverlap can be used to implement the requirements of the crypto/cipher +// AEAD, Block, BlockMode and Stream interfaces. +func InexactOverlap(x, y []byte) bool { + if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { + return false + } + return AnyOverlap(x, y) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go b/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go new file mode 100644 index 0000000..333da28 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go @@ -0,0 +1,9 @@ +// Copyright 2018 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 && !ppc64le && !s390x) || !gc || purego + +package poly1305 + +type mac struct{ macGeneric } diff --git a/vendor/golang.org/x/crypto/internal/poly1305/poly1305.go b/vendor/golang.org/x/crypto/internal/poly1305/poly1305.go new file mode 100644 index 0000000..4aaea81 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/poly1305.go @@ -0,0 +1,99 @@ +// Copyright 2012 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 poly1305 implements Poly1305 one-time message authentication code as +// specified in https://cr.yp.to/mac/poly1305-20050329.pdf. +// +// Poly1305 is a fast, one-time authentication function. It is infeasible for an +// attacker to generate an authenticator for a message without the key. However, a +// key must only be used for a single message. Authenticating two different +// messages with the same key allows an attacker to forge authenticators for other +// messages with the same key. +// +// Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was +// used with a fixed key in order to generate one-time keys from an nonce. +// However, in this package AES isn't used and the one-time key is specified +// directly. +package poly1305 + +import "crypto/subtle" + +// TagSize is the size, in bytes, of a poly1305 authenticator. +const TagSize = 16 + +// Sum generates an authenticator for msg using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + h := New(key) + h.Write(m) + h.Sum(out[:0]) +} + +// Verify returns true if mac is a valid authenticator for m with the given key. +func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { + var tmp [16]byte + Sum(&tmp, m, key) + return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 +} + +// New returns a new MAC computing an authentication +// tag of all data written to it with the given key. +// This allows writing the message progressively instead +// of passing it as a single slice. Common users should use +// the Sum function instead. +// +// The key must be unique for each message, as authenticating +// two different messages with the same key allows an attacker +// to forge messages at will. +func New(key *[32]byte) *MAC { + m := &MAC{} + initialize(key, &m.macState) + return m +} + +// MAC is an io.Writer computing an authentication tag +// of the data written to it. +// +// MAC cannot be used like common hash.Hash implementations, +// because using a poly1305 key twice breaks its security. +// Therefore writing data to a running MAC after calling +// Sum or Verify causes it to panic. +type MAC struct { + mac // platform-dependent implementation + + finalized bool +} + +// Size returns the number of bytes Sum will return. +func (h *MAC) Size() int { return TagSize } + +// Write adds more data to the running message authentication code. +// It never returns an error. +// +// It must not be called after the first call of Sum or Verify. +func (h *MAC) Write(p []byte) (n int, err error) { + if h.finalized { + panic("poly1305: write to MAC after Sum or Verify") + } + return h.mac.Write(p) +} + +// Sum computes the authenticator of all data written to the +// message authentication code. +func (h *MAC) Sum(b []byte) []byte { + var mac [TagSize]byte + h.mac.Sum(&mac) + h.finalized = true + return append(b, mac[:]...) +} + +// Verify returns whether the authenticator of all data written to +// the message authentication code matches the expected value. +func (h *MAC) Verify(expected []byte) bool { + var mac [TagSize]byte + h.mac.Sum(&mac) + h.finalized = true + return subtle.ConstantTimeCompare(expected, mac[:]) == 1 +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go new file mode 100644 index 0000000..164cd47 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go @@ -0,0 +1,47 @@ +// Copyright 2012 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 gc && !purego + +package poly1305 + +//go:noescape +func update(state *macState, msg []byte) + +// mac is a wrapper for macGeneric that redirects calls that would have gone to +// updateGeneric to update. +// +// Its Write and Sum methods are otherwise identical to the macGeneric ones, but +// using function pointers would carry a major performance cost. +type mac struct{ macGeneric } + +func (h *mac) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < TagSize { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + update(&h.macState, h.buffer[:]) + } + if n := len(p) - (len(p) % TagSize); n > 0 { + update(&h.macState, p[:n]) + p = p[n:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return nn, nil +} + +func (h *mac) Sum(out *[16]byte) { + state := h.macState + if h.offset > 0 { + update(&state, h.buffer[:h.offset]) + } + finalize(out, &state.h, &state.s) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s new file mode 100644 index 0000000..e0d3c64 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s @@ -0,0 +1,108 @@ +// Copyright 2012 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 gc && !purego + +#include "textflag.h" + +#define POLY1305_ADD(msg, h0, h1, h2) \ + ADDQ 0(msg), h0; \ + ADCQ 8(msg), h1; \ + ADCQ $1, h2; \ + LEAQ 16(msg), msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ + MOVQ r0, AX; \ + MULQ h0; \ + MOVQ AX, t0; \ + MOVQ DX, t1; \ + MOVQ r0, AX; \ + MULQ h1; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ r0, t2; \ + IMULQ h2, t2; \ + ADDQ DX, t2; \ + \ + MOVQ r1, AX; \ + MULQ h0; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ DX, h0; \ + MOVQ r1, t3; \ + IMULQ h2, t3; \ + MOVQ r1, AX; \ + MULQ h1; \ + ADDQ AX, t2; \ + ADCQ DX, t3; \ + ADDQ h0, t2; \ + ADCQ $0, t3; \ + \ + MOVQ t0, h0; \ + MOVQ t1, h1; \ + MOVQ t2, h2; \ + ANDQ $3, h2; \ + MOVQ t2, t0; \ + ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ + ADDQ t0, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2; \ + SHRQ $2, t3, t2; \ + SHRQ $2, t3; \ + ADDQ t2, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2 + +// func update(state *[7]uint64, msg []byte) +TEXT ·update(SB), $0-32 + MOVQ state+0(FP), DI + MOVQ msg_base+8(FP), SI + MOVQ msg_len+16(FP), R15 + + MOVQ 0(DI), R8 // h0 + MOVQ 8(DI), R9 // h1 + MOVQ 16(DI), R10 // h2 + MOVQ 24(DI), R11 // r0 + MOVQ 32(DI), R12 // r1 + + CMPQ R15, $16 + JB bytes_between_0_and_15 + +loop: + POLY1305_ADD(SI, R8, R9, R10) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) + SUBQ $16, R15 + CMPQ R15, $16 + JAE loop + +bytes_between_0_and_15: + TESTQ R15, R15 + JZ done + MOVQ $1, BX + XORQ CX, CX + XORQ R13, R13 + ADDQ R15, SI + +flush_buffer: + SHLQ $8, BX, CX + SHLQ $8, BX + MOVB -1(SI), R13 + XORQ R13, BX + DECQ SI + DECQ R15 + JNZ flush_buffer + + ADDQ BX, R8 + ADCQ CX, R9 + ADCQ $0, R10 + MOVQ $16, R15 + JMP multiply + +done: + MOVQ R8, 0(DI) + MOVQ R9, 8(DI) + MOVQ R10, 16(DI) + RET diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go new file mode 100644 index 0000000..ec2202b --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go @@ -0,0 +1,312 @@ +// Copyright 2018 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. + +// This file provides the generic implementation of Sum and MAC. Other files +// might provide optimized assembly implementations of some of this code. + +package poly1305 + +import ( + "encoding/binary" + "math/bits" +) + +// Poly1305 [RFC 7539] is a relatively simple algorithm: the authentication tag +// for a 64 bytes message is approximately +// +// s + m[0:16] * r⁴ + m[16:32] * r³ + m[32:48] * r² + m[48:64] * r mod 2¹³⁰ - 5 +// +// for some secret r and s. It can be computed sequentially like +// +// for len(msg) > 0: +// h += read(msg, 16) +// h *= r +// h %= 2¹³⁰ - 5 +// return h + s +// +// All the complexity is about doing performant constant-time math on numbers +// larger than any available numeric type. + +func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) { + h := newMACGeneric(key) + h.Write(msg) + h.Sum(out) +} + +func newMACGeneric(key *[32]byte) macGeneric { + m := macGeneric{} + initialize(key, &m.macState) + return m +} + +// macState holds numbers in saturated 64-bit little-endian limbs. That is, +// the value of [x0, x1, x2] is x[0] + x[1] * 2⁶⁴ + x[2] * 2¹²⁸. +type macState struct { + // h is the main accumulator. It is to be interpreted modulo 2¹³⁰ - 5, but + // can grow larger during and after rounds. It must, however, remain below + // 2 * (2¹³⁰ - 5). + h [3]uint64 + // r and s are the private key components. + r [2]uint64 + s [2]uint64 +} + +type macGeneric struct { + macState + + buffer [TagSize]byte + offset int +} + +// Write splits the incoming message into TagSize chunks, and passes them to +// update. It buffers incomplete chunks. +func (h *macGeneric) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < TagSize { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + updateGeneric(&h.macState, h.buffer[:]) + } + if n := len(p) - (len(p) % TagSize); n > 0 { + updateGeneric(&h.macState, p[:n]) + p = p[n:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return nn, nil +} + +// Sum flushes the last incomplete chunk from the buffer, if any, and generates +// the MAC output. It does not modify its state, in order to allow for multiple +// calls to Sum, even if no Write is allowed after Sum. +func (h *macGeneric) Sum(out *[TagSize]byte) { + state := h.macState + if h.offset > 0 { + updateGeneric(&state, h.buffer[:h.offset]) + } + finalize(out, &state.h, &state.s) +} + +// [rMask0, rMask1] is the specified Poly1305 clamping mask in little-endian. It +// clears some bits of the secret coefficient to make it possible to implement +// multiplication more efficiently. +const ( + rMask0 = 0x0FFFFFFC0FFFFFFF + rMask1 = 0x0FFFFFFC0FFFFFFC +) + +// initialize loads the 256-bit key into the two 128-bit secret values r and s. +func initialize(key *[32]byte, m *macState) { + m.r[0] = binary.LittleEndian.Uint64(key[0:8]) & rMask0 + m.r[1] = binary.LittleEndian.Uint64(key[8:16]) & rMask1 + m.s[0] = binary.LittleEndian.Uint64(key[16:24]) + m.s[1] = binary.LittleEndian.Uint64(key[24:32]) +} + +// uint128 holds a 128-bit number as two 64-bit limbs, for use with the +// bits.Mul64 and bits.Add64 intrinsics. +type uint128 struct { + lo, hi uint64 +} + +func mul64(a, b uint64) uint128 { + hi, lo := bits.Mul64(a, b) + return uint128{lo, hi} +} + +func add128(a, b uint128) uint128 { + lo, c := bits.Add64(a.lo, b.lo, 0) + hi, c := bits.Add64(a.hi, b.hi, c) + if c != 0 { + panic("poly1305: unexpected overflow") + } + return uint128{lo, hi} +} + +func shiftRightBy2(a uint128) uint128 { + a.lo = a.lo>>2 | (a.hi&3)<<62 + a.hi = a.hi >> 2 + return a +} + +// updateGeneric absorbs msg into the state.h accumulator. For each chunk m of +// 128 bits of message, it computes +// +// h₊ = (h + m) * r mod 2¹³⁰ - 5 +// +// If the msg length is not a multiple of TagSize, it assumes the last +// incomplete chunk is the final one. +func updateGeneric(state *macState, msg []byte) { + h0, h1, h2 := state.h[0], state.h[1], state.h[2] + r0, r1 := state.r[0], state.r[1] + + for len(msg) > 0 { + var c uint64 + + // For the first step, h + m, we use a chain of bits.Add64 intrinsics. + // The resulting value of h might exceed 2¹³⁰ - 5, but will be partially + // reduced at the end of the multiplication below. + // + // The spec requires us to set a bit just above the message size, not to + // hide leading zeroes. For full chunks, that's 1 << 128, so we can just + // add 1 to the most significant (2¹²⁸) limb, h2. + if len(msg) >= TagSize { + h0, c = bits.Add64(h0, binary.LittleEndian.Uint64(msg[0:8]), 0) + h1, c = bits.Add64(h1, binary.LittleEndian.Uint64(msg[8:16]), c) + h2 += c + 1 + + msg = msg[TagSize:] + } else { + var buf [TagSize]byte + copy(buf[:], msg) + buf[len(msg)] = 1 + + h0, c = bits.Add64(h0, binary.LittleEndian.Uint64(buf[0:8]), 0) + h1, c = bits.Add64(h1, binary.LittleEndian.Uint64(buf[8:16]), c) + h2 += c + + msg = nil + } + + // Multiplication of big number limbs is similar to elementary school + // columnar multiplication. Instead of digits, there are 64-bit limbs. + // + // We are multiplying a 3 limbs number, h, by a 2 limbs number, r. + // + // h2 h1 h0 x + // r1 r0 = + // ---------------- + // h2r0 h1r0 h0r0 <-- individual 128-bit products + // + h2r1 h1r1 h0r1 + // ------------------------ + // m3 m2 m1 m0 <-- result in 128-bit overlapping limbs + // ------------------------ + // m3.hi m2.hi m1.hi m0.hi <-- carry propagation + // + m3.lo m2.lo m1.lo m0.lo + // ------------------------------- + // t4 t3 t2 t1 t0 <-- final result in 64-bit limbs + // + // The main difference from pen-and-paper multiplication is that we do + // carry propagation in a separate step, as if we wrote two digit sums + // at first (the 128-bit limbs), and then carried the tens all at once. + + h0r0 := mul64(h0, r0) + h1r0 := mul64(h1, r0) + h2r0 := mul64(h2, r0) + h0r1 := mul64(h0, r1) + h1r1 := mul64(h1, r1) + h2r1 := mul64(h2, r1) + + // Since h2 is known to be at most 7 (5 + 1 + 1), and r0 and r1 have their + // top 4 bits cleared by rMask{0,1}, we know that their product is not going + // to overflow 64 bits, so we can ignore the high part of the products. + // + // This also means that the product doesn't have a fifth limb (t4). + if h2r0.hi != 0 { + panic("poly1305: unexpected overflow") + } + if h2r1.hi != 0 { + panic("poly1305: unexpected overflow") + } + + m0 := h0r0 + m1 := add128(h1r0, h0r1) // These two additions don't overflow thanks again + m2 := add128(h2r0, h1r1) // to the 4 masked bits at the top of r0 and r1. + m3 := h2r1 + + t0 := m0.lo + t1, c := bits.Add64(m1.lo, m0.hi, 0) + t2, c := bits.Add64(m2.lo, m1.hi, c) + t3, _ := bits.Add64(m3.lo, m2.hi, c) + + // Now we have the result as 4 64-bit limbs, and we need to reduce it + // modulo 2¹³⁰ - 5. The special shape of this Crandall prime lets us do + // a cheap partial reduction according to the reduction identity + // + // c * 2¹³⁰ + n = c * 5 + n mod 2¹³⁰ - 5 + // + // because 2¹³⁰ = 5 mod 2¹³⁰ - 5. Partial reduction since the result is + // likely to be larger than 2¹³⁰ - 5, but still small enough to fit the + // assumptions we make about h in the rest of the code. + // + // See also https://speakerdeck.com/gtank/engineering-prime-numbers?slide=23 + + // We split the final result at the 2¹³⁰ mark into h and cc, the carry. + // Note that the carry bits are effectively shifted left by 2, in other + // words, cc = c * 4 for the c in the reduction identity. + h0, h1, h2 = t0, t1, t2&maskLow2Bits + cc := uint128{t2 & maskNotLow2Bits, t3} + + // To add c * 5 to h, we first add cc = c * 4, and then add (cc >> 2) = c. + + h0, c = bits.Add64(h0, cc.lo, 0) + h1, c = bits.Add64(h1, cc.hi, c) + h2 += c + + cc = shiftRightBy2(cc) + + h0, c = bits.Add64(h0, cc.lo, 0) + h1, c = bits.Add64(h1, cc.hi, c) + h2 += c + + // h2 is at most 3 + 1 + 1 = 5, making the whole of h at most + // + // 5 * 2¹²⁸ + (2¹²⁸ - 1) = 6 * 2¹²⁸ - 1 + } + + state.h[0], state.h[1], state.h[2] = h0, h1, h2 +} + +const ( + maskLow2Bits uint64 = 0x0000000000000003 + maskNotLow2Bits uint64 = ^maskLow2Bits +) + +// select64 returns x if v == 1 and y if v == 0, in constant time. +func select64(v, x, y uint64) uint64 { return ^(v-1)&x | (v-1)&y } + +// [p0, p1, p2] is 2¹³⁰ - 5 in little endian order. +const ( + p0 = 0xFFFFFFFFFFFFFFFB + p1 = 0xFFFFFFFFFFFFFFFF + p2 = 0x0000000000000003 +) + +// finalize completes the modular reduction of h and computes +// +// out = h + s mod 2¹²⁸ +func finalize(out *[TagSize]byte, h *[3]uint64, s *[2]uint64) { + h0, h1, h2 := h[0], h[1], h[2] + + // After the partial reduction in updateGeneric, h might be more than + // 2¹³⁰ - 5, but will be less than 2 * (2¹³⁰ - 5). To complete the reduction + // in constant time, we compute t = h - (2¹³⁰ - 5), and select h as the + // result if the subtraction underflows, and t otherwise. + + hMinusP0, b := bits.Sub64(h0, p0, 0) + hMinusP1, b := bits.Sub64(h1, p1, b) + _, b = bits.Sub64(h2, p2, b) + + // h = h if h < p else h - p + h0 = select64(b, h0, hMinusP0) + h1 = select64(b, h1, hMinusP1) + + // Finally, we compute the last Poly1305 step + // + // tag = h + s mod 2¹²⁸ + // + // by just doing a wide addition with the 128 low bits of h and discarding + // the overflow. + h0, c := bits.Add64(h0, s[0], 0) + h1, _ = bits.Add64(h1, s[1], c) + + binary.LittleEndian.PutUint64(out[0:8], h0) + binary.LittleEndian.PutUint64(out[8:16], h1) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go new file mode 100644 index 0000000..4aec487 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go @@ -0,0 +1,47 @@ +// Copyright 2019 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 gc && !purego + +package poly1305 + +//go:noescape +func update(state *macState, msg []byte) + +// mac is a wrapper for macGeneric that redirects calls that would have gone to +// updateGeneric to update. +// +// Its Write and Sum methods are otherwise identical to the macGeneric ones, but +// using function pointers would carry a major performance cost. +type mac struct{ macGeneric } + +func (h *mac) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < TagSize { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + update(&h.macState, h.buffer[:]) + } + if n := len(p) - (len(p) % TagSize); n > 0 { + update(&h.macState, p[:n]) + p = p[n:] + } + if len(p) > 0 { + h.offset += copy(h.buffer[h.offset:], p) + } + return nn, nil +} + +func (h *mac) Sum(out *[16]byte) { + state := h.macState + if h.offset > 0 { + update(&state, h.buffer[:h.offset]) + } + finalize(out, &state.h, &state.s) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s new file mode 100644 index 0000000..b3c1699 --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s @@ -0,0 +1,179 @@ +// Copyright 2019 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 gc && !purego + +#include "textflag.h" + +// This was ported from the amd64 implementation. + +#define POLY1305_ADD(msg, h0, h1, h2, t0, t1, t2) \ + MOVD (msg), t0; \ + MOVD 8(msg), t1; \ + MOVD $1, t2; \ + ADDC t0, h0, h0; \ + ADDE t1, h1, h1; \ + ADDE t2, h2; \ + ADD $16, msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3, t4, t5) \ + MULLD r0, h0, t0; \ + MULHDU r0, h0, t1; \ + MULLD r0, h1, t4; \ + MULHDU r0, h1, t5; \ + ADDC t4, t1, t1; \ + MULLD r0, h2, t2; \ + MULHDU r1, h0, t4; \ + MULLD r1, h0, h0; \ + ADDE t5, t2, t2; \ + ADDC h0, t1, t1; \ + MULLD h2, r1, t3; \ + ADDZE t4, h0; \ + MULHDU r1, h1, t5; \ + MULLD r1, h1, t4; \ + ADDC t4, t2, t2; \ + ADDE t5, t3, t3; \ + ADDC h0, t2, t2; \ + MOVD $-4, t4; \ + ADDZE t3; \ + RLDICL $0, t2, $62, h2; \ + AND t2, t4, h0; \ + ADDC t0, h0, h0; \ + ADDE t3, t1, h1; \ + SLD $62, t3, t4; \ + SRD $2, t2; \ + ADDZE h2; \ + OR t4, t2, t2; \ + SRD $2, t3; \ + ADDC t2, h0, h0; \ + ADDE t3, h1, h1; \ + ADDZE h2 + +DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +GLOBL ·poly1305Mask<>(SB), RODATA, $16 + +// func update(state *[7]uint64, msg []byte) +TEXT ·update(SB), $0-32 + MOVD state+0(FP), R3 + MOVD msg_base+8(FP), R4 + MOVD msg_len+16(FP), R5 + + MOVD 0(R3), R8 // h0 + MOVD 8(R3), R9 // h1 + MOVD 16(R3), R10 // h2 + MOVD 24(R3), R11 // r0 + MOVD 32(R3), R12 // r1 + + CMP R5, $16 + BLT bytes_between_0_and_15 + +loop: + POLY1305_ADD(R4, R8, R9, R10, R20, R21, R22) + + PCALIGN $16 +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, R16, R17, R18, R14, R20, R21) + ADD $-16, R5 + CMP R5, $16 + BGE loop + +bytes_between_0_and_15: + CMP R5, $0 + BEQ done + MOVD $0, R16 // h0 + MOVD $0, R17 // h1 + +flush_buffer: + CMP R5, $8 + BLE just1 + + MOVD $8, R21 + SUB R21, R5, R21 + + // Greater than 8 -- load the rightmost remaining bytes in msg + // and put into R17 (h1) + MOVD (R4)(R21), R17 + MOVD $16, R22 + + // Find the offset to those bytes + SUB R5, R22, R22 + SLD $3, R22 + + // Shift to get only the bytes in msg + SRD R22, R17, R17 + + // Put 1 at high end + MOVD $1, R23 + SLD $3, R21 + SLD R21, R23, R23 + OR R23, R17, R17 + + // Remainder is 8 + MOVD $8, R5 + +just1: + CMP R5, $8 + BLT less8 + + // Exactly 8 + MOVD (R4), R16 + + CMP R17, $0 + + // Check if we've already set R17; if not + // set 1 to indicate end of msg. + BNE carry + MOVD $1, R17 + BR carry + +less8: + MOVD $0, R16 // h0 + MOVD $0, R22 // shift count + CMP R5, $4 + BLT less4 + MOVWZ (R4), R16 + ADD $4, R4 + ADD $-4, R5 + MOVD $32, R22 + +less4: + CMP R5, $2 + BLT less2 + MOVHZ (R4), R21 + SLD R22, R21, R21 + OR R16, R21, R16 + ADD $16, R22 + ADD $-2, R5 + ADD $2, R4 + +less2: + CMP R5, $0 + BEQ insert1 + MOVBZ (R4), R21 + SLD R22, R21, R21 + OR R16, R21, R16 + ADD $8, R22 + +insert1: + // Insert 1 at end of msg + MOVD $1, R21 + SLD R22, R21, R21 + OR R16, R21, R16 + +carry: + // Add new values to h0, h1, h2 + ADDC R16, R8 + ADDE R17, R9 + ADDZE R10, R10 + MOVD $16, R5 + ADD R5, R4 + BR multiply + +done: + // Save h0, h1, h2 in state + MOVD R8, 0(R3) + MOVD R9, 8(R3) + MOVD R10, 16(R3) + RET diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go new file mode 100644 index 0000000..e1d033a --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go @@ -0,0 +1,76 @@ +// Copyright 2018 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 gc && !purego + +package poly1305 + +import ( + "golang.org/x/sys/cpu" +) + +// updateVX is an assembly implementation of Poly1305 that uses vector +// instructions. It must only be called if the vector facility (vx) is +// available. +// +//go:noescape +func updateVX(state *macState, msg []byte) + +// mac is a replacement for macGeneric that uses a larger buffer and redirects +// calls that would have gone to updateGeneric to updateVX if the vector +// facility is installed. +// +// A larger buffer is required for good performance because the vector +// implementation has a higher fixed cost per call than the generic +// implementation. +type mac struct { + macState + + buffer [16 * TagSize]byte // size must be a multiple of block size (16) + offset int +} + +func (h *mac) Write(p []byte) (int, error) { + nn := len(p) + if h.offset > 0 { + n := copy(h.buffer[h.offset:], p) + if h.offset+n < len(h.buffer) { + h.offset += n + return nn, nil + } + p = p[n:] + h.offset = 0 + if cpu.S390X.HasVX { + updateVX(&h.macState, h.buffer[:]) + } else { + updateGeneric(&h.macState, h.buffer[:]) + } + } + + tail := len(p) % len(h.buffer) // number of bytes to copy into buffer + body := len(p) - tail // number of bytes to process now + if body > 0 { + if cpu.S390X.HasVX { + updateVX(&h.macState, p[:body]) + } else { + updateGeneric(&h.macState, p[:body]) + } + } + h.offset = copy(h.buffer[:], p[body:]) // copy tail bytes - can be 0 + return nn, nil +} + +func (h *mac) Sum(out *[TagSize]byte) { + state := h.macState + remainder := h.buffer[:h.offset] + + // Use the generic implementation if we have 2 or fewer blocks left + // to sum. The vector implementation has a higher startup time. + if cpu.S390X.HasVX && len(remainder) > 2*TagSize { + updateVX(&state, remainder) + } else if len(remainder) > 0 { + updateGeneric(&state, remainder) + } + finalize(out, &state.h, &state.s) +} diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s new file mode 100644 index 0000000..0fe3a7c --- /dev/null +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s @@ -0,0 +1,503 @@ +// Copyright 2018 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 gc && !purego + +#include "textflag.h" + +// This implementation of Poly1305 uses the vector facility (vx) +// to process up to 2 blocks (32 bytes) per iteration using an +// algorithm based on the one described in: +// +// NEON crypto, Daniel J. Bernstein & Peter Schwabe +// https://cryptojedi.org/papers/neoncrypto-20120320.pdf +// +// This algorithm uses 5 26-bit limbs to represent a 130-bit +// value. These limbs are, for the most part, zero extended and +// placed into 64-bit vector register elements. Each vector +// register is 128-bits wide and so holds 2 of these elements. +// Using 26-bit limbs allows us plenty of headroom to accommodate +// accumulations before and after multiplication without +// overflowing either 32-bits (before multiplication) or 64-bits +// (after multiplication). +// +// In order to parallelise the operations required to calculate +// the sum we use two separate accumulators and then sum those +// in an extra final step. For compatibility with the generic +// implementation we perform this summation at the end of every +// updateVX call. +// +// To use two accumulators we must multiply the message blocks +// by r² rather than r. Only the final message block should be +// multiplied by r. +// +// Example: +// +// We want to calculate the sum (h) for a 64 byte message (m): +// +// h = m[0:16]r⁴ + m[16:32]r³ + m[32:48]r² + m[48:64]r +// +// To do this we split the calculation into the even indices +// and odd indices of the message. These form our SIMD 'lanes': +// +// h = m[ 0:16]r⁴ + m[32:48]r² + <- lane 0 +// m[16:32]r³ + m[48:64]r <- lane 1 +// +// To calculate this iteratively we refactor so that both lanes +// are written in terms of r² and r: +// +// h = (m[ 0:16]r² + m[32:48])r² + <- lane 0 +// (m[16:32]r² + m[48:64])r <- lane 1 +// ^ ^ +// | coefficients for second iteration +// coefficients for first iteration +// +// So in this case we would have two iterations. In the first +// both lanes are multiplied by r². In the second only the +// first lane is multiplied by r² and the second lane is +// instead multiplied by r. This gives use the odd and even +// powers of r that we need from the original equation. +// +// Notation: +// +// h - accumulator +// r - key +// m - message +// +// [a, b] - SIMD register holding two 64-bit values +// [a, b, c, d] - SIMD register holding four 32-bit values +// xᵢ[n] - limb n of variable x with bit width i +// +// Limbs are expressed in little endian order, so for 26-bit +// limbs x₂₆[4] will be the most significant limb and x₂₆[0] +// will be the least significant limb. + +// masking constants +#define MOD24 V0 // [0x0000000000ffffff, 0x0000000000ffffff] - mask low 24-bits +#define MOD26 V1 // [0x0000000003ffffff, 0x0000000003ffffff] - mask low 26-bits + +// expansion constants (see EXPAND macro) +#define EX0 V2 +#define EX1 V3 +#define EX2 V4 + +// key (r², r or 1 depending on context) +#define R_0 V5 +#define R_1 V6 +#define R_2 V7 +#define R_3 V8 +#define R_4 V9 + +// precalculated coefficients (5r², 5r or 0 depending on context) +#define R5_1 V10 +#define R5_2 V11 +#define R5_3 V12 +#define R5_4 V13 + +// message block (m) +#define M_0 V14 +#define M_1 V15 +#define M_2 V16 +#define M_3 V17 +#define M_4 V18 + +// accumulator (h) +#define H_0 V19 +#define H_1 V20 +#define H_2 V21 +#define H_3 V22 +#define H_4 V23 + +// temporary registers (for short-lived values) +#define T_0 V24 +#define T_1 V25 +#define T_2 V26 +#define T_3 V27 +#define T_4 V28 + +GLOBL ·constants<>(SB), RODATA, $0x30 +// EX0 +DATA ·constants<>+0x00(SB)/8, $0x0006050403020100 +DATA ·constants<>+0x08(SB)/8, $0x1016151413121110 +// EX1 +DATA ·constants<>+0x10(SB)/8, $0x060c0b0a09080706 +DATA ·constants<>+0x18(SB)/8, $0x161c1b1a19181716 +// EX2 +DATA ·constants<>+0x20(SB)/8, $0x0d0d0d0d0d0f0e0d +DATA ·constants<>+0x28(SB)/8, $0x1d1d1d1d1d1f1e1d + +// MULTIPLY multiplies each lane of f and g, partially reduced +// modulo 2¹³⁰ - 5. The result, h, consists of partial products +// in each lane that need to be reduced further to produce the +// final result. +// +// h₁₃₀ = (f₁₃₀g₁₃₀) % 2¹³⁰ + (5f₁₃₀g₁₃₀) / 2¹³⁰ +// +// Note that the multiplication by 5 of the high bits is +// achieved by precalculating the multiplication of four of the +// g coefficients by 5. These are g51-g54. +#define MULTIPLY(f0, f1, f2, f3, f4, g0, g1, g2, g3, g4, g51, g52, g53, g54, h0, h1, h2, h3, h4) \ + VMLOF f0, g0, h0 \ + VMLOF f0, g3, h3 \ + VMLOF f0, g1, h1 \ + VMLOF f0, g4, h4 \ + VMLOF f0, g2, h2 \ + VMLOF f1, g54, T_0 \ + VMLOF f1, g2, T_3 \ + VMLOF f1, g0, T_1 \ + VMLOF f1, g3, T_4 \ + VMLOF f1, g1, T_2 \ + VMALOF f2, g53, h0, h0 \ + VMALOF f2, g1, h3, h3 \ + VMALOF f2, g54, h1, h1 \ + VMALOF f2, g2, h4, h4 \ + VMALOF f2, g0, h2, h2 \ + VMALOF f3, g52, T_0, T_0 \ + VMALOF f3, g0, T_3, T_3 \ + VMALOF f3, g53, T_1, T_1 \ + VMALOF f3, g1, T_4, T_4 \ + VMALOF f3, g54, T_2, T_2 \ + VMALOF f4, g51, h0, h0 \ + VMALOF f4, g54, h3, h3 \ + VMALOF f4, g52, h1, h1 \ + VMALOF f4, g0, h4, h4 \ + VMALOF f4, g53, h2, h2 \ + VAG T_0, h0, h0 \ + VAG T_3, h3, h3 \ + VAG T_1, h1, h1 \ + VAG T_4, h4, h4 \ + VAG T_2, h2, h2 + +// REDUCE performs the following carry operations in four +// stages, as specified in Bernstein & Schwabe: +// +// 1: h₂₆[0]->h₂₆[1] h₂₆[3]->h₂₆[4] +// 2: h₂₆[1]->h₂₆[2] h₂₆[4]->h₂₆[0] +// 3: h₂₆[0]->h₂₆[1] h₂₆[2]->h₂₆[3] +// 4: h₂₆[3]->h₂₆[4] +// +// The result is that all of the limbs are limited to 26-bits +// except for h₂₆[1] and h₂₆[4] which are limited to 27-bits. +// +// Note that although each limb is aligned at 26-bit intervals +// they may contain values that exceed 2²⁶ - 1, hence the need +// to carry the excess bits in each limb. +#define REDUCE(h0, h1, h2, h3, h4) \ + VESRLG $26, h0, T_0 \ + VESRLG $26, h3, T_1 \ + VN MOD26, h0, h0 \ + VN MOD26, h3, h3 \ + VAG T_0, h1, h1 \ + VAG T_1, h4, h4 \ + VESRLG $26, h1, T_2 \ + VESRLG $26, h4, T_3 \ + VN MOD26, h1, h1 \ + VN MOD26, h4, h4 \ + VESLG $2, T_3, T_4 \ + VAG T_3, T_4, T_4 \ + VAG T_2, h2, h2 \ + VAG T_4, h0, h0 \ + VESRLG $26, h2, T_0 \ + VESRLG $26, h0, T_1 \ + VN MOD26, h2, h2 \ + VN MOD26, h0, h0 \ + VAG T_0, h3, h3 \ + VAG T_1, h1, h1 \ + VESRLG $26, h3, T_2 \ + VN MOD26, h3, h3 \ + VAG T_2, h4, h4 + +// EXPAND splits the 128-bit little-endian values in0 and in1 +// into 26-bit big-endian limbs and places the results into +// the first and second lane of d₂₆[0:4] respectively. +// +// The EX0, EX1 and EX2 constants are arrays of byte indices +// for permutation. The permutation both reverses the bytes +// in the input and ensures the bytes are copied into the +// destination limb ready to be shifted into their final +// position. +#define EXPAND(in0, in1, d0, d1, d2, d3, d4) \ + VPERM in0, in1, EX0, d0 \ + VPERM in0, in1, EX1, d2 \ + VPERM in0, in1, EX2, d4 \ + VESRLG $26, d0, d1 \ + VESRLG $30, d2, d3 \ + VESRLG $4, d2, d2 \ + VN MOD26, d0, d0 \ // [in0₂₆[0], in1₂₆[0]] + VN MOD26, d3, d3 \ // [in0₂₆[3], in1₂₆[3]] + VN MOD26, d1, d1 \ // [in0₂₆[1], in1₂₆[1]] + VN MOD24, d4, d4 \ // [in0₂₆[4], in1₂₆[4]] + VN MOD26, d2, d2 // [in0₂₆[2], in1₂₆[2]] + +// func updateVX(state *macState, msg []byte) +TEXT ·updateVX(SB), NOSPLIT, $0 + MOVD state+0(FP), R1 + LMG msg+8(FP), R2, R3 // R2=msg_base, R3=msg_len + + // load EX0, EX1 and EX2 + MOVD $·constants<>(SB), R5 + VLM (R5), EX0, EX2 + + // generate masks + VGMG $(64-24), $63, MOD24 // [0x00ffffff, 0x00ffffff] + VGMG $(64-26), $63, MOD26 // [0x03ffffff, 0x03ffffff] + + // load h (accumulator) and r (key) from state + VZERO T_1 // [0, 0] + VL 0(R1), T_0 // [h₆₄[0], h₆₄[1]] + VLEG $0, 16(R1), T_1 // [h₆₄[2], 0] + VL 24(R1), T_2 // [r₆₄[0], r₆₄[1]] + VPDI $0, T_0, T_2, T_3 // [h₆₄[0], r₆₄[0]] + VPDI $5, T_0, T_2, T_4 // [h₆₄[1], r₆₄[1]] + + // unpack h and r into 26-bit limbs + // note: h₆₄[2] may have the low 3 bits set, so h₂₆[4] is a 27-bit value + VN MOD26, T_3, H_0 // [h₂₆[0], r₂₆[0]] + VZERO H_1 // [0, 0] + VZERO H_3 // [0, 0] + VGMG $(64-12-14), $(63-12), T_0 // [0x03fff000, 0x03fff000] - 26-bit mask with low 12 bits masked out + VESLG $24, T_1, T_1 // [h₆₄[2]<<24, 0] + VERIMG $-26&63, T_3, MOD26, H_1 // [h₂₆[1], r₂₆[1]] + VESRLG $+52&63, T_3, H_2 // [h₂₆[2], r₂₆[2]] - low 12 bits only + VERIMG $-14&63, T_4, MOD26, H_3 // [h₂₆[1], r₂₆[1]] + VESRLG $40, T_4, H_4 // [h₂₆[4], r₂₆[4]] - low 24 bits only + VERIMG $+12&63, T_4, T_0, H_2 // [h₂₆[2], r₂₆[2]] - complete + VO T_1, H_4, H_4 // [h₂₆[4], r₂₆[4]] - complete + + // replicate r across all 4 vector elements + VREPF $3, H_0, R_0 // [r₂₆[0], r₂₆[0], r₂₆[0], r₂₆[0]] + VREPF $3, H_1, R_1 // [r₂₆[1], r₂₆[1], r₂₆[1], r₂₆[1]] + VREPF $3, H_2, R_2 // [r₂₆[2], r₂₆[2], r₂₆[2], r₂₆[2]] + VREPF $3, H_3, R_3 // [r₂₆[3], r₂₆[3], r₂₆[3], r₂₆[3]] + VREPF $3, H_4, R_4 // [r₂₆[4], r₂₆[4], r₂₆[4], r₂₆[4]] + + // zero out lane 1 of h + VLEIG $1, $0, H_0 // [h₂₆[0], 0] + VLEIG $1, $0, H_1 // [h₂₆[1], 0] + VLEIG $1, $0, H_2 // [h₂₆[2], 0] + VLEIG $1, $0, H_3 // [h₂₆[3], 0] + VLEIG $1, $0, H_4 // [h₂₆[4], 0] + + // calculate 5r (ignore least significant limb) + VREPIF $5, T_0 + VMLF T_0, R_1, R5_1 // [5r₂₆[1], 5r₂₆[1], 5r₂₆[1], 5r₂₆[1]] + VMLF T_0, R_2, R5_2 // [5r₂₆[2], 5r₂₆[2], 5r₂₆[2], 5r₂₆[2]] + VMLF T_0, R_3, R5_3 // [5r₂₆[3], 5r₂₆[3], 5r₂₆[3], 5r₂₆[3]] + VMLF T_0, R_4, R5_4 // [5r₂₆[4], 5r₂₆[4], 5r₂₆[4], 5r₂₆[4]] + + // skip r² calculation if we are only calculating one block + CMPBLE R3, $16, skip + + // calculate r² + MULTIPLY(R_0, R_1, R_2, R_3, R_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, M_0, M_1, M_2, M_3, M_4) + REDUCE(M_0, M_1, M_2, M_3, M_4) + VGBM $0x0f0f, T_0 + VERIMG $0, M_0, T_0, R_0 // [r₂₆[0], r²₂₆[0], r₂₆[0], r²₂₆[0]] + VERIMG $0, M_1, T_0, R_1 // [r₂₆[1], r²₂₆[1], r₂₆[1], r²₂₆[1]] + VERIMG $0, M_2, T_0, R_2 // [r₂₆[2], r²₂₆[2], r₂₆[2], r²₂₆[2]] + VERIMG $0, M_3, T_0, R_3 // [r₂₆[3], r²₂₆[3], r₂₆[3], r²₂₆[3]] + VERIMG $0, M_4, T_0, R_4 // [r₂₆[4], r²₂₆[4], r₂₆[4], r²₂₆[4]] + + // calculate 5r² (ignore least significant limb) + VREPIF $5, T_0 + VMLF T_0, R_1, R5_1 // [5r₂₆[1], 5r²₂₆[1], 5r₂₆[1], 5r²₂₆[1]] + VMLF T_0, R_2, R5_2 // [5r₂₆[2], 5r²₂₆[2], 5r₂₆[2], 5r²₂₆[2]] + VMLF T_0, R_3, R5_3 // [5r₂₆[3], 5r²₂₆[3], 5r₂₆[3], 5r²₂₆[3]] + VMLF T_0, R_4, R5_4 // [5r₂₆[4], 5r²₂₆[4], 5r₂₆[4], 5r²₂₆[4]] + +loop: + CMPBLE R3, $32, b2 // 2 or fewer blocks remaining, need to change key coefficients + + // load next 2 blocks from message + VLM (R2), T_0, T_1 + + // update message slice + SUB $32, R3 + MOVD $32(R2), R2 + + // unpack message blocks into 26-bit big-endian limbs + EXPAND(T_0, T_1, M_0, M_1, M_2, M_3, M_4) + + // add 2¹²⁸ to each message block value + VLEIB $4, $1, M_4 + VLEIB $12, $1, M_4 + +multiply: + // accumulate the incoming message + VAG H_0, M_0, M_0 + VAG H_3, M_3, M_3 + VAG H_1, M_1, M_1 + VAG H_4, M_4, M_4 + VAG H_2, M_2, M_2 + + // multiply the accumulator by the key coefficient + MULTIPLY(M_0, M_1, M_2, M_3, M_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, H_0, H_1, H_2, H_3, H_4) + + // carry and partially reduce the partial products + REDUCE(H_0, H_1, H_2, H_3, H_4) + + CMPBNE R3, $0, loop + +finish: + // sum lane 0 and lane 1 and put the result in lane 1 + VZERO T_0 + VSUMQG H_0, T_0, H_0 + VSUMQG H_3, T_0, H_3 + VSUMQG H_1, T_0, H_1 + VSUMQG H_4, T_0, H_4 + VSUMQG H_2, T_0, H_2 + + // reduce again after summation + // TODO(mundaym): there might be a more efficient way to do this + // now that we only have 1 active lane. For example, we could + // simultaneously pack the values as we reduce them. + REDUCE(H_0, H_1, H_2, H_3, H_4) + + // carry h[1] through to h[4] so that only h[4] can exceed 2²⁶ - 1 + // TODO(mundaym): in testing this final carry was unnecessary. + // Needs a proof before it can be removed though. + VESRLG $26, H_1, T_1 + VN MOD26, H_1, H_1 + VAQ T_1, H_2, H_2 + VESRLG $26, H_2, T_2 + VN MOD26, H_2, H_2 + VAQ T_2, H_3, H_3 + VESRLG $26, H_3, T_3 + VN MOD26, H_3, H_3 + VAQ T_3, H_4, H_4 + + // h is now < 2(2¹³⁰ - 5) + // Pack each lane in h₂₆[0:4] into h₁₂₈[0:1]. + VESLG $26, H_1, H_1 + VESLG $26, H_3, H_3 + VO H_0, H_1, H_0 + VO H_2, H_3, H_2 + VESLG $4, H_2, H_2 + VLEIB $7, $48, H_1 + VSLB H_1, H_2, H_2 + VO H_0, H_2, H_0 + VLEIB $7, $104, H_1 + VSLB H_1, H_4, H_3 + VO H_3, H_0, H_0 + VLEIB $7, $24, H_1 + VSRLB H_1, H_4, H_1 + + // update state + VSTEG $1, H_0, 0(R1) + VSTEG $0, H_0, 8(R1) + VSTEG $1, H_1, 16(R1) + RET + +b2: // 2 or fewer blocks remaining + CMPBLE R3, $16, b1 + + // Load the 2 remaining blocks (17-32 bytes remaining). + MOVD $-17(R3), R0 // index of final byte to load modulo 16 + VL (R2), T_0 // load full 16 byte block + VLL R0, 16(R2), T_1 // load final (possibly partial) block and pad with zeros to 16 bytes + + // The Poly1305 algorithm requires that a 1 bit be appended to + // each message block. If the final block is less than 16 bytes + // long then it is easiest to insert the 1 before the message + // block is split into 26-bit limbs. If, on the other hand, the + // final message block is 16 bytes long then we append the 1 bit + // after expansion as normal. + MOVBZ $1, R0 + MOVD $-16(R3), R3 // index of byte in last block to insert 1 at (could be 16) + CMPBEQ R3, $16, 2(PC) // skip the insertion if the final block is 16 bytes long + VLVGB R3, R0, T_1 // insert 1 into the byte at index R3 + + // Split both blocks into 26-bit limbs in the appropriate lanes. + EXPAND(T_0, T_1, M_0, M_1, M_2, M_3, M_4) + + // Append a 1 byte to the end of the second to last block. + VLEIB $4, $1, M_4 + + // Append a 1 byte to the end of the last block only if it is a + // full 16 byte block. + CMPBNE R3, $16, 2(PC) + VLEIB $12, $1, M_4 + + // Finally, set up the coefficients for the final multiplication. + // We have previously saved r and 5r in the 32-bit even indexes + // of the R_[0-4] and R5_[1-4] coefficient registers. + // + // We want lane 0 to be multiplied by r² so that can be kept the + // same. We want lane 1 to be multiplied by r so we need to move + // the saved r value into the 32-bit odd index in lane 1 by + // rotating the 64-bit lane by 32. + VGBM $0x00ff, T_0 // [0, 0xffffffffffffffff] - mask lane 1 only + VERIMG $32, R_0, T_0, R_0 // [_, r²₂₆[0], _, r₂₆[0]] + VERIMG $32, R_1, T_0, R_1 // [_, r²₂₆[1], _, r₂₆[1]] + VERIMG $32, R_2, T_0, R_2 // [_, r²₂₆[2], _, r₂₆[2]] + VERIMG $32, R_3, T_0, R_3 // [_, r²₂₆[3], _, r₂₆[3]] + VERIMG $32, R_4, T_0, R_4 // [_, r²₂₆[4], _, r₂₆[4]] + VERIMG $32, R5_1, T_0, R5_1 // [_, 5r²₂₆[1], _, 5r₂₆[1]] + VERIMG $32, R5_2, T_0, R5_2 // [_, 5r²₂₆[2], _, 5r₂₆[2]] + VERIMG $32, R5_3, T_0, R5_3 // [_, 5r²₂₆[3], _, 5r₂₆[3]] + VERIMG $32, R5_4, T_0, R5_4 // [_, 5r²₂₆[4], _, 5r₂₆[4]] + + MOVD $0, R3 + BR multiply + +skip: + CMPBEQ R3, $0, finish + +b1: // 1 block remaining + + // Load the final block (1-16 bytes). This will be placed into + // lane 0. + MOVD $-1(R3), R0 + VLL R0, (R2), T_0 // pad to 16 bytes with zeros + + // The Poly1305 algorithm requires that a 1 bit be appended to + // each message block. If the final block is less than 16 bytes + // long then it is easiest to insert the 1 before the message + // block is split into 26-bit limbs. If, on the other hand, the + // final message block is 16 bytes long then we append the 1 bit + // after expansion as normal. + MOVBZ $1, R0 + CMPBEQ R3, $16, 2(PC) + VLVGB R3, R0, T_0 + + // Set the message block in lane 1 to the value 0 so that it + // can be accumulated without affecting the final result. + VZERO T_1 + + // Split the final message block into 26-bit limbs in lane 0. + // Lane 1 will be contain 0. + EXPAND(T_0, T_1, M_0, M_1, M_2, M_3, M_4) + + // Append a 1 byte to the end of the last block only if it is a + // full 16 byte block. + CMPBNE R3, $16, 2(PC) + VLEIB $4, $1, M_4 + + // We have previously saved r and 5r in the 32-bit even indexes + // of the R_[0-4] and R5_[1-4] coefficient registers. + // + // We want lane 0 to be multiplied by r so we need to move the + // saved r value into the 32-bit odd index in lane 0. We want + // lane 1 to be set to the value 1. This makes multiplication + // a no-op. We do this by setting lane 1 in every register to 0 + // and then just setting the 32-bit index 3 in R_0 to 1. + VZERO T_0 + MOVD $0, R0 + MOVD $0x10111213, R12 + VLVGP R12, R0, T_1 // [_, 0x10111213, _, 0x00000000] + VPERM T_0, R_0, T_1, R_0 // [_, r₂₆[0], _, 0] + VPERM T_0, R_1, T_1, R_1 // [_, r₂₆[1], _, 0] + VPERM T_0, R_2, T_1, R_2 // [_, r₂₆[2], _, 0] + VPERM T_0, R_3, T_1, R_3 // [_, r₂₆[3], _, 0] + VPERM T_0, R_4, T_1, R_4 // [_, r₂₆[4], _, 0] + VPERM T_0, R5_1, T_1, R5_1 // [_, 5r₂₆[1], _, 0] + VPERM T_0, R5_2, T_1, R5_2 // [_, 5r₂₆[2], _, 0] + VPERM T_0, R5_3, T_1, R5_3 // [_, 5r₂₆[3], _, 0] + VPERM T_0, R5_4, T_1, R5_4 // [_, 5r₂₆[4], _, 0] + + // Set the value of lane 1 to be 1. + VLEIF $3, $1, R_0 // [_, r₂₆[0], _, 1] + + MOVD $0, R3 + BR multiply diff --git a/vendor/golang.org/x/sys/LICENSE b/vendor/golang.org/x/sys/LICENSE new file mode 100644 index 0000000..6a66aea --- /dev/null +++ b/vendor/golang.org/x/sys/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/vendor/golang.org/x/sys/PATENTS b/vendor/golang.org/x/sys/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/vendor/golang.org/x/sys/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s new file mode 100644 index 0000000..269e173 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s @@ -0,0 +1,17 @@ +// Copyright 2018 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 gc + +#include "textflag.h" + +// +// System calls for ppc64, AIX are implemented in runtime/syscall_aix.go +// + +TEXT ·syscall6(SB),NOSPLIT,$0-88 + JMP syscall·syscall6(SB) + +TEXT ·rawSyscall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSyscall6(SB) diff --git a/vendor/golang.org/x/sys/cpu/byteorder.go b/vendor/golang.org/x/sys/cpu/byteorder.go new file mode 100644 index 0000000..271055b --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/byteorder.go @@ -0,0 +1,66 @@ +// Copyright 2019 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 cpu + +import ( + "runtime" +) + +// byteOrder is a subset of encoding/binary.ByteOrder. +type byteOrder interface { + Uint32([]byte) uint32 + Uint64([]byte) uint64 +} + +type littleEndian struct{} +type bigEndian struct{} + +func (littleEndian) Uint32(b []byte) uint32 { + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func (littleEndian) Uint64(b []byte) uint64 { + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func (bigEndian) Uint32(b []byte) uint32 { + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 +} + +func (bigEndian) Uint64(b []byte) uint64 { + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | + uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 +} + +// hostByteOrder returns littleEndian on little-endian machines and +// bigEndian on big-endian machines. +func hostByteOrder() byteOrder { + switch runtime.GOARCH { + case "386", "amd64", "amd64p32", + "alpha", + "arm", "arm64", + "loong64", + "mipsle", "mips64le", "mips64p32le", + "nios2", + "ppc64le", + "riscv", "riscv64", + "sh": + return littleEndian{} + case "armbe", "arm64be", + "m68k", + "mips", "mips64", "mips64p32", + "ppc", "ppc64", + "s390", "s390x", + "shbe", + "sparc", "sparc64": + return bigEndian{} + } + panic("unknown architecture") +} diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go new file mode 100644 index 0000000..4756ad5 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu.go @@ -0,0 +1,290 @@ +// Copyright 2018 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 cpu implements processor feature detection for +// various CPU architectures. +package cpu + +import ( + "os" + "strings" +) + +// Initialized reports whether the CPU features were initialized. +// +// For some GOOS/GOARCH combinations initialization of the CPU features depends +// on reading an operating specific file, e.g. /proc/self/auxv on linux/arm +// Initialized will report false if reading the file fails. +var Initialized bool + +// CacheLinePad is used to pad structs to avoid false sharing. +type CacheLinePad struct{ _ [cacheLineSize]byte } + +// X86 contains the supported CPU features of the +// current X86/AMD64 platform. If the current platform +// is not X86/AMD64 then all feature flags are false. +// +// X86 is padded to avoid false sharing. Further the HasAVX +// and HasAVX2 are only set if the OS supports XMM and YMM +// registers in addition to the CPUID feature bit being set. +var X86 struct { + _ CacheLinePad + HasAES bool // AES hardware implementation (AES NI) + HasADX bool // Multi-precision add-carry instruction extensions + HasAVX bool // Advanced vector extension + HasAVX2 bool // Advanced vector extension 2 + HasAVX512 bool // Advanced vector extension 512 + HasAVX512F bool // Advanced vector extension 512 Foundation Instructions + HasAVX512CD bool // Advanced vector extension 512 Conflict Detection Instructions + HasAVX512ER bool // Advanced vector extension 512 Exponential and Reciprocal Instructions + HasAVX512PF bool // Advanced vector extension 512 Prefetch Instructions + HasAVX512VL bool // Advanced vector extension 512 Vector Length Extensions + HasAVX512BW bool // Advanced vector extension 512 Byte and Word Instructions + HasAVX512DQ bool // Advanced vector extension 512 Doubleword and Quadword Instructions + HasAVX512IFMA bool // Advanced vector extension 512 Integer Fused Multiply Add + HasAVX512VBMI bool // Advanced vector extension 512 Vector Byte Manipulation Instructions + HasAVX5124VNNIW bool // Advanced vector extension 512 Vector Neural Network Instructions Word variable precision + HasAVX5124FMAPS bool // Advanced vector extension 512 Fused Multiply Accumulation Packed Single precision + HasAVX512VPOPCNTDQ bool // Advanced vector extension 512 Double and quad word population count instructions + HasAVX512VPCLMULQDQ bool // Advanced vector extension 512 Vector carry-less multiply operations + HasAVX512VNNI bool // Advanced vector extension 512 Vector Neural Network Instructions + HasAVX512GFNI bool // Advanced vector extension 512 Galois field New Instructions + HasAVX512VAES bool // Advanced vector extension 512 Vector AES instructions + HasAVX512VBMI2 bool // Advanced vector extension 512 Vector Byte Manipulation Instructions 2 + HasAVX512BITALG bool // Advanced vector extension 512 Bit Algorithms + HasAVX512BF16 bool // Advanced vector extension 512 BFloat16 Instructions + HasAMXTile bool // Advanced Matrix Extension Tile instructions + HasAMXInt8 bool // Advanced Matrix Extension Int8 instructions + HasAMXBF16 bool // Advanced Matrix Extension BFloat16 instructions + HasBMI1 bool // Bit manipulation instruction set 1 + HasBMI2 bool // Bit manipulation instruction set 2 + HasCX16 bool // Compare and exchange 16 Bytes + HasERMS bool // Enhanced REP for MOVSB and STOSB + HasFMA bool // Fused-multiply-add instructions + HasOSXSAVE bool // OS supports XSAVE/XRESTOR for saving/restoring XMM registers. + HasPCLMULQDQ bool // PCLMULQDQ instruction - most often used for AES-GCM + HasPOPCNT bool // Hamming weight instruction POPCNT. + HasRDRAND bool // RDRAND instruction (on-chip random number generator) + HasRDSEED bool // RDSEED instruction (on-chip random number generator) + HasSSE2 bool // Streaming SIMD extension 2 (always available on amd64) + HasSSE3 bool // Streaming SIMD extension 3 + HasSSSE3 bool // Supplemental streaming SIMD extension 3 + HasSSE41 bool // Streaming SIMD extension 4 and 4.1 + HasSSE42 bool // Streaming SIMD extension 4 and 4.2 + _ CacheLinePad +} + +// ARM64 contains the supported CPU features of the +// current ARMv8(aarch64) platform. If the current platform +// is not arm64 then all feature flags are false. +var ARM64 struct { + _ CacheLinePad + HasFP bool // Floating-point instruction set (always available) + HasASIMD bool // Advanced SIMD (always available) + HasEVTSTRM bool // Event stream support + HasAES bool // AES hardware implementation + HasPMULL bool // Polynomial multiplication instruction set + HasSHA1 bool // SHA1 hardware implementation + HasSHA2 bool // SHA2 hardware implementation + HasCRC32 bool // CRC32 hardware implementation + HasATOMICS bool // Atomic memory operation instruction set + HasFPHP bool // Half precision floating-point instruction set + HasASIMDHP bool // Advanced SIMD half precision instruction set + HasCPUID bool // CPUID identification scheme registers + HasASIMDRDM bool // Rounding double multiply add/subtract instruction set + HasJSCVT bool // Javascript conversion from floating-point to integer + HasFCMA bool // Floating-point multiplication and addition of complex numbers + HasLRCPC bool // Release Consistent processor consistent support + HasDCPOP bool // Persistent memory support + HasSHA3 bool // SHA3 hardware implementation + HasSM3 bool // SM3 hardware implementation + HasSM4 bool // SM4 hardware implementation + HasASIMDDP bool // Advanced SIMD double precision instruction set + HasSHA512 bool // SHA512 hardware implementation + HasSVE bool // Scalable Vector Extensions + HasASIMDFHM bool // Advanced SIMD multiplication FP16 to FP32 + _ CacheLinePad +} + +// ARM contains the supported CPU features of the current ARM (32-bit) platform. +// All feature flags are false if: +// 1. the current platform is not arm, or +// 2. the current operating system is not Linux. +var ARM struct { + _ CacheLinePad + HasSWP bool // SWP instruction support + HasHALF bool // Half-word load and store support + HasTHUMB bool // ARM Thumb instruction set + Has26BIT bool // Address space limited to 26-bits + HasFASTMUL bool // 32-bit operand, 64-bit result multiplication support + HasFPA bool // Floating point arithmetic support + HasVFP bool // Vector floating point support + HasEDSP bool // DSP Extensions support + HasJAVA bool // Java instruction set + HasIWMMXT bool // Intel Wireless MMX technology support + HasCRUNCH bool // MaverickCrunch context switching and handling + HasTHUMBEE bool // Thumb EE instruction set + HasNEON bool // NEON instruction set + HasVFPv3 bool // Vector floating point version 3 support + HasVFPv3D16 bool // Vector floating point version 3 D8-D15 + HasTLS bool // Thread local storage support + HasVFPv4 bool // Vector floating point version 4 support + HasIDIVA bool // Integer divide instruction support in ARM mode + HasIDIVT bool // Integer divide instruction support in Thumb mode + HasVFPD32 bool // Vector floating point version 3 D15-D31 + HasLPAE bool // Large Physical Address Extensions + HasEVTSTRM bool // Event stream support + HasAES bool // AES hardware implementation + HasPMULL bool // Polynomial multiplication instruction set + HasSHA1 bool // SHA1 hardware implementation + HasSHA2 bool // SHA2 hardware implementation + HasCRC32 bool // CRC32 hardware implementation + _ CacheLinePad +} + +// MIPS64X contains the supported CPU features of the current mips64/mips64le +// platforms. If the current platform is not mips64/mips64le or the current +// operating system is not Linux then all feature flags are false. +var MIPS64X struct { + _ CacheLinePad + HasMSA bool // MIPS SIMD architecture + _ CacheLinePad +} + +// PPC64 contains the supported CPU features of the current ppc64/ppc64le platforms. +// If the current platform is not ppc64/ppc64le then all feature flags are false. +// +// For ppc64/ppc64le, it is safe to check only for ISA level starting on ISA v3.00, +// since there are no optional categories. There are some exceptions that also +// require kernel support to work (DARN, SCV), so there are feature bits for +// those as well. The struct is padded to avoid false sharing. +var PPC64 struct { + _ CacheLinePad + HasDARN bool // Hardware random number generator (requires kernel enablement) + HasSCV bool // Syscall vectored (requires kernel enablement) + IsPOWER8 bool // ISA v2.07 (POWER8) + IsPOWER9 bool // ISA v3.00 (POWER9), implies IsPOWER8 + _ CacheLinePad +} + +// S390X contains the supported CPU features of the current IBM Z +// (s390x) platform. If the current platform is not IBM Z then all +// feature flags are false. +// +// S390X is padded to avoid false sharing. Further HasVX is only set +// if the OS supports vector registers in addition to the STFLE +// feature bit being set. +var S390X struct { + _ CacheLinePad + HasZARCH bool // z/Architecture mode is active [mandatory] + HasSTFLE bool // store facility list extended + HasLDISP bool // long (20-bit) displacements + HasEIMM bool // 32-bit immediates + HasDFP bool // decimal floating point + HasETF3EH bool // ETF-3 enhanced + HasMSA bool // message security assist (CPACF) + HasAES bool // KM-AES{128,192,256} functions + HasAESCBC bool // KMC-AES{128,192,256} functions + HasAESCTR bool // KMCTR-AES{128,192,256} functions + HasAESGCM bool // KMA-GCM-AES{128,192,256} functions + HasGHASH bool // KIMD-GHASH function + HasSHA1 bool // K{I,L}MD-SHA-1 functions + HasSHA256 bool // K{I,L}MD-SHA-256 functions + HasSHA512 bool // K{I,L}MD-SHA-512 functions + HasSHA3 bool // K{I,L}MD-SHA3-{224,256,384,512} and K{I,L}MD-SHAKE-{128,256} functions + HasVX bool // vector facility + HasVXE bool // vector-enhancements facility 1 + _ CacheLinePad +} + +func init() { + archInit() + initOptions() + processOptions() +} + +// options contains the cpu debug options that can be used in GODEBUG. +// Options are arch dependent and are added by the arch specific initOptions functions. +// Features that are mandatory for the specific GOARCH should have the Required field set +// (e.g. SSE2 on amd64). +var options []option + +// Option names should be lower case. e.g. avx instead of AVX. +type option struct { + Name string + Feature *bool + Specified bool // whether feature value was specified in GODEBUG + Enable bool // whether feature should be enabled + Required bool // whether feature is mandatory and can not be disabled +} + +func processOptions() { + env := os.Getenv("GODEBUG") +field: + for env != "" { + field := "" + i := strings.IndexByte(env, ',') + if i < 0 { + field, env = env, "" + } else { + field, env = env[:i], env[i+1:] + } + if len(field) < 4 || field[:4] != "cpu." { + continue + } + i = strings.IndexByte(field, '=') + if i < 0 { + print("GODEBUG sys/cpu: no value specified for \"", field, "\"\n") + continue + } + key, value := field[4:i], field[i+1:] // e.g. "SSE2", "on" + + var enable bool + switch value { + case "on": + enable = true + case "off": + enable = false + default: + print("GODEBUG sys/cpu: value \"", value, "\" not supported for cpu option \"", key, "\"\n") + continue field + } + + if key == "all" { + for i := range options { + options[i].Specified = true + options[i].Enable = enable || options[i].Required + } + continue field + } + + for i := range options { + if options[i].Name == key { + options[i].Specified = true + options[i].Enable = enable + continue field + } + } + + print("GODEBUG sys/cpu: unknown cpu feature \"", key, "\"\n") + } + + for _, o := range options { + if !o.Specified { + continue + } + + if o.Enable && !*o.Feature { + print("GODEBUG sys/cpu: can not enable \"", o.Name, "\", missing CPU support\n") + continue + } + + if !o.Enable && o.Required { + print("GODEBUG sys/cpu: can not disable \"", o.Name, "\", required CPU feature\n") + continue + } + + *o.Feature = o.Enable + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_aix.go b/vendor/golang.org/x/sys/cpu/cpu_aix.go new file mode 100644 index 0000000..9bf0c32 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_aix.go @@ -0,0 +1,33 @@ +// Copyright 2019 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 aix + +package cpu + +const ( + // getsystemcfg constants + _SC_IMPL = 2 + _IMPL_POWER8 = 0x10000 + _IMPL_POWER9 = 0x20000 +) + +func archInit() { + impl := getsystemcfg(_SC_IMPL) + if impl&_IMPL_POWER8 != 0 { + PPC64.IsPOWER8 = true + } + if impl&_IMPL_POWER9 != 0 { + PPC64.IsPOWER8 = true + PPC64.IsPOWER9 = true + } + + Initialized = true +} + +func getsystemcfg(label int) (n uint64) { + r0, _ := callgetsystemcfg(label) + n = uint64(r0) + return +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm.go b/vendor/golang.org/x/sys/cpu/cpu_arm.go new file mode 100644 index 0000000..301b752 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm.go @@ -0,0 +1,73 @@ +// Copyright 2018 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 cpu + +const cacheLineSize = 32 + +// HWCAP/HWCAP2 bits. +// These are specific to Linux. +const ( + hwcap_SWP = 1 << 0 + hwcap_HALF = 1 << 1 + hwcap_THUMB = 1 << 2 + hwcap_26BIT = 1 << 3 + hwcap_FAST_MULT = 1 << 4 + hwcap_FPA = 1 << 5 + hwcap_VFP = 1 << 6 + hwcap_EDSP = 1 << 7 + hwcap_JAVA = 1 << 8 + hwcap_IWMMXT = 1 << 9 + hwcap_CRUNCH = 1 << 10 + hwcap_THUMBEE = 1 << 11 + hwcap_NEON = 1 << 12 + hwcap_VFPv3 = 1 << 13 + hwcap_VFPv3D16 = 1 << 14 + hwcap_TLS = 1 << 15 + hwcap_VFPv4 = 1 << 16 + hwcap_IDIVA = 1 << 17 + hwcap_IDIVT = 1 << 18 + hwcap_VFPD32 = 1 << 19 + hwcap_LPAE = 1 << 20 + hwcap_EVTSTRM = 1 << 21 + + hwcap2_AES = 1 << 0 + hwcap2_PMULL = 1 << 1 + hwcap2_SHA1 = 1 << 2 + hwcap2_SHA2 = 1 << 3 + hwcap2_CRC32 = 1 << 4 +) + +func initOptions() { + options = []option{ + {Name: "pmull", Feature: &ARM.HasPMULL}, + {Name: "sha1", Feature: &ARM.HasSHA1}, + {Name: "sha2", Feature: &ARM.HasSHA2}, + {Name: "swp", Feature: &ARM.HasSWP}, + {Name: "thumb", Feature: &ARM.HasTHUMB}, + {Name: "thumbee", Feature: &ARM.HasTHUMBEE}, + {Name: "tls", Feature: &ARM.HasTLS}, + {Name: "vfp", Feature: &ARM.HasVFP}, + {Name: "vfpd32", Feature: &ARM.HasVFPD32}, + {Name: "vfpv3", Feature: &ARM.HasVFPv3}, + {Name: "vfpv3d16", Feature: &ARM.HasVFPv3D16}, + {Name: "vfpv4", Feature: &ARM.HasVFPv4}, + {Name: "half", Feature: &ARM.HasHALF}, + {Name: "26bit", Feature: &ARM.Has26BIT}, + {Name: "fastmul", Feature: &ARM.HasFASTMUL}, + {Name: "fpa", Feature: &ARM.HasFPA}, + {Name: "edsp", Feature: &ARM.HasEDSP}, + {Name: "java", Feature: &ARM.HasJAVA}, + {Name: "iwmmxt", Feature: &ARM.HasIWMMXT}, + {Name: "crunch", Feature: &ARM.HasCRUNCH}, + {Name: "neon", Feature: &ARM.HasNEON}, + {Name: "idivt", Feature: &ARM.HasIDIVT}, + {Name: "idiva", Feature: &ARM.HasIDIVA}, + {Name: "lpae", Feature: &ARM.HasLPAE}, + {Name: "evtstrm", Feature: &ARM.HasEVTSTRM}, + {Name: "aes", Feature: &ARM.HasAES}, + {Name: "crc32", Feature: &ARM.HasCRC32}, + } + +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_arm64.go new file mode 100644 index 0000000..f3eb993 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.go @@ -0,0 +1,172 @@ +// Copyright 2019 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 cpu + +import "runtime" + +// cacheLineSize is used to prevent false sharing of cache lines. +// We choose 128 because Apple Silicon, a.k.a. M1, has 128-byte cache line size. +// It doesn't cost much and is much more future-proof. +const cacheLineSize = 128 + +func initOptions() { + options = []option{ + {Name: "fp", Feature: &ARM64.HasFP}, + {Name: "asimd", Feature: &ARM64.HasASIMD}, + {Name: "evstrm", Feature: &ARM64.HasEVTSTRM}, + {Name: "aes", Feature: &ARM64.HasAES}, + {Name: "fphp", Feature: &ARM64.HasFPHP}, + {Name: "jscvt", Feature: &ARM64.HasJSCVT}, + {Name: "lrcpc", Feature: &ARM64.HasLRCPC}, + {Name: "pmull", Feature: &ARM64.HasPMULL}, + {Name: "sha1", Feature: &ARM64.HasSHA1}, + {Name: "sha2", Feature: &ARM64.HasSHA2}, + {Name: "sha3", Feature: &ARM64.HasSHA3}, + {Name: "sha512", Feature: &ARM64.HasSHA512}, + {Name: "sm3", Feature: &ARM64.HasSM3}, + {Name: "sm4", Feature: &ARM64.HasSM4}, + {Name: "sve", Feature: &ARM64.HasSVE}, + {Name: "crc32", Feature: &ARM64.HasCRC32}, + {Name: "atomics", Feature: &ARM64.HasATOMICS}, + {Name: "asimdhp", Feature: &ARM64.HasASIMDHP}, + {Name: "cpuid", Feature: &ARM64.HasCPUID}, + {Name: "asimrdm", Feature: &ARM64.HasASIMDRDM}, + {Name: "fcma", Feature: &ARM64.HasFCMA}, + {Name: "dcpop", Feature: &ARM64.HasDCPOP}, + {Name: "asimddp", Feature: &ARM64.HasASIMDDP}, + {Name: "asimdfhm", Feature: &ARM64.HasASIMDFHM}, + } +} + +func archInit() { + switch runtime.GOOS { + case "freebsd": + readARM64Registers() + case "linux", "netbsd", "openbsd": + doinit() + default: + // Many platforms don't seem to allow reading these registers. + setMinimalFeatures() + } +} + +// setMinimalFeatures fakes the minimal ARM64 features expected by +// TestARM64minimalFeatures. +func setMinimalFeatures() { + ARM64.HasASIMD = true + ARM64.HasFP = true +} + +func readARM64Registers() { + Initialized = true + + parseARM64SystemRegisters(getisar0(), getisar1(), getpfr0()) +} + +func parseARM64SystemRegisters(isar0, isar1, pfr0 uint64) { + // ID_AA64ISAR0_EL1 + switch extractBits(isar0, 4, 7) { + case 1: + ARM64.HasAES = true + case 2: + ARM64.HasAES = true + ARM64.HasPMULL = true + } + + switch extractBits(isar0, 8, 11) { + case 1: + ARM64.HasSHA1 = true + } + + switch extractBits(isar0, 12, 15) { + case 1: + ARM64.HasSHA2 = true + case 2: + ARM64.HasSHA2 = true + ARM64.HasSHA512 = true + } + + switch extractBits(isar0, 16, 19) { + case 1: + ARM64.HasCRC32 = true + } + + switch extractBits(isar0, 20, 23) { + case 2: + ARM64.HasATOMICS = true + } + + switch extractBits(isar0, 28, 31) { + case 1: + ARM64.HasASIMDRDM = true + } + + switch extractBits(isar0, 32, 35) { + case 1: + ARM64.HasSHA3 = true + } + + switch extractBits(isar0, 36, 39) { + case 1: + ARM64.HasSM3 = true + } + + switch extractBits(isar0, 40, 43) { + case 1: + ARM64.HasSM4 = true + } + + switch extractBits(isar0, 44, 47) { + case 1: + ARM64.HasASIMDDP = true + } + + // ID_AA64ISAR1_EL1 + switch extractBits(isar1, 0, 3) { + case 1: + ARM64.HasDCPOP = true + } + + switch extractBits(isar1, 12, 15) { + case 1: + ARM64.HasJSCVT = true + } + + switch extractBits(isar1, 16, 19) { + case 1: + ARM64.HasFCMA = true + } + + switch extractBits(isar1, 20, 23) { + case 1: + ARM64.HasLRCPC = true + } + + // ID_AA64PFR0_EL1 + switch extractBits(pfr0, 16, 19) { + case 0: + ARM64.HasFP = true + case 1: + ARM64.HasFP = true + ARM64.HasFPHP = true + } + + switch extractBits(pfr0, 20, 23) { + case 0: + ARM64.HasASIMD = true + case 1: + ARM64.HasASIMD = true + ARM64.HasASIMDHP = true + } + + switch extractBits(pfr0, 32, 35) { + case 1: + ARM64.HasSVE = true + } +} + +func extractBits(data uint64, start, end uint) uint { + return (uint)(data>>start) & ((1 << (end - start + 1)) - 1) +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.s b/vendor/golang.org/x/sys/cpu/cpu_arm64.s new file mode 100644 index 0000000..fcb9a38 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.s @@ -0,0 +1,31 @@ +// Copyright 2019 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 gc + +#include "textflag.h" + +// func getisar0() uint64 +TEXT ·getisar0(SB),NOSPLIT,$0-8 + // get Instruction Set Attributes 0 into x0 + // mrs x0, ID_AA64ISAR0_EL1 = d5380600 + WORD $0xd5380600 + MOVD R0, ret+0(FP) + RET + +// func getisar1() uint64 +TEXT ·getisar1(SB),NOSPLIT,$0-8 + // get Instruction Set Attributes 1 into x0 + // mrs x0, ID_AA64ISAR1_EL1 = d5380620 + WORD $0xd5380620 + MOVD R0, ret+0(FP) + RET + +// func getpfr0() uint64 +TEXT ·getpfr0(SB),NOSPLIT,$0-8 + // get Processor Feature Register 0 into x0 + // mrs x0, ID_AA64PFR0_EL1 = d5380400 + WORD $0xd5380400 + MOVD R0, ret+0(FP) + RET diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go new file mode 100644 index 0000000..a8acd3e --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go @@ -0,0 +1,11 @@ +// Copyright 2019 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 gc + +package cpu + +func getisar0() uint64 +func getisar1() uint64 +func getpfr0() uint64 diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go new file mode 100644 index 0000000..c8ae6dd --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go @@ -0,0 +1,21 @@ +// Copyright 2019 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 gc + +package cpu + +// haveAsmFunctions reports whether the other functions in this file can +// be safely called. +func haveAsmFunctions() bool { return true } + +// The following feature detection functions are defined in cpu_s390x.s. +// They are likely to be expensive to call so the results should be cached. +func stfle() facilityList +func kmQuery() queryResult +func kmcQuery() queryResult +func kmctrQuery() queryResult +func kmaQuery() queryResult +func kimdQuery() queryResult +func klmdQuery() queryResult diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go new file mode 100644 index 0000000..910728f --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go @@ -0,0 +1,15 @@ +// Copyright 2018 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 (386 || amd64 || amd64p32) && gc + +package cpu + +// cpuid is implemented in cpu_x86.s for gc compiler +// and in cpu_gccgo.c for gccgo. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in cpu_x86.s for gc compiler +// and in cpu_gccgo.c for gccgo. +func xgetbv() (eax, edx uint32) diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go new file mode 100644 index 0000000..7f19467 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go @@ -0,0 +1,11 @@ +// Copyright 2019 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 gccgo + +package cpu + +func getisar0() uint64 { return 0 } +func getisar1() uint64 { return 0 } +func getpfr0() uint64 { return 0 } diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go new file mode 100644 index 0000000..9526d2c --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go @@ -0,0 +1,22 @@ +// Copyright 2019 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 gccgo + +package cpu + +// haveAsmFunctions reports whether the other functions in this file can +// be safely called. +func haveAsmFunctions() bool { return false } + +// TODO(mundaym): the following feature detection functions are currently +// stubs. See https://golang.org/cl/162887 for how to fix this. +// They are likely to be expensive to call so the results should be cached. +func stfle() facilityList { panic("not implemented for gccgo") } +func kmQuery() queryResult { panic("not implemented for gccgo") } +func kmcQuery() queryResult { panic("not implemented for gccgo") } +func kmctrQuery() queryResult { panic("not implemented for gccgo") } +func kmaQuery() queryResult { panic("not implemented for gccgo") } +func kimdQuery() queryResult { panic("not implemented for gccgo") } +func klmdQuery() queryResult { panic("not implemented for gccgo") } diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c new file mode 100644 index 0000000..3f73a05 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c @@ -0,0 +1,37 @@ +// Copyright 2018 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 (386 || amd64 || amd64p32) && gccgo + +#include +#include +#include + +// Need to wrap __get_cpuid_count because it's declared as static. +int +gccgoGetCpuidCount(uint32_t leaf, uint32_t subleaf, + uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx) +{ + return __get_cpuid_count(leaf, subleaf, eax, ebx, ecx, edx); +} + +#pragma GCC diagnostic ignored "-Wunknown-pragmas" +#pragma GCC push_options +#pragma GCC target("xsave") +#pragma clang attribute push (__attribute__((target("xsave"))), apply_to=function) + +// xgetbv reads the contents of an XCR (Extended Control Register) +// specified in the ECX register into registers EDX:EAX. +// Currently, the only supported value for XCR is 0. +void +gccgoXgetbv(uint32_t *eax, uint32_t *edx) +{ + uint64_t v = _xgetbv(0); + *eax = v & 0xffffffff; + *edx = v >> 32; +} + +#pragma clang attribute pop +#pragma GCC pop_options diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go new file mode 100644 index 0000000..99c60fe --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go @@ -0,0 +1,31 @@ +// Copyright 2018 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 (386 || amd64 || amd64p32) && gccgo + +package cpu + +//extern gccgoGetCpuidCount +func gccgoGetCpuidCount(eaxArg, ecxArg uint32, eax, ebx, ecx, edx *uint32) + +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) { + var a, b, c, d uint32 + gccgoGetCpuidCount(eaxArg, ecxArg, &a, &b, &c, &d) + return a, b, c, d +} + +//extern gccgoXgetbv +func gccgoXgetbv(eax, edx *uint32) + +func xgetbv() (eax, edx uint32) { + var a, d uint32 + gccgoXgetbv(&a, &d) + return a, d +} + +// gccgo doesn't build on Darwin, per: +// https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/gcc.rb#L76 +func darwinSupportsAVX512() bool { + return false +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux.go b/vendor/golang.org/x/sys/cpu/cpu_linux.go new file mode 100644 index 0000000..743eb54 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux.go @@ -0,0 +1,15 @@ +// Copyright 2018 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 !386 && !amd64 && !amd64p32 && !arm64 + +package cpu + +func archInit() { + if err := readHWCAP(); err != nil { + return + } + doinit() + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go b/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go new file mode 100644 index 0000000..2057006 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go @@ -0,0 +1,39 @@ +// Copyright 2019 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 cpu + +func doinit() { + ARM.HasSWP = isSet(hwCap, hwcap_SWP) + ARM.HasHALF = isSet(hwCap, hwcap_HALF) + ARM.HasTHUMB = isSet(hwCap, hwcap_THUMB) + ARM.Has26BIT = isSet(hwCap, hwcap_26BIT) + ARM.HasFASTMUL = isSet(hwCap, hwcap_FAST_MULT) + ARM.HasFPA = isSet(hwCap, hwcap_FPA) + ARM.HasVFP = isSet(hwCap, hwcap_VFP) + ARM.HasEDSP = isSet(hwCap, hwcap_EDSP) + ARM.HasJAVA = isSet(hwCap, hwcap_JAVA) + ARM.HasIWMMXT = isSet(hwCap, hwcap_IWMMXT) + ARM.HasCRUNCH = isSet(hwCap, hwcap_CRUNCH) + ARM.HasTHUMBEE = isSet(hwCap, hwcap_THUMBEE) + ARM.HasNEON = isSet(hwCap, hwcap_NEON) + ARM.HasVFPv3 = isSet(hwCap, hwcap_VFPv3) + ARM.HasVFPv3D16 = isSet(hwCap, hwcap_VFPv3D16) + ARM.HasTLS = isSet(hwCap, hwcap_TLS) + ARM.HasVFPv4 = isSet(hwCap, hwcap_VFPv4) + ARM.HasIDIVA = isSet(hwCap, hwcap_IDIVA) + ARM.HasIDIVT = isSet(hwCap, hwcap_IDIVT) + ARM.HasVFPD32 = isSet(hwCap, hwcap_VFPD32) + ARM.HasLPAE = isSet(hwCap, hwcap_LPAE) + ARM.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM) + ARM.HasAES = isSet(hwCap2, hwcap2_AES) + ARM.HasPMULL = isSet(hwCap2, hwcap2_PMULL) + ARM.HasSHA1 = isSet(hwCap2, hwcap2_SHA1) + ARM.HasSHA2 = isSet(hwCap2, hwcap2_SHA2) + ARM.HasCRC32 = isSet(hwCap2, hwcap2_CRC32) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go new file mode 100644 index 0000000..a968b80 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go @@ -0,0 +1,111 @@ +// Copyright 2018 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 cpu + +import ( + "strings" + "syscall" +) + +// HWCAP/HWCAP2 bits. These are exposed by Linux. +const ( + hwcap_FP = 1 << 0 + hwcap_ASIMD = 1 << 1 + hwcap_EVTSTRM = 1 << 2 + hwcap_AES = 1 << 3 + hwcap_PMULL = 1 << 4 + hwcap_SHA1 = 1 << 5 + hwcap_SHA2 = 1 << 6 + hwcap_CRC32 = 1 << 7 + hwcap_ATOMICS = 1 << 8 + hwcap_FPHP = 1 << 9 + hwcap_ASIMDHP = 1 << 10 + hwcap_CPUID = 1 << 11 + hwcap_ASIMDRDM = 1 << 12 + hwcap_JSCVT = 1 << 13 + hwcap_FCMA = 1 << 14 + hwcap_LRCPC = 1 << 15 + hwcap_DCPOP = 1 << 16 + hwcap_SHA3 = 1 << 17 + hwcap_SM3 = 1 << 18 + hwcap_SM4 = 1 << 19 + hwcap_ASIMDDP = 1 << 20 + hwcap_SHA512 = 1 << 21 + hwcap_SVE = 1 << 22 + hwcap_ASIMDFHM = 1 << 23 +) + +// linuxKernelCanEmulateCPUID reports whether we're running +// on Linux 4.11+. Ideally we'd like to ask the question about +// whether the current kernel contains +// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=77c97b4ee21290f5f083173d957843b615abbff2 +// but the version number will have to do. +func linuxKernelCanEmulateCPUID() bool { + var un syscall.Utsname + syscall.Uname(&un) + var sb strings.Builder + for _, b := range un.Release[:] { + if b == 0 { + break + } + sb.WriteByte(byte(b)) + } + major, minor, _, ok := parseRelease(sb.String()) + return ok && (major > 4 || major == 4 && minor >= 11) +} + +func doinit() { + if err := readHWCAP(); err != nil { + // We failed to read /proc/self/auxv. This can happen if the binary has + // been given extra capabilities(7) with /bin/setcap. + // + // When this happens, we have two options. If the Linux kernel is new + // enough (4.11+), we can read the arm64 registers directly which'll + // trap into the kernel and then return back to userspace. + // + // But on older kernels, such as Linux 4.4.180 as used on many Synology + // devices, calling readARM64Registers (specifically getisar0) will + // cause a SIGILL and we'll die. So for older kernels, parse /proc/cpuinfo + // instead. + // + // See golang/go#57336. + if linuxKernelCanEmulateCPUID() { + readARM64Registers() + } else { + readLinuxProcCPUInfo() + } + return + } + + // HWCAP feature bits + ARM64.HasFP = isSet(hwCap, hwcap_FP) + ARM64.HasASIMD = isSet(hwCap, hwcap_ASIMD) + ARM64.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM) + ARM64.HasAES = isSet(hwCap, hwcap_AES) + ARM64.HasPMULL = isSet(hwCap, hwcap_PMULL) + ARM64.HasSHA1 = isSet(hwCap, hwcap_SHA1) + ARM64.HasSHA2 = isSet(hwCap, hwcap_SHA2) + ARM64.HasCRC32 = isSet(hwCap, hwcap_CRC32) + ARM64.HasATOMICS = isSet(hwCap, hwcap_ATOMICS) + ARM64.HasFPHP = isSet(hwCap, hwcap_FPHP) + ARM64.HasASIMDHP = isSet(hwCap, hwcap_ASIMDHP) + ARM64.HasCPUID = isSet(hwCap, hwcap_CPUID) + ARM64.HasASIMDRDM = isSet(hwCap, hwcap_ASIMDRDM) + ARM64.HasJSCVT = isSet(hwCap, hwcap_JSCVT) + ARM64.HasFCMA = isSet(hwCap, hwcap_FCMA) + ARM64.HasLRCPC = isSet(hwCap, hwcap_LRCPC) + ARM64.HasDCPOP = isSet(hwCap, hwcap_DCPOP) + ARM64.HasSHA3 = isSet(hwCap, hwcap_SHA3) + ARM64.HasSM3 = isSet(hwCap, hwcap_SM3) + ARM64.HasSM4 = isSet(hwCap, hwcap_SM4) + ARM64.HasASIMDDP = isSet(hwCap, hwcap_ASIMDDP) + ARM64.HasSHA512 = isSet(hwCap, hwcap_SHA512) + ARM64.HasSVE = isSet(hwCap, hwcap_SVE) + ARM64.HasASIMDFHM = isSet(hwCap, hwcap_ASIMDFHM) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go new file mode 100644 index 0000000..4686c1d --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go @@ -0,0 +1,22 @@ +// Copyright 2020 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 linux && (mips64 || mips64le) + +package cpu + +// HWCAP bits. These are exposed by the Linux kernel 5.4. +const ( + // CPU features + hwcap_MIPS_MSA = 1 << 1 +) + +func doinit() { + // HWCAP feature bits + MIPS64X.HasMSA = isSet(hwCap, hwcap_MIPS_MSA) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go new file mode 100644 index 0000000..cd63e73 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go @@ -0,0 +1,9 @@ +// Copyright 2019 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 linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x + +package cpu + +func doinit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go new file mode 100644 index 0000000..197188e --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go @@ -0,0 +1,30 @@ +// Copyright 2018 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 linux && (ppc64 || ppc64le) + +package cpu + +// HWCAP/HWCAP2 bits. These are exposed by the kernel. +const ( + // ISA Level + _PPC_FEATURE2_ARCH_2_07 = 0x80000000 + _PPC_FEATURE2_ARCH_3_00 = 0x00800000 + + // CPU features + _PPC_FEATURE2_DARN = 0x00200000 + _PPC_FEATURE2_SCV = 0x00100000 +) + +func doinit() { + // HWCAP2 feature bits + PPC64.IsPOWER8 = isSet(hwCap2, _PPC_FEATURE2_ARCH_2_07) + PPC64.IsPOWER9 = isSet(hwCap2, _PPC_FEATURE2_ARCH_3_00) + PPC64.HasDARN = isSet(hwCap2, _PPC_FEATURE2_DARN) + PPC64.HasSCV = isSet(hwCap2, _PPC_FEATURE2_SCV) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go new file mode 100644 index 0000000..1517ac6 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go @@ -0,0 +1,40 @@ +// Copyright 2019 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 cpu + +const ( + // bit mask values from /usr/include/bits/hwcap.h + hwcap_ZARCH = 2 + hwcap_STFLE = 4 + hwcap_MSA = 8 + hwcap_LDISP = 16 + hwcap_EIMM = 32 + hwcap_DFP = 64 + hwcap_ETF3EH = 256 + hwcap_VX = 2048 + hwcap_VXE = 8192 +) + +func initS390Xbase() { + // test HWCAP bit vector + has := func(featureMask uint) bool { + return hwCap&featureMask == featureMask + } + + // mandatory + S390X.HasZARCH = has(hwcap_ZARCH) + + // optional + S390X.HasSTFLE = has(hwcap_STFLE) + S390X.HasLDISP = has(hwcap_LDISP) + S390X.HasEIMM = has(hwcap_EIMM) + S390X.HasETF3EH = has(hwcap_ETF3EH) + S390X.HasDFP = has(hwcap_DFP) + S390X.HasMSA = has(hwcap_MSA) + S390X.HasVX = has(hwcap_VX) + if S390X.HasVX { + S390X.HasVXE = has(hwcap_VXE) + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_loong64.go b/vendor/golang.org/x/sys/cpu/cpu_loong64.go new file mode 100644 index 0000000..5586358 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_loong64.go @@ -0,0 +1,12 @@ +// Copyright 2022 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 loong64 + +package cpu + +const cacheLineSize = 64 + +func initOptions() { +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go new file mode 100644 index 0000000..fedb00c --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go @@ -0,0 +1,15 @@ +// Copyright 2018 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 mips64 || mips64le + +package cpu + +const cacheLineSize = 32 + +func initOptions() { + options = []option{ + {Name: "msa", Feature: &MIPS64X.HasMSA}, + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_mipsx.go b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go new file mode 100644 index 0000000..ffb4ec7 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go @@ -0,0 +1,11 @@ +// Copyright 2018 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 mips || mipsle + +package cpu + +const cacheLineSize = 32 + +func initOptions() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go new file mode 100644 index 0000000..ebfb3fc --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go @@ -0,0 +1,173 @@ +// Copyright 2020 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 cpu + +import ( + "syscall" + "unsafe" +) + +// Minimal copy of functionality from x/sys/unix so the cpu package can call +// sysctl without depending on x/sys/unix. + +const ( + _CTL_QUERY = -2 + + _SYSCTL_VERS_1 = 0x1000000 +) + +var _zero uintptr + +func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, errno := syscall.Syscall6( + syscall.SYS___SYSCTL, + uintptr(_p0), + uintptr(len(mib)), + uintptr(unsafe.Pointer(old)), + uintptr(unsafe.Pointer(oldlen)), + uintptr(unsafe.Pointer(new)), + uintptr(newlen)) + if errno != 0 { + return errno + } + return nil +} + +type sysctlNode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + __rsvd uint32 + Un [16]byte + _sysctl_size [8]byte + _sysctl_func [8]byte + _sysctl_parent [8]byte + _sysctl_desc [8]byte +} + +func sysctlNodes(mib []int32) ([]sysctlNode, error) { + var olen uintptr + + // Get a list of all sysctl nodes below the given MIB by performing + // a sysctl for the given MIB with CTL_QUERY appended. + mib = append(mib, _CTL_QUERY) + qnode := sysctlNode{Flags: _SYSCTL_VERS_1} + qp := (*byte)(unsafe.Pointer(&qnode)) + sz := unsafe.Sizeof(qnode) + if err := sysctl(mib, nil, &olen, qp, sz); err != nil { + return nil, err + } + + // Now that we know the size, get the actual nodes. + nodes := make([]sysctlNode, olen/sz) + np := (*byte)(unsafe.Pointer(&nodes[0])) + if err := sysctl(mib, np, &olen, qp, sz); err != nil { + return nil, err + } + + return nodes, nil +} + +func nametomib(name string) ([]int32, error) { + // Split name into components. + var parts []string + last := 0 + for i := 0; i < len(name); i++ { + if name[i] == '.' { + parts = append(parts, name[last:i]) + last = i + 1 + } + } + parts = append(parts, name[last:]) + + mib := []int32{} + // Discover the nodes and construct the MIB OID. + for partno, part := range parts { + nodes, err := sysctlNodes(mib) + if err != nil { + return nil, err + } + for _, node := range nodes { + n := make([]byte, 0) + for i := range node.Name { + if node.Name[i] != 0 { + n = append(n, byte(node.Name[i])) + } + } + if string(n) == part { + mib = append(mib, int32(node.Num)) + break + } + } + if len(mib) != partno+1 { + return nil, err + } + } + + return mib, nil +} + +// aarch64SysctlCPUID is struct aarch64_sysctl_cpu_id from NetBSD's +type aarch64SysctlCPUID struct { + midr uint64 /* Main ID Register */ + revidr uint64 /* Revision ID Register */ + mpidr uint64 /* Multiprocessor Affinity Register */ + aa64dfr0 uint64 /* A64 Debug Feature Register 0 */ + aa64dfr1 uint64 /* A64 Debug Feature Register 1 */ + aa64isar0 uint64 /* A64 Instruction Set Attribute Register 0 */ + aa64isar1 uint64 /* A64 Instruction Set Attribute Register 1 */ + aa64mmfr0 uint64 /* A64 Memory Model Feature Register 0 */ + aa64mmfr1 uint64 /* A64 Memory Model Feature Register 1 */ + aa64mmfr2 uint64 /* A64 Memory Model Feature Register 2 */ + aa64pfr0 uint64 /* A64 Processor Feature Register 0 */ + aa64pfr1 uint64 /* A64 Processor Feature Register 1 */ + aa64zfr0 uint64 /* A64 SVE Feature ID Register 0 */ + mvfr0 uint32 /* Media and VFP Feature Register 0 */ + mvfr1 uint32 /* Media and VFP Feature Register 1 */ + mvfr2 uint32 /* Media and VFP Feature Register 2 */ + pad uint32 + clidr uint64 /* Cache Level ID Register */ + ctr uint64 /* Cache Type Register */ +} + +func sysctlCPUID(name string) (*aarch64SysctlCPUID, error) { + mib, err := nametomib(name) + if err != nil { + return nil, err + } + + out := aarch64SysctlCPUID{} + n := unsafe.Sizeof(out) + _, _, errno := syscall.Syscall6( + syscall.SYS___SYSCTL, + uintptr(unsafe.Pointer(&mib[0])), + uintptr(len(mib)), + uintptr(unsafe.Pointer(&out)), + uintptr(unsafe.Pointer(&n)), + uintptr(0), + uintptr(0)) + if errno != 0 { + return nil, errno + } + return &out, nil +} + +func doinit() { + cpuid, err := sysctlCPUID("machdep.cpu0.cpu_id") + if err != nil { + setMinimalFeatures() + return + } + parseARM64SystemRegisters(cpuid.aa64isar0, cpuid.aa64isar1, cpuid.aa64pfr0) + + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go new file mode 100644 index 0000000..85b64d5 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go @@ -0,0 +1,65 @@ +// Copyright 2022 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 cpu + +import ( + "syscall" + "unsafe" +) + +// Minimal copy of functionality from x/sys/unix so the cpu package can call +// sysctl without depending on x/sys/unix. + +const ( + // From OpenBSD's sys/sysctl.h. + _CTL_MACHDEP = 7 + + // From OpenBSD's machine/cpu.h. + _CPU_ID_AA64ISAR0 = 2 + _CPU_ID_AA64ISAR1 = 3 +) + +// Implemented in the runtime package (runtime/sys_openbsd3.go) +func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) + +//go:linkname syscall_syscall6 syscall.syscall6 + +func sysctl(mib []uint32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + _, _, errno := syscall_syscall6(libc_sysctl_trampoline_addr, uintptr(unsafe.Pointer(&mib[0])), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if errno != 0 { + return errno + } + return nil +} + +var libc_sysctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + +func sysctlUint64(mib []uint32) (uint64, bool) { + var out uint64 + nout := unsafe.Sizeof(out) + if err := sysctl(mib, (*byte)(unsafe.Pointer(&out)), &nout, nil, 0); err != nil { + return 0, false + } + return out, true +} + +func doinit() { + setMinimalFeatures() + + // Get ID_AA64ISAR0 and ID_AA64ISAR1 from sysctl. + isar0, ok := sysctlUint64([]uint32{_CTL_MACHDEP, _CPU_ID_AA64ISAR0}) + if !ok { + return + } + isar1, ok := sysctlUint64([]uint32{_CTL_MACHDEP, _CPU_ID_AA64ISAR1}) + if !ok { + return + } + parseARM64SystemRegisters(isar0, isar1, 0) + + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s new file mode 100644 index 0000000..054ba05 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s @@ -0,0 +1,11 @@ +// Copyright 2022 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. + +#include "textflag.h" + +TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) + +GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go new file mode 100644 index 0000000..e9ecf2a --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go @@ -0,0 +1,9 @@ +// Copyright 2020 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 !linux && arm + +package cpu + +func archInit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go new file mode 100644 index 0000000..5341e7f --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go @@ -0,0 +1,9 @@ +// Copyright 2019 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 !linux && !netbsd && !openbsd && arm64 + +package cpu + +func doinit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go new file mode 100644 index 0000000..5f8f241 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go @@ -0,0 +1,11 @@ +// Copyright 2020 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 !linux && (mips64 || mips64le) + +package cpu + +func archInit() { + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go new file mode 100644 index 0000000..89608fb --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go @@ -0,0 +1,12 @@ +// Copyright 2022 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 !aix && !linux && (ppc64 || ppc64le) + +package cpu + +func archInit() { + PPC64.IsPOWER8 = true + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go new file mode 100644 index 0000000..5ab8780 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go @@ -0,0 +1,11 @@ +// Copyright 2022 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 !linux && riscv64 + +package cpu + +func archInit() { + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go new file mode 100644 index 0000000..c14f12b --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go @@ -0,0 +1,16 @@ +// Copyright 2020 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 ppc64 || ppc64le + +package cpu + +const cacheLineSize = 128 + +func initOptions() { + options = []option{ + {Name: "darn", Feature: &PPC64.HasDARN}, + {Name: "scv", Feature: &PPC64.HasSCV}, + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go new file mode 100644 index 0000000..7f0c79c --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go @@ -0,0 +1,11 @@ +// Copyright 2019 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 riscv64 + +package cpu + +const cacheLineSize = 64 + +func initOptions() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_s390x.go new file mode 100644 index 0000000..5881b88 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_s390x.go @@ -0,0 +1,172 @@ +// Copyright 2020 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 cpu + +const cacheLineSize = 256 + +func initOptions() { + options = []option{ + {Name: "zarch", Feature: &S390X.HasZARCH, Required: true}, + {Name: "stfle", Feature: &S390X.HasSTFLE, Required: true}, + {Name: "ldisp", Feature: &S390X.HasLDISP, Required: true}, + {Name: "eimm", Feature: &S390X.HasEIMM, Required: true}, + {Name: "dfp", Feature: &S390X.HasDFP}, + {Name: "etf3eh", Feature: &S390X.HasETF3EH}, + {Name: "msa", Feature: &S390X.HasMSA}, + {Name: "aes", Feature: &S390X.HasAES}, + {Name: "aescbc", Feature: &S390X.HasAESCBC}, + {Name: "aesctr", Feature: &S390X.HasAESCTR}, + {Name: "aesgcm", Feature: &S390X.HasAESGCM}, + {Name: "ghash", Feature: &S390X.HasGHASH}, + {Name: "sha1", Feature: &S390X.HasSHA1}, + {Name: "sha256", Feature: &S390X.HasSHA256}, + {Name: "sha3", Feature: &S390X.HasSHA3}, + {Name: "sha512", Feature: &S390X.HasSHA512}, + {Name: "vx", Feature: &S390X.HasVX}, + {Name: "vxe", Feature: &S390X.HasVXE}, + } +} + +// bitIsSet reports whether the bit at index is set. The bit index +// is in big endian order, so bit index 0 is the leftmost bit. +func bitIsSet(bits []uint64, index uint) bool { + return bits[index/64]&((1<<63)>>(index%64)) != 0 +} + +// facility is a bit index for the named facility. +type facility uint8 + +const ( + // mandatory facilities + zarch facility = 1 // z architecture mode is active + stflef facility = 7 // store-facility-list-extended + ldisp facility = 18 // long-displacement + eimm facility = 21 // extended-immediate + + // miscellaneous facilities + dfp facility = 42 // decimal-floating-point + etf3eh facility = 30 // extended-translation 3 enhancement + + // cryptography facilities + msa facility = 17 // message-security-assist + msa3 facility = 76 // message-security-assist extension 3 + msa4 facility = 77 // message-security-assist extension 4 + msa5 facility = 57 // message-security-assist extension 5 + msa8 facility = 146 // message-security-assist extension 8 + msa9 facility = 155 // message-security-assist extension 9 + + // vector facilities + vx facility = 129 // vector facility + vxe facility = 135 // vector-enhancements 1 + vxe2 facility = 148 // vector-enhancements 2 +) + +// facilityList contains the result of an STFLE call. +// Bits are numbered in big endian order so the +// leftmost bit (the MSB) is at index 0. +type facilityList struct { + bits [4]uint64 +} + +// Has reports whether the given facilities are present. +func (s *facilityList) Has(fs ...facility) bool { + if len(fs) == 0 { + panic("no facility bits provided") + } + for _, f := range fs { + if !bitIsSet(s.bits[:], uint(f)) { + return false + } + } + return true +} + +// function is the code for the named cryptographic function. +type function uint8 + +const ( + // KM{,A,C,CTR} function codes + aes128 function = 18 // AES-128 + aes192 function = 19 // AES-192 + aes256 function = 20 // AES-256 + + // K{I,L}MD function codes + sha1 function = 1 // SHA-1 + sha256 function = 2 // SHA-256 + sha512 function = 3 // SHA-512 + sha3_224 function = 32 // SHA3-224 + sha3_256 function = 33 // SHA3-256 + sha3_384 function = 34 // SHA3-384 + sha3_512 function = 35 // SHA3-512 + shake128 function = 36 // SHAKE-128 + shake256 function = 37 // SHAKE-256 + + // KLMD function codes + ghash function = 65 // GHASH +) + +// queryResult contains the result of a Query function +// call. Bits are numbered in big endian order so the +// leftmost bit (the MSB) is at index 0. +type queryResult struct { + bits [2]uint64 +} + +// Has reports whether the given functions are present. +func (q *queryResult) Has(fns ...function) bool { + if len(fns) == 0 { + panic("no function codes provided") + } + for _, f := range fns { + if !bitIsSet(q.bits[:], uint(f)) { + return false + } + } + return true +} + +func doinit() { + initS390Xbase() + + // We need implementations of stfle, km and so on + // to detect cryptographic features. + if !haveAsmFunctions() { + return + } + + // optional cryptographic functions + if S390X.HasMSA { + aes := []function{aes128, aes192, aes256} + + // cipher message + km, kmc := kmQuery(), kmcQuery() + S390X.HasAES = km.Has(aes...) + S390X.HasAESCBC = kmc.Has(aes...) + if S390X.HasSTFLE { + facilities := stfle() + if facilities.Has(msa4) { + kmctr := kmctrQuery() + S390X.HasAESCTR = kmctr.Has(aes...) + } + if facilities.Has(msa8) { + kma := kmaQuery() + S390X.HasAESGCM = kma.Has(aes...) + } + } + + // compute message digest + kimd := kimdQuery() // intermediate (no padding) + klmd := klmdQuery() // last (padding) + S390X.HasSHA1 = kimd.Has(sha1) && klmd.Has(sha1) + S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256) + S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512) + S390X.HasGHASH = kimd.Has(ghash) // KLMD-GHASH does not exist + sha3 := []function{ + sha3_224, sha3_256, sha3_384, sha3_512, + shake128, shake256, + } + S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...) + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_s390x.s b/vendor/golang.org/x/sys/cpu/cpu_s390x.s new file mode 100644 index 0000000..1fb4b70 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_s390x.s @@ -0,0 +1,57 @@ +// Copyright 2019 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 gc + +#include "textflag.h" + +// func stfle() facilityList +TEXT ·stfle(SB), NOSPLIT|NOFRAME, $0-32 + MOVD $ret+0(FP), R1 + MOVD $3, R0 // last doubleword index to store + XC $32, (R1), (R1) // clear 4 doublewords (32 bytes) + WORD $0xb2b01000 // store facility list extended (STFLE) + RET + +// func kmQuery() queryResult +TEXT ·kmQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KM-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92E0024 // cipher message (KM) + RET + +// func kmcQuery() queryResult +TEXT ·kmcQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMC-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92F0024 // cipher message with chaining (KMC) + RET + +// func kmctrQuery() queryResult +TEXT ·kmctrQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMCTR-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92D4024 // cipher message with counter (KMCTR) + RET + +// func kmaQuery() queryResult +TEXT ·kmaQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMA-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xb9296024 // cipher message with authentication (KMA) + RET + +// func kimdQuery() queryResult +TEXT ·kimdQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KIMD-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB93E0024 // compute intermediate message digest (KIMD) + RET + +// func klmdQuery() queryResult +TEXT ·klmdQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KLMD-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB93F0024 // compute last message digest (KLMD) + RET diff --git a/vendor/golang.org/x/sys/cpu/cpu_wasm.go b/vendor/golang.org/x/sys/cpu/cpu_wasm.go new file mode 100644 index 0000000..384787e --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_wasm.go @@ -0,0 +1,17 @@ +// Copyright 2019 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 wasm + +package cpu + +// We're compiling the cpu package for an unknown (software-abstracted) CPU. +// Make CacheLinePad an empty struct and hope that the usual struct alignment +// rules are good enough. + +const cacheLineSize = 0 + +func initOptions() {} + +func archInit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go new file mode 100644 index 0000000..c29f5e4 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -0,0 +1,151 @@ +// Copyright 2018 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 386 || amd64 || amd64p32 + +package cpu + +import "runtime" + +const cacheLineSize = 64 + +func initOptions() { + options = []option{ + {Name: "adx", Feature: &X86.HasADX}, + {Name: "aes", Feature: &X86.HasAES}, + {Name: "avx", Feature: &X86.HasAVX}, + {Name: "avx2", Feature: &X86.HasAVX2}, + {Name: "avx512", Feature: &X86.HasAVX512}, + {Name: "avx512f", Feature: &X86.HasAVX512F}, + {Name: "avx512cd", Feature: &X86.HasAVX512CD}, + {Name: "avx512er", Feature: &X86.HasAVX512ER}, + {Name: "avx512pf", Feature: &X86.HasAVX512PF}, + {Name: "avx512vl", Feature: &X86.HasAVX512VL}, + {Name: "avx512bw", Feature: &X86.HasAVX512BW}, + {Name: "avx512dq", Feature: &X86.HasAVX512DQ}, + {Name: "avx512ifma", Feature: &X86.HasAVX512IFMA}, + {Name: "avx512vbmi", Feature: &X86.HasAVX512VBMI}, + {Name: "avx512vnniw", Feature: &X86.HasAVX5124VNNIW}, + {Name: "avx5124fmaps", Feature: &X86.HasAVX5124FMAPS}, + {Name: "avx512vpopcntdq", Feature: &X86.HasAVX512VPOPCNTDQ}, + {Name: "avx512vpclmulqdq", Feature: &X86.HasAVX512VPCLMULQDQ}, + {Name: "avx512vnni", Feature: &X86.HasAVX512VNNI}, + {Name: "avx512gfni", Feature: &X86.HasAVX512GFNI}, + {Name: "avx512vaes", Feature: &X86.HasAVX512VAES}, + {Name: "avx512vbmi2", Feature: &X86.HasAVX512VBMI2}, + {Name: "avx512bitalg", Feature: &X86.HasAVX512BITALG}, + {Name: "avx512bf16", Feature: &X86.HasAVX512BF16}, + {Name: "amxtile", Feature: &X86.HasAMXTile}, + {Name: "amxint8", Feature: &X86.HasAMXInt8}, + {Name: "amxbf16", Feature: &X86.HasAMXBF16}, + {Name: "bmi1", Feature: &X86.HasBMI1}, + {Name: "bmi2", Feature: &X86.HasBMI2}, + {Name: "cx16", Feature: &X86.HasCX16}, + {Name: "erms", Feature: &X86.HasERMS}, + {Name: "fma", Feature: &X86.HasFMA}, + {Name: "osxsave", Feature: &X86.HasOSXSAVE}, + {Name: "pclmulqdq", Feature: &X86.HasPCLMULQDQ}, + {Name: "popcnt", Feature: &X86.HasPOPCNT}, + {Name: "rdrand", Feature: &X86.HasRDRAND}, + {Name: "rdseed", Feature: &X86.HasRDSEED}, + {Name: "sse3", Feature: &X86.HasSSE3}, + {Name: "sse41", Feature: &X86.HasSSE41}, + {Name: "sse42", Feature: &X86.HasSSE42}, + {Name: "ssse3", Feature: &X86.HasSSSE3}, + + // These capabilities should always be enabled on amd64: + {Name: "sse2", Feature: &X86.HasSSE2, Required: runtime.GOARCH == "amd64"}, + } +} + +func archInit() { + + Initialized = true + + maxID, _, _, _ := cpuid(0, 0) + + if maxID < 1 { + return + } + + _, _, ecx1, edx1 := cpuid(1, 0) + X86.HasSSE2 = isSet(26, edx1) + + X86.HasSSE3 = isSet(0, ecx1) + X86.HasPCLMULQDQ = isSet(1, ecx1) + X86.HasSSSE3 = isSet(9, ecx1) + X86.HasFMA = isSet(12, ecx1) + X86.HasCX16 = isSet(13, ecx1) + X86.HasSSE41 = isSet(19, ecx1) + X86.HasSSE42 = isSet(20, ecx1) + X86.HasPOPCNT = isSet(23, ecx1) + X86.HasAES = isSet(25, ecx1) + X86.HasOSXSAVE = isSet(27, ecx1) + X86.HasRDRAND = isSet(30, ecx1) + + var osSupportsAVX, osSupportsAVX512 bool + // For XGETBV, OSXSAVE bit is required and sufficient. + if X86.HasOSXSAVE { + eax, _ := xgetbv() + // Check if XMM and YMM registers have OS support. + osSupportsAVX = isSet(1, eax) && isSet(2, eax) + + if runtime.GOOS == "darwin" { + // Darwin doesn't save/restore AVX-512 mask registers correctly across signal handlers. + // Since users can't rely on mask register contents, let's not advertise AVX-512 support. + // See issue 49233. + osSupportsAVX512 = false + } else { + // Check if OPMASK and ZMM registers have OS support. + osSupportsAVX512 = osSupportsAVX && isSet(5, eax) && isSet(6, eax) && isSet(7, eax) + } + } + + X86.HasAVX = isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, ecx7, edx7 := cpuid(7, 0) + X86.HasBMI1 = isSet(3, ebx7) + X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX + X86.HasBMI2 = isSet(8, ebx7) + X86.HasERMS = isSet(9, ebx7) + X86.HasRDSEED = isSet(18, ebx7) + X86.HasADX = isSet(19, ebx7) + + X86.HasAVX512 = isSet(16, ebx7) && osSupportsAVX512 // Because avx-512 foundation is the core required extension + if X86.HasAVX512 { + X86.HasAVX512F = true + X86.HasAVX512CD = isSet(28, ebx7) + X86.HasAVX512ER = isSet(27, ebx7) + X86.HasAVX512PF = isSet(26, ebx7) + X86.HasAVX512VL = isSet(31, ebx7) + X86.HasAVX512BW = isSet(30, ebx7) + X86.HasAVX512DQ = isSet(17, ebx7) + X86.HasAVX512IFMA = isSet(21, ebx7) + X86.HasAVX512VBMI = isSet(1, ecx7) + X86.HasAVX5124VNNIW = isSet(2, edx7) + X86.HasAVX5124FMAPS = isSet(3, edx7) + X86.HasAVX512VPOPCNTDQ = isSet(14, ecx7) + X86.HasAVX512VPCLMULQDQ = isSet(10, ecx7) + X86.HasAVX512VNNI = isSet(11, ecx7) + X86.HasAVX512GFNI = isSet(8, ecx7) + X86.HasAVX512VAES = isSet(9, ecx7) + X86.HasAVX512VBMI2 = isSet(6, ecx7) + X86.HasAVX512BITALG = isSet(12, ecx7) + + eax71, _, _, _ := cpuid(7, 1) + X86.HasAVX512BF16 = isSet(5, eax71) + } + + X86.HasAMXTile = isSet(24, edx7) + X86.HasAMXInt8 = isSet(25, edx7) + X86.HasAMXBF16 = isSet(22, edx7) +} + +func isSet(bitpos uint, value uint32) bool { + return value&(1<> 63)) +) + +// For those platforms don't have a 'cpuid' equivalent we use HWCAP/HWCAP2 +// These are initialized in cpu_$GOARCH.go +// and should not be changed after they are initialized. +var hwCap uint +var hwCap2 uint + +func readHWCAP() error { + // For Go 1.21+, get auxv from the Go runtime. + if a := getAuxv(); len(a) > 0 { + for len(a) >= 2 { + tag, val := a[0], uint(a[1]) + a = a[2:] + switch tag { + case _AT_HWCAP: + hwCap = val + case _AT_HWCAP2: + hwCap2 = val + } + } + return nil + } + + buf, err := os.ReadFile(procAuxv) + if err != nil { + // e.g. on android /proc/self/auxv is not accessible, so silently + // ignore the error and leave Initialized = false. On some + // architectures (e.g. arm64) doinit() implements a fallback + // readout and will set Initialized = true again. + return err + } + bo := hostByteOrder() + for len(buf) >= 2*(uintSize/8) { + var tag, val uint + switch uintSize { + case 32: + tag = uint(bo.Uint32(buf[0:])) + val = uint(bo.Uint32(buf[4:])) + buf = buf[8:] + case 64: + tag = uint(bo.Uint64(buf[0:])) + val = uint(bo.Uint64(buf[8:])) + buf = buf[16:] + } + switch tag { + case _AT_HWCAP: + hwCap = val + case _AT_HWCAP2: + hwCap2 = val + } + } + return nil +} diff --git a/vendor/golang.org/x/sys/cpu/parse.go b/vendor/golang.org/x/sys/cpu/parse.go new file mode 100644 index 0000000..762b63d --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/parse.go @@ -0,0 +1,43 @@ +// Copyright 2022 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 cpu + +import "strconv" + +// parseRelease parses a dot-separated version number. It follows the semver +// syntax, but allows the minor and patch versions to be elided. +// +// This is a copy of the Go runtime's parseRelease from +// https://golang.org/cl/209597. +func parseRelease(rel string) (major, minor, patch int, ok bool) { + // Strip anything after a dash or plus. + for i := 0; i < len(rel); i++ { + if rel[i] == '-' || rel[i] == '+' { + rel = rel[:i] + break + } + } + + next := func() (int, bool) { + for i := 0; i < len(rel); i++ { + if rel[i] == '.' { + ver, err := strconv.Atoi(rel[:i]) + rel = rel[i+1:] + return ver, err == nil + } + } + ver, err := strconv.Atoi(rel) + rel = "" + return ver, err == nil + } + if major, ok = next(); !ok || rel == "" { + return + } + if minor, ok = next(); !ok || rel == "" { + return + } + patch, ok = next() + return +} diff --git a/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go b/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go new file mode 100644 index 0000000..4cd64c7 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go @@ -0,0 +1,53 @@ +// Copyright 2022 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 linux && arm64 + +package cpu + +import ( + "errors" + "io" + "os" + "strings" +) + +func readLinuxProcCPUInfo() error { + f, err := os.Open("/proc/cpuinfo") + if err != nil { + return err + } + defer f.Close() + + var buf [1 << 10]byte // enough for first CPU + n, err := io.ReadFull(f, buf[:]) + if err != nil && err != io.ErrUnexpectedEOF { + return err + } + in := string(buf[:n]) + const features = "\nFeatures : " + i := strings.Index(in, features) + if i == -1 { + return errors.New("no CPU features found") + } + in = in[i+len(features):] + if i := strings.Index(in, "\n"); i != -1 { + in = in[:i] + } + m := map[string]*bool{} + + initOptions() // need it early here; it's harmless to call twice + for _, o := range options { + m[o.Name] = o.Feature + } + // The EVTSTRM field has alias "evstrm" in Go, but Linux calls it "evtstrm". + m["evtstrm"] = &ARM64.HasEVTSTRM + + for _, f := range strings.Fields(in) { + if p, ok := m[f]; ok { + *p = true + } + } + return nil +} diff --git a/vendor/golang.org/x/sys/cpu/runtime_auxv.go b/vendor/golang.org/x/sys/cpu/runtime_auxv.go new file mode 100644 index 0000000..5f92ac9 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/runtime_auxv.go @@ -0,0 +1,16 @@ +// Copyright 2023 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 cpu + +// getAuxvFn is non-nil on Go 1.21+ (via runtime_auxv_go121.go init) +// on platforms that use auxv. +var getAuxvFn func() []uintptr + +func getAuxv() []uintptr { + if getAuxvFn == nil { + return nil + } + return getAuxvFn() +} diff --git a/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go b/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go new file mode 100644 index 0000000..4c9788e --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go @@ -0,0 +1,18 @@ +// Copyright 2023 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 go1.21 + +package cpu + +import ( + _ "unsafe" // for linkname +) + +//go:linkname runtime_getAuxv runtime.getAuxv +func runtime_getAuxv() []uintptr + +func init() { + getAuxvFn = runtime_getAuxv +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go new file mode 100644 index 0000000..1b9ccb0 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go @@ -0,0 +1,26 @@ +// Copyright 2020 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. + +// Recreate a getsystemcfg syscall handler instead of +// using the one provided by x/sys/unix to avoid having +// the dependency between them. (See golang.org/issue/32102) +// Moreover, this file will be used during the building of +// gccgo's libgo and thus must not used a CGo method. + +//go:build aix && gccgo + +package cpu + +import ( + "syscall" +) + +//extern getsystemcfg +func gccgoGetsystemcfg(label uint32) (r uint64) + +func callgetsystemcfg(label int) (r1 uintptr, e1 syscall.Errno) { + r1 = uintptr(gccgoGetsystemcfg(uint32(label))) + e1 = syscall.GetErrno() + return +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go new file mode 100644 index 0000000..e8b6cdb --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go @@ -0,0 +1,35 @@ +// Copyright 2019 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. + +// Minimal copy of x/sys/unix so the cpu package can make a +// system call on AIX without depending on x/sys/unix. +// (See golang.org/issue/32102) + +//go:build aix && ppc64 && gc + +package cpu + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o" + +//go:linkname libc_getsystemcfg libc_getsystemcfg + +type syscallFunc uintptr + +var libc_getsystemcfg syscallFunc + +type errno = syscall.Errno + +// Implemented in runtime/syscall_aix.go. +func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno) +func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno) + +func callgetsystemcfg(label int) (r1 uintptr, e1 errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsystemcfg)), 1, uintptr(label), 0, 0, 0, 0, 0) + return +} diff --git a/vendor/modules.txt b/vendor/modules.txt new file mode 100644 index 0000000..72111c5 --- /dev/null +++ b/vendor/modules.txt @@ -0,0 +1,9 @@ +# golang.org/x/crypto v0.22.0 +## explicit +golang.org/x/crypto/chacha20 +golang.org/x/crypto/chacha20poly1305 +golang.org/x/crypto/hkdf +golang.org/x/crypto/internal/alias +golang.org/x/crypto/internal/poly1305 +# golang.org/x/sys v0.19.0 +golang.org/x/sys/cpu