1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 19:13:07 +01:00

Don't allow null keys

This commit is contained in:
Michał Janiszewski
2016-05-27 22:34:13 +02:00
parent ebb8eb749c
commit 4699635086
2 changed files with 18 additions and 11 deletions

View File

@@ -92,6 +92,7 @@ bool NetworkKey::Generate()
bool NetworkKey::LoadPrivate(SDL_RWops * file)
{
assert(file != nullptr);
size_t size = (size_t)file->size(file);
if (size == (size_t)-1)
{
@@ -135,6 +136,7 @@ bool NetworkKey::LoadPrivate(SDL_RWops * file)
bool NetworkKey::LoadPublic(SDL_RWops * file)
{
assert(file != nullptr);
size_t size = (size_t)file->size(file);
if (size == (size_t)-1)
{

View File

@@ -2008,19 +2008,24 @@ void Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p
} else {
const char *signature = (const char *)packet.Read(sigsize);
SDL_RWops *pubkey_rw = SDL_RWFromConstMem(pubkey, strlen(pubkey));
connection.key.LoadPublic(pubkey_rw);
SDL_RWclose(pubkey_rw);
bool verified = connection.key.Verify(connection.challenge.data(), connection.challenge.size(), signature, sigsize);
const std::string hash = connection.key.PublicKeyHash();
if (verified) {
connection.authstatus = NETWORK_AUTH_VERIFIED;
log_verbose("Signature verification ok. Hash %s", hash.c_str());
} else {
if (pubkey_rw == nullptr) {
connection.authstatus = NETWORK_AUTH_VERIFICATIONFAILURE;
log_verbose("Signature verification failed!");
}
if (gConfigNetwork.known_keys_only && _userManager.GetUserByHash(hash) == nullptr) {
connection.authstatus = NETWORK_AUTH_UNKNOWN_KEY_DISALLOWED;
} else {
connection.key.LoadPublic(pubkey_rw);
SDL_RWclose(pubkey_rw);
bool verified = connection.key.Verify(connection.challenge.data(), connection.challenge.size(), signature, sigsize);
const std::string hash = connection.key.PublicKeyHash();
if (verified) {
connection.authstatus = NETWORK_AUTH_VERIFIED;
log_verbose("Signature verification ok. Hash %s", hash.c_str());
} else {
connection.authstatus = NETWORK_AUTH_VERIFICATIONFAILURE;
log_verbose("Signature verification failed!");
}
if (gConfigNetwork.known_keys_only && _userManager.GetUserByHash(hash) == nullptr) {
connection.authstatus = NETWORK_AUTH_UNKNOWN_KEY_DISALLOWED;
}
}
}