summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/des/des.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/des/des.c')
-rw-r--r--src/lib/libcrypto/des/des.c220
1 files changed, 94 insertions, 126 deletions
diff --git a/src/lib/libcrypto/des/des.c b/src/lib/libcrypto/des/des.c
index c1e5005474..d8c846b23d 100644
--- a/src/lib/libcrypto/des/des.c
+++ b/src/lib/libcrypto/des/des.c
@@ -58,17 +58,26 @@
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include <stdlib.h> 60#include <stdlib.h>
61#ifndef MSDOS 61#include <string.h>
62#include <openssl/opensslconf.h>
63#ifndef OPENSSL_SYS_MSDOS
64#ifndef OPENSSL_SYS_VMS
65#include OPENSSL_UNISTD
66#else /* OPENSSL_SYS_VMS */
67#ifdef __DECC
62#include <unistd.h> 68#include <unistd.h>
63#else 69#else /* not __DECC */
70#include <math.h>
71#endif /* __DECC */
72#endif /* OPENSSL_SYS_VMS */
73#else /* OPENSSL_SYS_MSDOS */
64#include <io.h> 74#include <io.h>
65#define RAND
66#endif 75#endif
67 76
68#include <time.h> 77#include <time.h>
69#include "des_ver.h" 78#include "des_ver.h"
70 79
71#ifdef VMS 80#ifdef OPENSSL_SYS_VMS
72#include <types.h> 81#include <types.h>
73#include <stat.h> 82#include <stat.h>
74#else 83#else
@@ -77,21 +86,10 @@
77#endif 86#endif
78#include <sys/stat.h> 87#include <sys/stat.h>
79#endif 88#endif
80#if defined(NOCONST) 89#include <openssl/des.h>
81#define const 90#include <openssl/rand.h>
82#endif 91#include <openssl/ui_compat.h>
83#include "des.h"
84
85#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
86#include <string.h>
87#endif
88 92
89#ifdef RAND
90#define random rand
91#define srandom(s) srand(s)
92#endif
93
94#ifndef NOPROTO
95void usage(void); 93void usage(void);
96void doencryption(void); 94void doencryption(void);
97int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp); 95int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp);
@@ -99,21 +97,10 @@ void uufwriteEnd(FILE *fp);
99int uufread(unsigned char *out,int size,unsigned int num,FILE *fp); 97int uufread(unsigned char *out,int size,unsigned int num,FILE *fp);
100int uuencode(unsigned char *in,int num,unsigned char *out); 98int uuencode(unsigned char *in,int num,unsigned char *out);
101int uudecode(unsigned char *in,int num,unsigned char *out); 99int uudecode(unsigned char *in,int num,unsigned char *out);
102void des_3cbc_encrypt(des_cblock *input,des_cblock *output,long length, 100void DES_3cbc_encrypt(DES_cblock *input,DES_cblock *output,long length,
103 des_key_schedule sk1,des_key_schedule sk2, 101 DES_key_schedule sk1,DES_key_schedule sk2,
104 des_cblock *ivec1,des_cblock *ivec2,int enc); 102 DES_cblock *ivec1,DES_cblock *ivec2,int enc);
105#else 103#ifdef OPENSSL_SYS_VMS
106void usage();
107void doencryption();
108int uufwrite();
109void uufwriteEnd();
110int uufread();
111int uuencode();
112int uudecode();
113void des_3cbc_encrypt();
114#endif
115
116#ifdef VMS
117#define EXIT(a) exit(a&0x10000000L) 104#define EXIT(a) exit(a&0x10000000L)
118#else 105#else
119#define EXIT(a) exit(a) 106#define EXIT(a) exit(a)
@@ -133,14 +120,12 @@ int uubufnum=0;
133#define OUTUUBUF (65*100) 120#define OUTUUBUF (65*100)
134unsigned char b[OUTUUBUF]; 121unsigned char b[OUTUUBUF];
135unsigned char bb[300]; 122unsigned char bb[300];
136des_cblock cksum={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 123DES_cblock cksum={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
137char cksumname[200]=""; 124char cksumname[200]="";
138 125
139int vflag,cflag,eflag,dflag,kflag,bflag,fflag,sflag,uflag,flag3,hflag,error; 126int vflag,cflag,eflag,dflag,kflag,bflag,fflag,sflag,uflag,flag3,hflag,error;
140 127
141int main(argc, argv) 128int main(int argc, char **argv)
142int argc;
143char **argv;
144 { 129 {
145 int i; 130 int i;
146 struct stat ins,outs; 131 struct stat ins,outs;
@@ -168,12 +153,14 @@ char **argv;
168 case 'c': 153 case 'c':
169 cflag=1; 154 cflag=1;
170 strncpy(cksumname,p,200); 155 strncpy(cksumname,p,200);
156 cksumname[sizeof(cksumname)-1]='\0';
171 p+=strlen(cksumname); 157 p+=strlen(cksumname);
172 break; 158 break;
173 case 'C': 159 case 'C':
174 cflag=1; 160 cflag=1;
175 longk=1; 161 longk=1;
176 strncpy(cksumname,p,200); 162 strncpy(cksumname,p,200);
163 cksumname[sizeof(cksumname)-1]='\0';
177 p+=strlen(cksumname); 164 p+=strlen(cksumname);
178 break; 165 break;
179 case 'e': 166 case 'e':
@@ -205,6 +192,7 @@ char **argv;
205 case 'u': 192 case 'u':
206 uflag=1; 193 uflag=1;
207 strncpy(uuname,p,200); 194 strncpy(uuname,p,200);
195 uuname[sizeof(uuname)-1]='\0';
208 p+=strlen(uuname); 196 p+=strlen(uuname);
209 break; 197 break;
210 case 'h': 198 case 'h':
@@ -274,12 +262,12 @@ char **argv;
274#endif 262#endif
275 if ( (in != NULL) && 263 if ( (in != NULL) &&
276 (out != NULL) && 264 (out != NULL) &&
277#ifndef MSDOS 265#ifndef OPENSSL_SYS_MSDOS
278 (stat(in,&ins) != -1) && 266 (stat(in,&ins) != -1) &&
279 (stat(out,&outs) != -1) && 267 (stat(out,&outs) != -1) &&
280 (ins.st_dev == outs.st_dev) && 268 (ins.st_dev == outs.st_dev) &&
281 (ins.st_ino == outs.st_ino)) 269 (ins.st_ino == outs.st_ino))
282#else /* MSDOS */ 270#else /* OPENSSL_SYS_MSDOS */
283 (strcmp(in,out) == 0)) 271 (strcmp(in,out) == 0))
284#endif 272#endif
285 { 273 {
@@ -314,7 +302,7 @@ char **argv;
314 EXIT(5); 302 EXIT(5);
315 } 303 }
316 304
317#ifdef MSDOS 305#ifdef OPENSSL_SYS_MSDOS
318 /* This should set the file to binary mode. */ 306 /* This should set the file to binary mode. */
319 { 307 {
320#include <fcntl.h> 308#include <fcntl.h>
@@ -331,33 +319,33 @@ char **argv;
331 EXIT(0); 319 EXIT(0);
332 } 320 }
333 321
334void usage() 322void usage(void)
335 { 323 {
336 char **u; 324 char **u;
337 static const char *Usage[]={ 325 static const char *Usage[]={
338"des <options> [input-file [output-file]]", 326"des <options> [input-file [output-file]]",
339"options:", 327"options:",
340"-v : des(1) version number", 328"-v : des(1) version number",
341"-e : encrypt using sunOS compatible user key to DES key conversion.", 329"-e : encrypt using SunOS compatible user key to DES key conversion.",
342"-E : encrypt ", 330"-E : encrypt ",
343"-d : decrypt using sunOS compatible user key to DES key conversion.", 331"-d : decrypt using SunOS compatible user key to DES key conversion.",
344"-D : decrypt ", 332"-D : decrypt ",
345"-c[ckname] : generate a cbc_cksum using sunOS compatible user key to", 333"-c[ckname] : generate a cbc_cksum using SunOS compatible user key to",
346" DES key conversion and output to ckname (stdout default,", 334" DES key conversion and output to ckname (stdout default,",
347" stderr if data being output on stdout). The checksum is", 335" stderr if data being output on stdout). The checksum is",
348" generated before encryption and after decryption if used", 336" generated before encryption and after decryption if used",
349" in conjunction with -[eEdD].", 337" in conjunction with -[eEdD].",
350"-C[ckname] : generate a cbc_cksum as for -c but compatible with -[ED].", 338"-C[ckname] : generate a cbc_cksum as for -c but compatible with -[ED].",
351"-k key : use key 'key'", 339"-k key : use key 'key'",
352"-h : the key that is entered will be a hexidecimal number", 340"-h : the key that is entered will be a hexadecimal number",
353" that is used directly as the des key", 341" that is used directly as the des key",
354"-u[uuname] : input file is uudecoded if -[dD] or output uuencoded data if -[eE]", 342"-u[uuname] : input file is uudecoded if -[dD] or output uuencoded data if -[eE]",
355" (uuname is the filename to put in the uuencode header).", 343" (uuname is the filename to put in the uuencode header).",
356"-b : encrypt using DES in ecb encryption mode, the defaut is cbc mode.", 344"-b : encrypt using DES in ecb encryption mode, the default is cbc mode.",
357"-3 : encrypt using tripple DES encryption. This uses 2 keys", 345"-3 : encrypt using triple DES encryption. This uses 2 keys",
358" generated from the input key. If the input key is less", 346" generated from the input key. If the input key is less",
359" than 8 characters long, this is equivelent to normal", 347" than 8 characters long, this is equivalent to normal",
360" encryption. Default is tripple cbc, -b makes it tripple ecb.", 348" encryption. Default is triple cbc, -b makes it triple ecb.",
361NULL 349NULL
362}; 350};
363 for (u=(char **)Usage; *u; u++) 351 for (u=(char **)Usage; *u; u++)
@@ -369,31 +357,29 @@ NULL
369 EXIT(1); 357 EXIT(1);
370 } 358 }
371 359
372void doencryption() 360void doencryption(void)
373 { 361 {
374#ifdef _LIBC 362#ifdef _LIBC
375 extern int srandom();
376 extern int random();
377 extern unsigned long time(); 363 extern unsigned long time();
378#endif 364#endif
379 365
380 register int i; 366 register int i;
381 des_key_schedule ks,ks2; 367 DES_key_schedule ks,ks2;
382 unsigned char iv[8],iv2[8]; 368 DES_cblock iv,iv2;
383 char *p; 369 char *p;
384 int num=0,j,k,l,rem,ll,len,last,ex=0; 370 int num=0,j,k,l,rem,ll,len,last,ex=0;
385 des_cblock kk,k2; 371 DES_cblock kk,k2;
386 FILE *O; 372 FILE *O;
387 int Exit=0; 373 int Exit=0;
388#ifndef MSDOS 374#ifndef OPENSSL_SYS_MSDOS
389 static unsigned char buf[BUFSIZE+8],obuf[BUFSIZE+8]; 375 static unsigned char buf[BUFSIZE+8],obuf[BUFSIZE+8];
390#else 376#else
391 static unsigned char *buf=NULL,*obuf=NULL; 377 static unsigned char *buf=NULL,*obuf=NULL;
392 378
393 if (buf == NULL) 379 if (buf == NULL)
394 { 380 {
395 if ( (( buf=(unsigned char *)Malloc(BUFSIZE+8)) == NULL) || 381 if ( (( buf=OPENSSL_malloc(BUFSIZE+8)) == NULL) ||
396 ((obuf=(unsigned char *)Malloc(BUFSIZE+8)) == NULL)) 382 ((obuf=OPENSSL_malloc(BUFSIZE+8)) == NULL))
397 { 383 {
398 fputs("Not enough memory\n",stderr); 384 fputs("Not enough memory\n",stderr);
399 Exit=10; 385 Exit=10;
@@ -440,19 +426,19 @@ void doencryption()
440 else 426 else
441 k2[i-8]=k; 427 k2[i-8]=k;
442 } 428 }
443 des_set_key((C_Block *)k2,ks2); 429 DES_set_key_unchecked(&k2,&ks2);
444 memset(k2,0,sizeof(k2)); 430 memset(k2,0,sizeof(k2));
445 } 431 }
446 else if (longk || flag3) 432 else if (longk || flag3)
447 { 433 {
448 if (flag3) 434 if (flag3)
449 { 435 {
450 des_string_to_2keys(key,(C_Block *)kk,(C_Block *)k2); 436 DES_string_to_2keys(key,&kk,&k2);
451 des_set_key((C_Block *)k2,ks2); 437 DES_set_key_unchecked(&k2,&ks2);
452 memset(k2,0,sizeof(k2)); 438 memset(k2,0,sizeof(k2));
453 } 439 }
454 else 440 else
455 des_string_to_key(key,(C_Block *)kk); 441 DES_string_to_key(key,&kk);
456 } 442 }
457 else 443 else
458 for (i=0; i<KEYSIZ; i++) 444 for (i=0; i<KEYSIZ; i++)
@@ -470,7 +456,7 @@ void doencryption()
470 kk[i]=key[i]|0x80; 456 kk[i]=key[i]|0x80;
471 } 457 }
472 458
473 des_set_key((C_Block *)kk,ks); 459 DES_set_key_unchecked(&kk,&ks);
474 memset(key,0,sizeof(key)); 460 memset(key,0,sizeof(key));
475 memset(kk,0,sizeof(kk)); 461 memset(kk,0,sizeof(kk));
476 /* woops - A bug that does not showup under unix :-( */ 462 /* woops - A bug that does not showup under unix :-( */
@@ -498,9 +484,8 @@ void doencryption()
498 len=l-rem; 484 len=l-rem;
499 if (feof(DES_IN)) 485 if (feof(DES_IN))
500 { 486 {
501 srandom((unsigned int)time(NULL));
502 for (i=7-rem; i>0; i--) 487 for (i=7-rem; i>0; i--)
503 buf[l++]=random()&0xff; 488 RAND_pseudo_bytes(buf + l++, 1);
504 buf[l++]=rem; 489 buf[l++]=rem;
505 ex=1; 490 ex=1;
506 len+=rem; 491 len+=rem;
@@ -510,8 +495,8 @@ void doencryption()
510 495
511 if (cflag) 496 if (cflag)
512 { 497 {
513 des_cbc_cksum((C_Block *)buf,(C_Block *)cksum, 498 DES_cbc_cksum(buf,&cksum,
514 (long)len,ks,(C_Block *)cksum); 499 (long)len,&ks,&cksum);
515 if (!eflag) 500 if (!eflag)
516 { 501 {
517 if (feof(DES_IN)) break; 502 if (feof(DES_IN)) break;
@@ -521,34 +506,34 @@ void doencryption()
521 506
522 if (bflag && !flag3) 507 if (bflag && !flag3)
523 for (i=0; i<l; i+=8) 508 for (i=0; i<l; i+=8)
524 des_ecb_encrypt( 509 DES_ecb_encrypt(
525 (des_cblock *)&(buf[i]), 510 (DES_cblock *)&(buf[i]),
526 (des_cblock *)&(obuf[i]), 511 (DES_cblock *)&(obuf[i]),
527 ks,do_encrypt); 512 &ks,do_encrypt);
528 else if (flag3 && bflag) 513 else if (flag3 && bflag)
529 for (i=0; i<l; i+=8) 514 for (i=0; i<l; i+=8)
530 des_ecb2_encrypt( 515 DES_ecb2_encrypt(
531 (des_cblock *)&(buf[i]), 516 (DES_cblock *)&(buf[i]),
532 (des_cblock *)&(obuf[i]), 517 (DES_cblock *)&(obuf[i]),
533 ks,ks2,do_encrypt); 518 &ks,&ks2,do_encrypt);
534 else if (flag3 && !bflag) 519 else if (flag3 && !bflag)
535 { 520 {
536 char tmpbuf[8]; 521 char tmpbuf[8];
537 522
538 if (rem) memcpy(tmpbuf,&(buf[l]), 523 if (rem) memcpy(tmpbuf,&(buf[l]),
539 (unsigned int)rem); 524 (unsigned int)rem);
540 des_3cbc_encrypt( 525 DES_3cbc_encrypt(
541 (des_cblock *)buf,(des_cblock *)obuf, 526 (DES_cblock *)buf,(DES_cblock *)obuf,
542 (long)l,ks,ks2,(des_cblock *)iv, 527 (long)l,ks,ks2,&iv,
543 (des_cblock *)iv2,do_encrypt); 528 &iv2,do_encrypt);
544 if (rem) memcpy(&(buf[l]),tmpbuf, 529 if (rem) memcpy(&(buf[l]),tmpbuf,
545 (unsigned int)rem); 530 (unsigned int)rem);
546 } 531 }
547 else 532 else
548 { 533 {
549 des_cbc_encrypt( 534 DES_cbc_encrypt(
550 (des_cblock *)buf,(des_cblock *)obuf, 535 buf,obuf,
551 (long)l,ks,(des_cblock *)iv,do_encrypt); 536 (long)l,&ks,&iv,do_encrypt);
552 if (l >= 8) memcpy(iv,&(obuf[l-8]),8); 537 if (l >= 8) memcpy(iv,&(obuf[l-8]),8);
553 } 538 }
554 if (rem) memcpy(buf,&(buf[l]),(unsigned int)rem); 539 if (rem) memcpy(buf,&(buf[l]),(unsigned int)rem);
@@ -600,28 +585,28 @@ void doencryption()
600 585
601 if (bflag && !flag3) 586 if (bflag && !flag3)
602 for (i=0; i<l; i+=8) 587 for (i=0; i<l; i+=8)
603 des_ecb_encrypt( 588 DES_ecb_encrypt(
604 (des_cblock *)&(buf[i]), 589 (DES_cblock *)&(buf[i]),
605 (des_cblock *)&(obuf[i]), 590 (DES_cblock *)&(obuf[i]),
606 ks,do_encrypt); 591 &ks,do_encrypt);
607 else if (flag3 && bflag) 592 else if (flag3 && bflag)
608 for (i=0; i<l; i+=8) 593 for (i=0; i<l; i+=8)
609 des_ecb2_encrypt( 594 DES_ecb2_encrypt(
610 (des_cblock *)&(buf[i]), 595 (DES_cblock *)&(buf[i]),
611 (des_cblock *)&(obuf[i]), 596 (DES_cblock *)&(obuf[i]),
612 ks,ks2,do_encrypt); 597 &ks,&ks2,do_encrypt);
613 else if (flag3 && !bflag) 598 else if (flag3 && !bflag)
614 { 599 {
615 des_3cbc_encrypt( 600 DES_3cbc_encrypt(
616 (des_cblock *)buf,(des_cblock *)obuf, 601 (DES_cblock *)buf,(DES_cblock *)obuf,
617 (long)l,ks,ks2,(des_cblock *)iv, 602 (long)l,ks,ks2,&iv,
618 (des_cblock *)iv2,do_encrypt); 603 &iv2,do_encrypt);
619 } 604 }
620 else 605 else
621 { 606 {
622 des_cbc_encrypt( 607 DES_cbc_encrypt(
623 (des_cblock *)buf,(des_cblock *)obuf, 608 buf,obuf,
624 (long)l,ks,(des_cblock *)iv,do_encrypt); 609 (long)l,&ks,&iv,do_encrypt);
625 if (l >= 8) memcpy(iv,&(buf[l-8]),8); 610 if (l >= 8) memcpy(iv,&(buf[l-8]),8);
626 } 611 }
627 612
@@ -646,9 +631,9 @@ void doencryption()
646 l=l-8+last; 631 l=l-8+last;
647 } 632 }
648 i=0; 633 i=0;
649 if (cflag) des_cbc_cksum((C_Block *)obuf, 634 if (cflag) DES_cbc_cksum(obuf,
650 (C_Block *)cksum,(long)l/8*8,ks, 635 (DES_cblock *)cksum,(long)l/8*8,&ks,
651 (C_Block *)cksum); 636 (DES_cblock *)cksum);
652 while (i != l) 637 while (i != l)
653 { 638 {
654 j=fwrite(obuf,1,(unsigned int)l-i,DES_OUT); 639 j=fwrite(obuf,1,(unsigned int)l-i,DES_OUT);
@@ -683,8 +668,8 @@ void doencryption()
683problems: 668problems:
684 memset(buf,0,sizeof(buf)); 669 memset(buf,0,sizeof(buf));
685 memset(obuf,0,sizeof(obuf)); 670 memset(obuf,0,sizeof(obuf));
686 memset(ks,0,sizeof(ks)); 671 memset(&ks,0,sizeof(ks));
687 memset(ks2,0,sizeof(ks2)); 672 memset(&ks2,0,sizeof(ks2));
688 memset(iv,0,sizeof(iv)); 673 memset(iv,0,sizeof(iv));
689 memset(iv2,0,sizeof(iv2)); 674 memset(iv2,0,sizeof(iv2));
690 memset(kk,0,sizeof(kk)); 675 memset(kk,0,sizeof(kk));
@@ -696,15 +681,8 @@ problems:
696 if (Exit) EXIT(Exit); 681 if (Exit) EXIT(Exit);
697 } 682 }
698 683
699int uufwrite(data, size, num, fp) 684/* We ignore this parameter but it should be > ~50 I believe */
700unsigned char *data; 685int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp)
701int size;
702unsigned int num;
703FILE *fp;
704
705 /* We ignore this parameter but it should be > ~50 I believe */
706
707
708 { 686 {
709 int i,j,left,rem,ret=num; 687 int i,j,left,rem,ret=num;
710 static int start=1; 688 static int start=1;
@@ -757,8 +735,7 @@ FILE *fp;
757 return(ret); 735 return(ret);
758 } 736 }
759 737
760void uufwriteEnd(fp) 738void uufwriteEnd(FILE *fp)
761FILE *fp;
762 { 739 {
763 int j; 740 int j;
764 static const char *end=" \nend\n"; 741 static const char *end=" \nend\n";
@@ -774,11 +751,8 @@ FILE *fp;
774 fwrite(end,1,strlen(end),fp); 751 fwrite(end,1,strlen(end),fp);
775 } 752 }
776 753
777int uufread(out, size, num, fp) 754/* int size: should always be > ~ 60; I actually ignore this parameter :-) */
778unsigned char *out; 755int uufread(unsigned char *out, int size, unsigned int num, FILE *fp)
779int size; /* should always be > ~ 60; I actually ignore this parameter :-) */
780unsigned int num;
781FILE *fp;
782 { 756 {
783 int i,j,tot; 757 int i,j,tot;
784 static int done=0; 758 static int done=0;
@@ -850,10 +824,7 @@ FILE *fp;
850 *((c)++)=(unsigned char)(((l) )&0xff)) 824 *((c)++)=(unsigned char)(((l) )&0xff))
851 825
852 826
853int uuencode(in, num, out) 827int uuencode(unsigned char *in, int num, unsigned char *out)
854unsigned char *in;
855int num;
856unsigned char *out;
857 { 828 {
858 int j,i,n,tot=0; 829 int j,i,n,tot=0;
859 DES_LONG l; 830 DES_LONG l;
@@ -883,10 +854,7 @@ unsigned char *out;
883 return(tot); 854 return(tot);
884 } 855 }
885 856
886int uudecode(in, num, out) 857int uudecode(unsigned char *in, int num, unsigned char *out)
887unsigned char *in;
888int num;
889unsigned char *out;
890 { 858 {
891 int j,i,k; 859 int j,i,k;
892 unsigned int n=0,space=0; 860 unsigned int n=0,space=0;