asn1.cpp

来自「JdonFramework need above jdk 1.4.0 This」· C++ 代码 · 共 2,107 行 · 第 1/5 页

CPP
2,107
字号
    case SMI_TIMETICKS:    case SMI_UINTEGER:      vp->val.integer = (long *)malloc(sizeof(long));      vp->val_len = sizeof(long);      asn_parse_unsigned_int(var_val, &len, &vp->type, (unsigned long *)vp->val.integer, sizeof(*vp->val.integer));      break;    case SMI_COUNTER64:      vp->val.counter64 = (struct counter64 *)malloc( sizeof(struct counter64) );      vp->val_len = sizeof(struct counter64);      asn_parse_unsigned_int64(var_val, &len, &vp->type,			       (struct counter64 *)vp->val.counter64,			       sizeof(*vp->val.counter64));      break;	    case ASN_OCTET_STR:    case SMI_IPADDRESS:    case SMI_OPAQUE:    case SMI_NSAP:      vp->val.string = (unsigned char *)malloc((unsigned)vp->val_len);      asn_parse_string(var_val, &len, &vp->type, vp->val.string, &vp->val_len);      break;    case ASN_OBJECT_ID:      vp->val_len = ASN_MAX_NAME_LEN;      asn_parse_objid(var_val, &len, &vp->type, objid, &vp->val_len);      //vp->val_len *= sizeof(oid);      vp->val.objid = (oid *)malloc((unsigned)vp->val_len * sizeof(oid));      // fixed      memcpy((char *)vp->val.objid,	     (char *)objid,	     vp->val_len * sizeof(oid));      break;    case SNMP_NOSUCHOBJECT:    case SNMP_NOSUCHINSTANCE:    case SNMP_ENDOFMIBVIEW:    case ASN_NULL:      break;    default:      ASNERROR("bad type returned ");      return SNMP_CLASS_ASN1ERROR;      break;    }  }  return SNMP_CLASS_SUCCESS;}int snmp_parse_data_pdu(snmp_pdu *pdu, unsigned char *&data, int &length){  oid	    objid[ASN_MAX_NAME_LEN];  int	    four = 4;  unsigned char  type;  data = asn_parse_header(data, &length, &type);  if (data == NULL) return SNMP_CLASS_ASN1ERROR;  pdu->command = type;  if (pdu->command != TRP_REQ_MSG)  {    // get the rid    data = asn_parse_int(data, &length, &type,			 (long *)&pdu->reqid, sizeof(pdu->reqid));    if (data == NULL) return SNMP_CLASS_ASN1ERROR;    // get the error status    data = asn_parse_int(data, &length, &type,			 (long *)&pdu->errstat, sizeof(pdu->errstat));    if (data == NULL) return SNMP_CLASS_ASN1ERROR;    // get the error index    data = asn_parse_int(data, &length, &type,			 (long *)&pdu->errindex, sizeof(pdu->errindex));    if (data == NULL) return SNMP_CLASS_ASN1ERROR;  }  else  {  // is a trap    // get the enterprise    pdu->enterprise_length = ASN_MAX_NAME_LEN;    data = asn_parse_objid(data, &length, &type,			   objid, &pdu->enterprise_length);    if (data == NULL) return SNMP_CLASS_ASN1ERROR;    pdu->enterprise = (oid *)malloc(pdu->enterprise_length * sizeof(oid));    memcpy((char *)pdu->enterprise,(char *)objid,	   pdu->enterprise_length * sizeof(oid));    // get source address    data = asn_parse_string(data, &length, &type,			    (unsigned char *)&pdu->agent_addr.sin_addr.s_addr,			    &four);    if (data == NULL) return SNMP_CLASS_ASN1ERROR;    // get trap type    long dummy = 0;    data = asn_parse_int(data, &length, &type, &dummy, sizeof(dummy));    pdu->trap_type = dummy;    if (data == NULL) return SNMP_CLASS_ASN1ERROR;    // trap type    dummy = 0;    data = asn_parse_int(data, &length, &type, &dummy, sizeof(dummy));    pdu->specific_type = dummy;    if (data == NULL) return SNMP_CLASS_ASN1ERROR;    // timestamp    data = asn_parse_unsigned_int(data, &length, &type,                                  &pdu->time, sizeof(pdu->time));    if (data == NULL) return SNMP_CLASS_ASN1ERROR;  }  return SNMP_CLASS_SUCCESS;}// parse a pduint snmp_parse( struct snmp_pdu *pdu,                unsigned char *data, int data_length,		unsigned char *community_name,		int &community_len,		snmp_version &spp_version){  long    version = -1;  // authenticates message and returns length if valid  data = snmp_auth_parse(data, &data_length,			 community_name, &community_len,			 &version);  if (data == NULL)    return SNMP_CLASS_ASN1ERROR;  if(version != SNMP_VERSION_1 && version != SNMP_VERSION_2C ) {    ASNERROR("Wrong version");    return SNMP_CLASS_BADVERSION;  }  spp_version = (snmp_version) version;  int res = snmp_parse_data_pdu(pdu, data, data_length);  if (res != SNMP_CLASS_SUCCESS)    return res;  return snmp_parse_vb(pdu, data, data_length);}#ifdef _SNMPv3// Parse the field HeaderData of a SNMPv3 message and return the values.unsigned char *asn1_parse_header_data(unsigned char *buf, int *buf_len,				      long *msg_id, long *msg_max_size,				      unsigned char *msg_flags,				      long *msg_security_model){  unsigned char *buf_ptr = buf;  int length = *buf_len;  unsigned char type;  buf = asn_parse_header( buf, &length, &type);  if (!buf)  {    debugprintf(0, "Parse error in header HeaderData");    return 0;  }  if (type != (ASN_SEQ_CON)){    debugprintf(0, "wrong type in header of msgHeaderData");    return 0;  }  buf = asn_parse_int(buf, &length, &type, msg_id, sizeof(*msg_id));  if (!buf){    debugprintf(0, "Parse error: msg_id");    return 0;  }  buf = asn_parse_int(buf, &length,		      &type, msg_max_size, sizeof(*msg_max_size));  if (!buf){    debugprintf(0, "Parse error: msg_max_size");    return 0;  }  int dummy = 1;  buf = asn_parse_string( buf, &length, &type, msg_flags, &dummy);  if ((dummy !=1) || (!buf)) {    debugprintf(0, "Parse error: msg_flags");    return 0;  }  buf = asn_parse_int(buf, &length, &type,		      msg_security_model, sizeof(*msg_security_model));  if (!buf){    debugprintf(0, "Parse error: msg_security_model");    return 0;  }  if (length) {    debugprintf(0, "Parse error: wrong length in header of HeaderData");    return 0;  }  debugprintf(3, "Parsed HeaderData: globalDataLength(0x%x), msg_id(0x%lx), "	     "msg_max_size(0x%lx), msg_flags(0x%x), msg_security_model(0x%lx)",	      length, *msg_id, *msg_max_size, *msg_flags, *msg_security_model);  *buf_len -= SAFE_INT_CAST(buf - buf_ptr);  return buf;}// Encode the given values for the HeaderData into the buffer.unsigned char *asn1_build_header_data(unsigned char *outBuf, int *maxLength,				       long msgID,				       long maxMessageSize,				       unsigned char msgFlags,				       long securityModel){  unsigned char buf[MAXLENGTH_GLOBALDATA];  unsigned char *bufPtr = (unsigned char*)&buf;  unsigned char *outBufPtr = outBuf;  int length = *maxLength;  int totalLength;#ifdef INVALID_MAXMSGSIZE  debugprintf(-10, "\nWARNING: Using constant MaxMessageSize!\n");  maxMessageSize = 65535;#endif  debugprintf(3, "Coding msgID(0x%lx), maxMessageSize(0x%lx), "	      "msgFlags(0x%x), securityModel(0x%lx)",              msgID, maxMessageSize, msgFlags, securityModel);  bufPtr = asn_build_int(bufPtr, &length,                         (unsigned char)(ASN_UNI_PRIV | ASN_INTEGER),                         (long *)&msgID, sizeof(msgID));  if (bufPtr == NULL){    debugprintf(0, "asn_build_header_data: Error coding msgID");    return NULL;  }  bufPtr = asn_build_int(bufPtr, &length,                         (unsigned char)(ASN_UNI_PRIV | ASN_INTEGER),                         (long *)&maxMessageSize, sizeof(maxMessageSize));  if (bufPtr == NULL){    debugprintf(0, "asn_build_header_data: Error coding maxMessageSize");    return NULL;  }  bufPtr = asn_build_string(bufPtr, &length,                            (unsigned char)(ASN_UNI_PRIV | ASN_OCTET_STR),                            (unsigned char*)&msgFlags, 1);  if (bufPtr == NULL){    debugprintf(0, "asn_build_header_data: Error coding msgFlags");    return NULL;  }  bufPtr = asn_build_int(bufPtr, &length,                         (unsigned char)(ASN_UNI_PRIV | ASN_INTEGER),                         (long *)&securityModel, sizeof(securityModel));  if (bufPtr == NULL){    debugprintf(0, "asn_build_header_data: Error coding securityModel");    return NULL;  }  totalLength = SAFE_INT_CAST(bufPtr - (unsigned char*)&buf);  debugprintf(3, "Coding sequence (headerdata), length = 0x%x", totalLength);  outBufPtr = asn_build_sequence(outBufPtr, maxLength,                                 (unsigned char)(ASN_SEQ_CON),                                 totalLength);  if (outBufPtr == NULL) {    debugprintf(0, "asn_build_header_data: Error coding seq headerdata");    return NULL;  }  if (*maxLength < totalLength) {    debugprintf(0, "asn_build_header_data: Length error");    return NULL;  }  memcpy(outBufPtr, (unsigned char*)&buf, totalLength);  outBufPtr += totalLength;  *maxLength -= totalLength;  debugprintf(21, "bufHeaderData:");  debughexprintf(21, outBuf, SAFE_INT_CAST(outBufPtr - outBuf));  return outBufPtr;}#endif// Parse the ScopedPDU and return the encoded values.unsigned char *asn1_parse_scoped_pdu(         unsigned char *scoped_pdu, int *scoped_pdu_len,         unsigned char *context_engine_id, int *context_engine_id_len,         unsigned char *context_name, int *context_name_len ){  unsigned char type;  scoped_pdu = asn_parse_header( scoped_pdu, scoped_pdu_len, &type);  if (!scoped_pdu) {    debugprintf(0, "Parse error: Wrong header in scoped_pdu.");    return 0;  }  if (type != (ASN_SEQ_CON)){    debugprintf(0, "Parse error: Wrong header type in scoped_pdu.");    return 0;  }  scoped_pdu = asn_parse_string( scoped_pdu, scoped_pdu_len, &type,                                context_engine_id, context_engine_id_len);  if (!scoped_pdu){    debugprintf(0, "Parse error: context_engine_id");    return 0;  }  scoped_pdu = asn_parse_string( scoped_pdu, scoped_pdu_len, &type,                                context_name, context_name_len);  if (!scoped_pdu){    debugprintf(0, "mpParseScopedPDU: bad parse of context_name");    return 0;  }  debugprintf(3, "Parsed scoped_pdu: context_engine_id length(0x%x), "	      "context_name length(0x%x)",	      *context_engine_id_len, *context_name_len);  return scoped_pdu;}// Encode the given values for the scopedPDU into the buffer.unsigned char *asn1_build_scoped_pdu(                   unsigned char *outBuf, int *max_len,                   unsigned char *contextEngineID, long contextEngineIDLength,                   unsigned char *contextName, long contextNameLength,                   unsigned char *data, long dataLength){  Buffer<unsigned char> buffer(MAX_SNMP_PACKET);  unsigned char *bufPtr = buffer.get_ptr();  unsigned char *outBufPtr = outBuf;  long  bufLength = 0;  LOG_BEGIN(DEBUG_LOG | 10);  LOG("ASN1: coding (context engine id) (context name)");  LOG(OctetStr(contextEngineID, contextEngineIDLength).get_printable());  LOG(OctetStr(contextName, contextNameLength).get_printable());  LOG_END;  bufPtr = asn_build_string(bufPtr, max_len,                            (unsigned char)(ASN_UNI_PRIV | ASN_OCTET_STR),                            contextEngineID, contextEngineIDLength);  if (!bufPtr)  {    LOG_BEGIN(ERROR_LOG | 1);    LOG("ASN1: Error encoding contextEngineID");    LOG_END;    return 0;  }  bufPtr = asn_build_string(bufPtr, max_len,                            (unsigned char)(ASN_UNI_PRIV | ASN_OCTET_STR),                            contextName, contextNameLength);  if (!bufPtr)  {    LOG_BEGIN(ERROR_LOG | 1);    LOG("ASN1: Error encoding contextName");    LOG_END;    return 0;  }  bufLength = SAFE_INT_CAST(bufPtr - buffer.get_ptr());  memcpy((char *)bufPtr, (char *)data, dataLength);  bufLength += dataLength;  LOG_BEGIN(DEBUG_LOG | 10);  LOG("ASN1: Encoding scoped PDU sequence (len)");  LOG(bufLength);  LOG_END;  outBufPtr = asn_build_sequence(outBufPtr, max_len,                                 (unsigned char)(ASN_SEQ_CON),                                 bufLength);  if (!outBufPtr)  {    LOG_BEGIN(ERROR_LOG | 1);    LOG("ASN1: Error encoding scopedPDU sequence");    LOG_END;    return 0;  }  memcpy(outBufPtr, buffer.get_ptr(), bufLength);  outBufPtr += bufLength;#ifdef __DEBUG  LOG_BEGIN(DEBUG_LOG | 15);  LOG("ASN1: Result of build_scoped_pdu (len) (data)");  LOG(outBufPtr - outBuf);  LOG(OctetStr(outBuf, outBufPtr - outBuf).get_printable_hex());  LOG_END;#endif  return outBufPtr;}#ifdef SNMP_PP_NAMESPACE}; // end of namespace Snmp_pp#endif 

⌨️ 快捷键说明

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