Skip to content

Commit 7bb0624

Browse files
author
Adam Langley
committed
Initial import
0 parents  commit 7bb0624

26 files changed

+7353
-0
lines changed

README.md

Lines changed: 155 additions & 0 deletions
Large diffs are not rendered by default.

bbssig/bbssig.go

Lines changed: 542 additions & 0 deletions
Large diffs are not rendered by default.

bbssig/bbssig_test.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package bbssig
2+
3+
import (
4+
"bytes"
5+
"crypto/rand"
6+
"crypto/sha256"
7+
"testing"
8+
)
9+
10+
func TestMarshal(t *testing.T) {
11+
priv, err := GenerateGroup(rand.Reader)
12+
if err != nil {
13+
t.Fatalf("failed to generate group: %s", err)
14+
}
15+
16+
groupBytes := priv.Group.Marshal()
17+
_, ok := new(Group).Unmarshal(groupBytes)
18+
if !ok {
19+
t.Error("failed to unmarshal group")
20+
}
21+
22+
group2, ok := new(Group).Unmarshal(groupBytes)
23+
if !ok {
24+
t.Error("failed to unmarshal group")
25+
}
26+
27+
if group2Bytes := group2.Marshal(); !bytes.Equal(groupBytes, group2Bytes) {
28+
t.Error("reserialising group produces different result")
29+
}
30+
31+
_, ok = new(PrivateKey).Unmarshal(group2, priv.Marshal())
32+
if !ok {
33+
t.Error("failed to unmarshal private key")
34+
}
35+
}
36+
37+
func TestSign(t *testing.T) {
38+
priv, err := GenerateGroup(rand.Reader)
39+
if err != nil {
40+
t.Fatalf("failed to generate group: %s", err)
41+
}
42+
43+
group := priv.Group
44+
member, err := priv.NewMember(rand.Reader)
45+
if err != nil {
46+
t.Fatalf("failed to add member to group: %s", err)
47+
}
48+
49+
msg := []byte("hello world")
50+
h := sha256.New()
51+
h.Write(msg)
52+
digest := h.Sum(nil)
53+
54+
ok := false
55+
groupBytes := group.Marshal()
56+
group, ok = new(Group).Unmarshal(groupBytes)
57+
if !ok {
58+
t.Fatalf("failed to unmarshal group")
59+
}
60+
61+
sig, err := member.Sign(rand.Reader, digest, h)
62+
if err != nil {
63+
t.Fatalf("failed to sign message: %s", err)
64+
}
65+
66+
if !group.Verify(digest, h, sig) {
67+
t.Errorf("signature failed to verify")
68+
}
69+
70+
digest[1] ^= 0x80
71+
if group.Verify(digest, h, sig) {
72+
t.Errorf("signature always verifies")
73+
}
74+
digest[1] ^= 0x80
75+
76+
tag, ok := priv.Open(sig)
77+
if !ok {
78+
t.Fatalf("failed to open signature")
79+
}
80+
81+
if !bytes.Equal(tag, member.Tag()) {
82+
t.Errorf("Open returned wrong tag value")
83+
}
84+
85+
member2, err := priv.NewMember(rand.Reader)
86+
if err != nil {
87+
t.Fatalf("failed to add second member: %s", err)
88+
}
89+
rev := priv.GenerateRevocation(member)
90+
91+
group.Update(rev)
92+
if group.Verify(digest, h, sig) {
93+
t.Errorf("signature still verifies after revocation")
94+
}
95+
96+
if member.Update(rev) {
97+
t.Errorf("revoked key successfully updated")
98+
}
99+
100+
sig2, err := member2.Sign(rand.Reader, digest, h)
101+
if err != nil {
102+
t.Fatalf("failed to sign second message: %s", err)
103+
}
104+
105+
if group.Verify(digest, h, sig2) {
106+
t.Errorf("signature verified before member key updated")
107+
}
108+
109+
member2.Group.Update(rev)
110+
111+
if !member2.Update(rev) {
112+
t.Errorf("unrevoked member failed to update")
113+
}
114+
115+
sig3, err := member2.Sign(rand.Reader, digest, h)
116+
if err != nil {
117+
t.Fatalf("failed to sign second message: %s", err)
118+
}
119+
120+
if !group.Verify(digest, h, sig3) {
121+
t.Errorf("updated signature failed to verify")
122+
}
123+
}

client/TODO

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Short-term TODOs:
2+
3+
Allow for immediate deletion.
4+
Expose server queue length in fetches
5+
Delete messages while UI is open.
6+
? Add delay to server responses.
7+
Compress messages

0 commit comments

Comments
 (0)