Skip to content

Commit

Permalink
Merge branch '30-get-pk-route' into 'dev'
Browse files Browse the repository at this point in the history
Add /getPK route

Closes #30

See merge request ergo/rosen-bridge/sign-protocols!40
  • Loading branch information
vorujack committed Jan 2, 2025
2 parents 993ae2a + 3484619 commit 4ec802a
Show file tree
Hide file tree
Showing 10 changed files with 214 additions and 105 deletions.
5 changes: 5 additions & 0 deletions .changeset/serious-wasps-clean.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'tss-api': minor
---

Add /getPK route
19 changes: 19 additions & 0 deletions services/tss-api/api/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type TssController interface {
Sign() echo.HandlerFunc
Keygen() echo.HandlerFunc
Message() echo.HandlerFunc
GetPublicKey() echo.HandlerFunc
Validate(interface{}) error
}

Expand Down Expand Up @@ -198,3 +199,21 @@ func (tssController *tssController) Threshold() echo.HandlerFunc {
return c.JSON(http.StatusOK, res)
}
}

// returns echo handler, get public key of crypto
func (tssController *tssController) GetPublicKey() echo.HandlerFunc {
return func(c echo.Context) (err error) {
data := models.GetPublicKey{}

if err = c.Bind(&data); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}

pk, err := tssController.rosenTss.GetPublicKey(data)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
res := map[string]string{"publicKey": pk}
return c.JSON(http.StatusOK, res)
}
}
1 change: 1 addition & 0 deletions services/tss-api/api/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ func InitRouting(e *echo.Echo, tssController TssController) {
e.Use(middleware.Recover())

e.GET("/threshold", tssController.Threshold())
e.POST("/getPK", tssController.GetPublicKey())
e.POST("/sign", tssController.Sign())
e.POST("/keygen", tssController.Keygen())
e.POST("/message", tssController.Message())
Expand Down
1 change: 1 addition & 0 deletions services/tss-api/app/interface/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,5 @@ type RosenTss interface {
GetP2pId() string
GetConfig() models.Config
GetTrustKey() string
GetPublicKey(models.GetPublicKey) (string, error)
}
37 changes: 37 additions & 0 deletions services/tss-api/app/rosenTss.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package app

import (
"encoding/hex"
"encoding/json"
"fmt"
"github.com/bnb-chain/tss-lib/v2/tss"
"os"
ecdsaKeygen "rosen-bridge/tss-api/app/keygen/ecdsa"
eddsaKeygen "rosen-bridge/tss-api/app/keygen/eddsa"
Expand Down Expand Up @@ -196,6 +198,41 @@ func (r *rosenTss) StartNewSign(signMessage models.SignMessage) error {
return nil
}

// GetPublicKey get the compressed public key of crypto
func (r *rosenTss) GetPublicKey(pkData models.GetPublicKey) (string, error) {
switch pkData.Crypto {
case models.EDDSA:
eddsaKeygenData, err := r.GetStorage().LoadEDDSAKeygen(r.GetPeerHome(), r.GetP2pId())
if err != nil {
logging.Error(err)
return "", err
}
pub := eddsaKeygenData.TssConfig.KeygenData.EDDSAPub
compressedPublicKey := utils.GetPKFromEDDSAPub(pub.X(), pub.Y())
encodedPK := hex.EncodeToString(compressedPublicKey)
return encodedPK, nil
case models.ECDSA:
if len(pkData.DerivationPath) == 0 {
return "", fmt.Errorf(models.WrongDerivationPathError)
}
ecdsaKeygenData, err := r.GetStorage().LoadECDSAKeygen(r.GetPeerHome(), r.GetP2pId())
if err != nil {
logging.Error(err)
return "", err
}
_, extendedChildPk, err := ecdsaSign.DerivingPubkeyFromPath(ecdsaKeygenData.TssConfig.KeygenData.ECDSAPub, []byte(pkData.ChainCode), pkData.DerivationPath, tss.S256())
if err != nil {
return "", err
}
compressedPublicKey := utils.GetPKFromECDSAPub(extendedChildPk.X, extendedChildPk.Y)
encodedPK := hex.EncodeToString(compressedPublicKey)

return encodedPK, nil
default:
return "", fmt.Errorf(models.WrongCryptoProtocolError)
}
}

// handles the receiving message from message route
func (r *rosenTss) MessageHandler(message models.Message) error {

Expand Down
14 changes: 7 additions & 7 deletions services/tss-api/app/sign/ecdsa/ecdsa.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ func (h *handler) StartParty(
}
}

il, extendedChildPk, err := derivingPubkeyFromPath(h.savedData.ECDSAPub, []byte(signMsg.ChainCode), signMsg.DerivationPath, tss.S256())
il, extendedChildPk, err := DerivingPubkeyFromPath(h.savedData.ECDSAPub, []byte(signMsg.ChainCode), signMsg.DerivationPath, tss.S256())

if err != nil {
return err
Expand Down Expand Up @@ -245,18 +245,18 @@ func (h *handler) StartParty(
func (h *handler) LoadData(rosenTss _interface.RosenTss) (*tss.PartyID, error) {
_, err1 := rosenTss.GetMetaData(models.ECDSA)
if h.savedData.ShareID == nil || (err1 != nil && err1.Error() == models.ECDSANoMetaDataFoundError) {
data, pID, err := rosenTss.GetStorage().LoadECDSAKeygen(rosenTss.GetPeerHome(), rosenTss.GetP2pId())
data, err := rosenTss.GetStorage().LoadECDSAKeygen(rosenTss.GetPeerHome(), rosenTss.GetP2pId())
if err != nil {
logging.Error(err)
return nil, err
}
if pID == nil {
if data.PartyID == nil {
logging.Error("pID is nil")
return nil, fmt.Errorf("pID is nil")
}
h.savedData = data.KeygenData
h.pID = pID
err = rosenTss.SetMetaData(data.MetaData, models.ECDSA)
h.savedData = data.TssConfig.KeygenData
h.pID = data.PartyID
err = rosenTss.SetMetaData(data.TssConfig.MetaData, models.ECDSA)
if err != nil {
return nil, err
}
Expand All @@ -271,7 +271,7 @@ func (h *handler) GetData() ([]*big.Int, *big.Int) {

// - derive on master pubKey according to bip32 (tss-lib modified version)
// - return new keyDerivationDelta and extendedChildPk
func derivingPubkeyFromPath(masterPub *crypto.ECPoint, chainCode []byte, path []uint32, ec elliptic.Curve) (*big.Int, *ckd.ExtendedKey, error) {
func DerivingPubkeyFromPath(masterPub *crypto.ECPoint, chainCode []byte, path []uint32, ec elliptic.Curve) (*big.Int, *ckd.ExtendedKey, error) {
// build ecdsa key pair
pk := ecdsa.PublicKey{
Curve: ec,
Expand Down
10 changes: 5 additions & 5 deletions services/tss-api/app/sign/eddsa/eddsa.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,18 +215,18 @@ func (h *handler) StartParty(
func (h *handler) LoadData(rosenTss _interface.RosenTss) (*tss.PartyID, error) {
_, err1 := rosenTss.GetMetaData(models.EDDSA)
if h.savedData.ShareID == nil || (err1 != nil && err1.Error() == models.EDDSANoMetaDataFoundError) {
data, pID, err := rosenTss.GetStorage().LoadEDDSAKeygen(rosenTss.GetPeerHome(), rosenTss.GetP2pId())
data, err := rosenTss.GetStorage().LoadEDDSAKeygen(rosenTss.GetPeerHome(), rosenTss.GetP2pId())
if err != nil {
logging.Error(err)
return nil, err
}
if pID == nil {
if data.PartyID == nil {
logging.Error("pID is nil")
return nil, fmt.Errorf("pID is nil")
}
h.savedData = data.KeygenData
h.pID = pID
err = rosenTss.SetMetaData(data.MetaData, models.EDDSA)
h.savedData = data.TssConfig.KeygenData
h.pID = data.PartyID
err = rosenTss.SetMetaData(data.TssConfig.MetaData, models.EDDSA)
if err != nil {
return nil, err
}
Expand Down
8 changes: 4 additions & 4 deletions services/tss-api/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,23 +99,23 @@ func main() {
}

// setting up meta data if exist for eddsa
eddsaMetaData, _, err := tss.GetStorage().LoadEDDSAKeygen(tss.GetPeerHome(), tss.GetP2pId())
eddsaKeygenData, err := tss.GetStorage().LoadEDDSAKeygen(tss.GetPeerHome(), tss.GetP2pId())
if err != nil {
logging.Warn(err)
}

err = tss.SetMetaData(eddsaMetaData.MetaData, models.EDDSA)
err = tss.SetMetaData(eddsaKeygenData.TssConfig.MetaData, models.EDDSA)
if err != nil {
logging.Warn(models.EDDSANoMetaDataFoundError)
}

// setting up meta data if exist for ecdsa
ecdsaMetaData, _, err := tss.GetStorage().LoadECDSAKeygen(tss.GetPeerHome(), tss.GetP2pId())
ecdsaKeygenData, err := tss.GetStorage().LoadECDSAKeygen(tss.GetPeerHome(), tss.GetP2pId())
if err != nil {
logging.Warn(err)
}

err = tss.SetMetaData(ecdsaMetaData.MetaData, models.ECDSA)
err = tss.SetMetaData(ecdsaKeygenData.TssConfig.MetaData, models.ECDSA)
if err != nil {
logging.Warn(models.ECDSANoMetaDataFoundError)
}
Expand Down
28 changes: 28 additions & 0 deletions services/tss-api/models/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ type SignMessage struct {
DerivationPath []uint32 `json:"derivationPath"`
}

type GetPublicKey struct {
Crypto string `json:"crypto" validate:"required"`
ChainCode string `json:"chainCode" validate:"required"`
DerivationPath []uint32 `json:"derivationPath"`
}

type Peer struct {
ShareID string `json:"shareID"`
P2PID string `json:"p2pID"`
Expand Down Expand Up @@ -92,11 +98,33 @@ type TssConfigEDDSA struct {
KeygenData eddsaKeygen.LocalPartySaveData `json:"keygenData"`
}

type EDDSAKeygenData struct {
TssConfig TssConfigEDDSA
PartyID *tss.PartyID
}

func (d EDDSAKeygenData) IsEmpty() bool {
return d.TssConfig.MetaData.PeersCount == 0 &&
d.TssConfig.MetaData.Threshold == 0 &&
d.PartyID == nil
}

type TssConfigECDSA struct {
MetaData MetaData `json:"metaData"`
KeygenData ecdsaKeygen.LocalPartySaveData `json:"keygenData"`
}

type ECDSAKeygenData struct {
TssConfig TssConfigECDSA
PartyID *tss.PartyID
}

func (d ECDSAKeygenData) IsEmpty() bool {
return d.TssConfig.MetaData.PeersCount == 0 &&
d.TssConfig.MetaData.Threshold == 0 &&
d.PartyID == nil
}

type TssData struct {
PartyID *tss.PartyID
Params *tss.Parameters
Expand Down
Loading

0 comments on commit 4ec802a

Please sign in to comment.