Fail with no key if algorithm is not NONE

This commit is contained in:
Arun M 2017-12-25 21:35:28 +05:30
parent f8eebbede0
commit cb1847142e
5 changed files with 50 additions and 3 deletions

View file

@ -11,6 +11,7 @@ enum class AlgorithmErrc
{ {
SigningErr = 1, SigningErr = 1,
VerificationErr, VerificationErr,
KeyNotFoundErr,
NoneAlgorithmUsed, // Not an actual error! NoneAlgorithmUsed, // Not an actual error!
}; };

View file

@ -22,6 +22,8 @@ struct AlgorithmErrCategory: std::error_category
return "signing failed"; return "signing failed";
case AlgorithmErrc::VerificationErr: case AlgorithmErrc::VerificationErr:
return "verification failed"; return "verification failed";
case AlgorithmErrc::KeyNotFoundErr:
return "key not provided";
case AlgorithmErrc::NoneAlgorithmUsed: case AlgorithmErrc::NoneAlgorithmUsed:
return "none algorithm used"; return "none algorithm used";
}; };

View file

@ -338,6 +338,15 @@ jwt_object& jwt_object::remove_claim(const string_view name)
std::string jwt_object::signature(std::error_code& ec) const std::string jwt_object::signature(std::error_code& ec) const
{ {
ec.clear(); ec.clear();
//key/secret should be set for any algorithm except NONE
if (header().algo() != jwt::algorithm::NONE) {
if (secret_.length() == 0) {
ec = AlgorithmErrc::KeyNotFoundErr;
return {};
}
}
jwt_signature jws{secret_}; jwt_signature jws{secret_};
return jws.encode(header_, payload_, ec); return jws.encode(header_, payload_, ec);
} }

Binary file not shown.

View file

@ -138,9 +138,7 @@ TEST (EncodeTest, StrEncodeHS512WithKey)
jwt::string_view key = "00112233445566778899"; jwt::string_view key = "00112233445566778899";
//TODO: map of jwt::string_view not working std::map<jwt::string_view, jwt::string_view> p;
std::map<std::string, std::string> p;
p["aud"] = "rift.io"; p["aud"] = "rift.io";
p["sub"] = "nothing much"; p["sub"] = "nothing much";
@ -180,6 +178,43 @@ TEST (EncodeTest, StrEncodeChangeAlg)
EXPECT_EQ (expected_none_sign, enc_str); EXPECT_EQ (expected_none_sign, enc_str);
} }
TEST (EncodeTest, StrEncodeNoKey)
{
using namespace jwt::params;
jwt::jwt_object obj{algorithm(jwt::algorithm::HS512),
payload({{"iss", "arn-ml"}})
};
std::error_code ec;
std::string enc_str = obj.signature(ec);
ASSERT_TRUE (ec);
EXPECT_EQ (ec.value(), static_cast<int>(jwt::AlgorithmErrc::KeyNotFoundErr));
}
TEST (EncodeTest, StrEncodeNoneAlgWithKey)
{
using namespace jwt::params;
const jwt::string_view secret1 = "abcdefghijklmnopqrstuvwxyz";
const jwt::string_view secret2 = "0123456789qwertybabe";
jwt::jwt_object obj{algorithm("NONE"),
payload({{"iss", "arn-ml"}}),
secret(secret1)};
std::error_code ec;
std::string enc_str1 = obj.signature(ec);
ASSERT_FALSE (ec);
obj.secret(secret2);
std::string enc_str2 = obj.signature(ec);
ASSERT_FALSE (ec);
EXPECT_EQ (enc_str1, enc_str2);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
::testing::InitGoogleTest(&argc, argv); ::testing::InitGoogleTest(&argc, argv);