5 #include <boost/test/unit_test.hpp>
6 #include <openssl/ecdsa.h>
19 BOOST_AUTO_TEST_SUITE(canonical_tests)
22 bool static IsCanonicalSignature_OpenSSL_inner(const
std::vector<
unsigned char>& vchSig)
24 if (vchSig.size() == 0)
26 const unsigned char *input = &vchSig[0];
27 ECDSA_SIG *psig = NULL;
28 d2i_ECDSA_SIG(&psig, &input, vchSig.size());
31 unsigned char buf[256];
32 unsigned char *pbuf = buf;
33 unsigned int nLen = i2d_ECDSA_SIG(psig, NULL);
34 if (nLen != vchSig.size()) {
38 nLen = i2d_ECDSA_SIG(psig, &pbuf);
40 return (memcmp(&vchSig[0], &buf[0], nLen) == 0);
44 bool static IsCanonicalSignature_OpenSSL(
const std::vector<unsigned char> &vchSignature) {
45 if (vchSignature.size() < 1)
47 if (vchSignature.size() > 127)
49 if (vchSignature[vchSignature.size() - 1] & 0x7C)
52 std::vector<unsigned char> vchSig(vchSignature);
54 if (!IsCanonicalSignature_OpenSSL_inner(vchSig))
63 BOOST_FOREACH(
Value &tv, tests) {
66 std::vector<unsigned char> sig =
ParseHex(test);
68 BOOST_CHECK_MESSAGE(IsCanonicalSignature_OpenSSL(sig), test);
77 BOOST_FOREACH(
Value &tv, tests) {
80 std::vector<unsigned char> sig =
ParseHex(test);
82 BOOST_CHECK_MESSAGE(!IsCanonicalSignature_OpenSSL(sig), test);
87 BOOST_AUTO_TEST_SUITE_END()
Array read_json(const std::string &filename)
bool IsHex(const string &str)
const String_type & get_str() const
BOOST_AUTO_TEST_CASE(script_canon)
vector< unsigned char > ParseHex(const char *psz)
bool IsCanonicalSignature(const valtype &vchSig)