You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

70 lines
1.5 KiB

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
}