| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // Package xof provides an interface for eXtendable-Output Functions.
- //
- // # Available Functions
- //
- // SHAKE functions are defined in FIPS-202, see https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf.
- // BLAKE2Xb and BLAKE2Xs are defined in https://www.blake2.net/blake2x.pdf.
- package xof
- import (
- "io"
- "github.com/cloudflare/circl/internal/sha3"
- "github.com/cloudflare/circl/xof/k12"
- "golang.org/x/crypto/blake2b"
- "golang.org/x/crypto/blake2s"
- )
- // XOF defines the interface to hash functions that support arbitrary-length output.
- type XOF interface {
- // Write absorbs more data into the XOF's state. It panics if called
- // after Read.
- io.Writer
- // Read reads more output from the XOF. It returns io.EOF if the limit
- // has been reached.
- io.Reader
- // Clone returns a copy of the XOF in its current state.
- Clone() XOF
- // Reset restores the XOF to its initial state and discards all data appended by Write.
- Reset()
- }
- type ID uint
- const (
- SHAKE128 ID = iota + 1
- SHAKE256
- BLAKE2XB
- BLAKE2XS
- K12D10
- )
- func (x ID) New() XOF {
- switch x {
- case SHAKE128:
- s := sha3.NewShake128()
- return shakeBody{&s}
- case SHAKE256:
- s := sha3.NewShake256()
- return shakeBody{&s}
- case BLAKE2XB:
- x, _ := blake2b.NewXOF(blake2b.OutputLengthUnknown, nil)
- return blake2xb{x}
- case BLAKE2XS:
- x, _ := blake2s.NewXOF(blake2s.OutputLengthUnknown, nil)
- return blake2xs{x}
- case K12D10:
- x := k12.NewDraft10([]byte{})
- return k12d10{&x}
- default:
- panic("crypto: requested unavailable XOF function")
- }
- }
- type shakeBody struct{ sha3.ShakeHash }
- func (s shakeBody) Clone() XOF { return shakeBody{s.ShakeHash.Clone()} }
- type blake2xb struct{ blake2b.XOF }
- func (s blake2xb) Clone() XOF { return blake2xb{s.XOF.Clone()} }
- type blake2xs struct{ blake2s.XOF }
- func (s blake2xs) Clone() XOF { return blake2xs{s.XOF.Clone()} }
- type k12d10 struct{ *k12.State }
- func (s k12d10) Clone() XOF {
- x := s.State.Clone()
- return k12d10{&x}
- }
|