[monitoring-plugins] check_snmp: test for more priv protocols at ...

GitHub git at monitoring-plugins.org
Mon Aug 3 11:10:13 CEST 2026


    Module: monitoring-plugins
    Branch: master
    Commit: 0296723fedc883a65ea01578a08b84db185241b7
    Author: Lorenz Kästle <12514511+RincewindsHat at users.noreply.github.com>
 Committer: GitHub <noreply at github.com>
      Date: Mon Aug  3 11:07:09 2026 +0200
       URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=0296723f

check_snmp: test for more priv protocols at compile time (#2313)

* check_snmp: test for more priv protocols at compile time

Build check_snmp broke on Gentoo due to missing support
for the bluementhal-AES variants in net-snmp there.
This patch adds a check for that.

* check_snmp: Fix several problems regarding SNMPv3 USM

Apparently the check_snmp rewrite broke Authentication/Privacy for
check_snmp (it always failed while generating keys).

This patch fixes this and also some copy and paste errors.

---------

Co-authored-by: Lorenz Kästle <lorenz.kaestle at netways.de>

---

 configure.ac         |  10 +++++
 plugins/check_snmp.c | 104 ++++++++++++++++++++++++++++-----------------------
 2 files changed, 67 insertions(+), 47 deletions(-)

diff --git a/configure.ac b/configure.ac
index 5e6aaeae..63c1eeae 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1486,6 +1486,16 @@ AC_COMPILE_IFELSE(
 	[]
 )
 
+dnl Check whether Blumentahl AES encryption is available (might not on Gentoo on probably others)
+AC_COMPILE_IFELSE(
+	[AC_LANG_PROGRAM(
+		[[#include <net-snmp/net-snmp-config.h>
+                #include <net-snmp/net-snmp-includes.h>]], [[oid *foo = usmAES192PrivProtocol;]]
+	)],
+	[AC_DEFINE(HAVE_USM_AES_PRIV_PROTOCOL,1,Define whether we have AES Privacy Protocol)],
+	[]
+)
+
 AC_PATH_PROG(PATH_TO_QUAKESTAT,quakestat)
 AC_PATH_PROG(PATH_TO_QSTAT,qstat)
 AC_ARG_WITH(qstat_command,
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 6615bb63..8e9830cd 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -514,8 +514,8 @@ static process_arguments_wrapper process_arguments(int argc, char **argv) {
 	size_t eval_counter = 0;
 	size_t unitv_counter = 0;
 	size_t labels_counter = 0;
-	unsigned char *authpasswd = NULL;
-	unsigned char *privpasswd = NULL;
+	char *authpasswd = NULL;
+	char *privpasswd = NULL;
 	int cflags = REG_EXTENDED | REG_NOSUB | REG_NEWLINE;
 	char *port = NULL;
 	char *miblist = NULL;
@@ -628,50 +628,52 @@ static process_arguments_wrapper process_arguments(int argc, char **argv) {
 		case 'x': /* priv protocol */
 			if (strcasecmp("DES", optarg) == 0) {
 #ifdef HAVE_USM_DES_PRIV_PROTOCOL
-				config.snmp_params.snmp_session.securityAuthProto = usmDESPrivProtocol;
-				config.snmp_params.snmp_session.securityAuthProtoLen =
+				config.snmp_params.snmp_session.securityPrivProto = usmDESPrivProtocol;
+				config.snmp_params.snmp_session.securityPrivProtoLen =
 					OID_LENGTH(usmDESPrivProtocol);
 #else
 				die(STATE_UNKNOWN, "DES Privacy Protocol not available on this platform");
 #endif
 			} else if (strcasecmp("AES", optarg) == 0) {
-				config.snmp_params.snmp_session.securityAuthProto = usmAESPrivProtocol;
-				config.snmp_params.snmp_session.securityAuthProtoLen =
+				config.snmp_params.snmp_session.securityPrivProto = usmAESPrivProtocol;
+				config.snmp_params.snmp_session.securityPrivProtoLen =
 					OID_LENGTH(usmAESPrivProtocol);
-				// } else if (strcasecmp("AES128", optarg)) {
-				// 	config.snmp_session.securityAuthProto = usmAES128PrivProtocol;
-				// 	config.snmp_session.securityAuthProtoLen = OID_LENGTH(usmAES128PrivProtocol)
-				// / OID_LENGTH(oid);
+// } else if (strcasecmp("AES128", optarg)) {
+// 	config.snmp_session.securityAuthProto = usmAES128PrivProtocol;
+// 	config.snmp_session.securityAuthProtoLen = OID_LENGTH(usmAES128PrivProtocol)
+// / OID_LENGTH(oid);
+#ifdef HAVE_USM_AES_PRIV_PROTOCOL
 			} else if (strcasecmp("AES192", optarg) == 0) {
-				config.snmp_params.snmp_session.securityAuthProto = usmAES192PrivProtocol;
-				config.snmp_params.snmp_session.securityAuthProtoLen =
+				config.snmp_params.snmp_session.securityPrivProto = usmAES192PrivProtocol;
+				config.snmp_params.snmp_session.securityPrivProtoLen =
 					OID_LENGTH(usmAES192PrivProtocol);
 			} else if (strcasecmp("AES256", optarg) == 0) {
-				config.snmp_params.snmp_session.securityAuthProto = usmAES256PrivProtocol;
-				config.snmp_params.snmp_session.securityAuthProtoLen =
+				config.snmp_params.snmp_session.securityPrivProto = usmAES256PrivProtocol;
+				config.snmp_params.snmp_session.securityPrivProtoLen =
 					OID_LENGTH(usmAES256PrivProtocol);
-				// } else if (strcasecmp("AES192Cisco", optarg)) {
-				// 	config.snmp_session.securityAuthProto = usmAES192CiscoPrivProtocol;
-				// 	config.snmp_session.securityAuthProtoLen =
-				// sizeof(usmAES192CiscoPrivProtocol) / sizeof(oid); } else if
-				// (strcasecmp("AES256Cisco", optarg)) { config.snmp_session.securityAuthProto =
-				// usmAES256CiscoPrivProtocol; 	config.snmp_session.securityAuthProtoLen =
-				// sizeof(usmAES256CiscoPrivProtocol) / sizeof(oid); } else if
-				// (strcasecmp("AES192Cisco2", optarg)) { config.snmp_session.securityAuthProto
-				// = usmAES192Cisco2PrivProtocol; 	config.snmp_session.securityAuthProtoLen =
-				// sizeof(usmAES192Cisco2PrivProtocol) / sizeof(oid); } else if
-				// (strcasecmp("AES256Cisco2", optarg)) { config.snmp_session.securityAuthProto
-				// = usmAES256Cisco2PrivProtocol; 	config.snmp_session.securityAuthProtoLen =
-				// sizeof(usmAES256Cisco2PrivProtocol) / sizeof(oid);
+// } else if (strcasecmp("AES192Cisco", optarg)) {
+// 	config.snmp_session.securityPrivProto = usmAES192CiscoPrivProtocol;
+// 	config.snmp_session.securityPrivProtoLen =
+// sizeof(usmAES192CiscoPrivProtocol) / sizeof(oid); } else if
+// (strcasecmp("AES256Cisco", optarg)) { config.snmp_session.securityPrivProto =
+// usmAES256CiscoPrivProtocol; 	config.snmp_session.securityPrivProtoLen =
+// sizeof(usmAES256CiscoPrivProtocol) / sizeof(oid); } else if
+// (strcasecmp("AES192Cisco2", optarg)) { config.snmp_session.securityPrivProto
+// = usmAES192Cisco2PrivProtocol; 	config.snmp_session.securityPrivProtoLen =
+// sizeof(usmAES192Cisco2PrivProtocol) / sizeof(oid); } else if
+// (strcasecmp("AES256Cisco2", optarg)) { config.snmp_session.securityPrivProto
+// = usmAES256Cisco2PrivProtocol; 	config.snmp_session.securityPrivProtoLen =
+// sizeof(usmAES256Cisco2PrivProtocol) / sizeof(oid);
+#endif
 			} else {
 				die(STATE_UNKNOWN, "Unknown privacy protocol");
 			}
 			break;
 		case 'A': /* auth passwd */
-			authpasswd = (unsigned char *)optarg;
+			authpasswd = optarg;
 			break;
 		case 'X': /* priv passwd */
-			privpasswd = (unsigned char *)optarg;
+			privpasswd = optarg;
 			break;
 		case 'e':
 		case 'E':
@@ -938,34 +940,42 @@ static process_arguments_wrapper process_arguments(int argc, char **argv) {
 
 		switch (config.snmp_params.snmp_session.securityLevel) {
 		case SNMP_SEC_LEVEL_AUTHPRIV: {
-			if (authpasswd == NULL) {
-				die(STATE_UNKNOWN,
-					"No authentication passphrase was given, but authorization was requested");
+			// privacy
+			if (privpasswd == NULL) {
+				die(STATE_UNKNOWN, "No privacy passphrase was given, but privacy was requested");
 			}
-			// auth and priv
-			int priv_key_generated = generate_Ku(
-				config.snmp_params.snmp_session.securityPrivProto,
-				(unsigned int)config.snmp_params.snmp_session.securityPrivProtoLen, authpasswd,
-				strlen((const char *)authpasswd), config.snmp_params.snmp_session.securityPrivKey,
-				&config.snmp_params.snmp_session.securityPrivKeyLen);
+
+			config.snmp_params.snmp_session.securityPrivKeyLen = USM_PRIV_KU_LEN;
+			size_t tmp_strlen = strlen(privpasswd);
+
+			int priv_key_generated =
+				generate_Ku(config.snmp_params.snmp_session.securityAuthProto,
+							(unsigned int)config.snmp_params.snmp_session.securityAuthProtoLen,
+							(const unsigned char *)privpasswd, tmp_strlen,
+							config.snmp_params.snmp_session.securityPrivKey,
+							&config.snmp_params.snmp_session.securityPrivKeyLen);
 
 			if (priv_key_generated != SNMPERR_SUCCESS) {
-				die(STATE_UNKNOWN, "Failed to generate privacy key");
+				die(STATE_UNKNOWN, "Failed to generate privacy key\n");
 			}
 		}
 		// fall through
 		case SNMP_SEC_LEVEL_AUTHNOPRIV: {
-			if (privpasswd == NULL) {
-				die(STATE_UNKNOWN, "No privacy passphrase was given, but privacy was requested");
+			// authentication
+			if (authpasswd == NULL) {
+				die(STATE_UNKNOWN,
+					"No authentication passphrase was given, but authentication was requested");
 			}
-			int auth_key_generated = generate_Ku(
-				config.snmp_params.snmp_session.securityAuthProto,
-				(unsigned int)config.snmp_params.snmp_session.securityAuthProtoLen, privpasswd,
-				strlen((const char *)privpasswd), config.snmp_params.snmp_session.securityAuthKey,
-				&config.snmp_params.snmp_session.securityAuthKeyLen);
+			config.snmp_params.snmp_session.securityAuthKeyLen = USM_AUTH_KU_LEN;
+			int auth_key_generated =
+				generate_Ku(config.snmp_params.snmp_session.securityAuthProto,
+							(unsigned int)config.snmp_params.snmp_session.securityAuthProtoLen,
+							(const unsigned char *)authpasswd, strlen(authpasswd),
+							config.snmp_params.snmp_session.securityAuthKey,
+							&config.snmp_params.snmp_session.securityAuthKeyLen);
 
 			if (auth_key_generated != SNMPERR_SUCCESS) {
-				die(STATE_UNKNOWN, "Failed to generate privacy key");
+				die(STATE_UNKNOWN, "Failed to generate authentication key\n");
 			}
 		} break;
 		case SNMP_SEC_LEVEL_NOAUTH:



More information about the Commits mailing list