mirror of
https://github.com/cloudflare/redoctober.git
synced 2026-01-08 07:11:48 +00:00
72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
package msp
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/rand"
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
type Database map[string][][]byte
|
|
|
|
func (d *Database) ValidUser(name string) bool {
|
|
_, ok := (*d)[name]
|
|
return ok
|
|
}
|
|
|
|
func (d *Database) CanGetShare(name string) bool {
|
|
_, ok := (*d)[name]
|
|
return ok
|
|
}
|
|
|
|
func (d *Database) GetShare(name string) ([][]byte, error) {
|
|
out, ok := (*d)[name]
|
|
|
|
if ok {
|
|
return out, nil
|
|
}
|
|
return nil, errors.New("Not found!")
|
|
}
|
|
|
|
func TestMSP(t *testing.T) {
|
|
db := &Database{
|
|
"Alice": [][]byte{},
|
|
"Bob": [][]byte{},
|
|
"Carl": [][]byte{},
|
|
}
|
|
|
|
sec := make([]byte, 16)
|
|
rand.Read(sec)
|
|
sec[0] &= 63 // Removes first 2 bits of key.
|
|
|
|
predicate, _ := StringToMSP("(2, (1, Alice, Bob), Carl)")
|
|
|
|
shares1, _ := predicate.DistributeShares(sec, db)
|
|
shares2, _ := predicate.DistributeShares(sec, db)
|
|
|
|
alice := bytes.Compare(shares1["Alice"][0], shares2["Alice"][0])
|
|
bob := bytes.Compare(shares1["Bob"][0], shares2["Bob"][0])
|
|
carl := bytes.Compare(shares1["Carl"][0], shares2["Carl"][0])
|
|
|
|
if alice == 0 && bob == 0 && carl == 0 {
|
|
t.Fatalf("Key splitting isn't random! %v %v", shares1, shares2)
|
|
}
|
|
|
|
db1 := Database(shares1)
|
|
db2 := Database(shares2)
|
|
|
|
sec1, err := predicate.RecoverSecret(&db1)
|
|
if err != nil {
|
|
t.Fatalf("#1: %v", err)
|
|
}
|
|
|
|
sec2, err := predicate.RecoverSecret(&db2)
|
|
if err != nil {
|
|
t.Fatalf("#2: %v", err)
|
|
}
|
|
|
|
if !(bytes.Compare(sec, sec1) == 0 && bytes.Compare(sec, sec2) == 0) {
|
|
t.Fatalf("Secrets derived differed: %v %v %v", sec, sec1, sec2)
|
|
}
|
|
}
|