//
// Copyright Coinbase, Inc. All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//

package curves

import (
	"crypto/ecdsa"
	"math/big"
)

// EcdsaVerify runs a curve- or algorithm-specific ECDSA verification function on input
// an ECDSA public (verification) key, a message digest, and an ECDSA signature.
// It must return true if all the parameters are sane and the ECDSA signature is valid,
// and false otherwise
type EcdsaVerify func(pubKey *EcPoint, hash []byte, signature *EcdsaSignature) bool

// EcdsaSignature represents a (composite) digital signature
type EcdsaSignature struct {
	V    int
	R, S *big.Int
}

// Static type assertion
var _ EcdsaVerify = VerifyEcdsa

// Verifies ECDSA signature using core types.
func VerifyEcdsa(pk *EcPoint, hash []byte, sig *EcdsaSignature) bool {
	return ecdsa.Verify(
		&ecdsa.PublicKey{
			Curve: pk.Curve,
			X:     pk.X,
			Y:     pk.Y,
		},
		hash, sig.R, sig.S)
}