1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
// A C implementation of the Ristretto group based on the PandA library
// by Chuengsatiansup, Ribarski and Schwabe, which we use as a reference
// of our pure Go implementation.
// See also https://link.springer.com/chapter/10.1007/978-3-319-04873-4_14
package cref
// #include "cref.h"
import "C"
type Fe25519 C.fe25519
type GroupGe C.group_ge
type GroupScalar C.group_scalar
func (f *Fe25519) c() *C.fe25519 {
return (*C.fe25519)(f)
}
func (f *Fe25519) Unpack(buf *[32]byte) {
C.fe25519_unpack(f.c(), (*C.uchar)(&buf[0]))
}
func (f *Fe25519) Pack(buf *[32]byte) {
C.fe25519_pack((*C.uchar)(&buf[0]), f.c())
}
func (g *GroupGe) c() *C.group_ge {
return (*C.group_ge)(g)
}
func (g *GroupGe) Pack(buf *[32]byte) {
C.group_ge_pack((*C.uchar)(&buf[0]), g.c())
}
func (g *GroupGe) Unpack(buf *[32]byte) int {
return int(C.group_ge_unpack(g.c(), (*C.uchar)(&buf[0])))
}
func (g *GroupGe) Elligator(r0 *Fe25519) {
C.group_ge_elligator(g.c(), r0.c())
}
func (g *GroupGe) Neg(x *GroupGe) {
C.group_ge_negate(g.c(), x.c())
}
func (g *GroupGe) Add(x, y *GroupGe) {
C.group_ge_add(g.c(), x.c(), y.c())
}
func (g *GroupGe) Double(x *GroupGe) {
C.group_ge_double(g.c(), x.c())
}
func (g *GroupGe) ScalarMult(x *GroupGe, s *GroupScalar) {
C.group_ge_scalarmult(g.c(), x.c(), s.c())
}
func (g *GroupGe) X() *Fe25519 {
return (*Fe25519)(&g.c().x)
}
func (g *GroupGe) Y() *Fe25519 {
return (*Fe25519)(&g.c().y)
}
func (g *GroupGe) Z() *Fe25519 {
return (*Fe25519)(&g.c().z)
}
func (g *GroupGe) T() *Fe25519 {
return (*Fe25519)(&g.c().t)
}
func (s *GroupScalar) c() *C.group_scalar {
return (*C.group_scalar)(s)
}
func (s *GroupScalar) Unpack(buf *[32]byte) {
C.group_scalar_unpack(s.c(), (*C.uchar)(&buf[0]))
}
func (s *GroupScalar) Pack(buf *[32]byte) {
C.group_scalar_pack((*C.uchar)(&buf[0]), s.c())
}
|