Generates the second (IKE_AUTH) packet for Initiator

        :return: bytes() containing a valid IKE_INIT packet

def auth_send(self):
        """
        Generates the second (IKE_AUTH) packet for Initiator

        :return: bytes() containing a valid IKE_INIT packet
        """
        assert len(self.packets) == 2
        packet = Packet(exchange_type=const.ExchangeType.IKE_AUTH, iSPI=self.iSPI, rSPI=self.rSPI)

        # Add IDi (35)
        id_payload = payloads.IDi()
        packet.add_payload(id_payload)

        # Add AUTH (39)
        signed_octets = bytes(self.packets[0]) + self.Nr + prf(self.SK_pi, id_payload._data)
        packet.add_payload(payloads.AUTH(signed_octets))

        # Add SA (33)
        self.esp_SPIout = int.from_bytes(os.urandom(4), 'big')
        packet.add_payload(payloads.SA(proposals=[
            proposal.Proposal(protocol=const.ProtocolID.ESP, spi=self.esp_SPIout, last=True, transforms=[
                ('ENCR_CAMELLIA_CBC', 256), ('ESN',), ('AUTH_HMAC_SHA2_256_128',)
            ])
        ]))

        # Add TSi (44)
        packet.add_payload(payloads.TSi(addr=self.address))

        # Add TSr (45)
        packet.add_payload(payloads.TSr(addr=self.peer))

        # Add N(INITIAL_CONTACT)
        packet.add_payload(payloads.Notify(notify_type=const.MessageType.INITIAL_CONTACT))

        self.packets.append(packet)
        self.state = State.AUTH

        return self.encrypt_and_hmac(packet)