schnorr_wasm.mx raw

   1  //go:build wasm
   2  //:build wasm
   3  
   4  package schnorr
   5  
   6  import (
   7  	"crypto/secp256k1"
   8  	"crypto/sha256"
   9  )
  10  
  11  func PubKeyFromSecKey(seckey []byte) ([]byte, bool) {
  12  	var sk [32]byte
  13  	copy(sk[:], seckey)
  14  	pk, ok := secp256k1.PubKeyFromSecKey(sk)
  15  	if !ok {
  16  		return nil, false
  17  	}
  18  	return pk[:], true
  19  }
  20  
  21  func SignSchnorr(seckey, msg, auxRand []byte) ([]byte, bool) {
  22  	var sk, m, aux [32]byte
  23  	copy(sk[:], seckey)
  24  	copy(m[:], msg)
  25  	copy(aux[:], auxRand)
  26  	sig, ok := secp256k1.SignSchnorr(sk, m, aux)
  27  	if !ok {
  28  		return nil, false
  29  	}
  30  	return sig[:], true
  31  }
  32  
  33  func VerifySchnorr(pubkey, msg, sig []byte) (ok bool) {
  34  	var pk, m [32]byte
  35  	var s [64]byte
  36  	copy(pk[:], pubkey)
  37  	copy(m[:], msg)
  38  	copy(s[:], sig)
  39  	return secp256k1.VerifySchnorr(pk, m, s)
  40  }
  41  
  42  func ECDH(seckey, pubkey []byte) ([]byte, bool) {
  43  	var sk, pk [32]byte
  44  	copy(sk[:], seckey)
  45  	copy(pk[:], pubkey)
  46  	shared, ok := secp256k1.ECDH(sk, pk)
  47  	if !ok {
  48  		return nil, false
  49  	}
  50  	return shared[:], true
  51  }
  52  
  53  func SHA256Sum(data []byte) (buf []byte) {
  54  	h := sha256.Sum(data)
  55  	return h[:]
  56  }
  57  
  58  func ScalarAddModN(a, b []byte) ([]byte, bool) {
  59  	var fa, fb [32]byte
  60  	copy(fa[:], a)
  61  	copy(fb[:], b)
  62  	r, ok := secp256k1.ScalarAddModN(fa, fb)
  63  	if !ok {
  64  		return nil, false
  65  	}
  66  	return r[:], true
  67  }
  68  
  69  func CompressedPubKey(seckey []byte) ([]byte, bool) {
  70  	var sk [32]byte
  71  	copy(sk[:], seckey)
  72  	cpk, ok := secp256k1.CompressedPubKey(sk)
  73  	if !ok {
  74  		return nil, false
  75  	}
  76  	return cpk[:], true
  77  }
  78