Blame src/mw_cipher.h

Packit Service 37472d
Packit Service 37472d
/*
Packit Service 37472d
  Meanwhile - Unofficial Lotus Sametime Community Client Library
Packit Service 37472d
  Copyright (C) 2004  Christopher (siege) O'Brien
Packit Service 37472d
  
Packit Service 37472d
  This library is free software; you can redistribute it and/or
Packit Service 37472d
  modify it under the terms of the GNU Library General Public
Packit Service 37472d
  License as published by the Free Software Foundation; either
Packit Service 37472d
  version 2 of the License, or (at your option) any later version.
Packit Service 37472d
  
Packit Service 37472d
  This library is distributed in the hope that it will be useful,
Packit Service 37472d
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 37472d
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 37472d
  Library General Public License for more details.
Packit Service 37472d
  
Packit Service 37472d
  You should have received a copy of the GNU Library General Public
Packit Service 37472d
  License along with this library; if not, write to the Free
Packit Service 37472d
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service 37472d
*/
Packit Service 37472d
Packit Service 37472d
#ifndef _MW_CIPHER_H
Packit Service 37472d
#define _MW_CIPHER_H
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
#include <glib.h>
Packit Service 37472d
#include "mw_common.h"
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
#ifdef __cplusplus
Packit Service 37472d
extern "C" {
Packit Service 37472d
#endif
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* place-holders */
Packit Service 37472d
struct mwChannel;
Packit Service 37472d
struct mwSession;
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** @enum mwCipherType
Packit Service 37472d
    Common cipher types */
Packit Service 37472d
enum mwCipherType {
Packit Service 37472d
  mwCipher_RC2_40   = 0x0000,
Packit Service 37472d
  mwCipher_RC2_128  = 0x0001,
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwCipher;
Packit Service 37472d
struct mwCipherInstance;
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Obtain an instance of a given cipher, which can be used for the
Packit Service 37472d
    processing of a single channel. */
Packit Service 37472d
typedef struct mwCipherInstance *(*mwCipherInstantiator)
Packit Service 37472d
     (struct mwCipher *cipher, struct mwChannel *chan);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Process (encrypt or decrypt, depending) the given data. The passed
Packit Service 37472d
    buffer may be freed in processing and be replaced with a freshly
Packit Service 37472d
    allocated buffer. The post-processed buffer must in turn be freed
Packit Service 37472d
    after use */
Packit Service 37472d
typedef int (*mwCipherProcessor)
Packit Service 37472d
     (struct mwCipherInstance *ci, struct mwOpaque *data);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** A cipher. Ciphers are primarily used to provide cipher instances
Packit Service 37472d
    for bi-directional encryption on channels, but some may be used
Packit Service 37472d
    for other activities. Expand upon this structure to create a
Packit Service 37472d
    custom encryption provider.
Packit Service 37472d
    @see mwCipherInstance */
Packit Service 37472d
struct mwCipher {
Packit Service 37472d
Packit Service 37472d
  /** service this cipher is providing for
Packit Service 37472d
      @see mwCipher_getSession */
Packit Service 37472d
  struct mwSession *session;
Packit Service 37472d
Packit Service 37472d
  guint16 type;               /**< @see mwCipher_getType */
Packit Service 37472d
  const char *(*get_name)(void);  /**< @see mwCipher_getName */
Packit Service 37472d
  const char *(*get_desc)(void);  /**< @see mwCipher_getDesc */
Packit Service 37472d
Packit Service 37472d
  /** Generate a new Cipher Instance for use on a channel
Packit Service 37472d
      @see mwCipher_newInstance */
Packit Service 37472d
  mwCipherInstantiator new_instance;
Packit Service 37472d
Packit Service 37472d
  void (*offered)(struct mwCipherInstance *ci, struct mwEncryptItem *item);
Packit Service 37472d
  struct mwEncryptItem *(*offer)(struct mwCipherInstance *ci);
Packit Service 37472d
  void (*accepted)(struct mwCipherInstance *ci, struct mwEncryptItem *item);
Packit Service 37472d
  struct mwEncryptItem *(*accept)(struct mwCipherInstance *ci);
Packit Service 37472d
Packit Service 37472d
  mwCipherProcessor encrypt; /**< @see mwCipherInstance_encrypt */
Packit Service 37472d
  mwCipherProcessor decrypt; /**< @see mwCipherInstance_decrypt */
Packit Service 37472d
Packit Service 37472d
  /** prepare this cipher for being free'd
Packit Service 37472d
      @see mwCipher_free */
Packit Service 37472d
  void (*clear)(struct mwCipher *c);
Packit Service 37472d
Packit Service 37472d
  /** clean up a cipher instance before being free'd
Packit Service 37472d
      @see mwCipherInstance_free */
Packit Service 37472d
  void (*clear_instance)(struct mwCipherInstance *ci);
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** An instance of a cipher. Expand upon this structure to contain
Packit Service 37472d
    necessary state data
Packit Service 37472d
    @see mwCipher */
Packit Service 37472d
struct mwCipherInstance {
Packit Service 37472d
Packit Service 37472d
  /** the parent cipher.
Packit Service 37472d
      @see mwCipherInstance_getCipher */
Packit Service 37472d
  struct mwCipher *cipher;
Packit Service 37472d
Packit Service 37472d
  /** the channel this instances processes
Packit Service 37472d
      @see mwCipherInstance_getChannel */
Packit Service 37472d
  struct mwChannel *channel;
Packit Service 37472d
};
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwCipher *mwCipher_new_RC2_40(struct mwSession *s);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwCipher *mwCipher_new_RC2_128(struct mwSession *s);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwSession *mwCipher_getSession(struct mwCipher *cipher);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
guint16 mwCipher_getType(struct mwCipher *cipher);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
const char *mwCipher_getName(struct mwCipher *cipher);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
const char *mwCipher_getDesc(struct mwCipher *cipher);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
struct mwCipherInstance *mwCipher_newInstance(struct mwCipher *cipher,
Packit Service 37472d
					      struct mwChannel *channel);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** destroy a cipher */
Packit Service 37472d
void mwCipher_free(struct mwCipher* cipher);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** reference the parent cipher of an instance */
Packit Service 37472d
struct mwCipher *mwCipherInstance_getCipher(struct mwCipherInstance *ci);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** reference the channel a cipher instance is attached to */
Packit Service 37472d
struct mwChannel *mwCipherInstance_getChannel(struct mwCipherInstance *ci);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Indicates a cipher has been offered to our channel */
Packit Service 37472d
void mwCipherInstance_offered(struct mwCipherInstance *ci,
Packit Service 37472d
			      struct mwEncryptItem *item);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Offer a cipher */
Packit Service 37472d
struct mwEncryptItem *
Packit Service 37472d
mwCipherInstance_offer(struct mwCipherInstance *ci);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Indicates an offered cipher has been accepted */
Packit Service 37472d
void mwCipherInstance_accepted(struct mwCipherInstance *ci,
Packit Service 37472d
			       struct mwEncryptItem *item);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Accept a cipher offered to our channel */
Packit Service 37472d
struct mwEncryptItem *
Packit Service 37472d
mwCipherInstance_accept(struct mwCipherInstance *ci);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** encrypt data */
Packit Service 37472d
int mwCipherInstance_encrypt(struct mwCipherInstance *ci,
Packit Service 37472d
			     struct mwOpaque *data);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** decrypt data */
Packit Service 37472d
int mwCipherInstance_decrypt(struct mwCipherInstance *ci,
Packit Service 37472d
			     struct mwOpaque *data);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** destroy a cipher instance */
Packit Service 37472d
void mwCipherInstance_free(struct mwCipherInstance *ci);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/**
Packit Service 37472d
  @section General Cipher Functions
Packit Service 37472d
Packit Service 37472d
  These functions are reused where encryption is necessary outside of
Packit Service 37472d
  a channel (eg. session authentication)
Packit Service 37472d
*/
Packit Service 37472d
/* @{ */
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** generate some pseudo-random bytes
Packit Service 37472d
    @param keylen  count of bytes to write into key
Packit Service 37472d
    @param key     buffer to write keys into
Packit Service 37472d
*/
Packit Service 37472d
void mwKeyRandom(guchar *key, gsize keylen);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Setup an Initialization Vector. IV must be at least 8 bytes */
Packit Service 37472d
void mwIV_init(guchar *iv);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Expand a variable-length key into a 128-byte key (represented as
Packit Service 37472d
    an an array of 64 ints) */
Packit Service 37472d
void mwKeyExpand(int *ekey, const guchar *key, gsize keylen);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Encrypt data using an already-expanded key */
Packit Service 37472d
void mwEncryptExpanded(const int *ekey, guchar *iv,
Packit Service 37472d
		       struct mwOpaque *in,
Packit Service 37472d
		       struct mwOpaque *out);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Encrypt data using an expanded form of the given key */
Packit Service 37472d
void mwEncrypt(const guchar *key, gsize keylen, guchar *iv,
Packit Service 37472d
	       struct mwOpaque *in, struct mwOpaque *out);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Decrypt data using an already expanded key */
Packit Service 37472d
void mwDecryptExpanded(const int *ekey, guchar *iv,
Packit Service 37472d
		       struct mwOpaque *in,
Packit Service 37472d
		       struct mwOpaque *out);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Decrypt data using an expanded form of the given key */
Packit Service 37472d
void mwDecrypt(const guchar *key, gsize keylen, guchar *iv,
Packit Service 37472d
	       struct mwOpaque *in, struct mwOpaque *out);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* @} */
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/**
Packit Service 37472d
  @section Diffie-Hellman Functions
Packit Service 37472d
Packit Service 37472d
  These functions are reused where DH Key negotiation is necessary
Packit Service 37472d
  outside of a channel (eg. session authentication). These are
Packit Service 37472d
  wrapping a full multiple-precision integer math library, but most of
Packit Service 37472d
  the functionality there-of is not exposed. Currently, the math is
Packit Service 37472d
  provided by a copy of the public domain libmpi.
Packit Service 37472d
Packit Service 37472d
  for more information on the used MPI Library, visit
Packit Service 37472d
  http://www.cs.dartmouth.edu/~sting/mpi/
Packit Service 37472d
*/
Packit Service 37472d
/* @{ */
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** @struct mwMpi */
Packit Service 37472d
struct mwMpi;
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** prepare a new mpi value */
Packit Service 37472d
struct mwMpi *mwMpi_new(void);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** destroy an mpi value */
Packit Service 37472d
void mwMpi_free(struct mwMpi *i);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Import a value from an opaque */
Packit Service 37472d
void mwMpi_import(struct mwMpi *i, struct mwOpaque *o);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** Export a value into an opaque */
Packit Service 37472d
void mwMpi_export(struct mwMpi *i, struct mwOpaque *o);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** set a big integer to the Sametime Prime value */
Packit Service 37472d
void mwMpi_setDHPrime(struct mwMpi *i);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** set a big integer to the Sametime Base value */
Packit Service 37472d
void mwMpi_setDHBase(struct mwMpi *i);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** sets private to a randomly generated value, and calculates public
Packit Service 37472d
    using the Sametime Prime and Base */
Packit Service 37472d
void mwMpi_randDHKeypair(struct mwMpi *private_key, struct mwMpi *public_key);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** sets the shared key value based on the remote and private keys,
Packit Service 37472d
    using the Sametime Prime and Base */
Packit Service 37472d
void mwMpi_calculateDHShared(struct mwMpi *shared_key, struct mwMpi *remote_key,
Packit Service 37472d
			     struct mwMpi *private_key);
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/* @} */
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
#ifdef __cplusplus
Packit Service 37472d
}
Packit Service 37472d
#endif
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
#endif /* _MW_CIPHER_H */