text: /*
  ///////////////////////////////////////////////////////////////////////////////
  // Name:        codec.h
  // Purpose:     
  // Author:      Ulrich Telle
  // Modified by:
  // Created:     2006-12-06
  // Copyright:   (c) Ulrich Telle
  // Licence:     wxWindows licence
  ///////////////////////////////////////////////////////////////////////////////
  
  /// \file codec.h Interface of the codec class
  */
  
  #ifndef _CODEC_H_
  #define _CODEC_H_
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  #if defined(__BORLANDC__)
  #define __STDC__ 1
  #endif
  
  #if defined(__BORLANDC__)
  #undef __STDC__
  #endif
  
  /*
  // ATTENTION: Macro similar to that in pager.c
  // TODO: Check in case of new version of SQLite
  */
  #define WX_PAGER_MJ_PGNO(x) ((PENDING_BYTE/(x))+1)
  
  #ifdef __cplusplus
  }  /* End of the 'extern "C"' block */
  #endif
  
  #include "rijndael.h"
  
  #define CODEC_TYPE_AES128 1
  #define CODEC_TYPE_AES256 2
  
  #ifndef CODEC_TYPE
  #define CODEC_TYPE CODEC_TYPE_AES128
  #endif
  
  #if CODEC_TYPE == CODEC_TYPE_AES256
  #define KEYLENGTH 32
  #define CODEC_SHA_ITER 4001
  #else
  #define KEYLENGTH 16
  #endif
  
  typedef struct _Codec
  {
    int           m_isEncrypted;
    int           m_hasReadKey;
    unsigned char m_readKey[KEYLENGTH];
    int           m_hasWriteKey;
    unsigned char m_writeKey[KEYLENGTH];
    Rijndael*     m_aes;
  
    Btree*        m_bt; /* Pointer to B-tree used by DB */
    unsigned char m_page[SQLITE_MAX_PAGE_SIZE+24];
  } Codec;
  
  void CodecInit(Codec* codec);
  void CodecTerm(Codec* codec);
  
  void CodecCopy(Codec* codec, Codec* other);
  
  void CodecGenerateReadKey(Codec* codec, char* userPassword, int passwordLength);
  
  void CodecGenerateWriteKey(Codec* codec, char* userPassword, int passwordLength);
  
  void CodecEncrypt(Codec* codec, int page, unsigned char* data, int len, int useWriteKey);
  
  void CodecDecrypt(Codec* codec, int page, unsigned char* data, int len);
  
  void CodecCopyKey(Codec* codec, int read2write);
  
  void CodecSetIsEncrypted(Codec* codec, int isEncrypted);
  void CodecSetHasReadKey(Codec* codec, int hasReadKey);
  void CodecSetHasWriteKey(Codec* codec, int hasWriteKey);
  void CodecSetBtree(Codec* codec, Btree* bt);
  
  int CodecIsEncrypted(Codec* codec);
  int CodecHasReadKey(Codec* codec);
  int CodecHasWriteKey(Codec* codec);
  Btree* CodecGetBtree(Codec* codec);
  unsigned char* CodecGetPageBuffer(Codec* codec);
  
  void CodecGenerateEncryptionKey(Codec* codec, char* userPassword, int passwordLength, 
                                  unsigned char encryptionKey[KEYLENGTH]);
  
  void CodecPadPassword(Codec* codec, char* password, int pswdlen, unsigned char pswd[32]);
  
  void CodecRC4(Codec* codec, unsigned char* key, int keylen,
                unsigned char* textin, int textlen,
           unsigned char* textout);
  
  void CodecGetMD5Binary(Codec* codec, unsigned char* data, int length, unsigned char* digest);
  
  #if CODEC_TYPE == CODEC_TYPE_AES256
  void CodecGetSHABinary(Codec* codec, unsigned char* data, int length, unsigned char* digest);
  #endif
    
  void CodecGenerateInitialVector(Codec* codec, int seed, unsigned char iv[16]);
  
  void CodecAES(Codec* codec, int page, int encrypt, unsigned char encryptionKey[KEYLENGTH],
                unsigned char* datain, int datalen, unsigned char* dataout);
  
  #endif
  