diff options
author | Jack Lloyd <[email protected]> | 2017-08-16 04:36:17 -0400 |
---|---|---|
committer | Jack Lloyd <[email protected]> | 2017-08-16 04:36:17 -0400 |
commit | 216affee6db0eef9b3a6f9516c24feb82078ffbe (patch) | |
tree | 4b7e2083fbadfe79b1b4b1111e341abdb96461b1 | |
parent | ba75558b723ae0c8b1e3b8718d972ef2fa567dfd (diff) | |
parent | 528d0ae3226932157b54451b0179053ff08e934e (diff) |
Merge GH #1153 Add Raw(hash) support
-rw-r--r-- | src/lib/pk_pad/emsa.cpp | 13 | ||||
-rw-r--r-- | src/lib/pk_pad/emsa_raw/emsa_raw.cpp | 22 | ||||
-rw-r--r-- | src/lib/pk_pad/emsa_raw/emsa_raw.h | 10 | ||||
-rw-r--r-- | src/tests/data/pubkey/ecdsa_prob.vec | 22 | ||||
-rw-r--r-- | src/tests/data/pubkey/ecdsa_rfc6979.vec | 35 | ||||
-rw-r--r-- | src/tests/test_ecdsa.cpp | 2 |
6 files changed, 96 insertions, 8 deletions
diff --git a/src/lib/pk_pad/emsa.cpp b/src/lib/pk_pad/emsa.cpp index 074af273a..0fd35ef43 100644 --- a/src/lib/pk_pad/emsa.cpp +++ b/src/lib/pk_pad/emsa.cpp @@ -134,9 +134,18 @@ EMSA* get_emsa(const std::string& algo_spec) #endif #if defined(BOTAN_HAS_EMSA_RAW) - if(req.algo_name() == "Raw" && req.arg_count() == 0) + if(req.algo_name() == "Raw") { - return new EMSA_Raw; + if(req.arg_count() == 0) + { + return new EMSA_Raw; + } + else + { + auto hash = HashFunction::create(req.arg(0)); + if(hash) + return new EMSA_Raw(hash->output_length()); + } } #endif diff --git a/src/lib/pk_pad/emsa_raw/emsa_raw.cpp b/src/lib/pk_pad/emsa_raw/emsa_raw.cpp index d15012a0d..bae7b2d04 100644 --- a/src/lib/pk_pad/emsa_raw/emsa_raw.cpp +++ b/src/lib/pk_pad/emsa_raw/emsa_raw.cpp @@ -22,6 +22,12 @@ void EMSA_Raw::update(const uint8_t input[], size_t length) */ secure_vector<uint8_t> EMSA_Raw::raw_data() { + if(m_expected_size && m_message.size() != m_expected_size) + throw Invalid_Argument("EMSA_Raw was configured to use a " + + std::to_string(m_expected_size) + + " byte hash but instead was used for a " + + std::to_string(m_message.size()) + " hash"); + secure_vector<uint8_t> output; std::swap(m_message, output); return output; @@ -30,10 +36,17 @@ secure_vector<uint8_t> EMSA_Raw::raw_data() /* * EMSA-Raw Encode Operation */ -secure_vector<uint8_t> EMSA_Raw::encoding_of(const secure_vector<uint8_t>& msg, - size_t, - RandomNumberGenerator&) +secure_vector<uint8_t> +EMSA_Raw::encoding_of(const secure_vector<uint8_t>& msg, + size_t, + RandomNumberGenerator&) { + if(m_expected_size && msg.size() != m_expected_size) + throw Invalid_Argument("EMSA_Raw was configured to use a " + + std::to_string(m_expected_size) + + " byte hash but instead was used for a " + + std::to_string(msg.size()) + " hash"); + return msg; } @@ -44,6 +57,9 @@ bool EMSA_Raw::verify(const secure_vector<uint8_t>& coded, const secure_vector<uint8_t>& raw, size_t) { + if(m_expected_size && raw.size() != m_expected_size) + return false; + if(coded.size() == raw.size()) return (coded == raw); diff --git a/src/lib/pk_pad/emsa_raw/emsa_raw.h b/src/lib/pk_pad/emsa_raw/emsa_raw.h index 288969257..598b9b97c 100644 --- a/src/lib/pk_pad/emsa_raw/emsa_raw.h +++ b/src/lib/pk_pad/emsa_raw/emsa_raw.h @@ -21,15 +21,21 @@ class BOTAN_DLL EMSA_Raw final : public EMSA public: EMSA* clone() override { return new EMSA_Raw(); } + explicit EMSA_Raw(size_t expected_hash_size = 0) : + m_expected_size(expected_hash_size) {} + private: void update(const uint8_t[], size_t) override; secure_vector<uint8_t> raw_data() override; secure_vector<uint8_t> encoding_of(const secure_vector<uint8_t>&, size_t, - RandomNumberGenerator&) override; - bool verify(const secure_vector<uint8_t>&, const secure_vector<uint8_t>&, + RandomNumberGenerator&) override; + + bool verify(const secure_vector<uint8_t>&, + const secure_vector<uint8_t>&, size_t) override; + const size_t m_expected_size; secure_vector<uint8_t> m_message; }; diff --git a/src/tests/data/pubkey/ecdsa_prob.vec b/src/tests/data/pubkey/ecdsa_prob.vec index dcfc5664e..e5a5ad8e5 100644 --- a/src/tests/data/pubkey/ecdsa_prob.vec +++ b/src/tests/data/pubkey/ecdsa_prob.vec @@ -1004,9 +1004,31 @@ Nonce = A808BBBBCDB8C60C097DD2839FA2B4DEA13777D27D11C8BD3ABE7F16FFDA4BF6 Msg = 0000000000000000000000000000000000000000000000000000000000000000 Signature = AE15A0963B6E0144E7F801616DBBBF1BB4C4943CA85B0AF9D00F3FA5CACB95FB02032D911851E27F8E5C565A43F54DE6E03EFF81A9BF73B9ACC47B363979F101 +Hash = Raw(SHA-256) +Group = secp256r1 +X = 5 +Nonce = 35F6E341405E516C2FD796CA12F039C6971AB7A0F69B254E38CA7191F298DFB2 +Msg = 0000000000000000000000000000000000000000000000000000000000000000 +Signature = 921D2C2012856C4F8BD1AB9229C302848AB99CFCF92A512BD24B9A08F3C0DF99CE18D76B930B81493E77737E24285D07F2919C98AFE32F2450A28BA50FBE32E8 + Hash = Raw Group = secp384r1 X = 5 Nonce = 77294F6D855441C4DBEC66E1494DA0F2C6BFA3FB8518A9ED8D271D72BB3BE45302DCDEE6FF66555489756BECB8BF6CB9 Msg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Signature = 53C99B5021F9DD7B8D2EC1C1BB17C03FCFF324DED361B4845D9C98E1A3F490C63946BA68DF0FA26AE62BB6E04531581C9D29FF7775BE15F14C1AA86B292F987241E42241E08DBA4229597260A4D9F433AC78F36D772F83499C5E2E3AF68F83E4 + +X = 5 +Group = secp384r1 +Hash = Raw(SHA-384) +Msg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Nonce = 6BE36DD30F03CB45B2F20A1F38025BBF7701561C163FBB426CB0B210E601EF85B3E5F60058B706C56575712A05BB780D +Signature = 7A5C707564BF8DA1261387DFD5D5ED2A8C10B3AA4D00C9A927D5729E8BB555954F94799B972CD6F976B99703A561A1AD62929113627D363F5765D5FFCEBCF529B6B74D78B91D7A400D7E09C7613571C25E55AC98989635BE251EE123AA9A63CC + +X = 5 +Group = secp521r1 +Hash = Raw(SHA-512) +Msg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Nonce = 0169EBB978C1B61CCE759A67B828F8213960B2E1D041DF948ABC435C99E1080D650612D1C7284E1B1F1B9D16D477B722B59545407137D0FBC17C05344A7BB2033E60 +Signature = 0157BC701722FB4853DD9F3E9BBAE977137CF04659B3CF4BD9A3FF47D8E1DF3D7B9A1E291234CD8AE9C9B9711F22C9B3B127F6217A582A9830D75184CB6A6AC174570164A920D8059F8BC21F4FBFDEE3140CF1033F3AB10260A71CBD32197822C3B575BC44DA681EBBB4612357A1E81670B2A76A35DDA2AAE708F7FD7D66D1EAE453249C + diff --git a/src/tests/data/pubkey/ecdsa_rfc6979.vec b/src/tests/data/pubkey/ecdsa_rfc6979.vec index a56970fa5..b423624c2 100644 --- a/src/tests/data/pubkey/ecdsa_rfc6979.vec +++ b/src/tests/data/pubkey/ecdsa_rfc6979.vec @@ -385,9 +385,44 @@ Hash = Raw Msg = 0000000000000000000000000000000000000000000000000000000000000000 Signature = AE15A0963B6E0144E7F801616DBBBF1BB4C4943CA85B0AF9D00F3FA5CACB95FB02032D911851E27F8E5C565A43F54DE6E03EFF81A9BF73B9ACC47B363979F101 +X = 5 +Group = secp256r1 +Hash = Raw(SHA-256) +Msg = 0000000000000000000000000000000000000000000000000000000000000000 +Signature = 921D2C2012856C4F8BD1AB9229C302848AB99CFCF92A512BD24B9A08F3C0DF99CE18D76B930B81493E77737E24285D07F2919C98AFE32F2450A28BA50FBE32E8 + X = 5 Group = secp384r1 Hash = Raw Msg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Signature = 53C99B5021F9DD7B8D2EC1C1BB17C03FCFF324DED361B4845D9C98E1A3F490C63946BA68DF0FA26AE62BB6E04531581C9D29FF7775BE15F14C1AA86B292F987241E42241E08DBA4229597260A4D9F433AC78F36D772F83499C5E2E3AF68F83E4 + +X = 5 +Group = secp384r1 +Hash = Raw(SHA-384) +Msg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Signature = 7A5C707564BF8DA1261387DFD5D5ED2A8C10B3AA4D00C9A927D5729E8BB555954F94799B972CD6F976B99703A561A1AD62929113627D363F5765D5FFCEBCF529B6B74D78B91D7A400D7E09C7613571C25E55AC98989635BE251EE123AA9A63CC + +X = 5 +Group = secp521r1 +Hash = Raw(SHA-512) +Msg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Signature = 0157BC701722FB4853DD9F3E9BBAE977137CF04659B3CF4BD9A3FF47D8E1DF3D7B9A1E291234CD8AE9C9B9711F22C9B3B127F6217A582A9830D75184CB6A6AC174570164A920D8059F8BC21F4FBFDEE3140CF1033F3AB10260A71CBD32197822C3B575BC44DA681EBBB4612357A1E81670B2A76A35DDA2AAE708F7FD7D66D1EAE453249C + +# Test Raw(hash) using RFC 6979 test cases + +Group = secp256r1 +X = 0xC9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721 + +Msg = 8151325DCDBAE9E0FF95F9F9658432DBEDFDB209 +Hash = Raw(SHA-1) +Signature = 61340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D326D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB + +Msg = 9003E374BC726550C2C289447FD0533160F875709386DFA377BFD41C +Hash = Raw(SHA-224) +Signature = 53B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3FB9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C + +Msg = AF2BDBE1AA9B6EC1E2ADE1D694F41FC71A831D0268E9891562113D8A62ADD1BF +Hash = Raw(SHA-256) +Signature = EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8 diff --git a/src/tests/test_ecdsa.cpp b/src/tests/test_ecdsa.cpp index 9b8c2200e..5d9c327a8 100644 --- a/src/tests/test_ecdsa.cpp +++ b/src/tests/test_ecdsa.cpp @@ -52,7 +52,7 @@ class ECDSA_Signature_KAT_Tests : public PK_Signature_Generation_Test std::string default_padding(const VarMap& vars) const override { const std::string hash = get_req_str(vars, "Hash"); - if(hash == "Raw") + if(hash.substr(0,3) == "Raw") return hash; return "EMSA1(" + hash + ")"; } |