61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2014 The Go Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package sha3
 | 
						|
 | 
						|
// This file defines the ShakeHash interface, and provides
 | 
						|
// functions for creating SHAKE instances, as well as utility
 | 
						|
// functions for hashing bytes to arbitrary-length output.
 | 
						|
 | 
						|
import (
 | 
						|
	"io"
 | 
						|
)
 | 
						|
 | 
						|
// ShakeHash defines the interface to hash functions that
 | 
						|
// support arbitrary-length output.
 | 
						|
type ShakeHash interface {
 | 
						|
	// Write absorbs more data into the hash's state. It panics if input is
 | 
						|
	// written to it after output has been read from it.
 | 
						|
	io.Writer
 | 
						|
 | 
						|
	// Read reads more output from the hash; reading affects the hash's
 | 
						|
	// state. (ShakeHash.Read is thus very different from Hash.Sum)
 | 
						|
	// It never returns an error.
 | 
						|
	io.Reader
 | 
						|
 | 
						|
	// Clone returns a copy of the ShakeHash in its current state.
 | 
						|
	Clone() ShakeHash
 | 
						|
 | 
						|
	// Reset resets the ShakeHash to its initial state.
 | 
						|
	Reset()
 | 
						|
}
 | 
						|
 | 
						|
func (d *state) Clone() ShakeHash {
 | 
						|
	return d.clone()
 | 
						|
}
 | 
						|
 | 
						|
// NewShake128 creates a new SHAKE128 variable-output-length ShakeHash.
 | 
						|
// Its generic security strength is 128 bits against all attacks if at
 | 
						|
// least 32 bytes of its output are used.
 | 
						|
func NewShake128() ShakeHash { return &state{rate: 168, dsbyte: 0x1f} }
 | 
						|
 | 
						|
// NewShake256 creates a new SHAKE128 variable-output-length ShakeHash.
 | 
						|
// Its generic security strength is 256 bits against all attacks if
 | 
						|
// at least 64 bytes of its output are used.
 | 
						|
func NewShake256() ShakeHash { return &state{rate: 136, dsbyte: 0x1f} }
 | 
						|
 | 
						|
// ShakeSum128 writes an arbitrary-length digest of data into hash.
 | 
						|
func ShakeSum128(hash, data []byte) {
 | 
						|
	h := NewShake128()
 | 
						|
	h.Write(data)
 | 
						|
	h.Read(hash)
 | 
						|
}
 | 
						|
 | 
						|
// ShakeSum256 writes an arbitrary-length digest of data into hash.
 | 
						|
func ShakeSum256(hash, data []byte) {
 | 
						|
	h := NewShake256()
 | 
						|
	h.Write(data)
 | 
						|
	h.Read(hash)
 | 
						|
}
 |