home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Between Heaven & Hell 2
/
BetweenHeavenHell.cdr
/
100
/
49
/
pccode4.for
< prev
next >
Wrap
Text File
|
1986-04-06
|
17KB
|
669 lines
$NODEBUG
$NOFLOATCALLS
$STRICT
$PAGE
PROGRAM PCCODE4
C
C ********************************************************
C * *
C * PC-CODE4 PORTABLE CRYPTOGRAPHY v6.2 *
C * (C) COPYRIGHT RICHARD NOLEN COLVARD Apr-86 *
C * COMMERCIAL RIGHTS RESERVED *
C * *
C * MICROSOFT MS FORTRAN V3.30 *
C * *
C ********************************************************
C
INTEGER*2 IERR,ILOW,IHIGH,NKEYS,J,K,M,IFREQ,RECNUM
INTEGER*2 RANGE,RESULT,RANGE2,IA,IR,ISEC,SIZE99,RECN2
INTEGER*2 JEOF
INTEGER*4 KEYS(999),HASHER,JHASH
CHARACTER*1 IYES,ITRANS,IHDR,IHASH,TEXT(512)
CHARACTER*1 ICODE,IKEY,IINP,IOUT,TEMP(72)
CHARACTER*21 VERSION,VERS,FILLER*10
C CHARACTER*16 TEOF
C CHARACTER*16 ZEOF
C
C
PARAMETER (SIZE99=512)
C
C
C EQUIVALENCE (TEXT(1),TEOF)
DATA RECNUM / 1 /, RECN2 / 1 /
DATA IERR / 0 /, JEOF / 0 /
DATA TEXT / 512 * ' '/
DATA KEYS / 999 * 0 /
DATA HASHER / 0 /
DATA VERSION / '$PC-CODE4 V6.2 APR-86' /
C DATA ZEOF / '/*END-OF-FILE*/ '/
C
C
5 FORMAT(1X)
6 FORMAT(1X,/)
WRITE(*,6)
WRITE(*,10)
10 FORMAT(10X,'PC-CODE4 PORTABLE CRYPTO-SYSTEM v6.2B',//)
20 FORMAT(10X,'(c) Copyright R. Nolen COLVARD Company 1986')
22 FORMAT(10X,' Commercial Rights Reserved')
24 FORMAT(10X,'(c) Copyright Microsoft Corp 1985')
26 FORMAT(10X,' Microsoft FORTRAN-77 V3.30'//)
WRITE(*,20)
WRITE(*,22)
WRITE(*,24)
WRITE(*,26)
C
C
OPEN(9,FILE='CONFIG.PC3',FORM='FORMATTED',ACCESS='SEQUENTIAL',
+ STATUS='OLD',IOSTAT=IERR)
C
C
30 FORMAT(5X,'*** PROBLEM MISSING "config.pc3" CANNOT CONTINUE')
35 FORMAT(5X,' PLEASE EXECUTE "install3" TO CONTINUE')
40 FORMAT(5X,' SESSION ABORTED',//)
IF (IERR .GT. 0) THEN
WRITE(*,30)
WRITE(*,35)
WRITE(*,40)
STOP 99
ENDIF
C
70 FORMAT(A1,72A1)
71 FORMAT(1X,A1,72A1)
72 FORMAT(I1,72A1)
73 FORMAT(1X,I1,72A1)
READ(9,72) ISEC, TEMP
WRITE(*,73) ISEC, TEMP
C
C
READ(9,70) IKEY, TEMP
WRITE(*,71) IKEY, TEMP
C
C
READ(9,70) ITRANS, TEMP
WRITE(*,71) ITRANS, TEMP
C
C
READ(9,80) ILOW, TEMP
80 FORMAT(I3,72A1)
81 FORMAT(1X,I3,72A1)
ILOW = 0
WRITE(*,81) ILOW, TEMP
C
C
READ(9,80) IHIGH, TEMP
IHIGH = 255
WRITE(*,81) IHIGH, TEMP
C
C
READ(9,70) IHDR, TEMP
WRITE(*,71) IHDR, TEMP
C
C
READ(9,70) IHASH, TEMP
WRITE(*,71) IHASH, TEMP
C
C
READ(9,80) IFREQ, TEMP
WRITE(*,81) IFREQ, TEMP
C
C
READ(9,70) IINP, TEMP
C WRITE(*,71) IINP, TEMP
C
C
READ(9,70) IOUT, TEMP
C WRITE(*,71) IOUT, TEMP
C
C
CLOSE(9)
C
RANGE = (IHIGH - ILOW) + 1
RANGE2 = 2 * RANGE
WRITE(*,6)
PAUSE
WRITE(*,6)
C
C
C
401 FORMAT(1X,'Enter KEYS (a minimum of 4) one per line')
402 FORMAT(1X,'---------> to TERMINATE enter a ZERO (0)')
455 FORMAT(I10)
460 FORMAT(1X,'AT LEAST 4 KEYS MUST BE ENTERED; ADD MORE')
500 FORMAT(1X,'Enter Key FILE Name below ---',/)
571 FORMAT(1X,'123456789A')
572 FORMAT(1X,'+........+')
C
IF (IKEY .EQ. 'N') THEN
NKEYS = 1
WRITE(*,401)
WRITE(*,402)
WRITE(*,571)
WRITE(*,572)
450 READ(*,455,END=451) KEYS(NKEYS)
IF (KEYS(NKEYS) .GT. 0) THEN
NKEYS = NKEYS + 1
GOTO 450
ENDIF
451 NKEYS = NKEYS - 1
IF (NKEYS .LT. 4) THEN
WRITE(*,460)
GO TO 450
ENDIF
ELSE
NKEYS = 1
WRITE(*,500)
OPEN(3,FILE=' ',FORM='FORMATTED',ACCESS='SEQUENTIAL',
+ STATUS='OLD',IOSTAT=IERR)
501 READ(3,455,END=600) KEYS(NKEYS)
NKEYS = NKEYS + 1
GO TO 501
600 NKEYS = NKEYS - 1
CLOSE(3)
ENDIF
WRITE(*,606) NKEYS
606 FORMAT(1X,/,1X,'KEYS FOUND=',I4)
C
C
C
IF (IHASH .EQ. 'Y') THEN
HASHER = 0
DO 404 J=1,NKEYS
HASHER = MOD((HASHER + KEYS(J)),997)
404 CONTINUE
ENDIF
C
C
C
WRITE(*,5)
707 WRITE(*,100)
100 FORMAT(1X,'Encode or Decode ("E" or "D") a file:')
110 FORMAT(A1)
READ(*,110) ICODE
IF (ICODE .EQ. 'e') ICODE = 'E'
IF (ICODE .EQ. 'd') ICODE = 'D'
IF ((ICODE .NE. 'E') .AND. (ICODE .NE. 'D')) GOTO 707
WRITE(*,6)
C
C
IF (ICODE .EQ. 'E') THEN
WRITE(*,120)
OPEN(5,FILE=' ',FORM='BINARY',ACCESS='DIRECT',
+ STATUS='OLD',IOSTAT=IERR,RECL=512)
WRITE(*,5)
WRITE(*,130)
OPEN(6,FILE=' ',FORM='BINARY',ACCESS='DIRECT',
+ STATUS='NEW',IOSTAT=IERR,RECL=512)
ELSE
WRITE(*,5)
WRITE(*,140)
OPEN(5,FILE=' ',FORM='BINARY',ACCESS='DIRECT',
+ STATUS='OLD',IOSTAT=IERR,RECL=512)
WRITE(*,5)
WRITE(*,150)
OPEN(6,FILE=' ',FORM='BINARY',ACCESS='DIRECT',
+ STATUS='NEW',IOSTAT=IERR,RECL=512)
ENDIF
C
C
120 FORMAT(1X,'Enter the INPUT File to be ENCODED -----',/,1X)
130 FORMAT(1X,'Enter the OUTPUT file for the CODE -----',/,1X)
140 FORMAT(1X,'Enter the INPUT File to be DECODED -----',/,1X)
150 FORMAT(1X,'Enter the OUTPUT file for plain TEXT ---',/,1X)
C 407 FORMAT(1X,'$PC-CODE4 V6.2 APR-86; HASHED=',I3,' $END HEADER '
C + 79('*') )
C 408 FORMAT(1X,A21,10X,I3,93X)
409 FORMAT(1X,//,5X,'FATAL ERROR: KEY does not match coded file')
410 FORMAT(1X,//,5X,'FATAL ERROR: cannot decode,not of PC-CODE4')
411 FORMAT(5X,'----- This file never encoded by PC-CODE4')
412 FORMAT(5X,'Correct VERSION should be: ',A21)
413 FORMAT(5X,'Incorrect file VERSION is: ',A21)
414 FORMAT(5X,'Correct Hash count should be: ',I3)
415 FORMAT(5X,'Incorrect File Hash count is: ',I3)
C
C
C
IF (IHDR .EQ. 'Y') THEN
IF (ICODE .EQ. 'D') THEN
C READ(5,408,REC=RECNUM) VERS,JHASH
READ(5,REC=RECNUM) VERS, FILLER, JHASH, TEMP
RECN2 = 1
RECNUM = 2
ELSE
C WRITE(6,407,REC=RECN2) HASHER
WRITE(6,REC=RECN2) '$PC-CODE4 V6.2 APR-86; HASHED=',
+ HASHER, ' $END HEADER ******************',
+ '************************************************'
RECN2 = 2
RECNUM = 1
ENDIF
ENDIF
C
C
C
IF ((IHDR .EQ. 'Y') .AND. (ICODE .EQ. 'D')) THEN
IF (VERS .NE. VERSION) THEN
WRITE(*,410)
WRITE(*,411)
WRITE(*,412) VERSION
WRITE(*,413) VERS
STOP 410
ENDIF
ENDIF
C
C
IF ((IHASH .EQ. 'Y') .AND. (IHDR .EQ. 'Y')) THEN
IF (ICODE .EQ. 'D') THEN
IF (HASHER .NE. JHASH) THEN
WRITE(*,409)
WRITE(*,415) JHASH
WRITE(*,414) HASHER
STOP 409
ENDIF
ENDIF
ENDIF
C
C
C <----------- LOOP HERE FOR NEW RECORD <----------
200 CONTINUE
C
C
C 919 FORMAT(512A1)
C
C IF (ICODE .EQ. 'E') THEN
C READ(5,919,END=800,REC=RECNUM) (TEXT(M),M=1,SIZE99)
C ELSE
C READ(5,919,END=67,REC=RECNUM) (TEXT(M),M=1,SIZE99)
C 67 IF (TEOF .EQ. ZEOF) GO TO 800
C ENDIF
C
C
READ(5,END=307,REC=RECNUM) (TEXT(M),M=1,SIZE99)
C
GOTO 300
C
307 JEOF = -1
C
300 CONTINUE
C
CALL IJGEND(KEYS,NKEYS,IFREQ,ISEC,SIZE99)
C
IF ((ITRANS .EQ. 'Y') .AND. (ICODE .EQ. 'D'))
+ CALL IJDEAL(TEXT,SIZE99)
C
C
C
DO 333 J=1,SIZE99
C
IA = ICHAR( TEXT(J) )
C
CALL RANDJ1(KEYS,RANGE,RESULT,NKEYS,ISEC)
C
C IA = IA - ILOW
IR = RESULT
IF (ICODE .EQ. 'D') IR = -1 * IR
IA = RANGE2 + IA + IR
C
TEXT(J) = CHAR( MOD(IA,RANGE) )
C
333 CONTINUE
C
C
IF ((ITRANS .EQ. 'Y') .AND. (ICODE .EQ. 'E') )
+ CALL IJDEAL(TEXT,SIZE99)
C
C
335 CONTINUE
C
C
C
C WRITE(6,919,REC=RECN2) (TEXT(M),M=1,SIZE99)
C
WRITE(6,REC=RECN2) (TEXT(M),M=1,SIZE99)
C
RECNUM = RECNUM + 1
RECN2 = RECN2 + 1
C
C
IF (JEOF .EQ. 0) GO TO 200
C
C
C
800 CONTINUE
C
C
C IF (ICODE .EQ. 'E') THEN
C WRITE(6,940,REC=RECN2)
C ELSE
C RECNUM = RECNUM - 2
C ENDIF
C
IF (ICODE .EQ. 'D') RECNUM = RECNUM - 2
C
WRITE(*,906) RECNUM
C
C 940 FORMAT(32('/*END-OF-FILE*/ '))
906 FORMAT(1X,//,5X,'* PROCESSED',I4,' LOGICAL CLUSTERS (512X)')
900 FORMAT(2X,/,5X,'*** End of Program PC-CODE4 ***',/)
WRITE(*,900)
DO 903 J=1,NKEYS
903 KEYS(J) = 0
CLOSE(6)
CLOSE(5)
STOP
END
$NODEBUG
$STRICT
$NOFLOATCALLS
$PAGE
SUBROUTINE RANDJ1(SEEDS,RANGE,RESULT,NSIZE,ISEC)
C
C * * * * * * * * * * * * * * * * * * * * * * *
C * *
C * P E R M U T T A T I O N *
C * *
C * MICROSOFT FORTRAN-77 V3.30 *
C * *
C * * * * * * * * * * * * * * * * * * * * * * *
C
INTEGER*4 SEEDS(*)
INTEGER*4 JSAVE
INTEGER*2 RANGE,RESULT,NSIZE
INTEGER*2 JTEMP,JSIZE,ISEC
C
C
JSIZE = NSIZE - 1
IF (JSIZE .LE. 1) THEN
WRITE (*,*) '* RANDJ1 ERROR INPUT NSIZE LT 2'
GOTO 999
ENDIF
C
JSAVE = SEEDS(1)
CALL RANDJ3(JSAVE,JSIZE,JTEMP)
SEEDS(1) = JSAVE
C
JTEMP = JTEMP + 1
JSAVE = SEEDS(JTEMP)
IF (ISEC .GT. 3) ISEC = MOD(ISEC,3) + 1
C
GOTO (100,200,300), ISEC
C
100 CALL RANDJ3(JSAVE,RANGE,RESULT)
GOTO 900
200 CALL RANDJ2(JSAVE,RANGE,RESULT)
GO TO 900
300 CALL RANDJ4(JSAVE,RANGE,RESULT)
GO TO 900
C
C
900 SEEDS(JTEMP) = JSAVE
C
999 RETURN
END
$NODEBUG
$STRICT
$NOFLOATCALLS
$PAGE
SUBROUTINE RANDJ2(SEED,RANGE,RESULT)
C
C * * * * * * * * * * * * * * * * * * * * * * *
C * *
C * LOW SECURITY RANDOM NUMBERS / EFFICENT *
C * *
C * MICROSOFT FORTRAN-77 V3.30 *
C * *
C * * * * * * * * * * * * * * * * * * * * * * *
C
INTEGER*4 SEED,MX,MX2,A,B,C,CSAVE
INTEGER*4 SEED2
INTEGER*2 RANGE,RESULT
INTEGER*2 SEEDR(2)
C
EQUIVALENCE (SEED2,SEEDR(1))
C
DATA MX/032767/, MX2/032768/
C
C
C
SEED2 = SEED
A = SEEDR(1)
B = SEEDR(2)
C
IF (A) 10,20,30
10 A = IABS(A) + 1
GOTO 30
20 A = 1
WRITE (*,*) 'RANDJ2 INPUT SEED(a) OF ZERO; Reset OK'
30 CONTINUE
C
IF (B) 40,50,60
40 B = IABS(B) + 1
GOTO 30
50 B = 1
WRITE (*,*) 'RANDJ2 INPUT SEED(b) OF ZERO; Reset OK'
60 CONTINUE
C
A = 2 * A
B = 2 * B
C
IF (A .GT. MX) A = A - MX
IF (B .GT. MX) B = B - MX
C
C = A + B
CSAVE = C
IF (C .GT. MX2) C = C - MX2
C = 2 * C
C
IF (C .GT. MX) C = C - MX
C
A = B
B = C
SEEDR(1) = A
SEEDR(2) = B
SEED = SEED2
RESULT = MOD(CSAVE,RANGE) + 1
C
RETURN
END
$NODEBUG
$STRICT
$NOFLOATCALLS
$PAGE
SUBROUTINE RANDJ3(SEED,RANGE,RESULT)
C
C * * * * * * * * * * * * * * * * * * * * * * *
C * *
C * HIGH SECURITY RANDOM NUMBERS / SLOW *
C * *
C * MICROSOFT FORTRAN-77 V3.30 *
C * *
C * * * * * * * * * * * * * * * * * * * * * * *
C
INTEGER*4 SEED
INTEGER*2 RANGE,RESULT
REAL*8 SEED2,ZMOD,ZMULT
C
C
DATA ZMOD/2147483647.00D0/, ZMULT/16807.000D0/
C
C
C
SEED2 = SEED
C
IF (SEED .LT. 1) THEN
WRITE(*,*) '* RANDJ3 SEED VALUE OF ZERO; Reset OK'
SEED2 = 10019567.0D0
ENDIF
C
C
SEED2 = SEED2 * ZMULT
SEED2 = DMOD(SEED2,ZMOD)
C
RESULT = (SEED2 / ZMOD) * DFLOAT(RANGE)
RESULT = RESULT + 1
SEED = SEED2
C
RETURN
END
$PAGE
DOUBLE PRECISION FUNCTION DFLOAT(D)
INTEGER*2 D
DFLOAT = D
RETURN
END
$NODEBUG
$STRICT
$NOFLOATCALLS
$PAGE
SUBROUTINE RANDJ4(SEED,RANGE,RESULT)
C
C * * * * * * * * * * * * * * * * * * * * * * *
C * *
C * LOW SECURITY RANDOM NUMBERS / EFFICENT *
C * *
C * MICROSOFT FORTRAN-77 V3.30 *
C * *
C * * * * * * * * * * * * * * * * * * * * * * *
C
INTEGER*4 SEED,A,B,C,ASAVE,BSAVE
INTEGER*4 SEED2
INTEGER*2 RANGE,RESULT
INTEGER*2 SEEDR(2)
C
EQUIVALENCE (SEED2,SEEDR(1))
C
C
C
SEED2 = SEED
A = SEEDR(1)
B = SEEDR(2)
C
C
C
IF (A) 10,20,30
10 A = IABS(A) + 1
GOTO 30
20 A = 10009
WRITE (*,*) 'RANDJ4 INPUT SEED(a) OF ZERO; Reset OK'
30 CONTINUE
C
IF (B) 40,50,60
40 B = IABS(B) + 1
GOTO 30
50 B = 55717
WRITE (*,*) 'RANDJ4 INPUT SEED(b) OF ZERO; Reset OK'
60 CONTINUE
C
C
C
A = A * 182
ASAVE = A
A = MOD(A,32749)
C
B = B * 180
BSAVE = B
B = MOD(B,32717)
C
SEEDR(1) = A
SEEDR(2) = B
SEED = SEED2
C
C = ASAVE + BSAVE
RESULT = MOD(C,RANGE) + 1
C
RETURN
END
$NODEBUG
$STRICT
$NOFLOATCALLS
$PAGE
SUBROUTINE IJDEAL(TEXT,LEN)
C
C * * * * * * * * * * * * * * * * * * * * * * *
C * *
C * TRANSPOSE INPUT/OUTPUT TEXT *
C * *
C * MICROSOFT FORTRAN-77 V3.30 *
C * *
C * * * * * * * * * * * * * * * * * * * * * * *
C
INTEGER*2 LEN,LEN2
INTEGER*2 J,K,M,ISEC,IDEAL
CHARACTER*1 TEXT(*),CHSAVE
COMMON /IJRAN/ IDEAL(512)
C
C
LEN2 = LEN / 2
C
C
DO 400 K=1,LEN2
J = IDEAL(K)
M = IDEAL(K+LEN2)
CHSAVE = TEXT(M)
TEXT(M) = TEXT(J)
TEXT(J) = CHSAVE
400 CONTINUE
C
C
C
RETURN
END
$NODEBUG
$STRICT
$NOFLOATCALLS
$PAGE
SUBROUTINE IJGEND(KEYS,NKEYS,IFREQ,ISEC,LEN)
C
C * * * * * * * * * * * * * * * * * * * * * * *
C * *
C * DEAL PERMUATION FOR TRANSPOSITION *
C * *
C * MICROSOFT FORTRAN-77 V3.30 *
C * *
C * * * * * * * * * * * * * * * * * * * * * * *
C
INTEGER*4 KEYS(*)
INTEGER*2 NKEYS,LEN,IFREQ,DEAL
INTEGER*2 ICOUNT,LAST,J,K,M
INTEGER*2 RANGE,RESULT,ISEC
COMMON /IJRAN/ DEAL(512)
DATA ICOUNT / 9999 /, LAST / 9999 /
C
C
IF (ICOUNT .EQ. 9999) THEN
ICOUNT = -1
LAST = LEN
DO 100 J=1,512
DEAL(J) = J
100 CONTINUE
ENDIF
C
C
IF (LAST .NE. LEN) THEN
ICOUNT = -1
LAST = LEN
DO 200 J=1,LEN
DEAL(J) = J
200 CONTINUE
ENDIF
C
C
ICOUNT = ICOUNT + 1
C
C
RANGE = LEN
C
C
IF ( MOD(ICOUNT,IFREQ) .EQ. 0) THEN
DO 300 K=1,LEN
CALL RANDJ1(KEYS,RANGE,RESULT,NKEYS,ISEC)
M = DEAL(RESULT)
DEAL(RESULT) = DEAL(K)
DEAL(K) = M
300 CONTINUE
ENDIF
C
C
C
RETURN
END