/*

  silcske_payload.h

  Author: Pekka Riikonen <priikone@silcnet.org>

  Copyright (C) 2000 - 2005 Pekka Riikonen

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; version 2 of the License.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

*/

/****h* silcske/SKE Payloads
 *
 * DESCRIPTION
 *
 * This interface defines the implementation of the SKE Payloads, as
 * defined by the SKE protocol. This interface is mainly used by the SKE
 * library, however all structures are public and the interface can be used
 * by the application if needed. Usually application does not need use this
 * interface.
 *
 ***/

#ifndef SILCSKE_PAYLOAD_H
#define SILCSKE_PAYLOAD_H

/****s* silcske/SilcSKEPayloads/SilcSKEStartPayload
 *
 * NAME
 *
 *    typedef struct SilcSKEStartPayloadStruct SilcSKEStartPayload;
 *
 * DESCRIPTION
 *
 *    This context is the actual Key Exchange Start Payload and is allocated
 *    by silc_ske_payload_start_decode. It is freed by calling the
 *    silc_ske_payload_start_free function.
 *
 ***/
typedef struct SilcSKEStartPayloadStruct *SilcSKEStartPayload;

/****s* silcske/SilcSKEPayloads/SilcSKEKEPayload
 *
 * NAME
 *
 *    typedef struct SilcSKEKEPayloadStruct SilcSKEKEPayload;
 *
 * DESCRIPTION
 *
 *    This context is the actual Key Exchange Payload and is allocated
 *    by silc_ske_payload_ke_decode. It is freed by calling the
 *    silc_ske_payload_ke_free function.
 *
 ***/
typedef struct SilcSKEKEPayloadStruct *SilcSKEKEPayload;

/* SILC Key Exchange Start Payload */
struct SilcSKEStartPayloadStruct {
  unsigned char flags;
  SilcUInt16 len;

  unsigned char *cookie;
  SilcUInt16 cookie_len;

  unsigned char *version;
  SilcUInt16 version_len;

  SilcUInt16 ke_grp_len;
  unsigned char *ke_grp_list;

  SilcUInt16 pkcs_alg_len;
  unsigned char *pkcs_alg_list;

  SilcUInt16 enc_alg_len;
  unsigned char *enc_alg_list;

  SilcUInt16 hash_alg_len;
  unsigned char *hash_alg_list;

  SilcUInt16 hmac_alg_len;
  unsigned char *hmac_alg_list;

  SilcUInt16 comp_alg_len;
  unsigned char *comp_alg_list;
};

/* SILC Key Exchange Payload */
struct SilcSKEKEPayloadStruct {
  SilcUInt16 pk_len;
  unsigned char *pk_data;
  SilcUInt16 pk_type;

  SilcMPInt x;

  SilcUInt16 sign_len;
  unsigned char *sign_data;
};

/* Prototypes */

/****f* silcske/SilcSKEPayloads/silc_ske_payload_start_encode
 *
 * SYNOPSIS
 *
 *    SilcSKEStatus silc_ske_payload_start_encode(SilcSKE ske,
 *                                                SilcSKEStartPayload payload,
 *                                                SilcBuffer *return_buffer);
 *
 * DESCRIPTION
 *
 *    Utility function used to encode Key Exchange Start Payload from the
 *    `payload' structure. The encoded buffer is returned into the
 *    `return_buffer' and the caller must free it.
 *
 ***/
SilcSKEStatus silc_ske_payload_start_encode(SilcSKE ske,
					    SilcSKEStartPayload payload,
					    SilcBuffer *return_buffer);

/****f* silcske/SilcSKEPayloads/silc_ske_payload_start_decode
 *
 * SYNOPSIS
 *
 *    SilcSKEStatus
 *    silc_ske_payload_start_decode(SilcSKE ske,
 *                                  SilcBuffer buffer,
 *                                  SilcSKEStartPayload *return_payload);
 *
 * DESCRIPTION
 *
 *    Utility function used to decode Key Exchange Start Payload from the
 *    `buffer' data buffer. The decoded payload is returned into the
 *    `return_payload' and the caller must free it.
 *
 ***/
SilcSKEStatus
silc_ske_payload_start_decode(SilcSKE ske,
			      SilcBuffer buffer,
			      SilcSKEStartPayload *return_payload);

/****f* silcske/SilcSKEPayloads/silc_ske_payload_start_free
 *
 * SYNOPSIS
 *
 *    void silc_ske_payload_start_free(SilcSKEStartPayload *payload);
 *
 * DESCRIPTION
 *
 *    Frees the Key Exchange Start Payload indicated by `payload'.
 *
 ***/
void silc_ske_payload_start_free(SilcSKEStartPayload payload);

/****f* silcske/SilcSKEPayloads/silc_ske_payload_ke_encode
 *
 * SYNOPSIS
 *
 *    SilcSKEStatus silc_ske_payload_ke_encode(SilcSKE ske,
 *                                             SilcSKEKEPayload payload,
 *                                             SilcBuffer *return_buffer);
 *
 * DESCRIPTION
 *
 *    Utility function used to encode Key Exchange Payload from the
 *    `payload' structure. The encoded buffer is returned into the
 *    `return_buffer' and the caller must free it.
 *
 ***/
SilcSKEStatus silc_ske_payload_ke_encode(SilcSKE ske,
					 SilcSKEKEPayload payload,
					 SilcBuffer *return_buffer);

/****f* silcske/SilcSKEPayloads/silc_ske_payload_ke_decode
 *
 * SYNOPSIS
 *
 *    SilcSKEStatus silc_ske_payload_ke_decode(SilcSKE ske,
 *                                             SilcBuffer buffer,
 *                                             SilcSKEKEPayload
 *                                               **return_payload);
 *
 * DESCRIPTION
 *
 *    Utility function used to decode Key Exchange Payload from the
 *    `buffer' data buffer. The decoded payload is returned into the
 *    `return_payload' and the caller must free it.
 *
 ***/
SilcSKEStatus silc_ske_payload_ke_decode(SilcSKE ske,
					 SilcBuffer buffer,
					 SilcSKEKEPayload *return_payload);

/****f* silcske/SilcSKEPayloads/silc_ske_payload_ke_free
 *
 * SYNOPSIS
 *
 *    void silc_ske_payload_ke_free(SilcSKEKEPayload *payload);
 *
 * DESCRIPTION
 *
 *    Frees the Key Exchange Payload indicated by `payload'.
 *
 ***/
void silc_ske_payload_ke_free(SilcSKEKEPayload payload);

#endif /* SILCSKE_PAYLOAD_H */
