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.