📄 camellia.c
字号:
/* camellia.c ver 1.1.0 * ==================================================================== * Copyright 2006 NTT (Nippon Telegraph and Telephone Corporation) . * ALL RIGHTS RESERVED. * * Intellectual Property information for Camellia: * http://info.isl.ntt.co.jp/crypt/eng/info/chiteki.html * * News Release for Announcement of Camellia open source: * http://www.ntt.co.jp/news/news06e/0604/060413a.html * * The Camellia Code included herein is developed by * NTT (Nippon Telegraph and Telephone Corporation), and is contributed * to the OpenSSL project. * * The Camellia Code is licensed pursuant to the OpenSSL open source * license provided below. *//* ==================================================================== * Copyright (c) 2006 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== *//* * Algorithm Specification * http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html *//* * * NOTE --- NOTE --- NOTE --- NOTE * This implementation assumes that all memory addresses passed * as parameters are four-byte aligned. * */#include <string.h>#include <stdlib.h>#include "camellia.h"#if defined(_MSC_VER)typedef unsigned char uint8_t;typedef unsigned int uint32_t;typedef unsigned __int64 uint64_t;#else#include <inttypes.h>#endif#if BYTE_ORDER == _LITTLE_ENDIAN || __i386__ || __alpha__ || _M_IX86#define L_ENDIAN#else#undef L_ENDIAN#endif/* key constants */#define CAMELLIA_SIGMA1L (0xA09E667FL)#define CAMELLIA_SIGMA1R (0x3BCC908BL)#define CAMELLIA_SIGMA2L (0xB67AE858L)#define CAMELLIA_SIGMA2R (0x4CAA73B2L)#define CAMELLIA_SIGMA3L (0xC6EF372FL)#define CAMELLIA_SIGMA3R (0xE94F82BEL)#define CAMELLIA_SIGMA4L (0x54FF53A5L)#define CAMELLIA_SIGMA4R (0xF1D36F1CL)#define CAMELLIA_SIGMA5L (0x10E527FAL)#define CAMELLIA_SIGMA5R (0xDE682D1DL)#define CAMELLIA_SIGMA6L (0xB05688C2L)#define CAMELLIA_SIGMA6R (0xB3E6C1FDL)/* * macros */#if defined(_MSC_VER)# define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)# define GETU32(p) SWAP(*((uint32_t *)(p)))# define CAMELLIA_SWAP4(x) (x = (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00))#else /* not MS-VC */# define GETU32(pt) (((uint32_t)(pt)[0] << 24) \ ^ ((uint32_t)(pt)[1] << 16) \ ^ ((uint32_t)(pt)[2] << 8) \ ^ ((uint32_t)(pt)[3]))#ifdef L_ENDIAN#define CAMELLIA_SWAP4(x) \ do { \ x = ((uint32_t)x << 16) + ((uint32_t)x >> 16); \ x = (((uint32_t)x & 0xff00ff) << 8) + \ (((uint32_t)x >> 8) & 0xff00ff); \ } while(0)#else /* big endian */#define CAMELLIA_SWAP4(x)#endif /* L_ENDIAN */#endif#define COPY4WORD(dst, src) \ do { \ (dst)[0]=(src)[0]; \ (dst)[1]=(src)[1]; \ (dst)[2]=(src)[2]; \ (dst)[3]=(src)[3]; \ }while(0)#define SWAP4WORD(word) \ do { \ CAMELLIA_SWAP4((word)[0]); \ CAMELLIA_SWAP4((word)[1]); \ CAMELLIA_SWAP4((word)[2]); \ CAMELLIA_SWAP4((word)[3]); \ }while(0)#define XOR4WORD(a, b)/* a = a ^ b */ \ do { \ (a)[0]^=(b)[0]; \ (a)[1]^=(b)[1]; \ (a)[2]^=(b)[2]; \ (a)[3]^=(b)[3]; \ }while(0)#define XOR4WORD2(a, b, c)/* a = b ^ c */ \ do { \ (a)[0]=(b)[0]^(c)[0]; \ (a)[1]=(b)[1]^(c)[1]; \ (a)[2]=(b)[2]^(c)[2]; \ (a)[3]=(b)[3]^(c)[3]; \ }while(0)#ifdef L_ENDIAN#define CamelliaSubkeyL(INDEX) (subkey[(INDEX)*2 + 1])#define CamelliaSubkeyR(INDEX) (subkey[(INDEX)*2])#else /* big endian */#define CamelliaSubkeyL(INDEX) (subkey[(INDEX)*2])#define CamelliaSubkeyR(INDEX) (subkey[(INDEX)*2 + 1])#endif /* L_ENDIAN *//* rotation right shift 1byte */#define CAMELLIA_RR8(x) (((x) >> 8) + ((x) << 24))/* rotation left shift 1bit */#define CAMELLIA_RL1(x) (((x) << 1) + ((x) >> 31))/* rotation left shift 1byte */#define CAMELLIA_RL8(x) (((x) << 8) + ((x) >> 24))#define CAMELLIA_ROLDQ(ll, lr, rl, rr, w0, w1, bits) \ do { \ w0 = ll; \ ll = (ll << bits) + (lr >> (32 - bits)); \ lr = (lr << bits) + (rl >> (32 - bits)); \ rl = (rl << bits) + (rr >> (32 - bits)); \ rr = (rr << bits) + (w0 >> (32 - bits)); \ } while(0)#define CAMELLIA_ROLDQo32(ll, lr, rl, rr, w0, w1, bits) \ do { \ w0 = ll; \ w1 = lr; \ ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \ lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \ rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \ rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \ } while(0)#define CAMELLIA_SP1110(INDEX) (camellia_sp1110[(INDEX)])#define CAMELLIA_SP0222(INDEX) (camellia_sp0222[(INDEX)])#define CAMELLIA_SP3033(INDEX) (camellia_sp3033[(INDEX)])#define CAMELLIA_SP4404(INDEX) (camellia_sp4404[(INDEX)])#define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ do { \ il = xl ^ kl; \ ir = xr ^ kr; \ t0 = il >> 16; \ t1 = ir >> 16; \ yl = CAMELLIA_SP1110(ir & 0xff) \ ^ CAMELLIA_SP0222((t1 >> 8) & 0xff) \ ^ CAMELLIA_SP3033(t1 & 0xff) \ ^ CAMELLIA_SP4404((ir >> 8) & 0xff); \ yr = CAMELLIA_SP1110((t0 >> 8) & 0xff) \ ^ CAMELLIA_SP0222(t0 & 0xff) \ ^ CAMELLIA_SP3033((il >> 8) & 0xff) \ ^ CAMELLIA_SP4404(il & 0xff); \ yl ^= yr; \ yr = CAMELLIA_RR8(yr); \ yr ^= yl; \ } while(0)/* * for speed up * */#if !defined(_MSC_VER)#define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \ do { \ t0 = kll; \ t2 = krr; \ t0 &= ll; \ t2 |= rr; \ rl ^= t2; \ lr ^= CAMELLIA_RL1(t0); \ t3 = krl; \ t1 = klr; \ t3 &= rl; \ t1 |= lr; \ ll ^= t1; \ rr ^= CAMELLIA_RL1(t3); \ } while(0)#define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ do { \ ir = CAMELLIA_SP1110(xr & 0xff); \ il = CAMELLIA_SP1110((xl>>24) & 0xff); \ ir ^= CAMELLIA_SP0222((xr>>24) & 0xff); \ il ^= CAMELLIA_SP0222((xl>>16) & 0xff); \ ir ^= CAMELLIA_SP3033((xr>>16) & 0xff); \ il ^= CAMELLIA_SP3033((xl>>8) & 0xff); \ ir ^= CAMELLIA_SP4404((xr>>8) & 0xff); \ il ^= CAMELLIA_SP4404(xl & 0xff); \ il ^= kl; \ ir ^= il ^ kr; \ yl ^= ir; \ yr ^= CAMELLIA_RR8(il) ^ ir; \ } while(0)#else /* for MS-VC */#define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \ do { \ t0 = kll; \ t0 &= ll; \ lr ^= CAMELLIA_RL1(t0); \ t1 = klr; \ t1 |= lr; \ ll ^= t1; \ \ t2 = krr; \ t2 |= rr; \ rl ^= t2; \ t3 = krl; \ t3 &= rl; \ rr ^= CAMELLIA_RL1(t3); \ } while(0)#define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ do { \ il = xl; \ ir = xr; \ t0 = il >> 16; \ t1 = ir >> 16; \ ir = CAMELLIA_SP1110(ir & 0xff) \ ^ CAMELLIA_SP0222((t1 >> 8) & 0xff) \ ^ CAMELLIA_SP3033(t1 & 0xff) \ ^ CAMELLIA_SP4404((ir >> 8) & 0xff); \ il = CAMELLIA_SP1110((t0 >> 8) & 0xff) \ ^ CAMELLIA_SP0222(t0 & 0xff) \ ^ CAMELLIA_SP3033((il >> 8) & 0xff) \ ^ CAMELLIA_SP4404(il & 0xff); \ il ^= kl; \ ir ^= kr; \ ir ^= il; \ il = CAMELLIA_RR8(il); \ il ^= ir; \ yl ^= ir; \ yr ^= il; \ } while(0)#endifstatic const uint32_t camellia_sp1110[256] = { 0x70707000,0x82828200,0x2c2c2c00,0xececec00, 0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500, 0xe4e4e400,0x85858500,0x57575700,0x35353500, 0xeaeaea00,0x0c0c0c00,0xaeaeae00,0x41414100, 0x23232300,0xefefef00,0x6b6b6b00,0x93939300, 0x45454500,0x19191900,0xa5a5a500,0x21212100, 0xededed00,0x0e0e0e00,0x4f4f4f00,0x4e4e4e00, 0x1d1d1d00,0x65656500,0x92929200,0xbdbdbd00, 0x86868600,0xb8b8b800,0xafafaf00,0x8f8f8f00, 0x7c7c7c00,0xebebeb00,0x1f1f1f00,0xcecece00, 0x3e3e3e00,0x30303000,0xdcdcdc00,0x5f5f5f00, 0x5e5e5e00,0xc5c5c500,0x0b0b0b00,0x1a1a1a00, 0xa6a6a600,0xe1e1e100,0x39393900,0xcacaca00, 0xd5d5d500,0x47474700,0x5d5d5d00,0x3d3d3d00, 0xd9d9d900,0x01010100,0x5a5a5a00,0xd6d6d600, 0x51515100,0x56565600,0x6c6c6c00,0x4d4d4d00, 0x8b8b8b00,0x0d0d0d00,0x9a9a9a00,0x66666600, 0xfbfbfb00,0xcccccc00,0xb0b0b000,0x2d2d2d00, 0x74747400,0x12121200,0x2b2b2b00,0x20202000, 0xf0f0f000,0xb1b1b100,0x84848400,0x99999900, 0xdfdfdf00,0x4c4c4c00,0xcbcbcb00,0xc2c2c200, 0x34343400,0x7e7e7e00,0x76767600,0x05050500, 0x6d6d6d00,0xb7b7b700,0xa9a9a900,0x31313100, 0xd1d1d100,0x17171700,0x04040400,0xd7d7d700, 0x14141400,0x58585800,0x3a3a3a00,0x61616100, 0xdedede00,0x1b1b1b00,0x11111100,0x1c1c1c00, 0x32323200,0x0f0f0f00,0x9c9c9c00,0x16161600, 0x53535300,0x18181800,0xf2f2f200,0x22222200, 0xfefefe00,0x44444400,0xcfcfcf00,0xb2b2b200, 0xc3c3c300,0xb5b5b500,0x7a7a7a00,0x91919100, 0x24242400,0x08080800,0xe8e8e800,0xa8a8a800, 0x60606000,0xfcfcfc00,0x69696900,0x50505000, 0xaaaaaa00,0xd0d0d000,0xa0a0a000,0x7d7d7d00, 0xa1a1a100,0x89898900,0x62626200,0x97979700, 0x54545400,0x5b5b5b00,0x1e1e1e00,0x95959500, 0xe0e0e000,0xffffff00,0x64646400,0xd2d2d200, 0x10101000,0xc4c4c400,0x00000000,0x48484800, 0xa3a3a300,0xf7f7f700,0x75757500,0xdbdbdb00, 0x8a8a8a00,0x03030300,0xe6e6e600,0xdadada00, 0x09090900,0x3f3f3f00,0xdddddd00,0x94949400, 0x87878700,0x5c5c5c00,0x83838300,0x02020200, 0xcdcdcd00,0x4a4a4a00,0x90909000,0x33333300, 0x73737300,0x67676700,0xf6f6f600,0xf3f3f300, 0x9d9d9d00,0x7f7f7f00,0xbfbfbf00,0xe2e2e200, 0x52525200,0x9b9b9b00,0xd8d8d800,0x26262600, 0xc8c8c800,0x37373700,0xc6c6c600,0x3b3b3b00, 0x81818100,0x96969600,0x6f6f6f00,0x4b4b4b00, 0x13131300,0xbebebe00,0x63636300,0x2e2e2e00,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -