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

📄 isakmp.c

📁 该程序类似于tcpdump软件
💻 C
📖 第 1 页 / 共 2 页
字号:
  printf("Payload length          %d\n", ntohs(gen->length));

  bp = bp + sizeof(ISAKMP_generic_hdr);

  printf("Hash data:              not shown\n");

  bp = old_bp + ntohs(gen->length);
  determine_next_payload(gen->next_payload, bp);

}


/*----------------------------------------------------------------------------
**
** dump_notification_payload()
**
** Dump a notification payload.
**
**----------------------------------------------------------------------------
*/

void dump_notification_payload(u_char *bp)
{
  ISAKMP_generic_hdr *gen;
  u_int8_t protocol_id, spi_size;
  u_int16_t message_type;
  u_int32_t doi;
  u_char *old_bp;

  old_bp = bp;
  gen = (ISAKMP_generic_hdr *) bp;
  
  printf("-----------------------------------------------------------------\n");
  printf("                        ISAKMP Notification Header\n");
  printf("-----------------------------------------------------------------\n");
  printf("Next payload:           %d ", gen->next_payload);
  dump_next_payload(gen->next_payload);
  printf("Reserved:               %d\n", gen->reserved);
  printf("Payload length          %d\n", ntohs(gen->length));

  bp = bp + sizeof(ISAKMP_generic_hdr);

  doi = EXTRACT_32BITS(bp);
  bp = bp + 4;
  printf("DOI:                    %d\n", doi);

  protocol_id = *bp;
  bp++;
  printf("Protocol ID:            %d ", protocol_id);
  switch( protocol_id )
    {
    case 0:
      printf("(reserved)");
      break;
    case 1:
      printf("(protocol ISAKMP)");
      break;
    case 2:
      printf("(protocol IPSEC_AH)");
      break;
    case 3:
      printf("(protocol IPSEC_ESP)");
      break;
    case 4:
      printf("(protocol IPCOMP)");
      break;
    default:
      printf("(unknown)");
      break;
    }
  printf("\n");
  

  spi_size = *bp;
  bp++;
  printf("SPI size:               %d\n", spi_size);

  message_type = EXTRACT_16BITS(bp);
  bp = bp + 2;
  printf("Message type:           %d ", message_type);
  switch(message_type)
    {
    case 1:
    	printf("(invalid payload type)");
    	break;
    case 2:
    	printf("(DOI not supported)");
    	break;
    case 3:
    	printf("(situation not supported)");
    	break;
    case 4:
    	printf("(invalid cookie)");
    	break;
    case 5:
    	printf("(invalid major version)");
    	break;
    case 6:
    	printf("(invalid minor version)");
    	break;
    case 7:
    	printf("(invalid exchange type)");
    	break;
    case 8:
    	printf("(invalid flags)");
    	break;
    case 9:
    	printf("(invalid message ID)");
    	break;
    case 10:
    	printf("(invalid protocol ID)");
    	break;
    case 11:
    	printf("(invalid SPI)");
    	break;
    case 12:
    	printf("(invalid transform ID)");
    	break;
    case 13:
    	printf("(attributes not supported)");
    	break;
    case 14:
    	printf("(no proposal chosen)");
    	break;
    case 15:
    	printf("(bad proposal syntax)");
    	break;
    case 16:
    	printf("(payload malformed)");
    	break;
    case 17:
    	printf("(invalid key information)");
    	break;
    case 18:
    	printf("(invalid ID information)");
    	break;
    case 19:
    	printf("(invalid cert encoding)");
    	break;
    case 20:
    	printf("(invalid certificate)");
    	break;
    case 21:
    	printf("(cert type unsupported)");
    	break;
    case 22:
    	printf("(invalid cert authority)");
    	break;
    case 23:
    	printf("(invalid hash information)");
    	break;
    case 24:
    	printf("(authentication failed)");
    	break;
    case 25:
    	printf("(invalid signature)");
    	break;
    case 26:
    	printf("(address notification)");
    	break;
    case 27:
    	printf("(notify SA lifetime)");
    	break;
    case 28:
    	printf("(certificate unavailable)");
    	break;
    case 29:
    	printf("(unsupported exchange type)");
    	break;
    case 16384:
    	printf("(connected)");
    	break;
    case 24576:
      printf("(responder lifetime)");
      break;
    case 24577:
      printf("(replay status)");
      break;
    case 24578:
      printf("(initial contact)");
      break;
    default:
      printf("(unknown)");
      break;
    }
  printf("\n");

  printf("SPI:                    not shown\n");
  bp = bp + spi_size;

  /*
   * Here, the notification data length depends on the message type.
   * They really should have defined a length for this field.  We
   * have to get a bit ugly in order to do this right...
   */

  switch(message_type)
    {
    case 24576:
      break;
    case 24577:
      {
	u_int32_t data;
	
	data = EXTRACT_32BITS(bp);
	bp = bp + 4;
	printf("Notification data        %d ", data);
	switch(data)
	  {
	  case 0: 
	    printf("(replay detection disabled)");
	    break;
	  case 1:
	    printf("(replay detection enabled)");
	    break;
	  default:
	    printf("(unknown)");
	    break;
	  }
	printf("\n");
      }
      break;
    case 24578:
      printf("(initial contact)"); /* no data field */
      break;
    default:
      printf("(unknown)");
      break;
    }

  /*
   * Move pointer to end of this header 
   */

  bp = old_bp + ntohs(gen->length);
  determine_next_payload(gen->next_payload, bp);

}


/*----------------------------------------------------------------------------
**
** dump_transform_payload()
**
** Dump a transform payload.
**
**----------------------------------------------------------------------------
*/

void dump_transform_payload(u_char *bp)
{
  ISAKMP_generic_hdr *gen;
  u_int8_t trans_id, spi_size;
  u_int32_t trans;
  u_char *old_bp;

  old_bp = bp;
  gen = (ISAKMP_generic_hdr *) bp;
  
  printf("-----------------------------------------------------------------\n");
  printf("                        ISAKMP Transform Header\n");
  printf("-----------------------------------------------------------------\n");
  printf("Next payload:           %d ", gen->next_payload);
  dump_next_payload(gen->next_payload);
  printf("Reserved:               %d\n", gen->reserved);
  printf("Payload length          %d\n", ntohs(gen->length));

  bp = bp + sizeof(ISAKMP_generic_hdr);

  trans = EXTRACT_32BITS(bp);
  bp = bp + 4;
  printf("Transform Number:       %d\n", trans);

  trans_id = *bp;
  bp++;
  printf("Transform ID:            %d ", trans_id);

  /* NOTE: This should be conditional so that we don't print both the AH 
   * and ESP transform IDs at the same time.  Need to add IPCOMP also.
   */     
  switch( trans_id )
    {
    case 0:
      printf("(reserved)");
      break;
    case 1:
      printf("(AH reserved) or (ESP DES IV64)");
      break;
    case 2:
      printf("(AH MD5) or (ESP DES)");
      break;
    case 3:
      printf("(AH SHA1) or (ESP 3DES)");
      break;
    case 4:
      printf("(AH DES)");
      break;
    case 5:
      printf("(protocol IPCOMP)");
      break;
    default:
      printf("(unknown)");
      break;
    }
  printf("\n");
  

  spi_size = *bp;
  bp++;
  printf("Reserved:               %d\n", spi_size);

  /*
   * Move pointer to end of this header 
   */

  bp = old_bp + ntohs(gen->length);
  determine_next_payload(gen->next_payload, bp);

}

/*----------------------------------------------------------------------------
**
** dump_keyexchange_payload()
**
** Dump a key exchange payload.
**
**----------------------------------------------------------------------------
*/

void dump_keyexchange_payload(u_char *bp)
{
  ISAKMP_generic_hdr *gen;
  u_char *old_bp;

  gen = (ISAKMP_generic_hdr *) bp;
  old_bp = bp;

  printf("-----------------------------------------------------------------\n");
  printf("                        ISAKMP Key Exchange Header\n");
  printf("-----------------------------------------------------------------\n");
  printf("Next payload:           %d ", gen->next_payload);
  dump_next_payload(gen->next_payload);
  printf("Reserved:               %d\n", gen->reserved);
  printf("Payload length          %d\n", ntohs(gen->length));

  bp = bp + sizeof(ISAKMP_generic_hdr);

  printf("Key exchange data:      ");  
  print_char2hex(bp, ntohs(gen->length) - 4);

  bp = old_bp + ntohs(gen->length);
  determine_next_payload(gen->next_payload, bp);

}


/*----------------------------------------------------------------------------
**
** dump_identification_payload()
**
** Dump an identification payload.
**
**----------------------------------------------------------------------------
*/

void dump_identification_payload(u_char *bp)
{
  ISAKMP_generic_hdr *gen;
  u_char *old_bp;
  u_int8_t id_type;
  u_int32_t doi_data;

  gen = (ISAKMP_generic_hdr *) bp;
  old_bp = bp;

  printf("-----------------------------------------------------------------\n");
  printf("                        ISAKMP Identification Header\n");
  printf("-----------------------------------------------------------------\n");
  printf("Next payload:           %d ", gen->next_payload);
  dump_next_payload(gen->next_payload);
  printf("Reserved:               %d\n", gen->reserved);
  printf("Payload length          %d\n", ntohs(gen->length));

  bp = bp + sizeof(ISAKMP_generic_hdr);

  id_type = *bp;
  bp ++;
  printf("ID type:                %d ", id_type);
  switch(id_type)
    {
    case 0:
      printf("(reserved)");
      break;
    case 1:
      printf("(IPv4 address)");
      break;
    case 2: 
      printf("(FQDN)");
      break;
    case 3:
      printf("(user FQDN)");
      break;
    case 4:
      printf("(IPv4 address subnet)");
      break;
    case 5:
      printf("(IPv6 address)");
      break;
    case 6:
      printf("(IPv6 address subnet)");
      break;
    case 7:
      printf("(IPv4 address range)");
      break;
    case 8:
      printf("(IPv6 address range)");
      break;
    case 9: 
      printf("(DER coding of ASN.1 X.500 dist. name)");
      break;
    case 10:
      printf("(DER coding of ASN.1 X.500 gen. name)");
      break;
    case 11:
      printf("(key ID)");
      break;
    }
  printf("\n");

  /*
   * Read next 3 bytes 
   */

  doi_data = *bp;
  doi_data = doi_data << 8;
  doi_data += *(bp+1);
  doi_data = doi_data << 8;
  doi_data += *(bp+1);
  bp = bp + 3;
  printf("DOI ID data:           %d\n", doi_data);

  switch(id_type)
    {
    case 0:
      break;
    case 1:
      
      break;
    case 2: 
      printf("(FQDN)");
      break;
    case 3:
      printf("(user FQDN)");
      break;
    case 4:
      printf("(IPv4 address subnet)");
      break;
    case 5:
      printf("(IPv6 address)");
      break;
    case 6:
      printf("(IPv6 address subnet)");
      break;
    case 7:
      printf("(IPv4 address range)");
      break;
    case 8:
      printf("(IPv6 address range)");
      break;
    case 9: 
      printf("(DER coding of ASN.1 X.500 dist. name)");
      break;
    case 10:
      printf("(DER coding of ASN.1 X.500 gen. name)");
      break;
    case 11:
      printf("(key ID)");
      break;
    }

  

  bp = old_bp + ntohs(gen->length);
  determine_next_payload(gen->next_payload, bp);

}


/*----------------------------------------------------------------------------
**
** dump_nonce_payload()
**
** Dump a nonce payload.
**
**----------------------------------------------------------------------------
*/

void dump_nonce_payload(u_char *bp)
{
  ISAKMP_generic_hdr *gen;
  u_char *old_bp;
  
  gen = (ISAKMP_generic_hdr *) bp;
  old_bp = bp;
  
  printf("-----------------------------------------------------------------\n");
  printf("                        ISAKMP Nonce Header\n");
  printf("-----------------------------------------------------------------\n");
  printf("Next payload:           %d ", gen->next_payload);
  dump_next_payload(gen->next_payload);
  printf("Reserved:               %d\n", gen->reserved);
  printf("Payload length          %d\n", ntohs(gen->length));
  
  bp = bp + sizeof(ISAKMP_generic_hdr);
  
  printf("Nonce data:             ");
  print_char2hex(bp, ntohs(gen->length) - 4);
  
  bp = old_bp + ntohs(gen->length);
  determine_next_payload(gen->next_payload, bp);
  
}


/*----------------------------------------------------------------------------
**
** dump_signature_payload()
**
** Dump a signature payload.
**
**----------------------------------------------------------------------------
*/

void dump_signature_payload(u_char *bp)
{
  ISAKMP_generic_hdr *gen;
  u_char *old_bp;
  
  gen = (ISAKMP_generic_hdr *) bp;
  old_bp = bp;
  
  printf("-----------------------------------------------------------------\n");
  printf("                        ISAKMP Signature Header\n");
  printf("-----------------------------------------------------------------\n");
  printf("Next payload:           %d ", gen->next_payload);
  dump_next_payload(gen->next_payload);
  printf("Reserved:               %d\n", gen->reserved);
  printf("Payload length          %d\n", ntohs(gen->length));
  
  bp = bp + sizeof(ISAKMP_generic_hdr);
  
  printf("Signature data:             ");
  print_char2hex(bp, ntohs(gen->length) - 4);
  
  bp = old_bp + ntohs(gen->length);
  determine_next_payload(gen->next_payload, bp);
  
}


/*----------------------------------------------------------------------------
**
** dump_vendorid_payload()
**
** Dump a vendor ID payload.
**
**----------------------------------------------------------------------------
*/

void dump_vendorid_payload(u_char *bp)
{
  ISAKMP_generic_hdr *gen;
  u_char *old_bp;
  
  gen = (ISAKMP_generic_hdr *) bp;
  old_bp = bp;
  
  printf("-----------------------------------------------------------------\n");
  printf("                        ISAKMP Vendor ID Header\n");
  printf("-----------------------------------------------------------------\n");
  printf("Next payload:           %d ", gen->next_payload);
  dump_next_payload(gen->next_payload);
  printf("Reserved:               %d\n", gen->reserved);
  printf("Payload length          %d\n", ntohs(gen->length));
  
  bp = bp + sizeof(ISAKMP_generic_hdr);
  
  printf("Vendor ID:              ");
  print_char2hex(bp, ntohs(gen->length) - 4);
  
  bp = old_bp + ntohs(gen->length);
  determine_next_payload(gen->next_payload, bp);
  
}

⌨️ 快捷键说明

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