1/* 2 * UFC-crypt: ultra fast crypt(3) implementation 3 * 4 * Copyright (C) 1991, 1992, Free Software Foundation, Inc. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public 17 * License along with this library; if not, write to the Free 18 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 * 20 * @(#)crypt.c 2.19 5/28/92 21 * 22 * Semiportable C version 23 * 24 */ 25 26#include "ufc-crypt.h" 27 28#ifdef _UFC_32_ 29 30/* 31 * 32 bit version 32 */ 33 34extern long32 _ufc_keytab[16][2]; 35extern long32 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[]; 36 37#define SBA(sb, v) (*(long32*)((char*)(sb)+(v))) 38 39static ufc_long ary[4]; 40 41ufc_long *_ufc_doit(l1, l2, r1, r2, itr) 42 ufc_long l1, l2, r1, r2, itr; 43 { int i; 44 long32 s, *k; 45 register long32 *sb0 = _ufc_sb0; 46 register long32 *sb1 = _ufc_sb1; 47 register long32 *sb2 = _ufc_sb2; 48 register long32 *sb3 = _ufc_sb3; 49 50 while(itr--) { 51 k = &_ufc_keytab[0][0]; 52 for(i=8; i--; ) { 53 s = *k++ ^ r1; 54 l1 ^= SBA(sb1, s & 0xffff); l2 ^= SBA(sb1, (s & 0xffff)+4); 55 l1 ^= SBA(sb0, s >>= 16); l2 ^= SBA(sb0, (s) +4); 56 s = *k++ ^ r2; 57 l1 ^= SBA(sb3, s & 0xffff); l2 ^= SBA(sb3, (s & 0xffff)+4); 58 l1 ^= SBA(sb2, s >>= 16); l2 ^= SBA(sb2, (s) +4); 59 60 s = *k++ ^ l1; 61 r1 ^= SBA(sb1, s & 0xffff); r2 ^= SBA(sb1, (s & 0xffff)+4); 62 r1 ^= SBA(sb0, s >>= 16); r2 ^= SBA(sb0, (s) +4); 63 s = *k++ ^ l2; 64 r1 ^= SBA(sb3, s & 0xffff); r2 ^= SBA(sb3, (s & 0xffff)+4); 65 r1 ^= SBA(sb2, s >>= 16); r2 ^= SBA(sb2, (s) +4); 66 } 67 s=l1; l1=r1; r1=s; s=l2; l2=r2; r2=s; 68 } 69 ary[0] = l1; ary[1] = l2; ary[2] = r1; ary[3] = r2; 70 return ary; 71 } 72 73#endif 74 75#ifdef _UFC_64_ 76 77/* 78 * 64 bit version 79 */ 80 81extern long64 _ufc_keytab[16]; 82extern long64 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[]; 83 84#define SBA(sb, v) (*(long64*)((char*)(sb)+(v))) 85 86static ufc_long ary[4]; 87 88ufc_long *_ufc_doit(l1, l2, r1, r2, itr) 89 ufc_long l1, l2, r1, r2, itr; 90 { int i; 91 long64 l, r, s, *k; 92 register long64 *sb0 = _ufc_sb0; 93 register long64 *sb1 = _ufc_sb1; 94 register long64 *sb2 = _ufc_sb2; 95 register long64 *sb3 = _ufc_sb3; 96 97 l = (((long64)l1) << 32) | ((long64)l2); 98 r = (((long64)r1) << 32) | ((long64)r2); 99 100 while(itr--) { 101 k = &_ufc_keytab[0]; 102 for(i=8; i--; ) { 103 s = *k++ ^ r; 104 l ^= SBA(sb3, (s >> 0) & 0xffff); 105 l ^= SBA(sb2, (s >> 16) & 0xffff); 106 l ^= SBA(sb1, (s >> 32) & 0xffff); 107 l ^= SBA(sb0, (s >> 48) & 0xffff); 108 109 s = *k++ ^ l; 110 r ^= SBA(sb3, (s >> 0) & 0xffff); 111 r ^= SBA(sb2, (s >> 16) & 0xffff); 112 r ^= SBA(sb1, (s >> 32) & 0xffff); 113 r ^= SBA(sb0, (s >> 48) & 0xffff); 114 } 115 s=l; l=r; r=s; 116 } 117 118 ary[0] = l >> 32; ary[1] = l & 0xffffffff; 119 ary[2] = r >> 32; ary[3] = r & 0xffffffff; 120 return ary; 121 } 122 123#endif 124