| // 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) |
| } |