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/ecies" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/log" | ||||
| 	"github.com/ethereum/go-ethereum/swarm/api" | ||||
| 	swarmapi "github.com/ethereum/go-ethereum/swarm/api/client" | ||||
| 	"github.com/ethereum/go-ethereum/swarm/testutil" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @ -598,7 +598,7 @@ func TestKeypairSanity(t *testing.T) { | ||||
| 			t.Fatal(err) | ||||
| 		} | ||||
| 
 | ||||
| 		hasher := sha3.NewKeccak256() | ||||
| 		hasher := sha3.NewLegacyKeccak256() | ||||
| 		hasher.Write(salt) | ||||
| 		shared, err := hex.DecodeString(sharedSecret) | ||||
| 		if err != nil { | ||||
|  | ||||
| @ -27,7 +27,7 @@ import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"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.
 | ||||
| @ -196,7 +196,7 @@ func (a Address) Hash() Hash { return BytesToHash(a[:]) } | ||||
| // Hex returns an EIP55-compliant hex string representation of the address.
 | ||||
| func (a Address) Hex() string { | ||||
| 	unchecksummed := hex.EncodeToString(a[:]) | ||||
| 	sha := sha3.NewKeccak256() | ||||
| 	sha := sha3.NewLegacyKeccak256() | ||||
| 	sha.Write([]byte(unchecksummed)) | ||||
| 	hash := sha.Sum(nil) | ||||
| 
 | ||||
|  | ||||
| @ -33,13 +33,13 @@ import ( | ||||
| 	"github.com/ethereum/go-ethereum/core/state" | ||||
| 	"github.com/ethereum/go-ethereum/core/types" | ||||
| 	"github.com/ethereum/go-ethereum/crypto" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ethereum/go-ethereum/log" | ||||
| 	"github.com/ethereum/go-ethereum/params" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"github.com/ethereum/go-ethereum/rpc" | ||||
| 	lru "github.com/hashicorp/golang-lru" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| 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
 | ||||
| // or not), which could be abused to produce different hashes for the same header.
 | ||||
| func sigHash(header *types.Header) (hash common.Hash) { | ||||
| 	hasher := sha3.NewKeccak256() | ||||
| 	hasher := sha3.NewLegacyKeccak256() | ||||
| 
 | ||||
| 	rlp.Encode(hasher, []interface{}{ | ||||
| 		header.ParentHash, | ||||
|  | ||||
| @ -30,8 +30,8 @@ import ( | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/common/bitutil" | ||||
| 	"github.com/ethereum/go-ethereum/crypto" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/log" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @ -123,7 +123,7 @@ func seedHash(block uint64) []byte { | ||||
| 	if block < epochLength { | ||||
| 		return seed | ||||
| 	} | ||||
| 	keccak256 := makeHasher(sha3.NewKeccak256()) | ||||
| 	keccak256 := makeHasher(sha3.NewLegacyKeccak256()) | ||||
| 	for i := 0; i < int(block/epochLength); i++ { | ||||
| 		keccak256(seed, seed) | ||||
| 	} | ||||
| @ -177,7 +177,7 @@ func generateCache(dest []uint32, epoch uint64, seed []byte) { | ||||
| 		} | ||||
| 	}() | ||||
| 	// Create a hasher to reuse between invocations
 | ||||
| 	keccak512 := makeHasher(sha3.NewKeccak512()) | ||||
| 	keccak512 := makeHasher(sha3.NewLegacyKeccak512()) | ||||
| 
 | ||||
| 	// Sequentially produce the initial dataset
 | ||||
| 	keccak512(cache, seed) | ||||
| @ -301,7 +301,7 @@ func generateDataset(dest []uint32, epoch uint64, cache []uint32) { | ||||
| 			defer pend.Done() | ||||
| 
 | ||||
| 			// Create a hasher to reuse between invocations
 | ||||
| 			keccak512 := makeHasher(sha3.NewKeccak512()) | ||||
| 			keccak512 := makeHasher(sha3.NewLegacyKeccak512()) | ||||
| 
 | ||||
| 			// Calculate the data segment this thread should generate
 | ||||
| 			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
 | ||||
| // hash and nonce.
 | ||||
| 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 { | ||||
| 		rawData := generateDatasetItem(cache, index, keccak512) | ||||
|  | ||||
| @ -31,9 +31,9 @@ import ( | ||||
| 	"github.com/ethereum/go-ethereum/consensus/misc" | ||||
| 	"github.com/ethereum/go-ethereum/core/state" | ||||
| 	"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/rlp" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| // 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.
 | ||||
| func (ethash *Ethash) SealHash(header *types.Header) (hash common.Hash) { | ||||
| 	hasher := sha3.NewKeccak256() | ||||
| 	hasher := sha3.NewLegacyKeccak256() | ||||
| 
 | ||||
| 	rlp.Encode(hasher, []interface{}{ | ||||
| 		header.ParentHash, | ||||
|  | ||||
| @ -23,9 +23,9 @@ import ( | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"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/rlp" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| // 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 { | ||||
| 		t.Fatalf("Stored header RLP not found") | ||||
| 	} else { | ||||
| 		hasher := sha3.NewKeccak256() | ||||
| 		hasher := sha3.NewLegacyKeccak256() | ||||
| 		hasher.Write(entry) | ||||
| 
 | ||||
| 		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
 | ||||
| 	body := &types.Body{Uncles: []*types.Header{{Extra: []byte("test header")}}} | ||||
| 
 | ||||
| 	hasher := sha3.NewKeccak256() | ||||
| 	hasher := sha3.NewLegacyKeccak256() | ||||
| 	rlp.Encode(hasher, body) | ||||
| 	hash := common.BytesToHash(hasher.Sum(nil)) | ||||
| 
 | ||||
| @ -85,7 +85,7 @@ func TestBodyStorage(t *testing.T) { | ||||
| 	if entry := ReadBodyRLP(db, hash, 0); entry == nil { | ||||
| 		t.Fatalf("Stored body RLP not found") | ||||
| 	} else { | ||||
| 		hasher := sha3.NewKeccak256() | ||||
| 		hasher := sha3.NewLegacyKeccak256() | ||||
| 		hasher.Write(entry) | ||||
| 
 | ||||
| 		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/hexutil" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| @ -109,7 +109,7 @@ func (h *Header) Size() common.StorageSize { | ||||
| } | ||||
| 
 | ||||
| func rlpHash(x interface{}) (h common.Hash) { | ||||
| 	hw := sha3.NewKeccak256() | ||||
| 	hw := sha3.NewLegacyKeccak256() | ||||
| 	rlp.Encode(hw, x) | ||||
| 	hw.Sum(h[:0]) | ||||
| 	return h | ||||
|  | ||||
| @ -24,8 +24,8 @@ import ( | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/common/math" | ||||
| 	"github.com/ethereum/go-ethereum/core/types" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/params" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| @ -387,7 +387,7 @@ func opSha3(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory | ||||
| 	data := memory.Get(offset.Int64(), size.Int64()) | ||||
| 
 | ||||
| 	if interpreter.hasher == nil { | ||||
| 		interpreter.hasher = sha3.NewKeccak256().(keccakState) | ||||
| 		interpreter.hasher = sha3.NewLegacyKeccak256().(keccakState) | ||||
| 	} else { | ||||
| 		interpreter.hasher.Reset() | ||||
| 	} | ||||
|  | ||||
| @ -30,8 +30,8 @@ import ( | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/common/math" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| @ -43,7 +43,7 @@ var errInvalidPubkey = errors.New("invalid secp256k1 public key") | ||||
| 
 | ||||
| // Keccak256 calculates and returns the Keccak256 hash of the input data.
 | ||||
| func Keccak256(data ...[]byte) []byte { | ||||
| 	d := sha3.NewKeccak256() | ||||
| 	d := sha3.NewLegacyKeccak256() | ||||
| 	for _, b := range data { | ||||
| 		d.Write(b) | ||||
| 	} | ||||
| @ -53,7 +53,7 @@ func Keccak256(data ...[]byte) []byte { | ||||
| // Keccak256Hash calculates and returns the Keccak256 hash of the input data,
 | ||||
| // converting it to an internal Hash data structure.
 | ||||
| func Keccak256Hash(data ...[]byte) (h common.Hash) { | ||||
| 	d := sha3.NewKeccak256() | ||||
| 	d := sha3.NewLegacyKeccak256() | ||||
| 	for _, b := range data { | ||||
| 		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.
 | ||||
| func Keccak512(data ...[]byte) []byte { | ||||
| 	d := sha3.NewKeccak512() | ||||
| 	d := sha3.NewLegacyKeccak512() | ||||
| 	for _, b := range data { | ||||
| 		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/core/rawdb" | ||||
| 	"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/log" | ||||
| 	"github.com/ethereum/go-ethereum/trie" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| // 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{ | ||||
| 		d:       d, | ||||
| 		sched:   state.NewStateSync(root, d.stateDB), | ||||
| 		keccak:  sha3.NewKeccak256(), | ||||
| 		keccak:  sha3.NewLegacyKeccak256(), | ||||
| 		tasks:   make(map[common.Hash]*stateTask), | ||||
| 		deliver: make(chan *stateReq), | ||||
| 		cancel:  make(chan struct{}), | ||||
|  | ||||
| @ -27,10 +27,10 @@ import ( | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/common/mclock" | ||||
| 	"github.com/ethereum/go-ethereum/crypto" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/log" | ||||
| 	"github.com/ethereum/go-ethereum/p2p/netutil" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| @ -1234,7 +1234,7 @@ func (net *Network) checkTopicRegister(data *topicRegister) (*pong, error) { | ||||
| } | ||||
| 
 | ||||
| func rlpHash(x interface{}) (h common.Hash) { | ||||
| 	hw := sha3.NewKeccak256() | ||||
| 	hw := sha3.NewLegacyKeccak256() | ||||
| 	rlp.Encode(hw, x) | ||||
| 	hw.Sum(h[:0]) | ||||
| 	return h | ||||
|  | ||||
| @ -23,9 +23,9 @@ import ( | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/common/math" | ||||
| 	"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/rlp" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| // 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(Secp256k1(privkey.PublicKey)) | ||||
| 
 | ||||
| 	h := sha3.NewKeccak256() | ||||
| 	h := sha3.NewLegacyKeccak256() | ||||
| 	rlp.Encode(h, cpy.AppendElements(nil)) | ||||
| 	sig, err := crypto.Sign(h.Sum(nil), privkey) | ||||
| 	if err != nil { | ||||
| @ -69,7 +69,7 @@ func (V4ID) Verify(r *enr.Record, sig []byte) error { | ||||
| 		return fmt.Errorf("invalid public key") | ||||
| 	} | ||||
| 
 | ||||
| 	h := sha3.NewKeccak256() | ||||
| 	h := sha3.NewLegacyKeccak256() | ||||
| 	rlp.Encode(h, r.AppendElements(nil)) | ||||
| 	if !crypto.VerifySignature(entry, h.Sum(nil), sig) { | ||||
| 		return enr.ErrInvalidSig | ||||
|  | ||||
| @ -39,9 +39,9 @@ import ( | ||||
| 	"github.com/ethereum/go-ethereum/crypto" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/ecies" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/secp256k1" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"github.com/golang/snappy" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @ -253,10 +253,10 @@ func (h *encHandshake) secrets(auth, authResp []byte) (secrets, error) { | ||||
| 	} | ||||
| 
 | ||||
| 	// setup sha3 instances for the MACs
 | ||||
| 	mac1 := sha3.NewKeccak256() | ||||
| 	mac1 := sha3.NewLegacyKeccak256() | ||||
| 	mac1.Write(xor(s.MAC, h.respNonce)) | ||||
| 	mac1.Write(auth) | ||||
| 	mac2 := sha3.NewKeccak256() | ||||
| 	mac2 := sha3.NewLegacyKeccak256() | ||||
| 	mac2.Write(xor(s.MAC, h.initNonce)) | ||||
| 	mac2.Write(authResp) | ||||
| 	if h.initiator { | ||||
|  | ||||
| @ -34,9 +34,9 @@ import ( | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	"github.com/ethereum/go-ethereum/crypto" | ||||
| 	"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/rlp" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| func TestSharedSecret(t *testing.T) { | ||||
| @ -334,8 +334,8 @@ func TestRLPXFrameRW(t *testing.T) { | ||||
| 	s1 := secrets{ | ||||
| 		AES:        aesSecret, | ||||
| 		MAC:        macSecret, | ||||
| 		EgressMAC:  sha3.NewKeccak256(), | ||||
| 		IngressMAC: sha3.NewKeccak256(), | ||||
| 		EgressMAC:  sha3.NewLegacyKeccak256(), | ||||
| 		IngressMAC: sha3.NewLegacyKeccak256(), | ||||
| 	} | ||||
| 	s1.EgressMAC.Write(egressMACinit) | ||||
| 	s1.IngressMAC.Write(ingressMACinit) | ||||
| @ -344,8 +344,8 @@ func TestRLPXFrameRW(t *testing.T) { | ||||
| 	s2 := secrets{ | ||||
| 		AES:        aesSecret, | ||||
| 		MAC:        macSecret, | ||||
| 		EgressMAC:  sha3.NewKeccak256(), | ||||
| 		IngressMAC: sha3.NewKeccak256(), | ||||
| 		EgressMAC:  sha3.NewLegacyKeccak256(), | ||||
| 		IngressMAC: sha3.NewLegacyKeccak256(), | ||||
| 	} | ||||
| 	s2.EgressMAC.Write(ingressMACinit) | ||||
| 	s2.IngressMAC.Write(egressMACinit) | ||||
|  | ||||
| @ -26,10 +26,10 @@ import ( | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/crypto" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/log" | ||||
| 	"github.com/ethereum/go-ethereum/p2p/enode" | ||||
| 	"github.com/ethereum/go-ethereum/p2p/enr" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| // func init() {
 | ||||
| @ -48,8 +48,8 @@ func newTestTransport(rpub *ecdsa.PublicKey, fd net.Conn) transport { | ||||
| 	wrapped.rw = newRLPXFrameRW(fd, secrets{ | ||||
| 		MAC:        zero16, | ||||
| 		AES:        zero16, | ||||
| 		IngressMAC: sha3.NewKeccak256(), | ||||
| 		EgressMAC:  sha3.NewKeccak256(), | ||||
| 		IngressMAC: sha3.NewLegacyKeccak256(), | ||||
| 		EgressMAC:  sha3.NewLegacyKeccak256(), | ||||
| 	}) | ||||
| 	return &testTransport{rpub: rpub, rlpx: wrapped} | ||||
| } | ||||
|  | ||||
| @ -15,11 +15,11 @@ import ( | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/crypto" | ||||
| 	"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/sctx" | ||||
| 	"github.com/ethereum/go-ethereum/swarm/storage" | ||||
| 	"golang.org/x/crypto/scrypt" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| 	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) { | ||||
| 	hasher := sha3.NewKeccak256() | ||||
| 	hasher := sha3.NewLegacyKeccak256() | ||||
| 	hasher.Write(append(sessionKey, 0)) | ||||
| 	lookupKey := hasher.Sum(nil) | ||||
| 	hasher.Reset() | ||||
| @ -462,7 +462,7 @@ func DoACT(ctx *cli.Context, privateKey *ecdsa.PrivateKey, salt []byte, grantees | ||||
| 			return nil, nil, nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		hasher := sha3.NewKeccak256() | ||||
| 		hasher := sha3.NewLegacyKeccak256() | ||||
| 		hasher.Write(append(sessionKey, 0)) | ||||
| 		lookupKey := hasher.Sum(nil) | ||||
| 
 | ||||
| @ -484,7 +484,7 @@ func DoACT(ctx *cli.Context, privateKey *ecdsa.PrivateKey, salt []byte, grantees | ||||
| 		if err != nil { | ||||
| 			return nil, nil, nil, err | ||||
| 		} | ||||
| 		hasher := sha3.NewKeccak256() | ||||
| 		hasher := sha3.NewLegacyKeccak256() | ||||
| 		hasher.Write(append(sessionKey, 0)) | ||||
| 		lookupKey := hasher.Sum(nil) | ||||
| 
 | ||||
|  | ||||
| @ -20,8 +20,8 @@ import ( | ||||
| 	"encoding/binary" | ||||
| 	"errors" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/swarm/storage/encryption" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| type RefEncryption struct { | ||||
| @ -39,12 +39,12 @@ func NewRefEncryption(refSize int) *RefEncryption { | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
| 	if err != nil { | ||||
| 		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) | ||||
| 	if err != nil { | ||||
| 		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) { | ||||
| 	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]) | ||||
| 	if err != nil { | ||||
| 		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") | ||||
| 	} | ||||
| 
 | ||||
| 	dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewKeccak256) | ||||
| 	dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewLegacyKeccak256) | ||||
| 	decryptedRef, err := dataEncryption.Decrypt(ref[8:]) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
|  | ||||
| @ -61,7 +61,7 @@ const ( | ||||
| ) | ||||
| 
 | ||||
| // 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 | ||||
| 
 | ||||
| // Hasher a reusable hasher for fixed maximum size chunks representing a BMT
 | ||||
|  | ||||
| @ -26,8 +26,8 @@ import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"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)
 | ||||
| @ -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
 | ||||
| func sha3hash(data ...[]byte) []byte { | ||||
| 	h := sha3.NewKeccak256() | ||||
| 	h := sha3.NewLegacyKeccak256() | ||||
| 	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) { | ||||
| 					data := testutil.RandomBytes(i, length) | ||||
| 					expected := x.expected(data) | ||||
| 					actual := NewRefHasher(sha3.NewKeccak256, segmentCount).Hash(data) | ||||
| 					actual := NewRefHasher(sha3.NewLegacyKeccak256, segmentCount).Hash(data) | ||||
| 					if !bytes.Equal(actual, expected) { | ||||
| 						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
 | ||||
| func TestHasherEmptyData(t *testing.T) { | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	var data []byte | ||||
| 	for _, count := range counts { | ||||
| 		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
 | ||||
| func TestSyncHasherCorrectness(t *testing.T) { | ||||
| 	data := testutil.RandomBytes(1, BufferSize) | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	size := hasher().Size() | ||||
| 
 | ||||
| 	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
 | ||||
| func TestAsyncCorrectness(t *testing.T) { | ||||
| 	data := testutil.RandomBytes(1, BufferSize) | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	size := hasher().Size() | ||||
| 	whs := []whenHash{first, last, random} | ||||
| 
 | ||||
| @ -226,7 +226,7 @@ func TestHasherReuse(t *testing.T) { | ||||
| 
 | ||||
| // tests if bmt reuse is not corrupting result
 | ||||
| func testHasherReuse(poolsize int, t *testing.T) { | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	pool := NewTreePool(hasher, segmentCount, poolsize) | ||||
| 	defer pool.Drain(0) | ||||
| 	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
 | ||||
| func TestBMTConcurrentUse(t *testing.T) { | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	pool := NewTreePool(hasher, segmentCount, PoolSize) | ||||
| 	defer pool.Drain(0) | ||||
| 	cycles := 100 | ||||
| @ -277,7 +277,7 @@ LOOP: | ||||
| // Tests BMT Hasher io.Writer interface is working correctly
 | ||||
| // even multiple short random write buffers
 | ||||
| func TestBMTWriterBuffers(t *testing.T) { | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 
 | ||||
| 	for _, count := range counts { | ||||
| 		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
 | ||||
| func benchmarkSHA3(t *testing.B, n int) { | ||||
| 	data := testutil.RandomBytes(1, n) | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	h := hasher() | ||||
| 
 | ||||
| 	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
 | ||||
| // therefore this serves as a theoretical optimum for concurrent implementations
 | ||||
| func benchmarkBMTBaseline(t *testing.B, n int) { | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	hashSize := hasher().Size() | ||||
| 	data := testutil.RandomBytes(1, hashSize) | ||||
| 
 | ||||
| @ -453,7 +453,7 @@ func benchmarkBMTBaseline(t *testing.B, n int) { | ||||
| // benchmarks BMT Hasher
 | ||||
| func benchmarkBMT(t *testing.B, n int) { | ||||
| 	data := testutil.RandomBytes(1, n) | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	pool := NewTreePool(hasher, segmentCount, PoolSize) | ||||
| 	bmt := New(pool) | ||||
| 
 | ||||
| @ -467,7 +467,7 @@ func benchmarkBMT(t *testing.B, n int) { | ||||
| // benchmarks BMT hasher with asynchronous concurrent segment/section writes
 | ||||
| func benchmarkBMTAsync(t *testing.B, n int, wh whenHash, double bool) { | ||||
| 	data := testutil.RandomBytes(1, n) | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	pool := NewTreePool(hasher, segmentCount, PoolSize) | ||||
| 	bmt := New(pool).NewAsyncWriter(double) | ||||
| 	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
 | ||||
| func benchmarkPool(t *testing.B, poolsize, n int) { | ||||
| 	data := testutil.RandomBytes(1, n) | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	pool := NewTreePool(hasher, segmentCount, poolsize) | ||||
| 	cycles := 100 | ||||
| 
 | ||||
| @ -508,7 +508,7 @@ func benchmarkPool(t *testing.B, poolsize, n int) { | ||||
| // benchmarks the reference hasher
 | ||||
| func benchmarkRefHasher(t *testing.B, n int) { | ||||
| 	data := testutil.RandomBytes(1, n) | ||||
| 	hasher := sha3.NewKeccak256 | ||||
| 	hasher := sha3.NewLegacyKeccak256 | ||||
| 	rbmt := NewRefHasher(hasher, 128) | ||||
| 
 | ||||
| 	t.ReportAllocs() | ||||
|  | ||||
| @ -24,8 +24,8 @@ import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	p2ptest "github.com/ethereum/go-ethereum/p2p/testing" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| func TestStreamerSubscribe(t *testing.T) { | ||||
|  | ||||
| @ -29,7 +29,6 @@ import ( | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/crypto" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/metrics" | ||||
| 	"github.com/ethereum/go-ethereum/p2p" | ||||
| 	"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/storage" | ||||
| 	whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @ -187,7 +187,7 @@ func NewPss(k *network.Kademlia, params *PssParams) (*Pss, error) { | ||||
| 
 | ||||
| 		hashPool: sync.Pool{ | ||||
| 			New: func() interface{} { | ||||
| 				return sha3.NewKeccak256() | ||||
| 				return sha3.NewLegacyKeccak256() | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| @ -24,8 +24,8 @@ import ( | ||||
| 	"io" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"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)) | ||||
| 
 | ||||
| 	rawSha3 := sha3.NewKeccak256() | ||||
| 	rawSha3 := sha3.NewLegacyKeccak256() | ||||
| 	rawSha3.Reset() | ||||
| 	rawSha3.Write(input) | ||||
| 	rawSha3Output := rawSha3.Sum(nil) | ||||
|  | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -21,9 +21,9 @@ import ( | ||||
| 	"fmt" | ||||
| 	"sync/atomic" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	ch "github.com/ethereum/go-ethereum/swarm/chunk" | ||||
| 	"github.com/ethereum/go-ethereum/swarm/storage/encryption" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| 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 { | ||||
| 	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 { | ||||
| 	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) { | ||||
|  | ||||
| @ -26,9 +26,9 @@ import ( | ||||
| 	"io" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/swarm/bmt" | ||||
| 	ch "github.com/ethereum/go-ethereum/swarm/chunk" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| const MaxPO = 16 | ||||
| @ -75,10 +75,10 @@ func MakeHashFunc(hash string) SwarmHasher { | ||||
| 	case "SHA256": | ||||
| 		return func() SwarmHash { return &HashWithLength{crypto.SHA256.New()} } | ||||
| 	case "SHA3": | ||||
| 		return func() SwarmHash { return &HashWithLength{sha3.NewKeccak256()} } | ||||
| 		return func() SwarmHash { return &HashWithLength{sha3.NewLegacyKeccak256()} } | ||||
| 	case "BMT": | ||||
| 		return func() SwarmHash { | ||||
| 			hasher := sha3.NewKeccak256 | ||||
| 			hasher := sha3.NewLegacyKeccak256 | ||||
| 			hasherSize := hasher().Size() | ||||
| 			segmentCount := ch.DefaultSize / hasherSize | ||||
| 			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/vm" | ||||
| 	"github.com/ethereum/go-ethereum/crypto" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/ethdb" | ||||
| 	"github.com/ethereum/go-ethereum/params" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| // 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) { | ||||
| 	hw := sha3.NewKeccak256() | ||||
| 	hw := sha3.NewLegacyKeccak256() | ||||
| 	rlp.Encode(hw, x) | ||||
| 	hw.Sum(h[:0]) | ||||
| 	return h | ||||
|  | ||||
| @ -21,8 +21,8 @@ import ( | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/ethereum/go-ethereum/common" | ||||
| 	"github.com/ethereum/go-ethereum/crypto/sha3" | ||||
| 	"github.com/ethereum/go-ethereum/rlp" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| ) | ||||
| 
 | ||||
| type hasher struct { | ||||
| @ -57,7 +57,7 @@ var hasherPool = sync.Pool{ | ||||
| 	New: func() interface{} { | ||||
| 		return &hasher{ | ||||
| 			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/.
 | ||||
| //
 | ||||
| // 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 | ||||
| 
 | ||||
| // This code is a port of the public domain, “ref10” implementation of ed25519
 | ||||
| @ -31,6 +34,8 @@ const ( | ||||
| 	PrivateKeySize = 64 | ||||
| 	// SignatureSize is the size, in bytes, of signatures generated and verified by this package.
 | ||||
| 	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.
 | ||||
| @ -46,6 +51,15 @@ func (priv PrivateKey) Public() crypto.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.
 | ||||
| // Ed25519 performs two passes over messages to be signed and therefore cannot
 | ||||
| // 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.
 | ||||
| // 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 { | ||||
| 		rand = cryptorand.Reader | ||||
| 	} | ||||
| 
 | ||||
| 	privateKey = make([]byte, PrivateKeySize) | ||||
| 	publicKey = make([]byte, PublicKeySize) | ||||
| 	_, err = io.ReadFull(rand, privateKey[:32]) | ||||
| 	if err != nil { | ||||
| 	seed := make([]byte, SeedSize) | ||||
| 	if _, err := io.ReadFull(rand, seed); err != nil { | ||||
| 		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[31] &= 127 | ||||
| 	digest[31] |= 64 | ||||
| @ -85,10 +113,11 @@ func GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, er | ||||
| 	var publicKeyBytes [32]byte | ||||
| 	A.ToBytes(&publicKeyBytes) | ||||
| 
 | ||||
| 	privateKey := make([]byte, PrivateKeySize) | ||||
| 	copy(privateKey, seed) | ||||
| 	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
 | ||||
| @ -171,9 +200,16 @@ func Verify(publicKey PublicKey, message, sig []byte) bool { | ||||
| 	edwards25519.ScReduce(&hReduced, &digest) | ||||
| 
 | ||||
| 	var R edwards25519.ProjectiveGroupElement | ||||
| 	var b [32]byte | ||||
| 	copy(b[:], sig[32:]) | ||||
| 	edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &b) | ||||
| 	var s [32]byte | ||||
| 	copy(s[:], sig[32:]) | ||||
| 
 | ||||
| 	// 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 | ||||
| 	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 | ||||
| 
 | ||||
| import "encoding/binary" | ||||
| 
 | ||||
| // This code is a port of the public domain, “ref10” implementation of ed25519
 | ||||
| // from SUPERCOP.
 | ||||
| 
 | ||||
| @ -1769,3 +1771,23 @@ func ScReduce(out *[32]byte, s *[64]byte) { | ||||
| 	out[30] = byte(s11 >> 9) | ||||
| 	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 { | ||||
| 			packets.Unread(p) | ||||
| 			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() { | ||||
| 		return nil, errors.StructuralError("primary key cannot be used for signatures") | ||||
| 	} | ||||
| 
 | ||||
| 	var current *Identity | ||||
| 	var revocations []*packet.Signature | ||||
| EachPacket: | ||||
| 	for { | ||||
| @ -347,32 +345,8 @@ EachPacket: | ||||
| 
 | ||||
| 		switch pkt := p.(type) { | ||||
| 		case *packet.UserId: | ||||
| 			current = new(Identity) | ||||
| 			current.Name = pkt.Id | ||||
| 			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) | ||||
| 			if err := addUserID(e, packets, pkt); err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 		case *packet.Signature: | ||||
| 			if pkt.SigType == packet.SigTypeKeyRevocation { | ||||
| @ -381,11 +355,9 @@ EachPacket: | ||||
| 				// TODO: RFC4880 5.2.1 permits signatures
 | ||||
| 				// directly on keys (eg. to bind additional
 | ||||
| 				// 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: | ||||
| 			if pkt.IsSubkey == false { | ||||
| 				packets.Unread(p) | ||||
| @ -426,33 +398,105 @@ EachPacket: | ||||
| 	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 { | ||||
| 	var subKey Subkey | ||||
| 	subKey.PublicKey = pub | ||||
| 	subKey.PrivateKey = priv | ||||
| 	p, err := packets.Next() | ||||
| 	if err == io.EOF { | ||||
| 		return io.ErrUnexpectedEOF | ||||
| 
 | ||||
| 	for { | ||||
| 		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()) | ||||
| 	} | ||||
| 	var ok bool | ||||
| 	subKey.Sig, ok = p.(*packet.Signature) | ||||
| 	if !ok { | ||||
| 
 | ||||
| 	if subKey.Sig == nil { | ||||
| 		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) | ||||
| 
 | ||||
| 	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 | ||||
| 
 | ||||
| // 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 | ||||
| 	e.Identities[uid.Id] = &Identity{ | ||||
| 		Name:   uid.Name, | ||||
| 		Name:   uid.Id, | ||||
| 		UserId: uid, | ||||
| 		SelfSignature: &packet.Signature{ | ||||
| 			CreationTime: currentTime, | ||||
| @ -501,6 +545,10 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err | ||||
| 			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,
 | ||||
| 	// 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)} | ||||
| 	} | ||||
| 
 | ||||
| 	// 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[0] = Subkey{ | ||||
| 		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].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 | ||||
| } | ||||
| 
 | ||||
| // SerializePrivate serializes an Entity, including private key material, to
 | ||||
| // the given Writer. For now, it must only be used on an Entity returned from
 | ||||
| // NewEntity.
 | ||||
| // SerializePrivate serializes an Entity, including private key material, but
 | ||||
| // excluding signatures from other entities, to the given Writer.
 | ||||
| // Identities and subkeys are re-signed in case they changed since NewEntry.
 | ||||
| // If config is nil, sensible defaults will be used.
 | ||||
| func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) { | ||||
| 	err = e.PrivateKey.Serialize(w) | ||||
| @ -569,8 +625,8 @@ func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // Serialize writes the public part of the given Entity to w. (No private
 | ||||
| // key material will be output).
 | ||||
| // Serialize writes the public part of the given Entity to w, including
 | ||||
| // signatures from other entities. No private key material will be output.
 | ||||
| func (e *Entity) Serialize(w io.Writer) error { | ||||
| 	err := e.PrimaryKey.Serialize(w) | ||||
| 	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 { | ||||
| 	case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: | ||||
| 		e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 	case PubKeyAlgoElGamal: | ||||
| 		e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 		e.encryptedMPI2.bytes, e.encryptedMPI2.bitLength, err = readMPI(r) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 	_, err = consumeAll(r) | ||||
| 	return | ||||
| @ -72,7 +78,8 @@ func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error { | ||||
| 	// padding oracle attacks.
 | ||||
| 	switch priv.PubKeyAlgo { | ||||
| 	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: | ||||
| 		c1 := new(big.Int).SetBytes(e.encryptedMPI1.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/cipher" | ||||
| 	"crypto/des" | ||||
| 	"golang.org/x/crypto/cast5" | ||||
| 	"golang.org/x/crypto/openpgp/errors" | ||||
| 	"crypto/rsa" | ||||
| 	"io" | ||||
| 	"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
 | ||||
| @ -402,14 +404,16 @@ const ( | ||||
| type PublicKeyAlgorithm uint8 | ||||
| 
 | ||||
| const ( | ||||
| 	PubKeyAlgoRSA            PublicKeyAlgorithm = 1 | ||||
| 	PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 | ||||
| 	PubKeyAlgoRSASignOnly    PublicKeyAlgorithm = 3 | ||||
| 	PubKeyAlgoElGamal        PublicKeyAlgorithm = 16 | ||||
| 	PubKeyAlgoDSA            PublicKeyAlgorithm = 17 | ||||
| 	PubKeyAlgoRSA     PublicKeyAlgorithm = 1 | ||||
| 	PubKeyAlgoElGamal PublicKeyAlgorithm = 16 | ||||
| 	PubKeyAlgoDSA     PublicKeyAlgorithm = 17 | ||||
| 	// RFC 6637, Section 5.
 | ||||
| 	PubKeyAlgoECDH  PublicKeyAlgorithm = 18 | ||||
| 	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
 | ||||
| @ -500,19 +504,17 @@ func readMPI(r io.Reader) (mpi []byte, bitLength uint16, err error) { | ||||
| 	numBytes := (int(bitLength) + 7) / 8 | ||||
| 	mpi = make([]byte, numBytes) | ||||
| 	_, err = readFull(r, mpi) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // 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 | ||||
| 	// 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.
 | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // writeMPI serializes a big integer to w.
 | ||||
| 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)}) | ||||
| 	if err == nil { | ||||
| 		_, 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()) | ||||
| } | ||||
| 
 | ||||
| // 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
 | ||||
| // supported by OpenPGP (except for BZIP2, which is not currently
 | ||||
| // 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 | ||||
| } | ||||
| 
 | ||||
| // NewSignerPrivateKey creates a sign-only PrivateKey from a crypto.Signer that
 | ||||
| // NewSignerPrivateKey creates a PrivateKey from a crypto.Signer that
 | ||||
| // implements RSA or ECDSA.
 | ||||
| func NewSignerPrivateKey(currentTime time.Time, signer crypto.Signer) *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) { | ||||
| 	case *rsa.PublicKey: | ||||
| 		pk.PublicKey = *NewRSAPublicKey(currentTime, pubkey) | ||||
| 	case rsa.PublicKey: | ||||
| 		pk.PublicKey = *NewRSAPublicKey(currentTime, &pubkey) | ||||
| 		pk.PubKeyAlgo = PubKeyAlgoRSASignOnly | ||||
| 	case *ecdsa.PublicKey: | ||||
| 		pk.PublicKey = *NewECDSAPublicKey(currentTime, pubkey) | ||||
| 	case ecdsa.PublicKey: | ||||
| 		pk.PublicKey = *NewECDSAPublicKey(currentTime, &pubkey) | ||||
| 	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.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() | ||||
| 	return pk | ||||
| @ -515,7 +520,7 @@ func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err erro | ||||
| 	switch pk.PubKeyAlgo { | ||||
| 	case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: | ||||
| 		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 { | ||||
| 			return errors.SignatureError("RSA verification failure") | ||||
| 		} | ||||
| @ -566,7 +571,7 @@ func (pk *PublicKey) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err | ||||
| 	switch pk.PubKeyAlgo { | ||||
| 	case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: | ||||
| 		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 | ||||
|  | ||||
							
								
								
									
										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) | ||||
| 		} else { | ||||
| 			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 { | ||||
| 				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
 | ||||
| // JPEG File Interchange Format (JFIF), for each photo in the
 | ||||
| // the user attribute packet.
 | ||||
| // user attribute packet.
 | ||||
| func (uat *UserAttribute) ImageData() (imageData [][]byte) { | ||||
| 	for _, sp := range uat.Contents { | ||||
| 		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 | ||||
| } | ||||
| 
 | ||||
| // 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) { | ||||
| // writeAndSign writes the data as a payload package 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 writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { | ||||
| 	var signer *packet.PrivateKey | ||||
| 	if signed != nil { | ||||
| 		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.
 | ||||
| 	candidateCiphers := []uint8{ | ||||
| 		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.
 | ||||
| 	candidateHashes := []uint8{ | ||||
| 		hashToHashId(crypto.SHA256), | ||||
| 		hashToHashId(crypto.SHA384), | ||||
| 		hashToHashId(crypto.SHA512), | ||||
| 		hashToHashId(crypto.SHA1), | ||||
| 		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()) | ||||
| 	if _, err := io.ReadFull(config.Random(), symKey); err != nil { | ||||
| 		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 { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if signer != nil { | ||||
| 		ops := &packet.OnePassSignature{ | ||||
| 			SigType:    packet.SigTypeBinary, | ||||
| 			Hash:       hash, | ||||
| 			PubKeyAlgo: signer.PubKeyAlgo, | ||||
| 			KeyId:      signer.KeyId, | ||||
| 			IsLast:     true, | ||||
| 		} | ||||
| 		if err := ops.Serialize(encryptedData); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	return writeAndSign(payload, candidateHashes, signed, hints, config) | ||||
| } | ||||
| 
 | ||||
| // Sign signs a message. The resulting WriteCloser must be closed after the
 | ||||
| // contents of the file have been written.  hints contains optional information
 | ||||
| // that aids the recipients in processing the message.
 | ||||
| // 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 signed == nil { | ||||
| 		return nil, errors.InvalidArgumentError("no signer provided") | ||||
| 	} | ||||
| 
 | ||||
| 	if hints == nil { | ||||
| 		hints = &FileHints{} | ||||
| 	// These are the possible hash functions that we'll use for the signature.
 | ||||
| 	candidateHashes := []uint8{ | ||||
| 		hashToHashId(crypto.SHA256), | ||||
| 		hashToHashId(crypto.SHA384), | ||||
| 		hashToHashId(crypto.SHA512), | ||||
| 		hashToHashId(crypto.SHA1), | ||||
| 		hashToHashId(crypto.RIPEMD160), | ||||
| 	} | ||||
| 
 | ||||
| 	w := encryptedData | ||||
| 	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{encryptedData} | ||||
| 
 | ||||
| 	defaultHashes := candidateHashes[len(candidateHashes)-1:] | ||||
| 	preferredHashes := signed.primaryIdentity().SelfSignature.PreferredHash | ||||
| 	if len(preferredHashes) == 0 { | ||||
| 		preferredHashes = defaultHashes | ||||
| 	} | ||||
| 	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{encryptedData, literalData, hash, hash.New(), signer, config}, nil | ||||
| 	} | ||||
| 	return literalData, nil | ||||
| 	candidateHashes = intersectPreferences(candidateHashes, preferredHashes) | ||||
| 	return writeAndSign(noOpCloser{output}, candidateHashes, signed, hints, config) | ||||
| } | ||||
| 
 | ||||
| // 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 // 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:
 | ||||
| // 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 | ||||
| 
 | ||||
| import ( | ||||
| 	"math/bits" | ||||
| ) | ||||
| 
 | ||||
| // work buffer indices and roll amounts for one line
 | ||||
| var _n = [80]uint{ | ||||
| 	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 | ||||
| 		for i < 16 { | ||||
| 			alpha = a + (b ^ c ^ d) + x[_n[i]] | ||||
| 			s := _r[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | ||||
| 			beta = c<<10 | c>>22 | ||||
| 			s := int(_r[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + e | ||||
| 			beta = bits.RotateLeft32(c, 10) | ||||
| 			a, b, c, d, e = e, alpha, b, beta, d | ||||
| 
 | ||||
| 			// parallel line
 | ||||
| 			alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 | ||||
| 			s = r_[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | ||||
| 			beta = cc<<10 | cc>>22 | ||||
| 			s = int(r_[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||
| 			beta = bits.RotateLeft32(cc, 10) | ||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||
| 
 | ||||
| 			i++ | ||||
| @ -77,16 +81,16 @@ func _Block(md *digest, p []byte) int { | ||||
| 		// round 2
 | ||||
| 		for i < 32 { | ||||
| 			alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 | ||||
| 			s := _r[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | ||||
| 			beta = c<<10 | c>>22 | ||||
| 			s := int(_r[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + e | ||||
| 			beta = bits.RotateLeft32(c, 10) | ||||
| 			a, b, c, d, e = e, alpha, b, beta, d | ||||
| 
 | ||||
| 			// parallel line
 | ||||
| 			alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 | ||||
| 			s = r_[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | ||||
| 			beta = cc<<10 | cc>>22 | ||||
| 			s = int(r_[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||
| 			beta = bits.RotateLeft32(cc, 10) | ||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||
| 
 | ||||
| 			i++ | ||||
| @ -95,16 +99,16 @@ func _Block(md *digest, p []byte) int { | ||||
| 		// round 3
 | ||||
| 		for i < 48 { | ||||
| 			alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 | ||||
| 			s := _r[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | ||||
| 			beta = c<<10 | c>>22 | ||||
| 			s := int(_r[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + e | ||||
| 			beta = bits.RotateLeft32(c, 10) | ||||
| 			a, b, c, d, e = e, alpha, b, beta, d | ||||
| 
 | ||||
| 			// parallel line
 | ||||
| 			alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 | ||||
| 			s = r_[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | ||||
| 			beta = cc<<10 | cc>>22 | ||||
| 			s = int(r_[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||
| 			beta = bits.RotateLeft32(cc, 10) | ||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||
| 
 | ||||
| 			i++ | ||||
| @ -113,16 +117,16 @@ func _Block(md *digest, p []byte) int { | ||||
| 		// round 4
 | ||||
| 		for i < 64 { | ||||
| 			alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc | ||||
| 			s := _r[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | ||||
| 			beta = c<<10 | c>>22 | ||||
| 			s := int(_r[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + e | ||||
| 			beta = bits.RotateLeft32(c, 10) | ||||
| 			a, b, c, d, e = e, alpha, b, beta, d | ||||
| 
 | ||||
| 			// parallel line
 | ||||
| 			alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 | ||||
| 			s = r_[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | ||||
| 			beta = cc<<10 | cc>>22 | ||||
| 			s = int(r_[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||
| 			beta = bits.RotateLeft32(cc, 10) | ||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||
| 
 | ||||
| 			i++ | ||||
| @ -131,16 +135,16 @@ func _Block(md *digest, p []byte) int { | ||||
| 		// round 5
 | ||||
| 		for i < 80 { | ||||
| 			alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e | ||||
| 			s := _r[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + e | ||||
| 			beta = c<<10 | c>>22 | ||||
| 			s := int(_r[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + e | ||||
| 			beta = bits.RotateLeft32(c, 10) | ||||
| 			a, b, c, d, e = e, alpha, b, beta, d | ||||
| 
 | ||||
| 			// parallel line
 | ||||
| 			alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] | ||||
| 			s = r_[i] | ||||
| 			alpha = (alpha<<s | alpha>>(32-s)) + ee | ||||
| 			beta = cc<<10 | cc>>22 | ||||
| 			s = int(r_[i]) | ||||
| 			alpha = bits.RotateLeft32(alpha, s) + ee | ||||
| 			beta = bits.RotateLeft32(cc, 10) | ||||
| 			aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd | ||||
| 
 | ||||
| 			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,
 | ||||
| // 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) { | ||||
| 	w0 := tmp[0] ^ in[0] | ||||
| 	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
 | ||||
| // 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
 | ||||
| // 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
 | ||||
| // repeated until all the input has been "absorbed". The input is then padded.
 | ||||
| // The digest is "squeezed" from the sponge in the same way, except that output
 | ||||
| // output is copied out instead of input being XORed in.
 | ||||
| // is copied out instead of input being XORed in.
 | ||||
| //
 | ||||
| // A sponge is parameterized by its generic security strength, which is equal
 | ||||
| // to half its capacity; capacity + rate is equal to the permutation's width.
 | ||||
| @ -63,4 +63,4 @@ | ||||
| // They produce output of the same length, with the same security strengths
 | ||||
| // against all attacks. This means, in particular, that SHA3-256 only has
 | ||||
| // 128-bit collision resistance, because its output length is 32 bytes.
 | ||||
| package sha3 | ||||
| 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" | ||||
| ) | ||||
| 
 | ||||
| // 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.
 | ||||
| // Its generic security strength is 224 bits against preimage attacks,
 | ||||
| // and 112 bits against collision attacks.
 | ||||
| func New224() hash.Hash { return &state{rate: 144, outputLen: 28, dsbyte: 0x06} } | ||||
| 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.
 | ||||
| // Its generic security strength is 256 bits against preimage attacks,
 | ||||
| // and 128 bits against collision attacks.
 | ||||
| func New256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x06} } | ||||
| 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.
 | ||||
| // Its generic security strength is 384 bits against preimage attacks,
 | ||||
| // and 192 bits against collision attacks.
 | ||||
| func New384() hash.Hash { return &state{rate: 104, outputLen: 48, dsbyte: 0x06} } | ||||
| 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.
 | ||||
| // Its generic security strength is 512 bits against preimage attacks,
 | ||||
| // and 256 bits against collision attacks.
 | ||||
| func New512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x06} } | ||||
| 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.
 | ||||
| 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
 | ||||
| 
 | ||||
| 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.
 | ||||
| // Its generic security strength is 128 bits against all attacks if at
 | ||||
| // least 32 bytes of its output are used.
 | ||||
| func NewShake128() ShakeHash { return &state{rate: 168, dsbyte: 0x1f} } | ||||
| 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
 | ||||
| // 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.
 | ||||
| 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 | ||||
| 
 | ||||
| // 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 { | ||||
| 	Nonce           []byte | ||||
| 	Key             PublicKey | ||||
| @ -220,6 +222,11 @@ type openSSHCertSigner struct { | ||||
| 	signer Signer | ||||
| } | ||||
| 
 | ||||
| type algorithmOpenSSHCertSigner struct { | ||||
| 	*openSSHCertSigner | ||||
| 	algorithmSigner AlgorithmSigner | ||||
| } | ||||
| 
 | ||||
| // 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
 | ||||
| // 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 &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) { | ||||
| @ -239,6 +251,10 @@ func (s *openSSHCertSigner) PublicKey() PublicKey { | ||||
| 	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" | ||||
| 
 | ||||
| // 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.
 | ||||
| func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { | ||||
| 	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
 | ||||
| 		// serverAuthenticate
 | ||||
| 		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
 | ||||
| // sentClose. This method takes the lock c.writeMu.
 | ||||
| func (c *channel) writePacket(packet []byte) error { | ||||
| 	c.writeMu.Lock() | ||||
| 	if c.sentClose { | ||||
| 		c.writeMu.Unlock() | ||||
| func (ch *channel) writePacket(packet []byte) error { | ||||
| 	ch.writeMu.Lock() | ||||
| 	if ch.sentClose { | ||||
| 		ch.writeMu.Unlock() | ||||
| 		return io.EOF | ||||
| 	} | ||||
| 	c.sentClose = (packet[0] == msgChannelClose) | ||||
| 	err := c.mux.conn.writePacket(packet) | ||||
| 	c.writeMu.Unlock() | ||||
| 	ch.sentClose = (packet[0] == msgChannelClose) | ||||
| 	err := ch.mux.conn.writePacket(packet) | ||||
| 	ch.writeMu.Unlock() | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func (c *channel) sendMessage(msg interface{}) error { | ||||
| func (ch *channel) sendMessage(msg interface{}) error { | ||||
| 	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) | ||||
| 	binary.BigEndian.PutUint32(p[1:], c.remoteId) | ||||
| 	return c.writePacket(p) | ||||
| 	binary.BigEndian.PutUint32(p[1:], ch.remoteId) | ||||
| 	return ch.writePacket(p) | ||||
| } | ||||
| 
 | ||||
| // WriteExtended writes data to a specific extended stream. These streams are
 | ||||
| // used, for example, for stderr.
 | ||||
| func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { | ||||
| 	if c.sentEOF { | ||||
| func (ch *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { | ||||
| 	if ch.sentEOF { | ||||
| 		return 0, io.EOF | ||||
| 	} | ||||
| 	// 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 | ||||
| 	} | ||||
| 
 | ||||
| 	c.writeMu.Lock() | ||||
| 	packet := c.packetPool[extendedCode] | ||||
| 	ch.writeMu.Lock() | ||||
| 	packet := ch.packetPool[extendedCode] | ||||
| 	// We don't remove the buffer from packetPool, so
 | ||||
| 	// WriteExtended calls from different goroutines will be
 | ||||
| 	// flagged as errors by the race detector.
 | ||||
| 	c.writeMu.Unlock() | ||||
| 	ch.writeMu.Unlock() | ||||
| 
 | ||||
| 	for len(data) > 0 { | ||||
| 		space := min(c.maxRemotePayload, len(data)) | ||||
| 		if space, err = c.remoteWin.reserve(space); err != nil { | ||||
| 		space := min(ch.maxRemotePayload, len(data)) | ||||
| 		if space, err = ch.remoteWin.reserve(space); err != nil { | ||||
| 			return n, err | ||||
| 		} | ||||
| 		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] | ||||
| 
 | ||||
| 		packet[0] = opCode | ||||
| 		binary.BigEndian.PutUint32(packet[1:], c.remoteId) | ||||
| 		binary.BigEndian.PutUint32(packet[1:], ch.remoteId) | ||||
| 		if extendedCode > 0 { | ||||
| 			binary.BigEndian.PutUint32(packet[5:], uint32(extendedCode)) | ||||
| 		} | ||||
| 		binary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo))) | ||||
| 		copy(packet[headerLength:], todo) | ||||
| 		if err = c.writePacket(packet); err != nil { | ||||
| 		if err = ch.writePacket(packet); err != nil { | ||||
| 			return n, err | ||||
| 		} | ||||
| 
 | ||||
| @ -276,14 +276,14 @@ func (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err er | ||||
| 		data = data[len(todo):] | ||||
| 	} | ||||
| 
 | ||||
| 	c.writeMu.Lock() | ||||
| 	c.packetPool[extendedCode] = packet | ||||
| 	c.writeMu.Unlock() | ||||
| 	ch.writeMu.Lock() | ||||
| 	ch.packetPool[extendedCode] = packet | ||||
| 	ch.writeMu.Unlock() | ||||
| 
 | ||||
| 	return n, err | ||||
| } | ||||
| 
 | ||||
| func (c *channel) handleData(packet []byte) error { | ||||
| func (ch *channel) handleData(packet []byte) error { | ||||
| 	headerLen := 9 | ||||
| 	isExtendedData := packet[0] == msgChannelExtendedData | ||||
| 	if isExtendedData { | ||||
| @ -303,7 +303,7 @@ func (c *channel) handleData(packet []byte) error { | ||||
| 	if length == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if length > c.maxIncomingPayload { | ||||
| 	if length > ch.maxIncomingPayload { | ||||
| 		// TODO(hanwen): should send Disconnect?
 | ||||
| 		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") | ||||
| 	} | ||||
| 
 | ||||
| 	c.windowMu.Lock() | ||||
| 	if c.myWindow < length { | ||||
| 		c.windowMu.Unlock() | ||||
| 	ch.windowMu.Lock() | ||||
| 	if ch.myWindow < length { | ||||
| 		ch.windowMu.Unlock() | ||||
| 		// TODO(hanwen): should send Disconnect with reason?
 | ||||
| 		return errors.New("ssh: remote side wrote too much") | ||||
| 	} | ||||
| 	c.myWindow -= length | ||||
| 	c.windowMu.Unlock() | ||||
| 	ch.myWindow -= length | ||||
| 	ch.windowMu.Unlock() | ||||
| 
 | ||||
| 	if extended == 1 { | ||||
| 		c.extPending.write(data) | ||||
| 		ch.extPending.write(data) | ||||
| 	} else if extended > 0 { | ||||
| 		// discard other extended data.
 | ||||
| 	} else { | ||||
| 		c.pending.write(data) | ||||
| 		ch.pending.write(data) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| @ -384,31 +384,31 @@ func (c *channel) close() { | ||||
| // responseMessageReceived is called when a success or failure message is
 | ||||
| // received on a channel to check that such a message is reasonable for the
 | ||||
| // given channel.
 | ||||
| func (c *channel) responseMessageReceived() error { | ||||
| 	if c.direction == channelInbound { | ||||
| func (ch *channel) responseMessageReceived() error { | ||||
| 	if ch.direction == channelInbound { | ||||
| 		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") | ||||
| 	} | ||||
| 	c.decided = true | ||||
| 	ch.decided = true | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (c *channel) handlePacket(packet []byte) error { | ||||
| func (ch *channel) handlePacket(packet []byte) error { | ||||
| 	switch packet[0] { | ||||
| 	case msgChannelData, msgChannelExtendedData: | ||||
| 		return c.handleData(packet) | ||||
| 		return ch.handleData(packet) | ||||
| 	case msgChannelClose: | ||||
| 		c.sendMessage(channelCloseMsg{PeersId: c.remoteId}) | ||||
| 		c.mux.chanList.remove(c.localId) | ||||
| 		c.close() | ||||
| 		ch.sendMessage(channelCloseMsg{PeersID: ch.remoteId}) | ||||
| 		ch.mux.chanList.remove(ch.localId) | ||||
| 		ch.close() | ||||
| 		return nil | ||||
| 	case msgChannelEOF: | ||||
| 		// RFC 4254 is mute on how EOF affects dataExt messages but
 | ||||
| 		// it is logical to signal EOF at the same time.
 | ||||
| 		c.extPending.eof() | ||||
| 		c.pending.eof() | ||||
| 		ch.extPending.eof() | ||||
| 		ch.pending.eof() | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| @ -419,24 +419,24 @@ func (c *channel) handlePacket(packet []byte) error { | ||||
| 
 | ||||
| 	switch msg := decoded.(type) { | ||||
| 	case *channelOpenFailureMsg: | ||||
| 		if err := c.responseMessageReceived(); err != nil { | ||||
| 		if err := ch.responseMessageReceived(); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		c.mux.chanList.remove(msg.PeersId) | ||||
| 		c.msg <- msg | ||||
| 		ch.mux.chanList.remove(msg.PeersID) | ||||
| 		ch.msg <- msg | ||||
| 	case *channelOpenConfirmMsg: | ||||
| 		if err := c.responseMessageReceived(); err != nil { | ||||
| 		if err := ch.responseMessageReceived(); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { | ||||
| 			return fmt.Errorf("ssh: invalid MaxPacketSize %d from peer", msg.MaxPacketSize) | ||||
| 		} | ||||
| 		c.remoteId = msg.MyId | ||||
| 		c.maxRemotePayload = msg.MaxPacketSize | ||||
| 		c.remoteWin.add(msg.MyWindow) | ||||
| 		c.msg <- msg | ||||
| 		ch.remoteId = msg.MyID | ||||
| 		ch.maxRemotePayload = msg.MaxPacketSize | ||||
| 		ch.remoteWin.add(msg.MyWindow) | ||||
| 		ch.msg <- msg | ||||
| 	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) | ||||
| 		} | ||||
| 	case *channelRequestMsg: | ||||
| @ -444,12 +444,12 @@ func (c *channel) handlePacket(packet []byte) error { | ||||
| 			Type:      msg.Request, | ||||
| 			WantReply: msg.WantReply, | ||||
| 			Payload:   msg.RequestSpecificData, | ||||
| 			ch:        c, | ||||
| 			ch:        ch, | ||||
| 		} | ||||
| 
 | ||||
| 		c.incomingRequests <- &req | ||||
| 		ch.incomingRequests <- &req | ||||
| 	default: | ||||
| 		c.msg <- msg | ||||
| 		ch.msg <- msg | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| @ -488,23 +488,23 @@ func (e *extChannel) Read(data []byte) (n int, err error) { | ||||
| 	return e.ch.ReadExtended(data, e.code) | ||||
| } | ||||
| 
 | ||||
| func (c *channel) Accept() (Channel, <-chan *Request, error) { | ||||
| 	if c.decided { | ||||
| func (ch *channel) Accept() (Channel, <-chan *Request, error) { | ||||
| 	if ch.decided { | ||||
| 		return nil, nil, errDecidedAlready | ||||
| 	} | ||||
| 	c.maxIncomingPayload = channelMaxPacket | ||||
| 	ch.maxIncomingPayload = channelMaxPacket | ||||
| 	confirm := channelOpenConfirmMsg{ | ||||
| 		PeersId:       c.remoteId, | ||||
| 		MyId:          c.localId, | ||||
| 		MyWindow:      c.myWindow, | ||||
| 		MaxPacketSize: c.maxIncomingPayload, | ||||
| 		PeersID:       ch.remoteId, | ||||
| 		MyID:          ch.localId, | ||||
| 		MyWindow:      ch.myWindow, | ||||
| 		MaxPacketSize: ch.maxIncomingPayload, | ||||
| 	} | ||||
| 	c.decided = true | ||||
| 	if err := c.sendMessage(confirm); err != nil { | ||||
| 	ch.decided = true | ||||
| 	if err := ch.sendMessage(confirm); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return c, c.incomingRequests, nil | ||||
| 	return ch, ch.incomingRequests, nil | ||||
| } | ||||
| 
 | ||||
| func (ch *channel) Reject(reason RejectionReason, message string) error { | ||||
| @ -512,7 +512,7 @@ func (ch *channel) Reject(reason RejectionReason, message string) error { | ||||
| 		return errDecidedAlready | ||||
| 	} | ||||
| 	reject := channelOpenFailureMsg{ | ||||
| 		PeersId:  ch.remoteId, | ||||
| 		PeersID:  ch.remoteId, | ||||
| 		Reason:   reason, | ||||
| 		Message:  message, | ||||
| 		Language: "en", | ||||
| @ -541,7 +541,7 @@ func (ch *channel) CloseWrite() error { | ||||
| 	} | ||||
| 	ch.sentEOF = true | ||||
| 	return ch.sendMessage(channelEOFMsg{ | ||||
| 		PeersId: ch.remoteId}) | ||||
| 		PeersID: ch.remoteId}) | ||||
| } | ||||
| 
 | ||||
| func (ch *channel) Close() error { | ||||
| @ -550,7 +550,7 @@ func (ch *channel) Close() error { | ||||
| 	} | ||||
| 
 | ||||
| 	return ch.sendMessage(channelCloseMsg{ | ||||
| 		PeersId: ch.remoteId}) | ||||
| 		PeersID: ch.remoteId}) | ||||
| } | ||||
| 
 | ||||
| // 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{ | ||||
| 		PeersId:             ch.remoteId, | ||||
| 		PeersID:             ch.remoteId, | ||||
| 		Request:             name, | ||||
| 		WantReply:           wantReply, | ||||
| 		RequestSpecificData: payload, | ||||
| @ -614,11 +614,11 @@ func (ch *channel) ackRequest(ok bool) error { | ||||
| 	var msg interface{} | ||||
| 	if !ok { | ||||
| 		msg = channelRequestFailureMsg{ | ||||
| 			PeersId: ch.remoteId, | ||||
| 			PeersID: ch.remoteId, | ||||
| 		} | ||||
| 	} else { | ||||
| 		msg = channelRequestSuccessMsg{ | ||||
| 			PeersId: ch.remoteId, | ||||
| 			PeersID: ch.remoteId, | ||||
| 		} | ||||
| 	} | ||||
| 	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" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"math/bits" | ||||
| 
 | ||||
| 	"golang.org/x/crypto/internal/chacha20" | ||||
| 	"golang.org/x/crypto/poly1305" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| @ -53,78 +57,78 @@ func newRC4(key, iv []byte) (cipher.Stream, error) { | ||||
| 	return rc4.NewCipher(key) | ||||
| } | ||||
| 
 | ||||
| type streamCipherMode struct { | ||||
| 	keySize    int | ||||
| 	ivSize     int | ||||
| 	skip       int | ||||
| 	createFunc func(key, iv []byte) (cipher.Stream, error) | ||||
| type cipherMode struct { | ||||
| 	keySize int | ||||
| 	ivSize  int | ||||
| 	create  func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) | ||||
| } | ||||
| 
 | ||||
| func (c *streamCipherMode) createStream(key, iv []byte) (cipher.Stream, error) { | ||||
| 	if len(key) < c.keySize { | ||||
| 		panic("ssh: key length too small for cipher") | ||||
| 	} | ||||
| 	if len(iv) < c.ivSize { | ||||
| 		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) | ||||
| func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream, error)) func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | ||||
| 	return func(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { | ||||
| 		stream, err := createFunc(key, iv) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		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
 | ||||
| // are not supported and will not be negotiated, even if explicitly requested in
 | ||||
| // ClientConfig.Crypto.Ciphers.
 | ||||
| var cipherModes = map[string]*streamCipherMode{ | ||||
| var cipherModes = map[string]*cipherMode{ | ||||
| 	// Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms
 | ||||
| 	// are defined in the order specified in the RFC.
 | ||||
| 	"aes128-ctr": {16, aes.BlockSize, 0, newAESCTR}, | ||||
| 	"aes192-ctr": {24, aes.BlockSize, 0, newAESCTR}, | ||||
| 	"aes256-ctr": {32, aes.BlockSize, 0, newAESCTR}, | ||||
| 	"aes128-ctr": {16, aes.BlockSize, streamCipherMode(0, newAESCTR)}, | ||||
| 	"aes192-ctr": {24, aes.BlockSize, streamCipherMode(0, newAESCTR)}, | ||||
| 	"aes256-ctr": {32, aes.BlockSize, streamCipherMode(0, newAESCTR)}, | ||||
| 
 | ||||
| 	// Ciphers from RFC4345, which introduces security-improved arcfour ciphers.
 | ||||
| 	// They are defined in the order specified in the RFC.
 | ||||
| 	"arcfour128": {16, 0, 1536, newRC4}, | ||||
| 	"arcfour256": {32, 0, 1536, newRC4}, | ||||
| 	"arcfour128": {16, 0, streamCipherMode(1536, newRC4)}, | ||||
| 	"arcfour256": {32, 0, streamCipherMode(1536, newRC4)}, | ||||
| 
 | ||||
| 	// 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
 | ||||
| 	// RC4) has problems with weak keys, and should be used with caution."
 | ||||
| 	// 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
 | ||||
| 	// special case. If we add any more non-stream ciphers, we
 | ||||
| 	// should invest a cleaner way to do this.
 | ||||
| 	gcmCipherID: {16, 12, 0, nil}, | ||||
| 	// AEAD ciphers
 | ||||
| 	gcmCipherID:        {16, 12, newGCMCipher}, | ||||
| 	chacha20Poly1305ID: {64, 0, newChaCha20Cipher}, | ||||
| 
 | ||||
| 	// 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
 | ||||
| 	// needed, it's possible to specify a custom Config to enable it.
 | ||||
| 	// You should expect that an active attacker can recover plaintext if
 | ||||
| 	// you do.
 | ||||
| 	aes128cbcID: {16, aes.BlockSize, 0, nil}, | ||||
| 	aes128cbcID: {16, aes.BlockSize, newAESCBCCipher}, | ||||
| 
 | ||||
| 	// 3des-cbc is insecure and is disabled by default.
 | ||||
| 	tripledescbcID: {24, des.BlockSize, 0, nil}, | ||||
| 	// 3des-cbc is insecure and is not included in the default
 | ||||
| 	// config.
 | ||||
| 	tripledescbcID: {24, des.BlockSize, newTripleDESCBCCipher}, | ||||
| } | ||||
| 
 | ||||
| // prefixLen is the length of the packet prefix that contains the packet length
 | ||||
| @ -304,7 +308,7 @@ type gcmCipher struct { | ||||
| 	buf    []byte | ||||
| } | ||||
| 
 | ||||
| func newGCMCipher(iv, key []byte) (packetCipher, error) { | ||||
| func newGCMCipher(key, iv, unusedMacKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { | ||||
| 	c, err := aes.NewCipher(key) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @ -372,7 +376,7 @@ func (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { | ||||
| 	} | ||||
| 	length := binary.BigEndian.Uint32(c.prefix[:]) | ||||
| 	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) { | ||||
| @ -422,7 +426,7 @@ type cbcCipher struct { | ||||
| 	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{ | ||||
| 		mac:        macModes[algs.MAC].new(macKey), | ||||
| 		decrypter:  cipher.NewCBCDecrypter(c, iv), | ||||
| @ -436,13 +440,13 @@ func newCBCCipher(c cipher.Block, iv, key, macKey []byte, algs directionAlgorith | ||||
| 	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) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	cbc, err := newCBCCipher(c, iv, key, macKey, algs) | ||||
| 	cbc, err := newCBCCipher(c, key, iv, macKey, algs) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -450,13 +454,13 @@ func newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCi | ||||
| 	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) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	cbc, err := newCBCCipher(c, iv, key, macKey, algs) | ||||
| 	cbc, err := newCBCCipher(c, key, iv, macKey, algs) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -548,11 +552,11 @@ func (c *cbcCipher) readPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) | ||||
| 		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 | ||||
| 	} else { | ||||
| 		c.oracleCamouflage -= uint32(n) | ||||
| 	} | ||||
| 	c.oracleCamouflage -= uint32(n) | ||||
| 
 | ||||
| 	remainingCrypted := c.packetData[firstBlockLength:macStart] | ||||
| 	c.decrypter.CryptBlocks(remainingCrypted, remainingCrypted) | ||||
| @ -627,3 +631,140 @@ func (c *cbcCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, pack | ||||
| 
 | ||||
| 	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" | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"os" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| ) | ||||
| @ -18,6 +19,8 @@ import ( | ||||
| type Client struct { | ||||
| 	Conn | ||||
| 
 | ||||
| 	handleForwardsOnce sync.Once // guards calling (*Client).handleForwards
 | ||||
| 
 | ||||
| 	forwards        forwardList // forwarded tcpip connections from the remote side
 | ||||
| 	mu              sync.Mutex | ||||
| 	channelHandlers map[string]chan NewChannel | ||||
| @ -59,8 +62,6 @@ func NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client { | ||||
| 		conn.Wait() | ||||
| 		conn.forwards.closeAll() | ||||
| 	}() | ||||
| 	go conn.forwards.handleChannels(conn.HandleChannelOpen("forwarded-tcpip")) | ||||
| 	go conn.forwards.handleChannels(conn.HandleChannelOpen("forwarded-streamlocal@openssh.com")) | ||||
| 	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
 | ||||
| // an error to reject it. It receives the hostname as passed to Dial
 | ||||
| // 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 | ||||
| 
 | ||||
| // 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
 | ||||
| // modified after having been passed to an SSH function.
 | ||||
| type ClientConfig struct { | ||||
| @ -209,6 +214,12 @@ type ClientConfig struct { | ||||
| 	// FixedHostKey can be used for simplistic host key checks.
 | ||||
| 	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
 | ||||
| 	// be used for the connection. If empty, a reasonable default is used.
 | ||||
| 	ClientVersion string | ||||
| @ -255,3 +266,13 @@ func FixedHostKey(key PublicKey) HostKeyCallback { | ||||
| 	hk := &fixedHostKey{key} | ||||
| 	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" | ||||
| ) | ||||
| 
 | ||||
| type authResult int | ||||
| 
 | ||||
| const ( | ||||
| 	authFailure authResult = iota | ||||
| 	authPartialSuccess | ||||
| 	authSuccess | ||||
| ) | ||||
| 
 | ||||
| // clientAuthenticate authenticates with the remote server. See RFC 4252.
 | ||||
| func (c *connection) clientAuthenticate(config *ClientConfig) error { | ||||
| 	// initiate user auth session
 | ||||
| @ -37,11 +45,12 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if ok { | ||||
| 		if ok == authSuccess { | ||||
| 			// success
 | ||||
| 			return nil | ||||
| 		} else if ok == authFailure { | ||||
| 			tried[auth.method()] = true | ||||
| 		} | ||||
| 		tried[auth.method()] = true | ||||
| 		if methods == nil { | ||||
| 			methods = lastMethods | ||||
| 		} | ||||
| @ -82,7 +91,7 @@ type AuthMethod interface { | ||||
| 	// If authentication is not successful, a []string of alternative
 | ||||
| 	// method names is returned. If the slice is nil, it will be ignored
 | ||||
| 	// 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() string | ||||
| @ -91,13 +100,13 @@ type AuthMethod interface { | ||||
| // "none" authentication, RFC 4252 section 5.2.
 | ||||
| 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{ | ||||
| 		User:    user, | ||||
| 		Service: serviceSSH, | ||||
| 		Method:  "none", | ||||
| 	})); err != nil { | ||||
| 		return false, nil, err | ||||
| 		return authFailure, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return handleAuthResponse(c) | ||||
| @ -111,7 +120,7 @@ func (n *noneAuth) method() string { | ||||
| // a function call, e.g. by prompting the user.
 | ||||
| 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 { | ||||
| 		User     string `sshtype:"50"` | ||||
| 		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
 | ||||
| 	// when prompting.
 | ||||
| 	if err != nil { | ||||
| 		return false, nil, err | ||||
| 		return authFailure, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := c.writePacket(Marshal(&passwordAuthMsg{ | ||||
| @ -135,7 +144,7 @@ func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand | ||||
| 		Reply:    false, | ||||
| 		Password: pw, | ||||
| 	})); err != nil { | ||||
| 		return false, nil, err | ||||
| 		return authFailure, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return handleAuthResponse(c) | ||||
| @ -178,7 +187,7 @@ func (cb publicKeyCallback) method() string { | ||||
| 	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
 | ||||
| 	// 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
 | ||||
| @ -186,13 +195,13 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand | ||||
| 
 | ||||
| 	signers, err := cb() | ||||
| 	if err != nil { | ||||
| 		return false, nil, err | ||||
| 		return authFailure, nil, err | ||||
| 	} | ||||
| 	var methods []string | ||||
| 	for _, signer := range signers { | ||||
| 		ok, err := validateKey(signer.PublicKey(), user, c) | ||||
| 		if err != nil { | ||||
| 			return false, nil, err | ||||
| 			return authFailure, nil, err | ||||
| 		} | ||||
| 		if !ok { | ||||
| 			continue | ||||
| @ -206,7 +215,7 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand | ||||
| 			Method:  cb.method(), | ||||
| 		}, []byte(pub.Type()), pubKey)) | ||||
| 		if err != nil { | ||||
| 			return false, nil, err | ||||
| 			return authFailure, nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		// 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) | ||||
| 		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) | ||||
| 		if err != nil { | ||||
| 			return false, nil, err | ||||
| 			return authFailure, nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		// If authentication succeeds or the list of available methods does not
 | ||||
| 		// contain the "publickey" method, do not attempt to authenticate with any
 | ||||
| 		// other keys.  According to RFC 4252 Section 7, the latter can occur when
 | ||||
| 		// additional authentication methods are required.
 | ||||
| 		if success || !containsMethod(methods, cb.method()) { | ||||
| 		if success == authSuccess || !containsMethod(methods, cb.method()) { | ||||
| 			return success, methods, err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return false, methods, nil | ||||
| 	return authFailure, methods, nil | ||||
| } | ||||
| 
 | ||||
| func containsMethod(methods []string, method string) bool { | ||||
| @ -283,7 +292,9 @@ func confirmKeyAck(key PublicKey, c packetConn) (bool, error) { | ||||
| 		} | ||||
| 		switch packet[0] { | ||||
| 		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: | ||||
| 			var msg userAuthPubKeyOkMsg | ||||
| 			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
 | ||||
| // along with a list of remaining authentication methods to try next and
 | ||||
| // an error if an unexpected response was received.
 | ||||
| func handleAuthResponse(c packetConn) (bool, []string, error) { | ||||
| func handleAuthResponse(c packetConn) (authResult, []string, error) { | ||||
| 	for { | ||||
| 		packet, err := c.readPacket() | ||||
| 		if err != nil { | ||||
| 			return false, nil, err | ||||
| 			return authFailure, nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		switch packet[0] { | ||||
| 		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: | ||||
| 			var msg userAuthFailureMsg | ||||
| 			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: | ||||
| 			return true, nil, nil | ||||
| 			return authSuccess, nil, nil | ||||
| 		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
 | ||||
| // disabling echoing (e.g. for passwords), and return all the answers.
 | ||||
| // Challenge may be called multiple times in a single session. After
 | ||||
| @ -359,7 +393,7 @@ func (cb KeyboardInteractiveChallenge) method() string { | ||||
| 	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 { | ||||
| 		User       string `sshtype:"50"` | ||||
| 		Service    string | ||||
| @ -373,37 +407,42 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe | ||||
| 		Service: serviceSSH, | ||||
| 		Method:  "keyboard-interactive", | ||||
| 	})); err != nil { | ||||
| 		return false, nil, err | ||||
| 		return authFailure, nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	for { | ||||
| 		packet, err := c.readPacket() | ||||
| 		if err != nil { | ||||
| 			return false, nil, err | ||||
| 			return authFailure, nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		// like handleAuthResponse, but with less options.
 | ||||
| 		switch packet[0] { | ||||
| 		case msgUserAuthBanner: | ||||
| 			// TODO: Print banners during userauth.
 | ||||
| 			if err := handleBannerResponse(c, packet); err != nil { | ||||
| 				return authFailure, nil, err | ||||
| 			} | ||||
| 			continue | ||||
| 		case msgUserAuthInfoRequest: | ||||
| 			// OK
 | ||||
| 		case msgUserAuthFailure: | ||||
| 			var msg userAuthFailureMsg | ||||
| 			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: | ||||
| 			return true, nil, nil | ||||
| 			return authSuccess, nil, nil | ||||
| 		default: | ||||
| 			return false, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) | ||||
| 			return authFailure, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) | ||||
| 		} | ||||
| 
 | ||||
| 		var msg userAuthInfoRequestMsg | ||||
| 		if err := Unmarshal(packet, &msg); err != nil { | ||||
| 			return false, nil, err | ||||
| 			return authFailure, nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		// 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++ { | ||||
| 			prompt, r, ok := parseString(rest) | ||||
| 			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)) | ||||
| 			echos = append(echos, r[0] != 0) | ||||
| @ -421,16 +460,16 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe | ||||
| 		} | ||||
| 
 | ||||
| 		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) | ||||
| 		if err != nil { | ||||
| 			return false, nil, err | ||||
| 			return authFailure, nil, err | ||||
| 		} | ||||
| 
 | ||||
| 		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 | ||||
| 		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 { | ||||
| 			return false, nil, err | ||||
| 			return authFailure, nil, err | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -456,10 +495,10 @@ type retryableAuthMethod struct { | ||||
| 	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++ { | ||||
| 		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 | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										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" | ||||
| ) | ||||
| 
 | ||||
| // supportedCiphers specifies the supported ciphers in preference order.
 | ||||
| // supportedCiphers lists ciphers we support but might not recommend.
 | ||||
| var supportedCiphers = []string{ | ||||
| 	"aes128-ctr", "aes192-ctr", "aes256-ctr", | ||||
| 	"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
 | ||||
| @ -211,7 +221,7 @@ func (c *Config) SetDefaults() { | ||||
| 		c.Rand = rand.Reader | ||||
| 	} | ||||
| 	if c.Ciphers == nil { | ||||
| 		c.Ciphers = supportedCiphers | ||||
| 		c.Ciphers = preferredCiphers | ||||
| 	} | ||||
| 	var ciphers []string | ||||
| 	for _, c := range c.Ciphers { | ||||
| @ -242,7 +252,7 @@ func (c *Config) SetDefaults() { | ||||
| 
 | ||||
| // buildDataSignedForAuth returns the data that is signed in order to prove
 | ||||
| // 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 { | ||||
| 		Session []byte | ||||
| 		Type    byte | ||||
| @ -253,7 +263,7 @@ func buildDataSignedForAuth(sessionId []byte, req userAuthRequestMsg, algo, pubK | ||||
| 		Algo    []byte | ||||
| 		PubKey  []byte | ||||
| 	}{ | ||||
| 		sessionId, | ||||
| 		sessionID, | ||||
| 		msgUserAuthRequest, | ||||
| 		req.User, | ||||
| 		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 | ||||
| 	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 *algorithms | ||||
| 
 | ||||
| @ -120,6 +125,7 @@ func newClientTransport(conn keyingTransport, clientVersion, serverVersion []byt | ||||
| 	t.dialAddress = dialAddr | ||||
| 	t.remoteAddr = addr | ||||
| 	t.hostKeyCallback = config.HostKeyCallback | ||||
| 	t.bannerCallback = config.BannerCallback | ||||
| 	if config.HostKeyAlgorithms != nil { | ||||
| 		t.hostKeyAlgorithms = config.HostKeyAlgorithms | ||||
| 	} 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 | ||||
| 	} | ||||
| 
 | ||||
| 	kInt, err := group.diffieHellman(kexDHReply.Y, x) | ||||
| 	ki, err := group.diffieHellman(kexDHReply.Y, x) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -129,8 +129,8 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha | ||||
| 	writeString(h, kexDHReply.HostKey) | ||||
| 	writeInt(h, X) | ||||
| 	writeInt(h, kexDHReply.Y) | ||||
| 	K := make([]byte, intLength(kInt)) | ||||
| 	marshalInt(K, kInt) | ||||
| 	K := make([]byte, intLength(ki)) | ||||
| 	marshalInt(K, ki) | ||||
| 	h.Write(K) | ||||
| 
 | ||||
| 	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) | ||||
| 	kInt, err := group.diffieHellman(kexDHInit.X, y) | ||||
| 	ki, err := group.diffieHellman(kexDHInit.X, y) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @ -177,8 +177,8 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha | ||||
| 	writeInt(h, kexDHInit.X) | ||||
| 	writeInt(h, Y) | ||||
| 
 | ||||
| 	K := make([]byte, intLength(kInt)) | ||||
| 	marshalInt(K, kInt) | ||||
| 	K := make([]byte, intLength(ki)) | ||||
| 	marshalInt(K, ki) | ||||
| 	h.Write(K) | ||||
| 
 | ||||
| 	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, reply.EphemeralPubKey) | ||||
| 
 | ||||
| 	kInt := new(big.Int).SetBytes(secret[:]) | ||||
| 	K := make([]byte, intLength(kInt)) | ||||
| 	marshalInt(K, kInt) | ||||
| 	ki := new(big.Int).SetBytes(secret[:]) | ||||
| 	K := make([]byte, intLength(ki)) | ||||
| 	marshalInt(K, ki) | ||||
| 	h.Write(K) | ||||
| 
 | ||||
| 	return &kexResult{ | ||||
| @ -510,9 +510,9 @@ func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handsh | ||||
| 	writeString(h, kexInit.ClientPubKey) | ||||
| 	writeString(h, kp.pub[:]) | ||||
| 
 | ||||
| 	kInt := new(big.Int).SetBytes(secret[:]) | ||||
| 	K := make([]byte, intLength(kInt)) | ||||
| 	marshalInt(K, kInt) | ||||
| 	ki := new(big.Int).SetBytes(secret[:]) | ||||
| 	K := make([]byte, intLength(ki)) | ||||
| 	marshalInt(K, ki) | ||||
| 	h.Write(K) | ||||
| 
 | ||||
| 	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" | ||||
| ) | ||||
| 
 | ||||
| // 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.
 | ||||
| // Use ParsePublicKey for keys with prepended algorithm.
 | ||||
| func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) { | ||||
| @ -276,7 +286,8 @@ type PublicKey interface { | ||||
| 	Type() string | ||||
| 
 | ||||
| 	// 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 | ||||
| 
 | ||||
| 	// 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) | ||||
| } | ||||
| 
 | ||||
| // 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 | ||||
| 
 | ||||
| func (r *rsaPublicKey) Type() string { | ||||
| @ -348,13 +372,21 @@ func (r *rsaPublicKey) Marshal() []byte { | ||||
| } | ||||
| 
 | ||||
| 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()) | ||||
| 	} | ||||
| 	h := crypto.SHA1.New() | ||||
| 	h := hash.New() | ||||
| 	h.Write(data) | ||||
| 	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 { | ||||
| @ -363,7 +395,7 @@ func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { | ||||
| 
 | ||||
| type dsaPublicKey dsa.PublicKey | ||||
| 
 | ||||
| func (r *dsaPublicKey) Type() string { | ||||
| func (k *dsaPublicKey) Type() string { | ||||
| 	return "ssh-dss" | ||||
| } | ||||
| 
 | ||||
| @ -458,6 +490,14 @@ func (k *dsaPrivateKey) PublicKey() PublicKey { | ||||
| } | ||||
| 
 | ||||
| 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.Write(data) | ||||
| 	digest := h.Sum(nil) | ||||
| @ -481,12 +521,12 @@ func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { | ||||
| 
 | ||||
| type ecdsaPublicKey ecdsa.PublicKey | ||||
| 
 | ||||
| func (key *ecdsaPublicKey) Type() string { | ||||
| 	return "ecdsa-sha2-" + key.nistID() | ||||
| func (k *ecdsaPublicKey) Type() string { | ||||
| 	return "ecdsa-sha2-" + k.nistID() | ||||
| } | ||||
| 
 | ||||
| func (key *ecdsaPublicKey) nistID() string { | ||||
| 	switch key.Params().BitSize { | ||||
| func (k *ecdsaPublicKey) nistID() string { | ||||
| 	switch k.Params().BitSize { | ||||
| 	case 256: | ||||
| 		return "nistp256" | ||||
| 	case 384: | ||||
| @ -499,7 +539,7 @@ func (key *ecdsaPublicKey) nistID() string { | ||||
| 
 | ||||
| type ed25519PublicKey ed25519.PublicKey | ||||
| 
 | ||||
| func (key ed25519PublicKey) Type() string { | ||||
| func (k ed25519PublicKey) Type() string { | ||||
| 	return KeyAlgoED25519 | ||||
| } | ||||
| 
 | ||||
| @ -518,23 +558,23 @@ func parseED25519(in []byte) (out PublicKey, rest []byte, err error) { | ||||
| 	return (ed25519PublicKey)(key), w.Rest, nil | ||||
| } | ||||
| 
 | ||||
| func (key ed25519PublicKey) Marshal() []byte { | ||||
| func (k ed25519PublicKey) Marshal() []byte { | ||||
| 	w := struct { | ||||
| 		Name     string | ||||
| 		KeyBytes []byte | ||||
| 	}{ | ||||
| 		KeyAlgoED25519, | ||||
| 		[]byte(key), | ||||
| 		[]byte(k), | ||||
| 	} | ||||
| 	return Marshal(&w) | ||||
| } | ||||
| 
 | ||||
| func (key ed25519PublicKey) Verify(b []byte, sig *Signature) error { | ||||
| 	if sig.Format != key.Type() { | ||||
| 		return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, key.Type()) | ||||
| func (k ed25519PublicKey) Verify(b []byte, sig *Signature) error { | ||||
| 	if sig.Format != k.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 { | ||||
| 		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 | ||||
| } | ||||
| 
 | ||||
| func (key *ecdsaPublicKey) Marshal() []byte { | ||||
| func (k *ecdsaPublicKey) Marshal() []byte { | ||||
| 	// 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
 | ||||
| 	// parseECDSACert in the x/crypto/ssh/agent package.
 | ||||
| 	w := struct { | ||||
| @ -605,20 +645,20 @@ func (key *ecdsaPublicKey) Marshal() []byte { | ||||
| 		ID   string | ||||
| 		Key  []byte | ||||
| 	}{ | ||||
| 		key.Type(), | ||||
| 		key.nistID(), | ||||
| 		k.Type(), | ||||
| 		k.nistID(), | ||||
| 		keyBytes, | ||||
| 	} | ||||
| 
 | ||||
| 	return Marshal(&w) | ||||
| } | ||||
| 
 | ||||
| func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { | ||||
| 	if sig.Format != key.Type() { | ||||
| 		return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, key.Type()) | ||||
| func (k *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { | ||||
| 	if sig.Format != k.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) | ||||
| 	digest := h.Sum(nil) | ||||
| 
 | ||||
| @ -635,7 +675,7 @@ func (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { | ||||
| 		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 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) { | ||||
| 	return s.SignWithAlgorithm(rand, data, "") | ||||
| } | ||||
| 
 | ||||
| func (s *wrappedSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { | ||||
| 	var hashFunc crypto.Hash | ||||
| 
 | ||||
| 	switch key := s.pubKey.(type) { | ||||
| 	case *rsaPublicKey, *dsaPublicKey: | ||||
| 		hashFunc = crypto.SHA1 | ||||
| 	case *ecdsaPublicKey: | ||||
| 		hashFunc = ecHash(key.Curve) | ||||
| 	case ed25519PublicKey: | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("ssh: unsupported key type %T", key) | ||||
| 	if _, ok := s.pubKey.(*rsaPublicKey); ok { | ||||
| 		// RSA keys support a few hash functions determined by the requested signature algorithm
 | ||||
| 		switch algorithm { | ||||
| 		case "", SigAlgoRSA: | ||||
| 			algorithm = SigAlgoRSA | ||||
| 			hashFunc = crypto.SHA1 | ||||
| 		case SigAlgoRSASHA2256: | ||||
| 			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 | ||||
| @ -744,7 +810,7 @@ func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { | ||||
| 	} | ||||
| 
 | ||||
| 	return &Signature{ | ||||
| 		Format: s.pubKey.Type(), | ||||
| 		Format: algorithm, | ||||
| 		Blob:   signature, | ||||
| 	}, nil | ||||
| } | ||||
| @ -758,7 +824,7 @@ func NewPublicKey(key interface{}) (PublicKey, error) { | ||||
| 		return (*rsaPublicKey)(key), nil | ||||
| 	case *ecdsa.PublicKey: | ||||
| 		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 | ||||
| 	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
 | ||||
| // 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) { | ||||
| 	block, _ := pem.Decode(pemBytes) | ||||
| 	if block == nil { | ||||
| @ -816,6 +882,9 @@ func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { | ||||
| 	switch block.Type { | ||||
| 	case "RSA PRIVATE KEY": | ||||
| 		return x509.ParsePKCS1PrivateKey(block.Bytes) | ||||
| 	// RFC5208 - https://tools.ietf.org/html/rfc5208
 | ||||
| 	case "PRIVATE KEY": | ||||
| 		return x509.ParsePKCS8PrivateKey(block.Bytes) | ||||
| 	case "EC PRIVATE KEY": | ||||
| 		return x509.ParseECPrivateKey(block.Bytes) | ||||
| 	case "DSA PRIVATE KEY": | ||||
| @ -899,8 +968,8 @@ func ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) { | ||||
| // Implemented based on the documentation at
 | ||||
| // https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key
 | ||||
| func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { | ||||
| 	magic := append([]byte("openssh-key-v1"), 0) | ||||
| 	if !bytes.Equal(magic, key[0:len(magic)]) { | ||||
| 	const magic = "openssh-key-v1\x00" | ||||
| 	if len(key) < len(magic) || string(key[:len(magic)]) != magic { | ||||
| 		return nil, errors.New("ssh: invalid openssh private key format") | ||||
| 	} | ||||
| 	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 | ||||
| 	msgDebug         = 4 | ||||
| 	msgNewKeys       = 21 | ||||
| 
 | ||||
| 	// Standard authentication messages
 | ||||
| 	msgUserAuthSuccess = 52 | ||||
| 	msgUserAuthBanner  = 53 | ||||
| ) | ||||
| 
 | ||||
| // SSH messages:
 | ||||
| @ -137,6 +133,18 @@ type userAuthFailureMsg struct { | ||||
| 	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
 | ||||
| const msgUserAuthInfoRequest = 60 | ||||
| const msgUserAuthInfoResponse = 61 | ||||
| @ -154,7 +162,7 @@ const msgChannelOpen = 90 | ||||
| 
 | ||||
| type channelOpenMsg struct { | ||||
| 	ChanType         string `sshtype:"90"` | ||||
| 	PeersId          uint32 | ||||
| 	PeersID          uint32 | ||||
| 	PeersWindow      uint32 | ||||
| 	MaxPacketSize    uint32 | ||||
| 	TypeSpecificData []byte `ssh:"rest"` | ||||
| @ -165,7 +173,7 @@ const msgChannelData = 94 | ||||
| 
 | ||||
| // Used for debug print outs of packets.
 | ||||
| type channelDataMsg struct { | ||||
| 	PeersId uint32 `sshtype:"94"` | ||||
| 	PeersID uint32 `sshtype:"94"` | ||||
| 	Length  uint32 | ||||
| 	Rest    []byte `ssh:"rest"` | ||||
| } | ||||
| @ -174,8 +182,8 @@ type channelDataMsg struct { | ||||
| const msgChannelOpenConfirm = 91 | ||||
| 
 | ||||
| type channelOpenConfirmMsg struct { | ||||
| 	PeersId          uint32 `sshtype:"91"` | ||||
| 	MyId             uint32 | ||||
| 	PeersID          uint32 `sshtype:"91"` | ||||
| 	MyID             uint32 | ||||
| 	MyWindow         uint32 | ||||
| 	MaxPacketSize    uint32 | ||||
| 	TypeSpecificData []byte `ssh:"rest"` | ||||
| @ -185,7 +193,7 @@ type channelOpenConfirmMsg struct { | ||||
| const msgChannelOpenFailure = 92 | ||||
| 
 | ||||
| type channelOpenFailureMsg struct { | ||||
| 	PeersId  uint32 `sshtype:"92"` | ||||
| 	PeersID  uint32 `sshtype:"92"` | ||||
| 	Reason   RejectionReason | ||||
| 	Message  string | ||||
| 	Language string | ||||
| @ -194,7 +202,7 @@ type channelOpenFailureMsg struct { | ||||
| const msgChannelRequest = 98 | ||||
| 
 | ||||
| type channelRequestMsg struct { | ||||
| 	PeersId             uint32 `sshtype:"98"` | ||||
| 	PeersID             uint32 `sshtype:"98"` | ||||
| 	Request             string | ||||
| 	WantReply           bool | ||||
| 	RequestSpecificData []byte `ssh:"rest"` | ||||
| @ -204,28 +212,28 @@ type channelRequestMsg struct { | ||||
| const msgChannelSuccess = 99 | ||||
| 
 | ||||
| type channelRequestSuccessMsg struct { | ||||
| 	PeersId uint32 `sshtype:"99"` | ||||
| 	PeersID uint32 `sshtype:"99"` | ||||
| } | ||||
| 
 | ||||
| // See RFC 4254, section 5.4.
 | ||||
| const msgChannelFailure = 100 | ||||
| 
 | ||||
| type channelRequestFailureMsg struct { | ||||
| 	PeersId uint32 `sshtype:"100"` | ||||
| 	PeersID uint32 `sshtype:"100"` | ||||
| } | ||||
| 
 | ||||
| // See RFC 4254, section 5.3
 | ||||
| const msgChannelClose = 97 | ||||
| 
 | ||||
| type channelCloseMsg struct { | ||||
| 	PeersId uint32 `sshtype:"97"` | ||||
| 	PeersID uint32 `sshtype:"97"` | ||||
| } | ||||
| 
 | ||||
| // See RFC 4254, section 5.3
 | ||||
| const msgChannelEOF = 96 | ||||
| 
 | ||||
| type channelEOFMsg struct { | ||||
| 	PeersId uint32 `sshtype:"96"` | ||||
| 	PeersID uint32 `sshtype:"96"` | ||||
| } | ||||
| 
 | ||||
| // See RFC 4254, section 4
 | ||||
| @ -255,7 +263,7 @@ type globalRequestFailureMsg struct { | ||||
| const msgChannelWindowAdjust = 93 | ||||
| 
 | ||||
| type windowAdjustMsg struct { | ||||
| 	PeersId         uint32 `sshtype:"93"` | ||||
| 	PeersID         uint32 `sshtype:"93"` | ||||
| 	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 { | ||||
| 		failMsg := channelOpenFailureMsg{ | ||||
| 			PeersId:  msg.PeersId, | ||||
| 			PeersID:  msg.PeersID, | ||||
| 			Reason:   ConnectionFailed, | ||||
| 			Message:  "invalid request", | ||||
| 			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.remoteId = msg.PeersId | ||||
| 	c.remoteId = msg.PeersID | ||||
| 	c.maxRemotePayload = msg.MaxPacketSize | ||||
| 	c.remoteWin.add(msg.PeersWindow) | ||||
| 	m.incomingChannels <- c | ||||
| @ -313,7 +313,7 @@ func (m *mux) openChannel(chanType string, extra []byte) (*channel, error) { | ||||
| 		PeersWindow:      ch.myWindow, | ||||
| 		MaxPacketSize:    ch.maxIncomingPayload, | ||||
| 		TypeSpecificData: extra, | ||||
| 		PeersId:          ch.localId, | ||||
| 		PeersID:          ch.localId, | ||||
| 	} | ||||
| 	if err := m.sendMessage(open); err != nil { | ||||
| 		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
 | ||||
| 	// "SSH-2.0-".
 | ||||
| 	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
 | ||||
| @ -162,6 +166,9 @@ type ServerConn struct { | ||||
| // unsuccessful, it closes the connection and returns an error.  The
 | ||||
| // Request and NewChannel channels must be serviced, or the connection
 | ||||
| // 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) { | ||||
| 	fullConf := *config | ||||
| 	fullConf.SetDefaults() | ||||
| @ -252,7 +259,7 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) | ||||
| func isAcceptableAlgo(algo string) bool { | ||||
| 	switch algo { | ||||
| 	case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoED25519, | ||||
| 		CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01: | ||||
| 		CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: | ||||
| 		return true | ||||
| 	} | ||||
| 	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) | ||||
| } | ||||
| 
 | ||||
| // ServerAuthError implements the error interface. It appends any authentication
 | ||||
| // errors that may occur, and is returned if all of the authentication methods
 | ||||
| // provided by the user failed to authenticate.
 | ||||
| // ServerAuthError represents server authentication errors and is
 | ||||
| // sometimes returned by NewServerConn. It appends any authentication
 | ||||
| // errors that may occur, and is returned if all of the authentication
 | ||||
| // methods provided by the user failed to authenticate.
 | ||||
| type ServerAuthError struct { | ||||
| 	// Errors contains authentication errors returned by the authentication
 | ||||
| 	// callback methods.
 | ||||
| 	// callback methods. The first entry is typically ErrNoAuth.
 | ||||
| 	Errors []error | ||||
| } | ||||
| 
 | ||||
| @ -305,6 +313,13 @@ func (l ServerAuthError) Error() string { | ||||
| 	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) { | ||||
| 	sessionID := s.transport.getSessionID() | ||||
| 	var cache pubKeyCache | ||||
| @ -312,6 +327,7 @@ func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, err | ||||
| 
 | ||||
| 	authFailures := 0 | ||||
| 	var authErrs []error | ||||
| 	var displayedBanner bool | ||||
| 
 | ||||
| userAuthLoop: | ||||
| 	for { | ||||
| @ -343,8 +359,22 @@ userAuthLoop: | ||||
| 		} | ||||
| 
 | ||||
| 		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 | ||||
| 		authErr := errors.New("no auth passed yet") | ||||
| 		authErr := ErrNoAuth | ||||
| 
 | ||||
| 		switch userAuthReq.Method { | ||||
| 		case "none": | ||||
| @ -374,7 +404,7 @@ userAuthLoop: | ||||
| 			perms, authErr = config.PasswordCallback(s, password) | ||||
| 		case "keyboard-interactive": | ||||
| 			if config.KeyboardInteractiveCallback == nil { | ||||
| 				authErr = errors.New("ssh: keyboard-interactive auth not configubred") | ||||
| 				authErr = errors.New("ssh: keyboard-interactive auth not configured") | ||||
| 				break | ||||
| 			} | ||||
| 
 | ||||
| @ -454,6 +484,7 @@ userAuthLoop: | ||||
| 				// sig.Format.  This is usually the same, but
 | ||||
| 				// for certs, the names differ.
 | ||||
| 				if !isAcceptableAlgo(sig.Format) { | ||||
| 					authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format) | ||||
| 					break | ||||
| 				} | ||||
| 				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() | ||||
| 	} | ||||
| 	var copyError error | ||||
| 	for _ = range s.copyFuncs { | ||||
| 	for range s.copyFuncs { | ||||
| 		if err := <-s.errors; err != nil && copyError == nil { | ||||
| 			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.
 | ||||
| func (c *Client) ListenUnix(socketPath string) (net.Listener, error) { | ||||
| 	c.handleForwardsOnce.Do(c.handleForwards) | ||||
| 	m := streamLocalChannelForwardMsg{ | ||||
| 		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 | ||||
| } | ||||
| 
 | ||||
| // 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
 | ||||
| // on laddr. Incoming connections will be available by calling
 | ||||
| // Accept on the returned net.Listener.
 | ||||
| func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) { | ||||
| 	c.handleForwardsOnce.Do(c.handleForwards) | ||||
| 	if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) { | ||||
| 		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 { | ||||
| 				return n, err | ||||
| 			} | ||||
| 			n += 1 | ||||
| 			n++ | ||||
| 			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
 | ||||
| // 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
 | ||||
| // commonly found on UNIX systems.
 | ||||
| @ -25,7 +25,7 @@ type State struct { | ||||
| 	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 { | ||||
| 	_, err := unix.IoctlGetTermios(fd, ioctlReadTermios) | ||||
| 	return err == nil | ||||
| @ -108,9 +108,7 @@ func ReadPassword(fd int) ([]byte, error) { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	defer func() { | ||||
| 		unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) | ||||
| 	}() | ||||
| 	defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) | ||||
| 
 | ||||
| 	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{} | ||||
| 
 | ||||
| // 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 { | ||||
| 	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.
 | ||||
| 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 { | ||||
| 	_, err := unix.IoctlGetTermio(fd, unix.TCGETA) | ||||
| 	return err == nil | ||||
| @ -75,47 +75,43 @@ func ReadPassword(fd int) ([]byte, error) { | ||||
| // restored.
 | ||||
| // see http://cr.illumos.org/~webrev/andy_js/1060/
 | ||||
| func MakeRaw(fd int) (*State, error) { | ||||
| 	oldTermiosPtr, err := unix.IoctlGetTermios(fd, unix.TCGETS) | ||||
| 	termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	oldTermios := *oldTermiosPtr | ||||
| 
 | ||||
| 	newTermios := oldTermios | ||||
| 	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 | ||||
| 	oldState := State{termios: *termios} | ||||
| 
 | ||||
| 	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 &State{ | ||||
| 		state: oldTermiosPtr, | ||||
| 	}, nil | ||||
| 	return &oldState, nil | ||||
| } | ||||
| 
 | ||||
| // Restore restores the terminal connected to the given file descriptor to a
 | ||||
| // previous state.
 | ||||
| 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
 | ||||
| // restore the terminal after a signal.
 | ||||
| func GetState(fd int) (*State, error) { | ||||
| 	oldTermiosPtr, err := unix.IoctlGetTermios(fd, unix.TCGETS) | ||||
| 	termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return &State{ | ||||
| 		state: oldTermiosPtr, | ||||
| 	}, nil | ||||
| 	return &State{termios: *termios}, nil | ||||
| } | ||||
| 
 | ||||
| // 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 | ||||
| 
 | ||||
| import ( | ||||
| 	"os" | ||||
| 
 | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
| 
 | ||||
| @ -24,7 +26,7 @@ type State struct { | ||||
| 	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 { | ||||
| 	var st uint32 | ||||
| 	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 | ||||
| } | ||||
| 
 | ||||
| // 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
 | ||||
| // is commonly used for inputting passwords and other sensitive data. The slice
 | ||||
| // returned does not include the \n.
 | ||||
| @ -94,9 +89,15 @@ func ReadPassword(fd int) ([]byte, error) { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	defer func() { | ||||
| 		windows.SetConsoleMode(windows.Handle(fd), old) | ||||
| 	}() | ||||
| 	defer 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 ( | ||||
| 	"bufio" | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"log" | ||||
| @ -76,17 +77,17 @@ type connectionState struct { | ||||
| // both directions are triggered by reading and writing a msgNewKey packet
 | ||||
| // respectively.
 | ||||
| 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 | ||||
| 	} 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 | ||||
| 	} else { | ||||
| 		t.writer.pendingKeyChange <- ciph | ||||
| 	} | ||||
| 	t.writer.pendingKeyChange <- ciph | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| @ -139,7 +140,7 @@ func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { | ||||
| 			case cipher := <-s.pendingKeyChange: | ||||
| 				s.packetCipher = cipher | ||||
| 			default: | ||||
| 				return nil, errors.New("ssh: got bogus newkeys message.") | ||||
| 				return nil, errors.New("ssh: got bogus newkeys message") | ||||
| 			} | ||||
| 
 | ||||
| 		case msgDisconnect: | ||||
| @ -232,52 +233,22 @@ var ( | ||||
| 	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
 | ||||
| // described in RFC 4253, section 6.4. direction should either be serverKeys
 | ||||
| // (to setup server->client keys) or clientKeys (for client->server keys).
 | ||||
| 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 { | ||||
| 		return newGCMCipher(iv, key) | ||||
| 	} | ||||
| 	iv := make([]byte, cipherMode.ivSize) | ||||
| 	key := make([]byte, cipherMode.keySize) | ||||
| 	macKey := make([]byte, macMode.keySize) | ||||
| 
 | ||||
| 	if algs.Cipher == aes128cbcID { | ||||
| 		return newAESCBCCipher(iv, key, macKey, algs) | ||||
| 	} | ||||
| 	generateKeyMaterial(iv, d.ivTag, kex) | ||||
| 	generateKeyMaterial(key, d.keyTag, kex) | ||||
| 	generateKeyMaterial(macKey, d.macKeyTag, kex) | ||||
| 
 | ||||
| 	if algs.Cipher == tripledescbcID { | ||||
| 		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 | ||||
| 	return cipherModes[algs.Cipher].create(key, iv, macKey, algs) | ||||
| } | ||||
| 
 | ||||
| // 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 buf [1]byte | ||||
| 
 | ||||
| 	for len(versionString) < maxVersionStringBytes { | ||||
| 	for length := 0; length < maxVersionStringBytes; length++ { | ||||
| 		_, err := io.ReadFull(r, buf[:]) | ||||
| 		if err != nil { | ||||
| 			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
 | ||||
| 		// but several SSH servers actually only send a \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 | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
							
								
								
									
										100
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							| @ -631,92 +631,116 @@ | ||||
| 		{ | ||||
| 			"checksumSHA1": "TT1rac6kpQp2vz24m5yDGUNQ/QQ=", | ||||
| 			"path": "golang.org/x/crypto/cast5", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "IQkUIOnvlf0tYloFx9mLaXSvXWQ=", | ||||
| 			"path": "golang.org/x/crypto/curve25519", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "1hwn8cgg4EVXhCpJIqmMbzqnUo0=", | ||||
| 			"checksumSHA1": "2LpxYGSf068307b7bhAuVjvzLLc=", | ||||
| 			"path": "golang.org/x/crypto/ed25519", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "LXFcVx8I587SnWmKycSDEq9yvK8=", | ||||
| 			"checksumSHA1": "0JTAFXPkankmWcZGQJGScLDiaN8=", | ||||
| 			"path": "golang.org/x/crypto/ed25519/internal/edwards25519", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"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", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "olOKkhrdkYQHZ0lf1orrFQPQrv4=", | ||||
| 			"path": "golang.org/x/crypto/openpgp/armor", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "eo/KtdjieJQXH7Qy+faXFcF70ME=", | ||||
| 			"path": "golang.org/x/crypto/openpgp/elgamal", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "rlxVSaGgqdAgwblsErxTxIfuGfg=", | ||||
| 			"path": "golang.org/x/crypto/openpgp/errors", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "Pq88+Dgh04UdXWZN6P+bLgYnbRc=", | ||||
| 			"checksumSHA1": "DwKua4mYaqKBGxCrwgLP2JqkPA0=", | ||||
| 			"path": "golang.org/x/crypto/openpgp/packet", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "s2qT4UwvzBSkzXuiuMkowif1Olw=", | ||||
| 			"path": "golang.org/x/crypto/openpgp/s2k", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "1MGpGDQqnUoRpv7VEcQrXOBydXE=", | ||||
| 			"path": "golang.org/x/crypto/pbkdf2", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"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", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "dHh6VeHcbNg11miGjGEl8LbPe7w=", | ||||
| 			"checksumSHA1": "q+Rqy6Spw6qDSj75TGEZF7nzoFM=", | ||||
| 			"path": "golang.org/x/crypto/scrypt", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"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", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "5Yb2z6UO+Arm/TEd+OEtdnwOt1A=", | ||||
| 			"checksumSHA1": "BSPDVKviqHQaG2phOFN690zAKB8=", | ||||
| 			"path": "golang.org/x/crypto/ssh/terminal", | ||||
| 			"revision": "6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd", | ||||
| 			"revisionTime": "2017-09-25T11:22:06Z" | ||||
| 			"revision": "ff983b9c42bc9fbf91556e191cc8efb585c16908", | ||||
| 			"revisionTime": "2018-07-25T11:53:45Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "Y+HGqEkYM15ir+J93MEaHdyFy0c=", | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user