home *** CD-ROM | disk | FTP | other *** search
- $NODEBUG
- $NOFLOATCALLS
- $STRICT
- $PAGE
- PROGRAM PCCODE3
- C
- C ********************************************************
- C * *
- C * PC-CODE3 PORTABLE CRYPTOGRAPHY v6.2a *
- C * (c) COPYRIGHT RICHARD NOLEN COLVARD Apr-86 *
- C * COMMERCIAL RIGHTS RESERVED *
- C * *
- C * MICROSOFT FORTRAN-77 V3.30 *
- C * *
- C ********************************************************
- C
- INTEGER*2 IERR,ILOW,IHIGH,NKEYS,J,K,M,IFREQ,KLEN
- INTEGER*2 RANGE,RESULT,RANGE2,IA,IR,ISEC,SIZE99
- 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
- C
- C
- PARAMETER (SIZE99=80)
- C
- C
- DATA IERR / 0 /
- DATA TEXT / 512 * ' '/
- DATA KEYS / 999 * 0 /
- DATA HASHER / 0 /
- DATA VERSION / '$PC-CODE3 V6.2 APR-86' /
- C
- C
- 5 FORMAT(1X)
- 6 FORMAT(1X,/)
- WRITE(*,6)
- WRITE(*,10)
- 10 FORMAT(10X,'PC-CODE3 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)
- WRITE(*,81) ILOW, TEMP
- C
- C
- READ(9,80) IHIGH, TEMP
- 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
- WRITE(*,71) IINP, TEMP
- C
- C
- READ(9,70) IOUT, TEMP
- 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='FORMATTED',ACCESS='SEQUENTIAL',
- + STATUS='OLD',IOSTAT=IERR)
- WRITE(*,5)
- WRITE(*,130)
- OPEN(6,FILE=' ',FORM='FORMATTED',ACCESS='SEQUENTIAL',
- + STATUS='NEW',IOSTAT=IERR)
- ELSE
- WRITE(*,5)
- WRITE(*,140)
- OPEN(5,FILE=' ',FORM='FORMATTED',ACCESS='SEQUENTIAL',
- + STATUS='OLD',IOSTAT=IERR)
- WRITE(*,5)
- WRITE(*,150)
- OPEN(6,FILE=' ',FORM='FORMATTED',ACCESS='SEQUENTIAL',
- + STATUS='NEW',IOSTAT=IERR)
- 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)
- 407 FORMAT(1X,'$PC-CODE3 V6.2 APR-86; HASHED=',I3,' $END HEADER')
- 408 FORMAT(1X,A21,10X,I3,13X)
- 409 FORMAT(1X,//,5X,'FATAL ERROR: KEY does not match coded file')
- 410 FORMAT(1X,//,5X,'FATAL ERROR: cannot decode,not of Pc-Code3')
- 411 FORMAT(5X,'----- This file never encoded by Pc-Code3')
- 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
- READ(5,408) VERS,JHASH
- ELSE
- WRITE(6,407) HASHER
- 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
- 209 FORMAT(1X,512A1)
- 210 FORMAT(I3,512A1)
- 919 FORMAT(512A1)
- C
- C
- IF (ICODE .EQ. 'E') THEN
- READ(5,919,END=800) (TEXT(M),M=1,SIZE99)
- DO 205 KLEN=SIZE99,1,-1
- IF (TEXT(KLEN) .NE. ' ') GOTO 211
- 205 CONTINUE
- 211 CONTINUE
- ELSE
- KLEN = SIZE99
- READ(5,210,END=800) KLEN, (TEXT(M),M=1,KLEN)
- ENDIF
- C
- IF (IINP .EQ. 'Y') WRITE(*,209) (TEXT(M),M=1,KLEN)
- C
- IF (KLEN .GE. 2) THEN
- CALL IJGEND(KEYS,NKEYS,IFREQ,ISEC,KLEN)
- IF ((ITRANS .EQ. 'Y') .AND. (ICODE .EQ. 'D'))
- + CALL IJDEAL(TEXT,KLEN)
- ENDIF
- C
- C
- IF (KLEN .LT. 1) GOTO 335
- C
- C
- DO 333 J=1,KLEN
- C
- IA = ICHAR( TEXT(J) )
- IF ((IA .EQ. 13) .OR. (IA .EQ. 10)) GOTO 334
- IF (IA .GT. IHIGH) IA = ICHAR('?')
- IF (IA .LT. ILOW ) IA = ICHAR('?')
- C
- CALL RANDJ1(KEYS,RANGE,RESULT,NKEYS,ISEC)
- C
- IA = IA - ILOW
- IR = RESULT
- IF (ICODE .EQ. 'D') IR = -1 * IR
- IA = RANGE2 + IA + IR
- C
- TEXT(J) = CHAR( MOD(IA,RANGE) + ILOW )
- C
- 333 CONTINUE
- 334 CONTINUE
- C
- C
- IF (KLEN .GE. 2) THEN
- IF ((ITRANS .EQ. 'Y') .AND. (ICODE .EQ. 'E') )
- + CALL IJDEAL(TEXT,KLEN)
- ENDIF
- C
- C
- 335 CONTINUE
- C
- C
- IF (IOUT .EQ. 'Y') WRITE(*,209) (TEXT(M),M=1,KLEN)
- C
- IF (ICODE .EQ. 'D') THEN
- WRITE(6,919) (TEXT(M),M=1,KLEN)
- ELSE
- WRITE(6,210) KLEN, (TEXT(M),M=1,KLEN)
- ENDIF
- C
- C
- IF ((IOUT .EQ. 'Y') .AND. (IINP .EQ. 'Y')) WRITE(*,5)
- C
- GO TO 200
- C
- C
- C
- 800 CONTINUE
- 900 FORMAT(2X,/,5X,'*** End of Program PC-CODE3 ***',/)
- 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
- C
- IF (JSIZE .LE. 1) THEN
- WRITE (*,*) '* RANDJ1 ERROR INPUT NSIZE LT 3'
- GOTO 999
- ENDIF
- C
- JSAVE = SEEDS(1)
- CALL RANDJ3(JSAVE,JSIZE,JTEMP)
- SEEDS(1) = JSAVE
- C
- JTEMP = JTEMP + 1
- JSAVE = SEEDS(JTEMP)
- C
- IF (JSAVE .EQ. 0) THEN
- WRITE(*,*) '* RANDJ1 ZERO SEED SELECTED /SYSTEM ERROR/'
- WRITE(*,*) '* JTEMP=', JTEMP, ' JSIZE=', NSIZE
- ENDIF
- C
- 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.0000D0
- 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
- IF (A) 10,20,30
- 10 A = IABS(A)
- GOTO 30
- 20 A = 18127
- WRITE (*,*) 'RANDJ4 INPUT SEED(a) OF ZERO; Reset OK'
- 30 CONTINUE
- C
- IF (B) 40,50,60
- 40 B = IABS(B)
- GOTO 30
- 50 B = 16651
- WRITE (*,*) 'RANDJ2 INPUT SEED(b) OF ZERO; Reset OK'
- 60 CONTINUE
- 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