package wrapper /* #cgo CFLAGS: -I../../ref/csidh #cgo LDFLAGS: -L../../bin -lcsidh #include */ import "C" import ( "unsafe" csidh "github.com/henrydcase/nobs/dh/csidh" ) const ( PrvSz = 37 PubSz = 64 SsSz = 64 ) type Ref struct {} // Converts Golang's byte array to C's unsigned char. 'c' must // have same size as byte func (Ref) toBytes(c []C.uchar, b []byte) { if len(c) != len(b) { panic("len c!= len b") } for i,v := range(b) { c[i] = C.uchar(v) } } func (Ref) KeygenPrv() (prv csidh.PrivateKey) { var buf [PrvSz]C.uchar C.keygen_prv(&buf[0]) prv.Import(C.GoBytes(unsafe.Pointer(&buf[0]), C.int(len(buf)))) return } func (c Ref) KeygenPub(prv *csidh.PrivateKey) (pub csidh.PublicKey) { var prv_c_buf [PrvSz]C.uchar var pub_c_buf [PubSz]C.uchar var prv_g_buf [PrvSz]byte if !prv.Export(prv_g_buf[:]) { panic("Can't export private key") } c.toBytes(prv_c_buf[:], prv_g_buf[:]) C.keygen_pub(&pub_c_buf[0], &prv_c_buf[0]) pub.Import(C.GoBytes(unsafe.Pointer(&pub_c_buf[0]), C.int(len(pub_c_buf)))) return } func (c Ref) Derive(ss []byte, pub *csidh.PublicKey, prv *csidh.PrivateKey) { var prv_c_buf [PrvSz]C.uchar var pub_c_buf [PubSz]C.uchar var prv_g_buf [PrvSz]byte var pub_g_buf [PubSz]byte var ss_c_buf [SsSz]C.uchar if !pub.Export(pub_g_buf[:]) { panic("Can't export public key") } if !prv.Export(prv_g_buf[:]) { panic("Can't export private key") } c.toBytes(pub_c_buf[:], pub_g_buf[:]) c.toBytes(prv_c_buf[:], prv_g_buf[:]) C.derive(&ss_c_buf[0], &pub_c_buf[0], &prv_c_buf[0]) copy(ss, C.GoBytes(unsafe.Pointer(&ss_c_buf[0]), C.int(len(ss_c_buf)))) } func (c Ref) Validate(a []byte) bool { var pub_c_buf [PubSz]C.uchar c.toBytes(pub_c_buf[:], a[:]) return C.is_valid(&pub_c_buf[0]) != 0 }