
#ifndef THREEFISHAPI_H
#define THREEFISHAPI_H

/**
 * @file threefishApi.h
 * @brief A Threefish cipher API and its functions.
 * @{
 *
 * This API and the functions that implement this API simplify the usage
 * of the Threefish cipher. The design and the way to use the functions 
 * follow the openSSL design but at the same time take care of some Threefish
 * specific behaviour and possibilities.
 *
 * These are the low level functions that deal with Threefisch blocks only.
 * Implementations for cipher modes such as ECB, CFB, or CBC may use these 
 * functions.
 * 
@code
    // Threefish cipher context data
    struct threefish_key keyCtx;

    // Initialize the context
    threefishSetKey(&keyCtx, Threefish512, key, tweak);

    // Encrypt
    threefishEncryptBlockBytes(&keyCtx, input, cipher);
@endcode
 */

#include <linux/types.h>
#include <skein.h>

#define KeyScheduleConst 0x1BD11BDAA9FC1A22L

    /**
     * Which Threefish size to use
     */
    enum threefish_size {
        Threefish256 = 256,     /*!< Skein with 256 bit state */
        Threefish512 = 512,     /*!< Skein with 512 bit state */
        Threefish1024 = 1024    /*!< Skein with 1024 bit state */
    };
    
    /**
     * Context for Threefish key and tweak words.
     * 
     * This structure was setup with some know-how of the internal
     * Skein structures, in particular ordering of header and size dependent
     * variables. If Skein implementation changes this, the adapt these
     * structures as well.
     */
    struct threefish_key {
        u64 stateSize;
        u64 key[SKEIN_MAX_STATE_WORDS+1];   /* max number of key words*/
        u64 tweak[3];
    };

    /**
     * Set Threefish key and tweak data.
     * 
     * This function sets the key and tweak data for the Threefish cipher of
     * the given size. The key data must have the same length (number of bits)
     * as the state size 
     *
     * @param keyCtx
     *     Pointer to a Threefish key structure.
     * @param size
     *     Which Skein size to use.
     * @param keyData
     *     Pointer to the key words (word has 64 bits).
     * @param tweak
     *     Pointer to the two tweak words (word has 64 bits).
     */
    void threefishSetKey(struct threefish_key* keyCtx, enum threefish_size stateSize, uint64_t* keyData, uint64_t* tweak);
    
    /**
     * Encrypt Threefisch block (bytes).
     * 
     * The buffer must have at least the same length (number of bits) aas the 
     * state size for this key. The function uses the first @c stateSize bits
     * of the input buffer, encrypts them and stores the result in the output
     * buffer.
     * 
     * @param keyCtx
     *     Pointer to a Threefish key structure.
     * @param in
     *     Poionter to plaintext data buffer.
     * @param out
     *     Pointer to cipher buffer.
     */
    void threefishEncryptBlockBytes(struct threefish_key* keyCtx, uint8_t* in, uint8_t* out);
    
    /**
     * Encrypt Threefisch block (words).
     * 
     * The buffer must have at least the same length (number of bits) aas the 
     * state size for this key. The function uses the first @c stateSize bits
     * of the input buffer, encrypts them and stores the result in the output
     * buffer.
     * 
     * The wordsize ist set to 64 bits.
     * 
     * @param keyCtx
     *     Pointer to a Threefish key structure.
     * @param in
     *     Poionter to plaintext data buffer.
     * @param out
     *     Pointer to cipher buffer.
     */
    void threefishEncryptBlockWords(struct threefish_key* keyCtx, uint64_t* in, uint64_t* out);

    /**
     * Decrypt Threefisch block (bytes).
     * 
     * The buffer must have at least the same length (number of bits) aas the 
     * state size for this key. The function uses the first @c stateSize bits
     * of the input buffer, decrypts them and stores the result in the output
     * buffer
     * 
     * @param keyCtx
     *     Pointer to a Threefish key structure.
     * @param in
     *     Poionter to cipher data buffer.
     * @param out
     *     Pointer to plaintext buffer.
     */
    void threefishDecryptBlockBytes(struct threefish_key* keyCtx, uint8_t* in, uint8_t* out);

    /**
     * Decrypt Threefisch block (words).
     * 
     * The buffer must have at least the same length (number of bits) aas the 
     * state size for this key. The function uses the first @c stateSize bits
     * of the input buffer, encrypts them and stores the result in the output
     * buffer.
     * 
     * The wordsize ist set to 64 bits.
     * 
     * @param keyCtx
     *     Pointer to a Threefish key structure.
     * @param in
     *     Poionter to cipher data buffer.
     * @param out
     *     Pointer to plaintext buffer.
     */
    void threefishDecryptBlockWords(struct threefish_key* keyCtx, uint64_t* in, uint64_t* out);

    void threefishEncrypt256(struct threefish_key* keyCtx, uint64_t* input, uint64_t* output);
    void threefishEncrypt512(struct threefish_key* keyCtx, uint64_t* input, uint64_t* output);
    void threefishEncrypt1024(struct threefish_key* keyCtx, uint64_t* input, uint64_t* output);
    void threefishDecrypt256(struct threefish_key* keyCtx, uint64_t* input, uint64_t* output);
    void threefishDecrypt512(struct threefish_key* keyCtx, uint64_t* input, uint64_t* output);
    void threefishDecrypt1024(struct threefish_key* keyCtx, uint64_t* input, uint64_t* output);
/**
 * @}
 */
#endif
