package airgapped import ( "encoding/json" "fmt" "github.com/depools/dc4bc/client" "github.com/depools/dc4bc/fsm/state_machines/signing_proposal_fsm" "github.com/depools/dc4bc/fsm/types/requests" "github.com/depools/dc4bc/fsm/types/responses" "go.dedis.ch/kyber/v3/sign/bls" "go.dedis.ch/kyber/v3/sign/tbls" ) func (am *AirgappedMachine) handleStateSigningAwaitPartialKeys(o *client.Operation) error { var ( payload responses.DKGProposalResponsesParticipantResponse err error ) if err = json.Unmarshal(o.Payload, &payload); err != nil { return fmt.Errorf("failed to unmarshal payload: %w", err) } partialSign, err := am.createPartialSign(nil, o.DKGIdentifier) if err != nil { return fmt.Errorf("failed to create partialSign for msg: %w", err) } req := requests.SigningProposalPartialKeyRequest{ ParticipantId: 0, // TODO: from where? PartialKey: partialSign, CreatedAt: o.CreatedAt, } reqBz, err := json.Marshal(req) if err != nil { return fmt.Errorf("failed to generate fsm request: %w", err) } o.Result = reqBz o.Event = signing_proposal_fsm.EventSigningPartialKeyReceived return nil } func (am *AirgappedMachine) createPartialSign(msg []byte, dkgIdentifier string) ([]byte, error) { blsKeyring, err := am.loadBLSKeyring(dkgIdentifier) if err != nil { return nil, fmt.Errorf("failed to load blsKeyring: %w", err) } return tbls.Sign(am.suite, blsKeyring.Share, msg) } func (am *AirgappedMachine) recoverFullSign(msg []byte, sigShares [][]byte, dkgIdentifier string) ([]byte, error) { blsKeyring, err := am.loadBLSKeyring(dkgIdentifier) if err != nil { return nil, fmt.Errorf("failed to load blsKeyring: %w", err) } return tbls.Recover(am.suite, blsKeyring.PubPoly, msg, sigShares, len(sigShares), len(sigShares)) } func (am *AirgappedMachine) verifySign(msg []byte, fullSignature []byte, dkgIdentifier string) error { blsKeyring, err := am.loadBLSKeyring(dkgIdentifier) if err != nil { return fmt.Errorf("failed to load blsKeyring: %w", err) } return bls.Verify(am.suite, blsKeyring.PubPoly.Commit(), msg, fullSignature) }