sidh-torture/csidh/ref/go-wrapper/wrapper.go

81 lines
1.9 KiB
Go

package wrapper
/*
#cgo CFLAGS: -I../../ref/csidh
#cgo LDFLAGS: -L../../bin -lcsidh
#include <csidh.h>
*/
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
}