Documentation ¶
Index ¶
- Constants
- Variables
- func CalculateLeaves(dataSize uint64) uint64
- func GenerateKeyPair() (sk SecretKey, pk PublicKey)
- func GenerateKeyPairDeterministic(entropy [EntropySize]byte) (sk SecretKey, pk PublicKey)
- func IsValidCipherType(ct CipherType) bool
- func NewHash() hash.Hash
- func ReadSignedObject(r io.Reader, obj interface{}, maxLen uint64, pk PublicKey) error
- func SecureWipe(data []byte)
- func VerifyHash(data Hash, pk PublicKey, sig Signature) error
- func VerifySegment(base []byte, hashSet []Hash, numSegments, proofIndex uint64, root Hash) bool
- func WriteSignedObject(w io.Writer, obj interface{}, sk SecretKey) error
- type CachedMerkleTree
- type CipherKey
- type CipherType
- type Ciphertext
- type CurvePoint
- type Hash
- type HashSlice
- type MerkleTree
- type PublicKey
- type SecretKey
- type Signature
Constants ¶
const ( // EntropySize defines the amount of entropy necessary to do secure // cryptographic operations, in bytes. EntropySize = 32 // PublicKeySize defines the size of public keys in bytes. PublicKeySize = ed25519.PublicKeySize // SecretKeySize defines the size of secret keys in bytes. SecretKeySize = ed25519.PrivateKeySize // SignatureSize defines the size of signatures in bytes. SignatureSize = ed25519.SignatureSize // CurvePointSize defines the size of a curve point in bytes. CurvePointSize = ed25519.CurvePointSize )
const (
// HashSize is the length of a Hash in bytes.
HashSize = 32
)
const ( // SegmentSize is the chunk size that is used when taking the Merkle root // of a file. 64 is chosen because bandwidth is scarce and it optimizes for // the smallest possible storage proofs. Using a larger base, even 256 // bytes, would result in substantially faster hashing, but the bandwidth // tradeoff was deemed to be more important, as blockchain space is scarce. SegmentSize = 64 )
Variables ¶
var ( // TypeDefaultRenter is the default CipherType that is used for // encrypting pieces of uploaded data. TypeDefaultRenter = TypeThreefish // TypeDefaultWallet is the default CipherType that is used for // wallet operations like encrypting the wallet files. TypeDefaultWallet = TypeTwofish // TypePlain means no encryption is used. TypePlain = CipherType{0, 0, 0, 0, 0, 0, 0, 1} // TypeTwofish is the type for the Twofish-GCM encryption. TypeTwofish = CipherType{0, 0, 0, 0, 0, 0, 0, 2} // TypeThreefish is the type for the Threefish encryption. TypeThreefish = CipherType{0, 0, 0, 0, 0, 0, 0, 3} )
var ( // ErrInvalidSignature is returned if a signature is provided that does not // match the data and public key. ErrInvalidSignature = errors.New("invalid signature") // ErrCurvePointWrongLen is the error when encoded value has the wrong length to // be a curve point ErrCurvePointWrongLen = errors.New("encoded value has the wrong length to be a curve point") )
var ( // ErrHashWrongLen is the error when encoded value has the wrong // length to be a hash. ErrHashWrongLen = errors.New("encoded value has the wrong length to be a hash") )
var ( // ErrInsufficientLen is an error when supplied ciphertext is not // long enough to contain a nonce. ErrInsufficientLen = errors.New("supplied ciphertext is not long enough to contain a nonce") )
var ( // ErrInvalidCipherType is returned upon encountering an unknown cipher // type. ErrInvalidCipherType = errors.New("provided cipher type is invalid") )
Functions ¶
func CalculateLeaves ¶
CalculateLeaves calculates the number of leaves that would be pushed from data of size 'dataSize'.
func GenerateKeyPair ¶
GenerateKeyPair creates a public-secret keypair that can be used to sign and verify messages.
func GenerateKeyPairDeterministic ¶
func GenerateKeyPairDeterministic(entropy [EntropySize]byte) (sk SecretKey, pk PublicKey)
GenerateKeyPairDeterministic generates keys deterministically using the input entropy. The input entropy must be 32 bytes in length.
func IsValidCipherType ¶
func IsValidCipherType(ct CipherType) bool
IsValidCipherType returns true if ct is a known CipherType and false otherwise.
func ReadSignedObject ¶
ReadSignedObject reads a length-prefixed object prefixed by its signature, and verifies the signature.
func SecureWipe ¶
func SecureWipe(data []byte)
SecureWipe destroys the data contained within a byte slice. There are no strong guarantees that all copies of the memory have been eliminated. If the OS was doing context switching or using swap space the keys may still be elsewhere in memory.
func VerifyHash ¶
VerifyHash uses a public key and input data to verify a signature.
func VerifySegment ¶
VerifySegment will verify that a segment, given the proof, is a part of a Merkle root.
Types ¶
type CachedMerkleTree ¶
type CachedMerkleTree struct {
merkletree.CachedTree
}
CachedMerkleTree wraps merkletree.CachedTree, changing some of the function definitions to assume sia-specific constants and return sia-specific types.
func NewCachedTree ¶
func NewCachedTree(height uint64) *CachedMerkleTree
NewCachedTree returns a CachedMerkleTree, which can be used for getting Merkle roots and proofs from data that has cached subroots. See merkletree.CachedTree for more details.
func (*CachedMerkleTree) Prove ¶
func (ct *CachedMerkleTree) Prove(base []byte, cachedHashSet []Hash) []Hash
Prove is a redefinition of merkletree.CachedTree.Prove, so that Sia-specific types are used instead of the generic types used by the parent package. The base is not a return value because the base is used as input.
func (*CachedMerkleTree) Push ¶
func (ct *CachedMerkleTree) Push(h Hash)
Push is a redefinition of merkletree.CachedTree.Push, with the added type safety of only accepting a hash.
func (*CachedMerkleTree) PushSubTree ¶
func (ct *CachedMerkleTree) PushSubTree(height int, h Hash) error
PushSubTree is a redefinition of merkletree.CachedTree.PushSubTree, with the added type safety of only accepting a hash.
func (*CachedMerkleTree) Root ¶
func (ct *CachedMerkleTree) Root() (h Hash)
Root is a redefinition of merkletree.CachedTree.Root, returning a Hash instead of a []byte.
type CipherKey ¶
type CipherKey interface { // Key returns the underlying key. Key() []byte // Type returns the type of the key. Type() CipherType // EncryptBytes encrypts the given plaintext and returns the // ciphertext. EncryptBytes([]byte) Ciphertext // DecryptBytes decrypts the given ciphertext and returns the // plaintext. DecryptBytes(Ciphertext) ([]byte, error) // DecryptBytesInPlace decrypts the given ciphertext and returns the // plaintext. It will reuse the memory of the ciphertext which means // that it's not save to use it after calling DecryptBytesInPlace. DecryptBytesInPlace(Ciphertext) ([]byte, error) // Derive derives a child cipherkey given a provided chunk index and // piece index. Derive(chunkIndex, pieceIndex uint64) CipherKey }
CipherKey is a key with Sia specific encryption/decryption methods.
func GenerateSiaKey ¶
func GenerateSiaKey(ct CipherType) CipherKey
GenerateSiaKey creates a new SiaKey from the provided type and entropy.
func NewSiaKey ¶
func NewSiaKey(ct CipherType, entropy []byte) (CipherKey, error)
NewSiaKey creates a new SiaKey from the provided type and entropy.
func NewWalletKey ¶
NewWalletKey is a helper method which is meant to be used only if the type and entropy are guaranteed to be valid. In the wallet this is always the case since we always use hashes as the entropy and we don't read the key from file.
type CipherType ¶
type CipherType [8]byte
CipherType is an identifier for the individual ciphers provided by this package.
func RandomCipherType ¶
func RandomCipherType() CipherType
RandomCipherType is a helper function for testing. It's located in the crypto package to centralize all the types within one file to make future changes to them easy.
func (*CipherType) FromString ¶
func (ct *CipherType) FromString(s string) error
FromString reads a CipherType from a string.
func (CipherType) Overhead ¶
func (ct CipherType) Overhead() uint64
Overhead reports the overhead produced by a CipherType in bytes.
func (CipherType) String ¶
func (ct CipherType) String() string
String creates a string representation of a CipherType that can be converted into a type with FromString.
type CurvePoint ¶
type CurvePoint [CurvePointSize]byte
CurvePoint represents a point on the elliptic curve.
func (*CurvePoint) LoadString ¶
func (cp *CurvePoint) LoadString(s string) error
LoadString unmarshal CurvePoint from string
func (*CurvePoint) String ¶
func (cp *CurvePoint) String() string
type Hash ¶
Hash is a BLAKE2b 256-bit digest.
func HashAll ¶
func HashAll(objs ...interface{}) (hash Hash)
HashAll takes a set of objects as input, encodes them all using the encoding package, and then hashes the result.
func HashObject ¶
func HashObject(obj interface{}) (hash Hash)
HashObject takes an object as input, encodes it using the encoding package, and then hashes the result.
func MerkleProof ¶
MerkleProof builds a Merkle proof that the data at segment 'proofIndex' is a part of the Merkle root formed by 'b'.
func MerkleRoot ¶
MerkleRoot returns the Merkle root of the input data.
func (*Hash) LoadString ¶
LoadString takes a string, parses the hash value of the string, and sets the value of the hash equal to the hash value of the string.
func (Hash) MarshalJSON ¶
MarshalJSON marshales a hash as a hex string.
func (*Hash) UnmarshalJSON ¶
UnmarshalJSON decodes the json hex string of the hash.
type HashSlice ¶
type HashSlice []Hash
HashSlice is used for sorting
type MerkleTree ¶
type MerkleTree struct {
merkletree.Tree
}
MerkleTree wraps merkletree.Tree, changing some of the function definitions to assume sia-specific constants and return sia-specific types.
func NewTree ¶
func NewTree() *MerkleTree
NewTree returns a MerkleTree, which can be used for getting Merkle roots and Merkle proofs on data. See merkletree.Tree for more details.
func (*MerkleTree) PushObject ¶
func (t *MerkleTree) PushObject(obj interface{})
PushObject encodes and adds the hash of the encoded object to the tree as a leaf.
func (*MerkleTree) Root ¶
func (t *MerkleTree) Root() (h Hash)
Root is a redefinition of merkletree.Tree.Root, returning a Hash instead of a []byte.
type PublicKey ¶
type PublicKey [PublicKeySize]byte
PublicKey is an object that can be used to verify signatures.
type SecretKey ¶
type SecretKey [SecretKeySize]byte
SecretKey can be used to sign data for the corresponding public key.