mirror of
https://github.com/cheat/cheat.git
synced 2024-11-28 00:36:53 +01:00
80c91cbdee
Integrate `go-git` into the application, and use it to `git clone` cheatsheets when the installer runs. Previously, the installer required that `git` be installed on the system `PATH`, so this change has to big advantages: 1. It removes that system dependency on `git` 2. It paves the way for implementing the `--update` command Additionally, `cheat` now performs a `--depth=1` clone when installing cheatsheets, which should at least somewhat improve installation times (especially on slow network connections).
80 lines
2.3 KiB
Go
80 lines
2.3 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 and cSHAKE instances, as well as utility
|
|
// functions for hashing bytes to arbitrary-length output.
|
|
//
|
|
//
|
|
// SHAKE implementation is based on FIPS PUB 202 [1]
|
|
// cSHAKE implementations is based on NIST SP 800-185 [2]
|
|
//
|
|
// [1] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf
|
|
// [2] https://doi.org/10.6028/NIST.SP.800-185
|
|
|
|
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()
|
|
}
|
|
|
|
// Consts for configuring initial SHA-3 state
|
|
const (
|
|
dsbyteShake = 0x1f
|
|
rate128 = 168
|
|
rate256 = 136
|
|
)
|
|
|
|
// Clone returns copy of SHAKE context within its current state.
|
|
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() State {
|
|
return State{rate: rate128, dsbyte: dsbyteShake}
|
|
}
|
|
|
|
// NewShake256 creates a new SHAKE256 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() State {
|
|
return State{rate: rate256, dsbyte: dsbyteShake}
|
|
}
|
|
|
|
// 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)
|
|
}
|