.TITLE LVE - LOCK VIRTUAL DISK .SBTTL LVE - TITLE PAGE .IDENT /V02.00/ ; ; ************************************************************************ ; * ; FULL PERMISSION AND CONSENT IS HEREBY GIVEN TO DECUS AND TO THE DECUS * ; SPECIAL INTEREST GROUPS TO REPRODUCE, DISTRIBUTE, AND PUBLISH AND * ; PERMIT OTHERS TO REPRODUCE IN WHOLE OR IN PART, IN ANY FORM AND * ; WITHOUT RESTRICTION, THIS PROGRAM AND ANY INFORMATION RELATING THERETO * ; * ; ************************************************************************ ; ; LOCK (OR RESET LOCK) ON VIRTUAL DISK ; ; VERSION: V01.00 ; ; AUTHOR: GLENN EVERHART ; ; MODIFICATION HISTORY: ; ; 10-AUG-82 ADDED /CR:KEY SWITCH TO ALLOW ENCRYPTION OF HOME ; BLOCK (ASSUMED TO BE LOGICAL BLOCK 1) BY XOR WITH THE KEY. ; THIS ALLOWS SOME SMALL ADDITIONAL PROTECTION OF THE VOLUME ; CONTAINER FILE BY MAKING IT UNMOUNTABLE UNTIL DECRYPTED. ; THE XOR ALGORITHM IS HIGHLY INSECURE AS A CRYPTOGRAPHIC ; TOOL GENERALLY, BUT WILL MAKE IT FAIRLY DIFFICULT TO ACCESS ; THE DISK IF USED. THUS THERE ARE 2 PASSWORDS TO ACCESS THE ; DISK. ONE CONTROLS ACCESS BY (NONPRIV) TASKS, THE OTHER ; CONTROLS THE HOME BLOCK SCRAMBLING. - G. EVERHART. ; 18-MAY-83 ADDED /SD SWITCH TO SET SINGLE DIRECTORY DEVICE ; (DV.SDI) BIT IN U.CW2 TO CONTROL SINGLE DIRECTORY ATTRIBUTE ; AND /MD SWITCH TO CLEAR DV.SDI. .SBTTL LVE - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; SYMBOLIC DEFINITIONS. ; .MCALL HDRDF$ ;DEFINE TASK HEADER OFFSETS HDRDF$ .MCALL UCBDF$ ;DEFINE UCB OFFSETS UCBDF$ .MCALL TCBDF$ TCBDF$ .GLOBL $TKTCB ; ; DIRECTIVE MACROS. ; .MCALL DIR$ ;ISSUE DIRECTIVE .MCALL ALUN$S ;ASSIGN LUN .MCALL EXIT$S ;EXIT SYSTEM .MCALL GMCR$ ;GET MCR COMMAND LINE .MCALL QIOW$ ;ISSUE QIO AND WAIT .MCALL QIOW$S,QIO$S .MCALL SVTK$S ;SETUP SST VECTOR TABLE ; ; CSI MACROS. ; .MCALL CSI$ ;DEFINE CSI OFFSETS CSI$ .MCALL CSI$1,CSI$2 ;PARSE COMMAND LINE .MCALL CSI$SW,CSI$SV,CSI$ND ;SWITCH LOGIC ; ; FCS MACROS. ; .MCALL NBOF$L ;DEFINE FNB OFFSETS NBOF$L ; ; OTHER MACROS. ; .MCALL CALL,CALLR,RETURN ;SUBROUTINE MACROS ; ; GLOBAL DECLARATIONS: ; .GLOBL LVE ;TASK ENTRY ; ; GLOBAL REFERENCES: ; ; SYSTEM LIBRARY ROUTINES, SYMBOLS. ; .GLOBL $COTB ;CONVERT OCTAL TO BINARY .GLOBL IO.RLB,IO.WLB ;READ/WRITE LOGICAL BLOCK .GLOBL IO.WAT ;WRITE ATTRIBUTES .GLOBL IO.WVB ;WRITE VIRTUAL BLOCK .GLOBL IS.SUC ;I/O SUCCESS CODE .GLOBL $DSW ;DIRECTIVE STATUS WORD ; ; RSX11M SYSTEM ROUTINES, VARIABLES. ; .GLOBL $DEACB ;DEALLOCATE CORE BLOCK .GLOBL $HEADR ;CURRENT TASK HEADER ADDRESS .SBTTL LVE - MACROS ; ; DEFINE ERROR DECLARATION MACRO. ; .MACRO FATAL MSG TRAP 1 .ASCIZ #MSG# .EVEN .ENDM FATAL ; ; DEFINE SYSTEM STATE MACRO. ; .MACRO SYSTEM ADR EMT 376 .WORD ADR .ENDM SYSTEM ; ; DEFINE FILES-11 QIO MACRO. ; .MACRO F11QIO DPB,ADR DIR$ #DPB .IF NB ADR BCS ADR CMPB #IS.SUC,IOSTAT BNE ADR .ENDC .ENDM F11QIO .SBTTL LVE - LOCAL DATA ; ; LOCAL SYMBOLS: ; ; LOGICAL UNITS/EVENT FLAGS. ; TSTLUN = 1 ;LVE WORKING LUN TTYLUN = 2 ;TERMINAL I/O LUN FILLUN = 3 ;FILE I/O LUN EV.QIO = 1 ;QIO WAIT EVENT FLAG ; ; LOCAL DATA: ; ; DIRECTIVES. ; GETCMD: GMCR$ ;GET COMMAND LINE ERRDPB: QIOW$ IO.WVB,TTYLUN,EV.QIO,,,, ; ; ERROR MESSAGE STRING. ; ERRMSG: .ASCIZ <15><12>/LVE -- / ERRSTR: .BLKB 40. .EVEN ; ; STT VECTOR TABLE. ; SSTTBL: .WORD 0 ;ODD ADDRESS .WORD 0 ;MEMORY PROTECTION .WORD 0 ;T-BIT TRAP OR BPT .WORD 0 ;IOT TRAP .WORD 0 ;RESERVED INSTRUCTION .WORD 0 ;NON-RSX EMT INSTRUCTION .WORD ERRSRV ;TRAP INSTRUCTION SSTSIZ = <.-SSTTBL>/2 ; ; CSI CONTROL BLOCK. ; CSIBLK: .BLKB C.SIZE ;DEFINE CSI EXTENSION BLOCK .EVEN ; ; FILENAME BLOCK. ; FILFNB: .BLKB S.FNB ;FILENAME BLOCK ; ; WRITE ATTRIBUTE LIST. ;; ;WATLST: .BYTE 03,01 ;WRITE USER CHARACTERISTICS ; .WORD WATATT ; ; .BYTE 0,0 ;END-OF-LIST ;WATATT: .BYTE 200 ;CLEAR LOCK BIT, LEAVE CONTIGIOUS ON .EVEN ; ; OTHER VARIOUS BUFFERS. ; IOSTAT: .WORD 0,0 ;I/O STATUS BLOCK UCBADR: .WORD 0 ;VE: UCB ADDRESS EXTADR: .WORD 0 ;VIRTUAL EXTENSION BLOCK ADDRESS SWITCH: .WORD 0 ;SWITCH FLAGS PASSWD: .WORD 0 ;PASSWORD VALUE NEWPWD: .WORD 0 ;NEW PASSWORD IF DESIRED CRKEY: .WORD 0 ;VALUE TO XOR WITH HOME BLK CRBUF: .BLKW 256. ;BUFFER TO CONTAIN HOME BLOCK .MCALL QIOW$S SW.PA=1 SW.NE=2 SW.UN=4 ;BIT VALUES OF SWITCHES SW.IN=10 SW.LO=20 SW.CR=40 SW.SD=100 SW.MD=200 SWTBL: CSI$SW PA,SW.PA,SWITCH,SET,NEG,PAVALX CSI$SW NE,SW.NE,SWITCH,SET,NEG,NEVALX CSI$SW CR,SW.CR,SWITCH,SET,NEG,CRVALX CSI$SW SD,SW.SD,SWITCH,SET,NEG ;/SD - SINGLE DIRECTORY (MFD ONLY) CSI$SW MD,SW.MD,SWITCH,SET,NEG ;/MD - MULTI DIRECTORY CSI$SW UN,SW.UN,SWITCH,SET,NEG CSI$SW IN,SW.IN,SWITCH,SET,NEG CSI$SW LO,SW.LO,SWITCH,SET,NEG ;LOGOUT...INVALIDATE W/O PWD CSI$ND PAVALX: CSI$SV NUMERIC,PASSWD,2,PAVAL NEVALX: CSI$SV NUMERIC,NEWPWD,2,NEVAL CRVALX: CSI$SV NUMERIC,CRKEY,2,CRVAL CSI$ND .SBTTL LVE * MAIN-LINE TASK CODE ; ;+ ; THIS SECTION CONTAINS THE ENTRY LEVEL CODE FOR THE LVE TASK. ; IN GENERAL, THE STEPS PERFORMED ARE AS FOLLOWS: ; ; 1. GET THE COMMAND LINE. ; 2. PARSE COMMAND INTO ELEMENTS. ; 3. SET THE VIRTUAL DISK AS FOR EXCLUSIVE USE BY THIS TI: ; ; INPUT: ; ; MCR COMMAND LINE IN FORM SHOWN BELOW. ; ; LVE VEN:/SW ; ; VEN: VIRTUAL DISK TO LOCK ; ; /SW INCLUDE ; /PA:NNNNNN GIVE PASSWORD IN OCTAL. MUST ; MATCH OLD ONE FOR ANY ACTION TO BE ; TAKEN. ; /NE:MMMMMM NEW PASSWORD TO REPLACE OLD ONE IF ENTERED ; /UN UNLOCK DISK (ALLOW PUBLIC ACCESS) ; /IN INVALIDATE ACCESS BUT LEAVE PASSWORD ALONE ; (SETS NONEXISTENT UCB ADDRESS) ; /CR:KKKKKK ENCRYPT HOME BLOCK USING KEY KKKKKK OR DECRYPT ; USING KEY KKKKKK. ; /LO INVALIDATE ACCESS TO DISK WITHOUT NEEDING ; PASSWORD (FOR LOGOUT.CMD FILES.) ; ; OUTPUT: ; ; VIRTUAL DISK LOCKED/UNLOCKED OR ERROR MESSAGE ; OUTPUT TO USER'S TERMINAL. ; ;- ; LVE:: ;REF. LABEL. ; ; SETUP SST VECTOR TABLE FOR PROCESSING. ; SVTK$S #SSTTBL,#SSTSIZ ;SETUP SST VECTOR TABLE ; ; ZERO VARIOUS VARIABLES. ; CLR UCBADR ;CLEAR VEN: UCB ADDRESS CLR EXTADR ;CLEAR EXTENSION BLOCK ADDRESS ; ; GET COMMAND LINE, ERROR IF NONE AVAIABLE. ; DIR$ #GETCMD ;GET MCR COMMAND LINE BCC 1000$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR ; ; SETUP FOR COMMAND PARSING. ; 1000$: MOV #GETCMD+G.MCRB,R1 ;GET START OF COMMAND LINE MOV $DSW,R2 ;GET LENGTH OF COMMAND LINE 1100$: CMPB #' ,(R1)+ ;SCAN FOR FIRST BLANK CHARACTER BEQ 1200$ ; IF EQ - FOUND CHARACTER SOB R2,1100$ ;LOOP THROUGH ENTIRE LINE FATAL ;DECLARE ERROR ; ; CHECK COMMAND FOR SYNTACICAL CORRECTNESS. ; 1200$: DEC R2 ;CORRECT LINE LENGTH CSI$1 #CSIBLK,R1,R2 ;CHECK COMMAND LINE SYNTAX BCC 1210$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR 1210$: BITB #CS.EQU,C.STAT(R0) ;IS THERE AN EQUAL SIGN? BEQ 1300$ ; IF EQ - YES, CONTINUE FATAL ;DECLARE ERROR ; ; GET INPUT FILENAME. MUST ONLY BE VEX:. ; 1300$: CSI$2 #CSIBLK,OUTPUT,#SWTBL ;GET INPUT SPECIFICATION BCS 1311$ ; IF CS - BAD, ERROR BITB #CS.NMF!CS.DIF!CS.MOR,C.STAT(R0) ;IS OUTPUT ONLY DEVICE? BNE 1312$ ; IF NE - NO, ERROR ;ASSUME REST OF THE SYSTEM WAS BUILT WITH O$WNRS DEFINED .IIF NDF, O$WNRS .ERROR ;O$WNRS SYMBOL NOT DEFINED IN VEPRE. BITB #CS.DVF,C.STAT(R0) ;WAS A DEVICE SPECIFIED? BEQ 1313$ ; IF EQ - NO, ERROR MOV C.DEVD+2(R0),R0 ;GET DEVICE FIELD ADDRESS CMPB #'V,(R0)+ ;CHECK FIRST CHARACTER OF NAME BNE 1310$ ; IF NE - BAD, ERROR CMPB #'E,(R0)+ ;CHECK SECOND CHARACTER OF NAME BNE 1310$ ; IF NE - BAD, ERROR CALL $COTB ;CONVERT UNIT NUMBER CMPB #':,R2 ;CHECK FOR PROPER TERMINATOR BEQ 1400$ ; IF EQ - OK, CONTINUE 1310$: FATAL 1311$: FATAL 1312$: FATAL 1313$: FATAL ; ; ASSIGN VIRTUAL DISK TO LUN. ; 1400$: ALUN$S #TTYLUN,#"TI,#0 ;ASSIGH LUN 2 TO TI: BCS 1890$ ;IF CS CANT HACK IT ALUN$S #TSTLUN,#"VE,R1 ;ASSIGN VIRTUAL DISK BCC 2000$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR 1890$: FATAL ; ; GET VIRTUAL DISK UCB AND DEASSIGN IF POSSIBLE. ; 2000$: SYSTEM 2020$ ;;ENTER SYSTEM STATE MOV $HEADR,R5 ;;GET OUR TASK HEADER MOV H.LUN(R5),R5 ;;GET VE: UCB ADDRESS MOV U.NXT(R5),R0 ;;IS VCB ALLOCATED? BEQ 2010$ ;; IF EQ - YES, ERROR MOV R5,UCBADR ;;SAVE UCB ADDRESS BEQ 2010$ ;;SKIP OUT IF NO VALID UCB ;; ALLOW CONTROL OF SINGLE DIRECTORY DISK ATTRIBUTE SINCE MOU CLOBBERS ;; IT NOW. BIT #SW.SD,SWITCH ;;SET SINGLE DIRECTORY BIT? BEQ 2052$ ;;IF EQ NO, DON'T SET IT BIS #DV.SDI,U.CW1(R5) ;;IF SINGLE DIRECTORY SET IT SO. 2052$: BIT #SW.MD,SWITCH ;;/MD - WANT MULTIDIRECTORY DISK? BEQ 2053$ ;;IF EQ NO, LEAVE BIC #DV.SDI,U.CW1(R5) ;;IF MULTIDIR, CLEAR SINGLE DIR BIT 2053$: BIT #SW.CR,SWITCH ;;CRYPTING? BNE 2054$ ;;IF NE YES, ALLOW MOUNTED DISK BITB #US.MNT,U.STS(R5) ;;IS DISK MOUNTED? BEQ 2010$ ;; IF EQ - YES, CANNOT LOCK BITB #US.MDM,U.STS(R5) ;;IS DISK BEING DISMOUNTED? BNE 2010$ ;; IF NE - YES, CANNOT LOCK 2054$: ;ADDITIONAL TESTS FOR PASSWORD STUFF BIT #SW.LO,SWITCH ;;LOGOUT? FIX UP WITHOUT PASSWORD BNE 2011$ ;;JUST INVALIDATE ACCESS BIT #SW.PA,SWITCH ;;DID HE ENTER A PASSWORD? BEQ 2010$ ;;IF NOT, BOOT HIM OUT CMP PASSWD,U.PWD(R5) ;;DOES HE HAVE THE RIGHT PASSWORD? BNE 2010$ ;;IF NOT, FORGET HIM. BIT #SW.NE,SWITCH ;;WANT A NEW PASSWORD? BEQ 2006$ ;;IF NOT, SKIP SETUP MOV NEWPWD,U.PWD(R5) ;;ELSE STASH THE PASSWORD 2006$: BIT #SW.UN,SWITCH ;;UNLOCKING THE DISK? BNE 2007$ ;;IF EQ NO, LOCK IT UP HERE ;;LOCK THE DISK UP MOV $TKTCB,-(SP) ;;GET OUR TCB ADDRESS ADD #T.UCB,(SP) ;;FORM ADDRESS OF TI UCB MOV @(SP)+,U.TIU(R5) ;;FILL IN AS THIS DISK'S UCB BR 2008$ 2007$: ;;UNLOCK THE DISK CLR U.TIU(R5) ;;ZERO UCB DATA CLR U.PWD(R5) ;;AND PASSWORD ON UNLOCK. 2008$: BIT #SW.IN,SWITCH ;;INVALIDATE ACCESS? BEQ 2009$ ;;IF EQ NO, LEAVE ALONE 2011$: MOV #600,U.TIU(R5) ;;IF NE YES, PUT INVALID UCB ADDR 2009$: MOV R0,EXTADR ;;SAVE EXTENSION ADDR AS FLAG 2010$: RETURN ;;RETURN TO USER STATE 2020$: TST UCBADR ;WAS DISK ALLOCATED? BNE 2030$ ; IF NE - YES, CONTINUE FATAL ;DECLARE ERROR 2030$: MOV EXTADR,R0 ;WAS EXTENSION BLOCK DEALLOCATED? BNE 3000$ ; IF NE - YES, CONTINUE BIT #,SWITCH ; IF WE SET DIRECTORY BIT ONLY, OK BNE 3000$ ;SO NO FATAL MESSAGE THEN. FATAL ;DECLARE ERROR ; ; UNLOCK VIRTUAL DISK FILE, USING FNB STORED IN EXTENSION BLOCK. ; 3000$: ;ENCRYPT/DECRYPT HOME BLOCK IF CALLED FOR. BIT #SW.CR,SWITCH ;WAS THERE ANY CRYPTING TO DO? BEQ 3010$ ;IF EQ NO, SKIP IT. QIOW$S #IO.RLB,#TSTLUN,#1,,#IOSTAT,,<#CRBUF,#512.,,#0,#1> ;READ BLK 1 MOV #CRBUF,R0 MOV #256.,R1 MOV CRKEY,R2 ;GET KEY SWAB R2 ;MUCK IT AROUND BEFORE USE (ONLY A LITTLE, ;BUT THAT HELPS SOME COM R2 ;TO MAKE IT HARDER TO FIGURE IT OUT UNLESS ;SOMEONE SEES THIS CODE.) ADD #0,R2 ;ADD MAGIC CONSTANT MAGICK==.-2 ;THE ABOVE MAKES IT POSSIBLE TO BUILD LVE WITH A TKB PATCHABLE ;CONSTANT, SO KNOWING SOURCES WILL NOT SUFFICE TO GIVE THE ;MAPPING FROM ENTERED KEY TO CRYPTION CONSTANT. 3001$: MOV (R0),R3 ;GET WORD XOR R2,R3 ;XOR WITH KEY MOV R3,(R0)+ ;REPLACE IN BUFFER SOB R1,3001$ ;DO FOR ALL THE BUFFER QIOW$S #IO.WLB,#TSTLUN,#1,,#IOSTAT,,<#CRBUF,#512.,,#0,#1> ;WRITE BLK1 3010$: ; ALL DONE, EXIT TASK. ; 4000$: EXIT$S ;EXIT TASK .SBTTL ERRSRV * ERROR MESSAGE PROCESSING ; ;+ ; THIS ROUTINE IS ENTERED BY AN SST TRAP INSTRUCTION. IT OUTUTS ; THE ERROR MESSAGE AND EXITS THE TASK. ; ; INPUTS: ; ; THE TRAP CAUSED BY THE FATAL MACRO. THE STACK SHOULD ; BE SETUP AS SHOWN BELOW: ; ; SP+04 PS ; SP+02 PC OF TRAP+2 ; SP+00 TRAP OPERAND*2 ; ; THE TRAP INSTRUCTION IS FOLLOWED BY THE ASCIZ ERROR MESSAGE. ; ; OUTPUTS: ; ; THE ERROR MESSAGE IS OUTPUT TO THE USER'S TERMINAL AND ; THE TASK EXITS. ;- ; ERRSRV: MOV #ERRSTR,R0 ;GET START OF VARIABLE ERROR MOV 2(SP),R1 ;GET START OF ERROR MESSAGE 1100$: MOVB (R1)+,(R0)+ ;MOVE ERROR MESSAGE BNE 1100$ ; AND LOOP IF NOT DONE MOVB #15,-1(R0) ;MOVE IN EXTRA MOVB #12,(R0)+ ;MOVE IN EXTRA SUB #ERRMSG,R0 ;GET LENGTH OF STRING MOV R0,ERRDPB+Q.IOPL+2 ;STORE IN QIO DPB DIR$ #ERRDPB ;ISSUE OUTPUT EXIT$S ;EXIT TASK .END LVE