Hex Artifact Content
Not logged in

Artifact 4f6a03a5f3e6b718968d5c8bf4d422d13c48a2b8:


0000: 5c 20 57 75 72 73 74 6b 65 73 73 65 6c 20 64 61  \ Wurstkessel da
0010: 74 61 20 66 72 6f 6d 20 77 77 77 2e 72 61 6e 64  ta from www.rand
0020: 6f 6d 2e 6f 72 67 20 20 20 20 20 20 20 20 20 20  om.org          
0030: 20 20 20 20 20 20 20 32 36 6a 61 6e 30 39 70 79         26jan09py
0040: 0a 0a 72 65 71 75 69 72 65 20 36 34 62 69 74 2e  ..require 64bit.
0050: 66 73 0a 72 65 71 75 69 72 65 20 63 72 79 70 74  fs.require crypt
0060: 6f 2d 61 70 69 2e 66 73 0a 0a 38 20 36 34 73 20  o-api.fs..8 64s 
0070: 43 6f 6e 73 74 61 6e 74 20 73 74 61 74 65 23 0a  Constant state#.
0080: 32 20 32 2a 20 20 43 6f 6e 73 74 61 6e 74 20 73  2 2*  Constant s
0090: 74 61 74 65 23 33 32 0a 31 20 20 20 20 20 43 6f  tate#32.1     Co
00a0: 6e 73 74 61 6e 74 20 73 74 61 74 65 23 31 36 0a  nstant state#16.
00b0: 0a 63 72 79 70 74 6f 2d 6f 20 6e 65 78 74 2d 74  .crypto-o next-t
00c0: 61 73 6b 20 2d 20 63 6c 61 73 73 2d 6f 20 21 0a  ask - class-o !.
00d0: 0a 63 72 79 70 74 6f 20 63 6c 61 73 73 0a 20 20  .crypto class.  
00e0: 20 20 73 74 61 74 65 23 20 75 76 61 72 20 77 75    state# uvar wu
00f0: 72 73 74 2d 73 6f 75 72 63 65 0a 20 20 20 20 73  rst-source.    s
0100: 74 61 74 65 23 20 75 76 61 72 20 77 75 72 73 74  tate# uvar wurst
0110: 2d 73 74 61 74 65 0a 20 20 20 20 73 74 61 74 65  -state.    state
0120: 23 20 75 76 61 72 20 6e 65 78 74 73 74 61 74 65  # uvar nextstate
0130: 0a 20 20 20 20 73 74 61 74 65 23 20 38 20 2a 20  .    state# 8 * 
0140: 75 76 61 72 20 6d 65 73 73 61 67 65 0a 20 20 20  uvar message.   
0150: 20 63 65 6c 6c 20 75 76 61 72 20 77 75 72 73 74   cell uvar wurst
0160: 2d 75 70 0a 65 6e 64 2d 63 6c 61 73 73 20 77 75  -up.end-class wu
0170: 72 73 74 6b 65 73 73 65 6c 0a 0a 3a 20 2e 31 36  rstkessel..: .16
0180: 20 28 20 75 5b 64 5d 20 2d 2d 20 29 0a 20 20 20   ( u[d] -- ).   
0190: 20 5b 20 63 65 6c 6c 20 38 20 3d 20 5d 20 5b 49   [ cell 8 = ] [I
01a0: 46 5d 20 30 20 5b 54 48 45 4e 5d 0a 20 20 20 20  F] 0 [THEN].    
01b0: 62 61 73 65 20 40 20 3e 72 20 68 65 78 20 3c 3c  base @ >r hex <<
01c0: 23 20 31 36 20 30 20 44 4f 20 23 20 4c 4f 4f 50  # 16 0 DO # LOOP
01d0: 20 23 3e 20 74 79 70 65 20 23 3e 3e 20 72 3e 20   #> type #>> r> 
01e0: 62 61 73 65 20 21 20 3b 0a 0a 3a 20 2e 6e 6e 62  base ! ;..: .nnb
01f0: 20 28 20 61 64 64 72 20 6e 20 2d 2d 20 29 20 20   ( addr n -- )  
0200: 62 6f 75 6e 64 73 20 20 3f 44 4f 20 20 49 20 36  bounds  ?DO  I 6
0210: 34 40 20 2e 31 36 20 73 70 61 63 65 20 20 31 20  4@ .16 space  1 
0220: 36 34 73 20 2b 4c 4f 4f 50 20 3b 0a 3a 20 2e 36  64s +LOOP ;.: .6
0230: 34 62 20 28 20 61 64 64 72 20 2d 2d 20 29 20 36  4b ( addr -- ) 6
0240: 34 20 2e 6e 6e 62 20 3b 0a 0a 3a 20 2e 73 74 61  4 .nnb ;..: .sta
0250: 74 65 20 20 28 20 2d 2d 20 29 20 77 75 72 73 74  te  ( -- ) wurst
0260: 2d 73 74 61 74 65 20 20 2e 36 34 62 20 3b 0a 3a  -state  .64b ;.:
0270: 20 2e 73 6f 75 72 63 65 20 28 20 2d 2d 20 29 20   .source ( -- ) 
0280: 77 75 72 73 74 2d 73 6f 75 72 63 65 20 2e 36 34  wurst-source .64
0290: 62 20 3b 0a 0a 61 6c 69 67 6e 20 68 65 72 65 0a  b ;..align here.
02a0: 24 36 43 35 46 36 46 36 43 42 45 36 32 37 31 37  $6C5F6F6CBE62717
02b0: 32 2e 20 36 34 2c 20 24 37 31 36 34 43 33 30 36  2. 64, $7164C306
02c0: 30 33 36 36 31 43 32 45 2e 20 36 34 2c 20 24 43  03661C2E. 64, $C
02d0: 45 35 30 30 39 34 30 31 42 34 34 31 33 34 36 2e  E5009401B441346.
02e0: 20 36 34 2c 20 24 34 35 34 46 41 33 33 35 41 36   64, $454FA335A6
02f0: 45 36 33 41 44 32 2e 20 36 34 2c 0a 24 41 42 45  E63AD2. 64,.$ABE
0300: 39 44 30 44 36 34 38 43 31 35 46 36 45 2e 20 36  9D0D648C15F6E. 6
0310: 34 2c 20 24 42 39 30 46 44 34 30 36 30 44 37 39  4, $B90FD4060D79
0320: 33 35 44 36 2e 20 36 34 2c 20 24 46 37 45 44 41  35D6. 64, $F7EDA
0330: 38 45 32 45 38 44 36 43 42 33 32 2e 20 36 34 2c  8E2E8D6CB32. 64,
0340: 20 24 36 32 33 30 44 39 30 44 42 45 38 45 30 36   $6230D90DBE8E06
0350: 31 42 2e 20 36 34 2c 0a 0a 68 65 72 65 0a 24 32  1B. 64,..here.$2
0360: 30 37 39 39 46 45 43 34 42 32 45 38 36 43 37 2e  0799FEC4B2E86C7.
0370: 20 36 34 2c 20 24 39 46 35 34 35 34 43 44 42 44   64, $9F5454CDBD
0380: 46 35 31 46 37 36 2e 20 36 34 2c 20 24 45 45 31  F51F76. 64, $EE1
0390: 39 30 35 46 46 46 34 42 32 34 43 33 44 2e 20 36  905FFF4B24C3D. 6
03a0: 34 2c 20 24 39 38 34 31 46 37 38 42 41 31 45 30  4, $9841F78BA1E0
03b0: 41 33 42 37 2e 20 36 34 2c 0a 24 42 36 43 33 33  A3B7. 64,.$B6C33
03c0: 45 33 39 43 33 32 36 41 31 36 31 2e 20 36 34 2c  E39C326A161. 64,
03d0: 20 24 46 44 34 45 38 43 30 45 41 41 37 43 34 33   $FD4E8C0EAA7C43
03e0: 36 32 2e 20 36 34 2c 20 24 38 33 39 45 30 39 31  62. 64, $839E091
03f0: 30 46 46 44 39 34 30 31 41 2e 20 36 34 2c 20 24  0FFD9401A. 64, $
0400: 32 37 38 35 46 35 43 31 30 44 36 31 30 43 36 38  2785F5C10D610C68
0410: 2e 20 36 34 2c 0a 0a 68 65 72 65 0a 24 46 45 43  . 64,..here.$FEC
0420: 39 36 37 43 33 32 45 34 36 34 34 30 46 2e 20 36  967C32E46440F. 6
0430: 34 2c 20 24 33 46 36 33 31 35 37 45 31 34 46 38  4, $3F63157E14F8
0440: 39 39 38 32 2e 20 36 34 2c 20 24 46 37 33 36 34  9982. 64, $F7364
0450: 41 37 46 38 30 38 33 45 46 46 41 2e 20 36 34 2c  A7F8083EFFA. 64,
0460: 20 24 46 43 36 32 35 37 32 41 34 34 35 35 39 39   $FC62572A445599
0470: 35 31 2e 20 36 34 2c 0a 24 39 39 31 35 37 31 34  51. 64,.$9915714
0480: 44 42 37 33 39 37 39 34 39 2e 20 36 34 2c 20 24  DB7397949. 64, $
0490: 41 45 34 31 38 30 44 35 33 36 35 30 45 33 38 43  AE4180D53650E38C
04a0: 2e 20 36 34 2c 20 24 43 35 33 38 31 33 37 38 31  . 64, $C53813781
04b0: 44 46 46 30 43 32 45 2e 20 36 34 2c 20 24 41 35  DFF0C2E. 64, $A5
04c0: 37 39 34 33 35 35 30 32 46 32 32 37 34 31 2e 20  79435502F22741. 
04d0: 36 34 2c 0a 0a 68 65 72 65 0a 24 33 39 41 31 35  64,..here.$39A15
04e0: 37 41 33 31 46 37 44 36 32 42 43 2e 20 36 34 2c  7A31F7D62BC. 64,
04f0: 20 24 35 31 43 33 42 44 33 42 41 34 46 34 46 38   $51C3BD3BA4F4F8
0500: 30 33 2e 20 36 34 2c 20 24 32 31 44 37 44 30 45  03. 64, $21D7D0E
0510: 44 31 36 41 35 32 34 33 41 2e 20 36 34 2c 20 24  D16A5243A. 64, $
0520: 33 43 38 30 31 39 35 44 38 44 38 30 38 37 34 46  3C80195D8D80874F
0530: 2e 20 36 34 2c 0a 24 36 44 46 35 45 46 36 32 30  . 64,.$6DF5EF620
0540: 35 44 35 35 45 30 33 2e 20 36 34 2c 20 24 38 38  5D55E03. 64, $88
0550: 35 39 43 35 39 38 31 32 46 34 37 30 32 38 2e 20  59C59812F47028. 
0560: 36 34 2c 20 24 46 37 37 39 35 46 30 30 38 37 34  64, $F7795F00874
0570: 41 43 45 44 37 2e 20 36 34 2c 20 24 35 46 42 45  ACED7. 64, $5FBE
0580: 36 36 39 34 34 44 42 45 43 42 37 46 2e 20 36 34  66944DBECB7F. 64
0590: 2c 0a 0a 68 65 72 65 0a 24 46 45 43 39 36 37 43  ,..here.$FEC967C
05a0: 33 32 45 34 36 34 34 30 46 2e 20 36 34 2c 20 24  32E46440F. 64, $
05b0: 33 46 36 33 31 35 37 45 31 34 46 38 39 39 38 32  3F63157E14F89982
05c0: 2e 20 36 34 2c 20 24 46 37 33 36 34 41 37 46 38  . 64, $F7364A7F8
05d0: 30 38 33 45 46 46 41 2e 20 36 34 2c 20 24 46 43  083EFFA. 64, $FC
05e0: 36 32 35 37 32 41 34 34 35 35 39 39 35 31 2e 20  62572A44559951. 
05f0: 36 34 2c 0a 24 39 39 31 35 37 31 34 44 42 37 33  64,.$9915714DB73
0600: 39 37 39 34 39 2e 20 36 34 2c 20 24 41 45 34 31  97949. 64, $AE41
0610: 38 30 44 35 33 36 35 30 45 33 38 43 2e 20 36 34  80D53650E38C. 64
0620: 2c 20 24 43 35 33 38 31 33 37 38 31 44 46 46 30  , $C53813781DFF0
0630: 43 32 45 2e 20 36 34 2c 20 24 41 35 37 39 34 33  C2E. 64, $A57943
0640: 35 35 30 32 46 32 32 37 34 31 2e 20 36 34 2c 0a  5502F22741. 64,.
0650: 43 6f 6e 73 74 61 6e 74 20 73 74 61 74 65 2d 69  Constant state-i
0660: 6e 69 74 0a 43 6f 6e 73 74 61 6e 74 20 77 75 72  nit.Constant wur
0670: 73 74 2d 73 61 6c 74 20 5c 20 66 6f 72 20 74 65  st-salt \ for te
0680: 73 74 69 6e 67 20 6f 6e 6c 79 21 20 54 68 69 73  sting only! This
0690: 20 69 73 20 73 61 6c 74 2c 20 73 68 6f 75 6c 64   is salt, should
06a0: 20 6e 6f 74 20 62 65 20 67 75 65 73 73 61 62 6c   not be guessabl
06b0: 65 21 0a 43 6f 6e 73 74 61 6e 74 20 72 6e 64 2d  e!.Constant rnd-
06c0: 69 6e 69 74 20 5c 20 66 6f 72 20 74 65 73 74 69  init \ for testi
06d0: 6e 67 20 6f 6e 6c 79 21 20 54 68 69 73 20 69 73  ng only! This is
06e0: 20 73 61 6c 74 2c 20 73 68 6f 75 6c 64 20 6e 6f   salt, should no
06f0: 74 20 62 65 20 67 75 65 73 73 61 62 6c 65 21 0a  t be guessable!.
0700: 43 6f 6e 73 74 61 6e 74 20 77 75 72 73 74 2d 6b  Constant wurst-k
0710: 65 79 20 5c 20 64 65 66 61 75 6c 74 20 6b 65 79  ey \ default key
0720: 0a 43 6f 6e 73 74 61 6e 74 20 73 6f 75 72 63 65  .Constant source
0730: 2d 69 6e 69 74 0a 0a 43 72 65 61 74 65 20 27 72  -init..Create 'r
0740: 6e 67 73 20 5c 20 74 68 69 73 20 69 73 20 65 73  ngs \ this is es
0750: 73 65 6e 74 69 61 6c 6c 79 20 57 75 72 73 74 6b  sentially Wurstk
0760: 65 73 73 65 6c 27 73 20 53 2d 62 6f 78 0a 24 45  essel's S-box.$E
0770: 41 35 37 36 42 31 35 41 37 41 46 42 41 30 38 2e  A576B15A7AFBA08.
0780: 20 36 34 2c 20 24 42 46 34 38 38 38 44 43 30 32   64, $BF4888DC02
0790: 31 33 31 45 46 37 2e 20 36 34 2c 20 24 35 46 34  131EF7. 64, $5F4
07a0: 39 41 34 30 42 31 44 41 41 46 35 46 44 2e 20 36  9A40B1DAAF5FD. 6
07b0: 34 2c 20 24 37 37 39 38 39 37 35 45 35 32 33 33  4, $7798975E5233
07c0: 43 38 39 44 2e 20 36 34 2c 20 0a 24 41 37 30 41  C89D. 64, .$A70A
07d0: 31 42 44 35 31 38 42 33 46 42 43 36 2e 20 36 34  1BD518B3FBC6. 64
07e0: 2c 20 24 38 45 33 31 44 35 34 45 43 42 37 42 43  , $8E31D54ECB7BC
07f0: 44 46 39 2e 20 36 34 2c 20 24 39 34 39 44 31 30  DF9. 64, $949D10
0800: 37 30 32 39 46 39 34 45 41 41 2e 20 36 34 2c 20  7029F94EAA. 64, 
0810: 24 37 42 34 30 32 36 31 46 36 42 33 45 30 37 36  $7B40261F6B3E076
0820: 33 2e 20 36 34 2c 20 0a 24 45 38 34 35 46 39 30  3. 64, .$E845F90
0830: 34 37 37 41 33 30 41 43 35 2e 20 36 34 2c 20 24  477A30AC5. 64, $
0840: 36 42 46 35 43 44 43 30 39 34 42 37 41 36 35 37  6BF5CDC094B7A657
0850: 2e 20 36 34 2c 20 24 42 30 37 39 36 43 39 46 36  . 64, $B0796C9F6
0860: 31 46 39 39 30 46 39 2e 20 36 34 2c 20 24 43 31  1F990F9. 64, $C1
0870: 34 39 46 41 42 41 35 30 30 31 34 42 46 43 2e 20  49FABA50014BFC. 
0880: 36 34 2c 20 0a 24 36 32 36 33 37 37 32 32 38 42  64, .$626377228B
0890: 43 37 36 32 45 46 2e 20 36 34 2c 20 24 36 33 39  C762EF. 64, $639
08a0: 42 46 45 39 33 30 39 34 45 37 42 38 34 2e 20 36  BFE93094E7B84. 6
08b0: 34 2c 20 24 30 42 36 31 31 34 30 43 31 33 35 31  4, $0B61140C1351
08c0: 33 45 31 35 2e 20 36 34 2c 20 24 41 44 42 38 30  3E15. 64, $ADB80
08d0: 30 34 36 30 44 38 42 37 41 33 46 2e 20 36 34 2c  0460D8B7A3F. 64,
08e0: 20 0a 24 32 30 44 33 38 37 33 31 31 30 38 38 30   .$20D3873110880
08f0: 44 34 33 2e 20 36 34 2c 20 24 31 34 34 42 38 36  D43. 64, $144B86
0900: 32 46 34 37 35 35 44 38 45 46 2e 20 36 34 2c 20  2F4755D8EF. 64, 
0910: 24 36 39 43 31 32 37 46 33 35 30 45 43 44 37 30  $69C127F350ECD70
0920: 39 2e 20 36 34 2c 20 24 34 41 39 32 35 31 31 46  9. 64, $4A92511F
0930: 41 44 33 31 44 34 36 35 2e 20 36 34 2c 20 0a 24  AD31D465. 64, .$
0940: 33 34 45 42 30 45 46 38 45 44 38 32 33 30 42 32  34EB0EF8ED8230B2
0950: 2e 20 36 34 2c 20 24 34 37 37 42 46 34 36 36 45  . 64, $477BF466E
0960: 33 33 32 44 44 42 38 2e 20 36 34 2c 20 24 30 38  332DDB8. 64, $08
0970: 36 42 36 46 32 30 44 43 32 46 31 42 33 33 2e 20  6B6F20DC2F1B33. 
0980: 36 34 2c 20 24 45 30 32 30 43 38 30 31 32 45 31  64, $E020C8012E1
0990: 45 42 43 34 41 2e 20 36 34 2c 20 0a 24 43 34 41  EBC4A. 64, .$C4A
09a0: 35 42 45 46 39 33 39 30 34 34 41 46 43 2e 20 36  5BEF939044AFC. 6
09b0: 34 2c 20 24 43 35 43 35 42 30 33 46 38 30 46 41  4, $C5C5B03F80FA
09c0: 46 37 33 39 2e 20 36 34 2c 20 24 41 44 34 36 45  F739. 64, $AD46E
09d0: 46 42 41 36 45 34 45 45 46 42 32 2e 20 36 34 2c  FBA6E4EEFB2. 64,
09e0: 20 24 45 41 44 30 34 45 45 46 32 31 41 44 35 43   $EAD04EEF21AD5C
09f0: 43 41 2e 20 36 34 2c 20 0a 24 36 38 35 31 36 33  CA. 64, .$685163
0a00: 34 35 46 33 32 45 35 38 32 45 2e 20 36 34 2c 20  45F32E582E. 64, 
0a10: 24 46 45 44 45 32 30 36 37 41 33 33 35 42 31 46  $FEDE2067A335B1F
0a20: 36 2e 20 36 34 2c 20 24 39 36 36 31 31 44 31 33  6. 64, $96611D13
0a30: 31 37 32 42 41 30 34 34 2e 20 36 34 2c 20 24 31  172BA044. 64, $1
0a40: 44 44 42 43 33 46 33 36 32 35 37 44 46 39 36 2e  DDBC3F36257DF96.
0a50: 20 36 34 2c 20 0a 24 34 42 46 45 37 35 41 39 31   64, .$4BFE75A91
0a60: 42 35 38 32 44 30 37 2e 20 36 34 2c 20 24 38 32  B582D07. 64, $82
0a70: 44 46 33 41 37 44 34 32 30 35 44 39 42 34 2e 20  DF3A7D4205D9B4. 
0a80: 36 34 2c 20 24 43 44 43 37 43 32 43 37 36 39 42  64, $CDC7C2C769B
0a90: 31 30 31 36 33 2e 20 36 34 2c 20 24 32 42 39 45  10163. 64, $2B9E
0aa0: 46 42 33 41 34 30 36 43 31 43 32 32 2e 20 36 34  FB3A406C1C22. 64
0ab0: 2c 20 0a 24 44 41 37 33 32 46 31 37 42 42 35 46  , .$DA732F17BB5F
0ac0: 41 38 31 39 2e 20 36 34 2c 20 24 31 34 44 41 32  A819. 64, $14DA2
0ad0: 44 39 39 34 42 38 38 45 42 46 42 2e 20 36 34 2c  D994B88EBFB. 64,
0ae0: 20 24 45 39 45 38 44 41 33 37 31 38 36 36 38 31   $E9E8DA37186681
0af0: 38 45 2e 20 36 34 2c 20 24 36 41 41 46 45 41 41  8E. 64, $6AAFEAA
0b00: 42 38 30 44 37 32 37 35 38 2e 20 36 34 2c 20 0a  B80D72758. 64, .
0b10: 24 45 32 34 35 33 41 43 45 41 37 34 37 31 39 44  $E2453ACEA74719D
0b20: 42 2e 20 36 34 2c 20 24 36 32 43 41 42 37 38 45  B. 64, $62CAB78E
0b30: 38 32 31 33 37 45 37 38 2e 20 36 34 2c 20 24 34  82137E78. 64, $4
0b40: 42 36 30 45 36 37 37 38 41 38 34 43 38 32 42 2e  B60E6778A84C82B.
0b50: 20 36 34 2c 20 24 34 31 42 46 32 34 31 37 42 30   64, $41BF2417B0
0b60: 30 37 30 37 36 34 2e 20 36 34 2c 20 0a 24 46 33  070764. 64, .$F3
0b70: 38 36 35 41 44 45 42 46 33 33 37 41 39 39 2e 20  865ADEBF337A99. 
0b80: 36 34 2c 20 24 41 31 45 43 33 36 43 36 39 36 34  64, $A1EC36C6964
0b90: 39 32 42 45 30 2e 20 36 34 2c 20 24 37 43 38 38  92BE0. 64, $7C88
0ba0: 34 42 33 32 30 38 30 43 36 34 39 46 2e 20 36 34  4B32080C649F. 64
0bb0: 2c 20 24 41 41 45 39 39 42 44 41 44 43 33 37 36  , $AAE99BDADC376
0bc0: 38 35 41 2e 20 36 34 2c 20 0a 24 44 43 41 34 43  85A. 64, .$DCA4C
0bd0: 35 39 44 39 38 42 45 45 43 36 43 2e 20 36 34 2c  59D98BEEC6C. 64,
0be0: 20 24 44 44 38 38 38 36 46 45 44 38 42 38 32 30   $DD8886FED8B820
0bf0: 39 30 2e 20 36 34 2c 20 24 46 38 39 34 41 41 36  90. 64, $F894AA6
0c00: 39 39 34 45 46 44 42 38 41 2e 20 36 34 2c 20 24  994EFDB8A. 64, $
0c10: 46 42 39 35 34 45 41 37 31 30 37 42 31 42 46 33  FB954EA7107B1BF3
0c20: 2e 20 36 34 2c 20 0a 24 38 30 45 35 36 39 35 38  . 64, .$80E56958
0c30: 31 37 37 33 43 46 35 46 2e 20 36 34 2c 20 24 46  1773CF5F. 64, $F
0c40: 34 31 38 45 31 46 39 37 45 36 30 31 44 39 34 2e  418E1F97E601D94.
0c50: 20 36 34 2c 20 24 37 41 39 42 39 46 39 30 33 33   64, $7A9B9F9033
0c60: 41 34 30 38 32 30 2e 20 36 34 2c 20 24 30 30 45  A40820. 64, $00E
0c70: 30 36 44 37 43 34 46 35 30 37 32 36 42 2e 20 36  06D7C4F50726B. 6
0c80: 34 2c 20 0a 24 31 39 43 32 30 35 43 37 46 34 36  4, .$19C205C7F46
0c90: 31 45 42 36 35 2e 20 36 34 2c 20 24 44 42 36 31  1EB65. 64, $DB61
0ca0: 30 41 33 36 44 45 34 30 41 45 37 43 2e 20 36 34  0A36DE40AE7C. 64
0cb0: 2c 20 24 30 46 43 44 32 30 31 41 46 33 45 36 35  , $0FCD201AF3E65
0cc0: 46 35 46 2e 20 36 34 2c 20 24 35 38 34 30 39 31  F5F. 64, $584091
0cd0: 30 46 43 31 39 30 32 32 32 34 2e 20 36 34 2c 20  0FC1902224. 64, 
0ce0: 0a 24 31 32 31 30 39 37 35 32 34 30 42 45 31 38  .$1210975240BE18
0cf0: 32 39 2e 20 36 34 2c 20 24 37 31 42 39 37 33 30  29. 64, $71B9730
0d00: 37 45 38 45 39 30 33 46 39 2e 20 36 34 2c 20 24  7E8E903F9. 64, $
0d10: 44 46 38 35 43 36 43 33 34 36 44 46 34 46 46 32  DF85C6C346DF4FF2
0d20: 2e 20 36 34 2c 20 24 42 42 32 36 46 38 33 35 46  . 64, $BB26F835F
0d30: 44 33 37 31 31 46 31 2e 20 36 34 2c 20 0a 24 34  D3711F1. 64, .$4
0d40: 44 45 38 45 36 44 43 30 30 38 42 44 32 34 39 2e  DE8E6DC008BD249.
0d50: 20 36 34 2c 20 24 38 43 31 31 44 35 41 36 34 37   64, $8C11D5A647
0d60: 43 41 36 32 33 31 2e 20 36 34 2c 20 24 42 31 30  CA6231. 64, $B10
0d70: 44 30 46 36 36 45 43 30 37 41 32 35 31 2e 20 36  D0F66EC07A251. 6
0d80: 34 2c 20 24 44 32 44 34 43 37 42 44 36 30 38 41  4, $D2D4C7BD608A
0d90: 41 43 44 45 2e 20 36 34 2c 20 0a 24 31 37 43 37  ACDE. 64, .$17C7
0da0: 35 36 30 44 36 32 31 45 36 44 36 32 2e 20 36 34  560D621E6D62. 64
0db0: 2c 20 24 41 31 38 32 35 39 31 42 43 35 33 44 37  , $A182591BC53D7
0dc0: 43 38 41 2e 20 36 34 2c 20 24 38 46 42 46 37 32  C8A. 64, $8FBF72
0dd0: 36 30 43 31 36 30 35 38 44 37 2e 20 36 34 2c 20  60C16058D7. 64, 
0de0: 24 44 32 30 43 31 41 41 34 37 41 44 32 38 30 46  $D20C1AA47AD280F
0df0: 44 2e 20 36 34 2c 20 0a 24 34 43 33 34 41 42 43  D. 64, .$4C34ABC
0e00: 36 34 36 32 37 36 44 33 45 2e 20 36 34 2c 20 24  646276D3E. 64, $
0e10: 44 46 39 33 32 38 32 32 32 42 35 35 35 38 38 35  DF9328222B555885
0e20: 2e 20 36 34 2c 20 24 35 46 43 45 41 43 36 38 42  . 64, $5FCEAC68B
0e30: 39 31 41 41 37 35 46 2e 20 36 34 2c 20 24 42 36  91AA75F. 64, $B6
0e40: 36 32 43 34 44 38 34 46 37 31 33 35 43 36 2e 20  62C4D84F7135C6. 
0e50: 36 34 2c 20 0a 24 34 31 38 44 42 44 33 43 34 35  64, .$418DBD3C45
0e60: 44 37 45 36 37 43 2e 20 36 34 2c 20 24 35 45 30  D7E67C. 64, $5E0
0e70: 37 44 42 39 37 41 32 38 44 32 41 33 41 2e 20 36  7DB97A28D2A3A. 6
0e80: 34 2c 20 24 44 35 44 37 42 30 32 34 43 37 45 31  4, $D5D7B024C7E1
0e90: 34 38 41 33 2e 20 36 34 2c 20 24 33 46 33 30 32  48A3. 64, $3F302
0ea0: 33 36 33 39 45 34 45 44 39 31 44 2e 20 36 34 2c  3639E4ED91D. 64,
0eb0: 20 0a 24 37 35 35 39 30 35 38 30 44 31 38 42 44   .$75590580D18BD
0ec0: 43 46 37 2e 20 36 34 2c 20 24 32 39 33 36 43 34  CF7. 64, $2936C4
0ed0: 34 35 41 38 43 43 45 35 44 33 2e 20 36 34 2c 20  45A8CCE5D3. 64, 
0ee0: 24 31 43 39 42 35 31 33 35 32 41 39 42 33 38 41  $1C9B51352A9B38A
0ef0: 41 2e 20 36 34 2c 20 24 31 45 43 36 37 42 30 45  A. 64, $1EC67B0E
0f00: 36 33 45 41 36 42 39 43 2e 20 36 34 2c 20 0a 24  63EA6B9C. 64, .$
0f10: 33 30 41 41 34 32 46 34 34 34 44 44 38 44 37 37  30AA42F444DD8D77
0f20: 2e 20 36 34 2c 20 24 35 34 39 30 43 37 35 46 31  . 64, $5490C75F1
0f30: 41 35 30 42 33 44 34 2e 20 36 34 2c 20 24 38 41  A50B3D4. 64, $8A
0f40: 36 32 44 43 36 38 36 36 31 34 39 44 43 36 2e 20  62DC6866149DC6. 
0f50: 36 34 2c 20 24 34 35 45 37 31 43 41 35 38 41 33  64, $45E71CA58A3
0f60: 41 31 41 30 33 2e 20 36 34 2c 20 0a 24 34 34 43  A1A03. 64, .$44C
0f70: 33 35 41 36 30 43 41 36 32 45 46 34 43 2e 20 36  35A60CA62EF4C. 6
0f80: 34 2c 20 24 38 41 38 44 31 30 46 36 37 39 30 34  4, $8A8D10F67904
0f90: 46 32 30 33 2e 20 36 34 2c 20 24 37 33 46 42 34  F203. 64, $73FB4
0fa0: 37 43 39 39 41 37 38 39 45 32 37 2e 20 36 34 2c  7C99A789E27. 64,
0fb0: 20 24 46 36 44 41 32 36 34 43 35 45 43 35 38 38   $F6DA264C5EC588
0fc0: 33 34 2e 20 36 34 2c 20 0a 24 37 44 45 37 30 37  34. 64, .$7DE707
0fd0: 41 42 39 34 31 41 36 38 42 31 2e 20 36 34 2c 20  AB941A68B1. 64, 
0fe0: 24 38 45 35 46 43 31 35 41 42 31 42 38 32 44 34  $8E5FC15AB1B82D4
0ff0: 32 2e 20 36 34 2c 20 24 31 36 39 46 32 37 30 45  2. 64, $169F270E
1000: 33 31 45 31 31 38 42 39 2e 20 36 34 2c 20 24 38  31E118B9. 64, $8
1010: 39 44 37 37 44 32 43 41 32 32 38 46 31 41 31 2e  9D77D2CA228F1A1.
1020: 20 36 34 2c 20 0a 24 46 37 33 42 46 43 44 30 37   64, .$F73BFCD07
1030: 36 45 41 34 35 39 33 2e 20 36 34 2c 20 24 33 46  6EA4593. 64, $3F
1040: 43 32 35 39 34 45 41 38 36 38 41 41 36 42 2e 20  C2594EA868AA6B. 
1050: 36 34 2c 20 24 37 45 37 31 32 42 33 38 32 36 42  64, $7E712B3826B
1060: 46 39 34 30 42 2e 20 36 34 2c 20 24 43 35 45 34  F940B. 64, $C5E4
1070: 37 35 32 33 46 32 45 44 37 32 44 33 2e 20 36 34  7523F2ED72D3. 64
1080: 2c 20 0a 24 42 31 37 44 35 45 32 42 34 30 44 39  , .$B17D5E2B40D9
1090: 31 43 42 37 2e 20 36 34 2c 20 24 37 41 34 36 43  1CB7. 64, $7A46C
10a0: 41 39 38 39 42 36 42 35 34 35 43 2e 20 36 34 2c  A989B6B545C. 64,
10b0: 20 24 44 46 35 33 39 36 33 34 37 33 44 38 41 30   $DF53963473D8A0
10c0: 32 38 2e 20 36 34 2c 20 24 31 43 32 42 30 35 45  28. 64, $1C2B05E
10d0: 39 35 42 36 41 32 33 36 31 2e 20 36 34 2c 20 0a  95B6A2361. 64, .
10e0: 24 32 41 38 43 45 36 43 43 38 41 41 34 36 32 34  $2A8CE6CC8AA4624
10f0: 30 2e 20 36 34 2c 20 24 37 45 35 36 36 37 33 42  0. 64, $7E56673B
1100: 38 34 36 37 42 32 44 34 2e 20 36 34 2c 20 24 35  8467B2D4. 64, $5
1110: 43 43 30 38 39 38 36 44 44 31 36 34 33 44 32 2e  CC08986DD1643D2.
1120: 20 36 34 2c 20 24 33 34 42 45 43 32 36 43 31 30   64, $34BEC26C10
1130: 41 38 41 30 46 37 2e 20 36 34 2c 20 0a 24 35 41  A8A0F7. 64, .$5A
1140: 31 30 36 35 35 30 38 33 34 34 44 39 42 46 2e 20  1065508344D9BF. 
1150: 36 34 2c 20 24 39 36 34 43 44 36 39 31 43 37 35  64, $964CD691C75
1160: 31 34 41 35 34 2e 20 36 34 2c 20 24 44 41 36 36  14A54. 64, $DA66
1170: 34 32 45 32 30 36 44 38 45 45 43 30 2e 20 36 34  42E206D8EEC0. 64
1180: 2c 20 24 46 45 35 30 36 34 30 45 41 43 43 35 37  , $FE50640EACC57
1190: 37 33 36 2e 20 36 34 2c 20 0a 24 34 46 44 37 37  736. 64, .$4FD77
11a0: 35 42 45 45 43 30 33 45 30 30 43 2e 20 36 34 2c  5BEEC03E00C. 64,
11b0: 20 24 32 45 44 35 31 33 32 32 46 41 36 34 38 34   $2ED51322FA6484
11c0: 37 30 2e 20 36 34 2c 20 24 44 31 32 36 33 39 36  70. 64, $D126396
11d0: 46 45 33 34 36 46 44 38 32 2e 20 36 34 2c 20 24  FE346FD82. 64, $
11e0: 33 32 31 46 38 45 36 32 36 36 30 41 35 33 35 38  321F8E62660A5358
11f0: 2e 20 36 34 2c 20 0a 24 42 31 38 41 43 30 34 31  . 64, .$B18AC041
1200: 35 31 32 30 41 39 37 30 2e 20 36 34 2c 20 24 41  5120A970. 64, $A
1210: 45 36 36 45 38 44 30 44 38 39 42 44 45 41 32 2e  E66E8D0D89BDEA2.
1220: 20 36 34 2c 20 24 38 46 46 33 39 30 37 30 34 32   64, $8FF3907042
1230: 31 31 33 37 31 33 2e 20 36 34 2c 20 24 33 45 44  113713. 64, $3ED
1240: 31 41 35 41 46 34 35 42 39 42 44 32 31 2e 20 36  1A5AF45B9BD21. 6
1250: 34 2c 20 0a 24 43 44 39 33 43 35 41 37 36 37 36  4, .$CD93C5A7676
1260: 46 39 42 38 30 2e 20 36 34 2c 20 24 42 36 33 39  F9B80. 64, $B639
1270: 30 41 33 44 39 34 44 41 45 46 31 31 2e 20 36 34  0A3D94DAEF11. 64
1280: 2c 20 24 38 36 38 39 37 36 37 31 35 43 35 43 43  , $868976715C5CC
1290: 41 36 38 2e 20 36 34 2c 20 24 41 44 38 38 36 41  A68. 64, $AD886A
12a0: 41 30 36 34 42 35 44 44 43 35 2e 20 36 34 2c 20  A064B5DDC5. 64, 
12b0: 0a 24 44 43 44 38 41 30 43 43 42 30 45 45 34 46  .$DCD8A0CCB0EE4F
12c0: 34 32 2e 20 36 34 2c 20 24 35 45 38 32 35 42 35  42. 64, $5E825B5
12d0: 41 46 32 36 39 36 42 34 38 2e 20 36 34 2c 20 24  AF2696B48. 64, $
12e0: 43 36 41 44 32 38 34 38 42 31 42 44 32 41 46 45  C6AD2848B1BD2AFE
12f0: 2e 20 36 34 2c 20 24 34 44 45 35 41 32 30 41 44  . 64, $4DE5A20AD
1300: 33 33 30 42 36 45 34 2e 20 36 34 2c 20 0a 24 31  330B6E4. 64, .$1
1310: 32 31 44 41 33 45 34 34 32 38 41 41 32 37 44 2e  21DA3E4428AA27D.
1320: 20 36 34 2c 20 24 41 44 37 33 34 41 46 36 39 42   64, $AD734AF69B
1330: 42 36 35 38 45 38 2e 20 36 34 2c 20 24 41 32 33  B658E8. 64, $A23
1340: 39 38 30 39 38 33 34 42 36 36 46 45 43 2e 20 36  9809834B66FEC. 6
1350: 34 2c 20 24 34 45 30 41 46 46 32 35 43 31 36 32  4, $4E0AFF25C162
1360: 30 32 34 43 2e 20 36 34 2c 20 0a 24 31 32 41 44  024C. 64, .$12AD
1370: 41 42 31 42 38 43 44 42 41 41 34 39 2e 20 36 34  AB1B8CDBAA49. 64
1380: 2c 20 24 37 45 46 44 32 30 35 42 38 41 32 44 37  , $7EFD205B8A2D7
1390: 31 34 32 2e 20 36 34 2c 20 24 31 31 30 30 44 33  142. 64, $1100D3
13a0: 36 39 35 31 43 43 36 41 43 44 2e 20 36 34 2c 20  6951CC6ACD. 64, 
13b0: 24 35 36 44 37 44 35 44 39 30 38 37 44 34 32 44  $56D7D5D9087D42D
13c0: 43 2e 20 36 34 2c 20 0a 24 31 39 42 45 38 46 33  C. 64, .$19BE8F3
13d0: 44 31 44 37 41 31 30 33 46 2e 20 36 34 2c 20 24  D1D7A103F. 64, $
13e0: 35 38 37 36 39 37 41 30 37 33 33 37 45 30 37 36  587697A07337E076
13f0: 2e 20 36 34 2c 20 24 46 31 33 34 39 38 33 44 37  . 64, $F134983D7
1400: 39 36 33 33 33 42 46 2e 20 36 34 2c 20 24 38 41  96333BF. 64, $8A
1410: 36 37 42 34 46 33 38 43 35 36 32 34 43 35 2e 20  67B4F38C5624C5. 
1420: 36 34 2c 20 0a 24 35 44 38 41 39 37 33 36 41 44  64, .$5D8A9736AD
1430: 32 45 45 44 45 33 2e 20 36 34 2c 20 24 35 43 33  2EEDE3. 64, $5C3
1440: 32 46 30 43 31 44 32 45 32 36 42 45 44 2e 20 36  2F0C1D2E26BED. 6
1450: 34 2c 20 24 30 32 39 41 44 38 36 30 38 30 41 31  4, $029AD86080A1
1460: 39 36 30 41 2e 20 36 34 2c 20 24 45 44 35 46 37  960A. 64, $ED5F7
1470: 36 44 31 44 42 32 37 36 45 44 39 2e 20 36 34 2c  6D1DB276ED9. 64,
1480: 20 0a 24 33 33 43 42 35 38 31 30 36 31 38 30 35   .$33CB581061805
1490: 44 46 44 2e 20 36 34 2c 20 24 41 35 44 46 32 35  DFD. 64, $A5DF25
14a0: 32 32 41 30 46 36 39 31 43 37 2e 20 36 34 2c 20  22A0F691C7. 64, 
14b0: 24 41 34 41 44 45 44 46 37 38 32 46 44 36 42 44  $A4ADEDF782FD6BD
14c0: 32 2e 20 36 34 2c 20 24 46 45 33 38 34 46 46 30  2. 64, $FE384FF0
14d0: 44 33 37 31 43 39 36 34 2e 20 36 34 2c 20 0a 24  D371C964. 64, .$
14e0: 46 35 43 46 45 46 39 45 34 41 34 43 44 32 37 33  F5CFEF9E4A4CD273
14f0: 2e 20 36 34 2c 20 24 38 35 43 42 42 41 43 38 36  . 64, $85CBBAC86
1500: 39 34 30 31 43 38 31 2e 20 36 34 2c 20 24 44 35  9401C81. 64, $D5
1510: 31 31 42 37 31 33 46 45 44 37 30 30 35 42 2e 20  11B713FED7005B. 
1520: 36 34 2c 20 24 41 37 36 31 31 31 37 37 44 36 39  64, $A7611177D69
1530: 36 46 31 38 36 2e 20 36 34 2c 20 0a 24 43 42 32  6F186. 64, .$CB2
1540: 42 45 31 46 46 41 36 30 38 46 36 37 35 2e 20 36  BE1FFA608F675. 6
1550: 34 2c 20 24 32 35 30 33 31 30 34 36 43 38 35 43  4, $25031046C85C
1560: 34 36 35 31 2e 20 36 34 2c 20 24 36 30 37 31 37  4651. 64, $60717
1570: 31 42 43 34 35 37 37 44 32 37 30 2e 20 36 34 2c  1BC4577D270. 64,
1580: 20 24 41 37 42 44 38 38 38 34 32 39 39 38 36 33   $A7BD8884299863
1590: 41 36 2e 20 36 34 2c 20 0a 24 42 42 30 39 46 42  A6. 64, .$BB09FB
15a0: 37 32 38 30 39 39 41 31 45 30 2e 20 36 34 2c 20  728099A1E0. 64, 
15b0: 24 32 35 37 31 34 35 45 35 36 36 43 38 36 39 38  $257145E566C8698
15c0: 46 2e 20 36 34 2c 20 24 36 35 36 42 44 42 36 42  F. 64, $656BDB6B
15d0: 39 31 38 34 35 33 35 46 2e 20 36 34 2c 20 24 32  9184535F. 64, $2
15e0: 36 38 32 41 41 45 32 43 41 38 33 41 45 39 31 2e  682AAE2CA83AE91.
15f0: 20 36 34 2c 20 0a 24 46 37 41 34 34 43 43 34 30   64, .$F7A44CC40
1600: 30 33 41 41 45 45 30 2e 20 36 34 2c 20 24 38 38  03AAEE0. 64, $88
1610: 38 41 39 41 39 33 37 30 44 41 34 36 30 41 2e 20  8A9A9370DA460A. 
1620: 36 34 2c 20 24 36 44 45 31 46 37 46 43 46 46 36  64, $6DE1F7FCFF6
1630: 34 41 38 39 35 2e 20 36 34 2c 20 24 42 39 39 38  4A895. 64, $B998
1640: 32 39 34 42 36 45 36 33 31 37 32 36 2e 20 36 34  294B6E631726. 64
1650: 2c 20 0a 24 44 44 31 30 46 44 30 45 33 37 33 44  , .$DD10FD0E373D
1660: 45 31 37 34 2e 20 36 34 2c 20 24 41 34 41 31 43  E174. 64, $A4A1C
1670: 39 39 45 31 45 44 46 46 37 38 38 2e 20 36 34 2c  99E1EDFF788. 64,
1680: 20 24 41 42 46 38 39 43 35 43 32 33 39 36 35 43   $ABF89C5C23965C
1690: 38 43 2e 20 36 34 2c 20 24 35 31 39 46 43 45 41  8C. 64, $519FCEA
16a0: 43 44 42 35 30 41 34 32 45 2e 20 36 34 2c 20 0a  CDB50A42E. 64, .
16b0: 24 43 38 37 45 45 30 36 42 30 34 41 33 45 45 32  $C87EE06B04A3EE2
16c0: 37 2e 20 36 34 2c 20 24 42 33 42 38 34 38 33 36  7. 64, $B3B84836
16d0: 46 35 32 45 46 45 34 41 2e 20 36 34 2c 20 24 36  F52EFE4A. 64, $6
16e0: 37 37 31 38 35 35 46 43 35 34 38 38 46 46 32 2e  771855FC5488FF2.
16f0: 20 36 34 2c 20 24 30 32 39 46 32 37 33 35 37 42   64, $029F27357B
1700: 46 37 39 41 37 42 2e 20 36 34 2c 20 0a 24 38 36  F79A7B. 64, .$86
1710: 34 45 39 33 31 45 43 30 32 44 32 32 30 31 2e 20  4E931EC02D2201. 
1720: 36 34 2c 20 24 39 44 46 41 34 31 43 30 36 39 41  64, $9DFA41C069A
1730: 32 42 45 45 45 2e 20 36 34 2c 20 24 32 32 41 35  2BEEE. 64, $22A5
1740: 44 42 34 42 35 30 34 36 34 30 39 31 2e 20 36 34  DB4B50464091. 64
1750: 2c 20 24 42 30 44 32 45 32 39 39 41 37 38 30 38  , $B0D2E299A7808
1760: 37 32 34 2e 20 36 34 2c 20 0a 24 46 46 43 33 35  724. 64, .$FFC35
1770: 32 41 43 43 34 45 30 36 43 44 36 2e 20 36 34 2c  2ACC4E06CD6. 64,
1780: 20 24 39 35 37 38 42 45 42 42 34 44 42 38 46 43   $9578BEBB4DB8FC
1790: 32 46 2e 20 36 34 2c 20 24 44 43 36 45 33 34 39  2F. 64, $DC6E349
17a0: 42 32 44 36 44 41 35 34 38 2e 20 36 34 2c 20 24  B2D6DA548. 64, $
17b0: 32 30 39 34 44 41 42 36 43 36 34 36 43 32 44 37  2094DAB6C646C2D7
17c0: 2e 20 36 34 2c 20 0a 24 33 42 30 41 46 33 44 32  . 64, .$3B0AF3D2
17d0: 46 44 38 45 46 31 44 30 2e 20 36 34 2c 20 24 36  FD8EF1D0. 64, $6
17e0: 33 46 44 45 37 38 46 32 45 30 46 42 36 33 34 2e  3FDE78F2E0FB634.
17f0: 20 36 34 2c 20 24 31 43 39 39 35 30 33 42 43 36   64, $1C99503BC6
1800: 30 34 46 30 39 37 2e 20 36 34 2c 20 24 31 43 31  04F097. 64, $1C1
1810: 45 46 33 45 38 32 43 39 46 43 30 35 33 2e 20 36  EF3E82C9FC053. 6
1820: 34 2c 20 0a 24 36 42 44 42 38 45 37 36 30 31 37  4, .$6BDB8E76017
1830: 43 31 38 31 41 2e 20 36 34 2c 20 24 32 36 44 38  C181A. 64, $26D8
1840: 38 34 30 34 42 38 43 42 41 46 41 45 2e 20 36 34  8404B8CBAFAE. 64
1850: 2c 20 24 31 38 37 33 36 36 41 46 30 34 34 37 31  , $187366AF04471
1860: 46 38 44 2e 20 36 34 2c 20 24 37 36 41 32 37 37  F8D. 64, $76A277
1870: 38 46 36 36 45 35 31 32 42 38 2e 20 36 34 2c 20  8F66E512B8. 64, 
1880: 0a 24 45 35 42 41 32 39 35 31 41 46 32 31 31 46  .$E5BA2951AF211F
1890: 38 30 2e 20 36 34 2c 20 24 38 36 42 30 36 35 35  80. 64, $86B0655
18a0: 30 37 42 33 33 46 32 30 35 2e 20 36 34 2c 20 24  07B33F205. 64, $
18b0: 37 35 45 33 42 30 44 46 44 44 31 37 42 45 39 38  75E3B0DFDD17BE98
18c0: 2e 20 36 34 2c 20 24 30 39 45 44 41 37 37 42 36  . 64, $09EDA77B6
18d0: 30 41 42 46 45 30 41 2e 20 36 34 2c 20 0a 24 39  0ABFE0A. 64, .$9
18e0: 37 42 45 41 30 34 45 38 46 41 33 35 30 46 43 2e  7BEA04E8FA350FC.
18f0: 20 36 34 2c 20 24 42 43 36 45 36 34 31 44 38 41   64, $BC6E641D8A
1900: 35 44 31 41 32 38 2e 20 36 34 2c 20 24 34 36 44  5D1A28. 64, $46D
1910: 36 33 37 37 44 35 46 42 37 37 43 38 44 2e 20 36  6377D5FB77C8D. 6
1920: 34 2c 20 24 33 46 39 37 41 37 43 32 33 32 38 35  4, $3F97A7C23285
1930: 44 39 45 34 2e 20 36 34 2c 20 0a 24 42 41 35 30  D9E4. 64, .$BA50
1940: 31 36 34 43 41 39 32 36 43 32 35 44 2e 20 36 34  164CA926C25D. 64
1950: 2c 20 24 43 43 44 42 35 37 38 31 33 45 32 32 30  , $CCDB57813E220
1960: 34 35 31 2e 20 36 34 2c 20 24 31 43 39 36 37 46  451. 64, $1C967F
1970: 31 32 31 42 36 33 44 44 44 46 2e 20 36 34 2c 20  121B63DDDF. 64, 
1980: 24 41 32 41 38 34 30 42 32 45 35 36 43 41 33 42  $A2A840B2E56CA3B
1990: 44 2e 20 36 34 2c 20 0a 24 30 30 37 38 37 41 38  D. 64, .$00787A8
19a0: 31 44 42 36 39 41 38 35 31 2e 20 36 34 2c 20 24  1DB69A851. 64, $
19b0: 41 42 37 42 45 38 33 35 42 46 43 31 39 46 45 38  AB7BE835BFC19FE8
19c0: 2e 20 36 34 2c 20 24 43 33 35 41 31 38 42 36 45  . 64, $C35A18B6E
19d0: 31 31 41 39 46 30 35 2e 20 36 34 2c 20 24 46 34  11A9F05. 64, $F4
19e0: 46 41 44 33 43 32 36 39 43 45 41 39 39 35 2e 20  FAD3C269CEA995. 
19f0: 36 34 2c 20 0a 24 43 35 32 42 34 46 39 46 42 35  64, .$C52B4F9FB5
1a00: 46 37 45 42 38 37 2e 20 36 34 2c 20 24 42 46 30  F7EB87. 64, $BF0
1a10: 36 36 38 39 30 42 34 39 34 44 46 30 45 2e 20 36  66890B494DF0E. 6
1a20: 34 2c 20 24 45 36 36 35 45 35 34 42 44 35 37 42  4, $E665E54BD57B
1a30: 46 30 37 44 2e 20 36 34 2c 20 24 39 46 36 36 32  F07D. 64, $9F662
1a40: 36 35 30 45 31 43 41 41 38 42 33 2e 20 36 34 2c  650E1CAA8B3. 64,
1a50: 20 0a 24 42 36 30 46 43 42 42 32 30 35 45 31 42   .$B60FCBB205E1B
1a60: 33 44 34 2e 20 36 34 2c 20 24 32 31 44 34 37 46  3D4. 64, $21D47F
1a70: 30 35 42 31 36 43 45 45 34 36 2e 20 36 34 2c 20  05B16CEE46. 64, 
1a80: 24 41 37 37 30 36 44 39 44 41 34 44 33 36 42 33  $A7706D9DA4D36B3
1a90: 31 2e 20 36 34 2c 20 24 32 33 30 32 38 44 31 43  1. 64, $23028D1C
1aa0: 38 38 36 35 37 38 33 39 2e 20 36 34 2c 20 0a 24  88657839. 64, .$
1ab0: 45 30 46 33 42 45 39 38 43 30 44 38 45 39 32 45  E0F3BE98C0D8E92E
1ac0: 2e 20 36 34 2c 20 24 39 44 41 35 44 35 43 44 45  . 64, $9DA5D5CDE
1ad0: 44 38 43 34 44 41 32 2e 20 36 34 2c 20 24 38 32  D8C4DA2. 64, $82
1ae0: 37 31 30 39 42 46 41 37 35 34 43 45 41 34 2e 20  7109BFA754CEA4. 
1af0: 36 34 2c 20 24 34 33 35 35 37 31 46 38 38 45 34  64, $435571F88E4
1b00: 32 42 43 31 46 2e 20 36 34 2c 20 0a 24 33 43 45  2BC1F. 64, .$3CE
1b10: 30 36 30 39 34 43 42 42 39 45 46 43 42 2e 20 36  06094CBB9EFCB. 6
1b20: 34 2c 20 24 32 43 30 33 34 34 37 44 39 35 42 30  4, $2C03447D95B0
1b30: 30 39 37 37 2e 20 36 34 2c 20 24 44 33 45 36 33  0977. 64, $D3E63
1b40: 42 36 35 44 39 36 41 33 36 38 36 2e 20 36 34 2c  B65D96A3686. 64,
1b50: 20 24 41 35 30 43 37 32 44 37 34 33 37 42 43 37   $A50C72D7437BC7
1b60: 46 45 2e 20 36 34 2c 20 0a 24 35 37 33 37 45 34  FE. 64, .$5737E4
1b70: 37 36 33 38 39 43 41 39 46 44 2e 20 36 34 2c 20  76389CA9FD. 64, 
1b80: 24 33 43 38 46 38 34 39 35 45 44 39 46 42 36 42  $3C8F8495ED9FB6B
1b90: 42 2e 20 36 34 2c 20 24 37 45 36 36 42 46 30 31  B. 64, $7E66BF01
1ba0: 42 44 44 45 38 41 43 39 2e 20 36 34 2c 20 24 34  BDDE8AC9. 64, $4
1bb0: 32 46 46 36 35 30 43 39 34 37 46 31 42 37 33 2e  2FF650C947F1B73.
1bc0: 20 36 34 2c 20 0a 24 38 33 31 41 44 34 43 30 31   64, .$831AD4C01
1bd0: 41 33 37 34 35 38 41 2e 20 36 34 2c 20 24 41 42  A37458A. 64, $AB
1be0: 38 36 32 39 36 39 32 34 46 39 44 34 34 45 2e 20  86296924F9D44E. 
1bf0: 36 34 2c 20 24 44 30 34 35 33 34 39 33 34 35 32  64, $D0453493452
1c00: 37 46 45 31 31 2e 20 36 34 2c 20 24 41 44 36 37  7FE11. 64, $AD67
1c10: 42 31 38 44 33 32 36 42 41 30 35 36 2e 20 36 34  B18D326BA056. 64
1c20: 2c 20 0a 24 43 44 43 38 35 42 43 32 31 38 45 35  , .$CDC85BC218E5
1c30: 39 36 43 33 2e 20 36 34 2c 20 24 39 37 35 33 36  96C3. 64, $97536
1c40: 43 44 36 35 30 38 32 41 35 38 38 2e 20 36 34 2c  CD65082A588. 64,
1c50: 20 24 34 31 38 33 38 31 31 31 41 33 37 43 38 39   $41838111A37C89
1c60: 42 35 2e 20 36 34 2c 20 24 31 45 36 37 30 41 43  B5. 64, $1E670AC
1c70: 37 41 35 39 30 35 36 34 38 2e 20 36 34 2c 20 0a  7A5905648. 64, .
1c80: 24 37 45 42 36 37 44 32 36 33 36 41 44 45 44 46  $7EB67D2636ADEDF
1c90: 36 2e 20 36 34 2c 20 24 30 35 36 30 35 31 34 46  6. 64, $0560514F
1ca0: 37 38 30 44 44 31 33 45 2e 20 36 34 2c 20 24 38  780DD13E. 64, $8
1cb0: 42 37 38 41 39 34 42 36 43 39 39 30 37 30 38 2e  B78A94B6C990708.
1cc0: 20 36 34 2c 20 24 37 43 31 35 39 37 37 42 41 38   64, $7C15977BA8
1cd0: 45 41 36 32 31 33 2e 20 36 34 2c 20 0a 24 38 43  EA6213. 64, .$8C
1ce0: 38 45 38 39 38 44 33 35 46 38 39 35 46 45 2e 20  8E898D35F895FE. 
1cf0: 36 34 2c 20 24 31 41 32 43 41 38 45 45 39 31 37  64, $1A2CA8EE917
1d00: 46 33 32 34 42 2e 20 36 34 2c 20 24 32 43 44 33  F324B. 64, $2CD3
1d10: 30 36 37 42 31 32 36 32 41 38 34 44 2e 20 36 34  067B1262A84D. 64
1d20: 2c 20 24 31 36 39 43 30 39 35 36 44 36 30 31 31  , $169C0956D6011
1d30: 32 34 31 2e 20 36 34 2c 20 0a 24 33 32 31 33 46  241. 64, .$3213F
1d40: 39 31 39 33 42 44 42 33 43 36 39 2e 20 36 34 2c  9193BDB3C69. 64,
1d50: 20 24 37 42 43 32 46 30 38 36 34 45 37 43 34 38   $7BC2F0864E7C48
1d60: 30 45 2e 20 36 34 2c 20 24 35 33 39 46 38 32 30  0E. 64, $539F820
1d70: 30 36 41 42 30 35 42 32 43 2e 20 36 34 2c 20 24  06AB05B2C. 64, $
1d80: 44 36 38 34 44 44 35 43 36 39 41 37 36 46 37 33  D684DD5C69A76F73
1d90: 2e 20 36 34 2c 20 0a 24 31 36 38 41 34 34 45 34  . 64, .$168A44E4
1da0: 45 30 46 41 30 35 30 34 2e 20 36 34 2c 20 24 34  E0FA0504. 64, $4
1db0: 32 41 37 35 46 44 44 45 33 42 41 38 43 30 31 2e  2A75FDDE3BA8C01.
1dc0: 20 36 34 2c 20 24 46 42 34 38 41 39 32 41 45 32   64, $FB48A92AE2
1dd0: 44 41 44 34 44 31 2e 20 36 34 2c 20 24 38 36 31  DAD4D1. 64, $861
1de0: 32 31 38 39 39 44 43 37 34 32 39 43 37 2e 20 36  21899DC7429C7. 6
1df0: 34 2c 20 0a 24 31 30 46 37 32 41 41 35 42 34 30  4, .$10F72AA5B40
1e00: 41 33 34 34 41 2e 20 36 34 2c 20 24 45 34 39 32  A344A. 64, $E492
1e10: 36 42 31 37 38 31 46 38 43 39 30 43 2e 20 36 34  6B1781F8C90C. 64
1e20: 2c 20 24 34 46 34 43 33 46 32 38 45 44 41 44 37  , $4F4C3F28EDAD7
1e30: 35 31 38 2e 20 36 34 2c 20 24 37 34 34 43 35 37  518. 64, $744C57
1e40: 43 34 44 42 31 34 41 30 31 33 2e 20 36 34 2c 20  C4DB14A013. 64, 
1e50: 0a 24 34 35 30 46 43 32 34 42 33 30 36 31 33 36  .$450FC24B306136
1e60: 41 45 2e 20 36 34 2c 20 24 44 42 45 38 36 31 34  AE. 64, $DBE8614
1e70: 42 37 45 31 38 31 31 35 43 2e 20 36 34 2c 20 24  B7E18115C. 64, $
1e80: 41 34 43 44 36 36 38 31 31 42 30 46 38 37 46 43  A4CD66811B0F87FC
1e90: 2e 20 36 34 2c 20 24 33 31 39 38 34 35 30 30 30  . 64, $319845000
1ea0: 39 39 44 30 36 46 35 2e 20 36 34 2c 20 0a 68 65  99D06F5. 64, .he
1eb0: 72 65 20 27 72 6e 67 73 20 2d 0a 63 6f 6e 73 74  re 'rngs -.const
1ec0: 61 6e 74 20 72 6e 67 2d 73 69 7a 65 0a 0a 5c 20  ant rng-size..\ 
1ed0: 77 75 72 73 74 6b 65 73 73 65 6c 20 70 72 69 6d  wurstkessel prim
1ee0: 69 74 69 76 65 73 0a 0a 63 65 6c 6c 20 38 20 3d  itives..cell 8 =
1ef0: 20 5b 49 46 5d 0a 20 20 20 20 3a 20 77 75 72 73   [IF].    : wurs
1f00: 74 20 28 20 75 31 20 75 32 20 2d 2d 20 75 33 20  t ( u1 u2 -- u3 
1f10: 29 20 3e 72 20 64 75 70 20 32 2a 20 73 77 61 70  ) >r dup 2* swap
1f20: 20 30 3c 20 2d 20 72 3e 20 78 6f 72 20 3b 0a 20   0< - r> xor ;. 
1f30: 20 20 20 3a 20 72 6e 67 73 20 36 34 73 20 27 72     : rngs 64s 'r
1f40: 6e 67 73 20 2b 20 36 34 40 20 3b 0a 5b 45 4c 53  ngs + 64@ ;.[ELS
1f50: 45 5d 0a 20 20 20 20 73 22 20 62 69 67 46 4f 52  E].    s" bigFOR
1f60: 54 48 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 3f  TH" environment?
1f70: 20 5b 49 46 5d 20 32 64 72 6f 70 0a 09 43 6f 64   [IF] 2drop..Cod
1f80: 65 20 77 75 72 73 74 20 28 20 75 64 31 20 75 64  e wurst ( ud1 ud
1f90: 32 20 2d 2d 20 75 64 33 20 29 0a 09 20 20 20 20  2 -- ud3 )..    
1fa0: 44 58 20 70 6f 70 20 20 43 58 20 70 6f 70 20 20  DX pop  CX pop  
1fb0: 53 50 20 29 20 42 58 20 78 63 68 67 0a 09 20 20  SP ) BX xchg..  
1fc0: 20 20 42 58 20 42 58 20 61 64 64 20 20 43 58 20    BX BX add  CX 
1fd0: 43 58 20 61 64 63 0a 09 20 20 20 20 30 20 23 20  CX adc..    0 # 
1fe0: 42 58 20 61 64 63 20 20 20 44 58 20 42 58 20 78  BX adc   DX BX x
1ff0: 6f 72 20 20 43 58 20 41 58 20 78 6f 72 0a 09 20  or  CX AX xor.. 
2000: 20 20 20 53 50 20 29 20 42 58 20 78 63 68 67 0a     SP ) BX xchg.
2010: 09 20 20 20 20 4e 65 78 74 20 65 6e 64 2d 63 6f  .    Next end-co
2020: 64 65 20 20 6d 61 63 72 6f 0a 09 43 6f 64 65 20  de  macro..Code 
2030: 72 6e 67 73 20 20 27 72 6e 67 73 20 41 58 20 2a  rngs  'rngs AX *
2040: 38 20 49 23 29 20 70 75 73 68 20 20 27 72 6e 67  8 I#) push  'rng
2050: 73 20 63 65 6c 6c 2b 20 41 58 20 2a 38 20 49 23  s cell+ AX *8 I#
2060: 29 20 41 58 20 6d 6f 76 0a 09 20 20 20 20 4e 65  ) AX mov..    Ne
2070: 78 74 20 65 6e 64 2d 63 6f 64 65 20 20 6d 61 63  xt end-code  mac
2080: 72 6f 0a 20 20 20 20 5b 45 4c 53 45 5d 0a 09 3a  ro.    [ELSE]..:
2090: 20 72 6e 67 73 20 36 34 73 20 27 72 6e 67 73 20   rngs 64s 'rngs 
20a0: 2b 20 36 34 40 20 3b 0a 09 3a 20 77 75 72 73 74  + 64@ ;..: wurst
20b0: 20 28 20 75 64 31 20 75 64 32 20 2d 2d 20 75 64   ( ud1 ud2 -- ud
20c0: 33 20 29 20 20 32 3e 72 0a 09 20 20 20 20 64 75  3 )  2>r..    du
20d0: 70 20 30 3c 20 3e 72 20 64 32 2a 20 72 3e 20 64  p 0< >r d2* r> d
20e0: 75 70 20 64 2d 20 32 72 3e 0a 09 20 20 20 20 36  up d- 2r>..    6
20f0: 34 78 6f 72 20 3b 0a 20 20 20 20 5b 54 48 45 4e  4xor ;.    [THEN
2100: 5d 0a 5b 54 48 45 4e 5d 0a 0a 5c 20 70 65 72 6d  ].[THEN]..\ perm
2110: 75 74 61 74 69 6f 6e 20 67 65 6e 65 72 61 74 69  utation generati
2120: 6f 6e 0a 0a 30 20 5b 49 46 5d 0a 43 72 65 61 74  on..0 [IF].Creat
2130: 65 20 70 65 72 6d 75 74 23 20 30 20 2c 20 31 20  e permut# 0 , 1 
2140: 2c 20 32 20 2c 20 33 20 2c 20 34 20 2c 20 35 20  , 2 , 3 , 4 , 5 
2150: 2c 20 36 20 2c 20 37 20 2c 0a 70 65 72 6d 75 74  , 6 , 7 ,.permut
2160: 23 0a 44 4f 45 53 3e 20 73 77 61 70 20 37 20 61  #.DOES> swap 7 a
2170: 6e 64 20 63 65 6c 6c 73 20 2b 20 40 20 3b 0a 0a  nd cells + @ ;..
2180: 43 6f 6e 73 74 61 6e 74 20 27 70 65 72 6d 75 74  Constant 'permut
2190: 0a 0a 63 72 65 61 74 65 20 73 74 61 74 65 31 20  ..create state1 
21a0: 30 20 2c 20 31 20 2c 20 32 20 2c 20 33 20 2c 20  0 , 1 , 2 , 3 , 
21b0: 34 20 2c 20 35 20 2c 20 36 20 2c 20 37 20 2c 0a  4 , 5 , 6 , 7 ,.
21c0: 63 72 65 61 74 65 20 73 74 61 74 65 32 20 38 20  create state2 8 
21d0: 63 65 6c 6c 73 20 61 6c 6c 6f 74 0a 3a 20 70 65  cells allot.: pe
21e0: 72 6d 75 74 20 38 20 30 20 44 4f 20 20 73 74 61  rmut 8 0 DO  sta
21f0: 74 65 31 20 49 20 70 65 72 6d 75 74 23 20 63 65  te1 I permut# ce
2200: 6c 6c 73 20 2b 20 40 20 73 74 61 74 65 32 20 49  lls + @ state2 I
2210: 20 63 65 6c 6c 73 20 2b 20 21 20 4c 4f 4f 50 0a   cells + ! LOOP.
2220: 20 20 20 20 73 74 61 74 65 32 20 73 74 61 74 65      state2 state
2230: 31 20 38 20 63 65 6c 6c 73 20 6d 6f 76 65 20 3b  1 8 cells move ;
2240: 0a 3a 20 70 65 72 6d 75 74 40 20 30 20 38 20 30  .: permut@ 0 8 0
2250: 20 44 4f 20 33 20 6c 73 68 69 66 74 20 73 74 61   DO 3 lshift sta
2260: 74 65 31 20 49 20 63 65 6c 6c 73 20 2b 20 40 20  te1 I cells + @ 
2270: 6f 72 20 20 4c 4f 4f 50 20 3b 0a 0a 70 65 72 6d  or  LOOP ;..perm
2280: 75 74 40 20 43 6f 6e 73 74 61 6e 74 20 69 6e 69  ut@ Constant ini
2290: 74 2d 70 65 72 6d 75 74 0a 0a 3a 20 70 65 72 6d  t-permut..: perm
22a0: 75 74 2d 63 6f 75 6e 74 20 28 20 2d 2d 20 6e 20  ut-count ( -- n 
22b0: 29 0a 20 20 20 20 30 20 42 45 47 49 4e 20 31 2b  ).    0 BEGIN 1+
22c0: 20 70 65 72 6d 75 74 20 70 65 72 6d 75 74 40 20   permut permut@ 
22d0: 69 6e 69 74 2d 70 65 72 6d 75 74 20 3d 20 55 4e  init-permut = UN
22e0: 54 49 4c 20 3b 0a 0a 3a 20 28 70 65 72 6d 75 74  TIL ;..: (permut
22f0: 2d 63 6f 75 6e 74 73 20 7b 20 6e 20 7d 0a 20 20  -counts { n }.  
2300: 20 20 6e 20 30 3d 20 49 46 20 20 70 65 72 6d 75    n 0= IF  permu
2310: 74 2d 63 6f 75 6e 74 20 2e 20 38 20 30 20 44 4f  t-count . 8 0 DO
2320: 20 49 20 70 65 72 6d 75 74 23 20 2e 20 4c 4f 4f   I permut# . LOO
2330: 50 20 20 63 72 20 20 45 58 49 54 20 20 54 48 45  P  cr  EXIT  THE
2340: 4e 0a 20 20 20 20 38 20 30 20 44 4f 0a 09 27 70  N.    8 0 DO..'p
2350: 65 72 6d 75 74 20 49 20 63 65 6c 6c 73 20 2b 20  ermut I cells + 
2360: 64 75 70 20 40 20 30 3d 20 49 46 0a 09 20 20 20  dup @ 0= IF..   
2370: 20 6e 20 73 77 61 70 20 21 20 6e 20 31 2d 20 72   n swap ! n 1- r
2380: 65 63 75 72 73 65 20 27 70 65 72 6d 75 74 20 49  ecurse 'permut I
2390: 20 63 65 6c 6c 73 20 2b 20 6f 66 66 0a 09 45 4c   cells + off..EL
23a0: 53 45 20 20 64 72 6f 70 20 20 54 48 45 4e 0a 20  SE  drop  THEN. 
23b0: 20 20 20 4c 4f 4f 50 20 3b 0a 0a 3a 20 70 65 72     LOOP ;..: per
23c0: 6d 75 74 2d 63 6f 75 6e 74 73 20 27 70 65 72 6d  mut-counts 'perm
23d0: 75 74 20 38 20 63 65 6c 6c 73 20 65 72 61 73 65  ut 8 cells erase
23e0: 20 20 37 20 28 70 65 72 6d 75 74 2d 63 6f 75 6e    7 (permut-coun
23f0: 74 73 20 3b 0a 5b 54 48 45 4e 5d 0a 0a 5c 20 77  ts ;.[THEN]..\ w
2400: 75 72 73 74 6b 65 73 73 65 6c 20 61 6c 67 6f 72  urstkessel algor
2410: 69 74 68 6d 0a 0a 3a 20 6d 69 78 32 62 79 74 65  ithm..: mix2byte
2420: 73 20 28 20 69 6e 64 65 78 20 6e 20 6b 20 2d 2d  s ( index n k --
2430: 20 62 31 20 2e 2e 20 62 38 20 69 6e 64 65 78 27   b1 .. b8 index'
2440: 20 6e 20 29 20 77 75 72 73 74 2d 73 74 61 74 65   n ) wurst-state
2450: 20 2b 20 38 20 30 20 44 4f 0a 09 3e 72 20 6f 76   + 8 0 DO..>r ov
2460: 65 72 20 77 75 72 73 74 2d 73 6f 75 72 63 65 20  er wurst-source 
2470: 2b 20 63 40 20 72 40 20 63 40 20 78 6f 72 20 2d  + c@ r@ c@ xor -
2480: 72 6f 74 20 64 75 70 20 3e 72 20 2b 20 24 33 46  rot dup >r + $3F
2490: 20 61 6e 64 20 72 3e 20 72 3e 20 38 20 2b 20 4c   and r> r> 8 + L
24a0: 4f 4f 50 0a 20 20 20 20 64 72 6f 70 20 3b 0a 0a  OOP.    drop ;..
24b0: 3a 20 62 79 74 65 73 32 73 75 6d 20 28 20 75 64  : bytes2sum ( ud
24c0: 20 62 31 20 2e 2e 20 62 38 20 2d 2d 20 75 64 27   b1 .. b8 -- ud'
24d0: 20 29 20 3e 72 20 3e 72 20 3e 72 20 3e 72 20 20   ) >r >r >r >r  
24e0: 3e 72 20 3e 72 20 3e 72 20 3e 72 0a 20 20 20 20  >r >r >r >r.    
24f0: 72 3e 20 72 6e 67 73 20 77 75 72 73 74 20 20 72  r> rngs wurst  r
2500: 3e 20 72 6e 67 73 20 77 75 72 73 74 20 20 72 3e  > rngs wurst  r>
2510: 20 72 6e 67 73 20 77 75 72 73 74 20 20 72 3e 20   rngs wurst  r> 
2520: 72 6e 67 73 20 77 75 72 73 74 0a 20 20 20 20 72  rngs wurst.    r
2530: 3e 20 72 6e 67 73 20 77 75 72 73 74 20 20 72 3e  > rngs wurst  r>
2540: 20 72 6e 67 73 20 77 75 72 73 74 20 20 72 3e 20   rngs wurst  r> 
2550: 72 6e 67 73 20 77 75 72 73 74 20 20 72 3e 20 72  rngs wurst  r> r
2560: 6e 67 73 20 77 75 72 73 74 20 3b 0a 0a 43 72 65  ngs wurst ;..Cre
2570: 61 74 65 20 72 6f 75 6e 64 23 20 31 33 20 2c 20  ate round# 13 , 
2580: 32 39 20 2c 20 31 39 20 2c 20 32 33 20 2c 20 33  29 , 19 , 23 , 3
2590: 31 20 2c 20 34 37 20 2c 20 31 37 20 2c 20 33 37  1 , 47 , 17 , 37
25a0: 20 2c 0a 44 4f 45 53 3e 20 73 77 61 70 20 37 20   ,.DOES> swap 7 
25b0: 61 6e 64 20 63 65 6c 6c 73 20 2b 20 40 20 3b 0a  and cells + @ ;.
25c0: 43 72 65 61 74 65 20 70 65 72 6d 75 74 23 20 32  Create permut# 2
25d0: 20 2c 20 36 20 2c 20 31 20 2c 20 34 20 2c 20 37   , 6 , 1 , 4 , 7
25e0: 20 2c 20 30 20 2c 20 35 20 2c 20 33 20 2c 20 5c   , 0 , 5 , 3 , \
25f0: 20 70 65 72 6d 75 74 20 6c 65 6e 67 74 68 20 31   permut length 1
2600: 35 0a 44 4f 45 53 3e 20 73 77 61 70 20 37 20 61  5.DOES> swap 7 a
2610: 6e 64 20 63 65 6c 6c 73 20 2b 20 40 20 3b 0a 0a  nd cells + @ ;..
2620: 3a 20 78 6f 72 73 20 28 20 61 64 64 72 31 20 61  : xors ( addr1 a
2630: 64 64 72 32 20 6e 20 2d 2d 20 29 20 62 6f 75 6e  ddr2 n -- ) boun
2640: 64 73 20 3f 44 4f 0a 20 20 20 20 64 75 70 20 40  ds ?DO.    dup @
2650: 20 49 20 40 20 78 6f 72 20 49 20 21 20 63 65 6c   I @ xor I ! cel
2660: 6c 2b 20 20 63 65 6c 6c 20 2b 4c 4f 4f 50 20 20  l+  cell +LOOP  
2670: 64 72 6f 70 20 3b 0a 3a 20 2b 21 73 20 28 20 61  drop ;.: +!s ( a
2680: 64 64 72 31 20 61 64 64 72 32 20 6e 20 2d 2d 20  ddr1 addr2 n -- 
2690: 29 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 20 20 20  ) bounds ?DO.   
26a0: 20 64 75 70 20 36 34 40 20 49 20 36 34 40 20 36   dup 64@ I 64@ 6
26b0: 34 2b 20 49 20 36 34 21 20 36 34 27 2b 20 20 31  4+ I 64! 64'+  1
26c0: 20 36 34 73 20 2b 4c 4f 4f 50 20 20 64 72 6f 70   64s +LOOP  drop
26d0: 20 3b 0a 0a 3a 20 75 70 64 61 74 65 2d 73 74 61   ;..: update-sta
26e0: 74 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 77 75  te ( -- ).    wu
26f0: 72 73 74 2d 73 74 61 74 65 20 77 75 72 73 74 2d  rst-state wurst-
2700: 73 6f 75 72 63 65 20 73 74 61 74 65 23 20 78 6f  source state# xo
2710: 72 73 0a 20 20 20 20 6e 65 78 74 73 74 61 74 65  rs.    nextstate
2720: 20 77 75 72 73 74 2d 73 74 61 74 65 20 73 74 61   wurst-state sta
2730: 74 65 23 20 2b 21 73 20 3b 0a 3a 20 72 6f 75 6e  te# +!s ;.: roun
2740: 64 20 28 20 6e 20 2d 2d 20 29 20 64 75 70 20 31  d ( n -- ) dup 1
2750: 2d 20 73 77 61 70 20 20 38 20 30 20 44 4f 0a 09  - swap  8 0 DO..
2760: 77 75 72 73 74 2d 73 74 61 74 65 20 49 20 70 65  wurst-state I pe
2770: 72 6d 75 74 23 20 36 34 73 20 2b 20 36 34 40 20  rmut# 64s + 64@ 
2780: 2d 36 34 72 6f 74 0a 09 49 20 6d 69 78 32 62 79  -64rot..I mix2by
2790: 74 65 73 20 32 3e 72 20 62 79 74 65 73 32 73 75  tes 2>r bytes2su
27a0: 6d 20 32 72 3e 20 36 34 72 6f 74 20 6e 65 78 74  m 2r> 64rot next
27b0: 73 74 61 74 65 20 49 20 36 34 73 20 2b 20 36 34  state I 64s + 64
27c0: 21 0a 20 20 20 20 4c 4f 4f 50 20 32 64 72 6f 70  !.    LOOP 2drop
27d0: 20 75 70 64 61 74 65 2d 73 74 61 74 65 20 3b 0a   update-state ;.
27e0: 0a 5c 20 66 61 73 74 20 6d 69 78 69 6e 67 0a 0a  .\ fast mixing..
27f0: 5b 49 46 55 4e 44 45 46 5d 20 5d 5d 0a 20 20 20  [IFUNDEF] ]].   
2800: 20 3a 20 5b 5b 20 3b 20 5c 20 74 6f 6b 65 6e 20   : [[ ; \ token 
2810: 74 6f 20 65 6e 64 20 62 75 6c 6b 2d 70 6f 73 74  to end bulk-post
2820: 70 6f 6e 69 6e 67 0a 20 20 20 20 3a 20 5d 5d 20  poning.    : ]] 
2830: 42 45 47 49 4e 20 20 3e 69 6e 20 40 20 27 20 5b  BEGIN  >in @ ' [
2840: 27 5d 20 5b 5b 20 3c 3e 20 57 48 49 4c 45 20 20  '] [[ <> WHILE  
2850: 3e 69 6e 20 21 20 70 6f 73 74 70 6f 6e 65 20 70  >in ! postpone p
2860: 6f 73 74 70 6f 6e 65 20 20 52 45 50 45 41 54 0a  ostpone  REPEAT.
2870: 09 64 72 6f 70 20 3b 20 69 6d 6d 65 64 69 61 74  .drop ; immediat
2880: 65 0a 5b 54 48 45 4e 5d 0a 73 22 20 62 69 67 46  e.[THEN].s" bigF
2890: 4f 52 54 48 22 20 65 6e 76 69 72 6f 6e 6d 65 6e  ORTH" environmen
28a0: 74 3f 20 5b 49 46 5d 20 32 64 72 6f 70 0a 20 20  t? [IF] 2drop.  
28b0: 20 20 24 46 34 38 37 20 43 6f 6e 73 74 61 6e 74    $F487 Constant
28c0: 20 5b 73 7e 72 5d 0a 20 20 20 20 3a 20 53 3a 20   [s~r].    : S: 
28d0: 20 28 20 2d 2d 20 29 20 20 6c 61 73 74 64 65 73   ( -- )  lastdes
28e0: 20 63 40 20 64 75 70 20 3a 72 20 3d 0a 09 49 46   c@ dup :r =..IF
28f0: 20 20 20 64 72 6f 70 20 5b 73 7e 72 5d 20 77 2c     drop [s~r] w,
2900: 0a 09 45 4c 53 45 20 3a 73 20 3d 20 30 3d 20 49  ..ELSE :s = 0= I
2910: 46 20 20 2d 32 20 61 6c 6c 6f 74 20 20 54 48 45  F  -2 allot  THE
2920: 4e 20 20 54 48 45 4e 20 20 3a 73 20 6c 61 73 74  N  THEN  :s last
2930: 64 65 73 20 63 21 20 3b 0a 20 20 20 20 3a 20 77  des c! ;.    : w
2940: 75 72 73 74 2d 6d 69 78 20 28 20 61 31 20 61 32  urst-mix ( a1 a2
2950: 20 2d 2d 20 29 20 53 3a 20 5b 20 61 6c 73 6f 20   -- ) S: [ also 
2960: 61 73 73 65 6d 62 6c 65 72 20 5d 0a 09 41 58 20  assembler ]..AX 
2970: 70 75 73 68 20 20 2e 62 20 41 23 29 20 41 58 20  push  .b A#) AX 
2980: 6d 6f 76 7a 78 20 20 41 23 29 20 41 4c 20 78 6f  movzx  A#) AL xo
2990: 72 0a 09 5b 20 70 72 65 76 69 6f 75 73 20 5d 20  r..[ previous ] 
29a0: 5b 73 7e 72 5d 20 77 2c 20 5d 5d 20 72 6e 67 73  [s~r] w, ]] rngs
29b0: 20 77 75 72 73 74 20 5b 5b 20 3b 20 69 6d 6d 65   wurst [[ ; imme
29c0: 64 69 61 74 65 0a 5b 45 4c 53 45 5d 0a 20 20 20  diate.[ELSE].   
29d0: 20 3a 20 77 75 72 73 74 2d 6d 69 78 20 5d 5d 20   : wurst-mix ]] 
29e0: 4c 69 74 65 72 61 6c 20 63 40 20 4c 69 74 65 72  Literal c@ Liter
29f0: 61 6c 20 63 40 20 78 6f 72 20 72 6e 67 73 20 77  al c@ xor rngs w
2a00: 75 72 73 74 20 5b 5b 20 3b 20 69 6d 6d 65 64 69  urst [[ ; immedi
2a10: 61 74 65 0a 5b 54 48 45 4e 5d 0a 3a 20 6d 69 78  ate.[THEN].: mix
2a20: 32 62 79 74 65 73 2c 20 28 20 69 6e 64 65 78 20  2bytes, ( index 
2a30: 6e 20 6b 20 2d 2d 20 69 6e 64 65 78 27 20 6e 20  n k -- index' n 
2a40: 29 20 77 75 72 73 74 2d 73 74 61 74 65 20 2b 20  ) wurst-state + 
2a50: 38 20 30 20 44 4f 0a 09 3e 72 20 6f 76 65 72 20  8 0 DO..>r over 
2a60: 77 75 72 73 74 2d 73 6f 75 72 63 65 20 2b 20 72  wurst-source + r
2a70: 40 20 5d 5d 20 77 75 72 73 74 2d 6d 69 78 20 5b  @ ]] wurst-mix [
2a80: 5b 0a 09 64 75 70 20 3e 72 20 2b 20 24 33 46 20  [..dup >r + $3F 
2a90: 61 6e 64 20 72 3e 20 72 3e 20 38 20 2b 20 4c 4f  and r> r> 8 + LO
2aa0: 4f 50 0a 20 20 20 20 64 72 6f 70 20 3b 0a 0a 3a  OP.    drop ;..:
2ab0: 20 72 6f 75 6e 64 2c 20 28 20 6e 20 2d 2d 20 29   round, ( n -- )
2ac0: 20 64 75 70 20 31 2d 20 73 77 61 70 20 20 38 20   dup 1- swap  8 
2ad0: 30 20 44 4f 0a 09 77 75 72 73 74 2d 73 74 61 74  0 DO..wurst-stat
2ae0: 65 20 49 20 70 65 72 6d 75 74 23 20 36 34 73 20  e I permut# 64s 
2af0: 2b 20 5d 5d 20 4c 69 74 65 72 61 6c 20 36 34 40  + ]] Literal 64@
2b00: 20 5b 5b 0a 09 49 20 6d 69 78 32 62 79 74 65 73   [[..I mix2bytes
2b10: 2c 20 6e 65 78 74 73 74 61 74 65 20 49 20 36 34  , nextstate I 64
2b20: 73 20 2b 20 5d 5d 20 4c 69 74 65 72 61 6c 20 36  s + ]] Literal 6
2b30: 34 21 20 5b 5b 0a 20 20 20 20 4c 4f 4f 50 20 32  4! [[.    LOOP 2
2b40: 64 72 6f 70 20 5d 5d 20 75 70 64 61 74 65 2d 73  drop ]] update-s
2b50: 74 61 74 65 20 5b 5b 20 3b 0a 0a 73 22 20 67 66  tate [[ ;..s" gf
2b60: 6f 72 74 68 22 20 65 6e 76 69 72 6f 6e 6d 65 6e  orth" environmen
2b70: 74 3f 20 5b 49 46 5d 20 32 64 72 6f 70 0a 20 20  t? [IF] 2drop.  
2b80: 20 20 61 6c 73 6f 20 63 2d 6c 69 62 0a 20 20 20    also c-lib.   
2b90: 20 3a 20 5c 63 2c 20 28 20 61 64 64 72 20 75 20   : \c, ( addr u 
2ba0: 2d 2d 20 29 20 73 61 76 65 2d 63 2d 70 72 65 66  -- ) save-c-pref
2bb0: 69 78 2d 6c 69 6e 65 20 3b 0a 20 20 20 20 70 72  ix-line ;.    pr
2bc0: 65 76 69 6f 75 73 0a 20 20 20 20 56 61 72 69 61  evious.    Varia
2bd0: 62 6c 65 20 25 73 74 72 69 6e 67 20 20 73 22 20  ble %string  s" 
2be0: 22 20 25 73 74 72 69 6e 67 20 24 21 0a 20 20 20  " %string $!.   
2bf0: 20 3a 20 25 3e 20 28 20 2d 2d 20 29 0a 09 42 45   : %> ( -- )..BE
2c00: 47 49 4e 20 20 73 6f 75 72 63 65 20 3e 69 6e 20  GIN  source >in 
2c10: 40 20 2f 73 74 72 69 6e 67 20 73 22 20 3c 25 22  @ /string s" <%"
2c20: 20 73 65 61 72 63 68 20 20 30 3d 20 57 48 49 4c   search  0= WHIL
2c30: 45 0a 09 09 70 6f 73 74 70 6f 6e 65 20 73 6c 69  E...postpone sli
2c40: 74 65 72 61 6c 20 70 6f 73 74 70 6f 6e 65 20 25  teral postpone %
2c50: 73 74 72 69 6e 67 20 70 6f 73 74 70 6f 6e 65 20  string postpone 
2c60: 24 2b 21 0a 09 20 20 20 20 72 65 66 69 6c 6c 20  $+!..    refill 
2c70: 20 30 3d 20 55 4e 54 49 4c 20 20 45 58 49 54 20   0= UNTIL  EXIT 
2c80: 20 54 48 45 4e 0a 09 6e 69 70 20 73 6f 75 72 63   THEN..nip sourc
2c90: 65 20 3e 69 6e 20 40 20 2f 73 74 72 69 6e 67 20  e >in @ /string 
2ca0: 72 6f 74 20 2d 20 64 75 70 20 32 20 2b 20 3e 69  rot - dup 2 + >i
2cb0: 6e 20 2b 21 0a 09 70 6f 73 74 70 6f 6e 65 20 73  n +!..postpone s
2cc0: 6c 69 74 65 72 61 6c 20 70 6f 73 74 70 6f 6e 65  literal postpone
2cd0: 20 25 73 74 72 69 6e 67 20 70 6f 73 74 70 6f 6e   %string postpon
2ce0: 65 20 24 2b 21 20 3b 20 20 69 6d 6d 65 64 69 61  e $+! ;  immedia
2cf0: 74 65 0a 20 20 20 20 3a 20 25 63 2c 20 28 20 2d  te.    : %c, ( -
2d00: 2d 20 29 20 20 25 73 74 72 69 6e 67 20 24 40 20  - )  %string $@ 
2d10: 5c 63 2c 20 20 73 22 20 22 20 25 73 74 72 69 6e  \c,  s" " %strin
2d20: 67 20 24 21 20 3b 0a 20 20 20 20 3a 20 23 24 20  g $! ;.    : #$ 
2d30: 28 20 6e 20 2d 2d 20 29 20 20 30 20 3c 3c 23 20  ( n -- )  0 <<# 
2d40: 23 53 20 23 3e 20 25 73 74 72 69 6e 67 20 24 2b  #S #> %string $+
2d50: 21 20 23 3e 3e 20 3b 0a 20 20 20 20 3a 20 6d 69  ! #>> ;.    : mi
2d60: 78 32 62 79 74 65 73 5f 69 6e 64 2c 20 28 20 69  x2bytes_ind, ( i
2d70: 6e 64 65 78 20 6e 20 6b 20 69 20 2d 2d 20 69 6e  ndex n k i -- in
2d80: 64 65 78 20 6e 20 29 20 3e 72 0a 09 3e 72 20 6f  dex n ) >r..>r o
2d90: 76 65 72 20 72 40 20 36 34 20 2b 0a 09 25 3e 20  ver r@ 64 +..%> 
2da0: 61 3c 25 20 72 40 20 37 20 61 6e 64 20 23 24 20  a<% r@ 7 and #$ 
2db0: 25 3e 20 5e 3d 52 4f 4c 28 72 6e 64 73 5b 73 74  %> ^=ROL(rnds[st
2dc0: 61 74 65 73 5b 3c 25 20 73 77 61 70 20 23 24 20  ates[<% swap #$ 
2dd0: 25 3e 20 5d 5e 28 30 78 66 66 26 28 74 3e 3e 3c  %> ]^(0xff&(t>><
2de0: 25 0a 09 24 37 20 61 6e 64 20 38 20 2a 20 23 24  %..$7 and 8 * #$
2df0: 20 25 3e 20 29 29 5d 2c 3c 25 20 72 3e 20 37 20   %> ))],<% r> 7 
2e00: 72 40 20 2d 20 23 24 20 3e 72 20 25 3e 20 29 3b  r@ - #$ >r %> );
2e10: 3c 25 09 25 63 2c 0a 09 72 64 72 6f 70 20 72 64  <%.%c,..rdrop rd
2e20: 72 6f 70 20 3b 0a 20 20 20 20 3a 20 72 6f 75 6e  rop ;.    : roun
2e30: 64 5f 69 6e 64 2c 20 28 20 6e 20 2d 2d 20 29 0a  d_ind, ( n -- ).
2e40: 09 25 3e 20 73 74 61 74 69 63 20 69 6e 6c 69 6e  .%> static inlin
2e50: 65 20 76 6f 69 64 20 72 6f 75 6e 64 3c 25 20 64  e void round<% d
2e60: 75 70 20 23 24 0a 09 25 3e 20 5f 69 6e 64 28 75  up #$..%> _ind(u
2e70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 73  nsigned char * s
2e80: 74 61 74 65 73 2c 20 75 69 6e 74 36 34 5f 74 20  tates, uint64_t 
2e90: 2a 20 72 6e 64 73 29 20 7b 3c 25 20 25 63 2c 0a  * rnds) {<% %c,.
2ea0: 09 25 3e 20 20 20 75 69 6e 74 36 34 5f 74 20 61  .%>   uint64_t a
2eb0: 30 2c 20 61 31 2c 20 61 32 2c 20 61 33 2c 20 61  0, a1, a2, a3, a
2ec0: 34 2c 20 61 35 2c 20 61 36 2c 20 61 37 2c 20 74  4, a5, a6, a7, t
2ed0: 3b 3c 25 20 25 63 2c 0a 09 72 6f 75 6e 64 23 20  ;<% %c,..round# 
2ee0: 64 75 70 20 31 2d 20 73 77 61 70 20 38 20 30 20  dup 1- swap 8 0 
2ef0: 44 4f 0a 09 20 20 20 20 25 3e 20 61 3c 25 20 49  DO..    %> a<% I
2f00: 20 23 24 20 25 3e 20 3d 52 4f 4c 28 2a 28 28 75   #$ %> =ROL(*((u
2f10: 69 6e 74 36 34 5f 74 2a 29 28 73 74 61 74 65 73  int64_t*)(states
2f20: 2b 3c 25 0a 09 20 20 20 20 49 20 70 65 72 6d 75  +<%..    I permu
2f30: 74 23 20 38 20 2b 20 36 34 73 20 23 24 20 25 3e  t# 8 + 64s #$ %>
2f40: 20 29 29 2c 38 29 3b 3c 25 20 25 63 2c 0a 09 4c   )),8);<% %c,..L
2f50: 4f 4f 50 0a 09 38 20 30 20 44 4f 0a 09 20 20 20  OOP..8 0 DO..   
2f60: 20 5b 20 30 20 5d 20 5b 49 46 5d 0a 09 09 25 3e   [ 0 ] [IF]...%>
2f70: 20 61 73 6d 20 76 6f 6c 61 74 69 6c 65 28 22 23   asm volatile("#
2f80: 20 6c 69 6e 65 20 62 72 65 61 6b 22 20 3a 20 3a   line break" : :
2f90: 20 22 67 22 20 28 61 30 29 2c 20 22 67 22 20 28   "g" (a0), "g" (
2fa0: 61 31 29 2c 20 22 67 22 20 28 61 32 29 2c 20 22  a1), "g" (a2), "
2fb0: 67 22 20 28 61 33 29 2c 20 22 67 22 20 28 61 34  g" (a3), "g" (a4
2fc0: 29 2c 20 22 67 22 20 28 61 35 29 2c 20 22 67 22  ), "g" (a5), "g"
2fd0: 20 28 61 36 29 2c 20 22 67 22 20 28 61 37 29 29   (a6), "g" (a7))
2fe0: 3b 3c 25 20 25 63 2c 0a 09 20 20 20 20 5b 54 48  ;<% %c,..    [TH
2ff0: 45 4e 5d 20 5c 20 73 65 65 6d 73 20 74 6f 20 62  EN] \ seems to b
3000: 65 20 61 20 62 61 64 20 69 64 65 61 20 2d 20 6c  e a bad idea - l
3010: 65 74 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  et the compiler 
3020: 64 65 63 69 64 65 0a 09 20 20 20 20 25 3e 20 74  decide..    %> t
3030: 3d 2a 28 28 75 69 6e 74 36 34 5f 74 2a 29 28 73  =*((uint64_t*)(s
3040: 74 61 74 65 73 2b 3c 25 20 49 20 38 20 2a 20 36  tates+<% I 8 * 6
3050: 34 20 2b 20 23 24 20 25 3e 20 29 29 3b 3c 25 20  4 + #$ %> ));<% 
3060: 25 63 2c 0a 09 20 20 20 20 38 20 30 20 44 4f 20  %c,..    8 0 DO 
3070: 20 49 20 4a 20 38 20 2a 20 2b 20 4a 20 6d 69 78   I J 8 * + J mix
3080: 32 62 79 74 65 73 5f 69 6e 64 2c 0a 09 09 64 75  2bytes_ind,...du
3090: 70 20 3e 72 20 38 20 2a 20 2b 20 24 33 46 20 61  p >r 8 * + $3F a
30a0: 6e 64 20 72 3e 0a 09 20 20 20 20 4c 4f 4f 50 20  nd r>..    LOOP 
30b0: 20 64 75 70 20 3e 72 20 2b 20 24 33 46 20 61 6e   dup >r + $3F an
30c0: 64 20 72 3e 0a 09 4c 4f 4f 50 0a 09 32 64 72 6f  d r>..LOOP..2dro
30d0: 70 0a 09 38 20 30 20 44 4f 0a 09 20 20 20 20 25  p..8 0 DO..    %
30e0: 3e 20 2a 28 28 75 69 6e 74 36 34 5f 74 20 2a 29  > *((uint64_t *)
30f0: 28 73 74 61 74 65 73 2b 3c 25 20 49 20 36 34 73  (states+<% I 64s
3100: 20 23 24 20 25 3e 20 29 29 20 5e 3d 20 2a 28 28   #$ %> )) ^= *((
3110: 75 69 6e 74 36 34 5f 74 20 2a 29 28 73 74 61 74  uint64_t *)(stat
3120: 65 73 2b 3c 25 20 49 20 38 20 2b 20 36 34 73 20  es+<% I 8 + 64s 
3130: 23 24 20 25 3e 20 29 29 3b 3c 25 0a 09 20 20 20  #$ %> ));<%..   
3140: 20 25 63 2c 0a 09 4c 4f 4f 50 0a 09 38 20 30 20   %c,..LOOP..8 0 
3150: 44 4f 0a 09 20 20 20 20 25 3e 20 2a 28 28 75 69  DO..    %> *((ui
3160: 6e 74 36 34 5f 74 20 2a 29 28 73 74 61 74 65 73  nt64_t *)(states
3170: 2b 3c 25 20 49 20 38 20 2b 20 36 34 73 20 23 24  +<% I 8 + 64s #$
3180: 20 25 3e 20 29 29 20 2b 3d 20 61 3c 25 20 49 20   %> )) += a<% I 
3190: 23 24 20 25 3e 20 3b 3c 25 20 25 63 2c 0a 09 4c  #$ %> ;<% %c,..L
31a0: 4f 4f 50 0a 09 25 3e 20 7d 3c 25 20 25 63 2c 20  OOP..%> }<% %c, 
31b0: 3b 0a 09 0a 20 20 20 20 63 2d 6c 69 62 72 61 72  ;...    c-librar
31c0: 79 20 77 75 72 73 74 6b 65 73 73 65 6c 0a 20 20  y wurstkessel.  
31d0: 20 20 5c 63 20 23 69 6e 63 6c 75 64 65 20 3c 73    \c #include <s
31e0: 74 64 69 6e 74 2e 68 3e 0a 20 20 20 20 5c 63 20  tdint.h>.    \c 
31f0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
3200: 2e 68 3e 0a 20 20 20 20 5c 63 20 23 64 65 66 69  .h>.    \c #defi
3210: 6e 65 20 52 4f 4c 28 78 2c 20 6e 29 20 28 6e 3d  ne ROL(x, n) (n=
3220: 3d 30 29 3f 78 3a 28 28 78 20 3c 3c 20 6e 29 20  =0)?x:((x << n) 
3230: 7c 20 28 78 20 3e 3e 20 28 36 34 2d 6e 29 29 29  | (x >> (64-n)))
3240: 0a 20 20 20 20 5c 63 20 23 64 65 66 69 6e 65 20  .    \c #define 
3250: 43 4f 4d 42 49 4e 45 28 78 30 2c 61 31 2c 61 32  COMBINE(x0,a1,a2
3260: 2c 61 33 2c 61 34 2c 61 35 2c 61 36 2c 61 37 2c  ,a3,a4,a5,a6,a7,
3270: 61 38 29 20 28 52 4f 4c 28 78 30 2c 38 29 5e 52  a8) (ROL(x0,8)^R
3280: 4f 4c 28 61 31 2c 37 29 5e 52 4f 4c 28 61 32 2c  OL(a1,7)^ROL(a2,
3290: 36 29 5e 52 4f 4c 28 61 33 2c 35 29 5e 52 4f 4c  6)^ROL(a3,5)^ROL
32a0: 28 61 34 2c 34 29 5e 52 4f 4c 28 61 35 2c 33 29  (a4,4)^ROL(a5,3)
32b0: 5e 52 4f 4c 28 61 36 2c 32 29 5e 52 4f 4c 28 61  ^ROL(a6,2)^ROL(a
32c0: 37 2c 31 29 5e 61 38 29 0a 20 20 20 20 30 20 72  7,1)^a8).    0 r
32d0: 6f 75 6e 64 5f 69 6e 64 2c 0a 20 20 20 20 31 20  ound_ind,.    1 
32e0: 72 6f 75 6e 64 5f 69 6e 64 2c 0a 20 20 20 20 32  round_ind,.    2
32f0: 20 72 6f 75 6e 64 5f 69 6e 64 2c 0a 20 20 20 20   round_ind,.    
3300: 33 20 72 6f 75 6e 64 5f 69 6e 64 2c 0a 20 20 20  3 round_ind,.   
3310: 20 34 20 72 6f 75 6e 64 5f 69 6e 64 2c 0a 20 20   4 round_ind,.  
3320: 20 20 35 20 72 6f 75 6e 64 5f 69 6e 64 2c 0a 20    5 round_ind,. 
3330: 20 20 20 36 20 72 6f 75 6e 64 5f 69 6e 64 2c 0a     6 round_ind,.
3340: 20 20 20 20 37 20 72 6f 75 6e 64 5f 69 6e 64 2c      7 round_ind,
3350: 0a 20 20 20 20 5c 63 20 73 74 61 74 69 63 20 69  .    \c static i
3360: 6e 6c 69 6e 65 20 76 6f 69 64 20 61 64 64 5f 65  nline void add_e
3370: 6e 74 72 6f 70 79 28 75 69 6e 74 36 34 5f 74 20  ntropy(uint64_t 
3380: 2a 20 6d 2c 20 75 69 6e 74 36 34 5f 74 20 2a 20  * m, uint64_t * 
3390: 73 29 20 7b 0a 20 20 20 20 5c 63 20 20 20 20 69  s) {.    \c    i
33a0: 6e 74 20 69 3b 0a 20 20 20 20 5c 63 20 20 20 20  nt i;.    \c    
33b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 38 3b 20 69 2b  for(i=0; i<8; i+
33c0: 2b 29 20 7b 20 73 5b 69 5d 20 5e 3d 20 6d 5b 69  +) { s[i] ^= m[i
33d0: 5d 3b 20 6d 5b 69 5d 20 5e 3d 20 73 5b 69 2b 38  ]; m[i] ^= s[i+8
33e0: 5d 3b 20 7d 0a 20 20 20 20 5c 63 20 7d 0a 20 20  ]; }.    \c }.  
33f0: 20 20 5c 63 20 73 74 61 74 69 63 20 69 6e 6c 69    \c static inli
3400: 6e 65 20 76 6f 69 64 20 73 65 74 5f 65 6e 74 72  ne void set_entr
3410: 6f 70 79 28 75 69 6e 74 36 34 5f 74 20 2a 20 6d  opy(uint64_t * m
3420: 2c 20 75 69 6e 74 36 34 5f 74 20 2a 20 73 29 20  , uint64_t * s) 
3430: 7b 0a 20 20 20 20 5c 63 20 20 20 20 69 6e 74 20  {.    \c    int 
3440: 69 3b 0a 20 20 20 20 5c 63 20 20 20 20 66 6f 72  i;.    \c    for
3450: 28 69 3d 30 3b 20 69 3c 38 3b 20 69 2b 2b 29 20  (i=0; i<8; i++) 
3460: 7b 20 6d 5b 69 5d 20 5e 3d 20 73 5b 69 2b 38 5d  { m[i] ^= s[i+8]
3470: 3b 20 73 5b 69 5d 20 5e 3d 20 6d 5b 69 5d 3b 20  ; s[i] ^= m[i]; 
3480: 7d 0a 20 20 20 20 5c 63 20 7d 0a 20 20 20 20 5c  }.    \c }.    \
3490: 63 20 76 6f 69 64 20 72 6f 75 6e 64 73 5f 65 6e  c void rounds_en
34a0: 63 72 79 70 74 28 75 6e 73 69 67 6e 65 64 20 63  crypt(unsigned c
34b0: 68 61 72 2a 20 6d 65 73 73 61 67 65 2c 20 75 6e  har* message, un
34c0: 73 69 67 6e 65 64 20 69 6e 74 20 6e 2c 20 75 6e  signed int n, un
34d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 73 74  signed char * st
34e0: 61 74 65 73 2c 20 75 69 6e 74 36 34 5f 74 20 2a  ates, uint64_t *
34f0: 20 72 6e 64 73 29 20 7b 0a 20 20 20 20 5c 63 20   rnds) {.    \c 
3500: 69 66 28 28 6e 26 31 35 29 3e 3d 31 29 20 7b 20  if((n&15)>=1) { 
3510: 72 6f 75 6e 64 30 5f 69 6e 64 28 73 74 61 74 65  round0_ind(state
3520: 73 2c 20 72 6e 64 73 29 3b 0a 20 20 20 20 5c 63  s, rnds);.    \c
3530: 20 69 66 28 6e 26 30 78 31 30 29 20 61 64 64 5f   if(n&0x10) add_
3540: 65 6e 74 72 6f 70 79 28 28 75 69 6e 74 36 34 5f  entropy((uint64_
3550: 74 20 2a 29 28 6d 65 73 73 61 67 65 2b 36 34 2a  t *)(message+64*
3560: 30 29 2c 28 75 69 6e 74 36 34 5f 74 20 2a 29 28  0),(uint64_t *)(
3570: 73 74 61 74 65 73 29 29 3b 0a 20 20 20 20 5c 63  states));.    \c
3580: 20 7d 20 69 66 28 28 6e 26 31 35 29 3e 3d 32 29   } if((n&15)>=2)
3590: 20 7b 20 72 6f 75 6e 64 31 5f 69 6e 64 28 73 74   { round1_ind(st
35a0: 61 74 65 73 2c 20 72 6e 64 73 29 3b 0a 20 20 20  ates, rnds);.   
35b0: 20 5c 63 20 69 66 28 6e 26 30 78 31 30 29 20 61   \c if(n&0x10) a
35c0: 64 64 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e 74  dd_entropy((uint
35d0: 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67 65 2b  64_t *)(message+
35e0: 36 34 2a 31 29 2c 28 75 69 6e 74 36 34 5f 74 20  64*1),(uint64_t 
35f0: 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20 20 20  *)(states));.   
3600: 20 5c 63 20 69 66 28 6e 26 30 78 32 30 29 20 61   \c if(n&0x20) a
3610: 64 64 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e 74  dd_entropy((uint
3620: 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67 65 2b  64_t *)(message+
3630: 36 34 2a 30 29 2c 28 75 69 6e 74 36 34 5f 74 20  64*0),(uint64_t 
3640: 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20 20 20  *)(states));.   
3650: 20 5c 63 20 7d 20 69 66 28 28 6e 26 31 35 29 3e   \c } if((n&15)>
3660: 3d 33 29 20 7b 20 72 6f 75 6e 64 32 5f 69 6e 64  =3) { round2_ind
3670: 28 73 74 61 74 65 73 2c 20 72 6e 64 73 29 3b 0a  (states, rnds);.
3680: 20 20 20 20 5c 63 20 69 66 28 6e 26 30 78 31 30      \c if(n&0x10
3690: 29 20 61 64 64 5f 65 6e 74 72 6f 70 79 28 28 75  ) add_entropy((u
36a0: 69 6e 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61  int64_t *)(messa
36b0: 67 65 2b 36 34 2a 32 29 2c 28 75 69 6e 74 36 34  ge+64*2),(uint64
36c0: 5f 74 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a  _t *)(states));.
36d0: 20 20 20 20 5c 63 20 7d 20 69 66 28 28 6e 26 31      \c } if((n&1
36e0: 35 29 3e 3d 34 29 20 7b 20 72 6f 75 6e 64 33 5f  5)>=4) { round3_
36f0: 69 6e 64 28 73 74 61 74 65 73 2c 20 72 6e 64 73  ind(states, rnds
3700: 29 3b 0a 20 20 20 20 5c 63 20 69 66 28 6e 26 30  );.    \c if(n&0
3710: 78 31 30 29 20 61 64 64 5f 65 6e 74 72 6f 70 79  x10) add_entropy
3720: 28 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 6d 65  ((uint64_t *)(me
3730: 73 73 61 67 65 2b 36 34 2a 33 29 2c 28 75 69 6e  ssage+64*3),(uin
3740: 74 36 34 5f 74 20 2a 29 28 73 74 61 74 65 73 29  t64_t *)(states)
3750: 29 3b 0a 20 20 20 20 5c 63 20 69 66 28 6e 26 30  );.    \c if(n&0
3760: 78 32 30 29 20 61 64 64 5f 65 6e 74 72 6f 70 79  x20) add_entropy
3770: 28 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 6d 65  ((uint64_t *)(me
3780: 73 73 61 67 65 2b 36 34 2a 31 29 2c 28 75 69 6e  ssage+64*1),(uin
3790: 74 36 34 5f 74 20 2a 29 28 73 74 61 74 65 73 29  t64_t *)(states)
37a0: 29 3b 0a 20 20 20 20 5c 63 20 69 66 28 6e 26 30  );.    \c if(n&0
37b0: 78 34 30 29 20 61 64 64 5f 65 6e 74 72 6f 70 79  x40) add_entropy
37c0: 28 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 6d 65  ((uint64_t *)(me
37d0: 73 73 61 67 65 2b 36 34 2a 30 29 2c 28 75 69 6e  ssage+64*0),(uin
37e0: 74 36 34 5f 74 20 2a 29 28 73 74 61 74 65 73 29  t64_t *)(states)
37f0: 29 3b 0a 20 20 20 20 5c 63 20 7d 20 69 66 28 28  );.    \c } if((
3800: 6e 26 31 35 29 3e 3d 35 29 20 7b 20 72 6f 75 6e  n&15)>=5) { roun
3810: 64 34 5f 69 6e 64 28 73 74 61 74 65 73 2c 20 72  d4_ind(states, r
3820: 6e 64 73 29 3b 0a 20 20 20 20 5c 63 20 69 66 28  nds);.    \c if(
3830: 6e 26 30 78 31 30 29 20 61 64 64 5f 65 6e 74 72  n&0x10) add_entr
3840: 6f 70 79 28 28 75 69 6e 74 36 34 5f 74 20 2a 29  opy((uint64_t *)
3850: 28 6d 65 73 73 61 67 65 2b 36 34 2a 34 29 2c 28  (message+64*4),(
3860: 75 69 6e 74 36 34 5f 74 20 2a 29 28 73 74 61 74  uint64_t *)(stat
3870: 65 73 29 29 3b 0a 20 20 20 20 5c 63 20 7d 20 69  es));.    \c } i
3880: 66 28 28 6e 26 31 35 29 3e 3d 36 29 20 7b 20 72  f((n&15)>=6) { r
3890: 6f 75 6e 64 35 5f 69 6e 64 28 73 74 61 74 65 73  ound5_ind(states
38a0: 2c 20 72 6e 64 73 29 3b 0a 20 20 20 20 5c 63 20  , rnds);.    \c 
38b0: 69 66 28 6e 26 30 78 31 30 29 20 61 64 64 5f 65  if(n&0x10) add_e
38c0: 6e 74 72 6f 70 79 28 28 75 69 6e 74 36 34 5f 74  ntropy((uint64_t
38d0: 20 2a 29 28 6d 65 73 73 61 67 65 2b 36 34 2a 35   *)(message+64*5
38e0: 29 2c 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 73  ),(uint64_t *)(s
38f0: 74 61 74 65 73 29 29 3b 0a 20 20 20 20 5c 63 20  tates));.    \c 
3900: 69 66 28 6e 26 30 78 32 30 29 20 61 64 64 5f 65  if(n&0x20) add_e
3910: 6e 74 72 6f 70 79 28 28 75 69 6e 74 36 34 5f 74  ntropy((uint64_t
3920: 20 2a 29 28 6d 65 73 73 61 67 65 2b 36 34 2a 32   *)(message+64*2
3930: 29 2c 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 73  ),(uint64_t *)(s
3940: 74 61 74 65 73 29 29 3b 0a 20 20 20 20 5c 63 20  tates));.    \c 
3950: 7d 20 69 66 28 28 6e 26 31 35 29 3e 3d 37 29 20  } if((n&15)>=7) 
3960: 7b 20 72 6f 75 6e 64 36 5f 69 6e 64 28 73 74 61  { round6_ind(sta
3970: 74 65 73 2c 20 72 6e 64 73 29 3b 0a 20 20 20 20  tes, rnds);.    
3980: 5c 63 20 69 66 28 6e 26 30 78 31 30 29 20 61 64  \c if(n&0x10) ad
3990: 64 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e 74 36  d_entropy((uint6
39a0: 34 5f 74 20 2a 29 28 6d 65 73 73 61 67 65 2b 36  4_t *)(message+6
39b0: 34 2a 36 29 2c 28 75 69 6e 74 36 34 5f 74 20 2a  4*6),(uint64_t *
39c0: 29 28 73 74 61 74 65 73 29 29 3b 0a 20 20 20 20  )(states));.    
39d0: 5c 63 20 7d 20 69 66 28 28 6e 26 31 35 29 3e 3d  \c } if((n&15)>=
39e0: 38 29 20 7b 20 72 6f 75 6e 64 37 5f 69 6e 64 28  8) { round7_ind(
39f0: 73 74 61 74 65 73 2c 20 72 6e 64 73 29 3b 0a 20  states, rnds);. 
3a00: 20 20 20 5c 63 20 69 66 28 6e 26 30 78 31 30 29     \c if(n&0x10)
3a10: 20 61 64 64 5f 65 6e 74 72 6f 70 79 28 28 75 69   add_entropy((ui
3a20: 6e 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67  nt64_t *)(messag
3a30: 65 2b 36 34 2a 37 29 2c 28 75 69 6e 74 36 34 5f  e+64*7),(uint64_
3a40: 74 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20  t *)(states));. 
3a50: 20 20 20 5c 63 20 69 66 28 6e 26 30 78 32 30 29     \c if(n&0x20)
3a60: 20 61 64 64 5f 65 6e 74 72 6f 70 79 28 28 75 69   add_entropy((ui
3a70: 6e 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67  nt64_t *)(messag
3a80: 65 2b 36 34 2a 33 29 2c 28 75 69 6e 74 36 34 5f  e+64*3),(uint64_
3a90: 74 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20  t *)(states));. 
3aa0: 20 20 20 5c 63 20 69 66 28 6e 26 30 78 34 30 29     \c if(n&0x40)
3ab0: 20 61 64 64 5f 65 6e 74 72 6f 70 79 28 28 75 69   add_entropy((ui
3ac0: 6e 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67  nt64_t *)(messag
3ad0: 65 2b 36 34 2a 31 29 2c 28 75 69 6e 74 36 34 5f  e+64*1),(uint64_
3ae0: 74 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20  t *)(states));. 
3af0: 20 20 20 5c 63 20 69 66 28 6e 26 30 78 38 30 29     \c if(n&0x80)
3b00: 20 61 64 64 5f 65 6e 74 72 6f 70 79 28 28 75 69   add_entropy((ui
3b10: 6e 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67  nt64_t *)(messag
3b20: 65 2b 36 34 2a 30 29 2c 28 75 69 6e 74 36 34 5f  e+64*0),(uint64_
3b30: 74 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20  t *)(states));. 
3b40: 20 20 20 5c 63 20 7d 20 7d 0a 20 20 20 20 5c 63     \c } }.    \c
3b50: 20 76 6f 69 64 20 72 6f 75 6e 64 73 5f 64 65 63   void rounds_dec
3b60: 72 79 70 74 28 75 6e 73 69 67 6e 65 64 20 63 68  rypt(unsigned ch
3b70: 61 72 2a 20 6d 65 73 73 61 67 65 2c 20 75 6e 73  ar* message, uns
3b80: 69 67 6e 65 64 20 69 6e 74 20 6e 2c 20 75 6e 73  igned int n, uns
3b90: 69 67 6e 65 64 20 63 68 61 72 20 2a 20 73 74 61  igned char * sta
3ba0: 74 65 73 2c 20 75 69 6e 74 36 34 5f 74 20 2a 20  tes, uint64_t * 
3bb0: 72 6e 64 73 29 20 7b 0a 20 20 20 20 5c 63 20 69  rnds) {.    \c i
3bc0: 66 28 28 6e 26 31 35 29 3e 3d 31 29 20 7b 20 72  f((n&15)>=1) { r
3bd0: 6f 75 6e 64 30 5f 69 6e 64 28 73 74 61 74 65 73  ound0_ind(states
3be0: 2c 20 72 6e 64 73 29 3b 0a 20 20 20 20 5c 63 20  , rnds);.    \c 
3bf0: 69 66 28 6e 26 30 78 31 30 29 20 73 65 74 5f 65  if(n&0x10) set_e
3c00: 6e 74 72 6f 70 79 28 28 75 69 6e 74 36 34 5f 74  ntropy((uint64_t
3c10: 20 2a 29 28 6d 65 73 73 61 67 65 2b 36 34 2a 30   *)(message+64*0
3c20: 29 2c 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 73  ),(uint64_t *)(s
3c30: 74 61 74 65 73 29 29 3b 0a 20 20 20 20 5c 63 20  tates));.    \c 
3c40: 7d 20 69 66 28 28 6e 26 31 35 29 3e 3d 32 29 20  } if((n&15)>=2) 
3c50: 7b 20 72 6f 75 6e 64 31 5f 69 6e 64 28 73 74 61  { round1_ind(sta
3c60: 74 65 73 2c 20 72 6e 64 73 29 3b 0a 20 20 20 20  tes, rnds);.    
3c70: 5c 63 20 69 66 28 6e 26 30 78 31 30 29 20 73 65  \c if(n&0x10) se
3c80: 74 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e 74 36  t_entropy((uint6
3c90: 34 5f 74 20 2a 29 28 6d 65 73 73 61 67 65 2b 36  4_t *)(message+6
3ca0: 34 2a 31 29 2c 28 75 69 6e 74 36 34 5f 74 20 2a  4*1),(uint64_t *
3cb0: 29 28 73 74 61 74 65 73 29 29 3b 0a 20 20 20 20  )(states));.    
3cc0: 5c 63 20 69 66 28 6e 26 30 78 32 30 29 20 73 65  \c if(n&0x20) se
3cd0: 74 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e 74 36  t_entropy((uint6
3ce0: 34 5f 74 20 2a 29 28 6d 65 73 73 61 67 65 2b 36  4_t *)(message+6
3cf0: 34 2a 30 29 2c 28 75 69 6e 74 36 34 5f 74 20 2a  4*0),(uint64_t *
3d00: 29 28 73 74 61 74 65 73 29 29 3b 0a 20 20 20 20  )(states));.    
3d10: 5c 63 20 7d 20 69 66 28 28 6e 26 31 35 29 3e 3d  \c } if((n&15)>=
3d20: 33 29 20 7b 20 72 6f 75 6e 64 32 5f 69 6e 64 28  3) { round2_ind(
3d30: 73 74 61 74 65 73 2c 20 72 6e 64 73 29 3b 0a 20  states, rnds);. 
3d40: 20 20 20 5c 63 20 69 66 28 6e 26 30 78 31 30 29     \c if(n&0x10)
3d50: 20 73 65 74 5f 65 6e 74 72 6f 70 79 28 28 75 69   set_entropy((ui
3d60: 6e 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67  nt64_t *)(messag
3d70: 65 2b 36 34 2a 32 29 2c 28 75 69 6e 74 36 34 5f  e+64*2),(uint64_
3d80: 74 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20  t *)(states));. 
3d90: 20 20 20 5c 63 20 7d 20 69 66 28 28 6e 26 31 35     \c } if((n&15
3da0: 29 3e 3d 34 29 20 7b 20 72 6f 75 6e 64 33 5f 69  )>=4) { round3_i
3db0: 6e 64 28 73 74 61 74 65 73 2c 20 72 6e 64 73 29  nd(states, rnds)
3dc0: 3b 0a 20 20 20 20 5c 63 20 69 66 28 6e 26 30 78  ;.    \c if(n&0x
3dd0: 31 30 29 20 73 65 74 5f 65 6e 74 72 6f 70 79 28  10) set_entropy(
3de0: 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 6d 65 73  (uint64_t *)(mes
3df0: 73 61 67 65 2b 36 34 2a 33 29 2c 28 75 69 6e 74  sage+64*3),(uint
3e00: 36 34 5f 74 20 2a 29 28 73 74 61 74 65 73 29 29  64_t *)(states))
3e10: 3b 0a 20 20 20 20 5c 63 20 69 66 28 6e 26 30 78  ;.    \c if(n&0x
3e20: 32 30 29 20 73 65 74 5f 65 6e 74 72 6f 70 79 28  20) set_entropy(
3e30: 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 6d 65 73  (uint64_t *)(mes
3e40: 73 61 67 65 2b 36 34 2a 31 29 2c 28 75 69 6e 74  sage+64*1),(uint
3e50: 36 34 5f 74 20 2a 29 28 73 74 61 74 65 73 29 29  64_t *)(states))
3e60: 3b 0a 20 20 20 20 5c 63 20 69 66 28 6e 26 30 78  ;.    \c if(n&0x
3e70: 34 30 29 20 73 65 74 5f 65 6e 74 72 6f 70 79 28  40) set_entropy(
3e80: 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 6d 65 73  (uint64_t *)(mes
3e90: 73 61 67 65 2b 36 34 2a 30 29 2c 28 75 69 6e 74  sage+64*0),(uint
3ea0: 36 34 5f 74 20 2a 29 28 73 74 61 74 65 73 29 29  64_t *)(states))
3eb0: 3b 0a 20 20 20 20 5c 63 20 7d 20 69 66 28 28 6e  ;.    \c } if((n
3ec0: 26 31 35 29 3e 3d 35 29 20 7b 20 72 6f 75 6e 64  &15)>=5) { round
3ed0: 34 5f 69 6e 64 28 73 74 61 74 65 73 2c 20 72 6e  4_ind(states, rn
3ee0: 64 73 29 3b 0a 20 20 20 20 5c 63 20 69 66 28 6e  ds);.    \c if(n
3ef0: 26 30 78 31 30 29 20 73 65 74 5f 65 6e 74 72 6f  &0x10) set_entro
3f00: 70 79 28 28 75 69 6e 74 36 34 5f 74 20 2a 29 28  py((uint64_t *)(
3f10: 6d 65 73 73 61 67 65 2b 36 34 2a 34 29 2c 28 75  message+64*4),(u
3f20: 69 6e 74 36 34 5f 74 20 2a 29 28 73 74 61 74 65  int64_t *)(state
3f30: 73 29 29 3b 0a 20 20 20 20 5c 63 20 7d 20 69 66  s));.    \c } if
3f40: 28 28 6e 26 31 35 29 3e 3d 36 29 20 7b 20 72 6f  ((n&15)>=6) { ro
3f50: 75 6e 64 35 5f 69 6e 64 28 73 74 61 74 65 73 2c  und5_ind(states,
3f60: 20 72 6e 64 73 29 3b 0a 20 20 20 20 5c 63 20 69   rnds);.    \c i
3f70: 66 28 6e 26 30 78 31 30 29 20 73 65 74 5f 65 6e  f(n&0x10) set_en
3f80: 74 72 6f 70 79 28 28 75 69 6e 74 36 34 5f 74 20  tropy((uint64_t 
3f90: 2a 29 28 6d 65 73 73 61 67 65 2b 36 34 2a 35 29  *)(message+64*5)
3fa0: 2c 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 73 74  ,(uint64_t *)(st
3fb0: 61 74 65 73 29 29 3b 0a 20 20 20 20 5c 63 20 69  ates));.    \c i
3fc0: 66 28 6e 26 30 78 32 30 29 20 73 65 74 5f 65 6e  f(n&0x20) set_en
3fd0: 74 72 6f 70 79 28 28 75 69 6e 74 36 34 5f 74 20  tropy((uint64_t 
3fe0: 2a 29 28 6d 65 73 73 61 67 65 2b 36 34 2a 32 29  *)(message+64*2)
3ff0: 2c 28 75 69 6e 74 36 34 5f 74 20 2a 29 28 73 74  ,(uint64_t *)(st
4000: 61 74 65 73 29 29 3b 0a 20 20 20 20 5c 63 20 7d  ates));.    \c }
4010: 20 69 66 28 28 6e 26 31 35 29 3e 3d 37 29 20 7b   if((n&15)>=7) {
4020: 20 72 6f 75 6e 64 36 5f 69 6e 64 28 73 74 61 74   round6_ind(stat
4030: 65 73 2c 20 72 6e 64 73 29 3b 0a 20 20 20 20 5c  es, rnds);.    \
4040: 63 20 69 66 28 6e 26 30 78 31 30 29 20 73 65 74  c if(n&0x10) set
4050: 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e 74 36 34  _entropy((uint64
4060: 5f 74 20 2a 29 28 6d 65 73 73 61 67 65 2b 36 34  _t *)(message+64
4070: 2a 36 29 2c 28 75 69 6e 74 36 34 5f 74 20 2a 29  *6),(uint64_t *)
4080: 28 73 74 61 74 65 73 29 29 3b 0a 20 20 20 20 5c  (states));.    \
4090: 63 20 7d 20 69 66 28 28 6e 26 31 35 29 3e 3d 38  c } if((n&15)>=8
40a0: 29 20 7b 20 72 6f 75 6e 64 37 5f 69 6e 64 28 73  ) { round7_ind(s
40b0: 74 61 74 65 73 2c 20 72 6e 64 73 29 3b 0a 20 20  tates, rnds);.  
40c0: 20 20 5c 63 20 69 66 28 6e 26 30 78 31 30 29 20    \c if(n&0x10) 
40d0: 73 65 74 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e  set_entropy((uin
40e0: 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67 65  t64_t *)(message
40f0: 2b 36 34 2a 37 29 2c 28 75 69 6e 74 36 34 5f 74  +64*7),(uint64_t
4100: 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20 20   *)(states));.  
4110: 20 20 5c 63 20 69 66 28 6e 26 30 78 32 30 29 20    \c if(n&0x20) 
4120: 73 65 74 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e  set_entropy((uin
4130: 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67 65  t64_t *)(message
4140: 2b 36 34 2a 33 29 2c 28 75 69 6e 74 36 34 5f 74  +64*3),(uint64_t
4150: 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20 20   *)(states));.  
4160: 20 20 5c 63 20 69 66 28 6e 26 30 78 34 30 29 20    \c if(n&0x40) 
4170: 73 65 74 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e  set_entropy((uin
4180: 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67 65  t64_t *)(message
4190: 2b 36 34 2a 31 29 2c 28 75 69 6e 74 36 34 5f 74  +64*1),(uint64_t
41a0: 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20 20   *)(states));.  
41b0: 20 20 5c 63 20 69 66 28 6e 26 30 78 38 30 29 20    \c if(n&0x80) 
41c0: 73 65 74 5f 65 6e 74 72 6f 70 79 28 28 75 69 6e  set_entropy((uin
41d0: 74 36 34 5f 74 20 2a 29 28 6d 65 73 73 61 67 65  t64_t *)(message
41e0: 2b 36 34 2a 30 29 2c 28 75 69 6e 74 36 34 5f 74  +64*0),(uint64_t
41f0: 20 2a 29 28 73 74 61 74 65 73 29 29 3b 0a 20 20   *)(states));.  
4200: 20 20 5c 63 20 7d 20 7d 0a 20 20 20 20 5c 63 20    \c } }.    \c 
4210: 75 69 6e 74 36 34 5f 74 20 77 75 72 73 74 5f 68  uint64_t wurst_h
4220: 61 73 68 36 34 28 75 6e 73 69 67 6e 65 64 20 63  ash64(unsigned c
4230: 68 61 72 20 2a 20 61 64 64 72 2c 20 75 6e 73 69  har * addr, unsi
4240: 67 6e 65 64 20 69 6e 74 20 6c 65 6e 2c 0a 20 20  gned int len,.  
4250: 20 20 5c 63 20 20 20 20 20 20 20 20 20 20 20 20    \c            
4260: 20 20 20 20 20 20 20 20 20 20 20 75 69 6e 74 36             uint6
4270: 34 5f 74 20 73 74 61 72 74 76 61 6c 2c 20 75 69  4_t startval, ui
4280: 6e 74 36 34 5f 74 20 2a 20 72 6e 64 73 29 20 7b  nt64_t * rnds) {
4290: 0a 20 20 20 20 5c 63 20 20 20 75 69 6e 74 36 34  .    \c   uint64
42a0: 5f 74 20 72 65 73 75 6c 74 3d 73 74 61 72 74 76  _t result=startv
42b0: 61 6c 3b 0a 20 20 20 20 5c 63 20 20 20 75 6e 73  al;.    \c   uns
42c0: 69 67 6e 65 64 20 69 6e 74 20 69 3d 30 3b 0a 20  igned int i=0;. 
42d0: 20 20 20 5c 63 20 20 20 66 6f 72 28 69 3d 30 3b     \c   for(i=0;
42e0: 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 20   i<len; i++) {. 
42f0: 20 20 20 5c 63 20 20 20 20 20 72 65 73 75 6c 74     \c     result
4300: 20 3d 20 52 4f 4c 28 72 65 73 75 6c 74 2c 20 31   = ROL(result, 1
4310: 29 20 2b 20 72 6e 64 73 5b 61 64 64 72 5b 69 5d  ) + rnds[addr[i]
4320: 20 5e 20 28 72 65 73 75 6c 74 20 26 20 30 78 46   ^ (result & 0xF
4330: 46 29 5d 3b 0a 20 20 20 20 5c 63 20 20 20 20 20  F)];.    \c     
4340: 2f 2a 20 74 68 65 20 72 65 73 75 6c 74 20 66 65  /* the result fe
4350: 65 64 62 61 63 6b 20 6b 69 6c 6c 73 20 70 61 72  edback kills par
4360: 61 6c 6c 65 6c 69 73 6d 2c 20 62 75 74 20 6d 61  allelism, but ma
4370: 6b 65 73 20 73 75 72 65 0a 20 20 20 20 5c 63 20  kes sure.    \c 
4380: 20 20 20 20 20 20 20 74 68 65 20 68 61 73 68 20         the hash 
4390: 63 61 6e 6e 6f 74 20 65 61 73 69 6c 79 20 62 65  cannot easily be
43a0: 20 61 74 74 61 63 6b 65 64 20 2a 2f 0a 20 20 20   attacked */.   
43b0: 20 5c 63 20 20 20 7d 0a 20 20 20 20 5c 63 20 20   \c   }.    \c  
43c0: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a   return result;.
43d0: 20 20 20 20 5c 63 20 7d 0a 09 63 2d 66 75 6e 63      \c }..c-func
43e0: 74 69 6f 6e 20 28 72 6f 75 6e 64 73 2d 65 6e 63  tion (rounds-enc
43f0: 72 79 70 74 29 20 72 6f 75 6e 64 73 5f 65 6e 63  rypt) rounds_enc
4400: 72 79 70 74 20 61 20 6e 20 61 20 61 20 2d 2d 20  rypt a n a a -- 
4410: 76 6f 69 64 0a 09 63 2d 66 75 6e 63 74 69 6f 6e  void..c-function
4420: 20 28 72 6f 75 6e 64 73 2d 64 65 63 72 79 70 74   (rounds-decrypt
4430: 29 20 72 6f 75 6e 64 73 5f 64 65 63 72 79 70 74  ) rounds_decrypt
4440: 20 61 20 6e 20 61 20 61 20 2d 2d 20 76 6f 69 64   a n a a -- void
4450: 0a 09 5b 49 46 44 45 46 5d 20 36 34 62 69 74 0a  ..[IFDEF] 64bit.
4460: 09 20 20 20 20 63 2d 66 75 6e 63 74 69 6f 6e 20  .    c-function 
4470: 77 75 72 73 74 5f 68 61 73 68 36 34 20 77 75 72  wurst_hash64 wur
4480: 73 74 5f 68 61 73 68 36 34 20 61 20 6e 20 6e 20  st_hash64 a n n 
4490: 61 20 2d 2d 20 6e 0a 09 5b 45 4c 53 45 5d 0a 09  a -- n..[ELSE]..
44a0: 20 20 20 20 63 2d 66 75 6e 63 74 69 6f 6e 20 77      c-function w
44b0: 75 72 73 74 5f 68 61 73 68 36 34 20 77 75 72 73  urst_hash64 wurs
44c0: 74 5f 68 61 73 68 36 34 20 61 20 6e 20 64 20 61  t_hash64 a n d a
44d0: 20 2d 2d 20 64 0a 09 5b 54 48 45 4e 5d 0a 20 20   -- d..[THEN].  
44e0: 20 20 65 6e 64 2d 63 2d 6c 69 62 72 61 72 79 0a    end-c-library.
44f0: 20 20 20 20 55 56 61 6c 75 65 20 40 73 74 61 74      UValue @stat
4500: 65 0a 20 20 20 20 77 75 72 73 74 2d 73 6f 75 72  e.    wurst-sour
4510: 63 65 20 74 6f 20 40 73 74 61 74 65 0a 20 20 20  ce to @state.   
4520: 20 3a 20 72 6f 75 6e 64 73 2d 73 65 74 6b 65 79   : rounds-setkey
4530: 20 28 20 61 64 64 72 20 2d 2d 20 29 20 20 74 6f   ( addr -- )  to
4540: 20 40 73 74 61 74 65 20 3b 0a 20 20 20 20 3a 20   @state ;.    : 
4550: 72 6f 75 6e 64 73 2d 65 6e 63 72 79 70 74 20 28  rounds-encrypt (
4560: 20 61 64 64 72 20 75 20 2d 2d 20 29 20 40 73 74   addr u -- ) @st
4570: 61 74 65 20 27 72 6e 67 73 20 28 72 6f 75 6e 64  ate 'rngs (round
4580: 73 2d 65 6e 63 72 79 70 74 29 20 3b 0a 20 20 20  s-encrypt) ;.   
4590: 20 3a 20 72 6f 75 6e 64 73 2d 64 65 63 72 79 70   : rounds-decryp
45a0: 74 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20  t ( addr u -- ) 
45b0: 40 73 74 61 74 65 20 27 72 6e 67 73 20 28 72 6f  @state 'rngs (ro
45c0: 75 6e 64 73 2d 64 65 63 72 79 70 74 29 20 3b 0a  unds-decrypt) ;.
45d0: 20 20 20 20 3a 20 77 75 72 73 74 2d 69 6e 69 74      : wurst-init
45e0: 20 28 20 2d 2d 20 29 20 3b 0a 20 20 20 20 3a 20   ( -- ) ;.    : 
45f0: 68 61 73 68 36 34 20 28 20 61 64 64 72 20 6e 20  hash64 ( addr n 
4600: 69 6e 69 74 20 2d 2d 20 68 61 73 68 20 29 20 27  init -- hash ) '
4610: 72 6e 67 73 20 77 75 72 73 74 5f 68 61 73 68 36  rngs wurst_hash6
4620: 34 20 3b 0a 5b 45 4c 53 45 5d 0a 3a 20 72 6f 75  4 ;.[ELSE].: rou
4630: 6e 64 30 20 28 20 2d 2d 20 29 20 20 5b 20 30 20  nd0 ( -- )  [ 0 
4640: 72 6f 75 6e 64 23 20 72 6f 75 6e 64 2c 20 5d 20  round# round, ] 
4650: 3b 20 0a 3a 20 72 6f 75 6e 64 31 20 28 20 2d 2d  ; .: round1 ( --
4660: 20 29 20 20 5b 20 31 20 72 6f 75 6e 64 23 20 72   )  [ 1 round# r
4670: 6f 75 6e 64 2c 20 5d 20 3b 20 0a 3a 20 72 6f 75  ound, ] ; .: rou
4680: 6e 64 32 20 28 20 2d 2d 20 29 20 20 5b 20 32 20  nd2 ( -- )  [ 2 
4690: 72 6f 75 6e 64 23 20 72 6f 75 6e 64 2c 20 5d 20  round# round, ] 
46a0: 3b 20 0a 3a 20 72 6f 75 6e 64 33 20 28 20 2d 2d  ; .: round3 ( --
46b0: 20 29 20 20 5b 20 33 20 72 6f 75 6e 64 23 20 72   )  [ 3 round# r
46c0: 6f 75 6e 64 2c 20 5d 20 3b 20 0a 3a 20 72 6f 75  ound, ] ; .: rou
46d0: 6e 64 34 20 28 20 2d 2d 20 29 20 20 5b 20 34 20  nd4 ( -- )  [ 4 
46e0: 72 6f 75 6e 64 23 20 72 6f 75 6e 64 2c 20 5d 20  round# round, ] 
46f0: 3b 20 0a 3a 20 72 6f 75 6e 64 35 20 28 20 2d 2d  ; .: round5 ( --
4700: 20 29 20 20 5b 20 35 20 72 6f 75 6e 64 23 20 72   )  [ 5 round# r
4710: 6f 75 6e 64 2c 20 5d 20 3b 20 0a 3a 20 72 6f 75  ound, ] ; .: rou
4720: 6e 64 36 20 28 20 2d 2d 20 29 20 20 5b 20 36 20  nd6 ( -- )  [ 6 
4730: 72 6f 75 6e 64 23 20 72 6f 75 6e 64 2c 20 5d 20  round# round, ] 
4740: 3b 20 0a 3a 20 72 6f 75 6e 64 37 20 28 20 2d 2d  ; .: round7 ( --
4750: 20 29 20 20 5b 20 37 20 72 6f 75 6e 64 23 20 72   )  [ 7 round# r
4760: 6f 75 6e 64 2c 20 5d 20 3b 0a 3a 20 77 75 72 73  ound, ] ;.: wurs
4770: 74 2d 69 6e 69 74 20 3b 0a 0a 43 72 65 61 74 65  t-init ;..Create
4780: 20 27 72 6f 75 6e 64 73 0a 20 20 20 20 27 20 72   'rounds.    ' r
4790: 6f 75 6e 64 30 20 41 2c 20 27 20 72 6f 75 6e 64  ound0 A, ' round
47a0: 31 20 41 2c 20 27 20 72 6f 75 6e 64 32 20 41 2c  1 A, ' round2 A,
47b0: 20 27 20 72 6f 75 6e 64 33 20 41 2c 0a 20 20 20   ' round3 A,.   
47c0: 20 27 20 72 6f 75 6e 64 34 20 41 2c 20 27 20 72   ' round4 A, ' r
47d0: 6f 75 6e 64 35 20 41 2c 20 27 20 72 6f 75 6e 64  ound5 A, ' round
47e0: 36 20 41 2c 20 27 20 72 6f 75 6e 64 37 20 41 2c  6 A, ' round7 A,
47f0: 0a 43 72 65 61 74 65 20 27 72 6f 75 6e 64 2d 66  .Create 'round-f
4800: 6c 61 67 73 0a 20 20 20 20 24 31 30 20 2c 20 24  lags.    $10 , $
4810: 33 30 20 2c 20 24 31 30 20 2c 20 24 37 30 20 2c  30 , $10 , $70 ,
4820: 20 24 31 30 20 2c 20 24 33 30 20 2c 20 24 31 30   $10 , $30 , $10
4830: 20 2c 20 24 46 30 20 2c 0a 0a 3a 20 2b 65 6e 74   , $F0 ,..: +ent
4840: 72 6f 70 79 20 28 20 6d 65 73 73 61 67 65 20 2d  ropy ( message -
4850: 2d 20 6d 65 73 73 61 67 65 27 20 29 0a 20 20 20  - message' ).   
4860: 20 64 75 70 20 77 75 72 73 74 2d 73 6f 75 72 63   dup wurst-sourc
4870: 65 20 73 74 61 74 65 23 20 78 6f 72 73 0a 20 20  e state# xors.  
4880: 20 20 77 75 72 73 74 2d 73 74 61 74 65 20 6f 76    wurst-state ov
4890: 65 72 20 73 74 61 74 65 23 20 78 6f 72 73 0a 20  er state# xors. 
48a0: 20 20 20 73 74 61 74 65 23 20 2b 20 3b 0a 0a 3a     state# + ;..:
48b0: 20 2d 65 6e 74 72 6f 70 79 20 28 20 6d 65 73 73   -entropy ( mess
48c0: 61 67 65 20 2d 2d 20 6d 65 73 73 61 67 65 27 20  age -- message' 
48d0: 29 0a 20 20 20 20 77 75 72 73 74 2d 73 74 61 74  ).    wurst-stat
48e0: 65 20 6f 76 65 72 20 73 74 61 74 65 23 20 78 6f  e over state# xo
48f0: 72 73 0a 20 20 20 20 64 75 70 20 77 75 72 73 74  rs.    dup wurst
4900: 2d 73 6f 75 72 63 65 20 73 74 61 74 65 23 20 78  -source state# x
4910: 6f 72 73 0a 20 20 20 20 73 74 61 74 65 23 20 2b  ors.    state# +
4920: 20 3b 0a 0a 3a 20 72 6f 75 6e 64 73 2d 65 6e 63   ;..: rounds-enc
4930: 72 79 70 74 20 28 20 61 64 64 72 20 6e 20 2d 2d  rypt ( addr n --
4940: 20 29 20 20 64 75 70 20 24 46 20 61 6e 64 20 38   )  dup $F and 8
4950: 20 75 6d 69 6e 20 30 20 3f 44 4f 0a 09 27 72 6f   umin 0 ?DO..'ro
4960: 75 6e 64 73 20 49 74 68 20 65 78 65 63 75 74 65  unds Ith execute
4970: 0a 09 64 75 70 20 27 72 6f 75 6e 64 2d 66 6c 61  ..dup 'round-fla
4980: 67 73 20 49 74 68 20 61 6e 64 20 49 46 0a 09 20  gs Ith and IF.. 
4990: 20 20 20 73 77 61 70 20 2b 65 6e 74 72 6f 70 79     swap +entropy
49a0: 20 73 77 61 70 0a 09 54 48 45 4e 0a 20 20 20 20   swap..THEN.    
49b0: 4c 4f 4f 50 20 32 64 72 6f 70 20 3b 0a 0a 5c 20  LOOP 2drop ;..\ 
49c0: 3a 20 72 6f 75 6e 64 73 27 20 28 20 6e 20 2d 2d  : rounds' ( n --
49d0: 20 29 20 20 64 75 70 20 24 46 20 61 6e 64 20 38   )  dup $F and 8
49e0: 20 75 6d 69 6e 20 30 20 3f 44 4f 0a 5c 20 09 27   umin 0 ?DO.\ .'
49f0: 72 6f 75 6e 64 73 20 49 74 68 20 65 78 65 63 75  rounds Ith execu
4a00: 74 65 20 2e 73 6f 75 72 63 65 20 63 72 20 2e 73  te .source cr .s
4a10: 74 61 74 65 20 63 72 20 63 72 0a 5c 20 09 64 75  tate cr cr.\ .du
4a20: 70 20 27 72 6f 75 6e 64 2d 66 6c 61 67 73 20 49  p 'round-flags I
4a30: 74 68 20 61 6e 64 20 49 46 0a 5c 20 09 20 20 20  th and IF.\ .   
4a40: 20 73 77 61 70 20 2b 65 6e 74 72 6f 70 79 20 73   swap +entropy s
4a50: 77 61 70 0a 5c 20 09 54 48 45 4e 0a 5c 20 20 20  wap.\ .THEN.\   
4a60: 20 20 4c 4f 4f 50 20 32 64 72 6f 70 20 3b 0a 0a    LOOP 2drop ;..
4a70: 3a 20 72 6f 75 6e 64 73 2d 64 65 63 72 79 70 74  : rounds-decrypt
4a80: 20 28 20 6e 20 2d 2d 20 29 20 20 64 75 70 20 24   ( n -- )  dup $
4a90: 46 20 61 6e 64 20 38 20 75 6d 69 6e 20 30 20 3f  F and 8 umin 0 ?
4aa0: 44 4f 0a 09 27 72 6f 75 6e 64 73 20 49 74 68 20  DO..'rounds Ith 
4ab0: 65 78 65 63 75 74 65 0a 09 64 75 70 20 27 72 6f  execute..dup 'ro
4ac0: 75 6e 64 2d 66 6c 61 67 73 20 49 74 68 20 61 6e  und-flags Ith an
4ad0: 64 20 49 46 0a 09 20 20 20 20 73 77 61 70 20 2d  d IF..    swap -
4ae0: 65 6e 74 72 6f 70 79 20 73 77 61 70 0a 09 54 48  entropy swap..TH
4af0: 45 4e 0a 20 20 20 20 4c 4f 4f 50 20 32 64 72 6f  EN.    LOOP 2dro
4b00: 70 20 3b 0a 5b 54 48 45 4e 5d 0a 0a 5c 20 77 75  p ;.[THEN]..\ wu
4b10: 72 73 74 6b 65 73 73 65 6c 20 66 69 6c 65 20 66  rstkessel file f
4b20: 75 6e 63 74 69 6f 6e 73 0a 0a 30 20 56 61 6c 75  unctions..0 Valu
4b30: 65 20 77 75 72 73 74 2d 69 6e 0a 30 20 56 61 6c  e wurst-in.0 Val
4b40: 75 65 20 77 75 72 73 74 2d 6f 75 74 0a 0a 3a 20  ue wurst-out..: 
4b50: 77 75 72 73 74 2d 66 69 6c 65 20 28 20 61 64 64  wurst-file ( add
4b60: 72 20 75 20 2d 2d 20 29 20 20 20 72 2f 6f 20 6f  r u -- )   r/o o
4b70: 70 65 6e 2d 66 69 6c 65 20 74 68 72 6f 77 20 74  pen-file throw t
4b80: 6f 20 77 75 72 73 74 2d 69 6e 20 3b 0a 0a 3a 20  o wurst-in ;..: 
4b90: 73 69 7a 65 3f 20 28 20 2d 2d 20 75 64 20 29 0a  size? ( -- ud ).
4ba0: 20 20 20 20 77 75 72 73 74 2d 69 6e 20 66 69 6c      wurst-in fil
4bb0: 65 2d 73 69 7a 65 20 74 68 72 6f 77 20 3b 0a 0a  e-size throw ;..
4bc0: 3a 20 77 75 72 73 74 2d 6f 75 74 66 69 6c 65 20  : wurst-outfile 
4bd0: 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 20 77  ( addr u -- )  w
4be0: 2f 6f 20 63 72 65 61 74 65 2d 66 69 6c 65 20 74  /o create-file t
4bf0: 68 72 6f 77 20 74 6f 20 77 75 72 73 74 2d 6f 75  hrow to wurst-ou
4c00: 74 20 3b 0a 0a 3a 20 77 75 72 73 74 2d 63 6c 6f  t ;..: wurst-clo
4c10: 73 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 77 75  se ( -- ).    wu
4c20: 72 73 74 2d 69 6e 20 20 3f 64 75 70 20 49 46 20  rst-in  ?dup IF 
4c30: 20 63 6c 6f 73 65 2d 66 69 6c 65 20 30 20 74 6f   close-file 0 to
4c40: 20 77 75 72 73 74 2d 69 6e 20 20 74 68 72 6f 77   wurst-in  throw
4c50: 20 20 54 48 45 4e 0a 20 20 20 20 77 75 72 73 74    THEN.    wurst
4c60: 2d 6f 75 74 20 3f 64 75 70 20 49 46 20 20 63 6c  -out ?dup IF  cl
4c70: 6f 73 65 2d 66 69 6c 65 20 30 20 74 6f 20 77 75  ose-file 0 to wu
4c80: 72 73 74 2d 6f 75 74 20 74 68 72 6f 77 20 20 54  rst-out throw  T
4c90: 48 45 4e 20 3b 0a 0a 5c 20 77 75 72 73 74 6b 65  HEN ;..\ wurstke
4ca0: 73 73 65 6c 20 68 61 73 68 0a 0a 3a 20 68 61 73  ssel hash..: has
4cb0: 68 2d 69 6e 69 74 20 28 20 73 6f 75 72 63 65 20  h-init ( source 
4cc0: 73 74 61 74 65 20 2d 2d 20 29 20 73 77 61 70 0a  state -- ) swap.
4cd0: 20 20 20 20 77 75 72 73 74 2d 73 6f 75 72 63 65      wurst-source
4ce0: 20 73 74 61 74 65 23 20 6d 6f 76 65 0a 20 20 20   state# move.   
4cf0: 20 77 75 72 73 74 2d 73 74 61 74 65 20 20 73 74   wurst-state  st
4d00: 61 74 65 23 20 6d 6f 76 65 20 3b 0a 0a 3a 20 77  ate# move ;..: w
4d10: 75 72 73 74 2d 73 69 7a 65 20 28 20 2d 2d 20 29  urst-size ( -- )
4d20: 0a 20 20 20 20 5b 20 63 65 6c 6c 20 34 20 3d 20  .    [ cell 4 = 
4d30: 5d 20 5b 49 46 5d 0a 09 73 69 7a 65 3f 20 20 20  ] [IF]..size?   
4d40: 20 20 20 6d 65 73 73 61 67 65 20 36 34 21 20 20     message 64!  
4d50: 30 2e 20 6d 65 73 73 61 67 65 20 31 20 36 34 73  0. message 1 64s
4d60: 20 2b 20 36 34 21 0a 20 20 20 20 5b 45 4c 53 45   + 64!.    [ELSE
4d70: 5d 0a 09 73 69 7a 65 3f 20 64 72 6f 70 20 6d 65  ]..size? drop me
4d80: 73 73 61 67 65 20 36 34 21 20 20 30 20 20 6d 65  ssage 64!  0  me
4d90: 73 73 61 67 65 20 31 20 36 34 73 20 2b 20 36 34  ssage 1 64s + 64
4da0: 21 0a 20 20 20 20 5b 54 48 45 4e 5d 20 3b 0a 0a  !.    [THEN] ;..
4db0: 3a 20 3e 72 65 61 64 73 20 28 20 66 6c 61 67 73  : >reads ( flags
4dc0: 20 2d 2d 20 6e 20 29 20 20 64 75 70 20 24 46 20   -- n )  dup $F 
4dd0: 61 6e 64 20 73 77 61 70 20 34 20 72 73 68 69 66  and swap 4 rshif
4de0: 74 20 2f 20 3b 0a 0a 3a 20 65 6e 63 72 79 70 74  t / ;..: encrypt
4df0: 2d 72 65 61 64 20 28 20 66 6c 61 67 73 20 2d 2d  -read ( flags --
4e00: 20 6e 20 29 20 20 3e 72 65 61 64 73 20 3e 72 0a   n )  >reads >r.
4e10: 20 20 20 20 6d 65 73 73 61 67 65 20 73 74 61 74      message stat
4e20: 65 23 20 72 3e 20 2a 20 32 64 75 70 20 65 72 61  e# r> * 2dup era
4e30: 73 65 20 20 77 75 72 73 74 2d 69 6e 20 72 65 61  se  wurst-in rea
4e40: 64 2d 66 69 6c 65 20 74 68 72 6f 77 20 3b 0a 3a  d-file throw ;.:
4e50: 20 72 65 61 64 2d 66 69 72 73 74 20 28 20 66 6c   read-first ( fl
4e60: 61 67 73 20 2d 2d 20 6e 20 29 20 20 77 75 72 73  ags -- n )  wurs
4e70: 74 2d 73 69 7a 65 20 20 3e 72 65 61 64 73 20 3e  t-size  >reads >
4e80: 72 0a 20 20 20 20 6d 65 73 73 61 67 65 20 73 74  r.    message st
4e90: 61 74 65 23 20 72 3e 20 2a 20 32 20 36 34 73 20  ate# r> * 2 64s 
4ea0: 2f 73 74 72 69 6e 67 20 77 75 72 73 74 2d 69 6e  /string wurst-in
4eb0: 20 72 65 61 64 2d 66 69 6c 65 20 74 68 72 6f 77   read-file throw
4ec0: 20 20 32 20 36 34 73 20 2b 20 3b 0a 0a 3a 20 77    2 64s + ;..: w
4ed0: 75 72 73 74 2d 68 61 73 68 20 28 20 73 6f 75 72  urst-hash ( sour
4ee0: 63 65 20 73 74 61 74 65 20 66 69 6e 61 6c 2d 72  ce state final-r
4ef0: 6f 75 6e 64 73 20 72 6f 75 6e 64 73 20 2d 2d 20  ounds rounds -- 
4f00: 29 0a 20 20 20 20 32 73 77 61 70 20 68 61 73 68  ).    2swap hash
4f10: 2d 69 6e 69 74 20 64 75 70 20 72 65 61 64 2d 66  -init dup read-f
4f20: 69 72 73 74 0a 20 20 20 20 42 45 47 49 4e 20 20  irst.    BEGIN  
4f30: 30 3e 20 20 57 48 49 4c 45 0a 09 20 20 20 20 6d  0>  WHILE..    m
4f40: 65 73 73 61 67 65 20 6f 76 65 72 20 72 6f 75 6e  essage over roun
4f50: 64 73 2d 65 6e 63 72 79 70 74 0a 09 20 20 20 20  ds-encrypt..    
4f60: 64 75 70 20 65 6e 63 72 79 70 74 2d 72 65 61 64  dup encrypt-read
4f70: 0a 20 20 20 20 52 45 50 45 41 54 0a 20 20 20 20  .    REPEAT.    
4f80: 64 72 6f 70 20 6d 65 73 73 61 67 65 20 73 77 61  drop message swa
4f90: 70 20 72 6f 75 6e 64 73 2d 65 6e 63 72 79 70 74  p rounds-encrypt
4fa0: 20 2e 73 6f 75 72 63 65 20 77 75 72 73 74 2d 63   .source wurst-c
4fb0: 6c 6f 73 65 20 3b 0a 0a 5c 20 70 61 64 64 69 6e  lose ;..\ paddin
4fc0: 67 0a 0a 3a 20 3e 70 61 64 20 28 20 61 64 64 72  g..: >pad ( addr
4fd0: 20 75 20 75 32 20 2d 2d 20 61 64 64 72 20 75 32   u u2 -- addr u2
4fe0: 20 29 0a 20 20 20 20 73 77 61 70 20 3e 72 20 32   ).    swap >r 2
4ff0: 64 75 70 20 72 40 20 2f 73 74 72 69 6e 67 20 72  dup r@ /string r
5000: 3e 20 66 69 6c 6c 20 3b 0a 3a 20 3e 75 6e 70 61  > fill ;.: >unpa
5010: 64 20 28 20 61 64 64 72 20 75 27 20 2d 2d 20 61  d ( addr u' -- a
5020: 64 64 72 20 75 20 29 20 6f 76 65 72 20 2b 20 31  ddr u ) over + 1
5030: 2d 20 63 40 20 3b 0a 3a 20 3f 70 61 64 64 65 64  - c@ ;.: ?padded
5040: 20 28 20 61 64 64 72 20 75 27 20 2d 2d 20 66 6c   ( addr u' -- fl
5050: 61 67 20 29 0a 20 20 20 20 32 64 75 70 20 2b 20  ag ).    2dup + 
5060: 31 2d 20 63 40 20 64 75 70 20 3e 72 20 2f 73 74  1- c@ dup >r /st
5070: 72 69 6e 67 20 72 3e 20 73 6b 69 70 20 6e 69 70  ring r> skip nip
5080: 20 30 3d 20 3b 0a 0a 5c 20 77 75 72 73 74 6b 65   0= ;..\ wurstke
5090: 73 73 65 6c 20 65 6e 63 72 79 70 74 69 6f 6e 0a  ssel encryption.
50a0: 0a 3a 20 6d 65 73 73 61 67 65 3e 20 28 20 66 6c  .: message> ( fl
50b0: 61 67 73 20 2d 2d 20 29 20 3e 72 65 61 64 73 0a  ags -- ) >reads.
50c0: 20 20 20 20 6d 65 73 73 61 67 65 20 73 77 61 70      message swap
50d0: 20 73 74 61 74 65 23 20 2a 20 77 75 72 73 74 2d   state# * wurst-
50e0: 6f 75 74 20 77 72 69 74 65 2d 66 69 6c 65 20 74  out write-file t
50f0: 68 72 6f 77 20 3b 0a 0a 3a 20 65 6e 63 72 79 70  hrow ;..: encryp
5100: 74 2d 69 6e 69 74 20 28 20 6b 65 79 20 73 61 6c  t-init ( key sal
5110: 74 20 2d 2d 20 29 20 20 73 77 61 70 0a 20 20 20  t -- )  swap.   
5120: 20 77 75 72 73 74 2d 73 74 61 74 65 20 20 73 74   wurst-state  st
5130: 61 74 65 23 20 6d 6f 76 65 0a 20 20 20 20 77 75  ate# move.    wu
5140: 72 73 74 2d 73 6f 75 72 63 65 20 73 74 61 74 65  rst-source state
5150: 23 20 6d 6f 76 65 0a 20 20 20 20 77 75 72 73 74  # move.    wurst
5160: 2d 73 6f 75 72 63 65 20 73 74 61 74 65 23 20 77  -source state# w
5170: 75 72 73 74 2d 6f 75 74 20 77 72 69 74 65 2d 66  urst-out write-f
5180: 69 6c 65 20 74 68 72 6f 77 20 3b 0a 0a 3a 20 77  ile throw ;..: w
5190: 75 72 73 74 2d 65 6e 63 72 79 70 74 20 28 20 6b  urst-encrypt ( k
51a0: 65 79 20 73 61 6c 74 20 66 69 72 73 74 2d 72 6f  ey salt first-ro
51b0: 75 6e 64 73 20 72 6f 75 6e 64 73 20 2d 2d 20 29  unds rounds -- )
51c0: 0a 20 20 20 20 3e 72 20 3e 72 20 65 6e 63 72 79  .    >r >r encry
51d0: 70 74 2d 69 6e 69 74 0a 20 20 20 20 6d 65 73 73  pt-init.    mess
51e0: 61 67 65 20 72 3e 20 72 6f 75 6e 64 73 2d 65 6e  age r> rounds-en
51f0: 63 72 79 70 74 20 20 72 40 20 72 65 61 64 2d 66  crypt  r@ read-f
5200: 69 72 73 74 0a 20 20 20 20 42 45 47 49 4e 20 20  irst.    BEGIN  
5210: 30 3e 20 20 57 48 49 4c 45 0a 09 20 20 20 20 6d  0>  WHILE..    m
5220: 65 73 73 61 67 65 20 72 40 20 72 6f 75 6e 64 73  essage r@ rounds
5230: 2d 65 6e 63 72 79 70 74 20 20 72 40 20 6d 65 73  -encrypt  r@ mes
5240: 73 61 67 65 3e 0a 09 20 20 20 20 72 40 20 65 6e  sage>..    r@ en
5250: 63 72 79 70 74 2d 72 65 61 64 20 20 52 45 50 45  crypt-read  REPE
5260: 41 54 0a 20 20 20 20 72 64 72 6f 70 20 77 75 72  AT.    rdrop wur
5270: 73 74 2d 63 6c 6f 73 65 20 3b 0a 0a 3a 20 64 65  st-close ;..: de
5280: 63 72 79 70 74 2d 69 6e 69 74 20 28 20 6b 65 79  crypt-init ( key
5290: 20 2d 2d 20 29 0a 20 20 20 20 77 75 72 73 74 2d   -- ).    wurst-
52a0: 73 74 61 74 65 20 20 73 74 61 74 65 23 20 6d 6f  state  state# mo
52b0: 76 65 0a 20 20 20 20 77 75 72 73 74 2d 73 6f 75  ve.    wurst-sou
52c0: 72 63 65 20 73 74 61 74 65 23 20 77 75 72 73 74  rce state# wurst
52d0: 2d 69 6e 20 72 65 61 64 2d 66 69 6c 65 20 74 68  -in read-file th
52e0: 72 6f 77 20 64 72 6f 70 20 3b 0a 0a 32 56 61 72  row drop ;..2Var
52f0: 69 61 62 6c 65 20 77 75 72 73 74 2d 6f 75 74 73  iable wurst-outs
5300: 69 7a 65 0a 0a 3a 20 6f 75 74 2d 20 28 20 6e 20  ize..: out- ( n 
5310: 2d 2d 20 6e 27 20 29 0a 20 20 20 20 30 20 77 75  -- n' ).    0 wu
5320: 72 73 74 2d 6f 75 74 73 69 7a 65 20 32 40 20 64  rst-outsize 2@ d
5330: 6d 69 6e 20 77 75 72 73 74 2d 6f 75 74 73 69 7a  min wurst-outsiz
5340: 65 20 32 40 20 32 6f 76 65 72 20 64 2d 20 77 75  e 2@ 2over d- wu
5350: 72 73 74 2d 6f 75 74 73 69 7a 65 20 32 21 20 64  rst-outsize 2! d
5360: 72 6f 70 20 3b 0a 0a 3a 20 2e 78 6f 72 6d 73 67  rop ;..: .xormsg
5370: 2d 73 69 7a 65 20 28 20 66 6c 61 67 73 20 2d 2d  -size ( flags --
5380: 20 29 20 20 3e 72 65 61 64 73 0a 20 20 20 20 6d   )  >reads.    m
5390: 65 73 73 61 67 65 20 36 34 40 20 5b 20 63 65 6c  essage 64@ [ cel
53a0: 6c 20 38 20 3d 20 5d 20 5b 49 46 5d 20 30 20 5b  l 8 = ] [IF] 0 [
53b0: 54 48 45 4e 5d 20 77 75 72 73 74 2d 6f 75 74 73  THEN] wurst-outs
53c0: 69 7a 65 20 32 21 0a 20 20 20 20 6d 65 73 73 61  ize 2!.    messa
53d0: 67 65 20 73 77 61 70 20 73 74 61 74 65 23 20 2a  ge swap state# *
53e0: 20 32 20 36 34 73 20 2f 73 74 72 69 6e 67 20 6f   2 64s /string o
53f0: 75 74 2d 0a 20 20 20 20 77 75 72 73 74 2d 6f 75  ut-.    wurst-ou
5400: 74 20 77 72 69 74 65 2d 66 69 6c 65 20 74 68 72  t write-file thr
5410: 6f 77 20 3b 0a 0a 3a 20 6d 65 73 73 61 67 65 3e  ow ;..: message>
5420: 27 20 28 20 66 6c 61 67 73 20 2d 2d 20 29 20 3e  ' ( flags -- ) >
5430: 72 65 61 64 73 0a 20 20 20 20 6d 65 73 73 61 67  reads.    messag
5440: 65 20 73 77 61 70 20 73 74 61 74 65 23 20 2a 20  e swap state# * 
5450: 6f 75 74 2d 20 77 75 72 73 74 2d 6f 75 74 20 77  out- wurst-out w
5460: 72 69 74 65 2d 66 69 6c 65 20 74 68 72 6f 77 20  rite-file throw 
5470: 3b 0a 0a 3a 20 77 75 72 73 74 2d 64 65 63 72 79  ;..: wurst-decry
5480: 70 74 20 28 20 66 69 72 73 74 2d 72 6f 75 6e 64  pt ( first-round
5490: 73 20 72 6f 75 6e 64 73 20 2d 2d 20 29 0a 20 20  s rounds -- ).  
54a0: 20 20 3e 72 20 3e 72 20 64 65 63 72 79 70 74 2d    >r >r decrypt-
54b0: 69 6e 69 74 0a 20 20 20 20 6d 65 73 73 61 67 65  init.    message
54c0: 20 72 3e 20 72 6f 75 6e 64 73 2d 65 6e 63 72 79   r> rounds-encry
54d0: 70 74 0a 20 20 20 20 72 40 20 65 6e 63 72 79 70  pt.    r@ encryp
54e0: 74 2d 72 65 61 64 20 6d 65 73 73 61 67 65 20 72  t-read message r
54f0: 40 20 72 6f 75 6e 64 73 2d 64 65 63 72 79 70 74  @ rounds-decrypt
5500: 20 72 40 20 2e 78 6f 72 6d 73 67 2d 73 69 7a 65   r@ .xormsg-size
5510: 0a 20 20 20 20 42 45 47 49 4e 20 20 30 3e 20 20  .    BEGIN  0>  
5520: 57 48 49 4c 45 0a 09 20 20 20 20 72 40 20 65 6e  WHILE..    r@ en
5530: 63 72 79 70 74 2d 72 65 61 64 0a 09 20 20 20 20  crypt-read..    
5540: 6d 65 73 73 61 67 65 20 72 40 20 72 6f 75 6e 64  message r@ round
5550: 73 2d 64 65 63 72 79 70 74 20 20 72 40 20 6d 65  s-decrypt  r@ me
5560: 73 73 61 67 65 3e 27 0a 20 20 20 20 52 45 50 45  ssage>'.    REPE
5570: 41 54 0a 20 20 20 20 72 64 72 6f 70 20 20 77 75  AT.    rdrop  wu
5580: 72 73 74 2d 63 6c 6f 73 65 20 3b 0a 0a 5c 20 62  rst-close ;..\ b
5590: 65 6e 63 68 6d 61 72 6b 20 74 6f 20 65 76 61 6c  enchmark to eval
55a0: 75 61 74 65 20 71 75 61 6c 69 74 79 20 6f 66 20  uate quality of 
55b0: 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 63 6f 64  the compiled cod
55c0: 65 0a 0a 24 31 38 20 56 61 6c 75 65 20 72 6f 75  e..$18 Value rou
55d0: 6e 64 73 68 23 0a 24 32 38 20 56 61 6c 75 65 20  ndsh#.$28 Value 
55e0: 72 6f 75 6e 64 73 23 0a 34 20 56 61 6c 75 65 20  rounds#.4 Value 
55f0: 72 6f 75 6e 64 73 65 23 0a 0a 3a 20 77 75 72 73  roundse#..: wurs
5600: 74 2d 62 65 6e 63 68 20 28 20 6e 20 2d 2d 20 29  t-bench ( n -- )
5610: 20 3e 72 20 63 70 75 74 69 6d 65 20 64 2b 0a 20   >r cputime d+. 
5620: 20 20 20 72 40 20 30 20 3f 44 4f 20 20 6d 65 73     r@ 0 ?DO  mes
5630: 73 61 67 65 20 72 6f 75 6e 64 73 23 20 72 6f 75  sage rounds# rou
5640: 6e 64 73 2d 65 6e 63 72 79 70 74 20 20 4c 4f 4f  nds-encrypt  LOO
5650: 50 20 20 63 70 75 74 69 6d 65 20 64 2b 20 64 2d  P  cputime d+ d-
5660: 20 64 3e 66 20 2d 31 65 2d 36 20 66 2a 0a 20 20   d>f -1e-6 f*.  
5670: 20 20 31 2f 66 20 32 35 36 65 20 72 3e 20 66 6d    1/f 256e r> fm
5680: 2a 20 66 2a 20 31 30 32 34 65 20 66 64 75 70 20  * f* 1024e fdup 
5690: 66 2a 20 66 2f 20 66 2e 20 2e 22 20 4d 42 2f 73  f* f/ f. ." MB/s
56a0: 22 20 3b 0a 0a 3a 20 6d 65 6d 2d 72 6f 75 6e 64  " ;..: mem-round
56b0: 73 23 20 28 20 73 69 7a 65 20 2d 2d 20 6e 20 29  s# ( size -- n )
56c0: 0a 20 20 20 20 63 61 73 65 0a 09 73 74 61 74 65  .    case..state
56d0: 23 20 6f 66 20 20 24 32 32 20 20 65 6e 64 6f 66  # of  $22  endof
56e0: 0a 09 73 74 61 74 65 23 20 32 2a 20 6f 66 20 20  ..state# 2* of  
56f0: 24 32 34 20 20 65 6e 64 6f 66 0a 09 24 32 38 20  $24  endof..$28 
5700: 73 77 61 70 0a 20 20 20 20 65 6e 64 63 61 73 65  swap.    endcase
5710: 20 3b 0a 0a 5c 20 4f 4f 50 20 63 72 79 70 74 6f   ;..\ OOP crypto
5720: 20 61 70 69 20 63 6c 61 73 73 0a 0a 3a 20 77 75   api class..: wu
5730: 72 73 74 2d 63 72 63 20 28 20 2d 2d 20 78 64 20  rst-crc ( -- xd 
5740: 29 0a 20 20 20 20 6d 65 73 73 61 67 65 20 72 6f  ).    message ro
5750: 75 6e 64 73 65 23 20 72 6f 75 6e 64 73 2d 65 6e  undse# rounds-en
5760: 63 72 79 70 74 20 5c 20 61 6e 6f 74 68 65 72 20  crypt \ another 
5770: 6b 65 79 20 64 69 66 66 75 73 69 6f 6e 20 72 6f  key diffusion ro
5780: 75 6e 64 0a 20 20 20 20 40 73 74 61 74 65 20 31  und.    @state 1
5790: 32 38 40 20 3b 0a 0a 3a 20 77 75 72 73 74 2d 74  28@ ;..: wurst-t
57a0: 61 73 6b 2d 69 6e 69 74 20 28 20 2d 2d 20 29 0a  ask-init ( -- ).
57b0: 20 20 20 20 63 72 79 70 74 6f 2d 6f 20 40 20 49      crypto-o @ I
57c0: 46 20 20 77 75 72 73 74 2d 75 70 20 40 20 6e 65  F  wurst-up @ ne
57d0: 78 74 2d 74 61 73 6b 20 3d 20 3f 45 58 49 54 20  xt-task = ?EXIT 
57e0: 20 54 48 45 4e 0a 20 20 20 20 77 75 72 73 74 6b   THEN.    wurstk
57f0: 65 73 73 65 6c 20 6e 65 77 20 63 72 79 70 74 6f  essel new crypto
5800: 2d 6f 20 21 20 6e 65 78 74 2d 74 61 73 6b 20 77  -o ! next-task w
5810: 75 72 73 74 2d 75 70 20 21 0a 20 20 20 20 77 75  urst-up !.    wu
5820: 72 73 74 2d 73 6f 75 72 63 65 20 72 6f 75 6e 64  rst-source round
5830: 73 2d 73 65 74 6b 65 79 20 3b 0a 0a 27 20 77 75  s-setkey ;..' wu
5840: 72 73 74 2d 74 61 73 6b 2d 69 6e 69 74 20 77 75  rst-task-init wu
5850: 72 73 74 6b 65 73 73 65 6c 20 74 6f 20 63 3a 69  rstkessel to c:i
5860: 6e 69 74 0a 3a 6e 6f 6e 61 6d 65 20 74 6f 20 40  nit.:noname to @
5870: 73 74 61 74 65 20 3b 20 77 75 72 73 74 6b 65 73  state ; wurstkes
5880: 73 65 6c 20 74 6f 20 63 3a 6b 65 79 21 0a 27 20  sel to c:key!.' 
5890: 40 73 74 61 74 65 20 77 75 72 73 74 6b 65 73 73  @state wurstkess
58a0: 65 6c 20 74 6f 20 63 3a 6b 65 79 40 0a 73 74 61  el to c:key@.sta
58b0: 74 65 23 20 32 2a 20 43 6f 6e 73 74 61 6e 74 20  te# 2* Constant 
58c0: 77 75 72 73 74 2d 6b 65 79 23 20 27 20 77 75 72  wurst-key# ' wur
58d0: 73 74 2d 6b 65 79 23 20 77 75 72 73 74 6b 65 73  st-key# wurstkes
58e0: 73 65 6c 20 74 6f 20 63 3a 6b 65 79 23 0a 3a 6e  sel to c:key#.:n
58f0: 6f 6e 61 6d 65 20 28 20 61 64 64 72 20 2d 2d 20  oname ( addr -- 
5900: 29 0a 20 20 20 20 40 73 74 61 74 65 20 73 77 61  ).    @state swa
5910: 70 20 73 74 61 74 65 23 20 32 2a 20 6d 6f 76 65  p state# 2* move
5920: 20 3b 20 77 75 72 73 74 6b 65 73 73 65 6c 20 74   ; wurstkessel t
5930: 6f 20 63 3a 6b 65 79 3e 0a 3a 6e 6f 6e 61 6d 65  o c:key>.:noname
5940: 20 28 20 61 64 64 72 20 2d 2d 20 29 0a 20 20 20   ( addr -- ).   
5950: 20 77 75 72 73 74 2d 73 6f 75 72 63 65 20 73 74   wurst-source st
5960: 61 74 65 23 20 32 2a 20 6d 6f 76 65 20 3b 20 77  ate# 2* move ; w
5970: 75 72 73 74 6b 65 73 73 65 6c 20 74 6f 20 3e 63  urstkessel to >c
5980: 3a 6b 65 79 0a 3a 6e 6f 6e 61 6d 65 20 28 20 2d  :key.:noname ( -
5990: 2d 20 29 0a 20 20 20 20 6d 65 73 73 61 67 65 20  - ).    message 
59a0: 72 6f 75 6e 64 73 65 23 20 72 6f 75 6e 64 73 2d  roundse# rounds-
59b0: 65 6e 63 72 79 70 74 20 3b 20 77 75 72 73 74 6b  encrypt ; wurstk
59c0: 65 73 73 65 6c 20 74 6f 20 63 3a 64 69 66 66 75  essel to c:diffu
59d0: 73 65 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61 64 64  se.:noname ( add
59e0: 72 20 75 20 2d 2d 20 29 20 64 75 70 20 6d 65 6d  r u -- ) dup mem
59f0: 2d 72 6f 75 6e 64 73 23 0a 20 20 20 20 64 75 70  -rounds#.    dup
5a00: 20 3e 72 65 61 64 73 20 73 74 61 74 65 23 20 2a   >reads state# *
5a10: 20 7b 20 72 6e 64 20 72 65 61 64 73 20 7d 0a 20   { rnd reads }. 
5a20: 20 20 20 42 45 47 49 4e 20 20 64 75 70 20 30 3e     BEGIN  dup 0>
5a30: 20 20 57 48 49 4c 45 0a 09 20 20 20 20 6f 76 65    WHILE..    ove
5a40: 72 20 72 6e 64 20 72 6f 75 6e 64 73 2d 65 6e 63  r rnd rounds-enc
5a50: 72 79 70 74 20 20 72 65 61 64 73 20 2f 73 74 72  rypt  reads /str
5a60: 69 6e 67 0a 20 20 20 20 52 45 50 45 41 54 20 32  ing.    REPEAT 2
5a70: 64 72 6f 70 20 3b 20 77 75 72 73 74 6b 65 73 73  drop ; wurstkess
5a80: 65 6c 20 74 6f 20 63 3a 65 6e 63 72 79 70 74 0a  el to c:encrypt.
5a90: 3a 6e 6f 6e 61 6d 65 20 28 20 61 64 64 72 20 75  :noname ( addr u
5aa0: 20 2d 2d 20 29 20 64 75 70 20 6d 65 6d 2d 72 6f   -- ) dup mem-ro
5ab0: 75 6e 64 73 23 0a 20 20 20 20 64 75 70 20 3e 72  unds#.    dup >r
5ac0: 65 61 64 73 20 73 74 61 74 65 23 20 2a 20 7b 20  eads state# * { 
5ad0: 72 6e 64 20 72 65 61 64 73 20 7d 0a 20 20 20 20  rnd reads }.    
5ae0: 42 45 47 49 4e 20 20 64 75 70 20 30 3e 20 20 57  BEGIN  dup 0>  W
5af0: 48 49 4c 45 0a 09 20 20 20 20 6f 76 65 72 20 72  HILE..    over r
5b00: 6e 64 20 72 6f 75 6e 64 73 2d 64 65 63 72 79 70  nd rounds-decryp
5b10: 74 20 20 72 65 61 64 73 20 2f 73 74 72 69 6e 67  t  reads /string
5b20: 0a 20 20 20 20 52 45 50 45 41 54 20 32 64 72 6f  .    REPEAT 2dro
5b30: 70 20 3b 20 77 75 72 73 74 6b 65 73 73 65 6c 20  p ; wurstkessel 
5b40: 74 6f 20 63 3a 64 65 63 72 79 70 74 0a 3a 6e 6f  to c:decrypt.:no
5b50: 6e 61 6d 65 20 28 20 61 64 64 72 20 75 20 2d 2d  name ( addr u --
5b60: 20 29 20 64 75 70 20 6d 65 6d 2d 72 6f 75 6e 64   ) dup mem-round
5b70: 73 23 0a 20 20 20 20 64 75 70 20 3e 72 65 61 64  s#.    dup >read
5b80: 73 20 73 74 61 74 65 23 20 2a 20 7b 20 72 6e 64  s state# * { rnd
5b90: 20 72 65 61 64 73 20 7d 0a 20 20 20 20 42 45 47   reads }.    BEG
5ba0: 49 4e 20 20 64 75 70 20 30 3e 20 20 57 48 49 4c  IN  dup 0>  WHIL
5bb0: 45 0a 09 20 20 20 20 6f 76 65 72 20 72 6e 64 20  E..    over rnd 
5bc0: 72 6f 75 6e 64 73 2d 65 6e 63 72 79 70 74 20 20  rounds-encrypt  
5bd0: 72 65 61 64 73 20 2f 73 74 72 69 6e 67 0a 20 20  reads /string.  
5be0: 20 20 52 45 50 45 41 54 20 64 72 6f 70 20 3e 72    REPEAT drop >r
5bf0: 20 77 75 72 73 74 2d 63 72 63 20 72 3e 20 31 32   wurst-crc r> 12
5c00: 38 21 20 3b 20 77 75 72 73 74 6b 65 73 73 65 6c  8! ; wurstkessel
5c10: 20 74 6f 20 63 3a 65 6e 63 72 79 70 74 2b 61 75   to c:encrypt+au
5c20: 74 68 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61 64 64  th.:noname ( add
5c30: 72 20 75 20 2d 2d 20 29 20 64 75 70 20 6d 65 6d  r u -- ) dup mem
5c40: 2d 72 6f 75 6e 64 73 23 0a 20 20 20 20 64 75 70  -rounds#.    dup
5c50: 20 3e 72 65 61 64 73 20 73 74 61 74 65 23 20 2a   >reads state# *
5c60: 20 7b 20 72 6e 64 20 72 65 61 64 73 20 7d 0a 20   { rnd reads }. 
5c70: 20 20 20 42 45 47 49 4e 20 20 64 75 70 20 30 3e     BEGIN  dup 0>
5c80: 20 20 57 48 49 4c 45 0a 09 20 20 20 20 6f 76 65    WHILE..    ove
5c90: 72 20 72 6e 64 20 72 6f 75 6e 64 73 2d 64 65 63  r rnd rounds-dec
5ca0: 72 79 70 74 20 20 72 65 61 64 73 20 2f 73 74 72  rypt  reads /str
5cb0: 69 6e 67 0a 20 20 20 20 52 45 50 45 41 54 20 64  ing.    REPEAT d
5cc0: 72 6f 70 20 31 32 38 40 20 77 75 72 73 74 2d 63  rop 128@ wurst-c
5cd0: 72 63 20 31 32 38 3d 20 3b 20 77 75 72 73 74 6b  rc 128= ; wurstk
5ce0: 65 73 73 65 6c 20 74 6f 20 63 3a 64 65 63 72 79  essel to c:decry
5cf0: 70 74 2b 61 75 74 68 0a 3a 6e 6f 6e 61 6d 65 20  pt+auth.:noname 
5d00: 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 64 75  ( addr u -- ) du
5d10: 70 20 6d 65 6d 2d 72 6f 75 6e 64 73 23 0a 20 20  p mem-rounds#.  
5d20: 20 20 64 75 70 20 3e 72 65 61 64 73 20 73 74 61    dup >reads sta
5d30: 74 65 23 20 2a 20 7b 20 72 6e 64 20 72 65 61 64  te# * { rnd read
5d40: 73 20 7d 0a 20 20 20 20 42 45 47 49 4e 20 20 64  s }.    BEGIN  d
5d50: 75 70 20 30 3e 20 20 57 48 49 4c 45 0a 09 20 20  up 0>  WHILE..  
5d60: 20 20 6f 76 65 72 20 72 6e 64 20 72 6f 75 6e 64    over rnd round
5d70: 73 2d 65 6e 63 72 79 70 74 20 20 72 65 61 64 73  s-encrypt  reads
5d80: 20 2f 73 74 72 69 6e 67 0a 20 20 20 20 52 45 50   /string.    REP
5d90: 45 41 54 20 64 72 6f 70 20 72 6f 75 6e 64 73 65  EAT drop roundse
5da0: 23 20 72 6f 75 6e 64 73 2d 65 6e 63 72 79 70 74  # rounds-encrypt
5db0: 20 3b 20 77 75 72 73 74 6b 65 73 73 65 6c 20 74   ; wurstkessel t
5dc0: 6f 20 63 3a 68 61 73 68 0a 3a 6e 6f 6e 61 6d 65  o c:hash.:noname
5dd0: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 20   ( addr u -- )  
5de0: 32 64 75 70 20 65 72 61 73 65 20 63 3a 65 6e 63  2dup erase c:enc
5df0: 72 79 70 74 20 3b 20 77 75 72 73 74 6b 65 73 73  rypt ; wurstkess
5e00: 65 6c 20 74 6f 20 63 3a 70 72 6e 67 0a 27 20 77  el to c:prng.' w
5e10: 75 72 73 74 2d 63 72 63 20 77 75 72 73 74 6b 65  urst-crc wurstke
5e20: 73 73 65 6c 20 74 6f 20 63 3a 63 68 65 63 6b 73  ssel to c:checks
5e30: 75 6d 0a 3a 6e 6f 6e 61 6d 65 20 28 20 2d 2d 20  um.:noname ( -- 
5e40: 78 20 29 20 40 73 74 61 74 65 20 24 31 30 20 2b  x ) @state $10 +
5e50: 20 36 34 40 20 3b 20 77 75 72 73 74 6b 65 73 73   64@ ; wurstkess
5e60: 65 6c 20 74 6f 20 63 3a 63 6f 6f 6b 69 65 0a 0a  el to c:cookie..
5e70: 73 74 61 74 69 63 2d 61 20 74 6f 20 61 6c 6c 6f  static-a to allo
5e80: 63 61 74 65 72 0a 77 75 72 73 74 6b 65 73 73 65  cater.wurstkesse
5e90: 6c 20 6e 65 77 20 43 6f 6e 73 74 61 6e 74 20 77  l new Constant w
5ea0: 75 72 73 74 6b 65 73 73 65 6c 2d 6f 0a 64 79 6e  urstkessel-o.dyn
5eb0: 61 6d 69 63 2d 61 20 74 6f 20 61 6c 6c 6f 63 61  amic-a to alloca
5ec0: 74 65 72 0a 0a 77 75 72 73 74 2d 69 6e 69 74 0a  ter..wurst-init.
5ed0: 77 75 72 73 74 2d 74 61 73 6b 2d 69 6e 69 74 0a  wurst-task-init.