xref: /dragonfly/crypto/libressl/crypto/evp/e_camellia.c (revision 961e30ea7dc61d1112b778ea4981eac68129fb86)
1 /* $OpenBSD: e_camellia.c,v 1.15 2022/09/10 17:39:47 jsing Exp $ */
2 /* ====================================================================
3  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in
14  *    the documentation and/or other materials provided with the
15  *    distribution.
16  *
17  * 3. All advertising materials mentioning features or use of this
18  *    software must display the following acknowledgment:
19  *    "This product includes software developed by the OpenSSL Project
20  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21  *
22  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23  *    endorse or promote products derived from this software without
24  *    prior written permission. For written permission, please contact
25  *    openssl-core@openssl.org.
26  *
27  * 5. Products derived from this software may not be called "OpenSSL"
28  *    nor may "OpenSSL" appear in their names without prior written
29  *    permission of the OpenSSL Project.
30  *
31  * 6. Redistributions of any form whatsoever must retain the following
32  *    acknowledgment:
33  *    "This product includes software developed by the OpenSSL Project
34  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35  *
36  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47  * OF THE POSSIBILITY OF SUCH DAMAGE.
48  * ====================================================================
49  *
50  * This product includes cryptographic software written by Eric Young
51  * (eay@cryptsoft.com).  This product includes software written by Tim
52  * Hudson (tjh@cryptsoft.com).
53  *
54  */
55 
56 #include <string.h>
57 
58 #include <openssl/opensslconf.h>
59 
60 #ifndef OPENSSL_NO_CAMELLIA
61 #include <openssl/evp.h>
62 #include <openssl/err.h>
63 #include <openssl/camellia.h>
64 
65 #include "evp_locl.h"
66 
67 /* Camellia subkey Structure */
68 typedef struct {
69           CAMELLIA_KEY ks;
70 } EVP_CAMELLIA_KEY;
71 
72 /* Attribute operation for Camellia */
73 #define data(ctx)   ((EVP_CAMELLIA_KEY *)(ctx)->cipher_data)
74 
75 static int
camellia_init_key(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int enc)76 camellia_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
77     const unsigned char *iv, int enc)
78 {
79           int ret;
80 
81           ret = Camellia_set_key(key, ctx->key_len * 8, ctx->cipher_data);
82 
83           if (ret < 0) {
84                     EVPerror(EVP_R_CAMELLIA_KEY_SETUP_FAILED);
85                     return 0;
86           }
87 
88           return 1;
89 }
90 
91 static int
camellia_128_cbc_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)92 camellia_128_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
93 {
94           while (inl >= EVP_MAXCHUNK) {
95                     Camellia_cbc_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
96                     inl -= EVP_MAXCHUNK;
97                     in += EVP_MAXCHUNK;
98                     out += EVP_MAXCHUNK;
99           }
100 
101           if (inl)
102                     Camellia_cbc_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
103 
104           return 1;
105 }
106 
107 static int
camellia_128_cfb128_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)108 camellia_128_cfb128_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
109 {
110           size_t chunk = EVP_MAXCHUNK;
111 
112           if (inl < chunk)
113                     chunk = inl;
114 
115           while (inl && inl >= chunk) {
116                     Camellia_cfb128_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
117                     inl -= chunk;
118                     in += chunk;
119                     out += chunk;
120                     if (inl < chunk)
121                               chunk = inl;
122           }
123 
124           return 1;
125 }
126 
127 static int
camellia_128_ecb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)128 camellia_128_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
129 {
130           size_t i, bl;
131 
132           bl = ctx->cipher->block_size;
133 
134           if (inl < bl)
135                     return 1;
136 
137           inl -= bl;
138 
139           for (i = 0; i <= inl; i += bl)
140                     Camellia_ecb_encrypt(in + i, out + i, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->encrypt);
141 
142           return 1;
143 }
144 
145 static int
camellia_128_ofb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)146 camellia_128_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
147 {
148           while (inl >= EVP_MAXCHUNK) {
149                     Camellia_ofb128_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
150                     inl -= EVP_MAXCHUNK;
151                     in += EVP_MAXCHUNK;
152                     out += EVP_MAXCHUNK;
153           }
154 
155           if (inl)
156                     Camellia_ofb128_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
157 
158           return 1;
159 }
160 
161 static const EVP_CIPHER camellia_128_cbc = {
162           .nid = NID_camellia_128_cbc,
163           .block_size = 16,
164           .key_len = 16,
165           .iv_len = 16,
166           .flags = 0 | EVP_CIPH_CBC_MODE,
167           .init = camellia_init_key,
168           .do_cipher = camellia_128_cbc_cipher,
169           .cleanup = NULL,
170           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
171           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
172           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
173           .ctrl = NULL,
174           .app_data = NULL,
175 };
176 
177 const EVP_CIPHER *
EVP_camellia_128_cbc(void)178 EVP_camellia_128_cbc(void)
179 {
180           return &camellia_128_cbc;
181 }
182 
183 static const EVP_CIPHER camellia_128_cfb128 = {
184           .nid = NID_camellia_128_cfb128,
185           .block_size = 1,
186           .key_len = 16,
187           .iv_len = 16,
188           .flags = 0 | EVP_CIPH_CFB_MODE,
189           .init = camellia_init_key,
190           .do_cipher = camellia_128_cfb128_cipher,
191           .cleanup = NULL,
192           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
193           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
194           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
195           .ctrl = NULL,
196           .app_data = NULL,
197 };
198 
199 const EVP_CIPHER *
EVP_camellia_128_cfb128(void)200 EVP_camellia_128_cfb128(void)
201 {
202           return &camellia_128_cfb128;
203 }
204 
205 static const EVP_CIPHER camellia_128_ofb = {
206           .nid = NID_camellia_128_ofb128,
207           .block_size = 1,
208           .key_len = 16,
209           .iv_len = 16,
210           .flags = 0 | EVP_CIPH_OFB_MODE,
211           .init = camellia_init_key,
212           .do_cipher = camellia_128_ofb_cipher,
213           .cleanup = NULL,
214           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
215           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
216           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
217           .ctrl = NULL,
218           .app_data = NULL,
219 };
220 
221 const EVP_CIPHER *
EVP_camellia_128_ofb(void)222 EVP_camellia_128_ofb(void)
223 {
224           return &camellia_128_ofb;
225 }
226 
227 static const EVP_CIPHER camellia_128_ecb = {
228           .nid = NID_camellia_128_ecb,
229           .block_size = 16,
230           .key_len = 16,
231           .iv_len = 0,
232           .flags = 0 | EVP_CIPH_ECB_MODE,
233           .init = camellia_init_key,
234           .do_cipher = camellia_128_ecb_cipher,
235           .cleanup = NULL,
236           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
237           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
238           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
239           .ctrl = NULL,
240           .app_data = NULL,
241 };
242 
243 const EVP_CIPHER *
EVP_camellia_128_ecb(void)244 EVP_camellia_128_ecb(void)
245 {
246           return &camellia_128_ecb;
247 }
248 
249 static int
camellia_192_cbc_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)250 camellia_192_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
251 {
252           while (inl >= EVP_MAXCHUNK) {
253                     Camellia_cbc_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
254                     inl -= EVP_MAXCHUNK;
255                     in += EVP_MAXCHUNK;
256                     out += EVP_MAXCHUNK;
257           }
258 
259           if (inl)
260                     Camellia_cbc_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
261 
262           return 1;
263 }
264 
265 static int
camellia_192_cfb128_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)266 camellia_192_cfb128_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
267 {
268           size_t chunk = EVP_MAXCHUNK;
269 
270           if (inl < chunk)
271                     chunk = inl;
272 
273           while (inl && inl >= chunk) {
274                     Camellia_cfb128_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
275                     inl -= chunk;
276                     in += chunk;
277                     out += chunk;
278                     if (inl < chunk)
279                               chunk = inl;
280           }
281 
282           return 1;
283 }
284 
285 static int
camellia_192_ecb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)286 camellia_192_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
287 {
288           size_t i, bl;
289 
290           bl = ctx->cipher->block_size;
291 
292           if (inl < bl)
293                     return 1;
294 
295           inl -= bl;
296 
297           for (i = 0; i <= inl; i += bl)
298                     Camellia_ecb_encrypt(in + i, out + i, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->encrypt);
299 
300           return 1;
301 }
302 
303 static int
camellia_192_ofb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)304 camellia_192_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
305 {
306           while (inl >= EVP_MAXCHUNK) {
307                     Camellia_ofb128_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
308                     inl -= EVP_MAXCHUNK;
309                     in += EVP_MAXCHUNK;
310                     out += EVP_MAXCHUNK;
311           }
312 
313           if (inl)
314                     Camellia_ofb128_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
315 
316           return 1;
317 }
318 
319 static const EVP_CIPHER camellia_192_cbc = {
320           .nid = NID_camellia_192_cbc,
321           .block_size = 16,
322           .key_len = 24,
323           .iv_len = 16,
324           .flags = 0 | EVP_CIPH_CBC_MODE,
325           .init = camellia_init_key,
326           .do_cipher = camellia_192_cbc_cipher,
327           .cleanup = NULL,
328           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
329           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
330           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
331           .ctrl = NULL,
332           .app_data = NULL,
333 };
334 
335 const EVP_CIPHER *
EVP_camellia_192_cbc(void)336 EVP_camellia_192_cbc(void)
337 {
338           return &camellia_192_cbc;
339 }
340 
341 static const EVP_CIPHER camellia_192_cfb128 = {
342           .nid = NID_camellia_192_cfb128,
343           .block_size = 1,
344           .key_len = 24,
345           .iv_len = 16,
346           .flags = 0 | EVP_CIPH_CFB_MODE,
347           .init = camellia_init_key,
348           .do_cipher = camellia_192_cfb128_cipher,
349           .cleanup = NULL,
350           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
351           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
352           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
353           .ctrl = NULL,
354           .app_data = NULL,
355 };
356 
357 const EVP_CIPHER *
EVP_camellia_192_cfb128(void)358 EVP_camellia_192_cfb128(void)
359 {
360           return &camellia_192_cfb128;
361 }
362 
363 static const EVP_CIPHER camellia_192_ofb = {
364           .nid = NID_camellia_192_ofb128,
365           .block_size = 1,
366           .key_len = 24,
367           .iv_len = 16,
368           .flags = 0 | EVP_CIPH_OFB_MODE,
369           .init = camellia_init_key,
370           .do_cipher = camellia_192_ofb_cipher,
371           .cleanup = NULL,
372           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
373           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
374           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
375           .ctrl = NULL,
376           .app_data = NULL,
377 };
378 
379 const EVP_CIPHER *
EVP_camellia_192_ofb(void)380 EVP_camellia_192_ofb(void)
381 {
382           return &camellia_192_ofb;
383 }
384 
385 static const EVP_CIPHER camellia_192_ecb = {
386           .nid = NID_camellia_192_ecb,
387           .block_size = 16,
388           .key_len = 24,
389           .iv_len = 0,
390           .flags = 0 | EVP_CIPH_ECB_MODE,
391           .init = camellia_init_key,
392           .do_cipher = camellia_192_ecb_cipher,
393           .cleanup = NULL,
394           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
395           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
396           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
397           .ctrl = NULL,
398           .app_data = NULL,
399 };
400 
401 const EVP_CIPHER *
EVP_camellia_192_ecb(void)402 EVP_camellia_192_ecb(void)
403 {
404           return &camellia_192_ecb;
405 }
406 
407 static int
camellia_256_cbc_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)408 camellia_256_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
409 {
410           while (inl >= EVP_MAXCHUNK) {
411                     Camellia_cbc_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
412                     inl -= EVP_MAXCHUNK;
413                     in += EVP_MAXCHUNK;
414                     out += EVP_MAXCHUNK;
415           }
416 
417           if (inl)
418                     Camellia_cbc_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
419 
420           return 1;
421 }
422 
423 static int
camellia_256_cfb128_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)424 camellia_256_cfb128_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
425 {
426           size_t chunk = EVP_MAXCHUNK;
427 
428           if (inl < chunk)
429                     chunk = inl;
430 
431           while (inl && inl >= chunk) {
432                     Camellia_cfb128_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
433                     inl -= chunk;
434                     in += chunk;
435                     out += chunk;
436                     if (inl < chunk)
437                               chunk = inl;
438           }
439 
440           return 1;
441 }
442 
443 static int
camellia_256_ecb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)444 camellia_256_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
445 {
446           size_t i, bl;
447 
448           bl = ctx->cipher->block_size;
449 
450           if (inl < bl)
451                     return 1;
452 
453           inl -= bl;
454 
455           for (i = 0; i <= inl; i += bl)
456                     Camellia_ecb_encrypt(in + i, out + i, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->encrypt);
457 
458           return 1;
459 }
460 
461 static int
camellia_256_ofb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)462 camellia_256_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
463 {
464           while (inl >= EVP_MAXCHUNK) {
465                     Camellia_ofb128_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
466                     inl -= EVP_MAXCHUNK;
467                     in += EVP_MAXCHUNK;
468                     out += EVP_MAXCHUNK;
469           }
470 
471           if (inl)
472                     Camellia_ofb128_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
473 
474           return 1;
475 }
476 
477 static const EVP_CIPHER camellia_256_cbc = {
478           .nid = NID_camellia_256_cbc,
479           .block_size = 16,
480           .key_len = 32,
481           .iv_len = 16,
482           .flags = 0 | EVP_CIPH_CBC_MODE,
483           .init = camellia_init_key,
484           .do_cipher = camellia_256_cbc_cipher,
485           .cleanup = NULL,
486           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
487           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
488           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
489           .ctrl = NULL,
490           .app_data = NULL,
491 };
492 
493 const EVP_CIPHER *
EVP_camellia_256_cbc(void)494 EVP_camellia_256_cbc(void)
495 {
496           return &camellia_256_cbc;
497 }
498 
499 static const EVP_CIPHER camellia_256_cfb128 = {
500           .nid = NID_camellia_256_cfb128,
501           .block_size = 1,
502           .key_len = 32,
503           .iv_len = 16,
504           .flags = 0 | EVP_CIPH_CFB_MODE,
505           .init = camellia_init_key,
506           .do_cipher = camellia_256_cfb128_cipher,
507           .cleanup = NULL,
508           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
509           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
510           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
511           .ctrl = NULL,
512           .app_data = NULL,
513 };
514 
515 const EVP_CIPHER *
EVP_camellia_256_cfb128(void)516 EVP_camellia_256_cfb128(void)
517 {
518           return &camellia_256_cfb128;
519 }
520 
521 static const EVP_CIPHER camellia_256_ofb = {
522           .nid = NID_camellia_256_ofb128,
523           .block_size = 1,
524           .key_len = 32,
525           .iv_len = 16,
526           .flags = 0 | EVP_CIPH_OFB_MODE,
527           .init = camellia_init_key,
528           .do_cipher = camellia_256_ofb_cipher,
529           .cleanup = NULL,
530           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
531           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
532           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
533           .ctrl = NULL,
534           .app_data = NULL,
535 };
536 
537 const EVP_CIPHER *
EVP_camellia_256_ofb(void)538 EVP_camellia_256_ofb(void)
539 {
540           return &camellia_256_ofb;
541 }
542 
543 static const EVP_CIPHER camellia_256_ecb = {
544           .nid = NID_camellia_256_ecb,
545           .block_size = 16,
546           .key_len = 32,
547           .iv_len = 0,
548           .flags = 0 | EVP_CIPH_ECB_MODE,
549           .init = camellia_init_key,
550           .do_cipher = camellia_256_ecb_cipher,
551           .cleanup = NULL,
552           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
553           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
554           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
555           .ctrl = NULL,
556           .app_data = NULL,
557 };
558 
559 const EVP_CIPHER *
EVP_camellia_256_ecb(void)560 EVP_camellia_256_ecb(void)
561 {
562           return &camellia_256_ecb;
563 }
564 
565 static int
camellia_128_cfb1_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)566 camellia_128_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
567 {
568           size_t chunk = EVP_MAXCHUNK;
569 
570           chunk >>= 3;
571 
572           if (inl < chunk)
573                     chunk = inl;
574 
575           while (inl && inl >= chunk) {
576                     Camellia_cfb1_encrypt(in, out, ((1 == 1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ? chunk * 8 : chunk), &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
577                     inl -= chunk;
578                     in += chunk;
579                     out += chunk;
580                     if (inl < chunk)
581                               chunk = inl;
582           }
583 
584           return 1;
585 }
586 
587 static const EVP_CIPHER camellia_128_cfb1 = {
588           .nid = NID_camellia_128_cfb1,
589           .block_size = 1,
590           .key_len = 128/8,
591           .iv_len = 16,
592           .flags = 0 | EVP_CIPH_CFB_MODE,
593           .init = camellia_init_key,
594           .do_cipher = camellia_128_cfb1_cipher,
595           .cleanup = NULL,
596           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
597           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
598           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
599           .ctrl = NULL,
600           .app_data = NULL,
601 };
602 
603 const EVP_CIPHER *
EVP_camellia_128_cfb1(void)604 EVP_camellia_128_cfb1(void)
605 {
606           return &camellia_128_cfb1;
607 }
608 
609 static int
camellia_192_cfb1_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)610 camellia_192_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
611 {
612           size_t chunk = EVP_MAXCHUNK;
613 
614           chunk >>= 3;
615 
616           if (inl < chunk)
617                     chunk = inl;
618 
619           while (inl && inl >= chunk) {
620                     Camellia_cfb1_encrypt(in, out, ((1 == 1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ? chunk * 8 : chunk), &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
621                     inl -= chunk;
622                     in += chunk;
623                     out += chunk;
624                     if (inl < chunk)
625                               chunk = inl;
626           }
627 
628           return 1;
629 }
630 
631 static const EVP_CIPHER camellia_192_cfb1 = {
632           .nid = NID_camellia_192_cfb1,
633           .block_size = 1,
634           .key_len = 192/8,
635           .iv_len = 16,
636           .flags = 0 | EVP_CIPH_CFB_MODE,
637           .init = camellia_init_key,
638           .do_cipher = camellia_192_cfb1_cipher,
639           .cleanup = NULL,
640           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
641           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
642           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
643           .ctrl = NULL,
644           .app_data = NULL,
645 };
646 
647 const EVP_CIPHER *
EVP_camellia_192_cfb1(void)648 EVP_camellia_192_cfb1(void)
649 {
650           return &camellia_192_cfb1;
651 }
652 
653 static int
camellia_256_cfb1_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)654 camellia_256_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
655 {
656           size_t chunk = EVP_MAXCHUNK;
657 
658           chunk >>= 3;
659 
660           if (inl < chunk)
661                     chunk = inl;
662 
663           while (inl && inl >= chunk) {
664                     Camellia_cfb1_encrypt(in, out, ((1 == 1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ? chunk * 8 : chunk), &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
665                     inl -= chunk;
666                     in += chunk;
667                     out += chunk;
668                     if (inl < chunk)
669                               chunk = inl;
670           }
671 
672           return 1;
673 }
674 
675 static const EVP_CIPHER camellia_256_cfb1 = {
676           .nid = NID_camellia_256_cfb1,
677           .block_size = 1,
678           .key_len = 256/8,
679           .iv_len = 16,
680           .flags = 0 | EVP_CIPH_CFB_MODE,
681           .init = camellia_init_key,
682           .do_cipher = camellia_256_cfb1_cipher,
683           .cleanup = NULL,
684           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
685           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
686           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
687           .ctrl = NULL,
688           .app_data = NULL,
689 };
690 
691 const EVP_CIPHER *
EVP_camellia_256_cfb1(void)692 EVP_camellia_256_cfb1(void)
693 {
694           return &camellia_256_cfb1;
695 }
696 
697 
698 static int
camellia_128_cfb8_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)699 camellia_128_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
700 {
701           size_t chunk = EVP_MAXCHUNK;
702 
703           if (inl < chunk)
704                     chunk = inl;
705 
706           while (inl && inl >= chunk) {
707                     Camellia_cfb8_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
708                     inl -= chunk;
709                     in += chunk;
710                     out += chunk;
711                     if (inl < chunk)
712                               chunk = inl;
713           }
714 
715           return 1;
716 }
717 
718 static const EVP_CIPHER camellia_128_cfb8 = {
719           .nid = NID_camellia_128_cfb8,
720           .block_size = 1,
721           .key_len = 128/8,
722           .iv_len = 16,
723           .flags = 0 | EVP_CIPH_CFB_MODE,
724           .init = camellia_init_key,
725           .do_cipher = camellia_128_cfb8_cipher,
726           .cleanup = NULL,
727           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
728           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
729           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
730           .ctrl = NULL,
731           .app_data = NULL,
732 };
733 
734 const EVP_CIPHER *
EVP_camellia_128_cfb8(void)735 EVP_camellia_128_cfb8(void)
736 {
737           return &camellia_128_cfb8;
738 }
739 
740 static int
camellia_192_cfb8_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)741 camellia_192_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
742 {
743           size_t chunk = EVP_MAXCHUNK;
744 
745           if (inl < chunk)
746                     chunk = inl;
747 
748           while (inl && inl >= chunk) {
749                     Camellia_cfb8_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
750                     inl -= chunk;
751                     in += chunk;
752                     out += chunk;
753                     if (inl < chunk)
754                               chunk = inl;
755           }
756 
757           return 1;
758 }
759 
760 static const EVP_CIPHER camellia_192_cfb8 = {
761           .nid = NID_camellia_192_cfb8,
762           .block_size = 1,
763           .key_len = 192/8,
764           .iv_len = 16,
765           .flags = 0 | EVP_CIPH_CFB_MODE,
766           .init = camellia_init_key,
767           .do_cipher = camellia_192_cfb8_cipher,
768           .cleanup = NULL,
769           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
770           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
771           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
772           .ctrl = NULL,
773           .app_data = NULL,
774 };
775 
776 const EVP_CIPHER *
EVP_camellia_192_cfb8(void)777 EVP_camellia_192_cfb8(void)
778 {
779           return &camellia_192_cfb8;
780 }
781 
782 static int
camellia_256_cfb8_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)783 camellia_256_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
784 {
785           size_t chunk = EVP_MAXCHUNK;
786 
787           if (inl < chunk)
788                     chunk = inl;
789 
790           while (inl && inl >= chunk) {
791                     Camellia_cfb8_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
792                     inl -= chunk;
793                     in += chunk;
794                     out += chunk;
795                     if (inl < chunk)
796                               chunk = inl;
797           }
798 
799           return 1;
800 }
801 
802 static const EVP_CIPHER camellia_256_cfb8 = {
803           .nid = NID_camellia_256_cfb8,
804           .block_size = 1,
805           .key_len = 256/8,
806           .iv_len = 16,
807           .flags = 0 | EVP_CIPH_CFB_MODE,
808           .init = camellia_init_key,
809           .do_cipher = camellia_256_cfb8_cipher,
810           .cleanup = NULL,
811           .ctx_size = sizeof(EVP_CAMELLIA_KEY),
812           .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
813           .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
814           .ctrl = NULL,
815           .app_data = NULL,
816 };
817 
818 const EVP_CIPHER *
EVP_camellia_256_cfb8(void)819 EVP_camellia_256_cfb8(void)
820 {
821           return &camellia_256_cfb8;
822 }
823 #endif
824