home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / com / utils / elm / sources / crypt.c < prev    next >
C/C++ Source or Header  |  1992-05-28  |  4KB  |  124 lines

  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.  
  34. extern long32 _ufc_keytab[16][2];
  35. extern long32 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];
  36.  
  37. #define SBA(sb, v) (*(long32*)((char*)(sb)+(v)))
  38.  
  39. static ufc_long ary[4];
  40.  
  41. ufc_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.  
  81. extern long64 _ufc_keytab[16];
  82. extern long64 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];
  83.  
  84. #define SBA(sb, v) (*(long64*)((char*)(sb)+(v)))
  85.  
  86. static ufc_long ary[4];
  87.  
  88. ufc_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.