package babyjub
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto"
|
|
"io"
|
|
"math/big"
|
|
)
|
|
|
|
// BjjWrappedPublicKey is a wrapper for PublicKey.
|
|
type BjjWrappedPublicKey struct {
|
|
pubKey *PublicKey
|
|
}
|
|
|
|
// Equal returns true if the public keys are equal.
|
|
func (pub *BjjWrappedPublicKey) Equal(x crypto.PublicKey) bool {
|
|
var xk *BjjWrappedPublicKey
|
|
switch x := x.(type) {
|
|
case BjjWrappedPublicKey:
|
|
xk = &x
|
|
case *BjjWrappedPublicKey:
|
|
xk = x
|
|
default:
|
|
return false
|
|
}
|
|
return pub.pubKey.X.Cmp(xk.pubKey.X) == 0 &&
|
|
pub.pubKey.Y.Cmp(xk.pubKey.Y) == 0
|
|
}
|
|
|
|
// BjjWrappedPrivateKey is a wrapper for PrivateKey.
|
|
type BjjWrappedPrivateKey struct {
|
|
privKey *PrivateKey
|
|
}
|
|
|
|
// NewBjjWrappedKey creates a new BjjWrappedPrivateKey.
|
|
func NewBjjWrappedKey(privKey *PrivateKey) *BjjWrappedPrivateKey {
|
|
return &BjjWrappedPrivateKey{privKey}
|
|
}
|
|
|
|
// RandomBjjWrappedKey creates a new BjjWrappedPrivateKey with a random private key.
|
|
func RandomBjjWrappedKey() *BjjWrappedPrivateKey {
|
|
privKey := NewRandPrivKey()
|
|
return NewBjjWrappedKey(&privKey)
|
|
}
|
|
|
|
// Public returns the public key of the private key.
|
|
func (w *BjjWrappedPrivateKey) Public() crypto.PublicKey {
|
|
return &BjjWrappedPublicKey{w.privKey.Public()}
|
|
}
|
|
|
|
// Sign signs the digest with the private key.
|
|
func (w *BjjWrappedPrivateKey) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error) {
|
|
hash := opts.HashFunc()
|
|
|
|
switch hash {
|
|
// alredy hashed
|
|
case crypto.Hash(0):
|
|
default:
|
|
hasher := hash.New()
|
|
hasher.Write(digest)
|
|
digest = hasher.Sum(nil)
|
|
}
|
|
|
|
digestBI := big.NewInt(0).SetBytes(digest)
|
|
sig, err := w.privKey.SignPoseidon(digestBI)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return sig.Compress().MarshalText()
|
|
}
|
|
|
|
// Equal returns true if the private keys are equal.
|
|
func (w *BjjWrappedPrivateKey) Equal(x crypto.PrivateKey) bool {
|
|
var xk *BjjWrappedPrivateKey
|
|
switch x := x.(type) {
|
|
case BjjWrappedPrivateKey:
|
|
xk = &x
|
|
case *BjjWrappedPrivateKey:
|
|
xk = x
|
|
default:
|
|
return false
|
|
}
|
|
return bytes.Equal(w.privKey[:], xk.privKey[:])
|
|
}
|