@@ -2,15 +2,17 @@ package quorum
22
33import (
44 "context"
5+ "encoding/binary"
56 "github.com/pkg/errors"
67 "github.com/qubic/go-archiver/store"
78 "github.com/qubic/go-archiver/utils"
89 "github.com/qubic/go-node-connector/types"
910 "log"
11+ "slices"
1012)
1113
1214// Validate validates the quorum votes and if success returns the aligned votes back
13- func Validate (ctx context.Context , sigVerifierFunc utils.SigVerifierFunc , quorumVotes types.QuorumVotes , computors types.Computors ) (types.QuorumVotes , error ) {
15+ func Validate (ctx context.Context , sigVerifierFunc utils.SigVerifierFunc , quorumVotes types.QuorumVotes , computors types.Computors , targetTickVoteSignature uint32 ) (types.QuorumVotes , error ) {
1416 if len (quorumVotes ) < types .MinimumQuorumVotes {
1517 return nil , errors .New ("not enough quorum votes" )
1618 }
@@ -26,7 +28,7 @@ func Validate(ctx context.Context, sigVerifierFunc utils.SigVerifierFunc, quorum
2628 }
2729
2830 log .Printf ("Proceed to validate total quorum sigs: %d\n " , len (alignedVotes ))
29- err = quorumTickSigVerify (ctx , sigVerifierFunc , alignedVotes , computors )
31+ err = quorumTickSigVerify (ctx , sigVerifierFunc , alignedVotes , computors , targetTickVoteSignature )
3032 if err != nil {
3133 return nil , errors .Wrap (err , "quorum tick signature verification failed" )
3234 }
@@ -105,7 +107,7 @@ func getAlignedVotes(quorumVotes types.QuorumVotes) (types.QuorumVotes, error) {
105107 return alignedVotes , nil
106108}
107109
108- func quorumTickSigVerify (ctx context.Context , sigVerifierFunc utils.SigVerifierFunc , quorumVotes types.QuorumVotes , computors types.Computors ) error {
110+ func quorumTickSigVerify (ctx context.Context , sigVerifierFunc utils.SigVerifierFunc , quorumVotes types.QuorumVotes , computors types.Computors , targetTickVoteSignature uint32 ) error {
109111 var successVotes = 0
110112 failedIndexes := make ([]uint16 , 0 , 0 )
111113 failedIdentites := make ([]string , 0 , 0 )
@@ -116,7 +118,7 @@ func quorumTickSigVerify(ctx context.Context, sigVerifierFunc utils.SigVerifierF
116118 return errors .Wrap (err , "getting digest from tick data" )
117119 }
118120 computorPubKey := computors .PubKeys [quorumTickData .ComputorIndex ]
119- if err := sigVerifierFunc (ctx , computorPubKey , digest , quorumTickData .Signature ); err != nil {
121+ if err := verifyTickVoteSignature (ctx , sigVerifierFunc , computorPubKey , digest , quorumTickData .Signature , targetTickVoteSignature ); err != nil {
120122 //return errors.Wrapf(err, "quorum tick signature verification failed for computor index: %d", quorumTickData.ComputorIndex)
121123 //log.Printf("Quorum tick signature verification failed for computor index: %d. Err: %s\n", quorumTickData.ComputorIndex, err.Error())
122124 failedIndexes = append (failedIndexes , quorumTickData .ComputorIndex )
@@ -142,6 +144,25 @@ func quorumTickSigVerify(ctx context.Context, sigVerifierFunc utils.SigVerifierF
142144 return nil
143145}
144146
147+ func verifyTickVoteSignature (ctx context.Context , sigVerifierFunc utils.SigVerifierFunc , computorPubKey , digest [32 ]byte , signature [64 ]byte , targetTickVoteSignature uint32 ) error {
148+ invertedSignatureSection := swapBytes (signature [:4 ])
149+ score := binary .LittleEndian .Uint32 (invertedSignatureSection )
150+
151+ if score > targetTickVoteSignature {
152+ return errors .New ("vote signature score over target tick vote signature" )
153+ }
154+
155+ return sigVerifierFunc (ctx , computorPubKey , digest , signature )
156+ }
157+
158+ func swapBytes (input []byte ) []byte {
159+ output := make ([]byte , len (input ))
160+ copy (output , input )
161+ slices .Reverse (output )
162+
163+ return output
164+ }
165+
145166func getDigestFromQuorumTickData (data types.QuorumTickVote ) ([32 ]byte , error ) {
146167 // xor computor index with 8
147168 data .ComputorIndex ^= 3
0 commit comments