2016-02-21 22:05:00 +00:00
|
|
|
// 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.
|
2019-01-03 22:15:26 +00:00
|
|
|
func NewShake128() ShakeHash {
|
|
|
|
if h := newShake128Asm(); h != nil {
|
|
|
|
return h
|
|
|
|
}
|
|
|
|
return &state{rate: 168, dsbyte: 0x1f}
|
|
|
|
}
|
2016-02-21 22:05:00 +00:00
|
|
|
|
2019-01-03 22:15:26 +00:00
|
|
|
// NewShake256 creates a new SHAKE256 variable-output-length ShakeHash.
|
2016-02-21 22:05:00 +00:00
|
|
|
// Its generic security strength is 256 bits against all attacks if
|
|
|
|
// at least 64 bytes of its output are used.
|
2019-01-03 22:15:26 +00:00
|
|
|
func NewShake256() ShakeHash {
|
|
|
|
if h := newShake256Asm(); h != nil {
|
|
|
|
return h
|
|
|
|
}
|
|
|
|
return &state{rate: 136, dsbyte: 0x1f}
|
|
|
|
}
|
2016-02-21 22:05:00 +00:00
|
|
|
|
|
|
|
// 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)
|
|
|
|
}
|