TITLE LOGIN - PASSWORD SCRAMBLER AND TESTER ; ACCUMULATOR DEFINITIONS A=1 B=2 C=3 D=4 E=5 P=17 COMPTR=D ; COMMAND POINTER HOLDER FOR GETSYL FIN=11 ; CHANNEL FOR MAIL FILE INPUT TOUT=12 ; CHANNEL FOR MAIL TYPING TIN=13 ; CHAN FOR TYPE IN BOUT=14 ; BLOCK OUTPUT TTY CHAN TEMP=15 ; CHAN FOR TEMP DISK CHECKING OF PASSWDS USRI=16 ; CHANNEL FOR OPENING OWNER OF STY PDLLEN==40. PDL: BLOCK PDLLEN BUFLEN==20. BUF: BLOCK BUFLEN VBUF: BLOCK BUFLEN ; BLOCK FOR VALUE RETURN ; MACRO TO CAUSE COMMENT TO BE RETURNED TO SUPERIOR. DEFINE VALRET STR .VALUE [ASCIZ /:KILL :LOGIN: STR /] TERMIN DEFINE CNTASC STR -.LENGTH /STR//5-1,,[ASCIC /STR/] TERMIN DEFINE VALOUT STR .VALUE [ASCIZ /: STR 0U/] TERMIN UNAME: 0 ;USER'S DESIRED UNAME. ALTUIN: 0 ;LOGGED IN WITH ALT-U? START: MOVE P,[-PDLLEN,,PDL-1] ; SET UP PDL .BREAK 12,[..RJCL,,BUF] ;INVOKE SUPERIOR FOR COMMAND MOVE COMPTR,[440700,,BUF] ;GET BYTE POINTER FOR ASCII STRING .OPEN TIN,[SIXBIT / TTY/] SKIPA .OPEN BOUT,[SIXBIT / #TTY/] ;BLOCK MODE OUTPUT SKIPA .OPEN TOUT,[SIXBIT/ !TTY/] ;UNIT OUTPUT VALRET [TTY failure, please notify MB.] .SUSET [.RUNAME,,UNAME] ; AND NAME LOGGED IN AS .SUSET [.RXJNAM,,A] LDB A,[301400,,A] CAIN A,'SC JRST LOGDIN SKIPE ALTUIN JRST GOTNAM ; IF LOGGED IN WITH ALT-U, CHECK PASSWORD ANYWAY HLLE A,UNAME ; NEW SYSTEM DEFINES -1 IN LEFT HALF AS NOT LOGD AOJN A,LOGDIN ; LOGGED IN? LET HIM SCRAMBLE HIS GOODIE PUSHJ P,GETSYL ; GET UNAME TO LOG IN AS MOVEM B,UNAME JUMPE B,[VALOUT [No name supplied]] GOTNAM: HLLES B AOSN B ILLNAM: VALOUT [Not supposed to use that name] .CALL [SETZ SIXBIT /TTYGET/ MOVEI TIN MOVEM A MOVEM B SETZM C] .LOSE %LSSYS TLO C,%TSSII .CALL [SETZ SIXBIT /TTYSET/ MOVEI TIN A B SETZ C] .LOSE %LSSYS MOVE A,UNAME MOVEM A,TESTMP' SETOM C TEST1: MOVEI B,0 LSHC A,-6 JUMPE A,TEST3 JUMPE B,TEST2 ROT B,6 CAIG B,'9 CAIGE B,'0 JRST TEST3 TEST2: LSH C,6 JRST TEST1 TEST3: MOVE A,TESTMP ANDM C,TESTMP CAMN A,TESTMP SETZM TESTMP PUSHJ P,CKNAME SKIPA A,TESTMP JRST WIN LDB B,[360600,,A] CAIN B,'. LSH A,6 JUMPE A,LOSER1 PUSHJ P,CKNAME SKIPA JRST WIN LOSER1: SKIPN ALTUIN JRST LOSER2 .CALL [SETZ ? 'STYGET ? 1000,,TIN ? SETZM B] .LOSE 1000 SKIPE B .CALL [SETZ ? SIXBIT /OPEN/ 5000,,10 1000,,USRI [SIXBIT /USR/] B SETZI] JRST LOSER2 .USET USRI,[.RSNAM,,A] CAME A,['HST206] CAMN A,['HST306] .VALUE [ASCIZ /:KILL /] ;NOT USING .BREAK TO AVOID OBSCURE DDT LOSSAGE CAMN A,['HST354] .VALUE [ASCIZ /:KILL /] LOSER2: VALOUT [User not known on this system. Send mail to ACCOUNTS@MIT-DMS requesting system usage.] WIN: SKIPE ALTUIN JRST ALTUSR JUMPE A,LOSER ;PASSWORD FILED IS "NULL", PASS IMMEDIATE CAMN A,[-1] JRST ILLNAM ;PASSWORD FILED IS -1, REJECT IMMEDIATE PUSHJ P,CKPASS VALOUT [Password not matched] MOVE B,[CNTASC [ password ok. ]] .IOT BOUT,B LOSER: MOVE COMPTR,[440700,,VBUF] ; INIT VALUE CONCAT STRING MOVEI B,[ASCIZ /:KILL /] PUSHJ P,PUTA MOVE A,UNAME PUSHJ P,PUT6 ;NAME TO LOGIN MOVEI B,[ASCIZ /1U/] ;FOO$1U TURNS ON TTY (DOES A ^V) BEFORE DOING INIT FILE. PUSHJ P,PUTA SETZ A, IDPB A,COMPTR ; RAM ZERO AT TAIL OF STRING .VALUE VBUF ; VALUE IT UP TO MONIT VALRET [Proceeded after LOGIN, notify MB.] ALTUSR: SKIPE A CAMN A,[543460,,275614] .VALUE [ASCIZ /:KILL /] CAMN A,[-1] JRST ILLNAM PUSHJ P,CKPASS VALOUT [Password not matched] .VALUE [ASCIZ /: password ok. :KILL /] PUT6: MOVEI B,0 ROTC A,6 ADDI B,40 IDPB B,COMPTR JUMPN A,PUT6 POPJ P, PUTA: HRLI B,440700 ILDB A,B JUMPE A,CPOPJ IDPB A,COMPTR JRST .-3 LOGDIN: MOVE A,UNAME TRZ A,77 CAME A,[SIXBIT/GUEST/] JRST EGGS VALRET [You are already logged in!] EGGS: MOVE COMPTR,[MSG1] ;POINTER FOR MAIL OF USERS NAME MOVE A,UNAME PUSHJ P,PUT6 MOVEI A,0 ;HERE TO GET A WORD, AND TYPE OUT ITS SCRAMBLE PUSHJ P,CKPASS ;0 MEANS LET IT PASS .VALUE [ASCIZ /Obscure.bug/] MOVEM A,BASKET' ;ALL IN ONE MOVE B,[CNTASC [Type word again, to see if it matchesî]] .IOT BOUT,B PUSHJ P,CKPASS ;TO TRY AGAIN JRST [ MOVE B,[CNTASC [ not matched. Try typing in code againî]] .IOT BOUT,B JRST EGGS] MOVE A,BASKET MOVE B,[440300,,A] MOVE COMPTR,[MSG2] ;POINTER FOR MAIL OF PASSWORD BENEDICT:ILDB C,B ADDI C,"0 PUSHJ P,CLUCK CAMN B,[220300,,A] PUSHJ P,[MOVEI C,", ? JRST CLUCK2] TLNE B,770000 JRST BENEDICT ; .SUSET [.SSNAME,,['COMSYS]] ; .OPEN TEMP,[SIXBIT / #DSKMSGX >/] ; JRST [ MOVE A,[CNTASC [Cannot send code now, try again, or MAIL to MB]] ; .IOT BOUT,A ; JRST EGGSIT] ; MOVE A,[-MSGLNG,,MSG] ; .IOT TEMP,A ; .CLOSE TEMP, EGGSIT: .IOT TOUT,[15] .BREAK 16,160000 CLUCK2: PUSHJ P,.+1 ;OUTPUT TO TTY AND "ACCOUNT" MAIL CLUCK: .IOT TOUT,C IDPB C,COMPTR POPJ P, MSG: .BYTE 7 IRPC A,,["TO" ("ACCOUNTS") "FROM" ": " "TEXT" "My password code is :nnnnnn,,nnnnnn " "SCHEDULE" ("SENDING" #FALSE ()) ] IFE "A-":,[ IF1,[IRP B,,[MSG1,MSG2] IFNDEF B,B: .ISTOP TERMIN ]] IFN "A-":,"A TERMIN REPEAT 5,^C .BYTE MSGLNG==.-MSG-1 ;CKNAME CHECK FOR NAME IN MASTER FILE ; A/ 6BIT NAME TO SEARCH FOR ; 0 RETURN - NAME NOT FOUND ; 1 RETURN - A/ SCRAMBLED ENTRY CKNAME: PUSH P,B ? PUSH P,C SKIPL NAMWDS JRST CKNAM1 .OPEN TEMP,[SIXBIT / "SYS PASS WORDS/] JRST CKNML1 ;OPEN LOSS, RETURN .CALL [SETZ ? 'FILLEN MOVEI TEMP SETZM B] JRST CKNML1 ;BAD FILE? MOVEM B,NAMWDS MOVEI B,1777(B) ;WORD COUNT LSH B,-12 SKIPE B ;SKIP IF EMPTY FILE CAILE B,400-NAMPAG ;SKIP IF NOT TOO BIG JRST CKNML2 ;FILE BAD SIZE? MOVNS B ;- WDS MOVSS B ;-WDS,, HRRI B,NAMPAG MOVEI C,0 .CALL [SETZ ? 'CORBLK MOVEI 200000 MOVEI -1 B MOVEI TEMP SETZ C] JRST CKNML2 ;CORE LOST .CLOSE TEMP, ;CLOSE CHANNEL NOW ; A/ NAME, B/ #WDS IN FILE, C/ INDEX CKNAM1: MOVE B,NAMWDS TRZ B,1 ;TRUNCATE WORD COUNT MOVEI C,0 CAMN A,NAMES(C) ;SKIP IF NOT YET JRST [AOS -2(P) ;SKIP RETURN MOVE A,NAMES+1(C) JRST CKNML2] ADDI C,2 CAMGE C,B JRST .-4 JRST CKNML1 CKNML2: SETOM NAMWDS .CORE NAMPAG JFCL CKNML1: .CLOSE TEMP, POP P,C ? POP P,B POPJ P, NAMWDS: -1 ;CKPASS: CHECK PASSWORD IN FILE, ASKING USER FOR TYPIN OF IT ; INPUT A/ INPUT SCRAMBLED CODE FROM FILE ; RETURN 0 - FAILED AFTER A FEW TRIES ; RETURN 1 - WON, HE TYPED IN A STRING WHICH MATCHED WHEN SCRAMBLED CKPASS: PUSH P,A ? PUSH P,B ? PUSH P,C MOVEI A,CKPMSC ;COUNT OF TRIES MOVEM A,CKPCNT' .CALL [SETZ ? 'TTYGET ? [TIN] ? MOVEM A ? SETZM B] JRST CKPAS0 ;FAILED? MOVEM A,GRPS1' ;STORE GROUP BITS MOVEM B,GRPS2' AND A,[171717171717] ;MASK ECHO BITS TO "OFF" AND B,[171717171717] .CALL [SETZ ? 'TTYSET ? [TIN] ? A ? SETZ B] JFCL CKPAS0: SOSGE A,CKPCNT JRST CKPASX MOVE A,CKPMSG(A) .IOT BOUT,A MOVEI A,14. MOVE C,[440700,,BUF] CKPAS1: .IOT TIN,B CAIG B,40 JRST CKPAS4 SOJLE A,CKPAS5 IDPB B,C .IOT TOUT,["*] JRST CKPAS1 CKPAS5: MOVE B,[CNTASC [ - too long ]] .IOT BOUT,B CKPAS4: .IOT TOUT,["*] SOJG A,.-2 MOVEI B,0 IDPB B,C MOVE A,[440700,,BUF] MOVEM A,COMPTR PUSHJ P,GETSYL MOVE A,B PUSHJ P,SCRAMBLE CAME A,-2(P) JRST [ SKIPE -2(P) JRST CKPAS0 JRST .+1] EXCH A,-2(P) AOS -3(P) CKPASX: POP P,C ? POP P,B ? POP P,A .CALL [SETZ ? 'TTYSET ? [TIN] ? GRPS1 ? SETZ GRPS2] JFCL POPJ P, CKPMSG: CNTASC [ - wrong again. This will be your last try - ] CNTASC [ - not matched. Please try again - ] CNTASC [Password please - ] CKPMSC==.-CKPMSG SCRAMBLE:PUSH P,B ? PUSH P,C PUSH P,A PUSHJ P,CBITS MOVE C,A MOVE B,(P) ROT B,(A) XOR B,(P) MOVE A,B PUSHJ P,CBITS ADD C,A ROT B,(A) XOR B,[3.1415927] MOVE A,B PUSHJ P,CBITS ADD C,A ROT B,(A) XOR B,[2.7182818] MOVN A,C ROT B,36.(A) MOVE A,B SUB P,[1,,1] POP P,C ? POP P,B POPJ P, ;COUNT THE NUMBER OF 1'S IN WORD CBITS: JUMPE A,[POPJ P,] ;0 GIVES QUICK ANSWER PUSH P,B ;SAVE STUFF PUSH P,C MOVE B,A ;TEMP MOVEI C,1 ;INITIAL COUNTER SOS A ANDB A,B ;REMOVE EXACTLY 1 "1" JUMPN A,[AOJA C,.-2] ;COUNT AGAIN IF NOT FINISHED MOVE A,C ;COUNT TO BE RETURNED POP P,C POP P,B POPJ P, ; GETSYL - ROUTINE TO GET SINGLE WORD OFF COMMAND LINE ; ONLY BRK CHAR ARE : ; SPACE AND CONTROLS EXCEPT ^Q WHICH ; QUOTES THE NEXT NON CTL CHAR (: ; SP) GETSYL: PUSH P,[0] ; INIT SYL ON STACK MOVE B,[440600,,0(P)] ; BYT PTR TO STACK GETSLP: ILDB A,COMPTR SKIPN A ; END OF STRING JRST GETSX ; END OF SYL CAIN A,^Q ; IS IT "QUOTE" JRST GETQOT ; YES SUBI A,40 ; MAKE SIXBIT JUMPL A,GETSX ; CTL=EXIT JUMPE A,GETSP ; INIT SPACES FLUSHED CAIE A,': CAIN A,'; JRST GETSX ; ; OR : TERM GETSPT: CAIL A,100 ; LC? SUBI A,40 ; MAKE UC TLNE B,770000 ; CHECK FIT IDPB A,B ; STORE CHAR JRST GETSLP GETQOT: ILDB A,COMPTR ; GET CHAR TO QUOTE SKIPN A ; EMPTY? JRST GETSX ; EXIT SUBI A,40 ; 6BIT JUMPGE A,GETSPT ; CAN'T ^Q A CTL JRST GETSX GETSP: TLNE B,400000 ; IF NONE YET PUT IN JRST GETSLP ; SPACE IGNORED GETSX: POP P,B ; ASSEMBLED SYL TO B CPOPJ: POPJ P, ; BRK IS LEFT IN A VARS:: VARIABLES LITTER: CONSTANTS LOC <.+1777>&776000 NAMES: NAMPAG==./2000 END START