// NewJVSS creates a new JVSS protocol instance and returns it. func NewJVSS(node *onet.TreeNodeInstance) (onet.ProtocolInstance, error) { kp := &config.KeyPair{Suite: node.Suite(), Public: node.Public(), Secret: node.Private()} n := len(node.List()) pk := make([]abstract.Point, n) var idx int for i, tn := range node.List() { if tn.ServerIdentity.Public.Equal(node.Public()) { idx = i } pk[i] = tn.ServerIdentity.Public } // NOTE: T <= R <= N (for simplicity we use T = R = N; might change later) info := poly.Threshold{T: n, R: n, N: n} jv := &JVSS{ TreeNodeInstance: node, keyPair: kp, pubKeys: pk, treeIndex: idx, info: info, schnorr: new(poly.Schnorr), secrets: newSecrets(), ltssInit: false, longTermSecDone: make(chan bool, 1), shortTermSecDone: make(chan bool, 1), sigChan: make(chan *poly.SchnorrSig), sidStore: newSidStore(), } // Setup message handlers h := []interface{}{ jv.handleSecInit, jv.handleSecConf, jv.handleSigReq, jv.handleSigResp, } err := jv.RegisterHandlers(h...) if err != nil { return nil, err } return jv, err }