arnaucube
arnaucube/go-iden3-cryptoPublic Self-hosted repository
Add scanner/valuer interface to PublicKey
a_bennassar arnaubennassar5@gmail.com
Thu, 13 Aug 2020 12:19:01 +0200
commit

a86308cb0bed12a0eaec50ee0f8cab06dec279df

parent

d91a4261f1174126b6e6f42109a3b9fbe98ec0c5

2 files changed, 41 insertions(+), 1 deletions(-)

jump to
M babyjub/eddsa.go → babyjub/eddsa.go

@@ -283,3 +283,28 @@ right := NewPoint().Mul(r1, p.Point())

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 +}
M babyjub/eddsa_test.go → babyjub/eddsa_test.go

@@ -135,12 +135,27 @@ assert.Equal(t, true, ok)

} } -func TestScannerValuer(t *testing.T) { +func TestSignatureScannerValuer(t *testing.T) { privK := NewRandPrivKey() var value driver.Valuer var scan sql.Scanner value = privK.SignPoseidon(big.NewInt(674238462)) scan = privK.SignPoseidon(big.NewInt(1)) + fromDB, err := value.Value() + assert.NoError(t, err) + assert.NoError(t, scan.Scan(fromDB)) + 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))