source: trunk/include/polarssl/camellia.h @ 1095

Revision 1095, 6.1 KB checked in by paul, 8 months ago (diff)
  • Clarified use of AES and Camellia in CFB and CTR modes
Line 
1/**
2 * \file camellia.h
3 *
4 * \brief Camellia block cipher
5 *
6 *  Copyright (C) 2006-2010, Brainspark B.V.
7 *
8 *  This file is part of PolarSSL (http://www.polarssl.org)
9 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
10 *
11 *  All rights reserved.
12 *
13 *  This program is free software; you can redistribute it and/or modify
14 *  it under the terms of the GNU General Public License as published by
15 *  the Free Software Foundation; either version 2 of the License, or
16 *  (at your option) any later version.
17 *
18 *  This program is distributed in the hope that it will be useful,
19 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 *  GNU General Public License for more details.
22 *
23 *  You should have received a copy of the GNU General Public License along
24 *  with this program; if not, write to the Free Software Foundation, Inc.,
25 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 */
27#ifndef POLARSSL_CAMELLIA_H
28#define POLARSSL_CAMELLIA_H
29
30#include <string.h>
31
32#ifdef _MSC_VER
33#include <basetsd.h>
34typedef UINT32 uint32_t;
35#else
36#include <inttypes.h>
37#endif
38
39#define CAMELLIA_ENCRYPT     1
40#define CAMELLIA_DECRYPT     0
41
42#define POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH           -0x0024  /**< Invalid key length. */
43#define POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH         -0x0026  /**< Invalid data input length. */
44
45/**
46 * \brief          CAMELLIA context structure
47 */
48typedef struct
49{
50    int nr;                     /*!<  number of rounds  */
51    uint32_t rk[68];            /*!<  CAMELLIA round keys    */
52}
53camellia_context;
54
55#ifdef __cplusplus
56extern "C" {
57#endif
58
59/**
60 * \brief          CAMELLIA key schedule (encryption)
61 *
62 * \param ctx      CAMELLIA context to be initialized
63 * \param key      encryption key
64 * \param keysize  must be 128, 192 or 256
65 *
66 * \return         0 if successful, or POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH
67 */
68int camellia_setkey_enc( camellia_context *ctx, const unsigned char *key, unsigned int keysize );
69
70/**
71 * \brief          CAMELLIA key schedule (decryption)
72 *
73 * \param ctx      CAMELLIA context to be initialized
74 * \param key      decryption key
75 * \param keysize  must be 128, 192 or 256
76 *
77 * \return         0 if successful, or POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH
78 */
79int camellia_setkey_dec( camellia_context *ctx, const unsigned char *key, unsigned int keysize );
80
81/**
82 * \brief          CAMELLIA-ECB block encryption/decryption
83 *
84 * \param ctx      CAMELLIA context
85 * \param mode     CAMELLIA_ENCRYPT or CAMELLIA_DECRYPT
86 * \param input    16-byte input block
87 * \param output   16-byte output block
88 *
89 * \return         0 if successful
90 */
91int camellia_crypt_ecb( camellia_context *ctx,
92                    int mode,
93                    const unsigned char input[16],
94                    unsigned char output[16] );
95
96/**
97 * \brief          CAMELLIA-CBC buffer encryption/decryption
98 *                 Length should be a multiple of the block
99 *                 size (16 bytes)
100 *
101 * \param ctx      CAMELLIA context
102 * \param mode     CAMELLIA_ENCRYPT or CAMELLIA_DECRYPT
103 * \param length   length of the input data
104 * \param iv       initialization vector (updated after use)
105 * \param input    buffer holding the input data
106 * \param output   buffer holding the output data
107 *
108 * \return         0 if successful, or POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH
109 */
110int camellia_crypt_cbc( camellia_context *ctx,
111                    int mode,
112                    size_t length,
113                    unsigned char iv[16],
114                    const unsigned char *input,
115                    unsigned char *output );
116
117/**
118 * \brief          CAMELLIA-CFB128 buffer encryption/decryption
119 *
120 * Note: Due to the nature of CFB you should use the same key schedule for
121 * both encryption and decryption. So a context initialized with
122 * camellia_setkey_enc() for both CAMELLIA_ENCRYPT and CAMELLIE_DECRYPT.
123 *
124 * \param ctx      CAMELLIA context
125 * \param mode     CAMELLIA_ENCRYPT or CAMELLIA_DECRYPT
126 * \param length   length of the input data
127 * \param iv_off   offset in IV (updated after use)
128 * \param iv       initialization vector (updated after use)
129 * \param input    buffer holding the input data
130 * \param output   buffer holding the output data
131 *
132 * \return         0 if successful, or POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH
133 */
134int camellia_crypt_cfb128( camellia_context *ctx,
135                       int mode,
136                       size_t length,
137                       size_t *iv_off,
138                       unsigned char iv[16],
139                       const unsigned char *input,
140                       unsigned char *output );
141
142/*
143 * \brief               CAMELLIA-CTR buffer encryption/decryption
144 *
145 * Warning: You have to keep the maximum use of your counter in mind!
146 *
147 * Note: Due to the nature of CTR you should use the same key schedule for
148 * both encryption and decryption. So a context initialized with
149 * camellia_setkey_enc() for both CAMELLIA_ENCRYPT and CAMELLIA_DECRYPT.
150 *
151 * \param length        The length of the data
152 * \param nc_off        The offset in the current stream_block (for resuming
153 *                      within current cipher stream). The offset pointer to
154 *                      should be 0 at the start of a stream.
155 * \param nonce_counter The 128-bit nonce and counter.
156 * \param stream_block  The saved stream-block for resuming. Is overwritten
157 *                      by the function.
158 * \param input         The input data stream
159 * \param output        The output data stream
160 *
161 * \return         0 if successful
162 */
163int camellia_crypt_ctr( camellia_context *ctx,
164                       size_t length,
165                       size_t *nc_off,
166                       unsigned char nonce_counter[16],
167                       unsigned char stream_block[16],
168                       const unsigned char *input,
169                       unsigned char *output );
170
171/**
172 * \brief          Checkup routine
173 *
174 * \return         0 if successful, or 1 if the test failed
175 */
176int camellia_self_test( int verbose );
177
178#ifdef __cplusplus
179}
180#endif
181
182#endif /* camellia.h */
Note: See TracBrowser for help on using the repository browser.

What are you looking for?