diff options
Diffstat (limited to 'agent/mibgroup/snmp-usm-dh-objects-mib/usmDHParameters/usmDHParameters.c')
-rw-r--r-- | agent/mibgroup/snmp-usm-dh-objects-mib/usmDHParameters/usmDHParameters.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/agent/mibgroup/snmp-usm-dh-objects-mib/usmDHParameters/usmDHParameters.c b/agent/mibgroup/snmp-usm-dh-objects-mib/usmDHParameters/usmDHParameters.c new file mode 100644 index 0000000..d28225d --- /dev/null +++ b/agent/mibgroup/snmp-usm-dh-objects-mib/usmDHParameters/usmDHParameters.c @@ -0,0 +1,136 @@ +/* + * Note: this file originally auto-generated by mib2c using + * : mib2c.scalar.conf,v 1.7 2003/04/08 14:57:04 dts12 Exp $ + */ + +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-includes.h> +#include <net-snmp/agent/net-snmp-agent-includes.h> +#include "usmDHParameters.h" + +#include <openssl/dh.h> + +static DH *dh_params = NULL; + +DH * +get_dh_params(void) +{ + return dh_params; +} + +/** Initializes the usmDHParameters module */ +void +init_usmDHParameters(void) +{ + static oid usmDHParameters_oid[] = + { 1, 3, 6, 1, 3, 101, 1, 1, 1 }; + + DEBUGMSGTL(("usmDHParameters", "Initializing\n")); + + netsnmp_register_scalar(netsnmp_create_handler_registration + ("usmDHParameters", handle_usmDHParameters, + usmDHParameters_oid, + OID_LENGTH(usmDHParameters_oid), + HANDLER_CAN_RWRITE)); + + /* currently hard coded to the oakly group 2 set. */ + /* these values are modifiable via SNMP SETs if needed by + management apps though */ + if (!dh_params) { + dh_params = DH_new(); + dh_params->g = BN_new(); + BN_hex2bn(&dh_params->g, "02"); + BN_hex2bn(&dh_params->p, "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"); + } +} + +int +handle_usmDHParameters(netsnmp_mib_handler *handler, + netsnmp_handler_registration *reginfo, + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *requests) +{ + /* + * We are never called for a GETNEXT if it's registered as a + * "instance", as it's "magically" handled for us. + */ + + static unsigned char *cp = NULL; + static DH *dh_tmpp = NULL; + int cp_len; + + /* + * a instance handler also only hands us one request at a time, so + * we don't need to loop over a list of requests; we'll only get one. + */ + + switch (reqinfo->mode) { + + case MODE_GET: + if(cp) { + free(cp); + cp = NULL; + } + cp_len = i2d_DHparams(dh_params, &cp); + if (cp_len > 0) + snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR, + (u_char *) cp, cp_len); + break; + + /* + * SET REQUEST + * + * multiple states in the transaction. See: + * http://www.net-snmp.org/tutorial-5/toolkit/mib_module/set-actions.jpg + */ + case MODE_SET_RESERVE1: + break; + + case MODE_SET_RESERVE2: + cp = requests->requestvb->val.string; + dh_tmpp = d2i_DHparams(NULL, (const unsigned char **) (void *)&cp, + requests->requestvb->val_len); + if ( !dh_tmpp) { + netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_WRONGVALUE); + } + if (cp - requests->requestvb->val.string != + requests->requestvb->val_len) { + /* value too long; we didn't parse the whole thing */ + netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_WRONGVALUE); + DH_free(dh_tmpp); + dh_tmpp = NULL; + } + break; + + case MODE_SET_FREE: + case MODE_SET_COMMIT: + DH_free(dh_tmpp); + dh_tmpp = NULL; + break; + + case MODE_SET_ACTION: + { + DH *tmpp; + tmpp = dh_params; + dh_params = dh_tmpp; + dh_tmpp = tmpp; + break; + } + + case MODE_SET_UNDO: + { + DH_free(dh_params); /* free new value */ + dh_params = dh_tmpp; /* restore old value */ + dh_tmpp = NULL; + break; + } + + default: + /* + * we should never get here, so this is a really bad error + */ + return SNMP_ERR_GENERR; + } + + return SNMP_ERR_NOERROR; +} |