/* FEAL sample source code. Copyright 2000 (C) by NTT. All rights reserved. */ #include typedef unsigned char uint8; typedef unsigned long uint32; #define ROTL(x, n) (uint8)(((uint8)(x) << (n)) | ((uint8)(x) >> (8-(n)))) #define S0(x, y) (uint8)(ROTL(((uint8)((x) + (y) )), 2)) #define S1(x, y) (uint8)(ROTL(((uint8)((x) + (y) + 1)), 2)) void FEAL_Fk(a, b) uint8 *a, *b; { uint8 t; a[1] ^= a[0]; a[2] ^= a[3]; t = a[2] ^ b[0]; a[1] = S1(a[1], t); t = a[1] ^ b[1]; a[2] = S0(a[2], t); t = a[1] ^ b[2]; a[0] = S0(a[0], t); t = a[2] ^ b[3]; a[3] = S1(a[3], t); } void FEAL_F(a, b, e) uint8 *a, *b, *e; { a[1] = (b[0] ^ b[1] ^ e[0]); a[2] = (b[2] ^ b[3] ^ e[1]); a[1] = S1(a[1], a[2]); a[2] = S0(a[1], a[2]); a[0] = S0(b[0], a[1]); a[3] = S1(b[3], a[2]); } /* key generation */ void FEAL_keygen(k, e, r) uint32 r; uint8 *k, *e; { uint32 i, j; uint8 a[4], b[4], d[4], kr1[4], kr2[4]; uint8 t, s[4]; for(i = 0; i < 4; i++){ a[i] = k[i]; b[i] = k[i+4]; kr1[i] = k[i+8]; kr2[i] = k[i+12]; d[i] = 0; } for(i = 0; i < r+8; i += 2){ for(j = 0; j < 4; j++){ s[j] = b[j]; if((i/2) % 3 == 0){ s[j] ^= (kr1[j] ^ kr2[j]); } else if((i/2) % 3 == 1){ s[j] ^= kr1[j]; } else { s[j] ^= kr2[j]; } s[j] ^= d[j]; d[j] = a[j]; /* for next steps */ } FEAL_Fk(a, s); for(j = 0; j < 4; j++){ e[2*i+j] = a[j]; } for(j = 0; j < 4; j++){ t = a[j]; a[j] = b[j]; b[j] = t; } } } /* encryption (one block) */ void FEAL_encrypt(p, r, e, c) uint8 *p, *e, *c; uint32 r; { uint32 i, j; uint8 a[4], b[4]; uint8 t, s[4]; for(j = 0; j < 4; j++){ a[j] = p[j] ^ e[2*r+j]; b[j] = p[j+4] ^ e[2*r+j+4] ^ a[j]; } for(i = 0; i < r; i++){ FEAL_F(s, b, e + 2*i); for(j = 0; j < 4; j++){ a[j] ^= s[j]; } for(j = 0; j < 4; j++){ t = a[j]; a[j] = b[j]; b[j] = t; } } for(j = 0; j < 4; j++){ a[j] ^= b[j]; } for(j = 0; j < 4; j++){ c[j] = (b[j] ^ e[2*r+j+8]); c[j+4] = (a[j] ^ e[2*r+j+12]); } } /* decryption (one block) */ void FEAL_decrypt(c, r, e, p) uint8 *c, *e, *p; uint32 r; { uint32 i, j; uint8 a[4], b[4]; uint8 t, s[4]; for(j = 0; j < 4; j++){ a[j] = c[j] ^ e[2*r+j+8]; b[j] = c[j+4] ^ e[2*r+j+12] ^ a[j]; } for(i = 0; i < r; i++){ FEAL_F(s, b, e + 2*(r-1-i)); for(j = 0; j < 4; j++){ a[j] ^= s[j]; } for(j = 0; j < 4; j++){ t = a[j]; a[j] = b[j]; b[j] = t; } } for(j = 0; j < 4; j++){ a[j] ^= b[j]; } for(j = 0; j < 4; j++){ p[j] = (b[j] ^ e[2*r+j]); p[j+4] = (a[j] ^ e[2*r+j+4]); } } /* −−−−−−−−−−−−−−−−−−−−−−−−−−−−− 「本ソフトウェア使用にあたっての注意事項」  本ソフトウェア(FEALサンプルコードプログラム)の著作権は、日本電信電話 株式会社(以下、NTTといいます)に帰属します。本ソフトウェアの利用者(以下ラ イセンシーといいます)は以下に示す事項をおまもりください。 1. ライセンシーは、情報処理振興協会(以下「IPA」といいます)において、通 商産業省委託の暗号技術評価の用途に限り、本ソフトウェア(暗号技術評価のために 、本ソフトウェアに変更を加えた派生物も含みます)を使用、複製、配布、及び暗号 技術評価のために必要な場合には変更することができます。 2. ライセンシーは、本ソフトウェアの変更を行う時に、本注意書き、及び本ソフト ウェアに記載された著作権表示を削除することはできません。また、ライセンシーは 、本ソフトウェアの配布時に、本注意書きを添付の上、配布してください。 3. NTTは、ライセンシーに対し、本ソフトウェアの一切の動作保証及び瑕疵保証をし ません。また、本ソフトウェアに起因して被ったいかなる損害に対しても責任を負い ません。NTTは、ライセンシーに対し、本ソフトウェアの一切の動作保証及び瑕疵保 証をしません。また、本ソフトウェアに起因して被ったいかなる損害に対しても責任 を負いません。 /*