| The following is the README for UFC-crypt, with those portions deleted | 
 | that are known to be incorrect for the implementation used with the | 
 | GNU C library. | 
 |  | 
 |  | 
 | 	UFC-crypt: ultra fast 'crypt' implementation | 
 | 	============================================ | 
 |  | 
 | 	@(#)README	2.27 11 Sep 1996 | 
 |  | 
 | Design goals/non goals: | 
 | ---------------------- | 
 |  | 
 | - Crypt implementation plugin compatible with crypt(3)/fcrypt. | 
 |  | 
 | - High performance when used for password cracking. | 
 |  | 
 | - Portable to most 32/64 bit machines. | 
 |  | 
 | - Startup time/mixed salt performance not critical. | 
 |  | 
 | Features of the implementation: | 
 | ------------------------------ | 
 |  | 
 | - On most machines, UFC-crypt runs 30-60 times faster than crypt(3) when | 
 |   invoked repeated times with the same salt and varying passwords. | 
 |  | 
 | - With mostly constant salts, performance is about two to three times | 
 |   that of the default fcrypt implementation shipped with Alec | 
 |   Muffets 'Crack' password cracker. For instructions on how to | 
 |   plug UFC-crypt into 'Crack', see below. | 
 |  | 
 | - With alternating salts, performance is only about twice | 
 |   that of crypt(3). | 
 |  | 
 | - Requires 165 kb for tables. | 
 |  | 
 | Author & licensing etc | 
 | ---------------------- | 
 |  | 
 | UFC-crypt is created by Michael Glad, email: glad@daimi.aau.dk, and has | 
 | been donated to the Free Software Foundation, Inc. It is covered by the | 
 | GNU library license version 2, see the file 'COPYING.LIB'. | 
 |  | 
 | NOTES FOR USERS OUTSIDE THE US: | 
 | ------------------------------ | 
 |  | 
 | The US government limits the export of DES based software/hardware. | 
 | This software is written in Aarhus, Denmark. It can therefore be retrieved | 
 | from ftp sites outside the US without breaking US law. Please do not | 
 | ftp it from american sites. | 
 |  | 
 | Benchmark table: | 
 | --------------- | 
 |  | 
 | The table shows how many operations per second UFC-crypt can | 
 | do on various machines. | 
 |  | 
 | |--------------|-------------------------------------------| | 
 | |Machine       |  SUN*  SUN*   HP*     DecStation   HP     | | 
 | |              | 3/50   ELC  9000/425e    3100    9000/720 | | 
 | |--------------|-------------------------------------------| | 
 | | Crypt(3)/sec |  4.6    30     15         25        57    | | 
 | | Ufc/sec      |  220   990    780       1015      3500    | | 
 | |--------------|-------------------------------------------| | 
 | | Speedup      |   48    30     52         40        60    | | 
 | |--------------|-------------------------------------------| | 
 |  | 
 | *) Compiled using special assembly language support module. | 
 |  | 
 | It seems as if performance is limited by CPU bus and data cache capacity. | 
 | This also makes the benchmarks debatable compared to a real test with | 
 | UFC-crypt wired into Crack. However, the table gives an outline of | 
 | what can be expected. | 
 |  | 
 | Optimizations: | 
 | ------------- | 
 |  | 
 | Here are the optimizations used relative to an ordinary implementation | 
 | such as the one said to be used in crypt(3). | 
 |  | 
 | Major optimizations | 
 | ******************* | 
 |  | 
 | - Keep data packed as bits in integer variables -- allows for | 
 |   fast permutations & parallel xor's in CPU hardware. | 
 |  | 
 | - Let adjacent final & initial permutations collapse. | 
 |  | 
 | - Keep working data in 'E expanded' format all the time. | 
 |  | 
 | - Implement DES 'f' function mostly by table lookup | 
 |  | 
 | - Calculate the above function on 12 bit basis rather than 6 | 
 |   as would be the most natural. | 
 |  | 
 | - Implement setup routines so that performance is limited by the DES | 
 |   inner loops only. | 
 |  | 
 | - Instead of doing salting in the DES inner loops, modify the above tables | 
 |   each time a new salt is seen. According to the BSD crypt code this is | 
 |   ugly :-) | 
 |  | 
 | Minor (dirty) optimizations | 
 | *************************** | 
 |  | 
 | - combine iterations of DES inner loop so that DES only loops | 
 |   8 times. This saves a lot of variable swapping. | 
 |  | 
 | - Implement key access by a walking pointer rather than coding | 
 |   as array indexing. | 
 |  | 
 | - As described, the table based f function uses a 3 dimensional array: | 
 |  | 
 | 	sb ['number of 12 bit segment']['12 bit index']['48 bit half index'] | 
 |  | 
 |   Code the routine with 4 (one dimensional) vectors. | 
 |  | 
 | - Design the internal data format & uglify the DES loops so that | 
 |   the compiler does not need to do bit shifts when indexing vectors. | 
 |  | 
 | Revision history | 
 | **************** | 
 |  | 
 | UFC patchlevel 0: base version; released to alt.sources on Sep 24 1991 | 
 | UFC patchlevel 1: patch released to alt.sources on Sep 27 1991. | 
 | 		  No longer rebuilds sb tables when seeing a new salt. | 
 | UFC-crypt pl0:	  Essentially UFC pl 1. Released to comp.sources.misc | 
 | 		  on Oct 22 1991. | 
 | UFC-crypt pl1:    Released to comp.sources.misc in march 1992 | 
 | 		  * setkey/encrypt routines added | 
 | 		  * added validation/benchmarking programs | 
 | 		  * reworked keyschedule setup code | 
 | 		  * memory demands reduced | 
 | 		  * 64 bit support added |