. . FILE PROTECTION ROUTINES . . THIS ELEMENT PROCESSES THE PROTECT COMMAND AND CONTAINS THE . SUBROUTINES CALLED BY THE INPUT AND OUTPUT ROUTINES TO IMPLEMENT . CRYPTOGRAPHIC FILE PROTECTION. . . . (C) Copyright 1972-1978 John Walker . . This software is in the public domain . AXR$ DEFUNCT$ FANG . . PROTECT COMMAND PROCESSING . PROTECT* LX X9,CDBPC,X8 LOAD LINK TO FILE PARAMETER LX X10,PBVAL,X9 LOAD FDT ADDRESS FOR THE FILE TNZ PBLINK,X9 IS STRING PARAMETER PRESENT ? J PROTOFF NO. TURN OFF PROTECT MODE LX X9,PBLINK,X9 LINK TO STRING PARAMETER SNONZ FDPROT,X10 SET PROTECTION MODE FOR THE FILE LA A0,PBVAL,X9 LOAD LENGTH OF THE STRING TLE,U A0,7 WILL BUFFER BE TWO WORDS ? J ZOWK NO. HANDLE ZERO OR ONE WORD KEY DL A0,PBSS,X9 LOAD STRING PARAMETER PSETK DS A0,FDCRYK,X10 SET CRYPTOGRAPHIC KEY IN FDT COMPLETE . COMPLETE COMMAND PROCESSING . ZOWK JZ A0,CANK USE CANNED KEY IF ZERO LENGTH STRING LA A0,PBSS,X9 LOAD ONE WORD USER KEY MI A0,('MARGIN') MIX UP THE BITS J PSETK GO SET THE KEY IN THE FDT . CANK DL A0,('NSA FT MEADE') LOAD CANNED KEY FOR IDIOTS J PSETK SET IT IN THE FDT . . TURN OFF PROTECTION IF NO STRING SPECIFIED . PROTOFF SZ FDPROT,X10 CLEAR FILE PROTECTION MODE COMPLETE . COMPLETE THE COMMAND /. . . LX,U X1,<BLOCK BUFFER> . LX,U X5,<4 WORD WORK BUFFER> . DL A0,(<72 BIT KEY>) . LR,U R1,<BUFFER LENGTH> . LMJ X2,ENCIPHER (OR DECIPHER) . <RETURN> X1,X2,X6,X11,A0-A5,R1,R2 DESTROYED . ENCIPHER* LMJ X11,RANDOMISE INITIALISE RANDOM NUMBER GENERATOR LXI,U X1,1 LOAD INCREMENT IN BUFFER POINTER J CRYPT1 ENTER ENCODING LOOP CRYPT LMJ X6,RANDOM GET NEXT RANDOM NUMBER XOR A0,,X1 ENCODE A WORD SA A1,MASK USE ENCODED WORD AS MASK FOR NEXT TIME SA A1,,*X1 REPLACE IT IN THE BUFFER CRYPT1 JGD R1,CRYPT LOOP FOR ALL WORDS J 0,X2 RETURN TO CALLER . . DECIPHER* LMJ X11,RANDOMISE INITIALISE RANDOM NUMBER GENERATOR LXI,U X1,1 LOAD INCREMENT IN BUFFER POINTER J DCRYPT1 ENTER DECODING LOOP DCRYPT LMJ X6,RANDOM GENERATE FIRST RANDOM NUMBER LA A1,,X1 LOAD FIRST ENCODED WORD FROM BUFFER SA A1,MASK USE ENCODED DATA AS MASK FOR NEXT TIME XOR A0,A1 GENERATE CLEAR DATA WORD SA A1,,*X1 STORE BACK INTO THE BUFFER DCRYPT1 JGD R1,DCRYPT LOOP FOR ALL WORDS IN BUFFER J 0,X2 RETURN TO CALL /. . . RANDOM NUMBER GENERATOR FOR ENCODING DATA . . DESIGNED BY DAN DRAKE. ADAPTED BY JOHN WALKER. . BASED UPON KNUTH, SECTION 3.2. . . THIS ROUTINE OPERATES TWO RANDOM NUMBER GENERATORS, RAN1 AND . RAN2. ON EACH CALL IT CYCLES EACH GENERATOR AND COMBINES . THE RESULTS USING A MLU. THE MLU MASK IS THE XOR OF THE PREVIOUS . RAN1 AND RAN2. . . RAN1 IS A MULTIPLICATIVE CONGRUENTIAL GENERATOR OPERATING . MODULO THE LARGEST PRIME LESS THAN 2**35. THIS GENERATES . 35 HIGH-QUALITY RANDOM BITS. SINCE ONLY 35 BITS ARE . GENERATED, BIT 2**35 ALWAYS COMES FROM RAN2. THE SHIFTING . OF THE RESULT SHOULD MAKE THIS LESS VULNERABLE. . . RAN2 IS A MIXED CONGRUENTIAL GENERATOR FOLLOWING THE RULE: . X(N+1) = X(N)*2049 + 1 (MOD 2**36) . 2049 PERMITS MULTIPLICATION BY SHIFTING AND ADDING, . FOR SIMPLICITY IN HANDLING 36 BITS. IT IS THE LARGEST . 2**N + 1 FOR WHICH THE POTENCY IS MAXIMISED. . . THE FACT THAN RAN2 IS A FAIRLY BAD GENERATOR SHOULD BE . COMPENSATED BY THE MIXTURE WITH RAN1. . . CALLING SEQUENCE: . . LX,U X5,<RANDOM BUFFER> . LMJ X6,RANDOM . <RETURN> A0 = RANDOM NUMBER . . THE <RANDOM BUFFER> IS A FOUR-WORD BUFFER CONTAINING THE ONGOING . DATA FOR THE GENERATOR. THIS BUFFER IS BUILT BY THE CALL: . . LX,U X5,<RANDOM BUFFER> . DL A0,(<72 BIT KEY>) . LMJ X11,RANDOMISE . <RETURN> . . . FORMAT OF RANDOM BUFFER . MASK EQUF 0,X5 MASK FOR MLU INSTRUCTION RAN1 EQUF 1,X5 CURRENT VALUE OF RAN1 GENERATOR RAN2 EQUF 2,X5 CURRENT VALUE OF RAN2 GENERATOR (2 WDS) . RANDOM* LR R2,MASK LOAD MASK TO COMBINE VALUES LA,S2 A3,RAN1 LOAD SHIFT COUNT LA A4,RAN1 LOAD PREVIOUS RAN1 VALUE MI A4,(8589934583) MULTIPLY BY MAX PERIOD MULTIPLIER DI A4,(0377777777741) TAKE MOD GREATEST PRIME < 2**35 SA A5,RAN1 SAVE NEW VALUE FOR RAN1 GENERATOR DL A0,RAN2 LOAD CURRENT VALUE FOR RAN2 GENERATOR LDSL A0,11 MULTIPLY BY 2048 BY SHIFTING DA A0,RAN2 AND ADD VALUE TO GET * 2049 DA A0,(1D) ADD ONE TO GET N*2049+1 SA A1,RAN2+1 STORE RESULTS MOD 2**36 MLU A1,A5 COMBINE RESULTS OF TWO GENERATORS SSC A2,,A3 SHIFT RESULT LA A0,A2 LOAD RESULT FOR CALLER XOR A1,A5 COMBINE OUTPUTS FOR NEXT TIME SA A2,MASK SAVE IN RUNNING MASK WORD J 0,X6 RETURN TO CALLER . . RANDOM BUFFER SETUP SUBROUTINE . RANDOMISE* TG A0,(0377777777741) IS VALUE GREATER THAN LARGEST PRIME ? ANA A0,(0377777777741) YES. MAKE MOD LARGEST PRIME JNZ A0,$+2 IS IT EXACTLY OUR MODULUS ? LA A0,('MARGIN') YES. GIVE HIM ANOTHER NUMBER SA A0,RAN1 STORE START VALUE FOR RAN1 GENERATOR SZ RAN2 CLEAR FIRST WORD OF RAN2 VALUE SA A1,RAN2+1 SET START VALUE FOR RAN2 GENERATOR SZ MASK CLEAR INITIAL MLU MASK LMJ X6,RANDOM RUN THE GENERATORS 1 PASS J 0,X11 RETURN (MASK IS NOW SET UP) END