diff --git a/encrypt/ibe/ibe.go b/encrypt/ibe/ibe.go new file mode 100644 index 000000000..cb7a70027 --- /dev/null +++ b/encrypt/ibe/ibe.go @@ -0,0 +1,189 @@ +package ibe + +import ( + "crypto/rand" + "errors" + "fmt" + + "golang.org/x/crypto/blake2s" + + "github.com/drand/kyber" + "github.com/drand/kyber/pairing" + "github.com/drand/kyber/util/random" +) + +type Ciphertext struct { + // Random point rP + U kyber.Point + // Sigma attached to ID: sigma XOR H(rG_id) + V []byte + // ciphertext of the message M XOR H(sigma) + W []byte +} + +// H2Tag is the domain separation tag for the H2 hash function +func H2Tag() []byte { + return []byte("IBE-H2") +} + +// H3Tag is the domain separation tag for the H3 hash function +func H3Tag() []byte { + return []byte("IBE-H3") +} + +// H4Tag is the domain separation tag for the H4 hash function +func H4Tag() []byte { + return []byte("IBE-H4") +} + +// Encrypt implements the cca identity based encryption scheme from +// https://crypto.stanford.edu/~dabo/pubs/papers/bfibe.pdf for more information +// about the scheme. +// - master is the master key on G1 +// - ID is the ID towards which we encrypt the message +// - msg is the actual message +// - seed is the random seed to generate the random element (sigma) of the encryption +// The suite must produce points which implements the `HashablePoint` interface. +func Encrypt(s pairing.Suite, master kyber.Point, ID, msg []byte) (*Ciphertext, error) { + if len(msg)>>16 > 0 { + // we're using blake2 as XOF which only outputs 2^16-1 length + return nil, errors.New("plaintext too long for blake2") + } + // 1. Compute Gid = e(master,Q_id) + hG2, ok := s.G2().Point().(kyber.HashablePoint) + if !ok { + return nil, errors.New("point needs to implement `kyber.HashablePoint`") + } + Qid := hG2.Hash(ID) + Gid := s.Pair(master, Qid) + + // 2. Derive random sigma + sigma := make([]byte, len(msg)) + if _, err := rand.Read(sigma); err != nil { + return nil, fmt.Errorf("err reading rand sigma: %v", err) + } + // 3. Derive r from sigma and msg + r, err := h3(s, sigma, msg) + if err != nil { + return nil, err + } + // 4. Compute U = rP + U := s.G1().Point().Mul(r, s.G1().Point().Base()) + + // 5. Compute V = sigma XOR H2(rGid) + rGid := Gid.Mul(r, Gid) // even in Gt, it's additive notation + hrGid, err := gtToHash(rGid, len(msg), H2Tag()) + if err != nil { + return nil, err + } + V := xor(sigma, hrGid) + + // 6. Compute M XOR H(sigma) + hsigma, err := h4(sigma, len(msg)) + if err != nil { + return nil, err + } + W := xor(msg, hsigma) + + return &Ciphertext{ + U: U, + V: V, + W: W, + }, nil +} + +func Decrypt(s pairing.Suite, private kyber.Point, c *Ciphertext) ([]byte, error) { + // 1. Compute sigma = V XOR H2(e(rP,private)) + gidt := s.Pair(c.U, private) + hgidt, err := gtToHash(gidt, len(c.W), H2Tag()) + if err != nil { + return nil, err + } + if len(hgidt) != len(c.V) { + return nil, fmt.Errorf("XorSigma is of invalid length: exp %d vs got %d", len(hgidt), len(c.V)) + } + sigma := xor(hgidt, c.V) + + // 2. Compute M = W XOR H4(sigma) + hsigma, err := h4(sigma, len(c.W)) + if err != nil { + return nil, err + } + + msg := xor(hsigma, c.W) + + // 3. Check U = rP + r, err := h3(s, sigma, msg) + if err != nil { + return nil, err + } + rP := s.G1().Point().Mul(r, s.G1().Point().Base()) + if !rP.Equal(c.U) { + return nil, fmt.Errorf("invalid proof: rP check failed") + } + return msg, nil + +} + +const maxSize = 1 << 10 + +// hash sigma and msg to get r +func h3(s pairing.Suite, sigma, msg []byte) (kyber.Scalar, error) { + h3, err := blake2s.NewXOF(maxSize, nil) + if err != nil { + panic(err) + } + if _, err := h3.Write(H3Tag()); err != nil { + return nil, fmt.Errorf("err hashing h3 tag: %v", err) + } + if _, err := h3.Write(sigma); err != nil { + return nil, fmt.Errorf("err hashing sigma to XOF: %v", err) + } + _, _ = h3.Write(msg) + return s.G1().Scalar().Pick(random.New(h3)), nil +} + +func h4(sigma []byte, length int) ([]byte, error) { + h4, err := blake2s.NewXOF(maxSize, nil) + if err != nil { + panic(err) + } + if _, err := h4.Write(H4Tag()); err != nil { + return nil, fmt.Errorf("err writing h4tag: %v", err) + } + if _, err := h4.Write(sigma); err != nil { + return nil, fmt.Errorf("err writing sigma to h4: %v", err) + } + h4sigma := make([]byte, length) + if _, err := h4.Read(h4sigma); err != nil { + return nil, fmt.Errorf("err reading from h4: %v", err) + } + return h4sigma, nil +} + +func gtToHash(gt kyber.Point, length int, dst []byte) ([]byte, error) { + xof, err := blake2s.NewXOF(maxSize, nil) + if err != nil { + return nil, err + } + if _, err := xof.Write(dst); err != nil { + return nil, errors.New("err writing dst to gtHash") + } + gt.MarshalTo(xof) + var b = make([]byte, length) + if _, err := xof.Read(b); err != nil { + return nil, errors.New("couldn't read from xof") + } + return b[:], nil +} + +func xor(a, b []byte) []byte { + if len(a) != len(b) { + panic("wrong xor input") + } + res := make([]byte, len(a)) + for i := 0; i < len(a); i++ { + res[i] = a[i] ^ b[i] + } + return res +} diff --git a/encrypt/ibe/ibe_test.go b/encrypt/ibe/ibe_test.go new file mode 100644 index 000000000..9a7beb946 --- /dev/null +++ b/encrypt/ibe/ibe_test.go @@ -0,0 +1,83 @@ +package ibe + +import ( + "strings" + "testing" + + "github.com/drand/kyber" + bls "github.com/drand/kyber-bls12381" + "github.com/drand/kyber/pairing" + "github.com/drand/kyber/util/random" + "github.com/stretchr/testify/require" +) + +func newSetting() (pairing.Suite, kyber.Point, []byte, kyber.Point) { + suite := bls.NewBLS12381Suite() + P := suite.G1().Point().Base() + s := suite.G1().Scalar().Pick(random.New()) + Ppub := suite.G1().Point().Mul(s, P) + + ID := []byte("passtherand") + IDP := suite.G2().Point().(kyber.HashablePoint) + Qid := IDP.Hash(ID) // public key + sQid := Qid.Mul(s, Qid) // secret key + return suite, Ppub, ID, sQid +} + +func TestValidTimelockEncryptionDecryptsCorrectly(t *testing.T) { + suite, Ppub, ID, sQid := newSetting() + msg := []byte("Hello World\n") + + c, err := Encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + msg2, err := Decrypt(suite, sQid, c) + require.NoError(t, err) + require.Equal(t, msg, msg2) +} + +func TestInvalidSigmaFailsDecryption(t *testing.T) { + suite, Ppub, ID, sQid := newSetting() + msg := []byte("Hello World\n") + + c, err := Encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.V = []byte("somenonsense") + + _, err = Decrypt(suite, sQid, c) + require.Error(t, err) + require.ErrorContains(t, err, "invalid proof") +} + +func TestInvalidMessageFailsDecryption(t *testing.T) { + suite, Ppub, ID, sQid := newSetting() + msg := []byte("Hello World\n") + + c, err := Encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.W = []byte("somenonsense") + _, err = Decrypt(suite, sQid, c) + require.Error(t, err) + require.ErrorContains(t, err, "invalid proof") +} + +func TestVeryLongInputFailsEncryption(t *testing.T) { + suite, Ppub, ID, _ := newSetting() + msg := []byte(strings.Repeat("And you have to understand this, that a prince, especially a new one, cannot observe all those things for which men are esteemed", 1000)) + _, err := Encrypt(suite, Ppub, ID, msg) + require.Error(t, err) +} + +func TestVeryLongCipherFailsDecryptionBecauseOfLength(t *testing.T) { + suite, Ppub, ID, sQid := newSetting() + msg := []byte("hello world") + c, err := Encrypt(suite, Ppub, ID, msg) + require.NoError(t, err) + + c.W = []byte(strings.Repeat("And you have to understand this, that a prince, especially a new one, cannot observe all those things for which men are esteemed", 1000)) + _, err = Decrypt(suite, sQid, c) + + require.Error(t, err) + require.ErrorContains(t, err, "XorSigma is of invalid length") +} diff --git a/go.mod b/go.mod index e779dc66a..c06625732 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,21 @@ module github.com/drand/kyber -go 1.13 +go 1.17 require ( - github.com/drand/kyber-bls12381 v0.2.1 - github.com/jonboulle/clockwork v0.1.0 - github.com/stretchr/testify v1.4.0 + github.com/drand/kyber-bls12381 v0.2.2 + github.com/jonboulle/clockwork v0.3.0 + github.com/stretchr/testify v1.7.2 go.dedis.ch/fixbuf v1.0.3 go.dedis.ch/protobuf v1.0.11 - golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a - golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e + golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/kilic/bls12-381 v0.1.0 // indirect + github.com/kr/pretty v0.2.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index f02bc4059..61f1db348 100644 --- a/go.sum +++ b/go.sum @@ -1,26 +1,26 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/drand/bls12-381 v0.3.2 h1:RImU8Wckmx8XQx1tp1q04OV73J9Tj6mmpQLYDP7V1XE= github.com/drand/bls12-381 v0.3.2/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.2/go.mod h1:x6KOpK7avKj0GJ4emhXFP5n7M7W7ChAPmnQh/OL6vRw= github.com/drand/kyber v1.1.4/go.mod h1:9+IgTq7kadePhZg7eRwSD7+bA+bmvqRK+8DtmoV5a3U= -github.com/drand/kyber-bls12381 v0.2.0 h1:3GJfiHaMggQS2l2n7yrfX0PjY9BYikLM2f0zKP1eZTs= +github.com/drand/kyber v1.1.10/go.mod h1:UkHLsI4W6+jT5PvNxmc0cvQAgppjTUpX+XCsN9TXmRo= github.com/drand/kyber-bls12381 v0.2.0/go.mod h1:zQip/bHdeEB6HFZSU3v+d3cQE0GaBVQw9aR2E7AdoeI= -github.com/drand/kyber-bls12381 v0.2.1 h1:/d5/YAdaCmHpYjF1NZevOEcKGaq6LBbyvkCTIdGqDjs= github.com/drand/kyber-bls12381 v0.2.1/go.mod h1:JwWn4nHO9Mp4F5qCie5sVIPQZ0X6cw8XAeMRvc/GXBE= -github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= +github.com/drand/kyber-bls12381 v0.2.2 h1:MsqhbRUNIziZVGg5nT/AgZFXjKSc4Vd8jkBC0Y0sq4c= +github.com/drand/kyber-bls12381 v0.2.2/go.mod h1:FsudUZf6Xu61u/gYrDHEHf6lKIKluJdnX7WJe4hkMh4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f h1:qET3Wx0v8tMtoTOQnsJXVvqvCopSf48qobR6tcJuDHo= +github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= +github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/kilic/bls12-381 v0.0.0-20200607163746-32e1441c8a9f/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= -github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5 h1:RAGCvOaqSiey3BGHopL/JI6+baO7D7AYQVDb6I8pRTs= github.com/kilic/bls12-381 v0.0.0-20200731194930-64c428e1bff5/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= -github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391 h1:51kHw7l/dUDdOdW06AlUGT5jnpj6nqQSILebcsikSjA= github.com/kilic/bls12-381 v0.0.0-20200820230200-6b2c19996391/go.mod h1:XXfR6YFCRSrkEXbNlIyDsgXVNJWVUV30m/ebkVy9n6s= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= +github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -28,8 +28,9 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= @@ -42,33 +43,37 @@ go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYr golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d h1:9FCpayM9Egr1baVnV1SX0H87m+XB0B8S0hAMi99X/3U= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d h1:QQrM/CCYEzTs91GZylDCQjGHudbPTxF/1fvXdVh5lMo= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c h1:38q6VNPWR010vN82/SB121GujZNIfAUb4YttE2rhGuc= golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/hash.go b/hash.go index 5632df31a..3bfc9c545 100644 --- a/hash.go +++ b/hash.go @@ -1,8 +1,15 @@ package kyber -import "hash" +import ( + "hash" +) // A HashFactory is an interface that can be mixed in to local suite definitions. type HashFactory interface { Hash() hash.Hash } + +// HashablePoint is an interface implemented by n +type HashablePoint interface { + Hash([]byte) Point +}