I am signing a transaction by using a private key in AWS Cloud HSM. But not able to recover the correct public key from the signature. Every time I try to run **ECRecover** method, it generates different public key.

I am able to retrieve the R and S from ECDSA signature generated by AWS Cloud HSM in the following code: 

```golang
import (ethcrypto "github.com/ethereum/go-ethereum/crypto")
// SignatureValues returns signature values [R || S]
func (e *Ethereum) SignatureValues(sig []byte) (r, s *big.Int, err error) {
	r = new(big.Int).SetBytes(sig[:32])
	s = new(big.Int).SetBytes(sig[32:64])
	return r, s, nil
}
```

And below code snippet tries to find the correct signature to be verified:

```golang

    sig := make([]byte, 65)

	denTwo := big.NewInt(2)
	rightS := big.NewInt(0)
	curve := elliptic.P256()

	/*
		URL: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2.md
		All transaction signatures whose s-value is greater than secp256k1n/2 are now considered invalid.
		The ECDSA recover precompiled contract remains unchanged and will keep accepting high s-values; this is useful
		e.g. if a contract recovers old Bitcoin signatures.
	*/
	rightS = rightS.Div(curve.Params().N, denTwo)

	if rightS.Cmp(S) == -1 {
		S = S.Sub(curve.Params().N, S)
		log.Println("S: ", S.String())
		rbytes, sbytes := R.Bytes(), S.Bytes()
		copy(sig[32-len(rbytes):32], rbytes)
		copy(sig[64-len(sbytes):64], sbytes)
		log.Println("Result : ", verifyECRecover(hash.Bytes(), sig, expectedPubKey))
	} else {
		rbytes, sbytes := R.Bytes(), S.Bytes()
		copy(sig[32-len(rbytes):32], rbytes)
		copy(sig[64-len(sbytes):64], sbytes)
		log.Println("Else Result : ", verifyECRecover(hash.Bytes(), sig, expectedPubKey))
	}

	verification := ethcrypto.VerifySignature(expectedPubKey, hash.Bytes(), sig)
``` 
    
Below code method is VerifyECRecover:

```golang
func verifyECRecover(hash, sig, expectedPubKey []byte) bool {
	for v := 0; v < 2; v++ {
		sig[64] = byte(v)
		if pubkey, err := ethcrypto.Ecrecover(hash, sig); err == nil {
			if bytes.Equal(pubkey, expectedPubKey) {
				log.Println("Matched")
				return true
			}
			log.Println("Not Matched")
		} else {
			log.Println("Error: ", err)
		}
	}
	return false
}
```

I am not able to get the correct public key, so that I can submit the transaction to ethereum blockchain. Can anyone help me in solving this?