home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume29 / libdes / patch02 < prev    next >
Internet Message Format  |  1992-05-15  |  33KB

  1. From: eay@psych.psy.uq.oz.au (Eric Young)
  2. Newsgroups: comp.sources.misc
  3. Subject: v29i114: libdes - DES encryption library, Patch02
  4. Message-ID: <1992May14.103924.27723@aber.ac.uk>
  5. Date: 14 May 92 10:39:24 GMT
  6. Approved: aem@aber.ac.uk
  7. X-Md4-Signature: d08d5139a979171c837cf0dee3c78606
  8.  
  9. Submitted-by: eay@psych.psy.uq.oz.au (Eric Young)
  10. Posting-number: Volume 29, Issue 114
  11. Archive-name: libdes/patch02
  12. Environment: UNIX
  13. Patch-To: libdes: Volume 29, Issue 43-46
  14.  
  15. This patch fixes one bug.
  16. It also modifies libdes (and des(1) etc) so they can be compiled under MSDOS.
  17. It also finishes the modifications required for VMS.
  18. This should be the last patch (I hope :-).
  19.  
  20. The bug is not realy a bug but a correction of an incompatability
  21. with MIT's libdes.
  22. The string_to_key function did not return the same key for strings
  23. longer than 8 characters as MIT's.  The problem with fixing this is
  24. that it will mean any files encrypted with the previous version of
  25. des -E that had a key longer than 8 characters will not be decrypted
  26. with des -D anymore :-(.  At least it compiles under MSDOS now :-).
  27. Be forwarned.
  28.  
  29. to apply the patch, use
  30. patch -p1 <patch2
  31.  
  32. NOTES
  33. - I have be notified that the string_to_key routine was different from
  34.   the MIT version for strings longer than 8 characters long.  I have
  35.   now made it the same as MIT's.  If you wish to keep the old version,
  36.   turn the OLD_STR_TO_KEY option on in the makefile.
  37. - I have added an option to compile with an alternative macro for the
  38.   inner loop of the DES routine.  It can provide either a speed up or
  39.   a slow down depending on the compiler/CPU combination.  It is a big
  40.   win on Sparcs using the sun compiler (The code is almost as fast as
  41.   that produced by gcc2 :-).
  42. - read_password.c modified so that echo is turned off when reading the
  43.   password under VMS.
  44. - The library and the support programs (des(1) destest etc.) can now be
  45.   compiled under MSDOS with either TURBO C v 2.0 or Microsoft C v 5.1.
  46.   I assume other compilers (and versions) will work but these are the
  47.   only MSDOS C compilers I have tested.  As has been pointed out by
  48.   various people, the filenames in this library are a bit long.  There is
  49.   not much I can do about this, so when moving the files to MSDOS just
  50.   truncate them to 8 characters.
  51. - One bug in des(1) that does not show up under unix (not zeroing a
  52.   Cblock).
  53.  
  54. diff -c -r des.old/INSTALLATION des/INSTALLATION
  55. *** des.old/INSTALLATION    Wed May 13 12:36:43 1992
  56. --- des/INSTALLATION    Wed May 13 09:55:01 1992
  57. ***************
  58. *** 1,6 ****
  59.   Check the CC and CFLAGS lines in the makefile
  60.   
  61. ! If your C library does not suport the times(3) function, change the
  62.   #define TIMES to
  63.   #undef TIMES in speed.c
  64.   If it does, check the HZ value for the times(3) function.
  65. --- 1,6 ----
  66.   Check the CC and CFLAGS lines in the makefile
  67.   
  68. ! If your C library does not support the times(3) function, change the
  69.   #define TIMES to
  70.   #undef TIMES in speed.c
  71.   If it does, check the HZ value for the times(3) function.
  72. ***************
  73. *** 23,27 ****
  74.   des.man       in /usr/local/man/man1/des.1
  75.   des.h         in /usr/include/des.h
  76.   
  77. ! des(1) should be compatable with sunOS's but I have been unable to
  78.   test it.
  79. --- 23,47 ----
  80.   des.man       in /usr/local/man/man1/des.1
  81.   des.h         in /usr/include/des.h
  82.   
  83. ! des(1) should be compatible with sunOS's but I have been unable to
  84.   test it.
  85. + These routines can now be compiled under MSDOS.
  86. + I have successfully encrypted files using des(1) under MSDOS and then
  87. + decrypted the files on a SparcStation.
  88. + I have been able to compile and test the routines with
  89. + Microsoft C v 5.1 and Turbo C v 2.0.
  90. + The code in this library is in no way optimised for the 16bit
  91. + operation of MSDOS.  Microsoft C generates code that is 40% slower
  92. + than Turbo C's code.  I believe this is due to problems it has with
  93. + code generation with the 32bit shift operation in the IP and FP
  94. + sections.
  95. + For Turbo C v 2.0, make sure to define MSDOS, in the relevant menu.
  96. + There is now an alternative version of the D_ENCRYPT macro that can be
  97. + enabled with the -DALT_ECB option in the makefile.  This alternative
  98. + macro can make a +-%20 speed difference to the DES encryption speed,
  99. + depending on the compiler/CPU combinations.
  100. + It has its greatest effect on Sparc machines when using the sun compiler.
  101. + If in doubt, try enable/disable it and running speed.
  102. diff -c -r des.old/README des/README
  103. *** des.old/README    Wed May 13 12:36:44 1992
  104. --- des/README    Tue May  5 14:34:33 1992
  105. ***************
  106. *** 3,9 ****
  107.   a fast implementation of crypt(3).
  108.   It also contains support routines to read keys from a terminal,
  109.   generate a random key, generate a key from an arbitary length string,
  110. ! read/write from/to a file descriptor, and an implementation of
  111.   sunOS des(1) command for file encryption.
  112.   
  113.   The implementation was written so as to conform with the manual entry
  114. --- 3,9 ----
  115.   a fast implementation of crypt(3).
  116.   It also contains support routines to read keys from a terminal,
  117.   generate a random key, generate a key from an arbitary length string,
  118. ! read/write encrypted data from/to a file descriptor, and an implementation of
  119.   sunOS des(1) command for file encryption.
  120.   
  121.   The implementation was written so as to conform with the manual entry
  122. diff -c -r des.old/VERSION des/VERSION
  123. *** des.old/VERSION    Wed May 13 12:36:44 1992
  124. --- des/VERSION    Wed May 13 09:54:06 1992
  125. ***************
  126. *** 1,5 ****
  127.   Version 1.92 13/04/92 eay
  128. !     Changed D_ENCRYPT so that the rotation of R occures outside of
  129.        the loop.  This required rotating all the longs in sp.h (now
  130.        called spr.h). Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
  131.       speed.c has been changed so it will work without SIGALRM.  If
  132. --- 1,25 ----
  133. + Patch2 posted to comp.sources.misc
  134. + Version 1.95 13/05/92 eay
  135. +     Added an alternative version of the D_ENCRYPT macro in
  136. +     ecb_encrypt and fcrypt.  Depending on the compiler, one version or the
  137. +     other will be faster.
  138. + Version 1.94 05/05/92 eay
  139. +     Fixed an incompatiblity between my string_to_key and the MIT
  140. +      version.  When the key is longer than 8 chars, I was wrapping
  141. +      with a different method.  To use the old version, define
  142. +      OLD_STR_TO_KEY in the makefile.  Thanks to
  143. +      viktor@newsu.shearson.com (Viktor Dukhovni).
  144. + Version 1.93 28/04/92 eay
  145. +     Fixed the VMS mods so that echo is now turned off in
  146. +      read_password.  Thanks again to brennan@coco.cchs.su.oz.AU.
  147. +     MSDOS support added.  The routines can be compiled with
  148. +      Turbo C (v2.0) and MSC (v5.1).  Make sure MSDOS is defined.
  149. + Patch1 posted to comp.sources.misc
  150.   Version 1.92 13/04/92 eay
  151. !     Changed D_ENCRYPT so that the rotation of R occurs outside of
  152.        the loop.  This required rotating all the longs in sp.h (now
  153.        called spr.h). Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
  154.       speed.c has been changed so it will work without SIGALRM.  If
  155. ***************
  156. *** 14,19 ****
  157. --- 34,40 ----
  158.       Changed FILE *IN/*OUT to *DES_IN/*DES_OUT since it appears VMS
  159.       does not like IN/OUT being used.
  160.   
  161. + Libdes posted to comp.sources.misc
  162.   Version 1.9 24/03/92 eay
  163.       Now contains a fast small crypt replacement.
  164.       Added des(1) command.
  165. diff -c -r des.old/des.c des/des.c
  166. *** des.old/des.c    Wed May 13 12:36:45 1992
  167. --- des/des.c    Tue Apr 28 12:32:12 1992
  168. ***************
  169. *** 10,16 ****
  170.   #endif
  171.   #include "des.h"
  172.   
  173. ! #if defined(__STDC__) || defined(VMS)
  174.   #include <string.h>
  175.   #define bcopy(f,t,n)    memcpy(t,f,(size_t)(n))
  176.   #define bzero(s,n)    memset(s,0,(size_t)(n))
  177. --- 10,16 ----
  178.   #endif
  179.   #include "des.h"
  180.   
  181. ! #if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
  182.   #include <string.h>
  183.   #define bcopy(f,t,n)    memcpy(t,f,(size_t)(n))
  184.   #define bzero(s,n)    memset(s,0,(size_t)(n))
  185. ***************
  186. *** 18,24 ****
  187. --- 18,29 ----
  188.   #define index(s,c)    strchr(s,c)
  189.   #endif
  190.   
  191. + #ifdef MSDOS
  192. + /* Turbo C v 2.0 feof(FILE *) only works in text mode. :-(. */
  193. + #define feof(a)    ((num == 0) || (num != BUFSIZE))
  194. + #endif
  195.   
  196. + #define BUFSIZE (8*1024)
  197.   #define VERIFY  1
  198.   #define KEYSIZ    8
  199.   #define KEYSIZB 1024 /* should hit tty line limit first :-) */
  200. ***************
  201. *** 113,122 ****
  202. --- 118,131 ----
  203.   
  204.       if (    (in != NULL) &&
  205.           (out != NULL) &&
  206. + #ifndef MSDOS
  207.           (stat(in,&ins) != -1) &&
  208.           (stat(out,&outs) != -1) &&
  209.           (ins.st_dev == outs.st_dev) &&
  210.           (ins.st_ino == outs.st_ino))
  211. + #else /* MSDOS */
  212. +         (strcmp(in,out) == 0))
  213. + #endif
  214.               {
  215.               fputs("input and output file are the same\n",stderr);
  216.               exit(3);
  217. ***************
  218. *** 145,150 ****
  219. --- 154,168 ----
  220.           exit(5);
  221.           }
  222.   
  223. + #ifdef MSDOS
  224. +     /* This should set the file to binary mode. */
  225. +     {
  226. + #include <fcntl.h>
  227. +     setmode(fileno(DES_IN),O_BINARY);
  228. +     setmode(fileno(DES_OUT),O_BINARY);
  229. +     }
  230. + #endif
  231.       doencryption();
  232.       fclose(DES_IN);
  233.       fclose(DES_OUT);
  234. ***************
  235. *** 160,170 ****
  236.   
  237.   doencryption()
  238.       {
  239. !     char buf[1024*8+8];
  240. !     char obuf[1024*8+8];
  241.       des_key_schedule ks;
  242.       char iv[8];
  243. !     int i,j,k,l,ll,last,ex=0;
  244.       des_cblock kk;
  245.   
  246.       if (longk)
  247. --- 178,188 ----
  248.   
  249.   doencryption()
  250.       {
  251. !     static char buf[BUFSIZE+8];
  252. !     static char obuf[BUFSIZE+8];
  253.       des_key_schedule ks;
  254.       char iv[8];
  255. !     int num=0,i,j,k,l,ll,last,ex=0;
  256.       des_cblock kk;
  257.   
  258.       if (longk)
  259. ***************
  260. *** 190,195 ****
  261. --- 208,215 ----
  262.       des_set_key(kk,ks);
  263.       bzero(key,sizeof(key));
  264.       bzero(kk,sizeof(kk));
  265. +     /* woops - A bug that does not showup under unix :-( */
  266. +     bzero(iv,sizeof(iv));
  267.   
  268.       l=1;
  269.       /* first read */
  270. ***************
  271. *** 197,203 ****
  272.           {
  273.           for (;;)
  274.               {
  275. !             l=fread(buf,1,1024*8,DES_IN);
  276.               if (l < 0)
  277.                   {
  278.                   perror("read error");
  279. --- 217,223 ----
  280.           {
  281.           for (;;)
  282.               {
  283. !             num=l=fread(buf,1,BUFSIZE,DES_IN);
  284.               if (l < 0)
  285.                   {
  286.                   perror("read error");
  287. ***************
  288. *** 224,230 ****
  289.                   {
  290.                   des_cbc_encrypt(
  291.                       (des_cblock *)buf,(des_cblock *)obuf,
  292. !                     l,ks,(des_cblock *)iv,encrypt);
  293.                   if (l >= 8) bcopy(&(obuf[l-8]),iv,8);
  294.                   }
  295.   
  296. --- 244,250 ----
  297.                   {
  298.                   des_cbc_encrypt(
  299.                       (des_cblock *)buf,(des_cblock *)obuf,
  300. !                     (long)l,ks,(des_cblock *)iv,encrypt);
  301.                   if (l >= 8) bcopy(&(obuf[l-8]),iv,8);
  302.                   }
  303.   
  304. ***************
  305. *** 248,254 ****
  306.           for (;;)
  307.               {
  308.               if (ex) {
  309. !                 l=fread(buf,1,1024*8,DES_IN);
  310.                   ex=0;
  311.                   }
  312.               if (l < 0)
  313. --- 268,274 ----
  314.           for (;;)
  315.               {
  316.               if (ex) {
  317. !                 l=fread(buf,1,BUFSIZE,DES_IN);
  318.                   ex=0;
  319.                   }
  320.               if (l < 0)
  321. ***************
  322. *** 267,277 ****
  323.                   {
  324.                   des_cbc_encrypt(
  325.                       (des_cblock *)buf,(des_cblock *)obuf,
  326. !                     l,ks,(des_cblock *)iv,encrypt);
  327.                   if (l >= 8) bcopy(&(buf[l-8]),iv,8);
  328.                   }
  329.   
  330. !             ll=fread(buf,1,1024*8,DES_IN);
  331.               if (feof(DES_IN) && (ll == 0))
  332.                   {
  333.                   last=obuf[l-1];
  334. --- 287,297 ----
  335.                   {
  336.                   des_cbc_encrypt(
  337.                       (des_cblock *)buf,(des_cblock *)obuf,
  338. !                      (long)l,ks,(des_cblock *)iv,encrypt);
  339.                   if (l >= 8) bcopy(&(buf[l-8]),iv,8);
  340.                   }
  341.   
  342. !             ll=fread(buf,1,BUFSIZE,DES_IN);
  343.               if (feof(DES_IN) && (ll == 0))
  344.                   {
  345.                   last=obuf[l-1];
  346. diff -c -r des.old/des_local.h des/des_local.h
  347. *** des.old/des_local.h    Wed May 13 12:36:47 1992
  348. --- des/des_local.h    Wed May 13 09:33:02 1992
  349. ***************
  350. *** 3,9 ****
  351.   #include <stdio.h>
  352.   #include "des.h"
  353.   
  354. ! #if defined(__STDC__) || defined(VMS)
  355.   #include <string.h>
  356.   #define bcopy(b1,b2,len) memcpy(b2, b1, (size_t)(len))
  357.   #define bzero(b,len) memset(b, 0, (size_t)(len))
  358. --- 3,9 ----
  359.   #include <stdio.h>
  360.   #include "des.h"
  361.   
  362. ! #if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
  363.   #include <string.h>
  364.   #define bcopy(b1,b2,len) memcpy(b2, b1, (size_t)(len))
  365.   #define bzero(b,len) memset(b, 0, (size_t)(len))
  366. ***************
  367. *** 11,20 ****
  368. --- 11,35 ----
  369.   #define index(s1,char) strchr(s1,char)
  370.   #endif
  371.   
  372. + #ifdef MSDOS
  373. + #define getpid() 2
  374. + #define RAND
  375. + extern int errno;
  376. + #endif
  377. + #ifdef RAND
  378. + #define random() rand()
  379. + #define srandom(s) srand(s)
  380. + #endif
  381. + #ifndef _AIX
  382.   typedef unsigned char uchar;
  383.   typedef unsigned short ushort;
  384. + #ifndef _HPUX
  385.   typedef unsigned int uint;
  386.   typedef unsigned long ulong;
  387. + #endif
  388. + #endif
  389.   
  390.   #define ITERATIONS 16
  391.   #define HALF_ITERATIONS 8
  392. diff -c -r des.old/ecb_encrypt.c des/ecb_encrypt.c
  393. *** des.old/ecb_encrypt.c    Wed May 13 12:36:48 1992
  394. --- des/ecb_encrypt.c    Wed May 13 09:56:25 1992
  395. ***************
  396. *** 27,36 ****
  397.       return(0);
  398.       }
  399.   
  400.   #define D_ENCRYPT(L,R,S)    \
  401.       u=(R^s[S  ]); \
  402. !     t=(R^s[S+1]); \
  403. !     t=(t>>4)|(t<<28); \
  404.       L^=    des_SPtrans[1][(t    )&0x3f]| \
  405.           des_SPtrans[3][(t>> 8)&0x3f]| \
  406.           des_SPtrans[5][(t>>16)&0x3f]| \
  407. --- 27,53 ----
  408.       return(0);
  409.       }
  410.   
  411. + /* The changes to this macro may help or hinder, depending on the
  412. +  * compiler and the achitecture.  gcc2 always seems to do well :-).  */
  413. + #ifdef ALT_ECB
  414. + #define D_ENCRYPT(L,R,S) \
  415. +     u=((R^s[S  ])<<2);    \
  416. +     t= R^s[S+1]; \
  417. +     t=((t>>2)+(t<<30)); \
  418. +     L^= \
  419. +     *(ulong *)(des_SP+0x0100+((t    )&0xfc))+ \
  420. +     *(ulong *)(des_SP+0x0300+((t>> 8)&0xfc))+ \
  421. +     *(ulong *)(des_SP+0x0500+((t>>16)&0xfc))+ \
  422. +     *(ulong *)(des_SP+0x0700+((t>>24)&0xfc))+ \
  423. +     *(ulong *)(des_SP+       ((u    )&0xfc))+ \
  424. +       *(ulong *)(des_SP+0x0200+((u>> 8)&0xfc))+ \
  425. +       *(ulong *)(des_SP+0x0400+((u>>16)&0xfc))+ \
  426. +      *(ulong *)(des_SP+0x0600+((u>>24)&0xfc));
  427. + #else /* original version */
  428.   #define D_ENCRYPT(L,R,S)    \
  429.       u=(R^s[S  ]); \
  430. !     t=R^s[S+1]; \
  431. !     t=((t>>4)+(t<<28)); \
  432.       L^=    des_SPtrans[1][(t    )&0x3f]| \
  433.           des_SPtrans[3][(t>> 8)&0x3f]| \
  434.           des_SPtrans[5][(t>>16)&0x3f]| \
  435. ***************
  436. *** 39,44 ****
  437. --- 56,62 ----
  438.           des_SPtrans[2][(u>> 8)&0x3f]| \
  439.           des_SPtrans[4][(u>>16)&0x3f]| \
  440.           des_SPtrans[6][(u>>24)&0x3f];
  441. + #endif
  442.   
  443.       /* IP and FP
  444.        * The problem is more of a geometric problem that random bit fiddling.
  445. ***************
  446. *** 88,93 ****
  447. --- 106,114 ----
  448.   int encrypt;
  449.       {
  450.       register ulong l,r,t,u;
  451. + #ifdef ALT_ECB
  452. +     register uchar *des_SP=(uchar *)des_SPtrans;
  453. + #endif
  454.       register int i;
  455.       register ulong *s;
  456.   
  457. diff -c -r des.old/enc_read.c des/enc_read.c
  458. *** des.old/enc_read.c    Wed May 13 12:35:57 1992
  459. --- des/enc_read.c    Tue Apr 28 12:32:13 1992
  460. ***************
  461. *** 7,12 ****
  462. --- 7,31 ----
  463.   extern int errno;
  464.   int des_rw_mode=DES_PCBC_MODE;
  465.   
  466. + /* Functions to convert from/to network byte order (big endian)
  467. +  * for MSDOS (little endian) */
  468. + #ifdef MSDOS
  469. + #define NETCONV(name) \
  470. + ulong name(l) \
  471. + ulong l; \
  472. +     { \
  473. +     ulong t; \
  474. + \
  475. +     t=(l>>16)|(l<<16); \
  476. +     t=((t<<8)&0xff00ff00)|((t>>8)&0x00ff00ff); \
  477. +     return(t); \
  478. +     }
  479. + NETCONV(htonl);
  480. + NETCONV(ntohl);
  481. + #endif
  482.   int des_enc_read(fd,buf,len,sched,iv)
  483.   int fd;
  484.   char *buf;
  485. diff -c -r des.old/fcrypt.c des/fcrypt.c
  486. *** des.old/fcrypt.c    Wed May 13 12:36:50 1992
  487. --- des/fcrypt.c    Wed May 13 10:24:23 1992
  488. ***************
  489. *** 387,392 ****
  490. --- 387,412 ----
  491.    * modified stuff for crypt.
  492.    ******************************************************************/
  493.   
  494. + /* The changes to this macro may help or hinder, depending on the
  495. +  * compiler and the achitecture.  gcc2 always seems to do well :-).  */
  496. + #ifdef ALT_ECB
  497. + #define D_ENCRYPT(L,R,S) \
  498. +     v=(R^(R>>16)); \
  499. +     u=(v&E0); \
  500. +     v=(v&E1); \
  501. +     u=((u^(u<<16))^R^s[S  ])<<2; \
  502. +     t=(v^(v<<16))^R^s[S+1]; \
  503. +     t=(t>>2)|(t<<30); \
  504. +     L^= \
  505. +     *(ulong *)(des_SP+0x0100+((t    )&0xfc))+ \
  506. +     *(ulong *)(des_SP+0x0300+((t>> 8)&0xfc))+ \
  507. +     *(ulong *)(des_SP+0x0500+((t>>16)&0xfc))+ \
  508. +     *(ulong *)(des_SP+0x0700+((t>>24)&0xfc))+ \
  509. +     *(ulong *)(des_SP+       ((u    )&0xfc))+ \
  510. +       *(ulong *)(des_SP+0x0200+((u>> 8)&0xfc))+ \
  511. +       *(ulong *)(des_SP+0x0400+((u>>16)&0xfc))+ \
  512. +      *(ulong *)(des_SP+0x0600+((u>>24)&0xfc));
  513. + #else /* original version */
  514.   #define D_ENCRYPT(L,R,S)    \
  515.       v=(R^(R>>16)); \
  516.       u=(v&E0); \
  517. ***************
  518. *** 402,407 ****
  519. --- 422,428 ----
  520.           SPtrans[2][(u>> 8)&0x3f]| \
  521.           SPtrans[4][(u>>16)&0x3f]| \
  522.           SPtrans[6][(u>>24)&0x3f];
  523. + #endif
  524.   
  525.   #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
  526.       (b)^=(t),\
  527. ***************
  528. *** 498,503 ****
  529. --- 519,527 ----
  530.   ulong Eswap0,Eswap1;
  531.       {
  532.       register unsigned long l,r,t,u,v;
  533. + #ifdef ALT_ECB
  534. +     register uchar *des_SP=(uchar *)SPtrans;
  535. + #endif
  536.       register unsigned long *s;
  537.       register int i,j;
  538.       register unsigned long E0,E1;
  539. diff -c -r des.old/makefile des/makefile
  540. *** des.old/makefile    Wed May 13 12:36:52 1992
  541. --- des/makefile    Wed May 13 12:35:27 1992
  542. ***************
  543. *** 1,7 ****
  544.   #CC=gcc
  545. ! #CFLAGS= -O2
  546.   CC=cc
  547. ! CFLAGS= -O
  548.   
  549.   LIBDIR=/usr/local/lib
  550.   BINDIR=/usr/local/bin
  551. --- 1,26 ----
  552. + # Version 1.94 has changed the strings_to_key function so that it is
  553. + # now compatible with MITs when the string is longer than 8 characters.
  554. + # If you wish to keep the old version, uncomment the following line.
  555. + # This will affect the -E/-D options on des(1).
  556. + #OPTS1= -DOLD_STR_TO_KEY
  557. + # This #define specifies the use of an alternative D_ENCRYPT macro in
  558. + # ecb_encrypt.  The choice of macro can make a %20 difference in the
  559. + # speed.  Unfortunatly the choise of the best macro appears to be very
  560. + # dependant on the compiler and the machine in question.
  561. + # For the following combinations use the ALT_ECB option.
  562. + # Sparc 2 (cc -O4), sun 3/260 (cc -O4)
  563. + # For the following combinations do not use the ALT_ECB option.
  564. + # Sparc 2 (gcc2 -O2), sun 3/260 (cc -O2), mvax2 (cc -O), MSDOS (Turbo Cv2)
  565. + # For other machines, experiment with changing the option and run
  566. + # ./speed to see which is faster.
  567. + #OPTS2= -DALT_ECB
  568. + OPTS= $(OPTS1) $(OPTS2)
  569.   #CC=gcc
  570. ! #CFLAGS= -O2 $(OPTS)
  571.   CC=cc
  572. ! CFLAGS= -O $(OPTS)
  573.   
  574.   LIBDIR=/usr/local/lib
  575.   BINDIR=/usr/local/bin
  576. ***************
  577. *** 9,14 ****
  578. --- 28,34 ----
  579.   MANDIR=/usr/local/man
  580.   MAN1=1
  581.   MAN3=3
  582. + SHELL=/bin/sh
  583.   
  584.   OBJS=    cbc_cksum.o cbc_encrypt.o ecb_encrypt.o pcbc_encrypt.o \
  585.       quad_cksum.o random_key.o read_password.o set_key.o string_to_key.o \
  586. diff -c -r des.old/read_password.c des/read_password.c
  587. *** des.old/read_password.c    Wed May 13 12:36:52 1992
  588. --- des/read_password.c    Tue Apr 28 12:32:13 1992
  589. ***************
  590. *** 6,20 ****
  591.   #include <signal.h>
  592.   #include <setjmp.h>
  593.   #ifndef VMS
  594.   #include <sgtty.h>
  595.   #include <sys/ioctl.h>
  596.   #else /* VMS */
  597. ! truct sgttyb {
  598. !     unsigned char class, ttype;
  599. !     unsigned short pgwid;
  600. !     unsigned ttchr : 24;
  601. !     unsigned char pglen;
  602. !     unsigned int xchar;
  603.       };
  604.   #endif
  605.   
  606. --- 6,29 ----
  607.   #include <signal.h>
  608.   #include <setjmp.h>
  609.   #ifndef VMS
  610. + #ifndef MSDOS
  611.   #include <sgtty.h>
  612.   #include <sys/ioctl.h>
  613. + #else /* MSDOS */
  614. + #define fgets(a,b,c) noecho_fgets(a,b,c)
  615. + #ifndef NSIG
  616. + #define NSIG 32
  617. + #endif
  618. + #endif
  619.   #else /* VMS */
  620. ! #include <ssdef.h>
  621. ! #include <iodef.h>
  622. ! #include <ttdef.h>
  623. ! #include <descrip.h>
  624. ! struct IOSB {
  625. !     short iosb$w_value;
  626. !     short iosb$w_count;
  627. !     long  iosb$l_info;
  628.       };
  629.   #endif
  630.   
  631. ***************
  632. *** 73,91 ****
  633.   char *prompt;
  634.   int verify;
  635.       {
  636.       struct sgttyb tty_orig,tty_new;
  637.       int ok=0;
  638.       char *p;
  639.       int ps=0;
  640.       FILE *tty;
  641.   
  642.       if ((tty=fopen("/dev/tty","r")) == NULL)
  643.           tty=stdin;
  644.   #ifdef TIOCGETP
  645.       if (ioctl(fileno(tty),TIOCGETP,(char *)&tty_orig) == -1)
  646.           return(-1);
  647. - #endif
  648.       bcopy(&(tty_orig),&(tty_new),sizeof(tty_orig));
  649.       if (setjmp(save))
  650.           {
  651.           ok=0;
  652. --- 82,125 ----
  653.   char *prompt;
  654.   int verify;
  655.       {
  656. + #ifndef VMS
  657. + #ifndef MSDOS
  658.       struct sgttyb tty_orig,tty_new;
  659. + #endif /* !MSDOS */
  660. + #else
  661. +     struct IOSB iosb;
  662. +     $DESCRIPTOR(terminal,"TT");
  663. +     long tty_orig[3], tty_new[3];
  664. +     long status;
  665. +     unsigned short channel = 0;
  666. + #endif
  667.       int ok=0;
  668.       char *p;
  669.       int ps=0;
  670.       FILE *tty;
  671.   
  672. + #ifndef MSDOS
  673.       if ((tty=fopen("/dev/tty","r")) == NULL)
  674.           tty=stdin;
  675. + #else /* MSDOS */
  676. +     if ((tty=fopen("con","r")) == NULL)
  677. +         tty=stdin;
  678. + #endif /* MSDOS */
  679. + #ifndef VMS
  680.   #ifdef TIOCGETP
  681.       if (ioctl(fileno(tty),TIOCGETP,(char *)&tty_orig) == -1)
  682.           return(-1);
  683.       bcopy(&(tty_orig),&(tty_new),sizeof(tty_orig));
  684. + #endif
  685. + #else /* VMS */
  686. +     status = SYS$ASSIGN(&terminal,&channel,0,0);
  687. +     if (status != SS$_NORMAL)
  688. +         return(-1);
  689. +     status=SYS$QIOW(0,channel,IO$_SENSEMODE,&iosb,0,0,tty_orig,12,0,0,0,0);
  690. +     if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
  691. +         return(-1);
  692. + #endif
  693.       if (setjmp(save))
  694.           {
  695.           ok=0;
  696. ***************
  697. *** 93,103 ****
  698. --- 127,148 ----
  699.           }
  700.       pushsig();
  701.       ps=1;
  702. + #ifndef VMS
  703. + #ifndef MSDOS
  704.       tty_new.sg_flags &= ~ECHO;
  705. + #endif /* !MSDOS */
  706.   #ifdef TIOCSETP
  707.       if (ioctl(fileno(tty),TIOCSETP,(char *)&tty_new) == -1)
  708.           return(-1);
  709.   #endif
  710. + #else /* VMS */
  711. +     tty_new[0] = tty_orig[0];
  712. +     tty_new[1] = tty_orig[1] | TT$M_NOECHO;
  713. +     tty_new[2] = tty_orig[2];
  714. +     status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0);
  715. +     if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
  716. +         return(-1);
  717. + #endif /* VMS */
  718.       ps=2;
  719.   
  720.       while (!ok)
  721. ***************
  722. *** 135,145 ****
  723. --- 180,200 ----
  724.   error:
  725.       fprintf(stderr,"\n");
  726.       /* What can we do if there is an error? */
  727. + #ifndef VMS
  728.   #ifdef TIOCSETP
  729.       if (ps >= 2) ioctl(fileno(tty),TIOCSETP,(char *)&tty_orig);
  730.   #endif
  731. + #else /* VMS */
  732. +     if (ps >= 2)
  733. +         status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0
  734. +             ,tty_orig,12,0,0,0,0);
  735. + #endif /* VMS */
  736. +     
  737.       if (ps >= 1) popsig();
  738.       if (stdin != tty) fclose(tty);
  739. + #ifdef VMS
  740. +     status = SYS$DASSGN(channel);
  741. + #endif
  742.       return(!ok);
  743.       }
  744.   
  745. ***************
  746. *** 163,165 ****
  747. --- 218,250 ----
  748.       {
  749.       longjmp(save,1);
  750.       }
  751. + #ifdef MSDOS
  752. + static int noecho_fgets(buf,size,tty)
  753. + char *buf;
  754. + int size;
  755. + FILE *tty;
  756. +     {
  757. +     int i;
  758. +     char *p;
  759. +     p=buf;
  760. +     for (;;)
  761. +         {
  762. +         if (size == 0)
  763. +             {
  764. +             *p='\0';
  765. +             break;
  766. +             }
  767. +         size--;
  768. +         i=getch();
  769. +         if (i == '\r') i='\n';
  770. +         *(p++)=i;
  771. +         if (i == '\n')
  772. +             {
  773. +             *p='\0';
  774. +             break;
  775. +             }
  776. +         }
  777. +     }
  778. + #endif
  779. diff -c -r des.old/set_key.c des/set_key.c
  780. *** des.old/set_key.c    Wed May 13 12:36:06 1992
  781. --- des/set_key.c    Thu Apr 23 12:41:58 1992
  782. ***************
  783. *** 168,174 ****
  784.       return(0);
  785.       }
  786.   
  787. ! int key_sched(key,schedule)
  788.   des_cblock *key;
  789.   des_key_schedule schedule;
  790.       {
  791. --- 168,174 ----
  792.       return(0);
  793.       }
  794.   
  795. ! int des_key_sched(key,schedule)
  796.   des_cblock *key;
  797.   des_key_schedule schedule;
  798.       {
  799. diff -c -r des.old/speed.c des/speed.c
  800. *** des.old/speed.c    Wed May 13 12:36:53 1992
  801. --- des/speed.c    Wed May 13 09:42:30 1992
  802. ***************
  803. *** 2,16 ****
  804.   /* Copyright (C) 1992 Eric Young - see COPYING for more details */
  805.   /* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
  806.   
  807.   #define TIMES
  808.   
  809.   #include <stdio.h>
  810.   #include <signal.h>
  811. - #undef SIGALRM
  812.   #ifndef VMS
  813.   #include <time.h>
  814.   #include <sys/types.h>
  815.   #include <sys/times.h>
  816.   #else /* VMS */
  817.   #include <types.h>
  818.   struct tms {
  819. --- 2,19 ----
  820.   /* Copyright (C) 1992 Eric Young - see COPYING for more details */
  821.   /* 06-Apr-92 Luke Brennan    Support for VMS and add extra signal calls */
  822.   
  823. + #ifndef MSDOS
  824.   #define TIMES
  825. + #endif
  826.   
  827.   #include <stdio.h>
  828.   #include <signal.h>
  829.   #ifndef VMS
  830.   #include <time.h>
  831.   #include <sys/types.h>
  832. + #ifdef TIMES
  833.   #include <sys/times.h>
  834. + #endif /* TIMES */
  835.   #else /* VMS */
  836.   #include <types.h>
  837.   struct tms {
  838. ***************
  839. *** 36,42 ****
  840.   #define HZ ((double)CLK_TCK)
  841.   #endif
  842.   
  843. ! #define BUFSIZE    (1024*8)
  844.   long run=0;
  845.   
  846.   #ifdef SIGALRM
  847. --- 39,45 ----
  848.   #define HZ ((double)CLK_TCK)
  849.   #endif
  850.   
  851. ! #define BUFSIZE    ((long)1024*8)
  852.   long run=0;
  853.   
  854.   #ifdef SIGALRM
  855. ***************
  856. *** 57,65 ****
  857.   #define START    0
  858.   #define STOP    1
  859.   
  860. ! double Time(s)
  861.   int s;
  862.       {
  863.   #ifdef TIMES
  864.       static struct tms tstart,tend;
  865.   
  866. --- 60,69 ----
  867.   #define START    0
  868.   #define STOP    1
  869.   
  870. ! double Time_F(s)
  871.   int s;
  872.       {
  873. +     double ret;
  874.   #ifdef TIMES
  875.       static struct tms tstart,tend;
  876.   
  877. ***************
  878. *** 71,77 ****
  879.       else
  880.           {
  881.           times(&tend);
  882. !         return(((double)(tend.tms_utime-tstart.tms_utime))/HZ);
  883.           }
  884.   #else /* !times() */
  885.       static struct timeb tstart,tend;
  886. --- 75,82 ----
  887.       else
  888.           {
  889.           times(&tend);
  890. !         ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
  891. !         return((ret == 0.0)?1e-6:ret);
  892.           }
  893.   #else /* !times() */
  894.       static struct timeb tstart,tend;
  895. ***************
  896. *** 85,92 ****
  897.       else
  898.           {
  899.           ftime(&tend);
  900. !         i=(long)tend.time-(long)tstart.time;
  901. !         return(((double)(tend.time-tstart.time))+i/1000.0);
  902.           }
  903.   #endif
  904.       }
  905. --- 90,98 ----
  906.       else
  907.           {
  908.           ftime(&tend);
  909. !         i=(long)tend.millitm-(long)tstart.millitm;
  910. !         ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
  911. !         return((ret == 0.0)?1e-6:ret);
  912.           }
  913.   #endif
  914.       }
  915. ***************
  916. *** 100,106 ****
  917.       static unsigned char buf[BUFSIZE];
  918.       static des_cblock key={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
  919.       des_key_schedule sch;
  920. !     int i,j,k,enc,cat=0,catfd;
  921.       double d,a,b,c;
  922.       long ca,cb,cc,cd;
  923.   
  924. --- 106,112 ----
  925.       static unsigned char buf[BUFSIZE];
  926.       static des_cblock key={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
  927.       des_key_schedule sch;
  928. !     int i,j,k,enc,catfd;
  929.       double d,a,b,c;
  930.       long ca,cb,cc,cd;
  931.   
  932. ***************
  933. *** 115,130 ****
  934.       count=10;
  935.       do    {
  936.           count*=2;
  937. !         Time(START);
  938.           for (i=count; i; i--)
  939.               des_ecb_encrypt(buf,buf,&(sch[0]),DES_ENCRYPT);
  940. !         d=Time(STOP);
  941.           } while (d <3);
  942.       ca=count;
  943.       cb=count*10;
  944.       cc=count*10*8/BUFSIZE+1;
  945.       cd=count/20+1;
  946. !     printf("Doing set_key's %d times\n",ca);
  947.   #define COND(d)    (count != (d))
  948.   #define COUNT(d) (d)
  949.   #else
  950. --- 121,136 ----
  951.       count=10;
  952.       do    {
  953.           count*=2;
  954. !         Time_F(START);
  955.           for (i=count; i; i--)
  956.               des_ecb_encrypt(buf,buf,&(sch[0]),DES_ENCRYPT);
  957. !         d=Time_F(STOP);
  958.           } while (d <3);
  959.       ca=count;
  960.       cb=count*10;
  961.       cc=count*10*8/BUFSIZE+1;
  962.       cd=count/20+1;
  963. !     printf("Doing set_key's %ld times\n",ca);
  964.   #define COND(d)    (count != (d))
  965.   #define COUNT(d) (d)
  966.   #else
  967. ***************
  968. *** 135,145 ****
  969.       alarm(60);
  970.   #endif
  971.   
  972. !     Time(START);
  973.       for (count=0,run=1; COND(ca); count++)
  974.           des_set_key(key,sch);
  975. !     d=Time(STOP);
  976. !     printf("%d set_key's in %.2f seconds\n",count,d);
  977.       a=((double)COUNT(ca))/d;
  978.   
  979.   #ifdef SIGALRM
  980. --- 141,151 ----
  981.       alarm(60);
  982.   #endif
  983.   
  984. !     Time_F(START);
  985.       for (count=0,run=1; COND(ca); count++)
  986.           des_set_key(key,sch);
  987. !     d=Time_F(STOP);
  988. !     printf("%ld set_key's in %.2f seconds\n",count,d);
  989.       a=((double)COUNT(ca))/d;
  990.   
  991.   #ifdef SIGALRM
  992. ***************
  993. *** 146,173 ****
  994.       printf("Doing des_ecb_encrypt's for 60 seconds\n");
  995.       alarm(60);
  996.   #else
  997. !     printf("Doing %d des_ecb_encrypt's\n",cb);
  998.   #endif
  999. !     Time(START);
  1000.       for (count=0,run=1; COND(cb); count++)
  1001.           des_ecb_encrypt(buf,buf,&(sch[0]),DES_ENCRYPT);
  1002. !     d=Time(STOP);
  1003. !     printf("%d des_ecb_encrypt's in %.2f second\n",count,d);
  1004.       b=((double)COUNT(cb)*8)/d;
  1005.   
  1006.   #ifdef SIGALRM
  1007. !     printf("Doing des_cbc_encrypt on %d byte blocks for 60 seconds\n",
  1008.           BUFSIZE);
  1009.       alarm(60);
  1010.   #else
  1011. !     printf("Doing %d des_cbc_encrypt's on %d byte blocks\n",cc,BUFSIZE);
  1012.   #endif
  1013. !     Time(START);
  1014.       for (count=0,run=1; COND(cc); count++)
  1015.           des_cbc_encrypt(buf,buf,BUFSIZE,&(sch[0]),
  1016.           &(key[0]),DES_ENCRYPT);
  1017. !     d=Time(STOP);
  1018. !     printf("%d des_cbc_encrypt's of %d byte blocks in %.2f second\n",
  1019.           count,BUFSIZE,d);
  1020.       c=((double)COUNT(cc)*BUFSIZE)/d;
  1021.   
  1022. --- 152,179 ----
  1023.       printf("Doing des_ecb_encrypt's for 60 seconds\n");
  1024.       alarm(60);
  1025.   #else
  1026. !     printf("Doing %ld des_ecb_encrypt's\n",cb);
  1027.   #endif
  1028. !     Time_F(START);
  1029.       for (count=0,run=1; COND(cb); count++)
  1030.           des_ecb_encrypt(buf,buf,&(sch[0]),DES_ENCRYPT);
  1031. !     d=Time_F(STOP);
  1032. !     printf("%ld des_ecb_encrypt's in %.2f second\n",count,d);
  1033.       b=((double)COUNT(cb)*8)/d;
  1034.   
  1035.   #ifdef SIGALRM
  1036. !     printf("Doing des_cbc_encrypt on %ld byte blocks for 60 seconds\n",
  1037.           BUFSIZE);
  1038.       alarm(60);
  1039.   #else
  1040. !     printf("Doing %ld des_cbc_encrypt's on %ld byte blocks\n",cc,BUFSIZE);
  1041.   #endif
  1042. !     Time_F(START);
  1043.       for (count=0,run=1; COND(cc); count++)
  1044.           des_cbc_encrypt(buf,buf,BUFSIZE,&(sch[0]),
  1045.           &(key[0]),DES_ENCRYPT);
  1046. !     d=Time_F(STOP);
  1047. !     printf("%ld des_cbc_encrypt's of %ld byte blocks in %.2f second\n",
  1048.           count,BUFSIZE,d);
  1049.       c=((double)COUNT(cc)*BUFSIZE)/d;
  1050.   
  1051. ***************
  1052. *** 175,191 ****
  1053.       printf("Doing crypt for 60 seconds\n");
  1054.       alarm(60);
  1055.   #else
  1056. !     printf("Doing %d crypt's\n",cd);
  1057.   #endif
  1058. !     Time(START);
  1059.       for (count=0,run=1; COND(cd); count++)
  1060.           crypt("testing1","ef");
  1061. !     d=Time(STOP);
  1062. !     printf("%d crypts in %.2f second\n",count,d);
  1063.       d=((double)COUNT(cd))/d;
  1064.   
  1065. !     printf("set_key       per sec = %12.2f\n",a);
  1066. !     printf("DES ecb bytes per sec = %12.2f\n",b);
  1067. !     printf("DES cbc bytes per sec = %12.2f\n",c);
  1068. !     printf("crypt         per sec = %12.2f\n",d);
  1069.       }
  1070. --- 181,197 ----
  1071.       printf("Doing crypt for 60 seconds\n");
  1072.       alarm(60);
  1073.   #else
  1074. !     printf("Doing %ld crypt's\n",cd);
  1075.   #endif
  1076. !     Time_F(START);
  1077.       for (count=0,run=1; COND(cd); count++)
  1078.           crypt("testing1","ef");
  1079. !     d=Time_F(STOP);
  1080. !     printf("%ld crypts in %.2f second\n",count,d);
  1081.       d=((double)COUNT(cd))/d;
  1082.   
  1083. !     printf("set_key       per sec = %12.2f (%5.1fuS)\n",a,1.0e6/a);
  1084. !     printf("DES ecb bytes per sec = %12.2f (%5.1fuS)\n",b,8.0e6/b);
  1085. !     printf("DES cbc bytes per sec = %12.2f (%5.1fuS)\n",c,8.0e6/c);
  1086. !     printf("crypt         per sec = %12.2f (%5.1fuS)\n",d,1.0e6/d);
  1087.       }
  1088. diff -c -r des.old/spr.h des/spr.h
  1089. *** des.old/spr.h    Wed May 13 12:36:53 1992
  1090. --- des/spr.h    Thu Apr 30 12:09:21 1992
  1091. ***************
  1092. *** 1,4 ****
  1093. ! /* sp.h */
  1094.   /* Copyright (C) 1992 Eric Young - see COPYING for more details */
  1095.   static unsigned long des_SPtrans[8][64]={
  1096.   /* nibble 0 */
  1097. --- 1,4 ----
  1098. ! /* spr.h */
  1099.   /* Copyright (C) 1992 Eric Young - see COPYING for more details */
  1100.   static unsigned long des_SPtrans[8][64]={
  1101.   /* nibble 0 */
  1102. diff -c -r des.old/string_to_key.c des/string_to_key.c
  1103. *** des.old/string_to_key.c    Wed May 13 12:36:03 1992
  1104. --- des/string_to_key.c    Tue May  5 16:04:26 1992
  1105. ***************
  1106. *** 8,18 ****
  1107. --- 8,36 ----
  1108.       {
  1109.       des_key_schedule ks;
  1110.       int i,length;
  1111. +     register uchar j;
  1112.   
  1113.       bzero(key,8);
  1114.       length=strlen(str);
  1115. + #ifdef OLD_STR_TO_KEY
  1116.       for (i=0; i<length; i++)
  1117.           (*key)[i%8]^=(str[i]<<1);
  1118. + #else /* MIT COMPATIBLE */
  1119. +     for (i=0; i<length; i++)
  1120. +         {
  1121. +         j=str[i];
  1122. +         if ((i%16) < 8)
  1123. +             (*key)[i%8]^=(j<<1);
  1124. +         else
  1125. +             {
  1126. +             /* Reverse the bit order 05/05/92 eay */
  1127. +             j=((j<<4)&0xf0)|((j>>4)&0x0f);
  1128. +             j=((j<<2)&0xcc)|((j>>2)&0x33);
  1129. +             j=((j<<1)&0xaa)|((j>>1)&0x55);
  1130. +             (*key)[7-(i%8)]^=j;
  1131. +             }
  1132. +         }
  1133. + #endif
  1134.       des_set_odd_parity((des_cblock *)key);
  1135.       des_set_key((des_cblock *)key,ks);
  1136.       des_cbc_cksum((des_cblock *)str,(des_cblock *)key,(long)length,ks,
  1137. diff -c -r des.old/times des/times
  1138. *** des.old/times    Wed May 13 12:36:54 1992
  1139. --- des/times    Wed May 13 09:41:53 1992
  1140. ***************
  1141. *** 1,5 ****
  1142. --- 1,11 ----
  1143.   New version 1.92 - slight speedup.
  1144.   
  1145. + PA-RISC 1.1 HP 710, 16 MB memory, NFS mounted disks:
  1146. + set_key       per sec =     38916.86
  1147. + DES ecb bytes per sec =    505971.82
  1148. + DES cbc bytes per sec =    515381.13
  1149. + crypt         per sec =      2438.24
  1150.   sun sparc 2 - gcc2 -O2
  1151.   set_key       per sec =     21559.10
  1152.   DES ecb bytes per sec =    305566.92
  1153. ***************
  1154. *** 6,45 ****
  1155.   DES cbc bytes per sec =    303497.50
  1156.   crypt         per sec =      1410.48
  1157.   
  1158.   
  1159. ! Old version 1.90
  1160.   
  1161. ! sun sparc 2 - gcc2 -O2
  1162. ! -rw-r-----  1 eay      wheel       25804 Mar 24 14:16 libdes.a
  1163. ! set_key       per sec =     21462.36
  1164. ! DES ecb bytes per sec =    289342.72
  1165. ! DES cbc bytes per sec =    288306.34
  1166. ! crypt         per sec =      1343.25
  1167.   
  1168. ! sun sparc 2 - cc -O4
  1169. ! -rw-r-----  1 eay      wheel       27444 Mar 24 14:47 libdes.a
  1170. ! set_key       per sec =     20065.82
  1171. ! DES ecb bytes per sec =    240058.09
  1172. ! DES cbc bytes per sec =    240987.25
  1173. ! crypt         per sec =      1147.72
  1174.   
  1175. ! sun 3/260 gcc -O2
  1176. ! -rw-r-----  1 eay      wheel       22540 Mar 25 07:30 libdes.a
  1177. ! set_key       per sec =      3305.00
  1178. ! DES ecb bytes per sec =     41326.80
  1179. ! DES cbc bytes per sec =     42421.17
  1180. ! crypt         per sec =       187.79
  1181.   
  1182. - sun 3/260 cc -O4
  1183. - -rw-r-----  1 eay      wheel       23714 Mar 25 07:15 libdes.a
  1184. - set_key       per sec =      2994.30
  1185. - DES ecb bytes per sec =     31061.97
  1186. - DES cbc bytes per sec =     31561.52
  1187. - crypt         per sec =       148.66
  1188.   From Robert Withrow <witr@rwwa.COM>
  1189.   386/33 - cc -O
  1190. - -rw-r--r--   1 root     other      32708 Apr  4 14:45 /usr/local/lib/libdes.a
  1191.   set_key       per sec =      5475.44
  1192.   DES ecb bytes per sec =     64527.52
  1193.   DES cbc bytes per sec =     67086.06
  1194. --- 12,44 ----
  1195.   DES cbc bytes per sec =    303497.50
  1196.   crypt         per sec =      1410.48
  1197.   
  1198. + RS/6000 model 320
  1199. + set_key       per sec =     14371.93
  1200. + DES ecb bytes per sec =    222231.26
  1201. + DES cbc bytes per sec =    223926.79
  1202. + crypt         per sec =       981.20
  1203.   
  1204. ! 68030 HP400, 16 MB memory, local 660 MB disk
  1205. ! set_key       per sec =      5251.28
  1206. ! DES ecb bytes per sec =     56186.56
  1207. ! DES cbc bytes per sec =     58681.53
  1208. ! crypt         per sec =       276.15
  1209.   
  1210. ! 80386/???mh MSDOS Turbo C v 2.0
  1211. ! set_key       per sec =       918.39
  1212. ! DES ecb bytes per sec =     15568.23
  1213. ! DES cbc bytes per sec =     15575.90
  1214. ! crypt         per sec =        74.67
  1215.   
  1216. ! 8088/4.77mh MSDOS Turbo C v 2.0
  1217. ! set_key       per sec =        35.09
  1218. ! DES ecb bytes per sec =       563.63
  1219. ! crypt         per sec =         2.69
  1220.   
  1221. ! libdes Version 1.90 (5% slower)
  1222.   
  1223.   From Robert Withrow <witr@rwwa.COM>
  1224.   386/33 - cc -O
  1225.   set_key       per sec =      5475.44
  1226.   DES ecb bytes per sec =     64527.52
  1227.   DES cbc bytes per sec =     67086.06
  1228. exit 0 # Just in case...
  1229.