package crypto
|
|
|
|
/*
|
|
#cgo CFLAGS: -g -m64 -O3 -fPIC -pthread
|
|
#cgo LDFLAGS: -lcrypto
|
|
|
|
#include <stdio.h>
|
|
#include "ed25519.h"
|
|
*/
|
|
import "C"
|
|
import "unsafe"
|
|
|
|
type Verify struct {
|
|
Message []byte
|
|
PubKey []byte
|
|
Signature []byte
|
|
Valid bool
|
|
}
|
|
|
|
func MakePubKey(privKey []byte) []byte {
|
|
pubKey := [32]byte{}
|
|
C.ed25519_publickey(
|
|
(*C.uchar)(unsafe.Pointer(&privKey[0])),
|
|
(*C.uchar)(unsafe.Pointer(&pubKey[0])),
|
|
)
|
|
return pubKey[:]
|
|
}
|
|
|
|
func SignMessage(message []byte, privKey []byte, pubKey []byte) []byte {
|
|
sig := [64]byte{}
|
|
C.ed25519_sign(
|
|
(*C.uchar)(unsafe.Pointer(&message[0])), (C.size_t)(len(message)),
|
|
(*C.uchar)(unsafe.Pointer(&privKey[0])),
|
|
(*C.uchar)(unsafe.Pointer(&pubKey[0])),
|
|
(*C.uchar)(unsafe.Pointer(&sig[0])),
|
|
)
|
|
return sig[:]
|
|
}
|
|
|
|
func VerifyBatch(verifys []*Verify) bool {
|
|
|
|
count := len(verifys)
|
|
|
|
msgs := make([]*byte, count)
|
|
lens := make([]C.size_t, count)
|
|
pubs := make([]*byte, count)
|
|
sigs := make([]*byte, count)
|
|
valids := make([]C.int, count)
|
|
|
|
for i, v := range verifys {
|
|
msgs[i] = (*byte)(unsafe.Pointer(&v.Message[0]))
|
|
lens[i] = (C.size_t)(len(v.Message))
|
|
pubs[i] = (*byte)(&v.PubKey[0])
|
|
sigs[i] = (*byte)(&v.Signature[0])
|
|
}
|
|
|
|
count_ := (C.size_t)(count)
|
|
msgs_ := (**C.uchar)(unsafe.Pointer(&msgs[0]))
|
|
lens_ := (*C.size_t)(unsafe.Pointer(&lens[0]))
|
|
pubs_ := (**C.uchar)(unsafe.Pointer(&pubs[0]))
|
|
sigs_ := (**C.uchar)(unsafe.Pointer(&sigs[0]))
|
|
|
|
res := C.ed25519_sign_open_batch(msgs_, lens_, pubs_, sigs_, count_, &valids[0])
|
|
|
|
for i, valid := range valids {
|
|
verifys[i].Valid = valid > 0
|
|
}
|
|
|
|
return res == 0
|
|
}
|