<div dir="ltr"><div dir="ltr"><div dir="auto">Hello!</div><div dir="auto"><br></div><div dir="auto"><div dir="auto">I have a C++ programme, ECDSA key pair and some string to sign. The programme generates signature and saves it into a file (<font face="monospace, monospace">signature.bin</font>). Then I check the validity of the signature via the following command:</div><div dir="auto"><br></div><div dir="auto"><font face="monospace, monospace">openssl dgst -verify ec_public.pem -signature signature.bin ToSign.txt</font></div><div dir="auto"><br></div><div dir="auto">the problem is that <b>my programme sometimes generates wrong signature</b>. 16 times out of 21 the signature produced is invalid and the above command outputs:</div><div dir="auto"><font face="monospace, monospace">Error Verifying Data</font></div><div dir="auto"><br></div><div dir="auto">while in the remaining 5 occurrences it outputs:</div><div dir="auto"><font face="monospace, monospace">Verified OK</font></div><div dir="auto"><br></div><div dir="auto">Do you have any ideas of how it can be possible? What am I doing wrong?</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">Here is the programme:<br></div><div dir="auto"><br></div><div dir="auto"><font face="monospace, monospace" size="1">SSL_library_init();</font></div><div dir="auto"><font face="monospace, monospace" size="1">OPENSSL_config(nullptr);</font></div><div dir="auto"><font face="monospace, monospace" size="1">SSL_load_error_strings();</font></div><div dir="auto"><font face="monospace, monospace" size="1">OpenSSL_add_all_algorithms();</font></div><div dir="auto"><font face="monospace, monospace" size="1">ERR_load_BIO_strings();</font></div><div dir="auto"><font face="monospace, monospace" size="1">CRYPTO_set_id_callback(ThreadIdFunction);</font></div><div dir="auto"><font face="monospace, monospace" size="1">CRYPTO_set_locking_callback(LockingFunction);</font></div><div dir="auto"><font face="monospace, monospace" size="1"><br></font></div><div dir="auto"><font face="monospace, monospace" size="1">const TString pk = "-----BEGIN EC PRIVATE KEY-----\n"</font></div><div dir="auto"><font face="monospace, monospace" size="1">                       "MHcCAQEEIG90zmo1o3NWNFa8wp2z4rdQXGSN8xAP/OATLpwlgi+1oAoGCCqGSM49\n"</font></div><div dir="auto"><font face="monospace, monospace" size="1">                       "AwEHoUQDQgAE5TwpzBhjUWZoOf629GfwGG5WlRJD7TSuz+ZTHUaiK5mj2qgxBOPk\n"</font></div><div dir="auto"><font face="monospace, monospace" size="1">                       "eqOrTYXsiPwnaWe23zHjIM8NOhAm1BiGgA==\n"</font></div><div dir="auto"><font face="monospace, monospace" size="1">                       "-----END EC PRIVATE KEY-----\n";</font></div><div dir="auto"><font face="monospace, monospace" size="1"><br></font></div><div dir="auto"><font face="monospace, monospace" size="1">const TString ToSign = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhc2RmIn0";</font></div><div dir="auto"><font face="monospace, monospace" size="1"><br></font></div><div dir="auto"><font face="monospace, monospace" size="1">EVP_MD_CTX *Ctx    = EVP_MD_CTX_create();</font></div><div dir="auto"><font face="monospace, monospace" size="1">BIO *       Bio    = BIO_new_mem_buf(pk.data(), pk.size());</font></div><div dir="auto"><font face="monospace, monospace" size="1">EVP_PKEY *  EVPKey = PEM_read_bio_PrivateKey(Bio, nullptr, nullptr, nullptr);</font></div><div dir="auto"><font face="monospace, monospace" size="1"><br></font></div><div dir="auto"><font face="monospace, monospace" size="1">EVP_DigestSignInit(Ctx, nullptr, EVP_sha256(), nullptr, EVPKey);</font></div><div dir="auto"><font face="monospace, monospace" size="1">EVP_DigestSignUpdate(Ctx, ToSign.data(), ToSign.size());</font></div><div dir="auto"><font face="monospace, monospace" size="1">size_t SignatureLength;</font></div><div dir="auto"><font face="monospace, monospace" size="1">EVP_DigestSignFinal(Ctx, nullptr, &SignatureLength);</font></div><div dir="auto"><font face="monospace, monospace" size="1"><br></font></div><div dir="auto"><font face="monospace, monospace" size="1">TString Result;</font></div><div dir="auto"><font face="monospace, monospace" size="1">Result.resize(SignatureLength);</font></div><div dir="auto"><font face="monospace, monospace" size="1">EVP_DigestSignFinal(Ctx, reinterpret_cast<unsigned char *>(const_cast<char *>(Result.data())), &SignatureLength);</font></div><div dir="auto"><font face="monospace, monospace" size="1"><br></font></div><div dir="auto"><font face="monospace, monospace" size="1">// Saving to file...</font></div><br>Thank you in advance</div>
</div></div>