bool verifyDigest (PublicKey const& publicKey, uint256 const& digest, Slice const& sig, bool mustBeFullyCanonical) { if (publicKeyType(publicKey) != KeyType::secp256k1) LogicError("sign: secp256k1 required for digest signing"); auto const canonicality = ecdsaCanonicality(sig); if (! canonicality) return false; if (mustBeFullyCanonical && (*canonicality != ECDSACanonicality::fullyCanonical)) return false; secp256k1_pubkey pubkey_imp; if(secp256k1_ec_pubkey_parse( secp256k1Context(), &pubkey_imp, reinterpret_cast<unsigned char const*>( publicKey.data()), publicKey.size()) != 1) return false; secp256k1_ecdsa_signature sig_imp; if(secp256k1_ecdsa_signature_parse_der( secp256k1Context(), &sig_imp, reinterpret_cast<unsigned char const*>( sig.data()), sig.size()) != 1) return false; if (*canonicality != ECDSACanonicality::fullyCanonical) { secp256k1_ecdsa_signature sig_norm; if(secp256k1_ecdsa_signature_normalize( secp256k1Context(), &sig_norm, &sig_imp) != 1) return false; return secp256k1_ecdsa_verify( secp256k1Context(), &sig_norm, reinterpret_cast<unsigned char const*>( digest.data()), &pubkey_imp) == 1; } return secp256k1_ecdsa_verify( secp256k1Context(), &sig_imp, reinterpret_cast<unsigned char const*>( digest.data()), &pubkey_imp) == 1; }
bool RippleAddress::verifySignature(uint256 const& hash, Blob const& vchSig) const { if (vchData.size() != crypto_sign_PUBLICKEYBYTES || vchSig.size () != crypto_sign_BYTES) throw std::runtime_error("bad inputs to verifySignature"); bool verified = crypto_sign_verify_detached(vchSig.data(), hash.data(), hash.bytes, vchData.data()) == 0; bool canonical = signatureIsCanonical (vchSig); return verified && canonical; }