diff --git a/src/crypto/key_validator/key_validator_impl.cpp b/src/crypto/key_validator/key_validator_impl.cpp index 429057f6c..55fd36f83 100644 --- a/src/crypto/key_validator/key_validator_impl.cpp +++ b/src/crypto/key_validator/key_validator_impl.cpp @@ -170,15 +170,57 @@ namespace libp2p::crypto::validator { outcome::result KeyValidatorImpl::validateEcdsa( const PrivateKey &key) const { - // TODO(xDimon): Check if it possible to validate ECDSA key by some way. - // issue: https://github.com/libp2p/cpp-libp2p/issues/103 + // Basic ECDSA private key validation + // ECDSA private keys are typically 32 bytes for P-256, 48 bytes for P-384, 66 bytes for P-521 + if (key.data.empty()) { + return KeyValidatorError::INVALID_PRIVATE_KEY; + } + + // Check for reasonable key sizes (32-66 bytes covers most common curves) + if (key.data.size() < 32 || key.data.size() > 66) { + return KeyValidatorError::WRONG_PRIVATE_KEY_SIZE; + } + + // Check that the key is not all zeros (invalid private key) + bool all_zeros = true; + for (const auto& byte : key.data) { + if (byte != 0) { + all_zeros = false; + break; + } + } + if (all_zeros) { + return KeyValidatorError::INVALID_PRIVATE_KEY; + } + return outcome::success(); } outcome::result KeyValidatorImpl::validateEcdsa( const PublicKey &key) const { - // TODO(xDimon): Check if it possible to validate ECDSA key by some way. - // issue: https://github.com/libp2p/cpp-libp2p/issues/103 + // Basic ECDSA public key validation + if (key.data.empty()) { + return KeyValidatorError::INVALID_PUBLIC_KEY; + } + + // ECDSA public keys are typically 64 bytes (uncompressed) or 33/49/67 bytes (compressed) + // for P-256/P-384/P-521 respectively + if (key.data.size() < 33 || key.data.size() > 133) { + return KeyValidatorError::WRONG_PUBLIC_KEY_SIZE; + } + + // Check that the key is not all zeros (invalid public key) + bool all_zeros = true; + for (const auto& byte : key.data) { + if (byte != 0) { + all_zeros = false; + break; + } + } + if (all_zeros) { + return KeyValidatorError::INVALID_PUBLIC_KEY; + } + return outcome::success(); } diff --git a/src/storage/sqlite.cpp b/src/storage/sqlite.cpp index 33f47cedf..49245d5e1 100644 --- a/src/storage/sqlite.cpp +++ b/src/storage/sqlite.cpp @@ -22,12 +22,12 @@ namespace libp2p::storage { } } - int SQLite::getErrorCode() { + int SQLite::getErrorCode() const { return sqlite3_extended_errcode(db_.connection().get()); } - std::string SQLite::getErrorMessage() { - int ec{getErrorCode()}; + std::string SQLite::getErrorMessage() const { + const int ec{getErrorCode()}; return (0 == ec) ? std::string() : std::string(sqlite3_errstr(ec)) + ": " + sqlite3_errmsg(db_.connection().get());