1*9bac3682Sbeck /* $OpenBSD: e_camellia.c,v 1.20 2024/04/09 13:52:41 beck Exp $ */
25650a0e1Sdjm /* ====================================================================
35650a0e1Sdjm * Copyright (c) 2006 The OpenSSL Project. All rights reserved.
45650a0e1Sdjm *
55650a0e1Sdjm * Redistribution and use in source and binary forms, with or without
65650a0e1Sdjm * modification, are permitted provided that the following conditions
75650a0e1Sdjm * are met:
85650a0e1Sdjm *
95650a0e1Sdjm * 1. Redistributions of source code must retain the above copyright
105650a0e1Sdjm * notice, this list of conditions and the following disclaimer.
115650a0e1Sdjm *
125650a0e1Sdjm * 2. Redistributions in binary form must reproduce the above copyright
135650a0e1Sdjm * notice, this list of conditions and the following disclaimer in
145650a0e1Sdjm * the documentation and/or other materials provided with the
155650a0e1Sdjm * distribution.
165650a0e1Sdjm *
175650a0e1Sdjm * 3. All advertising materials mentioning features or use of this
185650a0e1Sdjm * software must display the following acknowledgment:
195650a0e1Sdjm * "This product includes software developed by the OpenSSL Project
205650a0e1Sdjm * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
215650a0e1Sdjm *
225650a0e1Sdjm * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
235650a0e1Sdjm * endorse or promote products derived from this software without
245650a0e1Sdjm * prior written permission. For written permission, please contact
255650a0e1Sdjm * openssl-core@openssl.org.
265650a0e1Sdjm *
275650a0e1Sdjm * 5. Products derived from this software may not be called "OpenSSL"
285650a0e1Sdjm * nor may "OpenSSL" appear in their names without prior written
295650a0e1Sdjm * permission of the OpenSSL Project.
305650a0e1Sdjm *
315650a0e1Sdjm * 6. Redistributions of any form whatsoever must retain the following
325650a0e1Sdjm * acknowledgment:
335650a0e1Sdjm * "This product includes software developed by the OpenSSL Project
345650a0e1Sdjm * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
355650a0e1Sdjm *
365650a0e1Sdjm * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
375650a0e1Sdjm * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
385650a0e1Sdjm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
395650a0e1Sdjm * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
405650a0e1Sdjm * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
415650a0e1Sdjm * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
425650a0e1Sdjm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
435650a0e1Sdjm * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
445650a0e1Sdjm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
455650a0e1Sdjm * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
465650a0e1Sdjm * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
475650a0e1Sdjm * OF THE POSSIBILITY OF SUCH DAMAGE.
485650a0e1Sdjm * ====================================================================
495650a0e1Sdjm *
505650a0e1Sdjm * This product includes cryptographic software written by Eric Young
515650a0e1Sdjm * (eay@cryptsoft.com). This product includes software written by Tim
525650a0e1Sdjm * Hudson (tjh@cryptsoft.com).
535650a0e1Sdjm *
545650a0e1Sdjm */
555650a0e1Sdjm
568cf4d6a6Sjsing #include <string.h>
578cf4d6a6Sjsing
585650a0e1Sdjm #include <openssl/opensslconf.h>
598cf4d6a6Sjsing
605650a0e1Sdjm #ifndef OPENSSL_NO_CAMELLIA
615650a0e1Sdjm #include <openssl/evp.h>
625650a0e1Sdjm #include <openssl/err.h>
635650a0e1Sdjm #include <openssl/camellia.h>
64bc366ef8Stb
65c9675a23Stb #include "evp_local.h"
665650a0e1Sdjm
675650a0e1Sdjm /* Camellia subkey Structure */
68ba3920edSjsing typedef struct {
695650a0e1Sdjm CAMELLIA_KEY ks;
705650a0e1Sdjm } EVP_CAMELLIA_KEY;
715650a0e1Sdjm
725650a0e1Sdjm /* Attribute operation for Camellia */
738ee7443bSjsing #define data(ctx) ((EVP_CAMELLIA_KEY *)(ctx)->cipher_data)
745650a0e1Sdjm
758ee7443bSjsing static int
camellia_init_key(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int enc)765b4a16c0Sjsing camellia_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
775b4a16c0Sjsing const unsigned char *iv, int enc)
785b4a16c0Sjsing {
795b4a16c0Sjsing int ret;
805b4a16c0Sjsing
815b4a16c0Sjsing ret = Camellia_set_key(key, ctx->key_len * 8, ctx->cipher_data);
825b4a16c0Sjsing
835b4a16c0Sjsing if (ret < 0) {
845b4a16c0Sjsing EVPerror(EVP_R_CAMELLIA_KEY_SETUP_FAILED);
855b4a16c0Sjsing return 0;
865b4a16c0Sjsing }
875b4a16c0Sjsing
885b4a16c0Sjsing return 1;
895b4a16c0Sjsing }
905b4a16c0Sjsing
915b4a16c0Sjsing static int
camellia_128_cbc_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)928ee7443bSjsing camellia_128_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
938ee7443bSjsing {
948ee7443bSjsing while (inl >= EVP_MAXCHUNK) {
95d5650aa3Sjsing Camellia_cbc_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
968ee7443bSjsing inl -= EVP_MAXCHUNK;
978ee7443bSjsing in += EVP_MAXCHUNK;
988ee7443bSjsing out += EVP_MAXCHUNK;
998ee7443bSjsing }
1008ee7443bSjsing
1018ee7443bSjsing if (inl)
102d5650aa3Sjsing Camellia_cbc_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
1038ee7443bSjsing
1048ee7443bSjsing return 1;
1058ee7443bSjsing }
1068ee7443bSjsing
1078ee7443bSjsing static int
camellia_128_cfb128_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)1088ee7443bSjsing camellia_128_cfb128_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
1098ee7443bSjsing {
1108ee7443bSjsing size_t chunk = EVP_MAXCHUNK;
1118ee7443bSjsing
1128ee7443bSjsing if (inl < chunk)
1138ee7443bSjsing chunk = inl;
1148ee7443bSjsing
1158ee7443bSjsing while (inl && inl >= chunk) {
1167a606269Sjsing Camellia_cfb128_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
1178ee7443bSjsing inl -= chunk;
1188ee7443bSjsing in += chunk;
1198ee7443bSjsing out += chunk;
1208ee7443bSjsing if (inl < chunk)
1218ee7443bSjsing chunk = inl;
1228ee7443bSjsing }
1238ee7443bSjsing
1248ee7443bSjsing return 1;
1258ee7443bSjsing }
1268ee7443bSjsing
1278ee7443bSjsing static int
camellia_128_ecb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)1288ee7443bSjsing camellia_128_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
1298ee7443bSjsing {
1308ee7443bSjsing size_t i, bl;
1318ee7443bSjsing
1328ee7443bSjsing bl = ctx->cipher->block_size;
1338ee7443bSjsing
1348ee7443bSjsing if (inl < bl)
1358ee7443bSjsing return 1;
1368ee7443bSjsing
1378ee7443bSjsing inl -= bl;
1388ee7443bSjsing
1398ee7443bSjsing for (i = 0; i <= inl; i += bl)
1408ee7443bSjsing Camellia_ecb_encrypt(in + i, out + i, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->encrypt);
1418ee7443bSjsing
1428ee7443bSjsing return 1;
1438ee7443bSjsing }
1448ee7443bSjsing
1458ee7443bSjsing static int
camellia_128_ofb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)1468ee7443bSjsing camellia_128_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
1478ee7443bSjsing {
1488ee7443bSjsing while (inl >= EVP_MAXCHUNK) {
149d5650aa3Sjsing Camellia_ofb128_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
1508ee7443bSjsing inl -= EVP_MAXCHUNK;
1518ee7443bSjsing in += EVP_MAXCHUNK;
1528ee7443bSjsing out += EVP_MAXCHUNK;
1538ee7443bSjsing }
1548ee7443bSjsing
1558ee7443bSjsing if (inl)
156d5650aa3Sjsing Camellia_ofb128_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
1578ee7443bSjsing
1588ee7443bSjsing return 1;
1598ee7443bSjsing }
1608ee7443bSjsing
1618ee7443bSjsing static const EVP_CIPHER camellia_128_cbc = {
1628ee7443bSjsing .nid = NID_camellia_128_cbc,
1638ee7443bSjsing .block_size = 16,
1648ee7443bSjsing .key_len = 16,
1658ee7443bSjsing .iv_len = 16,
1668ee7443bSjsing .flags = 0 | EVP_CIPH_CBC_MODE,
1678ee7443bSjsing .init = camellia_init_key,
1688ee7443bSjsing .do_cipher = camellia_128_cbc_cipher,
1698ee7443bSjsing .cleanup = NULL,
1708ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
1718ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
1728ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
1738ee7443bSjsing .ctrl = NULL,
1748ee7443bSjsing };
1758ee7443bSjsing
1768ee7443bSjsing const EVP_CIPHER *
EVP_camellia_128_cbc(void)1778ee7443bSjsing EVP_camellia_128_cbc(void)
1788ee7443bSjsing {
1798ee7443bSjsing return &camellia_128_cbc;
1808ee7443bSjsing }
181*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_128_cbc);
1828ee7443bSjsing
1838ee7443bSjsing static const EVP_CIPHER camellia_128_cfb128 = {
1848ee7443bSjsing .nid = NID_camellia_128_cfb128,
1858ee7443bSjsing .block_size = 1,
1868ee7443bSjsing .key_len = 16,
1878ee7443bSjsing .iv_len = 16,
1888ee7443bSjsing .flags = 0 | EVP_CIPH_CFB_MODE,
1898ee7443bSjsing .init = camellia_init_key,
1908ee7443bSjsing .do_cipher = camellia_128_cfb128_cipher,
1918ee7443bSjsing .cleanup = NULL,
1928ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
1938ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
1948ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
1958ee7443bSjsing .ctrl = NULL,
1968ee7443bSjsing };
1978ee7443bSjsing
1988ee7443bSjsing const EVP_CIPHER *
EVP_camellia_128_cfb128(void)1998ee7443bSjsing EVP_camellia_128_cfb128(void)
2008ee7443bSjsing {
2018ee7443bSjsing return &camellia_128_cfb128;
2028ee7443bSjsing }
203*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_128_cfb128);
2048ee7443bSjsing
2058ee7443bSjsing static const EVP_CIPHER camellia_128_ofb = {
2068ee7443bSjsing .nid = NID_camellia_128_ofb128,
2078ee7443bSjsing .block_size = 1,
2088ee7443bSjsing .key_len = 16,
2098ee7443bSjsing .iv_len = 16,
2108ee7443bSjsing .flags = 0 | EVP_CIPH_OFB_MODE,
2118ee7443bSjsing .init = camellia_init_key,
2128ee7443bSjsing .do_cipher = camellia_128_ofb_cipher,
2138ee7443bSjsing .cleanup = NULL,
2148ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
2158ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
2168ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
2178ee7443bSjsing .ctrl = NULL,
2188ee7443bSjsing };
2198ee7443bSjsing
2208ee7443bSjsing const EVP_CIPHER *
EVP_camellia_128_ofb(void)2218ee7443bSjsing EVP_camellia_128_ofb(void)
2228ee7443bSjsing {
2238ee7443bSjsing return &camellia_128_ofb;
2248ee7443bSjsing }
225*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_128_ofb);
2268ee7443bSjsing
2278ee7443bSjsing static const EVP_CIPHER camellia_128_ecb = {
2288ee7443bSjsing .nid = NID_camellia_128_ecb,
2298ee7443bSjsing .block_size = 16,
2308ee7443bSjsing .key_len = 16,
2318ee7443bSjsing .iv_len = 0,
2328ee7443bSjsing .flags = 0 | EVP_CIPH_ECB_MODE,
2338ee7443bSjsing .init = camellia_init_key,
2348ee7443bSjsing .do_cipher = camellia_128_ecb_cipher,
2358ee7443bSjsing .cleanup = NULL,
2368ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
2378ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
2388ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
2398ee7443bSjsing .ctrl = NULL,
2408ee7443bSjsing };
2418ee7443bSjsing
2428ee7443bSjsing const EVP_CIPHER *
EVP_camellia_128_ecb(void)2438ee7443bSjsing EVP_camellia_128_ecb(void)
2448ee7443bSjsing {
2458ee7443bSjsing return &camellia_128_ecb;
2468ee7443bSjsing }
247*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_128_ecb);
2488ee7443bSjsing
2498ee7443bSjsing static int
camellia_192_cbc_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)2508ee7443bSjsing camellia_192_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
2518ee7443bSjsing {
2528ee7443bSjsing while (inl >= EVP_MAXCHUNK) {
253d5650aa3Sjsing Camellia_cbc_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
2548ee7443bSjsing inl -= EVP_MAXCHUNK;
2558ee7443bSjsing in += EVP_MAXCHUNK;
2568ee7443bSjsing out += EVP_MAXCHUNK;
2578ee7443bSjsing }
2588ee7443bSjsing
2598ee7443bSjsing if (inl)
260d5650aa3Sjsing Camellia_cbc_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
2618ee7443bSjsing
2628ee7443bSjsing return 1;
2638ee7443bSjsing }
2648ee7443bSjsing
2658ee7443bSjsing static int
camellia_192_cfb128_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)2668ee7443bSjsing camellia_192_cfb128_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
2678ee7443bSjsing {
2688ee7443bSjsing size_t chunk = EVP_MAXCHUNK;
2698ee7443bSjsing
2708ee7443bSjsing if (inl < chunk)
2718ee7443bSjsing chunk = inl;
2728ee7443bSjsing
2738ee7443bSjsing while (inl && inl >= chunk) {
2747a606269Sjsing Camellia_cfb128_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
2758ee7443bSjsing inl -= chunk;
2768ee7443bSjsing in += chunk;
2778ee7443bSjsing out += chunk;
2788ee7443bSjsing if (inl < chunk)
2798ee7443bSjsing chunk = inl;
2808ee7443bSjsing }
2818ee7443bSjsing
2828ee7443bSjsing return 1;
2838ee7443bSjsing }
2848ee7443bSjsing
2858ee7443bSjsing static int
camellia_192_ecb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)2868ee7443bSjsing camellia_192_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
2878ee7443bSjsing {
2888ee7443bSjsing size_t i, bl;
2898ee7443bSjsing
2908ee7443bSjsing bl = ctx->cipher->block_size;
2918ee7443bSjsing
2928ee7443bSjsing if (inl < bl)
2938ee7443bSjsing return 1;
2948ee7443bSjsing
2958ee7443bSjsing inl -= bl;
2968ee7443bSjsing
2978ee7443bSjsing for (i = 0; i <= inl; i += bl)
2988ee7443bSjsing Camellia_ecb_encrypt(in + i, out + i, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->encrypt);
2998ee7443bSjsing
3008ee7443bSjsing return 1;
3018ee7443bSjsing }
3028ee7443bSjsing
3038ee7443bSjsing static int
camellia_192_ofb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)3048ee7443bSjsing camellia_192_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
3058ee7443bSjsing {
3068ee7443bSjsing while (inl >= EVP_MAXCHUNK) {
307d5650aa3Sjsing Camellia_ofb128_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
3088ee7443bSjsing inl -= EVP_MAXCHUNK;
3098ee7443bSjsing in += EVP_MAXCHUNK;
3108ee7443bSjsing out += EVP_MAXCHUNK;
3118ee7443bSjsing }
3128ee7443bSjsing
3138ee7443bSjsing if (inl)
314d5650aa3Sjsing Camellia_ofb128_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
3158ee7443bSjsing
3168ee7443bSjsing return 1;
3178ee7443bSjsing }
3188ee7443bSjsing
3198ee7443bSjsing static const EVP_CIPHER camellia_192_cbc = {
3208ee7443bSjsing .nid = NID_camellia_192_cbc,
3218ee7443bSjsing .block_size = 16,
3228ee7443bSjsing .key_len = 24,
3238ee7443bSjsing .iv_len = 16,
3248ee7443bSjsing .flags = 0 | EVP_CIPH_CBC_MODE,
3258ee7443bSjsing .init = camellia_init_key,
3268ee7443bSjsing .do_cipher = camellia_192_cbc_cipher,
3278ee7443bSjsing .cleanup = NULL,
3288ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
3298ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
3308ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
3318ee7443bSjsing .ctrl = NULL,
3328ee7443bSjsing };
3338ee7443bSjsing
3348ee7443bSjsing const EVP_CIPHER *
EVP_camellia_192_cbc(void)3358ee7443bSjsing EVP_camellia_192_cbc(void)
3368ee7443bSjsing {
3378ee7443bSjsing return &camellia_192_cbc;
3388ee7443bSjsing }
339*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_192_cbc);
3408ee7443bSjsing
3418ee7443bSjsing static const EVP_CIPHER camellia_192_cfb128 = {
3428ee7443bSjsing .nid = NID_camellia_192_cfb128,
3438ee7443bSjsing .block_size = 1,
3448ee7443bSjsing .key_len = 24,
3458ee7443bSjsing .iv_len = 16,
3468ee7443bSjsing .flags = 0 | EVP_CIPH_CFB_MODE,
3478ee7443bSjsing .init = camellia_init_key,
3488ee7443bSjsing .do_cipher = camellia_192_cfb128_cipher,
3498ee7443bSjsing .cleanup = NULL,
3508ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
3518ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
3528ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
3538ee7443bSjsing .ctrl = NULL,
3548ee7443bSjsing };
3558ee7443bSjsing
3568ee7443bSjsing const EVP_CIPHER *
EVP_camellia_192_cfb128(void)3578ee7443bSjsing EVP_camellia_192_cfb128(void)
3588ee7443bSjsing {
3598ee7443bSjsing return &camellia_192_cfb128;
3608ee7443bSjsing }
361*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_192_cfb128);
3628ee7443bSjsing
3638ee7443bSjsing static const EVP_CIPHER camellia_192_ofb = {
3648ee7443bSjsing .nid = NID_camellia_192_ofb128,
3658ee7443bSjsing .block_size = 1,
3668ee7443bSjsing .key_len = 24,
3678ee7443bSjsing .iv_len = 16,
3688ee7443bSjsing .flags = 0 | EVP_CIPH_OFB_MODE,
3698ee7443bSjsing .init = camellia_init_key,
3708ee7443bSjsing .do_cipher = camellia_192_ofb_cipher,
3718ee7443bSjsing .cleanup = NULL,
3728ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
3738ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
3748ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
3758ee7443bSjsing .ctrl = NULL,
3768ee7443bSjsing };
3778ee7443bSjsing
3788ee7443bSjsing const EVP_CIPHER *
EVP_camellia_192_ofb(void)3798ee7443bSjsing EVP_camellia_192_ofb(void)
3808ee7443bSjsing {
3818ee7443bSjsing return &camellia_192_ofb;
3828ee7443bSjsing }
383*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_192_ofb);
3848ee7443bSjsing
3858ee7443bSjsing static const EVP_CIPHER camellia_192_ecb = {
3868ee7443bSjsing .nid = NID_camellia_192_ecb,
3878ee7443bSjsing .block_size = 16,
3888ee7443bSjsing .key_len = 24,
3898ee7443bSjsing .iv_len = 0,
3908ee7443bSjsing .flags = 0 | EVP_CIPH_ECB_MODE,
3918ee7443bSjsing .init = camellia_init_key,
3928ee7443bSjsing .do_cipher = camellia_192_ecb_cipher,
3938ee7443bSjsing .cleanup = NULL,
3948ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
3958ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
3968ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
3978ee7443bSjsing .ctrl = NULL,
3988ee7443bSjsing };
3998ee7443bSjsing
4008ee7443bSjsing const EVP_CIPHER *
EVP_camellia_192_ecb(void)4018ee7443bSjsing EVP_camellia_192_ecb(void)
4028ee7443bSjsing {
4038ee7443bSjsing return &camellia_192_ecb;
4048ee7443bSjsing }
405*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_192_ecb);
4068ee7443bSjsing
4078ee7443bSjsing static int
camellia_256_cbc_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)4088ee7443bSjsing camellia_256_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
4098ee7443bSjsing {
4108ee7443bSjsing while (inl >= EVP_MAXCHUNK) {
411d5650aa3Sjsing Camellia_cbc_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
4128ee7443bSjsing inl -= EVP_MAXCHUNK;
4138ee7443bSjsing in += EVP_MAXCHUNK;
4148ee7443bSjsing out += EVP_MAXCHUNK;
4158ee7443bSjsing }
4168ee7443bSjsing
4178ee7443bSjsing if (inl)
418d5650aa3Sjsing Camellia_cbc_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, ctx->encrypt);
4198ee7443bSjsing
4208ee7443bSjsing return 1;
4218ee7443bSjsing }
4228ee7443bSjsing
4238ee7443bSjsing static int
camellia_256_cfb128_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)4248ee7443bSjsing camellia_256_cfb128_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
4258ee7443bSjsing {
4268ee7443bSjsing size_t chunk = EVP_MAXCHUNK;
4278ee7443bSjsing
4288ee7443bSjsing if (inl < chunk)
4298ee7443bSjsing chunk = inl;
4308ee7443bSjsing
4318ee7443bSjsing while (inl && inl >= chunk) {
4327a606269Sjsing Camellia_cfb128_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
4338ee7443bSjsing inl -= chunk;
4348ee7443bSjsing in += chunk;
4358ee7443bSjsing out += chunk;
4368ee7443bSjsing if (inl < chunk)
4378ee7443bSjsing chunk = inl;
4388ee7443bSjsing }
4398ee7443bSjsing
4408ee7443bSjsing return 1;
4418ee7443bSjsing }
4428ee7443bSjsing
4438ee7443bSjsing static int
camellia_256_ecb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)4448ee7443bSjsing camellia_256_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
4458ee7443bSjsing {
4468ee7443bSjsing size_t i, bl;
4478ee7443bSjsing
4488ee7443bSjsing bl = ctx->cipher->block_size;
4498ee7443bSjsing
4508ee7443bSjsing if (inl < bl)
4518ee7443bSjsing return 1;
4528ee7443bSjsing
4538ee7443bSjsing inl -= bl;
4548ee7443bSjsing
4558ee7443bSjsing for (i = 0; i <= inl; i += bl)
4568ee7443bSjsing Camellia_ecb_encrypt(in + i, out + i, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->encrypt);
4578ee7443bSjsing
4588ee7443bSjsing return 1;
4598ee7443bSjsing }
4608ee7443bSjsing
4618ee7443bSjsing static int
camellia_256_ofb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)4628ee7443bSjsing camellia_256_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
4638ee7443bSjsing {
4648ee7443bSjsing while (inl >= EVP_MAXCHUNK) {
465d5650aa3Sjsing Camellia_ofb128_encrypt(in, out, EVP_MAXCHUNK, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
4668ee7443bSjsing inl -= EVP_MAXCHUNK;
4678ee7443bSjsing in += EVP_MAXCHUNK;
4688ee7443bSjsing out += EVP_MAXCHUNK;
4698ee7443bSjsing }
4708ee7443bSjsing
4718ee7443bSjsing if (inl)
472d5650aa3Sjsing Camellia_ofb128_encrypt(in, out, inl, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num);
4738ee7443bSjsing
4748ee7443bSjsing return 1;
4758ee7443bSjsing }
4768ee7443bSjsing
4778ee7443bSjsing static const EVP_CIPHER camellia_256_cbc = {
4788ee7443bSjsing .nid = NID_camellia_256_cbc,
4798ee7443bSjsing .block_size = 16,
4808ee7443bSjsing .key_len = 32,
4818ee7443bSjsing .iv_len = 16,
4828ee7443bSjsing .flags = 0 | EVP_CIPH_CBC_MODE,
4838ee7443bSjsing .init = camellia_init_key,
4848ee7443bSjsing .do_cipher = camellia_256_cbc_cipher,
4858ee7443bSjsing .cleanup = NULL,
4868ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
4878ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
4888ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
4898ee7443bSjsing .ctrl = NULL,
4908ee7443bSjsing };
4918ee7443bSjsing
4928ee7443bSjsing const EVP_CIPHER *
EVP_camellia_256_cbc(void)4938ee7443bSjsing EVP_camellia_256_cbc(void)
4948ee7443bSjsing {
4958ee7443bSjsing return &camellia_256_cbc;
4968ee7443bSjsing }
497*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_256_cbc);
4988ee7443bSjsing
4998ee7443bSjsing static const EVP_CIPHER camellia_256_cfb128 = {
5008ee7443bSjsing .nid = NID_camellia_256_cfb128,
5018ee7443bSjsing .block_size = 1,
5028ee7443bSjsing .key_len = 32,
5038ee7443bSjsing .iv_len = 16,
5048ee7443bSjsing .flags = 0 | EVP_CIPH_CFB_MODE,
5058ee7443bSjsing .init = camellia_init_key,
5068ee7443bSjsing .do_cipher = camellia_256_cfb128_cipher,
5078ee7443bSjsing .cleanup = NULL,
5088ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
5098ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
5108ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
5118ee7443bSjsing .ctrl = NULL,
5128ee7443bSjsing };
5138ee7443bSjsing
5148ee7443bSjsing const EVP_CIPHER *
EVP_camellia_256_cfb128(void)5158ee7443bSjsing EVP_camellia_256_cfb128(void)
5168ee7443bSjsing {
5178ee7443bSjsing return &camellia_256_cfb128;
5188ee7443bSjsing }
519*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_256_cfb128);
5208ee7443bSjsing
5218ee7443bSjsing static const EVP_CIPHER camellia_256_ofb = {
5228ee7443bSjsing .nid = NID_camellia_256_ofb128,
5238ee7443bSjsing .block_size = 1,
5248ee7443bSjsing .key_len = 32,
5258ee7443bSjsing .iv_len = 16,
5268ee7443bSjsing .flags = 0 | EVP_CIPH_OFB_MODE,
5278ee7443bSjsing .init = camellia_init_key,
5288ee7443bSjsing .do_cipher = camellia_256_ofb_cipher,
5298ee7443bSjsing .cleanup = NULL,
5308ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
5318ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
5328ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
5338ee7443bSjsing .ctrl = NULL,
5348ee7443bSjsing };
5358ee7443bSjsing
5368ee7443bSjsing const EVP_CIPHER *
EVP_camellia_256_ofb(void)5378ee7443bSjsing EVP_camellia_256_ofb(void)
5388ee7443bSjsing {
5398ee7443bSjsing return &camellia_256_ofb;
5408ee7443bSjsing }
541*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_256_ofb);
5428ee7443bSjsing
5438ee7443bSjsing static const EVP_CIPHER camellia_256_ecb = {
5448ee7443bSjsing .nid = NID_camellia_256_ecb,
5458ee7443bSjsing .block_size = 16,
5468ee7443bSjsing .key_len = 32,
5478ee7443bSjsing .iv_len = 0,
5488ee7443bSjsing .flags = 0 | EVP_CIPH_ECB_MODE,
5498ee7443bSjsing .init = camellia_init_key,
5508ee7443bSjsing .do_cipher = camellia_256_ecb_cipher,
5518ee7443bSjsing .cleanup = NULL,
5528ee7443bSjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
5538ee7443bSjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
5548ee7443bSjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
5558ee7443bSjsing .ctrl = NULL,
5568ee7443bSjsing };
5578ee7443bSjsing
5588ee7443bSjsing const EVP_CIPHER *
EVP_camellia_256_ecb(void)5598ee7443bSjsing EVP_camellia_256_ecb(void)
5608ee7443bSjsing {
5618ee7443bSjsing return &camellia_256_ecb;
5628ee7443bSjsing }
563*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_256_ecb);
5648ee7443bSjsing
56578539ee5Sjsing static int
camellia_128_cfb1_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)56678539ee5Sjsing camellia_128_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
56778539ee5Sjsing {
56878539ee5Sjsing size_t chunk = EVP_MAXCHUNK;
5695650a0e1Sdjm
57078539ee5Sjsing chunk >>= 3;
5715650a0e1Sdjm
57278539ee5Sjsing if (inl < chunk)
57378539ee5Sjsing chunk = inl;
5745650a0e1Sdjm
57578539ee5Sjsing while (inl && inl >= chunk) {
5767a606269Sjsing 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);
57778539ee5Sjsing inl -= chunk;
57878539ee5Sjsing in += chunk;
57978539ee5Sjsing out += chunk;
58078539ee5Sjsing if (inl < chunk)
58178539ee5Sjsing chunk = inl;
58278539ee5Sjsing }
5835650a0e1Sdjm
58478539ee5Sjsing return 1;
58578539ee5Sjsing }
58678539ee5Sjsing
58778539ee5Sjsing static const EVP_CIPHER camellia_128_cfb1 = {
58878539ee5Sjsing .nid = NID_camellia_128_cfb1,
58978539ee5Sjsing .block_size = 1,
59078539ee5Sjsing .key_len = 128/8,
59178539ee5Sjsing .iv_len = 16,
59278539ee5Sjsing .flags = 0 | EVP_CIPH_CFB_MODE,
59378539ee5Sjsing .init = camellia_init_key,
59478539ee5Sjsing .do_cipher = camellia_128_cfb1_cipher,
59578539ee5Sjsing .cleanup = NULL,
59678539ee5Sjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
59778539ee5Sjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
59878539ee5Sjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
59978539ee5Sjsing .ctrl = NULL,
60078539ee5Sjsing };
60178539ee5Sjsing
60278539ee5Sjsing const EVP_CIPHER *
EVP_camellia_128_cfb1(void)60378539ee5Sjsing EVP_camellia_128_cfb1(void)
60478539ee5Sjsing {
60578539ee5Sjsing return &camellia_128_cfb1;
60678539ee5Sjsing }
607*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_128_cfb1);
60878539ee5Sjsing
60978539ee5Sjsing static int
camellia_192_cfb1_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)61078539ee5Sjsing camellia_192_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
61178539ee5Sjsing {
61278539ee5Sjsing size_t chunk = EVP_MAXCHUNK;
61378539ee5Sjsing
61478539ee5Sjsing chunk >>= 3;
61578539ee5Sjsing
61678539ee5Sjsing if (inl < chunk)
61778539ee5Sjsing chunk = inl;
61878539ee5Sjsing
61978539ee5Sjsing while (inl && inl >= chunk) {
6207a606269Sjsing 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);
62178539ee5Sjsing inl -= chunk;
62278539ee5Sjsing in += chunk;
62378539ee5Sjsing out += chunk;
62478539ee5Sjsing if (inl < chunk)
62578539ee5Sjsing chunk = inl;
62678539ee5Sjsing }
62778539ee5Sjsing
62878539ee5Sjsing return 1;
62978539ee5Sjsing }
63078539ee5Sjsing
63178539ee5Sjsing static const EVP_CIPHER camellia_192_cfb1 = {
63278539ee5Sjsing .nid = NID_camellia_192_cfb1,
63378539ee5Sjsing .block_size = 1,
63478539ee5Sjsing .key_len = 192/8,
63578539ee5Sjsing .iv_len = 16,
63678539ee5Sjsing .flags = 0 | EVP_CIPH_CFB_MODE,
63778539ee5Sjsing .init = camellia_init_key,
63878539ee5Sjsing .do_cipher = camellia_192_cfb1_cipher,
63978539ee5Sjsing .cleanup = NULL,
64078539ee5Sjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
64178539ee5Sjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
64278539ee5Sjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
64378539ee5Sjsing .ctrl = NULL,
64478539ee5Sjsing };
64578539ee5Sjsing
64678539ee5Sjsing const EVP_CIPHER *
EVP_camellia_192_cfb1(void)64778539ee5Sjsing EVP_camellia_192_cfb1(void)
64878539ee5Sjsing {
64978539ee5Sjsing return &camellia_192_cfb1;
65078539ee5Sjsing }
651*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_192_cfb1);
65278539ee5Sjsing
65378539ee5Sjsing static int
camellia_256_cfb1_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)65478539ee5Sjsing camellia_256_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
65578539ee5Sjsing {
65678539ee5Sjsing size_t chunk = EVP_MAXCHUNK;
65778539ee5Sjsing
65878539ee5Sjsing chunk >>= 3;
65978539ee5Sjsing
66078539ee5Sjsing if (inl < chunk)
66178539ee5Sjsing chunk = inl;
66278539ee5Sjsing
66378539ee5Sjsing while (inl && inl >= chunk) {
6647a606269Sjsing 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);
66578539ee5Sjsing inl -= chunk;
66678539ee5Sjsing in += chunk;
66778539ee5Sjsing out += chunk;
66878539ee5Sjsing if (inl < chunk)
66978539ee5Sjsing chunk = inl;
67078539ee5Sjsing }
67178539ee5Sjsing
67278539ee5Sjsing return 1;
67378539ee5Sjsing }
67478539ee5Sjsing
67578539ee5Sjsing static const EVP_CIPHER camellia_256_cfb1 = {
67678539ee5Sjsing .nid = NID_camellia_256_cfb1,
67778539ee5Sjsing .block_size = 1,
67878539ee5Sjsing .key_len = 256/8,
67978539ee5Sjsing .iv_len = 16,
68078539ee5Sjsing .flags = 0 | EVP_CIPH_CFB_MODE,
68178539ee5Sjsing .init = camellia_init_key,
68278539ee5Sjsing .do_cipher = camellia_256_cfb1_cipher,
68378539ee5Sjsing .cleanup = NULL,
68478539ee5Sjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
68578539ee5Sjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
68678539ee5Sjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
68778539ee5Sjsing .ctrl = NULL,
68878539ee5Sjsing };
68978539ee5Sjsing
69078539ee5Sjsing const EVP_CIPHER *
EVP_camellia_256_cfb1(void)69178539ee5Sjsing EVP_camellia_256_cfb1(void)
69278539ee5Sjsing {
69378539ee5Sjsing return &camellia_256_cfb1;
69478539ee5Sjsing }
695*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_256_cfb1);
69678539ee5Sjsing
69778539ee5Sjsing
69878539ee5Sjsing static int
camellia_128_cfb8_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)69978539ee5Sjsing camellia_128_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
70078539ee5Sjsing {
70178539ee5Sjsing size_t chunk = EVP_MAXCHUNK;
70278539ee5Sjsing
70378539ee5Sjsing if (inl < chunk)
70478539ee5Sjsing chunk = inl;
70578539ee5Sjsing
70678539ee5Sjsing while (inl && inl >= chunk) {
7077a606269Sjsing Camellia_cfb8_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
70878539ee5Sjsing inl -= chunk;
70978539ee5Sjsing in += chunk;
71078539ee5Sjsing out += chunk;
71178539ee5Sjsing if (inl < chunk)
71278539ee5Sjsing chunk = inl;
71378539ee5Sjsing }
71478539ee5Sjsing
71578539ee5Sjsing return 1;
71678539ee5Sjsing }
71778539ee5Sjsing
71878539ee5Sjsing static const EVP_CIPHER camellia_128_cfb8 = {
71978539ee5Sjsing .nid = NID_camellia_128_cfb8,
72078539ee5Sjsing .block_size = 1,
72178539ee5Sjsing .key_len = 128/8,
72278539ee5Sjsing .iv_len = 16,
72378539ee5Sjsing .flags = 0 | EVP_CIPH_CFB_MODE,
72478539ee5Sjsing .init = camellia_init_key,
72578539ee5Sjsing .do_cipher = camellia_128_cfb8_cipher,
72678539ee5Sjsing .cleanup = NULL,
72778539ee5Sjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
72878539ee5Sjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
72978539ee5Sjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
73078539ee5Sjsing .ctrl = NULL,
73178539ee5Sjsing };
73278539ee5Sjsing
73378539ee5Sjsing const EVP_CIPHER *
EVP_camellia_128_cfb8(void)73478539ee5Sjsing EVP_camellia_128_cfb8(void)
73578539ee5Sjsing {
73678539ee5Sjsing return &camellia_128_cfb8;
73778539ee5Sjsing }
738*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_128_cfb8);
73978539ee5Sjsing
74078539ee5Sjsing static int
camellia_192_cfb8_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)74178539ee5Sjsing camellia_192_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
74278539ee5Sjsing {
74378539ee5Sjsing size_t chunk = EVP_MAXCHUNK;
74478539ee5Sjsing
74578539ee5Sjsing if (inl < chunk)
74678539ee5Sjsing chunk = inl;
74778539ee5Sjsing
74878539ee5Sjsing while (inl && inl >= chunk) {
7497a606269Sjsing Camellia_cfb8_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
75078539ee5Sjsing inl -= chunk;
75178539ee5Sjsing in += chunk;
75278539ee5Sjsing out += chunk;
75378539ee5Sjsing if (inl < chunk)
75478539ee5Sjsing chunk = inl;
75578539ee5Sjsing }
75678539ee5Sjsing
75778539ee5Sjsing return 1;
75878539ee5Sjsing }
75978539ee5Sjsing
76078539ee5Sjsing static const EVP_CIPHER camellia_192_cfb8 = {
76178539ee5Sjsing .nid = NID_camellia_192_cfb8,
76278539ee5Sjsing .block_size = 1,
76378539ee5Sjsing .key_len = 192/8,
76478539ee5Sjsing .iv_len = 16,
76578539ee5Sjsing .flags = 0 | EVP_CIPH_CFB_MODE,
76678539ee5Sjsing .init = camellia_init_key,
76778539ee5Sjsing .do_cipher = camellia_192_cfb8_cipher,
76878539ee5Sjsing .cleanup = NULL,
76978539ee5Sjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
77078539ee5Sjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
77178539ee5Sjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
77278539ee5Sjsing .ctrl = NULL,
77378539ee5Sjsing };
77478539ee5Sjsing
77578539ee5Sjsing const EVP_CIPHER *
EVP_camellia_192_cfb8(void)77678539ee5Sjsing EVP_camellia_192_cfb8(void)
77778539ee5Sjsing {
77878539ee5Sjsing return &camellia_192_cfb8;
77978539ee5Sjsing }
780*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_192_cfb8);
78178539ee5Sjsing
78278539ee5Sjsing static int
camellia_256_cfb8_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)78378539ee5Sjsing camellia_256_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl)
78478539ee5Sjsing {
78578539ee5Sjsing size_t chunk = EVP_MAXCHUNK;
78678539ee5Sjsing
78778539ee5Sjsing if (inl < chunk)
78878539ee5Sjsing chunk = inl;
78978539ee5Sjsing
79078539ee5Sjsing while (inl && inl >= chunk) {
7917a606269Sjsing Camellia_cfb8_encrypt(in, out, chunk, &((EVP_CAMELLIA_KEY *)ctx->cipher_data)->ks, ctx->iv, &ctx->num, ctx->encrypt);
79278539ee5Sjsing inl -= chunk;
79378539ee5Sjsing in += chunk;
79478539ee5Sjsing out += chunk;
79578539ee5Sjsing if (inl < chunk)
79678539ee5Sjsing chunk = inl;
79778539ee5Sjsing }
79878539ee5Sjsing
79978539ee5Sjsing return 1;
80078539ee5Sjsing }
80178539ee5Sjsing
80278539ee5Sjsing static const EVP_CIPHER camellia_256_cfb8 = {
80378539ee5Sjsing .nid = NID_camellia_256_cfb8,
80478539ee5Sjsing .block_size = 1,
80578539ee5Sjsing .key_len = 256/8,
80678539ee5Sjsing .iv_len = 16,
80778539ee5Sjsing .flags = 0 | EVP_CIPH_CFB_MODE,
80878539ee5Sjsing .init = camellia_init_key,
80978539ee5Sjsing .do_cipher = camellia_256_cfb8_cipher,
81078539ee5Sjsing .cleanup = NULL,
81178539ee5Sjsing .ctx_size = sizeof(EVP_CAMELLIA_KEY),
81278539ee5Sjsing .set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
81378539ee5Sjsing .get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
81478539ee5Sjsing .ctrl = NULL,
81578539ee5Sjsing };
81678539ee5Sjsing
81778539ee5Sjsing const EVP_CIPHER *
EVP_camellia_256_cfb8(void)81878539ee5Sjsing EVP_camellia_256_cfb8(void)
81978539ee5Sjsing {
82078539ee5Sjsing return &camellia_256_cfb8;
82178539ee5Sjsing }
822*9bac3682Sbeck LCRYPTO_ALIAS(EVP_camellia_256_cfb8);
8235650a0e1Sdjm #endif
824