⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camellia.c

📁 Camellia算法官方发表的版本OpenSSL1.1。为2006.7官方发布。
💻 C
📖 第 1 页 / 共 5 页
字号:
/* 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 + -