using System.Globalization;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
System.Console.ReadLine();
var mobileAppDataHex = "03a239ddb1ede15dfb43881671930cf6fcbda4b698b1b6f64c0a91aa58aea7171a";
var mobileAppSignedDataHex = "f90191b01af0826d1bf553712baf72b23e8a723b888ff6390d06e8c4ccd5b684dde17e588990198ae9afcddf806400ff2c0716f1559971c65f1be4fccf0bf5a5";
var mobileAppResult = VerifySignature(mobileAppDataHex, mobileAppSignedDataHex);
System.Console.WriteLine($"Mobile result: {mobileAppResult}");
var openSslDataHex = "03cff911f07e4d308f986af959d676b65c2e8127136adba4e84ea2293e78fc6903";
var openSslSignedDataHex = "3046022100cc724299345c294d0bbd8540d6a409525784c38dfaa1417449970648f414dc23022100c2b06e7e763bab93961796717d9459dee87aea3c44846e6a84b1267c226447ca";
var openSslDataResult = VerifySignature(openSslDataHex, openSslSignedDataHex);
System.Console.WriteLine($"Open SSL result: {openSslDataResult}");
static bool VerifySignature(string dataHex, string signatureHex)
var cert = X509Certificate2.CreateFromPem(@"-----BEGIN CERTIFICATE-----
MIIFATCCAumgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwfzELMAkGA1UEBhMCRlIx
ETAPBgNVBAgMCEJhcy1SaGluMQ8wDQYDVQQKDAZTZXdvc3kxCzAJBgNVBAsMAklU
MRwwGgYDVQQDDBNhcHAuaW50ZXJtZWRpYXRlLmNhMSEwHwYJKoZIhvcNAQkBFhJu
b3JlcGx5QHNld29zeS5uZXQwHhcNMjIwOTI2MTM1MDQ5WhcNMzIwOTIzMTM1MDQ5
WjCBkTELMAkGA1UEBhMCRlIxETAPBgNVBAgMCEJhcy1SaGluMREwDwYDVQQHDAhI
YWd1ZW5hdTEPMA0GA1UECgwGU2V3b3N5MQswCQYDVQQLDAJJVDEbMBkGA1UEAwwS
YXBwLmtlb2xhLnVzZXIuMC4xMSEwHwYJKoZIhvcNAQkBFhJub3JlcGx5QHNld29z
eS5uZXQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ1w49fH40Y7lcWDBkDiKM4
FehPK2aosK4sIH1PYWx/yfRou0LCMIz9uR29ZprOfQnZI3QJfGTJW9kCVOhjsiDj
o4IBPTCCATkwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBBAwMwYJYIZIAYb4
QgENBCYWJE9wZW5TU0wgR2VuZXJhdGVkIFNlcnZlciBDZXJ0aWZpY2F0ZTAdBgNV
HQ4EFgQU/WiIIbSJmaZ68MM6Spa5UjhZqagwgbQGA1UdIwSBrDCBqYAU7mEgR89B
dRAqNGJ6Xkee/7Tk14yhgYykgYkwgYYxCzAJBgNVBAYTAkZSMREwDwYDVQQIDAhC
YXMtUmhpbjERMA8GA1UEBwwISGFndWVuYXUxDzANBgNVBAoMBlNld29zeTELMAkG
A1UECwwCSVQxEDAOBgNVBAMMB1Jvb3QgQ0ExITAfBgkqhkiG9w0BCQEWEm5vcmVw
bHlAc2V3b3N5Lm5ldIICEAEwDgYDVR0PAQH/BAQDAgWgMA0GCSqGSIb3DQEBCwUA
A4ICAQCyxAxICiZ+yFzXs2Rslkrd6/IHhmXVvm/bTegyjaG3lW6F+wBh65GEoNU0
XxYlUk4AhwwSE3MHwQ15EOnAHUtT3LRWU8shjpHDTMSzyx/NNa6fLPbYq6MmEOV0
wMdZ2rBkXfzRVK+3DKuGQ3LuXuJaBBNbD1l4LubDm/GEX8QVpu2mxzrHib6dpwHi
g5AKLTsEN1wojpJ2ryjUfXEhfbyqt3xlU0eryXBpZZkPYsjr56wXzAhymR0pgOJ3
YxdvSl9RwtiTmtqlKh2dqJU4wzpKE53MKU2kv/W527T/mlJQy3IsVfVWDy5tkX89
UfK3oW8bXDaGVTywzb9gD3Bu5mL9zweOxiFlPSeUlqEvYS1qyzwnqHXBevlbZYVU
zA466dAcJxZ8Da/V6pPU+16jbPqftJgj+mDrDClrKudxzIo8PVmDqUGE3g48elji
4+27PIf2VNwuEdll4EJ4B0b7DfHU7O9Cgxg21zxUMRnsqUjz9ERbHV3ojZ/N/wy6
QXNVivPMFUz5lN4SaVZnSVlC4Sm2UX4DIr6Ak16RrNpf366K24Akav9zJaVknfkk
nDoB+J3nrqY+8qqUrjR5OU7zUNRlToKZi1jjuzsVJxJ0qE1BxR0c0iwNfxuQKFhT
HcPmRf5tG4RTU+BfyCbwzVbmIAht8CoopucsQh1dM31RSOQSIQ==
-----END CERTIFICATE-----");
var publicKey = cert.PublicKey.GetECDsaPublicKey()!;
var signatureBytes = ConvertHexStringToByteArray(signatureHex);
var data = ConvertHexStringToByteArray(dataHex);
return publicKey.VerifyData(data, signatureBytes, HashAlgorithmName.SHA256);
static byte[] ConvertHexStringToByteArray(string hexString)
var data = new byte[hexString.Length / 2];
for (int index = 0; index < data.Length; index++)
string byteValue = hexString.Substring(index * 2, 2);
data[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);