Update go.mod module line, all require/replace directives, and every .go import path from forge.lthn.ai/core/go-blockchain to dappco.re/go/core/blockchain. Add replace directives to bridge dappco.re paths to existing forge.lthn.ai registry during migration. Update CLAUDE.md, README, and docs to reflect the new module path. Co-Authored-By: Virgil <virgil@lethean.io>
89 lines
2.4 KiB
Go
89 lines
2.4 KiB
Go
// 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
|
|
}
|