mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 17:33:47 +00:00
swarm/storage: Vendor deps for multiformats/go-multihash
This commit is contained in:
parent
8dd34e999e
commit
08fc950a2e
47 changed files with 6123 additions and 0 deletions
13
vendor/github.com/jbenet/go-base58/LICENSE
generated
vendored
Normal file
13
vendor/github.com/jbenet/go-base58/LICENSE
generated
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
Copyright (c) 2013 Conformal Systems LLC.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
66
vendor/github.com/jbenet/go-base58/README.md
generated
vendored
Normal file
66
vendor/github.com/jbenet/go-base58/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
# go-base58
|
||||||
|
|
||||||
|
I extracted this package from https://github.com/conformal/btcutil to provide a simple base58 package that
|
||||||
|
- defaults to base58-check (btc)
|
||||||
|
- and allows using different alphabets.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
b58 "github.com/jbenet/go-base58"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
buf := []byte{255, 254, 253, 252}
|
||||||
|
fmt.Printf("buffer: %v\n", buf)
|
||||||
|
|
||||||
|
str := b58.Encode(buf)
|
||||||
|
fmt.Printf("encoded: %s\n", str)
|
||||||
|
|
||||||
|
buf2 := b58.Decode(str)
|
||||||
|
fmt.Printf("decoded: %v\n", buf2)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Another alphabet
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
b58 "github.com/jbenet/go-base58"
|
||||||
|
)
|
||||||
|
|
||||||
|
const BogusAlphabet = "ZYXWVUTSRQPNMLKJHGFEDCBAzyxwvutsrqponmkjihgfedcba987654321"
|
||||||
|
|
||||||
|
|
||||||
|
func encdec(alphabet string) {
|
||||||
|
fmt.Printf("using: %s\n", alphabet)
|
||||||
|
|
||||||
|
buf := []byte{255, 254, 253, 252}
|
||||||
|
fmt.Printf("buffer: %v\n", buf)
|
||||||
|
|
||||||
|
str := b58.EncodeAlphabet(buf, alphabet)
|
||||||
|
fmt.Printf("encoded: %s\n", str)
|
||||||
|
|
||||||
|
buf2 := b58.DecodeAlphabet(str, alphabet)
|
||||||
|
fmt.Printf("decoded: %v\n\n", buf2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
encdec(b58.BTCAlphabet)
|
||||||
|
encdec(b58.FlickrAlphabet)
|
||||||
|
encdec(BogusAlphabet)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Package base58 (and the original btcutil) are licensed under the ISC License.
|
||||||
90
vendor/github.com/jbenet/go-base58/base58.go
generated
vendored
Normal file
90
vendor/github.com/jbenet/go-base58/base58.go
generated
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
// Copyright (c) 2013-2014 Conformal Systems LLC.
|
||||||
|
// Use of this source code is governed by an ISC
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
// Modified by Juan Benet (juan@benet.ai)
|
||||||
|
|
||||||
|
package base58
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/big"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// alphabet is the modified base58 alphabet used by Bitcoin.
|
||||||
|
const BTCAlphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
||||||
|
const FlickrAlphabet = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
|
||||||
|
|
||||||
|
var bigRadix = big.NewInt(58)
|
||||||
|
var bigZero = big.NewInt(0)
|
||||||
|
|
||||||
|
// Decode decodes a modified base58 string to a byte slice, using BTCAlphabet
|
||||||
|
func Decode(b string) []byte {
|
||||||
|
return DecodeAlphabet(b, BTCAlphabet)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode encodes a byte slice to a modified base58 string, using BTCAlphabet
|
||||||
|
func Encode(b []byte) string {
|
||||||
|
return EncodeAlphabet(b, BTCAlphabet)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecodeAlphabet decodes a modified base58 string to a byte slice, using alphabet.
|
||||||
|
func DecodeAlphabet(b, alphabet string) []byte {
|
||||||
|
answer := big.NewInt(0)
|
||||||
|
j := big.NewInt(1)
|
||||||
|
|
||||||
|
for i := len(b) - 1; i >= 0; i-- {
|
||||||
|
tmp := strings.IndexAny(alphabet, string(b[i]))
|
||||||
|
if tmp == -1 {
|
||||||
|
return []byte("")
|
||||||
|
}
|
||||||
|
idx := big.NewInt(int64(tmp))
|
||||||
|
tmp1 := big.NewInt(0)
|
||||||
|
tmp1.Mul(j, idx)
|
||||||
|
|
||||||
|
answer.Add(answer, tmp1)
|
||||||
|
j.Mul(j, bigRadix)
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpval := answer.Bytes()
|
||||||
|
|
||||||
|
var numZeros int
|
||||||
|
for numZeros = 0; numZeros < len(b); numZeros++ {
|
||||||
|
if b[numZeros] != alphabet[0] {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flen := numZeros + len(tmpval)
|
||||||
|
val := make([]byte, flen, flen)
|
||||||
|
copy(val[numZeros:], tmpval)
|
||||||
|
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode encodes a byte slice to a modified base58 string, using alphabet
|
||||||
|
func EncodeAlphabet(b []byte, alphabet string) string {
|
||||||
|
x := new(big.Int)
|
||||||
|
x.SetBytes(b)
|
||||||
|
|
||||||
|
answer := make([]byte, 0, len(b)*136/100)
|
||||||
|
for x.Cmp(bigZero) > 0 {
|
||||||
|
mod := new(big.Int)
|
||||||
|
x.DivMod(x, bigRadix, mod)
|
||||||
|
answer = append(answer, alphabet[mod.Int64()])
|
||||||
|
}
|
||||||
|
|
||||||
|
// leading zero bytes
|
||||||
|
for _, i := range b {
|
||||||
|
if i != 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
answer = append(answer, alphabet[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
// reverse
|
||||||
|
alen := len(answer)
|
||||||
|
for i := 0; i < alen/2; i++ {
|
||||||
|
answer[i], answer[alen-1-i] = answer[alen-1-i], answer[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(answer)
|
||||||
|
}
|
||||||
20
vendor/github.com/jbenet/go-base58/doc.go
generated
vendored
Normal file
20
vendor/github.com/jbenet/go-base58/doc.go
generated
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright (c) 2013-2014 Conformal Systems LLC.
|
||||||
|
// Use of this source code is governed by an ISC
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package base58 provides base58-check encoding.
|
||||||
|
The alphabet is modifyiable for
|
||||||
|
|
||||||
|
Base58 Usage
|
||||||
|
|
||||||
|
To decode a base58 string:
|
||||||
|
|
||||||
|
rawData := base58.Base58Decode(encodedData)
|
||||||
|
|
||||||
|
Similarly, to encode the same data:
|
||||||
|
|
||||||
|
encodedData := base58.Base58Encode(rawData)
|
||||||
|
|
||||||
|
*/
|
||||||
|
package base58
|
||||||
21
vendor/github.com/multiformats/go-multihash/LICENSE
generated
vendored
Normal file
21
vendor/github.com/multiformats/go-multihash/LICENSE
generated
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Juan Batiz-Benet
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
15
vendor/github.com/multiformats/go-multihash/Makefile
generated
vendored
Normal file
15
vendor/github.com/multiformats/go-multihash/Makefile
generated
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
gx:
|
||||||
|
go get github.com/whyrusleeping/gx
|
||||||
|
go get github.com/whyrusleeping/gx-go
|
||||||
|
|
||||||
|
covertools:
|
||||||
|
go get github.com/mattn/goveralls
|
||||||
|
go get golang.org/x/tools/cmd/cover
|
||||||
|
|
||||||
|
deps: gx covertools
|
||||||
|
gx --verbose install --global
|
||||||
|
gx-go rewrite
|
||||||
|
|
||||||
|
publish:
|
||||||
|
gx-go rewrite --undo
|
||||||
|
|
||||||
111
vendor/github.com/multiformats/go-multihash/README.md
generated
vendored
Normal file
111
vendor/github.com/multiformats/go-multihash/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
# go-multihash
|
||||||
|
|
||||||
|
[](http://ipn.io)
|
||||||
|
[](https://github.com/multiformats/multiformats)
|
||||||
|
[](https://webchat.freenode.net/?channels=%23ipfs)
|
||||||
|
[](https://github.com/RichardLitt/standard-readme)
|
||||||
|
[](https://godoc.org/github.com/multiformats/go-multihash)
|
||||||
|
[](https://travis-ci.org/multiformats/go-multihash)
|
||||||
|
[](https://codecov.io/github/multiformats/go-multihash?branch=master)
|
||||||
|
|
||||||
|
> [multihash](https://github.com/multiformats/multihash) implementation in Go
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
- [Install](#install)
|
||||||
|
- [Usage](#usage)
|
||||||
|
- [Maintainers](#maintainers)
|
||||||
|
- [Contribute](#contribute)
|
||||||
|
- [License](#license)
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
`go-multihash` is a standard Go module which can be installed with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go get github.com/multiformats/go-multihash
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that `go-multihash` is packaged with Gx, so it is recommended to use Gx to install and use it (see Usage section).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Using Gx and Gx-go
|
||||||
|
|
||||||
|
This module is packaged with [Gx](https://github.com/whyrusleeping/gx). In order to use it in your own project it is recommended that you:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go get -u github.com/whyrusleeping/gx
|
||||||
|
go get -u github.com/whyrusleeping/gx-go
|
||||||
|
cd <your-project-repository>
|
||||||
|
gx init
|
||||||
|
gx import github.com/multiformats/go-multihash
|
||||||
|
gx install --global
|
||||||
|
gx-go --rewrite
|
||||||
|
```
|
||||||
|
|
||||||
|
Please check [Gx](https://github.com/whyrusleeping/gx) and [Gx-go](https://github.com/whyrusleeping/gx-go) documentation for more information.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
This example takes a standard hex-encoded data and uses `EncodeName` to calculate the SHA1 multihash value for the buffer.
|
||||||
|
|
||||||
|
The resulting hex-encoded data corresponds to: `<hash function code><digest size><hash function output>`, which could be re-parsed
|
||||||
|
with `Multihash.FromHexString()`.
|
||||||
|
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/multiformats/go-multihash"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// ignores errors for simplicity.
|
||||||
|
// don't do that at home.
|
||||||
|
// Decode a SHA1 hash to a binary buffer
|
||||||
|
buf, _ := hex.DecodeString("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33")
|
||||||
|
|
||||||
|
// Create a new multihash with it.
|
||||||
|
mHashBuf, _ := multihash.EncodeName(buf, "sha1")
|
||||||
|
// Print the multihash as hex string
|
||||||
|
fmt.Printf("hex: %s\n", hex.EncodeToString(mHashBuf))
|
||||||
|
|
||||||
|
// Parse the binary multihash to a DecodedMultihash
|
||||||
|
mHash, _ := multihash.Decode(mHashBuf)
|
||||||
|
// Convert the sha1 value to hex string
|
||||||
|
sha1hex := hex.EncodeToString(mHash.Digest)
|
||||||
|
// Print all the information in the multihash
|
||||||
|
fmt.Printf("obj: %v 0x%x %d %s\n", mHash.Name, mHash.Code, mHash.Length, sha1hex)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To run, copy to [example/foo.go](example/foo.go) and:
|
||||||
|
|
||||||
|
```
|
||||||
|
> cd example/
|
||||||
|
> go build
|
||||||
|
> ./example
|
||||||
|
hex: 11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
|
||||||
|
obj: sha1 0x11 20 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
|
||||||
|
```
|
||||||
|
|
||||||
|
## Maintainers
|
||||||
|
|
||||||
|
Captain: [@Kubuxu](https://github.com/Kubuxu).
|
||||||
|
|
||||||
|
## Contribute
|
||||||
|
|
||||||
|
Contributions welcome. Please check out [the issues](https://github.com/multiformats/go-multihash/issues).
|
||||||
|
|
||||||
|
Check out our [contributing document](https://github.com/multiformats/multiformats/blob/master/contributing.md) for more information on how we work, and about contributing in general. Please be aware that all interactions related to multiformats are subject to the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md).
|
||||||
|
|
||||||
|
Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](LICENSE) © 2014 Juan Batiz-Benet
|
||||||
97
vendor/github.com/multiformats/go-multihash/io.go
generated
vendored
Normal file
97
vendor/github.com/multiformats/go-multihash/io.go
generated
vendored
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
package multihash
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reader is an io.Reader wrapper that exposes a function
|
||||||
|
// to read a whole multihash, parse it, and return it.
|
||||||
|
type Reader interface {
|
||||||
|
io.Reader
|
||||||
|
|
||||||
|
ReadMultihash() (Multihash, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writer is an io.Writer wrapper that exposes a function
|
||||||
|
// to write a whole multihash.
|
||||||
|
type Writer interface {
|
||||||
|
io.Writer
|
||||||
|
|
||||||
|
WriteMultihash(Multihash) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewReader wraps an io.Reader with a multihash.Reader
|
||||||
|
func NewReader(r io.Reader) Reader {
|
||||||
|
return &mhReader{r}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWriter wraps an io.Writer with a multihash.Writer
|
||||||
|
func NewWriter(w io.Writer) Writer {
|
||||||
|
return &mhWriter{w}
|
||||||
|
}
|
||||||
|
|
||||||
|
type mhReader struct {
|
||||||
|
r io.Reader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *mhReader) Read(buf []byte) (n int, err error) {
|
||||||
|
return r.r.Read(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *mhReader) ReadByte() (byte, error) {
|
||||||
|
if br, ok := r.r.(io.ByteReader); ok {
|
||||||
|
return br.ReadByte()
|
||||||
|
}
|
||||||
|
b := make([]byte, 1)
|
||||||
|
_, err := r.r.Read(b)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return b[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *mhReader) ReadMultihash() (Multihash, error) {
|
||||||
|
code, err := binary.ReadUvarint(r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
length, err := binary.ReadUvarint(r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if length > math.MaxInt32 {
|
||||||
|
return nil, errors.New("digest too long, supporting only <= 2^31-1")
|
||||||
|
}
|
||||||
|
|
||||||
|
pre := make([]byte, 2*binary.MaxVarintLen64)
|
||||||
|
spot := pre
|
||||||
|
n := binary.PutUvarint(spot, code)
|
||||||
|
spot = pre[n:]
|
||||||
|
n += binary.PutUvarint(spot, length)
|
||||||
|
|
||||||
|
buf := make([]byte, int(length)+n)
|
||||||
|
copy(buf, pre[:n])
|
||||||
|
|
||||||
|
if _, err := io.ReadFull(r.r, buf[n:]); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return Cast(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
type mhWriter struct {
|
||||||
|
w io.Writer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *mhWriter) Write(buf []byte) (n int, err error) {
|
||||||
|
return w.w.Write(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *mhWriter) WriteMultihash(m Multihash) error {
|
||||||
|
_, err := w.w.Write([]byte(m))
|
||||||
|
return err
|
||||||
|
}
|
||||||
309
vendor/github.com/multiformats/go-multihash/multihash.go
generated
vendored
Normal file
309
vendor/github.com/multiformats/go-multihash/multihash.go
generated
vendored
Normal file
|
|
@ -0,0 +1,309 @@
|
||||||
|
// Package multihash is the Go implementation of
|
||||||
|
// https://github.com/multiformats/multihash, or self-describing
|
||||||
|
// hashes.
|
||||||
|
package multihash
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
|
||||||
|
b58 "github.com/jbenet/go-base58"
|
||||||
|
)
|
||||||
|
|
||||||
|
// errors
|
||||||
|
var (
|
||||||
|
ErrUnknownCode = errors.New("unknown multihash code")
|
||||||
|
ErrTooShort = errors.New("multihash too short. must be > 3 bytes")
|
||||||
|
ErrTooLong = errors.New("multihash too long. must be < 129 bytes")
|
||||||
|
ErrLenNotSupported = errors.New("multihash does not yet support digests longer than 127 bytes")
|
||||||
|
ErrInvalidMultihash = errors.New("input isn't valid multihash")
|
||||||
|
|
||||||
|
ErrVarintBufferShort = errors.New("uvarint: buffer too small")
|
||||||
|
ErrVarintTooLong = errors.New("uvarint: varint too big (max 64bit)")
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrInconsistentLen is returned when a decoded multihash has an inconsistent length
|
||||||
|
type ErrInconsistentLen struct {
|
||||||
|
dm *DecodedMultihash
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrInconsistentLen) Error() string {
|
||||||
|
return fmt.Sprintf("multihash length inconsistent: %v", e.dm)
|
||||||
|
}
|
||||||
|
|
||||||
|
// constants
|
||||||
|
const (
|
||||||
|
ID = 0x00
|
||||||
|
SHA1 = 0x11
|
||||||
|
SHA2_256 = 0x12
|
||||||
|
SHA2_512 = 0x13
|
||||||
|
SHA3_224 = 0x17
|
||||||
|
SHA3_256 = 0x16
|
||||||
|
SHA3_384 = 0x15
|
||||||
|
SHA3_512 = 0x14
|
||||||
|
SHA3 = SHA3_512
|
||||||
|
KECCAK_224 = 0x1A
|
||||||
|
KECCAK_256 = 0x1B
|
||||||
|
KECCAK_384 = 0x1C
|
||||||
|
KECCAK_512 = 0x1D
|
||||||
|
|
||||||
|
SHAKE_128 = 0x18
|
||||||
|
SHAKE_256 = 0x19
|
||||||
|
|
||||||
|
BLAKE2B_MIN = 0xb201
|
||||||
|
BLAKE2B_MAX = 0xb240
|
||||||
|
BLAKE2S_MIN = 0xb241
|
||||||
|
BLAKE2S_MAX = 0xb260
|
||||||
|
|
||||||
|
DBL_SHA2_256 = 0x56
|
||||||
|
|
||||||
|
MURMUR3 = 0x22
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// Add blake2b (64 codes)
|
||||||
|
for c := uint64(BLAKE2B_MIN); c <= BLAKE2B_MAX; c++ {
|
||||||
|
n := c - BLAKE2B_MIN + 1
|
||||||
|
name := fmt.Sprintf("blake2b-%d", n*8)
|
||||||
|
Names[name] = c
|
||||||
|
Codes[c] = name
|
||||||
|
DefaultLengths[c] = int(n)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add blake2s (32 codes)
|
||||||
|
for c := uint64(BLAKE2S_MIN); c <= BLAKE2S_MAX; c++ {
|
||||||
|
n := c - BLAKE2S_MIN + 1
|
||||||
|
name := fmt.Sprintf("blake2s-%d", n*8)
|
||||||
|
Names[name] = c
|
||||||
|
Codes[c] = name
|
||||||
|
DefaultLengths[c] = int(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Names maps the name of a hash to the code
|
||||||
|
var Names = map[string]uint64{
|
||||||
|
"id": ID,
|
||||||
|
"sha1": SHA1,
|
||||||
|
"sha2-256": SHA2_256,
|
||||||
|
"sha2-512": SHA2_512,
|
||||||
|
"sha3": SHA3_512,
|
||||||
|
"sha3-224": SHA3_224,
|
||||||
|
"sha3-256": SHA3_256,
|
||||||
|
"sha3-384": SHA3_384,
|
||||||
|
"sha3-512": SHA3_512,
|
||||||
|
"dbl-sha2-256": DBL_SHA2_256,
|
||||||
|
"murmur3": MURMUR3,
|
||||||
|
"keccak-224": KECCAK_224,
|
||||||
|
"keccak-256": KECCAK_256,
|
||||||
|
"keccak-384": KECCAK_384,
|
||||||
|
"keccak-512": KECCAK_512,
|
||||||
|
"shake-128": SHAKE_128,
|
||||||
|
"shake-256": SHAKE_256,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Codes maps a hash code to it's name
|
||||||
|
var Codes = map[uint64]string{
|
||||||
|
ID: "id",
|
||||||
|
SHA1: "sha1",
|
||||||
|
SHA2_256: "sha2-256",
|
||||||
|
SHA2_512: "sha2-512",
|
||||||
|
SHA3_224: "sha3-224",
|
||||||
|
SHA3_256: "sha3-256",
|
||||||
|
SHA3_384: "sha3-384",
|
||||||
|
SHA3_512: "sha3-512",
|
||||||
|
DBL_SHA2_256: "dbl-sha2-256",
|
||||||
|
MURMUR3: "murmur3",
|
||||||
|
KECCAK_224: "keccak-224",
|
||||||
|
KECCAK_256: "keccak-256",
|
||||||
|
KECCAK_384: "keccak-384",
|
||||||
|
KECCAK_512: "keccak-512",
|
||||||
|
SHAKE_128: "shake-128",
|
||||||
|
SHAKE_256: "shake-256",
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultLengths maps a hash code to it's default length
|
||||||
|
var DefaultLengths = map[uint64]int{
|
||||||
|
ID: -1,
|
||||||
|
SHA1: 20,
|
||||||
|
SHA2_256: 32,
|
||||||
|
SHA2_512: 64,
|
||||||
|
SHA3_224: 28,
|
||||||
|
SHA3_256: 32,
|
||||||
|
SHA3_384: 48,
|
||||||
|
SHA3_512: 64,
|
||||||
|
DBL_SHA2_256: 32,
|
||||||
|
KECCAK_224: 28,
|
||||||
|
KECCAK_256: 32,
|
||||||
|
MURMUR3: 4,
|
||||||
|
KECCAK_384: 48,
|
||||||
|
KECCAK_512: 64,
|
||||||
|
SHAKE_128: 32,
|
||||||
|
SHAKE_256: 64,
|
||||||
|
}
|
||||||
|
|
||||||
|
func uvarint(buf []byte) (uint64, []byte, error) {
|
||||||
|
n, c := binary.Uvarint(buf)
|
||||||
|
|
||||||
|
if c == 0 {
|
||||||
|
return n, buf, ErrVarintBufferShort
|
||||||
|
} else if c < 0 {
|
||||||
|
return n, buf[-c:], ErrVarintTooLong
|
||||||
|
} else {
|
||||||
|
return n, buf[c:], nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecodedMultihash represents a parsed multihash and allows
|
||||||
|
// easy access to the different parts of a multihash.
|
||||||
|
type DecodedMultihash struct {
|
||||||
|
Code uint64
|
||||||
|
Name string
|
||||||
|
Length int // Length is just int as it is type of len() opearator
|
||||||
|
Digest []byte // Digest holds the raw multihash bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multihash is byte slice with the following form:
|
||||||
|
// <hash function code><digest size><hash function output>.
|
||||||
|
// See the spec for more information.
|
||||||
|
type Multihash []byte
|
||||||
|
|
||||||
|
// HexString returns the hex-encoded representation of a multihash.
|
||||||
|
func (m *Multihash) HexString() string {
|
||||||
|
return hex.EncodeToString([]byte(*m))
|
||||||
|
}
|
||||||
|
|
||||||
|
// String is an alias to HexString().
|
||||||
|
func (m *Multihash) String() string {
|
||||||
|
return m.HexString()
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromHexString parses a hex-encoded multihash.
|
||||||
|
func FromHexString(s string) (Multihash, error) {
|
||||||
|
b, err := hex.DecodeString(s)
|
||||||
|
if err != nil {
|
||||||
|
return Multihash{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return Cast(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// B58String returns the B58-encoded representation of a multihash.
|
||||||
|
func (m Multihash) B58String() string {
|
||||||
|
return b58.Encode([]byte(m))
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromB58String parses a B58-encoded multihash.
|
||||||
|
func FromB58String(s string) (m Multihash, err error) {
|
||||||
|
// panic handler, in case we try accessing bytes incorrectly.
|
||||||
|
defer func() {
|
||||||
|
if e := recover(); e != nil {
|
||||||
|
m = Multihash{}
|
||||||
|
err = e.(error)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
//b58 smells like it can panic...
|
||||||
|
b := b58.Decode(s)
|
||||||
|
if len(b) == 0 {
|
||||||
|
return Multihash{}, ErrInvalidMultihash
|
||||||
|
}
|
||||||
|
|
||||||
|
return Cast(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cast casts a buffer onto a multihash, and returns an error
|
||||||
|
// if it does not work.
|
||||||
|
func Cast(buf []byte) (Multihash, error) {
|
||||||
|
dm, err := Decode(buf)
|
||||||
|
if err != nil {
|
||||||
|
return Multihash{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ValidCode(dm.Code) {
|
||||||
|
return Multihash{}, ErrUnknownCode
|
||||||
|
}
|
||||||
|
|
||||||
|
return Multihash(buf), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode parses multihash bytes into a DecodedMultihash.
|
||||||
|
func Decode(buf []byte) (*DecodedMultihash, error) {
|
||||||
|
|
||||||
|
if len(buf) < 3 {
|
||||||
|
return nil, ErrTooShort
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
var code, length uint64
|
||||||
|
|
||||||
|
code, buf, err = uvarint(buf)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
length, buf, err = uvarint(buf)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if length > math.MaxInt32 {
|
||||||
|
return nil, errors.New("digest too long, supporting only <= 2^31-1")
|
||||||
|
}
|
||||||
|
|
||||||
|
dm := &DecodedMultihash{
|
||||||
|
Code: code,
|
||||||
|
Name: Codes[code],
|
||||||
|
Length: int(length),
|
||||||
|
Digest: buf,
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(dm.Digest) != dm.Length {
|
||||||
|
return nil, ErrInconsistentLen{dm}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dm, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode a hash digest along with the specified function code.
|
||||||
|
// Note: the length is derived from the length of the digest itself.
|
||||||
|
func Encode(buf []byte, code uint64) ([]byte, error) {
|
||||||
|
|
||||||
|
if !ValidCode(code) {
|
||||||
|
return nil, ErrUnknownCode
|
||||||
|
}
|
||||||
|
|
||||||
|
start := make([]byte, 2*binary.MaxVarintLen64)
|
||||||
|
spot := start
|
||||||
|
n := binary.PutUvarint(spot, code)
|
||||||
|
spot = start[n:]
|
||||||
|
n += binary.PutUvarint(spot, uint64(len(buf)))
|
||||||
|
|
||||||
|
return append(start[:n], buf...), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// EncodeName is like Encode() but providing a string name
|
||||||
|
// instead of a numeric code. See Names for allowed values.
|
||||||
|
func EncodeName(buf []byte, name string) ([]byte, error) {
|
||||||
|
return Encode(buf, Names[name])
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidCode checks whether a multihash code is valid.
|
||||||
|
func ValidCode(code uint64) bool {
|
||||||
|
if AppCode(code) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := Codes[code]; ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppCode checks whether a multihash code is part of the App range.
|
||||||
|
func AppCode(code uint64) bool {
|
||||||
|
return code >= 0 && code < 0x10
|
||||||
|
}
|
||||||
42
vendor/github.com/multiformats/go-multihash/package.json
generated
vendored
Normal file
42
vendor/github.com/multiformats/go-multihash/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"author": "multiformats",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/multiformats/go-multihash/issues"
|
||||||
|
},
|
||||||
|
"gx": {
|
||||||
|
"dvcsimport": "github.com/multiformats/go-multihash"
|
||||||
|
},
|
||||||
|
"gxDependencies": [
|
||||||
|
{
|
||||||
|
"author": "whyrusleeping",
|
||||||
|
"hash": "QmaPHkZLbQQbvcyavn8q1GFHg6o6yeceyHFSJ3Pjf3p3TQ",
|
||||||
|
"name": "go-crypto",
|
||||||
|
"version": "0.0.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "whyrusleeping",
|
||||||
|
"hash": "QmT8rehPR3F6bmwL6zjUN8XpiDBFFpMP2myPdC6ApsWfJf",
|
||||||
|
"name": "go-base58",
|
||||||
|
"version": "0.0.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "whyrusleeping",
|
||||||
|
"hash": "QmQPWTeQJnJE7MYu6dJTiNTQRNuqBr41dis6UgY6Uekmgd",
|
||||||
|
"name": "keccakpg",
|
||||||
|
"version": "0.0.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "whyrusleeping",
|
||||||
|
"hash": "QmfJHywXQu98UeZtGJBQrPAR6AtmDjjbe3qjTo9piXHPnx",
|
||||||
|
"name": "murmur3",
|
||||||
|
"version": "0.0.0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"gxVersion": "0.9.0",
|
||||||
|
"language": "go",
|
||||||
|
"license": "MIT",
|
||||||
|
"name": "go-multihash",
|
||||||
|
"releaseCmd": "git commit -a -m \"gx release $VERSION\"",
|
||||||
|
"version": "1.0.5"
|
||||||
|
}
|
||||||
|
|
||||||
209
vendor/github.com/multiformats/go-multihash/sum.go
generated
vendored
Normal file
209
vendor/github.com/multiformats/go-multihash/sum.go
generated
vendored
Normal file
|
|
@ -0,0 +1,209 @@
|
||||||
|
package multihash
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/sha1"
|
||||||
|
"crypto/sha256"
|
||||||
|
"crypto/sha512"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/spaolacci/murmur3"
|
||||||
|
blake2b "golang.org/x/crypto/blake2b"
|
||||||
|
blake2s "golang.org/x/crypto/blake2s"
|
||||||
|
sha3 "golang.org/x/crypto/sha3"
|
||||||
|
keccak "leb.io/hashland/keccakpg"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrSumNotSupported is returned when the Sum function code is not implemented
|
||||||
|
var ErrSumNotSupported = errors.New("Function not implemented. Complain to lib maintainer.")
|
||||||
|
|
||||||
|
// Sum obtains the cryptographic sum of a given buffer. The length parameter
|
||||||
|
// indicates the length of the resulting digest and passing a negative value
|
||||||
|
// use default length values for the selected hash function.
|
||||||
|
func Sum(data []byte, code uint64, length int) (Multihash, error) {
|
||||||
|
m := Multihash{}
|
||||||
|
err := error(nil)
|
||||||
|
if !ValidCode(code) {
|
||||||
|
return m, fmt.Errorf("invalid multihash code %d", code)
|
||||||
|
}
|
||||||
|
|
||||||
|
if length < 0 {
|
||||||
|
var ok bool
|
||||||
|
length, ok = DefaultLengths[code]
|
||||||
|
if !ok {
|
||||||
|
return m, fmt.Errorf("no default length for code %d", code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var d []byte
|
||||||
|
switch {
|
||||||
|
case isBlake2s(code):
|
||||||
|
olen := code - BLAKE2S_MIN + 1
|
||||||
|
switch olen {
|
||||||
|
case 32:
|
||||||
|
out := blake2s.Sum256(data)
|
||||||
|
d = out[:]
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unsupported length for blake2s: %d", olen)
|
||||||
|
}
|
||||||
|
case isBlake2b(code):
|
||||||
|
olen := code - BLAKE2B_MIN + 1
|
||||||
|
switch olen {
|
||||||
|
case 32:
|
||||||
|
out := blake2b.Sum256(data)
|
||||||
|
d = out[:]
|
||||||
|
case 48:
|
||||||
|
out := blake2b.Sum384(data)
|
||||||
|
d = out[:]
|
||||||
|
case 64:
|
||||||
|
out := blake2b.Sum512(data)
|
||||||
|
d = out[:]
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unsupported length for blake2b: %d", olen)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
switch code {
|
||||||
|
case ID:
|
||||||
|
d = sumID(data)
|
||||||
|
case SHA1:
|
||||||
|
d = sumSHA1(data)
|
||||||
|
case SHA2_256:
|
||||||
|
d = sumSHA256(data)
|
||||||
|
case SHA2_512:
|
||||||
|
d = sumSHA512(data)
|
||||||
|
case KECCAK_224:
|
||||||
|
d = sumKeccak224(data)
|
||||||
|
case KECCAK_256:
|
||||||
|
d = sumKeccak256(data)
|
||||||
|
case KECCAK_384:
|
||||||
|
d = sumKeccak384(data)
|
||||||
|
case KECCAK_512:
|
||||||
|
d = sumKeccak512(data)
|
||||||
|
case SHA3_224:
|
||||||
|
d = sumSHA3_224(data)
|
||||||
|
case SHA3_256:
|
||||||
|
d = sumSHA3_256(data)
|
||||||
|
case SHA3_384:
|
||||||
|
d = sumSHA3_384(data)
|
||||||
|
case SHA3_512:
|
||||||
|
d = sumSHA3_512(data)
|
||||||
|
case DBL_SHA2_256:
|
||||||
|
d = sumSHA256(sumSHA256(data))
|
||||||
|
case MURMUR3:
|
||||||
|
d, err = sumMURMUR3(data)
|
||||||
|
case SHAKE_128:
|
||||||
|
d = sumSHAKE128(data)
|
||||||
|
case SHAKE_256:
|
||||||
|
d = sumSHAKE256(data)
|
||||||
|
default:
|
||||||
|
return m, ErrSumNotSupported
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return m, err
|
||||||
|
}
|
||||||
|
if length >= 0 {
|
||||||
|
d = d[:length]
|
||||||
|
}
|
||||||
|
return Encode(d, code)
|
||||||
|
}
|
||||||
|
|
||||||
|
func isBlake2s(code uint64) bool {
|
||||||
|
return code >= BLAKE2S_MIN && code <= BLAKE2S_MAX
|
||||||
|
}
|
||||||
|
func isBlake2b(code uint64) bool {
|
||||||
|
return code >= BLAKE2B_MIN && code <= BLAKE2B_MAX
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumID(data []byte) []byte {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHA1(data []byte) []byte {
|
||||||
|
a := sha1.Sum(data)
|
||||||
|
return a[0:20]
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHA256(data []byte) []byte {
|
||||||
|
a := sha256.Sum256(data)
|
||||||
|
return a[0:32]
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHA512(data []byte) []byte {
|
||||||
|
a := sha512.Sum512(data)
|
||||||
|
return a[0:64]
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumKeccak224(data []byte) []byte {
|
||||||
|
h := keccak.New224()
|
||||||
|
h.Write(data)
|
||||||
|
return h.Sum(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumKeccak256(data []byte) []byte {
|
||||||
|
h := keccak.New256()
|
||||||
|
h.Write(data)
|
||||||
|
return h.Sum(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumKeccak384(data []byte) []byte {
|
||||||
|
h := keccak.New384()
|
||||||
|
h.Write(data)
|
||||||
|
return h.Sum(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumKeccak512(data []byte) []byte {
|
||||||
|
h := keccak.New512()
|
||||||
|
h.Write(data)
|
||||||
|
return h.Sum(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHA3(data []byte) ([]byte, error) {
|
||||||
|
h := sha3.New512()
|
||||||
|
if _, err := h.Write(data); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return h.Sum(nil), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHA3_512(data []byte) []byte {
|
||||||
|
a := sha3.Sum512(data)
|
||||||
|
return a[:]
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumMURMUR3(data []byte) ([]byte, error) {
|
||||||
|
number := murmur3.Sum32(data)
|
||||||
|
bytes := make([]byte, 4)
|
||||||
|
for i := range bytes {
|
||||||
|
bytes[i] = byte(number & 0xff)
|
||||||
|
number >>= 8
|
||||||
|
}
|
||||||
|
return bytes, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHAKE128(data []byte) []byte {
|
||||||
|
bytes := make([]byte, 32)
|
||||||
|
sha3.ShakeSum128(bytes, data)
|
||||||
|
return bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHAKE256(data []byte) []byte {
|
||||||
|
bytes := make([]byte, 64)
|
||||||
|
sha3.ShakeSum256(bytes, data)
|
||||||
|
return bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHA3_384(data []byte) []byte {
|
||||||
|
a := sha3.Sum384(data)
|
||||||
|
return a[:]
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHA3_256(data []byte) []byte {
|
||||||
|
a := sha3.Sum256(data)
|
||||||
|
return a[:]
|
||||||
|
}
|
||||||
|
|
||||||
|
func sumSHA3_224(data []byte) []byte {
|
||||||
|
a := sha3.Sum224(data)
|
||||||
|
return a[:]
|
||||||
|
}
|
||||||
24
vendor/github.com/spaolacci/murmur3/LICENSE
generated
vendored
Normal file
24
vendor/github.com/spaolacci/murmur3/LICENSE
generated
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
Copyright 2013, Sébastien Paolacci.
|
||||||
|
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 the library 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 <COPYRIGHT HOLDER> 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.
|
||||||
86
vendor/github.com/spaolacci/murmur3/README.md
generated
vendored
Normal file
86
vendor/github.com/spaolacci/murmur3/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
murmur3
|
||||||
|
=======
|
||||||
|
|
||||||
|
[](https://travis-ci.org/spaolacci/murmur3)
|
||||||
|
|
||||||
|
Native Go implementation of Austin Appleby's third MurmurHash revision (aka
|
||||||
|
MurmurHash3).
|
||||||
|
|
||||||
|
Reference algorithm has been slightly hacked as to support the streaming mode
|
||||||
|
required by Go's standard [Hash interface](http://golang.org/pkg/hash/#Hash).
|
||||||
|
|
||||||
|
|
||||||
|
Benchmarks
|
||||||
|
----------
|
||||||
|
|
||||||
|
Go tip as of 2014-06-12 (i.e almost go1.3), core i7 @ 3.4 Ghz. All runs
|
||||||
|
include hasher instantiation and sequence finalization.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
Benchmark32_1 500000000 7.69 ns/op 130.00 MB/s
|
||||||
|
Benchmark32_2 200000000 8.83 ns/op 226.42 MB/s
|
||||||
|
Benchmark32_4 500000000 7.99 ns/op 500.39 MB/s
|
||||||
|
Benchmark32_8 200000000 9.47 ns/op 844.69 MB/s
|
||||||
|
Benchmark32_16 100000000 12.1 ns/op 1321.61 MB/s
|
||||||
|
Benchmark32_32 100000000 18.3 ns/op 1743.93 MB/s
|
||||||
|
Benchmark32_64 50000000 30.9 ns/op 2071.64 MB/s
|
||||||
|
Benchmark32_128 50000000 57.6 ns/op 2222.96 MB/s
|
||||||
|
Benchmark32_256 20000000 116 ns/op 2188.60 MB/s
|
||||||
|
Benchmark32_512 10000000 226 ns/op 2260.59 MB/s
|
||||||
|
Benchmark32_1024 5000000 452 ns/op 2263.73 MB/s
|
||||||
|
Benchmark32_2048 2000000 891 ns/op 2296.02 MB/s
|
||||||
|
Benchmark32_4096 1000000 1787 ns/op 2290.92 MB/s
|
||||||
|
Benchmark32_8192 500000 3593 ns/op 2279.68 MB/s
|
||||||
|
Benchmark128_1 100000000 26.1 ns/op 38.33 MB/s
|
||||||
|
Benchmark128_2 100000000 29.0 ns/op 69.07 MB/s
|
||||||
|
Benchmark128_4 50000000 29.8 ns/op 134.17 MB/s
|
||||||
|
Benchmark128_8 50000000 31.6 ns/op 252.86 MB/s
|
||||||
|
Benchmark128_16 100000000 26.5 ns/op 603.42 MB/s
|
||||||
|
Benchmark128_32 100000000 28.6 ns/op 1117.15 MB/s
|
||||||
|
Benchmark128_64 50000000 35.5 ns/op 1800.97 MB/s
|
||||||
|
Benchmark128_128 50000000 50.9 ns/op 2515.50 MB/s
|
||||||
|
Benchmark128_256 20000000 76.9 ns/op 3330.11 MB/s
|
||||||
|
Benchmark128_512 20000000 135 ns/op 3769.09 MB/s
|
||||||
|
Benchmark128_1024 10000000 250 ns/op 4094.38 MB/s
|
||||||
|
Benchmark128_2048 5000000 477 ns/op 4290.75 MB/s
|
||||||
|
Benchmark128_4096 2000000 940 ns/op 4353.29 MB/s
|
||||||
|
Benchmark128_8192 1000000 1838 ns/op 4455.47 MB/s
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
benchmark Go1.0 MB/s Go1.1 MB/s speedup Go1.2 MB/s speedup Go1.3 MB/s speedup
|
||||||
|
Benchmark32_1 98.90 118.59 1.20x 114.79 0.97x 130.00 1.13x
|
||||||
|
Benchmark32_2 168.04 213.31 1.27x 210.65 0.99x 226.42 1.07x
|
||||||
|
Benchmark32_4 414.01 494.19 1.19x 490.29 0.99x 500.39 1.02x
|
||||||
|
Benchmark32_8 662.19 836.09 1.26x 836.46 1.00x 844.69 1.01x
|
||||||
|
Benchmark32_16 917.46 1304.62 1.42x 1297.63 0.99x 1321.61 1.02x
|
||||||
|
Benchmark32_32 1141.93 1737.54 1.52x 1728.24 0.99x 1743.93 1.01x
|
||||||
|
Benchmark32_64 1289.47 2039.51 1.58x 2038.20 1.00x 2071.64 1.02x
|
||||||
|
Benchmark32_128 1299.23 2097.63 1.61x 2177.13 1.04x 2222.96 1.02x
|
||||||
|
Benchmark32_256 1369.90 2202.34 1.61x 2213.15 1.00x 2188.60 0.99x
|
||||||
|
Benchmark32_512 1399.56 2255.72 1.61x 2264.49 1.00x 2260.59 1.00x
|
||||||
|
Benchmark32_1024 1410.90 2285.82 1.62x 2270.99 0.99x 2263.73 1.00x
|
||||||
|
Benchmark32_2048 1422.14 2297.62 1.62x 2269.59 0.99x 2296.02 1.01x
|
||||||
|
Benchmark32_4096 1420.53 2307.81 1.62x 2273.43 0.99x 2290.92 1.01x
|
||||||
|
Benchmark32_8192 1424.79 2312.87 1.62x 2286.07 0.99x 2279.68 1.00x
|
||||||
|
Benchmark128_1 8.32 30.15 3.62x 30.84 1.02x 38.33 1.24x
|
||||||
|
Benchmark128_2 16.38 59.72 3.65x 59.37 0.99x 69.07 1.16x
|
||||||
|
Benchmark128_4 32.26 112.96 3.50x 114.24 1.01x 134.17 1.17x
|
||||||
|
Benchmark128_8 62.68 217.88 3.48x 218.18 1.00x 252.86 1.16x
|
||||||
|
Benchmark128_16 128.47 451.57 3.51x 474.65 1.05x 603.42 1.27x
|
||||||
|
Benchmark128_32 246.18 910.42 3.70x 871.06 0.96x 1117.15 1.28x
|
||||||
|
Benchmark128_64 449.05 1477.64 3.29x 1449.24 0.98x 1800.97 1.24x
|
||||||
|
Benchmark128_128 762.61 2222.42 2.91x 2217.30 1.00x 2515.50 1.13x
|
||||||
|
Benchmark128_256 1179.92 3005.46 2.55x 2931.55 0.98x 3330.11 1.14x
|
||||||
|
Benchmark128_512 1616.51 3590.75 2.22x 3592.08 1.00x 3769.09 1.05x
|
||||||
|
Benchmark128_1024 1964.36 3979.67 2.03x 4034.01 1.01x 4094.38 1.01x
|
||||||
|
Benchmark128_2048 2225.07 4156.93 1.87x 4244.17 1.02x 4290.75 1.01x
|
||||||
|
Benchmark128_4096 2360.15 4299.09 1.82x 4392.35 1.02x 4353.29 0.99x
|
||||||
|
Benchmark128_8192 2411.50 4356.84 1.81x 4480.68 1.03x 4455.47 0.99x
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
|
||||||
64
vendor/github.com/spaolacci/murmur3/murmur.go
generated
vendored
Normal file
64
vendor/github.com/spaolacci/murmur3/murmur.go
generated
vendored
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
// Copyright 2013, Sébastien Paolacci. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package murmur3 implements Austin Appleby's non-cryptographic MurmurHash3.
|
||||||
|
|
||||||
|
Reference implementation:
|
||||||
|
http://code.google.com/p/smhasher/wiki/MurmurHash3
|
||||||
|
|
||||||
|
History, characteristics and (legacy) perfs:
|
||||||
|
https://sites.google.com/site/murmurhash/
|
||||||
|
https://sites.google.com/site/murmurhash/statistics
|
||||||
|
*/
|
||||||
|
package murmur3
|
||||||
|
|
||||||
|
type bmixer interface {
|
||||||
|
bmix(p []byte) (tail []byte)
|
||||||
|
Size() (n int)
|
||||||
|
reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
type digest struct {
|
||||||
|
clen int // Digested input cumulative length.
|
||||||
|
tail []byte // 0 to Size()-1 bytes view of `buf'.
|
||||||
|
buf [16]byte // Expected (but not required) to be Size() large.
|
||||||
|
seed uint32 // Seed for initializing the hash.
|
||||||
|
bmixer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) BlockSize() int { return 1 }
|
||||||
|
|
||||||
|
func (d *digest) Write(p []byte) (n int, err error) {
|
||||||
|
n = len(p)
|
||||||
|
d.clen += n
|
||||||
|
|
||||||
|
if len(d.tail) > 0 {
|
||||||
|
// Stick back pending bytes.
|
||||||
|
nfree := d.Size() - len(d.tail) // nfree ∈ [1, d.Size()-1].
|
||||||
|
if nfree < len(p) {
|
||||||
|
// One full block can be formed.
|
||||||
|
block := append(d.tail, p[:nfree]...)
|
||||||
|
p = p[nfree:]
|
||||||
|
_ = d.bmix(block) // No tail.
|
||||||
|
} else {
|
||||||
|
// Tail's buf is large enough to prevent reallocs.
|
||||||
|
p = append(d.tail, p...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
d.tail = d.bmix(p)
|
||||||
|
|
||||||
|
// Keep own copy of the 0 to Size()-1 pending bytes.
|
||||||
|
nn := copy(d.buf[:], d.tail)
|
||||||
|
d.tail = d.buf[:nn]
|
||||||
|
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) Reset() {
|
||||||
|
d.clen = 0
|
||||||
|
d.tail = nil
|
||||||
|
d.bmixer.reset()
|
||||||
|
}
|
||||||
203
vendor/github.com/spaolacci/murmur3/murmur128.go
generated
vendored
Normal file
203
vendor/github.com/spaolacci/murmur3/murmur128.go
generated
vendored
Normal file
|
|
@ -0,0 +1,203 @@
|
||||||
|
package murmur3
|
||||||
|
|
||||||
|
import (
|
||||||
|
//"encoding/binary"
|
||||||
|
"hash"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
c1_128 = 0x87c37b91114253d5
|
||||||
|
c2_128 = 0x4cf5ad432745937f
|
||||||
|
)
|
||||||
|
|
||||||
|
// Make sure interfaces are correctly implemented.
|
||||||
|
var (
|
||||||
|
_ hash.Hash = new(digest128)
|
||||||
|
_ Hash128 = new(digest128)
|
||||||
|
_ bmixer = new(digest128)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Hash128 represents a 128-bit hasher
|
||||||
|
// Hack: the standard api doesn't define any Hash128 interface.
|
||||||
|
type Hash128 interface {
|
||||||
|
hash.Hash
|
||||||
|
Sum128() (uint64, uint64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// digest128 represents a partial evaluation of a 128 bites hash.
|
||||||
|
type digest128 struct {
|
||||||
|
digest
|
||||||
|
h1 uint64 // Unfinalized running hash part 1.
|
||||||
|
h2 uint64 // Unfinalized running hash part 2.
|
||||||
|
}
|
||||||
|
|
||||||
|
// New128 returns a 128-bit hasher
|
||||||
|
func New128() Hash128 { return New128WithSeed(0) }
|
||||||
|
|
||||||
|
// New128WithSeed returns a 128-bit hasher set with explicit seed value
|
||||||
|
func New128WithSeed(seed uint32) Hash128 {
|
||||||
|
d := new(digest128)
|
||||||
|
d.seed = seed
|
||||||
|
d.bmixer = d
|
||||||
|
d.Reset()
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest128) Size() int { return 16 }
|
||||||
|
|
||||||
|
func (d *digest128) reset() { d.h1, d.h2 = uint64(d.seed), uint64(d.seed) }
|
||||||
|
|
||||||
|
func (d *digest128) Sum(b []byte) []byte {
|
||||||
|
h1, h2 := d.Sum128()
|
||||||
|
return append(b,
|
||||||
|
byte(h1>>56), byte(h1>>48), byte(h1>>40), byte(h1>>32),
|
||||||
|
byte(h1>>24), byte(h1>>16), byte(h1>>8), byte(h1),
|
||||||
|
|
||||||
|
byte(h2>>56), byte(h2>>48), byte(h2>>40), byte(h2>>32),
|
||||||
|
byte(h2>>24), byte(h2>>16), byte(h2>>8), byte(h2),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest128) bmix(p []byte) (tail []byte) {
|
||||||
|
h1, h2 := d.h1, d.h2
|
||||||
|
|
||||||
|
nblocks := len(p) / 16
|
||||||
|
for i := 0; i < nblocks; i++ {
|
||||||
|
t := (*[2]uint64)(unsafe.Pointer(&p[i*16]))
|
||||||
|
k1, k2 := t[0], t[1]
|
||||||
|
|
||||||
|
k1 *= c1_128
|
||||||
|
k1 = (k1 << 31) | (k1 >> 33) // rotl64(k1, 31)
|
||||||
|
k1 *= c2_128
|
||||||
|
h1 ^= k1
|
||||||
|
|
||||||
|
h1 = (h1 << 27) | (h1 >> 37) // rotl64(h1, 27)
|
||||||
|
h1 += h2
|
||||||
|
h1 = h1*5 + 0x52dce729
|
||||||
|
|
||||||
|
k2 *= c2_128
|
||||||
|
k2 = (k2 << 33) | (k2 >> 31) // rotl64(k2, 33)
|
||||||
|
k2 *= c1_128
|
||||||
|
h2 ^= k2
|
||||||
|
|
||||||
|
h2 = (h2 << 31) | (h2 >> 33) // rotl64(h2, 31)
|
||||||
|
h2 += h1
|
||||||
|
h2 = h2*5 + 0x38495ab5
|
||||||
|
}
|
||||||
|
d.h1, d.h2 = h1, h2
|
||||||
|
return p[nblocks*d.Size():]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest128) Sum128() (h1, h2 uint64) {
|
||||||
|
|
||||||
|
h1, h2 = d.h1, d.h2
|
||||||
|
|
||||||
|
var k1, k2 uint64
|
||||||
|
switch len(d.tail) & 15 {
|
||||||
|
case 15:
|
||||||
|
k2 ^= uint64(d.tail[14]) << 48
|
||||||
|
fallthrough
|
||||||
|
case 14:
|
||||||
|
k2 ^= uint64(d.tail[13]) << 40
|
||||||
|
fallthrough
|
||||||
|
case 13:
|
||||||
|
k2 ^= uint64(d.tail[12]) << 32
|
||||||
|
fallthrough
|
||||||
|
case 12:
|
||||||
|
k2 ^= uint64(d.tail[11]) << 24
|
||||||
|
fallthrough
|
||||||
|
case 11:
|
||||||
|
k2 ^= uint64(d.tail[10]) << 16
|
||||||
|
fallthrough
|
||||||
|
case 10:
|
||||||
|
k2 ^= uint64(d.tail[9]) << 8
|
||||||
|
fallthrough
|
||||||
|
case 9:
|
||||||
|
k2 ^= uint64(d.tail[8]) << 0
|
||||||
|
|
||||||
|
k2 *= c2_128
|
||||||
|
k2 = (k2 << 33) | (k2 >> 31) // rotl64(k2, 33)
|
||||||
|
k2 *= c1_128
|
||||||
|
h2 ^= k2
|
||||||
|
|
||||||
|
fallthrough
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
k1 ^= uint64(d.tail[7]) << 56
|
||||||
|
fallthrough
|
||||||
|
case 7:
|
||||||
|
k1 ^= uint64(d.tail[6]) << 48
|
||||||
|
fallthrough
|
||||||
|
case 6:
|
||||||
|
k1 ^= uint64(d.tail[5]) << 40
|
||||||
|
fallthrough
|
||||||
|
case 5:
|
||||||
|
k1 ^= uint64(d.tail[4]) << 32
|
||||||
|
fallthrough
|
||||||
|
case 4:
|
||||||
|
k1 ^= uint64(d.tail[3]) << 24
|
||||||
|
fallthrough
|
||||||
|
case 3:
|
||||||
|
k1 ^= uint64(d.tail[2]) << 16
|
||||||
|
fallthrough
|
||||||
|
case 2:
|
||||||
|
k1 ^= uint64(d.tail[1]) << 8
|
||||||
|
fallthrough
|
||||||
|
case 1:
|
||||||
|
k1 ^= uint64(d.tail[0]) << 0
|
||||||
|
k1 *= c1_128
|
||||||
|
k1 = (k1 << 31) | (k1 >> 33) // rotl64(k1, 31)
|
||||||
|
k1 *= c2_128
|
||||||
|
h1 ^= k1
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 ^= uint64(d.clen)
|
||||||
|
h2 ^= uint64(d.clen)
|
||||||
|
|
||||||
|
h1 += h2
|
||||||
|
h2 += h1
|
||||||
|
|
||||||
|
h1 = fmix64(h1)
|
||||||
|
h2 = fmix64(h2)
|
||||||
|
|
||||||
|
h1 += h2
|
||||||
|
h2 += h1
|
||||||
|
|
||||||
|
return h1, h2
|
||||||
|
}
|
||||||
|
|
||||||
|
func fmix64(k uint64) uint64 {
|
||||||
|
k ^= k >> 33
|
||||||
|
k *= 0xff51afd7ed558ccd
|
||||||
|
k ^= k >> 33
|
||||||
|
k *= 0xc4ceb9fe1a85ec53
|
||||||
|
k ^= k >> 33
|
||||||
|
return k
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
func rotl64(x uint64, r byte) uint64 {
|
||||||
|
return (x << r) | (x >> (64 - r))
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Sum128 returns the MurmurHash3 sum of data. It is equivalent to the
|
||||||
|
// following sequence (without the extra burden and the extra allocation):
|
||||||
|
// hasher := New128()
|
||||||
|
// hasher.Write(data)
|
||||||
|
// return hasher.Sum128()
|
||||||
|
func Sum128(data []byte) (h1 uint64, h2 uint64) { return Sum128WithSeed(data, 0) }
|
||||||
|
|
||||||
|
// Sum128WithSeed returns the MurmurHash3 sum of data. It is equivalent to the
|
||||||
|
// following sequence (without the extra burden and the extra allocation):
|
||||||
|
// hasher := New128WithSeed(seed)
|
||||||
|
// hasher.Write(data)
|
||||||
|
// return hasher.Sum128()
|
||||||
|
func Sum128WithSeed(data []byte, seed uint32) (h1 uint64, h2 uint64) {
|
||||||
|
d := &digest128{h1: uint64(seed), h2: uint64(seed)}
|
||||||
|
d.seed = seed
|
||||||
|
d.tail = d.bmix(data)
|
||||||
|
d.clen = len(data)
|
||||||
|
return d.Sum128()
|
||||||
|
}
|
||||||
167
vendor/github.com/spaolacci/murmur3/murmur32.go
generated
vendored
Normal file
167
vendor/github.com/spaolacci/murmur3/murmur32.go
generated
vendored
Normal file
|
|
@ -0,0 +1,167 @@
|
||||||
|
package murmur3
|
||||||
|
|
||||||
|
// http://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/hash/Murmur3_32HashFunction.java
|
||||||
|
|
||||||
|
import (
|
||||||
|
"hash"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Make sure interfaces are correctly implemented.
|
||||||
|
var (
|
||||||
|
_ hash.Hash = new(digest32)
|
||||||
|
_ hash.Hash32 = new(digest32)
|
||||||
|
_ bmixer = new(digest32)
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
c1_32 uint32 = 0xcc9e2d51
|
||||||
|
c2_32 uint32 = 0x1b873593
|
||||||
|
)
|
||||||
|
|
||||||
|
// digest32 represents a partial evaluation of a 32 bites hash.
|
||||||
|
type digest32 struct {
|
||||||
|
digest
|
||||||
|
h1 uint32 // Unfinalized running hash.
|
||||||
|
}
|
||||||
|
|
||||||
|
// New32 returns new 32-bit hasher
|
||||||
|
func New32() hash.Hash32 { return New32WithSeed(0) }
|
||||||
|
|
||||||
|
// New32WithSeed returns new 32-bit hasher set with explicit seed value
|
||||||
|
func New32WithSeed(seed uint32) hash.Hash32 {
|
||||||
|
d := new(digest32)
|
||||||
|
d.seed = seed
|
||||||
|
d.bmixer = d
|
||||||
|
d.Reset()
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest32) Size() int { return 4 }
|
||||||
|
|
||||||
|
func (d *digest32) reset() { d.h1 = d.seed }
|
||||||
|
|
||||||
|
func (d *digest32) Sum(b []byte) []byte {
|
||||||
|
h := d.Sum32()
|
||||||
|
return append(b, byte(h>>24), byte(h>>16), byte(h>>8), byte(h))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Digest as many blocks as possible.
|
||||||
|
func (d *digest32) bmix(p []byte) (tail []byte) {
|
||||||
|
h1 := d.h1
|
||||||
|
|
||||||
|
nblocks := len(p) / 4
|
||||||
|
for i := 0; i < nblocks; i++ {
|
||||||
|
k1 := *(*uint32)(unsafe.Pointer(&p[i*4]))
|
||||||
|
|
||||||
|
k1 *= c1_32
|
||||||
|
k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15)
|
||||||
|
k1 *= c2_32
|
||||||
|
|
||||||
|
h1 ^= k1
|
||||||
|
h1 = (h1 << 13) | (h1 >> 19) // rotl32(h1, 13)
|
||||||
|
h1 = h1*4 + h1 + 0xe6546b64
|
||||||
|
}
|
||||||
|
d.h1 = h1
|
||||||
|
return p[nblocks*d.Size():]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest32) Sum32() (h1 uint32) {
|
||||||
|
|
||||||
|
h1 = d.h1
|
||||||
|
|
||||||
|
var k1 uint32
|
||||||
|
switch len(d.tail) & 3 {
|
||||||
|
case 3:
|
||||||
|
k1 ^= uint32(d.tail[2]) << 16
|
||||||
|
fallthrough
|
||||||
|
case 2:
|
||||||
|
k1 ^= uint32(d.tail[1]) << 8
|
||||||
|
fallthrough
|
||||||
|
case 1:
|
||||||
|
k1 ^= uint32(d.tail[0])
|
||||||
|
k1 *= c1_32
|
||||||
|
k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15)
|
||||||
|
k1 *= c2_32
|
||||||
|
h1 ^= k1
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 ^= uint32(d.clen)
|
||||||
|
|
||||||
|
h1 ^= h1 >> 16
|
||||||
|
h1 *= 0x85ebca6b
|
||||||
|
h1 ^= h1 >> 13
|
||||||
|
h1 *= 0xc2b2ae35
|
||||||
|
h1 ^= h1 >> 16
|
||||||
|
|
||||||
|
return h1
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
func rotl32(x uint32, r byte) uint32 {
|
||||||
|
return (x << r) | (x >> (32 - r))
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Sum32 returns the MurmurHash3 sum of data. It is equivalent to the
|
||||||
|
// following sequence (without the extra burden and the extra allocation):
|
||||||
|
// hasher := New32()
|
||||||
|
// hasher.Write(data)
|
||||||
|
// return hasher.Sum32()
|
||||||
|
func Sum32(data []byte) uint32 { return Sum32WithSeed(data, 0) }
|
||||||
|
|
||||||
|
// Sum32WithSeed returns the MurmurHash3 sum of data. It is equivalent to the
|
||||||
|
// following sequence (without the extra burden and the extra allocation):
|
||||||
|
// hasher := New32WithSeed(seed)
|
||||||
|
// hasher.Write(data)
|
||||||
|
// return hasher.Sum32()
|
||||||
|
func Sum32WithSeed(data []byte, seed uint32) uint32 {
|
||||||
|
|
||||||
|
h1 := seed
|
||||||
|
|
||||||
|
nblocks := len(data) / 4
|
||||||
|
var p uintptr
|
||||||
|
if len(data) > 0 {
|
||||||
|
p = uintptr(unsafe.Pointer(&data[0]))
|
||||||
|
}
|
||||||
|
p1 := p + uintptr(4*nblocks)
|
||||||
|
for ; p < p1; p += 4 {
|
||||||
|
k1 := *(*uint32)(unsafe.Pointer(p))
|
||||||
|
|
||||||
|
k1 *= c1_32
|
||||||
|
k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15)
|
||||||
|
k1 *= c2_32
|
||||||
|
|
||||||
|
h1 ^= k1
|
||||||
|
h1 = (h1 << 13) | (h1 >> 19) // rotl32(h1, 13)
|
||||||
|
h1 = h1*4 + h1 + 0xe6546b64
|
||||||
|
}
|
||||||
|
|
||||||
|
tail := data[nblocks*4:]
|
||||||
|
|
||||||
|
var k1 uint32
|
||||||
|
switch len(tail) & 3 {
|
||||||
|
case 3:
|
||||||
|
k1 ^= uint32(tail[2]) << 16
|
||||||
|
fallthrough
|
||||||
|
case 2:
|
||||||
|
k1 ^= uint32(tail[1]) << 8
|
||||||
|
fallthrough
|
||||||
|
case 1:
|
||||||
|
k1 ^= uint32(tail[0])
|
||||||
|
k1 *= c1_32
|
||||||
|
k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15)
|
||||||
|
k1 *= c2_32
|
||||||
|
h1 ^= k1
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 ^= uint32(len(data))
|
||||||
|
|
||||||
|
h1 ^= h1 >> 16
|
||||||
|
h1 *= 0x85ebca6b
|
||||||
|
h1 ^= h1 >> 13
|
||||||
|
h1 *= 0xc2b2ae35
|
||||||
|
h1 ^= h1 >> 16
|
||||||
|
|
||||||
|
return h1
|
||||||
|
}
|
||||||
57
vendor/github.com/spaolacci/murmur3/murmur64.go
generated
vendored
Normal file
57
vendor/github.com/spaolacci/murmur3/murmur64.go
generated
vendored
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
package murmur3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Make sure interfaces are correctly implemented.
|
||||||
|
var (
|
||||||
|
_ hash.Hash = new(digest64)
|
||||||
|
_ hash.Hash64 = new(digest64)
|
||||||
|
_ bmixer = new(digest64)
|
||||||
|
)
|
||||||
|
|
||||||
|
// digest64 is half a digest128.
|
||||||
|
type digest64 digest128
|
||||||
|
|
||||||
|
// New64 returns a 64-bit hasher
|
||||||
|
func New64() hash.Hash64 { return New64WithSeed(0) }
|
||||||
|
|
||||||
|
// New64WithSeed returns a 64-bit hasher set with explicit seed value
|
||||||
|
func New64WithSeed(seed uint32) hash.Hash64 {
|
||||||
|
d := (*digest64)(New128WithSeed(seed).(*digest128))
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest64) Sum(b []byte) []byte {
|
||||||
|
h1 := d.Sum64()
|
||||||
|
return append(b,
|
||||||
|
byte(h1>>56), byte(h1>>48), byte(h1>>40), byte(h1>>32),
|
||||||
|
byte(h1>>24), byte(h1>>16), byte(h1>>8), byte(h1))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest64) Sum64() uint64 {
|
||||||
|
h1, _ := (*digest128)(d).Sum128()
|
||||||
|
return h1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum64 returns the MurmurHash3 sum of data. It is equivalent to the
|
||||||
|
// following sequence (without the extra burden and the extra allocation):
|
||||||
|
// hasher := New64()
|
||||||
|
// hasher.Write(data)
|
||||||
|
// return hasher.Sum64()
|
||||||
|
func Sum64(data []byte) uint64 { return Sum64WithSeed(data, 0) }
|
||||||
|
|
||||||
|
// Sum64WithSeed returns the MurmurHash3 sum of data. It is equivalent to the
|
||||||
|
// following sequence (without the extra burden and the extra allocation):
|
||||||
|
// hasher := New64WithSeed(seed)
|
||||||
|
// hasher.Write(data)
|
||||||
|
// return hasher.Sum64()
|
||||||
|
func Sum64WithSeed(data []byte, seed uint32) uint64 {
|
||||||
|
d := &digest128{h1: uint64(seed), h2: uint64(seed)}
|
||||||
|
d.seed = seed
|
||||||
|
d.tail = d.bmix(data)
|
||||||
|
d.clen = len(data)
|
||||||
|
h1, _ := d.Sum128()
|
||||||
|
return h1
|
||||||
|
}
|
||||||
194
vendor/golang.org/x/crypto/blake2b/blake2b.go
generated
vendored
Normal file
194
vendor/golang.org/x/crypto/blake2b/blake2b.go
generated
vendored
Normal file
|
|
@ -0,0 +1,194 @@
|
||||||
|
// 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 blake2b implements the BLAKE2b hash algorithm as
|
||||||
|
// defined in RFC 7693.
|
||||||
|
package blake2b // import "golang.org/x/crypto/blake2b"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
|
"hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// The blocksize of BLAKE2b in bytes.
|
||||||
|
BlockSize = 128
|
||||||
|
// The hash size of BLAKE2b-512 in bytes.
|
||||||
|
Size = 64
|
||||||
|
// The hash size of BLAKE2b-384 in bytes.
|
||||||
|
Size384 = 48
|
||||||
|
// The hash size of BLAKE2b-256 in bytes.
|
||||||
|
Size256 = 32
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
useAVX2 bool
|
||||||
|
useAVX bool
|
||||||
|
useSSE4 bool
|
||||||
|
)
|
||||||
|
|
||||||
|
var errKeySize = errors.New("blake2b: invalid key size")
|
||||||
|
|
||||||
|
var iv = [8]uint64{
|
||||||
|
0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
|
||||||
|
0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum512 returns the BLAKE2b-512 checksum of the data.
|
||||||
|
func Sum512(data []byte) [Size]byte {
|
||||||
|
var sum [Size]byte
|
||||||
|
checkSum(&sum, Size, data)
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum384 returns the BLAKE2b-384 checksum of the data.
|
||||||
|
func Sum384(data []byte) [Size384]byte {
|
||||||
|
var sum [Size]byte
|
||||||
|
var sum384 [Size384]byte
|
||||||
|
checkSum(&sum, Size384, data)
|
||||||
|
copy(sum384[:], sum[:Size384])
|
||||||
|
return sum384
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum256 returns the BLAKE2b-256 checksum of the data.
|
||||||
|
func Sum256(data []byte) [Size256]byte {
|
||||||
|
var sum [Size]byte
|
||||||
|
var sum256 [Size256]byte
|
||||||
|
checkSum(&sum, Size256, data)
|
||||||
|
copy(sum256[:], sum[:Size256])
|
||||||
|
return sum256
|
||||||
|
}
|
||||||
|
|
||||||
|
// New512 returns a new hash.Hash computing the BLAKE2b-512 checksum. A non-nil
|
||||||
|
// key turns the hash into a MAC. The key must between zero and 64 bytes long.
|
||||||
|
func New512(key []byte) (hash.Hash, error) { return newDigest(Size, key) }
|
||||||
|
|
||||||
|
// New384 returns a new hash.Hash computing the BLAKE2b-384 checksum. A non-nil
|
||||||
|
// key turns the hash into a MAC. The key must between zero and 64 bytes long.
|
||||||
|
func New384(key []byte) (hash.Hash, error) { return newDigest(Size384, key) }
|
||||||
|
|
||||||
|
// New256 returns a new hash.Hash computing the BLAKE2b-256 checksum. A non-nil
|
||||||
|
// key turns the hash into a MAC. The key must between zero and 64 bytes long.
|
||||||
|
func New256(key []byte) (hash.Hash, error) { return newDigest(Size256, key) }
|
||||||
|
|
||||||
|
func newDigest(hashSize int, key []byte) (*digest, error) {
|
||||||
|
if len(key) > Size {
|
||||||
|
return nil, errKeySize
|
||||||
|
}
|
||||||
|
d := &digest{
|
||||||
|
size: hashSize,
|
||||||
|
keyLen: len(key),
|
||||||
|
}
|
||||||
|
copy(d.key[:], key)
|
||||||
|
d.Reset()
|
||||||
|
return d, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkSum(sum *[Size]byte, hashSize int, data []byte) {
|
||||||
|
h := iv
|
||||||
|
h[0] ^= uint64(hashSize) | (1 << 16) | (1 << 24)
|
||||||
|
var c [2]uint64
|
||||||
|
|
||||||
|
if length := len(data); length > BlockSize {
|
||||||
|
n := length &^ (BlockSize - 1)
|
||||||
|
if length == n {
|
||||||
|
n -= BlockSize
|
||||||
|
}
|
||||||
|
hashBlocks(&h, &c, 0, data[:n])
|
||||||
|
data = data[n:]
|
||||||
|
}
|
||||||
|
|
||||||
|
var block [BlockSize]byte
|
||||||
|
offset := copy(block[:], data)
|
||||||
|
remaining := uint64(BlockSize - offset)
|
||||||
|
if c[0] < remaining {
|
||||||
|
c[1]--
|
||||||
|
}
|
||||||
|
c[0] -= remaining
|
||||||
|
|
||||||
|
hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:])
|
||||||
|
|
||||||
|
for i, v := range h[:(hashSize+7)/8] {
|
||||||
|
binary.LittleEndian.PutUint64(sum[8*i:], v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type digest struct {
|
||||||
|
h [8]uint64
|
||||||
|
c [2]uint64
|
||||||
|
size int
|
||||||
|
block [BlockSize]byte
|
||||||
|
offset int
|
||||||
|
|
||||||
|
key [BlockSize]byte
|
||||||
|
keyLen int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) BlockSize() int { return BlockSize }
|
||||||
|
|
||||||
|
func (d *digest) Size() int { return d.size }
|
||||||
|
|
||||||
|
func (d *digest) Reset() {
|
||||||
|
d.h = iv
|
||||||
|
d.h[0] ^= uint64(d.size) | (uint64(d.keyLen) << 8) | (1 << 16) | (1 << 24)
|
||||||
|
d.offset, d.c[0], d.c[1] = 0, 0, 0
|
||||||
|
if d.keyLen > 0 {
|
||||||
|
d.block = d.key
|
||||||
|
d.offset = BlockSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) Write(p []byte) (n int, err error) {
|
||||||
|
n = len(p)
|
||||||
|
|
||||||
|
if d.offset > 0 {
|
||||||
|
remaining := BlockSize - d.offset
|
||||||
|
if n <= remaining {
|
||||||
|
d.offset += copy(d.block[d.offset:], p)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
copy(d.block[d.offset:], p[:remaining])
|
||||||
|
hashBlocks(&d.h, &d.c, 0, d.block[:])
|
||||||
|
d.offset = 0
|
||||||
|
p = p[remaining:]
|
||||||
|
}
|
||||||
|
|
||||||
|
if length := len(p); length > BlockSize {
|
||||||
|
nn := length &^ (BlockSize - 1)
|
||||||
|
if length == nn {
|
||||||
|
nn -= BlockSize
|
||||||
|
}
|
||||||
|
hashBlocks(&d.h, &d.c, 0, p[:nn])
|
||||||
|
p = p[nn:]
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(p) > 0 {
|
||||||
|
d.offset += copy(d.block[:], p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) Sum(b []byte) []byte {
|
||||||
|
var block [BlockSize]byte
|
||||||
|
copy(block[:], d.block[:d.offset])
|
||||||
|
remaining := uint64(BlockSize - d.offset)
|
||||||
|
|
||||||
|
c := d.c
|
||||||
|
if c[0] < remaining {
|
||||||
|
c[1]--
|
||||||
|
}
|
||||||
|
c[0] -= remaining
|
||||||
|
|
||||||
|
h := d.h
|
||||||
|
hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:])
|
||||||
|
|
||||||
|
var sum [Size]byte
|
||||||
|
for i, v := range h[:(d.size+7)/8] {
|
||||||
|
binary.LittleEndian.PutUint64(sum[8*i:], v)
|
||||||
|
}
|
||||||
|
|
||||||
|
return append(b, sum[:d.size]...)
|
||||||
|
}
|
||||||
43
vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go
generated
vendored
Normal file
43
vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go
generated
vendored
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build go1.7,amd64,!gccgo,!appengine
|
||||||
|
|
||||||
|
package blake2b
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
useAVX2 = supportsAVX2()
|
||||||
|
useAVX = supportsAVX()
|
||||||
|
useSSE4 = supportsSSE4()
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func supportsSSE4() bool
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func supportsAVX() bool
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func supportsAVX2() bool
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
|
||||||
|
|
||||||
|
func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
|
||||||
|
if useAVX2 {
|
||||||
|
hashBlocksAVX2(h, c, flag, blocks)
|
||||||
|
} else if useAVX {
|
||||||
|
hashBlocksAVX(h, c, flag, blocks)
|
||||||
|
} else if useSSE4 {
|
||||||
|
hashBlocksSSE4(h, c, flag, blocks)
|
||||||
|
} else {
|
||||||
|
hashBlocksGeneric(h, c, flag, blocks)
|
||||||
|
}
|
||||||
|
}
|
||||||
762
vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s
generated
vendored
Normal file
762
vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s
generated
vendored
Normal file
|
|
@ -0,0 +1,762 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build go1.7,amd64,!gccgo,!appengine
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
DATA ·AVX2_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908
|
||||||
|
DATA ·AVX2_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b
|
||||||
|
DATA ·AVX2_iv0<>+0x10(SB)/8, $0x3c6ef372fe94f82b
|
||||||
|
DATA ·AVX2_iv0<>+0x18(SB)/8, $0xa54ff53a5f1d36f1
|
||||||
|
GLOBL ·AVX2_iv0<>(SB), (NOPTR+RODATA), $32
|
||||||
|
|
||||||
|
DATA ·AVX2_iv1<>+0x00(SB)/8, $0x510e527fade682d1
|
||||||
|
DATA ·AVX2_iv1<>+0x08(SB)/8, $0x9b05688c2b3e6c1f
|
||||||
|
DATA ·AVX2_iv1<>+0x10(SB)/8, $0x1f83d9abfb41bd6b
|
||||||
|
DATA ·AVX2_iv1<>+0x18(SB)/8, $0x5be0cd19137e2179
|
||||||
|
GLOBL ·AVX2_iv1<>(SB), (NOPTR+RODATA), $32
|
||||||
|
|
||||||
|
DATA ·AVX2_c40<>+0x00(SB)/8, $0x0201000706050403
|
||||||
|
DATA ·AVX2_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b
|
||||||
|
DATA ·AVX2_c40<>+0x10(SB)/8, $0x0201000706050403
|
||||||
|
DATA ·AVX2_c40<>+0x18(SB)/8, $0x0a09080f0e0d0c0b
|
||||||
|
GLOBL ·AVX2_c40<>(SB), (NOPTR+RODATA), $32
|
||||||
|
|
||||||
|
DATA ·AVX2_c48<>+0x00(SB)/8, $0x0100070605040302
|
||||||
|
DATA ·AVX2_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a
|
||||||
|
DATA ·AVX2_c48<>+0x10(SB)/8, $0x0100070605040302
|
||||||
|
DATA ·AVX2_c48<>+0x18(SB)/8, $0x09080f0e0d0c0b0a
|
||||||
|
GLOBL ·AVX2_c48<>(SB), (NOPTR+RODATA), $32
|
||||||
|
|
||||||
|
DATA ·AVX_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908
|
||||||
|
DATA ·AVX_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b
|
||||||
|
GLOBL ·AVX_iv0<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·AVX_iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b
|
||||||
|
DATA ·AVX_iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1
|
||||||
|
GLOBL ·AVX_iv1<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·AVX_iv2<>+0x00(SB)/8, $0x510e527fade682d1
|
||||||
|
DATA ·AVX_iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f
|
||||||
|
GLOBL ·AVX_iv2<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·AVX_iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b
|
||||||
|
DATA ·AVX_iv3<>+0x08(SB)/8, $0x5be0cd19137e2179
|
||||||
|
GLOBL ·AVX_iv3<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·AVX_c40<>+0x00(SB)/8, $0x0201000706050403
|
||||||
|
DATA ·AVX_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b
|
||||||
|
GLOBL ·AVX_c40<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·AVX_c48<>+0x00(SB)/8, $0x0100070605040302
|
||||||
|
DATA ·AVX_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a
|
||||||
|
GLOBL ·AVX_c48<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
#define VPERMQ_0x39_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x39
|
||||||
|
#define VPERMQ_0x93_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x93
|
||||||
|
#define VPERMQ_0x4E_Y2_Y2 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xd2; BYTE $0x4e
|
||||||
|
#define VPERMQ_0x93_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x93
|
||||||
|
#define VPERMQ_0x39_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x39
|
||||||
|
|
||||||
|
#define ROUND_AVX2(m0, m1, m2, m3, t, c40, c48) \
|
||||||
|
VPADDQ m0, Y0, Y0; \
|
||||||
|
VPADDQ Y1, Y0, Y0; \
|
||||||
|
VPXOR Y0, Y3, Y3; \
|
||||||
|
VPSHUFD $-79, Y3, Y3; \
|
||||||
|
VPADDQ Y3, Y2, Y2; \
|
||||||
|
VPXOR Y2, Y1, Y1; \
|
||||||
|
VPSHUFB c40, Y1, Y1; \
|
||||||
|
VPADDQ m1, Y0, Y0; \
|
||||||
|
VPADDQ Y1, Y0, Y0; \
|
||||||
|
VPXOR Y0, Y3, Y3; \
|
||||||
|
VPSHUFB c48, Y3, Y3; \
|
||||||
|
VPADDQ Y3, Y2, Y2; \
|
||||||
|
VPXOR Y2, Y1, Y1; \
|
||||||
|
VPADDQ Y1, Y1, t; \
|
||||||
|
VPSRLQ $63, Y1, Y1; \
|
||||||
|
VPXOR t, Y1, Y1; \
|
||||||
|
VPERMQ_0x39_Y1_Y1; \
|
||||||
|
VPERMQ_0x4E_Y2_Y2; \
|
||||||
|
VPERMQ_0x93_Y3_Y3; \
|
||||||
|
VPADDQ m2, Y0, Y0; \
|
||||||
|
VPADDQ Y1, Y0, Y0; \
|
||||||
|
VPXOR Y0, Y3, Y3; \
|
||||||
|
VPSHUFD $-79, Y3, Y3; \
|
||||||
|
VPADDQ Y3, Y2, Y2; \
|
||||||
|
VPXOR Y2, Y1, Y1; \
|
||||||
|
VPSHUFB c40, Y1, Y1; \
|
||||||
|
VPADDQ m3, Y0, Y0; \
|
||||||
|
VPADDQ Y1, Y0, Y0; \
|
||||||
|
VPXOR Y0, Y3, Y3; \
|
||||||
|
VPSHUFB c48, Y3, Y3; \
|
||||||
|
VPADDQ Y3, Y2, Y2; \
|
||||||
|
VPXOR Y2, Y1, Y1; \
|
||||||
|
VPADDQ Y1, Y1, t; \
|
||||||
|
VPSRLQ $63, Y1, Y1; \
|
||||||
|
VPXOR t, Y1, Y1; \
|
||||||
|
VPERMQ_0x39_Y3_Y3; \
|
||||||
|
VPERMQ_0x4E_Y2_Y2; \
|
||||||
|
VPERMQ_0x93_Y1_Y1
|
||||||
|
|
||||||
|
#define VMOVQ_SI_X11_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x1E
|
||||||
|
#define VMOVQ_SI_X12_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x26
|
||||||
|
#define VMOVQ_SI_X13_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x2E
|
||||||
|
#define VMOVQ_SI_X14_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x36
|
||||||
|
#define VMOVQ_SI_X15_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x3E
|
||||||
|
|
||||||
|
#define VMOVQ_SI_X11(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x5E; BYTE $n
|
||||||
|
#define VMOVQ_SI_X12(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x66; BYTE $n
|
||||||
|
#define VMOVQ_SI_X13(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x6E; BYTE $n
|
||||||
|
#define VMOVQ_SI_X14(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x76; BYTE $n
|
||||||
|
#define VMOVQ_SI_X15(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x7E; BYTE $n
|
||||||
|
|
||||||
|
#define VPINSRQ_1_SI_X11_0 BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x1E; BYTE $0x01
|
||||||
|
#define VPINSRQ_1_SI_X12_0 BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x26; BYTE $0x01
|
||||||
|
#define VPINSRQ_1_SI_X13_0 BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x2E; BYTE $0x01
|
||||||
|
#define VPINSRQ_1_SI_X14_0 BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x36; BYTE $0x01
|
||||||
|
#define VPINSRQ_1_SI_X15_0 BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x3E; BYTE $0x01
|
||||||
|
|
||||||
|
#define VPINSRQ_1_SI_X11(n) BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x5E; BYTE $n; BYTE $0x01
|
||||||
|
#define VPINSRQ_1_SI_X12(n) BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x66; BYTE $n; BYTE $0x01
|
||||||
|
#define VPINSRQ_1_SI_X13(n) BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x6E; BYTE $n; BYTE $0x01
|
||||||
|
#define VPINSRQ_1_SI_X14(n) BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x76; BYTE $n; BYTE $0x01
|
||||||
|
#define VPINSRQ_1_SI_X15(n) BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x7E; BYTE $n; BYTE $0x01
|
||||||
|
|
||||||
|
#define VMOVQ_R8_X15 BYTE $0xC4; BYTE $0x41; BYTE $0xF9; BYTE $0x6E; BYTE $0xF8
|
||||||
|
#define VPINSRQ_1_R9_X15 BYTE $0xC4; BYTE $0x43; BYTE $0x81; BYTE $0x22; BYTE $0xF9; BYTE $0x01
|
||||||
|
|
||||||
|
// load msg: Y12 = (i0, i1, i2, i3)
|
||||||
|
// i0, i1, i2, i3 must not be 0
|
||||||
|
#define LOAD_MSG_AVX2_Y12(i0, i1, i2, i3) \
|
||||||
|
VMOVQ_SI_X12(i0*8); \
|
||||||
|
VMOVQ_SI_X11(i2*8); \
|
||||||
|
VPINSRQ_1_SI_X12(i1*8); \
|
||||||
|
VPINSRQ_1_SI_X11(i3*8); \
|
||||||
|
VINSERTI128 $1, X11, Y12, Y12
|
||||||
|
|
||||||
|
// load msg: Y13 = (i0, i1, i2, i3)
|
||||||
|
// i0, i1, i2, i3 must not be 0
|
||||||
|
#define LOAD_MSG_AVX2_Y13(i0, i1, i2, i3) \
|
||||||
|
VMOVQ_SI_X13(i0*8); \
|
||||||
|
VMOVQ_SI_X11(i2*8); \
|
||||||
|
VPINSRQ_1_SI_X13(i1*8); \
|
||||||
|
VPINSRQ_1_SI_X11(i3*8); \
|
||||||
|
VINSERTI128 $1, X11, Y13, Y13
|
||||||
|
|
||||||
|
// load msg: Y14 = (i0, i1, i2, i3)
|
||||||
|
// i0, i1, i2, i3 must not be 0
|
||||||
|
#define LOAD_MSG_AVX2_Y14(i0, i1, i2, i3) \
|
||||||
|
VMOVQ_SI_X14(i0*8); \
|
||||||
|
VMOVQ_SI_X11(i2*8); \
|
||||||
|
VPINSRQ_1_SI_X14(i1*8); \
|
||||||
|
VPINSRQ_1_SI_X11(i3*8); \
|
||||||
|
VINSERTI128 $1, X11, Y14, Y14
|
||||||
|
|
||||||
|
// load msg: Y15 = (i0, i1, i2, i3)
|
||||||
|
// i0, i1, i2, i3 must not be 0
|
||||||
|
#define LOAD_MSG_AVX2_Y15(i0, i1, i2, i3) \
|
||||||
|
VMOVQ_SI_X15(i0*8); \
|
||||||
|
VMOVQ_SI_X11(i2*8); \
|
||||||
|
VPINSRQ_1_SI_X15(i1*8); \
|
||||||
|
VPINSRQ_1_SI_X11(i3*8); \
|
||||||
|
VINSERTI128 $1, X11, Y15, Y15
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() \
|
||||||
|
VMOVQ_SI_X12_0; \
|
||||||
|
VMOVQ_SI_X11(4*8); \
|
||||||
|
VPINSRQ_1_SI_X12(2*8); \
|
||||||
|
VPINSRQ_1_SI_X11(6*8); \
|
||||||
|
VINSERTI128 $1, X11, Y12, Y12; \
|
||||||
|
LOAD_MSG_AVX2_Y13(1, 3, 5, 7); \
|
||||||
|
LOAD_MSG_AVX2_Y14(8, 10, 12, 14); \
|
||||||
|
LOAD_MSG_AVX2_Y15(9, 11, 13, 15)
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() \
|
||||||
|
LOAD_MSG_AVX2_Y12(14, 4, 9, 13); \
|
||||||
|
LOAD_MSG_AVX2_Y13(10, 8, 15, 6); \
|
||||||
|
VMOVQ_SI_X11(11*8); \
|
||||||
|
VPSHUFD $0x4E, 0*8(SI), X14; \
|
||||||
|
VPINSRQ_1_SI_X11(5*8); \
|
||||||
|
VINSERTI128 $1, X11, Y14, Y14; \
|
||||||
|
LOAD_MSG_AVX2_Y15(12, 2, 7, 3)
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() \
|
||||||
|
VMOVQ_SI_X11(5*8); \
|
||||||
|
VMOVDQU 11*8(SI), X12; \
|
||||||
|
VPINSRQ_1_SI_X11(15*8); \
|
||||||
|
VINSERTI128 $1, X11, Y12, Y12; \
|
||||||
|
VMOVQ_SI_X13(8*8); \
|
||||||
|
VMOVQ_SI_X11(2*8); \
|
||||||
|
VPINSRQ_1_SI_X13_0; \
|
||||||
|
VPINSRQ_1_SI_X11(13*8); \
|
||||||
|
VINSERTI128 $1, X11, Y13, Y13; \
|
||||||
|
LOAD_MSG_AVX2_Y14(10, 3, 7, 9); \
|
||||||
|
LOAD_MSG_AVX2_Y15(14, 6, 1, 4)
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() \
|
||||||
|
LOAD_MSG_AVX2_Y12(7, 3, 13, 11); \
|
||||||
|
LOAD_MSG_AVX2_Y13(9, 1, 12, 14); \
|
||||||
|
LOAD_MSG_AVX2_Y14(2, 5, 4, 15); \
|
||||||
|
VMOVQ_SI_X15(6*8); \
|
||||||
|
VMOVQ_SI_X11_0; \
|
||||||
|
VPINSRQ_1_SI_X15(10*8); \
|
||||||
|
VPINSRQ_1_SI_X11(8*8); \
|
||||||
|
VINSERTI128 $1, X11, Y15, Y15
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() \
|
||||||
|
LOAD_MSG_AVX2_Y12(9, 5, 2, 10); \
|
||||||
|
VMOVQ_SI_X13_0; \
|
||||||
|
VMOVQ_SI_X11(4*8); \
|
||||||
|
VPINSRQ_1_SI_X13(7*8); \
|
||||||
|
VPINSRQ_1_SI_X11(15*8); \
|
||||||
|
VINSERTI128 $1, X11, Y13, Y13; \
|
||||||
|
LOAD_MSG_AVX2_Y14(14, 11, 6, 3); \
|
||||||
|
LOAD_MSG_AVX2_Y15(1, 12, 8, 13)
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() \
|
||||||
|
VMOVQ_SI_X12(2*8); \
|
||||||
|
VMOVQ_SI_X11_0; \
|
||||||
|
VPINSRQ_1_SI_X12(6*8); \
|
||||||
|
VPINSRQ_1_SI_X11(8*8); \
|
||||||
|
VINSERTI128 $1, X11, Y12, Y12; \
|
||||||
|
LOAD_MSG_AVX2_Y13(12, 10, 11, 3); \
|
||||||
|
LOAD_MSG_AVX2_Y14(4, 7, 15, 1); \
|
||||||
|
LOAD_MSG_AVX2_Y15(13, 5, 14, 9)
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() \
|
||||||
|
LOAD_MSG_AVX2_Y12(12, 1, 14, 4); \
|
||||||
|
LOAD_MSG_AVX2_Y13(5, 15, 13, 10); \
|
||||||
|
VMOVQ_SI_X14_0; \
|
||||||
|
VPSHUFD $0x4E, 8*8(SI), X11; \
|
||||||
|
VPINSRQ_1_SI_X14(6*8); \
|
||||||
|
VINSERTI128 $1, X11, Y14, Y14; \
|
||||||
|
LOAD_MSG_AVX2_Y15(7, 3, 2, 11)
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() \
|
||||||
|
LOAD_MSG_AVX2_Y12(13, 7, 12, 3); \
|
||||||
|
LOAD_MSG_AVX2_Y13(11, 14, 1, 9); \
|
||||||
|
LOAD_MSG_AVX2_Y14(5, 15, 8, 2); \
|
||||||
|
VMOVQ_SI_X15_0; \
|
||||||
|
VMOVQ_SI_X11(6*8); \
|
||||||
|
VPINSRQ_1_SI_X15(4*8); \
|
||||||
|
VPINSRQ_1_SI_X11(10*8); \
|
||||||
|
VINSERTI128 $1, X11, Y15, Y15
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() \
|
||||||
|
VMOVQ_SI_X12(6*8); \
|
||||||
|
VMOVQ_SI_X11(11*8); \
|
||||||
|
VPINSRQ_1_SI_X12(14*8); \
|
||||||
|
VPINSRQ_1_SI_X11_0; \
|
||||||
|
VINSERTI128 $1, X11, Y12, Y12; \
|
||||||
|
LOAD_MSG_AVX2_Y13(15, 9, 3, 8); \
|
||||||
|
VMOVQ_SI_X11(1*8); \
|
||||||
|
VMOVDQU 12*8(SI), X14; \
|
||||||
|
VPINSRQ_1_SI_X11(10*8); \
|
||||||
|
VINSERTI128 $1, X11, Y14, Y14; \
|
||||||
|
VMOVQ_SI_X15(2*8); \
|
||||||
|
VMOVDQU 4*8(SI), X11; \
|
||||||
|
VPINSRQ_1_SI_X15(7*8); \
|
||||||
|
VINSERTI128 $1, X11, Y15, Y15
|
||||||
|
|
||||||
|
#define LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() \
|
||||||
|
LOAD_MSG_AVX2_Y12(10, 8, 7, 1); \
|
||||||
|
VMOVQ_SI_X13(2*8); \
|
||||||
|
VPSHUFD $0x4E, 5*8(SI), X11; \
|
||||||
|
VPINSRQ_1_SI_X13(4*8); \
|
||||||
|
VINSERTI128 $1, X11, Y13, Y13; \
|
||||||
|
LOAD_MSG_AVX2_Y14(15, 9, 3, 13); \
|
||||||
|
VMOVQ_SI_X15(11*8); \
|
||||||
|
VMOVQ_SI_X11(12*8); \
|
||||||
|
VPINSRQ_1_SI_X15(14*8); \
|
||||||
|
VPINSRQ_1_SI_X11_0; \
|
||||||
|
VINSERTI128 $1, X11, Y15, Y15
|
||||||
|
|
||||||
|
// func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
|
||||||
|
TEXT ·hashBlocksAVX2(SB), 4, $320-48 // frame size = 288 + 32 byte alignment
|
||||||
|
MOVQ h+0(FP), AX
|
||||||
|
MOVQ c+8(FP), BX
|
||||||
|
MOVQ flag+16(FP), CX
|
||||||
|
MOVQ blocks_base+24(FP), SI
|
||||||
|
MOVQ blocks_len+32(FP), DI
|
||||||
|
|
||||||
|
MOVQ SP, DX
|
||||||
|
MOVQ SP, R9
|
||||||
|
ADDQ $31, R9
|
||||||
|
ANDQ $~31, R9
|
||||||
|
MOVQ R9, SP
|
||||||
|
|
||||||
|
MOVQ CX, 16(SP)
|
||||||
|
XORQ CX, CX
|
||||||
|
MOVQ CX, 24(SP)
|
||||||
|
|
||||||
|
VMOVDQU ·AVX2_c40<>(SB), Y4
|
||||||
|
VMOVDQU ·AVX2_c48<>(SB), Y5
|
||||||
|
|
||||||
|
VMOVDQU 0(AX), Y8
|
||||||
|
VMOVDQU 32(AX), Y9
|
||||||
|
VMOVDQU ·AVX2_iv0<>(SB), Y6
|
||||||
|
VMOVDQU ·AVX2_iv1<>(SB), Y7
|
||||||
|
|
||||||
|
MOVQ 0(BX), R8
|
||||||
|
MOVQ 8(BX), R9
|
||||||
|
MOVQ R9, 8(SP)
|
||||||
|
|
||||||
|
loop:
|
||||||
|
ADDQ $128, R8
|
||||||
|
MOVQ R8, 0(SP)
|
||||||
|
CMPQ R8, $128
|
||||||
|
JGE noinc
|
||||||
|
INCQ R9
|
||||||
|
MOVQ R9, 8(SP)
|
||||||
|
|
||||||
|
noinc:
|
||||||
|
VMOVDQA Y8, Y0
|
||||||
|
VMOVDQA Y9, Y1
|
||||||
|
VMOVDQA Y6, Y2
|
||||||
|
VPXOR 0(SP), Y7, Y3
|
||||||
|
|
||||||
|
LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15()
|
||||||
|
VMOVDQA Y12, 32(SP)
|
||||||
|
VMOVDQA Y13, 64(SP)
|
||||||
|
VMOVDQA Y14, 96(SP)
|
||||||
|
VMOVDQA Y15, 128(SP)
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3()
|
||||||
|
VMOVDQA Y12, 160(SP)
|
||||||
|
VMOVDQA Y13, 192(SP)
|
||||||
|
VMOVDQA Y14, 224(SP)
|
||||||
|
VMOVDQA Y15, 256(SP)
|
||||||
|
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4()
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8()
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13()
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9()
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11()
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10()
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5()
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0()
|
||||||
|
ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
|
||||||
|
|
||||||
|
ROUND_AVX2(32(SP), 64(SP), 96(SP), 128(SP), Y10, Y4, Y5)
|
||||||
|
ROUND_AVX2(160(SP), 192(SP), 224(SP), 256(SP), Y10, Y4, Y5)
|
||||||
|
|
||||||
|
VPXOR Y0, Y8, Y8
|
||||||
|
VPXOR Y1, Y9, Y9
|
||||||
|
VPXOR Y2, Y8, Y8
|
||||||
|
VPXOR Y3, Y9, Y9
|
||||||
|
|
||||||
|
LEAQ 128(SI), SI
|
||||||
|
SUBQ $128, DI
|
||||||
|
JNE loop
|
||||||
|
|
||||||
|
MOVQ R8, 0(BX)
|
||||||
|
MOVQ R9, 8(BX)
|
||||||
|
|
||||||
|
VMOVDQU Y8, 0(AX)
|
||||||
|
VMOVDQU Y9, 32(AX)
|
||||||
|
VZEROUPPER
|
||||||
|
|
||||||
|
MOVQ DX, SP
|
||||||
|
RET
|
||||||
|
|
||||||
|
#define VPUNPCKLQDQ_X2_X2_X15 BYTE $0xC5; BYTE $0x69; BYTE $0x6C; BYTE $0xFA
|
||||||
|
#define VPUNPCKLQDQ_X3_X3_X15 BYTE $0xC5; BYTE $0x61; BYTE $0x6C; BYTE $0xFB
|
||||||
|
#define VPUNPCKLQDQ_X7_X7_X15 BYTE $0xC5; BYTE $0x41; BYTE $0x6C; BYTE $0xFF
|
||||||
|
#define VPUNPCKLQDQ_X13_X13_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x11; BYTE $0x6C; BYTE $0xFD
|
||||||
|
#define VPUNPCKLQDQ_X14_X14_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x09; BYTE $0x6C; BYTE $0xFE
|
||||||
|
|
||||||
|
#define VPUNPCKHQDQ_X15_X2_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x69; BYTE $0x6D; BYTE $0xD7
|
||||||
|
#define VPUNPCKHQDQ_X15_X3_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xDF
|
||||||
|
#define VPUNPCKHQDQ_X15_X6_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x49; BYTE $0x6D; BYTE $0xF7
|
||||||
|
#define VPUNPCKHQDQ_X15_X7_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xFF
|
||||||
|
#define VPUNPCKHQDQ_X15_X3_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xD7
|
||||||
|
#define VPUNPCKHQDQ_X15_X7_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xF7
|
||||||
|
#define VPUNPCKHQDQ_X15_X13_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xDF
|
||||||
|
#define VPUNPCKHQDQ_X15_X13_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xFF
|
||||||
|
|
||||||
|
#define SHUFFLE_AVX() \
|
||||||
|
VMOVDQA X6, X13; \
|
||||||
|
VMOVDQA X2, X14; \
|
||||||
|
VMOVDQA X4, X6; \
|
||||||
|
VPUNPCKLQDQ_X13_X13_X15; \
|
||||||
|
VMOVDQA X5, X4; \
|
||||||
|
VMOVDQA X6, X5; \
|
||||||
|
VPUNPCKHQDQ_X15_X7_X6; \
|
||||||
|
VPUNPCKLQDQ_X7_X7_X15; \
|
||||||
|
VPUNPCKHQDQ_X15_X13_X7; \
|
||||||
|
VPUNPCKLQDQ_X3_X3_X15; \
|
||||||
|
VPUNPCKHQDQ_X15_X2_X2; \
|
||||||
|
VPUNPCKLQDQ_X14_X14_X15; \
|
||||||
|
VPUNPCKHQDQ_X15_X3_X3; \
|
||||||
|
|
||||||
|
#define SHUFFLE_AVX_INV() \
|
||||||
|
VMOVDQA X2, X13; \
|
||||||
|
VMOVDQA X4, X14; \
|
||||||
|
VPUNPCKLQDQ_X2_X2_X15; \
|
||||||
|
VMOVDQA X5, X4; \
|
||||||
|
VPUNPCKHQDQ_X15_X3_X2; \
|
||||||
|
VMOVDQA X14, X5; \
|
||||||
|
VPUNPCKLQDQ_X3_X3_X15; \
|
||||||
|
VMOVDQA X6, X14; \
|
||||||
|
VPUNPCKHQDQ_X15_X13_X3; \
|
||||||
|
VPUNPCKLQDQ_X7_X7_X15; \
|
||||||
|
VPUNPCKHQDQ_X15_X6_X6; \
|
||||||
|
VPUNPCKLQDQ_X14_X14_X15; \
|
||||||
|
VPUNPCKHQDQ_X15_X7_X7; \
|
||||||
|
|
||||||
|
#define HALF_ROUND_AVX(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \
|
||||||
|
VPADDQ m0, v0, v0; \
|
||||||
|
VPADDQ v2, v0, v0; \
|
||||||
|
VPADDQ m1, v1, v1; \
|
||||||
|
VPADDQ v3, v1, v1; \
|
||||||
|
VPXOR v0, v6, v6; \
|
||||||
|
VPXOR v1, v7, v7; \
|
||||||
|
VPSHUFD $-79, v6, v6; \
|
||||||
|
VPSHUFD $-79, v7, v7; \
|
||||||
|
VPADDQ v6, v4, v4; \
|
||||||
|
VPADDQ v7, v5, v5; \
|
||||||
|
VPXOR v4, v2, v2; \
|
||||||
|
VPXOR v5, v3, v3; \
|
||||||
|
VPSHUFB c40, v2, v2; \
|
||||||
|
VPSHUFB c40, v3, v3; \
|
||||||
|
VPADDQ m2, v0, v0; \
|
||||||
|
VPADDQ v2, v0, v0; \
|
||||||
|
VPADDQ m3, v1, v1; \
|
||||||
|
VPADDQ v3, v1, v1; \
|
||||||
|
VPXOR v0, v6, v6; \
|
||||||
|
VPXOR v1, v7, v7; \
|
||||||
|
VPSHUFB c48, v6, v6; \
|
||||||
|
VPSHUFB c48, v7, v7; \
|
||||||
|
VPADDQ v6, v4, v4; \
|
||||||
|
VPADDQ v7, v5, v5; \
|
||||||
|
VPXOR v4, v2, v2; \
|
||||||
|
VPXOR v5, v3, v3; \
|
||||||
|
VPADDQ v2, v2, t0; \
|
||||||
|
VPSRLQ $63, v2, v2; \
|
||||||
|
VPXOR t0, v2, v2; \
|
||||||
|
VPADDQ v3, v3, t0; \
|
||||||
|
VPSRLQ $63, v3, v3; \
|
||||||
|
VPXOR t0, v3, v3
|
||||||
|
|
||||||
|
// load msg: X12 = (i0, i1), X13 = (i2, i3), X14 = (i4, i5), X15 = (i6, i7)
|
||||||
|
// i0, i1, i2, i3, i4, i5, i6, i7 must not be 0
|
||||||
|
#define LOAD_MSG_AVX(i0, i1, i2, i3, i4, i5, i6, i7) \
|
||||||
|
VMOVQ_SI_X12(i0*8); \
|
||||||
|
VMOVQ_SI_X13(i2*8); \
|
||||||
|
VMOVQ_SI_X14(i4*8); \
|
||||||
|
VMOVQ_SI_X15(i6*8); \
|
||||||
|
VPINSRQ_1_SI_X12(i1*8); \
|
||||||
|
VPINSRQ_1_SI_X13(i3*8); \
|
||||||
|
VPINSRQ_1_SI_X14(i5*8); \
|
||||||
|
VPINSRQ_1_SI_X15(i7*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (0, 2), X13 = (4, 6), X14 = (1, 3), X15 = (5, 7)
|
||||||
|
#define LOAD_MSG_AVX_0_2_4_6_1_3_5_7() \
|
||||||
|
VMOVQ_SI_X12_0; \
|
||||||
|
VMOVQ_SI_X13(4*8); \
|
||||||
|
VMOVQ_SI_X14(1*8); \
|
||||||
|
VMOVQ_SI_X15(5*8); \
|
||||||
|
VPINSRQ_1_SI_X12(2*8); \
|
||||||
|
VPINSRQ_1_SI_X13(6*8); \
|
||||||
|
VPINSRQ_1_SI_X14(3*8); \
|
||||||
|
VPINSRQ_1_SI_X15(7*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (1, 0), X13 = (11, 5), X14 = (12, 2), X15 = (7, 3)
|
||||||
|
#define LOAD_MSG_AVX_1_0_11_5_12_2_7_3() \
|
||||||
|
VPSHUFD $0x4E, 0*8(SI), X12; \
|
||||||
|
VMOVQ_SI_X13(11*8); \
|
||||||
|
VMOVQ_SI_X14(12*8); \
|
||||||
|
VMOVQ_SI_X15(7*8); \
|
||||||
|
VPINSRQ_1_SI_X13(5*8); \
|
||||||
|
VPINSRQ_1_SI_X14(2*8); \
|
||||||
|
VPINSRQ_1_SI_X15(3*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (11, 12), X13 = (5, 15), X14 = (8, 0), X15 = (2, 13)
|
||||||
|
#define LOAD_MSG_AVX_11_12_5_15_8_0_2_13() \
|
||||||
|
VMOVDQU 11*8(SI), X12; \
|
||||||
|
VMOVQ_SI_X13(5*8); \
|
||||||
|
VMOVQ_SI_X14(8*8); \
|
||||||
|
VMOVQ_SI_X15(2*8); \
|
||||||
|
VPINSRQ_1_SI_X13(15*8); \
|
||||||
|
VPINSRQ_1_SI_X14_0; \
|
||||||
|
VPINSRQ_1_SI_X15(13*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (2, 5), X13 = (4, 15), X14 = (6, 10), X15 = (0, 8)
|
||||||
|
#define LOAD_MSG_AVX_2_5_4_15_6_10_0_8() \
|
||||||
|
VMOVQ_SI_X12(2*8); \
|
||||||
|
VMOVQ_SI_X13(4*8); \
|
||||||
|
VMOVQ_SI_X14(6*8); \
|
||||||
|
VMOVQ_SI_X15_0; \
|
||||||
|
VPINSRQ_1_SI_X12(5*8); \
|
||||||
|
VPINSRQ_1_SI_X13(15*8); \
|
||||||
|
VPINSRQ_1_SI_X14(10*8); \
|
||||||
|
VPINSRQ_1_SI_X15(8*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (9, 5), X13 = (2, 10), X14 = (0, 7), X15 = (4, 15)
|
||||||
|
#define LOAD_MSG_AVX_9_5_2_10_0_7_4_15() \
|
||||||
|
VMOVQ_SI_X12(9*8); \
|
||||||
|
VMOVQ_SI_X13(2*8); \
|
||||||
|
VMOVQ_SI_X14_0; \
|
||||||
|
VMOVQ_SI_X15(4*8); \
|
||||||
|
VPINSRQ_1_SI_X12(5*8); \
|
||||||
|
VPINSRQ_1_SI_X13(10*8); \
|
||||||
|
VPINSRQ_1_SI_X14(7*8); \
|
||||||
|
VPINSRQ_1_SI_X15(15*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (2, 6), X13 = (0, 8), X14 = (12, 10), X15 = (11, 3)
|
||||||
|
#define LOAD_MSG_AVX_2_6_0_8_12_10_11_3() \
|
||||||
|
VMOVQ_SI_X12(2*8); \
|
||||||
|
VMOVQ_SI_X13_0; \
|
||||||
|
VMOVQ_SI_X14(12*8); \
|
||||||
|
VMOVQ_SI_X15(11*8); \
|
||||||
|
VPINSRQ_1_SI_X12(6*8); \
|
||||||
|
VPINSRQ_1_SI_X13(8*8); \
|
||||||
|
VPINSRQ_1_SI_X14(10*8); \
|
||||||
|
VPINSRQ_1_SI_X15(3*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (0, 6), X13 = (9, 8), X14 = (7, 3), X15 = (2, 11)
|
||||||
|
#define LOAD_MSG_AVX_0_6_9_8_7_3_2_11() \
|
||||||
|
MOVQ 0*8(SI), X12; \
|
||||||
|
VPSHUFD $0x4E, 8*8(SI), X13; \
|
||||||
|
MOVQ 7*8(SI), X14; \
|
||||||
|
MOVQ 2*8(SI), X15; \
|
||||||
|
VPINSRQ_1_SI_X12(6*8); \
|
||||||
|
VPINSRQ_1_SI_X14(3*8); \
|
||||||
|
VPINSRQ_1_SI_X15(11*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (6, 14), X13 = (11, 0), X14 = (15, 9), X15 = (3, 8)
|
||||||
|
#define LOAD_MSG_AVX_6_14_11_0_15_9_3_8() \
|
||||||
|
MOVQ 6*8(SI), X12; \
|
||||||
|
MOVQ 11*8(SI), X13; \
|
||||||
|
MOVQ 15*8(SI), X14; \
|
||||||
|
MOVQ 3*8(SI), X15; \
|
||||||
|
VPINSRQ_1_SI_X12(14*8); \
|
||||||
|
VPINSRQ_1_SI_X13_0; \
|
||||||
|
VPINSRQ_1_SI_X14(9*8); \
|
||||||
|
VPINSRQ_1_SI_X15(8*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (5, 15), X13 = (8, 2), X14 = (0, 4), X15 = (6, 10)
|
||||||
|
#define LOAD_MSG_AVX_5_15_8_2_0_4_6_10() \
|
||||||
|
MOVQ 5*8(SI), X12; \
|
||||||
|
MOVQ 8*8(SI), X13; \
|
||||||
|
MOVQ 0*8(SI), X14; \
|
||||||
|
MOVQ 6*8(SI), X15; \
|
||||||
|
VPINSRQ_1_SI_X12(15*8); \
|
||||||
|
VPINSRQ_1_SI_X13(2*8); \
|
||||||
|
VPINSRQ_1_SI_X14(4*8); \
|
||||||
|
VPINSRQ_1_SI_X15(10*8)
|
||||||
|
|
||||||
|
// load msg: X12 = (12, 13), X13 = (1, 10), X14 = (2, 7), X15 = (4, 5)
|
||||||
|
#define LOAD_MSG_AVX_12_13_1_10_2_7_4_5() \
|
||||||
|
VMOVDQU 12*8(SI), X12; \
|
||||||
|
MOVQ 1*8(SI), X13; \
|
||||||
|
MOVQ 2*8(SI), X14; \
|
||||||
|
VPINSRQ_1_SI_X13(10*8); \
|
||||||
|
VPINSRQ_1_SI_X14(7*8); \
|
||||||
|
VMOVDQU 4*8(SI), X15
|
||||||
|
|
||||||
|
// load msg: X12 = (15, 9), X13 = (3, 13), X14 = (11, 14), X15 = (12, 0)
|
||||||
|
#define LOAD_MSG_AVX_15_9_3_13_11_14_12_0() \
|
||||||
|
MOVQ 15*8(SI), X12; \
|
||||||
|
MOVQ 3*8(SI), X13; \
|
||||||
|
MOVQ 11*8(SI), X14; \
|
||||||
|
MOVQ 12*8(SI), X15; \
|
||||||
|
VPINSRQ_1_SI_X12(9*8); \
|
||||||
|
VPINSRQ_1_SI_X13(13*8); \
|
||||||
|
VPINSRQ_1_SI_X14(14*8); \
|
||||||
|
VPINSRQ_1_SI_X15_0
|
||||||
|
|
||||||
|
// func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
|
||||||
|
TEXT ·hashBlocksAVX(SB), 4, $288-48 // frame size = 272 + 16 byte alignment
|
||||||
|
MOVQ h+0(FP), AX
|
||||||
|
MOVQ c+8(FP), BX
|
||||||
|
MOVQ flag+16(FP), CX
|
||||||
|
MOVQ blocks_base+24(FP), SI
|
||||||
|
MOVQ blocks_len+32(FP), DI
|
||||||
|
|
||||||
|
MOVQ SP, BP
|
||||||
|
MOVQ SP, R9
|
||||||
|
ADDQ $15, R9
|
||||||
|
ANDQ $~15, R9
|
||||||
|
MOVQ R9, SP
|
||||||
|
|
||||||
|
VMOVDQU ·AVX_c40<>(SB), X0
|
||||||
|
VMOVDQU ·AVX_c48<>(SB), X1
|
||||||
|
VMOVDQA X0, X8
|
||||||
|
VMOVDQA X1, X9
|
||||||
|
|
||||||
|
VMOVDQU ·AVX_iv3<>(SB), X0
|
||||||
|
VMOVDQA X0, 0(SP)
|
||||||
|
XORQ CX, 0(SP) // 0(SP) = ·AVX_iv3 ^ (CX || 0)
|
||||||
|
|
||||||
|
VMOVDQU 0(AX), X10
|
||||||
|
VMOVDQU 16(AX), X11
|
||||||
|
VMOVDQU 32(AX), X2
|
||||||
|
VMOVDQU 48(AX), X3
|
||||||
|
|
||||||
|
MOVQ 0(BX), R8
|
||||||
|
MOVQ 8(BX), R9
|
||||||
|
|
||||||
|
loop:
|
||||||
|
ADDQ $128, R8
|
||||||
|
CMPQ R8, $128
|
||||||
|
JGE noinc
|
||||||
|
INCQ R9
|
||||||
|
|
||||||
|
noinc:
|
||||||
|
VMOVQ_R8_X15
|
||||||
|
VPINSRQ_1_R9_X15
|
||||||
|
|
||||||
|
VMOVDQA X10, X0
|
||||||
|
VMOVDQA X11, X1
|
||||||
|
VMOVDQU ·AVX_iv0<>(SB), X4
|
||||||
|
VMOVDQU ·AVX_iv1<>(SB), X5
|
||||||
|
VMOVDQU ·AVX_iv2<>(SB), X6
|
||||||
|
|
||||||
|
VPXOR X15, X6, X6
|
||||||
|
VMOVDQA 0(SP), X7
|
||||||
|
|
||||||
|
LOAD_MSG_AVX_0_2_4_6_1_3_5_7()
|
||||||
|
VMOVDQA X12, 16(SP)
|
||||||
|
VMOVDQA X13, 32(SP)
|
||||||
|
VMOVDQA X14, 48(SP)
|
||||||
|
VMOVDQA X15, 64(SP)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX(8, 10, 12, 14, 9, 11, 13, 15)
|
||||||
|
VMOVDQA X12, 80(SP)
|
||||||
|
VMOVDQA X13, 96(SP)
|
||||||
|
VMOVDQA X14, 112(SP)
|
||||||
|
VMOVDQA X15, 128(SP)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
LOAD_MSG_AVX(14, 4, 9, 13, 10, 8, 15, 6)
|
||||||
|
VMOVDQA X12, 144(SP)
|
||||||
|
VMOVDQA X13, 160(SP)
|
||||||
|
VMOVDQA X14, 176(SP)
|
||||||
|
VMOVDQA X15, 192(SP)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX_1_0_11_5_12_2_7_3()
|
||||||
|
VMOVDQA X12, 208(SP)
|
||||||
|
VMOVDQA X13, 224(SP)
|
||||||
|
VMOVDQA X14, 240(SP)
|
||||||
|
VMOVDQA X15, 256(SP)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
LOAD_MSG_AVX_11_12_5_15_8_0_2_13()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX(10, 3, 7, 9, 14, 6, 1, 4)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
LOAD_MSG_AVX(7, 3, 13, 11, 9, 1, 12, 14)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX_2_5_4_15_6_10_0_8()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
LOAD_MSG_AVX_9_5_2_10_0_7_4_15()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX(14, 11, 6, 3, 1, 12, 8, 13)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
LOAD_MSG_AVX_2_6_0_8_12_10_11_3()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX(4, 7, 15, 1, 13, 5, 14, 9)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
LOAD_MSG_AVX(12, 1, 14, 4, 5, 15, 13, 10)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX_0_6_9_8_7_3_2_11()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
LOAD_MSG_AVX(13, 7, 12, 3, 11, 14, 1, 9)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX_5_15_8_2_0_4_6_10()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
LOAD_MSG_AVX_6_14_11_0_15_9_3_8()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX_12_13_1_10_2_7_4_5()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
LOAD_MSG_AVX(10, 8, 7, 1, 2, 4, 6, 5)
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
LOAD_MSG_AVX_15_9_3_13_11_14_12_0()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 80(SP), 96(SP), 112(SP), 128(SP), X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 144(SP), 160(SP), 176(SP), 192(SP), X15, X8, X9)
|
||||||
|
SHUFFLE_AVX()
|
||||||
|
HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 208(SP), 224(SP), 240(SP), 256(SP), X15, X8, X9)
|
||||||
|
SHUFFLE_AVX_INV()
|
||||||
|
|
||||||
|
VMOVDQU 32(AX), X14
|
||||||
|
VMOVDQU 48(AX), X15
|
||||||
|
VPXOR X0, X10, X10
|
||||||
|
VPXOR X1, X11, X11
|
||||||
|
VPXOR X2, X14, X14
|
||||||
|
VPXOR X3, X15, X15
|
||||||
|
VPXOR X4, X10, X10
|
||||||
|
VPXOR X5, X11, X11
|
||||||
|
VPXOR X6, X14, X2
|
||||||
|
VPXOR X7, X15, X3
|
||||||
|
VMOVDQU X2, 32(AX)
|
||||||
|
VMOVDQU X3, 48(AX)
|
||||||
|
|
||||||
|
LEAQ 128(SI), SI
|
||||||
|
SUBQ $128, DI
|
||||||
|
JNE loop
|
||||||
|
|
||||||
|
VMOVDQU X10, 0(AX)
|
||||||
|
VMOVDQU X11, 16(AX)
|
||||||
|
|
||||||
|
MOVQ R8, 0(BX)
|
||||||
|
MOVQ R9, 8(BX)
|
||||||
|
VZEROUPPER
|
||||||
|
|
||||||
|
MOVQ BP, SP
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func supportsAVX2() bool
|
||||||
|
TEXT ·supportsAVX2(SB), 4, $0-1
|
||||||
|
MOVQ runtime·support_avx2(SB), AX
|
||||||
|
MOVB AX, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func supportsAVX() bool
|
||||||
|
TEXT ·supportsAVX(SB), 4, $0-1
|
||||||
|
MOVQ runtime·support_avx(SB), AX
|
||||||
|
MOVB AX, ret+0(FP)
|
||||||
|
RET
|
||||||
25
vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go
generated
vendored
Normal file
25
vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go
generated
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build !go1.7,amd64,!gccgo,!appengine
|
||||||
|
|
||||||
|
package blake2b
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
useSSE4 = supportsSSE4()
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func supportsSSE4() bool
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
|
||||||
|
|
||||||
|
func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
|
||||||
|
if useSSE4 {
|
||||||
|
hashBlocksSSE4(h, c, flag, blocks)
|
||||||
|
} else {
|
||||||
|
hashBlocksGeneric(h, c, flag, blocks)
|
||||||
|
}
|
||||||
|
}
|
||||||
290
vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s
generated
vendored
Normal file
290
vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s
generated
vendored
Normal file
|
|
@ -0,0 +1,290 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build amd64,!gccgo,!appengine
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
DATA ·iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908
|
||||||
|
DATA ·iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b
|
||||||
|
GLOBL ·iv0<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b
|
||||||
|
DATA ·iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1
|
||||||
|
GLOBL ·iv1<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·iv2<>+0x00(SB)/8, $0x510e527fade682d1
|
||||||
|
DATA ·iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f
|
||||||
|
GLOBL ·iv2<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b
|
||||||
|
DATA ·iv3<>+0x08(SB)/8, $0x5be0cd19137e2179
|
||||||
|
GLOBL ·iv3<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·c40<>+0x00(SB)/8, $0x0201000706050403
|
||||||
|
DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b
|
||||||
|
GLOBL ·c40<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA ·c48<>+0x00(SB)/8, $0x0100070605040302
|
||||||
|
DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a
|
||||||
|
GLOBL ·c48<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \
|
||||||
|
MOVO v4, t1; \
|
||||||
|
MOVO v5, v4; \
|
||||||
|
MOVO t1, v5; \
|
||||||
|
MOVO v6, t1; \
|
||||||
|
PUNPCKLQDQ v6, t2; \
|
||||||
|
PUNPCKHQDQ v7, v6; \
|
||||||
|
PUNPCKHQDQ t2, v6; \
|
||||||
|
PUNPCKLQDQ v7, t2; \
|
||||||
|
MOVO t1, v7; \
|
||||||
|
MOVO v2, t1; \
|
||||||
|
PUNPCKHQDQ t2, v7; \
|
||||||
|
PUNPCKLQDQ v3, t2; \
|
||||||
|
PUNPCKHQDQ t2, v2; \
|
||||||
|
PUNPCKLQDQ t1, t2; \
|
||||||
|
PUNPCKHQDQ t2, v3
|
||||||
|
|
||||||
|
#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \
|
||||||
|
MOVO v4, t1; \
|
||||||
|
MOVO v5, v4; \
|
||||||
|
MOVO t1, v5; \
|
||||||
|
MOVO v2, t1; \
|
||||||
|
PUNPCKLQDQ v2, t2; \
|
||||||
|
PUNPCKHQDQ v3, v2; \
|
||||||
|
PUNPCKHQDQ t2, v2; \
|
||||||
|
PUNPCKLQDQ v3, t2; \
|
||||||
|
MOVO t1, v3; \
|
||||||
|
MOVO v6, t1; \
|
||||||
|
PUNPCKHQDQ t2, v3; \
|
||||||
|
PUNPCKLQDQ v7, t2; \
|
||||||
|
PUNPCKHQDQ t2, v6; \
|
||||||
|
PUNPCKLQDQ t1, t2; \
|
||||||
|
PUNPCKHQDQ t2, v7
|
||||||
|
|
||||||
|
#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \
|
||||||
|
PADDQ m0, v0; \
|
||||||
|
PADDQ m1, v1; \
|
||||||
|
PADDQ v2, v0; \
|
||||||
|
PADDQ v3, v1; \
|
||||||
|
PXOR v0, v6; \
|
||||||
|
PXOR v1, v7; \
|
||||||
|
PSHUFD $0xB1, v6, v6; \
|
||||||
|
PSHUFD $0xB1, v7, v7; \
|
||||||
|
PADDQ v6, v4; \
|
||||||
|
PADDQ v7, v5; \
|
||||||
|
PXOR v4, v2; \
|
||||||
|
PXOR v5, v3; \
|
||||||
|
PSHUFB c40, v2; \
|
||||||
|
PSHUFB c40, v3; \
|
||||||
|
PADDQ m2, v0; \
|
||||||
|
PADDQ m3, v1; \
|
||||||
|
PADDQ v2, v0; \
|
||||||
|
PADDQ v3, v1; \
|
||||||
|
PXOR v0, v6; \
|
||||||
|
PXOR v1, v7; \
|
||||||
|
PSHUFB c48, v6; \
|
||||||
|
PSHUFB c48, v7; \
|
||||||
|
PADDQ v6, v4; \
|
||||||
|
PADDQ v7, v5; \
|
||||||
|
PXOR v4, v2; \
|
||||||
|
PXOR v5, v3; \
|
||||||
|
MOVOU v2, t0; \
|
||||||
|
PADDQ v2, t0; \
|
||||||
|
PSRLQ $63, v2; \
|
||||||
|
PXOR t0, v2; \
|
||||||
|
MOVOU v3, t0; \
|
||||||
|
PADDQ v3, t0; \
|
||||||
|
PSRLQ $63, v3; \
|
||||||
|
PXOR t0, v3
|
||||||
|
|
||||||
|
#define LOAD_MSG(m0, m1, m2, m3, src, i0, i1, i2, i3, i4, i5, i6, i7) \
|
||||||
|
MOVQ i0*8(src), m0; \
|
||||||
|
PINSRQ $1, i1*8(src), m0; \
|
||||||
|
MOVQ i2*8(src), m1; \
|
||||||
|
PINSRQ $1, i3*8(src), m1; \
|
||||||
|
MOVQ i4*8(src), m2; \
|
||||||
|
PINSRQ $1, i5*8(src), m2; \
|
||||||
|
MOVQ i6*8(src), m3; \
|
||||||
|
PINSRQ $1, i7*8(src), m3
|
||||||
|
|
||||||
|
// func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
|
||||||
|
TEXT ·hashBlocksSSE4(SB), 4, $288-48 // frame size = 272 + 16 byte alignment
|
||||||
|
MOVQ h+0(FP), AX
|
||||||
|
MOVQ c+8(FP), BX
|
||||||
|
MOVQ flag+16(FP), CX
|
||||||
|
MOVQ blocks_base+24(FP), SI
|
||||||
|
MOVQ blocks_len+32(FP), DI
|
||||||
|
|
||||||
|
MOVQ SP, BP
|
||||||
|
MOVQ SP, R9
|
||||||
|
ADDQ $15, R9
|
||||||
|
ANDQ $~15, R9
|
||||||
|
MOVQ R9, SP
|
||||||
|
|
||||||
|
MOVOU ·iv3<>(SB), X0
|
||||||
|
MOVO X0, 0(SP)
|
||||||
|
XORQ CX, 0(SP) // 0(SP) = ·iv3 ^ (CX || 0)
|
||||||
|
|
||||||
|
MOVOU ·c40<>(SB), X13
|
||||||
|
MOVOU ·c48<>(SB), X14
|
||||||
|
|
||||||
|
MOVOU 0(AX), X12
|
||||||
|
MOVOU 16(AX), X15
|
||||||
|
|
||||||
|
MOVQ 0(BX), R8
|
||||||
|
MOVQ 8(BX), R9
|
||||||
|
|
||||||
|
loop:
|
||||||
|
ADDQ $128, R8
|
||||||
|
CMPQ R8, $128
|
||||||
|
JGE noinc
|
||||||
|
INCQ R9
|
||||||
|
|
||||||
|
noinc:
|
||||||
|
MOVQ R8, X8
|
||||||
|
PINSRQ $1, R9, X8
|
||||||
|
|
||||||
|
MOVO X12, X0
|
||||||
|
MOVO X15, X1
|
||||||
|
MOVOU 32(AX), X2
|
||||||
|
MOVOU 48(AX), X3
|
||||||
|
MOVOU ·iv0<>(SB), X4
|
||||||
|
MOVOU ·iv1<>(SB), X5
|
||||||
|
MOVOU ·iv2<>(SB), X6
|
||||||
|
|
||||||
|
PXOR X8, X6
|
||||||
|
MOVO 0(SP), X7
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7)
|
||||||
|
MOVO X8, 16(SP)
|
||||||
|
MOVO X9, 32(SP)
|
||||||
|
MOVO X10, 48(SP)
|
||||||
|
MOVO X11, 64(SP)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 8, 10, 12, 14, 9, 11, 13, 15)
|
||||||
|
MOVO X8, 80(SP)
|
||||||
|
MOVO X9, 96(SP)
|
||||||
|
MOVO X10, 112(SP)
|
||||||
|
MOVO X11, 128(SP)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6)
|
||||||
|
MOVO X8, 144(SP)
|
||||||
|
MOVO X9, 160(SP)
|
||||||
|
MOVO X10, 176(SP)
|
||||||
|
MOVO X11, 192(SP)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 1, 0, 11, 5, 12, 2, 7, 3)
|
||||||
|
MOVO X8, 208(SP)
|
||||||
|
MOVO X9, 224(SP)
|
||||||
|
MOVO X10, 240(SP)
|
||||||
|
MOVO X11, 256(SP)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 10, 3, 7, 9, 14, 6, 1, 4)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 2, 5, 4, 15, 6, 10, 0, 8)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 14, 11, 6, 3, 1, 12, 8, 13)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 4, 7, 15, 1, 13, 5, 14, 9)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 0, 6, 9, 8, 7, 3, 2, 11)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 5, 15, 8, 2, 0, 4, 6, 10)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 12, 13, 1, 10, 2, 7, 4, 5)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
LOAD_MSG(X8, X9, X10, X11, SI, 15, 9, 3, 13, 11, 14, 12, 0)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 80(SP), 96(SP), 112(SP), 128(SP), X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 144(SP), 160(SP), 176(SP), 192(SP), X11, X13, X14)
|
||||||
|
SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 208(SP), 224(SP), 240(SP), 256(SP), X11, X13, X14)
|
||||||
|
SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
|
||||||
|
|
||||||
|
MOVOU 32(AX), X10
|
||||||
|
MOVOU 48(AX), X11
|
||||||
|
PXOR X0, X12
|
||||||
|
PXOR X1, X15
|
||||||
|
PXOR X2, X10
|
||||||
|
PXOR X3, X11
|
||||||
|
PXOR X4, X12
|
||||||
|
PXOR X5, X15
|
||||||
|
PXOR X6, X10
|
||||||
|
PXOR X7, X11
|
||||||
|
MOVOU X10, 32(AX)
|
||||||
|
MOVOU X11, 48(AX)
|
||||||
|
|
||||||
|
LEAQ 128(SI), SI
|
||||||
|
SUBQ $128, DI
|
||||||
|
JNE loop
|
||||||
|
|
||||||
|
MOVOU X12, 0(AX)
|
||||||
|
MOVOU X15, 16(AX)
|
||||||
|
|
||||||
|
MOVQ R8, 0(BX)
|
||||||
|
MOVQ R9, 8(BX)
|
||||||
|
|
||||||
|
MOVQ BP, SP
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func supportsSSE4() bool
|
||||||
|
TEXT ·supportsSSE4(SB), 4, $0-1
|
||||||
|
MOVL $1, AX
|
||||||
|
CPUID
|
||||||
|
SHRL $19, CX // Bit 19 indicates SSE4 support
|
||||||
|
ANDL $1, CX // CX != 0 if support SSE4
|
||||||
|
MOVB CX, ret+0(FP)
|
||||||
|
RET
|
||||||
179
vendor/golang.org/x/crypto/blake2b/blake2b_generic.go
generated
vendored
Normal file
179
vendor/golang.org/x/crypto/blake2b/blake2b_generic.go
generated
vendored
Normal file
|
|
@ -0,0 +1,179 @@
|
||||||
|
// 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 blake2b
|
||||||
|
|
||||||
|
import "encoding/binary"
|
||||||
|
|
||||||
|
// the precomputed values for BLAKE2b
|
||||||
|
// there are 12 16-byte arrays - one for each round
|
||||||
|
// the entries are calculated from the sigma constants.
|
||||||
|
var precomputed = [12][16]byte{
|
||||||
|
{0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15},
|
||||||
|
{14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3},
|
||||||
|
{11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4},
|
||||||
|
{7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8},
|
||||||
|
{9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13},
|
||||||
|
{2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9},
|
||||||
|
{12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11},
|
||||||
|
{13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10},
|
||||||
|
{6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5},
|
||||||
|
{10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0},
|
||||||
|
{0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, // equal to the first
|
||||||
|
{14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, // equal to the second
|
||||||
|
}
|
||||||
|
|
||||||
|
func hashBlocksGeneric(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
|
||||||
|
var m [16]uint64
|
||||||
|
c0, c1 := c[0], c[1]
|
||||||
|
|
||||||
|
for i := 0; i < len(blocks); {
|
||||||
|
c0 += BlockSize
|
||||||
|
if c0 < BlockSize {
|
||||||
|
c1++
|
||||||
|
}
|
||||||
|
|
||||||
|
v0, v1, v2, v3, v4, v5, v6, v7 := h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]
|
||||||
|
v8, v9, v10, v11, v12, v13, v14, v15 := iv[0], iv[1], iv[2], iv[3], iv[4], iv[5], iv[6], iv[7]
|
||||||
|
v12 ^= c0
|
||||||
|
v13 ^= c1
|
||||||
|
v14 ^= flag
|
||||||
|
|
||||||
|
for j := range m {
|
||||||
|
m[j] = binary.LittleEndian.Uint64(blocks[i:])
|
||||||
|
i += 8
|
||||||
|
}
|
||||||
|
|
||||||
|
for j := range precomputed {
|
||||||
|
s := &(precomputed[j])
|
||||||
|
|
||||||
|
v0 += m[s[0]]
|
||||||
|
v0 += v4
|
||||||
|
v12 ^= v0
|
||||||
|
v12 = v12<<(64-32) | v12>>32
|
||||||
|
v8 += v12
|
||||||
|
v4 ^= v8
|
||||||
|
v4 = v4<<(64-24) | v4>>24
|
||||||
|
v1 += m[s[1]]
|
||||||
|
v1 += v5
|
||||||
|
v13 ^= v1
|
||||||
|
v13 = v13<<(64-32) | v13>>32
|
||||||
|
v9 += v13
|
||||||
|
v5 ^= v9
|
||||||
|
v5 = v5<<(64-24) | v5>>24
|
||||||
|
v2 += m[s[2]]
|
||||||
|
v2 += v6
|
||||||
|
v14 ^= v2
|
||||||
|
v14 = v14<<(64-32) | v14>>32
|
||||||
|
v10 += v14
|
||||||
|
v6 ^= v10
|
||||||
|
v6 = v6<<(64-24) | v6>>24
|
||||||
|
v3 += m[s[3]]
|
||||||
|
v3 += v7
|
||||||
|
v15 ^= v3
|
||||||
|
v15 = v15<<(64-32) | v15>>32
|
||||||
|
v11 += v15
|
||||||
|
v7 ^= v11
|
||||||
|
v7 = v7<<(64-24) | v7>>24
|
||||||
|
|
||||||
|
v0 += m[s[4]]
|
||||||
|
v0 += v4
|
||||||
|
v12 ^= v0
|
||||||
|
v12 = v12<<(64-16) | v12>>16
|
||||||
|
v8 += v12
|
||||||
|
v4 ^= v8
|
||||||
|
v4 = v4<<(64-63) | v4>>63
|
||||||
|
v1 += m[s[5]]
|
||||||
|
v1 += v5
|
||||||
|
v13 ^= v1
|
||||||
|
v13 = v13<<(64-16) | v13>>16
|
||||||
|
v9 += v13
|
||||||
|
v5 ^= v9
|
||||||
|
v5 = v5<<(64-63) | v5>>63
|
||||||
|
v2 += m[s[6]]
|
||||||
|
v2 += v6
|
||||||
|
v14 ^= v2
|
||||||
|
v14 = v14<<(64-16) | v14>>16
|
||||||
|
v10 += v14
|
||||||
|
v6 ^= v10
|
||||||
|
v6 = v6<<(64-63) | v6>>63
|
||||||
|
v3 += m[s[7]]
|
||||||
|
v3 += v7
|
||||||
|
v15 ^= v3
|
||||||
|
v15 = v15<<(64-16) | v15>>16
|
||||||
|
v11 += v15
|
||||||
|
v7 ^= v11
|
||||||
|
v7 = v7<<(64-63) | v7>>63
|
||||||
|
|
||||||
|
v0 += m[s[8]]
|
||||||
|
v0 += v5
|
||||||
|
v15 ^= v0
|
||||||
|
v15 = v15<<(64-32) | v15>>32
|
||||||
|
v10 += v15
|
||||||
|
v5 ^= v10
|
||||||
|
v5 = v5<<(64-24) | v5>>24
|
||||||
|
v1 += m[s[9]]
|
||||||
|
v1 += v6
|
||||||
|
v12 ^= v1
|
||||||
|
v12 = v12<<(64-32) | v12>>32
|
||||||
|
v11 += v12
|
||||||
|
v6 ^= v11
|
||||||
|
v6 = v6<<(64-24) | v6>>24
|
||||||
|
v2 += m[s[10]]
|
||||||
|
v2 += v7
|
||||||
|
v13 ^= v2
|
||||||
|
v13 = v13<<(64-32) | v13>>32
|
||||||
|
v8 += v13
|
||||||
|
v7 ^= v8
|
||||||
|
v7 = v7<<(64-24) | v7>>24
|
||||||
|
v3 += m[s[11]]
|
||||||
|
v3 += v4
|
||||||
|
v14 ^= v3
|
||||||
|
v14 = v14<<(64-32) | v14>>32
|
||||||
|
v9 += v14
|
||||||
|
v4 ^= v9
|
||||||
|
v4 = v4<<(64-24) | v4>>24
|
||||||
|
|
||||||
|
v0 += m[s[12]]
|
||||||
|
v0 += v5
|
||||||
|
v15 ^= v0
|
||||||
|
v15 = v15<<(64-16) | v15>>16
|
||||||
|
v10 += v15
|
||||||
|
v5 ^= v10
|
||||||
|
v5 = v5<<(64-63) | v5>>63
|
||||||
|
v1 += m[s[13]]
|
||||||
|
v1 += v6
|
||||||
|
v12 ^= v1
|
||||||
|
v12 = v12<<(64-16) | v12>>16
|
||||||
|
v11 += v12
|
||||||
|
v6 ^= v11
|
||||||
|
v6 = v6<<(64-63) | v6>>63
|
||||||
|
v2 += m[s[14]]
|
||||||
|
v2 += v7
|
||||||
|
v13 ^= v2
|
||||||
|
v13 = v13<<(64-16) | v13>>16
|
||||||
|
v8 += v13
|
||||||
|
v7 ^= v8
|
||||||
|
v7 = v7<<(64-63) | v7>>63
|
||||||
|
v3 += m[s[15]]
|
||||||
|
v3 += v4
|
||||||
|
v14 ^= v3
|
||||||
|
v14 = v14<<(64-16) | v14>>16
|
||||||
|
v9 += v14
|
||||||
|
v4 ^= v9
|
||||||
|
v4 = v4<<(64-63) | v4>>63
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
h[0] ^= v0 ^ v8
|
||||||
|
h[1] ^= v1 ^ v9
|
||||||
|
h[2] ^= v2 ^ v10
|
||||||
|
h[3] ^= v3 ^ v11
|
||||||
|
h[4] ^= v4 ^ v12
|
||||||
|
h[5] ^= v5 ^ v13
|
||||||
|
h[6] ^= v6 ^ v14
|
||||||
|
h[7] ^= v7 ^ v15
|
||||||
|
}
|
||||||
|
c[0], c[1] = c0, c1
|
||||||
|
}
|
||||||
11
vendor/golang.org/x/crypto/blake2b/blake2b_ref.go
generated
vendored
Normal file
11
vendor/golang.org/x/crypto/blake2b/blake2b_ref.go
generated
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build !amd64 appengine gccgo
|
||||||
|
|
||||||
|
package blake2b
|
||||||
|
|
||||||
|
func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
|
||||||
|
hashBlocksGeneric(h, c, flag, blocks)
|
||||||
|
}
|
||||||
32
vendor/golang.org/x/crypto/blake2b/register.go
generated
vendored
Normal file
32
vendor/golang.org/x/crypto/blake2b/register.go
generated
vendored
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build go1.9
|
||||||
|
|
||||||
|
package blake2b
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto"
|
||||||
|
"hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
newHash256 := func() hash.Hash {
|
||||||
|
h, _ := New256(nil)
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
newHash384 := func() hash.Hash {
|
||||||
|
h, _ := New384(nil)
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
newHash512 := func() hash.Hash {
|
||||||
|
h, _ := New512(nil)
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
crypto.RegisterHash(crypto.BLAKE2b_256, newHash256)
|
||||||
|
crypto.RegisterHash(crypto.BLAKE2b_384, newHash384)
|
||||||
|
crypto.RegisterHash(crypto.BLAKE2b_512, newHash512)
|
||||||
|
}
|
||||||
175
vendor/golang.org/x/crypto/blake2s/blake2s.go
generated
vendored
Normal file
175
vendor/golang.org/x/crypto/blake2s/blake2s.go
generated
vendored
Normal file
|
|
@ -0,0 +1,175 @@
|
||||||
|
// 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 blake2s implements the BLAKE2s hash algorithm as
|
||||||
|
// defined in RFC 7693.
|
||||||
|
package blake2s // import "golang.org/x/crypto/blake2s"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
|
"hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// The blocksize of BLAKE2s in bytes.
|
||||||
|
BlockSize = 64
|
||||||
|
|
||||||
|
// The hash size of BLAKE2s-256 in bytes.
|
||||||
|
Size = 32
|
||||||
|
|
||||||
|
// The hash size of BLAKE2s-128 in bytes.
|
||||||
|
Size128 = 16
|
||||||
|
)
|
||||||
|
|
||||||
|
var errKeySize = errors.New("blake2s: invalid key size")
|
||||||
|
|
||||||
|
var iv = [8]uint32{
|
||||||
|
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
|
||||||
|
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum256 returns the BLAKE2s-256 checksum of the data.
|
||||||
|
func Sum256(data []byte) [Size]byte {
|
||||||
|
var sum [Size]byte
|
||||||
|
checkSum(&sum, Size, data)
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
// New256 returns a new hash.Hash computing the BLAKE2s-256 checksum. A non-nil
|
||||||
|
// key turns the hash into a MAC. The key must between zero and 32 bytes long.
|
||||||
|
func New256(key []byte) (hash.Hash, error) { return newDigest(Size, key) }
|
||||||
|
|
||||||
|
// New128 returns a new hash.Hash computing the BLAKE2s-128 checksum given a
|
||||||
|
// non-empty key. Note that a 128-bit digest is too small to be secure as a
|
||||||
|
// cryptographic hash and should only be used as a MAC, thus the key argument
|
||||||
|
// is not optional.
|
||||||
|
func New128(key []byte) (hash.Hash, error) {
|
||||||
|
if len(key) == 0 {
|
||||||
|
return nil, errors.New("blake2s: a key is required for a 128-bit hash")
|
||||||
|
}
|
||||||
|
return newDigest(Size128, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newDigest(hashSize int, key []byte) (*digest, error) {
|
||||||
|
if len(key) > Size {
|
||||||
|
return nil, errKeySize
|
||||||
|
}
|
||||||
|
d := &digest{
|
||||||
|
size: hashSize,
|
||||||
|
keyLen: len(key),
|
||||||
|
}
|
||||||
|
copy(d.key[:], key)
|
||||||
|
d.Reset()
|
||||||
|
return d, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkSum(sum *[Size]byte, hashSize int, data []byte) {
|
||||||
|
var (
|
||||||
|
h [8]uint32
|
||||||
|
c [2]uint32
|
||||||
|
)
|
||||||
|
|
||||||
|
h = iv
|
||||||
|
h[0] ^= uint32(hashSize) | (1 << 16) | (1 << 24)
|
||||||
|
|
||||||
|
if length := len(data); length > BlockSize {
|
||||||
|
n := length &^ (BlockSize - 1)
|
||||||
|
if length == n {
|
||||||
|
n -= BlockSize
|
||||||
|
}
|
||||||
|
hashBlocks(&h, &c, 0, data[:n])
|
||||||
|
data = data[n:]
|
||||||
|
}
|
||||||
|
|
||||||
|
var block [BlockSize]byte
|
||||||
|
offset := copy(block[:], data)
|
||||||
|
remaining := uint32(BlockSize - offset)
|
||||||
|
|
||||||
|
if c[0] < remaining {
|
||||||
|
c[1]--
|
||||||
|
}
|
||||||
|
c[0] -= remaining
|
||||||
|
|
||||||
|
hashBlocks(&h, &c, 0xFFFFFFFF, block[:])
|
||||||
|
|
||||||
|
for i, v := range h {
|
||||||
|
binary.LittleEndian.PutUint32(sum[4*i:], v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type digest struct {
|
||||||
|
h [8]uint32
|
||||||
|
c [2]uint32
|
||||||
|
size int
|
||||||
|
block [BlockSize]byte
|
||||||
|
offset int
|
||||||
|
|
||||||
|
key [BlockSize]byte
|
||||||
|
keyLen int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) BlockSize() int { return BlockSize }
|
||||||
|
|
||||||
|
func (d *digest) Size() int { return d.size }
|
||||||
|
|
||||||
|
func (d *digest) Reset() {
|
||||||
|
d.h = iv
|
||||||
|
d.h[0] ^= uint32(d.size) | (uint32(d.keyLen) << 8) | (1 << 16) | (1 << 24)
|
||||||
|
d.offset, d.c[0], d.c[1] = 0, 0, 0
|
||||||
|
if d.keyLen > 0 {
|
||||||
|
d.block = d.key
|
||||||
|
d.offset = BlockSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) Write(p []byte) (n int, err error) {
|
||||||
|
n = len(p)
|
||||||
|
|
||||||
|
if d.offset > 0 {
|
||||||
|
remaining := BlockSize - d.offset
|
||||||
|
if n <= remaining {
|
||||||
|
d.offset += copy(d.block[d.offset:], p)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
copy(d.block[d.offset:], p[:remaining])
|
||||||
|
hashBlocks(&d.h, &d.c, 0, d.block[:])
|
||||||
|
d.offset = 0
|
||||||
|
p = p[remaining:]
|
||||||
|
}
|
||||||
|
|
||||||
|
if length := len(p); length > BlockSize {
|
||||||
|
nn := length &^ (BlockSize - 1)
|
||||||
|
if length == nn {
|
||||||
|
nn -= BlockSize
|
||||||
|
}
|
||||||
|
hashBlocks(&d.h, &d.c, 0, p[:nn])
|
||||||
|
p = p[nn:]
|
||||||
|
}
|
||||||
|
|
||||||
|
d.offset += copy(d.block[:], p)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *digest) Sum(b []byte) []byte {
|
||||||
|
var block [BlockSize]byte
|
||||||
|
h := d.h
|
||||||
|
c := d.c
|
||||||
|
|
||||||
|
copy(block[:], d.block[:d.offset])
|
||||||
|
remaining := uint32(BlockSize - d.offset)
|
||||||
|
if c[0] < remaining {
|
||||||
|
c[1]--
|
||||||
|
}
|
||||||
|
c[0] -= remaining
|
||||||
|
|
||||||
|
hashBlocks(&h, &c, 0xFFFFFFFF, block[:])
|
||||||
|
|
||||||
|
var sum [Size]byte
|
||||||
|
for i, v := range h {
|
||||||
|
binary.LittleEndian.PutUint32(sum[4*i:], v)
|
||||||
|
}
|
||||||
|
|
||||||
|
return append(b, sum[:d.size]...)
|
||||||
|
}
|
||||||
36
vendor/golang.org/x/crypto/blake2s/blake2s_386.go
generated
vendored
Normal file
36
vendor/golang.org/x/crypto/blake2s/blake2s_386.go
generated
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build 386,!gccgo,!appengine
|
||||||
|
|
||||||
|
package blake2s
|
||||||
|
|
||||||
|
var (
|
||||||
|
useSSE4 = false
|
||||||
|
useSSSE3 = supportSSSE3()
|
||||||
|
useSSE2 = supportSSE2()
|
||||||
|
useGeneric = true
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func supportSSE2() bool
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func supportSSSE3() bool
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
|
||||||
|
func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) {
|
||||||
|
if useSSSE3 {
|
||||||
|
hashBlocksSSSE3(h, c, flag, blocks)
|
||||||
|
} else if useSSE2 {
|
||||||
|
hashBlocksSSE2(h, c, flag, blocks)
|
||||||
|
} else {
|
||||||
|
hashBlocksGeneric(h, c, flag, blocks)
|
||||||
|
}
|
||||||
|
}
|
||||||
460
vendor/golang.org/x/crypto/blake2s/blake2s_386.s
generated
vendored
Normal file
460
vendor/golang.org/x/crypto/blake2s/blake2s_386.s
generated
vendored
Normal file
|
|
@ -0,0 +1,460 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build 386,!gccgo,!appengine
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
DATA iv0<>+0x00(SB)/4, $0x6a09e667
|
||||||
|
DATA iv0<>+0x04(SB)/4, $0xbb67ae85
|
||||||
|
DATA iv0<>+0x08(SB)/4, $0x3c6ef372
|
||||||
|
DATA iv0<>+0x0c(SB)/4, $0xa54ff53a
|
||||||
|
GLOBL iv0<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA iv1<>+0x00(SB)/4, $0x510e527f
|
||||||
|
DATA iv1<>+0x04(SB)/4, $0x9b05688c
|
||||||
|
DATA iv1<>+0x08(SB)/4, $0x1f83d9ab
|
||||||
|
DATA iv1<>+0x0c(SB)/4, $0x5be0cd19
|
||||||
|
GLOBL iv1<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA rol16<>+0x00(SB)/8, $0x0504070601000302
|
||||||
|
DATA rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A
|
||||||
|
GLOBL rol16<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA rol8<>+0x00(SB)/8, $0x0407060500030201
|
||||||
|
DATA rol8<>+0x08(SB)/8, $0x0C0F0E0D080B0A09
|
||||||
|
GLOBL rol8<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA counter<>+0x00(SB)/8, $0x40
|
||||||
|
DATA counter<>+0x08(SB)/8, $0x0
|
||||||
|
GLOBL counter<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
#define ROTL_SSE2(n, t, v) \
|
||||||
|
MOVO v, t; \
|
||||||
|
PSLLL $n, t; \
|
||||||
|
PSRLL $(32-n), v; \
|
||||||
|
PXOR t, v
|
||||||
|
|
||||||
|
#define ROTL_SSSE3(c, v) \
|
||||||
|
PSHUFB c, v
|
||||||
|
|
||||||
|
#define ROUND_SSE2(v0, v1, v2, v3, m0, m1, m2, m3, t) \
|
||||||
|
PADDL m0, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSE2(16, t, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(20, t, v1); \
|
||||||
|
PADDL m1, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSE2(24, t, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(25, t, v1); \
|
||||||
|
PSHUFL $0x39, v1, v1; \
|
||||||
|
PSHUFL $0x4E, v2, v2; \
|
||||||
|
PSHUFL $0x93, v3, v3; \
|
||||||
|
PADDL m2, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSE2(16, t, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(20, t, v1); \
|
||||||
|
PADDL m3, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSE2(24, t, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(25, t, v1); \
|
||||||
|
PSHUFL $0x39, v3, v3; \
|
||||||
|
PSHUFL $0x4E, v2, v2; \
|
||||||
|
PSHUFL $0x93, v1, v1
|
||||||
|
|
||||||
|
#define ROUND_SSSE3(v0, v1, v2, v3, m0, m1, m2, m3, t, c16, c8) \
|
||||||
|
PADDL m0, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSSE3(c16, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(20, t, v1); \
|
||||||
|
PADDL m1, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSSE3(c8, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(25, t, v1); \
|
||||||
|
PSHUFL $0x39, v1, v1; \
|
||||||
|
PSHUFL $0x4E, v2, v2; \
|
||||||
|
PSHUFL $0x93, v3, v3; \
|
||||||
|
PADDL m2, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSSE3(c16, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(20, t, v1); \
|
||||||
|
PADDL m3, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSSE3(c8, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(25, t, v1); \
|
||||||
|
PSHUFL $0x39, v3, v3; \
|
||||||
|
PSHUFL $0x4E, v2, v2; \
|
||||||
|
PSHUFL $0x93, v1, v1
|
||||||
|
|
||||||
|
#define PRECOMPUTE(dst, off, src, t) \
|
||||||
|
MOVL 0*4(src), t; \
|
||||||
|
MOVL t, 0*4+off+0(dst); \
|
||||||
|
MOVL t, 9*4+off+64(dst); \
|
||||||
|
MOVL t, 5*4+off+128(dst); \
|
||||||
|
MOVL t, 14*4+off+192(dst); \
|
||||||
|
MOVL t, 4*4+off+256(dst); \
|
||||||
|
MOVL t, 2*4+off+320(dst); \
|
||||||
|
MOVL t, 8*4+off+384(dst); \
|
||||||
|
MOVL t, 12*4+off+448(dst); \
|
||||||
|
MOVL t, 3*4+off+512(dst); \
|
||||||
|
MOVL t, 15*4+off+576(dst); \
|
||||||
|
MOVL 1*4(src), t; \
|
||||||
|
MOVL t, 4*4+off+0(dst); \
|
||||||
|
MOVL t, 8*4+off+64(dst); \
|
||||||
|
MOVL t, 14*4+off+128(dst); \
|
||||||
|
MOVL t, 5*4+off+192(dst); \
|
||||||
|
MOVL t, 12*4+off+256(dst); \
|
||||||
|
MOVL t, 11*4+off+320(dst); \
|
||||||
|
MOVL t, 1*4+off+384(dst); \
|
||||||
|
MOVL t, 6*4+off+448(dst); \
|
||||||
|
MOVL t, 10*4+off+512(dst); \
|
||||||
|
MOVL t, 3*4+off+576(dst); \
|
||||||
|
MOVL 2*4(src), t; \
|
||||||
|
MOVL t, 1*4+off+0(dst); \
|
||||||
|
MOVL t, 13*4+off+64(dst); \
|
||||||
|
MOVL t, 6*4+off+128(dst); \
|
||||||
|
MOVL t, 8*4+off+192(dst); \
|
||||||
|
MOVL t, 2*4+off+256(dst); \
|
||||||
|
MOVL t, 0*4+off+320(dst); \
|
||||||
|
MOVL t, 14*4+off+384(dst); \
|
||||||
|
MOVL t, 11*4+off+448(dst); \
|
||||||
|
MOVL t, 12*4+off+512(dst); \
|
||||||
|
MOVL t, 4*4+off+576(dst); \
|
||||||
|
MOVL 3*4(src), t; \
|
||||||
|
MOVL t, 5*4+off+0(dst); \
|
||||||
|
MOVL t, 15*4+off+64(dst); \
|
||||||
|
MOVL t, 9*4+off+128(dst); \
|
||||||
|
MOVL t, 1*4+off+192(dst); \
|
||||||
|
MOVL t, 11*4+off+256(dst); \
|
||||||
|
MOVL t, 7*4+off+320(dst); \
|
||||||
|
MOVL t, 13*4+off+384(dst); \
|
||||||
|
MOVL t, 3*4+off+448(dst); \
|
||||||
|
MOVL t, 6*4+off+512(dst); \
|
||||||
|
MOVL t, 10*4+off+576(dst); \
|
||||||
|
MOVL 4*4(src), t; \
|
||||||
|
MOVL t, 2*4+off+0(dst); \
|
||||||
|
MOVL t, 1*4+off+64(dst); \
|
||||||
|
MOVL t, 15*4+off+128(dst); \
|
||||||
|
MOVL t, 10*4+off+192(dst); \
|
||||||
|
MOVL t, 6*4+off+256(dst); \
|
||||||
|
MOVL t, 8*4+off+320(dst); \
|
||||||
|
MOVL t, 3*4+off+384(dst); \
|
||||||
|
MOVL t, 13*4+off+448(dst); \
|
||||||
|
MOVL t, 14*4+off+512(dst); \
|
||||||
|
MOVL t, 5*4+off+576(dst); \
|
||||||
|
MOVL 5*4(src), t; \
|
||||||
|
MOVL t, 6*4+off+0(dst); \
|
||||||
|
MOVL t, 11*4+off+64(dst); \
|
||||||
|
MOVL t, 2*4+off+128(dst); \
|
||||||
|
MOVL t, 9*4+off+192(dst); \
|
||||||
|
MOVL t, 1*4+off+256(dst); \
|
||||||
|
MOVL t, 13*4+off+320(dst); \
|
||||||
|
MOVL t, 4*4+off+384(dst); \
|
||||||
|
MOVL t, 8*4+off+448(dst); \
|
||||||
|
MOVL t, 15*4+off+512(dst); \
|
||||||
|
MOVL t, 7*4+off+576(dst); \
|
||||||
|
MOVL 6*4(src), t; \
|
||||||
|
MOVL t, 3*4+off+0(dst); \
|
||||||
|
MOVL t, 7*4+off+64(dst); \
|
||||||
|
MOVL t, 13*4+off+128(dst); \
|
||||||
|
MOVL t, 12*4+off+192(dst); \
|
||||||
|
MOVL t, 10*4+off+256(dst); \
|
||||||
|
MOVL t, 1*4+off+320(dst); \
|
||||||
|
MOVL t, 9*4+off+384(dst); \
|
||||||
|
MOVL t, 14*4+off+448(dst); \
|
||||||
|
MOVL t, 0*4+off+512(dst); \
|
||||||
|
MOVL t, 6*4+off+576(dst); \
|
||||||
|
MOVL 7*4(src), t; \
|
||||||
|
MOVL t, 7*4+off+0(dst); \
|
||||||
|
MOVL t, 14*4+off+64(dst); \
|
||||||
|
MOVL t, 10*4+off+128(dst); \
|
||||||
|
MOVL t, 0*4+off+192(dst); \
|
||||||
|
MOVL t, 5*4+off+256(dst); \
|
||||||
|
MOVL t, 9*4+off+320(dst); \
|
||||||
|
MOVL t, 12*4+off+384(dst); \
|
||||||
|
MOVL t, 1*4+off+448(dst); \
|
||||||
|
MOVL t, 13*4+off+512(dst); \
|
||||||
|
MOVL t, 2*4+off+576(dst); \
|
||||||
|
MOVL 8*4(src), t; \
|
||||||
|
MOVL t, 8*4+off+0(dst); \
|
||||||
|
MOVL t, 5*4+off+64(dst); \
|
||||||
|
MOVL t, 4*4+off+128(dst); \
|
||||||
|
MOVL t, 15*4+off+192(dst); \
|
||||||
|
MOVL t, 14*4+off+256(dst); \
|
||||||
|
MOVL t, 3*4+off+320(dst); \
|
||||||
|
MOVL t, 11*4+off+384(dst); \
|
||||||
|
MOVL t, 10*4+off+448(dst); \
|
||||||
|
MOVL t, 7*4+off+512(dst); \
|
||||||
|
MOVL t, 1*4+off+576(dst); \
|
||||||
|
MOVL 9*4(src), t; \
|
||||||
|
MOVL t, 12*4+off+0(dst); \
|
||||||
|
MOVL t, 2*4+off+64(dst); \
|
||||||
|
MOVL t, 11*4+off+128(dst); \
|
||||||
|
MOVL t, 4*4+off+192(dst); \
|
||||||
|
MOVL t, 0*4+off+256(dst); \
|
||||||
|
MOVL t, 15*4+off+320(dst); \
|
||||||
|
MOVL t, 10*4+off+384(dst); \
|
||||||
|
MOVL t, 7*4+off+448(dst); \
|
||||||
|
MOVL t, 5*4+off+512(dst); \
|
||||||
|
MOVL t, 9*4+off+576(dst); \
|
||||||
|
MOVL 10*4(src), t; \
|
||||||
|
MOVL t, 9*4+off+0(dst); \
|
||||||
|
MOVL t, 4*4+off+64(dst); \
|
||||||
|
MOVL t, 8*4+off+128(dst); \
|
||||||
|
MOVL t, 13*4+off+192(dst); \
|
||||||
|
MOVL t, 3*4+off+256(dst); \
|
||||||
|
MOVL t, 5*4+off+320(dst); \
|
||||||
|
MOVL t, 7*4+off+384(dst); \
|
||||||
|
MOVL t, 15*4+off+448(dst); \
|
||||||
|
MOVL t, 11*4+off+512(dst); \
|
||||||
|
MOVL t, 0*4+off+576(dst); \
|
||||||
|
MOVL 11*4(src), t; \
|
||||||
|
MOVL t, 13*4+off+0(dst); \
|
||||||
|
MOVL t, 10*4+off+64(dst); \
|
||||||
|
MOVL t, 0*4+off+128(dst); \
|
||||||
|
MOVL t, 3*4+off+192(dst); \
|
||||||
|
MOVL t, 9*4+off+256(dst); \
|
||||||
|
MOVL t, 6*4+off+320(dst); \
|
||||||
|
MOVL t, 15*4+off+384(dst); \
|
||||||
|
MOVL t, 4*4+off+448(dst); \
|
||||||
|
MOVL t, 2*4+off+512(dst); \
|
||||||
|
MOVL t, 12*4+off+576(dst); \
|
||||||
|
MOVL 12*4(src), t; \
|
||||||
|
MOVL t, 10*4+off+0(dst); \
|
||||||
|
MOVL t, 12*4+off+64(dst); \
|
||||||
|
MOVL t, 1*4+off+128(dst); \
|
||||||
|
MOVL t, 6*4+off+192(dst); \
|
||||||
|
MOVL t, 13*4+off+256(dst); \
|
||||||
|
MOVL t, 4*4+off+320(dst); \
|
||||||
|
MOVL t, 0*4+off+384(dst); \
|
||||||
|
MOVL t, 2*4+off+448(dst); \
|
||||||
|
MOVL t, 8*4+off+512(dst); \
|
||||||
|
MOVL t, 14*4+off+576(dst); \
|
||||||
|
MOVL 13*4(src), t; \
|
||||||
|
MOVL t, 14*4+off+0(dst); \
|
||||||
|
MOVL t, 3*4+off+64(dst); \
|
||||||
|
MOVL t, 7*4+off+128(dst); \
|
||||||
|
MOVL t, 2*4+off+192(dst); \
|
||||||
|
MOVL t, 15*4+off+256(dst); \
|
||||||
|
MOVL t, 12*4+off+320(dst); \
|
||||||
|
MOVL t, 6*4+off+384(dst); \
|
||||||
|
MOVL t, 0*4+off+448(dst); \
|
||||||
|
MOVL t, 9*4+off+512(dst); \
|
||||||
|
MOVL t, 11*4+off+576(dst); \
|
||||||
|
MOVL 14*4(src), t; \
|
||||||
|
MOVL t, 11*4+off+0(dst); \
|
||||||
|
MOVL t, 0*4+off+64(dst); \
|
||||||
|
MOVL t, 12*4+off+128(dst); \
|
||||||
|
MOVL t, 7*4+off+192(dst); \
|
||||||
|
MOVL t, 8*4+off+256(dst); \
|
||||||
|
MOVL t, 14*4+off+320(dst); \
|
||||||
|
MOVL t, 2*4+off+384(dst); \
|
||||||
|
MOVL t, 5*4+off+448(dst); \
|
||||||
|
MOVL t, 1*4+off+512(dst); \
|
||||||
|
MOVL t, 13*4+off+576(dst); \
|
||||||
|
MOVL 15*4(src), t; \
|
||||||
|
MOVL t, 15*4+off+0(dst); \
|
||||||
|
MOVL t, 6*4+off+64(dst); \
|
||||||
|
MOVL t, 3*4+off+128(dst); \
|
||||||
|
MOVL t, 11*4+off+192(dst); \
|
||||||
|
MOVL t, 7*4+off+256(dst); \
|
||||||
|
MOVL t, 10*4+off+320(dst); \
|
||||||
|
MOVL t, 5*4+off+384(dst); \
|
||||||
|
MOVL t, 9*4+off+448(dst); \
|
||||||
|
MOVL t, 4*4+off+512(dst); \
|
||||||
|
MOVL t, 8*4+off+576(dst)
|
||||||
|
|
||||||
|
// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
TEXT ·hashBlocksSSE2(SB), 0, $672-24 // frame = 656 + 16 byte alignment
|
||||||
|
MOVL h+0(FP), AX
|
||||||
|
MOVL c+4(FP), BX
|
||||||
|
MOVL flag+8(FP), CX
|
||||||
|
MOVL blocks_base+12(FP), SI
|
||||||
|
MOVL blocks_len+16(FP), DX
|
||||||
|
|
||||||
|
MOVL SP, BP
|
||||||
|
MOVL SP, DI
|
||||||
|
ADDL $15, DI
|
||||||
|
ANDL $~15, DI
|
||||||
|
MOVL DI, SP
|
||||||
|
|
||||||
|
MOVL CX, 8(SP)
|
||||||
|
MOVL 0(BX), CX
|
||||||
|
MOVL CX, 0(SP)
|
||||||
|
MOVL 4(BX), CX
|
||||||
|
MOVL CX, 4(SP)
|
||||||
|
XORL CX, CX
|
||||||
|
MOVL CX, 12(SP)
|
||||||
|
|
||||||
|
MOVOU 0(AX), X0
|
||||||
|
MOVOU 16(AX), X1
|
||||||
|
MOVOU counter<>(SB), X2
|
||||||
|
|
||||||
|
loop:
|
||||||
|
MOVO X0, X4
|
||||||
|
MOVO X1, X5
|
||||||
|
MOVOU iv0<>(SB), X6
|
||||||
|
MOVOU iv1<>(SB), X7
|
||||||
|
|
||||||
|
MOVO 0(SP), X3
|
||||||
|
PADDQ X2, X3
|
||||||
|
PXOR X3, X7
|
||||||
|
MOVO X3, 0(SP)
|
||||||
|
|
||||||
|
PRECOMPUTE(SP, 16, SI, CX)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X3)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+64(SP), 32+64(SP), 48+64(SP), 64+64(SP), X3)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+128(SP), 32+128(SP), 48+128(SP), 64+128(SP), X3)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+192(SP), 32+192(SP), 48+192(SP), 64+192(SP), X3)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+256(SP), 32+256(SP), 48+256(SP), 64+256(SP), X3)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+320(SP), 32+320(SP), 48+320(SP), 64+320(SP), X3)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+384(SP), 32+384(SP), 48+384(SP), 64+384(SP), X3)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+448(SP), 32+448(SP), 48+448(SP), 64+448(SP), X3)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+512(SP), 32+512(SP), 48+512(SP), 64+512(SP), X3)
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+576(SP), 32+576(SP), 48+576(SP), 64+576(SP), X3)
|
||||||
|
|
||||||
|
PXOR X4, X0
|
||||||
|
PXOR X5, X1
|
||||||
|
PXOR X6, X0
|
||||||
|
PXOR X7, X1
|
||||||
|
|
||||||
|
LEAL 64(SI), SI
|
||||||
|
SUBL $64, DX
|
||||||
|
JNE loop
|
||||||
|
|
||||||
|
MOVL 0(SP), CX
|
||||||
|
MOVL CX, 0(BX)
|
||||||
|
MOVL 4(SP), CX
|
||||||
|
MOVL CX, 4(BX)
|
||||||
|
|
||||||
|
MOVOU X0, 0(AX)
|
||||||
|
MOVOU X1, 16(AX)
|
||||||
|
|
||||||
|
MOVL BP, SP
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
TEXT ·hashBlocksSSSE3(SB), 0, $704-24 // frame = 688 + 16 byte alignment
|
||||||
|
MOVL h+0(FP), AX
|
||||||
|
MOVL c+4(FP), BX
|
||||||
|
MOVL flag+8(FP), CX
|
||||||
|
MOVL blocks_base+12(FP), SI
|
||||||
|
MOVL blocks_len+16(FP), DX
|
||||||
|
|
||||||
|
MOVL SP, BP
|
||||||
|
MOVL SP, DI
|
||||||
|
ADDL $15, DI
|
||||||
|
ANDL $~15, DI
|
||||||
|
MOVL DI, SP
|
||||||
|
|
||||||
|
MOVL CX, 8(SP)
|
||||||
|
MOVL 0(BX), CX
|
||||||
|
MOVL CX, 0(SP)
|
||||||
|
MOVL 4(BX), CX
|
||||||
|
MOVL CX, 4(SP)
|
||||||
|
XORL CX, CX
|
||||||
|
MOVL CX, 12(SP)
|
||||||
|
|
||||||
|
MOVOU 0(AX), X0
|
||||||
|
MOVOU 16(AX), X1
|
||||||
|
MOVOU counter<>(SB), X2
|
||||||
|
|
||||||
|
loop:
|
||||||
|
MOVO X0, 656(SP)
|
||||||
|
MOVO X1, 672(SP)
|
||||||
|
MOVO X0, X4
|
||||||
|
MOVO X1, X5
|
||||||
|
MOVOU iv0<>(SB), X6
|
||||||
|
MOVOU iv1<>(SB), X7
|
||||||
|
|
||||||
|
MOVO 0(SP), X3
|
||||||
|
PADDQ X2, X3
|
||||||
|
PXOR X3, X7
|
||||||
|
MOVO X3, 0(SP)
|
||||||
|
|
||||||
|
MOVOU rol16<>(SB), X0
|
||||||
|
MOVOU rol8<>(SB), X1
|
||||||
|
|
||||||
|
PRECOMPUTE(SP, 16, SI, CX)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X3, X0, X1)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+64(SP), 32+64(SP), 48+64(SP), 64+64(SP), X3, X0, X1)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+128(SP), 32+128(SP), 48+128(SP), 64+128(SP), X3, X0, X1)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+192(SP), 32+192(SP), 48+192(SP), 64+192(SP), X3, X0, X1)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+256(SP), 32+256(SP), 48+256(SP), 64+256(SP), X3, X0, X1)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+320(SP), 32+320(SP), 48+320(SP), 64+320(SP), X3, X0, X1)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+384(SP), 32+384(SP), 48+384(SP), 64+384(SP), X3, X0, X1)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+448(SP), 32+448(SP), 48+448(SP), 64+448(SP), X3, X0, X1)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+512(SP), 32+512(SP), 48+512(SP), 64+512(SP), X3, X0, X1)
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+576(SP), 32+576(SP), 48+576(SP), 64+576(SP), X3, X0, X1)
|
||||||
|
|
||||||
|
MOVO 656(SP), X0
|
||||||
|
MOVO 672(SP), X1
|
||||||
|
PXOR X4, X0
|
||||||
|
PXOR X5, X1
|
||||||
|
PXOR X6, X0
|
||||||
|
PXOR X7, X1
|
||||||
|
|
||||||
|
LEAL 64(SI), SI
|
||||||
|
SUBL $64, DX
|
||||||
|
JNE loop
|
||||||
|
|
||||||
|
MOVL 0(SP), CX
|
||||||
|
MOVL CX, 0(BX)
|
||||||
|
MOVL 4(SP), CX
|
||||||
|
MOVL CX, 4(BX)
|
||||||
|
|
||||||
|
MOVOU X0, 0(AX)
|
||||||
|
MOVOU X1, 16(AX)
|
||||||
|
|
||||||
|
MOVL BP, SP
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func supportSSSE3() bool
|
||||||
|
TEXT ·supportSSSE3(SB), 4, $0-1
|
||||||
|
MOVL $1, AX
|
||||||
|
CPUID
|
||||||
|
MOVL CX, BX
|
||||||
|
ANDL $0x1, BX // supports SSE3
|
||||||
|
JZ FALSE
|
||||||
|
ANDL $0x200, CX // supports SSSE3
|
||||||
|
JZ FALSE
|
||||||
|
MOVB $1, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
FALSE:
|
||||||
|
MOVB $0, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func supportSSE2() bool
|
||||||
|
TEXT ·supportSSE2(SB), 4, $0-1
|
||||||
|
MOVL $1, AX
|
||||||
|
CPUID
|
||||||
|
SHRL $26, DX
|
||||||
|
ANDL $1, DX // DX != 0 if support SSE2
|
||||||
|
MOVB DX, ret+0(FP)
|
||||||
|
RET
|
||||||
39
vendor/golang.org/x/crypto/blake2s/blake2s_amd64.go
generated
vendored
Normal file
39
vendor/golang.org/x/crypto/blake2s/blake2s_amd64.go
generated
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build amd64,!gccgo,!appengine
|
||||||
|
|
||||||
|
package blake2s
|
||||||
|
|
||||||
|
var (
|
||||||
|
useSSE4 = supportSSE4()
|
||||||
|
useSSSE3 = supportSSSE3()
|
||||||
|
useSSE2 = true // Always available on amd64
|
||||||
|
useGeneric = false
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func supportSSSE3() bool
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func supportSSE4() bool
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func hashBlocksSSE4(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
|
||||||
|
func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) {
|
||||||
|
if useSSE4 {
|
||||||
|
hashBlocksSSE4(h, c, flag, blocks)
|
||||||
|
} else if useSSSE3 {
|
||||||
|
hashBlocksSSSE3(h, c, flag, blocks)
|
||||||
|
} else {
|
||||||
|
hashBlocksSSE2(h, c, flag, blocks)
|
||||||
|
}
|
||||||
|
}
|
||||||
463
vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s
generated
vendored
Normal file
463
vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s
generated
vendored
Normal file
|
|
@ -0,0 +1,463 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build amd64,!gccgo,!appengine
|
||||||
|
|
||||||
|
#include "textflag.h"
|
||||||
|
|
||||||
|
DATA iv0<>+0x00(SB)/4, $0x6a09e667
|
||||||
|
DATA iv0<>+0x04(SB)/4, $0xbb67ae85
|
||||||
|
DATA iv0<>+0x08(SB)/4, $0x3c6ef372
|
||||||
|
DATA iv0<>+0x0c(SB)/4, $0xa54ff53a
|
||||||
|
GLOBL iv0<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA iv1<>+0x00(SB)/4, $0x510e527f
|
||||||
|
DATA iv1<>+0x04(SB)/4, $0x9b05688c
|
||||||
|
DATA iv1<>+0x08(SB)/4, $0x1f83d9ab
|
||||||
|
DATA iv1<>+0x0c(SB)/4, $0x5be0cd19
|
||||||
|
GLOBL iv1<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA rol16<>+0x00(SB)/8, $0x0504070601000302
|
||||||
|
DATA rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A
|
||||||
|
GLOBL rol16<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA rol8<>+0x00(SB)/8, $0x0407060500030201
|
||||||
|
DATA rol8<>+0x08(SB)/8, $0x0C0F0E0D080B0A09
|
||||||
|
GLOBL rol8<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
DATA counter<>+0x00(SB)/8, $0x40
|
||||||
|
DATA counter<>+0x08(SB)/8, $0x0
|
||||||
|
GLOBL counter<>(SB), (NOPTR+RODATA), $16
|
||||||
|
|
||||||
|
#define ROTL_SSE2(n, t, v) \
|
||||||
|
MOVO v, t; \
|
||||||
|
PSLLL $n, t; \
|
||||||
|
PSRLL $(32-n), v; \
|
||||||
|
PXOR t, v
|
||||||
|
|
||||||
|
#define ROTL_SSSE3(c, v) \
|
||||||
|
PSHUFB c, v
|
||||||
|
|
||||||
|
#define ROUND_SSE2(v0, v1, v2, v3, m0, m1, m2, m3, t) \
|
||||||
|
PADDL m0, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSE2(16, t, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(20, t, v1); \
|
||||||
|
PADDL m1, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSE2(24, t, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(25, t, v1); \
|
||||||
|
PSHUFL $0x39, v1, v1; \
|
||||||
|
PSHUFL $0x4E, v2, v2; \
|
||||||
|
PSHUFL $0x93, v3, v3; \
|
||||||
|
PADDL m2, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSE2(16, t, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(20, t, v1); \
|
||||||
|
PADDL m3, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSE2(24, t, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(25, t, v1); \
|
||||||
|
PSHUFL $0x39, v3, v3; \
|
||||||
|
PSHUFL $0x4E, v2, v2; \
|
||||||
|
PSHUFL $0x93, v1, v1
|
||||||
|
|
||||||
|
#define ROUND_SSSE3(v0, v1, v2, v3, m0, m1, m2, m3, t, c16, c8) \
|
||||||
|
PADDL m0, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSSE3(c16, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(20, t, v1); \
|
||||||
|
PADDL m1, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSSE3(c8, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(25, t, v1); \
|
||||||
|
PSHUFL $0x39, v1, v1; \
|
||||||
|
PSHUFL $0x4E, v2, v2; \
|
||||||
|
PSHUFL $0x93, v3, v3; \
|
||||||
|
PADDL m2, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSSE3(c16, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(20, t, v1); \
|
||||||
|
PADDL m3, v0; \
|
||||||
|
PADDL v1, v0; \
|
||||||
|
PXOR v0, v3; \
|
||||||
|
ROTL_SSSE3(c8, v3); \
|
||||||
|
PADDL v3, v2; \
|
||||||
|
PXOR v2, v1; \
|
||||||
|
ROTL_SSE2(25, t, v1); \
|
||||||
|
PSHUFL $0x39, v3, v3; \
|
||||||
|
PSHUFL $0x4E, v2, v2; \
|
||||||
|
PSHUFL $0x93, v1, v1
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_MSG_SSE4(m0, m1, m2, m3, src, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15) \
|
||||||
|
MOVL i0*4(src), m0; \
|
||||||
|
PINSRD $1, i1*4(src), m0; \
|
||||||
|
PINSRD $2, i2*4(src), m0; \
|
||||||
|
PINSRD $3, i3*4(src), m0; \
|
||||||
|
MOVL i4*4(src), m1; \
|
||||||
|
PINSRD $1, i5*4(src), m1; \
|
||||||
|
PINSRD $2, i6*4(src), m1; \
|
||||||
|
PINSRD $3, i7*4(src), m1; \
|
||||||
|
MOVL i8*4(src), m2; \
|
||||||
|
PINSRD $1, i9*4(src), m2; \
|
||||||
|
PINSRD $2, i10*4(src), m2; \
|
||||||
|
PINSRD $3, i11*4(src), m2; \
|
||||||
|
MOVL i12*4(src), m3; \
|
||||||
|
PINSRD $1, i13*4(src), m3; \
|
||||||
|
PINSRD $2, i14*4(src), m3; \
|
||||||
|
PINSRD $3, i15*4(src), m3
|
||||||
|
|
||||||
|
#define PRECOMPUTE_MSG(dst, off, src, R8, R9, R10, R11, R12, R13, R14, R15) \
|
||||||
|
MOVQ 0*4(src), R8; \
|
||||||
|
MOVQ 2*4(src), R9; \
|
||||||
|
MOVQ 4*4(src), R10; \
|
||||||
|
MOVQ 6*4(src), R11; \
|
||||||
|
MOVQ 8*4(src), R12; \
|
||||||
|
MOVQ 10*4(src), R13; \
|
||||||
|
MOVQ 12*4(src), R14; \
|
||||||
|
MOVQ 14*4(src), R15; \
|
||||||
|
\
|
||||||
|
MOVL R8, 0*4+off+0(dst); \
|
||||||
|
MOVL R8, 9*4+off+64(dst); \
|
||||||
|
MOVL R8, 5*4+off+128(dst); \
|
||||||
|
MOVL R8, 14*4+off+192(dst); \
|
||||||
|
MOVL R8, 4*4+off+256(dst); \
|
||||||
|
MOVL R8, 2*4+off+320(dst); \
|
||||||
|
MOVL R8, 8*4+off+384(dst); \
|
||||||
|
MOVL R8, 12*4+off+448(dst); \
|
||||||
|
MOVL R8, 3*4+off+512(dst); \
|
||||||
|
MOVL R8, 15*4+off+576(dst); \
|
||||||
|
SHRQ $32, R8; \
|
||||||
|
MOVL R8, 4*4+off+0(dst); \
|
||||||
|
MOVL R8, 8*4+off+64(dst); \
|
||||||
|
MOVL R8, 14*4+off+128(dst); \
|
||||||
|
MOVL R8, 5*4+off+192(dst); \
|
||||||
|
MOVL R8, 12*4+off+256(dst); \
|
||||||
|
MOVL R8, 11*4+off+320(dst); \
|
||||||
|
MOVL R8, 1*4+off+384(dst); \
|
||||||
|
MOVL R8, 6*4+off+448(dst); \
|
||||||
|
MOVL R8, 10*4+off+512(dst); \
|
||||||
|
MOVL R8, 3*4+off+576(dst); \
|
||||||
|
\
|
||||||
|
MOVL R9, 1*4+off+0(dst); \
|
||||||
|
MOVL R9, 13*4+off+64(dst); \
|
||||||
|
MOVL R9, 6*4+off+128(dst); \
|
||||||
|
MOVL R9, 8*4+off+192(dst); \
|
||||||
|
MOVL R9, 2*4+off+256(dst); \
|
||||||
|
MOVL R9, 0*4+off+320(dst); \
|
||||||
|
MOVL R9, 14*4+off+384(dst); \
|
||||||
|
MOVL R9, 11*4+off+448(dst); \
|
||||||
|
MOVL R9, 12*4+off+512(dst); \
|
||||||
|
MOVL R9, 4*4+off+576(dst); \
|
||||||
|
SHRQ $32, R9; \
|
||||||
|
MOVL R9, 5*4+off+0(dst); \
|
||||||
|
MOVL R9, 15*4+off+64(dst); \
|
||||||
|
MOVL R9, 9*4+off+128(dst); \
|
||||||
|
MOVL R9, 1*4+off+192(dst); \
|
||||||
|
MOVL R9, 11*4+off+256(dst); \
|
||||||
|
MOVL R9, 7*4+off+320(dst); \
|
||||||
|
MOVL R9, 13*4+off+384(dst); \
|
||||||
|
MOVL R9, 3*4+off+448(dst); \
|
||||||
|
MOVL R9, 6*4+off+512(dst); \
|
||||||
|
MOVL R9, 10*4+off+576(dst); \
|
||||||
|
\
|
||||||
|
MOVL R10, 2*4+off+0(dst); \
|
||||||
|
MOVL R10, 1*4+off+64(dst); \
|
||||||
|
MOVL R10, 15*4+off+128(dst); \
|
||||||
|
MOVL R10, 10*4+off+192(dst); \
|
||||||
|
MOVL R10, 6*4+off+256(dst); \
|
||||||
|
MOVL R10, 8*4+off+320(dst); \
|
||||||
|
MOVL R10, 3*4+off+384(dst); \
|
||||||
|
MOVL R10, 13*4+off+448(dst); \
|
||||||
|
MOVL R10, 14*4+off+512(dst); \
|
||||||
|
MOVL R10, 5*4+off+576(dst); \
|
||||||
|
SHRQ $32, R10; \
|
||||||
|
MOVL R10, 6*4+off+0(dst); \
|
||||||
|
MOVL R10, 11*4+off+64(dst); \
|
||||||
|
MOVL R10, 2*4+off+128(dst); \
|
||||||
|
MOVL R10, 9*4+off+192(dst); \
|
||||||
|
MOVL R10, 1*4+off+256(dst); \
|
||||||
|
MOVL R10, 13*4+off+320(dst); \
|
||||||
|
MOVL R10, 4*4+off+384(dst); \
|
||||||
|
MOVL R10, 8*4+off+448(dst); \
|
||||||
|
MOVL R10, 15*4+off+512(dst); \
|
||||||
|
MOVL R10, 7*4+off+576(dst); \
|
||||||
|
\
|
||||||
|
MOVL R11, 3*4+off+0(dst); \
|
||||||
|
MOVL R11, 7*4+off+64(dst); \
|
||||||
|
MOVL R11, 13*4+off+128(dst); \
|
||||||
|
MOVL R11, 12*4+off+192(dst); \
|
||||||
|
MOVL R11, 10*4+off+256(dst); \
|
||||||
|
MOVL R11, 1*4+off+320(dst); \
|
||||||
|
MOVL R11, 9*4+off+384(dst); \
|
||||||
|
MOVL R11, 14*4+off+448(dst); \
|
||||||
|
MOVL R11, 0*4+off+512(dst); \
|
||||||
|
MOVL R11, 6*4+off+576(dst); \
|
||||||
|
SHRQ $32, R11; \
|
||||||
|
MOVL R11, 7*4+off+0(dst); \
|
||||||
|
MOVL R11, 14*4+off+64(dst); \
|
||||||
|
MOVL R11, 10*4+off+128(dst); \
|
||||||
|
MOVL R11, 0*4+off+192(dst); \
|
||||||
|
MOVL R11, 5*4+off+256(dst); \
|
||||||
|
MOVL R11, 9*4+off+320(dst); \
|
||||||
|
MOVL R11, 12*4+off+384(dst); \
|
||||||
|
MOVL R11, 1*4+off+448(dst); \
|
||||||
|
MOVL R11, 13*4+off+512(dst); \
|
||||||
|
MOVL R11, 2*4+off+576(dst); \
|
||||||
|
\
|
||||||
|
MOVL R12, 8*4+off+0(dst); \
|
||||||
|
MOVL R12, 5*4+off+64(dst); \
|
||||||
|
MOVL R12, 4*4+off+128(dst); \
|
||||||
|
MOVL R12, 15*4+off+192(dst); \
|
||||||
|
MOVL R12, 14*4+off+256(dst); \
|
||||||
|
MOVL R12, 3*4+off+320(dst); \
|
||||||
|
MOVL R12, 11*4+off+384(dst); \
|
||||||
|
MOVL R12, 10*4+off+448(dst); \
|
||||||
|
MOVL R12, 7*4+off+512(dst); \
|
||||||
|
MOVL R12, 1*4+off+576(dst); \
|
||||||
|
SHRQ $32, R12; \
|
||||||
|
MOVL R12, 12*4+off+0(dst); \
|
||||||
|
MOVL R12, 2*4+off+64(dst); \
|
||||||
|
MOVL R12, 11*4+off+128(dst); \
|
||||||
|
MOVL R12, 4*4+off+192(dst); \
|
||||||
|
MOVL R12, 0*4+off+256(dst); \
|
||||||
|
MOVL R12, 15*4+off+320(dst); \
|
||||||
|
MOVL R12, 10*4+off+384(dst); \
|
||||||
|
MOVL R12, 7*4+off+448(dst); \
|
||||||
|
MOVL R12, 5*4+off+512(dst); \
|
||||||
|
MOVL R12, 9*4+off+576(dst); \
|
||||||
|
\
|
||||||
|
MOVL R13, 9*4+off+0(dst); \
|
||||||
|
MOVL R13, 4*4+off+64(dst); \
|
||||||
|
MOVL R13, 8*4+off+128(dst); \
|
||||||
|
MOVL R13, 13*4+off+192(dst); \
|
||||||
|
MOVL R13, 3*4+off+256(dst); \
|
||||||
|
MOVL R13, 5*4+off+320(dst); \
|
||||||
|
MOVL R13, 7*4+off+384(dst); \
|
||||||
|
MOVL R13, 15*4+off+448(dst); \
|
||||||
|
MOVL R13, 11*4+off+512(dst); \
|
||||||
|
MOVL R13, 0*4+off+576(dst); \
|
||||||
|
SHRQ $32, R13; \
|
||||||
|
MOVL R13, 13*4+off+0(dst); \
|
||||||
|
MOVL R13, 10*4+off+64(dst); \
|
||||||
|
MOVL R13, 0*4+off+128(dst); \
|
||||||
|
MOVL R13, 3*4+off+192(dst); \
|
||||||
|
MOVL R13, 9*4+off+256(dst); \
|
||||||
|
MOVL R13, 6*4+off+320(dst); \
|
||||||
|
MOVL R13, 15*4+off+384(dst); \
|
||||||
|
MOVL R13, 4*4+off+448(dst); \
|
||||||
|
MOVL R13, 2*4+off+512(dst); \
|
||||||
|
MOVL R13, 12*4+off+576(dst); \
|
||||||
|
\
|
||||||
|
MOVL R14, 10*4+off+0(dst); \
|
||||||
|
MOVL R14, 12*4+off+64(dst); \
|
||||||
|
MOVL R14, 1*4+off+128(dst); \
|
||||||
|
MOVL R14, 6*4+off+192(dst); \
|
||||||
|
MOVL R14, 13*4+off+256(dst); \
|
||||||
|
MOVL R14, 4*4+off+320(dst); \
|
||||||
|
MOVL R14, 0*4+off+384(dst); \
|
||||||
|
MOVL R14, 2*4+off+448(dst); \
|
||||||
|
MOVL R14, 8*4+off+512(dst); \
|
||||||
|
MOVL R14, 14*4+off+576(dst); \
|
||||||
|
SHRQ $32, R14; \
|
||||||
|
MOVL R14, 14*4+off+0(dst); \
|
||||||
|
MOVL R14, 3*4+off+64(dst); \
|
||||||
|
MOVL R14, 7*4+off+128(dst); \
|
||||||
|
MOVL R14, 2*4+off+192(dst); \
|
||||||
|
MOVL R14, 15*4+off+256(dst); \
|
||||||
|
MOVL R14, 12*4+off+320(dst); \
|
||||||
|
MOVL R14, 6*4+off+384(dst); \
|
||||||
|
MOVL R14, 0*4+off+448(dst); \
|
||||||
|
MOVL R14, 9*4+off+512(dst); \
|
||||||
|
MOVL R14, 11*4+off+576(dst); \
|
||||||
|
\
|
||||||
|
MOVL R15, 11*4+off+0(dst); \
|
||||||
|
MOVL R15, 0*4+off+64(dst); \
|
||||||
|
MOVL R15, 12*4+off+128(dst); \
|
||||||
|
MOVL R15, 7*4+off+192(dst); \
|
||||||
|
MOVL R15, 8*4+off+256(dst); \
|
||||||
|
MOVL R15, 14*4+off+320(dst); \
|
||||||
|
MOVL R15, 2*4+off+384(dst); \
|
||||||
|
MOVL R15, 5*4+off+448(dst); \
|
||||||
|
MOVL R15, 1*4+off+512(dst); \
|
||||||
|
MOVL R15, 13*4+off+576(dst); \
|
||||||
|
SHRQ $32, R15; \
|
||||||
|
MOVL R15, 15*4+off+0(dst); \
|
||||||
|
MOVL R15, 6*4+off+64(dst); \
|
||||||
|
MOVL R15, 3*4+off+128(dst); \
|
||||||
|
MOVL R15, 11*4+off+192(dst); \
|
||||||
|
MOVL R15, 7*4+off+256(dst); \
|
||||||
|
MOVL R15, 10*4+off+320(dst); \
|
||||||
|
MOVL R15, 5*4+off+384(dst); \
|
||||||
|
MOVL R15, 9*4+off+448(dst); \
|
||||||
|
MOVL R15, 4*4+off+512(dst); \
|
||||||
|
MOVL R15, 8*4+off+576(dst)
|
||||||
|
|
||||||
|
#define BLAKE2s_SSE2() \
|
||||||
|
PRECOMPUTE_MSG(SP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X8); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+64(SP), 32+64(SP), 48+64(SP), 64+64(SP), X8); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+128(SP), 32+128(SP), 48+128(SP), 64+128(SP), X8); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+192(SP), 32+192(SP), 48+192(SP), 64+192(SP), X8); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+256(SP), 32+256(SP), 48+256(SP), 64+256(SP), X8); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+320(SP), 32+320(SP), 48+320(SP), 64+320(SP), X8); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+384(SP), 32+384(SP), 48+384(SP), 64+384(SP), X8); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+448(SP), 32+448(SP), 48+448(SP), 64+448(SP), X8); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+512(SP), 32+512(SP), 48+512(SP), 64+512(SP), X8); \
|
||||||
|
ROUND_SSE2(X4, X5, X6, X7, 16+576(SP), 32+576(SP), 48+576(SP), 64+576(SP), X8)
|
||||||
|
|
||||||
|
#define BLAKE2s_SSSE3() \
|
||||||
|
PRECOMPUTE_MSG(SP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X8, X13, X14); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+64(SP), 32+64(SP), 48+64(SP), 64+64(SP), X8, X13, X14); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+128(SP), 32+128(SP), 48+128(SP), 64+128(SP), X8, X13, X14); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+192(SP), 32+192(SP), 48+192(SP), 64+192(SP), X8, X13, X14); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+256(SP), 32+256(SP), 48+256(SP), 64+256(SP), X8, X13, X14); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+320(SP), 32+320(SP), 48+320(SP), 64+320(SP), X8, X13, X14); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+384(SP), 32+384(SP), 48+384(SP), 64+384(SP), X8, X13, X14); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+448(SP), 32+448(SP), 48+448(SP), 64+448(SP), X8, X13, X14); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+512(SP), 32+512(SP), 48+512(SP), 64+512(SP), X8, X13, X14); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, 16+576(SP), 32+576(SP), 48+576(SP), 64+576(SP), X8, X13, X14)
|
||||||
|
|
||||||
|
#define BLAKE2s_SSE4() \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \
|
||||||
|
LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0); \
|
||||||
|
ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14)
|
||||||
|
|
||||||
|
#define HASH_BLOCKS(h, c, flag, blocks_base, blocks_len, BLAKE2s_FUNC) \
|
||||||
|
MOVQ h, AX; \
|
||||||
|
MOVQ c, BX; \
|
||||||
|
MOVL flag, CX; \
|
||||||
|
MOVQ blocks_base, SI; \
|
||||||
|
MOVQ blocks_len, DX; \
|
||||||
|
\
|
||||||
|
MOVQ SP, BP; \
|
||||||
|
MOVQ SP, R9; \
|
||||||
|
ADDQ $15, R9; \
|
||||||
|
ANDQ $~15, R9; \
|
||||||
|
MOVQ R9, SP; \
|
||||||
|
\
|
||||||
|
MOVQ 0(BX), R9; \
|
||||||
|
MOVQ R9, 0(SP); \
|
||||||
|
XORQ R9, R9; \
|
||||||
|
MOVQ R9, 8(SP); \
|
||||||
|
MOVL CX, 8(SP); \
|
||||||
|
\
|
||||||
|
MOVOU 0(AX), X0; \
|
||||||
|
MOVOU 16(AX), X1; \
|
||||||
|
MOVOU iv0<>(SB), X2; \
|
||||||
|
MOVOU iv1<>(SB), X3 \
|
||||||
|
\
|
||||||
|
MOVOU counter<>(SB), X12; \
|
||||||
|
MOVOU rol16<>(SB), X13; \
|
||||||
|
MOVOU rol8<>(SB), X14; \
|
||||||
|
MOVO 0(SP), X15; \
|
||||||
|
\
|
||||||
|
loop: \
|
||||||
|
MOVO X0, X4; \
|
||||||
|
MOVO X1, X5; \
|
||||||
|
MOVO X2, X6; \
|
||||||
|
MOVO X3, X7; \
|
||||||
|
\
|
||||||
|
PADDQ X12, X15; \
|
||||||
|
PXOR X15, X7; \
|
||||||
|
\
|
||||||
|
BLAKE2s_FUNC(); \
|
||||||
|
\
|
||||||
|
PXOR X4, X0; \
|
||||||
|
PXOR X5, X1; \
|
||||||
|
PXOR X6, X0; \
|
||||||
|
PXOR X7, X1; \
|
||||||
|
\
|
||||||
|
LEAQ 64(SI), SI; \
|
||||||
|
SUBQ $64, DX; \
|
||||||
|
JNE loop; \
|
||||||
|
\
|
||||||
|
MOVO X15, 0(SP); \
|
||||||
|
MOVQ 0(SP), R9; \
|
||||||
|
MOVQ R9, 0(BX); \
|
||||||
|
\
|
||||||
|
MOVOU X0, 0(AX); \
|
||||||
|
MOVOU X1, 16(AX); \
|
||||||
|
\
|
||||||
|
MOVQ BP, SP
|
||||||
|
|
||||||
|
// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
TEXT ·hashBlocksSSE2(SB), 0, $672-48 // frame = 656 + 16 byte alignment
|
||||||
|
HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE2)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
TEXT ·hashBlocksSSSE3(SB), 0, $672-48 // frame = 656 + 16 byte alignment
|
||||||
|
HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSSE3)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func hashBlocksSSE4(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte)
|
||||||
|
TEXT ·hashBlocksSSE4(SB), 0, $32-48 // frame = 16 + 16 byte alignment
|
||||||
|
HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE4)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func supportSSE4() bool
|
||||||
|
TEXT ·supportSSE4(SB), 4, $0-1
|
||||||
|
MOVL $1, AX
|
||||||
|
CPUID
|
||||||
|
SHRL $19, CX // Bit 19 indicates SSE4.1.
|
||||||
|
ANDL $1, CX
|
||||||
|
MOVB CX, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
// func supportSSSE3() bool
|
||||||
|
TEXT ·supportSSSE3(SB), 4, $0-1
|
||||||
|
MOVL $1, AX
|
||||||
|
CPUID
|
||||||
|
MOVL CX, BX
|
||||||
|
ANDL $0x1, BX // Bit zero indicates SSE3 support.
|
||||||
|
JZ FALSE
|
||||||
|
ANDL $0x200, CX // Bit nine indicates SSSE3 support.
|
||||||
|
JZ FALSE
|
||||||
|
MOVB $1, ret+0(FP)
|
||||||
|
RET
|
||||||
|
|
||||||
|
FALSE:
|
||||||
|
MOVB $0, ret+0(FP)
|
||||||
|
RET
|
||||||
174
vendor/golang.org/x/crypto/blake2s/blake2s_generic.go
generated
vendored
Normal file
174
vendor/golang.org/x/crypto/blake2s/blake2s_generic.go
generated
vendored
Normal file
|
|
@ -0,0 +1,174 @@
|
||||||
|
// 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 blake2s
|
||||||
|
|
||||||
|
// the precomputed values for BLAKE2s
|
||||||
|
// there are 10 16-byte arrays - one for each round
|
||||||
|
// the entries are calculated from the sigma constants.
|
||||||
|
var precomputed = [10][16]byte{
|
||||||
|
{0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15},
|
||||||
|
{14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3},
|
||||||
|
{11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4},
|
||||||
|
{7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8},
|
||||||
|
{9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13},
|
||||||
|
{2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9},
|
||||||
|
{12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11},
|
||||||
|
{13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10},
|
||||||
|
{6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5},
|
||||||
|
{10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0},
|
||||||
|
}
|
||||||
|
|
||||||
|
func hashBlocksGeneric(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) {
|
||||||
|
var m [16]uint32
|
||||||
|
c0, c1 := c[0], c[1]
|
||||||
|
|
||||||
|
for i := 0; i < len(blocks); {
|
||||||
|
c0 += BlockSize
|
||||||
|
if c0 < BlockSize {
|
||||||
|
c1++
|
||||||
|
}
|
||||||
|
|
||||||
|
v0, v1, v2, v3, v4, v5, v6, v7 := h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]
|
||||||
|
v8, v9, v10, v11, v12, v13, v14, v15 := iv[0], iv[1], iv[2], iv[3], iv[4], iv[5], iv[6], iv[7]
|
||||||
|
v12 ^= c0
|
||||||
|
v13 ^= c1
|
||||||
|
v14 ^= flag
|
||||||
|
|
||||||
|
for j := range m {
|
||||||
|
m[j] = uint32(blocks[i]) | uint32(blocks[i+1])<<8 | uint32(blocks[i+2])<<16 | uint32(blocks[i+3])<<24
|
||||||
|
i += 4
|
||||||
|
}
|
||||||
|
|
||||||
|
for k := range precomputed {
|
||||||
|
s := &(precomputed[k])
|
||||||
|
|
||||||
|
v0 += m[s[0]]
|
||||||
|
v0 += v4
|
||||||
|
v12 ^= v0
|
||||||
|
v12 = v12<<(32-16) | v12>>16
|
||||||
|
v8 += v12
|
||||||
|
v4 ^= v8
|
||||||
|
v4 = v4<<(32-12) | v4>>12
|
||||||
|
v1 += m[s[1]]
|
||||||
|
v1 += v5
|
||||||
|
v13 ^= v1
|
||||||
|
v13 = v13<<(32-16) | v13>>16
|
||||||
|
v9 += v13
|
||||||
|
v5 ^= v9
|
||||||
|
v5 = v5<<(32-12) | v5>>12
|
||||||
|
v2 += m[s[2]]
|
||||||
|
v2 += v6
|
||||||
|
v14 ^= v2
|
||||||
|
v14 = v14<<(32-16) | v14>>16
|
||||||
|
v10 += v14
|
||||||
|
v6 ^= v10
|
||||||
|
v6 = v6<<(32-12) | v6>>12
|
||||||
|
v3 += m[s[3]]
|
||||||
|
v3 += v7
|
||||||
|
v15 ^= v3
|
||||||
|
v15 = v15<<(32-16) | v15>>16
|
||||||
|
v11 += v15
|
||||||
|
v7 ^= v11
|
||||||
|
v7 = v7<<(32-12) | v7>>12
|
||||||
|
|
||||||
|
v0 += m[s[4]]
|
||||||
|
v0 += v4
|
||||||
|
v12 ^= v0
|
||||||
|
v12 = v12<<(32-8) | v12>>8
|
||||||
|
v8 += v12
|
||||||
|
v4 ^= v8
|
||||||
|
v4 = v4<<(32-7) | v4>>7
|
||||||
|
v1 += m[s[5]]
|
||||||
|
v1 += v5
|
||||||
|
v13 ^= v1
|
||||||
|
v13 = v13<<(32-8) | v13>>8
|
||||||
|
v9 += v13
|
||||||
|
v5 ^= v9
|
||||||
|
v5 = v5<<(32-7) | v5>>7
|
||||||
|
v2 += m[s[6]]
|
||||||
|
v2 += v6
|
||||||
|
v14 ^= v2
|
||||||
|
v14 = v14<<(32-8) | v14>>8
|
||||||
|
v10 += v14
|
||||||
|
v6 ^= v10
|
||||||
|
v6 = v6<<(32-7) | v6>>7
|
||||||
|
v3 += m[s[7]]
|
||||||
|
v3 += v7
|
||||||
|
v15 ^= v3
|
||||||
|
v15 = v15<<(32-8) | v15>>8
|
||||||
|
v11 += v15
|
||||||
|
v7 ^= v11
|
||||||
|
v7 = v7<<(32-7) | v7>>7
|
||||||
|
|
||||||
|
v0 += m[s[8]]
|
||||||
|
v0 += v5
|
||||||
|
v15 ^= v0
|
||||||
|
v15 = v15<<(32-16) | v15>>16
|
||||||
|
v10 += v15
|
||||||
|
v5 ^= v10
|
||||||
|
v5 = v5<<(32-12) | v5>>12
|
||||||
|
v1 += m[s[9]]
|
||||||
|
v1 += v6
|
||||||
|
v12 ^= v1
|
||||||
|
v12 = v12<<(32-16) | v12>>16
|
||||||
|
v11 += v12
|
||||||
|
v6 ^= v11
|
||||||
|
v6 = v6<<(32-12) | v6>>12
|
||||||
|
v2 += m[s[10]]
|
||||||
|
v2 += v7
|
||||||
|
v13 ^= v2
|
||||||
|
v13 = v13<<(32-16) | v13>>16
|
||||||
|
v8 += v13
|
||||||
|
v7 ^= v8
|
||||||
|
v7 = v7<<(32-12) | v7>>12
|
||||||
|
v3 += m[s[11]]
|
||||||
|
v3 += v4
|
||||||
|
v14 ^= v3
|
||||||
|
v14 = v14<<(32-16) | v14>>16
|
||||||
|
v9 += v14
|
||||||
|
v4 ^= v9
|
||||||
|
v4 = v4<<(32-12) | v4>>12
|
||||||
|
|
||||||
|
v0 += m[s[12]]
|
||||||
|
v0 += v5
|
||||||
|
v15 ^= v0
|
||||||
|
v15 = v15<<(32-8) | v15>>8
|
||||||
|
v10 += v15
|
||||||
|
v5 ^= v10
|
||||||
|
v5 = v5<<(32-7) | v5>>7
|
||||||
|
v1 += m[s[13]]
|
||||||
|
v1 += v6
|
||||||
|
v12 ^= v1
|
||||||
|
v12 = v12<<(32-8) | v12>>8
|
||||||
|
v11 += v12
|
||||||
|
v6 ^= v11
|
||||||
|
v6 = v6<<(32-7) | v6>>7
|
||||||
|
v2 += m[s[14]]
|
||||||
|
v2 += v7
|
||||||
|
v13 ^= v2
|
||||||
|
v13 = v13<<(32-8) | v13>>8
|
||||||
|
v8 += v13
|
||||||
|
v7 ^= v8
|
||||||
|
v7 = v7<<(32-7) | v7>>7
|
||||||
|
v3 += m[s[15]]
|
||||||
|
v3 += v4
|
||||||
|
v14 ^= v3
|
||||||
|
v14 = v14<<(32-8) | v14>>8
|
||||||
|
v9 += v14
|
||||||
|
v4 ^= v9
|
||||||
|
v4 = v4<<(32-7) | v4>>7
|
||||||
|
}
|
||||||
|
|
||||||
|
h[0] ^= v0 ^ v8
|
||||||
|
h[1] ^= v1 ^ v9
|
||||||
|
h[2] ^= v2 ^ v10
|
||||||
|
h[3] ^= v3 ^ v11
|
||||||
|
h[4] ^= v4 ^ v12
|
||||||
|
h[5] ^= v5 ^ v13
|
||||||
|
h[6] ^= v6 ^ v14
|
||||||
|
h[7] ^= v7 ^ v15
|
||||||
|
}
|
||||||
|
c[0], c[1] = c0, c1
|
||||||
|
}
|
||||||
18
vendor/golang.org/x/crypto/blake2s/blake2s_ref.go
generated
vendored
Normal file
18
vendor/golang.org/x/crypto/blake2s/blake2s_ref.go
generated
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build !amd64,!386 gccgo appengine
|
||||||
|
|
||||||
|
package blake2s
|
||||||
|
|
||||||
|
var (
|
||||||
|
useSSE4 = false
|
||||||
|
useSSSE3 = false
|
||||||
|
useSSE2 = false
|
||||||
|
useGeneric = true
|
||||||
|
)
|
||||||
|
|
||||||
|
func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) {
|
||||||
|
hashBlocksGeneric(h, c, flag, blocks)
|
||||||
|
}
|
||||||
21
vendor/golang.org/x/crypto/blake2s/register.go
generated
vendored
Normal file
21
vendor/golang.org/x/crypto/blake2s/register.go
generated
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build go1.9
|
||||||
|
|
||||||
|
package blake2s
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto"
|
||||||
|
"hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
newHash256 := func() hash.Hash {
|
||||||
|
h, _ := New256(nil)
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
crypto.RegisterHash(crypto.BLAKE2s_256, newHash256)
|
||||||
|
}
|
||||||
66
vendor/golang.org/x/crypto/sha3/doc.go
generated
vendored
Normal file
66
vendor/golang.org/x/crypto/sha3/doc.go
generated
vendored
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package sha3 implements the SHA-3 fixed-output-length hash functions and
|
||||||
|
// the SHAKE variable-output-length hash functions defined by FIPS-202.
|
||||||
|
//
|
||||||
|
// Both types of hash function use the "sponge" construction and the Keccak
|
||||||
|
// permutation. For a detailed specification see http://keccak.noekeon.org/
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Guidance
|
||||||
|
//
|
||||||
|
// If you aren't sure what function you need, use SHAKE256 with at least 64
|
||||||
|
// bytes of output. The SHAKE instances are faster than the SHA3 instances;
|
||||||
|
// the latter have to allocate memory to conform to the hash.Hash interface.
|
||||||
|
//
|
||||||
|
// If you need a secret-key MAC (message authentication code), prepend the
|
||||||
|
// secret key to the input, hash with SHAKE256 and read at least 32 bytes of
|
||||||
|
// output.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Security strengths
|
||||||
|
//
|
||||||
|
// The SHA3-x (x equals 224, 256, 384, or 512) functions have a security
|
||||||
|
// strength against preimage attacks of x bits. Since they only produce "x"
|
||||||
|
// bits of output, their collision-resistance is only "x/2" bits.
|
||||||
|
//
|
||||||
|
// The SHAKE-256 and -128 functions have a generic security strength of 256 and
|
||||||
|
// 128 bits against all attacks, provided that at least 2x bits of their output
|
||||||
|
// is used. Requesting more than 64 or 32 bytes of output, respectively, does
|
||||||
|
// not increase the collision-resistance of the SHAKE functions.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// The sponge construction
|
||||||
|
//
|
||||||
|
// A sponge builds a pseudo-random function from a public pseudo-random
|
||||||
|
// permutation, by applying the permutation to a state of "rate + capacity"
|
||||||
|
// bytes, but hiding "capacity" of the bytes.
|
||||||
|
//
|
||||||
|
// A sponge starts out with a zero state. To hash an input using a sponge, up
|
||||||
|
// to "rate" bytes of the input are XORed into the sponge's state. The sponge
|
||||||
|
// is then "full" and the permutation is applied to "empty" it. This process is
|
||||||
|
// repeated until all the input has been "absorbed". The input is then padded.
|
||||||
|
// The digest is "squeezed" from the sponge in the same way, except that output
|
||||||
|
// output is copied out instead of input being XORed in.
|
||||||
|
//
|
||||||
|
// A sponge is parameterized by its generic security strength, which is equal
|
||||||
|
// to half its capacity; capacity + rate is equal to the permutation's width.
|
||||||
|
// Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means
|
||||||
|
// that the security strength of a sponge instance is equal to (1600 - bitrate) / 2.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Recommendations
|
||||||
|
//
|
||||||
|
// The SHAKE functions are recommended for most new uses. They can produce
|
||||||
|
// output of arbitrary length. SHAKE256, with an output length of at least
|
||||||
|
// 64 bytes, provides 256-bit security against all attacks. The Keccak team
|
||||||
|
// recommends it for most applications upgrading from SHA2-512. (NIST chose a
|
||||||
|
// much stronger, but much slower, sponge instance for SHA3-512.)
|
||||||
|
//
|
||||||
|
// The SHA-3 functions are "drop-in" replacements for the SHA-2 functions.
|
||||||
|
// They produce output of the same length, with the same security strengths
|
||||||
|
// against all attacks. This means, in particular, that SHA3-256 only has
|
||||||
|
// 128-bit collision resistance, because its output length is 32 bytes.
|
||||||
|
package sha3 // import "golang.org/x/crypto/sha3"
|
||||||
65
vendor/golang.org/x/crypto/sha3/hashes.go
generated
vendored
Normal file
65
vendor/golang.org/x/crypto/sha3/hashes.go
generated
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package sha3
|
||||||
|
|
||||||
|
// This file provides functions for creating instances of the SHA-3
|
||||||
|
// and SHAKE hash functions, as well as utility functions for hashing
|
||||||
|
// bytes.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
// New224 creates a new SHA3-224 hash.
|
||||||
|
// Its generic security strength is 224 bits against preimage attacks,
|
||||||
|
// and 112 bits against collision attacks.
|
||||||
|
func New224() hash.Hash { return &state{rate: 144, outputLen: 28, dsbyte: 0x06} }
|
||||||
|
|
||||||
|
// New256 creates a new SHA3-256 hash.
|
||||||
|
// Its generic security strength is 256 bits against preimage attacks,
|
||||||
|
// and 128 bits against collision attacks.
|
||||||
|
func New256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x06} }
|
||||||
|
|
||||||
|
// New384 creates a new SHA3-384 hash.
|
||||||
|
// Its generic security strength is 384 bits against preimage attacks,
|
||||||
|
// and 192 bits against collision attacks.
|
||||||
|
func New384() hash.Hash { return &state{rate: 104, outputLen: 48, dsbyte: 0x06} }
|
||||||
|
|
||||||
|
// New512 creates a new SHA3-512 hash.
|
||||||
|
// Its generic security strength is 512 bits against preimage attacks,
|
||||||
|
// and 256 bits against collision attacks.
|
||||||
|
func New512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x06} }
|
||||||
|
|
||||||
|
// Sum224 returns the SHA3-224 digest of the data.
|
||||||
|
func Sum224(data []byte) (digest [28]byte) {
|
||||||
|
h := New224()
|
||||||
|
h.Write(data)
|
||||||
|
h.Sum(digest[:0])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum256 returns the SHA3-256 digest of the data.
|
||||||
|
func Sum256(data []byte) (digest [32]byte) {
|
||||||
|
h := New256()
|
||||||
|
h.Write(data)
|
||||||
|
h.Sum(digest[:0])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum384 returns the SHA3-384 digest of the data.
|
||||||
|
func Sum384(data []byte) (digest [48]byte) {
|
||||||
|
h := New384()
|
||||||
|
h.Write(data)
|
||||||
|
h.Sum(digest[:0])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum512 returns the SHA3-512 digest of the data.
|
||||||
|
func Sum512(data []byte) (digest [64]byte) {
|
||||||
|
h := New512()
|
||||||
|
h.Write(data)
|
||||||
|
h.Sum(digest[:0])
|
||||||
|
return
|
||||||
|
}
|
||||||
412
vendor/golang.org/x/crypto/sha3/keccakf.go
generated
vendored
Normal file
412
vendor/golang.org/x/crypto/sha3/keccakf.go
generated
vendored
Normal file
|
|
@ -0,0 +1,412 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build !amd64 appengine gccgo
|
||||||
|
|
||||||
|
package sha3
|
||||||
|
|
||||||
|
// rc stores the round constants for use in the ι step.
|
||||||
|
var rc = [24]uint64{
|
||||||
|
0x0000000000000001,
|
||||||
|
0x0000000000008082,
|
||||||
|
0x800000000000808A,
|
||||||
|
0x8000000080008000,
|
||||||
|
0x000000000000808B,
|
||||||
|
0x0000000080000001,
|
||||||
|
0x8000000080008081,
|
||||||
|
0x8000000000008009,
|
||||||
|
0x000000000000008A,
|
||||||
|
0x0000000000000088,
|
||||||
|
0x0000000080008009,
|
||||||
|
0x000000008000000A,
|
||||||
|
0x000000008000808B,
|
||||||
|
0x800000000000008B,
|
||||||
|
0x8000000000008089,
|
||||||
|
0x8000000000008003,
|
||||||
|
0x8000000000008002,
|
||||||
|
0x8000000000000080,
|
||||||
|
0x000000000000800A,
|
||||||
|
0x800000008000000A,
|
||||||
|
0x8000000080008081,
|
||||||
|
0x8000000000008080,
|
||||||
|
0x0000000080000001,
|
||||||
|
0x8000000080008008,
|
||||||
|
}
|
||||||
|
|
||||||
|
// keccakF1600 applies the Keccak permutation to a 1600b-wide
|
||||||
|
// state represented as a slice of 25 uint64s.
|
||||||
|
func keccakF1600(a *[25]uint64) {
|
||||||
|
// Implementation translated from Keccak-inplace.c
|
||||||
|
// in the keccak reference code.
|
||||||
|
var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64
|
||||||
|
|
||||||
|
for i := 0; i < 24; i += 4 {
|
||||||
|
// Combines the 5 steps in each round into 2 steps.
|
||||||
|
// Unrolls 4 rounds per loop and spreads some steps across rounds.
|
||||||
|
|
||||||
|
// Round 1
|
||||||
|
bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
|
||||||
|
bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
|
||||||
|
bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
|
||||||
|
bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
|
||||||
|
bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
|
||||||
|
d0 = bc4 ^ (bc1<<1 | bc1>>63)
|
||||||
|
d1 = bc0 ^ (bc2<<1 | bc2>>63)
|
||||||
|
d2 = bc1 ^ (bc3<<1 | bc3>>63)
|
||||||
|
d3 = bc2 ^ (bc4<<1 | bc4>>63)
|
||||||
|
d4 = bc3 ^ (bc0<<1 | bc0>>63)
|
||||||
|
|
||||||
|
bc0 = a[0] ^ d0
|
||||||
|
t = a[6] ^ d1
|
||||||
|
bc1 = t<<44 | t>>(64-44)
|
||||||
|
t = a[12] ^ d2
|
||||||
|
bc2 = t<<43 | t>>(64-43)
|
||||||
|
t = a[18] ^ d3
|
||||||
|
bc3 = t<<21 | t>>(64-21)
|
||||||
|
t = a[24] ^ d4
|
||||||
|
bc4 = t<<14 | t>>(64-14)
|
||||||
|
a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i]
|
||||||
|
a[6] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[12] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[18] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[24] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[10] ^ d0
|
||||||
|
bc2 = t<<3 | t>>(64-3)
|
||||||
|
t = a[16] ^ d1
|
||||||
|
bc3 = t<<45 | t>>(64-45)
|
||||||
|
t = a[22] ^ d2
|
||||||
|
bc4 = t<<61 | t>>(64-61)
|
||||||
|
t = a[3] ^ d3
|
||||||
|
bc0 = t<<28 | t>>(64-28)
|
||||||
|
t = a[9] ^ d4
|
||||||
|
bc1 = t<<20 | t>>(64-20)
|
||||||
|
a[10] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[16] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[22] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[3] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[9] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[20] ^ d0
|
||||||
|
bc4 = t<<18 | t>>(64-18)
|
||||||
|
t = a[1] ^ d1
|
||||||
|
bc0 = t<<1 | t>>(64-1)
|
||||||
|
t = a[7] ^ d2
|
||||||
|
bc1 = t<<6 | t>>(64-6)
|
||||||
|
t = a[13] ^ d3
|
||||||
|
bc2 = t<<25 | t>>(64-25)
|
||||||
|
t = a[19] ^ d4
|
||||||
|
bc3 = t<<8 | t>>(64-8)
|
||||||
|
a[20] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[1] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[7] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[13] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[19] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[5] ^ d0
|
||||||
|
bc1 = t<<36 | t>>(64-36)
|
||||||
|
t = a[11] ^ d1
|
||||||
|
bc2 = t<<10 | t>>(64-10)
|
||||||
|
t = a[17] ^ d2
|
||||||
|
bc3 = t<<15 | t>>(64-15)
|
||||||
|
t = a[23] ^ d3
|
||||||
|
bc4 = t<<56 | t>>(64-56)
|
||||||
|
t = a[4] ^ d4
|
||||||
|
bc0 = t<<27 | t>>(64-27)
|
||||||
|
a[5] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[11] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[17] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[23] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[4] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[15] ^ d0
|
||||||
|
bc3 = t<<41 | t>>(64-41)
|
||||||
|
t = a[21] ^ d1
|
||||||
|
bc4 = t<<2 | t>>(64-2)
|
||||||
|
t = a[2] ^ d2
|
||||||
|
bc0 = t<<62 | t>>(64-62)
|
||||||
|
t = a[8] ^ d3
|
||||||
|
bc1 = t<<55 | t>>(64-55)
|
||||||
|
t = a[14] ^ d4
|
||||||
|
bc2 = t<<39 | t>>(64-39)
|
||||||
|
a[15] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[21] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[2] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[8] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[14] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
// Round 2
|
||||||
|
bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
|
||||||
|
bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
|
||||||
|
bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
|
||||||
|
bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
|
||||||
|
bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
|
||||||
|
d0 = bc4 ^ (bc1<<1 | bc1>>63)
|
||||||
|
d1 = bc0 ^ (bc2<<1 | bc2>>63)
|
||||||
|
d2 = bc1 ^ (bc3<<1 | bc3>>63)
|
||||||
|
d3 = bc2 ^ (bc4<<1 | bc4>>63)
|
||||||
|
d4 = bc3 ^ (bc0<<1 | bc0>>63)
|
||||||
|
|
||||||
|
bc0 = a[0] ^ d0
|
||||||
|
t = a[16] ^ d1
|
||||||
|
bc1 = t<<44 | t>>(64-44)
|
||||||
|
t = a[7] ^ d2
|
||||||
|
bc2 = t<<43 | t>>(64-43)
|
||||||
|
t = a[23] ^ d3
|
||||||
|
bc3 = t<<21 | t>>(64-21)
|
||||||
|
t = a[14] ^ d4
|
||||||
|
bc4 = t<<14 | t>>(64-14)
|
||||||
|
a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1]
|
||||||
|
a[16] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[7] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[23] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[14] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[20] ^ d0
|
||||||
|
bc2 = t<<3 | t>>(64-3)
|
||||||
|
t = a[11] ^ d1
|
||||||
|
bc3 = t<<45 | t>>(64-45)
|
||||||
|
t = a[2] ^ d2
|
||||||
|
bc4 = t<<61 | t>>(64-61)
|
||||||
|
t = a[18] ^ d3
|
||||||
|
bc0 = t<<28 | t>>(64-28)
|
||||||
|
t = a[9] ^ d4
|
||||||
|
bc1 = t<<20 | t>>(64-20)
|
||||||
|
a[20] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[11] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[2] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[18] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[9] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[15] ^ d0
|
||||||
|
bc4 = t<<18 | t>>(64-18)
|
||||||
|
t = a[6] ^ d1
|
||||||
|
bc0 = t<<1 | t>>(64-1)
|
||||||
|
t = a[22] ^ d2
|
||||||
|
bc1 = t<<6 | t>>(64-6)
|
||||||
|
t = a[13] ^ d3
|
||||||
|
bc2 = t<<25 | t>>(64-25)
|
||||||
|
t = a[4] ^ d4
|
||||||
|
bc3 = t<<8 | t>>(64-8)
|
||||||
|
a[15] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[6] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[22] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[13] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[4] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[10] ^ d0
|
||||||
|
bc1 = t<<36 | t>>(64-36)
|
||||||
|
t = a[1] ^ d1
|
||||||
|
bc2 = t<<10 | t>>(64-10)
|
||||||
|
t = a[17] ^ d2
|
||||||
|
bc3 = t<<15 | t>>(64-15)
|
||||||
|
t = a[8] ^ d3
|
||||||
|
bc4 = t<<56 | t>>(64-56)
|
||||||
|
t = a[24] ^ d4
|
||||||
|
bc0 = t<<27 | t>>(64-27)
|
||||||
|
a[10] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[1] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[17] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[8] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[24] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[5] ^ d0
|
||||||
|
bc3 = t<<41 | t>>(64-41)
|
||||||
|
t = a[21] ^ d1
|
||||||
|
bc4 = t<<2 | t>>(64-2)
|
||||||
|
t = a[12] ^ d2
|
||||||
|
bc0 = t<<62 | t>>(64-62)
|
||||||
|
t = a[3] ^ d3
|
||||||
|
bc1 = t<<55 | t>>(64-55)
|
||||||
|
t = a[19] ^ d4
|
||||||
|
bc2 = t<<39 | t>>(64-39)
|
||||||
|
a[5] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[21] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[12] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[3] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[19] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
// Round 3
|
||||||
|
bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
|
||||||
|
bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
|
||||||
|
bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
|
||||||
|
bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
|
||||||
|
bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
|
||||||
|
d0 = bc4 ^ (bc1<<1 | bc1>>63)
|
||||||
|
d1 = bc0 ^ (bc2<<1 | bc2>>63)
|
||||||
|
d2 = bc1 ^ (bc3<<1 | bc3>>63)
|
||||||
|
d3 = bc2 ^ (bc4<<1 | bc4>>63)
|
||||||
|
d4 = bc3 ^ (bc0<<1 | bc0>>63)
|
||||||
|
|
||||||
|
bc0 = a[0] ^ d0
|
||||||
|
t = a[11] ^ d1
|
||||||
|
bc1 = t<<44 | t>>(64-44)
|
||||||
|
t = a[22] ^ d2
|
||||||
|
bc2 = t<<43 | t>>(64-43)
|
||||||
|
t = a[8] ^ d3
|
||||||
|
bc3 = t<<21 | t>>(64-21)
|
||||||
|
t = a[19] ^ d4
|
||||||
|
bc4 = t<<14 | t>>(64-14)
|
||||||
|
a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2]
|
||||||
|
a[11] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[22] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[8] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[19] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[15] ^ d0
|
||||||
|
bc2 = t<<3 | t>>(64-3)
|
||||||
|
t = a[1] ^ d1
|
||||||
|
bc3 = t<<45 | t>>(64-45)
|
||||||
|
t = a[12] ^ d2
|
||||||
|
bc4 = t<<61 | t>>(64-61)
|
||||||
|
t = a[23] ^ d3
|
||||||
|
bc0 = t<<28 | t>>(64-28)
|
||||||
|
t = a[9] ^ d4
|
||||||
|
bc1 = t<<20 | t>>(64-20)
|
||||||
|
a[15] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[1] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[12] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[23] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[9] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[5] ^ d0
|
||||||
|
bc4 = t<<18 | t>>(64-18)
|
||||||
|
t = a[16] ^ d1
|
||||||
|
bc0 = t<<1 | t>>(64-1)
|
||||||
|
t = a[2] ^ d2
|
||||||
|
bc1 = t<<6 | t>>(64-6)
|
||||||
|
t = a[13] ^ d3
|
||||||
|
bc2 = t<<25 | t>>(64-25)
|
||||||
|
t = a[24] ^ d4
|
||||||
|
bc3 = t<<8 | t>>(64-8)
|
||||||
|
a[5] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[16] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[2] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[13] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[24] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[20] ^ d0
|
||||||
|
bc1 = t<<36 | t>>(64-36)
|
||||||
|
t = a[6] ^ d1
|
||||||
|
bc2 = t<<10 | t>>(64-10)
|
||||||
|
t = a[17] ^ d2
|
||||||
|
bc3 = t<<15 | t>>(64-15)
|
||||||
|
t = a[3] ^ d3
|
||||||
|
bc4 = t<<56 | t>>(64-56)
|
||||||
|
t = a[14] ^ d4
|
||||||
|
bc0 = t<<27 | t>>(64-27)
|
||||||
|
a[20] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[6] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[17] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[3] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[14] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[10] ^ d0
|
||||||
|
bc3 = t<<41 | t>>(64-41)
|
||||||
|
t = a[21] ^ d1
|
||||||
|
bc4 = t<<2 | t>>(64-2)
|
||||||
|
t = a[7] ^ d2
|
||||||
|
bc0 = t<<62 | t>>(64-62)
|
||||||
|
t = a[18] ^ d3
|
||||||
|
bc1 = t<<55 | t>>(64-55)
|
||||||
|
t = a[4] ^ d4
|
||||||
|
bc2 = t<<39 | t>>(64-39)
|
||||||
|
a[10] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[21] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[7] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[18] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[4] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
// Round 4
|
||||||
|
bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
|
||||||
|
bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
|
||||||
|
bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
|
||||||
|
bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
|
||||||
|
bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
|
||||||
|
d0 = bc4 ^ (bc1<<1 | bc1>>63)
|
||||||
|
d1 = bc0 ^ (bc2<<1 | bc2>>63)
|
||||||
|
d2 = bc1 ^ (bc3<<1 | bc3>>63)
|
||||||
|
d3 = bc2 ^ (bc4<<1 | bc4>>63)
|
||||||
|
d4 = bc3 ^ (bc0<<1 | bc0>>63)
|
||||||
|
|
||||||
|
bc0 = a[0] ^ d0
|
||||||
|
t = a[1] ^ d1
|
||||||
|
bc1 = t<<44 | t>>(64-44)
|
||||||
|
t = a[2] ^ d2
|
||||||
|
bc2 = t<<43 | t>>(64-43)
|
||||||
|
t = a[3] ^ d3
|
||||||
|
bc3 = t<<21 | t>>(64-21)
|
||||||
|
t = a[4] ^ d4
|
||||||
|
bc4 = t<<14 | t>>(64-14)
|
||||||
|
a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3]
|
||||||
|
a[1] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[2] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[3] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[4] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[5] ^ d0
|
||||||
|
bc2 = t<<3 | t>>(64-3)
|
||||||
|
t = a[6] ^ d1
|
||||||
|
bc3 = t<<45 | t>>(64-45)
|
||||||
|
t = a[7] ^ d2
|
||||||
|
bc4 = t<<61 | t>>(64-61)
|
||||||
|
t = a[8] ^ d3
|
||||||
|
bc0 = t<<28 | t>>(64-28)
|
||||||
|
t = a[9] ^ d4
|
||||||
|
bc1 = t<<20 | t>>(64-20)
|
||||||
|
a[5] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[6] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[7] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[8] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[9] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[10] ^ d0
|
||||||
|
bc4 = t<<18 | t>>(64-18)
|
||||||
|
t = a[11] ^ d1
|
||||||
|
bc0 = t<<1 | t>>(64-1)
|
||||||
|
t = a[12] ^ d2
|
||||||
|
bc1 = t<<6 | t>>(64-6)
|
||||||
|
t = a[13] ^ d3
|
||||||
|
bc2 = t<<25 | t>>(64-25)
|
||||||
|
t = a[14] ^ d4
|
||||||
|
bc3 = t<<8 | t>>(64-8)
|
||||||
|
a[10] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[11] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[12] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[13] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[14] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[15] ^ d0
|
||||||
|
bc1 = t<<36 | t>>(64-36)
|
||||||
|
t = a[16] ^ d1
|
||||||
|
bc2 = t<<10 | t>>(64-10)
|
||||||
|
t = a[17] ^ d2
|
||||||
|
bc3 = t<<15 | t>>(64-15)
|
||||||
|
t = a[18] ^ d3
|
||||||
|
bc4 = t<<56 | t>>(64-56)
|
||||||
|
t = a[19] ^ d4
|
||||||
|
bc0 = t<<27 | t>>(64-27)
|
||||||
|
a[15] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[16] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[17] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[18] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[19] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
|
||||||
|
t = a[20] ^ d0
|
||||||
|
bc3 = t<<41 | t>>(64-41)
|
||||||
|
t = a[21] ^ d1
|
||||||
|
bc4 = t<<2 | t>>(64-2)
|
||||||
|
t = a[22] ^ d2
|
||||||
|
bc0 = t<<62 | t>>(64-62)
|
||||||
|
t = a[23] ^ d3
|
||||||
|
bc1 = t<<55 | t>>(64-55)
|
||||||
|
t = a[24] ^ d4
|
||||||
|
bc2 = t<<39 | t>>(64-39)
|
||||||
|
a[20] = bc0 ^ (bc2 &^ bc1)
|
||||||
|
a[21] = bc1 ^ (bc3 &^ bc2)
|
||||||
|
a[22] = bc2 ^ (bc4 &^ bc3)
|
||||||
|
a[23] = bc3 ^ (bc0 &^ bc4)
|
||||||
|
a[24] = bc4 ^ (bc1 &^ bc0)
|
||||||
|
}
|
||||||
|
}
|
||||||
13
vendor/golang.org/x/crypto/sha3/keccakf_amd64.go
generated
vendored
Normal file
13
vendor/golang.org/x/crypto/sha3/keccakf_amd64.go
generated
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build amd64,!appengine,!gccgo
|
||||||
|
|
||||||
|
package sha3
|
||||||
|
|
||||||
|
// This function is implemented in keccakf_amd64.s.
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
|
||||||
|
func keccakF1600(a *[25]uint64)
|
||||||
390
vendor/golang.org/x/crypto/sha3/keccakf_amd64.s
generated
vendored
Normal file
390
vendor/golang.org/x/crypto/sha3/keccakf_amd64.s
generated
vendored
Normal file
|
|
@ -0,0 +1,390 @@
|
||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build amd64,!appengine,!gccgo
|
||||||
|
|
||||||
|
// This code was translated into a form compatible with 6a from the public
|
||||||
|
// domain sources at https://github.com/gvanas/KeccakCodePackage
|
||||||
|
|
||||||
|
// Offsets in state
|
||||||
|
#define _ba (0*8)
|
||||||
|
#define _be (1*8)
|
||||||
|
#define _bi (2*8)
|
||||||
|
#define _bo (3*8)
|
||||||
|
#define _bu (4*8)
|
||||||
|
#define _ga (5*8)
|
||||||
|
#define _ge (6*8)
|
||||||
|
#define _gi (7*8)
|
||||||
|
#define _go (8*8)
|
||||||
|
#define _gu (9*8)
|
||||||
|
#define _ka (10*8)
|
||||||
|
#define _ke (11*8)
|
||||||
|
#define _ki (12*8)
|
||||||
|
#define _ko (13*8)
|
||||||
|
#define _ku (14*8)
|
||||||
|
#define _ma (15*8)
|
||||||
|
#define _me (16*8)
|
||||||
|
#define _mi (17*8)
|
||||||
|
#define _mo (18*8)
|
||||||
|
#define _mu (19*8)
|
||||||
|
#define _sa (20*8)
|
||||||
|
#define _se (21*8)
|
||||||
|
#define _si (22*8)
|
||||||
|
#define _so (23*8)
|
||||||
|
#define _su (24*8)
|
||||||
|
|
||||||
|
// Temporary registers
|
||||||
|
#define rT1 AX
|
||||||
|
|
||||||
|
// Round vars
|
||||||
|
#define rpState DI
|
||||||
|
#define rpStack SP
|
||||||
|
|
||||||
|
#define rDa BX
|
||||||
|
#define rDe CX
|
||||||
|
#define rDi DX
|
||||||
|
#define rDo R8
|
||||||
|
#define rDu R9
|
||||||
|
|
||||||
|
#define rBa R10
|
||||||
|
#define rBe R11
|
||||||
|
#define rBi R12
|
||||||
|
#define rBo R13
|
||||||
|
#define rBu R14
|
||||||
|
|
||||||
|
#define rCa SI
|
||||||
|
#define rCe BP
|
||||||
|
#define rCi rBi
|
||||||
|
#define rCo rBo
|
||||||
|
#define rCu R15
|
||||||
|
|
||||||
|
#define MOVQ_RBI_RCE MOVQ rBi, rCe
|
||||||
|
#define XORQ_RT1_RCA XORQ rT1, rCa
|
||||||
|
#define XORQ_RT1_RCE XORQ rT1, rCe
|
||||||
|
#define XORQ_RBA_RCU XORQ rBa, rCu
|
||||||
|
#define XORQ_RBE_RCU XORQ rBe, rCu
|
||||||
|
#define XORQ_RDU_RCU XORQ rDu, rCu
|
||||||
|
#define XORQ_RDA_RCA XORQ rDa, rCa
|
||||||
|
#define XORQ_RDE_RCE XORQ rDe, rCe
|
||||||
|
|
||||||
|
#define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \
|
||||||
|
/* Prepare round */ \
|
||||||
|
MOVQ rCe, rDa; \
|
||||||
|
ROLQ $1, rDa; \
|
||||||
|
\
|
||||||
|
MOVQ _bi(iState), rCi; \
|
||||||
|
XORQ _gi(iState), rDi; \
|
||||||
|
XORQ rCu, rDa; \
|
||||||
|
XORQ _ki(iState), rCi; \
|
||||||
|
XORQ _mi(iState), rDi; \
|
||||||
|
XORQ rDi, rCi; \
|
||||||
|
\
|
||||||
|
MOVQ rCi, rDe; \
|
||||||
|
ROLQ $1, rDe; \
|
||||||
|
\
|
||||||
|
MOVQ _bo(iState), rCo; \
|
||||||
|
XORQ _go(iState), rDo; \
|
||||||
|
XORQ rCa, rDe; \
|
||||||
|
XORQ _ko(iState), rCo; \
|
||||||
|
XORQ _mo(iState), rDo; \
|
||||||
|
XORQ rDo, rCo; \
|
||||||
|
\
|
||||||
|
MOVQ rCo, rDi; \
|
||||||
|
ROLQ $1, rDi; \
|
||||||
|
\
|
||||||
|
MOVQ rCu, rDo; \
|
||||||
|
XORQ rCe, rDi; \
|
||||||
|
ROLQ $1, rDo; \
|
||||||
|
\
|
||||||
|
MOVQ rCa, rDu; \
|
||||||
|
XORQ rCi, rDo; \
|
||||||
|
ROLQ $1, rDu; \
|
||||||
|
\
|
||||||
|
/* Result b */ \
|
||||||
|
MOVQ _ba(iState), rBa; \
|
||||||
|
MOVQ _ge(iState), rBe; \
|
||||||
|
XORQ rCo, rDu; \
|
||||||
|
MOVQ _ki(iState), rBi; \
|
||||||
|
MOVQ _mo(iState), rBo; \
|
||||||
|
MOVQ _su(iState), rBu; \
|
||||||
|
XORQ rDe, rBe; \
|
||||||
|
ROLQ $44, rBe; \
|
||||||
|
XORQ rDi, rBi; \
|
||||||
|
XORQ rDa, rBa; \
|
||||||
|
ROLQ $43, rBi; \
|
||||||
|
\
|
||||||
|
MOVQ rBe, rCa; \
|
||||||
|
MOVQ rc, rT1; \
|
||||||
|
ORQ rBi, rCa; \
|
||||||
|
XORQ rBa, rT1; \
|
||||||
|
XORQ rT1, rCa; \
|
||||||
|
MOVQ rCa, _ba(oState); \
|
||||||
|
\
|
||||||
|
XORQ rDu, rBu; \
|
||||||
|
ROLQ $14, rBu; \
|
||||||
|
MOVQ rBa, rCu; \
|
||||||
|
ANDQ rBe, rCu; \
|
||||||
|
XORQ rBu, rCu; \
|
||||||
|
MOVQ rCu, _bu(oState); \
|
||||||
|
\
|
||||||
|
XORQ rDo, rBo; \
|
||||||
|
ROLQ $21, rBo; \
|
||||||
|
MOVQ rBo, rT1; \
|
||||||
|
ANDQ rBu, rT1; \
|
||||||
|
XORQ rBi, rT1; \
|
||||||
|
MOVQ rT1, _bi(oState); \
|
||||||
|
\
|
||||||
|
NOTQ rBi; \
|
||||||
|
ORQ rBa, rBu; \
|
||||||
|
ORQ rBo, rBi; \
|
||||||
|
XORQ rBo, rBu; \
|
||||||
|
XORQ rBe, rBi; \
|
||||||
|
MOVQ rBu, _bo(oState); \
|
||||||
|
MOVQ rBi, _be(oState); \
|
||||||
|
B_RBI_RCE; \
|
||||||
|
\
|
||||||
|
/* Result g */ \
|
||||||
|
MOVQ _gu(iState), rBe; \
|
||||||
|
XORQ rDu, rBe; \
|
||||||
|
MOVQ _ka(iState), rBi; \
|
||||||
|
ROLQ $20, rBe; \
|
||||||
|
XORQ rDa, rBi; \
|
||||||
|
ROLQ $3, rBi; \
|
||||||
|
MOVQ _bo(iState), rBa; \
|
||||||
|
MOVQ rBe, rT1; \
|
||||||
|
ORQ rBi, rT1; \
|
||||||
|
XORQ rDo, rBa; \
|
||||||
|
MOVQ _me(iState), rBo; \
|
||||||
|
MOVQ _si(iState), rBu; \
|
||||||
|
ROLQ $28, rBa; \
|
||||||
|
XORQ rBa, rT1; \
|
||||||
|
MOVQ rT1, _ga(oState); \
|
||||||
|
G_RT1_RCA; \
|
||||||
|
\
|
||||||
|
XORQ rDe, rBo; \
|
||||||
|
ROLQ $45, rBo; \
|
||||||
|
MOVQ rBi, rT1; \
|
||||||
|
ANDQ rBo, rT1; \
|
||||||
|
XORQ rBe, rT1; \
|
||||||
|
MOVQ rT1, _ge(oState); \
|
||||||
|
G_RT1_RCE; \
|
||||||
|
\
|
||||||
|
XORQ rDi, rBu; \
|
||||||
|
ROLQ $61, rBu; \
|
||||||
|
MOVQ rBu, rT1; \
|
||||||
|
ORQ rBa, rT1; \
|
||||||
|
XORQ rBo, rT1; \
|
||||||
|
MOVQ rT1, _go(oState); \
|
||||||
|
\
|
||||||
|
ANDQ rBe, rBa; \
|
||||||
|
XORQ rBu, rBa; \
|
||||||
|
MOVQ rBa, _gu(oState); \
|
||||||
|
NOTQ rBu; \
|
||||||
|
G_RBA_RCU; \
|
||||||
|
\
|
||||||
|
ORQ rBu, rBo; \
|
||||||
|
XORQ rBi, rBo; \
|
||||||
|
MOVQ rBo, _gi(oState); \
|
||||||
|
\
|
||||||
|
/* Result k */ \
|
||||||
|
MOVQ _be(iState), rBa; \
|
||||||
|
MOVQ _gi(iState), rBe; \
|
||||||
|
MOVQ _ko(iState), rBi; \
|
||||||
|
MOVQ _mu(iState), rBo; \
|
||||||
|
MOVQ _sa(iState), rBu; \
|
||||||
|
XORQ rDi, rBe; \
|
||||||
|
ROLQ $6, rBe; \
|
||||||
|
XORQ rDo, rBi; \
|
||||||
|
ROLQ $25, rBi; \
|
||||||
|
MOVQ rBe, rT1; \
|
||||||
|
ORQ rBi, rT1; \
|
||||||
|
XORQ rDe, rBa; \
|
||||||
|
ROLQ $1, rBa; \
|
||||||
|
XORQ rBa, rT1; \
|
||||||
|
MOVQ rT1, _ka(oState); \
|
||||||
|
K_RT1_RCA; \
|
||||||
|
\
|
||||||
|
XORQ rDu, rBo; \
|
||||||
|
ROLQ $8, rBo; \
|
||||||
|
MOVQ rBi, rT1; \
|
||||||
|
ANDQ rBo, rT1; \
|
||||||
|
XORQ rBe, rT1; \
|
||||||
|
MOVQ rT1, _ke(oState); \
|
||||||
|
K_RT1_RCE; \
|
||||||
|
\
|
||||||
|
XORQ rDa, rBu; \
|
||||||
|
ROLQ $18, rBu; \
|
||||||
|
NOTQ rBo; \
|
||||||
|
MOVQ rBo, rT1; \
|
||||||
|
ANDQ rBu, rT1; \
|
||||||
|
XORQ rBi, rT1; \
|
||||||
|
MOVQ rT1, _ki(oState); \
|
||||||
|
\
|
||||||
|
MOVQ rBu, rT1; \
|
||||||
|
ORQ rBa, rT1; \
|
||||||
|
XORQ rBo, rT1; \
|
||||||
|
MOVQ rT1, _ko(oState); \
|
||||||
|
\
|
||||||
|
ANDQ rBe, rBa; \
|
||||||
|
XORQ rBu, rBa; \
|
||||||
|
MOVQ rBa, _ku(oState); \
|
||||||
|
K_RBA_RCU; \
|
||||||
|
\
|
||||||
|
/* Result m */ \
|
||||||
|
MOVQ _ga(iState), rBe; \
|
||||||
|
XORQ rDa, rBe; \
|
||||||
|
MOVQ _ke(iState), rBi; \
|
||||||
|
ROLQ $36, rBe; \
|
||||||
|
XORQ rDe, rBi; \
|
||||||
|
MOVQ _bu(iState), rBa; \
|
||||||
|
ROLQ $10, rBi; \
|
||||||
|
MOVQ rBe, rT1; \
|
||||||
|
MOVQ _mi(iState), rBo; \
|
||||||
|
ANDQ rBi, rT1; \
|
||||||
|
XORQ rDu, rBa; \
|
||||||
|
MOVQ _so(iState), rBu; \
|
||||||
|
ROLQ $27, rBa; \
|
||||||
|
XORQ rBa, rT1; \
|
||||||
|
MOVQ rT1, _ma(oState); \
|
||||||
|
M_RT1_RCA; \
|
||||||
|
\
|
||||||
|
XORQ rDi, rBo; \
|
||||||
|
ROLQ $15, rBo; \
|
||||||
|
MOVQ rBi, rT1; \
|
||||||
|
ORQ rBo, rT1; \
|
||||||
|
XORQ rBe, rT1; \
|
||||||
|
MOVQ rT1, _me(oState); \
|
||||||
|
M_RT1_RCE; \
|
||||||
|
\
|
||||||
|
XORQ rDo, rBu; \
|
||||||
|
ROLQ $56, rBu; \
|
||||||
|
NOTQ rBo; \
|
||||||
|
MOVQ rBo, rT1; \
|
||||||
|
ORQ rBu, rT1; \
|
||||||
|
XORQ rBi, rT1; \
|
||||||
|
MOVQ rT1, _mi(oState); \
|
||||||
|
\
|
||||||
|
ORQ rBa, rBe; \
|
||||||
|
XORQ rBu, rBe; \
|
||||||
|
MOVQ rBe, _mu(oState); \
|
||||||
|
\
|
||||||
|
ANDQ rBa, rBu; \
|
||||||
|
XORQ rBo, rBu; \
|
||||||
|
MOVQ rBu, _mo(oState); \
|
||||||
|
M_RBE_RCU; \
|
||||||
|
\
|
||||||
|
/* Result s */ \
|
||||||
|
MOVQ _bi(iState), rBa; \
|
||||||
|
MOVQ _go(iState), rBe; \
|
||||||
|
MOVQ _ku(iState), rBi; \
|
||||||
|
XORQ rDi, rBa; \
|
||||||
|
MOVQ _ma(iState), rBo; \
|
||||||
|
ROLQ $62, rBa; \
|
||||||
|
XORQ rDo, rBe; \
|
||||||
|
MOVQ _se(iState), rBu; \
|
||||||
|
ROLQ $55, rBe; \
|
||||||
|
\
|
||||||
|
XORQ rDu, rBi; \
|
||||||
|
MOVQ rBa, rDu; \
|
||||||
|
XORQ rDe, rBu; \
|
||||||
|
ROLQ $2, rBu; \
|
||||||
|
ANDQ rBe, rDu; \
|
||||||
|
XORQ rBu, rDu; \
|
||||||
|
MOVQ rDu, _su(oState); \
|
||||||
|
\
|
||||||
|
ROLQ $39, rBi; \
|
||||||
|
S_RDU_RCU; \
|
||||||
|
NOTQ rBe; \
|
||||||
|
XORQ rDa, rBo; \
|
||||||
|
MOVQ rBe, rDa; \
|
||||||
|
ANDQ rBi, rDa; \
|
||||||
|
XORQ rBa, rDa; \
|
||||||
|
MOVQ rDa, _sa(oState); \
|
||||||
|
S_RDA_RCA; \
|
||||||
|
\
|
||||||
|
ROLQ $41, rBo; \
|
||||||
|
MOVQ rBi, rDe; \
|
||||||
|
ORQ rBo, rDe; \
|
||||||
|
XORQ rBe, rDe; \
|
||||||
|
MOVQ rDe, _se(oState); \
|
||||||
|
S_RDE_RCE; \
|
||||||
|
\
|
||||||
|
MOVQ rBo, rDi; \
|
||||||
|
MOVQ rBu, rDo; \
|
||||||
|
ANDQ rBu, rDi; \
|
||||||
|
ORQ rBa, rDo; \
|
||||||
|
XORQ rBi, rDi; \
|
||||||
|
XORQ rBo, rDo; \
|
||||||
|
MOVQ rDi, _si(oState); \
|
||||||
|
MOVQ rDo, _so(oState) \
|
||||||
|
|
||||||
|
// func keccakF1600(state *[25]uint64)
|
||||||
|
TEXT ·keccakF1600(SB), 0, $200-8
|
||||||
|
MOVQ state+0(FP), rpState
|
||||||
|
|
||||||
|
// Convert the user state into an internal state
|
||||||
|
NOTQ _be(rpState)
|
||||||
|
NOTQ _bi(rpState)
|
||||||
|
NOTQ _go(rpState)
|
||||||
|
NOTQ _ki(rpState)
|
||||||
|
NOTQ _mi(rpState)
|
||||||
|
NOTQ _sa(rpState)
|
||||||
|
|
||||||
|
// Execute the KeccakF permutation
|
||||||
|
MOVQ _ba(rpState), rCa
|
||||||
|
MOVQ _be(rpState), rCe
|
||||||
|
MOVQ _bu(rpState), rCu
|
||||||
|
|
||||||
|
XORQ _ga(rpState), rCa
|
||||||
|
XORQ _ge(rpState), rCe
|
||||||
|
XORQ _gu(rpState), rCu
|
||||||
|
|
||||||
|
XORQ _ka(rpState), rCa
|
||||||
|
XORQ _ke(rpState), rCe
|
||||||
|
XORQ _ku(rpState), rCu
|
||||||
|
|
||||||
|
XORQ _ma(rpState), rCa
|
||||||
|
XORQ _me(rpState), rCe
|
||||||
|
XORQ _mu(rpState), rCu
|
||||||
|
|
||||||
|
XORQ _sa(rpState), rCa
|
||||||
|
XORQ _se(rpState), rCe
|
||||||
|
MOVQ _si(rpState), rDi
|
||||||
|
MOVQ _so(rpState), rDo
|
||||||
|
XORQ _su(rpState), rCu
|
||||||
|
|
||||||
|
mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
|
||||||
|
mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP)
|
||||||
|
|
||||||
|
// Revert the internal state to the user state
|
||||||
|
NOTQ _be(rpState)
|
||||||
|
NOTQ _bi(rpState)
|
||||||
|
NOTQ _go(rpState)
|
||||||
|
NOTQ _ki(rpState)
|
||||||
|
NOTQ _mi(rpState)
|
||||||
|
NOTQ _sa(rpState)
|
||||||
|
|
||||||
|
RET
|
||||||
18
vendor/golang.org/x/crypto/sha3/register.go
generated
vendored
Normal file
18
vendor/golang.org/x/crypto/sha3/register.go
generated
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// +build go1.4
|
||||||
|
|
||||||
|
package sha3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
crypto.RegisterHash(crypto.SHA3_224, New224)
|
||||||
|
crypto.RegisterHash(crypto.SHA3_256, New256)
|
||||||
|
crypto.RegisterHash(crypto.SHA3_384, New384)
|
||||||
|
crypto.RegisterHash(crypto.SHA3_512, New512)
|
||||||
|
}
|
||||||
193
vendor/golang.org/x/crypto/sha3/sha3.go
generated
vendored
Normal file
193
vendor/golang.org/x/crypto/sha3/sha3.go
generated
vendored
Normal file
|
|
@ -0,0 +1,193 @@
|
||||||
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package sha3
|
||||||
|
|
||||||
|
// spongeDirection indicates the direction bytes are flowing through the sponge.
|
||||||
|
type spongeDirection int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// spongeAbsorbing indicates that the sponge is absorbing input.
|
||||||
|
spongeAbsorbing spongeDirection = iota
|
||||||
|
// spongeSqueezing indicates that the sponge is being squeezed.
|
||||||
|
spongeSqueezing
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// maxRate is the maximum size of the internal buffer. SHAKE-256
|
||||||
|
// currently needs the largest buffer.
|
||||||
|
maxRate = 168
|
||||||
|
)
|
||||||
|
|
||||||
|
type state struct {
|
||||||
|
// Generic sponge components.
|
||||||
|
a [25]uint64 // main state of the hash
|
||||||
|
buf []byte // points into storage
|
||||||
|
rate int // the number of bytes of state to use
|
||||||
|
|
||||||
|
// dsbyte contains the "domain separation" bits and the first bit of
|
||||||
|
// the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the
|
||||||
|
// SHA-3 and SHAKE functions by appending bitstrings to the message.
|
||||||
|
// Using a little-endian bit-ordering convention, these are "01" for SHA-3
|
||||||
|
// and "1111" for SHAKE, or 00000010b and 00001111b, respectively. Then the
|
||||||
|
// padding rule from section 5.1 is applied to pad the message to a multiple
|
||||||
|
// of the rate, which involves adding a "1" bit, zero or more "0" bits, and
|
||||||
|
// a final "1" bit. We merge the first "1" bit from the padding into dsbyte,
|
||||||
|
// giving 00000110b (0x06) and 00011111b (0x1f).
|
||||||
|
// [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf
|
||||||
|
// "Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and
|
||||||
|
// Extendable-Output Functions (May 2014)"
|
||||||
|
dsbyte byte
|
||||||
|
storage [maxRate]byte
|
||||||
|
|
||||||
|
// Specific to SHA-3 and SHAKE.
|
||||||
|
fixedOutput bool // whether this is a fixed-output-length instance
|
||||||
|
outputLen int // the default output size in bytes
|
||||||
|
state spongeDirection // whether the sponge is absorbing or squeezing
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlockSize returns the rate of sponge underlying this hash function.
|
||||||
|
func (d *state) BlockSize() int { return d.rate }
|
||||||
|
|
||||||
|
// Size returns the output size of the hash function in bytes.
|
||||||
|
func (d *state) Size() int { return d.outputLen }
|
||||||
|
|
||||||
|
// Reset clears the internal state by zeroing the sponge state and
|
||||||
|
// the byte buffer, and setting Sponge.state to absorbing.
|
||||||
|
func (d *state) Reset() {
|
||||||
|
// Zero the permutation's state.
|
||||||
|
for i := range d.a {
|
||||||
|
d.a[i] = 0
|
||||||
|
}
|
||||||
|
d.state = spongeAbsorbing
|
||||||
|
d.buf = d.storage[:0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *state) clone() *state {
|
||||||
|
ret := *d
|
||||||
|
if ret.state == spongeAbsorbing {
|
||||||
|
ret.buf = ret.storage[:len(ret.buf)]
|
||||||
|
} else {
|
||||||
|
ret.buf = ret.storage[d.rate-cap(d.buf) : d.rate]
|
||||||
|
}
|
||||||
|
|
||||||
|
return &ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// permute applies the KeccakF-1600 permutation. It handles
|
||||||
|
// any input-output buffering.
|
||||||
|
func (d *state) permute() {
|
||||||
|
switch d.state {
|
||||||
|
case spongeAbsorbing:
|
||||||
|
// If we're absorbing, we need to xor the input into the state
|
||||||
|
// before applying the permutation.
|
||||||
|
xorIn(d, d.buf)
|
||||||
|
d.buf = d.storage[:0]
|
||||||
|
keccakF1600(&d.a)
|
||||||
|
case spongeSqueezing:
|
||||||
|
// If we're squeezing, we need to apply the permutatin before
|
||||||
|
// copying more output.
|
||||||
|
keccakF1600(&d.a)
|
||||||
|
d.buf = d.storage[:d.rate]
|
||||||
|
copyOut(d, d.buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// pads appends the domain separation bits in dsbyte, applies
|
||||||
|
// the multi-bitrate 10..1 padding rule, and permutes the state.
|
||||||
|
func (d *state) padAndPermute(dsbyte byte) {
|
||||||
|
if d.buf == nil {
|
||||||
|
d.buf = d.storage[:0]
|
||||||
|
}
|
||||||
|
// Pad with this instance's domain-separator bits. We know that there's
|
||||||
|
// at least one byte of space in d.buf because, if it were full,
|
||||||
|
// permute would have been called to empty it. dsbyte also contains the
|
||||||
|
// first one bit for the padding. See the comment in the state struct.
|
||||||
|
d.buf = append(d.buf, dsbyte)
|
||||||
|
zerosStart := len(d.buf)
|
||||||
|
d.buf = d.storage[:d.rate]
|
||||||
|
for i := zerosStart; i < d.rate; i++ {
|
||||||
|
d.buf[i] = 0
|
||||||
|
}
|
||||||
|
// This adds the final one bit for the padding. Because of the way that
|
||||||
|
// bits are numbered from the LSB upwards, the final bit is the MSB of
|
||||||
|
// the last byte.
|
||||||
|
d.buf[d.rate-1] ^= 0x80
|
||||||
|
// Apply the permutation
|
||||||
|
d.permute()
|
||||||
|
d.state = spongeSqueezing
|
||||||
|
d.buf = d.storage[:d.rate]
|
||||||
|
copyOut(d, d.buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write absorbs more data into the hash's state. It produces an error
|
||||||
|
// if more data is written to the ShakeHash after writing
|
||||||
|
func (d *state) Write(p []byte) (written int, err error) {
|
||||||
|
if d.state != spongeAbsorbing {
|
||||||
|
panic("sha3: write to sponge after read")
|
||||||
|
}
|
||||||
|
if d.buf == nil {
|
||||||
|
d.buf = d.storage[:0]
|
||||||
|
}
|
||||||
|
written = len(p)
|
||||||
|
|
||||||
|
for len(p) > 0 {
|
||||||
|
if len(d.buf) == 0 && len(p) >= d.rate {
|
||||||
|
// The fast path; absorb a full "rate" bytes of input and apply the permutation.
|
||||||
|
xorIn(d, p[:d.rate])
|
||||||
|
p = p[d.rate:]
|
||||||
|
keccakF1600(&d.a)
|
||||||
|
} else {
|
||||||
|
// The slow path; buffer the input until we can fill the sponge, and then xor it in.
|
||||||
|
todo := d.rate - len(d.buf)
|
||||||
|
if todo > len(p) {
|
||||||
|
todo = len(p)
|
||||||
|
}
|
||||||
|
d.buf = append(d.buf, p[:todo]...)
|
||||||
|
p = p[todo:]
|
||||||
|
|
||||||
|
// If the sponge is full, apply the permutation.
|
||||||
|
if len(d.buf) == d.rate {
|
||||||
|
d.permute()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read squeezes an arbitrary number of bytes from the sponge.
|
||||||
|
func (d *state) Read(out []byte) (n int, err error) {
|
||||||
|
// If we're still absorbing, pad and apply the permutation.
|
||||||
|
if d.state == spongeAbsorbing {
|
||||||
|
d.padAndPermute(d.dsbyte)
|
||||||
|
}
|
||||||
|
|
||||||
|
n = len(out)
|
||||||
|
|
||||||
|
// Now, do the squeezing.
|
||||||
|
for len(out) > 0 {
|
||||||
|
n := copy(out, d.buf)
|
||||||
|
d.buf = d.buf[n:]
|
||||||
|
out = out[n:]
|
||||||
|
|
||||||
|
// Apply the permutation if we've squeezed the sponge dry.
|
||||||
|
if len(d.buf) == 0 {
|
||||||
|
d.permute()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum applies padding to the hash state and then squeezes out the desired
|
||||||
|
// number of output bytes.
|
||||||
|
func (d *state) Sum(in []byte) []byte {
|
||||||
|
// Make a copy of the original hash so that caller can keep writing
|
||||||
|
// and summing.
|
||||||
|
dup := d.clone()
|
||||||
|
hash := make([]byte, dup.outputLen)
|
||||||
|
dup.Read(hash)
|
||||||
|
return append(in, hash...)
|
||||||
|
}
|
||||||
60
vendor/golang.org/x/crypto/sha3/shake.go
generated
vendored
Normal file
60
vendor/golang.org/x/crypto/sha3/shake.go
generated
vendored
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package sha3
|
||||||
|
|
||||||
|
// This file defines the ShakeHash interface, and provides
|
||||||
|
// functions for creating SHAKE instances, as well as utility
|
||||||
|
// functions for hashing bytes to arbitrary-length output.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ShakeHash defines the interface to hash functions that
|
||||||
|
// support arbitrary-length output.
|
||||||
|
type ShakeHash interface {
|
||||||
|
// Write absorbs more data into the hash's state. It panics if input is
|
||||||
|
// written to it after output has been read from it.
|
||||||
|
io.Writer
|
||||||
|
|
||||||
|
// Read reads more output from the hash; reading affects the hash's
|
||||||
|
// state. (ShakeHash.Read is thus very different from Hash.Sum)
|
||||||
|
// It never returns an error.
|
||||||
|
io.Reader
|
||||||
|
|
||||||
|
// Clone returns a copy of the ShakeHash in its current state.
|
||||||
|
Clone() ShakeHash
|
||||||
|
|
||||||
|
// Reset resets the ShakeHash to its initial state.
|
||||||
|
Reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *state) Clone() ShakeHash {
|
||||||
|
return d.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewShake128 creates a new SHAKE128 variable-output-length ShakeHash.
|
||||||
|
// Its generic security strength is 128 bits against all attacks if at
|
||||||
|
// least 32 bytes of its output are used.
|
||||||
|
func NewShake128() ShakeHash { return &state{rate: 168, dsbyte: 0x1f} }
|
||||||
|
|
||||||
|
// NewShake256 creates a new SHAKE128 variable-output-length ShakeHash.
|
||||||
|
// Its generic security strength is 256 bits against all attacks if
|
||||||
|
// at least 64 bytes of its output are used.
|
||||||
|
func NewShake256() ShakeHash { return &state{rate: 136, dsbyte: 0x1f} }
|
||||||
|
|
||||||
|
// ShakeSum128 writes an arbitrary-length digest of data into hash.
|
||||||
|
func ShakeSum128(hash, data []byte) {
|
||||||
|
h := NewShake128()
|
||||||
|
h.Write(data)
|
||||||
|
h.Read(hash)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShakeSum256 writes an arbitrary-length digest of data into hash.
|
||||||
|
func ShakeSum256(hash, data []byte) {
|
||||||
|
h := NewShake256()
|
||||||
|
h.Write(data)
|
||||||
|
h.Read(hash)
|
||||||
|
}
|
||||||
16
vendor/golang.org/x/crypto/sha3/xor.go
generated
vendored
Normal file
16
vendor/golang.org/x/crypto/sha3/xor.go
generated
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build !amd64,!386,!ppc64le appengine
|
||||||
|
|
||||||
|
package sha3
|
||||||
|
|
||||||
|
var (
|
||||||
|
xorIn = xorInGeneric
|
||||||
|
copyOut = copyOutGeneric
|
||||||
|
xorInUnaligned = xorInGeneric
|
||||||
|
copyOutUnaligned = copyOutGeneric
|
||||||
|
)
|
||||||
|
|
||||||
|
const xorImplementationUnaligned = "generic"
|
||||||
28
vendor/golang.org/x/crypto/sha3/xor_generic.go
generated
vendored
Normal file
28
vendor/golang.org/x/crypto/sha3/xor_generic.go
generated
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package sha3
|
||||||
|
|
||||||
|
import "encoding/binary"
|
||||||
|
|
||||||
|
// xorInGeneric xors the bytes in buf into the state; it
|
||||||
|
// makes no non-portable assumptions about memory layout
|
||||||
|
// or alignment.
|
||||||
|
func xorInGeneric(d *state, buf []byte) {
|
||||||
|
n := len(buf) / 8
|
||||||
|
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
a := binary.LittleEndian.Uint64(buf)
|
||||||
|
d.a[i] ^= a
|
||||||
|
buf = buf[8:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// copyOutGeneric copies ulint64s to a byte buffer.
|
||||||
|
func copyOutGeneric(d *state, b []byte) {
|
||||||
|
for i := 0; len(b) >= 8; i++ {
|
||||||
|
binary.LittleEndian.PutUint64(b, d.a[i])
|
||||||
|
b = b[8:]
|
||||||
|
}
|
||||||
|
}
|
||||||
58
vendor/golang.org/x/crypto/sha3/xor_unaligned.go
generated
vendored
Normal file
58
vendor/golang.org/x/crypto/sha3/xor_unaligned.go
generated
vendored
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build amd64 386 ppc64le
|
||||||
|
// +build !appengine
|
||||||
|
|
||||||
|
package sha3
|
||||||
|
|
||||||
|
import "unsafe"
|
||||||
|
|
||||||
|
func xorInUnaligned(d *state, buf []byte) {
|
||||||
|
bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))
|
||||||
|
n := len(buf)
|
||||||
|
if n >= 72 {
|
||||||
|
d.a[0] ^= bw[0]
|
||||||
|
d.a[1] ^= bw[1]
|
||||||
|
d.a[2] ^= bw[2]
|
||||||
|
d.a[3] ^= bw[3]
|
||||||
|
d.a[4] ^= bw[4]
|
||||||
|
d.a[5] ^= bw[5]
|
||||||
|
d.a[6] ^= bw[6]
|
||||||
|
d.a[7] ^= bw[7]
|
||||||
|
d.a[8] ^= bw[8]
|
||||||
|
}
|
||||||
|
if n >= 104 {
|
||||||
|
d.a[9] ^= bw[9]
|
||||||
|
d.a[10] ^= bw[10]
|
||||||
|
d.a[11] ^= bw[11]
|
||||||
|
d.a[12] ^= bw[12]
|
||||||
|
}
|
||||||
|
if n >= 136 {
|
||||||
|
d.a[13] ^= bw[13]
|
||||||
|
d.a[14] ^= bw[14]
|
||||||
|
d.a[15] ^= bw[15]
|
||||||
|
d.a[16] ^= bw[16]
|
||||||
|
}
|
||||||
|
if n >= 144 {
|
||||||
|
d.a[17] ^= bw[17]
|
||||||
|
}
|
||||||
|
if n >= 168 {
|
||||||
|
d.a[18] ^= bw[18]
|
||||||
|
d.a[19] ^= bw[19]
|
||||||
|
d.a[20] ^= bw[20]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyOutUnaligned(d *state, buf []byte) {
|
||||||
|
ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0]))
|
||||||
|
copy(buf, ab[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
xorIn = xorInUnaligned
|
||||||
|
copyOut = copyOutUnaligned
|
||||||
|
)
|
||||||
|
|
||||||
|
const xorImplementationUnaligned = "unaligned"
|
||||||
22
vendor/leb.io/hashland/LICENSE
generated
vendored
Normal file
22
vendor/leb.io/hashland/LICENSE
generated
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Lawrence E. Bakst
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
224
vendor/leb.io/hashland/keccakpg/keccak.go
generated
vendored
Normal file
224
vendor/leb.io/hashland/keccakpg/keccak.go
generated
vendored
Normal file
|
|
@ -0,0 +1,224 @@
|
||||||
|
// Package keccak implements the Keccak (SHA-3) hash algorithm.
|
||||||
|
// http://keccak.noekeon.org.
|
||||||
|
package keccakpg
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "fmt"
|
||||||
|
"hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
const stdRounds = 24
|
||||||
|
|
||||||
|
var roundConstants = []uint64{
|
||||||
|
0x0000000000000001, 0x0000000000008082,
|
||||||
|
0x800000000000808A, 0x8000000080008000,
|
||||||
|
0x000000000000808B, 0x0000000080000001,
|
||||||
|
0x8000000080008081, 0x8000000000008009,
|
||||||
|
0x000000000000008A, 0x0000000000000088,
|
||||||
|
0x0000000080008009, 0x000000008000000A,
|
||||||
|
0x000000008000808B, 0x800000000000008B,
|
||||||
|
0x8000000000008089, 0x8000000000008003,
|
||||||
|
0x8000000000008002, 0x8000000000000080,
|
||||||
|
0x000000000000800A, 0x800000008000000A,
|
||||||
|
0x8000000080008081, 0x8000000000008080,
|
||||||
|
0x0000000080000001, 0x8000000080008008,
|
||||||
|
}
|
||||||
|
|
||||||
|
var rotationConstants = [24]uint{
|
||||||
|
1, 3, 6, 10, 15, 21, 28, 36,
|
||||||
|
45, 55, 2, 14, 27, 41, 56, 8,
|
||||||
|
25, 43, 62, 18, 39, 61, 20, 44,
|
||||||
|
}
|
||||||
|
|
||||||
|
var piLane = [24]uint{
|
||||||
|
10, 7, 11, 17, 18, 3, 5, 16,
|
||||||
|
8, 21, 24, 4, 15, 23, 19, 13,
|
||||||
|
12, 2, 20, 14, 22, 9, 6, 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
type keccak struct {
|
||||||
|
S [25]uint64
|
||||||
|
size int
|
||||||
|
blockSize int
|
||||||
|
rounds int
|
||||||
|
buf []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func newKeccak(bitlen, rounds int) hash.Hash {
|
||||||
|
var h keccak
|
||||||
|
h.size = bitlen / 8
|
||||||
|
h.blockSize = (200 - 2*h.size)
|
||||||
|
h.rounds = rounds
|
||||||
|
if rounds != stdRounds {
|
||||||
|
//fmt.Printf("keccak: warning non standard number of rounds %d vs %d\n", rounds, stdRounds)
|
||||||
|
}
|
||||||
|
return &h
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCustom(bits, rounds int) hash.Hash {
|
||||||
|
return newKeccak(bits, rounds)
|
||||||
|
}
|
||||||
|
|
||||||
|
func New160() hash.Hash {
|
||||||
|
return newKeccak(160, stdRounds)
|
||||||
|
}
|
||||||
|
|
||||||
|
func New224() hash.Hash {
|
||||||
|
return newKeccak(224, stdRounds)
|
||||||
|
}
|
||||||
|
|
||||||
|
func New256() hash.Hash {
|
||||||
|
return newKeccak(256, stdRounds)
|
||||||
|
}
|
||||||
|
|
||||||
|
func New384() hash.Hash {
|
||||||
|
return newKeccak(384, stdRounds)
|
||||||
|
}
|
||||||
|
|
||||||
|
func New512() hash.Hash {
|
||||||
|
return newKeccak(512, stdRounds)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *keccak) Write(b []byte) (int, error) {
|
||||||
|
n := len(b)
|
||||||
|
|
||||||
|
if len(k.buf) > 0 {
|
||||||
|
x := k.blockSize - len(k.buf)
|
||||||
|
if x > len(b) {
|
||||||
|
x = len(b)
|
||||||
|
}
|
||||||
|
k.buf = append(k.buf, b[:x]...)
|
||||||
|
b = b[x:]
|
||||||
|
|
||||||
|
if len(k.buf) < k.blockSize {
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
k.f(k.buf)
|
||||||
|
k.buf = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for len(b) >= k.blockSize {
|
||||||
|
k.f(b[:k.blockSize])
|
||||||
|
b = b[k.blockSize:]
|
||||||
|
}
|
||||||
|
|
||||||
|
k.buf = b
|
||||||
|
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k0 *keccak) Sum(b []byte) []byte {
|
||||||
|
|
||||||
|
k := *k0
|
||||||
|
|
||||||
|
last := k.pad(k.buf)
|
||||||
|
k.f(last)
|
||||||
|
|
||||||
|
buf := make([]byte, len(k.S)*8)
|
||||||
|
for i := range k.S {
|
||||||
|
putUint64le(buf[i*8:], k.S[i])
|
||||||
|
}
|
||||||
|
return append(b, buf[:k.size]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *keccak) Reset() {
|
||||||
|
for i := range k.S {
|
||||||
|
k.S[i] = 0
|
||||||
|
}
|
||||||
|
k.buf = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *keccak) Size() int {
|
||||||
|
return k.size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *keccak) BlockSize() int {
|
||||||
|
return k.blockSize
|
||||||
|
}
|
||||||
|
|
||||||
|
func rotl64(x uint64, n uint) uint64 {
|
||||||
|
return (x << n) | (x >> (64 - n))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *keccak) f(block []byte) {
|
||||||
|
|
||||||
|
if len(block) != k.blockSize {
|
||||||
|
panic("f() called with invalid block size")
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < k.blockSize/8; i++ {
|
||||||
|
k.S[i] ^= uint64le(block[i*8:])
|
||||||
|
}
|
||||||
|
|
||||||
|
for r := 0; r < k.rounds; r++ {
|
||||||
|
var bc [5]uint64
|
||||||
|
|
||||||
|
// theta
|
||||||
|
for i := range bc {
|
||||||
|
bc[i] = k.S[i] ^ k.S[5+i] ^ k.S[10+i] ^ k.S[15+i] ^ k.S[20+i]
|
||||||
|
}
|
||||||
|
for i := range bc {
|
||||||
|
t := bc[(i+4)%5] ^ rotl64(bc[(i+1)%5], 1)
|
||||||
|
for j := 0; j < len(k.S); j += 5 {
|
||||||
|
k.S[i+j] ^= t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// rho phi
|
||||||
|
temp := k.S[1]
|
||||||
|
for i := range piLane {
|
||||||
|
j := piLane[i]
|
||||||
|
temp2 := k.S[j]
|
||||||
|
k.S[j] = rotl64(temp, rotationConstants[i])
|
||||||
|
temp = temp2
|
||||||
|
}
|
||||||
|
|
||||||
|
// chi
|
||||||
|
for j := 0; j < len(k.S); j += 5 {
|
||||||
|
for i := range bc {
|
||||||
|
bc[i] = k.S[j+i]
|
||||||
|
}
|
||||||
|
for i := range bc {
|
||||||
|
k.S[j+i] ^= (^bc[(i+1)%5]) & bc[(i+2)%5]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// iota
|
||||||
|
k.S[0] ^= roundConstants[r]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *keccak) pad(block []byte) []byte {
|
||||||
|
|
||||||
|
padded := make([]byte, k.blockSize)
|
||||||
|
|
||||||
|
copy(padded, k.buf)
|
||||||
|
padded[len(k.buf)] = 0x01
|
||||||
|
padded[len(padded)-1] |= 0x80
|
||||||
|
|
||||||
|
return padded
|
||||||
|
}
|
||||||
|
|
||||||
|
func uint64le(v []byte) uint64 {
|
||||||
|
return uint64(v[0]) |
|
||||||
|
uint64(v[1])<<8 |
|
||||||
|
uint64(v[2])<<16 |
|
||||||
|
uint64(v[3])<<24 |
|
||||||
|
uint64(v[4])<<32 |
|
||||||
|
uint64(v[5])<<40 |
|
||||||
|
uint64(v[6])<<48 |
|
||||||
|
uint64(v[7])<<56
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func putUint64le(v []byte, x uint64) {
|
||||||
|
v[0] = byte(x)
|
||||||
|
v[1] = byte(x >> 8)
|
||||||
|
v[2] = byte(x >> 16)
|
||||||
|
v[3] = byte(x >> 24)
|
||||||
|
v[4] = byte(x >> 32)
|
||||||
|
v[5] = byte(x >> 40)
|
||||||
|
v[6] = byte(x >> 48)
|
||||||
|
v[7] = byte(x >> 56)
|
||||||
|
}
|
||||||
42
vendor/vendor.json
vendored
42
vendor/vendor.json
vendored
|
|
@ -182,6 +182,12 @@
|
||||||
"revision": "1fa385a6f45828c83361136b45b1a21a12139493",
|
"revision": "1fa385a6f45828c83361136b45b1a21a12139493",
|
||||||
"revisionTime": "2016-06-03T03:41:37Z"
|
"revisionTime": "2016-06-03T03:41:37Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "5NJ0D29BrSO9yfr6jb2PxfbIfNQ=",
|
||||||
|
"path": "github.com/jbenet/go-base58",
|
||||||
|
"revision": "6237cf65f3a6f7111cd8a42be3590df99a66bc7d",
|
||||||
|
"revisionTime": "2015-03-17T08:51:56Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "gKyBj05YkfuLFruAyPZ4KV9nFp8=",
|
"checksumSHA1": "gKyBj05YkfuLFruAyPZ4KV9nFp8=",
|
||||||
"path": "github.com/julienschmidt/httprouter",
|
"path": "github.com/julienschmidt/httprouter",
|
||||||
|
|
@ -225,6 +231,12 @@
|
||||||
"revision": "ad45545899c7b13c020ea92b2072220eefad42b8",
|
"revision": "ad45545899c7b13c020ea92b2072220eefad42b8",
|
||||||
"revisionTime": "2015-03-14T17:03:34Z"
|
"revisionTime": "2015-03-14T17:03:34Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "qcDnp9aAjAswDFGztkzgb+BZA+0=",
|
||||||
|
"path": "github.com/multiformats/go-multihash",
|
||||||
|
"revision": "f1ef5a02f28c862ca5a2037907cf76cc6c98dbf9",
|
||||||
|
"revisionTime": "2017-07-13T18:40:44Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "2gmvVTDCks8cPhpmyDlvm0sbrXE=",
|
"checksumSHA1": "2gmvVTDCks8cPhpmyDlvm0sbrXE=",
|
||||||
"path": "github.com/naoina/toml",
|
"path": "github.com/naoina/toml",
|
||||||
|
|
@ -345,6 +357,12 @@
|
||||||
"revision": "ed27b6fd65218132ee50cd95f38474a3d8a2cd12",
|
"revision": "ed27b6fd65218132ee50cd95f38474a3d8a2cd12",
|
||||||
"revisionTime": "2016-06-18T19:32:21Z"
|
"revisionTime": "2016-06-18T19:32:21Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "jAzqolwnRJhHsKXmmvKNrHqxqAw=",
|
||||||
|
"path": "github.com/spaolacci/murmur3",
|
||||||
|
"revision": "9f5d223c60793748f04a9d5b4b4eacddfc1f755d",
|
||||||
|
"revisionTime": "2017-08-19T07:11:01Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "mGbTYZ8dHVTiPTTJu3ktp+84pPI=",
|
"checksumSHA1": "mGbTYZ8dHVTiPTTJu3ktp+84pPI=",
|
||||||
"path": "github.com/stretchr/testify/assert",
|
"path": "github.com/stretchr/testify/assert",
|
||||||
|
|
@ -429,6 +447,18 @@
|
||||||
"revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199",
|
"revision": "b89cc31ef7977104127d34c1bd31ebd1a9db2199",
|
||||||
"revisionTime": "2017-07-25T06:48:36Z"
|
"revisionTime": "2017-07-25T06:48:36Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "pClJgcy1COeHxz/qRDFWnWgXTEI=",
|
||||||
|
"path": "golang.org/x/crypto/blake2b",
|
||||||
|
"revision": "adbae1b6b6fb4b02448a0fc0dbbc9ba2b95b294d",
|
||||||
|
"revisionTime": "2017-06-19T06:03:41Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "V1pAg1QF0kJNtnUUpGbWauw+vW0=",
|
||||||
|
"path": "golang.org/x/crypto/blake2s",
|
||||||
|
"revision": "adbae1b6b6fb4b02448a0fc0dbbc9ba2b95b294d",
|
||||||
|
"revisionTime": "2017-06-19T06:03:41Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "TT1rac6kpQp2vz24m5yDGUNQ/QQ=",
|
"checksumSHA1": "TT1rac6kpQp2vz24m5yDGUNQ/QQ=",
|
||||||
"path": "golang.org/x/crypto/cast5",
|
"path": "golang.org/x/crypto/cast5",
|
||||||
|
|
@ -507,6 +537,12 @@
|
||||||
"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd",
|
"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd",
|
||||||
"revisionTime": "2017-09-25T11:22:06Z"
|
"revisionTime": "2017-09-25T11:22:06Z"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "DDHnuGCrmkKSXdNzc8pmn6P5O28=",
|
||||||
|
"path": "golang.org/x/crypto/sha3",
|
||||||
|
"revision": "adbae1b6b6fb4b02448a0fc0dbbc9ba2b95b294d",
|
||||||
|
"revisionTime": "2017-06-19T06:03:41Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "Wi44TcpIOXdojyVWkvyOBnBKIS4=",
|
"checksumSHA1": "Wi44TcpIOXdojyVWkvyOBnBKIS4=",
|
||||||
"path": "golang.org/x/crypto/ssh",
|
"path": "golang.org/x/crypto/ssh",
|
||||||
|
|
@ -740,6 +776,12 @@
|
||||||
"path": "gopkg.in/urfave/cli.v1",
|
"path": "gopkg.in/urfave/cli.v1",
|
||||||
"revision": "cfb38830724cc34fedffe9a2a29fb54fa9169cd1",
|
"revision": "cfb38830724cc34fedffe9a2a29fb54fa9169cd1",
|
||||||
"revisionTime": "2017-08-11T01:42:03Z"
|
"revisionTime": "2017-08-11T01:42:03Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "r4wx8cWrUya0KvxUY5O7xtpJqTs=",
|
||||||
|
"path": "leb.io/hashland/keccakpg",
|
||||||
|
"revision": "e13accbe55f7fa03c73c74ace4cca4c425e47260",
|
||||||
|
"revisionTime": "2016-11-30T20:14:28Z"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"rootPath": "github.com/ethereum/go-ethereum"
|
"rootPath": "github.com/ethereum/go-ethereum"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue