*DECK DB$SCRM 
USETEXT UTCDFTX 
      FUNC DB$SCRM(STRING) C(30); 
  
 #
  
  *   DB$SCRM - SCRAMBLE A 3-WORD STRING VALUE   PAGE  1
  *   STEVEN P. LEVIN                            DATE  01/26/76 
  
  DC  PURPOSE 
  
      SCRAMBLE A THREE-WORD PARAMETER STRING VALUE FOR ENCRYPTION.
  
  DC  ENTRY CONDITIONS
  
      THE PARAMETER STRING HAS A THREE-WORD VALUE TO BE SCRAMBLED.
  
  DC  EXIT CONDITIONS 
  
      UPON RETURN, DB$SCRM HAS A THREE-WORD VALUE DERIVED FROM THE
      VALUE OF STRING BY USE OF A SCRAMBLING (ENCRYPTING) ALGORITHM.
      THE VALUE OF THE PARAMETER STRING ITSELF IS NOT MODIFIED. 
  
  DC  CALLING ROUTINES
  
      DB$CLOK - CST BUILDER PROC TO BUILD A PRIVACY LOCK TABLE IN CORE
  
  DC  CALLED ROUTINES 
  
      NO ROUTINES ARE CALLED BY DB$SCRM.
  
  DC  NON-LOCAL VARIABLES 
  
      DB$SCRM IS GIVEN A VALUE AS DESCRIBED IN EXIT CONDITIONS ABOVE. 
  
  DC  DESCRIPTION 
  
      MOVE THE VALUE OF THE PARAMETER STRING TO A LOCAL 3-WORD ARRAY. 
      ON EACH OF SIX ITERATIONS THROUGH THE ENCRYPTING FOR-LOOP,
      EXCLUSIVE-OR THREE PAIRS OF WORDS AND SHIFT THE FIRST WORD LEFT 
      CIRCULAR BY A SHIFT COUNT DERIVED FROM FIVE BITS OF THAT WORD.
      SET DB$SCRM TO THE RESULTANT SCRAMBLED VALUE, AND RETURN. 
  
 #
        CONTROL EJECT;
  
        BEGIN                # DB$SCRM #
  
# THE FOLLOWING FORMAL PARAMETER IS PASSED TO DB$SCRM # 
  
        ITEM STRING C(30);   # STRING WHOSE VALUE IS TO BE SCRAMBLED #
  
  
# THE FOLLOWING ITEM AND ARRAY ARE LOCAL TO DB$SCRM # 
  
        ITEM INDEX I;        # A GENERAL INDEX AND INDUCTION VARIABLE#
  
        ARRAY LITERARR[0:0] P(3);      # THREE-WORD LITERAL ARRAY # 
  
          BEGIN              # LITERARR ARRAY # 
  
            ITEM LITERVAL C(0,0,30);   # THREE-WORD LITERAL VALUE # 
            ITEM LITERONE U(0,0,60);   # LITERAL VALUE WORD ONE # 
            ITEM LITERTWO U(1,0,60);   # LITERAL VALUE WORD TWO # 
            ITEM LITERTHR U(2,0,60);   # LITERAL VALUE WORD THREE # 
  
          END                # LITERARR ARRAY # 
  
# ******************************************************************** #
  
# MOVE THE VALUE OF THE PARAMETER STRING TO A LOCAL THREE-WORD ARRAY #
  
        LITERVAL[0] = STRING;          # MOVE STRING TO LOCAL ARRAY # 
  
# ON EACH OF SIX ITERATIONS THROUGH THE ENCRYPTING FOR-LOOP, #
# EXCLUSIVE-OR THREE PAIRS OF WORDS AND SHIFT THE FIRST WORD LEFT # 
# CIRCULAR BY A SHIFT COUNT DERIVED FROM FIVE BITS OF THE FIRST WORD #
  
        FOR INDEX = 0 THRU 5 DO        # SIX ITERATIONS THROUGH LOOP #
          BEGIN 
            LITERONE[0] = LITERONE[0] LXR LITERTWO[0];     # EXCLU-OR#
            LITERTWO[0] = LITERTWO[0] LXR LITERTHR[0];     # EXCLU-OR#
            LITERTHR[0] = LITERTHR[0] LXR LITERONE[0];     # EXCLU-OR#
            LITERONE[0] =    # LEFT CIRCULAR SHIFT BY LAST 5 BITS + 1#
              LITERONE[0] * 2 ** (B<DFBITSWD - 5,5> LITERONE[0] + 1); 
          END 
  
# SET DB$SCRM TO THE RESULTANT SCRAMBLED VALUE.  RETURN FROM DB$SCRM.#
  
        DB$SCRM = LITERVAL[0];         # SET DB$SCRM TO THE RESULT #
  
        RETURN;              # THREE-WORD STRING VALUE IS SCRAMBLED # 
  
        END                  # DB$SCRM #
  
      TERM
