aboutsummaryrefslogtreecommitdiff
path: root/bidder/bid.go
blob: 5f98a0cea6f3e7509211a710bd93f877cf00c23c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package bidder

import (
	"crypto/ed25519"
	"fmt"

	. "kesim.org/seal/nizk"

	"kesim.org/seal/nizk/commit"
	"kesim.org/seal/nizk/stage1"
)

type bid struct {
	id ed25519.PrivateKey
	Id ed25519.PublicKey

	price     uint64 // bigendian encoding of the bid
	bitlength uint8  // number of bits encoded in price.

	// bits are derived from zbid and the zero element in
	// the slice corresponds to the highest bit in zbid
	bits []*commit.Statement

	// The commitments we received from the bidders.
	bidders map[string][]*commit.Commitment

	// sorted list of the bidders.
	bidder_ids []string

	// Stage 1 data per round
	stage1 []*stage1.Statement
}

// newBid creates a new Bidder for the given price, using the lower bits up to bitlength
func newBid(price uint64, bitlength uint8) (b *bid, e error) {
	if bitlength > 63 {
		return nil, fmt.Errorf("bitlength too large, maximum is 63")
	} else if 0 != (price >> bitlength) {
		return nil, fmt.Errorf("price %d too large for given bitlength %d", price, bitlength)
	}

	b = &bid{
		price:     price,
		bitlength: bitlength,
	}

	b.Id, b.id, e = ed25519.GenerateKey(nil)
	if e != nil {
		return nil, e
	}

	b.bits = make([]*commit.Statement, bitlength)
	for i := bitlength; i > 0; i-- {
		set := (price>>(i-1)&1 != 0)
		x, r := Curve.RandomScalar(), Curve.RandomScalar()
		b.bits[i-1] = commit.NewStatement(x, r, set)
	}

	return b, nil
}

// Commit returns the public commitment to the bits and a signature
// TODO: return signature over bid
func (bid *bid) Commit() (c []*commit.Commitment) {
	c = make([]*commit.Commitment, len(bid.bits))
	for i := range bid.bits {
		c[i] = bid.bits[i].Commit(Bites(bid.Id))
	}
	return c
}

func (bid *bid) Result() {
}

func (bid *bid) Send(msg []byte, sig []byte) error {
	return fmt.Errorf("bidder.Send not implemented")
}