⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmpv3.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
  /* READ: Authentication Pass Phrase */  if (!cp) {    config_perror("no authentication pass phrase");    usm_free_user(newuser);    return;  }  cp = copy_word(cp, buf);  /* And turn it into a localized key */  ret = generate_Ku(newuser->authProtocol, newuser->authProtocolLen,		    (u_char *)buf, strlen(buf),		    userKey, &userKeyLen );  if (ret != SNMPERR_SUCCESS) {    config_perror("Error generating auth key from pass phrase.");    usm_free_user(newuser);    return;  }  newuser->authKeyLen =    sc_get_properlength(newuser->authProtocol, newuser->authProtocolLen);  newuser->authKey = (u_char *) malloc(newuser->authKeyLen);  ret = generate_kul(newuser->authProtocol, newuser->authProtocolLen,		     newuser->engineID, newuser->engineIDLen,		     userKey, userKeyLen,		     newuser->authKey, &newuser->authKeyLen );  if (ret != SNMPERR_SUCCESS) {    config_perror("Error generating localized auth key (Kul) from Ku.");    usm_free_user(newuser);    return;  }  if (!cp)    goto add; /* no privacy type (which is legal) */    /* READ: Privacy Type */  if (strncmp(cp, "DES", 3) == 0) {    memcpy(newuser->privProtocol, usmDESPrivProtocol,           sizeof(usmDESPrivProtocol));  } else {    config_perror("Unknown privacy protocol");    usm_free_user(newuser);    return;  }  cp = skip_token(cp);  /* READ: Authentication Pass Phrase */  if (!cp) {    /* assume the same as the authentication key */    memdup(&newuser->privKey, newuser->authKey, newuser->authKeyLen);  } else {    cp = copy_word(cp, buf);    /* And turn it into a localized key */    ret = generate_Ku(newuser->authProtocol, newuser->authProtocolLen,                      (u_char *)buf, strlen(buf),                      userKey, &userKeyLen );    if (ret != SNMPERR_SUCCESS) {      config_perror("Error generating priv key from pass phrase.");      usm_free_user(newuser);      return;    }    ret = sc_get_properlength(newuser->authProtocol, newuser->authProtocolLen);    if (ret < 0) {      config_perror("Error getting proper key length for priv algorithm.");      usm_free_user(newuser);      return;    }    newuser->privKeyLen = ret;          newuser->privKey = (u_char *) malloc(newuser->privKeyLen);    ret = generate_kul(newuser->authProtocol, newuser->authProtocolLen,                       newuser->engineID, newuser->engineIDLen,                       userKey, userKeyLen,                       newuser->privKey, &newuser->privKeyLen );    if (ret != SNMPERR_SUCCESS) {      config_perror("Error generating localized priv key (Kul) from Ku.");      usm_free_user(newuser);      return;    }  }add:  usm_add_user(newuser);  DEBUGMSGTL(("usmUser","created a new user %s\n", newuser->secName));}/*******************************************************************-o-****** * engineBoots_conf * * Parameters: *	*word *	*cptr * * Line syntax: *	engineBoots <num_boots> */voidengineBoots_conf(const char *word, char *cptr){  engineBoots = atoi(cptr)+1;  DEBUGMSGTL(("snmpv3","engineBoots: %d\n",engineBoots));}/*******************************************************************-o-****** * engineID_conf * * Parameters: *	*word *	*cptr * * This function reads a string from the configuration file and uses that * string to initialize the engineID.  It's assumed to be human readable. */voidengineID_conf(const char *word, char *cptr){  setup_engineID(NULL, cptr);  DEBUGMSGTL(("snmpv3","initialized engineID with: %s\n",cptr));}voidversion_conf(const char *word, char *cptr){  if (strcmp(cptr,"1") == 0) {    ds_set_int(DS_LIBRARY_ID, DS_LIB_SNMPVERSION, SNMP_VERSION_1);  } else if (strcasecmp(cptr,"2c") == 0) {    ds_set_int(DS_LIBRARY_ID, DS_LIB_SNMPVERSION, SNMP_VERSION_2c);  } else if (strcmp(cptr,"3") == 0) {    ds_set_int(DS_LIBRARY_ID, DS_LIB_SNMPVERSION, SNMP_VERSION_3);  } else {    config_perror("Unknown version specification");    return;  }  DEBUGMSGTL(("snmpv3","set default version to %d\n",              ds_get_int(DS_LIBRARY_ID, DS_LIB_SNMPVERSION)));}/* engineID_old_conf(const char *, char *):   Reads a octet string encoded engineID into the oldEngineID and   oldEngineIDLen pointers.*/voidoldengineID_conf(const char *word, char *cptr){  read_config_read_octet_string(cptr, &oldEngineID, &oldEngineIDLength);}/*******************************************************************-o-****** * init_snmpv3 * * Parameters: *	*type	Label for the config file "type" used by calling entity. *       * Set time and engineID. * Set parsing functions for config file tokens. * Initialize SNMP Crypto API (SCAPI). */voidinit_snmpv3(const char *type) {  gettimeofday(&snmpv3starttime, NULL);  if (type == NULL)     type = "snmpapp";  if (type && !strcmp(type,"snmpapp")) {     setup_engineID(NULL,"__snmpapp__");  } else {     setup_engineID(NULL, NULL);  }  /* initialize submodules */  init_usm();  /* we need to be called back later */  snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_POST_READ_CONFIG,                         init_snmpv3_post_config, NULL);  /* we need to be called back later */  snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,                         snmpv3_store, (void *) type);#if		!defined(USE_INTERNAL_MD5)  /* doesn't belong here at all */  sc_init();#endif		/* !USE_INTERNAL_MD5 */  /* register all our configuration handlers (ack, there's a lot) */  /* handle engineID setup before everything else which may depend on it */  register_premib_handler(type,"engineID", engineID_conf, NULL, "string");  register_premib_handler(type,"oldEngineID", oldengineID_conf, NULL, NULL);  register_config_handler(type,"engineBoots", engineBoots_conf, NULL, NULL);  /* default store config entries */  ds_register_config(ASN_OCTET_STR, "snmp", "defSecurityName", DS_LIBRARY_ID,                     DS_LIB_SECNAME);  ds_register_config(ASN_OCTET_STR, "snmp", "defContext", DS_LIBRARY_ID,                     DS_LIB_CONTEXT);  ds_register_config(ASN_OCTET_STR, "snmp", "defPassphrase", DS_LIBRARY_ID,                     DS_LIB_PASSPHRASE);  ds_register_config(ASN_OCTET_STR, "snmp", "defAuthPassphrase", DS_LIBRARY_ID,                     DS_LIB_AUTHPASSPHRASE);  ds_register_config(ASN_OCTET_STR, "snmp", "defPrivPassphrase", DS_LIBRARY_ID,                     DS_LIB_PRIVPASSPHRASE);  register_config_handler("snmp","defVersion", version_conf, NULL, "1|2c|3");  register_config_handler("snmp","defAuthType", snmpv3_authtype_conf, NULL,                          "MD5|SHA");  register_config_handler("snmp","defPrivType", snmpv3_privtype_conf, NULL,                          "DES (currently the only possible value)");  register_config_handler("snmp","defSecurityLevel", snmpv3_secLevel_conf,                          NULL, "noAuthNoPriv|authNoPriv|authPriv");  register_config_handler(type,"userSetAuthPass", usm_set_password, NULL,                          "secname engineIDLen engineID pass");  register_config_handler(type,"userSetPrivPass", usm_set_password, NULL,                          "secname engineIDLen engineID pass");  register_config_handler(type,"userSetAuthKey", usm_set_password, NULL,                          "secname engineIDLen engineID KuLen Ku");  register_config_handler(type,"userSetPrivKey", usm_set_password, NULL,                          "secname engineIDLen engineID KuLen Ku");  register_config_handler(type,"userSetAuthLocalKey", usm_set_password, NULL,                          "secname engineIDLen engineID KulLen Kul");  register_config_handler(type,"userSetPrivLocalKey", usm_set_password, NULL,                          "secname engineIDLen engineID KulLen Kul");}/* * initializations for SNMPv3 to be called after the configuration files * have been read. */intinit_snmpv3_post_config(int majorid, int minorid, void *serverarg,                        void *clientarg) {  int engineIDLen;  u_char *c_engineID;  c_engineID = snmpv3_generate_engineID(&engineIDLen);  if ( engineIDLen < 0 ) {    /* Somethine went wrong - help! */    return SNMPERR_GENERR;  }  /* if our engineID has changed at all, the boots record must be set to 1 */  if (engineIDLen != (int)oldEngineIDLength ||      oldEngineID == NULL || c_engineID == NULL ||      memcmp(oldEngineID, c_engineID, engineIDLen) != 0) {    engineBoots = 1;  }  /* set our local engineTime in the LCD timing cache */  set_enginetime(c_engineID, engineIDLen,                  snmpv3_local_snmpEngineBoots(),                  snmpv3_local_snmpEngineTime(),                 TRUE);  free(c_engineID);  return SNMPERR_SUCCESS;}/*******************************************************************-o-****** * store_snmpv3 * * Parameters: *	*type */intsnmpv3_store(int majorID, int minorID, void *serverarg, void *clientarg) {  char line[SNMP_MAXBUF_SMALL];  u_char c_engineID[SNMP_MAXBUF_SMALL];  int  engineIDLen;  const char *type = (const char *) clientarg;  if (type == NULL)  /* should never happen, since the arg is ours */    type = "unknown";  sprintf(line, "engineBoots %ld", engineBoots);  read_config_store(type, line);  engineIDLen = snmpv3_get_engineID(c_engineID, SNMP_MAXBUF_SMALL);  if (engineIDLen) {    /* store the engineID used for this run */    sprintf(line, "oldEngineID ");    read_config_save_octet_string(line+strlen(line), c_engineID,                                  engineIDLen);    read_config_store(type, line);  }  return SNMPERR_SUCCESS;}  /* snmpv3_store() */u_longsnmpv3_local_snmpEngineBoots(void){  return engineBoots;}/*******************************************************************-o-****** * snmpv3_get_engineID * * Parameters: *	*buf *	 buflen *       * Returns: *	Length of engineID	On Success *	SNMPERR_GENERR		Otherwise. * * * Store engineID in buf; return the length. * */intsnmpv3_get_engineID(u_char *buf, size_t buflen){  /*   * Sanity check.   */  if ( !buf || (buflen < engineIDLength) ) {    return SNMPERR_GENERR;  }  memcpy(buf,engineID,engineIDLength);  return engineIDLength;}  /* end snmpv3_get_engineID() *//*******************************************************************-o-****** * snmpv3_clone_engineID * * Parameters: *	**dest *       *dest_len *       src *	 srclen *       * Returns: *	Length of engineID	On Success *	0		        Otherwise. * * * Clones engineID, creates memory * */intsnmpv3_clone_engineID(u_char **dest, size_t* destlen, u_char*src, size_t srclen){  if ( !dest || !destlen ) return 0;  *dest = NULL; *destlen = 0;  if (srclen && src) {    *dest = (u_char*)malloc((unsigned)srclen * sizeof(u_char));    if (*dest == NULL) return 0;    memmove(*dest, src, srclen * sizeof(u_char));    *destlen = srclen;  }  return *destlen;}  /* end snmpv3_clone_engineID() *//*******************************************************************-o-****** * snmpv3_generate_engineID * * Parameters: *	*length *       * Returns: *	Pointer to copy of engineID	On Success. *	NULL				If malloc() or snmpv3_get_engineID() *						fail. * * Generates a malloced copy of our engineID. * * 'length' is set to the length of engineID  -OR-  < 0 on failure. */u_char *snmpv3_generate_engineID(int *length){  u_char *newID;  newID = (u_char *) malloc(engineIDLength);  if (newID) {    *length = snmpv3_get_engineID(newID, engineIDLength);  }  if (*length < 0) {    SNMP_FREE(newID);    newID = NULL;  }  return newID;}  /* end snmpv3_generate_engineID() *//* snmpv3_local_snmpEngineTime(): return the number of seconds since the   snmpv3 engine last incremented engine_boots */u_longsnmpv3_local_snmpEngineTime(void){  struct timeval now;  gettimeofday(&now, NULL);  return calculate_time_diff(&now, &snmpv3starttime)/100;}#ifdef SNMP_TESTING_CODE/* snmpv3_set_engineBootsAndTime(): this function does not exist.  Go away. *//*   It certainly should never be used, unless in a testing scenero,     which is why it was created */voidsnmpv3_set_engineBootsAndTime(int boots, int ttime) {  engineBoots = boots;  gettimeofday(&snmpv3starttime, NULL);  snmpv3starttime.tv_sec -= ttime;}#endif#endif /* CYGPKG_SNMPAGENT_V3_SUPPORT */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -