go-blockchain/crypto/keygen.go

90 lines
2.4 KiB
Go
Raw Permalink Normal View History

// SPDX-Licence-Identifier: EUPL-1.2
package crypto
/*
#include "bridge.h"
*/
import "C"
import (
"fmt"
"unsafe"
coreerr "dappco.re/go/core/log"
)
// GenerateKeys creates a new random key pair.
func GenerateKeys() (pub [32]byte, sec [32]byte, err error) {
rc := C.cn_generate_keys(
(*C.uint8_t)(unsafe.Pointer(&pub[0])),
(*C.uint8_t)(unsafe.Pointer(&sec[0])),
)
if rc != 0 {
err = coreerr.E("GenerateKeys", fmt.Sprintf("generate_keys failed (rc=%d)", rc), nil)
}
return
}
// SecretToPublic derives the public key from a secret key.
func SecretToPublic(sec [32]byte) ([32]byte, error) {
var pub [32]byte
rc := C.cn_secret_to_public(
(*C.uint8_t)(unsafe.Pointer(&sec[0])),
(*C.uint8_t)(unsafe.Pointer(&pub[0])),
)
if rc != 0 {
return pub, coreerr.E("SecretToPublic", fmt.Sprintf("secret_to_public failed (rc=%d)", rc), nil)
}
return pub, nil
}
// CheckKey validates that a public key is a valid curve point.
func CheckKey(pub [32]byte) bool {
return C.cn_check_key((*C.uint8_t)(unsafe.Pointer(&pub[0]))) == 0
}
// GenerateKeyDerivation computes the ECDH shared secret (key derivation).
func GenerateKeyDerivation(pub [32]byte, sec [32]byte) ([32]byte, error) {
var d [32]byte
rc := C.cn_generate_key_derivation(
(*C.uint8_t)(unsafe.Pointer(&pub[0])),
(*C.uint8_t)(unsafe.Pointer(&sec[0])),
(*C.uint8_t)(unsafe.Pointer(&d[0])),
)
if rc != 0 {
return d, coreerr.E("GenerateKeyDerivation", "generate_key_derivation failed", nil)
}
return d, nil
}
// DerivePublicKey derives an ephemeral public key for a transaction output.
func DerivePublicKey(derivation [32]byte, index uint64, base [32]byte) ([32]byte, error) {
var derived [32]byte
rc := C.cn_derive_public_key(
(*C.uint8_t)(unsafe.Pointer(&derivation[0])),
C.uint64_t(index),
(*C.uint8_t)(unsafe.Pointer(&base[0])),
(*C.uint8_t)(unsafe.Pointer(&derived[0])),
)
if rc != 0 {
return derived, coreerr.E("DerivePublicKey", "derive_public_key failed", nil)
}
return derived, nil
}
// DeriveSecretKey derives the ephemeral secret key for a received output.
func DeriveSecretKey(derivation [32]byte, index uint64, base [32]byte) ([32]byte, error) {
var derived [32]byte
rc := C.cn_derive_secret_key(
(*C.uint8_t)(unsafe.Pointer(&derivation[0])),
C.uint64_t(index),
(*C.uint8_t)(unsafe.Pointer(&base[0])),
(*C.uint8_t)(unsafe.Pointer(&derived[0])),
)
if rc != 0 {
return derived, coreerr.E("DeriveSecretKey", "derive_secret_key failed", nil)
}
return derived, nil
}