Hi All,
        Thanks for reading. I am facing problem with SNMPV3 user
authentication.

(1) I created an SNMPv3 user at the initialization code(init_usm() in
snmpusm.c). I wrote an API to create an user. It is in accordance with
usm_parse_create_usmUser API present in snmpv3.c. Instead of taking
parameters like username and authentication key from snmpd.conf, I am
supplying them as parameters to my API. I am creating this user here as
I am not using snmpd.conf for configuration. The API I wrote for
creating the user is attached with this e-mail. For clarity, I am
including only the part I changed in snmpusm.c file.

(2)  When I create the user without Authentication and Privacy, SNMPV3
works fine and I get response. When I create user with Authentication
and privacy parameters, It fails. Basically I am getting failure in the
following piece of code in the API usm_process_in_msg present in
snmpusm.c :


  /*
     * Check the authentication credentials of the message.
     */
    if (secLevel == SNMP_SEC_LEVEL_AUTHNOPRIV
        || secLevel == SNMP_SEC_LEVEL_AUTHPRIV) {
        if (sc_check_keyed_hash(user->authProtocol,
user->authProtocolLen,
                                user->authKey, user->authKeyLen,
                                wholeMsg, wholeMsgLen,
                                signature, signature_length)
            != SNMP_ERR_NOERROR) {
            DEBUGMSGTL(("usm", "Verification failed.\n"));
           if (snmp_increment_statistic(STAT_USMSTATSWRONGDIGESTS) == 0)
{
                DEBUGMSGTL(("usm", "%s\n",
                            "Failed to increment statistic."));
            }
      snmp_log(LOG_WARNING, "Authentication failed for
%s\n",user->name);      -> I am getting this error on console for the
user I created.

            return SNMPERR_USM_AUTHENTICATIONFAILURE;
        }

        DEBUGMSGTL(("usm", "Verification succeeded.\n"));
    }


Please let me know if the way I am creating user is correct. It seems
the authentication is getting failed. Your inputs for solving this
problem are highly appreciated.


Thanks in advance,
Madan

void
init_usm(void)
{
    struct snmp_secmod_def *def;

    DEBUGMSGTL(("init_usm", "unit_usm: %d %d\n", usmNoPrivProtocol[0],
                usmNoPrivProtocol[1]));

    sc_init();                  /* initalize scapi code */

    /*
     * register ourselves as a security service
     */
    def = SNMP_MALLOC_STRUCT(snmp_secmod_def);
    /*
     * XXX: def->init_sess_secmod move stuff from snmp_api.c
     */
    def->encode_reverse = usm_secmod_rgenerate_out_msg;
    def->encode_forward = usm_secmod_generate_out_msg;
    def->decode = usm_secmod_process_in_msg;
    def->pdu_free_state_ref = usm_free_usmStateReference;
    def->handle_report = usm_handle_report;
    register_sec_mod(USM_SEC_MODEL_NUMBER, "usm", def);

    brcm_usm_parse_create_usmUser("madan","MD5","DES","madan123","madan123"); 
/* -> Here I am creating user */
    /*brcm_usm_parse_create_usmUser("madan",NULL,NULL,NULL,NULL); */
}



/*******************THIS IS THE API I WROTE FOR USER CREATION 
***********************/

void brcm_usm_parse_create_usmUser(const char *secName,const char 
*authType,const char *privType,const char *authKey,const char *privKey)
{
    struct usmUser *newuser;
    u_char          userKey[SNMP_MAXBUF_SMALL];
    size_t          userKeyLen = SNMP_MAXBUF_SMALL;
    size_t          privKeyLen = 0;
    size_t          ret;
    int             ret2;
    int             testcase;

    newuser = usm_create_user();

    /*
     * READ: Security Name
     */
    newuser->engineID = snmpv3_generate_engineID(&ret);
    if (ret == 0)
    {
      usm_free_user(newuser);
      return;
    }
    newuser->engineIDLen = ret;

    newuser->secName = strdup(secName);
    newuser->name = strdup(secName);

    if(authType == NULL && privType == NULL)  /* no authentication or privacy 
type */
    {
      printf("\r\nAs no authPriv...Adding the usere  here itself\n");
      goto add;
    }

    /*
     * READ: Authentication Type
     */
#ifndef NETSNMP_DISABLE_MD5
    if (strncmp(authType, "MD5", 3) == 0) {
        printf("\r\nFor user %s authType is %s\n",newuser->secName,authType);
        memcpy(newuser->authProtocol, usmHMACMD5AuthProtocol, 
sizeof(usmHMACMD5AuthProtocol));
    } else
#endif
        if (strncmp(authType, "SHA", 3) == 0) {
        printf("\r\nFor user %s authType is %s\n",newuser->secName,authType);
        memcpy(newuser->authProtocol, usmHMACSHA1AuthProtocol,
               sizeof(usmHMACSHA1AuthProtocol));
    } else {
        printf("Unknown authentication protocol");
        usm_free_user(newuser);
        return;
    }

    /*
     * READ: Authentication Pass Phrase or key
     */
    if (!authKey) {
        printf("no authentication pass phrase");
        usm_free_user(newuser);
        return;
    }
    else {
        /* a password is specified */
        userKeyLen = sizeof(userKey);
        printf("\r\nauthKey is %s\n",(u_char *) authKey);
        ret2 = generate_Ku(newuser->authProtocol, newuser->authProtocolLen,
                          (u_char *) authKey, strlen(authKey), userKey, 
&userKeyLen);
        if (ret2 != SNMPERR_SUCCESS) {
            printf("could not generate the authentication key from the "
                          "supplied pass phrase.");
            usm_free_user(newuser);
            return;
        }
    }

    /*
     * And turn it into a localized key
     */
    ret2 = sc_get_properlength(newuser->authProtocol,
 newuser->authProtocolLen);
    if (ret2 <= 0) {
        printf("Could not get proper authentication protocol key length");
        return;
    }
    newuser->authKey = (u_char *) malloc(ret2);

    newuser->authKeyLen = ret2;
    printf("\r\nuserKey is %s\n",userKey);
    ret2 = generate_kul(newuser->authProtocol, newuser->authProtocolLen,
                        newuser->engineID, newuser->engineIDLen,
                         userKey, userKeyLen,
                         newuser->authKey, &newuser->authKeyLen);
    if (ret2 != SNMPERR_SUCCESS) {
            printf("could not generate localized authentication key "
                          "(Kul) from the master key (Ku).");
            usm_free_user(newuser);
            return;
        }

    if (!privType)
        goto add;               /* no privacy type (which is legal) */

    /*
     * READ: Privacy Type
     */
    testcase = 0;
#ifndef NETSNMP_DISABLE_DES
    if (strncmp(privType, "DES", 3) == 0) {
        printf("\r\nFor user %s privType is %s\n",newuser->secName,privType);
        memcpy(newuser->privProtocol, usmDESPrivProtocol,
               sizeof(usmDESPrivProtocol));
        testcase = 1;
  /* DES uses a 128 bit key, 64 bits of which is a salt */
  privKeyLen = 16;
    }
#endif
#ifdef HAVE_AES
    if (strncmp(privType, "AES128", 6) == 0 || strncmp(cp, "AES", 3) == 0) {
        memcpy(newuser->privProtocol, usmAESPrivProtocol,
               sizeof(usmAESPrivProtocol));
        testcase = 1;
  privKeyLen = 16;
    }
#endif
    if (testcase == 0) {
        printf("Unknown privacy protocol");
        usm_free_user(newuser);
        return;
    }

    /*
     * READ: Encryption Pass Phrase or key
     */
    if (!privKey) {
        /*
         * assume the same as the authentication key
         */
        memdup(&newuser->privKey, newuser->authKey, newuser->authKeyLen);
        newuser->privKeyLen = newuser->authKeyLen;
    } else {
            printf("\r\nprivkey: %s\n",(u_char *) privKey);
            /* a password is specified */
            userKeyLen = sizeof(userKey);
            ret2 = generate_Ku(newuser->authProtocol, newuser->authProtocolLen,
                              (u_char *) privKey, strlen(privKey), userKey, 
&userKeyLen);
            if (ret2 != SNMPERR_SUCCESS) {
                config_perror("could not generate the privacy key from the "
                              "supplied pass phrase.");
                usm_free_user(newuser);
                return;
            }
        }
        /*
         * And turn it into a localized key
         */
        ret2 = sc_get_properlength(newuser->authProtocol,
                      newuser->authProtocolLen);
        if (ret2 < 0) {
            config_perror("could not get proper key length to use for the "
                          "privacy algorithm.");
            usm_free_user(newuser);
            return;
        }
        newuser->privKey = (u_char *) malloc(ret2);

        newuser->privKeyLen = ret2;
        printf("\r\nuserPrivkey: %s\n",(u_char *) userKey);
        ret2 = generate_kul(newuser->authProtocol, newuser->authProtocolLen,
                            newuser->engineID, newuser->engineIDLen,
                            userKey, userKeyLen,
                            newuser->privKey, &newuser->privKeyLen);
         if (ret2 != SNMPERR_SUCCESS) {
                printf("could not generate localized privacy key "
                              "(Kul) from the master key (Ku).");
                usm_free_user(newuser);
                return;
            }

    if ((newuser->privKeyLen >= privKeyLen) || (privKeyLen == 0)){
    printf("\r\nFUNCTION: %s LINE: %d\n",__FUNCTION__,__LINE__);
      newuser->privKeyLen = privKeyLen;
    }
    else {
    printf("\r\nFUNCTION: %s LINE: %d\n",__FUNCTION__,__LINE__);
      /* The privKey length is smaller than required by privProtocol */
      usm_free_user(newuser);
      return;
    }
    printf("\r\nFUNCTION: %s LINE: %d\n",__FUNCTION__,__LINE__);
    goto add;

  add:
    usm_add_user(newuser);
    printf("created a new user %s at ", newuser->secName);
    DEBUGMSGTL(("usmUser", "created a new user %s at ", newuser->secName));
 DEBUGMSGHEX(("usmUser", newuser->engineID, newuser->engineIDLen));
    DEBUGMSG(("usmUser", "\n"));
}

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Net-snmp-users mailing list
Net-snmp-users@lists.sourceforge.net
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users

Reply via email to