Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cross-platform compatibility #502

Closed
wants to merge 24 commits into from
Closed
Show file tree
Hide file tree
Changes from 19 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions .github/workflows/test_on_pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,24 @@ jobs:
needs: permission
strategy:
matrix:
platform: [macos-latest, windows-latest, ubuntu-latest]
runs-on: ${{matrix.platform}}
platform: [macos-latest, windows-latest, ubuntu-latest, ubuntu-latest-x86]
runs-on: ${{ matrix.platform == 'ubuntu-latest-x86' && 'ubuntu-latest' || matrix.platform }}
env:
DBGSYNCLOG: trace
DBGSYNCON: true
steps:
- name: Setup Alpine Linux
if: matrix.platform == 'ubuntu-latest-x86'
uses: jirutka/setup-alpine@v1
with:
arch: x86
packages: >
golang
make
git
gcc
musl-dev

- name: Set up Go ^1.13
uses: actions/setup-go@v3
with:
Expand All @@ -51,7 +63,7 @@ jobs:
fetch-depth: 0

- name: Test without coverage
if: matrix.platform == 'macos-latest' || matrix.platform == 'windows-latest'
if: matrix.platform == 'macos-latest' || matrix.platform == 'windows-latest' || matrix.platform == 'ubuntu-latest-x86'
run: make test

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add a step that does a uname -a and a go env just to be able to double check that it works?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can see that in the runner anyway, at the top...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think that would be the case for the Alpine x86 job, since it seems to run on the same worker, no?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I didn't see that it only runs 3 out of the 4 entries in the matrix - according to the Standard Github Runners, the ubuntu-latest-x86 doesn't exist. So perhaps it's just ignored?

If you look at the checks from this PR, only 3 are run. And I cannot see anything about two tests being run on the ubuntu-latest.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think the new workflow would be executed until the changes haven't been merged

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now I'm confused:

  • according to the header, the synchronize type will launch the script every time you do a git push
  • I can't find your changes to the file .github/workflows/test_on_pr.yml anymore - did you remove the changes?

I do think it's a good idea to add the 32-bit test to the workflow. And if I'm not mistaken, the workflow has actually been run. It's just that the -x86 target doesn't exist. But I didn't test it.

Copy link
Contributor Author

@matteosz matteosz May 22, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, yes the synchronize make the CI to run for every git push, however the CI that is run is the one which is already on the master branch (or the drandmerge since it's the base branch now). Hence, I changed the workflow to execute separate jobs (thus avoiding the -x86 target issue) and the changes weren't detected either, so I moved the CI changes to a separate PR to merge before this one so we have the correct CI tests running.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, as I have too many things going on and couldn't decide where to start, I did this:

https://github.com/ineiti/test_ubuntu_32bits/blob/main/.github/workflows/test.yaml

some notes:

  • it's nicer to use a matrix, it keeps the things simpler and easier to extend
  • you don't use the shell: alpine.sh {0}, so I think you're still running it on 64-bits and not 32-bits
  • uname doesn't show it's 32-bits, so I used getconf LONG_BIT - thanks to stackoverflow
  • ChatGPT was useless in this endeavour...

I hope that helps...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will update the CI with that

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, a good CI-pipeline is worth putting some effort in!

- name: Test with coverage
Expand Down
18 changes: 15 additions & 3 deletions .github/workflows/test_on_push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,24 @@ jobs:
test_and_coverage:
strategy:
matrix:
platform: [macos-latest, windows-latest, ubuntu-latest]
runs-on: ${{matrix.platform}}
platform: [macos-latest, windows-latest, ubuntu-latest, ubuntu-latest-x86]
runs-on: ${{ matrix.platform == 'ubuntu-latest-x86' && 'ubuntu-latest' || matrix.platform }}
env:
DBGSYNCLOG: trace
DBGSYNCON: true
steps:
- name: Setup Alpine Linux
if: matrix.platform == 'ubuntu-latest-x86'
uses: jirutka/setup-alpine@v1
with:
arch: x86
packages: >
golang
make
git
gcc
musl-dev

- name: Set up Go ^1.13
uses: actions/setup-go@v3
with:
Expand All @@ -26,7 +38,7 @@ jobs:
fetch-depth: 0

- name: Test without coverage
if: matrix.platform == 'macos-latest' || matrix.platform == 'windows-latest'
if: matrix.platform == 'macos-latest' || matrix.platform == 'windows-latest' || matrix.platform == 'ubuntu-latest-x86'
run: make test

- name: Test with coverage
Expand Down
2 changes: 1 addition & 1 deletion group/curve25519/param.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type Param struct {

P big.Int // Prime defining the underlying field
Q big.Int // Order of the prime-order base point
R int // Cofactor: Q*R is the total size of the curve
R int64 // Cofactor: Q*R is the total size of the curve

A, D big.Int // Edwards curve equation parameters

Expand Down
12 changes: 6 additions & 6 deletions proof/deniable.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (
// the Sigma-protocol proofs of any or all of the other participants.
// Different participants may produce different proofs of varying sizes,
// and may even consist of different numbers of steps.
func DeniableProver(suite Suite, self int, prover Prover,
func DeniableProver(suite Suite, self uint32, prover Prover,
verifiers []Verifier) Protocol {

return Protocol(func(ctx Context) []error {
Expand All @@ -25,7 +25,7 @@ func DeniableProver(suite Suite, self int, prover Prover,

type deniableProver struct {
suite Suite // Agreed-on ciphersuite for protocol
self int // Our own node number
self uint32 // Our own node number
sc Context // Clique protocol context

// verifiers for other nodes' proofs
Expand All @@ -43,14 +43,14 @@ type deniableProver struct {
err []error
}

func (dp *deniableProver) run(suite Suite, self int, prv Prover,
func (dp *deniableProver) run(suite Suite, self uint32, prv Prover,
vrf []Verifier, sc Context) []error {
dp.suite = suite
dp.self = self
dp.sc = sc
dp.prirand = sc.Random()

nnodes := len(vrf)
nnodes := uint32(len(vrf))
if self < 0 || self >= nnodes {
return []error{errors.New("out-of-range self node")}
}
Expand All @@ -60,7 +60,7 @@ func (dp *deniableProver) run(suite Suite, self int, prv Prover,
verr := errors.New("prover or verifier not run")
dp.err = make([]error, nnodes)
for i := range dp.err {
if i != self {
if uint32(i) != self {
dp.err[i] = verr
}
}
Expand Down Expand Up @@ -187,7 +187,7 @@ func (dp *deniableProver) challengeStep() error {
mix[j] ^= key[j]
}
}
if len(keys) <= dp.self || !bytes.Equal(keys[dp.self], dp.key) {
if uint32(len(keys)) <= dp.self || !bytes.Equal(keys[dp.self], dp.key) {
return errors.New("our own message was corrupted")
}

Expand Down
2 changes: 1 addition & 1 deletion proof/deniable_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func TestDeniable(t *testing.T) {
vpval := map[string]kyber.Point{"B": B, "X": nodes[vi].X}
vrfs[vi] = vpred.Verifier(suite, vpval)

n.proto = DeniableProver(suite, i, prover, vrfs)
n.proto = DeniableProver(suite, uint32(i), prover, vrfs)
n.outbox = make(chan []byte)
n.inbox = make(chan [][]byte)

Expand Down
4 changes: 2 additions & 2 deletions proof/hash_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func Example_hashProve2() {
}

// Make just one of them an actual public/private keypair (X[mine],x)
mine := 2 // only the signer knows this
mine := int32(2) // only the signer knows this
x := suite.Scalar().Pick(suite.RandomStream()) // create a private key x
X[mine] = suite.Point().Mul(x, nil) // corresponding public key X

Expand All @@ -116,7 +116,7 @@ func Example_hashProve2() {
fmt.Printf("Linkable Ring Signature Predicate:\n%s\n", pred.String())

// The prover needs to know which Or branch (mine) is actually true.
choice := make(map[Predicate]int)
choice := make(map[Predicate]int32)
choice[pred] = mine

// Generate the signature
Expand Down
40 changes: 20 additions & 20 deletions proof/proof.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ type Predicate interface {

// Create a Prover proving the statement this Predicate represents.
Prover(suite Suite, secrets map[string]kyber.Scalar,
points map[string]kyber.Point, choice map[Predicate]int) Prover
points map[string]kyber.Point, choice map[Predicate]int32) Prover

// Create a Verifier for the statement this Predicate represents.
Verifier(suite Suite, points map[string]kyber.Point) Verifier
Expand Down Expand Up @@ -103,17 +103,17 @@ const (
type proof struct {
s Suite

nsvars int // number of Scalar variables
npvars int // number of Point variables
svar, pvar []string // Scalar and Point variable names
sidx, pidx map[string]int // Maps from strings to variable indexes
nsvars uint32 // number of Scalar variables
npvars uint32 // number of Point variables
svar, pvar []string // Scalar and Point variable names
sidx, pidx map[string]uint32 // Maps from strings to variable indexes

pval map[string]kyber.Point // values of public Point variables

// prover-specific state
pc ProverContext
sval map[string]kyber.Scalar // values of private Scalar variables
choice map[Predicate]int // OR branch choices set by caller
choice map[Predicate]int32 // OR branch choices set by caller
pp map[Predicate]*proverPred // per-predicate prover state

// verifier-specific state
Expand Down Expand Up @@ -317,7 +317,7 @@ func (rp *repPred) verify(prf *proof, c kyber.Scalar, pr []kyber.Scalar) error {

func (rp *repPred) Prover(suite Suite, secrets map[string]kyber.Scalar,
points map[string]kyber.Point,
choice map[Predicate]int) Prover {
choice map[Predicate]int32) Prover {
return proof{}.init(suite, rp).prover(rp, secrets, points, choice)
}

Expand Down Expand Up @@ -427,7 +427,7 @@ func (ap *andPred) verify(prf *proof, c kyber.Scalar, pr []kyber.Scalar) error {

func (ap *andPred) Prover(suite Suite, secrets map[string]kyber.Scalar,
points map[string]kyber.Point,
choice map[Predicate]int) Prover {
choice map[Predicate]int32) Prover {
return proof{}.init(suite, ap).prover(ap, secrets, points, choice)
}

Expand Down Expand Up @@ -488,12 +488,12 @@ func (op *orPred) commit(prf *proof, w kyber.Scalar, pv []kyber.Scalar) error {
// We're on a proof-obligated branch;
// choose random pre-challenges for only non-obligated subs.
choice, ok := prf.choice[op]
if !ok || choice < 0 || choice >= len(sub) {
if !ok || choice < 0 || choice >= int32(len(sub)) {
return errors.New("no choice of proof branch for OR-predicate " +
op.String())
}
for i := 0; i < len(sub); i++ {
if i != choice {
if int32(i) != choice {
wi[i] = prf.s.Scalar()
prf.pc.PriRand(wi[i])
} // else wi[i] == nil for proof-obligated sub
Expand Down Expand Up @@ -536,7 +536,7 @@ func (op *orPred) respond(prf *proof, c kyber.Scalar, pr []kyber.Scalar) error {
cs := prf.s.Scalar().Set(c)
choice := prf.choice[op]
for i := 0; i < len(sub); i++ {
if i != choice {
if int32(i) != choice {
cs.Sub(cs, ci[i])
}
}
Expand Down Expand Up @@ -610,7 +610,7 @@ func (op *orPred) verify(prf *proof, c kyber.Scalar, pr []kyber.Scalar) error {

func (op *orPred) Prover(suite Suite, secrets map[string]kyber.Scalar,
points map[string]kyber.Point,
choice map[Predicate]int) Prover {
choice map[Predicate]int32) Prover {
return proof{}.init(suite, op).prover(op, secrets, points, choice)
}

Expand Down Expand Up @@ -641,25 +641,25 @@ func (prf proof) init(suite Suite, pred Predicate) *proof {
// Reserve variable index 0 for convenience.
prf.svar = []string{""}
prf.pvar = []string{""}
prf.sidx = make(map[string]int)
prf.pidx = make(map[string]int)
prf.sidx = make(map[string]uint32)
prf.pidx = make(map[string]uint32)
pred.enumVars(&prf)
prf.nsvars = len(prf.svar)
prf.npvars = len(prf.pvar)
prf.nsvars = uint32(len(prf.svar))
prf.npvars = uint32(len(prf.pvar))

return &prf
}

func (prf *proof) enumScalarVar(name string) {
if prf.sidx[name] == 0 {
prf.sidx[name] = len(prf.svar)
prf.sidx[name] = uint32(len(prf.svar))
prf.svar = append(prf.svar, name)
}
}

func (prf *proof) enumPointVar(name string) {
if prf.pidx[name] == 0 {
prf.pidx[name] = len(prf.pvar)
prf.pidx[name] = uint32(len(prf.pvar))
prf.pvar = append(prf.pvar, name)
}
}
Expand Down Expand Up @@ -705,7 +705,7 @@ func (prf *proof) getResponses(pr []kyber.Scalar, r []kyber.Scalar) error {

func (prf *proof) prove(p Predicate, sval map[string]kyber.Scalar,
pval map[string]kyber.Point,
choice map[Predicate]int, pc ProverContext) error {
choice map[Predicate]int32, pc ProverContext) error {
prf.pc = pc
prf.sval = sval
prf.pval = pval
Expand Down Expand Up @@ -752,7 +752,7 @@ func (prf *proof) verify(p Predicate, pval map[string]kyber.Point,
// Produce a higher-order Prover embodying a given proof predicate.
func (prf *proof) prover(p Predicate, sval map[string]kyber.Scalar,
pval map[string]kyber.Point,
choice map[Predicate]int) Prover {
choice map[Predicate]int32) Prover {

return Prover(func(ctx ProverContext) error {
return prf.prove(p, sval, pval, choice, ctx)
Expand Down
4 changes: 2 additions & 2 deletions proof/proof_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func TestRep(t *testing.T) {
Y := suite.Point().Mul(y, X)
R := suite.Point().Add(X, Y)

choice := make(map[Predicate]int)
choice := make(map[Predicate]int32)

// Simple single-secret predicate: prove X=x*B
log := Rep("X", "x", "B")
Expand Down Expand Up @@ -212,7 +212,7 @@ func Example_or2() {
// We'll need to tell the prover which Or clause is actually true.
// In this case clause 0, the first sub-predicate, is true:
// i.e., we know a secret x such that X=x*B.
choice := make(map[Predicate]int)
choice := make(map[Predicate]int32)
choice[pred] = 0

// Generate a proof that we know the discrete logarithm of X or Y.
Expand Down
Loading
Loading