go-blockchain/wallet/signer.go

61 lines
1.8 KiB
Go
Raw Normal View History

// Copyright (c) 2017-2026 Lethean (https://lt.hn)
//
// Licensed under the European Union Public Licence (EUPL) version 1.2.
// You may obtain a copy of the licence at:
//
// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl
//
// SPDX-License-Identifier: EUPL-1.2
package wallet
import (
"dappco.re/go/core/blockchain/crypto"
"dappco.re/go/core/blockchain/types"
coreerr "dappco.re/go/core/log"
)
// Signer produces signatures for transaction inputs.
type Signer interface {
SignInput(prefixHash types.Hash, ephemeral KeyPair,
ring []types.PublicKey, realIndex int) ([]types.Signature, error)
Version() uint64
}
// NLSAGSigner signs using NLSAG ring signatures (v0/v1 transactions).
type NLSAGSigner struct{}
// SignInput generates a ring signature for a single transaction input. It
// derives the key image from the ephemeral key pair, then produces one
// signature element per ring member.
func (s *NLSAGSigner) SignInput(prefixHash types.Hash, ephemeral KeyPair,
ring []types.PublicKey, realIndex int) ([]types.Signature, error) {
ki, err := crypto.GenerateKeyImage(
[32]byte(ephemeral.Public), [32]byte(ephemeral.Secret))
if err != nil {
return nil, coreerr.E("NLSAGSigner.SignInput", "wallet: key image", err)
}
pubs := make([][32]byte, len(ring))
for i, k := range ring {
pubs[i] = [32]byte(k)
}
rawSigs, err := crypto.GenerateRingSignature(
[32]byte(prefixHash), ki, pubs,
[32]byte(ephemeral.Secret), realIndex)
if err != nil {
return nil, coreerr.E("NLSAGSigner.SignInput", "wallet: ring signature", err)
}
sigs := make([]types.Signature, len(rawSigs))
for i, rs := range rawSigs {
sigs[i] = types.Signature(rs)
}
return sigs, nil
}
// Version returns the transaction version this signer targets.
func (s *NLSAGSigner) Version() uint64 { return 1 }