| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 | // 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 ssh// Message authentication supportimport (	"crypto/hmac"	"crypto/sha1"	"crypto/sha256"	"hash")type macMode struct {	keySize int	new     func(key []byte) hash.Hash}// truncatingMAC wraps around a hash.Hash and truncates the output digest to// a given size.type truncatingMAC struct {	length int	hmac   hash.Hash}func (t truncatingMAC) Write(data []byte) (int, error) {	return t.hmac.Write(data)}func (t truncatingMAC) Sum(in []byte) []byte {	out := t.hmac.Sum(in)	return out[:len(in)+t.length]}func (t truncatingMAC) Reset() {	t.hmac.Reset()}func (t truncatingMAC) Size() int {	return t.length}func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() }var macModes = map[string]*macMode{	"hmac-sha2-256": {32, func(key []byte) hash.Hash {		return hmac.New(sha256.New, key)	}},	"hmac-sha1": {20, func(key []byte) hash.Hash {		return hmac.New(sha1.New, key)	}},	"hmac-sha1-96": {20, func(key []byte) hash.Hash {		return truncatingMAC{12, hmac.New(sha1.New, key)}	}},}
 |