From a86308cb0bed12a0eaec50ee0f8cab06dec279df Mon Sep 17 00:00:00 2001 From: a_bennassar Date: Thu, 13 Aug 2020 12:19:01 +0200 Subject: [PATCH] Add scanner/valuer interface to PublicKey --- babyjub/eddsa.go | 25 +++++++++++++++++++++++++ babyjub/eddsa_test.go | 17 ++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/babyjub/eddsa.go b/babyjub/eddsa.go index e2cf78c..e6acbf0 100644 --- a/babyjub/eddsa.go +++ b/babyjub/eddsa.go @@ -283,3 +283,28 @@ func (p *PublicKey) VerifyPoseidon(msg *big.Int, sig *Signature) bool { right.Add(sig.R8, right) // right = 8 * R + 8 * hm * A return (left.X.Cmp(right.X) == 0) && (left.Y.Cmp(right.Y) == 0) } + +// Scan implements Scanner for database/sql. +func (p *PublicKey) Scan(src interface{}) error { + srcB, ok := src.([]byte) + if !ok { + return fmt.Errorf("can't scan %T into PublicKey", src) + } + if len(srcB) != 32 { + return fmt.Errorf("can't scan []byte of len %d into PublicKey, want %d", len(srcB), 32) + } + var comp PublicKeyComp + copy(comp[:], srcB) + decomp, err := comp.Decompress() + if err != nil { + return err + } + *p = *decomp + return nil +} + +// Value implements valuer for database/sql. +func (p *PublicKey) Value() (driver.Value, error) { + comp := p.Compress() + return comp[:], nil +} diff --git a/babyjub/eddsa_test.go b/babyjub/eddsa_test.go index 8de435c..1989785 100644 --- a/babyjub/eddsa_test.go +++ b/babyjub/eddsa_test.go @@ -135,7 +135,7 @@ func TestCompressDecompress(t *testing.T) { } } -func TestScannerValuer(t *testing.T) { +func TestSignatureScannerValuer(t *testing.T) { privK := NewRandPrivKey() var value driver.Valuer var scan sql.Scanner @@ -147,6 +147,21 @@ func TestScannerValuer(t *testing.T) { assert.Equal(t, value, scan) } +func TestPubKeyScannerValuer(t *testing.T) { + privKValue := NewRandPrivKey() + pubKValue := privKValue.Public() + privKScan := NewRandPrivKey() + pubKScan := privKScan.Public() + var value driver.Valuer + var scan sql.Scanner + value = pubKValue + scan = pubKScan + fromDB, err := value.Value() + assert.NoError(t, err) + assert.NoError(t, scan.Scan(fromDB)) + assert.Equal(t, value, scan) +} + func BenchmarkBabyjubEddsa(b *testing.B) { var k PrivateKey _, err := hex.Decode(k[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))