rijndael-api-fst.h
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:5k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /**
  2.  * rijndael-api-fst.h
  3.  * You're probably looking for aes-cfb.h, which is easier to use.
  4.  *
  5.  * @version 2.9 (December 2000)
  6.  *
  7.  * Optimised ANSI C code for the Rijndael cipher (now AES)
  8.  *
  9.  * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
  10.  * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
  11.  * @author Paulo Barreto <paulo.barreto@terra.com.br>
  12.  *
  13.  * This code is hereby placed in the public domain.
  14.  *
  15.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
  16.  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  17.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
  19.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  20.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  21.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  22.  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  23.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  24.  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  25.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26.  *
  27.  * Acknowledgements:
  28.  *
  29.  * We are deeply indebted to the following people for their bug reports,
  30.  * fixes, and improvement suggestions to this implementation. Though we
  31.  * tried to list all contributions, we apologise in advance for any
  32.  * missing reference.
  33.  *
  34.  * Andrew Bales <Andrew.Bales@Honeywell.com>
  35.  * Markus Friedl <markus.friedl@informatik.uni-erlangen.de>
  36.  * John Skodon <skodonj@webquill.com>
  37.  */
  38. #ifndef __RIJNDAEL_API_FST_H
  39. #define __RIJNDAEL_API_FST_H
  40. #include <stdio.h>
  41. #include "rijndael-alg-fst.h"
  42. /*  Generic Defines  */
  43. #define     DIR_ENCRYPT           0 /*  Are we encrpyting?  */
  44. #define     DIR_DECRYPT           1 /*  Are we decrpyting?  */
  45. #define     MODE_ECB              1 /*  Are we ciphering in ECB mode?   */
  46. #define     MODE_CBC              2 /*  Are we ciphering in CBC mode?   */
  47. #define     MODE_CFB1             3 /*  Are we ciphering in 1-bit CFB mode? */
  48. #define     TRUE                  1
  49. #define     FALSE                 0
  50. #define     BITSPERBLOCK        128 /* Default number of bits in a cipher block */
  51. /*  Error Codes  */
  52. #define     BAD_KEY_DIR          -1 /*  Key direction is invalid, e.g., unknown value */
  53. #define     BAD_KEY_MAT          -2 /*  Key material not of correct length */
  54. #define     BAD_KEY_INSTANCE     -3 /*  Key passed is not valid */
  55. #define     BAD_CIPHER_MODE      -4 /*  Params struct passed to cipherInit invalid */
  56. #define     BAD_CIPHER_STATE     -5 /*  Cipher in wrong state (e.g., not initialized) */
  57. #define     BAD_BLOCK_LENGTH     -6
  58. #define     BAD_CIPHER_INSTANCE  -7
  59. #define     BAD_DATA             -8 /*  Data contents are invalid, e.g., invalid padding */
  60. #define     BAD_OTHER            -9 /*  Unknown error */
  61. /*  Algorithm-specific Defines  */
  62. #define     MAX_KEY_SIZE         64 /* # of ASCII char's needed to represent a key */
  63. #define     MAX_IV_SIZE          16 /* # bytes needed to represent an IV  */
  64. /*  Typedefs  */
  65. typedef unsigned char   BYTE;
  66. /*  The structure for key information */
  67. typedef struct {
  68.     BYTE  direction;                /* Key used for encrypting or decrypting? */
  69.     int   keyLen;                   /* Length of the key  */
  70.     char  keyMaterial[MAX_KEY_SIZE+1];  /* Raw key data in ASCII, e.g., user input or KAT values */
  71. int   Nr;                       /* key-length-dependent number of rounds */
  72. u32   rk[4*(MAXNR + 1)];        /* key schedule */
  73. u32   ek[4*(MAXNR + 1)];        /* CFB1 key schedule (encryption only) */
  74. } keyInstance;
  75. /*  The structure for cipher information */
  76. typedef struct {                    /* changed order of the components */
  77.     BYTE  mode;                     /* MODE_ECB, MODE_CBC, or MODE_CFB1 */
  78.     BYTE  IV[MAX_IV_SIZE];          /* A possible Initialization Vector for ciphering */
  79. } cipherInstance;
  80. /*  Function prototypes  */
  81. int makeKey(keyInstance *key, BYTE direction, int keyLen, char *keyMaterial);
  82. int cipherInit(cipherInstance *cipher, BYTE mode, char *IV);
  83. int blockEncrypt(cipherInstance *cipher, keyInstance *key,
  84.         BYTE *input, int inputLen, BYTE *outBuffer);
  85. int padEncrypt(cipherInstance *cipher, keyInstance *key,
  86. BYTE *input, int inputOctets, BYTE *outBuffer);
  87. int blockDecrypt(cipherInstance *cipher, keyInstance *key,
  88.         BYTE *input, int inputLen, BYTE *outBuffer);
  89. int padDecrypt(cipherInstance *cipher, keyInstance *key,
  90. BYTE *input, int inputOctets, BYTE *outBuffer);
  91. #ifdef INTERMEDIATE_VALUE_KAT
  92. int cipherUpdateRounds(cipherInstance *cipher, keyInstance *key,
  93.         BYTE *input, int inputLen, BYTE *outBuffer, int Rounds);
  94. #endif /* INTERMEDIATE_VALUE_KAT */
  95. #endif /* __RIJNDAEL_API_FST_H */