mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-07 05:46:32 +00:00
Add package jsontypes that implements a subset of the custom libs/json package. Specifically it handles encoding and decoding of interface types wrapped in "tagged" JSON objects. It omits the deep reflection on arbitrary types, preserving only the handling of type tags wrapper encoding. - Register interface types (Evidence, PubKey, PrivKey) for tagged encoding. - Update the existing implementations to satisfy the type. - Register those types with the jsontypes registry. - Add string tags to 64-bit integer fields where needed. - Add marshalers to structs that export interface-typed fields.
62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
package crypto
|
|
|
|
import (
|
|
"github.com/tendermint/tendermint/crypto/tmhash"
|
|
"github.com/tendermint/tendermint/internal/jsontypes"
|
|
"github.com/tendermint/tendermint/libs/bytes"
|
|
)
|
|
|
|
const (
|
|
// AddressSize is the size of a pubkey address.
|
|
AddressSize = tmhash.TruncatedSize
|
|
)
|
|
|
|
// An address is a []byte, but hex-encoded even in JSON.
|
|
// []byte leaves us the option to change the address length.
|
|
// Use an alias so Unmarshal methods (with ptr receivers) are available too.
|
|
type Address = bytes.HexBytes
|
|
|
|
func AddressHash(bz []byte) Address {
|
|
return Address(tmhash.SumTruncated(bz))
|
|
}
|
|
|
|
type PubKey interface {
|
|
Address() Address
|
|
Bytes() []byte
|
|
VerifySignature(msg []byte, sig []byte) bool
|
|
Equals(PubKey) bool
|
|
Type() string
|
|
|
|
// Implementations must support tagged encoding in JSON.
|
|
jsontypes.Tagged
|
|
}
|
|
|
|
type PrivKey interface {
|
|
Bytes() []byte
|
|
Sign(msg []byte) ([]byte, error)
|
|
PubKey() PubKey
|
|
Equals(PrivKey) bool
|
|
Type() string
|
|
|
|
// Implementations must support tagged encoding in JSON.
|
|
jsontypes.Tagged
|
|
}
|
|
|
|
type Symmetric interface {
|
|
Keygen() []byte
|
|
Encrypt(plaintext []byte, secret []byte) (ciphertext []byte)
|
|
Decrypt(ciphertext []byte, secret []byte) (plaintext []byte, err error)
|
|
}
|
|
|
|
// If a new key type implements batch verification,
|
|
// the key type must be registered in github.com/tendermint/tendermint/crypto/batch
|
|
type BatchVerifier interface {
|
|
// Add appends an entry into the BatchVerifier.
|
|
Add(key PubKey, message, signature []byte) error
|
|
// Verify verifies all the entries in the BatchVerifier, and returns
|
|
// if every signature in the batch is valid, and a vector of bools
|
|
// indicating the verification status of each signature (in the order
|
|
// that signatures were added to the batch).
|
|
Verify() (bool, []bool)
|
|
}
|