Google
 

Trailing-Edge - PDP-10 Archives - cuspmar86binsrc_1of2_bb-x128b-sb - 10,7/acct/actcus.mac
There are 2 other files named actcus.mac in the archive. Click here to see a list.
TITLE	CUSPSW - PASSWORD PROCESSING AND ENCRYPTION ALGORITHMS

	SEARCH	ACTPRM
	MODULE	(CUSCRP)

	ENTRY	ENCRYP,	ENCRYN,	LENPSW,	SETPSW,	CHKPSW

CURALG::EXP	3		;CURRENT ENCRYPTION ALGORITHM INDEX
;LENPSW - DETERMINE AND VALIDATE PASSWORD LENGTH
; CALL:	MOVE	S1, ADDRESS OF PROFILE
;	MOVE	S2, ADDRESS OF PASSWORD
;	PUSHJ	P,LENPSW
;
; TRUE RETURN:	LENGTH OK
; FALSE RETURN:	LENGTH LESS THAN MINIMUM REQUIRED
;
; ON EITHER RETURN, S1 CONTAINS THE MINIMUM REQURED LENGTH

LENPSW::LOAD	TF,.AEREQ(S1),AE.PWL ;GET MINIMUM LENGTH REQUIRED
	JUMPE	TF,.RETT	;RETURN IF ZERO
	PUSHJ	P,.SAVE2	;SAVE P1
	DMOVE	P1,S1		;COPY ARGS
	HRLI	P2,(POINT 8,)	;8-BIT ASCIZ
	MOVSI	S2,-.APWLC	;MAXIMUM LENGTH

LENPS1:	ILDB	S1,P2		;GET A CHARACTER
	JUMPE	S1,LENPS2	;DONE?
	AOBJN	S2,LENPS1	;LOOP

LENPS2:	HRRZS	S2		;KEEP ONLY COUNT
	LOAD	S1,.AEREQ(P1),AE.PWL ;GET MINIMUM LENGTH REQUIRED
	CAIGE	S2,(S1)		;CHECK IT
	$RETF			;TOO SMALL
	$RETT			;RETURN GOODNESS
; SETPSW - STORE PASSWORD IN RECORD
; CALL:	MOVE	S1, ADDRESS OF PASSWORD IN 8-BIT ASCIZ
;	MOVE	S2, ADDRESS OF BUFFER CONTAINING RECORD
;	PUSHJ	P,SETPSW
;
; TRUE RETURN:	PASSWORD SET IN RECORD
; FALSE RETURN:	ENCRYPTION ALGORITHM FAILED
;
; GETTING THE RECORD IN CORE, AND PUTTING IT BACK ARE THE CALLER'S PROBLEM

SETPSW::$SAVE	P1		;SAVE P1
	MOVE	P1,S2		;KEEP ADDRESS OF BUFFER
	MOVE	T1,S1		;COPY ADDRESS OF NEW PASSWORD
	MOVE	T3,.AEPPN(P1)	;AND PPN FOR SALT
	PUSHJ	P,ENCRYP	;ENCRYPT IT, PLEASE
	$RETIF			;RETURN PROPAGATING ERROR IF ANY
	MOVE	T1,P1		;PROFILE ADDRESS
	MOVE	T2,S1		;GET -LENGTH,,0
	HRRI	T2,.AEPSW	;PROFILE OFFSET
	MOVE	T3,S2		;ENCRYPTED PASSWORD ADDRESS
	MOVEI	T4,0		;CLEAR .AEMAP ENTRY
	PUSHJ	P,A$EBLK##	;UPDATE PROFILE
	MOVE	S1,CURALG	;GET THE ALGORITHM USED
	STORE	S1,.AEFLG(P1),AE.PWE ;STORE ENCRYPTION ALGORITHM NUMBER
	$RETT			;RETURN
; CHKPSW - CHECK PASSWORDS
; CALL:	MOVE	S1, ADDRESS OF PASSWORD IN 8-BIT ASCIZ
;	MOVE	S2, ADDRESS OF PROFILE CONTAINING RECORD
;	PUSHJ	P,CHKPSW
;
; TRUE RETURN:	PASSWORD MATCHES
; FALSE RETURN:	PASSWORD DOES NOT MATCH
; IT IS THE CALLERS RESPONSIBILITY TO SET THE VALIDATION FAILED BIT.

CHKPSW::$SAVE	P1		;SAVE P1
	MOVE	P1,S2		;SAVE RECORD ADDRESS
	MOVE	T1,S1		;POINT TO PASSWORD SUPPLIED BY CALLER
	MOVEI	T2,PSWBLK	;POINT TO PLACE TO RECEIVE PASSWORD
	MOVE	T3,.AEPPN(P1)	;AND PPN FOR SALT
	LOAD	T4,.AEFLG(P1),AE.PWE ;GET THE ENCRYPTION VERSION
	PUSHJ	P,ENCRYN	;ENCRYPT IT
	$RETIF			;RETURN IF UNKNOWN ALG #
	HLLZ	T1,.AEPSW(P1)	;-NUMBER OF WORDS OF PASSWORD
	HRRZ	T2,.AEPSW(P1)	;GET OFFSET
	ADDI	P1,(T2)		;INDEX INTO PROFILE
	HRLI	P1,(IFIW 0(T1))	;MAKE AN INDIRECT PTR TO CURRENT WORD
CHKPS1:	MOVE	S1,@P1		;GET A WORD OF USER-SUPPLIED PASSWORD
	CAME	S1,PSWBLK(T1)	;COMPARE IT
	$RETF			;FAILED TO COMPARE
	AOBJN	T1,CHKPS1	;AND LOOP
	$RETT			;SUCCESS
;ENCRYP - Routine to take a 39 character password and encrypt it non-reversably
;	into a 144 bit quantity.
;Calling sequence
;	T1/ Pointer to 8-BIT ASCIZ string to encrypt.
;	T2/ Four word block to receive encrypted password
;	T3/ PPN to be used as salt.
;	T4/ALGORITHM NUMBER TO USE
;Return
;	Always,

ENCRYP::MOVE	T4,CURALG	;USE CURRENT ALGORITHM
ENCRYN::SKIPLE	T4		;CAN'T BE NEGATIVE OR ZERO
	CAILE	T4,AL$MAX	;OR GREATER THAN MAXIMUM?
	$RETF			;CAN ONLY HAPPEN IF ENTER FROM ENCRYN
	MOVEI	T2,PSWBLK	;WHERE ENCRYPED PASSWORD WILL GO
	PUSHJ	P,@ALGTAB-1(T4)	;DISPATCH
	MOVSI	S1,-4		;-LENGTH
	MOVEI	S2,PSWBLK	;ADDRESS
	$RETT			;RETURN

ALGTAB:	IFIW	ALG1		;6-BIT CRC
	IFIW	ALG2		;6-BIT POLYNOMIAL
	IFIW	ALG3		;8-BIT ASCIZ CRC
	IFIW	ALG4		;8-BIT POLYNOMIAL
	IFIW	ALG5		;NCRYPT
	IFIW	ALG6		;ALTERNATE NCRYPT
AL$MAX==.-ALGTAB		;LENGTH OF TABLE
	SUBTTL	ALGORITHMS 1 & 3 - 6 & 8 BIT CRC

; 6-BIT CRC
ALG1:	$SAVE	<P1,P2,P3,P4>	;WE TRASH THESE ACS
	PUSHJ	P,CNVSIX	;CONVERT 8-BIT ASCIZ PASSWORD TO SIXBIT
	DMOVE	P1,T2		;COPY ARGS
	PUSHJ	P,SMTH6		;SMOOTH THE PASSWORD ACROSS FOUR WORD BLOCK
	JRST	ALG1.0		;ENTER COMMON CODE

; 8-BIT ASCIZ CRC
ALG3:	PUSHJ	P,.SAVE4	;SAVE SOME ACS
	DMOVE	P1,T2		;COPY ARGS
	PUSHJ	P,CVTCAS	;DO CASE CONVERSION
	PUSHJ	P,SMTH8		;SMOOTH THE PASSWORD ACROSS FOUR WORD BLOCK

ALG1.0:	IMUL	P2,[^D10006721*^D3167] ;SPREAD SALT AROUND SALT WORD
	ADDI	P2,^D84857	;AVOID PROPAGATING TRALING ZEROES
	HRLI	P1,-WRDS	;MAKE AN AOBJN POINTER TO ENCRYPTED BLOCK

ALG1.1:	SETZB	T1,T2		;CLEAR DESTINATION
	DMOVE	T3,(P1)		;GET TWO WORDS OF PASSWORD
	TLC	P1,3
	TLCN	P1,3		;WAS THIS THE LAST WORD IN THE BLOCK?
	MOVE	T4,-3(P1)	;YES, DON'T USE JUNK BEYOND END
	MOVE	P3,(P1)		;GET A WORD FROM THE PASSWORD BLOCK
	XOR	P3,T4		;COMBINE IT WITH NEXT WORD
	ROT	P3,^D2		;ROTATE IT ODDLY
	ADD	P3,P2		;ADD IN THE "SALT" (SCRAMBLED PPN)
	MOVEI	P4,^D72		;NUMBER OF BITS WE ARE GOING TO DO

ALG1.2:	TRNE	P3,1		;ODD COMMAND BIT?
	DADD	T1,T3		;YES, ADD IN CURRENT OPERAND
	ROTC	T1,1		;SHIFT
	ROT	P3,-1		;ROTATE COMMAND BITS IN OPPOSITE DIRECTION
	SOJGE	P4,ALG1.2	;LOOP FOR EVERY BIT IN GROUP
	MOVEM	T1,(P1)		;STASH ENCRYPTED WORD
	AOBJN	P1,ALG1.1	;REPEAT FOR NEXT GROUP
	$RETT			;DONE


CNVSIX:	MOVE	T4,T1		;COPY ORIGINAL PASSWORD BLOCK ADDRESS
	MOVEI	T1,PSW6		;WILL USE THIS INSTEAD
	PUSHJ	P,.SAVET	;SAVE T1-T4
	MOVE	T1,T4		;GET ORIGINAL BLOCK ADDRESS BACK
	HRLI	T1,(POINT 8,)	;BYTE POINTER TO SOURCE
	MOVE	T2,[POINT 6,PSW6] ;BYTE POINTER TO DESTINATION
	MOVEI	T3,.APWLC	;MAX CHARACTER COUNT
	MOVE	T4,[PSW6,,PSW6+1] ;SET UP BLT
	SETZM	PSW6		;CLEAR FIRST WORD
	BLT	T4,PSW6+<.APWLC/6> ;ZERO INTERMEDIATE STORAGE
CNVSI1:	ILDB	T4,T1		;GET A CHARACTER
	JUMPE	T4,.POPJ	;RETURN IF ALL DONE
	ANDI	T4,177		;MASK DOWN
	CAIL	T4,"A"+40	;RANGE
	CAILE	T4,"Z"+40	; CHECK
	SUBI	T4,40		;CONVERT TO LOWER
	IDPB	T4,T2		;PUT A CHARACTER
	SOJG	T3,CNVSI1	;LOOP
	POPJ	P,		;RETURN


CVTCAS:	PUSHJ	P,.SAVET	;SAVE SOME ACS
	HRLI	T1,(POINT 8,)	;8-BIT ASCIZ
	MOVEI	T2,.APWLC	;CHARACTER COUNT
CVTCA1:	SOJL	T2,.POPJ	;DON'T GO OFF THE DEEP END
	ILDB	T3,T1		;GET A CHARACTER
	JUMPE	T3,.POPJ	;RETURN IF END OF STRING
	CAIL	T3,"A"+40	;LOWER CASE?
	CAILE	T3,"Z"+40
	CAIL	T3,340
	CAILE	T3,375
	JRST	CVTCA1		;NO
	SUBI	T3," "		;YES, MAKE UPPER
	DPB	T3,T1		;CONVERT IN PLACE
	JRST	CVTCA1		;LOOP OVER ALL CHARACTERS
	SUBTTL	ALGORITHMS 2 & 4 - 6 & 8 BIT POLYNOMIALS

;THIS COMPUTES  P^(2^30+36) +A1*P^(2^30) +A2*P^3 +A3*P^2 +A4*P +A5
;COPIED FROM TOPS20 MODULE CRYPT.MAC

	P5==P4+1

; 6-BIT POLYMONIAL
ALG2:	$SAVE	<P1,P2,P3,P4,P5> ;P ACS
	PUSHJ	P,CNVSIX	;CONVERT 8-BIT ASCIZ PASSWORD TO SIXBIT
	MOVE	P1,T2		;SAVE POINTER TO FOUR-WORD BLOCK
	PUSHJ	P,SMTH6		;SPREAD THE BITS AROUND
	JRST	ALG2.0		;ENTER COMMON CODE

; 8-BIT ASCIZ POLYNOMIAL
ALG4:	$SAVE	<P1,P2,P3,P4,P5> ;P ACS
	MOVE	P1,T2		;SAVE POINTER TO FOUR-WORD BLOCK
	PUSHJ	P,CVTCAS	;CONSISTENT CASING
	PUSHJ	P,SMTH8		;SPREAD THE BITS AROUND

ALG2.0:	MOVE	T1,P1		;GET BACK POINTER TO DATA
	MOVEI	P5,2		;NUMBER OF DOUBLE WORD GROUPS TO ENCODE
	DMOVE	P3,2(T1)	;FROM SCRATCH

ALG2.1: TDC	P3,0(T1)	;FIRST HALF
	TDC	P4,1(T1)	;SECOND HALF
	DMOVE	P1,P3		;DOUBLE WORD TO ENCODE
	LSHC	P1,-1		;PUT SIGNIFICANT BITS WHERE THEY BELONG
	DDIV	P1,HSHMOD	;TAKE MOD
	DMOVE	T3,P3 		;SAVE ORIGINAL NUMBER
	MOVEI	T2,5 		;LOOP COUNT

ALG2.2: DMOVE	P1,P3 		;COPY NUMBER FOR SQUARE
	DMUL	P1,P3 		;SQUARE IT
	DDIV	P1,HSHMOD 	;TAKE MOD
	SOJG	T2,ALG2.2 	;LOOP TO RAISE IT TO THE 32 POWER
	DMOVEM	P3,1(T1)	;SAVE PWD^32
	DMOVE	P1,P3 		;MOVE FOR MULTIPLY
	DMUL	P1,T3		;MAKE PWD^33
	DDIV	P1,HSHMOD 	;TAKE MOD
	DADD	P3,HSHA1 	;ADD IN FIRST COEFFICIENT
	SETZB	P1,P2 		;MAKE QUAD-WORD
	DDIV	P1,HSHMOD 	;TAKE MOD
	DMOVE	P1,1(T1)	;GET PWD^32 BACK
	DMOVEM	P3,1(T1)	;SAVE A1+PWD^33
	DMOVE	P3,P1 		;COPY FOR SQUARE
	MOVEI	T2,^D25 	;LOOP COUNT

ALG2.3:	DMUL	P1,P3 		;SQUARE IT
	DDIV	P1,HSHMOD 	;TAKE MOD
	DMOVE	P1,P3 		;COPY FOR SQUARE
	SOJG	T2,ALG2.3 	;LOOP TO PRODUCE (PWD^(2^30))
	DMUL	P1,1(T1)	;MULTIPLY BY A1+PWD^33
	DDIV	P1,HSHMOD 	;TAKE MOD
	DADD	P3,HSHA2 	;YES
	SETZB	P1,P2 		;MAKE A QUAD-WORD
	DDIV	P1,HSHMOD 	;TAKE MOD
	SETZ	T2,		;OFFSET FOR COEFFICIENTS

ALG2.4: DMOVE	P1,P3 		;MOVE FOR MULTIPLY
	DMUL	P1,T3		;MULTIPLY BY PWD
	DDIV	P1,HSHMOD 	;TAKE MOD
	DMOVE	P1,P3 		;MOVE FOR MULTIPLY
	DADD	P1,HSHA3(T2)	;YES
	DDIV	P1,HSHMOD 	;TAKE MOD
	ADDI	T2,2 		;NEXT COEFFICIENT
	CAIGE	T2,6 		;ONLY 3 MORE COEFFICIENTS
	JRST	ALG2.4 		;KEEP GOING
	DMOVEM	P3,1(T1)	;STORE ENCODED PASSWORD DOUBLEWORD
	ADDI	T1,2 		;POINT TO NEXT DOUBLEWORD
	SOJG	P5,ALG2.1 	;DO BOTH DOUBLEWORDS
	SETZ	T2,		;APPEND A ZERO
	$RETT			;RETURN

HSHMOD: OCT 377777777777,377777777735	;(2^70-35) PRIME MODULUS
HSHA1:	OCT 305301317120,157221260120	;THE RANDOMLY CHOSEN COEFFICIENTS
HSHA2:	OCT 147300565442,275156661305
HSHA3:	OCT 276504256001,246721554756
	OCT 226461502774,377222042231
	OCT 040267005300,343010077117
;SMTH6/SMTH8 - ROUTINE TO TAKE AN 8-BIT ASCIZ PASSWORD STRING AND
;CONVERT IT INTO A SMOOTH 144 BIT QUANTITY
;Call
;	T1/ Pointer to source string
;	T2/ Pointer to four word block to receive data
;Return
;	always

SRCBPT==<SRCCNT==<DSTADR==0>-1>-1
BYTES==.APWLC			;NUMBER OF INCOMING BYTES
BYTSIZ==1			;BYTE SIZE TO SPREAD AROUND
WRDS==4				;NUMBER OF WORDS IN DESTINATION
ORGWRD==2			;FIRST WORD TO DEPOSIT STUFF INTO
ORGPOS==21			;ORIGINAL POSITION TO DEPOSIT BYTES
ROTPOS==13			;HOW FAR TO ROTATE ON EACH ITERATION


SMTH6:	SKIPA	T4,[<BYTES*6>/BYTSIZ] ;6-BIT ENTRY POINT
SMTH8:	MOVE	T4,[<BYTES*8>/BYTSIZ] ;8-BIT ENTRY POINT
	PUSH	P,[POINT BYTSIZ,(T1)];POINTER TO SOURCE STRING
	PUSH	P,T4		;SAVE NUMBER OF ITERATIONS TO MAKE
	PUSH	P,T1		;SAVE T1
	MOVSI	T1,0(T2)	;POINT TO DESTINATION BLOCK
	HRRI	T1,1(T2)	;MAKE A BLT POINTER
	SETZM	(T2)		;CLEAR THE FIRST WORD
	BLT	T1,WRDS-1(T2)	;CLEAR THE ENTIRE BLOCK
	POP	P,T1		;RESTORE T1
	HRLI	T2,(IFIW (T2))	;MAKE AN INDIRECT POINTER TO DESTINATION
	PUSH	P,T2		;AND SAVE IT ON STACK
	MOVEI	T2,ORGWRD	;WORD TO START AT
	MOVEI	T4,ORGPOS	;ORIGINAL POSITION

SMTH.1:	SOSGE	SRCCNT(P)	;ALLOCATE A BIT FROM INPUT
	JRST	SMTH.2		;DONE, EXIT
	ILDB	T3,SRCBPT(P)	;GET A BYTE
	ROT	T3,(T4)		;POSITION IT CORRECTLY
	XORM	T3,@DSTADR(P)	;ADD IT INTO DESTINATION
	ADDI	T4,ROTPOS	;NEXT TIME'S ROTATION
	CAIL	T4,^D36		;MORE THAN A WORD'S ROTATION?
	SUBI	T4,^D36		;YES, LIMIT IT
	SOSGE	T2		;DECREMENT RELATIVE WORD TO DEPOSIT
	MOVEI	T2,WRDS-1	;START AT TOP IF OFF BOTTOM
	JRST	SMTH.1		;AND LOOP

SMTH.2:	ADJSP	P,-3		;BLOW AWAY THREE LOCATIONS ON THE STACK
	POPJ	P,		;AND RETURN
	SUBTTL	ALGORITHM 5 - NCRYPT


;Although this algorithm looks impressive, it is not.  To take advantage
;of the enhanced security offered by this release, we recommend that you
;force your users to change their passwords immediately on LOGIN.  This
;algorithm is provided only so that they can login that one time.

ALG5:	PUSHJ	P,CNVSIX	;CONVERT 8-BIT ASCIZ PASSWORD TO SIXBIT
	PUSH	P,T1		;SAVE T1
	MOVSI	T1,0(T2)	;POINT TO DESTINATION BLOCK
	HRRI	T1,1(T2)	;MAKE A BLT POINTER
	SETZM	(T2)		;CLEAR THE FIRST WORD
	BLT	T1,WRDS-1(T2)	;CLEAR THE ENTIRE BLOCK
	POP	P,T1		;RESTORE T1
	PUSH	P,T2		;SAVE WHERE TO STORE RESULT
	PUSH	P,T3		;SAVE PPN
	MOVE	T2,(T1)		;GET PSWD IN T2
	MOVE	T1,T2		;AND T2
	HRRZ	T4,(P)		;GET PROGRAMMER NUMBER
	IDIVI	T2,(T4)		;DIVIDE INTO PASSWORD
	MOVM	T3,T3		;GET ABS(REMAINDER)
	MOVE	T4,T3		;COPY FOR A LOOP COUNTER
ALG5.1:	MUL	T1,T1		;SQUARE THE PASSWORD
	ROTC	T1,^D18		;GET MIDDLE 36 BITS OF RESULT
	JUMPN	T1,.+2		;MAKE SURE NON-ZERO
	MOVE	T1,T2		;IF ZERO, PICK UP PSWD AGAIN
	SOJG	T4,ALG5.1	;DO THIS A LARGE (RANDOM) NO. OF TIMES
	XOR	T1,(P)		;MUNGE IT STILL MORE
	IDIVI	T3,^D35		;DIVIDE LOOP COUNTER
	ROT	T1,1(T4)	;ROTATE T1 BY REMAINDER
	MOVEM	T1,@-1(P)	;STORE INADEQUATE RESULT
	ADJSP	P,-2		;TOSS OUR SCRATCH SPACE
	$RETT
	SUBTTL	ALGORITHM 6 - ALTERNATE NCRYPT


;Although this algorithm looks impressive, it is not.  To take advantage
;of the enhanced security offered by this release, we recommend that you
;force your users to change their passwords immediately on LOGIN.  This
;algorithm is provided only so that they can login that one time.

ALG6:	PUSHJ	P,CNVSIX	;CONVERT 8-BIT ASCIZ PASSWORD TO SIXBIT
	PUSH	P,T1		;SAVE T1
	MOVSI	T1,0(T2)	;POINT TO DESTINATION BLOCK
	HRRI	T1,1(T2)	;MAKE A BLT POINTER
	SETZM	(T2)		;CLEAR THE FIRST WORD
	BLT	T1,WRDS-1(T2)	;CLEAR THE ENTIRE BLOCK
	POP	P,T1		;RESTORE T1
	MOVE	T4,T2		;WHERE TO STORE RESULT
	MOVS	T1,(T1)		;GET PASSWORD
	XOR	T1,T3		;VARY A BIT
	MUL	T1,[^D1220703125] ;5**13
	LSHC	T1,^D18		;GET MIDDLE 36 BITS OF RESULT
	XOR	T1,T3		;VARY A BIT
	MUL	T1,[^D1220703125] ;5**13
	LSHC	T1,^D18		;GET MIDDLE 36 BITS OF RESULT
	MOVEM	T1,0(T4)	;STORE INADEQUATE RESULT
	$RETT
	LIT

	RELOC	0

PSWBLK:	BLOCK	WRDS         	;TEMPORARY STORAGE FOR ENCRYPTED PASSWORD
PSW6:	BLOCK	.APWLC/6+1	;8-BIT TO SIXBIT CONVERTED PASSWORD RESULT

	PRGEND
TITLE	CUSREA - CUSTOMER INTERFACE TO REACT


	SEARCH	ACTPRM,ORNMAC
	MODULE	(CUSREA)

	ENTRY	CMDCUS,	CMDCUP,	ENTCUS

;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1985,1986.  ALL RIGHTS RESERVED.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR ANY  OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF THE  SOFTWARE  IS  HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.


	ND	FTISWS,0	;NORMALLY TURNED OFF
				; SET NON-ZERO FOR IN-HOUSE CORPORATE
				; DATA CENTER
	ND	FTXMPL,0	;NORMALLY TURNED OFF
				; SET NON-ZERO TO ASSEMBLE IN EXAMPLES
				; SHOWING HOW TO ADD CUSTOMER DEFINED
				; PRIVILEGED AND UNPRIVILEGED COMMANDS,
				; AND CUSTOMER DEFINED PROFILE ENTRY TYPES
SUBTTL	CUSTOMER COMMAND TABLES


; PRIVILEGED ADMINISTRATIVE COMMANDS
CMDCUS::$STAB
IFN FTXMPL,<
	DSPTAB	(PFOO00,PFOO,<PRVFOO>)
> ;END IFN FTXMPL
	$ETAB


; UNPRIVILEGED USER COMMANDS
CMDCUP::$STAB
IFN FTXMPL,<
	DSPTAB	(UFOO00,UFOO,<USRFOO>)
> ;END IFN FTXMPL
	$ETAB

IFN FTXMPL,<
PFOO00:	$NOISE	(CONFRM##,<privileged>)
UFOO00:	$NOISE	(CONFRM##,<unprivileged>)
> ;END IFN FTXMPL
SUBTTL	PFOO COMMAND


IFN FTXMPL,<

	XWD	PFOHLP,[ASCIZ /Performs the privileged FOO function/]
PFO:	$RETT


PFOHLP:	ASCIZ	\
The FOO command.
\

> ;END IFN FTXMPL
SUBTTL	UFOO COMMAND


IFN FTXMPL,<

	XWD	UFO,[ASCIZ /Performs the unprivileged FOO function/]
UFO:	$RETT

UFOHLP:	ASCIZ	\
The UFOO command.
\

> ;END IFN FTXMPL
SUBTTL	CUSTOMER ENTRIES -- PRIVILEGES


CPV010::$STAB
IFN FTXMPL,<
	DSPTAB	(PRV010##,CPVXXX,<X-PRIV>)
	DSPTAB	(PRV010##,CPVYYY,<Y-PRIV>)
> ;END IFN FTXMPL

IFN FTISWS,<
	DSPTAB	(PRV010##,CPVCPN,<CHANGE-PPN>)
	DSPTAB	(PRV010##,CPVMDC,<MDC-SET-P>)
	DSPTAB	(PRV010##,CPVNEX,<NETWORK-EXAMINE>)
	DSPTAB	(PRV010##,CPVTRD,<TRMOP-READ>)
	DSPTAB	(PRV010##,CPVTWR,<TRMOP-WRITE>)
> ;END IFN FTISWS

	$ETAB

CPVBPS::!
IFN FTXMPL,<
CPVXXX:	XWD	[POINT	1,.AEPRV(U),35],[ASCIZ /X-priv/]
CPVYYY:	XWD	[POINT	1,.AEPRV(U),34],[ASCIZ /Y-priv/]
> ;END IFN FTXMPL

IFN FTISWS,<
CPVCPN:	XWD	[POINT	1,.AEPRV(U),35],[ASCIZ /Change-PPN/]
CPVNEX:	XWD	[POINT	1,.AEPRV(U),34],[ASCIZ /Network-examine/]
CPVTWR:	XWD	[POINT	1,.AEPRV(U),33],[ASCIZ /TRMOP-write/]
CPVTRD:	XWD	[POINT	1,.AEPRV(U),32],[ASCIZ /TRMOP-read/]
CPVMDC:	XWD	[POINT	1,.AEPRV(U),18],[ASCIZ /MDC-Set-P/]
> ;END IFN FTISWS
CPVBPE::!

CPVPRT::SKIPL	S1,[IOWD CPVBPE-CPVBPS,CPVBPS] ;IOWD POINTER TO BITS
	$RETT			;TABLE IS EMPTY
	$TEXT	(,<    ^A>)	;INDENT NEXT SET OF TYPEOUT
	PUSHJ	P,PRTBTS##	;AND OUTPUT THE FIRST SET OF BITS
	$RETT
	SUBTTL	CUSTOMER FIELDS


ENTCUS::$STAB
	KEYTAB	(NUL##,<NULL-ENTRY>,CM%NOR!CM%INV)
IFN FTXMPL!FTISWS,<
	KEYTAB	(DLG,<DEFAULT-LOG-FILE>)
> ;END IFN FTXMPL!FTISWS
	$ETAB
SUBTTL	CUSTOMER ENTRIES -- DEFAULT-LOG-FILE


IFN FTXMPL!FTISWS,<

	.ENTRY	(DLG,.AELOG,<Default log file>)

DLGPRS:	$FILE	(CONFRM,<filesec>,<$PREFIL(DLGACT)>)

DLGACT:	MOVE	S1,[GJFBLK##,,GJFBLK##+1] ;SET UP TO ZERO BLOCK
	SETZM	GJFBLK##	;CLEAR 1ST WORD
	BLT	S1,GJFBLK##+GJFSIZ-1 ;CLEAR THE REST
	MOVSI	S1,'...'	;GET SOMETHING TO MARK OUR PLACE
	MOVEM	S1,GJFBLK##+.FDSTR ;STORE IT
	$RETT			;RETURN


; GET ROUTINE
DLGGET:	PUSHJ	P,.SAVE1	;SAVE P1
	PUSHJ	P,P$FILE##	;GET THE FILESPEC
	JUMPF	PRSERR##	;CHECK FOR ERRORS
	MOVE	P1,S1		;SAVE FD ADDRESS
	PUSHJ	P,P$CFM##	;GET EOL
	JUMPF	PRSERR##	;CHECK FOR ERRORS
	MOVSI	S1,'...'	;GET PLACE HOLDER VALUE
	CAMN	S1,.FDSTR(P1)	;DEVICE SPECIFIED?
	SETZM	.FDSTR(P1)	;NO, ZERO DEVICE WORD
	MOVEI	T1,(U)		;PROFILE ADDRESS
	LOAD	T2,ARG.HD(P1),AR.LEN ;GET LENGTH
	MOVNI	T2,-1(T2)	;NEGATE (ACCOUNT FOR WORD COUNT WORD)
	HRLZS	T2		;PUT IN LH
	HRRI	T2,.AELOG	;PROFILE OFFSET
	MOVEI	T3,ARG.DA(P1)	;ADDRESS OF DATA
	SETZ	T4,		;CLEAR DEFAULT BIT
	PUSHJ	P,A$EBLK##	;ALLOCATE AND STORE EXTENSIBLE BLOCK
	SKIPT			;CHECK FOR ERRORS
	WARN	(NRM,<No room in profile for DEFAULT-LOG-FILE>,,DLGRES)
DLGGO:	MOVEI	S1,.AELOG	;PROFILE OFFSET
	PJRST	CMPVLC##	;SET CHANGE FLAGS AND RETURN


; COMPARE ROUTINE
DLGCMP:	MOVEI	S1,.AELOG	;PROFILE OFFSET
	PJRST	COMPAR##	;GO COMPARE


; CHANGE ROUTINE
DLGCHG:	MOVEI	S1,.AELOG	;PROFILE OFFSET
	PJRST	QUECHG##	;QUEUE UP THE CHANGE


; RESTORE ROUTINE
DLGRES:	MOVEI	T1,(U)		;POINT TO PROFILE
	HLLZ	T2,.AELOG(X)	;-LENGTH
	HRRI	T2,.AELOG	;OFFSET
	MOVE	T3,.AELOG(X)	;ORIGINAL OFFSET POINTER
	ADDI	T3,(X)		;INDEX INTO PROFILE
	MOVX	T4,DF.LOG	;DEFAULT BIT FOR FIELD
	TDNN	T4,DF$LOG(X)	;WANT IT DEFAULTED?
	TDZA	T4,T4		;NO, RESTORE THE ZERO
	MOVEI	T4,1		;YES, RESTORE THE ONE
	PUSHJ	P,A$EBLK##	;RESTORE ORIGINAL DEFAULT LOG FILE
	SETZM	@CHGADR##	;INDICATE NOT CHANGING PROFILE ENTRY
	SETZM	CHGMSK##+.AELOG	;IN BOTH PLACES
	$RETT			;RETURN


; DEFAULTING ROUTINE
DLGDFL:	MOVX	S1,DF.LOG	;DEFAULT BIT
	IORM	S1,DF$LOG(U)	;LIGHT IT
	SETOM	PRSDFV##	;SETTING TO DEFAULT VALUE
	PJRST	DLGGO		;SETUP MASKS AND RETURN


; PRINT ROUTINE
DLGPRT:	SKIPE	S1,.AELOG(U)	;GET AOBJN POINTER TO FILESPEC
	JRST	DLGPR1		;GOT ONE
	$TEXT	(,<-none->)	;NOPE
	$RETT			;RETURN

DLGPR1:	ADDI	S1,(U)		;INDEX INTO PROFILE
	HLRE	S2,S1		;GET -LENGTH OF FILESPEC
	MOVMS	S2		;MAKE POSITIVE
	HRLZM	S2,FDBLK+.FDLEN	;SAVE AS FD LENGTH
	HRLZS	S1		;PUT FILESPEC ADDRESS IN LH
	HRRI	S1,FDBLK+.FDSTR	;MAKE A BLT POINTER
	BLT	S1,FDBLK+.FDPAT+4 ;COPY FOR GLXTXT
	$TEXT	(,<^F/FDBLK/>)	;DISPLAY
	$RETT			;RETURN
; HELP TEXT
DLGHLP:	ASCIZ	\
Default batch log file
\

> ;END IFN FTXMPL!FTISWS


	END