/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef _CAMELLIA_H_
#define _CAMELLIA_H_ 1

#define CAMELLIA_BLOCK_SIZE 16  /* bytes */
#define CAMELLIA_MIN_KEYSIZE 16 /* bytes */
#define CAMELLIA_MAX_KEYSIZE 32 /* bytes */

#define CAMELLIA_MAX_EXPANDEDKEY (34 * 2) /* 32bit unit */

typedef PRUint32 KEY_TABLE_TYPE[CAMELLIA_MAX_EXPANDEDKEY];

typedef SECStatus CamelliaFunc(CamelliaContext *cx, unsigned char *output,
                               unsigned int *outputLen,
                               unsigned int maxOutputLen,
                               const unsigned char *input,
                               unsigned int inputLen);

typedef SECStatus CamelliaBlockFunc(const PRUint32 *subkey,
                                    unsigned char *output,
                                    const unsigned char *input);

/* CamelliaContextStr
 *
 * Values which maintain the state for Camellia encryption/decryption.
 *
 * keysize     - the number of key bits
 * worker      - the encryption/decryption function to use with this context
 * iv          - initialization vector for CBC mode
 * expandedKey - the round keys in 4-byte words
 */
struct CamelliaContextStr {
    PRUint32 keysize; /* bytes */
    CamelliaFunc *worker;
    PRUint32 expandedKey[CAMELLIA_MAX_EXPANDEDKEY];
    PRUint8 iv[CAMELLIA_BLOCK_SIZE];
};

#endif /* _CAMELLIA_H_ */
