|
|
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[:]) }
|