/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



#define _RTL_CIPHER_C_ "$Revision$"

#include <sal/types.h>
#include <rtl/alloc.h>
#include <rtl/memory.h>
#include <rtl/cipher.h>

/*========================================================================
 *
 * rtlCipher internals.
 *
 *======================================================================*/
#define RTL_CIPHER_NTOHL(c, l) \
	((l)  = ((sal_uInt32)(*((c)++))) << 24L, \
	 (l) |= ((sal_uInt32)(*((c)++))) << 16L, \
	 (l) |= ((sal_uInt32)(*((c)++))) <<  8L, \
	 (l) |= ((sal_uInt32)(*((c)++))))

#define RTL_CIPHER_HTONL(l, c) \
	(*((c)++) = (sal_uInt8)(((l) >> 24L) & 0xff), \
	 *((c)++) = (sal_uInt8)(((l) >> 16L) & 0xff), \
	 *((c)++) = (sal_uInt8)(((l) >>  8L) & 0xff), \
	 *((c)++) = (sal_uInt8)(((l)       ) & 0xff))

#define RTL_CIPHER_NTOHL64(c, xl, xr, n) \
{ \
	(xl) = (xr) = 0; \
	(c) += (n);  \
	switch ((n)) \
	{ \
		case 8: (xr)  = ((sal_uInt32)(*(--(c)))); \
		case 7: (xr) |= ((sal_uInt32)(*(--(c)))) <<  8L; \
		case 6: (xr) |= ((sal_uInt32)(*(--(c)))) << 16L; \
		case 5: (xr) |= ((sal_uInt32)(*(--(c)))) << 24L; \
		case 4: (xl)  = ((sal_uInt32)(*(--(c)))); \
		case 3: (xl) |= ((sal_uInt32)(*(--(c)))) <<  8L; \
		case 2: (xl) |= ((sal_uInt32)(*(--(c)))) << 16L; \
		case 1: (xl) |= ((sal_uInt32)(*(--(c)))) << 24L; \
	} \
}

#define RTL_CIPHER_HTONL64(xl, xr, c, n) \
{ \
	(c) += (n);  \
	switch ((n)) \
	{ \
		case 8: *(--(c)) = (sal_uInt8)(((xr)       ) & 0xff); \
		case 7: *(--(c)) = (sal_uInt8)(((xr) >>  8L) & 0xff); \
		case 6: *(--(c)) = (sal_uInt8)(((xr) >> 16L) & 0xff); \
		case 5: *(--(c)) = (sal_uInt8)(((xr) >> 24L) & 0xff); \
		case 4: *(--(c)) = (sal_uInt8)(((xl)       ) & 0xff); \
		case 3: *(--(c)) = (sal_uInt8)(((xl) >>  8L) & 0xff); \
		case 2: *(--(c)) = (sal_uInt8)(((xl) >> 16L) & 0xff); \
		case 1: *(--(c)) = (sal_uInt8)(((xl) >> 24L) & 0xff); \
	} \
}

typedef rtlCipherError (SAL_CALL cipher_init_t) (
	rtlCipher          Cipher,
	rtlCipherDirection Direction,
	const sal_uInt8 *pKeyData, sal_Size nKeyLen,
	const sal_uInt8 *pArgData, sal_Size nArgLen);

typedef rtlCipherError (SAL_CALL cipher_update_t) (
	rtlCipher   Cipher,
	const void *pData,   sal_Size nDatLen,
	sal_uInt8  *pBuffer, sal_Size nBufLen);

typedef void (SAL_CALL cipher_delete_t) (rtlCipher Cipher);

/** Cipher_Impl.
 */
typedef struct cipher_impl_st
{
	rtlCipherAlgorithm  m_algorithm;
	rtlCipherDirection  m_direction;
	rtlCipherMode       m_mode;

	cipher_init_t      *m_init;
	cipher_update_t    *m_encode;
	cipher_update_t    *m_decode;
	cipher_delete_t    *m_delete;
} Cipher_Impl;

/*========================================================================
 *
 * rtlCipher implementation.
 *
 *======================================================================*/
/*
 * rtl_cipher_create.
 */
rtlCipher SAL_CALL rtl_cipher_create (
	rtlCipherAlgorithm Algorithm,
	rtlCipherMode      Mode)
{
	rtlCipher Cipher = (rtlCipher)NULL;
	switch (Algorithm)
	{
		case rtl_Cipher_AlgorithmBF:
			Cipher = rtl_cipher_createBF (Mode);
			break;

		case rtl_Cipher_AlgorithmARCFOUR:
			Cipher = rtl_cipher_createARCFOUR (Mode);
			break;

		default: /* rtl_Cipher_AlgorithmInvalid */
			break;
	}
	return Cipher;
}

/*
 * rtl_cipher_init.
 */
rtlCipherError SAL_CALL rtl_cipher_init (
	rtlCipher          Cipher,
	rtlCipherDirection Direction,
	const sal_uInt8 *pKeyData, sal_Size nKeyLen,
	const sal_uInt8 *pArgData, sal_Size nArgLen)
{
	Cipher_Impl *pImpl = (Cipher_Impl*)Cipher;
	if (pImpl == NULL)
		return rtl_Cipher_E_Argument;
	if (pImpl->m_init == NULL)
		return rtl_Cipher_E_Unknown;

	return (pImpl->m_init)(
		Cipher, Direction, pKeyData, nKeyLen, pArgData, nArgLen);
}

/*
 * rtl_cipher_encode.
 */
rtlCipherError SAL_CALL rtl_cipher_encode (
	rtlCipher   Cipher,
	const void *pData,   sal_Size nDatLen,
	sal_uInt8  *pBuffer, sal_Size nBufLen)
{
	Cipher_Impl *pImpl = (Cipher_Impl*)Cipher;
	if (pImpl == NULL)
		return rtl_Cipher_E_Argument;
	if (pImpl->m_encode == NULL)
		return rtl_Cipher_E_Unknown;

	return (pImpl->m_encode)(Cipher, pData, nDatLen, pBuffer, nBufLen);
}

/*
 * rtl_cipher_decode.
 */
rtlCipherError SAL_CALL rtl_cipher_decode (
	rtlCipher   Cipher,
	const void *pData,   sal_Size nDatLen,
	sal_uInt8  *pBuffer, sal_Size nBufLen)
{
	Cipher_Impl *pImpl = (Cipher_Impl*)Cipher;
	if (pImpl == NULL)
		return rtl_Cipher_E_Argument;
	if (pImpl->m_decode == NULL)
		return rtl_Cipher_E_Unknown;

	return (pImpl->m_decode)(Cipher, pData, nDatLen, pBuffer, nBufLen);
}

/*
 * rtl_cipher_destroy.
 */
void SAL_CALL rtl_cipher_destroy (rtlCipher Cipher)
{
	Cipher_Impl *pImpl = (Cipher_Impl*)Cipher;
	if (pImpl && pImpl->m_delete)
		pImpl->m_delete (Cipher);
}

/*========================================================================
 *
 * rtl_cipherBF (Blowfish) internals.
 *
 *======================================================================*/
#define CIPHER_ROUNDS_BF 16

typedef struct cipherBF_key_st
{
	sal_uInt32 m_S[4][256];
	sal_uInt32 m_P[CIPHER_ROUNDS_BF + 2];
} CipherKeyBF;

typedef struct cipherBF_context_st
{
	CipherKeyBF    m_key;
	union
	{
		sal_uInt32 m_long[2];
		sal_uInt8  m_byte[8];
	} m_iv;
	sal_uInt32     m_offset;
} CipherContextBF;

typedef struct cipherBF_impl_st
{
	Cipher_Impl     m_cipher;
	CipherContextBF m_context;
} CipherBF_Impl;

/** __rtl_cipherBF_init.
 */
static rtlCipherError __rtl_cipherBF_init (
	CipherContextBF *ctx,
	rtlCipherMode    eMode,
	const sal_uInt8 *pKeyData, sal_Size nKeyLen,
	const sal_uInt8 *pArgData, sal_Size nArgLen);

/** __rtl_cipherBF_update.
 */
static rtlCipherError __rtl_cipherBF_update (
	CipherContextBF    *ctx,
	rtlCipherMode       eMode,
	rtlCipherDirection  eDirection,
	const sal_uInt8    *pData,   sal_Size nDatLen,
	sal_uInt8          *pBuffer, sal_Size nBufLen);

/** __rtl_cipherBF_updateECB.
 */
static void __rtl_cipherBF_updateECB (
	CipherContextBF    *ctx,
	rtlCipherDirection  direction,
	const sal_uInt8    *pData,
	sal_uInt8          *pBuffer,
	sal_Size            nLength);

/** __rtl_cipherBF_updateCBC.
 */
static void __rtl_cipherBF_updateCBC (
	CipherContextBF    *ctx,
	rtlCipherDirection  direction,
	const sal_uInt8    *pData,
	sal_uInt8          *pBuffer,
	sal_Size          nLength);

/** __rtl_cipherBF_updateCFB.
 */
static void __rtl_cipherBF_updateCFB (
	CipherContextBF    *ctx,
	rtlCipherDirection  direction,
	const sal_uInt8    *pData,
	sal_uInt8          *pBuffer);

/** __rtl_cipher_encode.
 */
static void __rtl_cipherBF_encode (
	CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr);

/** __rtl_cipherBF_decode.
 */
static void __rtl_cipherBF_decode (
	CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr);

/** __rtl_cipherBF.
 */
static sal_uInt32 __rtl_cipherBF (
	CipherKeyBF *key, sal_uInt32 x);

/** __rtl_cipherBF_key.
 */
static const CipherKeyBF __rtl_cipherBF_key =
{
	/* S */
	{
		/* S[0] */
		{
			/* 0 */
			0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
			0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
			0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
			0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,

			/* 1 */
			0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
			0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
			0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
			0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,

			/* 2 */
			0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
			0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
			0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
			0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,

			/* 3 */
			0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
			0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
			0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
			0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,

			/* 4 */
			0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
			0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
			0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
			0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,

			/* 5 */
			0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
			0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
			0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
			0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,

			/* 6 */
			0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
			0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
			0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
			0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,

			/* 7 */
			0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
			0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
			0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
			0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,

			/* 8 */
			0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
			0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
			0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
			0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,

			/* 9 */
			0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
			0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
			0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
			0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,

			/* A */
			0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
			0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
			0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
			0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,

			/* B */
			0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
			0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
			0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
			0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,

			/* C */
			0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
			0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
			0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
			0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,

			/* D */
			0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
			0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
			0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
			0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,

			/* E */
			0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
			0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
			0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
			0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,

			/* F */
			0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
			0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
			0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
			0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL
		},

		/* S[1] */
		{
			0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
			0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
			0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
			0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,

			0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
			0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
			0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
			0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,

			0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
			0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
			0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
			0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,

			0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
			0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
			0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
			0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,

			0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
			0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
			0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
			0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,

			0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
			0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
			0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
			0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,

			0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
			0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
			0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
			0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,

			0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
			0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
			0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
			0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,

			0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
			0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
			0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
			0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,

			0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
			0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
			0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
			0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,

			0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
			0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
			0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
			0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,

			0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
			0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
			0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
			0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,

			0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
			0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
			0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
			0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,

			0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
			0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
			0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
			0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,

			0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
			0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
			0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
			0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,

			0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
			0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
			0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
			0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L
		},

		/* S[2] */
		{
			0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
			0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
			0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
			0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,

			0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
			0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
			0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
			0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,

			0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
			0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
			0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
			0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,

			0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
			0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
			0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
			0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,

			0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
			0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
			0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
			0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,

			0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
			0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
			0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
			0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,

			0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
			0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
			0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
			0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,

			0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
			0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
			0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
			0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,

			0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
			0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
			0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
			0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,

			0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
			0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
			0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
			0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,

			0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
			0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
			0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
			0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,

			0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
			0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
			0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
			0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,

			0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
			0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
			0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
			0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,

			0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
			0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
			0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
			0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,

			0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
			0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
			0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
			0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,

			0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
			0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
			0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
			0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L
		},

		/* S[3] */
		{
			0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
			0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
			0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
			0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,

			0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
			0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
			0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
			0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,

			0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
			0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
			0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
			0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,

			0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
			0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
			0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
			0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,

			0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
			0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
			0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
			0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,

			0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
			0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
			0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
			0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,

			0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
			0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
			0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
			0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,

			0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
			0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
			0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
			0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,

			0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
			0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
			0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
			0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,

			0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
			0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
			0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
			0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,

			0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
			0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
			0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
			0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,

			0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
			0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
			0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
			0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,

			0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
			0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
			0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
			0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,

			0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
			0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
			0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
			0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,

			0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
			0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
			0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
			0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,

			0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
			0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
			0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
			0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L
		}
	},

	/* P */
	{
		0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
		0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
		0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
		0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
		0x9216D5D9L, 0x8979FB1BL
	}
};

/*
 * __rtl_cipherBF_init.
 */
static rtlCipherError __rtl_cipherBF_init (
	CipherContextBF *ctx,
	rtlCipherMode    eMode,
	const sal_uInt8 *pKeyData, sal_Size nKeyLen,
	const sal_uInt8 *pArgData, sal_Size nArgLen)
{
	CipherKeyBF *key;
	sal_uInt32   D, DL, DR;
	sal_uInt16   i, j, k;

	key = &(ctx->m_key);

	rtl_copyMemory (key, &__rtl_cipherBF_key, sizeof (CipherKeyBF));
	rtl_zeroMemory (&(ctx->m_iv), sizeof(ctx->m_iv));
	ctx->m_offset = 0;

	for (i = 0, k = 0; i < CIPHER_ROUNDS_BF + 2; ++i)
	{
		D = 0;
		for (j = 0; j < 4; ++j)
		{
			D = ((D << 8) | pKeyData[k]);
			k++;
			if (k >= nKeyLen)
				k = 0;
		}
		key->m_P[i] ^= D;
	}

	DL = 0;
	DR = 0;

	for (i = 0; i < CIPHER_ROUNDS_BF + 2; i += 2)
	{
		__rtl_cipherBF_encode (key, &DL, &DR);
		key->m_P[i    ] = DL;
		key->m_P[i + 1] = DR;
	}

	for (i = 0; i < 4; ++i)
	{
		for (k = 0; k < 256; k += 2)
		{
			__rtl_cipherBF_encode (key, &DL, &DR);
			key->m_S[i][k    ] = DL;
			key->m_S[i][k + 1] = DR;
		}
	}

	if (pArgData && nArgLen)
	{
		nArgLen = ((nArgLen < 8) ? nArgLen : 8);
		if (eMode == rtl_Cipher_ModeStream)
		{
			rtl_copyMemory (ctx->m_iv.m_byte, pArgData, nArgLen);
		}
		else
		{
			RTL_CIPHER_NTOHL64 (pArgData, DL, DR, nArgLen);
			ctx->m_iv.m_long[0] = DL;
			ctx->m_iv.m_long[1] = DR;
		}
	}

	D = DL = DR = 0;
	return rtl_Cipher_E_None;
}

/*
 * __rtl_cipherBF_update.
 */
static rtlCipherError __rtl_cipherBF_update (
	CipherContextBF    *ctx,
	rtlCipherMode       eMode,
	rtlCipherDirection  eDirection,
	const sal_uInt8    *pData,   sal_Size nDatLen,
	sal_uInt8          *pBuffer, sal_Size nBufLen)
{
	/* Check arguments. */
	if ((pData == NULL) || (pBuffer == NULL))
		return rtl_Cipher_E_Argument;

	if (!((0 < nDatLen) && (nDatLen <= nBufLen)))
		return rtl_Cipher_E_BufferSize;

	/* Update. */
	if (eMode == rtl_Cipher_ModeECB)
	{
		/* Block mode. */
		while (nDatLen > 8)
		{
			__rtl_cipherBF_updateECB (ctx, eDirection, pData, pBuffer, 8);
			nDatLen -= 8;
			pData   += 8;
			pBuffer += 8;
		}
		__rtl_cipherBF_updateECB (ctx, eDirection, pData, pBuffer, nDatLen);
	}
	else if (eMode == rtl_Cipher_ModeCBC)
	{
		/* Block mode. */
		while (nDatLen > 8)
		{
			__rtl_cipherBF_updateCBC (ctx, eDirection, pData, pBuffer, 8);
			nDatLen -= 8;
			pData   += 8;
			pBuffer += 8;
		}
		__rtl_cipherBF_updateCBC (ctx, eDirection, pData, pBuffer, nDatLen);
	}
	else
	{
		/* Stream mode. */
		while (nDatLen > 0)
		{
			__rtl_cipherBF_updateCFB (ctx, eDirection, pData, pBuffer);
			nDatLen -= 1;
			pData   += 1;
			pBuffer += 1;
		}
	}
	return rtl_Cipher_E_None;
}

/*
 * __rtl_cipherBF_updateECB.
 */
static void __rtl_cipherBF_updateECB (
	CipherContextBF    *ctx,
	rtlCipherDirection  direction,
	const sal_uInt8    *pData,
	sal_uInt8          *pBuffer,
	sal_Size            nLength)
{
	CipherKeyBF *key;
	sal_uInt32   DL, DR;

	key = &(ctx->m_key);
	if (direction == rtl_Cipher_DirectionEncode)
	{
		RTL_CIPHER_NTOHL64(pData, DL, DR, nLength);

		__rtl_cipherBF_encode (key, &DL, &DR);

		RTL_CIPHER_HTONL(DL, pBuffer);
		RTL_CIPHER_HTONL(DR, pBuffer);
	}
	else
	{
		RTL_CIPHER_NTOHL(pData, DL);
		RTL_CIPHER_NTOHL(pData, DR);

		__rtl_cipherBF_decode (key, &DL, &DR);

		RTL_CIPHER_HTONL64(DL, DR, pBuffer, nLength);
	}
	DL = DR = 0;
}

/*
 * __rtl_cipherBF_updateCBC.
 */
static void __rtl_cipherBF_updateCBC (
	CipherContextBF    *ctx,
	rtlCipherDirection  direction,
	const sal_uInt8    *pData,
	sal_uInt8          *pBuffer,
	sal_Size            nLength)
{
	CipherKeyBF *key;
	sal_uInt32   DL, DR;

	key = &(ctx->m_key);
	if (direction == rtl_Cipher_DirectionEncode)
	{
		RTL_CIPHER_NTOHL64(pData, DL, DR, nLength);

		DL ^= ctx->m_iv.m_long[0];
		DR ^= ctx->m_iv.m_long[1];

		__rtl_cipherBF_encode (key, &DL, &DR);

		ctx->m_iv.m_long[0] = DL;
		ctx->m_iv.m_long[1] = DR;

		RTL_CIPHER_HTONL(DL, pBuffer);
		RTL_CIPHER_HTONL(DR, pBuffer);
	}
	else
	{
		sal_uInt32 IVL, IVR;

		RTL_CIPHER_NTOHL(pData, DL);
		RTL_CIPHER_NTOHL(pData, DR);

		IVL = DL;
		IVR = DR;

		__rtl_cipherBF_decode (key, &DL, &DR);

		DL ^= ctx->m_iv.m_long[0];
		DR ^= ctx->m_iv.m_long[1];

		ctx->m_iv.m_long[0] = IVL;
		ctx->m_iv.m_long[1] = IVR;

		RTL_CIPHER_HTONL64(DL, DR, pBuffer, nLength);
		IVL = IVR = 0;
	}
	DL = DR = 0;
}

/*
 * __rtl_cipherBF_updateCFB.
 */
static void __rtl_cipherBF_updateCFB (
	CipherContextBF    *ctx,
	rtlCipherDirection  direction,
	const sal_uInt8    *pData,
	sal_uInt8          *pBuffer)
{
	sal_uInt8  *iv;
	sal_uInt32  k;

	iv = ctx->m_iv.m_byte;
	k  = ctx->m_offset;

	if (k == 0)
	{
		sal_uInt32 IVL, IVR;

		RTL_CIPHER_NTOHL64(iv, IVL, IVR, 8);
		__rtl_cipherBF_encode (&(ctx->m_key), &IVL, &IVR);
		RTL_CIPHER_HTONL64(IVL, IVR, iv, 8);

		IVL = IVR = 0;
	}

	if (direction == rtl_Cipher_DirectionEncode)
	{
		iv[k] ^= *pData;
		*pBuffer = iv[k];
	}
	else
	{
		sal_uInt8 c = iv[k];
		iv[k] = *pData;
		*pBuffer = *pData ^ c;
		c = 0;
	}

	ctx->m_offset = ((k + 1) & 0x07);
	iv = NULL;
}

/*
 * __rtl_cipherBF_encode.
 */
static void __rtl_cipherBF_encode (
	CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr)
{
	sal_uInt32  t, XL, XR;
	sal_uInt16  i;

	XL = *xl;
	XR = *xr;

	for (i = 0; i < CIPHER_ROUNDS_BF; ++i)
	{
		XL ^= key->m_P[i];
		XR ^= __rtl_cipherBF (key, XL);

		t  = XL;
		XL = XR;
		XR = t;
	}

	t  = XL;
	XL = XR;
	XR = t;

	XR ^= key->m_P[CIPHER_ROUNDS_BF    ];
	XL ^= key->m_P[CIPHER_ROUNDS_BF + 1];

	*xl = XL;
	*xr = XR;

	t = XL = XR = 0;
}

/*
 * __rtl_cipherBF_decode.
 */
static void __rtl_cipherBF_decode (
	CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr)
{
	sal_uInt32  t, XL, XR;
	sal_uInt16  i;

	XL = *xl;
	XR = *xr;

	for (i = CIPHER_ROUNDS_BF + 1; i > 1; --i)
	{
		XL ^= key->m_P[i];
		XR ^= __rtl_cipherBF (key, XL);

		t  = XL;
		XL = XR;
		XR = t;
	}

	t  = XL;
	XL = XR;
	XR = t;

	XR ^= key->m_P[1];
	XL ^= key->m_P[0];

	*xl = XL;
	*xr = XR;

	t = XL = XR = 0;
}

/*
 * __rtl_cipherBF.
 */
static sal_uInt32 __rtl_cipherBF (CipherKeyBF *key, sal_uInt32 x)
{
	sal_uInt16 a, b, c, d;
	sal_uInt32 y;

	d = (sal_uInt16)(x & 0x00ff);
	x >>= 8;
	c = (sal_uInt16)(x & 0x00ff);
	x >>= 8;
	b = (sal_uInt16)(x & 0x00ff);
	x >>= 8;
	a = (sal_uInt16)(x & 0x00ff);

	y  = key->m_S[0][a];
	y += key->m_S[1][b];
	y ^= key->m_S[2][c];
	y += key->m_S[3][d];

	return y;
}

/*========================================================================
 *
 * rtl_cipherBF (Blowfish) implementation.
 *
 * Reference:
 *   Bruce Schneier: Applied Cryptography, 2nd edition, ch. 14.3
 *
 *======================================================================*/
/*
 * rtl_cipher_createBF.
 */
rtlCipher SAL_CALL rtl_cipher_createBF (rtlCipherMode Mode)
{
	CipherBF_Impl *pImpl = (CipherBF_Impl*)NULL;

	if (Mode == rtl_Cipher_ModeInvalid)
		return ((rtlCipher)NULL);

	pImpl = ((CipherBF_Impl*)rtl_allocateZeroMemory (sizeof (CipherBF_Impl)));
	if (pImpl)
	{
		pImpl->m_cipher.m_algorithm = rtl_Cipher_AlgorithmBF;
		pImpl->m_cipher.m_direction = rtl_Cipher_DirectionInvalid;
		pImpl->m_cipher.m_mode      = Mode;

		pImpl->m_cipher.m_init      = rtl_cipher_initBF;
		pImpl->m_cipher.m_encode    = rtl_cipher_encodeBF;
		pImpl->m_cipher.m_decode    = rtl_cipher_decodeBF;
		pImpl->m_cipher.m_delete    = rtl_cipher_destroyBF;
	}
	return ((rtlCipher)pImpl);
}

/*
 * rtl_cipher_initBF.
 */
rtlCipherError SAL_CALL rtl_cipher_initBF (
	rtlCipher          Cipher,
	rtlCipherDirection Direction,
	const sal_uInt8 *pKeyData, sal_Size nKeyLen,
	const sal_uInt8 *pArgData, sal_Size nArgLen)
{
	CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher;

	if ((pImpl == NULL) || (pKeyData == NULL))
		return rtl_Cipher_E_Argument;

	if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF))
		return rtl_Cipher_E_Algorithm;

	if (!(Direction == rtl_Cipher_DirectionInvalid))
		pImpl->m_cipher.m_direction = Direction;
	else
		return rtl_Cipher_E_Direction;

	return __rtl_cipherBF_init (
		&(pImpl->m_context), pImpl->m_cipher.m_mode,
		pKeyData, nKeyLen, pArgData, nArgLen);
}

/*
 * rtl_cipher_encodeBF.
 */
rtlCipherError SAL_CALL rtl_cipher_encodeBF (
	rtlCipher   Cipher,
	const void *pData,   sal_Size nDatLen,
	sal_uInt8  *pBuffer, sal_Size nBufLen)
{
	CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher;
	if (pImpl == NULL)
		return rtl_Cipher_E_Argument;

	if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF))
		return rtl_Cipher_E_Algorithm;

	if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid)
		return rtl_Cipher_E_Direction;
	if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionDecode)
		return rtl_Cipher_E_Direction;

	return __rtl_cipherBF_update (
		&(pImpl->m_context), pImpl->m_cipher.m_mode,
		rtl_Cipher_DirectionEncode,
		(const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen);
}

/*
 * rtl_cipher_decodeBF.
 */
rtlCipherError SAL_CALL rtl_cipher_decodeBF (
	rtlCipher   Cipher,
	const void *pData,   sal_Size nDatLen,
	sal_uInt8  *pBuffer, sal_Size nBufLen)
{
	CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher;
	if (pImpl == NULL)
		return rtl_Cipher_E_Argument;

	if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF))
		return rtl_Cipher_E_Algorithm;

	if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid)
		return rtl_Cipher_E_Direction;
	if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionEncode)
		return rtl_Cipher_E_Direction;

	return __rtl_cipherBF_update (
		&(pImpl->m_context), pImpl->m_cipher.m_mode,
		rtl_Cipher_DirectionDecode,
		(const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen);
}

/*
 * rtl_cipher_destroyBF.
 */
void SAL_CALL rtl_cipher_destroyBF (rtlCipher Cipher)
{
	CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher;
	if (pImpl)
	{
		if (pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF)
			rtl_freeZeroMemory (pImpl, sizeof (CipherBF_Impl));
		else
			rtl_freeMemory (pImpl);
	}
}

/*========================================================================
 *
 * rtl_cipher_ARCFOUR (RC4) internals.
 *
 *======================================================================*/
#define CIPHER_CBLOCK_ARCFOUR 256

typedef struct cipherARCFOUR_context_st
{
	unsigned int m_S[CIPHER_CBLOCK_ARCFOUR];
	unsigned int m_X, m_Y;
} ContextARCFOUR_Impl;

typedef struct cipherARCFOUR_impl_st
{
	Cipher_Impl         m_cipher;
	ContextARCFOUR_Impl m_context;
} CipherARCFOUR_Impl;

/** rtl_cipherARCFOUR_update_Impl.
 */
static rtlCipherError rtl_cipherARCFOUR_update_Impl (
	ContextARCFOUR_Impl *ctx,
	const sal_uInt8     *pData,   sal_Size nDatLen,
	sal_uInt8           *pBuffer, sal_Size nBufLen);

/*
 * rtl_cipherARCFOUR_init_Impl.
 */
static rtlCipherError rtl_cipherARCFOUR_init_Impl (
	ContextARCFOUR_Impl *ctx,
	const sal_uInt8     *pKeyData, sal_Size nKeyLen)
{
	unsigned int  K[CIPHER_CBLOCK_ARCFOUR];
	unsigned int *L, *S;
	unsigned int  x, y, t;
	sal_Size      n, k;

	S = &(ctx->m_S[0]);

	/* Initialize S linearly. */
	for (x = 0; x < CIPHER_CBLOCK_ARCFOUR; x++)
		S[x] = x;

	/* Initialize K with key, repeat key as necessary. */
	for (L = K, n = CIPHER_CBLOCK_ARCFOUR; n > nKeyLen; n -= nKeyLen)
	{
		for (k = 0; k < nKeyLen; k++) L[k] = pKeyData[k];
		L += nKeyLen;
	}
	for (k = 0; k < n; k++) L[k] = pKeyData[k];

	/* Initialize S with K. */
	for (x = 0, y = 0; x < CIPHER_CBLOCK_ARCFOUR; x++)
	{
		y = (y + S[x] + K[x]) % CIPHER_CBLOCK_ARCFOUR;
		t = S[x], S[x] = S[y], S[y] = t; /* swap S[x] and S[y] */
	}

	/* Initialize counters X and Y. */
	ctx->m_X = 0;
	ctx->m_Y = 0;

	return rtl_Cipher_E_None;
}

/*
 * rtl_cipherARCFOUR_update_Impl.
 */
static rtlCipherError rtl_cipherARCFOUR_update_Impl (
	ContextARCFOUR_Impl *ctx,
	const sal_uInt8     *pData,   sal_Size nDatLen,
	sal_uInt8           *pBuffer, sal_Size nBufLen)
{
	register unsigned int *S;
	register unsigned int  x, y, t;
	sal_Size               k;

	/* Check arguments. */
	if ((pData == NULL) || (pBuffer == NULL))
		return rtl_Cipher_E_Argument;

	if (!((0 < nDatLen) && (nDatLen <= nBufLen)))
		return rtl_Cipher_E_BufferSize;

	/* Update. */
	S = &(ctx->m_S[0]);
	for (k = 0; k < nDatLen; k++)
	{
		/* Update counters X and Y. */
		x = ctx->m_X;
		y = ctx->m_Y;
		x = (x + 1   ) % CIPHER_CBLOCK_ARCFOUR;
		y = (y + S[x]) % CIPHER_CBLOCK_ARCFOUR;
		ctx->m_X = x;
		ctx->m_Y = y;

		/* Swap S[x] and S[y]. */
		t = S[x], S[x] = S[y], S[y] = t;

		/* Evaluate next key byte S[t]. */
		t = (S[x] + S[y]) % CIPHER_CBLOCK_ARCFOUR;
		pBuffer[k] = pData[k] ^ ((sal_uInt8)(S[t] & 0xff));
	}

	return rtl_Cipher_E_None;
}

/*========================================================================
 *
 * rtl_cipher_ARCFOUR (RC4) implementation.
 *
 * Reference:
 *   Bruce Schneier: Applied Cryptography, 2nd edition, ch. 17.1
 *
 *======================================================================*/
/*
 * rtl_cipher_createARCFOUR.
 */
rtlCipher SAL_CALL rtl_cipher_createARCFOUR (rtlCipherMode Mode)
{
	CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)NULL;

	if (!(Mode == rtl_Cipher_ModeStream))
		return ((rtlCipher)NULL);

	pImpl = ((CipherARCFOUR_Impl*)rtl_allocateZeroMemory (sizeof (CipherARCFOUR_Impl)));
	if (pImpl)
	{
		pImpl->m_cipher.m_algorithm = rtl_Cipher_AlgorithmARCFOUR;
		pImpl->m_cipher.m_direction = rtl_Cipher_DirectionInvalid;
		pImpl->m_cipher.m_mode      = rtl_Cipher_ModeStream;

		pImpl->m_cipher.m_init      = rtl_cipher_initARCFOUR;
		pImpl->m_cipher.m_encode    = rtl_cipher_encodeARCFOUR;
		pImpl->m_cipher.m_decode    = rtl_cipher_decodeARCFOUR;
		pImpl->m_cipher.m_delete    = rtl_cipher_destroyARCFOUR;
	}
	return ((rtlCipher)pImpl);
}

/*
 * rtl_cipher_initARCFOUR.
 */
rtlCipherError SAL_CALL rtl_cipher_initARCFOUR (
	rtlCipher          Cipher,
	rtlCipherDirection Direction,
	const sal_uInt8 *pKeyData, sal_Size nKeyLen,
	const sal_uInt8 *pArgData, sal_Size nArgLen)
{
	CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher;
    (void) pArgData; // avoid warning
    (void) nArgLen; // avoid warning

	if ((pImpl == NULL) || (pKeyData == NULL))
		return rtl_Cipher_E_Argument;

	if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR))
		return rtl_Cipher_E_Algorithm;

	if (!(Direction == rtl_Cipher_DirectionInvalid))
		pImpl->m_cipher.m_direction = Direction;
	else
		return rtl_Cipher_E_Direction;

	return rtl_cipherARCFOUR_init_Impl (&(pImpl->m_context), pKeyData, nKeyLen);
}

/*
 * rtl_cipher_encodeARCFOUR.
 */
rtlCipherError SAL_CALL rtl_cipher_encodeARCFOUR (
	rtlCipher   Cipher,
	const void *pData,   sal_Size nDatLen,
	sal_uInt8  *pBuffer, sal_Size nBufLen)
{
	CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher;
	if (pImpl == NULL)
		return rtl_Cipher_E_Argument;

	if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR))
		return rtl_Cipher_E_Algorithm;

	if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid)
		return rtl_Cipher_E_Direction;

	return rtl_cipherARCFOUR_update_Impl (
		&(pImpl->m_context),
		(const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen);
}

/*
 * rtl_cipher_decodeARCFOUR.
 */
rtlCipherError SAL_CALL rtl_cipher_decodeARCFOUR (
	rtlCipher   Cipher,
	const void *pData,   sal_Size nDatLen,
	sal_uInt8  *pBuffer, sal_Size nBufLen)
{
	CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher;
	if (pImpl == NULL)
		return rtl_Cipher_E_Argument;

	if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR))
		return rtl_Cipher_E_Algorithm;

	if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid)
		return rtl_Cipher_E_Direction;

	return rtl_cipherARCFOUR_update_Impl (
		&(pImpl->m_context),
		(const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen);
}

/*
 * rtl_cipher_destroyARCFOUR.
 */
void SAL_CALL rtl_cipher_destroyARCFOUR (rtlCipher Cipher)
{
	CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher;
	if (pImpl)
	{
		if (pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR)
			rtl_freeZeroMemory (pImpl, sizeof (CipherARCFOUR_Impl));
		else
			rtl_freeMemory (pImpl);
	}
}
