/*
 * 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;
}
