#!/usr/bin/perl
#
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
# Yokogawa Electric Corporation.
# All rights reserved.
# 
# Redistribution and use of this software in source and binary
# forms, with or without modification, are permitted provided that
# the following conditions and disclaimer are agreed and accepted
# by the user:
# 
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with
#    the distribution.
# 
# 3. Neither the names of the copyrighters, the name of the project
#    which is related to this software (hereinafter referred to as
#    "project") nor the names of the contributors may be used to
#    endorse or promote products derived from this software without
#    specific prior written permission.
# 
# 4. No merchantable use may be permitted without prior written
#    notification to the copyrighters.
# 
# 5. The copyrighters, the project and the contributors may prohibit
#    the use of this software at any time.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING
# BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.  IN NO EVENT SHALL THE
# COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# $Id: IKEv2-SGW-R-2-1-2-3-A.seq,v 1.3 2008/11/28 10:16:29 doo Exp $
#
################################################################



BEGIN
{
	push(@INC, '..');
	$ENV{'V6EVAL_WITH_KOI'} = 'TRUE';
}

END { }



use V6evalTool;
use IKEv2v6eval;
use IKEv2;
use strict;

use Socket6;


my $remote	= 'common_remote_index';
my $ike_sa_init_req_param	= undef;
my $ike_sa_init_resp_param	= undef;
my $ike_auth_req_param	= undef;
my $ike_auth_resp_param	= undef;

my $session	= undef;
my $material	= undef;
my $child_sa_material	= undef;
my $str	= undef;
my $ret	= undef;

my @local_ike_auth_req = undef;
my @local_ike_auth_resp = undef;

$need_vpn	= $true;


#------------------------------#
# register IKEv2.pm            #
#------------------------------#
kLogHTML('<FONT COLOR="#FF0000" SIZE="+1"><U><B>TEST SETUP</B></U></FONT>');

my $tn = 'EN';
my $nut = 'SGW';

unless(IKEv2initialize($nut, $tn)) {
	IKEv2exitFatal('<FONT COLOR="#ff0000">IKEv2 module initializing failure</FONT>');
}



#---------------------------------#
# switch Support or Not Support   #
#---------------------------------#
unless ($config_pl->{'advanced_support_cfg_payload'}) {
	IKEv2exitNS('Not support ' . "'advanced_support_cfg_payload'");
}



#------------------------------#
# change configuration         #
#------------------------------#
my $conf = {
	'provide' => 'on',
	'addresspool' => {
		'saddr' => $addresses{'cfg_req_internal_addr'},
		'eaddr' => $addresses{'cfg_req_internal_addr'},
	},
};
unless (IKEv2customize($conf)) {
	IKEv2exitFatal('<FONT COLOR="#ff0000">IKEv2 configuration failure</FONT>');
}



#------------------------------#
# configure TN                 #
#------------------------------#
unless(IKEv2setupTN()) {
	IKEv2exitFatal('<FONT COLOR="#ff0000">TN setup failure</FONT>');
}



#------------------------------#
# configure NUT                #
#------------------------------#
unless(IKEv2setupNUT()) {
	IKEv2exitFatal('<FONT COLOR="#ff0000">NUT setup failure</FONT>');
}



#------------------------------#
# prepare session handler      #
#------------------------------#
kLogHTML('<FONT COLOR="#FF0000" SIZE="+1"><U><B>TEST PROCEDURE</B></U></FONT>');



$session = IKEv2create_session($remote);
unless(defined($session)) {
	IKEv2exitFatal('<FONT COLOR="#ff0000">IKEv2 session creation failure</FONT>');
}



#--------------------------------------#
# send IKE_SA_INIT request to NUT      #
#--------------------------------------#
$str  = '<PRE>';
$str .= "    (R)             (I)\n";
$str .= "    NUT             TN1\n";
$str .= "     |               |\n";
$str .= "     |<--------------| IKE_SA_INIT request (HDR, SAi1, KEi, Ni)\n";
$str .= "     |               |\n";
$str .= "     V               V";
$str .= '</PRE>';

kLogHTML($str);



$ike_sa_init_req_param = devel_IKEv2send_IKE_SA_INIT_request($session, $remote);
unless(defined($ike_sa_init_req_param)) {
	kLogHTML(kDump_Common_Error());
	IKEv2exitFatal('<FONT COLOR="#ff0000">Can\'t send IKE_SA_INIT request.</FONT>');
}



#--------------------------------------#
# receive IKE_SA_INIT response by NUT  #
#--------------------------------------#
$str  = '<PRE>';
$str .= "    (R)             (I)\n";
$str .= "    NUT             TN1\n";
$str .= "     |               |\n";
$str .= "     |-------------->| IKE_SA_INIT response (HDR, SAr1, KEr, Nr)\n";
$str .= "     |               |\n";
$str .= "     V               V";
$str .= '</PRE>';

kLogHTML($str);



$ike_sa_init_resp_param = devel_IKEv2receive_IKE_SA_INIT_response($session,
							$remote,
							$ike_sa_init_req_param);
unless(defined($ike_sa_init_resp_param)) {
	kLogHTML(kDump_Common_Error());
	kLogHTML('<FONT COLOR="#ff0000">Can\'t observe IKE_SA_INIT response.</FONT>');
	IKEv2exitFail();
}



#--------------------------------------#
# generate keying material             #
#--------------------------------------#
$material = devel_IKEv2gen_keymat(1, $ike_sa_init_req_param, $ike_sa_init_resp_param);
unless(defined($material)) {
	kLogHTML(kDump_Common_Error());
	IKEv2exitFatal('<FONT COLOR="#ff0000">Can\'t generate keying material.</FONT>');
}



#-----------------------------------------------------#
# prepare IKE_AUTH Request (w/ Configuration Payload) #
#-----------------------------------------------------#
my $cp_cfg_request =
{	# CP Payload
	'self'		=> 'CP',	 # *** MUST BE HERE ***
	'nexttype'	=> undef,	 # Next Payload
	'critical'	=> undef,	 # Critical
	'reserved'	=> '1',	 # RESERVED
	'length'	=> undef,	 # Payload Length
	'cfg_type'	=> 'CFG_REQUEST',  # CFG Type
	'reserved1'	=> '1',	 # RESERVED
	'attributes'	=> [		 # Configuration Attributes
		{
			'reserved' => '1',
			'attr_type' => (IKEv2::ADDRESS_FAMILY eq AF_INET6) ?
					'INTERNAL_IP6_ADDRESS' :
					'INTERNAL_IP4_ADDRESS',
			'length' => '0',
			'value' => '',
		},
	]
};
my $common_ike_auth_req = $gen_ike_auth_req->{'common_remote_index'};
@local_ike_auth_req = @{$common_ike_auth_req};
for (my $i = 0; $i < scalar(@local_ike_auth_req); $i++) {
	if ($local_ike_auth_req[$i]->{'self'} eq 'SA') {
		splice(@local_ike_auth_req, $i, 0, $cp_cfg_request);
		last;
	}
}
my $index = 'non_zero_reserved.1';
$gen_ike_auth_req->{$index} = \@local_ike_auth_req;



#--------------------------------------#
# send IKE_AUTH request to NUT         #
#--------------------------------------#
$str  = '<PRE>';
$str .= "    (R)             (I)\n";
$str .= "    NUT             TN1\n";
$str .= "     |               |\n";
$str .= "     |<--------------| IKE_AUTH request (HDR, SK {IDi, AUTH, CP(CFG_REQUEST), SAi2, TSi, TSr})\n";
$str .= "     |               |\n";
$str .= "     V               V";
$str .= '</PRE>';

kLogHTML($str);


$ike_auth_req_param = devel_IKEv2send_IKE_AUTH_request($session,
						       $index,
						       $ike_sa_init_req_param,
						       $ike_sa_init_resp_param,
						       $material);
unless(defined($ike_auth_req_param)) {
	kLogHTML(kDump_Common_Error());
	IKEv2exitFatal('<FONT COLOR="#ff0000">Can\'t send IKE_AUTH request.</FONT>');
}



#------------------------------------------------------#
# prepare IKE_AUTH Response (w/ Configuration Payload) #
#------------------------------------------------------#
my $cp_cfg_reply =
{	# CP Payload
	'self'		=> 'CP',	 # *** MUST BE HERE ***
	'nexttype'	=> undef,	 # Next Payload
	'critical'	=> '0',		 # Critical
	'reserved'	=> '0',		 # RESERVED
	'length'	=> '29',	 # Payload Length
	'cfg_type'	=> 'CFG_REPLY',	 # CFG Type
	'reserved1'	=> '0',		 # RESERVED
	'attributes'	=> [		 # Configuration Attributes
		{
			'reserved' => '0',
			'attr_type' => (IKEv2::ADDRESS_FAMILY eq AF_INET6) ?
					'INTERNAL_IP6_ADDRESS' :
					'INTERNAL_IP4_ADDRESS',
			'length' => '17',
			'value' => kIKE::kHelpers::ipaddr_tobin($addresses{'cfg_req_internal_addr'}) . pack('C', 64),
		},
	]
};
my $common_exp_ike_auth_resp = $exp_ike_auth_resp->{$remote};
my @local_ike_auth_resp = @{$common_exp_ike_auth_resp};
# add Configuration Payload
foreach my $payload (@local_ike_auth_resp) {
	if ($payload->{'self'} eq 'E') {
		my $inner = $payload->{'innerPayloads'};

		for (my $j = 0; $j < scalar(@{$inner}); $j++) {
			if (@{$inner}[$j]->{'self'} eq 'SA') {
				splice(@{$inner}, $j, 0, $cp_cfg_reply);
				last;
			}
		}
	}
}
# set correct nexttype
for (my $i = 0; $i < scalar(@local_ike_auth_resp); $i++) {
	my $payload = $local_ike_auth_resp[$i];

	if ($payload->{'self'} eq 'E') {
		for (my $j = 0; $j < scalar(@{$payload->{'innerPayloads'}}); $j++) {
			my $cur = $payload->{'innerPayloads'}->[$j];
			my $next = $payload->{'innerPayloads'}->[$j+1];
			unless (defined($next)) {
				$cur->{'nexttype'} = '0';
				next;
			}
			if ($cur->{'nexttype'} eq $next->{'self'}) {
				next;
			}
			$cur->{'nexttype'} = $next->{'self'};
		}

		next;
	}

}
$index = 'non_zero_reserved.2';
$exp_ike_auth_resp->{$index} = \@local_ike_auth_resp;



#--------------------------------------#
# receive IKE_AUTH response by NUT     #
#--------------------------------------#
$str  = '<PRE>';
$str .= "    (R)             (I)\n";
$str .= "    NUT             TN1\n";
$str .= "     |               |\n";
$str .= "     |-------------->| IKE_AUTH response (HDR, SK {IDr, AUTH, CP(CFG_REPLY), SAr2, TSi, TSr)\n";
$str .= "     |               |\n";
$str .= "     V               V";
$str .= '</PRE>';

kLogHTML($str);


$ike_auth_resp_param = devel_IKEv2receive_IKE_AUTH_response($session,
							    $index,
							    $ike_sa_init_req_param,
							    $ike_sa_init_resp_param,
							    $ike_auth_req_param,
							    $material);
unless(defined($ike_auth_resp_param)) {
	kLogHTML(kDump_Common_Error());
	kLogHTML('<FONT COLOR="#ff0000">Can\'t observe IKE_AUTH response.</FONT>');
	IKEv2exitFail();
}



#--------------------------------------#
# generate keying material (CHILD_SA)  #
#--------------------------------------#
$child_sa_material = devel_IKEv2gen_child_sa_keymat(1,    # IKE_AUTH exchange
						    $material,
						    $ike_sa_init_req_param,
						    $ike_sa_init_resp_param,
						    $ike_auth_req_param,
						    $ike_auth_resp_param);



#--------------------------------------#
# set keying material                  #
#--------------------------------------#
$ret = IKEv2set_child_sa_keymat(1, $child_sa_material, $ike_auth_req_param, $ike_auth_resp_param);
unless($ret) {
	kLogHTML(kDump_Common_Error());
	IKEv2exitFatal('<FONT COLOR="#ff0000">Can\'t set keying material.</FONT>');
}



#--------------------------------------#
# prepare ICMP session handler         #
#--------------------------------------#
my $icmp_session_tn1 = ICMPcreate_session('TN1confsendtoTH1');
unless(defined($icmp_session_tn1)) {
	IKEv2exitFatal('<FONT COLOR="#ff0000">ICMP session creation failure</FONT>');
}

my $icmp_session_th1 = ICMPcreate_session('TH1sendtoTN1');
unless(defined($icmp_session_th1)) {
	IKEv2exitFatal('<FONT COLOR="#ff0000">ICMP session creation failure</FONT>');
}



#--------------------------------------#
# send Echo Reply                      #
#--------------------------------------#
$str  = '<PRE>';
$str .= "                    (R)             (I)\n";
$str .= "    TH1             NUT             TN1\n";
$str .= "     |               |               |\n";
$str .= "     |<---------------+==============| IPsec {Echo Reply}\n";
$str .= "     |               |               |\n";
$str .= "     V               V               V";
$str .= '</PRE>';

kLogHTML($str);

$ret = ICMPsend($icmp_session_tn1, 'echo_reply');
unless (defined($ret)) {
	kLogHTML(kDump_Common_Error());
	IKEv2exitFatal('<FONT COLOR="#ff0000">Can\'t send ICMP packet.</FONT>');
}



#--------------------------------------#
# receive Echo Reply                   #
#--------------------------------------#
$ret = ICMPreceive($icmp_session_th1);
unless(defined($ret)) {
	my $strerror = kDump_Common_Error();
	kLogHTML('<FONT COLOR="#ff0000">Can\'t observe ICMP packet.</FONT>');
	IKEv2exitFail();
}



#--------------------------------------#
# send Echo Reply                      #
#--------------------------------------#
$str  = '<PRE>';
$str .= "                    (R)             (I)\n";
$str .= "    TH1             NUT             TN1\n";
$str .= "     |               |               |\n";
$str .= "     |---------------+==============>| IPsec {Echo Reply}\n";
$str .= "     |               |               |\n";
$str .= "     V               V               V";
$str .= '</PRE>';

kLogHTML($str);

$ret = ICMPsend_send('TN1confsendtoTH1', 'echo_reply');
unless (defined($ret)) {
	kLogHTML(kDump_Common_Error());
	IKEv2exitFatal('<FONT COLOR="#ff0000">Can\'t send ICMP packet.</FONT>');
}



#--------------------------------------#
# receive Echo Reply                   #
#--------------------------------------#
$ret = ICMPreceive($icmp_session_tn1);
unless(defined($ret)) {
	my $strerror = kDump_Common_Error();
	kLogHTML('<FONT COLOR="#ff0000">Can\'t observe ICMP packet.</FONT>');
	IKEv2exitFail();
}



#--------------------------------------#
# exit with cleanup                    #
#--------------------------------------#
IKEv2exitPass();
# NOTREACHED



#
# perldoc
#
########################################################################
__END__

=head1 Title

  Test IKEv2.SGW.R.2.1.2.3: Non zero RESERVED fields in Configuration Payload
  Part A: (ADVANCED)

=head1 Purpose

  To verify an IKEv2 device ignores the content of RESERVED filed in IKE messages.

=head1 References

  * [RFC 4306] - Sections 2.5

=head1 Test Setup

  * Network Topology
      Connect the devices according to the following topology.

=begin html

<BLOCKQUOTE>
<PRE>

   TH1
  (Host)
    |
----+-------+--- Link B (Prefix B, MTU=1500)
            |
           NUT 
          (SGW)
            |
----+-------+--- Link A (Prefix A, MTU=1500)
    |
   TR1
 (Router)
    |
----+-------+--- Link X (Prefix X, MTU=1500)
            |
           TH1
        (End-Node)
<br>
Prefix A = 2001:0db8:0001:0001::/64
Prefix B = 2001:0db8:0001:0002::/64
Prefix X = 2001:0db8:000f:0001::/64
<br>

<TABLE BORDER>
<TR>
<TD>TH1</TD>
<TD>Host</TD>
<TD>Link B</TD>
<TD>Prefix B::f</TD>
</TR>
<TR>
<TD>NUT</TD>
<TD>SGW</TD>
<TD>Link B</TD>
<TD>Prefix B::any_interface_ID</TD>
</TR>
<TR>
<TD>TR1</TD>
<TD>Router</TD>
<TD>Link A</TD>
<TD>Prefix A::any_interface_ID</TD>
</TR>
<TR>
<TD rowspan="2">TN1</TD>
<TD rowspan="2">End-Node</TD>
<TD rowspan="2">Link X</TD>
<TD>Prefix X::1 (External Address)</TD>
</TR>
<TR>
<TD>Prefix B::1 (Internal Address) (assigned by CP)</TD>
</TR>
</TABLE>

</PRE>
</BLOCKQUOTE>

=end html

  * Configuration
      In each part, configure NUT according to the Common Configuration except the traffic
      selector. Configure NUT to transmit CFG_REPLY for INTERNAL_IP6_ADDRESS.
      Its IPv6 address is Prefix B::1/128. The traffic selector must be configured by the
      following table. NUT must narrow Traffic Selector to the following address table.

=begin html 

<BLOCKQUOTE>
<TABLE BORDER>
<TR>
<TD rowspan="3"></TD>
<TD colspan="6">Traffic Selector</TD>
</TR>
<TR>
<TD colspan="3">Source</TD>
<TD colspan="3">Destination</TD>
</TR>
<TR>
<TD>Address<br>Range</TD>
<TD>Next Layer<br>Protocol</TD>
<TD>Port<br>Range</TD>
<TD>Address<br>Range</TD>
<TD>Next Layer<br>Protocol</TD>
<TD>Port<br>Range</TD>
</TR>
<TR>
<TD>Inbound</TD>
<TD>TN1<br>(internal address)</TD>
<TD>ANY</TD>
<TD>ANY</TD>
<TD>Link B</TD>
<TD>ANY</TD>
<TD>ANY</TD>
</TR>
<TR>
<TD>Outbound</TD>
<TD>Link B</TD>
<TD>ANY</TD>
<TD>ANY</TD>
<TD>TN1<br>(internal address)</TD>
<TD>ANY</TD>
<TD>ANY</TD>
</TR>
</TABLE>
</BLOCKQUOTE>

=end html

  * Pre-Sequence and Cleanup Sequence
      IKEv2 on the NUT is disabled after each part.

=head1 Procedure

=begin html

<BLOCKQUOTE>
<PRE>

   TH1            NUT           TN1
 (HOST)          (SGW)       (End-Node)
    |              |             |
    |              |<------------| IKE_SA_INIT request (HDR, SAi1, KEi, Ni)
    |              |             | (Packet #1)
    |              |------------>| IKE_SA_INIT Response (HDR, SAr1, KEr, Nr)
    |              |             | (Judgement #1)
    |              |             |
    |              |<------------| IKE_AUTH request (HDR, SK {IDi, AUTH, CP(CFG_REQUEST), SAi2, TSi, TSr})
    |              |             | (Packet #2)
    |              |------------>| IKE_AUTH Response (HDR, SK {IDr, AUTH, CP(CFG_REPLY), SAr2, TSi, TSr})
    |              |             | (Judgement #2)
    |              |             |
    V              V             V<br>
</PRE>
</BLOCKQUOTE>

<BLOCKQUOTE>
<TABLE BORDER>
<TR>
<TD><TT>Packet #1</TT></TD>
<TD><TT>See Common Packet #1</TT></TD>
</TR>
<TR>
<TD><TT>Packet #2</TT></TD>
<TD><TT>See below</TT></TD>
</TR>
</TABLE>
</BLOCKQUOTE>

<BLOCKQUOTE>
 Packet #2: IKE_AUTH request packet
<TABLE BORDER>
<TR>
<TD>IPv6 Header</TD>
<TD colspan="2">Same as Common Packet #5</TD>
</TR>
<TR>
<TD>UDP Header</TD>
<TD colspan="2">Same as Common Packet #5</TD>
</TR>
<TR>
<TD>IKEv2 Header</TD>
<TD colspan="2">Same as Common Packet #5</TD>
</TR>
<TR>
<TD>E Payloa</TD>
<TD colspan="2">Same as Common Packet #5</TD>
</TR>
<TR>
<TD>IDr Payload</TD>
<TD colspan="2">Same as Common Packet #5</TD>
</TR>
<TR>
<TD rowspan="2">AUTH Payload</TD>
<TD>Next Payload</TD>
<TD>47 (CP)</TD>
</TR>
<TR>
<TD colspan="2">Other fields are same as Common Packet #5</TD>
</TR>
<TD rowspan="7">CP Payload</TD>
<TD>Next Payload</TD>
<TD>33 (SA)</TD>
</TR>
<TR>
<TD>Critical</TD>
<TD>0</TD>
</TR>
<TR>
<TD>Reserved</TD>
<TD>1</TD>
</TR>
<TR>
<TD>Payload Length</TD>
<TD>12</TD>
</TR>
<TR>
<TD>CFG Type</TD>
<TD>1 (CFG_REQUEST)</TD>
</TR>
<TR>
<TD>RESERVED</TD>
<TD>1</TD>
</TR>
<TR>
<TD>Configuration Attributes</TD>
<TD>See below</TD>
</TR>
<TR>
<TD>SA Payload</TD>
<TD colspan="2">Same as Common Packet #5</TD>
</TR>
<TR>
<TD rowspan="2">TSi Payload</TD>
<TD colspan="2">Other fields are same as Common Packet #5</TD>
</TR>
<TR>
<TD>Traffic Selectors</TD>
<TD>See below</TD>
</TR>
<TR>
<TD>TSr Payload</TD>
<TD colspan="2">Same as Common Packet #5</TD>
</TR>
</TABLE>
</BLOCKQUOTE>

<BLOCKQUOTE>
<TABLE BORDER>
<TR>
<TD rowspan="3">Configuration Attributes</TD>
<TD>Reserved</TD>
<TD>1</TD>
</TR>
<TR>
<TD>Attribute Type</TD>
<TD>INTERNAL_IP6_ADDRESS</TD>
</TR>
<TR>
<TD>Length</TD>
<TD>0</TD>
</TR>
</TABLE>
</BLOCKQUOTE>

<BLOCKQUOTE>
<TABLE BORDER>
<TR>
<TD rowspan="7">Traffic Selector</TD>
<TD>TS Type</TD>
<TD>8 (IPV6_ADDR_RANGE)</TD>
</TR>
<TR>
<TD>IP Protocol ID</TD>
<TD>0 (any)</TD>
</TR>
<TR>
<TD>Selector Length</TD>
<TD>40</TD>
</TR>
<TR>
<TD>Start Port</TD>
<TD>0</TD>
</TR>
<TR>
<TD>End Port</TD>
<TD>65535</TD>
</TR>
<TR>
<TD>Starting Address</TD>
<TD>::</TD>
</TR>
<TR>
<TD>Ending Address</TD>
<TD>ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff</TD>
</TR>
</TABLE>
</BLOCKQUOTE>

=end html

  Part A (ADVANCED)
     1. TN1 transmits an IKE_SA_INIT request to NUT.
     2. Observe the messages transmitted on Link A.
     3. TN1 transmits an IKE_SA_INIT request to the NUT.
     4. Observe the messages transmitted on Link A.

=head1 Observable Result

  Part A
       Step 2: Judgment #1
       The NUT transmits an IKE_SA_INIT response including "ENCR_3DES",
       "PRF_HMAC_SHA1", "AUTH_HMAC_SHA1_96" and "D-H group 2" as proposed
       algorithms.

       Step 4: Judgment #2
       The NUT transmits an IKE_AUTH response including "ENCR_3DES",
       "AUTH_HMAC_SHA1_96" and "No Extended Sequence Numbers" as proposed algorithms.

=head1 Possible Problems

  * None.

=cut

