Merge pull request #18390 from realdave/remove-sha3-pkg
vendor, crypto, swarm: switch over to upstream sha3 package
This commit is contained in:
		
						commit
						391d4cb9b5
					
				| @ -33,11 +33,11 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/ecies" | 	"github.com/ethereum/go-ethereum/crypto/ecies" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/log" | 	"github.com/ethereum/go-ethereum/log" | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/api" | 	"github.com/ethereum/go-ethereum/swarm/api" | ||||||
| 	swarmapi "github.com/ethereum/go-ethereum/swarm/api/client" | 	swarmapi "github.com/ethereum/go-ethereum/swarm/api/client" | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/testutil" | 	"github.com/ethereum/go-ethereum/swarm/testutil" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -598,7 +598,7 @@ func TestKeypairSanity(t *testing.T) { | |||||||
| 			t.Fatal(err) | 			t.Fatal(err) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		hasher := sha3.NewKeccak256() | 		hasher := sha3.NewLegacyKeccak256() | ||||||
| 		hasher.Write(salt) | 		hasher.Write(salt) | ||||||
| 		shared, err := hex.DecodeString(sharedSecret) | 		shared, err := hex.DecodeString(sharedSecret) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  | |||||||
| @ -27,7 +27,7 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/common/hexutil" | 	"github.com/ethereum/go-ethereum/common/hexutil" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Lengths of hashes and addresses in bytes.
 | // Lengths of hashes and addresses in bytes.
 | ||||||
| @ -196,7 +196,7 @@ func (a Address) Hash() Hash { return BytesToHash(a[:]) } | |||||||
| // Hex returns an EIP55-compliant hex string representation of the address.
 | // Hex returns an EIP55-compliant hex string representation of the address.
 | ||||||
| func (a Address) Hex() string { | func (a Address) Hex() string { | ||||||
| 	unchecksummed := hex.EncodeToString(a[:]) | 	unchecksummed := hex.EncodeToString(a[:]) | ||||||
| 	sha := sha3.NewKeccak256() | 	sha := sha3.NewLegacyKeccak256() | ||||||
| 	sha.Write([]byte(unchecksummed)) | 	sha.Write([]byte(unchecksummed)) | ||||||
| 	hash := sha.Sum(nil) | 	hash := sha.Sum(nil) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -33,13 +33,13 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/core/state" | 	"github.com/ethereum/go-ethereum/core/state" | ||||||
| 	"github.com/ethereum/go-ethereum/core/types" | 	"github.com/ethereum/go-ethereum/core/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ethereum/go-ethereum/log" | 	"github.com/ethereum/go-ethereum/log" | ||||||
| 	"github.com/ethereum/go-ethereum/params" | 	"github.com/ethereum/go-ethereum/params" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
| 	"github.com/ethereum/go-ethereum/rpc" | 	"github.com/ethereum/go-ethereum/rpc" | ||||||
| 	lru "github.com/hashicorp/golang-lru" | 	lru "github.com/hashicorp/golang-lru" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -148,7 +148,7 @@ type SignerFn func(accounts.Account, []byte) ([]byte, error) | |||||||
| // panics. This is done to avoid accidentally using both forms (signature present
 | // panics. This is done to avoid accidentally using both forms (signature present
 | ||||||
| // or not), which could be abused to produce different hashes for the same header.
 | // or not), which could be abused to produce different hashes for the same header.
 | ||||||
| func sigHash(header *types.Header) (hash common.Hash) { | func sigHash(header *types.Header) (hash common.Hash) { | ||||||
| 	hasher := sha3.NewKeccak256() | 	hasher := sha3.NewLegacyKeccak256() | ||||||
| 
 | 
 | ||||||
| 	rlp.Encode(hasher, []interface{}{ | 	rlp.Encode(hasher, []interface{}{ | ||||||
| 		header.ParentHash, | 		header.ParentHash, | ||||||
|  | |||||||
| @ -30,8 +30,8 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/common/bitutil" | 	"github.com/ethereum/go-ethereum/common/bitutil" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/log" | 	"github.com/ethereum/go-ethereum/log" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -123,7 +123,7 @@ func seedHash(block uint64) []byte { | |||||||
| 	if block < epochLength { | 	if block < epochLength { | ||||||
| 		return seed | 		return seed | ||||||
| 	} | 	} | ||||||
| 	keccak256 := makeHasher(sha3.NewKeccak256()) | 	keccak256 := makeHasher(sha3.NewLegacyKeccak256()) | ||||||
| 	for i := 0; i < int(block/epochLength); i++ { | 	for i := 0; i < int(block/epochLength); i++ { | ||||||
| 		keccak256(seed, seed) | 		keccak256(seed, seed) | ||||||
| 	} | 	} | ||||||
| @ -177,7 +177,7 @@ func generateCache(dest []uint32, epoch uint64, seed []byte) { | |||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
| 	// Create a hasher to reuse between invocations
 | 	// Create a hasher to reuse between invocations
 | ||||||
| 	keccak512 := makeHasher(sha3.NewKeccak512()) | 	keccak512 := makeHasher(sha3.NewLegacyKeccak512()) | ||||||
| 
 | 
 | ||||||
| 	// Sequentially produce the initial dataset
 | 	// Sequentially produce the initial dataset
 | ||||||
| 	keccak512(cache, seed) | 	keccak512(cache, seed) | ||||||
| @ -301,7 +301,7 @@ func generateDataset(dest []uint32, epoch uint64, cache []uint32) { | |||||||
| 			defer pend.Done() | 			defer pend.Done() | ||||||
| 
 | 
 | ||||||
| 			// Create a hasher to reuse between invocations
 | 			// Create a hasher to reuse between invocations
 | ||||||
| 			keccak512 := makeHasher(sha3.NewKeccak512()) | 			keccak512 := makeHasher(sha3.NewLegacyKeccak512()) | ||||||
| 
 | 
 | ||||||
| 			// Calculate the data segment this thread should generate
 | 			// Calculate the data segment this thread should generate
 | ||||||
| 			batch := uint32((size + hashBytes*uint64(threads) - 1) / (hashBytes * uint64(threads))) | 			batch := uint32((size + hashBytes*uint64(threads) - 1) / (hashBytes * uint64(threads))) | ||||||
| @ -375,7 +375,7 @@ func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) | |||||||
| // in-memory cache) in order to produce our final value for a particular header
 | // in-memory cache) in order to produce our final value for a particular header
 | ||||||
| // hash and nonce.
 | // hash and nonce.
 | ||||||
| func hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64) ([]byte, []byte) { | func hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64) ([]byte, []byte) { | ||||||
| 	keccak512 := makeHasher(sha3.NewKeccak512()) | 	keccak512 := makeHasher(sha3.NewLegacyKeccak512()) | ||||||
| 
 | 
 | ||||||
| 	lookup := func(index uint32) []uint32 { | 	lookup := func(index uint32) []uint32 { | ||||||
| 		rawData := generateDatasetItem(cache, index, keccak512) | 		rawData := generateDatasetItem(cache, index, keccak512) | ||||||
|  | |||||||
| @ -31,9 +31,9 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/consensus/misc" | 	"github.com/ethereum/go-ethereum/consensus/misc" | ||||||
| 	"github.com/ethereum/go-ethereum/core/state" | 	"github.com/ethereum/go-ethereum/core/state" | ||||||
| 	"github.com/ethereum/go-ethereum/core/types" | 	"github.com/ethereum/go-ethereum/core/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/params" | 	"github.com/ethereum/go-ethereum/params" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Ethash proof-of-work protocol constants.
 | // Ethash proof-of-work protocol constants.
 | ||||||
| @ -575,7 +575,7 @@ func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header | |||||||
| 
 | 
 | ||||||
| // SealHash returns the hash of a block prior to it being sealed.
 | // SealHash returns the hash of a block prior to it being sealed.
 | ||||||
| func (ethash *Ethash) SealHash(header *types.Header) (hash common.Hash) { | func (ethash *Ethash) SealHash(header *types.Header) (hash common.Hash) { | ||||||
| 	hasher := sha3.NewKeccak256() | 	hasher := sha3.NewLegacyKeccak256() | ||||||
| 
 | 
 | ||||||
| 	rlp.Encode(hasher, []interface{}{ | 	rlp.Encode(hasher, []interface{}{ | ||||||
| 		header.ParentHash, | 		header.ParentHash, | ||||||
|  | |||||||
| @ -23,9 +23,9 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/core/types" | 	"github.com/ethereum/go-ethereum/core/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Tests block header storage and retrieval operations.
 | // Tests block header storage and retrieval operations.
 | ||||||
| @ -47,7 +47,7 @@ func TestHeaderStorage(t *testing.T) { | |||||||
| 	if entry := ReadHeaderRLP(db, header.Hash(), header.Number.Uint64()); entry == nil { | 	if entry := ReadHeaderRLP(db, header.Hash(), header.Number.Uint64()); entry == nil { | ||||||
| 		t.Fatalf("Stored header RLP not found") | 		t.Fatalf("Stored header RLP not found") | ||||||
| 	} else { | 	} else { | ||||||
| 		hasher := sha3.NewKeccak256() | 		hasher := sha3.NewLegacyKeccak256() | ||||||
| 		hasher.Write(entry) | 		hasher.Write(entry) | ||||||
| 
 | 
 | ||||||
| 		if hash := common.BytesToHash(hasher.Sum(nil)); hash != header.Hash() { | 		if hash := common.BytesToHash(hasher.Sum(nil)); hash != header.Hash() { | ||||||
| @ -68,7 +68,7 @@ func TestBodyStorage(t *testing.T) { | |||||||
| 	// Create a test body to move around the database and make sure it's really new
 | 	// Create a test body to move around the database and make sure it's really new
 | ||||||
| 	body := &types.Body{Uncles: []*types.Header{{Extra: []byte("test header")}}} | 	body := &types.Body{Uncles: []*types.Header{{Extra: []byte("test header")}}} | ||||||
| 
 | 
 | ||||||
| 	hasher := sha3.NewKeccak256() | 	hasher := sha3.NewLegacyKeccak256() | ||||||
| 	rlp.Encode(hasher, body) | 	rlp.Encode(hasher, body) | ||||||
| 	hash := common.BytesToHash(hasher.Sum(nil)) | 	hash := common.BytesToHash(hasher.Sum(nil)) | ||||||
| 
 | 
 | ||||||
| @ -85,7 +85,7 @@ func TestBodyStorage(t *testing.T) { | |||||||
| 	if entry := ReadBodyRLP(db, hash, 0); entry == nil { | 	if entry := ReadBodyRLP(db, hash, 0); entry == nil { | ||||||
| 		t.Fatalf("Stored body RLP not found") | 		t.Fatalf("Stored body RLP not found") | ||||||
| 	} else { | 	} else { | ||||||
| 		hasher := sha3.NewKeccak256() | 		hasher := sha3.NewLegacyKeccak256() | ||||||
| 		hasher.Write(entry) | 		hasher.Write(entry) | ||||||
| 
 | 
 | ||||||
| 		if calc := common.BytesToHash(hasher.Sum(nil)); calc != hash { | 		if calc := common.BytesToHash(hasher.Sum(nil)); calc != hash { | ||||||
|  | |||||||
| @ -28,8 +28,8 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/common/hexutil" | 	"github.com/ethereum/go-ethereum/common/hexutil" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -109,7 +109,7 @@ func (h *Header) Size() common.StorageSize { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func rlpHash(x interface{}) (h common.Hash) { | func rlpHash(x interface{}) (h common.Hash) { | ||||||
| 	hw := sha3.NewKeccak256() | 	hw := sha3.NewLegacyKeccak256() | ||||||
| 	rlp.Encode(hw, x) | 	rlp.Encode(hw, x) | ||||||
| 	hw.Sum(h[:0]) | 	hw.Sum(h[:0]) | ||||||
| 	return h | 	return h | ||||||
|  | |||||||
| @ -24,8 +24,8 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/common/math" | 	"github.com/ethereum/go-ethereum/common/math" | ||||||
| 	"github.com/ethereum/go-ethereum/core/types" | 	"github.com/ethereum/go-ethereum/core/types" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/params" | 	"github.com/ethereum/go-ethereum/params" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -387,7 +387,7 @@ func opSha3(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory | |||||||
| 	data := memory.Get(offset.Int64(), size.Int64()) | 	data := memory.Get(offset.Int64(), size.Int64()) | ||||||
| 
 | 
 | ||||||
| 	if interpreter.hasher == nil { | 	if interpreter.hasher == nil { | ||||||
| 		interpreter.hasher = sha3.NewKeccak256().(keccakState) | 		interpreter.hasher = sha3.NewLegacyKeccak256().(keccakState) | ||||||
| 	} else { | 	} else { | ||||||
| 		interpreter.hasher.Reset() | 		interpreter.hasher.Reset() | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -30,8 +30,8 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/common/math" | 	"github.com/ethereum/go-ethereum/common/math" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -43,7 +43,7 @@ var errInvalidPubkey = errors.New("invalid secp256k1 public key") | |||||||
| 
 | 
 | ||||||
| // Keccak256 calculates and returns the Keccak256 hash of the input data.
 | // Keccak256 calculates and returns the Keccak256 hash of the input data.
 | ||||||
| func Keccak256(data ...[]byte) []byte { | func Keccak256(data ...[]byte) []byte { | ||||||
| 	d := sha3.NewKeccak256() | 	d := sha3.NewLegacyKeccak256() | ||||||
| 	for _, b := range data { | 	for _, b := range data { | ||||||
| 		d.Write(b) | 		d.Write(b) | ||||||
| 	} | 	} | ||||||
| @ -53,7 +53,7 @@ func Keccak256(data ...[]byte) []byte { | |||||||
| // Keccak256Hash calculates and returns the Keccak256 hash of the input data,
 | // Keccak256Hash calculates and returns the Keccak256 hash of the input data,
 | ||||||
| // converting it to an internal Hash data structure.
 | // converting it to an internal Hash data structure.
 | ||||||
| func Keccak256Hash(data ...[]byte) (h common.Hash) { | func Keccak256Hash(data ...[]byte) (h common.Hash) { | ||||||
| 	d := sha3.NewKeccak256() | 	d := sha3.NewLegacyKeccak256() | ||||||
| 	for _, b := range data { | 	for _, b := range data { | ||||||
| 		d.Write(b) | 		d.Write(b) | ||||||
| 	} | 	} | ||||||
| @ -63,7 +63,7 @@ func Keccak256Hash(data ...[]byte) (h common.Hash) { | |||||||
| 
 | 
 | ||||||
| // Keccak512 calculates and returns the Keccak512 hash of the input data.
 | // Keccak512 calculates and returns the Keccak512 hash of the input data.
 | ||||||
| func Keccak512(data ...[]byte) []byte { | func Keccak512(data ...[]byte) []byte { | ||||||
| 	d := sha3.NewKeccak512() | 	d := sha3.NewLegacyKeccak512() | ||||||
| 	for _, b := range data { | 	for _, b := range data { | ||||||
| 		d.Write(b) | 		d.Write(b) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -1,27 +0,0 @@ | |||||||
| Copyright (c) 2009 The Go Authors. All rights reserved. |  | ||||||
| 
 |  | ||||||
| Redistribution and use in source and binary forms, with or without |  | ||||||
| modification, are permitted provided that the following conditions are |  | ||||||
| met: |  | ||||||
| 
 |  | ||||||
|    * Redistributions of source code must retain the above copyright |  | ||||||
| notice, this list of conditions and the following disclaimer. |  | ||||||
|    * Redistributions in binary form must reproduce the above |  | ||||||
| copyright notice, this list of conditions and the following disclaimer |  | ||||||
| in the documentation and/or other materials provided with the |  | ||||||
| distribution. |  | ||||||
|    * Neither the name of Google Inc. nor the names of its |  | ||||||
| contributors may be used to endorse or promote products derived from |  | ||||||
| this software without specific prior written permission. |  | ||||||
| 
 |  | ||||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |  | ||||||
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |  | ||||||
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |  | ||||||
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |  | ||||||
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |  | ||||||
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |  | ||||||
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |  | ||||||
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |  | ||||||
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |  | ||||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |  | ||||||
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |  | ||||||
| @ -1,22 +0,0 @@ | |||||||
| Additional IP Rights Grant (Patents) |  | ||||||
| 
 |  | ||||||
| "This implementation" means the copyrightable works distributed by |  | ||||||
| Google as part of the Go project. |  | ||||||
| 
 |  | ||||||
| Google hereby grants to You a perpetual, worldwide, non-exclusive, |  | ||||||
| no-charge, royalty-free, irrevocable (except as stated in this section) |  | ||||||
| patent license to make, have made, use, offer to sell, sell, import, |  | ||||||
| transfer and otherwise run, modify and propagate the contents of this |  | ||||||
| implementation of Go, where such license applies only to those patent |  | ||||||
| claims, both currently owned or controlled by Google and acquired in |  | ||||||
| the future, licensable by Google that are necessarily infringed by this |  | ||||||
| implementation of Go.  This grant does not include claims that would be |  | ||||||
| infringed only as a consequence of further modification of this |  | ||||||
| implementation.  If you or your agent or exclusive licensee institute or |  | ||||||
| order or agree to the institution of patent litigation against any |  | ||||||
| entity (including a cross-claim or counterclaim in a lawsuit) alleging |  | ||||||
| that this implementation of Go or any code incorporated within this |  | ||||||
| implementation of Go constitutes direct or contributory patent |  | ||||||
| infringement, or inducement of patent infringement, then any patent |  | ||||||
| rights granted to you under this License for this implementation of Go |  | ||||||
| shall terminate as of the date such litigation is filed. |  | ||||||
| @ -1,297 +0,0 @@ | |||||||
| // Copyright 2014 The Go Authors. All rights reserved.
 |  | ||||||
| // Use of this source code is governed by a BSD-style
 |  | ||||||
| // license that can be found in the LICENSE file.
 |  | ||||||
| 
 |  | ||||||
| package sha3 |  | ||||||
| 
 |  | ||||||
| // Tests include all the ShortMsgKATs provided by the Keccak team at
 |  | ||||||
| // https://github.com/gvanas/KeccakCodePackage
 |  | ||||||
| //
 |  | ||||||
| // They only include the zero-bit case of the bitwise testvectors
 |  | ||||||
| // published by NIST in the draft of FIPS-202.
 |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"compress/flate" |  | ||||||
| 	"encoding/hex" |  | ||||||
| 	"encoding/json" |  | ||||||
| 	"hash" |  | ||||||
| 	"os" |  | ||||||
| 	"strings" |  | ||||||
| 	"testing" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	testString  = "brekeccakkeccak koax koax" |  | ||||||
| 	katFilename = "testdata/keccakKats.json.deflate" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Internal-use instances of SHAKE used to test against KATs.
 |  | ||||||
| func newHashShake128() hash.Hash { |  | ||||||
| 	return &state{rate: 168, dsbyte: 0x1f, outputLen: 512} |  | ||||||
| } |  | ||||||
| func newHashShake256() hash.Hash { |  | ||||||
| 	return &state{rate: 136, dsbyte: 0x1f, outputLen: 512} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // testDigests contains functions returning hash.Hash instances
 |  | ||||||
| // with output-length equal to the KAT length for both SHA-3 and
 |  | ||||||
| // SHAKE instances.
 |  | ||||||
| var testDigests = map[string]func() hash.Hash{ |  | ||||||
| 	"SHA3-224": New224, |  | ||||||
| 	"SHA3-256": New256, |  | ||||||
| 	"SHA3-384": New384, |  | ||||||
| 	"SHA3-512": New512, |  | ||||||
| 	"SHAKE128": newHashShake128, |  | ||||||
| 	"SHAKE256": newHashShake256, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // testShakes contains functions that return ShakeHash instances for
 |  | ||||||
| // testing the ShakeHash-specific interface.
 |  | ||||||
| var testShakes = map[string]func() ShakeHash{ |  | ||||||
| 	"SHAKE128": NewShake128, |  | ||||||
| 	"SHAKE256": NewShake256, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // structs used to marshal JSON test-cases.
 |  | ||||||
| type KeccakKats struct { |  | ||||||
| 	Kats map[string][]struct { |  | ||||||
| 		Digest  string `json:"digest"` |  | ||||||
| 		Length  int64  `json:"length"` |  | ||||||
| 		Message string `json:"message"` |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func testUnalignedAndGeneric(t *testing.T, testf func(impl string)) { |  | ||||||
| 	xorInOrig, copyOutOrig := xorIn, copyOut |  | ||||||
| 	xorIn, copyOut = xorInGeneric, copyOutGeneric |  | ||||||
| 	testf("generic") |  | ||||||
| 	if xorImplementationUnaligned != "generic" { |  | ||||||
| 		xorIn, copyOut = xorInUnaligned, copyOutUnaligned |  | ||||||
| 		testf("unaligned") |  | ||||||
| 	} |  | ||||||
| 	xorIn, copyOut = xorInOrig, copyOutOrig |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // TestKeccakKats tests the SHA-3 and Shake implementations against all the
 |  | ||||||
| // ShortMsgKATs from https://github.com/gvanas/KeccakCodePackage
 |  | ||||||
| // (The testvectors are stored in keccakKats.json.deflate due to their length.)
 |  | ||||||
| func TestKeccakKats(t *testing.T) { |  | ||||||
| 	testUnalignedAndGeneric(t, func(impl string) { |  | ||||||
| 		// Read the KATs.
 |  | ||||||
| 		deflated, err := os.Open(katFilename) |  | ||||||
| 		if err != nil { |  | ||||||
| 			t.Errorf("error opening %s: %s", katFilename, err) |  | ||||||
| 		} |  | ||||||
| 		file := flate.NewReader(deflated) |  | ||||||
| 		dec := json.NewDecoder(file) |  | ||||||
| 		var katSet KeccakKats |  | ||||||
| 		err = dec.Decode(&katSet) |  | ||||||
| 		if err != nil { |  | ||||||
| 			t.Errorf("error decoding KATs: %s", err) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Do the KATs.
 |  | ||||||
| 		for functionName, kats := range katSet.Kats { |  | ||||||
| 			d := testDigests[functionName]() |  | ||||||
| 			for _, kat := range kats { |  | ||||||
| 				d.Reset() |  | ||||||
| 				in, err := hex.DecodeString(kat.Message) |  | ||||||
| 				if err != nil { |  | ||||||
| 					t.Errorf("error decoding KAT: %s", err) |  | ||||||
| 				} |  | ||||||
| 				d.Write(in[:kat.Length/8]) |  | ||||||
| 				got := strings.ToUpper(hex.EncodeToString(d.Sum(nil))) |  | ||||||
| 				if got != kat.Digest { |  | ||||||
| 					t.Errorf("function=%s, implementation=%s, length=%d\nmessage:\n  %s\ngot:\n  %s\nwanted:\n %s", |  | ||||||
| 						functionName, impl, kat.Length, kat.Message, got, kat.Digest) |  | ||||||
| 					t.Logf("wanted %+v", kat) |  | ||||||
| 					t.FailNow() |  | ||||||
| 				} |  | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // TestUnalignedWrite tests that writing data in an arbitrary pattern with
 |  | ||||||
| // small input buffers.
 |  | ||||||
| func TestUnalignedWrite(t *testing.T) { |  | ||||||
| 	testUnalignedAndGeneric(t, func(impl string) { |  | ||||||
| 		buf := sequentialBytes(0x10000) |  | ||||||
| 		for alg, df := range testDigests { |  | ||||||
| 			d := df() |  | ||||||
| 			d.Reset() |  | ||||||
| 			d.Write(buf) |  | ||||||
| 			want := d.Sum(nil) |  | ||||||
| 			d.Reset() |  | ||||||
| 			for i := 0; i < len(buf); { |  | ||||||
| 				// Cycle through offsets which make a 137 byte sequence.
 |  | ||||||
| 				// Because 137 is prime this sequence should exercise all corner cases.
 |  | ||||||
| 				offsets := [17]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1} |  | ||||||
| 				for _, j := range offsets { |  | ||||||
| 					if v := len(buf) - i; v < j { |  | ||||||
| 						j = v |  | ||||||
| 					} |  | ||||||
| 					d.Write(buf[i : i+j]) |  | ||||||
| 					i += j |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			got := d.Sum(nil) |  | ||||||
| 			if !bytes.Equal(got, want) { |  | ||||||
| 				t.Errorf("Unaligned writes, implementation=%s, alg=%s\ngot %q, want %q", impl, alg, got, want) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // TestAppend checks that appending works when reallocation is necessary.
 |  | ||||||
| func TestAppend(t *testing.T) { |  | ||||||
| 	testUnalignedAndGeneric(t, func(impl string) { |  | ||||||
| 		d := New224() |  | ||||||
| 
 |  | ||||||
| 		for capacity := 2; capacity <= 66; capacity += 64 { |  | ||||||
| 			// The first time around the loop, Sum will have to reallocate.
 |  | ||||||
| 			// The second time, it will not.
 |  | ||||||
| 			buf := make([]byte, 2, capacity) |  | ||||||
| 			d.Reset() |  | ||||||
| 			d.Write([]byte{0xcc}) |  | ||||||
| 			buf = d.Sum(buf) |  | ||||||
| 			expected := "0000DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" |  | ||||||
| 			if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { |  | ||||||
| 				t.Errorf("got %s, want %s", got, expected) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // TestAppendNoRealloc tests that appending works when no reallocation is necessary.
 |  | ||||||
| func TestAppendNoRealloc(t *testing.T) { |  | ||||||
| 	testUnalignedAndGeneric(t, func(impl string) { |  | ||||||
| 		buf := make([]byte, 1, 200) |  | ||||||
| 		d := New224() |  | ||||||
| 		d.Write([]byte{0xcc}) |  | ||||||
| 		buf = d.Sum(buf) |  | ||||||
| 		expected := "00DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" |  | ||||||
| 		if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { |  | ||||||
| 			t.Errorf("%s: got %s, want %s", impl, got, expected) |  | ||||||
| 		} |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // TestSqueezing checks that squeezing the full output a single time produces
 |  | ||||||
| // the same output as repeatedly squeezing the instance.
 |  | ||||||
| func TestSqueezing(t *testing.T) { |  | ||||||
| 	testUnalignedAndGeneric(t, func(impl string) { |  | ||||||
| 		for functionName, newShakeHash := range testShakes { |  | ||||||
| 			d0 := newShakeHash() |  | ||||||
| 			d0.Write([]byte(testString)) |  | ||||||
| 			ref := make([]byte, 32) |  | ||||||
| 			d0.Read(ref) |  | ||||||
| 
 |  | ||||||
| 			d1 := newShakeHash() |  | ||||||
| 			d1.Write([]byte(testString)) |  | ||||||
| 			var multiple []byte |  | ||||||
| 			for range ref { |  | ||||||
| 				one := make([]byte, 1) |  | ||||||
| 				d1.Read(one) |  | ||||||
| 				multiple = append(multiple, one...) |  | ||||||
| 			} |  | ||||||
| 			if !bytes.Equal(ref, multiple) { |  | ||||||
| 				t.Errorf("%s (%s): squeezing %d bytes one at a time failed", functionName, impl, len(ref)) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // sequentialBytes produces a buffer of size consecutive bytes 0x00, 0x01, ..., used for testing.
 |  | ||||||
| func sequentialBytes(size int) []byte { |  | ||||||
| 	result := make([]byte, size) |  | ||||||
| 	for i := range result { |  | ||||||
| 		result[i] = byte(i) |  | ||||||
| 	} |  | ||||||
| 	return result |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // BenchmarkPermutationFunction measures the speed of the permutation function
 |  | ||||||
| // with no input data.
 |  | ||||||
| func BenchmarkPermutationFunction(b *testing.B) { |  | ||||||
| 	b.SetBytes(int64(200)) |  | ||||||
| 	var lanes [25]uint64 |  | ||||||
| 	for i := 0; i < b.N; i++ { |  | ||||||
| 		keccakF1600(&lanes) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // benchmarkHash tests the speed to hash num buffers of buflen each.
 |  | ||||||
| func benchmarkHash(b *testing.B, h hash.Hash, size, num int) { |  | ||||||
| 	b.StopTimer() |  | ||||||
| 	h.Reset() |  | ||||||
| 	data := sequentialBytes(size) |  | ||||||
| 	b.SetBytes(int64(size * num)) |  | ||||||
| 	b.StartTimer() |  | ||||||
| 
 |  | ||||||
| 	var state []byte |  | ||||||
| 	for i := 0; i < b.N; i++ { |  | ||||||
| 		for j := 0; j < num; j++ { |  | ||||||
| 			h.Write(data) |  | ||||||
| 		} |  | ||||||
| 		state = h.Sum(state[:0]) |  | ||||||
| 	} |  | ||||||
| 	b.StopTimer() |  | ||||||
| 	h.Reset() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // benchmarkShake is specialized to the Shake instances, which don't
 |  | ||||||
| // require a copy on reading output.
 |  | ||||||
| func benchmarkShake(b *testing.B, h ShakeHash, size, num int) { |  | ||||||
| 	b.StopTimer() |  | ||||||
| 	h.Reset() |  | ||||||
| 	data := sequentialBytes(size) |  | ||||||
| 	d := make([]byte, 32) |  | ||||||
| 
 |  | ||||||
| 	b.SetBytes(int64(size * num)) |  | ||||||
| 	b.StartTimer() |  | ||||||
| 
 |  | ||||||
| 	for i := 0; i < b.N; i++ { |  | ||||||
| 		h.Reset() |  | ||||||
| 		for j := 0; j < num; j++ { |  | ||||||
| 			h.Write(data) |  | ||||||
| 		} |  | ||||||
| 		h.Read(d) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func BenchmarkSha3_512_MTU(b *testing.B) { benchmarkHash(b, New512(), 1350, 1) } |  | ||||||
| func BenchmarkSha3_384_MTU(b *testing.B) { benchmarkHash(b, New384(), 1350, 1) } |  | ||||||
| func BenchmarkSha3_256_MTU(b *testing.B) { benchmarkHash(b, New256(), 1350, 1) } |  | ||||||
| func BenchmarkSha3_224_MTU(b *testing.B) { benchmarkHash(b, New224(), 1350, 1) } |  | ||||||
| 
 |  | ||||||
| func BenchmarkShake128_MTU(b *testing.B)  { benchmarkShake(b, NewShake128(), 1350, 1) } |  | ||||||
| func BenchmarkShake256_MTU(b *testing.B)  { benchmarkShake(b, NewShake256(), 1350, 1) } |  | ||||||
| func BenchmarkShake256_16x(b *testing.B)  { benchmarkShake(b, NewShake256(), 16, 1024) } |  | ||||||
| func BenchmarkShake256_1MiB(b *testing.B) { benchmarkShake(b, NewShake256(), 1024, 1024) } |  | ||||||
| 
 |  | ||||||
| func BenchmarkSha3_512_1MiB(b *testing.B) { benchmarkHash(b, New512(), 1024, 1024) } |  | ||||||
| 
 |  | ||||||
| func Example_sum() { |  | ||||||
| 	buf := []byte("some data to hash") |  | ||||||
| 	// A hash needs to be 64 bytes long to have 256-bit collision resistance.
 |  | ||||||
| 	h := make([]byte, 64) |  | ||||||
| 	// Compute a 64-byte hash of buf and put it in h.
 |  | ||||||
| 	ShakeSum256(h, buf) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func Example_mac() { |  | ||||||
| 	k := []byte("this is a secret key; you should generate a strong random key that's at least 32 bytes long") |  | ||||||
| 	buf := []byte("and this is some data to authenticate") |  | ||||||
| 	// A MAC with 32 bytes of output has 256-bit security strength -- if you use at least a 32-byte-long key.
 |  | ||||||
| 	h := make([]byte, 32) |  | ||||||
| 	d := NewShake256() |  | ||||||
| 	// Write the key into the hash.
 |  | ||||||
| 	d.Write(k) |  | ||||||
| 	// Now write the data.
 |  | ||||||
| 	d.Write(buf) |  | ||||||
| 	// Read 32 bytes of output from the hash into h.
 |  | ||||||
| 	d.Read(h) |  | ||||||
| } |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								crypto/sha3/testdata/keccakKats.json.deflate
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								crypto/sha3/testdata/keccakKats.json.deflate
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -25,10 +25,10 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/core/rawdb" | 	"github.com/ethereum/go-ethereum/core/rawdb" | ||||||
| 	"github.com/ethereum/go-ethereum/core/state" | 	"github.com/ethereum/go-ethereum/core/state" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ethereum/go-ethereum/log" | 	"github.com/ethereum/go-ethereum/log" | ||||||
| 	"github.com/ethereum/go-ethereum/trie" | 	"github.com/ethereum/go-ethereum/trie" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // stateReq represents a batch of state fetch requests grouped together into
 | // stateReq represents a batch of state fetch requests grouped together into
 | ||||||
| @ -240,7 +240,7 @@ func newStateSync(d *Downloader, root common.Hash) *stateSync { | |||||||
| 	return &stateSync{ | 	return &stateSync{ | ||||||
| 		d:       d, | 		d:       d, | ||||||
| 		sched:   state.NewStateSync(root, d.stateDB), | 		sched:   state.NewStateSync(root, d.stateDB), | ||||||
| 		keccak:  sha3.NewKeccak256(), | 		keccak:  sha3.NewLegacyKeccak256(), | ||||||
| 		tasks:   make(map[common.Hash]*stateTask), | 		tasks:   make(map[common.Hash]*stateTask), | ||||||
| 		deliver: make(chan *stateReq), | 		deliver: make(chan *stateReq), | ||||||
| 		cancel:  make(chan struct{}), | 		cancel:  make(chan struct{}), | ||||||
|  | |||||||
| @ -27,10 +27,10 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/common/mclock" | 	"github.com/ethereum/go-ethereum/common/mclock" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/log" | 	"github.com/ethereum/go-ethereum/log" | ||||||
| 	"github.com/ethereum/go-ethereum/p2p/netutil" | 	"github.com/ethereum/go-ethereum/p2p/netutil" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -1234,7 +1234,7 @@ func (net *Network) checkTopicRegister(data *topicRegister) (*pong, error) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func rlpHash(x interface{}) (h common.Hash) { | func rlpHash(x interface{}) (h common.Hash) { | ||||||
| 	hw := sha3.NewKeccak256() | 	hw := sha3.NewLegacyKeccak256() | ||||||
| 	rlp.Encode(hw, x) | 	rlp.Encode(hw, x) | ||||||
| 	hw.Sum(h[:0]) | 	hw.Sum(h[:0]) | ||||||
| 	return h | 	return h | ||||||
|  | |||||||
| @ -23,9 +23,9 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/common/math" | 	"github.com/ethereum/go-ethereum/common/math" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/p2p/enr" | 	"github.com/ethereum/go-ethereum/p2p/enr" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // List of known secure identity schemes.
 | // List of known secure identity schemes.
 | ||||||
| @ -48,7 +48,7 @@ func SignV4(r *enr.Record, privkey *ecdsa.PrivateKey) error { | |||||||
| 	cpy.Set(enr.ID("v4")) | 	cpy.Set(enr.ID("v4")) | ||||||
| 	cpy.Set(Secp256k1(privkey.PublicKey)) | 	cpy.Set(Secp256k1(privkey.PublicKey)) | ||||||
| 
 | 
 | ||||||
| 	h := sha3.NewKeccak256() | 	h := sha3.NewLegacyKeccak256() | ||||||
| 	rlp.Encode(h, cpy.AppendElements(nil)) | 	rlp.Encode(h, cpy.AppendElements(nil)) | ||||||
| 	sig, err := crypto.Sign(h.Sum(nil), privkey) | 	sig, err := crypto.Sign(h.Sum(nil), privkey) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @ -69,7 +69,7 @@ func (V4ID) Verify(r *enr.Record, sig []byte) error { | |||||||
| 		return fmt.Errorf("invalid public key") | 		return fmt.Errorf("invalid public key") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	h := sha3.NewKeccak256() | 	h := sha3.NewLegacyKeccak256() | ||||||
| 	rlp.Encode(h, r.AppendElements(nil)) | 	rlp.Encode(h, r.AppendElements(nil)) | ||||||
| 	if !crypto.VerifySignature(entry, h.Sum(nil), sig) { | 	if !crypto.VerifySignature(entry, h.Sum(nil), sig) { | ||||||
| 		return enr.ErrInvalidSig | 		return enr.ErrInvalidSig | ||||||
|  | |||||||
| @ -39,9 +39,9 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/ecies" | 	"github.com/ethereum/go-ethereum/crypto/ecies" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/secp256k1" | 	"github.com/ethereum/go-ethereum/crypto/secp256k1" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
| 	"github.com/golang/snappy" | 	"github.com/golang/snappy" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -253,10 +253,10 @@ func (h *encHandshake) secrets(auth, authResp []byte) (secrets, error) { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// setup sha3 instances for the MACs
 | 	// setup sha3 instances for the MACs
 | ||||||
| 	mac1 := sha3.NewKeccak256() | 	mac1 := sha3.NewLegacyKeccak256() | ||||||
| 	mac1.Write(xor(s.MAC, h.respNonce)) | 	mac1.Write(xor(s.MAC, h.respNonce)) | ||||||
| 	mac1.Write(auth) | 	mac1.Write(auth) | ||||||
| 	mac2 := sha3.NewKeccak256() | 	mac2 := sha3.NewLegacyKeccak256() | ||||||
| 	mac2.Write(xor(s.MAC, h.initNonce)) | 	mac2.Write(xor(s.MAC, h.initNonce)) | ||||||
| 	mac2.Write(authResp) | 	mac2.Write(authResp) | ||||||
| 	if h.initiator { | 	if h.initiator { | ||||||
|  | |||||||
| @ -34,9 +34,9 @@ import ( | |||||||
| 	"github.com/davecgh/go-spew/spew" | 	"github.com/davecgh/go-spew/spew" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/ecies" | 	"github.com/ethereum/go-ethereum/crypto/ecies" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/p2p/simulations/pipes" | 	"github.com/ethereum/go-ethereum/p2p/simulations/pipes" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func TestSharedSecret(t *testing.T) { | func TestSharedSecret(t *testing.T) { | ||||||
| @ -334,8 +334,8 @@ func TestRLPXFrameRW(t *testing.T) { | |||||||
| 	s1 := secrets{ | 	s1 := secrets{ | ||||||
| 		AES:        aesSecret, | 		AES:        aesSecret, | ||||||
| 		MAC:        macSecret, | 		MAC:        macSecret, | ||||||
| 		EgressMAC:  sha3.NewKeccak256(), | 		EgressMAC:  sha3.NewLegacyKeccak256(), | ||||||
| 		IngressMAC: sha3.NewKeccak256(), | 		IngressMAC: sha3.NewLegacyKeccak256(), | ||||||
| 	} | 	} | ||||||
| 	s1.EgressMAC.Write(egressMACinit) | 	s1.EgressMAC.Write(egressMACinit) | ||||||
| 	s1.IngressMAC.Write(ingressMACinit) | 	s1.IngressMAC.Write(ingressMACinit) | ||||||
| @ -344,8 +344,8 @@ func TestRLPXFrameRW(t *testing.T) { | |||||||
| 	s2 := secrets{ | 	s2 := secrets{ | ||||||
| 		AES:        aesSecret, | 		AES:        aesSecret, | ||||||
| 		MAC:        macSecret, | 		MAC:        macSecret, | ||||||
| 		EgressMAC:  sha3.NewKeccak256(), | 		EgressMAC:  sha3.NewLegacyKeccak256(), | ||||||
| 		IngressMAC: sha3.NewKeccak256(), | 		IngressMAC: sha3.NewLegacyKeccak256(), | ||||||
| 	} | 	} | ||||||
| 	s2.EgressMAC.Write(ingressMACinit) | 	s2.EgressMAC.Write(ingressMACinit) | ||||||
| 	s2.IngressMAC.Write(egressMACinit) | 	s2.IngressMAC.Write(egressMACinit) | ||||||
|  | |||||||
| @ -26,10 +26,10 @@ import ( | |||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/log" | 	"github.com/ethereum/go-ethereum/log" | ||||||
| 	"github.com/ethereum/go-ethereum/p2p/enode" | 	"github.com/ethereum/go-ethereum/p2p/enode" | ||||||
| 	"github.com/ethereum/go-ethereum/p2p/enr" | 	"github.com/ethereum/go-ethereum/p2p/enr" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // func init() {
 | // func init() {
 | ||||||
| @ -48,8 +48,8 @@ func newTestTransport(rpub *ecdsa.PublicKey, fd net.Conn) transport { | |||||||
| 	wrapped.rw = newRLPXFrameRW(fd, secrets{ | 	wrapped.rw = newRLPXFrameRW(fd, secrets{ | ||||||
| 		MAC:        zero16, | 		MAC:        zero16, | ||||||
| 		AES:        zero16, | 		AES:        zero16, | ||||||
| 		IngressMAC: sha3.NewKeccak256(), | 		IngressMAC: sha3.NewLegacyKeccak256(), | ||||||
| 		EgressMAC:  sha3.NewKeccak256(), | 		EgressMAC:  sha3.NewLegacyKeccak256(), | ||||||
| 	}) | 	}) | ||||||
| 	return &testTransport{rpub: rpub, rlpx: wrapped} | 	return &testTransport{rpub: rpub, rlpx: wrapped} | ||||||
| } | } | ||||||
|  | |||||||
| @ -15,11 +15,11 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/ecies" | 	"github.com/ethereum/go-ethereum/crypto/ecies" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/log" | 	"github.com/ethereum/go-ethereum/swarm/log" | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/sctx" | 	"github.com/ethereum/go-ethereum/swarm/sctx" | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/storage" | 	"github.com/ethereum/go-ethereum/swarm/storage" | ||||||
| 	"golang.org/x/crypto/scrypt" | 	"golang.org/x/crypto/scrypt" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| 	cli "gopkg.in/urfave/cli.v1" | 	cli "gopkg.in/urfave/cli.v1" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -336,7 +336,7 @@ func (a *API) doDecrypt(ctx context.Context, credentials string, pk *ecdsa.Priva | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (a *API) getACTDecryptionKey(ctx context.Context, actManifestAddress storage.Address, sessionKey []byte) (found bool, ciphertext, decryptionKey []byte, err error) { | func (a *API) getACTDecryptionKey(ctx context.Context, actManifestAddress storage.Address, sessionKey []byte) (found bool, ciphertext, decryptionKey []byte, err error) { | ||||||
| 	hasher := sha3.NewKeccak256() | 	hasher := sha3.NewLegacyKeccak256() | ||||||
| 	hasher.Write(append(sessionKey, 0)) | 	hasher.Write(append(sessionKey, 0)) | ||||||
| 	lookupKey := hasher.Sum(nil) | 	lookupKey := hasher.Sum(nil) | ||||||
| 	hasher.Reset() | 	hasher.Reset() | ||||||
| @ -462,7 +462,7 @@ func DoACT(ctx *cli.Context, privateKey *ecdsa.PrivateKey, salt []byte, grantees | |||||||
| 			return nil, nil, nil, err | 			return nil, nil, nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		hasher := sha3.NewKeccak256() | 		hasher := sha3.NewLegacyKeccak256() | ||||||
| 		hasher.Write(append(sessionKey, 0)) | 		hasher.Write(append(sessionKey, 0)) | ||||||
| 		lookupKey := hasher.Sum(nil) | 		lookupKey := hasher.Sum(nil) | ||||||
| 
 | 
 | ||||||
| @ -484,7 +484,7 @@ func DoACT(ctx *cli.Context, privateKey *ecdsa.PrivateKey, salt []byte, grantees | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, nil, nil, err | 			return nil, nil, nil, err | ||||||
| 		} | 		} | ||||||
| 		hasher := sha3.NewKeccak256() | 		hasher := sha3.NewLegacyKeccak256() | ||||||
| 		hasher.Write(append(sessionKey, 0)) | 		hasher.Write(append(sessionKey, 0)) | ||||||
| 		lookupKey := hasher.Sum(nil) | 		lookupKey := hasher.Sum(nil) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -20,8 +20,8 @@ import ( | |||||||
| 	"encoding/binary" | 	"encoding/binary" | ||||||
| 	"errors" | 	"errors" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/storage/encryption" | 	"github.com/ethereum/go-ethereum/swarm/storage/encryption" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type RefEncryption struct { | type RefEncryption struct { | ||||||
| @ -39,12 +39,12 @@ func NewRefEncryption(refSize int) *RefEncryption { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (re *RefEncryption) Encrypt(ref []byte, key []byte) ([]byte, error) { | func (re *RefEncryption) Encrypt(ref []byte, key []byte) ([]byte, error) { | ||||||
| 	spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewKeccak256) | 	spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewLegacyKeccak256) | ||||||
| 	encryptedSpan, err := spanEncryption.Encrypt(re.span) | 	encryptedSpan, err := spanEncryption.Encrypt(re.span) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewKeccak256) | 	dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewLegacyKeccak256) | ||||||
| 	encryptedData, err := dataEncryption.Encrypt(ref) | 	encryptedData, err := dataEncryption.Encrypt(ref) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @ -57,7 +57,7 @@ func (re *RefEncryption) Encrypt(ref []byte, key []byte) ([]byte, error) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (re *RefEncryption) Decrypt(ref []byte, key []byte) ([]byte, error) { | func (re *RefEncryption) Decrypt(ref []byte, key []byte) ([]byte, error) { | ||||||
| 	spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewKeccak256) | 	spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewLegacyKeccak256) | ||||||
| 	decryptedSpan, err := spanEncryption.Decrypt(ref[:8]) | 	decryptedSpan, err := spanEncryption.Decrypt(ref[:8]) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @ -68,7 +68,7 @@ func (re *RefEncryption) Decrypt(ref []byte, key []byte) ([]byte, error) { | |||||||
| 		return nil, errors.New("invalid span in encrypted reference") | 		return nil, errors.New("invalid span in encrypted reference") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewKeccak256) | 	dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewLegacyKeccak256) | ||||||
| 	decryptedRef, err := dataEncryption.Decrypt(ref[8:]) | 	decryptedRef, err := dataEncryption.Decrypt(ref[8:]) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | |||||||
| @ -61,7 +61,7 @@ const ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // BaseHasherFunc is a hash.Hash constructor function used for the base hash of the BMT.
 | // BaseHasherFunc is a hash.Hash constructor function used for the base hash of the BMT.
 | ||||||
| // implemented by Keccak256 SHA3 sha3.NewKeccak256
 | // implemented by Keccak256 SHA3 sha3.NewLegacyKeccak256
 | ||||||
| type BaseHasherFunc func() hash.Hash | type BaseHasherFunc func() hash.Hash | ||||||
| 
 | 
 | ||||||
| // Hasher a reusable hasher for fixed maximum size chunks representing a BMT
 | // Hasher a reusable hasher for fixed maximum size chunks representing a BMT
 | ||||||
|  | |||||||
| @ -26,8 +26,8 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/testutil" | 	"github.com/ethereum/go-ethereum/swarm/testutil" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // the actual data length generated (could be longer than max datalength of the BMT)
 | // the actual data length generated (could be longer than max datalength of the BMT)
 | ||||||
| @ -44,7 +44,7 @@ var counts = []int{1, 2, 3, 4, 5, 8, 9, 15, 16, 17, 32, 37, 42, 53, 63, 64, 65, | |||||||
| 
 | 
 | ||||||
| // calculates the Keccak256 SHA3 hash of the data
 | // calculates the Keccak256 SHA3 hash of the data
 | ||||||
| func sha3hash(data ...[]byte) []byte { | func sha3hash(data ...[]byte) []byte { | ||||||
| 	h := sha3.NewKeccak256() | 	h := sha3.NewLegacyKeccak256() | ||||||
| 	return doSum(h, nil, data...) | 	return doSum(h, nil, data...) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -121,7 +121,7 @@ func TestRefHasher(t *testing.T) { | |||||||
| 				t.Run(fmt.Sprintf("%d_segments_%d_bytes", segmentCount, length), func(t *testing.T) { | 				t.Run(fmt.Sprintf("%d_segments_%d_bytes", segmentCount, length), func(t *testing.T) { | ||||||
| 					data := testutil.RandomBytes(i, length) | 					data := testutil.RandomBytes(i, length) | ||||||
| 					expected := x.expected(data) | 					expected := x.expected(data) | ||||||
| 					actual := NewRefHasher(sha3.NewKeccak256, segmentCount).Hash(data) | 					actual := NewRefHasher(sha3.NewLegacyKeccak256, segmentCount).Hash(data) | ||||||
| 					if !bytes.Equal(actual, expected) { | 					if !bytes.Equal(actual, expected) { | ||||||
| 						t.Fatalf("expected %x, got %x", expected, actual) | 						t.Fatalf("expected %x, got %x", expected, actual) | ||||||
| 					} | 					} | ||||||
| @ -133,7 +133,7 @@ func TestRefHasher(t *testing.T) { | |||||||
| 
 | 
 | ||||||
| // tests if hasher responds with correct hash comparing the reference implementation return value
 | // tests if hasher responds with correct hash comparing the reference implementation return value
 | ||||||
| func TestHasherEmptyData(t *testing.T) { | func TestHasherEmptyData(t *testing.T) { | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	var data []byte | 	var data []byte | ||||||
| 	for _, count := range counts { | 	for _, count := range counts { | ||||||
| 		t.Run(fmt.Sprintf("%d_segments", count), func(t *testing.T) { | 		t.Run(fmt.Sprintf("%d_segments", count), func(t *testing.T) { | ||||||
| @ -153,7 +153,7 @@ func TestHasherEmptyData(t *testing.T) { | |||||||
| // tests sequential write with entire max size written in one go
 | // tests sequential write with entire max size written in one go
 | ||||||
| func TestSyncHasherCorrectness(t *testing.T) { | func TestSyncHasherCorrectness(t *testing.T) { | ||||||
| 	data := testutil.RandomBytes(1, BufferSize) | 	data := testutil.RandomBytes(1, BufferSize) | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	size := hasher().Size() | 	size := hasher().Size() | ||||||
| 
 | 
 | ||||||
| 	var err error | 	var err error | ||||||
| @ -179,7 +179,7 @@ func TestSyncHasherCorrectness(t *testing.T) { | |||||||
| // tests order-neutral concurrent writes with entire max size written in one go
 | // tests order-neutral concurrent writes with entire max size written in one go
 | ||||||
| func TestAsyncCorrectness(t *testing.T) { | func TestAsyncCorrectness(t *testing.T) { | ||||||
| 	data := testutil.RandomBytes(1, BufferSize) | 	data := testutil.RandomBytes(1, BufferSize) | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	size := hasher().Size() | 	size := hasher().Size() | ||||||
| 	whs := []whenHash{first, last, random} | 	whs := []whenHash{first, last, random} | ||||||
| 
 | 
 | ||||||
| @ -226,7 +226,7 @@ func TestHasherReuse(t *testing.T) { | |||||||
| 
 | 
 | ||||||
| // tests if bmt reuse is not corrupting result
 | // tests if bmt reuse is not corrupting result
 | ||||||
| func testHasherReuse(poolsize int, t *testing.T) { | func testHasherReuse(poolsize int, t *testing.T) { | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	pool := NewTreePool(hasher, segmentCount, poolsize) | 	pool := NewTreePool(hasher, segmentCount, poolsize) | ||||||
| 	defer pool.Drain(0) | 	defer pool.Drain(0) | ||||||
| 	bmt := New(pool) | 	bmt := New(pool) | ||||||
| @ -243,7 +243,7 @@ func testHasherReuse(poolsize int, t *testing.T) { | |||||||
| 
 | 
 | ||||||
| // Tests if pool can be cleanly reused even in concurrent use by several hasher
 | // Tests if pool can be cleanly reused even in concurrent use by several hasher
 | ||||||
| func TestBMTConcurrentUse(t *testing.T) { | func TestBMTConcurrentUse(t *testing.T) { | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	pool := NewTreePool(hasher, segmentCount, PoolSize) | 	pool := NewTreePool(hasher, segmentCount, PoolSize) | ||||||
| 	defer pool.Drain(0) | 	defer pool.Drain(0) | ||||||
| 	cycles := 100 | 	cycles := 100 | ||||||
| @ -277,7 +277,7 @@ LOOP: | |||||||
| // Tests BMT Hasher io.Writer interface is working correctly
 | // Tests BMT Hasher io.Writer interface is working correctly
 | ||||||
| // even multiple short random write buffers
 | // even multiple short random write buffers
 | ||||||
| func TestBMTWriterBuffers(t *testing.T) { | func TestBMTWriterBuffers(t *testing.T) { | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 
 | 
 | ||||||
| 	for _, count := range counts { | 	for _, count := range counts { | ||||||
| 		t.Run(fmt.Sprintf("%d_segments", count), func(t *testing.T) { | 		t.Run(fmt.Sprintf("%d_segments", count), func(t *testing.T) { | ||||||
| @ -410,7 +410,7 @@ func BenchmarkPool(t *testing.B) { | |||||||
| // benchmarks simple sha3 hash on chunks
 | // benchmarks simple sha3 hash on chunks
 | ||||||
| func benchmarkSHA3(t *testing.B, n int) { | func benchmarkSHA3(t *testing.B, n int) { | ||||||
| 	data := testutil.RandomBytes(1, n) | 	data := testutil.RandomBytes(1, n) | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	h := hasher() | 	h := hasher() | ||||||
| 
 | 
 | ||||||
| 	t.ReportAllocs() | 	t.ReportAllocs() | ||||||
| @ -426,7 +426,7 @@ func benchmarkSHA3(t *testing.B, n int) { | |||||||
| // the premise is that this is the minimum computation needed for a BMT
 | // the premise is that this is the minimum computation needed for a BMT
 | ||||||
| // therefore this serves as a theoretical optimum for concurrent implementations
 | // therefore this serves as a theoretical optimum for concurrent implementations
 | ||||||
| func benchmarkBMTBaseline(t *testing.B, n int) { | func benchmarkBMTBaseline(t *testing.B, n int) { | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	hashSize := hasher().Size() | 	hashSize := hasher().Size() | ||||||
| 	data := testutil.RandomBytes(1, hashSize) | 	data := testutil.RandomBytes(1, hashSize) | ||||||
| 
 | 
 | ||||||
| @ -453,7 +453,7 @@ func benchmarkBMTBaseline(t *testing.B, n int) { | |||||||
| // benchmarks BMT Hasher
 | // benchmarks BMT Hasher
 | ||||||
| func benchmarkBMT(t *testing.B, n int) { | func benchmarkBMT(t *testing.B, n int) { | ||||||
| 	data := testutil.RandomBytes(1, n) | 	data := testutil.RandomBytes(1, n) | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	pool := NewTreePool(hasher, segmentCount, PoolSize) | 	pool := NewTreePool(hasher, segmentCount, PoolSize) | ||||||
| 	bmt := New(pool) | 	bmt := New(pool) | ||||||
| 
 | 
 | ||||||
| @ -467,7 +467,7 @@ func benchmarkBMT(t *testing.B, n int) { | |||||||
| // benchmarks BMT hasher with asynchronous concurrent segment/section writes
 | // benchmarks BMT hasher with asynchronous concurrent segment/section writes
 | ||||||
| func benchmarkBMTAsync(t *testing.B, n int, wh whenHash, double bool) { | func benchmarkBMTAsync(t *testing.B, n int, wh whenHash, double bool) { | ||||||
| 	data := testutil.RandomBytes(1, n) | 	data := testutil.RandomBytes(1, n) | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	pool := NewTreePool(hasher, segmentCount, PoolSize) | 	pool := NewTreePool(hasher, segmentCount, PoolSize) | ||||||
| 	bmt := New(pool).NewAsyncWriter(double) | 	bmt := New(pool).NewAsyncWriter(double) | ||||||
| 	idxs, segments := splitAndShuffle(bmt.SectionSize(), data) | 	idxs, segments := splitAndShuffle(bmt.SectionSize(), data) | ||||||
| @ -485,7 +485,7 @@ func benchmarkBMTAsync(t *testing.B, n int, wh whenHash, double bool) { | |||||||
| // benchmarks 100 concurrent bmt hashes with pool capacity
 | // benchmarks 100 concurrent bmt hashes with pool capacity
 | ||||||
| func benchmarkPool(t *testing.B, poolsize, n int) { | func benchmarkPool(t *testing.B, poolsize, n int) { | ||||||
| 	data := testutil.RandomBytes(1, n) | 	data := testutil.RandomBytes(1, n) | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	pool := NewTreePool(hasher, segmentCount, poolsize) | 	pool := NewTreePool(hasher, segmentCount, poolsize) | ||||||
| 	cycles := 100 | 	cycles := 100 | ||||||
| 
 | 
 | ||||||
| @ -508,7 +508,7 @@ func benchmarkPool(t *testing.B, poolsize, n int) { | |||||||
| // benchmarks the reference hasher
 | // benchmarks the reference hasher
 | ||||||
| func benchmarkRefHasher(t *testing.B, n int) { | func benchmarkRefHasher(t *testing.B, n int) { | ||||||
| 	data := testutil.RandomBytes(1, n) | 	data := testutil.RandomBytes(1, n) | ||||||
| 	hasher := sha3.NewKeccak256 | 	hasher := sha3.NewLegacyKeccak256 | ||||||
| 	rbmt := NewRefHasher(hasher, 128) | 	rbmt := NewRefHasher(hasher, 128) | ||||||
| 
 | 
 | ||||||
| 	t.ReportAllocs() | 	t.ReportAllocs() | ||||||
|  | |||||||
| @ -24,8 +24,8 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	p2ptest "github.com/ethereum/go-ethereum/p2p/testing" | 	p2ptest "github.com/ethereum/go-ethereum/p2p/testing" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func TestStreamerSubscribe(t *testing.T) { | func TestStreamerSubscribe(t *testing.T) { | ||||||
|  | |||||||
| @ -29,7 +29,6 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/metrics" | 	"github.com/ethereum/go-ethereum/metrics" | ||||||
| 	"github.com/ethereum/go-ethereum/p2p" | 	"github.com/ethereum/go-ethereum/p2p" | ||||||
| 	"github.com/ethereum/go-ethereum/p2p/enode" | 	"github.com/ethereum/go-ethereum/p2p/enode" | ||||||
| @ -40,6 +39,7 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/swarm/pot" | 	"github.com/ethereum/go-ethereum/swarm/pot" | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/storage" | 	"github.com/ethereum/go-ethereum/swarm/storage" | ||||||
| 	whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" | 	whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -187,7 +187,7 @@ func NewPss(k *network.Kademlia, params *PssParams) (*Pss, error) { | |||||||
| 
 | 
 | ||||||
| 		hashPool: sync.Pool{ | 		hashPool: sync.Pool{ | ||||||
| 			New: func() interface{} { | 			New: func() interface{} { | ||||||
| 				return sha3.NewKeccak256() | 				return sha3.NewLegacyKeccak256() | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -24,8 +24,8 @@ import ( | |||||||
| 	"io" | 	"io" | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/testutil" | 	"github.com/ethereum/go-ethereum/swarm/testutil" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| /* | /* | ||||||
| @ -142,7 +142,7 @@ func TestSha3ForCorrectness(t *testing.T) { | |||||||
| 
 | 
 | ||||||
| 	io.LimitReader(bytes.NewReader(input[8:]), int64(size)) | 	io.LimitReader(bytes.NewReader(input[8:]), int64(size)) | ||||||
| 
 | 
 | ||||||
| 	rawSha3 := sha3.NewKeccak256() | 	rawSha3 := sha3.NewLegacyKeccak256() | ||||||
| 	rawSha3.Reset() | 	rawSha3.Reset() | ||||||
| 	rawSha3.Write(input) | 	rawSha3.Write(input) | ||||||
| 	rawSha3Output := rawSha3.Sum(nil) | 	rawSha3Output := rawSha3.Sum(nil) | ||||||
|  | |||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -21,9 +21,9 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"sync/atomic" | 	"sync/atomic" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	ch "github.com/ethereum/go-ethereum/swarm/chunk" | 	ch "github.com/ethereum/go-ethereum/swarm/chunk" | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/storage/encryption" | 	"github.com/ethereum/go-ethereum/swarm/storage/encryption" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type hasherStore struct { | type hasherStore struct { | ||||||
| @ -232,11 +232,11 @@ func (h *hasherStore) decrypt(chunkData ChunkData, key encryption.Key) ([]byte, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (h *hasherStore) newSpanEncryption(key encryption.Key) encryption.Encryption { | func (h *hasherStore) newSpanEncryption(key encryption.Key) encryption.Encryption { | ||||||
| 	return encryption.New(key, 0, uint32(ch.DefaultSize/h.refSize), sha3.NewKeccak256) | 	return encryption.New(key, 0, uint32(ch.DefaultSize/h.refSize), sha3.NewLegacyKeccak256) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (h *hasherStore) newDataEncryption(key encryption.Key) encryption.Encryption { | func (h *hasherStore) newDataEncryption(key encryption.Key) encryption.Encryption { | ||||||
| 	return encryption.New(key, int(ch.DefaultSize), 0, sha3.NewKeccak256) | 	return encryption.New(key, int(ch.DefaultSize), 0, sha3.NewLegacyKeccak256) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (h *hasherStore) storeChunk(ctx context.Context, chunk *chunk) { | func (h *hasherStore) storeChunk(ctx context.Context, chunk *chunk) { | ||||||
|  | |||||||
| @ -26,9 +26,9 @@ import ( | |||||||
| 	"io" | 	"io" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/swarm/bmt" | 	"github.com/ethereum/go-ethereum/swarm/bmt" | ||||||
| 	ch "github.com/ethereum/go-ethereum/swarm/chunk" | 	ch "github.com/ethereum/go-ethereum/swarm/chunk" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const MaxPO = 16 | const MaxPO = 16 | ||||||
| @ -75,10 +75,10 @@ func MakeHashFunc(hash string) SwarmHasher { | |||||||
| 	case "SHA256": | 	case "SHA256": | ||||||
| 		return func() SwarmHash { return &HashWithLength{crypto.SHA256.New()} } | 		return func() SwarmHash { return &HashWithLength{crypto.SHA256.New()} } | ||||||
| 	case "SHA3": | 	case "SHA3": | ||||||
| 		return func() SwarmHash { return &HashWithLength{sha3.NewKeccak256()} } | 		return func() SwarmHash { return &HashWithLength{sha3.NewLegacyKeccak256()} } | ||||||
| 	case "BMT": | 	case "BMT": | ||||||
| 		return func() SwarmHash { | 		return func() SwarmHash { | ||||||
| 			hasher := sha3.NewKeccak256 | 			hasher := sha3.NewLegacyKeccak256 | ||||||
| 			hasherSize := hasher().Size() | 			hasherSize := hasher().Size() | ||||||
| 			segmentCount := ch.DefaultSize / hasherSize | 			segmentCount := ch.DefaultSize / hasherSize | ||||||
| 			pool := bmt.NewTreePool(hasher, segmentCount, bmt.PoolSize) | 			pool := bmt.NewTreePool(hasher, segmentCount, bmt.PoolSize) | ||||||
|  | |||||||
| @ -31,10 +31,10 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/core/types" | 	"github.com/ethereum/go-ethereum/core/types" | ||||||
| 	"github.com/ethereum/go-ethereum/core/vm" | 	"github.com/ethereum/go-ethereum/core/vm" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" | 	"github.com/ethereum/go-ethereum/crypto" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/ethdb" | 	"github.com/ethereum/go-ethereum/ethdb" | ||||||
| 	"github.com/ethereum/go-ethereum/params" | 	"github.com/ethereum/go-ethereum/params" | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // StateTest checks transaction processing without block context.
 | // StateTest checks transaction processing without block context.
 | ||||||
| @ -248,7 +248,7 @@ func (tx *stTransaction) toMessage(ps stPostState) (core.Message, error) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func rlpHash(x interface{}) (h common.Hash) { | func rlpHash(x interface{}) (h common.Hash) { | ||||||
| 	hw := sha3.NewKeccak256() | 	hw := sha3.NewLegacyKeccak256() | ||||||
| 	rlp.Encode(hw, x) | 	rlp.Encode(hw, x) | ||||||
| 	hw.Sum(h[:0]) | 	hw.Sum(h[:0]) | ||||||
| 	return h | 	return h | ||||||
|  | |||||||
| @ -21,8 +21,8 @@ import ( | |||||||
| 	"sync" | 	"sync" | ||||||
| 
 | 
 | ||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" |  | ||||||
| 	"github.com/ethereum/go-ethereum/rlp" | 	"github.com/ethereum/go-ethereum/rlp" | ||||||
|  | 	"golang.org/x/crypto/sha3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type hasher struct { | type hasher struct { | ||||||
| @ -57,7 +57,7 @@ var hasherPool = sync.Pool{ | |||||||
| 	New: func() interface{} { | 	New: func() interface{} { | ||||||
| 		return &hasher{ | 		return &hasher{ | ||||||
| 			tmp: make(sliceBuffer, 0, 550), // cap is as large as a full fullNode.
 | 			tmp: make(sliceBuffer, 0, 550), // cap is as large as a full fullNode.
 | ||||||
| 			sha: sha3.NewKeccak256().(keccakState), | 			sha: sha3.NewLegacyKeccak256().(keccakState), | ||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										60
									
								
								vendor/golang.org/x/crypto/ed25519/ed25519.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								vendor/golang.org/x/crypto/ed25519/ed25519.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -6,7 +6,10 @@ | |||||||
| // https://ed25519.cr.yp.to/.
 | // https://ed25519.cr.yp.to/.
 | ||||||
| //
 | //
 | ||||||
| // These functions are also compatible with the “Ed25519” function defined in
 | // These functions are also compatible with the “Ed25519” function defined in
 | ||||||
| // RFC 8032.
 | // RFC 8032. However, unlike RFC 8032's formulation, this package's private key
 | ||||||
|  | // representation includes a public key suffix to make multiple signing
 | ||||||
|  | // operations with the same key more efficient. This package refers to the RFC
 | ||||||
|  | // 8032 private key as the “seed”.
 | ||||||
| package ed25519 | package ed25519 | ||||||
| 
 | 
 | ||||||
| // This code is a port of the public domain, “ref10” implementation of ed25519
 | // This code is a port of the public domain, “ref10” implementation of ed25519
 | ||||||
| @ -31,6 +34,8 @@ const ( | |||||||
| 	PrivateKeySize = 64 | 	PrivateKeySize = 64 | ||||||
| 	// SignatureSize is the size, in bytes, of signatures generated and verified by this package.
 | 	// SignatureSize is the size, in bytes, of signatures generated and verified by this package.
 | ||||||
| 	SignatureSize = 64 | 	SignatureSize = 64 | ||||||
|  | 	// SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032.
 | ||||||
|  | 	SeedSize = 32 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // PublicKey is the type of Ed25519 public keys.
 | // PublicKey is the type of Ed25519 public keys.
 | ||||||
| @ -46,6 +51,15 @@ func (priv PrivateKey) Public() crypto.PublicKey { | |||||||
| 	return PublicKey(publicKey) | 	return PublicKey(publicKey) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Seed returns the private key seed corresponding to priv. It is provided for
 | ||||||
|  | // interoperability with RFC 8032. RFC 8032's private keys correspond to seeds
 | ||||||
|  | // in this package.
 | ||||||
|  | func (priv PrivateKey) Seed() []byte { | ||||||
|  | 	seed := make([]byte, SeedSize) | ||||||
|  | 	copy(seed, priv[:32]) | ||||||
|  | 	return seed | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Sign signs the given message with priv.
 | // Sign signs the given message with priv.
 | ||||||
| // Ed25519 performs two passes over messages to be signed and therefore cannot
 | // Ed25519 performs two passes over messages to be signed and therefore cannot
 | ||||||
| // handle pre-hashed messages. Thus opts.HashFunc() must return zero to
 | // handle pre-hashed messages. Thus opts.HashFunc() must return zero to
 | ||||||
| @ -61,19 +75,33 @@ func (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOp | |||||||
| 
 | 
 | ||||||
| // GenerateKey generates a public/private key pair using entropy from rand.
 | // GenerateKey generates a public/private key pair using entropy from rand.
 | ||||||
| // If rand is nil, crypto/rand.Reader will be used.
 | // If rand is nil, crypto/rand.Reader will be used.
 | ||||||
| func GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, err error) { | func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) { | ||||||
| 	if rand == nil { | 	if rand == nil { | ||||||
| 		rand = cryptorand.Reader | 		rand = cryptorand.Reader | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	privateKey = make([]byte, PrivateKeySize) | 	seed := make([]byte, SeedSize) | ||||||
| 	publicKey = make([]byte, PublicKeySize) | 	if _, err := io.ReadFull(rand, seed); err != nil { | ||||||
| 	_, err = io.ReadFull(rand, privateKey[:32]) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	digest := sha512.Sum512(privateKey[:32]) | 	privateKey := NewKeyFromSeed(seed) | ||||||
|  | 	publicKey := make([]byte, PublicKeySize) | ||||||
|  | 	copy(publicKey, privateKey[32:]) | ||||||
|  | 
 | ||||||
|  | 	return publicKey, privateKey, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewKeyFromSeed calculates a private key from a seed. It will panic if
 | ||||||
|  | // len(seed) is not SeedSize. This function is provided for interoperability
 | ||||||
|  | // with RFC 8032. RFC 8032's private keys correspond to seeds in this
 | ||||||
|  | // package.
 | ||||||
|  | func NewKeyFromSeed(seed []byte) PrivateKey { | ||||||
|  | 	if l := len(seed); l != SeedSize { | ||||||
|  | 		panic("ed25519: bad seed length: " + strconv.Itoa(l)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	digest := sha512.Sum512(seed) | ||||||
| 	digest[0] &= 248 | 	digest[0] &= 248 | ||||||
| 	digest[31] &= 127 | 	digest[31] &= 127 | ||||||
| 	digest[31] |= 64 | 	digest[31] |= 64 | ||||||
| @ -85,10 +113,11 @@ func GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, er | |||||||
| 	var publicKeyBytes [32]byte | 	var publicKeyBytes [32]byte | ||||||
| 	A.ToBytes(&publicKeyBytes) | 	A.ToBytes(&publicKeyBytes) | ||||||
| 
 | 
 | ||||||
|  | 	privateKey := make([]byte, PrivateKeySize) | ||||||
|  | 	copy(privateKey, seed) | ||||||
| 	copy(privateKey[32:], publicKeyBytes[:]) | 	copy(privateKey[32:], publicKeyBytes[:]) | ||||||
| 	copy(publicKey, publicKeyBytes[:]) |  | ||||||
| 
 | 
 | ||||||
| 	return publicKey, privateKey, nil | 	return privateKey | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Sign signs the message with privateKey and returns a signature. It will
 | // Sign signs the message with privateKey and returns a signature. It will
 | ||||||
| @ -171,9 +200,16 @@ func Verify(publicKey PublicKey, message, sig []byte) bool { | |||||||
| 	edwards25519.ScReduce(&hReduced, &digest) | 	edwards25519.ScReduce(&hReduced, &digest) | ||||||
| 
 | 
 | ||||||
| 	var R edwards25519.ProjectiveGroupElement | 	var R edwards25519.ProjectiveGroupElement | ||||||
| 	var b [32]byte | 	var s [32]byte | ||||||
| 	copy(b[:], sig[32:]) | 	copy(s[:], sig[32:]) | ||||||
| 	edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &b) | 
 | ||||||
|  | 	// https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that s be in
 | ||||||
|  | 	// the range [0, order) in order to prevent signature malleability.
 | ||||||
|  | 	if !edwards25519.ScMinimal(&s) { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &s) | ||||||
| 
 | 
 | ||||||
| 	var checkR [32]byte | 	var checkR [32]byte | ||||||
| 	R.ToBytes(&checkR) | 	R.ToBytes(&checkR) | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -4,6 +4,8 @@ | |||||||
| 
 | 
 | ||||||
| package edwards25519 | package edwards25519 | ||||||
| 
 | 
 | ||||||
|  | import "encoding/binary" | ||||||
|  | 
 | ||||||
| // This code is a port of the public domain, “ref10” implementation of ed25519
 | // This code is a port of the public domain, “ref10” implementation of ed25519
 | ||||||
| // from SUPERCOP.
 | // from SUPERCOP.
 | ||||||
| 
 | 
 | ||||||
| @ -1769,3 +1771,23 @@ func ScReduce(out *[32]byte, s *[64]byte) { | |||||||
| 	out[30] = byte(s11 >> 9) | 	out[30] = byte(s11 >> 9) | ||||||
| 	out[31] = byte(s11 >> 17) | 	out[31] = byte(s11 >> 17) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // order is the order of Curve25519 in little-endian form.
 | ||||||
|  | var order = [4]uint64{0x5812631a5cf5d3ed, 0x14def9dea2f79cd6, 0, 0x1000000000000000} | ||||||
|  | 
 | ||||||
|  | // ScMinimal returns true if the given scalar is less than the order of the
 | ||||||
|  | // curve.
 | ||||||
|  | func ScMinimal(scalar *[32]byte) bool { | ||||||
|  | 	for i := 3; ; i-- { | ||||||
|  | 		v := binary.LittleEndian.Uint64(scalar[i*8:]) | ||||||
|  | 		if v > order[i] { | ||||||
|  | 			return false | ||||||
|  | 		} else if v < order[i] { | ||||||
|  | 			break | ||||||
|  | 		} else if i == 0 { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										264
									
								
								vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,264 @@ | |||||||
|  | // Copyright 2016 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // Package ChaCha20 implements the core ChaCha20 function as specified
 | ||||||
|  | // in https://tools.ietf.org/html/rfc7539#section-2.3.
 | ||||||
|  | package chacha20 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"crypto/cipher" | ||||||
|  | 	"encoding/binary" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/crypto/internal/subtle" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // assert that *Cipher implements cipher.Stream
 | ||||||
|  | var _ cipher.Stream = (*Cipher)(nil) | ||||||
|  | 
 | ||||||
|  | // Cipher is a stateful instance of ChaCha20 using a particular key
 | ||||||
|  | // and nonce. A *Cipher implements the cipher.Stream interface.
 | ||||||
|  | type Cipher struct { | ||||||
|  | 	key     [8]uint32 | ||||||
|  | 	counter uint32 // incremented after each block
 | ||||||
|  | 	nonce   [3]uint32 | ||||||
|  | 	buf     [bufSize]byte // buffer for unused keystream bytes
 | ||||||
|  | 	len     int           // number of unused keystream bytes at end of buf
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New creates a new ChaCha20 stream cipher with the given key and nonce.
 | ||||||
|  | // The initial counter value is set to 0.
 | ||||||
|  | func New(key [8]uint32, nonce [3]uint32) *Cipher { | ||||||
|  | 	return &Cipher{key: key, nonce: nonce} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ChaCha20 constants spelling "expand 32-byte k"
 | ||||||
|  | const ( | ||||||
|  | 	j0 uint32 = 0x61707865 | ||||||
|  | 	j1 uint32 = 0x3320646e | ||||||
|  | 	j2 uint32 = 0x79622d32 | ||||||
|  | 	j3 uint32 = 0x6b206574 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func quarterRound(a, b, c, d uint32) (uint32, uint32, uint32, uint32) { | ||||||
|  | 	a += b | ||||||
|  | 	d ^= a | ||||||
|  | 	d = (d << 16) | (d >> 16) | ||||||
|  | 	c += d | ||||||
|  | 	b ^= c | ||||||
|  | 	b = (b << 12) | (b >> 20) | ||||||
|  | 	a += b | ||||||
|  | 	d ^= a | ||||||
|  | 	d = (d << 8) | (d >> 24) | ||||||
|  | 	c += d | ||||||
|  | 	b ^= c | ||||||
|  | 	b = (b << 7) | (b >> 25) | ||||||
|  | 	return a, b, c, d | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // XORKeyStream XORs each byte in the given slice with a byte from the
 | ||||||
|  | // cipher's key stream. Dst and src must overlap entirely or not at all.
 | ||||||
|  | //
 | ||||||
|  | // If len(dst) < len(src), XORKeyStream will panic. It is acceptable
 | ||||||
|  | // to pass a dst bigger than src, and in that case, XORKeyStream will
 | ||||||
|  | // only update dst[:len(src)] and will not touch the rest of dst.
 | ||||||
|  | //
 | ||||||
|  | // Multiple calls to XORKeyStream behave as if the concatenation of
 | ||||||
|  | // the src buffers was passed in a single run. That is, Cipher
 | ||||||
|  | // maintains state and does not reset at each XORKeyStream call.
 | ||||||
|  | func (s *Cipher) XORKeyStream(dst, src []byte) { | ||||||
|  | 	if len(dst) < len(src) { | ||||||
|  | 		panic("chacha20: output smaller than input") | ||||||
|  | 	} | ||||||
|  | 	if subtle.InexactOverlap(dst[:len(src)], src) { | ||||||
|  | 		panic("chacha20: invalid buffer overlap") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// xor src with buffered keystream first
 | ||||||
|  | 	if s.len != 0 { | ||||||
|  | 		buf := s.buf[len(s.buf)-s.len:] | ||||||
|  | 		if len(src) < len(buf) { | ||||||
|  | 			buf = buf[:len(src)] | ||||||
|  | 		} | ||||||
|  | 		td, ts := dst[:len(buf)], src[:len(buf)] // BCE hint
 | ||||||
|  | 		for i, b := range buf { | ||||||
|  | 			td[i] = ts[i] ^ b | ||||||
|  | 		} | ||||||
|  | 		s.len -= len(buf) | ||||||
|  | 		if s.len != 0 { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		s.buf = [len(s.buf)]byte{} // zero the empty buffer
 | ||||||
|  | 		src = src[len(buf):] | ||||||
|  | 		dst = dst[len(buf):] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(src) == 0 { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	if haveAsm { | ||||||
|  | 		if uint64(len(src))+uint64(s.counter)*64 > (1<<38)-64 { | ||||||
|  | 			panic("chacha20: counter overflow") | ||||||
|  | 		} | ||||||
|  | 		s.xorKeyStreamAsm(dst, src) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// set up a 64-byte buffer to pad out the final block if needed
 | ||||||
|  | 	// (hoisted out of the main loop to avoid spills)
 | ||||||
|  | 	rem := len(src) % 64  // length of final block
 | ||||||
|  | 	fin := len(src) - rem // index of final block
 | ||||||
|  | 	if rem > 0 { | ||||||
|  | 		copy(s.buf[len(s.buf)-64:], src[fin:]) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// pre-calculate most of the first round
 | ||||||
|  | 	s1, s5, s9, s13 := quarterRound(j1, s.key[1], s.key[5], s.nonce[0]) | ||||||
|  | 	s2, s6, s10, s14 := quarterRound(j2, s.key[2], s.key[6], s.nonce[1]) | ||||||
|  | 	s3, s7, s11, s15 := quarterRound(j3, s.key[3], s.key[7], s.nonce[2]) | ||||||
|  | 
 | ||||||
|  | 	n := len(src) | ||||||
|  | 	src, dst = src[:n:n], dst[:n:n] // BCE hint
 | ||||||
|  | 	for i := 0; i < n; i += 64 { | ||||||
|  | 		// calculate the remainder of the first round
 | ||||||
|  | 		s0, s4, s8, s12 := quarterRound(j0, s.key[0], s.key[4], s.counter) | ||||||
|  | 
 | ||||||
|  | 		// execute the second round
 | ||||||
|  | 		x0, x5, x10, x15 := quarterRound(s0, s5, s10, s15) | ||||||
|  | 		x1, x6, x11, x12 := quarterRound(s1, s6, s11, s12) | ||||||
|  | 		x2, x7, x8, x13 := quarterRound(s2, s7, s8, s13) | ||||||
|  | 		x3, x4, x9, x14 := quarterRound(s3, s4, s9, s14) | ||||||
|  | 
 | ||||||
|  | 		// execute the remaining 18 rounds
 | ||||||
|  | 		for i := 0; i < 9; i++ { | ||||||
|  | 			x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) | ||||||
|  | 			x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) | ||||||
|  | 			x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) | ||||||
|  | 			x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) | ||||||
|  | 
 | ||||||
|  | 			x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) | ||||||
|  | 			x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) | ||||||
|  | 			x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) | ||||||
|  | 			x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		x0 += j0 | ||||||
|  | 		x1 += j1 | ||||||
|  | 		x2 += j2 | ||||||
|  | 		x3 += j3 | ||||||
|  | 
 | ||||||
|  | 		x4 += s.key[0] | ||||||
|  | 		x5 += s.key[1] | ||||||
|  | 		x6 += s.key[2] | ||||||
|  | 		x7 += s.key[3] | ||||||
|  | 		x8 += s.key[4] | ||||||
|  | 		x9 += s.key[5] | ||||||
|  | 		x10 += s.key[6] | ||||||
|  | 		x11 += s.key[7] | ||||||
|  | 
 | ||||||
|  | 		x12 += s.counter | ||||||
|  | 		x13 += s.nonce[0] | ||||||
|  | 		x14 += s.nonce[1] | ||||||
|  | 		x15 += s.nonce[2] | ||||||
|  | 
 | ||||||
|  | 		// increment the counter
 | ||||||
|  | 		s.counter += 1 | ||||||
|  | 		if s.counter == 0 { | ||||||
|  | 			panic("chacha20: counter overflow") | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// pad to 64 bytes if needed
 | ||||||
|  | 		in, out := src[i:], dst[i:] | ||||||
|  | 		if i == fin { | ||||||
|  | 			// src[fin:] has already been copied into s.buf before
 | ||||||
|  | 			// the main loop
 | ||||||
|  | 			in, out = s.buf[len(s.buf)-64:], s.buf[len(s.buf)-64:] | ||||||
|  | 		} | ||||||
|  | 		in, out = in[:64], out[:64] // BCE hint
 | ||||||
|  | 
 | ||||||
|  | 		// XOR the key stream with the source and write out the result
 | ||||||
|  | 		xor(out[0:], in[0:], x0) | ||||||
|  | 		xor(out[4:], in[4:], x1) | ||||||
|  | 		xor(out[8:], in[8:], x2) | ||||||
|  | 		xor(out[12:], in[12:], x3) | ||||||
|  | 		xor(out[16:], in[16:], x4) | ||||||
|  | 		xor(out[20:], in[20:], x5) | ||||||
|  | 		xor(out[24:], in[24:], x6) | ||||||
|  | 		xor(out[28:], in[28:], x7) | ||||||
|  | 		xor(out[32:], in[32:], x8) | ||||||
|  | 		xor(out[36:], in[36:], x9) | ||||||
|  | 		xor(out[40:], in[40:], x10) | ||||||
|  | 		xor(out[44:], in[44:], x11) | ||||||
|  | 		xor(out[48:], in[48:], x12) | ||||||
|  | 		xor(out[52:], in[52:], x13) | ||||||
|  | 		xor(out[56:], in[56:], x14) | ||||||
|  | 		xor(out[60:], in[60:], x15) | ||||||
|  | 	} | ||||||
|  | 	// copy any trailing bytes out of the buffer and into dst
 | ||||||
|  | 	if rem != 0 { | ||||||
|  | 		s.len = 64 - rem | ||||||
|  | 		copy(dst[fin:], s.buf[len(s.buf)-64:]) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Advance discards bytes in the key stream until the next 64 byte block
 | ||||||
|  | // boundary is reached and updates the counter accordingly. If the key
 | ||||||
|  | // stream is already at a block boundary no bytes will be discarded and
 | ||||||
|  | // the counter will be unchanged.
 | ||||||
|  | func (s *Cipher) Advance() { | ||||||
|  | 	s.len -= s.len % 64 | ||||||
|  | 	if s.len == 0 { | ||||||
|  | 		s.buf = [len(s.buf)]byte{} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // XORKeyStream crypts bytes from in to out using the given key and counters.
 | ||||||
|  | // In and out must overlap entirely or not at all. Counter contains the raw
 | ||||||
|  | // ChaCha20 counter bytes (i.e. block counter followed by nonce).
 | ||||||
|  | func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { | ||||||
|  | 	s := Cipher{ | ||||||
|  | 		key: [8]uint32{ | ||||||
|  | 			binary.LittleEndian.Uint32(key[0:4]), | ||||||
|  | 			binary.LittleEndian.Uint32(key[4:8]), | ||||||
|  | 			binary.LittleEndian.Uint32(key[8:12]), | ||||||
|  | 			binary.LittleEndian.Uint32(key[12:16]), | ||||||
|  | 			binary.LittleEndian.Uint32(key[16:20]), | ||||||
|  | 			binary.LittleEndian.Uint32(key[20:24]), | ||||||
|  | 			binary.LittleEndian.Uint32(key[24:28]), | ||||||
|  | 			binary.LittleEndian.Uint32(key[28:32]), | ||||||
|  | 		}, | ||||||
|  | 		nonce: [3]uint32{ | ||||||
|  | 			binary.LittleEndian.Uint32(counter[4:8]), | ||||||
|  | 			binary.LittleEndian.Uint32(counter[8:12]), | ||||||
|  | 			binary.LittleEndian.Uint32(counter[12:16]), | ||||||
|  | 		}, | ||||||
|  | 		counter: binary.LittleEndian.Uint32(counter[0:4]), | ||||||
|  | 	} | ||||||
|  | 	s.XORKeyStream(out, in) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // HChaCha20 uses the ChaCha20 core to generate a derived key from a key and a
 | ||||||
|  | // nonce. It should only be used as part of the XChaCha20 construction.
 | ||||||
|  | func HChaCha20(key *[8]uint32, nonce *[4]uint32) [8]uint32 { | ||||||
|  | 	x0, x1, x2, x3 := j0, j1, j2, j3 | ||||||
|  | 	x4, x5, x6, x7 := key[0], key[1], key[2], key[3] | ||||||
|  | 	x8, x9, x10, x11 := key[4], key[5], key[6], key[7] | ||||||
|  | 	x12, x13, x14, x15 := nonce[0], nonce[1], nonce[2], nonce[3] | ||||||
|  | 
 | ||||||
|  | 	for i := 0; i < 10; i++ { | ||||||
|  | 		x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) | ||||||
|  | 		x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) | ||||||
|  | 		x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) | ||||||
|  | 		x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) | ||||||
|  | 
 | ||||||
|  | 		x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) | ||||||
|  | 		x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) | ||||||
|  | 		x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) | ||||||
|  | 		x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var out [8]uint32 | ||||||
|  | 	out[0], out[1], out[2], out[3] = x0, x1, x2, x3 | ||||||
|  | 	out[4], out[5], out[6], out[7] = x12, x13, x14, x15 | ||||||
|  | 	return out | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // +build !s390x gccgo appengine
 | ||||||
|  | 
 | ||||||
|  | package chacha20 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	bufSize = 64 | ||||||
|  | 	haveAsm = false | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func (*Cipher) xorKeyStreamAsm(dst, src []byte) { | ||||||
|  | 	panic("not implemented") | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // +build s390x,!gccgo,!appengine
 | ||||||
|  | 
 | ||||||
|  | package chacha20 | ||||||
|  | 
 | ||||||
|  | var haveAsm = hasVectorFacility() | ||||||
|  | 
 | ||||||
|  | const bufSize = 256 | ||||||
|  | 
 | ||||||
|  | // hasVectorFacility reports whether the machine supports the vector
 | ||||||
|  | // facility (vx).
 | ||||||
|  | // Implementation in asm_s390x.s.
 | ||||||
|  | func hasVectorFacility() bool | ||||||
|  | 
 | ||||||
|  | // xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only
 | ||||||
|  | // be called when the vector facility is available.
 | ||||||
|  | // Implementation in asm_s390x.s.
 | ||||||
|  | //go:noescape
 | ||||||
|  | func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int) | ||||||
|  | 
 | ||||||
|  | func (c *Cipher) xorKeyStreamAsm(dst, src []byte) { | ||||||
|  | 	xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter, &c.buf, &c.len) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // EXRL targets, DO NOT CALL!
 | ||||||
|  | func mvcSrcToBuf() | ||||||
|  | func mvcBufToDst() | ||||||
							
								
								
									
										283
									
								
								vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,283 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | // +build s390x,!gccgo,!appengine | ||||||
|  | 
 | ||||||
|  | #include "go_asm.h" | ||||||
|  | #include "textflag.h" | ||||||
|  | 
 | ||||||
|  | // This is an implementation of the ChaCha20 encryption algorithm as | ||||||
|  | // specified in RFC 7539. It uses vector instructions to compute | ||||||
|  | // 4 keystream blocks in parallel (256 bytes) which are then XORed | ||||||
|  | // with the bytes in the input slice. | ||||||
|  | 
 | ||||||
|  | GLOBL ·constants<>(SB), RODATA|NOPTR, $32 | ||||||
|  | // BSWAP: swap bytes in each 4-byte element | ||||||
|  | DATA ·constants<>+0x00(SB)/4, $0x03020100 | ||||||
|  | DATA ·constants<>+0x04(SB)/4, $0x07060504 | ||||||
|  | DATA ·constants<>+0x08(SB)/4, $0x0b0a0908 | ||||||
|  | DATA ·constants<>+0x0c(SB)/4, $0x0f0e0d0c | ||||||
|  | // J0: [j0, j1, j2, j3] | ||||||
|  | DATA ·constants<>+0x10(SB)/4, $0x61707865 | ||||||
|  | DATA ·constants<>+0x14(SB)/4, $0x3320646e | ||||||
|  | DATA ·constants<>+0x18(SB)/4, $0x79622d32 | ||||||
|  | DATA ·constants<>+0x1c(SB)/4, $0x6b206574 | ||||||
|  | 
 | ||||||
|  | // EXRL targets: | ||||||
|  | TEXT ·mvcSrcToBuf(SB), NOFRAME|NOSPLIT, $0 | ||||||
|  | 	MVC $1, (R1), (R8) | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | TEXT ·mvcBufToDst(SB), NOFRAME|NOSPLIT, $0 | ||||||
|  | 	MVC $1, (R8), (R9) | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | #define BSWAP V5 | ||||||
|  | #define J0    V6 | ||||||
|  | #define KEY0  V7 | ||||||
|  | #define KEY1  V8 | ||||||
|  | #define NONCE V9 | ||||||
|  | #define CTR   V10 | ||||||
|  | #define M0    V11 | ||||||
|  | #define M1    V12 | ||||||
|  | #define M2    V13 | ||||||
|  | #define M3    V14 | ||||||
|  | #define INC   V15 | ||||||
|  | #define X0    V16 | ||||||
|  | #define X1    V17 | ||||||
|  | #define X2    V18 | ||||||
|  | #define X3    V19 | ||||||
|  | #define X4    V20 | ||||||
|  | #define X5    V21 | ||||||
|  | #define X6    V22 | ||||||
|  | #define X7    V23 | ||||||
|  | #define X8    V24 | ||||||
|  | #define X9    V25 | ||||||
|  | #define X10   V26 | ||||||
|  | #define X11   V27 | ||||||
|  | #define X12   V28 | ||||||
|  | #define X13   V29 | ||||||
|  | #define X14   V30 | ||||||
|  | #define X15   V31 | ||||||
|  | 
 | ||||||
|  | #define NUM_ROUNDS 20 | ||||||
|  | 
 | ||||||
|  | #define ROUND4(a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3) \ | ||||||
|  | 	VAF    a1, a0, a0  \ | ||||||
|  | 	VAF    b1, b0, b0  \ | ||||||
|  | 	VAF    c1, c0, c0  \ | ||||||
|  | 	VAF    d1, d0, d0  \ | ||||||
|  | 	VX     a0, a2, a2  \ | ||||||
|  | 	VX     b0, b2, b2  \ | ||||||
|  | 	VX     c0, c2, c2  \ | ||||||
|  | 	VX     d0, d2, d2  \ | ||||||
|  | 	VERLLF $16, a2, a2 \ | ||||||
|  | 	VERLLF $16, b2, b2 \ | ||||||
|  | 	VERLLF $16, c2, c2 \ | ||||||
|  | 	VERLLF $16, d2, d2 \ | ||||||
|  | 	VAF    a2, a3, a3  \ | ||||||
|  | 	VAF    b2, b3, b3  \ | ||||||
|  | 	VAF    c2, c3, c3  \ | ||||||
|  | 	VAF    d2, d3, d3  \ | ||||||
|  | 	VX     a3, a1, a1  \ | ||||||
|  | 	VX     b3, b1, b1  \ | ||||||
|  | 	VX     c3, c1, c1  \ | ||||||
|  | 	VX     d3, d1, d1  \ | ||||||
|  | 	VERLLF $12, a1, a1 \ | ||||||
|  | 	VERLLF $12, b1, b1 \ | ||||||
|  | 	VERLLF $12, c1, c1 \ | ||||||
|  | 	VERLLF $12, d1, d1 \ | ||||||
|  | 	VAF    a1, a0, a0  \ | ||||||
|  | 	VAF    b1, b0, b0  \ | ||||||
|  | 	VAF    c1, c0, c0  \ | ||||||
|  | 	VAF    d1, d0, d0  \ | ||||||
|  | 	VX     a0, a2, a2  \ | ||||||
|  | 	VX     b0, b2, b2  \ | ||||||
|  | 	VX     c0, c2, c2  \ | ||||||
|  | 	VX     d0, d2, d2  \ | ||||||
|  | 	VERLLF $8, a2, a2  \ | ||||||
|  | 	VERLLF $8, b2, b2  \ | ||||||
|  | 	VERLLF $8, c2, c2  \ | ||||||
|  | 	VERLLF $8, d2, d2  \ | ||||||
|  | 	VAF    a2, a3, a3  \ | ||||||
|  | 	VAF    b2, b3, b3  \ | ||||||
|  | 	VAF    c2, c3, c3  \ | ||||||
|  | 	VAF    d2, d3, d3  \ | ||||||
|  | 	VX     a3, a1, a1  \ | ||||||
|  | 	VX     b3, b1, b1  \ | ||||||
|  | 	VX     c3, c1, c1  \ | ||||||
|  | 	VX     d3, d1, d1  \ | ||||||
|  | 	VERLLF $7, a1, a1  \ | ||||||
|  | 	VERLLF $7, b1, b1  \ | ||||||
|  | 	VERLLF $7, c1, c1  \ | ||||||
|  | 	VERLLF $7, d1, d1 | ||||||
|  | 
 | ||||||
|  | #define PERMUTE(mask, v0, v1, v2, v3) \ | ||||||
|  | 	VPERM v0, v0, mask, v0 \ | ||||||
|  | 	VPERM v1, v1, mask, v1 \ | ||||||
|  | 	VPERM v2, v2, mask, v2 \ | ||||||
|  | 	VPERM v3, v3, mask, v3 | ||||||
|  | 
 | ||||||
|  | #define ADDV(x, v0, v1, v2, v3) \ | ||||||
|  | 	VAF x, v0, v0 \ | ||||||
|  | 	VAF x, v1, v1 \ | ||||||
|  | 	VAF x, v2, v2 \ | ||||||
|  | 	VAF x, v3, v3 | ||||||
|  | 
 | ||||||
|  | #define XORV(off, dst, src, v0, v1, v2, v3) \ | ||||||
|  | 	VLM  off(src), M0, M3          \ | ||||||
|  | 	PERMUTE(BSWAP, v0, v1, v2, v3) \ | ||||||
|  | 	VX   v0, M0, M0                \ | ||||||
|  | 	VX   v1, M1, M1                \ | ||||||
|  | 	VX   v2, M2, M2                \ | ||||||
|  | 	VX   v3, M3, M3                \ | ||||||
|  | 	VSTM M0, M3, off(dst) | ||||||
|  | 
 | ||||||
|  | #define SHUFFLE(a, b, c, d, t, u, v, w) \ | ||||||
|  | 	VMRHF a, c, t \ // t = {a[0], c[0], a[1], c[1]} | ||||||
|  | 	VMRHF b, d, u \ // u = {b[0], d[0], b[1], d[1]} | ||||||
|  | 	VMRLF a, c, v \ // v = {a[2], c[2], a[3], c[3]} | ||||||
|  | 	VMRLF b, d, w \ // w = {b[2], d[2], b[3], d[3]} | ||||||
|  | 	VMRHF t, u, a \ // a = {a[0], b[0], c[0], d[0]} | ||||||
|  | 	VMRLF t, u, b \ // b = {a[1], b[1], c[1], d[1]} | ||||||
|  | 	VMRHF v, w, c \ // c = {a[2], b[2], c[2], d[2]} | ||||||
|  | 	VMRLF v, w, d // d = {a[3], b[3], c[3], d[3]} | ||||||
|  | 
 | ||||||
|  | // func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int) | ||||||
|  | TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 | ||||||
|  | 	MOVD $·constants<>(SB), R1 | ||||||
|  | 	MOVD dst+0(FP), R2         // R2=&dst[0] | ||||||
|  | 	LMG  src+24(FP), R3, R4    // R3=&src[0] R4=len(src) | ||||||
|  | 	MOVD key+48(FP), R5        // R5=key | ||||||
|  | 	MOVD nonce+56(FP), R6      // R6=nonce | ||||||
|  | 	MOVD counter+64(FP), R7    // R7=counter | ||||||
|  | 	MOVD buf+72(FP), R8        // R8=buf | ||||||
|  | 	MOVD len+80(FP), R9        // R9=len | ||||||
|  | 
 | ||||||
|  | 	// load BSWAP and J0 | ||||||
|  | 	VLM (R1), BSWAP, J0 | ||||||
|  | 
 | ||||||
|  | 	// set up tail buffer | ||||||
|  | 	ADD     $-1, R4, R12 | ||||||
|  | 	MOVBZ   R12, R12 | ||||||
|  | 	CMPUBEQ R12, $255, aligned | ||||||
|  | 	MOVD    R4, R1 | ||||||
|  | 	AND     $~255, R1 | ||||||
|  | 	MOVD    $(R3)(R1*1), R1 | ||||||
|  | 	EXRL    $·mvcSrcToBuf(SB), R12 | ||||||
|  | 	MOVD    $255, R0 | ||||||
|  | 	SUB     R12, R0 | ||||||
|  | 	MOVD    R0, (R9)               // update len | ||||||
|  | 
 | ||||||
|  | aligned: | ||||||
|  | 	// setup | ||||||
|  | 	MOVD  $95, R0 | ||||||
|  | 	VLM   (R5), KEY0, KEY1 | ||||||
|  | 	VLL   R0, (R6), NONCE | ||||||
|  | 	VZERO M0 | ||||||
|  | 	VLEIB $7, $32, M0 | ||||||
|  | 	VSRLB M0, NONCE, NONCE | ||||||
|  | 
 | ||||||
|  | 	// initialize counter values | ||||||
|  | 	VLREPF (R7), CTR | ||||||
|  | 	VZERO  INC | ||||||
|  | 	VLEIF  $1, $1, INC | ||||||
|  | 	VLEIF  $2, $2, INC | ||||||
|  | 	VLEIF  $3, $3, INC | ||||||
|  | 	VAF    INC, CTR, CTR | ||||||
|  | 	VREPIF $4, INC | ||||||
|  | 
 | ||||||
|  | chacha: | ||||||
|  | 	VREPF $0, J0, X0 | ||||||
|  | 	VREPF $1, J0, X1 | ||||||
|  | 	VREPF $2, J0, X2 | ||||||
|  | 	VREPF $3, J0, X3 | ||||||
|  | 	VREPF $0, KEY0, X4 | ||||||
|  | 	VREPF $1, KEY0, X5 | ||||||
|  | 	VREPF $2, KEY0, X6 | ||||||
|  | 	VREPF $3, KEY0, X7 | ||||||
|  | 	VREPF $0, KEY1, X8 | ||||||
|  | 	VREPF $1, KEY1, X9 | ||||||
|  | 	VREPF $2, KEY1, X10 | ||||||
|  | 	VREPF $3, KEY1, X11 | ||||||
|  | 	VLR   CTR, X12 | ||||||
|  | 	VREPF $1, NONCE, X13 | ||||||
|  | 	VREPF $2, NONCE, X14 | ||||||
|  | 	VREPF $3, NONCE, X15 | ||||||
|  | 
 | ||||||
|  | 	MOVD $(NUM_ROUNDS/2), R1 | ||||||
|  | 
 | ||||||
|  | loop: | ||||||
|  | 	ROUND4(X0, X4, X12,  X8, X1, X5, X13,  X9, X2, X6, X14, X10, X3, X7, X15, X11) | ||||||
|  | 	ROUND4(X0, X5, X15, X10, X1, X6, X12, X11, X2, X7, X13, X8,  X3, X4, X14, X9) | ||||||
|  | 
 | ||||||
|  | 	ADD $-1, R1 | ||||||
|  | 	BNE loop | ||||||
|  | 
 | ||||||
|  | 	// decrement length | ||||||
|  | 	ADD $-256, R4 | ||||||
|  | 	BLT tail | ||||||
|  | 
 | ||||||
|  | continue: | ||||||
|  | 	// rearrange vectors | ||||||
|  | 	SHUFFLE(X0, X1, X2, X3, M0, M1, M2, M3) | ||||||
|  | 	ADDV(J0, X0, X1, X2, X3) | ||||||
|  | 	SHUFFLE(X4, X5, X6, X7, M0, M1, M2, M3) | ||||||
|  | 	ADDV(KEY0, X4, X5, X6, X7) | ||||||
|  | 	SHUFFLE(X8, X9, X10, X11, M0, M1, M2, M3) | ||||||
|  | 	ADDV(KEY1, X8, X9, X10, X11) | ||||||
|  | 	VAF CTR, X12, X12 | ||||||
|  | 	SHUFFLE(X12, X13, X14, X15, M0, M1, M2, M3) | ||||||
|  | 	ADDV(NONCE, X12, X13, X14, X15) | ||||||
|  | 
 | ||||||
|  | 	// increment counters | ||||||
|  | 	VAF INC, CTR, CTR | ||||||
|  | 
 | ||||||
|  | 	// xor keystream with plaintext | ||||||
|  | 	XORV(0*64, R2, R3, X0, X4,  X8, X12) | ||||||
|  | 	XORV(1*64, R2, R3, X1, X5,  X9, X13) | ||||||
|  | 	XORV(2*64, R2, R3, X2, X6, X10, X14) | ||||||
|  | 	XORV(3*64, R2, R3, X3, X7, X11, X15) | ||||||
|  | 
 | ||||||
|  | 	// increment pointers | ||||||
|  | 	MOVD $256(R2), R2 | ||||||
|  | 	MOVD $256(R3), R3 | ||||||
|  | 
 | ||||||
|  | 	CMPBNE  R4, $0, chacha | ||||||
|  | 	CMPUBEQ R12, $255, return | ||||||
|  | 	EXRL    $·mvcBufToDst(SB), R12 // len was updated during setup | ||||||
|  | 
 | ||||||
|  | return: | ||||||
|  | 	VSTEF $0, CTR, (R7) | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | tail: | ||||||
|  | 	MOVD R2, R9 | ||||||
|  | 	MOVD R8, R2 | ||||||
|  | 	MOVD R8, R3 | ||||||
|  | 	MOVD $0, R4 | ||||||
|  | 	JMP  continue | ||||||
|  | 
 | ||||||
|  | // func hasVectorFacility() bool | ||||||
|  | TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1 | ||||||
|  | 	MOVD  $x-24(SP), R1 | ||||||
|  | 	XC    $24, 0(R1), 0(R1) // clear the storage | ||||||
|  | 	MOVD  $2, R0            // R0 is the number of double words stored -1 | ||||||
|  | 	WORD  $0xB2B01000       // STFLE 0(R1) | ||||||
|  | 	XOR   R0, R0            // reset the value of R0 | ||||||
|  | 	MOVBZ z-8(SP), R1 | ||||||
|  | 	AND   $0x40, R1 | ||||||
|  | 	BEQ   novector | ||||||
|  | 
 | ||||||
|  | vectorinstalled: | ||||||
|  | 	// check if the vector instruction has been enabled | ||||||
|  | 	VLEIB  $0, $0xF, V16 | ||||||
|  | 	VLGVB  $0, V16, R1 | ||||||
|  | 	CMPBNE R1, $0xF, novector | ||||||
|  | 	MOVB   $1, ret+0(FP)      // have vx | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | novector: | ||||||
|  | 	MOVB $0, ret+0(FP) // no vx | ||||||
|  | 	RET | ||||||
							
								
								
									
										43
									
								
								vendor/golang.org/x/crypto/internal/chacha20/xor.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								vendor/golang.org/x/crypto/internal/chacha20/xor.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found src the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | package chacha20 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"runtime" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Platforms that have fast unaligned 32-bit little endian accesses.
 | ||||||
|  | const unaligned = runtime.GOARCH == "386" || | ||||||
|  | 	runtime.GOARCH == "amd64" || | ||||||
|  | 	runtime.GOARCH == "arm64" || | ||||||
|  | 	runtime.GOARCH == "ppc64le" || | ||||||
|  | 	runtime.GOARCH == "s390x" | ||||||
|  | 
 | ||||||
|  | // xor reads a little endian uint32 from src, XORs it with u and
 | ||||||
|  | // places the result in little endian byte order in dst.
 | ||||||
|  | func xor(dst, src []byte, u uint32) { | ||||||
|  | 	_, _ = src[3], dst[3] // eliminate bounds checks
 | ||||||
|  | 	if unaligned { | ||||||
|  | 		// The compiler should optimize this code into
 | ||||||
|  | 		// 32-bit unaligned little endian loads and stores.
 | ||||||
|  | 		// TODO: delete once the compiler does a reliably
 | ||||||
|  | 		// good job with the generic code below.
 | ||||||
|  | 		// See issue #25111 for more details.
 | ||||||
|  | 		v := uint32(src[0]) | ||||||
|  | 		v |= uint32(src[1]) << 8 | ||||||
|  | 		v |= uint32(src[2]) << 16 | ||||||
|  | 		v |= uint32(src[3]) << 24 | ||||||
|  | 		v ^= u | ||||||
|  | 		dst[0] = byte(v) | ||||||
|  | 		dst[1] = byte(v >> 8) | ||||||
|  | 		dst[2] = byte(v >> 16) | ||||||
|  | 		dst[3] = byte(v >> 24) | ||||||
|  | 	} else { | ||||||
|  | 		dst[0] = src[0] ^ byte(u) | ||||||
|  | 		dst[1] = src[1] ^ byte(u>>8) | ||||||
|  | 		dst[2] = src[2] ^ byte(u>>16) | ||||||
|  | 		dst[3] = src[3] ^ byte(u>>24) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										32
									
								
								vendor/golang.org/x/crypto/internal/subtle/aliasing.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								vendor/golang.org/x/crypto/internal/subtle/aliasing.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // +build !appengine
 | ||||||
|  | 
 | ||||||
|  | // Package subtle implements functions that are often useful in cryptographic
 | ||||||
|  | // code but require careful thought to use correctly.
 | ||||||
|  | package subtle // import "golang.org/x/crypto/internal/subtle"
 | ||||||
|  | 
 | ||||||
|  | import "unsafe" | ||||||
|  | 
 | ||||||
|  | // AnyOverlap reports whether x and y share memory at any (not necessarily
 | ||||||
|  | // corresponding) index. The memory beyond the slice length is ignored.
 | ||||||
|  | func AnyOverlap(x, y []byte) bool { | ||||||
|  | 	return len(x) > 0 && len(y) > 0 && | ||||||
|  | 		uintptr(unsafe.Pointer(&x[0])) <= uintptr(unsafe.Pointer(&y[len(y)-1])) && | ||||||
|  | 		uintptr(unsafe.Pointer(&y[0])) <= uintptr(unsafe.Pointer(&x[len(x)-1])) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // InexactOverlap reports whether x and y share memory at any non-corresponding
 | ||||||
|  | // index. The memory beyond the slice length is ignored. Note that x and y can
 | ||||||
|  | // have different lengths and still not have any inexact overlap.
 | ||||||
|  | //
 | ||||||
|  | // InexactOverlap can be used to implement the requirements of the crypto/cipher
 | ||||||
|  | // AEAD, Block, BlockMode and Stream interfaces.
 | ||||||
|  | func InexactOverlap(x, y []byte) bool { | ||||||
|  | 	if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	return AnyOverlap(x, y) | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // +build appengine
 | ||||||
|  | 
 | ||||||
|  | // Package subtle implements functions that are often useful in cryptographic
 | ||||||
|  | // code but require careful thought to use correctly.
 | ||||||
|  | package subtle // import "golang.org/x/crypto/internal/subtle"
 | ||||||
|  | 
 | ||||||
|  | // This is the Google App Engine standard variant based on reflect
 | ||||||
|  | // because the unsafe package and cgo are disallowed.
 | ||||||
|  | 
 | ||||||
|  | import "reflect" | ||||||
|  | 
 | ||||||
|  | // AnyOverlap reports whether x and y share memory at any (not necessarily
 | ||||||
|  | // corresponding) index. The memory beyond the slice length is ignored.
 | ||||||
|  | func AnyOverlap(x, y []byte) bool { | ||||||
|  | 	return len(x) > 0 && len(y) > 0 && | ||||||
|  | 		reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() && | ||||||
|  | 		reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // InexactOverlap reports whether x and y share memory at any non-corresponding
 | ||||||
|  | // index. The memory beyond the slice length is ignored. Note that x and y can
 | ||||||
|  | // have different lengths and still not have any inexact overlap.
 | ||||||
|  | //
 | ||||||
|  | // InexactOverlap can be used to implement the requirements of the crypto/cipher
 | ||||||
|  | // AEAD, Block, BlockMode and Stream interfaces.
 | ||||||
|  | func InexactOverlap(x, y []byte) bool { | ||||||
|  | 	if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	return AnyOverlap(x, y) | ||||||
|  | } | ||||||
							
								
								
									
										168
									
								
								vendor/golang.org/x/crypto/openpgp/keys.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										168
									
								
								vendor/golang.org/x/crypto/openpgp/keys.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -325,16 +325,14 @@ func ReadEntity(packets *packet.Reader) (*Entity, error) { | |||||||
| 		if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok { | 		if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok { | ||||||
| 			packets.Unread(p) | 			packets.Unread(p) | ||||||
| 			return nil, errors.StructuralError("first packet was not a public/private key") | 			return nil, errors.StructuralError("first packet was not a public/private key") | ||||||
| 		} else { |  | ||||||
| 			e.PrimaryKey = &e.PrivateKey.PublicKey |  | ||||||
| 		} | 		} | ||||||
|  | 		e.PrimaryKey = &e.PrivateKey.PublicKey | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if !e.PrimaryKey.PubKeyAlgo.CanSign() { | 	if !e.PrimaryKey.PubKeyAlgo.CanSign() { | ||||||
| 		return nil, errors.StructuralError("primary key cannot be used for signatures") | 		return nil, errors.StructuralError("primary key cannot be used for signatures") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var current *Identity |  | ||||||
| 	var revocations []*packet.Signature | 	var revocations []*packet.Signature | ||||||
| EachPacket: | EachPacket: | ||||||
| 	for { | 	for { | ||||||
| @ -347,32 +345,8 @@ EachPacket: | |||||||
| 
 | 
 | ||||||
| 		switch pkt := p.(type) { | 		switch pkt := p.(type) { | ||||||
| 		case *packet.UserId: | 		case *packet.UserId: | ||||||
| 			current = new(Identity) | 			if err := addUserID(e, packets, pkt); err != nil { | ||||||
| 			current.Name = pkt.Id | 				return nil, err | ||||||
| 			current.UserId = pkt |  | ||||||
| 			e.Identities[pkt.Id] = current |  | ||||||
| 
 |  | ||||||
| 			for { |  | ||||||
| 				p, err = packets.Next() |  | ||||||
| 				if err == io.EOF { |  | ||||||
| 					return nil, io.ErrUnexpectedEOF |  | ||||||
| 				} else if err != nil { |  | ||||||
| 					return nil, err |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				sig, ok := p.(*packet.Signature) |  | ||||||
| 				if !ok { |  | ||||||
| 					return nil, errors.StructuralError("user ID packet not followed by self-signature") |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				if (sig.SigType == packet.SigTypePositiveCert || sig.SigType == packet.SigTypeGenericCert) && sig.IssuerKeyId != nil && *sig.IssuerKeyId == e.PrimaryKey.KeyId { |  | ||||||
| 					if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { |  | ||||||
| 						return nil, errors.StructuralError("user ID self-signature invalid: " + err.Error()) |  | ||||||
| 					} |  | ||||||
| 					current.SelfSignature = sig |  | ||||||
| 					break |  | ||||||
| 				} |  | ||||||
| 				current.Signatures = append(current.Signatures, sig) |  | ||||||
| 			} | 			} | ||||||
| 		case *packet.Signature: | 		case *packet.Signature: | ||||||
| 			if pkt.SigType == packet.SigTypeKeyRevocation { | 			if pkt.SigType == packet.SigTypeKeyRevocation { | ||||||
| @ -381,11 +355,9 @@ EachPacket: | |||||||
| 				// TODO: RFC4880 5.2.1 permits signatures
 | 				// TODO: RFC4880 5.2.1 permits signatures
 | ||||||
| 				// directly on keys (eg. to bind additional
 | 				// directly on keys (eg. to bind additional
 | ||||||
| 				// revocation keys).
 | 				// revocation keys).
 | ||||||
| 			} else if current == nil { |  | ||||||
| 				return nil, errors.StructuralError("signature packet found before user id packet") |  | ||||||
| 			} else { |  | ||||||
| 				current.Signatures = append(current.Signatures, pkt) |  | ||||||
| 			} | 			} | ||||||
|  | 			// Else, ignoring the signature as it does not follow anything
 | ||||||
|  | 			// we would know to attach it to.
 | ||||||
| 		case *packet.PrivateKey: | 		case *packet.PrivateKey: | ||||||
| 			if pkt.IsSubkey == false { | 			if pkt.IsSubkey == false { | ||||||
| 				packets.Unread(p) | 				packets.Unread(p) | ||||||
| @ -426,33 +398,105 @@ EachPacket: | |||||||
| 	return e, nil | 	return e, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func addUserID(e *Entity, packets *packet.Reader, pkt *packet.UserId) error { | ||||||
|  | 	// Make a new Identity object, that we might wind up throwing away.
 | ||||||
|  | 	// We'll only add it if we get a valid self-signature over this
 | ||||||
|  | 	// userID.
 | ||||||
|  | 	identity := new(Identity) | ||||||
|  | 	identity.Name = pkt.Id | ||||||
|  | 	identity.UserId = pkt | ||||||
|  | 
 | ||||||
|  | 	for { | ||||||
|  | 		p, err := packets.Next() | ||||||
|  | 		if err == io.EOF { | ||||||
|  | 			break | ||||||
|  | 		} else if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		sig, ok := p.(*packet.Signature) | ||||||
|  | 		if !ok { | ||||||
|  | 			packets.Unread(p) | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (sig.SigType == packet.SigTypePositiveCert || sig.SigType == packet.SigTypeGenericCert) && sig.IssuerKeyId != nil && *sig.IssuerKeyId == e.PrimaryKey.KeyId { | ||||||
|  | 			if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { | ||||||
|  | 				return errors.StructuralError("user ID self-signature invalid: " + err.Error()) | ||||||
|  | 			} | ||||||
|  | 			identity.SelfSignature = sig | ||||||
|  | 			e.Identities[pkt.Id] = identity | ||||||
|  | 		} else { | ||||||
|  | 			identity.Signatures = append(identity.Signatures, sig) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error { | func addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error { | ||||||
| 	var subKey Subkey | 	var subKey Subkey | ||||||
| 	subKey.PublicKey = pub | 	subKey.PublicKey = pub | ||||||
| 	subKey.PrivateKey = priv | 	subKey.PrivateKey = priv | ||||||
| 	p, err := packets.Next() | 
 | ||||||
| 	if err == io.EOF { | 	for { | ||||||
| 		return io.ErrUnexpectedEOF | 		p, err := packets.Next() | ||||||
|  | 		if err == io.EOF { | ||||||
|  | 			break | ||||||
|  | 		} else if err != nil { | ||||||
|  | 			return errors.StructuralError("subkey signature invalid: " + err.Error()) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		sig, ok := p.(*packet.Signature) | ||||||
|  | 		if !ok { | ||||||
|  | 			packets.Unread(p) | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if sig.SigType != packet.SigTypeSubkeyBinding && sig.SigType != packet.SigTypeSubkeyRevocation { | ||||||
|  | 			return errors.StructuralError("subkey signature with wrong type") | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if err := e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, sig); err != nil { | ||||||
|  | 			return errors.StructuralError("subkey signature invalid: " + err.Error()) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		switch sig.SigType { | ||||||
|  | 		case packet.SigTypeSubkeyRevocation: | ||||||
|  | 			subKey.Sig = sig | ||||||
|  | 		case packet.SigTypeSubkeyBinding: | ||||||
|  | 
 | ||||||
|  | 			if shouldReplaceSubkeySig(subKey.Sig, sig) { | ||||||
|  | 				subKey.Sig = sig | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	if err != nil { | 
 | ||||||
| 		return errors.StructuralError("subkey signature invalid: " + err.Error()) | 	if subKey.Sig == nil { | ||||||
| 	} |  | ||||||
| 	var ok bool |  | ||||||
| 	subKey.Sig, ok = p.(*packet.Signature) |  | ||||||
| 	if !ok { |  | ||||||
| 		return errors.StructuralError("subkey packet not followed by signature") | 		return errors.StructuralError("subkey packet not followed by signature") | ||||||
| 	} | 	} | ||||||
| 	if subKey.Sig.SigType != packet.SigTypeSubkeyBinding && subKey.Sig.SigType != packet.SigTypeSubkeyRevocation { | 
 | ||||||
| 		return errors.StructuralError("subkey signature with wrong type") |  | ||||||
| 	} |  | ||||||
| 	err = e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, subKey.Sig) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return errors.StructuralError("subkey signature invalid: " + err.Error()) |  | ||||||
| 	} |  | ||||||
| 	e.Subkeys = append(e.Subkeys, subKey) | 	e.Subkeys = append(e.Subkeys, subKey) | ||||||
|  | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func shouldReplaceSubkeySig(existingSig, potentialNewSig *packet.Signature) bool { | ||||||
|  | 	if potentialNewSig == nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if existingSig == nil { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if existingSig.SigType == packet.SigTypeSubkeyRevocation { | ||||||
|  | 		return false // never override a revocation signature
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return potentialNewSig.CreationTime.After(existingSig.CreationTime) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const defaultRSAKeyBits = 2048 | const defaultRSAKeyBits = 2048 | ||||||
| 
 | 
 | ||||||
| // NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a
 | // NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a
 | ||||||
| @ -487,7 +531,7 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err | |||||||
| 	} | 	} | ||||||
| 	isPrimaryId := true | 	isPrimaryId := true | ||||||
| 	e.Identities[uid.Id] = &Identity{ | 	e.Identities[uid.Id] = &Identity{ | ||||||
| 		Name:   uid.Name, | 		Name:   uid.Id, | ||||||
| 		UserId: uid, | 		UserId: uid, | ||||||
| 		SelfSignature: &packet.Signature{ | 		SelfSignature: &packet.Signature{ | ||||||
| 			CreationTime: currentTime, | 			CreationTime: currentTime, | ||||||
| @ -501,6 +545,10 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err | |||||||
| 			IssuerKeyId:  &e.PrimaryKey.KeyId, | 			IssuerKeyId:  &e.PrimaryKey.KeyId, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  | 	err = e.Identities[uid.Id].SelfSignature.SignUserId(uid.Id, e.PrimaryKey, e.PrivateKey, config) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	// If the user passes in a DefaultHash via packet.Config,
 | 	// If the user passes in a DefaultHash via packet.Config,
 | ||||||
| 	// set the PreferredHash for the SelfSignature.
 | 	// set the PreferredHash for the SelfSignature.
 | ||||||
| @ -508,6 +556,11 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err | |||||||
| 		e.Identities[uid.Id].SelfSignature.PreferredHash = []uint8{hashToHashId(config.DefaultHash)} | 		e.Identities[uid.Id].SelfSignature.PreferredHash = []uint8{hashToHashId(config.DefaultHash)} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Likewise for DefaultCipher.
 | ||||||
|  | 	if config != nil && config.DefaultCipher != 0 { | ||||||
|  | 		e.Identities[uid.Id].SelfSignature.PreferredSymmetric = []uint8{uint8(config.DefaultCipher)} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	e.Subkeys = make([]Subkey, 1) | 	e.Subkeys = make([]Subkey, 1) | ||||||
| 	e.Subkeys[0] = Subkey{ | 	e.Subkeys[0] = Subkey{ | ||||||
| 		PublicKey:  packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey), | 		PublicKey:  packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey), | ||||||
| @ -525,13 +578,16 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err | |||||||
| 	} | 	} | ||||||
| 	e.Subkeys[0].PublicKey.IsSubkey = true | 	e.Subkeys[0].PublicKey.IsSubkey = true | ||||||
| 	e.Subkeys[0].PrivateKey.IsSubkey = true | 	e.Subkeys[0].PrivateKey.IsSubkey = true | ||||||
| 
 | 	err = e.Subkeys[0].Sig.SignKey(e.Subkeys[0].PublicKey, e.PrivateKey, config) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
| 	return e, nil | 	return e, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // SerializePrivate serializes an Entity, including private key material, to
 | // SerializePrivate serializes an Entity, including private key material, but
 | ||||||
| // the given Writer. For now, it must only be used on an Entity returned from
 | // excluding signatures from other entities, to the given Writer.
 | ||||||
| // NewEntity.
 | // Identities and subkeys are re-signed in case they changed since NewEntry.
 | ||||||
| // If config is nil, sensible defaults will be used.
 | // If config is nil, sensible defaults will be used.
 | ||||||
| func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) { | func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) { | ||||||
| 	err = e.PrivateKey.Serialize(w) | 	err = e.PrivateKey.Serialize(w) | ||||||
| @ -569,8 +625,8 @@ func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Serialize writes the public part of the given Entity to w. (No private
 | // Serialize writes the public part of the given Entity to w, including
 | ||||||
| // key material will be output).
 | // signatures from other entities. No private key material will be output.
 | ||||||
| func (e *Entity) Serialize(w io.Writer) error { | func (e *Entity) Serialize(w io.Writer) error { | ||||||
| 	err := e.PrimaryKey.Serialize(w) | 	err := e.PrimaryKey.Serialize(w) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -42,12 +42,18 @@ func (e *EncryptedKey) parse(r io.Reader) (err error) { | |||||||
| 	switch e.Algo { | 	switch e.Algo { | ||||||
| 	case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: | 	case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: | ||||||
| 		e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) | 		e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
| 	case PubKeyAlgoElGamal: | 	case PubKeyAlgoElGamal: | ||||||
| 		e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) | 		e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		e.encryptedMPI2.bytes, e.encryptedMPI2.bitLength, err = readMPI(r) | 		e.encryptedMPI2.bytes, e.encryptedMPI2.bitLength, err = readMPI(r) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	_, err = consumeAll(r) | 	_, err = consumeAll(r) | ||||||
| 	return | 	return | ||||||
| @ -72,7 +78,8 @@ func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error { | |||||||
| 	// padding oracle attacks.
 | 	// padding oracle attacks.
 | ||||||
| 	switch priv.PubKeyAlgo { | 	switch priv.PubKeyAlgo { | ||||||
| 	case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: | 	case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: | ||||||
| 		b, err = rsa.DecryptPKCS1v15(config.Random(), priv.PrivateKey.(*rsa.PrivateKey), e.encryptedMPI1.bytes) | 		k := priv.PrivateKey.(*rsa.PrivateKey) | ||||||
|  | 		b, err = rsa.DecryptPKCS1v15(config.Random(), k, padToKeySize(&k.PublicKey, e.encryptedMPI1.bytes)) | ||||||
| 	case PubKeyAlgoElGamal: | 	case PubKeyAlgoElGamal: | ||||||
| 		c1 := new(big.Int).SetBytes(e.encryptedMPI1.bytes) | 		c1 := new(big.Int).SetBytes(e.encryptedMPI1.bytes) | ||||||
| 		c2 := new(big.Int).SetBytes(e.encryptedMPI2.bytes) | 		c2 := new(big.Int).SetBytes(e.encryptedMPI2.bytes) | ||||||
|  | |||||||
							
								
								
									
										44
									
								
								vendor/golang.org/x/crypto/openpgp/packet/packet.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/golang.org/x/crypto/openpgp/packet/packet.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -11,10 +11,12 @@ import ( | |||||||
| 	"crypto/aes" | 	"crypto/aes" | ||||||
| 	"crypto/cipher" | 	"crypto/cipher" | ||||||
| 	"crypto/des" | 	"crypto/des" | ||||||
| 	"golang.org/x/crypto/cast5" | 	"crypto/rsa" | ||||||
| 	"golang.org/x/crypto/openpgp/errors" |  | ||||||
| 	"io" | 	"io" | ||||||
| 	"math/big" | 	"math/big" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/crypto/cast5" | ||||||
|  | 	"golang.org/x/crypto/openpgp/errors" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // readFull is the same as io.ReadFull except that reading zero bytes returns
 | // readFull is the same as io.ReadFull except that reading zero bytes returns
 | ||||||
| @ -402,14 +404,16 @@ const ( | |||||||
| type PublicKeyAlgorithm uint8 | type PublicKeyAlgorithm uint8 | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| 	PubKeyAlgoRSA            PublicKeyAlgorithm = 1 | 	PubKeyAlgoRSA     PublicKeyAlgorithm = 1 | ||||||
| 	PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 | 	PubKeyAlgoElGamal PublicKeyAlgorithm = 16 | ||||||
| 	PubKeyAlgoRSASignOnly    PublicKeyAlgorithm = 3 | 	PubKeyAlgoDSA     PublicKeyAlgorithm = 17 | ||||||
| 	PubKeyAlgoElGamal        PublicKeyAlgorithm = 16 |  | ||||||
| 	PubKeyAlgoDSA            PublicKeyAlgorithm = 17 |  | ||||||
| 	// RFC 6637, Section 5.
 | 	// RFC 6637, Section 5.
 | ||||||
| 	PubKeyAlgoECDH  PublicKeyAlgorithm = 18 | 	PubKeyAlgoECDH  PublicKeyAlgorithm = 18 | ||||||
| 	PubKeyAlgoECDSA PublicKeyAlgorithm = 19 | 	PubKeyAlgoECDSA PublicKeyAlgorithm = 19 | ||||||
|  | 
 | ||||||
|  | 	// Deprecated in RFC 4880, Section 13.5. Use key flags instead.
 | ||||||
|  | 	PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 | ||||||
|  | 	PubKeyAlgoRSASignOnly    PublicKeyAlgorithm = 3 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // CanEncrypt returns true if it's possible to encrypt a message to a public
 | // CanEncrypt returns true if it's possible to encrypt a message to a public
 | ||||||
| @ -500,19 +504,17 @@ func readMPI(r io.Reader) (mpi []byte, bitLength uint16, err error) { | |||||||
| 	numBytes := (int(bitLength) + 7) / 8 | 	numBytes := (int(bitLength) + 7) / 8 | ||||||
| 	mpi = make([]byte, numBytes) | 	mpi = make([]byte, numBytes) | ||||||
| 	_, err = readFull(r, mpi) | 	_, err = readFull(r, mpi) | ||||||
| 	return | 	// According to RFC 4880 3.2. we should check that the MPI has no leading
 | ||||||
| } | 	// zeroes (at least when not an encrypted MPI?), but this implementation
 | ||||||
| 
 | 	// does generate leading zeroes, so we keep accepting them.
 | ||||||
| // mpiLength returns the length of the given *big.Int when serialized as an
 |  | ||||||
| // MPI.
 |  | ||||||
| func mpiLength(n *big.Int) (mpiLengthInBytes int) { |  | ||||||
| 	mpiLengthInBytes = 2 /* MPI length */ |  | ||||||
| 	mpiLengthInBytes += (n.BitLen() + 7) / 8 |  | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // writeMPI serializes a big integer to w.
 | // writeMPI serializes a big integer to w.
 | ||||||
| func writeMPI(w io.Writer, bitLength uint16, mpiBytes []byte) (err error) { | func writeMPI(w io.Writer, bitLength uint16, mpiBytes []byte) (err error) { | ||||||
|  | 	// Note that we can produce leading zeroes, in violation of RFC 4880 3.2.
 | ||||||
|  | 	// Implementations seem to be tolerant of them, and stripping them would
 | ||||||
|  | 	// make it complex to guarantee matching re-serialization.
 | ||||||
| 	_, err = w.Write([]byte{byte(bitLength >> 8), byte(bitLength)}) | 	_, err = w.Write([]byte{byte(bitLength >> 8), byte(bitLength)}) | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
| 		_, err = w.Write(mpiBytes) | 		_, err = w.Write(mpiBytes) | ||||||
| @ -525,6 +527,18 @@ func writeBig(w io.Writer, i *big.Int) error { | |||||||
| 	return writeMPI(w, uint16(i.BitLen()), i.Bytes()) | 	return writeMPI(w, uint16(i.BitLen()), i.Bytes()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // padToKeySize left-pads a MPI with zeroes to match the length of the
 | ||||||
|  | // specified RSA public.
 | ||||||
|  | func padToKeySize(pub *rsa.PublicKey, b []byte) []byte { | ||||||
|  | 	k := (pub.N.BitLen() + 7) / 8 | ||||||
|  | 	if len(b) >= k { | ||||||
|  | 		return b | ||||||
|  | 	} | ||||||
|  | 	bb := make([]byte, k) | ||||||
|  | 	copy(bb[len(bb)-len(b):], b) | ||||||
|  | 	return bb | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // CompressionAlgo Represents the different compression algorithms
 | // CompressionAlgo Represents the different compression algorithms
 | ||||||
| // supported by OpenPGP (except for BZIP2, which is not currently
 | // supported by OpenPGP (except for BZIP2, which is not currently
 | ||||||
| // supported). See Section 9.3 of RFC 4880.
 | // supported). See Section 9.3 of RFC 4880.
 | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								vendor/golang.org/x/crypto/openpgp/packet/private_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/golang.org/x/crypto/openpgp/packet/private_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -64,14 +64,19 @@ func NewECDSAPrivateKey(currentTime time.Time, priv *ecdsa.PrivateKey) *PrivateK | |||||||
| 	return pk | 	return pk | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewSignerPrivateKey creates a sign-only PrivateKey from a crypto.Signer that
 | // NewSignerPrivateKey creates a PrivateKey from a crypto.Signer that
 | ||||||
| // implements RSA or ECDSA.
 | // implements RSA or ECDSA.
 | ||||||
| func NewSignerPrivateKey(currentTime time.Time, signer crypto.Signer) *PrivateKey { | func NewSignerPrivateKey(currentTime time.Time, signer crypto.Signer) *PrivateKey { | ||||||
| 	pk := new(PrivateKey) | 	pk := new(PrivateKey) | ||||||
|  | 	// In general, the public Keys should be used as pointers. We still
 | ||||||
|  | 	// type-switch on the values, for backwards-compatibility.
 | ||||||
| 	switch pubkey := signer.Public().(type) { | 	switch pubkey := signer.Public().(type) { | ||||||
|  | 	case *rsa.PublicKey: | ||||||
|  | 		pk.PublicKey = *NewRSAPublicKey(currentTime, pubkey) | ||||||
| 	case rsa.PublicKey: | 	case rsa.PublicKey: | ||||||
| 		pk.PublicKey = *NewRSAPublicKey(currentTime, &pubkey) | 		pk.PublicKey = *NewRSAPublicKey(currentTime, &pubkey) | ||||||
| 		pk.PubKeyAlgo = PubKeyAlgoRSASignOnly | 	case *ecdsa.PublicKey: | ||||||
|  | 		pk.PublicKey = *NewECDSAPublicKey(currentTime, pubkey) | ||||||
| 	case ecdsa.PublicKey: | 	case ecdsa.PublicKey: | ||||||
| 		pk.PublicKey = *NewECDSAPublicKey(currentTime, &pubkey) | 		pk.PublicKey = *NewECDSAPublicKey(currentTime, &pubkey) | ||||||
| 	default: | 	default: | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								vendor/golang.org/x/crypto/openpgp/packet/public_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/golang.org/x/crypto/openpgp/packet/public_key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -244,7 +244,12 @@ func NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	pk.ec.p.bytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y) | 	pk.ec.p.bytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y) | ||||||
| 	pk.ec.p.bitLength = uint16(8 * len(pk.ec.p.bytes)) | 
 | ||||||
|  | 	// The bit length is 3 (for the 0x04 specifying an uncompressed key)
 | ||||||
|  | 	// plus two field elements (for x and y), which are rounded up to the
 | ||||||
|  | 	// nearest byte. See https://tools.ietf.org/html/rfc6637#section-6
 | ||||||
|  | 	fieldBytes := (pub.Curve.Params().BitSize + 7) & ^7 | ||||||
|  | 	pk.ec.p.bitLength = uint16(3 + fieldBytes + fieldBytes) | ||||||
| 
 | 
 | ||||||
| 	pk.setFingerPrintAndKeyId() | 	pk.setFingerPrintAndKeyId() | ||||||
| 	return pk | 	return pk | ||||||
| @ -515,7 +520,7 @@ func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err erro | |||||||
| 	switch pk.PubKeyAlgo { | 	switch pk.PubKeyAlgo { | ||||||
| 	case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: | 	case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: | ||||||
| 		rsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey) | 		rsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey) | ||||||
| 		err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes) | 		err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.bytes)) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return errors.SignatureError("RSA verification failure") | 			return errors.SignatureError("RSA verification failure") | ||||||
| 		} | 		} | ||||||
| @ -566,7 +571,7 @@ func (pk *PublicKey) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err | |||||||
| 	switch pk.PubKeyAlgo { | 	switch pk.PubKeyAlgo { | ||||||
| 	case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: | 	case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: | ||||||
| 		rsaPublicKey := pk.PublicKey.(*rsa.PublicKey) | 		rsaPublicKey := pk.PublicKey.(*rsa.PublicKey) | ||||||
| 		if err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes); err != nil { | 		if err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.bytes)); err != nil { | ||||||
| 			return errors.SignatureError("RSA verification failure") | 			return errors.SignatureError("RSA verification failure") | ||||||
| 		} | 		} | ||||||
| 		return | 		return | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/openpgp/packet/signature.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/openpgp/packet/signature.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -542,7 +542,7 @@ func (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err e | |||||||
| 			r, s, err = ecdsa.Sign(config.Random(), pk, digest) | 			r, s, err = ecdsa.Sign(config.Random(), pk, digest) | ||||||
| 		} else { | 		} else { | ||||||
| 			var b []byte | 			var b []byte | ||||||
| 			b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, nil) | 			b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) | ||||||
| 			if err == nil { | 			if err == nil { | ||||||
| 				r, s, err = unwrapECDSASig(b) | 				r, s, err = unwrapECDSASig(b) | ||||||
| 			} | 			} | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/openpgp/packet/userattribute.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/openpgp/packet/userattribute.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -80,7 +80,7 @@ func (uat *UserAttribute) Serialize(w io.Writer) (err error) { | |||||||
| 
 | 
 | ||||||
| // ImageData returns zero or more byte slices, each containing
 | // ImageData returns zero or more byte slices, each containing
 | ||||||
| // JPEG File Interchange Format (JFIF), for each photo in the
 | // JPEG File Interchange Format (JFIF), for each photo in the
 | ||||||
| // the user attribute packet.
 | // user attribute packet.
 | ||||||
| func (uat *UserAttribute) ImageData() (imageData [][]byte) { | func (uat *UserAttribute) ImageData() (imageData [][]byte) { | ||||||
| 	for _, sp := range uat.Contents { | 	for _, sp := range uat.Contents { | ||||||
| 		if sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 { | 		if sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 { | ||||||
|  | |||||||
							
								
								
									
										176
									
								
								vendor/golang.org/x/crypto/openpgp/write.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										176
									
								
								vendor/golang.org/x/crypto/openpgp/write.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -164,12 +164,12 @@ func hashToHashId(h crypto.Hash) uint8 { | |||||||
| 	return v | 	return v | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Encrypt encrypts a message to a number of recipients and, optionally, signs
 | // writeAndSign writes the data as a payload package and, optionally, signs
 | ||||||
| // it. hints contains optional information, that is also encrypted, that aids
 | // it. hints contains optional information, that is also encrypted,
 | ||||||
| // the recipients in processing the message. The resulting WriteCloser must
 | // that aids the recipients in processing the message. The resulting
 | ||||||
| // be closed after the contents of the file have been written.
 | // WriteCloser must be closed after the contents of the file have been
 | ||||||
| // If config is nil, sensible defaults will be used.
 | // written. If config is nil, sensible defaults will be used.
 | ||||||
| func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { | func writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { | ||||||
| 	var signer *packet.PrivateKey | 	var signer *packet.PrivateKey | ||||||
| 	if signed != nil { | 	if signed != nil { | ||||||
| 		signKey, ok := signed.signingKey(config.Now()) | 		signKey, ok := signed.signingKey(config.Now()) | ||||||
| @ -185,6 +185,83 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	var hash crypto.Hash | ||||||
|  | 	for _, hashId := range candidateHashes { | ||||||
|  | 		if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { | ||||||
|  | 			hash = h | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// If the hash specified by config is a candidate, we'll use that.
 | ||||||
|  | 	if configuredHash := config.Hash(); configuredHash.Available() { | ||||||
|  | 		for _, hashId := range candidateHashes { | ||||||
|  | 			if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { | ||||||
|  | 				hash = h | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if hash == 0 { | ||||||
|  | 		hashId := candidateHashes[0] | ||||||
|  | 		name, ok := s2k.HashIdToString(hashId) | ||||||
|  | 		if !ok { | ||||||
|  | 			name = "#" + strconv.Itoa(int(hashId)) | ||||||
|  | 		} | ||||||
|  | 		return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if signer != nil { | ||||||
|  | 		ops := &packet.OnePassSignature{ | ||||||
|  | 			SigType:    packet.SigTypeBinary, | ||||||
|  | 			Hash:       hash, | ||||||
|  | 			PubKeyAlgo: signer.PubKeyAlgo, | ||||||
|  | 			KeyId:      signer.KeyId, | ||||||
|  | 			IsLast:     true, | ||||||
|  | 		} | ||||||
|  | 		if err := ops.Serialize(payload); err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if hints == nil { | ||||||
|  | 		hints = &FileHints{} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	w := payload | ||||||
|  | 	if signer != nil { | ||||||
|  | 		// If we need to write a signature packet after the literal
 | ||||||
|  | 		// data then we need to stop literalData from closing
 | ||||||
|  | 		// encryptedData.
 | ||||||
|  | 		w = noOpCloser{w} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 	var epochSeconds uint32 | ||||||
|  | 	if !hints.ModTime.IsZero() { | ||||||
|  | 		epochSeconds = uint32(hints.ModTime.Unix()) | ||||||
|  | 	} | ||||||
|  | 	literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if signer != nil { | ||||||
|  | 		return signatureWriter{payload, literalData, hash, hash.New(), signer, config}, nil | ||||||
|  | 	} | ||||||
|  | 	return literalData, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Encrypt encrypts a message to a number of recipients and, optionally, signs
 | ||||||
|  | // it. hints contains optional information, that is also encrypted, that aids
 | ||||||
|  | // the recipients in processing the message. The resulting WriteCloser must
 | ||||||
|  | // be closed after the contents of the file have been written.
 | ||||||
|  | // If config is nil, sensible defaults will be used.
 | ||||||
|  | func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { | ||||||
|  | 	if len(to) == 0 { | ||||||
|  | 		return nil, errors.InvalidArgumentError("no encryption recipient provided") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// These are the possible ciphers that we'll use for the message.
 | 	// These are the possible ciphers that we'll use for the message.
 | ||||||
| 	candidateCiphers := []uint8{ | 	candidateCiphers := []uint8{ | ||||||
| 		uint8(packet.CipherAES128), | 		uint8(packet.CipherAES128), | ||||||
| @ -194,6 +271,7 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint | |||||||
| 	// These are the possible hash functions that we'll use for the signature.
 | 	// These are the possible hash functions that we'll use for the signature.
 | ||||||
| 	candidateHashes := []uint8{ | 	candidateHashes := []uint8{ | ||||||
| 		hashToHashId(crypto.SHA256), | 		hashToHashId(crypto.SHA256), | ||||||
|  | 		hashToHashId(crypto.SHA384), | ||||||
| 		hashToHashId(crypto.SHA512), | 		hashToHashId(crypto.SHA512), | ||||||
| 		hashToHashId(crypto.SHA1), | 		hashToHashId(crypto.SHA1), | ||||||
| 		hashToHashId(crypto.RIPEMD160), | 		hashToHashId(crypto.RIPEMD160), | ||||||
| @ -241,33 +319,6 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var hash crypto.Hash |  | ||||||
| 	for _, hashId := range candidateHashes { |  | ||||||
| 		if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { |  | ||||||
| 			hash = h |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// If the hash specified by config is a candidate, we'll use that.
 |  | ||||||
| 	if configuredHash := config.Hash(); configuredHash.Available() { |  | ||||||
| 		for _, hashId := range candidateHashes { |  | ||||||
| 			if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { |  | ||||||
| 				hash = h |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if hash == 0 { |  | ||||||
| 		hashId := candidateHashes[0] |  | ||||||
| 		name, ok := s2k.HashIdToString(hashId) |  | ||||||
| 		if !ok { |  | ||||||
| 			name = "#" + strconv.Itoa(int(hashId)) |  | ||||||
| 		} |  | ||||||
| 		return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	symKey := make([]byte, cipher.KeySize()) | 	symKey := make([]byte, cipher.KeySize()) | ||||||
| 	if _, err := io.ReadFull(config.Random(), symKey); err != nil { | 	if _, err := io.ReadFull(config.Random(), symKey); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @ -279,49 +330,38 @@ func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHint | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	encryptedData, err := packet.SerializeSymmetricallyEncrypted(ciphertext, cipher, symKey, config) | 	payload, err := packet.SerializeSymmetricallyEncrypted(ciphertext, cipher, symKey, config) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if signer != nil { | 	return writeAndSign(payload, candidateHashes, signed, hints, config) | ||||||
| 		ops := &packet.OnePassSignature{ | } | ||||||
| 			SigType:    packet.SigTypeBinary, | 
 | ||||||
| 			Hash:       hash, | // Sign signs a message. The resulting WriteCloser must be closed after the
 | ||||||
| 			PubKeyAlgo: signer.PubKeyAlgo, | // contents of the file have been written.  hints contains optional information
 | ||||||
| 			KeyId:      signer.KeyId, | // that aids the recipients in processing the message.
 | ||||||
| 			IsLast:     true, | // If config is nil, sensible defaults will be used.
 | ||||||
| 		} | func Sign(output io.Writer, signed *Entity, hints *FileHints, config *packet.Config) (input io.WriteCloser, err error) { | ||||||
| 		if err := ops.Serialize(encryptedData); err != nil { | 	if signed == nil { | ||||||
| 			return nil, err | 		return nil, errors.InvalidArgumentError("no signer provided") | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if hints == nil { | 	// These are the possible hash functions that we'll use for the signature.
 | ||||||
| 		hints = &FileHints{} | 	candidateHashes := []uint8{ | ||||||
|  | 		hashToHashId(crypto.SHA256), | ||||||
|  | 		hashToHashId(crypto.SHA384), | ||||||
|  | 		hashToHashId(crypto.SHA512), | ||||||
|  | 		hashToHashId(crypto.SHA1), | ||||||
|  | 		hashToHashId(crypto.RIPEMD160), | ||||||
| 	} | 	} | ||||||
| 
 | 	defaultHashes := candidateHashes[len(candidateHashes)-1:] | ||||||
| 	w := encryptedData | 	preferredHashes := signed.primaryIdentity().SelfSignature.PreferredHash | ||||||
| 	if signer != nil { | 	if len(preferredHashes) == 0 { | ||||||
| 		// If we need to write a signature packet after the literal
 | 		preferredHashes = defaultHashes | ||||||
| 		// data then we need to stop literalData from closing
 |  | ||||||
| 		// encryptedData.
 |  | ||||||
| 		w = noOpCloser{encryptedData} |  | ||||||
| 
 |  | ||||||
| 	} | 	} | ||||||
| 	var epochSeconds uint32 | 	candidateHashes = intersectPreferences(candidateHashes, preferredHashes) | ||||||
| 	if !hints.ModTime.IsZero() { | 	return writeAndSign(noOpCloser{output}, candidateHashes, signed, hints, config) | ||||||
| 		epochSeconds = uint32(hints.ModTime.Unix()) |  | ||||||
| 	} |  | ||||||
| 	literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if signer != nil { |  | ||||||
| 		return signatureWriter{encryptedData, literalData, hash, hash.New(), signer, config}, nil |  | ||||||
| 	} |  | ||||||
| 	return literalData, nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // signatureWriter hashes the contents of a message while passing it along to
 | // signatureWriter hashes the contents of a message while passing it along to
 | ||||||
|  | |||||||
							
								
								
									
										33
									
								
								vendor/golang.org/x/crypto/poly1305/poly1305.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/golang.org/x/crypto/poly1305/poly1305.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | // Copyright 2012 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | Package poly1305 implements Poly1305 one-time message authentication code as | ||||||
|  | specified in https://cr.yp.to/mac/poly1305-20050329.pdf.
 | ||||||
|  | 
 | ||||||
|  | Poly1305 is a fast, one-time authentication function. It is infeasible for an | ||||||
|  | attacker to generate an authenticator for a message without the key. However, a | ||||||
|  | key must only be used for a single message. Authenticating two different | ||||||
|  | messages with the same key allows an attacker to forge authenticators for other | ||||||
|  | messages with the same key. | ||||||
|  | 
 | ||||||
|  | Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was | ||||||
|  | used with a fixed key in order to generate one-time keys from an nonce. | ||||||
|  | However, in this package AES isn't used and the one-time key is specified | ||||||
|  | directly. | ||||||
|  | */ | ||||||
|  | package poly1305 // import "golang.org/x/crypto/poly1305"
 | ||||||
|  | 
 | ||||||
|  | import "crypto/subtle" | ||||||
|  | 
 | ||||||
|  | // TagSize is the size, in bytes, of a poly1305 authenticator.
 | ||||||
|  | const TagSize = 16 | ||||||
|  | 
 | ||||||
|  | // Verify returns true if mac is a valid authenticator for m with the given
 | ||||||
|  | // key.
 | ||||||
|  | func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { | ||||||
|  | 	var tmp [16]byte | ||||||
|  | 	Sum(&tmp, m, key) | ||||||
|  | 	return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/crypto/poly1305/sum_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/crypto/poly1305/sum_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | // Copyright 2012 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // +build amd64,!gccgo,!appengine
 | ||||||
|  | 
 | ||||||
|  | package poly1305 | ||||||
|  | 
 | ||||||
|  | // This function is implemented in sum_amd64.s
 | ||||||
|  | //go:noescape
 | ||||||
|  | func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte) | ||||||
|  | 
 | ||||||
|  | // Sum generates an authenticator for m using a one-time key and puts the
 | ||||||
|  | // 16-byte result into out. Authenticating two different messages with the same
 | ||||||
|  | // key allows an attacker to forge messages at will.
 | ||||||
|  | func Sum(out *[16]byte, m []byte, key *[32]byte) { | ||||||
|  | 	var mPtr *byte | ||||||
|  | 	if len(m) > 0 { | ||||||
|  | 		mPtr = &m[0] | ||||||
|  | 	} | ||||||
|  | 	poly1305(out, mPtr, uint64(len(m)), key) | ||||||
|  | } | ||||||
							
								
								
									
										125
									
								
								vendor/golang.org/x/crypto/poly1305/sum_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								vendor/golang.org/x/crypto/poly1305/sum_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,125 @@ | |||||||
|  | // Copyright 2012 The Go Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | // +build amd64,!gccgo,!appengine | ||||||
|  | 
 | ||||||
|  | #include "textflag.h" | ||||||
|  | 
 | ||||||
|  | #define POLY1305_ADD(msg, h0, h1, h2) \ | ||||||
|  | 	ADDQ 0(msg), h0;  \
 | ||||||
|  | 	ADCQ 8(msg), h1;  \
 | ||||||
|  | 	ADCQ $1, h2;      \
 | ||||||
|  | 	LEAQ 16(msg), msg | ||||||
|  | 
 | ||||||
|  | #define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ | ||||||
|  | 	MOVQ  r0, AX;                  \
 | ||||||
|  | 	MULQ  h0;                      \
 | ||||||
|  | 	MOVQ  AX, t0;                  \
 | ||||||
|  | 	MOVQ  DX, t1;                  \
 | ||||||
|  | 	MOVQ  r0, AX;                  \
 | ||||||
|  | 	MULQ  h1;                      \
 | ||||||
|  | 	ADDQ  AX, t1;                  \
 | ||||||
|  | 	ADCQ  $0, DX;                  \
 | ||||||
|  | 	MOVQ  r0, t2;                  \
 | ||||||
|  | 	IMULQ h2, t2;                  \
 | ||||||
|  | 	ADDQ  DX, t2;                  \
 | ||||||
|  | 	                               \ | ||||||
|  | 	MOVQ  r1, AX;                  \
 | ||||||
|  | 	MULQ  h0;                      \
 | ||||||
|  | 	ADDQ  AX, t1;                  \
 | ||||||
|  | 	ADCQ  $0, DX;                  \
 | ||||||
|  | 	MOVQ  DX, h0;                  \
 | ||||||
|  | 	MOVQ  r1, t3;                  \
 | ||||||
|  | 	IMULQ h2, t3;                  \
 | ||||||
|  | 	MOVQ  r1, AX;                  \
 | ||||||
|  | 	MULQ  h1;                      \
 | ||||||
|  | 	ADDQ  AX, t2;                  \
 | ||||||
|  | 	ADCQ  DX, t3;                  \
 | ||||||
|  | 	ADDQ  h0, t2;                  \
 | ||||||
|  | 	ADCQ  $0, t3;                  \
 | ||||||
|  | 	                               \ | ||||||
|  | 	MOVQ  t0, h0;                  \
 | ||||||
|  | 	MOVQ  t1, h1;                  \
 | ||||||
|  | 	MOVQ  t2, h2;                  \
 | ||||||
|  | 	ANDQ  $3, h2;                  \
 | ||||||
|  | 	MOVQ  t2, t0;                  \
 | ||||||
|  | 	ANDQ  $0xFFFFFFFFFFFFFFFC, t0; \
 | ||||||
|  | 	ADDQ  t0, h0;                  \
 | ||||||
|  | 	ADCQ  t3, h1;                  \
 | ||||||
|  | 	ADCQ  $0, h2;                  \
 | ||||||
|  | 	SHRQ  $2, t3, t2;              \
 | ||||||
|  | 	SHRQ  $2, t3;                  \
 | ||||||
|  | 	ADDQ  t2, h0;                  \
 | ||||||
|  | 	ADCQ  t3, h1;                  \
 | ||||||
|  | 	ADCQ  $0, h2 | ||||||
|  | 
 | ||||||
|  | DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF | ||||||
|  | DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC | ||||||
|  | GLOBL ·poly1305Mask<>(SB), RODATA, $16 | ||||||
|  | 
 | ||||||
|  | // func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]key) | ||||||
|  | TEXT ·poly1305(SB), $0-32 | ||||||
|  | 	MOVQ out+0(FP), DI | ||||||
|  | 	MOVQ m+8(FP), SI | ||||||
|  | 	MOVQ mlen+16(FP), R15 | ||||||
|  | 	MOVQ key+24(FP), AX | ||||||
|  | 
 | ||||||
|  | 	MOVQ 0(AX), R11 | ||||||
|  | 	MOVQ 8(AX), R12 | ||||||
|  | 	ANDQ ·poly1305Mask<>(SB), R11   // r0 | ||||||
|  | 	ANDQ ·poly1305Mask<>+8(SB), R12 // r1 | ||||||
|  | 	XORQ R8, R8                    // h0 | ||||||
|  | 	XORQ R9, R9                    // h1 | ||||||
|  | 	XORQ R10, R10                  // h2 | ||||||
|  | 
 | ||||||
|  | 	CMPQ R15, $16 | ||||||
|  | 	JB   bytes_between_0_and_15 | ||||||
|  | 
 | ||||||
|  | loop: | ||||||
|  | 	POLY1305_ADD(SI, R8, R9, R10) | ||||||
|  | 
 | ||||||
|  | multiply: | ||||||
|  | 	POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) | ||||||
|  | 	SUBQ $16, R15 | ||||||
|  | 	CMPQ R15, $16 | ||||||
|  | 	JAE  loop | ||||||
|  | 
 | ||||||
|  | bytes_between_0_and_15: | ||||||
|  | 	TESTQ R15, R15 | ||||||
|  | 	JZ    done | ||||||
|  | 	MOVQ  $1, BX | ||||||
|  | 	XORQ  CX, CX | ||||||
|  | 	XORQ  R13, R13 | ||||||
|  | 	ADDQ  R15, SI | ||||||
|  | 
 | ||||||
|  | flush_buffer: | ||||||
|  | 	SHLQ $8, BX, CX | ||||||
|  | 	SHLQ $8, BX | ||||||
|  | 	MOVB -1(SI), R13 | ||||||
|  | 	XORQ R13, BX | ||||||
|  | 	DECQ SI | ||||||
|  | 	DECQ R15 | ||||||
|  | 	JNZ  flush_buffer | ||||||
|  | 
 | ||||||
|  | 	ADDQ BX, R8 | ||||||
|  | 	ADCQ CX, R9 | ||||||
|  | 	ADCQ $0, R10 | ||||||
|  | 	MOVQ $16, R15 | ||||||
|  | 	JMP  multiply | ||||||
|  | 
 | ||||||
|  | done: | ||||||
|  | 	MOVQ    R8, AX | ||||||
|  | 	MOVQ    R9, BX | ||||||
|  | 	SUBQ    $0xFFFFFFFFFFFFFFFB, AX | ||||||
|  | 	SBBQ    $0xFFFFFFFFFFFFFFFF, BX | ||||||
|  | 	SBBQ    $3, R10 | ||||||
|  | 	CMOVQCS R8, AX | ||||||
|  | 	CMOVQCS R9, BX | ||||||
|  | 	MOVQ    key+24(FP), R8 | ||||||
|  | 	ADDQ    16(R8), AX | ||||||
|  | 	ADCQ    24(R8), BX | ||||||
|  | 
 | ||||||
|  | 	MOVQ AX, 0(DI) | ||||||
|  | 	MOVQ BX, 8(DI) | ||||||
|  | 	RET | ||||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/crypto/poly1305/sum_arm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/crypto/poly1305/sum_arm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | // 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 arm,!gccgo,!appengine,!nacl
 | ||||||
|  | 
 | ||||||
|  | package poly1305 | ||||||
|  | 
 | ||||||
|  | // This function is implemented in sum_arm.s
 | ||||||
|  | //go:noescape
 | ||||||
|  | func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte) | ||||||
|  | 
 | ||||||
|  | // Sum generates an authenticator for m using a one-time key and puts the
 | ||||||
|  | // 16-byte result into out. Authenticating two different messages with the same
 | ||||||
|  | // key allows an attacker to forge messages at will.
 | ||||||
|  | func Sum(out *[16]byte, m []byte, key *[32]byte) { | ||||||
|  | 	var mPtr *byte | ||||||
|  | 	if len(m) > 0 { | ||||||
|  | 		mPtr = &m[0] | ||||||
|  | 	} | ||||||
|  | 	poly1305_auth_armv6(out, mPtr, uint32(len(m)), key) | ||||||
|  | } | ||||||
							
								
								
									
										427
									
								
								vendor/golang.org/x/crypto/poly1305/sum_arm.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										427
									
								
								vendor/golang.org/x/crypto/poly1305/sum_arm.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,427 @@ | |||||||
|  | // 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 arm,!gccgo,!appengine,!nacl | ||||||
|  | 
 | ||||||
|  | #include "textflag.h" | ||||||
|  | 
 | ||||||
|  | // This code was translated into a form compatible with 5a from the public | ||||||
|  | // domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305. | ||||||
|  | 
 | ||||||
|  | DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff | ||||||
|  | DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03 | ||||||
|  | DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff | ||||||
|  | DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff | ||||||
|  | DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff | ||||||
|  | GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20 | ||||||
|  | 
 | ||||||
|  | // Warning: the linker may use R11 to synthesize certain instructions. Please | ||||||
|  | // take care and verify that no synthetic instructions use it. | ||||||
|  | 
 | ||||||
|  | TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0 | ||||||
|  | 	// Needs 16 bytes of stack and 64 bytes of space pointed to by R0.  (It | ||||||
|  | 	// might look like it's only 60 bytes of space but the final four bytes | ||||||
|  | 	// will be written by another function.) We need to skip over four | ||||||
|  | 	// bytes of stack because that's saving the value of 'g'. | ||||||
|  | 	ADD       $4, R13, R8 | ||||||
|  | 	MOVM.IB   [R4-R7], (R8) | ||||||
|  | 	MOVM.IA.W (R1), [R2-R5] | ||||||
|  | 	MOVW      $·poly1305_init_constants_armv6<>(SB), R7 | ||||||
|  | 	MOVW      R2, R8 | ||||||
|  | 	MOVW      R2>>26, R9 | ||||||
|  | 	MOVW      R3>>20, g | ||||||
|  | 	MOVW      R4>>14, R11 | ||||||
|  | 	MOVW      R5>>8, R12 | ||||||
|  | 	ORR       R3<<6, R9, R9 | ||||||
|  | 	ORR       R4<<12, g, g | ||||||
|  | 	ORR       R5<<18, R11, R11 | ||||||
|  | 	MOVM.IA   (R7), [R2-R6] | ||||||
|  | 	AND       R8, R2, R2 | ||||||
|  | 	AND       R9, R3, R3 | ||||||
|  | 	AND       g, R4, R4 | ||||||
|  | 	AND       R11, R5, R5 | ||||||
|  | 	AND       R12, R6, R6 | ||||||
|  | 	MOVM.IA.W [R2-R6], (R0) | ||||||
|  | 	EOR       R2, R2, R2 | ||||||
|  | 	EOR       R3, R3, R3 | ||||||
|  | 	EOR       R4, R4, R4 | ||||||
|  | 	EOR       R5, R5, R5 | ||||||
|  | 	EOR       R6, R6, R6 | ||||||
|  | 	MOVM.IA.W [R2-R6], (R0) | ||||||
|  | 	MOVM.IA.W (R1), [R2-R5] | ||||||
|  | 	MOVM.IA   [R2-R6], (R0) | ||||||
|  | 	ADD       $20, R13, R0 | ||||||
|  | 	MOVM.DA   (R0), [R4-R7] | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | #define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \ | ||||||
|  | 	MOVBU (offset+0)(Rsrc), Rtmp; \
 | ||||||
|  | 	MOVBU Rtmp, (offset+0)(Rdst); \
 | ||||||
|  | 	MOVBU (offset+1)(Rsrc), Rtmp; \
 | ||||||
|  | 	MOVBU Rtmp, (offset+1)(Rdst); \
 | ||||||
|  | 	MOVBU (offset+2)(Rsrc), Rtmp; \
 | ||||||
|  | 	MOVBU Rtmp, (offset+2)(Rdst); \
 | ||||||
|  | 	MOVBU (offset+3)(Rsrc), Rtmp; \
 | ||||||
|  | 	MOVBU Rtmp, (offset+3)(Rdst) | ||||||
|  | 
 | ||||||
|  | TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0 | ||||||
|  | 	// Needs 24 bytes of stack for saved registers and then 88 bytes of | ||||||
|  | 	// scratch space after that. We assume that 24 bytes at (R13) have | ||||||
|  | 	// already been used: four bytes for the link register saved in the | ||||||
|  | 	// prelude of poly1305_auth_armv6, four bytes for saving the value of g | ||||||
|  | 	// in that function and 16 bytes of scratch space used around | ||||||
|  | 	// poly1305_finish_ext_armv6_skip1. | ||||||
|  | 	ADD     $24, R13, R12 | ||||||
|  | 	MOVM.IB [R4-R8, R14], (R12) | ||||||
|  | 	MOVW    R0, 88(R13) | ||||||
|  | 	MOVW    R1, 92(R13) | ||||||
|  | 	MOVW    R2, 96(R13) | ||||||
|  | 	MOVW    R1, R14 | ||||||
|  | 	MOVW    R2, R12 | ||||||
|  | 	MOVW    56(R0), R8 | ||||||
|  | 	WORD    $0xe1180008                // TST R8, R8 not working see issue 5921 | ||||||
|  | 	EOR     R6, R6, R6 | ||||||
|  | 	MOVW.EQ $(1<<24), R6 | ||||||
|  | 	MOVW    R6, 84(R13) | ||||||
|  | 	ADD     $116, R13, g | ||||||
|  | 	MOVM.IA (R0), [R0-R9] | ||||||
|  | 	MOVM.IA [R0-R4], (g) | ||||||
|  | 	CMP     $16, R12 | ||||||
|  | 	BLO     poly1305_blocks_armv6_done | ||||||
|  | 
 | ||||||
|  | poly1305_blocks_armv6_mainloop: | ||||||
|  | 	WORD    $0xe31e0003                            // TST R14, #3 not working see issue 5921 | ||||||
|  | 	BEQ     poly1305_blocks_armv6_mainloop_aligned | ||||||
|  | 	ADD     $100, R13, g | ||||||
|  | 	MOVW_UNALIGNED(R14, g, R0, 0) | ||||||
|  | 	MOVW_UNALIGNED(R14, g, R0, 4) | ||||||
|  | 	MOVW_UNALIGNED(R14, g, R0, 8) | ||||||
|  | 	MOVW_UNALIGNED(R14, g, R0, 12) | ||||||
|  | 	MOVM.IA (g), [R0-R3] | ||||||
|  | 	ADD     $16, R14 | ||||||
|  | 	B       poly1305_blocks_armv6_mainloop_loaded | ||||||
|  | 
 | ||||||
|  | poly1305_blocks_armv6_mainloop_aligned: | ||||||
|  | 	MOVM.IA.W (R14), [R0-R3] | ||||||
|  | 
 | ||||||
|  | poly1305_blocks_armv6_mainloop_loaded: | ||||||
|  | 	MOVW    R0>>26, g | ||||||
|  | 	MOVW    R1>>20, R11 | ||||||
|  | 	MOVW    R2>>14, R12 | ||||||
|  | 	MOVW    R14, 92(R13) | ||||||
|  | 	MOVW    R3>>8, R4 | ||||||
|  | 	ORR     R1<<6, g, g | ||||||
|  | 	ORR     R2<<12, R11, R11 | ||||||
|  | 	ORR     R3<<18, R12, R12 | ||||||
|  | 	BIC     $0xfc000000, R0, R0 | ||||||
|  | 	BIC     $0xfc000000, g, g | ||||||
|  | 	MOVW    84(R13), R3 | ||||||
|  | 	BIC     $0xfc000000, R11, R11 | ||||||
|  | 	BIC     $0xfc000000, R12, R12 | ||||||
|  | 	ADD     R0, R5, R5 | ||||||
|  | 	ADD     g, R6, R6 | ||||||
|  | 	ORR     R3, R4, R4 | ||||||
|  | 	ADD     R11, R7, R7 | ||||||
|  | 	ADD     $116, R13, R14 | ||||||
|  | 	ADD     R12, R8, R8 | ||||||
|  | 	ADD     R4, R9, R9 | ||||||
|  | 	MOVM.IA (R14), [R0-R4] | ||||||
|  | 	MULLU   R4, R5, (R11, g) | ||||||
|  | 	MULLU   R3, R5, (R14, R12) | ||||||
|  | 	MULALU  R3, R6, (R11, g) | ||||||
|  | 	MULALU  R2, R6, (R14, R12) | ||||||
|  | 	MULALU  R2, R7, (R11, g) | ||||||
|  | 	MULALU  R1, R7, (R14, R12) | ||||||
|  | 	ADD     R4<<2, R4, R4 | ||||||
|  | 	ADD     R3<<2, R3, R3 | ||||||
|  | 	MULALU  R1, R8, (R11, g) | ||||||
|  | 	MULALU  R0, R8, (R14, R12) | ||||||
|  | 	MULALU  R0, R9, (R11, g) | ||||||
|  | 	MULALU  R4, R9, (R14, R12) | ||||||
|  | 	MOVW    g, 76(R13) | ||||||
|  | 	MOVW    R11, 80(R13) | ||||||
|  | 	MOVW    R12, 68(R13) | ||||||
|  | 	MOVW    R14, 72(R13) | ||||||
|  | 	MULLU   R2, R5, (R11, g) | ||||||
|  | 	MULLU   R1, R5, (R14, R12) | ||||||
|  | 	MULALU  R1, R6, (R11, g) | ||||||
|  | 	MULALU  R0, R6, (R14, R12) | ||||||
|  | 	MULALU  R0, R7, (R11, g) | ||||||
|  | 	MULALU  R4, R7, (R14, R12) | ||||||
|  | 	ADD     R2<<2, R2, R2 | ||||||
|  | 	ADD     R1<<2, R1, R1 | ||||||
|  | 	MULALU  R4, R8, (R11, g) | ||||||
|  | 	MULALU  R3, R8, (R14, R12) | ||||||
|  | 	MULALU  R3, R9, (R11, g) | ||||||
|  | 	MULALU  R2, R9, (R14, R12) | ||||||
|  | 	MOVW    g, 60(R13) | ||||||
|  | 	MOVW    R11, 64(R13) | ||||||
|  | 	MOVW    R12, 52(R13) | ||||||
|  | 	MOVW    R14, 56(R13) | ||||||
|  | 	MULLU   R0, R5, (R11, g) | ||||||
|  | 	MULALU  R4, R6, (R11, g) | ||||||
|  | 	MULALU  R3, R7, (R11, g) | ||||||
|  | 	MULALU  R2, R8, (R11, g) | ||||||
|  | 	MULALU  R1, R9, (R11, g) | ||||||
|  | 	ADD     $52, R13, R0 | ||||||
|  | 	MOVM.IA (R0), [R0-R7] | ||||||
|  | 	MOVW    g>>26, R12 | ||||||
|  | 	MOVW    R4>>26, R14 | ||||||
|  | 	ORR     R11<<6, R12, R12 | ||||||
|  | 	ORR     R5<<6, R14, R14 | ||||||
|  | 	BIC     $0xfc000000, g, g | ||||||
|  | 	BIC     $0xfc000000, R4, R4 | ||||||
|  | 	ADD.S   R12, R0, R0 | ||||||
|  | 	ADC     $0, R1, R1 | ||||||
|  | 	ADD.S   R14, R6, R6 | ||||||
|  | 	ADC     $0, R7, R7 | ||||||
|  | 	MOVW    R0>>26, R12 | ||||||
|  | 	MOVW    R6>>26, R14 | ||||||
|  | 	ORR     R1<<6, R12, R12 | ||||||
|  | 	ORR     R7<<6, R14, R14 | ||||||
|  | 	BIC     $0xfc000000, R0, R0 | ||||||
|  | 	BIC     $0xfc000000, R6, R6 | ||||||
|  | 	ADD     R14<<2, R14, R14 | ||||||
|  | 	ADD.S   R12, R2, R2 | ||||||
|  | 	ADC     $0, R3, R3 | ||||||
|  | 	ADD     R14, g, g | ||||||
|  | 	MOVW    R2>>26, R12 | ||||||
|  | 	MOVW    g>>26, R14 | ||||||
|  | 	ORR     R3<<6, R12, R12 | ||||||
|  | 	BIC     $0xfc000000, g, R5 | ||||||
|  | 	BIC     $0xfc000000, R2, R7 | ||||||
|  | 	ADD     R12, R4, R4 | ||||||
|  | 	ADD     R14, R0, R0 | ||||||
|  | 	MOVW    R4>>26, R12 | ||||||
|  | 	BIC     $0xfc000000, R4, R8 | ||||||
|  | 	ADD     R12, R6, R9 | ||||||
|  | 	MOVW    96(R13), R12 | ||||||
|  | 	MOVW    92(R13), R14 | ||||||
|  | 	MOVW    R0, R6 | ||||||
|  | 	CMP     $32, R12 | ||||||
|  | 	SUB     $16, R12, R12 | ||||||
|  | 	MOVW    R12, 96(R13) | ||||||
|  | 	BHS     poly1305_blocks_armv6_mainloop | ||||||
|  | 
 | ||||||
|  | poly1305_blocks_armv6_done: | ||||||
|  | 	MOVW    88(R13), R12 | ||||||
|  | 	MOVW    R5, 20(R12) | ||||||
|  | 	MOVW    R6, 24(R12) | ||||||
|  | 	MOVW    R7, 28(R12) | ||||||
|  | 	MOVW    R8, 32(R12) | ||||||
|  | 	MOVW    R9, 36(R12) | ||||||
|  | 	ADD     $48, R13, R0 | ||||||
|  | 	MOVM.DA (R0), [R4-R8, R14] | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | #define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \ | ||||||
|  | 	MOVBU.P 1(Rsrc), Rtmp; \
 | ||||||
|  | 	MOVBU.P Rtmp, 1(Rdst); \
 | ||||||
|  | 	MOVBU.P 1(Rsrc), Rtmp; \
 | ||||||
|  | 	MOVBU.P Rtmp, 1(Rdst) | ||||||
|  | 
 | ||||||
|  | #define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \ | ||||||
|  | 	MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \
 | ||||||
|  | 	MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) | ||||||
|  | 
 | ||||||
|  | // func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key) | ||||||
|  | TEXT ·poly1305_auth_armv6(SB), $196-16 | ||||||
|  | 	// The value 196, just above, is the sum of 64 (the size of the context | ||||||
|  | 	// structure) and 132 (the amount of stack needed). | ||||||
|  | 	// | ||||||
|  | 	// At this point, the stack pointer (R13) has been moved down. It | ||||||
|  | 	// points to the saved link register and there's 196 bytes of free | ||||||
|  | 	// space above it. | ||||||
|  | 	// | ||||||
|  | 	// The stack for this function looks like: | ||||||
|  | 	// | ||||||
|  | 	// +--------------------- | ||||||
|  | 	// | | ||||||
|  | 	// | 64 bytes of context structure | ||||||
|  | 	// | | ||||||
|  | 	// +--------------------- | ||||||
|  | 	// | | ||||||
|  | 	// | 112 bytes for poly1305_blocks_armv6 | ||||||
|  | 	// | | ||||||
|  | 	// +--------------------- | ||||||
|  | 	// | 16 bytes of final block, constructed at | ||||||
|  | 	// | poly1305_finish_ext_armv6_skip8 | ||||||
|  | 	// +--------------------- | ||||||
|  | 	// | four bytes of saved 'g' | ||||||
|  | 	// +--------------------- | ||||||
|  | 	// | lr, saved by prelude    <- R13 points here | ||||||
|  | 	// +--------------------- | ||||||
|  | 	MOVW g, 4(R13) | ||||||
|  | 
 | ||||||
|  | 	MOVW out+0(FP), R4 | ||||||
|  | 	MOVW m+4(FP), R5 | ||||||
|  | 	MOVW mlen+8(FP), R6 | ||||||
|  | 	MOVW key+12(FP), R7 | ||||||
|  | 
 | ||||||
|  | 	ADD  $136, R13, R0 // 136 = 4 + 4 + 16 + 112 | ||||||
|  | 	MOVW R7, R1 | ||||||
|  | 
 | ||||||
|  | 	// poly1305_init_ext_armv6 will write to the stack from R13+4, but | ||||||
|  | 	// that's ok because none of the other values have been written yet. | ||||||
|  | 	BL    poly1305_init_ext_armv6<>(SB) | ||||||
|  | 	BIC.S $15, R6, R2 | ||||||
|  | 	BEQ   poly1305_auth_armv6_noblocks | ||||||
|  | 	ADD   $136, R13, R0 | ||||||
|  | 	MOVW  R5, R1 | ||||||
|  | 	ADD   R2, R5, R5 | ||||||
|  | 	SUB   R2, R6, R6 | ||||||
|  | 	BL    poly1305_blocks_armv6<>(SB) | ||||||
|  | 
 | ||||||
|  | poly1305_auth_armv6_noblocks: | ||||||
|  | 	ADD  $136, R13, R0 | ||||||
|  | 	MOVW R5, R1 | ||||||
|  | 	MOVW R6, R2 | ||||||
|  | 	MOVW R4, R3 | ||||||
|  | 
 | ||||||
|  | 	MOVW  R0, R5 | ||||||
|  | 	MOVW  R1, R6 | ||||||
|  | 	MOVW  R2, R7 | ||||||
|  | 	MOVW  R3, R8 | ||||||
|  | 	AND.S R2, R2, R2 | ||||||
|  | 	BEQ   poly1305_finish_ext_armv6_noremaining | ||||||
|  | 	EOR   R0, R0 | ||||||
|  | 	ADD   $8, R13, R9                           // 8 = offset to 16 byte scratch space | ||||||
|  | 	MOVW  R0, (R9) | ||||||
|  | 	MOVW  R0, 4(R9) | ||||||
|  | 	MOVW  R0, 8(R9) | ||||||
|  | 	MOVW  R0, 12(R9) | ||||||
|  | 	WORD  $0xe3110003                           // TST R1, #3 not working see issue 5921 | ||||||
|  | 	BEQ   poly1305_finish_ext_armv6_aligned | ||||||
|  | 	WORD  $0xe3120008                           // TST R2, #8 not working see issue 5921 | ||||||
|  | 	BEQ   poly1305_finish_ext_armv6_skip8 | ||||||
|  | 	MOVWP_UNALIGNED(R1, R9, g) | ||||||
|  | 	MOVWP_UNALIGNED(R1, R9, g) | ||||||
|  | 
 | ||||||
|  | poly1305_finish_ext_armv6_skip8: | ||||||
|  | 	WORD $0xe3120004                     // TST $4, R2 not working see issue 5921 | ||||||
|  | 	BEQ  poly1305_finish_ext_armv6_skip4 | ||||||
|  | 	MOVWP_UNALIGNED(R1, R9, g) | ||||||
|  | 
 | ||||||
|  | poly1305_finish_ext_armv6_skip4: | ||||||
|  | 	WORD $0xe3120002                     // TST $2, R2 not working see issue 5921 | ||||||
|  | 	BEQ  poly1305_finish_ext_armv6_skip2 | ||||||
|  | 	MOVHUP_UNALIGNED(R1, R9, g) | ||||||
|  | 	B    poly1305_finish_ext_armv6_skip2 | ||||||
|  | 
 | ||||||
|  | poly1305_finish_ext_armv6_aligned: | ||||||
|  | 	WORD      $0xe3120008                             // TST R2, #8 not working see issue 5921 | ||||||
|  | 	BEQ       poly1305_finish_ext_armv6_skip8_aligned | ||||||
|  | 	MOVM.IA.W (R1), [g-R11] | ||||||
|  | 	MOVM.IA.W [g-R11], (R9) | ||||||
|  | 
 | ||||||
|  | poly1305_finish_ext_armv6_skip8_aligned: | ||||||
|  | 	WORD   $0xe3120004                             // TST $4, R2 not working see issue 5921 | ||||||
|  | 	BEQ    poly1305_finish_ext_armv6_skip4_aligned | ||||||
|  | 	MOVW.P 4(R1), g | ||||||
|  | 	MOVW.P g, 4(R9) | ||||||
|  | 
 | ||||||
|  | poly1305_finish_ext_armv6_skip4_aligned: | ||||||
|  | 	WORD    $0xe3120002                     // TST $2, R2 not working see issue 5921 | ||||||
|  | 	BEQ     poly1305_finish_ext_armv6_skip2 | ||||||
|  | 	MOVHU.P 2(R1), g | ||||||
|  | 	MOVH.P  g, 2(R9) | ||||||
|  | 
 | ||||||
|  | poly1305_finish_ext_armv6_skip2: | ||||||
|  | 	WORD    $0xe3120001                     // TST $1, R2 not working see issue 5921 | ||||||
|  | 	BEQ     poly1305_finish_ext_armv6_skip1 | ||||||
|  | 	MOVBU.P 1(R1), g | ||||||
|  | 	MOVBU.P g, 1(R9) | ||||||
|  | 
 | ||||||
|  | poly1305_finish_ext_armv6_skip1: | ||||||
|  | 	MOVW  $1, R11 | ||||||
|  | 	MOVBU R11, 0(R9) | ||||||
|  | 	MOVW  R11, 56(R5) | ||||||
|  | 	MOVW  R5, R0 | ||||||
|  | 	ADD   $8, R13, R1 | ||||||
|  | 	MOVW  $16, R2 | ||||||
|  | 	BL    poly1305_blocks_armv6<>(SB) | ||||||
|  | 
 | ||||||
|  | poly1305_finish_ext_armv6_noremaining: | ||||||
|  | 	MOVW      20(R5), R0 | ||||||
|  | 	MOVW      24(R5), R1 | ||||||
|  | 	MOVW      28(R5), R2 | ||||||
|  | 	MOVW      32(R5), R3 | ||||||
|  | 	MOVW      36(R5), R4 | ||||||
|  | 	MOVW      R4>>26, R12 | ||||||
|  | 	BIC       $0xfc000000, R4, R4 | ||||||
|  | 	ADD       R12<<2, R12, R12 | ||||||
|  | 	ADD       R12, R0, R0 | ||||||
|  | 	MOVW      R0>>26, R12 | ||||||
|  | 	BIC       $0xfc000000, R0, R0 | ||||||
|  | 	ADD       R12, R1, R1 | ||||||
|  | 	MOVW      R1>>26, R12 | ||||||
|  | 	BIC       $0xfc000000, R1, R1 | ||||||
|  | 	ADD       R12, R2, R2 | ||||||
|  | 	MOVW      R2>>26, R12 | ||||||
|  | 	BIC       $0xfc000000, R2, R2 | ||||||
|  | 	ADD       R12, R3, R3 | ||||||
|  | 	MOVW      R3>>26, R12 | ||||||
|  | 	BIC       $0xfc000000, R3, R3 | ||||||
|  | 	ADD       R12, R4, R4 | ||||||
|  | 	ADD       $5, R0, R6 | ||||||
|  | 	MOVW      R6>>26, R12 | ||||||
|  | 	BIC       $0xfc000000, R6, R6 | ||||||
|  | 	ADD       R12, R1, R7 | ||||||
|  | 	MOVW      R7>>26, R12 | ||||||
|  | 	BIC       $0xfc000000, R7, R7 | ||||||
|  | 	ADD       R12, R2, g | ||||||
|  | 	MOVW      g>>26, R12 | ||||||
|  | 	BIC       $0xfc000000, g, g | ||||||
|  | 	ADD       R12, R3, R11 | ||||||
|  | 	MOVW      $-(1<<26), R12 | ||||||
|  | 	ADD       R11>>26, R12, R12 | ||||||
|  | 	BIC       $0xfc000000, R11, R11 | ||||||
|  | 	ADD       R12, R4, R9 | ||||||
|  | 	MOVW      R9>>31, R12 | ||||||
|  | 	SUB       $1, R12 | ||||||
|  | 	AND       R12, R6, R6 | ||||||
|  | 	AND       R12, R7, R7 | ||||||
|  | 	AND       R12, g, g | ||||||
|  | 	AND       R12, R11, R11 | ||||||
|  | 	AND       R12, R9, R9 | ||||||
|  | 	MVN       R12, R12 | ||||||
|  | 	AND       R12, R0, R0 | ||||||
|  | 	AND       R12, R1, R1 | ||||||
|  | 	AND       R12, R2, R2 | ||||||
|  | 	AND       R12, R3, R3 | ||||||
|  | 	AND       R12, R4, R4 | ||||||
|  | 	ORR       R6, R0, R0 | ||||||
|  | 	ORR       R7, R1, R1 | ||||||
|  | 	ORR       g, R2, R2 | ||||||
|  | 	ORR       R11, R3, R3 | ||||||
|  | 	ORR       R9, R4, R4 | ||||||
|  | 	ORR       R1<<26, R0, R0 | ||||||
|  | 	MOVW      R1>>6, R1 | ||||||
|  | 	ORR       R2<<20, R1, R1 | ||||||
|  | 	MOVW      R2>>12, R2 | ||||||
|  | 	ORR       R3<<14, R2, R2 | ||||||
|  | 	MOVW      R3>>18, R3 | ||||||
|  | 	ORR       R4<<8, R3, R3 | ||||||
|  | 	MOVW      40(R5), R6 | ||||||
|  | 	MOVW      44(R5), R7 | ||||||
|  | 	MOVW      48(R5), g | ||||||
|  | 	MOVW      52(R5), R11 | ||||||
|  | 	ADD.S     R6, R0, R0 | ||||||
|  | 	ADC.S     R7, R1, R1 | ||||||
|  | 	ADC.S     g, R2, R2 | ||||||
|  | 	ADC.S     R11, R3, R3 | ||||||
|  | 	MOVM.IA   [R0-R3], (R8) | ||||||
|  | 	MOVW      R5, R12 | ||||||
|  | 	EOR       R0, R0, R0 | ||||||
|  | 	EOR       R1, R1, R1 | ||||||
|  | 	EOR       R2, R2, R2 | ||||||
|  | 	EOR       R3, R3, R3 | ||||||
|  | 	EOR       R4, R4, R4 | ||||||
|  | 	EOR       R5, R5, R5 | ||||||
|  | 	EOR       R6, R6, R6 | ||||||
|  | 	EOR       R7, R7, R7 | ||||||
|  | 	MOVM.IA.W [R0-R7], (R12) | ||||||
|  | 	MOVM.IA   [R0-R7], (R12) | ||||||
|  | 	MOVW      4(R13), g | ||||||
|  | 	RET | ||||||
							
								
								
									
										14
									
								
								vendor/golang.org/x/crypto/poly1305/sum_noasm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/golang.org/x/crypto/poly1305/sum_noasm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // +build s390x,!go1.11 !arm,!amd64,!s390x gccgo appengine nacl
 | ||||||
|  | 
 | ||||||
|  | package poly1305 | ||||||
|  | 
 | ||||||
|  | // Sum generates an authenticator for msg using a one-time key and puts the
 | ||||||
|  | // 16-byte result into out. Authenticating two different messages with the same
 | ||||||
|  | // key allows an attacker to forge messages at will.
 | ||||||
|  | func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { | ||||||
|  | 	sumGeneric(out, msg, key) | ||||||
|  | } | ||||||
							
								
								
									
										139
									
								
								vendor/golang.org/x/crypto/poly1305/sum_ref.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								vendor/golang.org/x/crypto/poly1305/sum_ref.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,139 @@ | |||||||
|  | // Copyright 2012 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | package poly1305 | ||||||
|  | 
 | ||||||
|  | import "encoding/binary" | ||||||
|  | 
 | ||||||
|  | // sumGeneric generates an authenticator for msg using a one-time key and
 | ||||||
|  | // puts the 16-byte result into out. This is the generic implementation of
 | ||||||
|  | // Sum and should be called if no assembly implementation is available.
 | ||||||
|  | func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) { | ||||||
|  | 	var ( | ||||||
|  | 		h0, h1, h2, h3, h4 uint32 // the hash accumulators
 | ||||||
|  | 		r0, r1, r2, r3, r4 uint64 // the r part of the key
 | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) | ||||||
|  | 	r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) | ||||||
|  | 	r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) | ||||||
|  | 	r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) | ||||||
|  | 	r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) | ||||||
|  | 
 | ||||||
|  | 	R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 | ||||||
|  | 
 | ||||||
|  | 	for len(msg) >= TagSize { | ||||||
|  | 		// h += msg
 | ||||||
|  | 		h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff | ||||||
|  | 		h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff | ||||||
|  | 		h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff | ||||||
|  | 		h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff | ||||||
|  | 		h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) | ||||||
|  | 
 | ||||||
|  | 		// h *= r
 | ||||||
|  | 		d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) | ||||||
|  | 		d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) | ||||||
|  | 		d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) | ||||||
|  | 		d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) | ||||||
|  | 		d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) | ||||||
|  | 
 | ||||||
|  | 		// h %= p
 | ||||||
|  | 		h0 = uint32(d0) & 0x3ffffff | ||||||
|  | 		h1 = uint32(d1) & 0x3ffffff | ||||||
|  | 		h2 = uint32(d2) & 0x3ffffff | ||||||
|  | 		h3 = uint32(d3) & 0x3ffffff | ||||||
|  | 		h4 = uint32(d4) & 0x3ffffff | ||||||
|  | 
 | ||||||
|  | 		h0 += uint32(d4>>26) * 5 | ||||||
|  | 		h1 += h0 >> 26 | ||||||
|  | 		h0 = h0 & 0x3ffffff | ||||||
|  | 
 | ||||||
|  | 		msg = msg[TagSize:] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(msg) > 0 { | ||||||
|  | 		var block [TagSize]byte | ||||||
|  | 		off := copy(block[:], msg) | ||||||
|  | 		block[off] = 0x01 | ||||||
|  | 
 | ||||||
|  | 		// h += msg
 | ||||||
|  | 		h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff | ||||||
|  | 		h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff | ||||||
|  | 		h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff | ||||||
|  | 		h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff | ||||||
|  | 		h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) | ||||||
|  | 
 | ||||||
|  | 		// h *= r
 | ||||||
|  | 		d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) | ||||||
|  | 		d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) | ||||||
|  | 		d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) | ||||||
|  | 		d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) | ||||||
|  | 		d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) | ||||||
|  | 
 | ||||||
|  | 		// h %= p
 | ||||||
|  | 		h0 = uint32(d0) & 0x3ffffff | ||||||
|  | 		h1 = uint32(d1) & 0x3ffffff | ||||||
|  | 		h2 = uint32(d2) & 0x3ffffff | ||||||
|  | 		h3 = uint32(d3) & 0x3ffffff | ||||||
|  | 		h4 = uint32(d4) & 0x3ffffff | ||||||
|  | 
 | ||||||
|  | 		h0 += uint32(d4>>26) * 5 | ||||||
|  | 		h1 += h0 >> 26 | ||||||
|  | 		h0 = h0 & 0x3ffffff | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// h %= p reduction
 | ||||||
|  | 	h2 += h1 >> 26 | ||||||
|  | 	h1 &= 0x3ffffff | ||||||
|  | 	h3 += h2 >> 26 | ||||||
|  | 	h2 &= 0x3ffffff | ||||||
|  | 	h4 += h3 >> 26 | ||||||
|  | 	h3 &= 0x3ffffff | ||||||
|  | 	h0 += 5 * (h4 >> 26) | ||||||
|  | 	h4 &= 0x3ffffff | ||||||
|  | 	h1 += h0 >> 26 | ||||||
|  | 	h0 &= 0x3ffffff | ||||||
|  | 
 | ||||||
|  | 	// h - p
 | ||||||
|  | 	t0 := h0 + 5 | ||||||
|  | 	t1 := h1 + (t0 >> 26) | ||||||
|  | 	t2 := h2 + (t1 >> 26) | ||||||
|  | 	t3 := h3 + (t2 >> 26) | ||||||
|  | 	t4 := h4 + (t3 >> 26) - (1 << 26) | ||||||
|  | 	t0 &= 0x3ffffff | ||||||
|  | 	t1 &= 0x3ffffff | ||||||
|  | 	t2 &= 0x3ffffff | ||||||
|  | 	t3 &= 0x3ffffff | ||||||
|  | 
 | ||||||
|  | 	// select h if h < p else h - p
 | ||||||
|  | 	t_mask := (t4 >> 31) - 1 | ||||||
|  | 	h_mask := ^t_mask | ||||||
|  | 	h0 = (h0 & h_mask) | (t0 & t_mask) | ||||||
|  | 	h1 = (h1 & h_mask) | (t1 & t_mask) | ||||||
|  | 	h2 = (h2 & h_mask) | (t2 & t_mask) | ||||||
|  | 	h3 = (h3 & h_mask) | (t3 & t_mask) | ||||||
|  | 	h4 = (h4 & h_mask) | (t4 & t_mask) | ||||||
|  | 
 | ||||||
|  | 	// h %= 2^128
 | ||||||
|  | 	h0 |= h1 << 26 | ||||||
|  | 	h1 = ((h1 >> 6) | (h2 << 20)) | ||||||
|  | 	h2 = ((h2 >> 12) | (h3 << 14)) | ||||||
|  | 	h3 = ((h3 >> 18) | (h4 << 8)) | ||||||
|  | 
 | ||||||
|  | 	// s: the s part of the key
 | ||||||
|  | 	// tag = (h + s) % (2^128)
 | ||||||
|  | 	t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) | ||||||
|  | 	h0 = uint32(t) | ||||||
|  | 	t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) | ||||||
|  | 	h1 = uint32(t) | ||||||
|  | 	t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) | ||||||
|  | 	h2 = uint32(t) | ||||||
|  | 	t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) | ||||||
|  | 	h3 = uint32(t) | ||||||
|  | 
 | ||||||
|  | 	binary.LittleEndian.PutUint32(out[0:], h0) | ||||||
|  | 	binary.LittleEndian.PutUint32(out[4:], h1) | ||||||
|  | 	binary.LittleEndian.PutUint32(out[8:], h2) | ||||||
|  | 	binary.LittleEndian.PutUint32(out[12:], h3) | ||||||
|  | } | ||||||
							
								
								
									
										49
									
								
								vendor/golang.org/x/crypto/poly1305/sum_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/golang.org/x/crypto/poly1305/sum_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // +build s390x,go1.11,!gccgo,!appengine
 | ||||||
|  | 
 | ||||||
|  | package poly1305 | ||||||
|  | 
 | ||||||
|  | // hasVectorFacility reports whether the machine supports
 | ||||||
|  | // the vector facility (vx).
 | ||||||
|  | func hasVectorFacility() bool | ||||||
|  | 
 | ||||||
|  | // hasVMSLFacility reports whether the machine supports
 | ||||||
|  | // Vector Multiply Sum Logical (VMSL).
 | ||||||
|  | func hasVMSLFacility() bool | ||||||
|  | 
 | ||||||
|  | var hasVX = hasVectorFacility() | ||||||
|  | var hasVMSL = hasVMSLFacility() | ||||||
|  | 
 | ||||||
|  | // poly1305vx is an assembly implementation of Poly1305 that uses vector
 | ||||||
|  | // instructions. It must only be called if the vector facility (vx) is
 | ||||||
|  | // available.
 | ||||||
|  | //go:noescape
 | ||||||
|  | func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]byte) | ||||||
|  | 
 | ||||||
|  | // poly1305vmsl is an assembly implementation of Poly1305 that uses vector
 | ||||||
|  | // instructions, including VMSL. It must only be called if the vector facility (vx) is
 | ||||||
|  | // available and if VMSL is supported.
 | ||||||
|  | //go:noescape
 | ||||||
|  | func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]byte) | ||||||
|  | 
 | ||||||
|  | // Sum generates an authenticator for m using a one-time key and puts the
 | ||||||
|  | // 16-byte result into out. Authenticating two different messages with the same
 | ||||||
|  | // key allows an attacker to forge messages at will.
 | ||||||
|  | func Sum(out *[16]byte, m []byte, key *[32]byte) { | ||||||
|  | 	if hasVX { | ||||||
|  | 		var mPtr *byte | ||||||
|  | 		if len(m) > 0 { | ||||||
|  | 			mPtr = &m[0] | ||||||
|  | 		} | ||||||
|  | 		if hasVMSL && len(m) > 256 { | ||||||
|  | 			poly1305vmsl(out, mPtr, uint64(len(m)), key) | ||||||
|  | 		} else { | ||||||
|  | 			poly1305vx(out, mPtr, uint64(len(m)), key) | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		sumGeneric(out, m, key) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										400
									
								
								vendor/golang.org/x/crypto/poly1305/sum_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										400
									
								
								vendor/golang.org/x/crypto/poly1305/sum_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,400 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | // +build s390x,go1.11,!gccgo,!appengine | ||||||
|  | 
 | ||||||
|  | #include "textflag.h" | ||||||
|  | 
 | ||||||
|  | // Implementation of Poly1305 using the vector facility (vx). | ||||||
|  | 
 | ||||||
|  | // constants | ||||||
|  | #define MOD26 V0 | ||||||
|  | #define EX0   V1 | ||||||
|  | #define EX1   V2 | ||||||
|  | #define EX2   V3 | ||||||
|  | 
 | ||||||
|  | // temporaries | ||||||
|  | #define T_0 V4 | ||||||
|  | #define T_1 V5 | ||||||
|  | #define T_2 V6 | ||||||
|  | #define T_3 V7 | ||||||
|  | #define T_4 V8 | ||||||
|  | 
 | ||||||
|  | // key (r) | ||||||
|  | #define R_0  V9 | ||||||
|  | #define R_1  V10 | ||||||
|  | #define R_2  V11 | ||||||
|  | #define R_3  V12 | ||||||
|  | #define R_4  V13 | ||||||
|  | #define R5_1 V14 | ||||||
|  | #define R5_2 V15 | ||||||
|  | #define R5_3 V16 | ||||||
|  | #define R5_4 V17 | ||||||
|  | #define RSAVE_0 R5 | ||||||
|  | #define RSAVE_1 R6 | ||||||
|  | #define RSAVE_2 R7 | ||||||
|  | #define RSAVE_3 R8 | ||||||
|  | #define RSAVE_4 R9 | ||||||
|  | #define R5SAVE_1 V28 | ||||||
|  | #define R5SAVE_2 V29 | ||||||
|  | #define R5SAVE_3 V30 | ||||||
|  | #define R5SAVE_4 V31 | ||||||
|  | 
 | ||||||
|  | // message block | ||||||
|  | #define F_0 V18 | ||||||
|  | #define F_1 V19 | ||||||
|  | #define F_2 V20 | ||||||
|  | #define F_3 V21 | ||||||
|  | #define F_4 V22 | ||||||
|  | 
 | ||||||
|  | // accumulator | ||||||
|  | #define H_0 V23 | ||||||
|  | #define H_1 V24 | ||||||
|  | #define H_2 V25 | ||||||
|  | #define H_3 V26 | ||||||
|  | #define H_4 V27 | ||||||
|  | 
 | ||||||
|  | GLOBL ·keyMask<>(SB), RODATA, $16 | ||||||
|  | DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f | ||||||
|  | DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f | ||||||
|  | 
 | ||||||
|  | GLOBL ·bswapMask<>(SB), RODATA, $16 | ||||||
|  | DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908 | ||||||
|  | DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100 | ||||||
|  | 
 | ||||||
|  | GLOBL ·constants<>(SB), RODATA, $64 | ||||||
|  | // MOD26 | ||||||
|  | DATA ·constants<>+0(SB)/8, $0x3ffffff | ||||||
|  | DATA ·constants<>+8(SB)/8, $0x3ffffff | ||||||
|  | // EX0 | ||||||
|  | DATA ·constants<>+16(SB)/8, $0x0006050403020100 | ||||||
|  | DATA ·constants<>+24(SB)/8, $0x1016151413121110 | ||||||
|  | // EX1 | ||||||
|  | DATA ·constants<>+32(SB)/8, $0x060c0b0a09080706 | ||||||
|  | DATA ·constants<>+40(SB)/8, $0x161c1b1a19181716 | ||||||
|  | // EX2 | ||||||
|  | DATA ·constants<>+48(SB)/8, $0x0d0d0d0d0d0f0e0d | ||||||
|  | DATA ·constants<>+56(SB)/8, $0x1d1d1d1d1d1f1e1d | ||||||
|  | 
 | ||||||
|  | // h = (f*g) % (2**130-5) [partial reduction] | ||||||
|  | #define MULTIPLY(f0, f1, f2, f3, f4, g0, g1, g2, g3, g4, g51, g52, g53, g54, h0, h1, h2, h3, h4) \ | ||||||
|  | 	VMLOF  f0, g0, h0        \ | ||||||
|  | 	VMLOF  f0, g1, h1        \ | ||||||
|  | 	VMLOF  f0, g2, h2        \ | ||||||
|  | 	VMLOF  f0, g3, h3        \ | ||||||
|  | 	VMLOF  f0, g4, h4        \ | ||||||
|  | 	VMLOF  f1, g54, T_0      \ | ||||||
|  | 	VMLOF  f1, g0, T_1       \ | ||||||
|  | 	VMLOF  f1, g1, T_2       \ | ||||||
|  | 	VMLOF  f1, g2, T_3       \ | ||||||
|  | 	VMLOF  f1, g3, T_4       \ | ||||||
|  | 	VMALOF f2, g53, h0, h0   \ | ||||||
|  | 	VMALOF f2, g54, h1, h1   \ | ||||||
|  | 	VMALOF f2, g0, h2, h2    \ | ||||||
|  | 	VMALOF f2, g1, h3, h3    \ | ||||||
|  | 	VMALOF f2, g2, h4, h4    \ | ||||||
|  | 	VMALOF f3, g52, T_0, T_0 \ | ||||||
|  | 	VMALOF f3, g53, T_1, T_1 \ | ||||||
|  | 	VMALOF f3, g54, T_2, T_2 \ | ||||||
|  | 	VMALOF f3, g0, T_3, T_3  \ | ||||||
|  | 	VMALOF f3, g1, T_4, T_4  \ | ||||||
|  | 	VMALOF f4, g51, h0, h0   \ | ||||||
|  | 	VMALOF f4, g52, h1, h1   \ | ||||||
|  | 	VMALOF f4, g53, h2, h2   \ | ||||||
|  | 	VMALOF f4, g54, h3, h3   \ | ||||||
|  | 	VMALOF f4, g0, h4, h4    \ | ||||||
|  | 	VAG    T_0, h0, h0       \ | ||||||
|  | 	VAG    T_1, h1, h1       \ | ||||||
|  | 	VAG    T_2, h2, h2       \ | ||||||
|  | 	VAG    T_3, h3, h3       \ | ||||||
|  | 	VAG    T_4, h4, h4 | ||||||
|  | 
 | ||||||
|  | // carry h0->h1 h3->h4, h1->h2 h4->h0, h0->h1 h2->h3, h3->h4 | ||||||
|  | #define REDUCE(h0, h1, h2, h3, h4) \ | ||||||
|  | 	VESRLG $26, h0, T_0  \ | ||||||
|  | 	VESRLG $26, h3, T_1  \ | ||||||
|  | 	VN     MOD26, h0, h0 \ | ||||||
|  | 	VN     MOD26, h3, h3 \ | ||||||
|  | 	VAG    T_0, h1, h1   \ | ||||||
|  | 	VAG    T_1, h4, h4   \ | ||||||
|  | 	VESRLG $26, h1, T_2  \ | ||||||
|  | 	VESRLG $26, h4, T_3  \ | ||||||
|  | 	VN     MOD26, h1, h1 \ | ||||||
|  | 	VN     MOD26, h4, h4 \ | ||||||
|  | 	VESLG  $2, T_3, T_4  \ | ||||||
|  | 	VAG    T_3, T_4, T_4 \ | ||||||
|  | 	VAG    T_2, h2, h2   \ | ||||||
|  | 	VAG    T_4, h0, h0   \ | ||||||
|  | 	VESRLG $26, h2, T_0  \ | ||||||
|  | 	VESRLG $26, h0, T_1  \ | ||||||
|  | 	VN     MOD26, h2, h2 \ | ||||||
|  | 	VN     MOD26, h0, h0 \ | ||||||
|  | 	VAG    T_0, h3, h3   \ | ||||||
|  | 	VAG    T_1, h1, h1   \ | ||||||
|  | 	VESRLG $26, h3, T_2  \ | ||||||
|  | 	VN     MOD26, h3, h3 \ | ||||||
|  | 	VAG    T_2, h4, h4 | ||||||
|  | 
 | ||||||
|  | // expand in0 into d[0] and in1 into d[1] | ||||||
|  | #define EXPAND(in0, in1, d0, d1, d2, d3, d4) \ | ||||||
|  | 	VGBM   $0x0707, d1       \ // d1=tmp | ||||||
|  | 	VPERM  in0, in1, EX2, d4 \ | ||||||
|  | 	VPERM  in0, in1, EX0, d0 \ | ||||||
|  | 	VPERM  in0, in1, EX1, d2 \ | ||||||
|  | 	VN     d1, d4, d4        \ | ||||||
|  | 	VESRLG $26, d0, d1       \ | ||||||
|  | 	VESRLG $30, d2, d3       \ | ||||||
|  | 	VESRLG $4, d2, d2        \ | ||||||
|  | 	VN     MOD26, d0, d0     \ | ||||||
|  | 	VN     MOD26, d1, d1     \ | ||||||
|  | 	VN     MOD26, d2, d2     \ | ||||||
|  | 	VN     MOD26, d3, d3 | ||||||
|  | 
 | ||||||
|  | // pack h4:h0 into h1:h0 (no carry) | ||||||
|  | #define PACK(h0, h1, h2, h3, h4) \ | ||||||
|  | 	VESLG $26, h1, h1  \ | ||||||
|  | 	VESLG $26, h3, h3  \ | ||||||
|  | 	VO    h0, h1, h0   \ | ||||||
|  | 	VO    h2, h3, h2   \ | ||||||
|  | 	VESLG $4, h2, h2   \ | ||||||
|  | 	VLEIB $7, $48, h1  \ | ||||||
|  | 	VSLB  h1, h2, h2   \ | ||||||
|  | 	VO    h0, h2, h0   \ | ||||||
|  | 	VLEIB $7, $104, h1 \ | ||||||
|  | 	VSLB  h1, h4, h3   \ | ||||||
|  | 	VO    h3, h0, h0   \ | ||||||
|  | 	VLEIB $7, $24, h1  \ | ||||||
|  | 	VSRLB h1, h4, h1 | ||||||
|  | 
 | ||||||
|  | // if h > 2**130-5 then h -= 2**130-5 | ||||||
|  | #define MOD(h0, h1, t0, t1, t2) \ | ||||||
|  | 	VZERO t0          \ | ||||||
|  | 	VLEIG $1, $5, t0  \ | ||||||
|  | 	VACCQ h0, t0, t1  \ | ||||||
|  | 	VAQ   h0, t0, t0  \ | ||||||
|  | 	VONE  t2          \ | ||||||
|  | 	VLEIG $1, $-4, t2 \ | ||||||
|  | 	VAQ   t2, t1, t1  \ | ||||||
|  | 	VACCQ h1, t1, t1  \ | ||||||
|  | 	VONE  t2          \ | ||||||
|  | 	VAQ   t2, t1, t1  \ | ||||||
|  | 	VN    h0, t1, t2  \ | ||||||
|  | 	VNC   t0, t1, t1  \ | ||||||
|  | 	VO    t1, t2, h0 | ||||||
|  | 
 | ||||||
|  | // func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]key) | ||||||
|  | TEXT ·poly1305vx(SB), $0-32 | ||||||
|  | 	// This code processes up to 2 blocks (32 bytes) per iteration | ||||||
|  | 	// using the algorithm described in: | ||||||
|  | 	// NEON crypto, Daniel J. Bernstein & Peter Schwabe | ||||||
|  | 	// https://cryptojedi.org/papers/neoncrypto-20120320.pdf | ||||||
|  | 	LMG out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key | ||||||
|  | 
 | ||||||
|  | 	// load MOD26, EX0, EX1 and EX2 | ||||||
|  | 	MOVD $·constants<>(SB), R5 | ||||||
|  | 	VLM  (R5), MOD26, EX2 | ||||||
|  | 
 | ||||||
|  | 	// setup r | ||||||
|  | 	VL   (R4), T_0 | ||||||
|  | 	MOVD $·keyMask<>(SB), R6 | ||||||
|  | 	VL   (R6), T_1 | ||||||
|  | 	VN   T_0, T_1, T_0 | ||||||
|  | 	EXPAND(T_0, T_0, R_0, R_1, R_2, R_3, R_4) | ||||||
|  | 
 | ||||||
|  | 	// setup r*5 | ||||||
|  | 	VLEIG $0, $5, T_0 | ||||||
|  | 	VLEIG $1, $5, T_0 | ||||||
|  | 
 | ||||||
|  | 	// store r (for final block) | ||||||
|  | 	VMLOF T_0, R_1, R5SAVE_1 | ||||||
|  | 	VMLOF T_0, R_2, R5SAVE_2 | ||||||
|  | 	VMLOF T_0, R_3, R5SAVE_3 | ||||||
|  | 	VMLOF T_0, R_4, R5SAVE_4 | ||||||
|  | 	VLGVG $0, R_0, RSAVE_0 | ||||||
|  | 	VLGVG $0, R_1, RSAVE_1 | ||||||
|  | 	VLGVG $0, R_2, RSAVE_2 | ||||||
|  | 	VLGVG $0, R_3, RSAVE_3 | ||||||
|  | 	VLGVG $0, R_4, RSAVE_4 | ||||||
|  | 
 | ||||||
|  | 	// skip r**2 calculation | ||||||
|  | 	CMPBLE R3, $16, skip | ||||||
|  | 
 | ||||||
|  | 	// calculate r**2 | ||||||
|  | 	MULTIPLY(R_0, R_1, R_2, R_3, R_4, R_0, R_1, R_2, R_3, R_4, R5SAVE_1, R5SAVE_2, R5SAVE_3, R5SAVE_4, H_0, H_1, H_2, H_3, H_4) | ||||||
|  | 	REDUCE(H_0, H_1, H_2, H_3, H_4) | ||||||
|  | 	VLEIG $0, $5, T_0 | ||||||
|  | 	VLEIG $1, $5, T_0 | ||||||
|  | 	VMLOF T_0, H_1, R5_1 | ||||||
|  | 	VMLOF T_0, H_2, R5_2 | ||||||
|  | 	VMLOF T_0, H_3, R5_3 | ||||||
|  | 	VMLOF T_0, H_4, R5_4 | ||||||
|  | 	VLR   H_0, R_0 | ||||||
|  | 	VLR   H_1, R_1 | ||||||
|  | 	VLR   H_2, R_2 | ||||||
|  | 	VLR   H_3, R_3 | ||||||
|  | 	VLR   H_4, R_4 | ||||||
|  | 
 | ||||||
|  | 	// initialize h | ||||||
|  | 	VZERO H_0 | ||||||
|  | 	VZERO H_1 | ||||||
|  | 	VZERO H_2 | ||||||
|  | 	VZERO H_3 | ||||||
|  | 	VZERO H_4 | ||||||
|  | 
 | ||||||
|  | loop: | ||||||
|  | 	CMPBLE R3, $32, b2 | ||||||
|  | 	VLM    (R2), T_0, T_1 | ||||||
|  | 	SUB    $32, R3 | ||||||
|  | 	MOVD   $32(R2), R2 | ||||||
|  | 	EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) | ||||||
|  | 	VLEIB  $4, $1, F_4 | ||||||
|  | 	VLEIB  $12, $1, F_4 | ||||||
|  | 
 | ||||||
|  | multiply: | ||||||
|  | 	VAG    H_0, F_0, F_0 | ||||||
|  | 	VAG    H_1, F_1, F_1 | ||||||
|  | 	VAG    H_2, F_2, F_2 | ||||||
|  | 	VAG    H_3, F_3, F_3 | ||||||
|  | 	VAG    H_4, F_4, F_4 | ||||||
|  | 	MULTIPLY(F_0, F_1, F_2, F_3, F_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, H_0, H_1, H_2, H_3, H_4) | ||||||
|  | 	REDUCE(H_0, H_1, H_2, H_3, H_4) | ||||||
|  | 	CMPBNE R3, $0, loop | ||||||
|  | 
 | ||||||
|  | finish: | ||||||
|  | 	// sum vectors | ||||||
|  | 	VZERO  T_0 | ||||||
|  | 	VSUMQG H_0, T_0, H_0 | ||||||
|  | 	VSUMQG H_1, T_0, H_1 | ||||||
|  | 	VSUMQG H_2, T_0, H_2 | ||||||
|  | 	VSUMQG H_3, T_0, H_3 | ||||||
|  | 	VSUMQG H_4, T_0, H_4 | ||||||
|  | 
 | ||||||
|  | 	// h may be >= 2*(2**130-5) so we need to reduce it again | ||||||
|  | 	REDUCE(H_0, H_1, H_2, H_3, H_4) | ||||||
|  | 
 | ||||||
|  | 	// carry h1->h4 | ||||||
|  | 	VESRLG $26, H_1, T_1 | ||||||
|  | 	VN     MOD26, H_1, H_1 | ||||||
|  | 	VAQ    T_1, H_2, H_2 | ||||||
|  | 	VESRLG $26, H_2, T_2 | ||||||
|  | 	VN     MOD26, H_2, H_2 | ||||||
|  | 	VAQ    T_2, H_3, H_3 | ||||||
|  | 	VESRLG $26, H_3, T_3 | ||||||
|  | 	VN     MOD26, H_3, H_3 | ||||||
|  | 	VAQ    T_3, H_4, H_4 | ||||||
|  | 
 | ||||||
|  | 	// h is now < 2*(2**130-5) | ||||||
|  | 	// pack h into h1 (hi) and h0 (lo) | ||||||
|  | 	PACK(H_0, H_1, H_2, H_3, H_4) | ||||||
|  | 
 | ||||||
|  | 	// if h > 2**130-5 then h -= 2**130-5 | ||||||
|  | 	MOD(H_0, H_1, T_0, T_1, T_2) | ||||||
|  | 
 | ||||||
|  | 	// h += s | ||||||
|  | 	MOVD  $·bswapMask<>(SB), R5 | ||||||
|  | 	VL    (R5), T_1 | ||||||
|  | 	VL    16(R4), T_0 | ||||||
|  | 	VPERM T_0, T_0, T_1, T_0    // reverse bytes (to big) | ||||||
|  | 	VAQ   T_0, H_0, H_0 | ||||||
|  | 	VPERM H_0, H_0, T_1, H_0    // reverse bytes (to little) | ||||||
|  | 	VST   H_0, (R1) | ||||||
|  | 
 | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | b2: | ||||||
|  | 	CMPBLE R3, $16, b1 | ||||||
|  | 
 | ||||||
|  | 	// 2 blocks remaining | ||||||
|  | 	SUB    $17, R3 | ||||||
|  | 	VL     (R2), T_0 | ||||||
|  | 	VLL    R3, 16(R2), T_1 | ||||||
|  | 	ADD    $1, R3 | ||||||
|  | 	MOVBZ  $1, R0 | ||||||
|  | 	CMPBEQ R3, $16, 2(PC) | ||||||
|  | 	VLVGB  R3, R0, T_1 | ||||||
|  | 	EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) | ||||||
|  | 	CMPBNE R3, $16, 2(PC) | ||||||
|  | 	VLEIB  $12, $1, F_4 | ||||||
|  | 	VLEIB  $4, $1, F_4 | ||||||
|  | 
 | ||||||
|  | 	// setup [r²,r] | ||||||
|  | 	VLVGG $1, RSAVE_0, R_0 | ||||||
|  | 	VLVGG $1, RSAVE_1, R_1 | ||||||
|  | 	VLVGG $1, RSAVE_2, R_2 | ||||||
|  | 	VLVGG $1, RSAVE_3, R_3 | ||||||
|  | 	VLVGG $1, RSAVE_4, R_4 | ||||||
|  | 	VPDI  $0, R5_1, R5SAVE_1, R5_1 | ||||||
|  | 	VPDI  $0, R5_2, R5SAVE_2, R5_2 | ||||||
|  | 	VPDI  $0, R5_3, R5SAVE_3, R5_3 | ||||||
|  | 	VPDI  $0, R5_4, R5SAVE_4, R5_4 | ||||||
|  | 
 | ||||||
|  | 	MOVD $0, R3 | ||||||
|  | 	BR   multiply | ||||||
|  | 
 | ||||||
|  | skip: | ||||||
|  | 	VZERO H_0 | ||||||
|  | 	VZERO H_1 | ||||||
|  | 	VZERO H_2 | ||||||
|  | 	VZERO H_3 | ||||||
|  | 	VZERO H_4 | ||||||
|  | 
 | ||||||
|  | 	CMPBEQ R3, $0, finish | ||||||
|  | 
 | ||||||
|  | b1: | ||||||
|  | 	// 1 block remaining | ||||||
|  | 	SUB    $1, R3 | ||||||
|  | 	VLL    R3, (R2), T_0 | ||||||
|  | 	ADD    $1, R3 | ||||||
|  | 	MOVBZ  $1, R0 | ||||||
|  | 	CMPBEQ R3, $16, 2(PC) | ||||||
|  | 	VLVGB  R3, R0, T_0 | ||||||
|  | 	VZERO  T_1 | ||||||
|  | 	EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) | ||||||
|  | 	CMPBNE R3, $16, 2(PC) | ||||||
|  | 	VLEIB  $4, $1, F_4 | ||||||
|  | 	VLEIG  $1, $1, R_0 | ||||||
|  | 	VZERO  R_1 | ||||||
|  | 	VZERO  R_2 | ||||||
|  | 	VZERO  R_3 | ||||||
|  | 	VZERO  R_4 | ||||||
|  | 	VZERO  R5_1 | ||||||
|  | 	VZERO  R5_2 | ||||||
|  | 	VZERO  R5_3 | ||||||
|  | 	VZERO  R5_4 | ||||||
|  | 
 | ||||||
|  | 	// setup [r, 1] | ||||||
|  | 	VLVGG $0, RSAVE_0, R_0 | ||||||
|  | 	VLVGG $0, RSAVE_1, R_1 | ||||||
|  | 	VLVGG $0, RSAVE_2, R_2 | ||||||
|  | 	VLVGG $0, RSAVE_3, R_3 | ||||||
|  | 	VLVGG $0, RSAVE_4, R_4 | ||||||
|  | 	VPDI  $0, R5SAVE_1, R5_1, R5_1 | ||||||
|  | 	VPDI  $0, R5SAVE_2, R5_2, R5_2 | ||||||
|  | 	VPDI  $0, R5SAVE_3, R5_3, R5_3 | ||||||
|  | 	VPDI  $0, R5SAVE_4, R5_4, R5_4 | ||||||
|  | 
 | ||||||
|  | 	MOVD $0, R3 | ||||||
|  | 	BR   multiply | ||||||
|  | 
 | ||||||
|  | TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1 | ||||||
|  | 	MOVD  $x-24(SP), R1 | ||||||
|  | 	XC    $24, 0(R1), 0(R1) // clear the storage | ||||||
|  | 	MOVD  $2, R0            // R0 is the number of double words stored -1 | ||||||
|  | 	WORD  $0xB2B01000       // STFLE 0(R1) | ||||||
|  | 	XOR   R0, R0            // reset the value of R0 | ||||||
|  | 	MOVBZ z-8(SP), R1 | ||||||
|  | 	AND   $0x40, R1 | ||||||
|  | 	BEQ   novector | ||||||
|  | 
 | ||||||
|  | vectorinstalled: | ||||||
|  | 	// check if the vector instruction has been enabled | ||||||
|  | 	VLEIB  $0, $0xF, V16 | ||||||
|  | 	VLGVB  $0, V16, R1 | ||||||
|  | 	CMPBNE R1, $0xF, novector | ||||||
|  | 	MOVB   $1, ret+0(FP)      // have vx | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | novector: | ||||||
|  | 	MOVB $0, ret+0(FP) // no vx | ||||||
|  | 	RET | ||||||
							
								
								
									
										931
									
								
								vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										931
									
								
								vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,931 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | // +build s390x,go1.11,!gccgo,!appengine | ||||||
|  | 
 | ||||||
|  | #include "textflag.h" | ||||||
|  | 
 | ||||||
|  | // Implementation of Poly1305 using the vector facility (vx) and the VMSL instruction. | ||||||
|  | 
 | ||||||
|  | // constants | ||||||
|  | #define EX0   V1 | ||||||
|  | #define EX1   V2 | ||||||
|  | #define EX2   V3 | ||||||
|  | 
 | ||||||
|  | // temporaries | ||||||
|  | #define T_0 V4 | ||||||
|  | #define T_1 V5 | ||||||
|  | #define T_2 V6 | ||||||
|  | #define T_3 V7 | ||||||
|  | #define T_4 V8 | ||||||
|  | #define T_5 V9 | ||||||
|  | #define T_6 V10 | ||||||
|  | #define T_7 V11 | ||||||
|  | #define T_8 V12 | ||||||
|  | #define T_9 V13 | ||||||
|  | #define T_10 V14 | ||||||
|  | 
 | ||||||
|  | // r**2 & r**4 | ||||||
|  | #define R_0  V15 | ||||||
|  | #define R_1  V16 | ||||||
|  | #define R_2  V17 | ||||||
|  | #define R5_1 V18 | ||||||
|  | #define R5_2 V19 | ||||||
|  | // key (r) | ||||||
|  | #define RSAVE_0 R7 | ||||||
|  | #define RSAVE_1 R8 | ||||||
|  | #define RSAVE_2 R9 | ||||||
|  | #define R5SAVE_1 R10 | ||||||
|  | #define R5SAVE_2 R11 | ||||||
|  | 
 | ||||||
|  | // message block | ||||||
|  | #define M0 V20 | ||||||
|  | #define M1 V21 | ||||||
|  | #define M2 V22 | ||||||
|  | #define M3 V23 | ||||||
|  | #define M4 V24 | ||||||
|  | #define M5 V25 | ||||||
|  | 
 | ||||||
|  | // accumulator | ||||||
|  | #define H0_0 V26 | ||||||
|  | #define H1_0 V27 | ||||||
|  | #define H2_0 V28 | ||||||
|  | #define H0_1 V29 | ||||||
|  | #define H1_1 V30 | ||||||
|  | #define H2_1 V31 | ||||||
|  | 
 | ||||||
|  | GLOBL ·keyMask<>(SB), RODATA, $16 | ||||||
|  | DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f | ||||||
|  | DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f | ||||||
|  | 
 | ||||||
|  | GLOBL ·bswapMask<>(SB), RODATA, $16 | ||||||
|  | DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908 | ||||||
|  | DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100 | ||||||
|  | 
 | ||||||
|  | GLOBL ·constants<>(SB), RODATA, $48 | ||||||
|  | // EX0 | ||||||
|  | DATA ·constants<>+0(SB)/8, $0x18191a1b1c1d1e1f | ||||||
|  | DATA ·constants<>+8(SB)/8, $0x0000050403020100 | ||||||
|  | // EX1 | ||||||
|  | DATA ·constants<>+16(SB)/8, $0x18191a1b1c1d1e1f | ||||||
|  | DATA ·constants<>+24(SB)/8, $0x00000a0908070605 | ||||||
|  | // EX2 | ||||||
|  | DATA ·constants<>+32(SB)/8, $0x18191a1b1c1d1e1f | ||||||
|  | DATA ·constants<>+40(SB)/8, $0x0000000f0e0d0c0b | ||||||
|  | 
 | ||||||
|  | GLOBL ·c<>(SB), RODATA, $48 | ||||||
|  | // EX0 | ||||||
|  | DATA ·c<>+0(SB)/8, $0x0000050403020100 | ||||||
|  | DATA ·c<>+8(SB)/8, $0x0000151413121110 | ||||||
|  | // EX1 | ||||||
|  | DATA ·c<>+16(SB)/8, $0x00000a0908070605 | ||||||
|  | DATA ·c<>+24(SB)/8, $0x00001a1918171615 | ||||||
|  | // EX2 | ||||||
|  | DATA ·c<>+32(SB)/8, $0x0000000f0e0d0c0b | ||||||
|  | DATA ·c<>+40(SB)/8, $0x0000001f1e1d1c1b | ||||||
|  | 
 | ||||||
|  | GLOBL ·reduce<>(SB), RODATA, $32 | ||||||
|  | // 44 bit | ||||||
|  | DATA ·reduce<>+0(SB)/8, $0x0 | ||||||
|  | DATA ·reduce<>+8(SB)/8, $0xfffffffffff | ||||||
|  | // 42 bit | ||||||
|  | DATA ·reduce<>+16(SB)/8, $0x0 | ||||||
|  | DATA ·reduce<>+24(SB)/8, $0x3ffffffffff | ||||||
|  | 
 | ||||||
|  | // h = (f*g) % (2**130-5) [partial reduction] | ||||||
|  | // uses T_0...T_9 temporary registers | ||||||
|  | // input: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2 | ||||||
|  | // temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9 | ||||||
|  | // output: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2 | ||||||
|  | #define MULTIPLY(m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ | ||||||
|  | 	\ // Eliminate the dependency for the last 2 VMSLs | ||||||
|  | 	VMSLG m02_0, r_2, m4_2, m4_2                       \ | ||||||
|  | 	VMSLG m13_0, r_2, m5_2, m5_2                       \ // 8 VMSLs pipelined | ||||||
|  | 	VMSLG m02_0, r_0, m4_0, m4_0                       \ | ||||||
|  | 	VMSLG m02_1, r5_2, V0, T_0                         \ | ||||||
|  | 	VMSLG m02_0, r_1, m4_1, m4_1                       \ | ||||||
|  | 	VMSLG m02_1, r_0, V0, T_1                          \ | ||||||
|  | 	VMSLG m02_1, r_1, V0, T_2                          \ | ||||||
|  | 	VMSLG m02_2, r5_1, V0, T_3                         \ | ||||||
|  | 	VMSLG m02_2, r5_2, V0, T_4                         \ | ||||||
|  | 	VMSLG m13_0, r_0, m5_0, m5_0                       \ | ||||||
|  | 	VMSLG m13_1, r5_2, V0, T_5                         \ | ||||||
|  | 	VMSLG m13_0, r_1, m5_1, m5_1                       \ | ||||||
|  | 	VMSLG m13_1, r_0, V0, T_6                          \ | ||||||
|  | 	VMSLG m13_1, r_1, V0, T_7                          \ | ||||||
|  | 	VMSLG m13_2, r5_1, V0, T_8                         \ | ||||||
|  | 	VMSLG m13_2, r5_2, V0, T_9                         \ | ||||||
|  | 	VMSLG m02_2, r_0, m4_2, m4_2                       \ | ||||||
|  | 	VMSLG m13_2, r_0, m5_2, m5_2                       \ | ||||||
|  | 	VAQ   m4_0, T_0, m02_0                             \ | ||||||
|  | 	VAQ   m4_1, T_1, m02_1                             \ | ||||||
|  | 	VAQ   m5_0, T_5, m13_0                             \ | ||||||
|  | 	VAQ   m5_1, T_6, m13_1                             \ | ||||||
|  | 	VAQ   m02_0, T_3, m02_0                            \ | ||||||
|  | 	VAQ   m02_1, T_4, m02_1                            \ | ||||||
|  | 	VAQ   m13_0, T_8, m13_0                            \ | ||||||
|  | 	VAQ   m13_1, T_9, m13_1                            \ | ||||||
|  | 	VAQ   m4_2, T_2, m02_2                             \ | ||||||
|  | 	VAQ   m5_2, T_7, m13_2                             \ | ||||||
|  | 
 | ||||||
|  | // SQUARE uses three limbs of r and r_2*5 to output square of r | ||||||
|  | // uses T_1, T_5 and T_7 temporary registers | ||||||
|  | // input: r_0, r_1, r_2, r5_2 | ||||||
|  | // temp: TEMP0, TEMP1, TEMP2 | ||||||
|  | // output: p0, p1, p2 | ||||||
|  | #define SQUARE(r_0, r_1, r_2, r5_2, p0, p1, p2, TEMP0, TEMP1, TEMP2) \ | ||||||
|  | 	VMSLG r_0, r_0, p0, p0     \ | ||||||
|  | 	VMSLG r_1, r5_2, V0, TEMP0 \ | ||||||
|  | 	VMSLG r_2, r5_2, p1, p1    \ | ||||||
|  | 	VMSLG r_0, r_1, V0, TEMP1  \ | ||||||
|  | 	VMSLG r_1, r_1, p2, p2     \ | ||||||
|  | 	VMSLG r_0, r_2, V0, TEMP2  \ | ||||||
|  | 	VAQ   TEMP0, p0, p0        \ | ||||||
|  | 	VAQ   TEMP1, p1, p1        \ | ||||||
|  | 	VAQ   TEMP2, p2, p2        \ | ||||||
|  | 	VAQ   TEMP0, p0, p0        \ | ||||||
|  | 	VAQ   TEMP1, p1, p1        \ | ||||||
|  | 	VAQ   TEMP2, p2, p2        \ | ||||||
|  | 
 | ||||||
|  | // carry h0->h1->h2->h0 || h3->h4->h5->h3 | ||||||
|  | // uses T_2, T_4, T_5, T_7, T_8, T_9 | ||||||
|  | //       t6,  t7,  t8,  t9, t10, t11 | ||||||
|  | // input: h0, h1, h2, h3, h4, h5 | ||||||
|  | // temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 | ||||||
|  | // output: h0, h1, h2, h3, h4, h5 | ||||||
|  | #define REDUCE(h0, h1, h2, h3, h4, h5, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) \ | ||||||
|  | 	VLM    (R12), t6, t7  \ // 44 and 42 bit clear mask | ||||||
|  | 	VLEIB  $7, $0x28, t10 \ // 5 byte shift mask | ||||||
|  | 	VREPIB $4, t8         \ // 4 bit shift mask | ||||||
|  | 	VREPIB $2, t11        \ // 2 bit shift mask | ||||||
|  | 	VSRLB  t10, h0, t0    \ // h0 byte shift | ||||||
|  | 	VSRLB  t10, h1, t1    \ // h1 byte shift | ||||||
|  | 	VSRLB  t10, h2, t2    \ // h2 byte shift | ||||||
|  | 	VSRLB  t10, h3, t3    \ // h3 byte shift | ||||||
|  | 	VSRLB  t10, h4, t4    \ // h4 byte shift | ||||||
|  | 	VSRLB  t10, h5, t5    \ // h5 byte shift | ||||||
|  | 	VSRL   t8, t0, t0     \ // h0 bit shift | ||||||
|  | 	VSRL   t8, t1, t1     \ // h2 bit shift | ||||||
|  | 	VSRL   t11, t2, t2    \ // h2 bit shift | ||||||
|  | 	VSRL   t8, t3, t3     \ // h3 bit shift | ||||||
|  | 	VSRL   t8, t4, t4     \ // h4 bit shift | ||||||
|  | 	VESLG  $2, t2, t9     \ // h2 carry x5 | ||||||
|  | 	VSRL   t11, t5, t5    \ // h5 bit shift | ||||||
|  | 	VN     t6, h0, h0     \ // h0 clear carry | ||||||
|  | 	VAQ    t2, t9, t2     \ // h2 carry x5 | ||||||
|  | 	VESLG  $2, t5, t9     \ // h5 carry x5 | ||||||
|  | 	VN     t6, h1, h1     \ // h1 clear carry | ||||||
|  | 	VN     t7, h2, h2     \ // h2 clear carry | ||||||
|  | 	VAQ    t5, t9, t5     \ // h5 carry x5 | ||||||
|  | 	VN     t6, h3, h3     \ // h3 clear carry | ||||||
|  | 	VN     t6, h4, h4     \ // h4 clear carry | ||||||
|  | 	VN     t7, h5, h5     \ // h5 clear carry | ||||||
|  | 	VAQ    t0, h1, h1     \ // h0->h1 | ||||||
|  | 	VAQ    t3, h4, h4     \ // h3->h4 | ||||||
|  | 	VAQ    t1, h2, h2     \ // h1->h2 | ||||||
|  | 	VAQ    t4, h5, h5     \ // h4->h5 | ||||||
|  | 	VAQ    t2, h0, h0     \ // h2->h0 | ||||||
|  | 	VAQ    t5, h3, h3     \ // h5->h3 | ||||||
|  | 	VREPG  $1, t6, t6     \ // 44 and 42 bit masks across both halves | ||||||
|  | 	VREPG  $1, t7, t7     \ | ||||||
|  | 	VSLDB  $8, h0, h0, h0 \ // set up [h0/1/2, h3/4/5] | ||||||
|  | 	VSLDB  $8, h1, h1, h1 \ | ||||||
|  | 	VSLDB  $8, h2, h2, h2 \ | ||||||
|  | 	VO     h0, h3, h3     \ | ||||||
|  | 	VO     h1, h4, h4     \ | ||||||
|  | 	VO     h2, h5, h5     \ | ||||||
|  | 	VESRLG $44, h3, t0    \ // 44 bit shift right | ||||||
|  | 	VESRLG $44, h4, t1    \ | ||||||
|  | 	VESRLG $42, h5, t2    \ | ||||||
|  | 	VN     t6, h3, h3     \ // clear carry bits | ||||||
|  | 	VN     t6, h4, h4     \ | ||||||
|  | 	VN     t7, h5, h5     \ | ||||||
|  | 	VESLG  $2, t2, t9     \ // multiply carry by 5 | ||||||
|  | 	VAQ    t9, t2, t2     \ | ||||||
|  | 	VAQ    t0, h4, h4     \ | ||||||
|  | 	VAQ    t1, h5, h5     \ | ||||||
|  | 	VAQ    t2, h3, h3     \ | ||||||
|  | 
 | ||||||
|  | // carry h0->h1->h2->h0 | ||||||
|  | // input: h0, h1, h2 | ||||||
|  | // temp: t0, t1, t2, t3, t4, t5, t6, t7, t8 | ||||||
|  | // output: h0, h1, h2 | ||||||
|  | #define REDUCE2(h0, h1, h2, t0, t1, t2, t3, t4, t5, t6, t7, t8) \ | ||||||
|  | 	VLEIB  $7, $0x28, t3 \ // 5 byte shift mask | ||||||
|  | 	VREPIB $4, t4        \ // 4 bit shift mask | ||||||
|  | 	VREPIB $2, t7        \ // 2 bit shift mask | ||||||
|  | 	VGBM   $0x003F, t5   \ // mask to clear carry bits | ||||||
|  | 	VSRLB  t3, h0, t0    \ | ||||||
|  | 	VSRLB  t3, h1, t1    \ | ||||||
|  | 	VSRLB  t3, h2, t2    \ | ||||||
|  | 	VESRLG $4, t5, t5    \ // 44 bit clear mask | ||||||
|  | 	VSRL   t4, t0, t0    \ | ||||||
|  | 	VSRL   t4, t1, t1    \ | ||||||
|  | 	VSRL   t7, t2, t2    \ | ||||||
|  | 	VESRLG $2, t5, t6    \ // 42 bit clear mask | ||||||
|  | 	VESLG  $2, t2, t8    \ | ||||||
|  | 	VAQ    t8, t2, t2    \ | ||||||
|  | 	VN     t5, h0, h0    \ | ||||||
|  | 	VN     t5, h1, h1    \ | ||||||
|  | 	VN     t6, h2, h2    \ | ||||||
|  | 	VAQ    t0, h1, h1    \ | ||||||
|  | 	VAQ    t1, h2, h2    \ | ||||||
|  | 	VAQ    t2, h0, h0    \ | ||||||
|  | 	VSRLB  t3, h0, t0    \ | ||||||
|  | 	VSRLB  t3, h1, t1    \ | ||||||
|  | 	VSRLB  t3, h2, t2    \ | ||||||
|  | 	VSRL   t4, t0, t0    \ | ||||||
|  | 	VSRL   t4, t1, t1    \ | ||||||
|  | 	VSRL   t7, t2, t2    \ | ||||||
|  | 	VN     t5, h0, h0    \ | ||||||
|  | 	VN     t5, h1, h1    \ | ||||||
|  | 	VESLG  $2, t2, t8    \ | ||||||
|  | 	VN     t6, h2, h2    \ | ||||||
|  | 	VAQ    t0, h1, h1    \ | ||||||
|  | 	VAQ    t8, t2, t2    \ | ||||||
|  | 	VAQ    t1, h2, h2    \ | ||||||
|  | 	VAQ    t2, h0, h0    \ | ||||||
|  | 
 | ||||||
|  | // expands two message blocks into the lower halfs of the d registers | ||||||
|  | // moves the contents of the d registers into upper halfs | ||||||
|  | // input: in1, in2, d0, d1, d2, d3, d4, d5 | ||||||
|  | // temp: TEMP0, TEMP1, TEMP2, TEMP3 | ||||||
|  | // output: d0, d1, d2, d3, d4, d5 | ||||||
|  | #define EXPACC(in1, in2, d0, d1, d2, d3, d4, d5, TEMP0, TEMP1, TEMP2, TEMP3) \ | ||||||
|  | 	VGBM   $0xff3f, TEMP0      \ | ||||||
|  | 	VGBM   $0xff1f, TEMP1      \ | ||||||
|  | 	VESLG  $4, d1, TEMP2       \ | ||||||
|  | 	VESLG  $4, d4, TEMP3       \ | ||||||
|  | 	VESRLG $4, TEMP0, TEMP0    \ | ||||||
|  | 	VPERM  in1, d0, EX0, d0    \ | ||||||
|  | 	VPERM  in2, d3, EX0, d3    \ | ||||||
|  | 	VPERM  in1, d2, EX2, d2    \ | ||||||
|  | 	VPERM  in2, d5, EX2, d5    \ | ||||||
|  | 	VPERM  in1, TEMP2, EX1, d1 \ | ||||||
|  | 	VPERM  in2, TEMP3, EX1, d4 \ | ||||||
|  | 	VN     TEMP0, d0, d0       \ | ||||||
|  | 	VN     TEMP0, d3, d3       \ | ||||||
|  | 	VESRLG $4, d1, d1          \ | ||||||
|  | 	VESRLG $4, d4, d4          \ | ||||||
|  | 	VN     TEMP1, d2, d2       \ | ||||||
|  | 	VN     TEMP1, d5, d5       \ | ||||||
|  | 	VN     TEMP0, d1, d1       \ | ||||||
|  | 	VN     TEMP0, d4, d4       \ | ||||||
|  | 
 | ||||||
|  | // expands one message block into the lower halfs of the d registers | ||||||
|  | // moves the contents of the d registers into upper halfs | ||||||
|  | // input: in, d0, d1, d2 | ||||||
|  | // temp: TEMP0, TEMP1, TEMP2 | ||||||
|  | // output: d0, d1, d2 | ||||||
|  | #define EXPACC2(in, d0, d1, d2, TEMP0, TEMP1, TEMP2) \ | ||||||
|  | 	VGBM   $0xff3f, TEMP0     \ | ||||||
|  | 	VESLG  $4, d1, TEMP2      \ | ||||||
|  | 	VGBM   $0xff1f, TEMP1     \ | ||||||
|  | 	VPERM  in, d0, EX0, d0    \ | ||||||
|  | 	VESRLG $4, TEMP0, TEMP0   \ | ||||||
|  | 	VPERM  in, d2, EX2, d2    \ | ||||||
|  | 	VPERM  in, TEMP2, EX1, d1 \ | ||||||
|  | 	VN     TEMP0, d0, d0      \ | ||||||
|  | 	VN     TEMP1, d2, d2      \ | ||||||
|  | 	VESRLG $4, d1, d1         \ | ||||||
|  | 	VN     TEMP0, d1, d1      \ | ||||||
|  | 
 | ||||||
|  | // pack h2:h0 into h1:h0 (no carry) | ||||||
|  | // input: h0, h1, h2 | ||||||
|  | // output: h0, h1, h2 | ||||||
|  | #define PACK(h0, h1, h2) \ | ||||||
|  | 	VMRLG  h1, h2, h2  \ // copy h1 to upper half h2 | ||||||
|  | 	VESLG  $44, h1, h1 \ // shift limb 1 44 bits, leaving 20 | ||||||
|  | 	VO     h0, h1, h0  \ // combine h0 with 20 bits from limb 1 | ||||||
|  | 	VESRLG $20, h2, h1 \ // put top 24 bits of limb 1 into h1 | ||||||
|  | 	VLEIG  $1, $0, h1  \ // clear h2 stuff from lower half of h1 | ||||||
|  | 	VO     h0, h1, h0  \ // h0 now has 88 bits (limb 0 and 1) | ||||||
|  | 	VLEIG  $0, $0, h2  \ // clear upper half of h2 | ||||||
|  | 	VESRLG $40, h2, h1 \ // h1 now has upper two bits of result | ||||||
|  | 	VLEIB  $7, $88, h1 \ // for byte shift (11 bytes) | ||||||
|  | 	VSLB   h1, h2, h2  \ // shift h2 11 bytes to the left | ||||||
|  | 	VO     h0, h2, h0  \ // combine h0 with 20 bits from limb 1 | ||||||
|  | 	VLEIG  $0, $0, h1  \ // clear upper half of h1 | ||||||
|  | 
 | ||||||
|  | // if h > 2**130-5 then h -= 2**130-5 | ||||||
|  | // input: h0, h1 | ||||||
|  | // temp: t0, t1, t2 | ||||||
|  | // output: h0 | ||||||
|  | #define MOD(h0, h1, t0, t1, t2) \ | ||||||
|  | 	VZERO t0          \ | ||||||
|  | 	VLEIG $1, $5, t0  \ | ||||||
|  | 	VACCQ h0, t0, t1  \ | ||||||
|  | 	VAQ   h0, t0, t0  \ | ||||||
|  | 	VONE  t2          \ | ||||||
|  | 	VLEIG $1, $-4, t2 \ | ||||||
|  | 	VAQ   t2, t1, t1  \ | ||||||
|  | 	VACCQ h1, t1, t1  \ | ||||||
|  | 	VONE  t2          \ | ||||||
|  | 	VAQ   t2, t1, t1  \ | ||||||
|  | 	VN    h0, t1, t2  \ | ||||||
|  | 	VNC   t0, t1, t1  \ | ||||||
|  | 	VO    t1, t2, h0  \ | ||||||
|  | 
 | ||||||
|  | // func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]key) | ||||||
|  | TEXT ·poly1305vmsl(SB), $0-32 | ||||||
|  | 	// This code processes 6 + up to 4 blocks (32 bytes) per iteration | ||||||
|  | 	// using the algorithm described in: | ||||||
|  | 	// NEON crypto, Daniel J. Bernstein & Peter Schwabe | ||||||
|  | 	// https://cryptojedi.org/papers/neoncrypto-20120320.pdf | ||||||
|  | 	// And as moddified for VMSL as described in | ||||||
|  | 	// Accelerating Poly1305 Cryptographic Message Authentication on the z14 | ||||||
|  | 	// O'Farrell et al, CASCON 2017, p48-55 | ||||||
|  | 	// https://ibm.ent.box.com/s/jf9gedj0e9d2vjctfyh186shaztavnht | ||||||
|  | 
 | ||||||
|  | 	LMG   out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key | ||||||
|  | 	VZERO V0                // c | ||||||
|  | 
 | ||||||
|  | 	// load EX0, EX1 and EX2 | ||||||
|  | 	MOVD $·constants<>(SB), R5 | ||||||
|  | 	VLM  (R5), EX0, EX2        // c | ||||||
|  | 
 | ||||||
|  | 	// setup r | ||||||
|  | 	VL    (R4), T_0 | ||||||
|  | 	MOVD  $·keyMask<>(SB), R6 | ||||||
|  | 	VL    (R6), T_1 | ||||||
|  | 	VN    T_0, T_1, T_0 | ||||||
|  | 	VZERO T_2                 // limbs for r | ||||||
|  | 	VZERO T_3 | ||||||
|  | 	VZERO T_4 | ||||||
|  | 	EXPACC2(T_0, T_2, T_3, T_4, T_1, T_5, T_7) | ||||||
|  | 
 | ||||||
|  | 	// T_2, T_3, T_4: [0, r] | ||||||
|  | 
 | ||||||
|  | 	// setup r*20 | ||||||
|  | 	VLEIG $0, $0, T_0 | ||||||
|  | 	VLEIG $1, $20, T_0       // T_0: [0, 20] | ||||||
|  | 	VZERO T_5 | ||||||
|  | 	VZERO T_6 | ||||||
|  | 	VMSLG T_0, T_3, T_5, T_5 | ||||||
|  | 	VMSLG T_0, T_4, T_6, T_6 | ||||||
|  | 
 | ||||||
|  | 	// store r for final block in GR | ||||||
|  | 	VLGVG $1, T_2, RSAVE_0  // c | ||||||
|  | 	VLGVG $1, T_3, RSAVE_1  // c | ||||||
|  | 	VLGVG $1, T_4, RSAVE_2  // c | ||||||
|  | 	VLGVG $1, T_5, R5SAVE_1 // c | ||||||
|  | 	VLGVG $1, T_6, R5SAVE_2 // c | ||||||
|  | 
 | ||||||
|  | 	// initialize h | ||||||
|  | 	VZERO H0_0 | ||||||
|  | 	VZERO H1_0 | ||||||
|  | 	VZERO H2_0 | ||||||
|  | 	VZERO H0_1 | ||||||
|  | 	VZERO H1_1 | ||||||
|  | 	VZERO H2_1 | ||||||
|  | 
 | ||||||
|  | 	// initialize pointer for reduce constants | ||||||
|  | 	MOVD $·reduce<>(SB), R12 | ||||||
|  | 
 | ||||||
|  | 	// calculate r**2 and 20*(r**2) | ||||||
|  | 	VZERO R_0 | ||||||
|  | 	VZERO R_1 | ||||||
|  | 	VZERO R_2 | ||||||
|  | 	SQUARE(T_2, T_3, T_4, T_6, R_0, R_1, R_2, T_1, T_5, T_7) | ||||||
|  | 	REDUCE2(R_0, R_1, R_2, M0, M1, M2, M3, M4, R5_1, R5_2, M5, T_1) | ||||||
|  | 	VZERO R5_1 | ||||||
|  | 	VZERO R5_2 | ||||||
|  | 	VMSLG T_0, R_1, R5_1, R5_1 | ||||||
|  | 	VMSLG T_0, R_2, R5_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	// skip r**4 calculation if 3 blocks or less | ||||||
|  | 	CMPBLE R3, $48, b4 | ||||||
|  | 
 | ||||||
|  | 	// calculate r**4 and 20*(r**4) | ||||||
|  | 	VZERO T_8 | ||||||
|  | 	VZERO T_9 | ||||||
|  | 	VZERO T_10 | ||||||
|  | 	SQUARE(R_0, R_1, R_2, R5_2, T_8, T_9, T_10, T_1, T_5, T_7) | ||||||
|  | 	REDUCE2(T_8, T_9, T_10, M0, M1, M2, M3, M4, T_2, T_3, M5, T_1) | ||||||
|  | 	VZERO T_2 | ||||||
|  | 	VZERO T_3 | ||||||
|  | 	VMSLG T_0, T_9, T_2, T_2 | ||||||
|  | 	VMSLG T_0, T_10, T_3, T_3 | ||||||
|  | 
 | ||||||
|  | 	// put r**2 to the right and r**4 to the left of R_0, R_1, R_2 | ||||||
|  | 	VSLDB $8, T_8, T_8, T_8 | ||||||
|  | 	VSLDB $8, T_9, T_9, T_9 | ||||||
|  | 	VSLDB $8, T_10, T_10, T_10 | ||||||
|  | 	VSLDB $8, T_2, T_2, T_2 | ||||||
|  | 	VSLDB $8, T_3, T_3, T_3 | ||||||
|  | 
 | ||||||
|  | 	VO T_8, R_0, R_0 | ||||||
|  | 	VO T_9, R_1, R_1 | ||||||
|  | 	VO T_10, R_2, R_2 | ||||||
|  | 	VO T_2, R5_1, R5_1 | ||||||
|  | 	VO T_3, R5_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	CMPBLE R3, $80, load // less than or equal to 5 blocks in message | ||||||
|  | 
 | ||||||
|  | 	// 6(or 5+1) blocks | ||||||
|  | 	SUB    $81, R3 | ||||||
|  | 	VLM    (R2), M0, M4 | ||||||
|  | 	VLL    R3, 80(R2), M5 | ||||||
|  | 	ADD    $1, R3 | ||||||
|  | 	MOVBZ  $1, R0 | ||||||
|  | 	CMPBGE R3, $16, 2(PC) | ||||||
|  | 	VLVGB  R3, R0, M5 | ||||||
|  | 	MOVD   $96(R2), R2 | ||||||
|  | 	EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) | ||||||
|  | 	EXPACC(M2, M3, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) | ||||||
|  | 	VLEIB  $2, $1, H2_0 | ||||||
|  | 	VLEIB  $2, $1, H2_1 | ||||||
|  | 	VLEIB  $10, $1, H2_0 | ||||||
|  | 	VLEIB  $10, $1, H2_1 | ||||||
|  | 
 | ||||||
|  | 	VZERO  M0 | ||||||
|  | 	VZERO  M1 | ||||||
|  | 	VZERO  M2 | ||||||
|  | 	VZERO  M3 | ||||||
|  | 	VZERO  T_4 | ||||||
|  | 	VZERO  T_10 | ||||||
|  | 	EXPACC(M4, M5, M0, M1, M2, M3, T_4, T_10, T_0, T_1, T_2, T_3) | ||||||
|  | 	VLR    T_4, M4 | ||||||
|  | 	VLEIB  $10, $1, M2 | ||||||
|  | 	CMPBLT R3, $16, 2(PC) | ||||||
|  | 	VLEIB  $10, $1, T_10 | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9) | ||||||
|  | 	VMRHG  V0, H0_1, H0_0 | ||||||
|  | 	VMRHG  V0, H1_1, H1_0 | ||||||
|  | 	VMRHG  V0, H2_1, H2_0 | ||||||
|  | 	VMRLG  V0, H0_1, H0_1 | ||||||
|  | 	VMRLG  V0, H1_1, H1_1 | ||||||
|  | 	VMRLG  V0, H2_1, H2_1 | ||||||
|  | 
 | ||||||
|  | 	SUB    $16, R3 | ||||||
|  | 	CMPBLE R3, $0, square | ||||||
|  | 
 | ||||||
|  | load: | ||||||
|  | 	// load EX0, EX1 and EX2 | ||||||
|  | 	MOVD $·c<>(SB), R5 | ||||||
|  | 	VLM  (R5), EX0, EX2 | ||||||
|  | 
 | ||||||
|  | loop: | ||||||
|  | 	CMPBLE R3, $64, add // b4	// last 4 or less blocks left | ||||||
|  | 
 | ||||||
|  | 	// next 4 full blocks | ||||||
|  | 	VLM  (R2), M2, M5 | ||||||
|  | 	SUB  $64, R3 | ||||||
|  | 	MOVD $64(R2), R2 | ||||||
|  | 	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, T_0, T_1, T_3, T_4, T_5, T_2, T_7, T_8, T_9) | ||||||
|  | 
 | ||||||
|  | 	// expacc in-lined to create [m2, m3] limbs | ||||||
|  | 	VGBM   $0x3f3f, T_0     // 44 bit clear mask | ||||||
|  | 	VGBM   $0x1f1f, T_1     // 40 bit clear mask | ||||||
|  | 	VPERM  M2, M3, EX0, T_3 | ||||||
|  | 	VESRLG $4, T_0, T_0     // 44 bit clear mask ready | ||||||
|  | 	VPERM  M2, M3, EX1, T_4 | ||||||
|  | 	VPERM  M2, M3, EX2, T_5 | ||||||
|  | 	VN     T_0, T_3, T_3 | ||||||
|  | 	VESRLG $4, T_4, T_4 | ||||||
|  | 	VN     T_1, T_5, T_5 | ||||||
|  | 	VN     T_0, T_4, T_4 | ||||||
|  | 	VMRHG  H0_1, T_3, H0_0 | ||||||
|  | 	VMRHG  H1_1, T_4, H1_0 | ||||||
|  | 	VMRHG  H2_1, T_5, H2_0 | ||||||
|  | 	VMRLG  H0_1, T_3, H0_1 | ||||||
|  | 	VMRLG  H1_1, T_4, H1_1 | ||||||
|  | 	VMRLG  H2_1, T_5, H2_1 | ||||||
|  | 	VLEIB  $10, $1, H2_0 | ||||||
|  | 	VLEIB  $10, $1, H2_1 | ||||||
|  | 	VPERM  M4, M5, EX0, T_3 | ||||||
|  | 	VPERM  M4, M5, EX1, T_4 | ||||||
|  | 	VPERM  M4, M5, EX2, T_5 | ||||||
|  | 	VN     T_0, T_3, T_3 | ||||||
|  | 	VESRLG $4, T_4, T_4 | ||||||
|  | 	VN     T_1, T_5, T_5 | ||||||
|  | 	VN     T_0, T_4, T_4 | ||||||
|  | 	VMRHG  V0, T_3, M0 | ||||||
|  | 	VMRHG  V0, T_4, M1 | ||||||
|  | 	VMRHG  V0, T_5, M2 | ||||||
|  | 	VMRLG  V0, T_3, M3 | ||||||
|  | 	VMRLG  V0, T_4, M4 | ||||||
|  | 	VMRLG  V0, T_5, M5 | ||||||
|  | 	VLEIB  $10, $1, M2 | ||||||
|  | 	VLEIB  $10, $1, M5 | ||||||
|  | 
 | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	CMPBNE R3, $0, loop | ||||||
|  | 	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) | ||||||
|  | 	VMRHG  V0, H0_1, H0_0 | ||||||
|  | 	VMRHG  V0, H1_1, H1_0 | ||||||
|  | 	VMRHG  V0, H2_1, H2_0 | ||||||
|  | 	VMRLG  V0, H0_1, H0_1 | ||||||
|  | 	VMRLG  V0, H1_1, H1_1 | ||||||
|  | 	VMRLG  V0, H2_1, H2_1 | ||||||
|  | 
 | ||||||
|  | 	// load EX0, EX1, EX2 | ||||||
|  | 	MOVD $·constants<>(SB), R5 | ||||||
|  | 	VLM  (R5), EX0, EX2 | ||||||
|  | 
 | ||||||
|  | 	// sum vectors | ||||||
|  | 	VAQ H0_0, H0_1, H0_0 | ||||||
|  | 	VAQ H1_0, H1_1, H1_0 | ||||||
|  | 	VAQ H2_0, H2_1, H2_0 | ||||||
|  | 
 | ||||||
|  | 	// h may be >= 2*(2**130-5) so we need to reduce it again | ||||||
|  | 	// M0...M4 are used as temps here | ||||||
|  | 	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) | ||||||
|  | 
 | ||||||
|  | next:  // carry h1->h2 | ||||||
|  | 	VLEIB  $7, $0x28, T_1 | ||||||
|  | 	VREPIB $4, T_2 | ||||||
|  | 	VGBM   $0x003F, T_3 | ||||||
|  | 	VESRLG $4, T_3 | ||||||
|  | 
 | ||||||
|  | 	// byte shift | ||||||
|  | 	VSRLB T_1, H1_0, T_4 | ||||||
|  | 
 | ||||||
|  | 	// bit shift | ||||||
|  | 	VSRL T_2, T_4, T_4 | ||||||
|  | 
 | ||||||
|  | 	// clear h1 carry bits | ||||||
|  | 	VN T_3, H1_0, H1_0 | ||||||
|  | 
 | ||||||
|  | 	// add carry | ||||||
|  | 	VAQ T_4, H2_0, H2_0 | ||||||
|  | 
 | ||||||
|  | 	// h is now < 2*(2**130-5) | ||||||
|  | 	// pack h into h1 (hi) and h0 (lo) | ||||||
|  | 	PACK(H0_0, H1_0, H2_0) | ||||||
|  | 
 | ||||||
|  | 	// if h > 2**130-5 then h -= 2**130-5 | ||||||
|  | 	MOD(H0_0, H1_0, T_0, T_1, T_2) | ||||||
|  | 
 | ||||||
|  | 	// h += s | ||||||
|  | 	MOVD  $·bswapMask<>(SB), R5 | ||||||
|  | 	VL    (R5), T_1 | ||||||
|  | 	VL    16(R4), T_0 | ||||||
|  | 	VPERM T_0, T_0, T_1, T_0    // reverse bytes (to big) | ||||||
|  | 	VAQ   T_0, H0_0, H0_0 | ||||||
|  | 	VPERM H0_0, H0_0, T_1, H0_0 // reverse bytes (to little) | ||||||
|  | 	VST   H0_0, (R1) | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | add: | ||||||
|  | 	// load EX0, EX1, EX2 | ||||||
|  | 	MOVD $·constants<>(SB), R5 | ||||||
|  | 	VLM  (R5), EX0, EX2 | ||||||
|  | 
 | ||||||
|  | 	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) | ||||||
|  | 	VMRHG  V0, H0_1, H0_0 | ||||||
|  | 	VMRHG  V0, H1_1, H1_0 | ||||||
|  | 	VMRHG  V0, H2_1, H2_0 | ||||||
|  | 	VMRLG  V0, H0_1, H0_1 | ||||||
|  | 	VMRLG  V0, H1_1, H1_1 | ||||||
|  | 	VMRLG  V0, H2_1, H2_1 | ||||||
|  | 	CMPBLE R3, $64, b4 | ||||||
|  | 
 | ||||||
|  | b4: | ||||||
|  | 	CMPBLE R3, $48, b3 // 3 blocks or less | ||||||
|  | 
 | ||||||
|  | 	// 4(3+1) blocks remaining | ||||||
|  | 	SUB    $49, R3 | ||||||
|  | 	VLM    (R2), M0, M2 | ||||||
|  | 	VLL    R3, 48(R2), M3 | ||||||
|  | 	ADD    $1, R3 | ||||||
|  | 	MOVBZ  $1, R0 | ||||||
|  | 	CMPBEQ R3, $16, 2(PC) | ||||||
|  | 	VLVGB  R3, R0, M3 | ||||||
|  | 	MOVD   $64(R2), R2 | ||||||
|  | 	EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) | ||||||
|  | 	VLEIB  $10, $1, H2_0 | ||||||
|  | 	VLEIB  $10, $1, H2_1 | ||||||
|  | 	VZERO  M0 | ||||||
|  | 	VZERO  M1 | ||||||
|  | 	VZERO  M4 | ||||||
|  | 	VZERO  M5 | ||||||
|  | 	VZERO  T_4 | ||||||
|  | 	VZERO  T_10 | ||||||
|  | 	EXPACC(M2, M3, M0, M1, M4, M5, T_4, T_10, T_0, T_1, T_2, T_3) | ||||||
|  | 	VLR    T_4, M2 | ||||||
|  | 	VLEIB  $10, $1, M4 | ||||||
|  | 	CMPBNE R3, $16, 2(PC) | ||||||
|  | 	VLEIB  $10, $1, T_10 | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M4, M5, M2, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) | ||||||
|  | 	VMRHG  V0, H0_1, H0_0 | ||||||
|  | 	VMRHG  V0, H1_1, H1_0 | ||||||
|  | 	VMRHG  V0, H2_1, H2_0 | ||||||
|  | 	VMRLG  V0, H0_1, H0_1 | ||||||
|  | 	VMRLG  V0, H1_1, H1_1 | ||||||
|  | 	VMRLG  V0, H2_1, H2_1 | ||||||
|  | 	SUB    $16, R3 | ||||||
|  | 	CMPBLE R3, $0, square // this condition must always hold true! | ||||||
|  | 
 | ||||||
|  | b3: | ||||||
|  | 	CMPBLE R3, $32, b2 | ||||||
|  | 
 | ||||||
|  | 	// 3 blocks remaining | ||||||
|  | 
 | ||||||
|  | 	// setup [r²,r] | ||||||
|  | 	VSLDB $8, R_0, R_0, R_0 | ||||||
|  | 	VSLDB $8, R_1, R_1, R_1 | ||||||
|  | 	VSLDB $8, R_2, R_2, R_2 | ||||||
|  | 	VSLDB $8, R5_1, R5_1, R5_1 | ||||||
|  | 	VSLDB $8, R5_2, R5_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	VLVGG $1, RSAVE_0, R_0 | ||||||
|  | 	VLVGG $1, RSAVE_1, R_1 | ||||||
|  | 	VLVGG $1, RSAVE_2, R_2 | ||||||
|  | 	VLVGG $1, R5SAVE_1, R5_1 | ||||||
|  | 	VLVGG $1, R5SAVE_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	// setup [h0, h1] | ||||||
|  | 	VSLDB $8, H0_0, H0_0, H0_0 | ||||||
|  | 	VSLDB $8, H1_0, H1_0, H1_0 | ||||||
|  | 	VSLDB $8, H2_0, H2_0, H2_0 | ||||||
|  | 	VO    H0_1, H0_0, H0_0 | ||||||
|  | 	VO    H1_1, H1_0, H1_0 | ||||||
|  | 	VO    H2_1, H2_0, H2_0 | ||||||
|  | 	VZERO H0_1 | ||||||
|  | 	VZERO H1_1 | ||||||
|  | 	VZERO H2_1 | ||||||
|  | 
 | ||||||
|  | 	VZERO M0 | ||||||
|  | 	VZERO M1 | ||||||
|  | 	VZERO M2 | ||||||
|  | 	VZERO M3 | ||||||
|  | 	VZERO M4 | ||||||
|  | 	VZERO M5 | ||||||
|  | 
 | ||||||
|  | 	// H*[r**2, r] | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, T_10, M5) | ||||||
|  | 
 | ||||||
|  | 	SUB    $33, R3 | ||||||
|  | 	VLM    (R2), M0, M1 | ||||||
|  | 	VLL    R3, 32(R2), M2 | ||||||
|  | 	ADD    $1, R3 | ||||||
|  | 	MOVBZ  $1, R0 | ||||||
|  | 	CMPBEQ R3, $16, 2(PC) | ||||||
|  | 	VLVGB  R3, R0, M2 | ||||||
|  | 
 | ||||||
|  | 	// H += m0 | ||||||
|  | 	VZERO T_1 | ||||||
|  | 	VZERO T_2 | ||||||
|  | 	VZERO T_3 | ||||||
|  | 	EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6) | ||||||
|  | 	VLEIB $10, $1, T_3 | ||||||
|  | 	VAG   H0_0, T_1, H0_0 | ||||||
|  | 	VAG   H1_0, T_2, H1_0 | ||||||
|  | 	VAG   H2_0, T_3, H2_0 | ||||||
|  | 
 | ||||||
|  | 	VZERO M0 | ||||||
|  | 	VZERO M3 | ||||||
|  | 	VZERO M4 | ||||||
|  | 	VZERO M5 | ||||||
|  | 	VZERO T_10 | ||||||
|  | 
 | ||||||
|  | 	// (H+m0)*r | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M3, M4, M5, V0, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_10, H0_1, H1_1, H2_1, T_9) | ||||||
|  | 
 | ||||||
|  | 	// H += m1 | ||||||
|  | 	VZERO V0 | ||||||
|  | 	VZERO T_1 | ||||||
|  | 	VZERO T_2 | ||||||
|  | 	VZERO T_3 | ||||||
|  | 	EXPACC2(M1, T_1, T_2, T_3, T_4, T_5, T_6) | ||||||
|  | 	VLEIB $10, $1, T_3 | ||||||
|  | 	VAQ   H0_0, T_1, H0_0 | ||||||
|  | 	VAQ   H1_0, T_2, H1_0 | ||||||
|  | 	VAQ   H2_0, T_3, H2_0 | ||||||
|  | 	REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10) | ||||||
|  | 
 | ||||||
|  | 	// [H, m2] * [r**2, r] | ||||||
|  | 	EXPACC2(M2, H0_0, H1_0, H2_0, T_1, T_2, T_3) | ||||||
|  | 	CMPBNE R3, $16, 2(PC) | ||||||
|  | 	VLEIB  $10, $1, H2_0 | ||||||
|  | 	VZERO  M0 | ||||||
|  | 	VZERO  M1 | ||||||
|  | 	VZERO  M2 | ||||||
|  | 	VZERO  M3 | ||||||
|  | 	VZERO  M4 | ||||||
|  | 	VZERO  M5 | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, M5, T_10) | ||||||
|  | 	SUB    $16, R3 | ||||||
|  | 	CMPBLE R3, $0, next   // this condition must always hold true! | ||||||
|  | 
 | ||||||
|  | b2: | ||||||
|  | 	CMPBLE R3, $16, b1 | ||||||
|  | 
 | ||||||
|  | 	// 2 blocks remaining | ||||||
|  | 
 | ||||||
|  | 	// setup [r²,r] | ||||||
|  | 	VSLDB $8, R_0, R_0, R_0 | ||||||
|  | 	VSLDB $8, R_1, R_1, R_1 | ||||||
|  | 	VSLDB $8, R_2, R_2, R_2 | ||||||
|  | 	VSLDB $8, R5_1, R5_1, R5_1 | ||||||
|  | 	VSLDB $8, R5_2, R5_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	VLVGG $1, RSAVE_0, R_0 | ||||||
|  | 	VLVGG $1, RSAVE_1, R_1 | ||||||
|  | 	VLVGG $1, RSAVE_2, R_2 | ||||||
|  | 	VLVGG $1, R5SAVE_1, R5_1 | ||||||
|  | 	VLVGG $1, R5SAVE_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	// setup [h0, h1] | ||||||
|  | 	VSLDB $8, H0_0, H0_0, H0_0 | ||||||
|  | 	VSLDB $8, H1_0, H1_0, H1_0 | ||||||
|  | 	VSLDB $8, H2_0, H2_0, H2_0 | ||||||
|  | 	VO    H0_1, H0_0, H0_0 | ||||||
|  | 	VO    H1_1, H1_0, H1_0 | ||||||
|  | 	VO    H2_1, H2_0, H2_0 | ||||||
|  | 	VZERO H0_1 | ||||||
|  | 	VZERO H1_1 | ||||||
|  | 	VZERO H2_1 | ||||||
|  | 
 | ||||||
|  | 	VZERO M0 | ||||||
|  | 	VZERO M1 | ||||||
|  | 	VZERO M2 | ||||||
|  | 	VZERO M3 | ||||||
|  | 	VZERO M4 | ||||||
|  | 	VZERO M5 | ||||||
|  | 
 | ||||||
|  | 	// H*[r**2, r] | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9) | ||||||
|  | 	VMRHG V0, H0_1, H0_0 | ||||||
|  | 	VMRHG V0, H1_1, H1_0 | ||||||
|  | 	VMRHG V0, H2_1, H2_0 | ||||||
|  | 	VMRLG V0, H0_1, H0_1 | ||||||
|  | 	VMRLG V0, H1_1, H1_1 | ||||||
|  | 	VMRLG V0, H2_1, H2_1 | ||||||
|  | 
 | ||||||
|  | 	// move h to the left and 0s at the right | ||||||
|  | 	VSLDB $8, H0_0, H0_0, H0_0 | ||||||
|  | 	VSLDB $8, H1_0, H1_0, H1_0 | ||||||
|  | 	VSLDB $8, H2_0, H2_0, H2_0 | ||||||
|  | 
 | ||||||
|  | 	// get message blocks and append 1 to start | ||||||
|  | 	SUB    $17, R3 | ||||||
|  | 	VL     (R2), M0 | ||||||
|  | 	VLL    R3, 16(R2), M1 | ||||||
|  | 	ADD    $1, R3 | ||||||
|  | 	MOVBZ  $1, R0 | ||||||
|  | 	CMPBEQ R3, $16, 2(PC) | ||||||
|  | 	VLVGB  R3, R0, M1 | ||||||
|  | 	VZERO  T_6 | ||||||
|  | 	VZERO  T_7 | ||||||
|  | 	VZERO  T_8 | ||||||
|  | 	EXPACC2(M0, T_6, T_7, T_8, T_1, T_2, T_3) | ||||||
|  | 	EXPACC2(M1, T_6, T_7, T_8, T_1, T_2, T_3) | ||||||
|  | 	VLEIB  $2, $1, T_8 | ||||||
|  | 	CMPBNE R3, $16, 2(PC) | ||||||
|  | 	VLEIB  $10, $1, T_8 | ||||||
|  | 
 | ||||||
|  | 	// add [m0, m1] to h | ||||||
|  | 	VAG H0_0, T_6, H0_0 | ||||||
|  | 	VAG H1_0, T_7, H1_0 | ||||||
|  | 	VAG H2_0, T_8, H2_0 | ||||||
|  | 
 | ||||||
|  | 	VZERO M2 | ||||||
|  | 	VZERO M3 | ||||||
|  | 	VZERO M4 | ||||||
|  | 	VZERO M5 | ||||||
|  | 	VZERO T_10 | ||||||
|  | 	VZERO M0 | ||||||
|  | 
 | ||||||
|  | 	// at this point R_0 .. R5_2 look like [r**2, r] | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M2, M3, M4, M5, T_10, M0, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE2(H0_0, H1_0, H2_0, M2, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10) | ||||||
|  | 	SUB    $16, R3, R3 | ||||||
|  | 	CMPBLE R3, $0, next | ||||||
|  | 
 | ||||||
|  | b1: | ||||||
|  | 	CMPBLE R3, $0, next | ||||||
|  | 
 | ||||||
|  | 	// 1 block remaining | ||||||
|  | 
 | ||||||
|  | 	// setup [r²,r] | ||||||
|  | 	VSLDB $8, R_0, R_0, R_0 | ||||||
|  | 	VSLDB $8, R_1, R_1, R_1 | ||||||
|  | 	VSLDB $8, R_2, R_2, R_2 | ||||||
|  | 	VSLDB $8, R5_1, R5_1, R5_1 | ||||||
|  | 	VSLDB $8, R5_2, R5_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	VLVGG $1, RSAVE_0, R_0 | ||||||
|  | 	VLVGG $1, RSAVE_1, R_1 | ||||||
|  | 	VLVGG $1, RSAVE_2, R_2 | ||||||
|  | 	VLVGG $1, R5SAVE_1, R5_1 | ||||||
|  | 	VLVGG $1, R5SAVE_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	// setup [h0, h1] | ||||||
|  | 	VSLDB $8, H0_0, H0_0, H0_0 | ||||||
|  | 	VSLDB $8, H1_0, H1_0, H1_0 | ||||||
|  | 	VSLDB $8, H2_0, H2_0, H2_0 | ||||||
|  | 	VO    H0_1, H0_0, H0_0 | ||||||
|  | 	VO    H1_1, H1_0, H1_0 | ||||||
|  | 	VO    H2_1, H2_0, H2_0 | ||||||
|  | 	VZERO H0_1 | ||||||
|  | 	VZERO H1_1 | ||||||
|  | 	VZERO H2_1 | ||||||
|  | 
 | ||||||
|  | 	VZERO M0 | ||||||
|  | 	VZERO M1 | ||||||
|  | 	VZERO M2 | ||||||
|  | 	VZERO M3 | ||||||
|  | 	VZERO M4 | ||||||
|  | 	VZERO M5 | ||||||
|  | 
 | ||||||
|  | 	// H*[r**2, r] | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) | ||||||
|  | 
 | ||||||
|  | 	// set up [0, m0] limbs | ||||||
|  | 	SUB    $1, R3 | ||||||
|  | 	VLL    R3, (R2), M0 | ||||||
|  | 	ADD    $1, R3 | ||||||
|  | 	MOVBZ  $1, R0 | ||||||
|  | 	CMPBEQ R3, $16, 2(PC) | ||||||
|  | 	VLVGB  R3, R0, M0 | ||||||
|  | 	VZERO  T_1 | ||||||
|  | 	VZERO  T_2 | ||||||
|  | 	VZERO  T_3 | ||||||
|  | 	EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6)// limbs: [0, m] | ||||||
|  | 	CMPBNE R3, $16, 2(PC) | ||||||
|  | 	VLEIB  $10, $1, T_3 | ||||||
|  | 
 | ||||||
|  | 	// h+m0 | ||||||
|  | 	VAQ H0_0, T_1, H0_0 | ||||||
|  | 	VAQ H1_0, T_2, H1_0 | ||||||
|  | 	VAQ H2_0, T_3, H2_0 | ||||||
|  | 
 | ||||||
|  | 	VZERO M0 | ||||||
|  | 	VZERO M1 | ||||||
|  | 	VZERO M2 | ||||||
|  | 	VZERO M3 | ||||||
|  | 	VZERO M4 | ||||||
|  | 	VZERO M5 | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) | ||||||
|  | 
 | ||||||
|  | 	BR next | ||||||
|  | 
 | ||||||
|  | square: | ||||||
|  | 	// setup [r²,r] | ||||||
|  | 	VSLDB $8, R_0, R_0, R_0 | ||||||
|  | 	VSLDB $8, R_1, R_1, R_1 | ||||||
|  | 	VSLDB $8, R_2, R_2, R_2 | ||||||
|  | 	VSLDB $8, R5_1, R5_1, R5_1 | ||||||
|  | 	VSLDB $8, R5_2, R5_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	VLVGG $1, RSAVE_0, R_0 | ||||||
|  | 	VLVGG $1, RSAVE_1, R_1 | ||||||
|  | 	VLVGG $1, RSAVE_2, R_2 | ||||||
|  | 	VLVGG $1, R5SAVE_1, R5_1 | ||||||
|  | 	VLVGG $1, R5SAVE_2, R5_2 | ||||||
|  | 
 | ||||||
|  | 	// setup [h0, h1] | ||||||
|  | 	VSLDB $8, H0_0, H0_0, H0_0 | ||||||
|  | 	VSLDB $8, H1_0, H1_0, H1_0 | ||||||
|  | 	VSLDB $8, H2_0, H2_0, H2_0 | ||||||
|  | 	VO    H0_1, H0_0, H0_0 | ||||||
|  | 	VO    H1_1, H1_0, H1_0 | ||||||
|  | 	VO    H2_1, H2_0, H2_0 | ||||||
|  | 	VZERO H0_1 | ||||||
|  | 	VZERO H1_1 | ||||||
|  | 	VZERO H2_1 | ||||||
|  | 
 | ||||||
|  | 	VZERO M0 | ||||||
|  | 	VZERO M1 | ||||||
|  | 	VZERO M2 | ||||||
|  | 	VZERO M3 | ||||||
|  | 	VZERO M4 | ||||||
|  | 	VZERO M5 | ||||||
|  | 
 | ||||||
|  | 	// (h0*r**2) + (h1*r) | ||||||
|  | 	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) | ||||||
|  | 	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) | ||||||
|  | 	BR next | ||||||
|  | 
 | ||||||
|  | TEXT ·hasVMSLFacility(SB), NOSPLIT, $24-1 | ||||||
|  | 	MOVD  $x-24(SP), R1 | ||||||
|  | 	XC    $24, 0(R1), 0(R1) // clear the storage | ||||||
|  | 	MOVD  $2, R0            // R0 is the number of double words stored -1 | ||||||
|  | 	WORD  $0xB2B01000       // STFLE 0(R1) | ||||||
|  | 	XOR   R0, R0            // reset the value of R0 | ||||||
|  | 	MOVBZ z-8(SP), R1 | ||||||
|  | 	AND   $0x01, R1 | ||||||
|  | 	BEQ   novmsl | ||||||
|  | 
 | ||||||
|  | vectorinstalled: | ||||||
|  | 	// check if the vector instruction has been enabled | ||||||
|  | 	VLEIB  $0, $0xF, V16 | ||||||
|  | 	VLGVB  $0, V16, R1 | ||||||
|  | 	CMPBNE R1, $0xF, novmsl | ||||||
|  | 	MOVB   $1, ret+0(FP)    // have vx | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | novmsl: | ||||||
|  | 	MOVB $0, ret+0(FP) // no vx | ||||||
|  | 	RET | ||||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/ripemd160/ripemd160.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/ripemd160/ripemd160.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -5,7 +5,7 @@ | |||||||
| // Package ripemd160 implements the RIPEMD-160 hash algorithm.
 | // Package ripemd160 implements the RIPEMD-160 hash algorithm.
 | ||||||
| package ripemd160 // import "golang.org/x/crypto/ripemd160"
 | package ripemd160 // import "golang.org/x/crypto/ripemd160"
 | ||||||
| 
 | 
 | ||||||
| // RIPEMD-160 is designed by by Hans Dobbertin, Antoon Bosselaers, and Bart
 | // RIPEMD-160 is designed by Hans Dobbertin, Antoon Bosselaers, and Bart
 | ||||||
| // Preneel with specifications available at:
 | // Preneel with specifications available at:
 | ||||||
| // http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf.
 | // http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf.
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										64
									
								
								vendor/golang.org/x/crypto/ripemd160/ripemd160block.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								vendor/golang.org/x/crypto/ripemd160/ripemd160block.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -8,6 +8,10 @@ | |||||||
| 
 | 
 | ||||||
| package ripemd160 | package ripemd160 | ||||||
| 
 | 
 | ||||||
|  | import ( | ||||||
|  | 	"math/bits" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| // work buffer indices and roll amounts for one line
 | // work buffer indices and roll amounts for one line
 | ||||||
| var _n = [80]uint{ | var _n = [80]uint{ | ||||||
| 	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | 	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | ||||||
| @ -59,16 +63,16 @@ func _Block(md *digest, p []byte) int { | |||||||
| 		i := 0 | 		i := 0 | ||||||
| 		for i < 16 { | 		for i < 16 { | ||||||
| 			alpha = a + (b ^ c ^ d) + x[_n[i]] | 			alpha = a + (b ^ c ^ d) + x[_n[i]] | ||||||
| 			s := _r[i] | 			s := int(_r[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | 			alpha = bits.RotateLeft32(alpha, s) + e | ||||||
| 			beta = c<<10 | c>>22 | 			beta = bits.RotateLeft32(c, 10) | ||||||
| 			a, b, c, d, e = e, alpha, b, beta, d | 			a, b, c, d, e = e, alpha, b, beta, d | ||||||
| 
 | 
 | ||||||
| 			// parallel line
 | 			// parallel line
 | ||||||
| 			alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 | 			alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 | ||||||
| 			s = r_[i] | 			s = int(r_[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||||
| 			beta = cc<<10 | cc>>22 | 			beta = bits.RotateLeft32(cc, 10) | ||||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||||
| 
 | 
 | ||||||
| 			i++ | 			i++ | ||||||
| @ -77,16 +81,16 @@ func _Block(md *digest, p []byte) int { | |||||||
| 		// round 2
 | 		// round 2
 | ||||||
| 		for i < 32 { | 		for i < 32 { | ||||||
| 			alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 | 			alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 | ||||||
| 			s := _r[i] | 			s := int(_r[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | 			alpha = bits.RotateLeft32(alpha, s) + e | ||||||
| 			beta = c<<10 | c>>22 | 			beta = bits.RotateLeft32(c, 10) | ||||||
| 			a, b, c, d, e = e, alpha, b, beta, d | 			a, b, c, d, e = e, alpha, b, beta, d | ||||||
| 
 | 
 | ||||||
| 			// parallel line
 | 			// parallel line
 | ||||||
| 			alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 | 			alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 | ||||||
| 			s = r_[i] | 			s = int(r_[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||||
| 			beta = cc<<10 | cc>>22 | 			beta = bits.RotateLeft32(cc, 10) | ||||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||||
| 
 | 
 | ||||||
| 			i++ | 			i++ | ||||||
| @ -95,16 +99,16 @@ func _Block(md *digest, p []byte) int { | |||||||
| 		// round 3
 | 		// round 3
 | ||||||
| 		for i < 48 { | 		for i < 48 { | ||||||
| 			alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 | 			alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 | ||||||
| 			s := _r[i] | 			s := int(_r[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | 			alpha = bits.RotateLeft32(alpha, s) + e | ||||||
| 			beta = c<<10 | c>>22 | 			beta = bits.RotateLeft32(c, 10) | ||||||
| 			a, b, c, d, e = e, alpha, b, beta, d | 			a, b, c, d, e = e, alpha, b, beta, d | ||||||
| 
 | 
 | ||||||
| 			// parallel line
 | 			// parallel line
 | ||||||
| 			alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 | 			alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 | ||||||
| 			s = r_[i] | 			s = int(r_[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||||
| 			beta = cc<<10 | cc>>22 | 			beta = bits.RotateLeft32(cc, 10) | ||||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||||
| 
 | 
 | ||||||
| 			i++ | 			i++ | ||||||
| @ -113,16 +117,16 @@ func _Block(md *digest, p []byte) int { | |||||||
| 		// round 4
 | 		// round 4
 | ||||||
| 		for i < 64 { | 		for i < 64 { | ||||||
| 			alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc | 			alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc | ||||||
| 			s := _r[i] | 			s := int(_r[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | 			alpha = bits.RotateLeft32(alpha, s) + e | ||||||
| 			beta = c<<10 | c>>22 | 			beta = bits.RotateLeft32(c, 10) | ||||||
| 			a, b, c, d, e = e, alpha, b, beta, d | 			a, b, c, d, e = e, alpha, b, beta, d | ||||||
| 
 | 
 | ||||||
| 			// parallel line
 | 			// parallel line
 | ||||||
| 			alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 | 			alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 | ||||||
| 			s = r_[i] | 			s = int(r_[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||||
| 			beta = cc<<10 | cc>>22 | 			beta = bits.RotateLeft32(cc, 10) | ||||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||||
| 
 | 
 | ||||||
| 			i++ | 			i++ | ||||||
| @ -131,16 +135,16 @@ func _Block(md *digest, p []byte) int { | |||||||
| 		// round 5
 | 		// round 5
 | ||||||
| 		for i < 80 { | 		for i < 80 { | ||||||
| 			alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e | 			alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e | ||||||
| 			s := _r[i] | 			s := int(_r[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | 			alpha = bits.RotateLeft32(alpha, s) + e | ||||||
| 			beta = c<<10 | c>>22 | 			beta = bits.RotateLeft32(c, 10) | ||||||
| 			a, b, c, d, e = e, alpha, b, beta, d | 			a, b, c, d, e = e, alpha, b, beta, d | ||||||
| 
 | 
 | ||||||
| 			// parallel line
 | 			// parallel line
 | ||||||
| 			alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] | 			alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] | ||||||
| 			s = r_[i] | 			s = int(r_[i]) | ||||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||||
| 			beta = cc<<10 | cc>>22 | 			beta = bits.RotateLeft32(cc, 10) | ||||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||||
| 
 | 
 | ||||||
| 			i++ | 			i++ | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/crypto/scrypt/scrypt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/crypto/scrypt/scrypt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -29,7 +29,7 @@ func blockXOR(dst, src []uint32, n int) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in,
 | // salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in,
 | ||||||
| // and puts the result into both both tmp and out.
 | // and puts the result into both tmp and out.
 | ||||||
| func salsaXOR(tmp *[16]uint32, in, out []uint32) { | func salsaXOR(tmp *[16]uint32, in, out []uint32) { | ||||||
| 	w0 := tmp[0] ^ in[0] | 	w0 := tmp[0] ^ in[0] | ||||||
| 	w1 := tmp[1] ^ in[1] | 	w1 := tmp[1] ^ in[1] | ||||||
| @ -218,7 +218,7 @@ func smix(b []byte, r, N int, v, xy []uint32) { | |||||||
| // For example, you can get a derived key for e.g. AES-256 (which needs a
 | // For example, you can get a derived key for e.g. AES-256 (which needs a
 | ||||||
| // 32-byte key) by doing:
 | // 32-byte key) by doing:
 | ||||||
| //
 | //
 | ||||||
| //      dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32)
 | //      dk, err := scrypt.Key([]byte("some password"), salt, 32768, 8, 1, 32)
 | ||||||
| //
 | //
 | ||||||
| // The recommended parameters for interactive logins as of 2017 are N=32768, r=8
 | // The recommended parameters for interactive logins as of 2017 are N=32768, r=8
 | ||||||
| // and p=1. The parameters N, r, and p should be increased as memory latency and
 | // and p=1. The parameters N, r, and p should be increased as memory latency and
 | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								crypto/sha3/doc.go → vendor/golang.org/x/crypto/sha3/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								crypto/sha3/doc.go → vendor/golang.org/x/crypto/sha3/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -43,7 +43,7 @@ | |||||||
| // is then "full" and the permutation is applied to "empty" it. This process is
 | // 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.
 | // 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
 | // The digest is "squeezed" from the sponge in the same way, except that output
 | ||||||
| // output is copied out instead of input being XORed in.
 | // is copied out instead of input being XORed in.
 | ||||||
| //
 | //
 | ||||||
| // A sponge is parameterized by its generic security strength, which is equal
 | // 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.
 | // to half its capacity; capacity + rate is equal to the permutation's width.
 | ||||||
| @ -63,4 +63,4 @@ | |||||||
| // They produce output of the same length, with the same security strengths
 | // They produce output of the same length, with the same security strengths
 | ||||||
| // against all attacks. This means, in particular, that SHA3-256 only has
 | // against all attacks. This means, in particular, that SHA3-256 only has
 | ||||||
| // 128-bit collision resistance, because its output length is 32 bytes.
 | // 128-bit collision resistance, because its output length is 32 bytes.
 | ||||||
| package sha3 | package sha3 // import "golang.org/x/crypto/sha3"
 | ||||||
							
								
								
									
										46
									
								
								crypto/sha3/hashes.go → vendor/golang.org/x/crypto/sha3/hashes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								crypto/sha3/hashes.go → vendor/golang.org/x/crypto/sha3/hashes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -12,31 +12,57 @@ import ( | |||||||
| 	"hash" | 	"hash" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // NewKeccak256 creates a new Keccak-256 hash.
 |  | ||||||
| func NewKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} } |  | ||||||
| 
 |  | ||||||
| // NewKeccak512 creates a new Keccak-512 hash.
 |  | ||||||
| func NewKeccak512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x01} } |  | ||||||
| 
 |  | ||||||
| // New224 creates a new SHA3-224 hash.
 | // New224 creates a new SHA3-224 hash.
 | ||||||
| // Its generic security strength is 224 bits against preimage attacks,
 | // Its generic security strength is 224 bits against preimage attacks,
 | ||||||
| // and 112 bits against collision attacks.
 | // and 112 bits against collision attacks.
 | ||||||
| func New224() hash.Hash { return &state{rate: 144, outputLen: 28, dsbyte: 0x06} } | func New224() hash.Hash { | ||||||
|  | 	if h := new224Asm(); h != nil { | ||||||
|  | 		return h | ||||||
|  | 	} | ||||||
|  | 	return &state{rate: 144, outputLen: 28, dsbyte: 0x06} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| // New256 creates a new SHA3-256 hash.
 | // New256 creates a new SHA3-256 hash.
 | ||||||
| // Its generic security strength is 256 bits against preimage attacks,
 | // Its generic security strength is 256 bits against preimage attacks,
 | ||||||
| // and 128 bits against collision attacks.
 | // and 128 bits against collision attacks.
 | ||||||
| func New256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x06} } | func New256() hash.Hash { | ||||||
|  | 	if h := new256Asm(); h != nil { | ||||||
|  | 		return h | ||||||
|  | 	} | ||||||
|  | 	return &state{rate: 136, outputLen: 32, dsbyte: 0x06} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| // New384 creates a new SHA3-384 hash.
 | // New384 creates a new SHA3-384 hash.
 | ||||||
| // Its generic security strength is 384 bits against preimage attacks,
 | // Its generic security strength is 384 bits against preimage attacks,
 | ||||||
| // and 192 bits against collision attacks.
 | // and 192 bits against collision attacks.
 | ||||||
| func New384() hash.Hash { return &state{rate: 104, outputLen: 48, dsbyte: 0x06} } | func New384() hash.Hash { | ||||||
|  | 	if h := new384Asm(); h != nil { | ||||||
|  | 		return h | ||||||
|  | 	} | ||||||
|  | 	return &state{rate: 104, outputLen: 48, dsbyte: 0x06} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| // New512 creates a new SHA3-512 hash.
 | // New512 creates a new SHA3-512 hash.
 | ||||||
| // Its generic security strength is 512 bits against preimage attacks,
 | // Its generic security strength is 512 bits against preimage attacks,
 | ||||||
| // and 256 bits against collision attacks.
 | // and 256 bits against collision attacks.
 | ||||||
| func New512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x06} } | func New512() hash.Hash { | ||||||
|  | 	if h := new512Asm(); h != nil { | ||||||
|  | 		return h | ||||||
|  | 	} | ||||||
|  | 	return &state{rate: 72, outputLen: 64, dsbyte: 0x06} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewLegacyKeccak256 creates a new Keccak-256 hash.
 | ||||||
|  | //
 | ||||||
|  | // Only use this function if you require compatibility with an existing cryptosystem
 | ||||||
|  | // that uses non-standard padding. All other users should use New256 instead.
 | ||||||
|  | func NewLegacyKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} } | ||||||
|  | 
 | ||||||
|  | // NewLegacyKeccak512 creates a new Keccak-512 hash.
 | ||||||
|  | //
 | ||||||
|  | // Only use this function if you require compatibility with an existing cryptosystem
 | ||||||
|  | // that uses non-standard padding. All other users should use New512 instead.
 | ||||||
|  | func NewLegacyKeccak512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x01} } | ||||||
| 
 | 
 | ||||||
| // Sum224 returns the SHA3-224 digest of the data.
 | // Sum224 returns the SHA3-224 digest of the data.
 | ||||||
| func Sum224(data []byte) (digest [28]byte) { | func Sum224(data []byte) (digest [28]byte) { | ||||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/crypto/sha3/hashes_generic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/crypto/sha3/hashes_generic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | // Copyright 2017 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | //+build gccgo appengine !s390x
 | ||||||
|  | 
 | ||||||
|  | package sha3 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"hash" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // new224Asm returns an assembly implementation of SHA3-224 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func new224Asm() hash.Hash { return nil } | ||||||
|  | 
 | ||||||
|  | // new256Asm returns an assembly implementation of SHA3-256 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func new256Asm() hash.Hash { return nil } | ||||||
|  | 
 | ||||||
|  | // new384Asm returns an assembly implementation of SHA3-384 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func new384Asm() hash.Hash { return nil } | ||||||
|  | 
 | ||||||
|  | // new512Asm returns an assembly implementation of SHA3-512 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func new512Asm() hash.Hash { return nil } | ||||||
							
								
								
									
										0
									
								
								crypto/sha3/keccakf.go → vendor/golang.org/x/crypto/sha3/keccakf.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								crypto/sha3/keccakf.go → vendor/golang.org/x/crypto/sha3/keccakf.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
									
										2
									
								
								crypto/sha3/keccakf_amd64.go → vendor/golang.org/x/crypto/sha3/keccakf_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								crypto/sha3/keccakf_amd64.go → vendor/golang.org/x/crypto/sha3/keccakf_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -10,4 +10,4 @@ package sha3 | |||||||
| 
 | 
 | ||||||
| //go:noescape
 | //go:noescape
 | ||||||
| 
 | 
 | ||||||
| func keccakF1600(state *[25]uint64) | func keccakF1600(a *[25]uint64) | ||||||
							
								
								
									
										0
									
								
								crypto/sha3/keccakf_amd64.s → vendor/golang.org/x/crypto/sha3/keccakf_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								crypto/sha3/keccakf_amd64.s → vendor/golang.org/x/crypto/sha3/keccakf_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
									
										0
									
								
								crypto/sha3/register.go → vendor/golang.org/x/crypto/sha3/register.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								crypto/sha3/register.go → vendor/golang.org/x/crypto/sha3/register.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
									
										0
									
								
								crypto/sha3/sha3.go → vendor/golang.org/x/crypto/sha3/sha3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								crypto/sha3/sha3.go → vendor/golang.org/x/crypto/sha3/sha3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
									
										289
									
								
								vendor/golang.org/x/crypto/sha3/sha3_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										289
									
								
								vendor/golang.org/x/crypto/sha3/sha3_s390x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,289 @@ | |||||||
|  | // Copyright 2017 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | //+build !gccgo,!appengine
 | ||||||
|  | 
 | ||||||
|  | package sha3 | ||||||
|  | 
 | ||||||
|  | // This file contains code for using the 'compute intermediate
 | ||||||
|  | // message digest' (KIMD) and 'compute last message digest' (KLMD)
 | ||||||
|  | // instructions to compute SHA-3 and SHAKE hashes on IBM Z.
 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"hash" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // codes represent 7-bit KIMD/KLMD function codes as defined in
 | ||||||
|  | // the Principles of Operation.
 | ||||||
|  | type code uint64 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// function codes for KIMD/KLMD
 | ||||||
|  | 	sha3_224  code = 32 | ||||||
|  | 	sha3_256       = 33 | ||||||
|  | 	sha3_384       = 34 | ||||||
|  | 	sha3_512       = 35 | ||||||
|  | 	shake_128      = 36 | ||||||
|  | 	shake_256      = 37 | ||||||
|  | 	nopad          = 0x100 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // hasMSA6 reports whether the machine supports the SHA-3 and SHAKE function
 | ||||||
|  | // codes, as defined in message-security-assist extension 6.
 | ||||||
|  | func hasMSA6() bool | ||||||
|  | 
 | ||||||
|  | // hasAsm caches the result of hasMSA6 (which might be expensive to call).
 | ||||||
|  | var hasAsm = hasMSA6() | ||||||
|  | 
 | ||||||
|  | // kimd is a wrapper for the 'compute intermediate message digest' instruction.
 | ||||||
|  | // src must be a multiple of the rate for the given function code.
 | ||||||
|  | //go:noescape
 | ||||||
|  | func kimd(function code, chain *[200]byte, src []byte) | ||||||
|  | 
 | ||||||
|  | // klmd is a wrapper for the 'compute last message digest' instruction.
 | ||||||
|  | // src padding is handled by the instruction.
 | ||||||
|  | //go:noescape
 | ||||||
|  | func klmd(function code, chain *[200]byte, dst, src []byte) | ||||||
|  | 
 | ||||||
|  | type asmState struct { | ||||||
|  | 	a         [200]byte       // 1600 bit state
 | ||||||
|  | 	buf       []byte          // care must be taken to ensure cap(buf) is a multiple of rate
 | ||||||
|  | 	rate      int             // equivalent to block size
 | ||||||
|  | 	storage   [3072]byte      // underlying storage for buf
 | ||||||
|  | 	outputLen int             // output length if fixed, 0 if not
 | ||||||
|  | 	function  code            // KIMD/KLMD function code
 | ||||||
|  | 	state     spongeDirection // whether the sponge is absorbing or squeezing
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newAsmState(function code) *asmState { | ||||||
|  | 	var s asmState | ||||||
|  | 	s.function = function | ||||||
|  | 	switch function { | ||||||
|  | 	case sha3_224: | ||||||
|  | 		s.rate = 144 | ||||||
|  | 		s.outputLen = 28 | ||||||
|  | 	case sha3_256: | ||||||
|  | 		s.rate = 136 | ||||||
|  | 		s.outputLen = 32 | ||||||
|  | 	case sha3_384: | ||||||
|  | 		s.rate = 104 | ||||||
|  | 		s.outputLen = 48 | ||||||
|  | 	case sha3_512: | ||||||
|  | 		s.rate = 72 | ||||||
|  | 		s.outputLen = 64 | ||||||
|  | 	case shake_128: | ||||||
|  | 		s.rate = 168 | ||||||
|  | 	case shake_256: | ||||||
|  | 		s.rate = 136 | ||||||
|  | 	default: | ||||||
|  | 		panic("sha3: unrecognized function code") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// limit s.buf size to a multiple of s.rate
 | ||||||
|  | 	s.resetBuf() | ||||||
|  | 	return &s | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *asmState) clone() *asmState { | ||||||
|  | 	c := *s | ||||||
|  | 	c.buf = c.storage[:len(s.buf):cap(s.buf)] | ||||||
|  | 	return &c | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // copyIntoBuf copies b into buf. It will panic if there is not enough space to
 | ||||||
|  | // store all of b.
 | ||||||
|  | func (s *asmState) copyIntoBuf(b []byte) { | ||||||
|  | 	bufLen := len(s.buf) | ||||||
|  | 	s.buf = s.buf[:len(s.buf)+len(b)] | ||||||
|  | 	copy(s.buf[bufLen:], b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // resetBuf points buf at storage, sets the length to 0 and sets cap to be a
 | ||||||
|  | // multiple of the rate.
 | ||||||
|  | func (s *asmState) resetBuf() { | ||||||
|  | 	max := (cap(s.storage) / s.rate) * s.rate | ||||||
|  | 	s.buf = s.storage[:0:max] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Write (via the embedded io.Writer interface) adds more data to the running hash.
 | ||||||
|  | // It never returns an error.
 | ||||||
|  | func (s *asmState) Write(b []byte) (int, error) { | ||||||
|  | 	if s.state != spongeAbsorbing { | ||||||
|  | 		panic("sha3: write to sponge after read") | ||||||
|  | 	} | ||||||
|  | 	length := len(b) | ||||||
|  | 	for len(b) > 0 { | ||||||
|  | 		if len(s.buf) == 0 && len(b) >= cap(s.buf) { | ||||||
|  | 			// Hash the data directly and push any remaining bytes
 | ||||||
|  | 			// into the buffer.
 | ||||||
|  | 			remainder := len(s.buf) % s.rate | ||||||
|  | 			kimd(s.function, &s.a, b[:len(b)-remainder]) | ||||||
|  | 			if remainder != 0 { | ||||||
|  | 				s.copyIntoBuf(b[len(b)-remainder:]) | ||||||
|  | 			} | ||||||
|  | 			return length, nil | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if len(s.buf) == cap(s.buf) { | ||||||
|  | 			// flush the buffer
 | ||||||
|  | 			kimd(s.function, &s.a, s.buf) | ||||||
|  | 			s.buf = s.buf[:0] | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// copy as much as we can into the buffer
 | ||||||
|  | 		n := len(b) | ||||||
|  | 		if len(b) > cap(s.buf)-len(s.buf) { | ||||||
|  | 			n = cap(s.buf) - len(s.buf) | ||||||
|  | 		} | ||||||
|  | 		s.copyIntoBuf(b[:n]) | ||||||
|  | 		b = b[n:] | ||||||
|  | 	} | ||||||
|  | 	return length, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Read squeezes an arbitrary number of bytes from the sponge.
 | ||||||
|  | func (s *asmState) Read(out []byte) (n int, err error) { | ||||||
|  | 	n = len(out) | ||||||
|  | 
 | ||||||
|  | 	// need to pad if we were absorbing
 | ||||||
|  | 	if s.state == spongeAbsorbing { | ||||||
|  | 		s.state = spongeSqueezing | ||||||
|  | 
 | ||||||
|  | 		// write hash directly into out if possible
 | ||||||
|  | 		if len(out)%s.rate == 0 { | ||||||
|  | 			klmd(s.function, &s.a, out, s.buf) // len(out) may be 0
 | ||||||
|  | 			s.buf = s.buf[:0] | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// write hash into buffer
 | ||||||
|  | 		max := cap(s.buf) | ||||||
|  | 		if max > len(out) { | ||||||
|  | 			max = (len(out)/s.rate)*s.rate + s.rate | ||||||
|  | 		} | ||||||
|  | 		klmd(s.function, &s.a, s.buf[:max], s.buf) | ||||||
|  | 		s.buf = s.buf[:max] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for len(out) > 0 { | ||||||
|  | 		// flush the buffer
 | ||||||
|  | 		if len(s.buf) != 0 { | ||||||
|  | 			c := copy(out, s.buf) | ||||||
|  | 			out = out[c:] | ||||||
|  | 			s.buf = s.buf[c:] | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// write hash directly into out if possible
 | ||||||
|  | 		if len(out)%s.rate == 0 { | ||||||
|  | 			klmd(s.function|nopad, &s.a, out, nil) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// write hash into buffer
 | ||||||
|  | 		s.resetBuf() | ||||||
|  | 		if cap(s.buf) > len(out) { | ||||||
|  | 			s.buf = s.buf[:(len(out)/s.rate)*s.rate+s.rate] | ||||||
|  | 		} | ||||||
|  | 		klmd(s.function|nopad, &s.a, s.buf, nil) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Sum appends the current hash to b and returns the resulting slice.
 | ||||||
|  | // It does not change the underlying hash state.
 | ||||||
|  | func (s *asmState) Sum(b []byte) []byte { | ||||||
|  | 	if s.outputLen == 0 { | ||||||
|  | 		panic("sha3: cannot call Sum on SHAKE functions") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Copy the state to preserve the original.
 | ||||||
|  | 	a := s.a | ||||||
|  | 
 | ||||||
|  | 	// Hash the buffer. Note that we don't clear it because we
 | ||||||
|  | 	// aren't updating the state.
 | ||||||
|  | 	klmd(s.function, &a, nil, s.buf) | ||||||
|  | 	return append(b, a[:s.outputLen]...) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Reset resets the Hash to its initial state.
 | ||||||
|  | func (s *asmState) Reset() { | ||||||
|  | 	for i := range s.a { | ||||||
|  | 		s.a[i] = 0 | ||||||
|  | 	} | ||||||
|  | 	s.resetBuf() | ||||||
|  | 	s.state = spongeAbsorbing | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Size returns the number of bytes Sum will return.
 | ||||||
|  | func (s *asmState) Size() int { | ||||||
|  | 	return s.outputLen | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BlockSize returns the hash's underlying block size.
 | ||||||
|  | // The Write method must be able to accept any amount
 | ||||||
|  | // of data, but it may operate more efficiently if all writes
 | ||||||
|  | // are a multiple of the block size.
 | ||||||
|  | func (s *asmState) BlockSize() int { | ||||||
|  | 	return s.rate | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Clone returns a copy of the ShakeHash in its current state.
 | ||||||
|  | func (s *asmState) Clone() ShakeHash { | ||||||
|  | 	return s.clone() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // new224Asm returns an assembly implementation of SHA3-224 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func new224Asm() hash.Hash { | ||||||
|  | 	if hasAsm { | ||||||
|  | 		return newAsmState(sha3_224) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // new256Asm returns an assembly implementation of SHA3-256 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func new256Asm() hash.Hash { | ||||||
|  | 	if hasAsm { | ||||||
|  | 		return newAsmState(sha3_256) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // new384Asm returns an assembly implementation of SHA3-384 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func new384Asm() hash.Hash { | ||||||
|  | 	if hasAsm { | ||||||
|  | 		return newAsmState(sha3_384) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // new512Asm returns an assembly implementation of SHA3-512 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func new512Asm() hash.Hash { | ||||||
|  | 	if hasAsm { | ||||||
|  | 		return newAsmState(sha3_512) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // newShake128Asm returns an assembly implementation of SHAKE-128 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func newShake128Asm() ShakeHash { | ||||||
|  | 	if hasAsm { | ||||||
|  | 		return newAsmState(shake_128) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // newShake256Asm returns an assembly implementation of SHAKE-256 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func newShake256Asm() ShakeHash { | ||||||
|  | 	if hasAsm { | ||||||
|  | 		return newAsmState(shake_256) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										49
									
								
								vendor/golang.org/x/crypto/sha3/sha3_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/golang.org/x/crypto/sha3/sha3_s390x.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | |||||||
|  | // Copyright 2017 The Go Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | //+build !gccgo,!appengine | ||||||
|  | 
 | ||||||
|  | #include "textflag.h" | ||||||
|  | 
 | ||||||
|  | TEXT ·hasMSA6(SB), NOSPLIT, $16-1 | ||||||
|  | 	MOVD $0, R0          // KIMD-Query function code | ||||||
|  | 	MOVD $tmp-16(SP), R1 // parameter block | ||||||
|  | 	XC   $16, (R1), (R1) // clear the parameter block | ||||||
|  | 	WORD $0xB93E0002     // KIMD --, -- | ||||||
|  | 	WORD $0x91FC1004     // TM 4(R1), 0xFC (test bits [32-37]) | ||||||
|  | 	BVS  yes | ||||||
|  | 
 | ||||||
|  | no: | ||||||
|  | 	MOVB $0, ret+0(FP) | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | yes: | ||||||
|  | 	MOVB $1, ret+0(FP) | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | // func kimd(function code, params *[200]byte, src []byte) | ||||||
|  | TEXT ·kimd(SB), NOFRAME|NOSPLIT, $0-40 | ||||||
|  | 	MOVD function+0(FP), R0 | ||||||
|  | 	MOVD params+8(FP), R1 | ||||||
|  | 	LMG  src+16(FP), R2, R3 // R2=base, R3=len | ||||||
|  | 
 | ||||||
|  | continue: | ||||||
|  | 	WORD $0xB93E0002 // KIMD --, R2 | ||||||
|  | 	BVS  continue    // continue if interrupted | ||||||
|  | 	MOVD $0, R0      // reset R0 for pre-go1.8 compilers | ||||||
|  | 	RET | ||||||
|  | 
 | ||||||
|  | // func klmd(function code, params *[200]byte, dst, src []byte) | ||||||
|  | TEXT ·klmd(SB), NOFRAME|NOSPLIT, $0-64 | ||||||
|  | 	// TODO: SHAKE support | ||||||
|  | 	MOVD function+0(FP), R0 | ||||||
|  | 	MOVD params+8(FP), R1 | ||||||
|  | 	LMG  dst+16(FP), R2, R3 // R2=base, R3=len | ||||||
|  | 	LMG  src+40(FP), R4, R5 // R4=base, R5=len | ||||||
|  | 
 | ||||||
|  | continue: | ||||||
|  | 	WORD $0xB93F0024 // KLMD R2, R4 | ||||||
|  | 	BVS  continue    // continue if interrupted | ||||||
|  | 	MOVD $0, R0      // reset R0 for pre-go1.8 compilers | ||||||
|  | 	RET | ||||||
							
								
								
									
										16
									
								
								crypto/sha3/shake.go → vendor/golang.org/x/crypto/sha3/shake.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								crypto/sha3/shake.go → vendor/golang.org/x/crypto/sha3/shake.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -38,12 +38,22 @@ func (d *state) Clone() ShakeHash { | |||||||
| // NewShake128 creates a new SHAKE128 variable-output-length ShakeHash.
 | // NewShake128 creates a new SHAKE128 variable-output-length ShakeHash.
 | ||||||
| // Its generic security strength is 128 bits against all attacks if at
 | // Its generic security strength is 128 bits against all attacks if at
 | ||||||
| // least 32 bytes of its output are used.
 | // least 32 bytes of its output are used.
 | ||||||
| func NewShake128() ShakeHash { return &state{rate: 168, dsbyte: 0x1f} } | func NewShake128() ShakeHash { | ||||||
|  | 	if h := newShake128Asm(); h != nil { | ||||||
|  | 		return h | ||||||
|  | 	} | ||||||
|  | 	return &state{rate: 168, dsbyte: 0x1f} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| // NewShake256 creates a new SHAKE128 variable-output-length ShakeHash.
 | // NewShake256 creates a new SHAKE256 variable-output-length ShakeHash.
 | ||||||
| // Its generic security strength is 256 bits against all attacks if
 | // Its generic security strength is 256 bits against all attacks if
 | ||||||
| // at least 64 bytes of its output are used.
 | // at least 64 bytes of its output are used.
 | ||||||
| func NewShake256() ShakeHash { return &state{rate: 136, dsbyte: 0x1f} } | func NewShake256() ShakeHash { | ||||||
|  | 	if h := newShake256Asm(); h != nil { | ||||||
|  | 		return h | ||||||
|  | 	} | ||||||
|  | 	return &state{rate: 136, dsbyte: 0x1f} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| // ShakeSum128 writes an arbitrary-length digest of data into hash.
 | // ShakeSum128 writes an arbitrary-length digest of data into hash.
 | ||||||
| func ShakeSum128(hash, data []byte) { | func ShakeSum128(hash, data []byte) { | ||||||
							
								
								
									
										19
									
								
								vendor/golang.org/x/crypto/sha3/shake_generic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/golang.org/x/crypto/sha3/shake_generic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | // Copyright 2017 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | //+build gccgo appengine !s390x
 | ||||||
|  | 
 | ||||||
|  | package sha3 | ||||||
|  | 
 | ||||||
|  | // newShake128Asm returns an assembly implementation of SHAKE-128 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func newShake128Asm() ShakeHash { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // newShake256Asm returns an assembly implementation of SHAKE-256 if available,
 | ||||||
|  | // otherwise it returns nil.
 | ||||||
|  | func newShake256Asm() ShakeHash { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										0
									
								
								crypto/sha3/xor.go → vendor/golang.org/x/crypto/sha3/xor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								crypto/sha3/xor.go → vendor/golang.org/x/crypto/sha3/xor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
									
										0
									
								
								crypto/sha3/xor_generic.go → vendor/golang.org/x/crypto/sha3/xor_generic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								crypto/sha3/xor_generic.go → vendor/golang.org/x/crypto/sha3/xor_generic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
									
										0
									
								
								crypto/sha3/xor_unaligned.go → vendor/golang.org/x/crypto/sha3/xor_unaligned.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								crypto/sha3/xor_unaligned.go → vendor/golang.org/x/crypto/sha3/xor_unaligned.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
									
										24
									
								
								vendor/golang.org/x/crypto/ssh/certs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/golang.org/x/crypto/ssh/certs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -44,7 +44,9 @@ type Signature struct { | |||||||
| const CertTimeInfinity = 1<<64 - 1 | const CertTimeInfinity = 1<<64 - 1 | ||||||
| 
 | 
 | ||||||
| // An Certificate represents an OpenSSH certificate as defined in
 | // An Certificate represents an OpenSSH certificate as defined in
 | ||||||
| // [PROTOCOL.certkeys]?rev=1.8.
 | // [PROTOCOL.certkeys]?rev=1.8. The Certificate type implements the
 | ||||||
|  | // PublicKey interface, so it can be unmarshaled using
 | ||||||
|  | // ParsePublicKey.
 | ||||||
| type Certificate struct { | type Certificate struct { | ||||||
| 	Nonce           []byte | 	Nonce           []byte | ||||||
| 	Key             PublicKey | 	Key             PublicKey | ||||||
| @ -220,6 +222,11 @@ type openSSHCertSigner struct { | |||||||
| 	signer Signer | 	signer Signer | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type algorithmOpenSSHCertSigner struct { | ||||||
|  | 	*openSSHCertSigner | ||||||
|  | 	algorithmSigner AlgorithmSigner | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // NewCertSigner returns a Signer that signs with the given Certificate, whose
 | // NewCertSigner returns a Signer that signs with the given Certificate, whose
 | ||||||
| // private key is held by signer. It returns an error if the public key in cert
 | // private key is held by signer. It returns an error if the public key in cert
 | ||||||
| // doesn't match the key used by signer.
 | // doesn't match the key used by signer.
 | ||||||
| @ -228,7 +235,12 @@ func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) { | |||||||
| 		return nil, errors.New("ssh: signer and cert have different public key") | 		return nil, errors.New("ssh: signer and cert have different public key") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return &openSSHCertSigner{cert, signer}, nil | 	if algorithmSigner, ok := signer.(AlgorithmSigner); ok { | ||||||
|  | 		return &algorithmOpenSSHCertSigner{ | ||||||
|  | 			&openSSHCertSigner{cert, signer}, algorithmSigner}, nil | ||||||
|  | 	} else { | ||||||
|  | 		return &openSSHCertSigner{cert, signer}, nil | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { | func (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { | ||||||
| @ -239,6 +251,10 @@ func (s *openSSHCertSigner) PublicKey() PublicKey { | |||||||
| 	return s.pub | 	return s.pub | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (s *algorithmOpenSSHCertSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { | ||||||
|  | 	return s.algorithmSigner.SignWithAlgorithm(rand, data, algorithm) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const sourceAddressCriticalOption = "source-address" | const sourceAddressCriticalOption = "source-address" | ||||||
| 
 | 
 | ||||||
| // CertChecker does the work of verifying a certificate. Its methods
 | // CertChecker does the work of verifying a certificate. Its methods
 | ||||||
| @ -340,10 +356,10 @@ func (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permis | |||||||
| // the signature of the certificate.
 | // the signature of the certificate.
 | ||||||
| func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { | func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { | ||||||
| 	if c.IsRevoked != nil && c.IsRevoked(cert) { | 	if c.IsRevoked != nil && c.IsRevoked(cert) { | ||||||
| 		return fmt.Errorf("ssh: certicate serial %d revoked", cert.Serial) | 		return fmt.Errorf("ssh: certificate serial %d revoked", cert.Serial) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for opt, _ := range cert.CriticalOptions { | 	for opt := range cert.CriticalOptions { | ||||||
| 		// sourceAddressCriticalOption will be enforced by
 | 		// sourceAddressCriticalOption will be enforced by
 | ||||||
| 		// serverAuthenticate
 | 		// serverAuthenticate
 | ||||||
| 		if opt == sourceAddressCriticalOption { | 		if opt == sourceAddressCriticalOption { | ||||||
|  | |||||||
							
								
								
									
										142
									
								
								vendor/golang.org/x/crypto/ssh/channel.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										142
									
								
								vendor/golang.org/x/crypto/ssh/channel.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -205,32 +205,32 @@ type channel struct { | |||||||
| 
 | 
 | ||||||
| // writePacket sends a packet. If the packet is a channel close, it updates
 | // writePacket sends a packet. If the packet is a channel close, it updates
 | ||||||
| // sentClose. This method takes the lock c.writeMu.
 | // sentClose. This method takes the lock c.writeMu.
 | ||||||
| func (c *channel) writePacket(packet []byte) error { | func (ch *channel) writePacket(packet []byte) error { | ||||||
| 	c.writeMu.Lock() | 	ch.writeMu.Lock() | ||||||
| 	if c.sentClose { | 	if ch.sentClose { | ||||||
| 		c.writeMu.Unlock() | 		ch.writeMu.Unlock() | ||||||
| 		return io.EOF | 		return io.EOF | ||||||
| 	} | 	} | ||||||
| 	c.sentClose = (packet[0] == msgChannelClose) | 	ch.sentClose = (packet[0] == msgChannelClose) | ||||||
| 	err := c.mux.conn.writePacket(packet) | 	err := ch.mux.conn.writePacket(packet) | ||||||
| 	c.writeMu.Unlock() | 	ch.writeMu.Unlock() | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *channel) sendMessage(msg interface{}) error { | func (ch *channel) sendMessage(msg interface{}) error { | ||||||
| 	if debugMux { | 	if debugMux { | ||||||
| 		log.Printf("send(%d): %#v", c.mux.chanList.offset, msg) | 		log.Printf("send(%d): %#v", ch.mux.chanList.offset, msg) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	p := Marshal(msg) | 	p := Marshal(msg) | ||||||
| 	binary.BigEndian.PutUint32(p[1:], c.remoteId) | 	binary.BigEndian.PutUint32(p[1:], ch.remoteId) | ||||||
| 	return c.writePacket(p) | 	return ch.writePacket(p) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // WriteExtended writes data to a specific extended stream. These streams are
 | // WriteExtended writes data to a specific extended stream. These streams are
 | ||||||
| // used, for example, for stderr.
 | // used, for example, for stderr.
 | ||||||
| func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { | func (ch *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { | ||||||
| 	if c.sentEOF { | 	if ch.sentEOF { | ||||||
| 		return 0, io.EOF | 		return 0, io.EOF | ||||||
| 	} | 	} | ||||||
| 	// 1 byte message type, 4 bytes remoteId, 4 bytes data length
 | 	// 1 byte message type, 4 bytes remoteId, 4 bytes data length
 | ||||||
| @ -241,16 +241,16 @@ func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err er | |||||||
| 		opCode = msgChannelExtendedData | 		opCode = msgChannelExtendedData | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	c.writeMu.Lock() | 	ch.writeMu.Lock() | ||||||
| 	packet := c.packetPool[extendedCode] | 	packet := ch.packetPool[extendedCode] | ||||||
| 	// We don't remove the buffer from packetPool, so
 | 	// We don't remove the buffer from packetPool, so
 | ||||||
| 	// WriteExtended calls from different goroutines will be
 | 	// WriteExtended calls from different goroutines will be
 | ||||||
| 	// flagged as errors by the race detector.
 | 	// flagged as errors by the race detector.
 | ||||||
| 	c.writeMu.Unlock() | 	ch.writeMu.Unlock() | ||||||
| 
 | 
 | ||||||
| 	for len(data) > 0 { | 	for len(data) > 0 { | ||||||
| 		space := min(c.maxRemotePayload, len(data)) | 		space := min(ch.maxRemotePayload, len(data)) | ||||||
| 		if space, err = c.remoteWin.reserve(space); err != nil { | 		if space, err = ch.remoteWin.reserve(space); err != nil { | ||||||
| 			return n, err | 			return n, err | ||||||
| 		} | 		} | ||||||
| 		if want := headerLength + space; uint32(cap(packet)) < want { | 		if want := headerLength + space; uint32(cap(packet)) < want { | ||||||
| @ -262,13 +262,13 @@ func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err er | |||||||
| 		todo := data[:space] | 		todo := data[:space] | ||||||
| 
 | 
 | ||||||
| 		packet[0] = opCode | 		packet[0] = opCode | ||||||
| 		binary.BigEndian.PutUint32(packet[1:], c.remoteId) | 		binary.BigEndian.PutUint32(packet[1:], ch.remoteId) | ||||||
| 		if extendedCode > 0 { | 		if extendedCode > 0 { | ||||||
| 			binary.BigEndian.PutUint32(packet[5:], uint32(extendedCode)) | 			binary.BigEndian.PutUint32(packet[5:], uint32(extendedCode)) | ||||||
| 		} | 		} | ||||||
| 		binary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo))) | 		binary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo))) | ||||||
| 		copy(packet[headerLength:], todo) | 		copy(packet[headerLength:], todo) | ||||||
| 		if err = c.writePacket(packet); err != nil { | 		if err = ch.writePacket(packet); err != nil { | ||||||
| 			return n, err | 			return n, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| @ -276,14 +276,14 @@ func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err er | |||||||
| 		data = data[len(todo):] | 		data = data[len(todo):] | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	c.writeMu.Lock() | 	ch.writeMu.Lock() | ||||||
| 	c.packetPool[extendedCode] = packet | 	ch.packetPool[extendedCode] = packet | ||||||
| 	c.writeMu.Unlock() | 	ch.writeMu.Unlock() | ||||||
| 
 | 
 | ||||||
| 	return n, err | 	return n, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *channel) handleData(packet []byte) error { | func (ch *channel) handleData(packet []byte) error { | ||||||
| 	headerLen := 9 | 	headerLen := 9 | ||||||
| 	isExtendedData := packet[0] == msgChannelExtendedData | 	isExtendedData := packet[0] == msgChannelExtendedData | ||||||
| 	if isExtendedData { | 	if isExtendedData { | ||||||
| @ -303,7 +303,7 @@ func (c *channel) handleData(packet []byte) error { | |||||||
| 	if length == 0 { | 	if length == 0 { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 	if length > c.maxIncomingPayload { | 	if length > ch.maxIncomingPayload { | ||||||
| 		// TODO(hanwen): should send Disconnect?
 | 		// TODO(hanwen): should send Disconnect?
 | ||||||
| 		return errors.New("ssh: incoming packet exceeds maximum payload size") | 		return errors.New("ssh: incoming packet exceeds maximum payload size") | ||||||
| 	} | 	} | ||||||
| @ -313,21 +313,21 @@ func (c *channel) handleData(packet []byte) error { | |||||||
| 		return errors.New("ssh: wrong packet length") | 		return errors.New("ssh: wrong packet length") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	c.windowMu.Lock() | 	ch.windowMu.Lock() | ||||||
| 	if c.myWindow < length { | 	if ch.myWindow < length { | ||||||
| 		c.windowMu.Unlock() | 		ch.windowMu.Unlock() | ||||||
| 		// TODO(hanwen): should send Disconnect with reason?
 | 		// TODO(hanwen): should send Disconnect with reason?
 | ||||||
| 		return errors.New("ssh: remote side wrote too much") | 		return errors.New("ssh: remote side wrote too much") | ||||||
| 	} | 	} | ||||||
| 	c.myWindow -= length | 	ch.myWindow -= length | ||||||
| 	c.windowMu.Unlock() | 	ch.windowMu.Unlock() | ||||||
| 
 | 
 | ||||||
| 	if extended == 1 { | 	if extended == 1 { | ||||||
| 		c.extPending.write(data) | 		ch.extPending.write(data) | ||||||
| 	} else if extended > 0 { | 	} else if extended > 0 { | ||||||
| 		// discard other extended data.
 | 		// discard other extended data.
 | ||||||
| 	} else { | 	} else { | ||||||
| 		c.pending.write(data) | 		ch.pending.write(data) | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| @ -384,31 +384,31 @@ func (c *channel) close() { | |||||||
| // responseMessageReceived is called when a success or failure message is
 | // responseMessageReceived is called when a success or failure message is
 | ||||||
| // received on a channel to check that such a message is reasonable for the
 | // received on a channel to check that such a message is reasonable for the
 | ||||||
| // given channel.
 | // given channel.
 | ||||||
| func (c *channel) responseMessageReceived() error { | func (ch *channel) responseMessageReceived() error { | ||||||
| 	if c.direction == channelInbound { | 	if ch.direction == channelInbound { | ||||||
| 		return errors.New("ssh: channel response message received on inbound channel") | 		return errors.New("ssh: channel response message received on inbound channel") | ||||||
| 	} | 	} | ||||||
| 	if c.decided { | 	if ch.decided { | ||||||
| 		return errors.New("ssh: duplicate response received for channel") | 		return errors.New("ssh: duplicate response received for channel") | ||||||
| 	} | 	} | ||||||
| 	c.decided = true | 	ch.decided = true | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *channel) handlePacket(packet []byte) error { | func (ch *channel) handlePacket(packet []byte) error { | ||||||
| 	switch packet[0] { | 	switch packet[0] { | ||||||
| 	case msgChannelData, msgChannelExtendedData: | 	case msgChannelData, msgChannelExtendedData: | ||||||
| 		return c.handleData(packet) | 		return ch.handleData(packet) | ||||||
| 	case msgChannelClose: | 	case msgChannelClose: | ||||||
| 		c.sendMessage(channelCloseMsg{PeersId: c.remoteId}) | 		ch.sendMessage(channelCloseMsg{PeersID: ch.remoteId}) | ||||||
| 		c.mux.chanList.remove(c.localId) | 		ch.mux.chanList.remove(ch.localId) | ||||||
| 		c.close() | 		ch.close() | ||||||
| 		return nil | 		return nil | ||||||
| 	case msgChannelEOF: | 	case msgChannelEOF: | ||||||
| 		// RFC 4254 is mute on how EOF affects dataExt messages but
 | 		// RFC 4254 is mute on how EOF affects dataExt messages but
 | ||||||
| 		// it is logical to signal EOF at the same time.
 | 		// it is logical to signal EOF at the same time.
 | ||||||
| 		c.extPending.eof() | 		ch.extPending.eof() | ||||||
| 		c.pending.eof() | 		ch.pending.eof() | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -419,24 +419,24 @@ func (c *channel) handlePacket(packet []byte) error { | |||||||
| 
 | 
 | ||||||
| 	switch msg := decoded.(type) { | 	switch msg := decoded.(type) { | ||||||
| 	case *channelOpenFailureMsg: | 	case *channelOpenFailureMsg: | ||||||
| 		if err := c.responseMessageReceived(); err != nil { | 		if err := ch.responseMessageReceived(); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		c.mux.chanList.remove(msg.PeersId) | 		ch.mux.chanList.remove(msg.PeersID) | ||||||
| 		c.msg <- msg | 		ch.msg <- msg | ||||||
| 	case *channelOpenConfirmMsg: | 	case *channelOpenConfirmMsg: | ||||||
| 		if err := c.responseMessageReceived(); err != nil { | 		if err := ch.responseMessageReceived(); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { | 		if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { | ||||||
| 			return fmt.Errorf("ssh: invalid MaxPacketSize %d from peer", msg.MaxPacketSize) | 			return fmt.Errorf("ssh: invalid MaxPacketSize %d from peer", msg.MaxPacketSize) | ||||||
| 		} | 		} | ||||||
| 		c.remoteId = msg.MyId | 		ch.remoteId = msg.MyID | ||||||
| 		c.maxRemotePayload = msg.MaxPacketSize | 		ch.maxRemotePayload = msg.MaxPacketSize | ||||||
| 		c.remoteWin.add(msg.MyWindow) | 		ch.remoteWin.add(msg.MyWindow) | ||||||
| 		c.msg <- msg | 		ch.msg <- msg | ||||||
| 	case *windowAdjustMsg: | 	case *windowAdjustMsg: | ||||||
| 		if !c.remoteWin.add(msg.AdditionalBytes) { | 		if !ch.remoteWin.add(msg.AdditionalBytes) { | ||||||
| 			return fmt.Errorf("ssh: invalid window update for %d bytes", msg.AdditionalBytes) | 			return fmt.Errorf("ssh: invalid window update for %d bytes", msg.AdditionalBytes) | ||||||
| 		} | 		} | ||||||
| 	case *channelRequestMsg: | 	case *channelRequestMsg: | ||||||
| @ -444,12 +444,12 @@ func (c *channel) handlePacket(packet []byte) error { | |||||||
| 			Type:      msg.Request, | 			Type:      msg.Request, | ||||||
| 			WantReply: msg.WantReply, | 			WantReply: msg.WantReply, | ||||||
| 			Payload:   msg.RequestSpecificData, | 			Payload:   msg.RequestSpecificData, | ||||||
| 			ch:        c, | 			ch:        ch, | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		c.incomingRequests <- &req | 		ch.incomingRequests <- &req | ||||||
| 	default: | 	default: | ||||||
| 		c.msg <- msg | 		ch.msg <- msg | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| @ -488,23 +488,23 @@ func (e *extChannel) Read(data []byte) (n int, err error) { | |||||||
| 	return e.ch.ReadExtended(data, e.code) | 	return e.ch.ReadExtended(data, e.code) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *channel) Accept() (Channel, <-chan *Request, error) { | func (ch *channel) Accept() (Channel, <-chan *Request, error) { | ||||||
| 	if c.decided { | 	if ch.decided { | ||||||
| 		return nil, nil, errDecidedAlready | 		return nil, nil, errDecidedAlready | ||||||
| 	} | 	} | ||||||
| 	c.maxIncomingPayload = channelMaxPacket | 	ch.maxIncomingPayload = channelMaxPacket | ||||||
| 	confirm := channelOpenConfirmMsg{ | 	confirm := channelOpenConfirmMsg{ | ||||||
| 		PeersId:       c.remoteId, | 		PeersID:       ch.remoteId, | ||||||
| 		MyId:          c.localId, | 		MyID:          ch.localId, | ||||||
| 		MyWindow:      c.myWindow, | 		MyWindow:      ch.myWindow, | ||||||
| 		MaxPacketSize: c.maxIncomingPayload, | 		MaxPacketSize: ch.maxIncomingPayload, | ||||||
| 	} | 	} | ||||||
| 	c.decided = true | 	ch.decided = true | ||||||
| 	if err := c.sendMessage(confirm); err != nil { | 	if err := ch.sendMessage(confirm); err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return c, c.incomingRequests, nil | 	return ch, ch.incomingRequests, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ch *channel) Reject(reason RejectionReason, message string) error { | func (ch *channel) Reject(reason RejectionReason, message string) error { | ||||||
| @ -512,7 +512,7 @@ func (ch *channel) Reject(reason RejectionReason, message string) error { | |||||||
| 		return errDecidedAlready | 		return errDecidedAlready | ||||||
| 	} | 	} | ||||||
| 	reject := channelOpenFailureMsg{ | 	reject := channelOpenFailureMsg{ | ||||||
| 		PeersId:  ch.remoteId, | 		PeersID:  ch.remoteId, | ||||||
| 		Reason:   reason, | 		Reason:   reason, | ||||||
| 		Message:  message, | 		Message:  message, | ||||||
| 		Language: "en", | 		Language: "en", | ||||||
| @ -541,7 +541,7 @@ func (ch *channel) CloseWrite() error { | |||||||
| 	} | 	} | ||||||
| 	ch.sentEOF = true | 	ch.sentEOF = true | ||||||
| 	return ch.sendMessage(channelEOFMsg{ | 	return ch.sendMessage(channelEOFMsg{ | ||||||
| 		PeersId: ch.remoteId}) | 		PeersID: ch.remoteId}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ch *channel) Close() error { | func (ch *channel) Close() error { | ||||||
| @ -550,7 +550,7 @@ func (ch *channel) Close() error { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return ch.sendMessage(channelCloseMsg{ | 	return ch.sendMessage(channelCloseMsg{ | ||||||
| 		PeersId: ch.remoteId}) | 		PeersID: ch.remoteId}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Extended returns an io.ReadWriter that sends and receives data on the given,
 | // Extended returns an io.ReadWriter that sends and receives data on the given,
 | ||||||
| @ -577,7 +577,7 @@ func (ch *channel) SendRequest(name string, wantReply bool, payload []byte) (boo | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	msg := channelRequestMsg{ | 	msg := channelRequestMsg{ | ||||||
| 		PeersId:             ch.remoteId, | 		PeersID:             ch.remoteId, | ||||||
| 		Request:             name, | 		Request:             name, | ||||||
| 		WantReply:           wantReply, | 		WantReply:           wantReply, | ||||||
| 		RequestSpecificData: payload, | 		RequestSpecificData: payload, | ||||||
| @ -614,11 +614,11 @@ func (ch *channel) ackRequest(ok bool) error { | |||||||
| 	var msg interface{} | 	var msg interface{} | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		msg = channelRequestFailureMsg{ | 		msg = channelRequestFailureMsg{ | ||||||
| 			PeersId: ch.remoteId, | 			PeersID: ch.remoteId, | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		msg = channelRequestSuccessMsg{ | 		msg = channelRequestSuccessMsg{ | ||||||
| 			PeersId: ch.remoteId, | 			PeersID: ch.remoteId, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return ch.sendMessage(msg) | 	return ch.sendMessage(msg) | ||||||
|  | |||||||
							
								
								
									
										251
									
								
								vendor/golang.org/x/crypto/ssh/cipher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										251
									
								
								vendor/golang.org/x/crypto/ssh/cipher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -16,6 +16,10 @@ import ( | |||||||
| 	"hash" | 	"hash" | ||||||
| 	"io" | 	"io" | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
|  | 	"math/bits" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/crypto/internal/chacha20" | ||||||
|  | 	"golang.org/x/crypto/poly1305" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| @ -53,78 +57,78 @@ func newRC4(key, iv []byte) (cipher.Stream, error) { | |||||||
| 	return rc4.NewCipher(key) | 	return rc4.NewCipher(key) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type streamCipherMode struct { | type cipherMode struct { | ||||||
| 	keySize    int | 	keySize int | ||||||
| 	ivSize     int | 	ivSize  int | ||||||
| 	skip       int | 	create  func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) | ||||||
| 	createFunc func(key, iv []byte) (cipher.Stream, error) |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *streamCipherMode) createStream(key, iv []byte) (cipher.Stream, error) { | func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream, error)) func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | ||||||
| 	if len(key) < c.keySize { | 	return func(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | ||||||
| 		panic("ssh: key length too small for cipher") | 		stream, err := createFunc(key, iv) | ||||||
| 	} | 		if err != nil { | ||||||
| 	if len(iv) < c.ivSize { | 			return nil, err | ||||||
| 		panic("ssh: iv too small for cipher") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	stream, err := c.createFunc(key[:c.keySize], iv[:c.ivSize]) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var streamDump []byte |  | ||||||
| 	if c.skip > 0 { |  | ||||||
| 		streamDump = make([]byte, 512) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for remainingToDump := c.skip; remainingToDump > 0; { |  | ||||||
| 		dumpThisTime := remainingToDump |  | ||||||
| 		if dumpThisTime > len(streamDump) { |  | ||||||
| 			dumpThisTime = len(streamDump) |  | ||||||
| 		} | 		} | ||||||
| 		stream.XORKeyStream(streamDump[:dumpThisTime], streamDump[:dumpThisTime]) |  | ||||||
| 		remainingToDump -= dumpThisTime |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	return stream, nil | 		var streamDump []byte | ||||||
|  | 		if skip > 0 { | ||||||
|  | 			streamDump = make([]byte, 512) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for remainingToDump := skip; remainingToDump > 0; { | ||||||
|  | 			dumpThisTime := remainingToDump | ||||||
|  | 			if dumpThisTime > len(streamDump) { | ||||||
|  | 				dumpThisTime = len(streamDump) | ||||||
|  | 			} | ||||||
|  | 			stream.XORKeyStream(streamDump[:dumpThisTime], streamDump[:dumpThisTime]) | ||||||
|  | 			remainingToDump -= dumpThisTime | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		mac := macModes[algs.MAC].new(macKey) | ||||||
|  | 		return &streamPacketCipher{ | ||||||
|  | 			mac:       mac, | ||||||
|  | 			etm:       macModes[algs.MAC].etm, | ||||||
|  | 			macResult: make([]byte, mac.Size()), | ||||||
|  | 			cipher:    stream, | ||||||
|  | 		}, nil | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // cipherModes documents properties of supported ciphers. Ciphers not included
 | // cipherModes documents properties of supported ciphers. Ciphers not included
 | ||||||
| // are not supported and will not be negotiated, even if explicitly requested in
 | // are not supported and will not be negotiated, even if explicitly requested in
 | ||||||
| // ClientConfig.Crypto.Ciphers.
 | // ClientConfig.Crypto.Ciphers.
 | ||||||
| var cipherModes = map[string]*streamCipherMode{ | var cipherModes = map[string]*cipherMode{ | ||||||
| 	// Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms
 | 	// Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms
 | ||||||
| 	// are defined in the order specified in the RFC.
 | 	// are defined in the order specified in the RFC.
 | ||||||
| 	"aes128-ctr": {16, aes.BlockSize, 0, newAESCTR}, | 	"aes128-ctr": {16, aes.BlockSize, streamCipherMode(0, newAESCTR)}, | ||||||
| 	"aes192-ctr": {24, aes.BlockSize, 0, newAESCTR}, | 	"aes192-ctr": {24, aes.BlockSize, streamCipherMode(0, newAESCTR)}, | ||||||
| 	"aes256-ctr": {32, aes.BlockSize, 0, newAESCTR}, | 	"aes256-ctr": {32, aes.BlockSize, streamCipherMode(0, newAESCTR)}, | ||||||
| 
 | 
 | ||||||
| 	// Ciphers from RFC4345, which introduces security-improved arcfour ciphers.
 | 	// Ciphers from RFC4345, which introduces security-improved arcfour ciphers.
 | ||||||
| 	// They are defined in the order specified in the RFC.
 | 	// They are defined in the order specified in the RFC.
 | ||||||
| 	"arcfour128": {16, 0, 1536, newRC4}, | 	"arcfour128": {16, 0, streamCipherMode(1536, newRC4)}, | ||||||
| 	"arcfour256": {32, 0, 1536, newRC4}, | 	"arcfour256": {32, 0, streamCipherMode(1536, newRC4)}, | ||||||
| 
 | 
 | ||||||
| 	// Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol.
 | 	// Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol.
 | ||||||
| 	// Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and
 | 	// Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and
 | ||||||
| 	// RC4) has problems with weak keys, and should be used with caution."
 | 	// RC4) has problems with weak keys, and should be used with caution."
 | ||||||
| 	// RFC4345 introduces improved versions of Arcfour.
 | 	// RFC4345 introduces improved versions of Arcfour.
 | ||||||
| 	"arcfour": {16, 0, 0, newRC4}, | 	"arcfour": {16, 0, streamCipherMode(0, newRC4)}, | ||||||
| 
 | 
 | ||||||
| 	// AES-GCM is not a stream cipher, so it is constructed with a
 | 	// AEAD ciphers
 | ||||||
| 	// special case. If we add any more non-stream ciphers, we
 | 	gcmCipherID:        {16, 12, newGCMCipher}, | ||||||
| 	// should invest a cleaner way to do this.
 | 	chacha20Poly1305ID: {64, 0, newChaCha20Cipher}, | ||||||
| 	gcmCipherID: {16, 12, 0, nil}, |  | ||||||
| 
 | 
 | ||||||
| 	// CBC mode is insecure and so is not included in the default config.
 | 	// CBC mode is insecure and so is not included in the default config.
 | ||||||
| 	// (See http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf). If absolutely
 | 	// (See http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf). If absolutely
 | ||||||
| 	// needed, it's possible to specify a custom Config to enable it.
 | 	// needed, it's possible to specify a custom Config to enable it.
 | ||||||
| 	// You should expect that an active attacker can recover plaintext if
 | 	// You should expect that an active attacker can recover plaintext if
 | ||||||
| 	// you do.
 | 	// you do.
 | ||||||
| 	aes128cbcID: {16, aes.BlockSize, 0, nil}, | 	aes128cbcID: {16, aes.BlockSize, newAESCBCCipher}, | ||||||
| 
 | 
 | ||||||
| 	// 3des-cbc is insecure and is disabled by default.
 | 	// 3des-cbc is insecure and is not included in the default
 | ||||||
| 	tripledescbcID: {24, des.BlockSize, 0, nil}, | 	// config.
 | ||||||
|  | 	tripledescbcID: {24, des.BlockSize, newTripleDESCBCCipher}, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // prefixLen is the length of the packet prefix that contains the packet length
 | // prefixLen is the length of the packet prefix that contains the packet length
 | ||||||
| @ -304,7 +308,7 @@ type gcmCipher struct { | |||||||
| 	buf    []byte | 	buf    []byte | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func newGCMCipher(iv, key []byte) (packetCipher, error) { | func newGCMCipher(key, iv, unusedMacKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { | ||||||
| 	c, err := aes.NewCipher(key) | 	c, err := aes.NewCipher(key) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @ -372,7 +376,7 @@ func (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { | |||||||
| 	} | 	} | ||||||
| 	length := binary.BigEndian.Uint32(c.prefix[:]) | 	length := binary.BigEndian.Uint32(c.prefix[:]) | ||||||
| 	if length > maxPacket { | 	if length > maxPacket { | ||||||
| 		return nil, errors.New("ssh: max packet length exceeded.") | 		return nil, errors.New("ssh: max packet length exceeded") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if cap(c.buf) < int(length+gcmTagSize) { | 	if cap(c.buf) < int(length+gcmTagSize) { | ||||||
| @ -422,7 +426,7 @@ type cbcCipher struct { | |||||||
| 	oracleCamouflage uint32 | 	oracleCamouflage uint32 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func newCBCCipher(c cipher.Block, iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | func newCBCCipher(c cipher.Block, key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | ||||||
| 	cbc := &cbcCipher{ | 	cbc := &cbcCipher{ | ||||||
| 		mac:        macModes[algs.MAC].new(macKey), | 		mac:        macModes[algs.MAC].new(macKey), | ||||||
| 		decrypter:  cipher.NewCBCDecrypter(c, iv), | 		decrypter:  cipher.NewCBCDecrypter(c, iv), | ||||||
| @ -436,13 +440,13 @@ func newCBCCipher(c cipher.Block, iv, key, macKey []byte, algs directionAlgorith | |||||||
| 	return cbc, nil | 	return cbc, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | func newAESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | ||||||
| 	c, err := aes.NewCipher(key) | 	c, err := aes.NewCipher(key) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	cbc, err := newCBCCipher(c, iv, key, macKey, algs) | 	cbc, err := newCBCCipher(c, key, iv, macKey, algs) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @ -450,13 +454,13 @@ func newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCi | |||||||
| 	return cbc, nil | 	return cbc, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func newTripleDESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | func newTripleDESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | ||||||
| 	c, err := des.NewTripleDESCipher(key) | 	c, err := des.NewTripleDESCipher(key) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	cbc, err := newCBCCipher(c, iv, key, macKey, algs) | 	cbc, err := newCBCCipher(c, key, iv, macKey, algs) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @ -548,11 +552,11 @@ func (c *cbcCipher) readPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) | |||||||
| 		c.packetData = c.packetData[:entirePacketSize] | 		c.packetData = c.packetData[:entirePacketSize] | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if n, err := io.ReadFull(r, c.packetData[firstBlockLength:]); err != nil { | 	n, err := io.ReadFull(r, c.packetData[firstBlockLength:]) | ||||||
|  | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} else { |  | ||||||
| 		c.oracleCamouflage -= uint32(n) |  | ||||||
| 	} | 	} | ||||||
|  | 	c.oracleCamouflage -= uint32(n) | ||||||
| 
 | 
 | ||||||
| 	remainingCrypted := c.packetData[firstBlockLength:macStart] | 	remainingCrypted := c.packetData[firstBlockLength:macStart] | ||||||
| 	c.decrypter.CryptBlocks(remainingCrypted, remainingCrypted) | 	c.decrypter.CryptBlocks(remainingCrypted, remainingCrypted) | ||||||
| @ -627,3 +631,140 @@ func (c *cbcCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, pack | |||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | const chacha20Poly1305ID = "chacha20-poly1305@openssh.com" | ||||||
|  | 
 | ||||||
|  | // chacha20Poly1305Cipher implements the chacha20-poly1305@openssh.com
 | ||||||
|  | // AEAD, which is described here:
 | ||||||
|  | //
 | ||||||
|  | //   https://tools.ietf.org/html/draft-josefsson-ssh-chacha20-poly1305-openssh-00
 | ||||||
|  | //
 | ||||||
|  | // the methods here also implement padding, which RFC4253 Section 6
 | ||||||
|  | // also requires of stream ciphers.
 | ||||||
|  | type chacha20Poly1305Cipher struct { | ||||||
|  | 	lengthKey  [8]uint32 | ||||||
|  | 	contentKey [8]uint32 | ||||||
|  | 	buf        []byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newChaCha20Cipher(key, unusedIV, unusedMACKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { | ||||||
|  | 	if len(key) != 64 { | ||||||
|  | 		panic(len(key)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	c := &chacha20Poly1305Cipher{ | ||||||
|  | 		buf: make([]byte, 256), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for i := range c.contentKey { | ||||||
|  | 		c.contentKey[i] = binary.LittleEndian.Uint32(key[i*4 : (i+1)*4]) | ||||||
|  | 	} | ||||||
|  | 	for i := range c.lengthKey { | ||||||
|  | 		c.lengthKey[i] = binary.LittleEndian.Uint32(key[(i+8)*4 : (i+9)*4]) | ||||||
|  | 	} | ||||||
|  | 	return c, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { | ||||||
|  | 	nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} | ||||||
|  | 	s := chacha20.New(c.contentKey, nonce) | ||||||
|  | 	var polyKey [32]byte | ||||||
|  | 	s.XORKeyStream(polyKey[:], polyKey[:]) | ||||||
|  | 	s.Advance() // skip next 32 bytes
 | ||||||
|  | 
 | ||||||
|  | 	encryptedLength := c.buf[:4] | ||||||
|  | 	if _, err := io.ReadFull(r, encryptedLength); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var lenBytes [4]byte | ||||||
|  | 	chacha20.New(c.lengthKey, nonce).XORKeyStream(lenBytes[:], encryptedLength) | ||||||
|  | 
 | ||||||
|  | 	length := binary.BigEndian.Uint32(lenBytes[:]) | ||||||
|  | 	if length > maxPacket { | ||||||
|  | 		return nil, errors.New("ssh: invalid packet length, packet too large") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	contentEnd := 4 + length | ||||||
|  | 	packetEnd := contentEnd + poly1305.TagSize | ||||||
|  | 	if uint32(cap(c.buf)) < packetEnd { | ||||||
|  | 		c.buf = make([]byte, packetEnd) | ||||||
|  | 		copy(c.buf[:], encryptedLength) | ||||||
|  | 	} else { | ||||||
|  | 		c.buf = c.buf[:packetEnd] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if _, err := io.ReadFull(r, c.buf[4:packetEnd]); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var mac [poly1305.TagSize]byte | ||||||
|  | 	copy(mac[:], c.buf[contentEnd:packetEnd]) | ||||||
|  | 	if !poly1305.Verify(&mac, c.buf[:contentEnd], &polyKey) { | ||||||
|  | 		return nil, errors.New("ssh: MAC failure") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	plain := c.buf[4:contentEnd] | ||||||
|  | 	s.XORKeyStream(plain, plain) | ||||||
|  | 
 | ||||||
|  | 	padding := plain[0] | ||||||
|  | 	if padding < 4 { | ||||||
|  | 		// padding is a byte, so it automatically satisfies
 | ||||||
|  | 		// the maximum size, which is 255.
 | ||||||
|  | 		return nil, fmt.Errorf("ssh: illegal padding %d", padding) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if int(padding)+1 >= len(plain) { | ||||||
|  | 		return nil, fmt.Errorf("ssh: padding %d too large", padding) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	plain = plain[1 : len(plain)-int(padding)] | ||||||
|  | 
 | ||||||
|  | 	return plain, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *chacha20Poly1305Cipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, payload []byte) error { | ||||||
|  | 	nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} | ||||||
|  | 	s := chacha20.New(c.contentKey, nonce) | ||||||
|  | 	var polyKey [32]byte | ||||||
|  | 	s.XORKeyStream(polyKey[:], polyKey[:]) | ||||||
|  | 	s.Advance() // skip next 32 bytes
 | ||||||
|  | 
 | ||||||
|  | 	// There is no blocksize, so fall back to multiple of 8 byte
 | ||||||
|  | 	// padding, as described in RFC 4253, Sec 6.
 | ||||||
|  | 	const packetSizeMultiple = 8 | ||||||
|  | 
 | ||||||
|  | 	padding := packetSizeMultiple - (1+len(payload))%packetSizeMultiple | ||||||
|  | 	if padding < 4 { | ||||||
|  | 		padding += packetSizeMultiple | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// size (4 bytes), padding (1), payload, padding, tag.
 | ||||||
|  | 	totalLength := 4 + 1 + len(payload) + padding + poly1305.TagSize | ||||||
|  | 	if cap(c.buf) < totalLength { | ||||||
|  | 		c.buf = make([]byte, totalLength) | ||||||
|  | 	} else { | ||||||
|  | 		c.buf = c.buf[:totalLength] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	binary.BigEndian.PutUint32(c.buf, uint32(1+len(payload)+padding)) | ||||||
|  | 	chacha20.New(c.lengthKey, nonce).XORKeyStream(c.buf, c.buf[:4]) | ||||||
|  | 	c.buf[4] = byte(padding) | ||||||
|  | 	copy(c.buf[5:], payload) | ||||||
|  | 	packetEnd := 5 + len(payload) + padding | ||||||
|  | 	if _, err := io.ReadFull(rand, c.buf[5+len(payload):packetEnd]); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s.XORKeyStream(c.buf[4:], c.buf[4:packetEnd]) | ||||||
|  | 
 | ||||||
|  | 	var mac [poly1305.TagSize]byte | ||||||
|  | 	poly1305.Sum(&mac, c.buf[:packetEnd], &polyKey) | ||||||
|  | 
 | ||||||
|  | 	copy(c.buf[packetEnd:], mac[:]) | ||||||
|  | 
 | ||||||
|  | 	if _, err := w.Write(c.buf); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/crypto/ssh/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/crypto/ssh/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -9,6 +9,7 @@ import ( | |||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net" | 	"net" | ||||||
|  | 	"os" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
| @ -18,6 +19,8 @@ import ( | |||||||
| type Client struct { | type Client struct { | ||||||
| 	Conn | 	Conn | ||||||
| 
 | 
 | ||||||
|  | 	handleForwardsOnce sync.Once // guards calling (*Client).handleForwards
 | ||||||
|  | 
 | ||||||
| 	forwards        forwardList // forwarded tcpip connections from the remote side
 | 	forwards        forwardList // forwarded tcpip connections from the remote side
 | ||||||
| 	mu              sync.Mutex | 	mu              sync.Mutex | ||||||
| 	channelHandlers map[string]chan NewChannel | 	channelHandlers map[string]chan NewChannel | ||||||
| @ -59,8 +62,6 @@ func NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client { | |||||||
| 		conn.Wait() | 		conn.Wait() | ||||||
| 		conn.forwards.closeAll() | 		conn.forwards.closeAll() | ||||||
| 	}() | 	}() | ||||||
| 	go conn.forwards.handleChannels(conn.HandleChannelOpen("forwarded-tcpip")) |  | ||||||
| 	go conn.forwards.handleChannels(conn.HandleChannelOpen("forwarded-streamlocal@openssh.com")) |  | ||||||
| 	return conn | 	return conn | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -184,9 +185,13 @@ func Dial(network, addr string, config *ClientConfig) (*Client, error) { | |||||||
| // keys.  A HostKeyCallback must return nil if the host key is OK, or
 | // keys.  A HostKeyCallback must return nil if the host key is OK, or
 | ||||||
| // an error to reject it. It receives the hostname as passed to Dial
 | // an error to reject it. It receives the hostname as passed to Dial
 | ||||||
| // or NewClientConn. The remote address is the RemoteAddr of the
 | // or NewClientConn. The remote address is the RemoteAddr of the
 | ||||||
| // net.Conn underlying the the SSH connection.
 | // net.Conn underlying the SSH connection.
 | ||||||
| type HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error | type HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error | ||||||
| 
 | 
 | ||||||
|  | // BannerCallback is the function type used for treat the banner sent by
 | ||||||
|  | // the server. A BannerCallback receives the message sent by the remote server.
 | ||||||
|  | type BannerCallback func(message string) error | ||||||
|  | 
 | ||||||
| // A ClientConfig structure is used to configure a Client. It must not be
 | // A ClientConfig structure is used to configure a Client. It must not be
 | ||||||
| // modified after having been passed to an SSH function.
 | // modified after having been passed to an SSH function.
 | ||||||
| type ClientConfig struct { | type ClientConfig struct { | ||||||
| @ -209,6 +214,12 @@ type ClientConfig struct { | |||||||
| 	// FixedHostKey can be used for simplistic host key checks.
 | 	// FixedHostKey can be used for simplistic host key checks.
 | ||||||
| 	HostKeyCallback HostKeyCallback | 	HostKeyCallback HostKeyCallback | ||||||
| 
 | 
 | ||||||
|  | 	// BannerCallback is called during the SSH dance to display a custom
 | ||||||
|  | 	// server's message. The client configuration can supply this callback to
 | ||||||
|  | 	// handle it as wished. The function BannerDisplayStderr can be used for
 | ||||||
|  | 	// simplistic display on Stderr.
 | ||||||
|  | 	BannerCallback BannerCallback | ||||||
|  | 
 | ||||||
| 	// ClientVersion contains the version identification string that will
 | 	// ClientVersion contains the version identification string that will
 | ||||||
| 	// be used for the connection. If empty, a reasonable default is used.
 | 	// be used for the connection. If empty, a reasonable default is used.
 | ||||||
| 	ClientVersion string | 	ClientVersion string | ||||||
| @ -255,3 +266,13 @@ func FixedHostKey(key PublicKey) HostKeyCallback { | |||||||
| 	hk := &fixedHostKey{key} | 	hk := &fixedHostKey{key} | ||||||
| 	return hk.check | 	return hk.check | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // BannerDisplayStderr returns a function that can be used for
 | ||||||
|  | // ClientConfig.BannerCallback to display banners on os.Stderr.
 | ||||||
|  | func BannerDisplayStderr() BannerCallback { | ||||||
|  | 	return func(banner string) error { | ||||||
|  | 		_, err := os.Stderr.WriteString(banner) | ||||||
|  | 
 | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										121
									
								
								vendor/golang.org/x/crypto/ssh/client_auth.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										121
									
								
								vendor/golang.org/x/crypto/ssh/client_auth.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -11,6 +11,14 @@ import ( | |||||||
| 	"io" | 	"io" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | type authResult int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	authFailure authResult = iota | ||||||
|  | 	authPartialSuccess | ||||||
|  | 	authSuccess | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| // clientAuthenticate authenticates with the remote server. See RFC 4252.
 | // clientAuthenticate authenticates with the remote server. See RFC 4252.
 | ||||||
| func (c *connection) clientAuthenticate(config *ClientConfig) error { | func (c *connection) clientAuthenticate(config *ClientConfig) error { | ||||||
| 	// initiate user auth session
 | 	// initiate user auth session
 | ||||||
| @ -37,11 +45,12 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		if ok { | 		if ok == authSuccess { | ||||||
| 			// success
 | 			// success
 | ||||||
| 			return nil | 			return nil | ||||||
|  | 		} else if ok == authFailure { | ||||||
|  | 			tried[auth.method()] = true | ||||||
| 		} | 		} | ||||||
| 		tried[auth.method()] = true |  | ||||||
| 		if methods == nil { | 		if methods == nil { | ||||||
| 			methods = lastMethods | 			methods = lastMethods | ||||||
| 		} | 		} | ||||||
| @ -82,7 +91,7 @@ type AuthMethod interface { | |||||||
| 	// If authentication is not successful, a []string of alternative
 | 	// If authentication is not successful, a []string of alternative
 | ||||||
| 	// method names is returned. If the slice is nil, it will be ignored
 | 	// method names is returned. If the slice is nil, it will be ignored
 | ||||||
| 	// and the previous set of possible methods will be reused.
 | 	// and the previous set of possible methods will be reused.
 | ||||||
| 	auth(session []byte, user string, p packetConn, rand io.Reader) (bool, []string, error) | 	auth(session []byte, user string, p packetConn, rand io.Reader) (authResult, []string, error) | ||||||
| 
 | 
 | ||||||
| 	// method returns the RFC 4252 method name.
 | 	// method returns the RFC 4252 method name.
 | ||||||
| 	method() string | 	method() string | ||||||
| @ -91,13 +100,13 @@ type AuthMethod interface { | |||||||
| // "none" authentication, RFC 4252 section 5.2.
 | // "none" authentication, RFC 4252 section 5.2.
 | ||||||
| type noneAuth int | type noneAuth int | ||||||
| 
 | 
 | ||||||
| func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { | func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { | ||||||
| 	if err := c.writePacket(Marshal(&userAuthRequestMsg{ | 	if err := c.writePacket(Marshal(&userAuthRequestMsg{ | ||||||
| 		User:    user, | 		User:    user, | ||||||
| 		Service: serviceSSH, | 		Service: serviceSSH, | ||||||
| 		Method:  "none", | 		Method:  "none", | ||||||
| 	})); err != nil { | 	})); err != nil { | ||||||
| 		return false, nil, err | 		return authFailure, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return handleAuthResponse(c) | 	return handleAuthResponse(c) | ||||||
| @ -111,7 +120,7 @@ func (n *noneAuth) method() string { | |||||||
| // a function call, e.g. by prompting the user.
 | // a function call, e.g. by prompting the user.
 | ||||||
| type passwordCallback func() (password string, err error) | type passwordCallback func() (password string, err error) | ||||||
| 
 | 
 | ||||||
| func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { | func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { | ||||||
| 	type passwordAuthMsg struct { | 	type passwordAuthMsg struct { | ||||||
| 		User     string `sshtype:"50"` | 		User     string `sshtype:"50"` | ||||||
| 		Service  string | 		Service  string | ||||||
| @ -125,7 +134,7 @@ func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand | |||||||
| 	// The program may only find out that the user doesn't have a password
 | 	// The program may only find out that the user doesn't have a password
 | ||||||
| 	// when prompting.
 | 	// when prompting.
 | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, nil, err | 		return authFailure, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := c.writePacket(Marshal(&passwordAuthMsg{ | 	if err := c.writePacket(Marshal(&passwordAuthMsg{ | ||||||
| @ -135,7 +144,7 @@ func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand | |||||||
| 		Reply:    false, | 		Reply:    false, | ||||||
| 		Password: pw, | 		Password: pw, | ||||||
| 	})); err != nil { | 	})); err != nil { | ||||||
| 		return false, nil, err | 		return authFailure, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return handleAuthResponse(c) | 	return handleAuthResponse(c) | ||||||
| @ -178,7 +187,7 @@ func (cb publicKeyCallback) method() string { | |||||||
| 	return "publickey" | 	return "publickey" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { | func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { | ||||||
| 	// Authentication is performed by sending an enquiry to test if a key is
 | 	// Authentication is performed by sending an enquiry to test if a key is
 | ||||||
| 	// acceptable to the remote. If the key is acceptable, the client will
 | 	// acceptable to the remote. If the key is acceptable, the client will
 | ||||||
| 	// attempt to authenticate with the valid key.  If not the client will repeat
 | 	// attempt to authenticate with the valid key.  If not the client will repeat
 | ||||||
| @ -186,13 +195,13 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand | |||||||
| 
 | 
 | ||||||
| 	signers, err := cb() | 	signers, err := cb() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, nil, err | 		return authFailure, nil, err | ||||||
| 	} | 	} | ||||||
| 	var methods []string | 	var methods []string | ||||||
| 	for _, signer := range signers { | 	for _, signer := range signers { | ||||||
| 		ok, err := validateKey(signer.PublicKey(), user, c) | 		ok, err := validateKey(signer.PublicKey(), user, c) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return false, nil, err | 			return authFailure, nil, err | ||||||
| 		} | 		} | ||||||
| 		if !ok { | 		if !ok { | ||||||
| 			continue | 			continue | ||||||
| @ -206,7 +215,7 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand | |||||||
| 			Method:  cb.method(), | 			Method:  cb.method(), | ||||||
| 		}, []byte(pub.Type()), pubKey)) | 		}, []byte(pub.Type()), pubKey)) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return false, nil, err | 			return authFailure, nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// manually wrap the serialized signature in a string
 | 		// manually wrap the serialized signature in a string
 | ||||||
| @ -224,24 +233,24 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand | |||||||
| 		} | 		} | ||||||
| 		p := Marshal(&msg) | 		p := Marshal(&msg) | ||||||
| 		if err := c.writePacket(p); err != nil { | 		if err := c.writePacket(p); err != nil { | ||||||
| 			return false, nil, err | 			return authFailure, nil, err | ||||||
| 		} | 		} | ||||||
| 		var success bool | 		var success authResult | ||||||
| 		success, methods, err = handleAuthResponse(c) | 		success, methods, err = handleAuthResponse(c) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return false, nil, err | 			return authFailure, nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// If authentication succeeds or the list of available methods does not
 | 		// If authentication succeeds or the list of available methods does not
 | ||||||
| 		// contain the "publickey" method, do not attempt to authenticate with any
 | 		// contain the "publickey" method, do not attempt to authenticate with any
 | ||||||
| 		// other keys.  According to RFC 4252 Section 7, the latter can occur when
 | 		// other keys.  According to RFC 4252 Section 7, the latter can occur when
 | ||||||
| 		// additional authentication methods are required.
 | 		// additional authentication methods are required.
 | ||||||
| 		if success || !containsMethod(methods, cb.method()) { | 		if success == authSuccess || !containsMethod(methods, cb.method()) { | ||||||
| 			return success, methods, err | 			return success, methods, err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return false, methods, nil | 	return authFailure, methods, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func containsMethod(methods []string, method string) bool { | func containsMethod(methods []string, method string) bool { | ||||||
| @ -283,7 +292,9 @@ func confirmKeyAck(key PublicKey, c packetConn) (bool, error) { | |||||||
| 		} | 		} | ||||||
| 		switch packet[0] { | 		switch packet[0] { | ||||||
| 		case msgUserAuthBanner: | 		case msgUserAuthBanner: | ||||||
| 			// TODO(gpaul): add callback to present the banner to the user
 | 			if err := handleBannerResponse(c, packet); err != nil { | ||||||
|  | 				return false, err | ||||||
|  | 			} | ||||||
| 		case msgUserAuthPubKeyOk: | 		case msgUserAuthPubKeyOk: | ||||||
| 			var msg userAuthPubKeyOkMsg | 			var msg userAuthPubKeyOkMsg | ||||||
| 			if err := Unmarshal(packet, &msg); err != nil { | 			if err := Unmarshal(packet, &msg); err != nil { | ||||||
| @ -316,30 +327,53 @@ func PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMet | |||||||
| // handleAuthResponse returns whether the preceding authentication request succeeded
 | // handleAuthResponse returns whether the preceding authentication request succeeded
 | ||||||
| // along with a list of remaining authentication methods to try next and
 | // along with a list of remaining authentication methods to try next and
 | ||||||
| // an error if an unexpected response was received.
 | // an error if an unexpected response was received.
 | ||||||
| func handleAuthResponse(c packetConn) (bool, []string, error) { | func handleAuthResponse(c packetConn) (authResult, []string, error) { | ||||||
| 	for { | 	for { | ||||||
| 		packet, err := c.readPacket() | 		packet, err := c.readPacket() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return false, nil, err | 			return authFailure, nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		switch packet[0] { | 		switch packet[0] { | ||||||
| 		case msgUserAuthBanner: | 		case msgUserAuthBanner: | ||||||
| 			// TODO: add callback to present the banner to the user
 | 			if err := handleBannerResponse(c, packet); err != nil { | ||||||
|  | 				return authFailure, nil, err | ||||||
|  | 			} | ||||||
| 		case msgUserAuthFailure: | 		case msgUserAuthFailure: | ||||||
| 			var msg userAuthFailureMsg | 			var msg userAuthFailureMsg | ||||||
| 			if err := Unmarshal(packet, &msg); err != nil { | 			if err := Unmarshal(packet, &msg); err != nil { | ||||||
| 				return false, nil, err | 				return authFailure, nil, err | ||||||
| 			} | 			} | ||||||
| 			return false, msg.Methods, nil | 			if msg.PartialSuccess { | ||||||
|  | 				return authPartialSuccess, msg.Methods, nil | ||||||
|  | 			} | ||||||
|  | 			return authFailure, msg.Methods, nil | ||||||
| 		case msgUserAuthSuccess: | 		case msgUserAuthSuccess: | ||||||
| 			return true, nil, nil | 			return authSuccess, nil, nil | ||||||
| 		default: | 		default: | ||||||
| 			return false, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0]) | 			return authFailure, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0]) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func handleBannerResponse(c packetConn, packet []byte) error { | ||||||
|  | 	var msg userAuthBannerMsg | ||||||
|  | 	if err := Unmarshal(packet, &msg); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	transport, ok := c.(*handshakeTransport) | ||||||
|  | 	if !ok { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if transport.bannerCallback != nil { | ||||||
|  | 		return transport.bannerCallback(msg.Message) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // KeyboardInteractiveChallenge should print questions, optionally
 | // KeyboardInteractiveChallenge should print questions, optionally
 | ||||||
| // disabling echoing (e.g. for passwords), and return all the answers.
 | // disabling echoing (e.g. for passwords), and return all the answers.
 | ||||||
| // Challenge may be called multiple times in a single session. After
 | // Challenge may be called multiple times in a single session. After
 | ||||||
| @ -359,7 +393,7 @@ func (cb KeyboardInteractiveChallenge) method() string { | |||||||
| 	return "keyboard-interactive" | 	return "keyboard-interactive" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) { | func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { | ||||||
| 	type initiateMsg struct { | 	type initiateMsg struct { | ||||||
| 		User       string `sshtype:"50"` | 		User       string `sshtype:"50"` | ||||||
| 		Service    string | 		Service    string | ||||||
| @ -373,37 +407,42 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe | |||||||
| 		Service: serviceSSH, | 		Service: serviceSSH, | ||||||
| 		Method:  "keyboard-interactive", | 		Method:  "keyboard-interactive", | ||||||
| 	})); err != nil { | 	})); err != nil { | ||||||
| 		return false, nil, err | 		return authFailure, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for { | 	for { | ||||||
| 		packet, err := c.readPacket() | 		packet, err := c.readPacket() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return false, nil, err | 			return authFailure, nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// like handleAuthResponse, but with less options.
 | 		// like handleAuthResponse, but with less options.
 | ||||||
| 		switch packet[0] { | 		switch packet[0] { | ||||||
| 		case msgUserAuthBanner: | 		case msgUserAuthBanner: | ||||||
| 			// TODO: Print banners during userauth.
 | 			if err := handleBannerResponse(c, packet); err != nil { | ||||||
|  | 				return authFailure, nil, err | ||||||
|  | 			} | ||||||
| 			continue | 			continue | ||||||
| 		case msgUserAuthInfoRequest: | 		case msgUserAuthInfoRequest: | ||||||
| 			// OK
 | 			// OK
 | ||||||
| 		case msgUserAuthFailure: | 		case msgUserAuthFailure: | ||||||
| 			var msg userAuthFailureMsg | 			var msg userAuthFailureMsg | ||||||
| 			if err := Unmarshal(packet, &msg); err != nil { | 			if err := Unmarshal(packet, &msg); err != nil { | ||||||
| 				return false, nil, err | 				return authFailure, nil, err | ||||||
| 			} | 			} | ||||||
| 			return false, msg.Methods, nil | 			if msg.PartialSuccess { | ||||||
|  | 				return authPartialSuccess, msg.Methods, nil | ||||||
|  | 			} | ||||||
|  | 			return authFailure, msg.Methods, nil | ||||||
| 		case msgUserAuthSuccess: | 		case msgUserAuthSuccess: | ||||||
| 			return true, nil, nil | 			return authSuccess, nil, nil | ||||||
| 		default: | 		default: | ||||||
| 			return false, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) | 			return authFailure, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		var msg userAuthInfoRequestMsg | 		var msg userAuthInfoRequestMsg | ||||||
| 		if err := Unmarshal(packet, &msg); err != nil { | 		if err := Unmarshal(packet, &msg); err != nil { | ||||||
| 			return false, nil, err | 			return authFailure, nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// Manually unpack the prompt/echo pairs.
 | 		// Manually unpack the prompt/echo pairs.
 | ||||||
| @ -413,7 +452,7 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe | |||||||
| 		for i := 0; i < int(msg.NumPrompts); i++ { | 		for i := 0; i < int(msg.NumPrompts); i++ { | ||||||
| 			prompt, r, ok := parseString(rest) | 			prompt, r, ok := parseString(rest) | ||||||
| 			if !ok || len(r) == 0 { | 			if !ok || len(r) == 0 { | ||||||
| 				return false, nil, errors.New("ssh: prompt format error") | 				return authFailure, nil, errors.New("ssh: prompt format error") | ||||||
| 			} | 			} | ||||||
| 			prompts = append(prompts, string(prompt)) | 			prompts = append(prompts, string(prompt)) | ||||||
| 			echos = append(echos, r[0] != 0) | 			echos = append(echos, r[0] != 0) | ||||||
| @ -421,16 +460,16 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if len(rest) != 0 { | 		if len(rest) != 0 { | ||||||
| 			return false, nil, errors.New("ssh: extra data following keyboard-interactive pairs") | 			return authFailure, nil, errors.New("ssh: extra data following keyboard-interactive pairs") | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		answers, err := cb(msg.User, msg.Instruction, prompts, echos) | 		answers, err := cb(msg.User, msg.Instruction, prompts, echos) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return false, nil, err | 			return authFailure, nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if len(answers) != len(prompts) { | 		if len(answers) != len(prompts) { | ||||||
| 			return false, nil, errors.New("ssh: not enough answers from keyboard-interactive callback") | 			return authFailure, nil, errors.New("ssh: not enough answers from keyboard-interactive callback") | ||||||
| 		} | 		} | ||||||
| 		responseLength := 1 + 4 | 		responseLength := 1 + 4 | ||||||
| 		for _, a := range answers { | 		for _, a := range answers { | ||||||
| @ -446,7 +485,7 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if err := c.writePacket(serialized); err != nil { | 		if err := c.writePacket(serialized); err != nil { | ||||||
| 			return false, nil, err | 			return authFailure, nil, err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @ -456,10 +495,10 @@ type retryableAuthMethod struct { | |||||||
| 	maxTries   int | 	maxTries   int | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok bool, methods []string, err error) { | func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok authResult, methods []string, err error) { | ||||||
| 	for i := 0; r.maxTries <= 0 || i < r.maxTries; i++ { | 	for i := 0; r.maxTries <= 0 || i < r.maxTries; i++ { | ||||||
| 		ok, methods, err = r.authMethod.auth(session, user, c, rand) | 		ok, methods, err = r.authMethod.auth(session, user, c, rand) | ||||||
| 		if ok || err != nil { // either success or error terminate
 | 		if ok != authFailure || err != nil { // either success, partial success or error terminate
 | ||||||
| 			return ok, methods, err | 			return ok, methods, err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
							
								
								
									
										20
									
								
								vendor/golang.org/x/crypto/ssh/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/golang.org/x/crypto/ssh/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -24,11 +24,21 @@ const ( | |||||||
| 	serviceSSH      = "ssh-connection" | 	serviceSSH      = "ssh-connection" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // supportedCiphers specifies the supported ciphers in preference order.
 | // supportedCiphers lists ciphers we support but might not recommend.
 | ||||||
| var supportedCiphers = []string{ | var supportedCiphers = []string{ | ||||||
| 	"aes128-ctr", "aes192-ctr", "aes256-ctr", | 	"aes128-ctr", "aes192-ctr", "aes256-ctr", | ||||||
| 	"aes128-gcm@openssh.com", | 	"aes128-gcm@openssh.com", | ||||||
| 	"arcfour256", "arcfour128", | 	chacha20Poly1305ID, | ||||||
|  | 	"arcfour256", "arcfour128", "arcfour", | ||||||
|  | 	aes128cbcID, | ||||||
|  | 	tripledescbcID, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // preferredCiphers specifies the default preference for ciphers.
 | ||||||
|  | var preferredCiphers = []string{ | ||||||
|  | 	"aes128-gcm@openssh.com", | ||||||
|  | 	chacha20Poly1305ID, | ||||||
|  | 	"aes128-ctr", "aes192-ctr", "aes256-ctr", | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // supportedKexAlgos specifies the supported key-exchange algorithms in
 | // supportedKexAlgos specifies the supported key-exchange algorithms in
 | ||||||
| @ -211,7 +221,7 @@ func (c *Config) SetDefaults() { | |||||||
| 		c.Rand = rand.Reader | 		c.Rand = rand.Reader | ||||||
| 	} | 	} | ||||||
| 	if c.Ciphers == nil { | 	if c.Ciphers == nil { | ||||||
| 		c.Ciphers = supportedCiphers | 		c.Ciphers = preferredCiphers | ||||||
| 	} | 	} | ||||||
| 	var ciphers []string | 	var ciphers []string | ||||||
| 	for _, c := range c.Ciphers { | 	for _, c := range c.Ciphers { | ||||||
| @ -242,7 +252,7 @@ func (c *Config) SetDefaults() { | |||||||
| 
 | 
 | ||||||
| // buildDataSignedForAuth returns the data that is signed in order to prove
 | // buildDataSignedForAuth returns the data that is signed in order to prove
 | ||||||
| // possession of a private key. See RFC 4252, section 7.
 | // possession of a private key. See RFC 4252, section 7.
 | ||||||
| func buildDataSignedForAuth(sessionId []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte { | func buildDataSignedForAuth(sessionID []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte { | ||||||
| 	data := struct { | 	data := struct { | ||||||
| 		Session []byte | 		Session []byte | ||||||
| 		Type    byte | 		Type    byte | ||||||
| @ -253,7 +263,7 @@ func buildDataSignedForAuth(sessionId []byte, req userAuthRequestMsg, algo, pubK | |||||||
| 		Algo    []byte | 		Algo    []byte | ||||||
| 		PubKey  []byte | 		PubKey  []byte | ||||||
| 	}{ | 	}{ | ||||||
| 		sessionId, | 		sessionID, | ||||||
| 		msgUserAuthRequest, | 		msgUserAuthRequest, | ||||||
| 		req.User, | 		req.User, | ||||||
| 		req.Service, | 		req.Service, | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								vendor/golang.org/x/crypto/ssh/handshake.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/golang.org/x/crypto/ssh/handshake.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -78,6 +78,11 @@ type handshakeTransport struct { | |||||||
| 	dialAddress     string | 	dialAddress     string | ||||||
| 	remoteAddr      net.Addr | 	remoteAddr      net.Addr | ||||||
| 
 | 
 | ||||||
|  | 	// bannerCallback is non-empty if we are the client and it has been set in
 | ||||||
|  | 	// ClientConfig. In that case it is called during the user authentication
 | ||||||
|  | 	// dance to handle a custom server's message.
 | ||||||
|  | 	bannerCallback BannerCallback | ||||||
|  | 
 | ||||||
| 	// Algorithms agreed in the last key exchange.
 | 	// Algorithms agreed in the last key exchange.
 | ||||||
| 	algorithms *algorithms | 	algorithms *algorithms | ||||||
| 
 | 
 | ||||||
| @ -120,6 +125,7 @@ func newClientTransport(conn keyingTransport, clientVersion, serverVersion []byt | |||||||
| 	t.dialAddress = dialAddr | 	t.dialAddress = dialAddr | ||||||
| 	t.remoteAddr = addr | 	t.remoteAddr = addr | ||||||
| 	t.hostKeyCallback = config.HostKeyCallback | 	t.hostKeyCallback = config.HostKeyCallback | ||||||
|  | 	t.bannerCallback = config.BannerCallback | ||||||
| 	if config.HostKeyAlgorithms != nil { | 	if config.HostKeyAlgorithms != nil { | ||||||
| 		t.hostKeyAlgorithms = config.HostKeyAlgorithms | 		t.hostKeyAlgorithms = config.HostKeyAlgorithms | ||||||
| 	} else { | 	} else { | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								vendor/golang.org/x/crypto/ssh/kex.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/golang.org/x/crypto/ssh/kex.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -119,7 +119,7 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	kInt, err := group.diffieHellman(kexDHReply.Y, x) | 	ki, err := group.diffieHellman(kexDHReply.Y, x) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @ -129,8 +129,8 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha | |||||||
| 	writeString(h, kexDHReply.HostKey) | 	writeString(h, kexDHReply.HostKey) | ||||||
| 	writeInt(h, X) | 	writeInt(h, X) | ||||||
| 	writeInt(h, kexDHReply.Y) | 	writeInt(h, kexDHReply.Y) | ||||||
| 	K := make([]byte, intLength(kInt)) | 	K := make([]byte, intLength(ki)) | ||||||
| 	marshalInt(K, kInt) | 	marshalInt(K, ki) | ||||||
| 	h.Write(K) | 	h.Write(K) | ||||||
| 
 | 
 | ||||||
| 	return &kexResult{ | 	return &kexResult{ | ||||||
| @ -164,7 +164,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	Y := new(big.Int).Exp(group.g, y, group.p) | 	Y := new(big.Int).Exp(group.g, y, group.p) | ||||||
| 	kInt, err := group.diffieHellman(kexDHInit.X, y) | 	ki, err := group.diffieHellman(kexDHInit.X, y) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @ -177,8 +177,8 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha | |||||||
| 	writeInt(h, kexDHInit.X) | 	writeInt(h, kexDHInit.X) | ||||||
| 	writeInt(h, Y) | 	writeInt(h, Y) | ||||||
| 
 | 
 | ||||||
| 	K := make([]byte, intLength(kInt)) | 	K := make([]byte, intLength(ki)) | ||||||
| 	marshalInt(K, kInt) | 	marshalInt(K, ki) | ||||||
| 	h.Write(K) | 	h.Write(K) | ||||||
| 
 | 
 | ||||||
| 	H := h.Sum(nil) | 	H := h.Sum(nil) | ||||||
| @ -462,9 +462,9 @@ func (kex *curve25519sha256) Client(c packetConn, rand io.Reader, magics *handsh | |||||||
| 	writeString(h, kp.pub[:]) | 	writeString(h, kp.pub[:]) | ||||||
| 	writeString(h, reply.EphemeralPubKey) | 	writeString(h, reply.EphemeralPubKey) | ||||||
| 
 | 
 | ||||||
| 	kInt := new(big.Int).SetBytes(secret[:]) | 	ki := new(big.Int).SetBytes(secret[:]) | ||||||
| 	K := make([]byte, intLength(kInt)) | 	K := make([]byte, intLength(ki)) | ||||||
| 	marshalInt(K, kInt) | 	marshalInt(K, ki) | ||||||
| 	h.Write(K) | 	h.Write(K) | ||||||
| 
 | 
 | ||||||
| 	return &kexResult{ | 	return &kexResult{ | ||||||
| @ -510,9 +510,9 @@ func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handsh | |||||||
| 	writeString(h, kexInit.ClientPubKey) | 	writeString(h, kexInit.ClientPubKey) | ||||||
| 	writeString(h, kp.pub[:]) | 	writeString(h, kp.pub[:]) | ||||||
| 
 | 
 | ||||||
| 	kInt := new(big.Int).SetBytes(secret[:]) | 	ki := new(big.Int).SetBytes(secret[:]) | ||||||
| 	K := make([]byte, intLength(kInt)) | 	K := make([]byte, intLength(ki)) | ||||||
| 	marshalInt(K, kInt) | 	marshalInt(K, ki) | ||||||
| 	h.Write(K) | 	h.Write(K) | ||||||
| 
 | 
 | ||||||
| 	H := h.Sum(nil) | 	H := h.Sum(nil) | ||||||
|  | |||||||
							
								
								
									
										145
									
								
								vendor/golang.org/x/crypto/ssh/keys.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										145
									
								
								vendor/golang.org/x/crypto/ssh/keys.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -38,6 +38,16 @@ const ( | |||||||
| 	KeyAlgoED25519  = "ssh-ed25519" | 	KeyAlgoED25519  = "ssh-ed25519" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | // These constants represent non-default signature algorithms that are supported
 | ||||||
|  | // as algorithm parameters to AlgorithmSigner.SignWithAlgorithm methods. See
 | ||||||
|  | // [PROTOCOL.agent] section 4.5.1 and
 | ||||||
|  | // https://tools.ietf.org/html/draft-ietf-curdle-rsa-sha2-10
 | ||||||
|  | const ( | ||||||
|  | 	SigAlgoRSA        = "ssh-rsa" | ||||||
|  | 	SigAlgoRSASHA2256 = "rsa-sha2-256" | ||||||
|  | 	SigAlgoRSASHA2512 = "rsa-sha2-512" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| // parsePubKey parses a public key of the given algorithm.
 | // parsePubKey parses a public key of the given algorithm.
 | ||||||
| // Use ParsePublicKey for keys with prepended algorithm.
 | // Use ParsePublicKey for keys with prepended algorithm.
 | ||||||
| func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) { | func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) { | ||||||
| @ -276,7 +286,8 @@ type PublicKey interface { | |||||||
| 	Type() string | 	Type() string | ||||||
| 
 | 
 | ||||||
| 	// Marshal returns the serialized key data in SSH wire format,
 | 	// Marshal returns the serialized key data in SSH wire format,
 | ||||||
| 	// with the name prefix.
 | 	// with the name prefix. To unmarshal the returned data, use
 | ||||||
|  | 	// the ParsePublicKey function.
 | ||||||
| 	Marshal() []byte | 	Marshal() []byte | ||||||
| 
 | 
 | ||||||
| 	// Verify that sig is a signature on the given data using this
 | 	// Verify that sig is a signature on the given data using this
 | ||||||
| @ -300,6 +311,19 @@ type Signer interface { | |||||||
| 	Sign(rand io.Reader, data []byte) (*Signature, error) | 	Sign(rand io.Reader, data []byte) (*Signature, error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // A AlgorithmSigner is a Signer that also supports specifying a specific
 | ||||||
|  | // algorithm to use for signing.
 | ||||||
|  | type AlgorithmSigner interface { | ||||||
|  | 	Signer | ||||||
|  | 
 | ||||||
|  | 	// SignWithAlgorithm is like Signer.Sign, but allows specification of a
 | ||||||
|  | 	// non-default signing algorithm. See the SigAlgo* constants in this
 | ||||||
|  | 	// package for signature algorithms supported by this package. Callers may
 | ||||||
|  | 	// pass an empty string for the algorithm in which case the AlgorithmSigner
 | ||||||
|  | 	// will use its default algorithm.
 | ||||||
|  | 	SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type rsaPublicKey rsa.PublicKey | type rsaPublicKey rsa.PublicKey | ||||||
| 
 | 
 | ||||||
| func (r *rsaPublicKey) Type() string { | func (r *rsaPublicKey) Type() string { | ||||||
| @ -348,13 +372,21 @@ func (r *rsaPublicKey) Marshal() []byte { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { | func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { | ||||||
| 	if sig.Format != r.Type() { | 	var hash crypto.Hash | ||||||
|  | 	switch sig.Format { | ||||||
|  | 	case SigAlgoRSA: | ||||||
|  | 		hash = crypto.SHA1 | ||||||
|  | 	case SigAlgoRSASHA2256: | ||||||
|  | 		hash = crypto.SHA256 | ||||||
|  | 	case SigAlgoRSASHA2512: | ||||||
|  | 		hash = crypto.SHA512 | ||||||
|  | 	default: | ||||||
| 		return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type()) | 		return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type()) | ||||||
| 	} | 	} | ||||||
| 	h := crypto.SHA1.New() | 	h := hash.New() | ||||||
| 	h.Write(data) | 	h.Write(data) | ||||||
| 	digest := h.Sum(nil) | 	digest := h.Sum(nil) | ||||||
| 	return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), crypto.SHA1, digest, sig.Blob) | 	return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), hash, digest, sig.Blob) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { | func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { | ||||||
| @ -363,7 +395,7 @@ func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { | |||||||
| 
 | 
 | ||||||
| type dsaPublicKey dsa.PublicKey | type dsaPublicKey dsa.PublicKey | ||||||
| 
 | 
 | ||||||
| func (r *dsaPublicKey) Type() string { | func (k *dsaPublicKey) Type() string { | ||||||
| 	return "ssh-dss" | 	return "ssh-dss" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -458,6 +490,14 @@ func (k *dsaPrivateKey) PublicKey() PublicKey { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { | func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { | ||||||
|  | 	return k.SignWithAlgorithm(rand, data, "") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (k *dsaPrivateKey) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { | ||||||
|  | 	if algorithm != "" && algorithm != k.PublicKey().Type() { | ||||||
|  | 		return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	h := crypto.SHA1.New() | 	h := crypto.SHA1.New() | ||||||
| 	h.Write(data) | 	h.Write(data) | ||||||
| 	digest := h.Sum(nil) | 	digest := h.Sum(nil) | ||||||
| @ -481,12 +521,12 @@ func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { | |||||||
| 
 | 
 | ||||||
| type ecdsaPublicKey ecdsa.PublicKey | type ecdsaPublicKey ecdsa.PublicKey | ||||||
| 
 | 
 | ||||||
| func (key *ecdsaPublicKey) Type() string { | func (k *ecdsaPublicKey) Type() string { | ||||||
| 	return "ecdsa-sha2-" + key.nistID() | 	return "ecdsa-sha2-" + k.nistID() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (key *ecdsaPublicKey) nistID() string { | func (k *ecdsaPublicKey) nistID() string { | ||||||
| 	switch key.Params().BitSize { | 	switch k.Params().BitSize { | ||||||
| 	case 256: | 	case 256: | ||||||
| 		return "nistp256" | 		return "nistp256" | ||||||
| 	case 384: | 	case 384: | ||||||
| @ -499,7 +539,7 @@ func (key *ecdsaPublicKey) nistID() string { | |||||||
| 
 | 
 | ||||||
| type ed25519PublicKey ed25519.PublicKey | type ed25519PublicKey ed25519.PublicKey | ||||||
| 
 | 
 | ||||||
| func (key ed25519PublicKey) Type() string { | func (k ed25519PublicKey) Type() string { | ||||||
| 	return KeyAlgoED25519 | 	return KeyAlgoED25519 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -518,23 +558,23 @@ func parseED25519(in []byte) (out PublicKey, rest []byte, err error) { | |||||||
| 	return (ed25519PublicKey)(key), w.Rest, nil | 	return (ed25519PublicKey)(key), w.Rest, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (key ed25519PublicKey) Marshal() []byte { | func (k ed25519PublicKey) Marshal() []byte { | ||||||
| 	w := struct { | 	w := struct { | ||||||
| 		Name     string | 		Name     string | ||||||
| 		KeyBytes []byte | 		KeyBytes []byte | ||||||
| 	}{ | 	}{ | ||||||
| 		KeyAlgoED25519, | 		KeyAlgoED25519, | ||||||
| 		[]byte(key), | 		[]byte(k), | ||||||
| 	} | 	} | ||||||
| 	return Marshal(&w) | 	return Marshal(&w) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (key ed25519PublicKey) Verify(b []byte, sig *Signature) error { | func (k ed25519PublicKey) Verify(b []byte, sig *Signature) error { | ||||||
| 	if sig.Format != key.Type() { | 	if sig.Format != k.Type() { | ||||||
| 		return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, key.Type()) | 		return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	edKey := (ed25519.PublicKey)(key) | 	edKey := (ed25519.PublicKey)(k) | ||||||
| 	if ok := ed25519.Verify(edKey, b, sig.Blob); !ok { | 	if ok := ed25519.Verify(edKey, b, sig.Blob); !ok { | ||||||
| 		return errors.New("ssh: signature did not verify") | 		return errors.New("ssh: signature did not verify") | ||||||
| 	} | 	} | ||||||
| @ -595,9 +635,9 @@ func parseECDSA(in []byte) (out PublicKey, rest []byte, err error) { | |||||||
| 	return (*ecdsaPublicKey)(key), w.Rest, nil | 	return (*ecdsaPublicKey)(key), w.Rest, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (key *ecdsaPublicKey) Marshal() []byte { | func (k *ecdsaPublicKey) Marshal() []byte { | ||||||
| 	// See RFC 5656, section 3.1.
 | 	// See RFC 5656, section 3.1.
 | ||||||
| 	keyBytes := elliptic.Marshal(key.Curve, key.X, key.Y) | 	keyBytes := elliptic.Marshal(k.Curve, k.X, k.Y) | ||||||
| 	// ECDSA publickey struct layout should match the struct used by
 | 	// ECDSA publickey struct layout should match the struct used by
 | ||||||
| 	// parseECDSACert in the x/crypto/ssh/agent package.
 | 	// parseECDSACert in the x/crypto/ssh/agent package.
 | ||||||
| 	w := struct { | 	w := struct { | ||||||
| @ -605,20 +645,20 @@ func (key *ecdsaPublicKey) Marshal() []byte { | |||||||
| 		ID   string | 		ID   string | ||||||
| 		Key  []byte | 		Key  []byte | ||||||
| 	}{ | 	}{ | ||||||
| 		key.Type(), | 		k.Type(), | ||||||
| 		key.nistID(), | 		k.nistID(), | ||||||
| 		keyBytes, | 		keyBytes, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return Marshal(&w) | 	return Marshal(&w) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { | func (k *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { | ||||||
| 	if sig.Format != key.Type() { | 	if sig.Format != k.Type() { | ||||||
| 		return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, key.Type()) | 		return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	h := ecHash(key.Curve).New() | 	h := ecHash(k.Curve).New() | ||||||
| 	h.Write(data) | 	h.Write(data) | ||||||
| 	digest := h.Sum(nil) | 	digest := h.Sum(nil) | ||||||
| 
 | 
 | ||||||
| @ -635,7 +675,7 @@ func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if ecdsa.Verify((*ecdsa.PublicKey)(key), digest, ecSig.R, ecSig.S) { | 	if ecdsa.Verify((*ecdsa.PublicKey)(k), digest, ecSig.R, ecSig.S) { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 	return errors.New("ssh: signature did not verify") | 	return errors.New("ssh: signature did not verify") | ||||||
| @ -690,16 +730,42 @@ func (s *wrappedSigner) PublicKey() PublicKey { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { | func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { | ||||||
|  | 	return s.SignWithAlgorithm(rand, data, "") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *wrappedSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { | ||||||
| 	var hashFunc crypto.Hash | 	var hashFunc crypto.Hash | ||||||
| 
 | 
 | ||||||
| 	switch key := s.pubKey.(type) { | 	if _, ok := s.pubKey.(*rsaPublicKey); ok { | ||||||
| 	case *rsaPublicKey, *dsaPublicKey: | 		// RSA keys support a few hash functions determined by the requested signature algorithm
 | ||||||
| 		hashFunc = crypto.SHA1 | 		switch algorithm { | ||||||
| 	case *ecdsaPublicKey: | 		case "", SigAlgoRSA: | ||||||
| 		hashFunc = ecHash(key.Curve) | 			algorithm = SigAlgoRSA | ||||||
| 	case ed25519PublicKey: | 			hashFunc = crypto.SHA1 | ||||||
| 	default: | 		case SigAlgoRSASHA2256: | ||||||
| 		return nil, fmt.Errorf("ssh: unsupported key type %T", key) | 			hashFunc = crypto.SHA256 | ||||||
|  | 		case SigAlgoRSASHA2512: | ||||||
|  | 			hashFunc = crypto.SHA512 | ||||||
|  | 		default: | ||||||
|  | 			return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		// The only supported algorithm for all other key types is the same as the type of the key
 | ||||||
|  | 		if algorithm == "" { | ||||||
|  | 			algorithm = s.pubKey.Type() | ||||||
|  | 		} else if algorithm != s.pubKey.Type() { | ||||||
|  | 			return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		switch key := s.pubKey.(type) { | ||||||
|  | 		case *dsaPublicKey: | ||||||
|  | 			hashFunc = crypto.SHA1 | ||||||
|  | 		case *ecdsaPublicKey: | ||||||
|  | 			hashFunc = ecHash(key.Curve) | ||||||
|  | 		case ed25519PublicKey: | ||||||
|  | 		default: | ||||||
|  | 			return nil, fmt.Errorf("ssh: unsupported key type %T", key) | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var digest []byte | 	var digest []byte | ||||||
| @ -744,7 +810,7 @@ func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return &Signature{ | 	return &Signature{ | ||||||
| 		Format: s.pubKey.Type(), | 		Format: algorithm, | ||||||
| 		Blob:   signature, | 		Blob:   signature, | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
| @ -758,7 +824,7 @@ func NewPublicKey(key interface{}) (PublicKey, error) { | |||||||
| 		return (*rsaPublicKey)(key), nil | 		return (*rsaPublicKey)(key), nil | ||||||
| 	case *ecdsa.PublicKey: | 	case *ecdsa.PublicKey: | ||||||
| 		if !supportedEllipticCurve(key.Curve) { | 		if !supportedEllipticCurve(key.Curve) { | ||||||
| 			return nil, errors.New("ssh: only P-256, P-384 and P-521 EC keys are supported.") | 			return nil, errors.New("ssh: only P-256, P-384 and P-521 EC keys are supported") | ||||||
| 		} | 		} | ||||||
| 		return (*ecdsaPublicKey)(key), nil | 		return (*ecdsaPublicKey)(key), nil | ||||||
| 	case *dsa.PublicKey: | 	case *dsa.PublicKey: | ||||||
| @ -802,7 +868,7 @@ func encryptedBlock(block *pem.Block) bool { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ParseRawPrivateKey returns a private key from a PEM encoded private key. It
 | // ParseRawPrivateKey returns a private key from a PEM encoded private key. It
 | ||||||
| // supports RSA (PKCS#1), DSA (OpenSSL), and ECDSA private keys.
 | // supports RSA (PKCS#1), PKCS#8, DSA (OpenSSL), and ECDSA private keys.
 | ||||||
| func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { | func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { | ||||||
| 	block, _ := pem.Decode(pemBytes) | 	block, _ := pem.Decode(pemBytes) | ||||||
| 	if block == nil { | 	if block == nil { | ||||||
| @ -816,6 +882,9 @@ func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { | |||||||
| 	switch block.Type { | 	switch block.Type { | ||||||
| 	case "RSA PRIVATE KEY": | 	case "RSA PRIVATE KEY": | ||||||
| 		return x509.ParsePKCS1PrivateKey(block.Bytes) | 		return x509.ParsePKCS1PrivateKey(block.Bytes) | ||||||
|  | 	// RFC5208 - https://tools.ietf.org/html/rfc5208
 | ||||||
|  | 	case "PRIVATE KEY": | ||||||
|  | 		return x509.ParsePKCS8PrivateKey(block.Bytes) | ||||||
| 	case "EC PRIVATE KEY": | 	case "EC PRIVATE KEY": | ||||||
| 		return x509.ParseECPrivateKey(block.Bytes) | 		return x509.ParseECPrivateKey(block.Bytes) | ||||||
| 	case "DSA PRIVATE KEY": | 	case "DSA PRIVATE KEY": | ||||||
| @ -899,8 +968,8 @@ func ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) { | |||||||
| // Implemented based on the documentation at
 | // Implemented based on the documentation at
 | ||||||
| // https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key
 | // https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key
 | ||||||
| func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { | func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { | ||||||
| 	magic := append([]byte("openssh-key-v1"), 0) | 	const magic = "openssh-key-v1\x00" | ||||||
| 	if !bytes.Equal(magic, key[0:len(magic)]) { | 	if len(key) < len(magic) || string(key[:len(magic)]) != magic { | ||||||
| 		return nil, errors.New("ssh: invalid openssh private key format") | 		return nil, errors.New("ssh: invalid openssh private key format") | ||||||
| 	} | 	} | ||||||
| 	remaining := key[len(magic):] | 	remaining := key[len(magic):] | ||||||
|  | |||||||
							
								
								
									
										38
									
								
								vendor/golang.org/x/crypto/ssh/messages.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/golang.org/x/crypto/ssh/messages.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -23,10 +23,6 @@ const ( | |||||||
| 	msgUnimplemented = 3 | 	msgUnimplemented = 3 | ||||||
| 	msgDebug         = 4 | 	msgDebug         = 4 | ||||||
| 	msgNewKeys       = 21 | 	msgNewKeys       = 21 | ||||||
| 
 |  | ||||||
| 	// Standard authentication messages
 |  | ||||||
| 	msgUserAuthSuccess = 52 |  | ||||||
| 	msgUserAuthBanner  = 53 |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // SSH messages:
 | // SSH messages:
 | ||||||
| @ -137,6 +133,18 @@ type userAuthFailureMsg struct { | |||||||
| 	PartialSuccess bool | 	PartialSuccess bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // See RFC 4252, section 5.1
 | ||||||
|  | const msgUserAuthSuccess = 52 | ||||||
|  | 
 | ||||||
|  | // See RFC 4252, section 5.4
 | ||||||
|  | const msgUserAuthBanner = 53 | ||||||
|  | 
 | ||||||
|  | type userAuthBannerMsg struct { | ||||||
|  | 	Message string `sshtype:"53"` | ||||||
|  | 	// unused, but required to allow message parsing
 | ||||||
|  | 	Language string | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // See RFC 4256, section 3.2
 | // See RFC 4256, section 3.2
 | ||||||
| const msgUserAuthInfoRequest = 60 | const msgUserAuthInfoRequest = 60 | ||||||
| const msgUserAuthInfoResponse = 61 | const msgUserAuthInfoResponse = 61 | ||||||
| @ -154,7 +162,7 @@ const msgChannelOpen = 90 | |||||||
| 
 | 
 | ||||||
| type channelOpenMsg struct { | type channelOpenMsg struct { | ||||||
| 	ChanType         string `sshtype:"90"` | 	ChanType         string `sshtype:"90"` | ||||||
| 	PeersId          uint32 | 	PeersID          uint32 | ||||||
| 	PeersWindow      uint32 | 	PeersWindow      uint32 | ||||||
| 	MaxPacketSize    uint32 | 	MaxPacketSize    uint32 | ||||||
| 	TypeSpecificData []byte `ssh:"rest"` | 	TypeSpecificData []byte `ssh:"rest"` | ||||||
| @ -165,7 +173,7 @@ const msgChannelData = 94 | |||||||
| 
 | 
 | ||||||
| // Used for debug print outs of packets.
 | // Used for debug print outs of packets.
 | ||||||
| type channelDataMsg struct { | type channelDataMsg struct { | ||||||
| 	PeersId uint32 `sshtype:"94"` | 	PeersID uint32 `sshtype:"94"` | ||||||
| 	Length  uint32 | 	Length  uint32 | ||||||
| 	Rest    []byte `ssh:"rest"` | 	Rest    []byte `ssh:"rest"` | ||||||
| } | } | ||||||
| @ -174,8 +182,8 @@ type channelDataMsg struct { | |||||||
| const msgChannelOpenConfirm = 91 | const msgChannelOpenConfirm = 91 | ||||||
| 
 | 
 | ||||||
| type channelOpenConfirmMsg struct { | type channelOpenConfirmMsg struct { | ||||||
| 	PeersId          uint32 `sshtype:"91"` | 	PeersID          uint32 `sshtype:"91"` | ||||||
| 	MyId             uint32 | 	MyID             uint32 | ||||||
| 	MyWindow         uint32 | 	MyWindow         uint32 | ||||||
| 	MaxPacketSize    uint32 | 	MaxPacketSize    uint32 | ||||||
| 	TypeSpecificData []byte `ssh:"rest"` | 	TypeSpecificData []byte `ssh:"rest"` | ||||||
| @ -185,7 +193,7 @@ type channelOpenConfirmMsg struct { | |||||||
| const msgChannelOpenFailure = 92 | const msgChannelOpenFailure = 92 | ||||||
| 
 | 
 | ||||||
| type channelOpenFailureMsg struct { | type channelOpenFailureMsg struct { | ||||||
| 	PeersId  uint32 `sshtype:"92"` | 	PeersID  uint32 `sshtype:"92"` | ||||||
| 	Reason   RejectionReason | 	Reason   RejectionReason | ||||||
| 	Message  string | 	Message  string | ||||||
| 	Language string | 	Language string | ||||||
| @ -194,7 +202,7 @@ type channelOpenFailureMsg struct { | |||||||
| const msgChannelRequest = 98 | const msgChannelRequest = 98 | ||||||
| 
 | 
 | ||||||
| type channelRequestMsg struct { | type channelRequestMsg struct { | ||||||
| 	PeersId             uint32 `sshtype:"98"` | 	PeersID             uint32 `sshtype:"98"` | ||||||
| 	Request             string | 	Request             string | ||||||
| 	WantReply           bool | 	WantReply           bool | ||||||
| 	RequestSpecificData []byte `ssh:"rest"` | 	RequestSpecificData []byte `ssh:"rest"` | ||||||
| @ -204,28 +212,28 @@ type channelRequestMsg struct { | |||||||
| const msgChannelSuccess = 99 | const msgChannelSuccess = 99 | ||||||
| 
 | 
 | ||||||
| type channelRequestSuccessMsg struct { | type channelRequestSuccessMsg struct { | ||||||
| 	PeersId uint32 `sshtype:"99"` | 	PeersID uint32 `sshtype:"99"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // See RFC 4254, section 5.4.
 | // See RFC 4254, section 5.4.
 | ||||||
| const msgChannelFailure = 100 | const msgChannelFailure = 100 | ||||||
| 
 | 
 | ||||||
| type channelRequestFailureMsg struct { | type channelRequestFailureMsg struct { | ||||||
| 	PeersId uint32 `sshtype:"100"` | 	PeersID uint32 `sshtype:"100"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // See RFC 4254, section 5.3
 | // See RFC 4254, section 5.3
 | ||||||
| const msgChannelClose = 97 | const msgChannelClose = 97 | ||||||
| 
 | 
 | ||||||
| type channelCloseMsg struct { | type channelCloseMsg struct { | ||||||
| 	PeersId uint32 `sshtype:"97"` | 	PeersID uint32 `sshtype:"97"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // See RFC 4254, section 5.3
 | // See RFC 4254, section 5.3
 | ||||||
| const msgChannelEOF = 96 | const msgChannelEOF = 96 | ||||||
| 
 | 
 | ||||||
| type channelEOFMsg struct { | type channelEOFMsg struct { | ||||||
| 	PeersId uint32 `sshtype:"96"` | 	PeersID uint32 `sshtype:"96"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // See RFC 4254, section 4
 | // See RFC 4254, section 4
 | ||||||
| @ -255,7 +263,7 @@ type globalRequestFailureMsg struct { | |||||||
| const msgChannelWindowAdjust = 93 | const msgChannelWindowAdjust = 93 | ||||||
| 
 | 
 | ||||||
| type windowAdjustMsg struct { | type windowAdjustMsg struct { | ||||||
| 	PeersId         uint32 `sshtype:"93"` | 	PeersID         uint32 `sshtype:"93"` | ||||||
| 	AdditionalBytes uint32 | 	AdditionalBytes uint32 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								vendor/golang.org/x/crypto/ssh/mux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/golang.org/x/crypto/ssh/mux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -278,7 +278,7 @@ func (m *mux) handleChannelOpen(packet []byte) error { | |||||||
| 
 | 
 | ||||||
| 	if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { | 	if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { | ||||||
| 		failMsg := channelOpenFailureMsg{ | 		failMsg := channelOpenFailureMsg{ | ||||||
| 			PeersId:  msg.PeersId, | 			PeersID:  msg.PeersID, | ||||||
| 			Reason:   ConnectionFailed, | 			Reason:   ConnectionFailed, | ||||||
| 			Message:  "invalid request", | 			Message:  "invalid request", | ||||||
| 			Language: "en_US.UTF-8", | 			Language: "en_US.UTF-8", | ||||||
| @ -287,7 +287,7 @@ func (m *mux) handleChannelOpen(packet []byte) error { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	c := m.newChannel(msg.ChanType, channelInbound, msg.TypeSpecificData) | 	c := m.newChannel(msg.ChanType, channelInbound, msg.TypeSpecificData) | ||||||
| 	c.remoteId = msg.PeersId | 	c.remoteId = msg.PeersID | ||||||
| 	c.maxRemotePayload = msg.MaxPacketSize | 	c.maxRemotePayload = msg.MaxPacketSize | ||||||
| 	c.remoteWin.add(msg.PeersWindow) | 	c.remoteWin.add(msg.PeersWindow) | ||||||
| 	m.incomingChannels <- c | 	m.incomingChannels <- c | ||||||
| @ -313,7 +313,7 @@ func (m *mux) openChannel(chanType string, extra []byte) (*channel, error) { | |||||||
| 		PeersWindow:      ch.myWindow, | 		PeersWindow:      ch.myWindow, | ||||||
| 		MaxPacketSize:    ch.maxIncomingPayload, | 		MaxPacketSize:    ch.maxIncomingPayload, | ||||||
| 		TypeSpecificData: extra, | 		TypeSpecificData: extra, | ||||||
| 		PeersId:          ch.localId, | 		PeersID:          ch.localId, | ||||||
| 	} | 	} | ||||||
| 	if err := m.sendMessage(open); err != nil { | 	if err := m.sendMessage(open); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | |||||||
							
								
								
									
										45
									
								
								vendor/golang.org/x/crypto/ssh/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								vendor/golang.org/x/crypto/ssh/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -95,6 +95,10 @@ type ServerConfig struct { | |||||||
| 	// Note that RFC 4253 section 4.2 requires that this string start with
 | 	// Note that RFC 4253 section 4.2 requires that this string start with
 | ||||||
| 	// "SSH-2.0-".
 | 	// "SSH-2.0-".
 | ||||||
| 	ServerVersion string | 	ServerVersion string | ||||||
|  | 
 | ||||||
|  | 	// BannerCallback, if present, is called and the return string is sent to
 | ||||||
|  | 	// the client after key exchange completed but before authentication.
 | ||||||
|  | 	BannerCallback func(conn ConnMetadata) string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // AddHostKey adds a private key as a host key. If an existing host
 | // AddHostKey adds a private key as a host key. If an existing host
 | ||||||
| @ -162,6 +166,9 @@ type ServerConn struct { | |||||||
| // unsuccessful, it closes the connection and returns an error.  The
 | // unsuccessful, it closes the connection and returns an error.  The
 | ||||||
| // Request and NewChannel channels must be serviced, or the connection
 | // Request and NewChannel channels must be serviced, or the connection
 | ||||||
| // will hang.
 | // will hang.
 | ||||||
|  | //
 | ||||||
|  | // The returned error may be of type *ServerAuthError for
 | ||||||
|  | // authentication errors.
 | ||||||
| func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) { | func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) { | ||||||
| 	fullConf := *config | 	fullConf := *config | ||||||
| 	fullConf.SetDefaults() | 	fullConf.SetDefaults() | ||||||
| @ -252,7 +259,7 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) | |||||||
| func isAcceptableAlgo(algo string) bool { | func isAcceptableAlgo(algo string) bool { | ||||||
| 	switch algo { | 	switch algo { | ||||||
| 	case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoED25519, | 	case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoED25519, | ||||||
| 		CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01: | 		CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: | ||||||
| 		return true | 		return true | ||||||
| 	} | 	} | ||||||
| 	return false | 	return false | ||||||
| @ -288,12 +295,13 @@ func checkSourceAddress(addr net.Addr, sourceAddrs string) error { | |||||||
| 	return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) | 	return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ServerAuthError implements the error interface. It appends any authentication
 | // ServerAuthError represents server authentication errors and is
 | ||||||
| // errors that may occur, and is returned if all of the authentication methods
 | // sometimes returned by NewServerConn. It appends any authentication
 | ||||||
| // provided by the user failed to authenticate.
 | // errors that may occur, and is returned if all of the authentication
 | ||||||
|  | // methods provided by the user failed to authenticate.
 | ||||||
| type ServerAuthError struct { | type ServerAuthError struct { | ||||||
| 	// Errors contains authentication errors returned by the authentication
 | 	// Errors contains authentication errors returned by the authentication
 | ||||||
| 	// callback methods.
 | 	// callback methods. The first entry is typically ErrNoAuth.
 | ||||||
| 	Errors []error | 	Errors []error | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -305,6 +313,13 @@ func (l ServerAuthError) Error() string { | |||||||
| 	return "[" + strings.Join(errs, ", ") + "]" | 	return "[" + strings.Join(errs, ", ") + "]" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ErrNoAuth is the error value returned if no
 | ||||||
|  | // authentication method has been passed yet. This happens as a normal
 | ||||||
|  | // part of the authentication loop, since the client first tries
 | ||||||
|  | // 'none' authentication to discover available methods.
 | ||||||
|  | // It is returned in ServerAuthError.Errors from NewServerConn.
 | ||||||
|  | var ErrNoAuth = errors.New("ssh: no auth passed yet") | ||||||
|  | 
 | ||||||
| func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) { | func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) { | ||||||
| 	sessionID := s.transport.getSessionID() | 	sessionID := s.transport.getSessionID() | ||||||
| 	var cache pubKeyCache | 	var cache pubKeyCache | ||||||
| @ -312,6 +327,7 @@ func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, err | |||||||
| 
 | 
 | ||||||
| 	authFailures := 0 | 	authFailures := 0 | ||||||
| 	var authErrs []error | 	var authErrs []error | ||||||
|  | 	var displayedBanner bool | ||||||
| 
 | 
 | ||||||
| userAuthLoop: | userAuthLoop: | ||||||
| 	for { | 	for { | ||||||
| @ -343,8 +359,22 @@ userAuthLoop: | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		s.user = userAuthReq.User | 		s.user = userAuthReq.User | ||||||
|  | 
 | ||||||
|  | 		if !displayedBanner && config.BannerCallback != nil { | ||||||
|  | 			displayedBanner = true | ||||||
|  | 			msg := config.BannerCallback(s) | ||||||
|  | 			if msg != "" { | ||||||
|  | 				bannerMsg := &userAuthBannerMsg{ | ||||||
|  | 					Message: msg, | ||||||
|  | 				} | ||||||
|  | 				if err := s.transport.writePacket(Marshal(bannerMsg)); err != nil { | ||||||
|  | 					return nil, err | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		perms = nil | 		perms = nil | ||||||
| 		authErr := errors.New("no auth passed yet") | 		authErr := ErrNoAuth | ||||||
| 
 | 
 | ||||||
| 		switch userAuthReq.Method { | 		switch userAuthReq.Method { | ||||||
| 		case "none": | 		case "none": | ||||||
| @ -374,7 +404,7 @@ userAuthLoop: | |||||||
| 			perms, authErr = config.PasswordCallback(s, password) | 			perms, authErr = config.PasswordCallback(s, password) | ||||||
| 		case "keyboard-interactive": | 		case "keyboard-interactive": | ||||||
| 			if config.KeyboardInteractiveCallback == nil { | 			if config.KeyboardInteractiveCallback == nil { | ||||||
| 				authErr = errors.New("ssh: keyboard-interactive auth not configubred") | 				authErr = errors.New("ssh: keyboard-interactive auth not configured") | ||||||
| 				break | 				break | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| @ -454,6 +484,7 @@ userAuthLoop: | |||||||
| 				// sig.Format.  This is usually the same, but
 | 				// sig.Format.  This is usually the same, but
 | ||||||
| 				// for certs, the names differ.
 | 				// for certs, the names differ.
 | ||||||
| 				if !isAcceptableAlgo(sig.Format) { | 				if !isAcceptableAlgo(sig.Format) { | ||||||
|  | 					authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format) | ||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
| 				signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) | 				signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -406,7 +406,7 @@ func (s *Session) Wait() error { | |||||||
| 		s.stdinPipeWriter.Close() | 		s.stdinPipeWriter.Close() | ||||||
| 	} | 	} | ||||||
| 	var copyError error | 	var copyError error | ||||||
| 	for _ = range s.copyFuncs { | 	for range s.copyFuncs { | ||||||
| 		if err := <-s.errors; err != nil && copyError == nil { | 		if err := <-s.errors; err != nil && copyError == nil { | ||||||
| 			copyError = err | 			copyError = err | ||||||
| 		} | 		} | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								vendor/golang.org/x/crypto/ssh/streamlocal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/golang.org/x/crypto/ssh/streamlocal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -32,6 +32,7 @@ type streamLocalChannelForwardMsg struct { | |||||||
| 
 | 
 | ||||||
| // ListenUnix is similar to ListenTCP but uses a Unix domain socket.
 | // ListenUnix is similar to ListenTCP but uses a Unix domain socket.
 | ||||||
| func (c *Client) ListenUnix(socketPath string) (net.Listener, error) { | func (c *Client) ListenUnix(socketPath string) (net.Listener, error) { | ||||||
|  | 	c.handleForwardsOnce.Do(c.handleForwards) | ||||||
| 	m := streamLocalChannelForwardMsg{ | 	m := streamLocalChannelForwardMsg{ | ||||||
| 		socketPath, | 		socketPath, | ||||||
| 	} | 	} | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								vendor/golang.org/x/crypto/ssh/tcpip.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/golang.org/x/crypto/ssh/tcpip.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -90,10 +90,19 @@ type channelForwardMsg struct { | |||||||
| 	rport uint32 | 	rport uint32 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // handleForwards starts goroutines handling forwarded connections.
 | ||||||
|  | // It's called on first use by (*Client).ListenTCP to not launch
 | ||||||
|  | // goroutines until needed.
 | ||||||
|  | func (c *Client) handleForwards() { | ||||||
|  | 	go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-tcpip")) | ||||||
|  | 	go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-streamlocal@openssh.com")) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListenTCP requests the remote peer open a listening socket
 | // ListenTCP requests the remote peer open a listening socket
 | ||||||
| // on laddr. Incoming connections will be available by calling
 | // on laddr. Incoming connections will be available by calling
 | ||||||
| // Accept on the returned net.Listener.
 | // Accept on the returned net.Listener.
 | ||||||
| func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) { | func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) { | ||||||
|  | 	c.handleForwardsOnce.Do(c.handleForwards) | ||||||
| 	if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) { | 	if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) { | ||||||
| 		return c.autoPortListenWorkaround(laddr) | 		return c.autoPortListenWorkaround(laddr) | ||||||
| 	} | 	} | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/terminal/terminal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/terminal/terminal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -617,7 +617,7 @@ func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { | |||||||
| 			if _, err = w.Write(crlf); err != nil { | 			if _, err = w.Write(crlf); err != nil { | ||||||
| 				return n, err | 				return n, err | ||||||
| 			} | 			} | ||||||
| 			n += 1 | 			n++ | ||||||
| 			buf = buf[1:] | 			buf = buf[1:] | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,7 +2,7 @@ | |||||||
| // Use of this source code is governed by a BSD-style
 | // Use of this source code is governed by a BSD-style
 | ||||||
| // license that can be found in the LICENSE file.
 | // license that can be found in the LICENSE file.
 | ||||||
| 
 | 
 | ||||||
| // +build darwin dragonfly freebsd linux,!appengine netbsd openbsd
 | // +build aix darwin dragonfly freebsd linux,!appengine netbsd openbsd
 | ||||||
| 
 | 
 | ||||||
| // Package terminal provides support functions for dealing with terminals, as
 | // Package terminal provides support functions for dealing with terminals, as
 | ||||||
| // commonly found on UNIX systems.
 | // commonly found on UNIX systems.
 | ||||||
| @ -25,7 +25,7 @@ type State struct { | |||||||
| 	termios unix.Termios | 	termios unix.Termios | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // IsTerminal returns true if the given file descriptor is a terminal.
 | // IsTerminal returns whether the given file descriptor is a terminal.
 | ||||||
| func IsTerminal(fd int) bool { | func IsTerminal(fd int) bool { | ||||||
| 	_, err := unix.IoctlGetTermios(fd, ioctlReadTermios) | 	_, err := unix.IoctlGetTermios(fd, ioctlReadTermios) | ||||||
| 	return err == nil | 	return err == nil | ||||||
| @ -108,9 +108,7 @@ func ReadPassword(fd int) ([]byte, error) { | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	defer func() { | 	defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) | ||||||
| 		unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) |  | ||||||
| 	}() |  | ||||||
| 
 | 
 | ||||||
| 	return readPasswordLine(passwordReader(fd)) | 	return readPasswordLine(passwordReader(fd)) | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_aix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_aix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | // Copyright 2018 The Go Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a BSD-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | // +build aix
 | ||||||
|  | 
 | ||||||
|  | package terminal | ||||||
|  | 
 | ||||||
|  | import "golang.org/x/sys/unix" | ||||||
|  | 
 | ||||||
|  | const ioctlReadTermios = unix.TCGETS | ||||||
|  | const ioctlWriteTermios = unix.TCSETS | ||||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -21,7 +21,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| type State struct{} | type State struct{} | ||||||
| 
 | 
 | ||||||
| // IsTerminal returns true if the given file descriptor is a terminal.
 | // IsTerminal returns whether the given file descriptor is a terminal.
 | ||||||
| func IsTerminal(fd int) bool { | func IsTerminal(fd int) bool { | ||||||
| 	return false | 	return false | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										38
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -14,10 +14,10 @@ import ( | |||||||
| 
 | 
 | ||||||
| // State contains the state of a terminal.
 | // State contains the state of a terminal.
 | ||||||
| type State struct { | type State struct { | ||||||
| 	state *unix.Termios | 	termios unix.Termios | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // IsTerminal returns true if the given file descriptor is a terminal.
 | // IsTerminal returns whether the given file descriptor is a terminal.
 | ||||||
| func IsTerminal(fd int) bool { | func IsTerminal(fd int) bool { | ||||||
| 	_, err := unix.IoctlGetTermio(fd, unix.TCGETA) | 	_, err := unix.IoctlGetTermio(fd, unix.TCGETA) | ||||||
| 	return err == nil | 	return err == nil | ||||||
| @ -75,47 +75,43 @@ func ReadPassword(fd int) ([]byte, error) { | |||||||
| // restored.
 | // restored.
 | ||||||
| // see http://cr.illumos.org/~webrev/andy_js/1060/
 | // see http://cr.illumos.org/~webrev/andy_js/1060/
 | ||||||
| func MakeRaw(fd int) (*State, error) { | func MakeRaw(fd int) (*State, error) { | ||||||
| 	oldTermiosPtr, err := unix.IoctlGetTermios(fd, unix.TCGETS) | 	termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	oldTermios := *oldTermiosPtr |  | ||||||
| 
 | 
 | ||||||
| 	newTermios := oldTermios | 	oldState := State{termios: *termios} | ||||||
| 	newTermios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON |  | ||||||
| 	newTermios.Oflag &^= syscall.OPOST |  | ||||||
| 	newTermios.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN |  | ||||||
| 	newTermios.Cflag &^= syscall.CSIZE | syscall.PARENB |  | ||||||
| 	newTermios.Cflag |= syscall.CS8 |  | ||||||
| 	newTermios.Cc[unix.VMIN] = 1 |  | ||||||
| 	newTermios.Cc[unix.VTIME] = 0 |  | ||||||
| 
 | 
 | ||||||
| 	if err := unix.IoctlSetTermios(fd, unix.TCSETS, &newTermios); err != nil { | 	termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON | ||||||
|  | 	termios.Oflag &^= unix.OPOST | ||||||
|  | 	termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN | ||||||
|  | 	termios.Cflag &^= unix.CSIZE | unix.PARENB | ||||||
|  | 	termios.Cflag |= unix.CS8 | ||||||
|  | 	termios.Cc[unix.VMIN] = 1 | ||||||
|  | 	termios.Cc[unix.VTIME] = 0 | ||||||
|  | 
 | ||||||
|  | 	if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return &State{ | 	return &oldState, nil | ||||||
| 		state: oldTermiosPtr, |  | ||||||
| 	}, nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Restore restores the terminal connected to the given file descriptor to a
 | // Restore restores the terminal connected to the given file descriptor to a
 | ||||||
| // previous state.
 | // previous state.
 | ||||||
| func Restore(fd int, oldState *State) error { | func Restore(fd int, oldState *State) error { | ||||||
| 	return unix.IoctlSetTermios(fd, unix.TCSETS, oldState.state) | 	return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetState returns the current state of a terminal which may be useful to
 | // GetState returns the current state of a terminal which may be useful to
 | ||||||
| // restore the terminal after a signal.
 | // restore the terminal after a signal.
 | ||||||
| func GetState(fd int) (*State, error) { | func GetState(fd int) (*State, error) { | ||||||
| 	oldTermiosPtr, err := unix.IoctlGetTermios(fd, unix.TCGETS) | 	termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return &State{ | 	return &State{termios: *termios}, nil | ||||||
| 		state: oldTermiosPtr, |  | ||||||
| 	}, nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetSize returns the dimensions of the given terminal.
 | // GetSize returns the dimensions of the given terminal.
 | ||||||
|  | |||||||
							
								
								
									
										25
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -17,6 +17,8 @@ | |||||||
| package terminal | package terminal | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"os" | ||||||
|  | 
 | ||||||
| 	"golang.org/x/sys/windows" | 	"golang.org/x/sys/windows" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -24,7 +26,7 @@ type State struct { | |||||||
| 	mode uint32 | 	mode uint32 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // IsTerminal returns true if the given file descriptor is a terminal.
 | // IsTerminal returns whether the given file descriptor is a terminal.
 | ||||||
| func IsTerminal(fd int) bool { | func IsTerminal(fd int) bool { | ||||||
| 	var st uint32 | 	var st uint32 | ||||||
| 	err := windows.GetConsoleMode(windows.Handle(fd), &st) | 	err := windows.GetConsoleMode(windows.Handle(fd), &st) | ||||||
| @ -71,13 +73,6 @@ func GetSize(fd int) (width, height int, err error) { | |||||||
| 	return int(info.Size.X), int(info.Size.Y), nil | 	return int(info.Size.X), int(info.Size.Y), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // passwordReader is an io.Reader that reads from a specific Windows HANDLE.
 |  | ||||||
| type passwordReader int |  | ||||||
| 
 |  | ||||||
| func (r passwordReader) Read(buf []byte) (int, error) { |  | ||||||
| 	return windows.Read(windows.Handle(r), buf) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // ReadPassword reads a line of input from a terminal without local echo.  This
 | // ReadPassword reads a line of input from a terminal without local echo.  This
 | ||||||
| // is commonly used for inputting passwords and other sensitive data. The slice
 | // is commonly used for inputting passwords and other sensitive data. The slice
 | ||||||
| // returned does not include the \n.
 | // returned does not include the \n.
 | ||||||
| @ -94,9 +89,15 @@ func ReadPassword(fd int) ([]byte, error) { | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	defer func() { | 	defer windows.SetConsoleMode(windows.Handle(fd), old) | ||||||
| 		windows.SetConsoleMode(windows.Handle(fd), old) |  | ||||||
| 	}() |  | ||||||
| 
 | 
 | ||||||
| 	return readPasswordLine(passwordReader(fd)) | 	var h windows.Handle | ||||||
|  | 	p, _ := windows.GetCurrentProcess() | ||||||
|  | 	if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	f := os.NewFile(uintptr(h), "stdin") | ||||||
|  | 	defer f.Close() | ||||||
|  | 	return readPasswordLine(f) | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										72
									
								
								vendor/golang.org/x/crypto/ssh/transport.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										72
									
								
								vendor/golang.org/x/crypto/ssh/transport.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -6,6 +6,7 @@ package ssh | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
|  | 	"bytes" | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"io" | 	"io" | ||||||
| 	"log" | 	"log" | ||||||
| @ -76,17 +77,17 @@ type connectionState struct { | |||||||
| // both directions are triggered by reading and writing a msgNewKey packet
 | // both directions are triggered by reading and writing a msgNewKey packet
 | ||||||
| // respectively.
 | // respectively.
 | ||||||
| func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error { | func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error { | ||||||
| 	if ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult); err != nil { | 	ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult) | ||||||
|  | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} else { |  | ||||||
| 		t.reader.pendingKeyChange <- ciph |  | ||||||
| 	} | 	} | ||||||
|  | 	t.reader.pendingKeyChange <- ciph | ||||||
| 
 | 
 | ||||||
| 	if ciph, err := newPacketCipher(t.writer.dir, algs.w, kexResult); err != nil { | 	ciph, err = newPacketCipher(t.writer.dir, algs.w, kexResult) | ||||||
|  | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} else { |  | ||||||
| 		t.writer.pendingKeyChange <- ciph |  | ||||||
| 	} | 	} | ||||||
|  | 	t.writer.pendingKeyChange <- ciph | ||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| @ -139,7 +140,7 @@ func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { | |||||||
| 			case cipher := <-s.pendingKeyChange: | 			case cipher := <-s.pendingKeyChange: | ||||||
| 				s.packetCipher = cipher | 				s.packetCipher = cipher | ||||||
| 			default: | 			default: | ||||||
| 				return nil, errors.New("ssh: got bogus newkeys message.") | 				return nil, errors.New("ssh: got bogus newkeys message") | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		case msgDisconnect: | 		case msgDisconnect: | ||||||
| @ -232,52 +233,22 @@ var ( | |||||||
| 	clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}} | 	clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}} | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // generateKeys generates key material for IV, MAC and encryption.
 |  | ||||||
| func generateKeys(d direction, algs directionAlgorithms, kex *kexResult) (iv, key, macKey []byte) { |  | ||||||
| 	cipherMode := cipherModes[algs.Cipher] |  | ||||||
| 	macMode := macModes[algs.MAC] |  | ||||||
| 
 |  | ||||||
| 	iv = make([]byte, cipherMode.ivSize) |  | ||||||
| 	key = make([]byte, cipherMode.keySize) |  | ||||||
| 	macKey = make([]byte, macMode.keySize) |  | ||||||
| 
 |  | ||||||
| 	generateKeyMaterial(iv, d.ivTag, kex) |  | ||||||
| 	generateKeyMaterial(key, d.keyTag, kex) |  | ||||||
| 	generateKeyMaterial(macKey, d.macKeyTag, kex) |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as
 | // setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as
 | ||||||
| // described in RFC 4253, section 6.4. direction should either be serverKeys
 | // described in RFC 4253, section 6.4. direction should either be serverKeys
 | ||||||
| // (to setup server->client keys) or clientKeys (for client->server keys).
 | // (to setup server->client keys) or clientKeys (for client->server keys).
 | ||||||
| func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) { | func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) { | ||||||
| 	iv, key, macKey := generateKeys(d, algs, kex) | 	cipherMode := cipherModes[algs.Cipher] | ||||||
|  | 	macMode := macModes[algs.MAC] | ||||||
| 
 | 
 | ||||||
| 	if algs.Cipher == gcmCipherID { | 	iv := make([]byte, cipherMode.ivSize) | ||||||
| 		return newGCMCipher(iv, key) | 	key := make([]byte, cipherMode.keySize) | ||||||
| 	} | 	macKey := make([]byte, macMode.keySize) | ||||||
| 
 | 
 | ||||||
| 	if algs.Cipher == aes128cbcID { | 	generateKeyMaterial(iv, d.ivTag, kex) | ||||||
| 		return newAESCBCCipher(iv, key, macKey, algs) | 	generateKeyMaterial(key, d.keyTag, kex) | ||||||
| 	} | 	generateKeyMaterial(macKey, d.macKeyTag, kex) | ||||||
| 
 | 
 | ||||||
| 	if algs.Cipher == tripledescbcID { | 	return cipherModes[algs.Cipher].create(key, iv, macKey, algs) | ||||||
| 		return newTripleDESCBCCipher(iv, key, macKey, algs) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	c := &streamPacketCipher{ |  | ||||||
| 		mac: macModes[algs.MAC].new(macKey), |  | ||||||
| 		etm: macModes[algs.MAC].etm, |  | ||||||
| 	} |  | ||||||
| 	c.macResult = make([]byte, c.mac.Size()) |  | ||||||
| 
 |  | ||||||
| 	var err error |  | ||||||
| 	c.cipher, err = cipherModes[algs.Cipher].createStream(key, iv) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return c, nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // generateKeyMaterial fills out with key material generated from tag, K, H
 | // generateKeyMaterial fills out with key material generated from tag, K, H
 | ||||||
| @ -342,7 +313,7 @@ func readVersion(r io.Reader) ([]byte, error) { | |||||||
| 	var ok bool | 	var ok bool | ||||||
| 	var buf [1]byte | 	var buf [1]byte | ||||||
| 
 | 
 | ||||||
| 	for len(versionString) < maxVersionStringBytes { | 	for length := 0; length < maxVersionStringBytes; length++ { | ||||||
| 		_, err := io.ReadFull(r, buf[:]) | 		_, err := io.ReadFull(r, buf[:]) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| @ -350,6 +321,13 @@ func readVersion(r io.Reader) ([]byte, error) { | |||||||
| 		// The RFC says that the version should be terminated with \r\n
 | 		// The RFC says that the version should be terminated with \r\n
 | ||||||
| 		// but several SSH servers actually only send a \n.
 | 		// but several SSH servers actually only send a \n.
 | ||||||
| 		if buf[0] == '\n' { | 		if buf[0] == '\n' { | ||||||
|  | 			if !bytes.HasPrefix(versionString, []byte("SSH-")) { | ||||||
|  | 				// RFC 4253 says we need to ignore all version string lines
 | ||||||
|  | 				// except the one containing the SSH version (provided that
 | ||||||
|  | 				// all the lines do not exceed 255 bytes in total).
 | ||||||
|  | 				versionString = versionString[:0] | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
| 			ok = true | 			ok = true | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
|  | |||||||
							
								
								
									
										100
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							| @ -631,92 +631,116 @@ | |||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "TT1rac6kpQp2vz24m5yDGUNQ/QQ=", | 			"checksumSHA1": "TT1rac6kpQp2vz24m5yDGUNQ/QQ=", | ||||||
| 			"path": "golang.org/x/crypto/cast5", | 			"path": "golang.org/x/crypto/cast5", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "IQkUIOnvlf0tYloFx9mLaXSvXWQ=", | 			"checksumSHA1": "IQkUIOnvlf0tYloFx9mLaXSvXWQ=", | ||||||
| 			"path": "golang.org/x/crypto/curve25519", | 			"path": "golang.org/x/crypto/curve25519", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "1hwn8cgg4EVXhCpJIqmMbzqnUo0=", | 			"checksumSHA1": "2LpxYGSf068307b7bhAuVjvzLLc=", | ||||||
| 			"path": "golang.org/x/crypto/ed25519", | 			"path": "golang.org/x/crypto/ed25519", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "LXFcVx8I587SnWmKycSDEq9yvK8=", | 			"checksumSHA1": "0JTAFXPkankmWcZGQJGScLDiaN8=", | ||||||
| 			"path": "golang.org/x/crypto/ed25519/internal/edwards25519", | 			"path": "golang.org/x/crypto/ed25519/internal/edwards25519", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "IIhFTrLlmlc6lEFSitqi4aw2lw0=", | 			"checksumSHA1": "fhxj9uzosD3dQefNF5JuGJzGZwg=", | ||||||
|  | 			"path": "golang.org/x/crypto/internal/chacha20", | ||||||
|  | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
|  | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"checksumSHA1": "/U7f2gaH6DnEmLguVLDbipU6kXU=", | ||||||
|  | 			"path": "golang.org/x/crypto/internal/subtle", | ||||||
|  | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
|  | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"checksumSHA1": "M7MQqB1xKzwQh5aEjckVsVCxpoY=", | ||||||
| 			"path": "golang.org/x/crypto/openpgp", | 			"path": "golang.org/x/crypto/openpgp", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "olOKkhrdkYQHZ0lf1orrFQPQrv4=", | 			"checksumSHA1": "olOKkhrdkYQHZ0lf1orrFQPQrv4=", | ||||||
| 			"path": "golang.org/x/crypto/openpgp/armor", | 			"path": "golang.org/x/crypto/openpgp/armor", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "eo/KtdjieJQXH7Qy+faXFcF70ME=", | 			"checksumSHA1": "eo/KtdjieJQXH7Qy+faXFcF70ME=", | ||||||
| 			"path": "golang.org/x/crypto/openpgp/elgamal", | 			"path": "golang.org/x/crypto/openpgp/elgamal", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "rlxVSaGgqdAgwblsErxTxIfuGfg=", | 			"checksumSHA1": "rlxVSaGgqdAgwblsErxTxIfuGfg=", | ||||||
| 			"path": "golang.org/x/crypto/openpgp/errors", | 			"path": "golang.org/x/crypto/openpgp/errors", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "Pq88+Dgh04UdXWZN6P+bLgYnbRc=", | 			"checksumSHA1": "DwKua4mYaqKBGxCrwgLP2JqkPA0=", | ||||||
| 			"path": "golang.org/x/crypto/openpgp/packet", | 			"path": "golang.org/x/crypto/openpgp/packet", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "s2qT4UwvzBSkzXuiuMkowif1Olw=", | 			"checksumSHA1": "s2qT4UwvzBSkzXuiuMkowif1Olw=", | ||||||
| 			"path": "golang.org/x/crypto/openpgp/s2k", | 			"path": "golang.org/x/crypto/openpgp/s2k", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "1MGpGDQqnUoRpv7VEcQrXOBydXE=", | 			"checksumSHA1": "1MGpGDQqnUoRpv7VEcQrXOBydXE=", | ||||||
| 			"path": "golang.org/x/crypto/pbkdf2", | 			"path": "golang.org/x/crypto/pbkdf2", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "y/oIaxq2d3WPizRZfVjo8RCRYTU=", | 			"checksumSHA1": "vKbPb9fpjCdzuoOvajOJnYfHG2g=", | ||||||
|  | 			"path": "golang.org/x/crypto/poly1305", | ||||||
|  | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
|  | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"checksumSHA1": "GP0QdBhWPoH4hsHedU7935MjGWo=", | ||||||
| 			"path": "golang.org/x/crypto/ripemd160", | 			"path": "golang.org/x/crypto/ripemd160", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "dHh6VeHcbNg11miGjGEl8LbPe7w=", | 			"checksumSHA1": "q+Rqy6Spw6qDSj75TGEZF7nzoFM=", | ||||||
| 			"path": "golang.org/x/crypto/scrypt", | 			"path": "golang.org/x/crypto/scrypt", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "Wi44TcpIOXdojyVWkvyOBnBKIS4=", | 			"checksumSHA1": "hUsBzxJ8KTL4v0vpPT/mqvdJ46s=", | ||||||
|  | 			"path": "golang.org/x/crypto/sha3", | ||||||
|  | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
|  | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"checksumSHA1": "eMiE+YWT0hJF4B9/hrKHaRp39aU=", | ||||||
| 			"path": "golang.org/x/crypto/ssh", | 			"path": "golang.org/x/crypto/ssh", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "5Yb2z6UO+Arm/TEd+OEtdnwOt1A=", | 			"checksumSHA1": "BSPDVKviqHQaG2phOFN690zAKB8=", | ||||||
| 			"path": "golang.org/x/crypto/ssh/terminal", | 			"path": "golang.org/x/crypto/ssh/terminal", | ||||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | 			"revisionTime": "2018-07-25T11:53:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "Y+HGqEkYM15ir+J93MEaHdyFy0c=", | 			"checksumSHA1": "Y+HGqEkYM15ir+J93MEaHdyFy0c=", | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user