diff --git a/src/script/ismine.h b/src/script/ismine.h --- a/src/script/ismine.h +++ b/src/script/ismine.h @@ -28,9 +28,8 @@ * isInvalid becomes true when the script is found invalid by consensus or * policy. This will terminate the recursion and return ISMINE_NO immediately, * as an invalid script should never be considered as "mine". Currently the only - * use of isInvalid is indicate uncompressed keys when - * SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE is specified, but could also be used in - * similar cases in the future. + * use of isInvalid is for P2SH-inside-P2SH scripts (as a technicality, to + * prevent infinite recursion). */ isminetype IsMine(const CKeyStore &keystore, const CScript &scriptPubKey, bool &isInvalid); diff --git a/src/script/script_error.h b/src/script/script_error.h --- a/src/script/script_error.h +++ b/src/script/script_error.h @@ -73,9 +73,6 @@ /* softfork safeness */ DISCOURAGE_UPGRADABLE_NOPS, - /* misc */ - NONCOMPRESSED_PUBKEY, - /* anti replay */ ILLEGAL_FORKID, MUST_USE_FORKID, diff --git a/src/script/script_error.cpp b/src/script/script_error.cpp --- a/src/script/script_error.cpp +++ b/src/script/script_error.cpp @@ -98,8 +98,6 @@ return "Public key is neither compressed or uncompressed"; case ScriptError::CLEANSTACK: return "Script did not clean its stack"; - case ScriptError::NONCOMPRESSED_PUBKEY: - return "Using non-compressed public key"; case ScriptError::ILLEGAL_FORKID: return "Illegal use of SIGHASH_FORKID"; case ScriptError::MUST_USE_FORKID: diff --git a/src/script/script_flags.h b/src/script/script_flags.h --- a/src/script/script_flags.h +++ b/src/script/script_flags.h @@ -80,10 +80,6 @@ // SCRIPT_VERIFY_NULLFAIL = (1U << 14), - // Public keys in scripts must be compressed - // - SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE = (1U << 15), - // Do we accept signature using SIGHASH_FORKID // SCRIPT_ENABLE_SIGHASH_FORKID = (1U << 16), diff --git a/src/script/sigencoding.cpp b/src/script/sigencoding.cpp --- a/src/script/sigencoding.cpp +++ b/src/script/sigencoding.cpp @@ -302,29 +302,11 @@ } } -static bool IsCompressedPubKey(const valtype &vchPubKey) { - if (vchPubKey.size() != CPubKey::COMPRESSED_PUBLIC_KEY_SIZE) { - // Non-canonical public key: invalid length for compressed key - return false; - } - if (vchPubKey[0] != 0x02 && vchPubKey[0] != 0x03) { - // Non-canonical public key: invalid prefix for compressed key - return false; - } - return true; -} - bool CheckPubKeyEncoding(const valtype &vchPubKey, uint32_t flags, ScriptError *serror) { if ((flags & SCRIPT_VERIFY_STRICTENC) && !IsCompressedOrUncompressedPubKey(vchPubKey)) { return set_error(serror, ScriptError::PUBKEYTYPE); } - // Only compressed keys are accepted when - // SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE is enabled. - if ((flags & SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) && - !IsCompressedPubKey(vchPubKey)) { - return set_error(serror, ScriptError::NONCOMPRESSED_PUBKEY); - } return true; } diff --git a/src/test/checkdatasig_tests.cpp b/src/test/checkdatasig_tests.cpp --- a/src/test/checkdatasig_tests.cpp +++ b/src/test/checkdatasig_tests.cpp @@ -157,12 +157,6 @@ ScriptError::PUBKEYTYPE); CheckError(flags, {{}, message, pubkeyH}, scriptverify, ScriptError::PUBKEYTYPE); - } else if (flags & SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) { - // When compressed-only is enforced, hybrid keys are invalid. - CheckError(flags, {{}, message, pubkeyH}, script, - ScriptError::NONCOMPRESSED_PUBKEY); - CheckError(flags, {{}, message, pubkeyH}, scriptverify, - ScriptError::NONCOMPRESSED_PUBKEY); } else { // Otherwise, hybrid keys are valid. CheckPass(flags, {{}, message, pubkeyH}, script, {}); @@ -170,18 +164,10 @@ ScriptError::CHECKDATASIGVERIFY); } - if (flags & SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) { - // When compressed-only is enforced, uncompressed keys are invalid. - CheckError(flags, {{}, message, pubkey}, script, - ScriptError::NONCOMPRESSED_PUBKEY); - CheckError(flags, {{}, message, pubkey}, scriptverify, - ScriptError::NONCOMPRESSED_PUBKEY); - } else { - // Otherwise, uncompressed keys are valid. - CheckPass(flags, {{}, message, pubkey}, script, {}); - CheckError(flags, {{}, message, pubkey}, scriptverify, - ScriptError::CHECKDATASIGVERIFY); - } + // Uncompressed keys are valid. + CheckPass(flags, {{}, message, pubkey}, script, {}); + CheckError(flags, {{}, message, pubkey}, scriptverify, + ScriptError::CHECKDATASIGVERIFY); if (flags & SCRIPT_VERIFY_NULLFAIL) { // Invalid signature causes checkdatasig to fail. diff --git a/src/test/data/script_tests.json b/src/test/data/script_tests.json --- a/src/test/data/script_tests.json +++ b/src/test/data/script_tests.json @@ -2928,13 +2928,6 @@ "OK", "Schnorr P2PK with uncompressed pubkey" ], -[ - "0x41 0x0df4be7f5fe74b2855b92082720e889038e15d8d747334fa3f300ef4ab1db1eea56aa83d1d60809ff6703791736be87cfb6cbc5c4036aeed3b4ea4e6dab3509001", - "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", - "COMPRESSED_PUBKEYTYPE,STRICTENC", - "NONCOMPRESSED_PUBKEY", - "Schnorr P2PK with uncompressed pubkey but COMPRESSED_PUBKEYTYPE set" -], [ "0x41 0xd211631fdebf4c8376b3d169ef65a1987460eda43c3312e561b0226fa3069f68a68bac0dbf780f77dd60ff602c66186f1da2bb0a31f10187796242f48295ddbe01", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -87,7 +87,6 @@ {ScriptError::SIG_BADLENGTH, "SIG_BADLENGTH"}, {ScriptError::SIG_NONSCHNORR, "SIG_NONSCHNORR"}, {ScriptError::DISCOURAGE_UPGRADABLE_NOPS, "DISCOURAGE_UPGRADABLE_NOPS"}, - {ScriptError::NONCOMPRESSED_PUBKEY, "NONCOMPRESSED_PUBKEY"}, {ScriptError::ILLEGAL_FORKID, "ILLEGAL_FORKID"}, {ScriptError::MUST_USE_FORKID, "MISSING_FORKID"}, {ScriptError::DIV_BY_ZERO, "DIV_BY_ZERO"}, @@ -1624,14 +1623,6 @@ "Schnorr P2PK with uncompressed pubkey", SCRIPT_VERIFY_STRICTENC) .PushSigSchnorr(keys.key0, SigHashType())); - tests.push_back( - TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, - "Schnorr P2PK with uncompressed pubkey but " - "COMPRESSED_PUBKEYTYPE set", - SCRIPT_VERIFY_STRICTENC | - SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) - .PushSigSchnorr(keys.key0, SigHashType()) - .SetScriptError(ScriptError::NONCOMPRESSED_PUBKEY)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, "Schnorr P2PK with hybrid pubkey", SCRIPT_VERIFY_STRICTENC) diff --git a/src/test/scriptflags.cpp b/src/test/scriptflags.cpp --- a/src/test/scriptflags.cpp +++ b/src/test/scriptflags.cpp @@ -27,7 +27,6 @@ {"NULLFAIL", SCRIPT_VERIFY_NULLFAIL}, {"CHECKLOCKTIMEVERIFY", SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY}, {"CHECKSEQUENCEVERIFY", SCRIPT_VERIFY_CHECKSEQUENCEVERIFY}, - {"COMPRESSED_PUBKEYTYPE", SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE}, {"SIGHASH_FORKID", SCRIPT_ENABLE_SIGHASH_FORKID}, {"REPLAY_PROTECTION", SCRIPT_ENABLE_REPLAY_PROTECTION}, {"CHECKDATASIG", SCRIPT_VERIFY_CHECKDATASIG_SIGOPS}, diff --git a/src/test/sigencoding_tests.cpp b/src/test/sigencoding_tests.cpp --- a/src/test/sigencoding_tests.cpp +++ b/src/test/sigencoding_tests.cpp @@ -374,31 +374,19 @@ ScriptError err = ScriptError::OK; - // Compressed pubkeys are always valid. + // Compressed and uncompressed pubkeys are always valid. BOOST_CHECK(CheckPubKeyEncoding(compressedKey0, flags, &err)); BOOST_CHECK(CheckPubKeyEncoding(compressedKey1, flags, &err)); + BOOST_CHECK(CheckPubKeyEncoding(fullKey, flags, &err)); - // If SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE is specified, full key are - // disabled. - const bool allowFullKey = - (flags & SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) == 0; - BOOST_CHECK_EQUAL(CheckPubKeyEncoding(fullKey, flags, &err), - allowFullKey); - if (!allowFullKey) { - BOOST_CHECK(err == ScriptError::NONCOMPRESSED_PUBKEY); - } - - // If SCRIPT_VERIFY_STRICTENC or SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE is - // specified, we rule out invalid keys. + // If SCRIPT_VERIFY_STRICTENC is specified, we rule out invalid keys. const bool hasStrictEnc = (flags & SCRIPT_VERIFY_STRICTENC) != 0; - const bool allowInvalidKeys = allowFullKey && !hasStrictEnc; + const bool allowInvalidKeys = !hasStrictEnc; for (const valtype &key : invalidKeys) { BOOST_CHECK_EQUAL(CheckPubKeyEncoding(key, flags, &err), allowInvalidKeys); if (!allowInvalidKeys) { - BOOST_CHECK(err == (hasStrictEnc - ? ScriptError::PUBKEYTYPE - : ScriptError::NONCOMPRESSED_PUBKEY)); + BOOST_CHECK(err == ScriptError::PUBKEYTYPE); } } }