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