diff --git a/element.go b/element.go index a2a84f36c5a7e98d37b6e395ad3f9687929848d1..4e02c13f71e23f1787251155c501c476d6d4fbe2 100644 --- a/element.go +++ b/element.go @@ -7,6 +7,7 @@ import "C" import ( "fmt" + "hash" "math/big" "runtime" ) @@ -21,6 +22,8 @@ type Element interface { Set(Element) Element SetFromHash([]byte) Element + SetFromStringHash(s string, h hash.Hash) Element + SetBytes([]byte) Element SetXBytes([]byte) Element SetCompressedBytes([]byte) Element @@ -51,6 +54,7 @@ type Element interface { Sign() int Cmp(x Element) int + Equals(x Element) bool Add(x, y Element) Element Sub(x, y Element) Element diff --git a/element_checked.go b/element_checked.go index e35ba7e89664340576e9117bd403bf7529d5e8e8..e0c915bd541b958e063f32bbee538f2a0d5c7b83 100644 --- a/element_checked.go +++ b/element_checked.go @@ -5,7 +5,10 @@ package pbc */ import "C" -import "math/big" +import ( + "hash" + "math/big" +) func (el *checkedElement) impl() *elementImpl { return &el.unchecked } @@ -81,6 +84,11 @@ func (el *checkedElement) SetFromHash(hash []byte) Element { return el } +func (el *checkedElement) SetFromStringHash(s string, h hash.Hash) Element { + el.unchecked.SetFromStringHash(s, h) + return el +} + func (el *checkedElement) SetBytes(buf []byte) Element { el.unchecked.SetBytes(buf) return el @@ -159,6 +167,8 @@ func (el *checkedElement) Cmp(x Element) int { return el.unchecked.Cmp(x) } +func (el *checkedElement) Equals(x Element) bool { return el.unchecked.Equals(x) } + func (el *checkedElement) Add(x Element, y Element) Element { el.checkAllCompatible(x, y) el.unchecked.Add(x, y) diff --git a/element_unchecked.go b/element_unchecked.go index 1d4297199c348b331db74b40e9f39371409bc8d9..86757b3e7e864aa8a35081f4181122c146055d1a 100644 --- a/element_unchecked.go +++ b/element_unchecked.go @@ -6,6 +6,7 @@ package pbc import "C" import ( + "hash" "math/big" "unsafe" ) @@ -49,6 +50,14 @@ func (el *elementImpl) SetFromHash(hash []byte) Element { return el } +func (el *elementImpl) SetFromStringHash(s string, h hash.Hash) Element { + h.Reset() + if _, err := h.Write([]byte(s)); err != nil { + panic(ErrHashFailure) + } + return el.SetFromHash(h.Sum([]byte{})) +} + func (el *elementImpl) SetBytes(buf []byte) Element { C.element_from_bytes(el.data, (*C.uchar)(unsafe.Pointer(&buf[0]))) return el @@ -171,6 +180,8 @@ func (el *elementImpl) Cmp(x Element) int { return normalizeSign(int64(C.element_cmp(el.data, x.impl().data))) } +func (el *elementImpl) Equals(x Element) bool { return el.Cmp(x) == 0 } + func (el *elementImpl) Add(x, y Element) Element { C.element_add(el.data, x.impl().data, y.impl().data) return el diff --git a/errors.go b/errors.go index 5ae343dc835d6304732fda60384d5175cf40e81f..8ad9ad44216d52733b38f5fd00ba51c6114313ad 100644 --- a/errors.go +++ b/errors.go @@ -14,5 +14,6 @@ var ( ErrIllegalNil = errors.New("received nil when non-nil was expected") ErrOutOfRange = errors.New("index out of range") ErrEntropyFailure = errors.New("error while reading from entropy source") + ErrHashFailure = errors.New("error while hashing data") ErrInternal = errors.New("a severe internal error has lead to possible memory corruption") )