Artifact
5a2439b4b0378f234b1b8c20e9cda6da4c3bb1a0 :
File
crypt.fs
— part of check-in
[92cd8b5e93]
at
2019-05-27 16:58:07
on branch trunk
— Don't recheck key signatures every time you open your secret keys
(user:
bernd
size: 20433)
0000: 5c 20 73 79 6d 6d 65 74 72 69 63 20 65 6e 63 72 \ symmetric encr
0010: 79 70 74 69 6f 6e 20 61 6e 64 20 64 65 63 72 79 yption and decry
0020: 70 74 69 6f 6e 0a 0a 5c 20 43 6f 70 79 72 69 67 ption..\ Copyrig
0030: 68 74 20 28 43 29 20 32 30 31 31 2d 32 30 31 35 ht (C) 2011-2015
0040: 20 20 20 42 65 72 6e 64 20 50 61 79 73 61 6e 0a Bernd Paysan.
0050: 0a 5c 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 .\ This program
0060: 69 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 is free software
0070: 3a 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73 74 : you can redist
0080: 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f 72 ribute it and/or
0090: 20 6d 6f 64 69 66 79 0a 5c 20 69 74 20 75 6e 64 modify.\ it und
00a0: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 er the terms of
00b0: 74 68 65 20 47 4e 55 20 41 66 66 65 72 6f 20 47 the GNU Affero G
00c0: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 eneral Public Li
00d0: 63 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 cense as publish
00e0: 65 64 20 62 79 0a 5c 20 74 68 65 20 46 72 65 65 ed by.\ the Free
00f0: 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61 Software Founda
0100: 74 69 6f 6e 2c 20 65 69 74 68 65 72 20 76 65 72 tion, either ver
0110: 73 69 6f 6e 20 33 20 6f 66 20 74 68 65 20 4c 69 sion 3 of the Li
0120: 63 65 6e 73 65 2c 20 6f 72 0a 5c 20 28 61 74 20 cense, or.\ (at
0130: 79 6f 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 your option) any
0140: 20 6c 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a later version..
0150: 0a 5c 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 .\ This program
0160: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 is distributed i
0170: 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 n the hope that
0180: 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 it will be usefu
0190: 6c 2c 0a 5c 20 62 75 74 20 57 49 54 48 4f 55 54 l,.\ but WITHOUT
01a0: 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77 ANY WARRANTY; w
01b0: 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 ithout even the
01c0: 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 implied warranty
01d0: 20 6f 66 0a 5c 20 4d 45 52 43 48 41 4e 54 41 42 of.\ MERCHANTAB
01e0: 49 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53 ILITY or FITNESS
01f0: 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 FOR A PARTICULA
0200: 52 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65 20 R PURPOSE. See
0210: 74 68 65 0a 5c 20 47 4e 55 20 41 66 66 65 72 6f the.\ GNU Affero
0220: 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 General Public
0230: 4c 69 63 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 License for more
0240: 20 64 65 74 61 69 6c 73 2e 0a 0a 5c 20 59 6f 75 details...\ You
0250: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 should have rec
0260: 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66 20 eived a copy of
0270: 74 68 65 20 47 4e 55 20 41 66 66 65 72 6f 20 47 the GNU Affero G
0280: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 eneral Public Li
0290: 63 65 6e 73 65 0a 5c 20 61 6c 6f 6e 67 20 77 69 cense.\ along wi
02a0: 74 68 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2e th this program.
02b0: 20 20 49 66 20 6e 6f 74 2c 20 73 65 65 20 3c 68 If not, see <h
02c0: 74 74 70 3a 2f 2f 77 77 77 2e 67 6e 75 2e 6f 72 ttp://www.gnu.or
02d0: 67 2f 6c 69 63 65 6e 73 65 73 2f 3e 2e 0a 0a 5c g/licenses/>...\
02e0: 20 6b 65 79 20 73 74 6f 72 61 67 65 20 73 74 75 key storage stu
02f0: 66 66 0a 24 31 45 30 20 43 6f 6e 73 74 61 6e 74 ff.$1E0 Constant
0300: 20 6b 65 79 70 61 63 6b 23 0a 6b 65 79 70 61 63 keypack#.keypac
0310: 6b 23 20 6b 65 79 2d 73 61 6c 74 23 20 2b 20 6b k# key-salt# + k
0320: 65 79 2d 63 6b 73 75 6d 23 20 2b 20 43 6f 6e 73 ey-cksum# + Cons
0330: 74 61 6e 74 20 6b 65 79 70 61 63 6b 2d 61 6c 6c tant keypack-all
0340: 23 0a 6b 65 79 2d 73 61 6c 74 23 20 6b 65 79 2d #.key-salt# key-
0350: 63 6b 73 75 6d 23 20 2b 20 43 6f 6e 73 74 61 6e cksum# + Constan
0360: 74 20 77 72 61 70 70 65 72 23 0a 0a 56 61 72 69 t wrapper#..Vari
0370: 61 62 6c 65 20 6d 79 2d 30 6b 65 79 0a 3a 20 79 able my-0key.: y
0380: 6f 75 72 2d 30 6b 65 79 20 28 20 2d 2d 20 61 64 our-0key ( -- ad
0390: 64 72 20 75 20 29 0a 20 20 20 20 6f 20 49 46 20 dr u ). o IF
03a0: 20 64 65 73 74 2d 30 6b 65 79 20 73 65 63 40 20 dest-0key sec@
03b0: 20 45 4c 53 45 20 20 23 30 2e 20 20 54 48 45 4e ELSE #0. THEN
03c0: 0a 20 20 20 20 64 75 70 20 30 3d 20 49 46 20 20 . dup 0= IF
03d0: 32 64 72 6f 70 20 6c 61 73 74 61 64 64 72 23 20 2drop lastaddr#
03e0: 63 65 6c 6c 2b 20 24 40 20 20 54 48 45 4e 20 3b cell+ $@ THEN ;
03f0: 0a 0a 75 73 65 72 2d 6f 20 6b 65 79 74 6d 70 20 ..user-o keytmp
0400: 5c 20 73 74 6f 72 61 67 65 20 66 6f 72 20 73 65 \ storage for se
0410: 63 75 72 65 20 74 65 6d 70 6f 72 61 72 79 20 6b cure temporary k
0420: 65 79 73 0a 0a 6f 62 6a 65 63 74 20 75 63 6c 61 eys..object ucla
0430: 73 73 20 6b 65 79 74 6d 70 0a 20 20 20 20 73 74 ss keytmp. st
0440: 61 74 65 32 23 20 20 20 75 76 61 72 20 6b 65 79 ate2# uvar key
0450: 2d 61 73 73 65 6d 62 6c 79 0a 20 20 20 20 73 74 -assembly. st
0460: 61 74 65 32 23 20 20 20 75 76 61 72 20 69 76 73 ate2# uvar ivs
0470: 2d 61 73 73 65 6d 62 6c 79 0a 20 20 20 20 73 74 -assembly. st
0480: 61 74 65 23 20 20 20 20 75 76 61 72 20 6d 79 6b ate# uvar myk
0490: 65 79 20 20 20 20 5c 20 69 6e 73 74 61 6e 63 65 ey \ instance
04a0: 27 73 20 72 6f 74 61 74 69 6e 67 20 70 72 69 76 's rotating priv
04b0: 61 74 65 20 6b 65 79 0a 20 20 20 20 73 74 61 74 ate key. stat
04c0: 65 23 20 20 20 20 75 76 61 72 20 6f 6c 64 6d 79 e# uvar oldmy
04d0: 6b 65 79 20 5c 20 70 72 65 76 69 6f 75 73 20 72 key \ previous r
04e0: 6f 74 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 otating private
04f0: 6b 65 79 0a 20 20 20 20 6b 65 79 73 69 7a 65 20 key. keysize
0500: 20 20 75 76 61 72 20 6f 6c 64 70 6b 63 20 20 20 uvar oldpkc
0510: 5c 20 70 72 65 76 69 6f 75 73 20 70 75 62 6b 65 \ previous pubke
0520: 79 20 61 66 74 65 72 20 72 65 76 6f 63 61 74 69 y after revocati
0530: 6f 6e 0a 20 20 20 20 6b 65 79 73 69 7a 65 20 20 on. keysize
0540: 20 75 76 61 72 20 6f 6c 64 73 6b 63 20 20 20 5c uvar oldskc \
0550: 20 70 72 65 76 69 6f 75 73 20 73 65 63 72 65 74 previous secret
0560: 20 6b 65 79 20 61 66 74 65 72 20 72 65 76 6f 63 key after revoc
0570: 61 74 69 6f 6e 0a 20 20 20 20 6b 65 79 73 69 7a ation. keysiz
0580: 65 20 20 20 75 76 61 72 20 6f 6c 64 70 6b 72 65 e uvar oldpkre
0590: 76 20 5c 20 70 72 65 76 69 6f 75 73 20 72 65 76 v \ previous rev
05a0: 6f 63 61 74 69 6f 6e 20 70 75 62 6b 65 79 20 61 ocation pubkey a
05b0: 66 74 65 72 20 72 65 76 6f 63 61 74 69 6f 6e 0a fter revocation.
05c0: 20 20 20 20 6b 65 79 73 69 7a 65 20 20 20 75 76 keysize uv
05d0: 61 72 20 6f 6c 64 73 6b 72 65 76 20 5c 20 70 72 ar oldskrev \ pr
05e0: 65 76 69 6f 75 73 20 72 65 76 6f 63 61 74 69 6f evious revocatio
05f0: 6e 20 73 65 63 72 65 74 20 61 66 74 65 72 20 72 n secret after r
0600: 65 76 6f 63 61 74 69 6f 6e 0a 20 20 20 20 6b 65 evocation. ke
0610: 79 73 69 7a 65 20 20 20 75 76 61 72 20 6b 65 79 ysize uvar key
0620: 70 61 64 0a 20 20 20 20 68 61 73 68 23 32 35 36 pad. hash#256
0630: 20 20 75 76 61 72 20 6b 65 79 65 64 2d 68 61 73 uvar keyed-has
0640: 68 2d 6f 75 74 0a 20 20 20 20 64 61 74 65 73 69 h-out. datesi
0650: 7a 65 23 20 75 76 61 72 20 73 69 67 64 61 74 65 ze# uvar sigdate
0660: 0a 20 20 20 20 6b 65 79 73 69 7a 65 20 20 20 75 . keysize u
0670: 76 61 72 20 73 74 70 6b 63 20 5c 20 73 65 72 76 var stpkc \ serv
0680: 65 72 20 74 65 6d 70 6f 72 61 72 79 20 6b 65 79 er temporary key
0690: 70 61 69 72 20 2d 20 6f 6e 63 65 20 70 65 72 20 pair - once per
06a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65 74 75 70 connection setup
06b0: 0a 20 20 20 20 6b 65 79 73 69 7a 65 20 20 20 75 . keysize u
06c0: 76 61 72 20 73 74 73 6b 63 0a 20 20 20 20 6b 65 var stskc. ke
06d0: 79 70 61 63 6b 2d 61 6c 6c 23 20 75 76 61 72 20 ypack-all# uvar
06e0: 6b 65 79 70 61 63 6b 2d 64 0a 20 20 20 20 24 31 keypack-d. $1
06f0: 30 30 20 20 20 20 20 20 75 76 61 72 20 76 61 75 00 uvar vau
0700: 6c 74 6b 65 79 20 5c 20 62 75 66 66 65 72 73 20 ltkey \ buffers
0710: 66 6f 72 20 76 61 75 6c 74 0a 20 20 20 20 24 31 for vault. $1
0720: 30 30 20 20 20 20 20 20 75 76 61 72 20 6b 65 79 00 uvar key
0730: 64 75 6d 70 2d 62 75 66 20 20 5c 20 62 75 66 66 dump-buf \ buff
0740: 65 72 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 6b er for dumping k
0750: 65 79 73 0a 20 20 20 20 73 74 61 74 65 32 23 20 eys. state2#
0760: 20 20 75 76 61 72 20 76 6b 65 79 20 5c 20 6d 61 uvar vkey \ ma
0770: 78 69 6d 75 6d 20 73 69 7a 65 20 66 6f 72 20 73 ximum size for s
0780: 65 73 73 69 6f 6e 20 6b 65 79 0a 20 20 20 20 73 ession key. s
0790: 74 61 74 65 32 23 20 20 20 75 76 61 72 20 76 6f tate2# uvar vo
07a0: 75 74 6b 65 79 20 5c 20 66 6f 72 20 6b 65 79 64 utkey \ for keyd
07b0: 75 6d 70 0a 20 20 20 20 6b 65 79 73 69 7a 65 20 ump. keysize
07c0: 20 20 75 76 61 72 20 6b 65 79 67 65 6e 64 68 0a uvar keygendh.
07d0: 20 20 20 20 6b 65 79 73 69 7a 65 20 20 20 75 76 keysize uv
07e0: 61 72 20 76 70 6b 0a 20 20 20 20 6b 65 79 73 69 ar vpk. keysi
07f0: 7a 65 20 20 20 75 76 61 72 20 76 73 6b 0a 20 20 ze uvar vsk.
0800: 20 20 31 20 36 34 73 20 20 20 20 20 75 76 61 72 1 64s uvar
0810: 20 6c 61 73 74 2d 6d 79 6b 65 79 0a 20 20 20 20 last-mykey.
0820: 63 65 6c 6c 20 20 20 20 20 20 75 76 61 72 20 6b cell uvar k
0830: 65 79 74 6d 70 2d 75 70 0a 65 6e 64 2d 63 6c 61 eytmp-up.end-cla
0840: 73 73 20 6b 65 79 74 6d 70 2d 63 0a 0a 75 73 65 ss keytmp-c..use
0850: 72 2d 6f 20 6b 65 79 62 75 66 20 5c 20 73 74 6f r-o keybuf \ sto
0860: 72 61 67 65 20 66 6f 72 20 73 65 63 75 72 65 20 rage for secure
0870: 70 65 72 6d 61 6e 65 6e 74 20 6b 65 79 73 0a 0a permanent keys..
0880: 6f 62 6a 65 63 74 20 75 63 6c 61 73 73 20 6b 65 object uclass ke
0890: 79 62 75 66 0a 20 20 20 20 5c 20 6b 65 79 20 73 ybuf. \ key s
08a0: 74 6f 72 61 67 65 0a 20 20 20 20 5c 20 63 6c 69 torage. \ cli
08b0: 65 6e 74 20 6b 65 79 73 0a 20 20 20 20 6b 65 79 ent keys. key
08c0: 73 69 7a 65 20 75 76 61 72 20 70 6b 63 20 20 20 size uvar pkc
08d0: 5c 20 70 75 62 6b 65 79 0a 20 20 20 20 6b 65 79 \ pubkey. key
08e0: 73 69 7a 65 20 75 76 61 72 20 70 6b 31 20 20 20 size uvar pk1
08f0: 5c 20 70 75 62 6b 65 79 20 31 20 66 6f 72 20 72 \ pubkey 1 for r
0900: 65 76 6f 6b 61 74 69 6f 6e 0a 20 20 20 20 6b 65 evokation. ke
0910: 79 73 69 7a 65 20 75 76 61 72 20 73 6b 63 20 20 ysize uvar skc
0920: 20 5c 20 73 65 63 72 65 74 20 6b 65 79 0a 20 20 \ secret key.
0930: 20 20 6b 65 79 73 69 7a 65 20 75 76 61 72 20 73 keysize uvar s
0940: 6b 73 69 67 20 5c 20 73 65 63 72 65 74 20 6b 65 ksig \ secret ke
0950: 79 20 66 6f 72 20 73 69 67 6e 61 74 75 72 65 0a y for signature.
0960: 20 20 20 20 6b 65 79 73 69 7a 65 20 75 76 61 72 keysize uvar
0970: 20 73 6b 31 20 20 20 5c 20 73 65 63 72 65 74 20 sk1 \ secret
0980: 6b 65 79 20 31 20 66 6f 72 20 72 65 76 6f 6b 61 key 1 for revoka
0990: 74 69 6f 6e 20 28 77 69 6c 6c 20 6e 6f 74 20 6c tion (will not l
09a0: 61 73 74 29 0a 20 20 20 20 6b 65 79 73 69 7a 65 ast). keysize
09b0: 20 75 76 61 72 20 70 6b 72 65 76 20 5c 20 70 75 uvar pkrev \ pu
09c0: 62 6b 65 79 20 66 6f 72 20 72 65 76 6f 6b 69 6e bkey for revokin
09d0: 67 20 6b 65 79 73 0a 20 20 20 20 6b 65 79 73 69 g keys. keysi
09e0: 7a 65 20 75 76 61 72 20 73 6b 72 65 76 20 5c 20 ze uvar skrev \
09f0: 73 65 63 72 65 74 20 66 6f 72 20 72 65 76 6f 6b secret for revok
0a00: 69 6e 67 20 6b 65 79 73 0a 65 6e 64 2d 63 6c 61 ing keys.end-cla
0a10: 73 73 20 6b 65 79 62 75 66 2d 63 0a 0a 73 74 61 ss keybuf-c..sta
0a20: 74 65 32 23 20 62 75 66 66 65 72 3a 20 6e 6f 2d te2# buffer: no-
0a30: 6b 65 79 20 5c 20 6a 75 73 74 20 7a 65 72 6f 73 key \ just zeros
0a40: 20 66 6f 72 20 6e 6f 20 6b 65 79 0a 6b 65 79 73 for no key.keys
0a50: 69 7a 65 20 62 75 66 66 65 72 3a 20 71 72 2d 6b ize buffer: qr-k
0a60: 65 79 20 5c 20 6b 65 79 20 75 73 65 64 20 66 6f ey \ key used fo
0a70: 72 20 51 52 20 63 68 61 6c 6c 65 6e 67 65 20 28 r QR challenge (
0a80: 63 61 6e 20 62 65 20 6f 6e 6c 79 20 6f 6e 65 29 can be only one)
0a90: 0a 73 74 61 74 65 23 20 20 62 75 66 66 65 72 3a .state# buffer:
0aa0: 20 71 72 2d 68 61 73 68 20 5c 20 68 61 73 68 20 qr-hash \ hash
0ab0: 6f 66 20 63 68 61 6c 6c 65 6e 67 65 0a 0a 3a 20 of challenge..:
0ac0: 6e 65 77 2d 6b 65 79 62 75 66 20 28 20 2d 2d 20 new-keybuf ( --
0ad0: 29 0a 20 20 20 20 6b 65 79 62 75 66 2d 63 20 3e ). keybuf-c >
0ae0: 6f 73 69 7a 65 20 40 20 6b 61 6c 6c 6f 63 20 6b osize @ kalloc k
0af0: 65 79 62 75 66 20 21 20 3b 0a 3a 20 6e 65 77 2d eybuf ! ;.: new-
0b00: 6b 65 79 74 6d 70 20 28 20 2d 2d 20 29 0a 20 20 keytmp ( -- ).
0b10: 20 20 6b 65 79 74 6d 70 20 40 20 49 46 0a 09 75 keytmp @ IF..u
0b20: 70 40 20 6b 65 79 74 6d 70 2d 75 70 20 40 20 3c p@ keytmp-up @ <
0b30: 3e 20 49 46 20 20 42 55 54 20 20 54 48 45 4e 0a > IF BUT THEN.
0b40: 09 6b 65 79 74 6d 70 2d 63 20 3e 6f 73 69 7a 65 .keytmp-c >osize
0b50: 20 40 20 6b 61 6c 6c 6f 63 20 6b 65 79 74 6d 70 @ kalloc keytmp
0b60: 20 21 0a 09 75 70 40 20 6b 65 79 74 6d 70 2d 75 !..up@ keytmp-u
0b70: 70 20 21 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a p !. THEN ;..
0b80: 3a 20 69 6e 69 74 2d 6b 65 79 62 75 66 20 28 20 : init-keybuf (
0b90: 2d 2d 20 29 0a 20 20 20 20 6b 65 79 73 69 7a 65 -- ). keysize
0ba0: 20 72 6e 67 24 20 71 72 2d 6b 65 79 20 73 77 61 rng$ qr-key swa
0bb0: 70 20 6d 6f 76 65 20 5c 20 71 72 2d 6b 65 79 20 p move \ qr-key
0bc0: 73 68 61 6c 6c 20 6e 6f 74 20 62 65 20 67 75 65 shall not be gue
0bd0: 73 73 61 62 6c 65 0a 20 20 20 20 6e 65 77 2d 6b ssable. new-k
0be0: 65 79 74 6d 70 20 20 6e 65 77 2d 6b 65 79 62 75 eytmp new-keybu
0bf0: 66 20 3b 20 5c 20 77 65 20 68 61 76 65 20 6f 6e f ; \ we have on
0c00: 6c 79 20 6f 6e 65 20 67 6c 6f 62 61 6c 20 6b 65 ly one global ke
0c10: 79 62 75 66 0a 0a 69 6e 69 74 2d 6b 65 79 62 75 ybuf..init-keybu
0c20: 66 0a 0a 3a 6e 6f 6e 61 6d 65 20 6b 65 79 74 6d f..:noname keytm
0c30: 70 20 6f 66 66 20 6b 65 79 62 75 66 20 6f 66 66 p off keybuf off
0c40: 20 64 65 66 65 72 73 20 27 69 6d 61 67 65 20 3b defers 'image ;
0c50: 20 69 73 20 27 69 6d 61 67 65 0a 3a 6e 6f 6e 61 is 'image.:nona
0c60: 6d 65 20 64 65 66 65 72 73 20 27 63 6f 6c 64 20 me defers 'cold
0c70: 69 6e 69 74 2d 6b 65 79 62 75 66 20 3b 20 69 73 init-keybuf ; is
0c80: 20 27 63 6f 6c 64 0a 3a 6e 6f 6e 61 6d 65 20 64 'cold.:noname d
0c90: 65 66 65 72 73 20 61 6c 6c 6f 63 2d 63 6f 64 65 efers alloc-code
0ca0: 2d 62 75 66 73 20 20 6e 65 77 2d 6b 65 79 74 6d -bufs new-keytm
0cb0: 70 20 3b 20 69 73 20 61 6c 6c 6f 63 2d 63 6f 64 p ; is alloc-cod
0cc0: 65 2d 62 75 66 73 0a 5c 20 3a 6e 6f 6e 61 6d 65 e-bufs.\ :noname
0cd0: 20 64 65 66 65 72 73 20 66 72 65 65 2d 63 6f 64 defers free-cod
0ce0: 65 2d 62 75 66 73 20 3b 20 69 73 20 66 72 65 65 e-bufs ; is free
0cf0: 2d 63 6f 64 65 2d 62 75 66 73 0a 0a 23 36 30 2e -code-bufs..#60.
0d00: 30 30 30 2e 30 30 30 2e 30 30 30 20 64 3e 36 34 000.000.000 d>64
0d10: 20 36 34 43 6f 6e 73 74 61 6e 74 20 3a 30 31 27 64Constant :01'
0d20: 23 20 5c 20 6f 6e 65 20 6d 69 6e 75 74 65 0a 23 # \ one minute.#
0d30: 31 30 2e 30 30 30 2e 30 30 30 2e 30 30 30 20 64 10.000.000.000 d
0d40: 3e 36 34 20 36 34 43 6f 6e 73 74 61 6e 74 20 31 >64 64Constant 1
0d50: 30 22 23 20 20 5c 20 74 65 6e 20 73 65 63 6f 6e 0"# \ ten secon
0d60: 64 0a 3a 30 31 27 23 20 36 34 56 61 6c 75 65 20 d.:01'# 64Value
0d70: 64 65 6c 74 61 2d 6d 79 6b 65 79 23 20 20 20 5c delta-mykey# \
0d80: 20 6e 65 77 20 6d 79 6b 65 79 20 65 76 65 72 79 new mykey every
0d90: 20 36 30 20 73 65 63 6f 6e 64 73 0a 31 30 22 23 60 seconds.10"#
0da0: 20 20 36 34 43 6f 6e 73 74 61 6e 74 20 66 75 7a 64Constant fuz
0db0: 7a 65 64 74 69 6d 65 23 20 5c 20 61 6c 6c 6f 77 zedtime# \ allow
0dc0: 20 63 6c 69 65 6e 74 73 20 74 6f 20 62 65 20 31 clients to be 1
0dd0: 30 73 20 6f 66 66 0a 0a 3a 20 69 6e 69 74 2d 6d 0s off..: init-m
0de0: 79 6b 65 79 20 28 20 2d 2d 20 29 0a 20 20 20 20 ykey ( -- ).
0df0: 74 69 63 6b 73 20 64 65 6c 74 61 2d 6d 79 6b 65 ticks delta-myke
0e00: 79 23 20 36 34 2b 20 6c 61 73 74 2d 6d 79 6b 65 y# 64+ last-myke
0e10: 79 20 36 34 21 0a 20 20 20 20 6d 79 6b 65 79 20 y 64!. mykey
0e20: 6f 6c 64 6d 79 6b 65 79 20 73 74 61 74 65 23 20 oldmykey state#
0e30: 6d 6f 76 65 0a 20 20 20 20 73 74 61 74 65 23 20 move. state#
0e40: 72 6e 67 24 20 6d 79 6b 65 79 20 73 77 61 70 20 rng$ mykey swap
0e50: 6d 6f 76 65 0a 20 20 20 20 6d 79 6b 65 79 28 20 move. mykey(
0e60: 3c 69 6e 66 6f 3e 20 2e 22 20 47 65 6e 65 72 61 <info> ." Genera
0e70: 74 65 20 6e 65 77 20 6d 79 6b 65 79 22 20 63 72 te new mykey" cr
0e80: 20 3c 64 65 66 61 75 6c 74 3e 20 29 0a 20 20 20 <default> ).
0e90: 20 67 65 6e 6b 65 79 28 20 2e 22 20 6d 79 6b 65 genkey( ." myke
0ea0: 79 3a 20 22 20 6d 79 6b 65 79 20 73 74 61 74 65 y: " mykey state
0eb0: 23 20 78 74 79 70 65 20 63 72 20 29 20 3b 0a 0a # xtype cr ) ;..
0ec0: 30 20 56 61 6c 75 65 20 68 65 61 64 65 72 2d 6b 0 Value header-k
0ed0: 65 79 0a 30 20 56 61 6c 75 65 20 68 65 61 64 65 ey.0 Value heade
0ee0: 72 2d 79 6f 75 72 2d 6b 65 79 0a 24 32 30 20 62 r-your-key.$20 b
0ef0: 75 66 66 65 72 3a 20 64 75 6d 6d 79 2d 62 75 66 uffer: dummy-buf
0f00: 0a 0a 3a 20 69 6e 69 74 2d 68 65 61 64 65 72 2d ..: init-header-
0f10: 6b 65 79 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b key ( -- ). k
0f20: 61 6c 6c 6f 63 36 34 20 64 75 70 20 74 6f 20 68 alloc64 dup to h
0f30: 65 61 64 65 72 2d 6b 65 79 20 24 34 30 20 65 72 eader-key $40 er
0f40: 61 73 65 0a 20 20 20 20 6b 61 6c 6c 6f 63 36 34 ase. kalloc64
0f50: 20 64 75 70 20 74 6f 20 68 65 61 64 65 72 2d 79 dup to header-y
0f60: 6f 75 72 2d 6b 65 79 20 24 34 30 20 65 72 61 73 our-key $40 eras
0f70: 65 0a 20 20 20 20 6d 79 2d 30 6b 65 79 20 73 65 e. my-0key se
0f80: 63 40 20 20 68 65 61 64 65 72 2d 6b 65 79 20 73 c@ header-key s
0f90: 77 61 70 20 6d 6f 76 65 0a 20 20 20 20 68 65 61 wap move. hea
0fa0: 64 65 72 2d 6b 65 79 20 64 75 6d 6d 79 2d 62 75 der-key dummy-bu
0fb0: 66 20 64 75 70 20 24 43 20 74 66 5f 65 6e 63 72 f dup $C tf_encr
0fc0: 79 70 74 5f 32 35 36 20 28 20 73 65 74 73 20 74 ypt_256 ( sets t
0fd0: 77 65 61 6b 73 20 29 20 3b 0a 0a 3a 20 69 6e 69 weaks ) ;..: ini
0fe0: 74 2d 6d 79 30 6b 65 79 20 28 20 2d 2d 20 29 0a t-my0key ( -- ).
0ff0: 20 20 20 20 6e 6f 30 6b 65 79 28 20 45 58 49 54 no0key( EXIT
1000: 20 29 20 6b 65 79 73 69 7a 65 20 72 6e 67 24 20 ) keysize rng$
1010: 6d 79 2d 30 6b 65 79 20 73 65 63 21 20 3b 0a 0a my-0key sec! ;..
1020: 3a 20 3f 6e 65 77 2d 6d 79 6b 65 79 20 28 20 2d : ?new-mykey ( -
1030: 2d 20 29 0a 20 20 20 20 6c 61 73 74 2d 6d 79 6b - ). last-myk
1040: 65 79 20 36 34 40 20 74 69 63 6b 65 72 20 36 34 ey 64@ ticker 64
1050: 40 20 36 34 2d 20 36 34 2d 30 3c 20 49 46 20 20 @ 64- 64-0< IF
1060: 69 6e 69 74 2d 6d 79 6b 65 79 20 20 54 48 45 4e init-mykey THEN
1070: 20 3b 0a 0a 3a 20 3e 63 72 79 70 74 2d 6b 65 79 ;..: >crypt-key
1080: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 6b ( addr u -- ) k
1090: 65 79 28 20 64 75 70 20 2e 20 29 0a 20 20 20 20 ey( dup . ).
10a0: 64 75 70 20 30 3d 20 49 46 20 20 32 64 72 6f 70 dup 0= IF 2drop
10b0: 20 6e 6f 2d 6b 65 79 20 73 74 61 74 65 23 20 20 no-key state#
10c0: 54 48 45 4e 0a 20 20 20 20 6b 65 79 2d 61 73 73 THEN. key-ass
10d0: 65 6d 62 6c 79 20 73 74 61 74 65 23 20 2b 20 73 embly state# + s
10e0: 74 61 74 65 23 20 6d 6f 76 65 2d 72 65 70 0a 20 tate# move-rep.
10f0: 20 20 20 6b 65 79 2d 61 73 73 65 6d 62 6c 79 20 key-assembly
1100: 74 77 65 61 6b 28 20 2e 22 20 3e 63 72 79 70 74 tweak( ." >crypt
1110: 2d 6b 65 79 20 22 20 64 75 70 20 73 74 61 74 65 -key " dup state
1120: 32 23 20 38 35 74 79 70 65 20 63 72 20 29 0a 20 2# 85type cr ).
1130: 20 20 20 3e 63 3a 6b 65 79 20 3b 0a 3a 20 3e 63 >c:key ;.: >c
1140: 72 79 70 74 2d 73 6f 75 72 63 65 20 28 20 61 64 rypt-source ( ad
1150: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 6b 65 dr u -- ). ke
1160: 79 2d 61 73 73 65 6d 62 6c 79 20 73 74 61 74 65 y-assembly state
1170: 23 20 6d 6f 76 65 2d 72 65 70 20 3b 0a 0a 5c 20 # move-rep ;..\
1180: 72 65 67 65 6e 65 72 61 74 65 20 69 76 73 20 69 regenerate ivs i
1190: 73 20 61 20 62 75 66 66 65 72 20 73 77 61 70 70 s a buffer swapp
11a0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 3a 0a 5c 20 ing function:.\
11b0: 72 65 67 65 6e 65 72 61 74 65 20 68 61 6c 66 20 regenerate half
11c0: 6f 66 20 74 68 65 20 69 76 73 20 70 65 72 20 74 of the ivs per t
11d0: 69 6d 65 2c 20 77 68 65 6e 20 79 6f 75 20 72 65 ime, when you re
11e0: 61 63 68 20 74 68 65 20 6d 69 64 64 6c 65 20 6f ach the middle o
11f0: 66 20 74 68 65 20 6f 74 68 65 72 20 68 61 6c 66 f the other half
1200: 0a 5c 20 6f 66 20 74 68 65 20 69 76 73 20 62 75 .\ of the ivs bu
1210: 66 66 65 72 2e 0a 0a 73 63 6f 70 65 7b 20 6d 61 ffer...scope{ ma
1220: 70 63 0a 0a 3a 20 64 65 73 74 2d 61 2f 62 20 28 pc..: dest-a/b (
1230: 20 61 64 64 72 20 75 20 2d 2d 20 61 64 64 72 31 addr u -- addr1
1240: 20 75 31 20 29 0a 20 20 20 20 32 2f 20 20 64 65 u1 ). 2/ de
1250: 73 74 2d 69 76 73 6c 61 73 74 67 65 6e 20 31 20 st-ivslastgen 1
1260: 3d 20 49 46 20 20 64 75 70 20 3e 72 20 2b 20 72 = IF dup >r + r
1270: 3e 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 72 65 70 > THEN ;..: rep
1280: 6c 69 65 73 2d 65 72 61 73 65 20 28 20 61 64 64 lies-erase ( add
1290: 72 20 6c 65 6e 20 2d 2d 20 29 0a 20 20 20 20 32 r len -- ). 2
12a0: 64 75 70 20 62 6f 75 6e 64 73 20 55 2b 44 4f 0a dup bounds U+DO.
12b0: 09 49 20 72 65 70 6c 79 2d 74 61 67 20 3f 64 75 .I reply-tag ?du
12c0: 70 2d 49 46 20 20 6f 66 66 20 20 54 48 45 4e 0a p-IF off THEN.
12d0: 20 20 20 20 72 65 70 6c 79 20 2b 4c 4f 4f 50 20 reply +LOOP
12e0: 20 65 72 61 73 65 20 3b 0a 0a 3a 20 63 6c 65 61 erase ;..: clea
12f0: 72 2d 72 65 70 6c 69 65 73 20 28 20 2d 2d 20 29 r-replies ( -- )
1300: 0a 20 20 20 20 64 65 73 74 2d 72 65 70 6c 69 65 . dest-replie
1310: 73 20 64 65 73 74 2d 73 69 7a 65 20 61 64 64 72 s dest-size addr
1320: 3e 72 65 70 6c 69 65 73 20 64 65 73 74 2d 61 2f >replies dest-a/
1330: 62 0a 20 20 20 20 72 65 70 6c 69 65 73 2d 65 72 b. replies-er
1340: 61 73 65 20 3b 0a 0a 3a 20 3e 69 76 73 6b 65 79 ase ;..: >ivskey
1350: 20 28 20 36 34 61 64 64 72 20 2d 2d 20 6b 65 79 ( 64addr -- key
1360: 61 64 64 72 20 29 0a 20 20 20 20 36 34 3e 6e 20 addr ). 64>n
1370: 61 64 64 72 3e 6b 65 79 73 20 64 65 73 74 2d 69 addr>keys dest-i
1380: 76 73 24 20 72 6f 74 20 75 6d 69 6e 20 2b 20 3b vs$ rot umin + ;
1390: 0a 0a 7d 73 63 6f 70 65 0a 0a 3a 20 63 72 79 70 ..}scope..: cryp
13a0: 74 2d 6b 65 79 24 20 28 20 2d 2d 20 61 64 64 72 t-key$ ( -- addr
13b0: 20 75 20 29 0a 20 20 20 20 6f 20 30 3d 20 49 46 u ). o 0= IF
13c0: 20 20 6e 6f 2d 6b 65 79 20 73 74 61 74 65 23 20 no-key state#
13d0: 20 45 4c 53 45 20 20 63 72 79 70 74 6f 2d 6b 65 ELSE crypto-ke
13e0: 79 20 73 65 63 40 20 20 54 48 45 4e 20 3b 0a 0a y sec@ THEN ;..
13f0: 3a 20 64 65 66 61 75 6c 74 2d 6b 65 79 20 28 20 : default-key (
1400: 2d 2d 20 29 0a 20 20 20 20 63 6d 64 28 20 2e 22 -- ). cmd( ."
1410: 20 44 65 66 61 75 6c 74 2d 6b 65 79 20 22 20 63 Default-key " c
1420: 72 20 29 0a 20 20 20 20 63 3a 30 6b 65 79 20 3b r ). c:0key ;
1430: 0a 0a 3a 20 61 64 64 72 3e 61 73 73 65 6d 62 6c ..: addr>assembl
1440: 79 20 28 20 61 64 64 72 36 34 20 66 6c 61 67 20 y ( addr64 flag
1450: 2d 2d 20 78 31 32 38 20 29 0a 20 20 20 20 5b 20 -- x128 ). [
1460: 61 63 6b 73 23 20 69 6e 76 65 72 74 20 38 20 6c acks# invert 8 l
1470: 73 68 69 66 74 20 5d 4c 20 61 6e 64 20 6e 3e 36 shift ]L and n>6
1480: 34 20 3b 0a 0a 3a 20 69 76 73 2d 74 77 65 61 6b 4 ;..: ivs-tweak
1490: 20 28 20 36 34 61 64 64 72 20 6b 65 79 61 64 64 ( 64addr keyadd
14a0: 72 20 2d 2d 20 29 0a 20 20 20 20 3e 72 20 64 65 r -- ). >r de
14b0: 73 74 2d 66 6c 61 67 73 20 6c 65 2d 75 77 40 20 st-flags le-uw@
14c0: 61 64 64 72 3e 61 73 73 65 6d 62 6c 79 0a 20 20 addr>assembly.
14d0: 20 20 72 3e 20 73 74 61 74 65 23 20 63 3a 74 77 r> state# c:tw
14e0: 65 61 6b 6b 65 79 21 0a 20 20 20 20 74 77 65 61 eakkey!. twea
14f0: 6b 28 20 2e 22 20 74 77 65 61 6b 20 6b 65 79 3a k( ." tweak key:
1500: 20 22 20 76 6f 75 74 6b 65 79 20 63 3a 6b 65 79 " voutkey c:key
1510: 3e 20 76 6f 75 74 6b 65 79 20 40 20 68 65 78 2e > voutkey @ hex.
1520: 20 76 6f 75 74 6b 65 79 20 73 74 61 74 65 23 20 voutkey state#
1530: 2b 20 24 31 30 20 2e 6e 6e 62 20 63 72 20 29 20 + $10 .nnb cr )
1540: 3b 0a 0a 73 63 6f 70 65 7b 20 6d 61 70 63 0a 0a ;..scope{ mapc..
1550: 3a 20 69 76 73 3e 73 6f 75 72 63 65 3f 20 28 20 : ivs>source? (
1560: 6f 3a 6d 61 70 20 2d 2d 20 29 0a 20 20 20 20 64 o:map -- ). d
1570: 65 73 74 2d 61 64 64 72 20 36 34 40 20 64 65 73 est-addr 64@ des
1580: 74 2d 76 61 64 64 72 20 36 34 2d 0a 20 20 20 20 t-vaddr 64-.
1590: 36 34 64 75 70 20 64 65 73 74 2d 73 69 7a 65 20 64dup dest-size
15a0: 6e 3e 36 34 20 36 34 75 3e 3d 20 21 21 69 6e 76 n>64 64u>= !!inv
15b0: 2d 64 65 73 74 21 21 0a 20 20 20 20 36 34 64 75 -dest!!. 64du
15c0: 70 20 36 34 64 75 70 20 3e 69 76 73 6b 65 79 20 p 64dup >ivskey
15d0: 69 76 73 2d 74 77 65 61 6b 20 36 34 3e 6e 20 61 ivs-tweak 64>n a
15e0: 64 64 72 3e 6b 65 79 73 20 72 65 67 65 6e 2d 69 ddr>keys regen-i
15f0: 76 73 20 3b 0a 0a 7d 73 63 6f 70 65 0a 0a 3a 20 vs ;..}scope..:
1600: 6b 65 79 3e 64 75 6d 70 20 28 20 2d 2d 20 61 64 key>dump ( -- ad
1610: 64 72 20 75 20 29 0a 20 20 20 20 6b 65 79 64 75 dr u ). keydu
1620: 6d 70 2d 62 75 66 20 63 3a 6b 65 79 3e 20 6b 65 mp-buf c:key> ke
1630: 79 64 75 6d 70 2d 62 75 66 20 63 3a 6b 65 79 23 ydump-buf c:key#
1640: 20 3b 0a 0a 3a 20 63 72 79 70 74 2d 6b 65 79 2d ;..: crypt-key-
1650: 69 6e 69 74 20 28 20 61 64 64 72 20 75 20 6b 65 init ( addr u ke
1660: 79 20 75 20 2d 2d 20 61 64 64 72 27 20 75 27 20 y u -- addr' u'
1670: 29 20 32 3e 72 0a 20 20 20 20 6f 76 65 72 20 6c ) 2>r. over l
1680: 65 2d 31 32 38 40 20 32 72 3e 20 63 3a 74 77 65 e-128@ 2r> c:twe
1690: 61 6b 6b 65 79 21 0a 20 20 20 20 6b 65 79 2d 73 akkey!. key-s
16a0: 61 6c 74 23 20 73 61 66 65 2f 73 74 72 69 6e 67 alt# safe/string
16b0: 0a 20 20 20 20 74 77 65 61 6b 28 20 2e 22 20 6b . tweak( ." k
16c0: 65 79 20 69 6e 69 74 3a 20 22 20 6b 65 79 3e 64 ey init: " key>d
16d0: 75 6d 70 20 2e 6e 6e 62 20 63 72 20 29 20 3b 0a ump .nnb cr ) ;.
16e0: 0a 3a 20 63 72 79 70 74 2d 6b 65 79 2d 73 65 74 .: crypt-key-set
16f0: 75 70 20 28 20 61 64 64 72 20 75 31 20 6b 65 79 up ( addr u1 key
1700: 20 75 32 20 2d 2d 20 61 64 64 72 27 20 75 27 20 u2 -- addr' u'
1710: 29 0a 20 20 20 20 32 3e 72 20 6f 76 65 72 20 3e ). 2>r over >
1720: 72 20 20 24 31 30 20 72 6e 67 24 20 64 72 6f 70 r $10 rng$ drop
1730: 20 64 75 70 20 72 3e 20 24 31 30 20 6d 6f 76 65 dup r> $10 move
1740: 20 6c 65 2d 31 32 38 40 20 32 72 3e 20 63 3a 74 le-128@ 2r> c:t
1750: 77 65 61 6b 6b 65 79 21 0a 20 20 20 20 6b 65 79 weakkey!. key
1760: 2d 73 61 6c 74 23 20 73 61 66 65 2f 73 74 72 69 -salt# safe/stri
1770: 6e 67 20 3b 0a 0a 3a 20 65 6e 63 72 79 70 74 24 ng ;..: encrypt$
1780: 20 28 20 61 64 64 72 20 75 31 20 6b 65 79 20 75 ( addr u1 key u
1790: 32 20 2d 2d 20 29 0a 20 20 20 20 63 72 79 70 74 2 -- ). crypt
17a0: 2d 6b 65 79 2d 73 65 74 75 70 0a 20 20 20 20 6f -key-setup. o
17b0: 76 65 72 20 3e 72 20 24 3e 61 6c 69 67 6e 20 32 ver >r $>align 2
17c0: 64 75 70 20 6b 65 79 2d 63 6b 73 75 6d 23 20 2d dup key-cksum# -
17d0: 20 30 20 63 3a 65 6e 63 72 79 70 74 2b 61 75 74 0 c:encrypt+aut
17e0: 68 0a 20 20 20 20 72 3e 20 73 77 61 70 20 6d 6f h. r> swap mo
17f0: 76 65 20 3b 0a 0a 3a 20 64 65 63 72 79 70 74 24 ve ;..: decrypt$
1800: 20 28 20 61 64 64 72 20 75 31 20 6b 65 79 20 75 ( addr u1 key u
1810: 32 20 2d 2d 20 61 64 64 72 27 20 75 27 20 66 6c 2 -- addr' u' fl
1820: 61 67 20 29 0a 20 20 20 20 63 72 79 70 74 2d 6b ag ). crypt-k
1830: 65 79 2d 69 6e 69 74 0a 20 20 20 20 24 3e 61 6c ey-init. $>al
1840: 69 67 6e 20 6b 65 79 2d 63 6b 73 75 6d 23 20 2d ign key-cksum# -
1850: 20 32 64 75 70 20 30 20 63 3a 64 65 63 72 79 70 2dup 0 c:decryp
1860: 74 2b 61 75 74 68 20 3b 0a 0a 5c 20 70 61 73 73 t+auth ;..\ pass
1870: 70 68 72 61 65 73 65 20 65 6e 63 72 79 70 74 69 phraese encrypti
1880: 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 69 66 66 on needs to diff
1890: 75 73 65 20 61 20 6c 6f 74 20 61 66 74 65 72 20 use a lot after
18a0: 6d 65 72 67 69 6e 20 69 6e 20 74 68 65 20 73 61 mergin in the sa
18b0: 6c 74 0a 0a 32 20 56 61 6c 75 65 20 70 77 2d 6c lt..2 Value pw-l
18c0: 65 76 65 6c 30 0a 0a 3a 20 63 72 79 70 74 2d 70 evel0..: crypt-p
18d0: 77 2d 73 65 74 75 70 20 28 20 61 64 64 72 20 75 w-setup ( addr u
18e0: 31 20 6b 65 79 20 75 32 20 6e 20 2d 2d 20 61 64 1 key u2 n -- ad
18f0: 64 72 27 20 75 27 20 6e 27 20 29 20 7b 20 6e 20 dr' u' n' ) { n
1900: 7d 0a 20 20 20 20 32 3e 72 20 6f 76 65 72 20 3e }. 2>r over >
1910: 72 20 20 24 31 30 20 72 6e 67 24 20 72 40 20 73 r $10 rng$ r@ s
1920: 77 61 70 20 6d 6f 76 65 0a 20 20 20 20 72 40 20 wap move. r@
1930: 63 40 20 6e 20 24 46 30 20 6d 75 78 20 72 3e 20 c@ n $F0 mux r>
1940: 63 21 20 32 72 3e 20 63 72 79 70 74 2d 6b 65 79 c! 2r> crypt-key
1950: 2d 69 6e 69 74 20 70 77 2d 6c 65 76 65 6c 30 20 -init pw-level0
1960: 6e 20 32 2a 20 6c 73 68 69 66 74 20 3b 0a 0a 3a n 2* lshift ;..:
1970: 20 70 77 2d 64 69 66 66 75 73 65 2d 6b 65 63 63 pw-diffuse-kecc
1980: 61 6b 20 28 20 64 69 66 66 75 73 65 23 20 2d 2d ak ( diffuse# --
1990: 20 29 0a 20 20 20 20 2d 31 20 2b 44 4f 20 20 63 ). -1 +DO c
19a0: 3a 64 69 66 66 75 73 65 20 20 4c 4f 4f 50 20 3b :diffuse LOOP ;
19b0: 20 5c 20 6a 75 73 74 20 74 6f 20 77 61 73 74 65 \ just to waste
19c0: 20 74 69 6d 65 20 3b 2d 29 0a 0a 6b 65 79 73 69 time ;-)..keysi
19d0: 7a 65 20 62 75 66 66 65 72 3a 20 64 69 66 66 75 ze buffer: diffu
19e0: 73 65 2d 65 63 63 0a 6b 65 79 73 69 7a 65 20 62 se-ecc.keysize b
19f0: 75 66 66 65 72 3a 20 64 69 66 66 75 73 65 2d 73 uffer: diffuse-s
1a00: 6b 0a 0a 3a 20 70 77 2d 64 69 66 66 75 73 65 2d k..: pw-diffuse-
1a10: 65 63 63 27 20 28 20 78 74 20 2d 2d 20 29 20 3e ecc' ( xt -- ) >
1a20: 72 0a 20 20 20 20 64 69 66 66 75 73 65 2d 73 6b r. diffuse-sk
1a30: 20 6b 65 79 73 69 7a 65 20 20 63 3a 68 61 73 68 keysize c:hash
1a40: 40 0a 20 20 20 20 64 69 66 66 75 73 65 2d 73 6b @. diffuse-sk
1a50: 20 64 75 70 20 73 6b 2d 6d 61 73 6b 20 20 64 69 dup sk-mask di
1a60: 66 66 75 73 65 2d 65 63 63 20 20 72 3e 20 65 78 ffuse-ecc r> ex
1a70: 65 63 75 74 65 0a 20 20 20 20 64 69 66 66 75 73 ecute. diffus
1a80: 65 2d 65 63 63 20 6b 65 79 73 69 7a 65 20 63 3a e-ecc keysize c:
1a90: 73 68 6f 72 74 68 61 73 68 20 3b 0a 0a 3a 20 70 shorthash ;..: p
1aa0: 77 2d 64 69 66 66 75 73 65 2d 65 63 63 20 28 20 w-diffuse-ecc (
1ab0: 64 69 66 66 75 73 65 23 20 2d 2d 20 29 0a 20 20 diffuse# -- ).
1ac0: 20 20 63 3a 64 69 66 66 75 73 65 20 5b 27 5d 20 c:diffuse [']
1ad0: 73 6b 3e 70 6b 20 73 77 61 70 0a 20 20 20 20 2d sk>pk swap. -
1ae0: 31 20 2b 44 4f 20 5c 20 64 6f 20 61 74 20 6c 65 1 +DO \ do at le
1af0: 61 73 74 20 31 20 74 69 6d 65 20 65 76 65 6e 20 ast 1 time even
1b00: 69 66 20 73 75 70 70 6c 69 65 64 20 77 69 74 68 if supplied with
1b10: 20 30 0a 09 70 77 2d 64 69 66 66 75 73 65 2d 65 0..pw-diffuse-e
1b20: 63 63 27 20 5b 3a 20 64 75 70 20 65 64 2d 64 68 cc' [: dup ed-dh
1b30: 20 32 64 72 6f 70 20 3b 5d 0a 20 20 20 20 4c 4f 2drop ;]. LO
1b40: 4f 50 0a 20 20 20 20 64 72 6f 70 20 20 64 69 66 OP. drop dif
1b50: 66 75 73 65 2d 65 63 63 20 6b 65 79 73 69 7a 65 fuse-ecc keysize
1b60: 20 65 72 61 73 65 20 20 64 69 66 66 75 73 65 2d erase diffuse-
1b70: 73 6b 20 6b 65 79 73 69 7a 65 20 65 72 61 73 65 sk keysize erase
1b80: 0a 3b 20 5c 20 6a 75 73 74 20 74 6f 20 77 61 73 .; \ just to was
1b90: 74 65 20 74 69 6d 65 20 69 6e 20 61 20 77 61 79 te time in a way
1ba0: 20 74 68 61 74 20 69 73 20 64 69 66 66 69 63 75 that is difficu
1bb0: 6c 74 20 74 6f 20 62 75 69 6c 74 20 69 6e 74 6f lt to built into
1bc0: 20 41 53 49 43 73 0a 0a 44 65 66 65 72 20 70 77 ASICs..Defer pw
1bd0: 2d 64 69 66 66 75 73 65 0a 0a 3a 20 6e 65 77 2d -diffuse..: new-
1be0: 70 77 2d 64 69 66 66 75 73 65 20 28 20 2d 2d 20 pw-diffuse ( --
1bf0: 29 0a 20 20 20 20 5b 27 5d 20 70 77 2d 64 69 66 ). ['] pw-dif
1c00: 66 75 73 65 2d 65 63 63 20 69 73 20 70 77 2d 64 fuse-ecc is pw-d
1c10: 69 66 66 75 73 65 20 20 32 20 74 6f 20 70 77 2d iffuse 2 to pw-
1c20: 6c 65 76 65 6c 30 20 3b 0a 0a 3a 20 6f 6c 64 2d level0 ;..: old-
1c30: 70 77 2d 64 69 66 66 75 73 65 20 28 20 2d 2d 20 pw-diffuse ( --
1c40: 29 0a 20 20 20 20 5b 27 5d 20 70 77 2d 64 69 66 ). ['] pw-dif
1c50: 66 75 73 65 2d 6b 65 63 63 61 6b 20 69 73 20 70 fuse-keccak is p
1c60: 77 2d 64 69 66 66 75 73 65 20 20 24 31 30 30 20 w-diffuse $100
1c70: 74 6f 20 70 77 2d 6c 65 76 65 6c 30 20 3b 0a 0a to pw-level0 ;..
1c80: 6e 65 77 2d 70 77 2d 64 69 66 66 75 73 65 0a 0a new-pw-diffuse..
1c90: 3a 20 70 77 2d 73 65 74 75 70 20 28 20 61 64 64 : pw-setup ( add
1ca0: 72 20 75 20 2d 2d 20 64 69 66 66 75 73 65 23 20 r u -- diffuse#
1cb0: 29 0a 20 20 20 20 5c 67 20 63 6f 6d 70 75 74 65 ). \g compute
1cc0: 20 62 65 74 77 65 65 6e 20 32 35 36 20 61 6e 64 between 256 and
1cd0: 20 72 69 64 69 63 75 6c 6f 75 73 6c 79 20 6d 61 ridiculously ma
1ce0: 6e 79 20 69 74 65 72 61 74 69 6f 6e 73 0a 20 20 ny iterations.
1cf0: 20 20 64 72 6f 70 20 63 40 20 24 46 20 61 6e 64 drop c@ $F and
1d00: 20 32 2a 20 70 77 2d 6c 65 76 65 6c 30 20 73 77 2* pw-level0 sw
1d10: 61 70 20 6c 73 68 69 66 74 20 3b 0a 0a 3a 20 65 ap lshift ;..: e
1d20: 6e 63 72 79 70 74 2d 70 77 24 20 28 20 61 64 64 ncrypt-pw$ ( add
1d30: 72 20 75 31 20 6b 65 79 20 75 32 20 6e 20 2d 2d r u1 key u2 n --
1d40: 20 29 0a 20 20 20 20 63 72 79 70 74 2d 70 77 2d ). crypt-pw-
1d50: 73 65 74 75 70 20 20 70 77 2d 64 69 66 66 75 73 setup pw-diffus
1d60: 65 20 20 6b 65 79 2d 63 6b 73 75 6d 23 20 2d 20 e key-cksum# -
1d70: 30 20 63 3a 65 6e 63 72 79 70 74 2b 61 75 74 68 0 c:encrypt+auth
1d80: 20 3b 0a 0a 3a 20 64 65 63 72 79 70 74 2d 70 77 ;..: decrypt-pw
1d90: 24 20 28 20 61 64 64 72 20 75 31 20 6b 65 79 20 $ ( addr u1 key
1da0: 75 32 20 2d 2d 20 61 64 64 72 27 20 75 27 20 66 u2 -- addr' u' f
1db0: 6c 61 67 20 29 20 20 32 6f 76 65 72 20 70 77 2d lag ) 2over pw-
1dc0: 73 65 74 75 70 20 3e 72 0a 20 20 20 20 63 72 79 setup >r. cry
1dd0: 70 74 2d 6b 65 79 2d 69 6e 69 74 20 20 20 72 3e pt-key-init r>
1de0: 20 70 77 2d 64 69 66 66 75 73 65 20 6b 65 79 2d pw-diffuse key-
1df0: 63 6b 73 75 6d 23 20 2d 20 32 64 75 70 20 30 20 cksum# - 2dup 0
1e00: 63 3a 64 65 63 72 79 70 74 2b 61 75 74 68 20 3b c:decrypt+auth ;
1e10: 0a 0a 5c 20 65 6e 63 72 79 70 74 2f 64 65 63 72 ..\ encrypt/decr
1e20: 79 70 74 20 68 65 61 64 65 72 0a 0a 3a 20 68 65 ypt header..: he
1e30: 61 64 65 72 2d 65 6e 63 72 79 70 74 20 28 20 61 ader-encrypt ( a
1e40: 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 79 6f 75 ddr -- ). you
1e50: 72 2d 30 6b 65 79 20 68 65 61 64 65 72 2d 79 6f r-0key header-yo
1e60: 75 72 2d 6b 65 79 20 73 77 61 70 20 6d 6f 76 65 ur-key swap move
1e70: 0a 20 20 20 20 68 65 61 64 65 72 2d 79 6f 75 72 . header-your
1e80: 2d 6b 65 79 20 73 77 61 70 20 64 75 70 20 24 43 -key swap dup $C
1e90: 20 74 66 5f 65 6e 63 72 79 70 74 5f 32 35 36 20 tf_encrypt_256
1ea0: 3b 0a 3a 20 68 65 61 64 65 72 2d 64 65 63 72 79 ;.: header-decry
1eb0: 70 74 20 28 20 61 64 64 72 20 2d 2d 20 29 0a 20 pt ( addr -- ).
1ec0: 20 20 20 68 65 61 64 65 72 2d 6b 65 79 20 73 77 header-key sw
1ed0: 61 70 20 64 75 70 20 24 30 20 74 66 5f 64 65 63 ap dup $0 tf_dec
1ee0: 72 79 70 74 5f 32 35 36 20 3b 0a 0a 5c 20 65 6e rypt_256 ;..\ en
1ef0: 63 72 79 70 74 20 77 69 74 68 20 6f 77 6e 20 6b crypt with own k
1f00: 65 79 0a 0a 3a 20 6d 79 6b 65 79 2d 65 6e 63 72 ey..: mykey-encr
1f10: 79 70 74 24 20 28 20 61 64 64 72 20 75 20 2d 2d ypt$ ( addr u --
1f20: 20 29 20 2b 63 61 6c 63 0a 20 20 20 20 6d 79 6b ) +calc. myk
1f30: 65 79 28 20 32 64 75 70 20 29 20 6d 79 6b 65 79 ey( 2dup ) mykey
1f40: 20 73 74 61 74 65 23 20 65 6e 63 72 79 70 74 24 state# encrypt$
1f50: 20 2b 65 6e 63 0a 20 20 20 20 6d 79 6b 65 79 28 +enc. mykey(
1f60: 20 3c 69 6e 66 6f 3e 20 2e 22 20 6d 79 6b 65 79 <info> ." mykey
1f70: 20 65 6e 63 3a 20 22 20 6d 79 6b 65 79 20 34 20 enc: " mykey 4
1f80: 38 35 74 79 70 65 20 73 70 61 63 65 0a 20 20 20 85type space.
1f90: 20 64 75 70 20 34 20 2d 20 2f 73 74 72 69 6e 67 dup 4 - /string
1fa0: 20 38 35 74 79 70 65 20 3c 64 65 66 61 75 6c 74 85type <default
1fb0: 3e 20 63 72 20 29 20 3b 0a 0a 3a 20 6d 79 6b 65 > cr ) ;..: myke
1fc0: 79 2d 64 65 63 72 79 70 74 24 20 28 20 61 64 64 y-decrypt$ ( add
1fd0: 72 20 75 20 2d 2d 20 61 64 64 72 27 20 75 27 20 r u -- addr' u'
1fe0: 66 6c 61 67 20 29 0a 20 20 20 20 2b 63 61 6c 63 flag ). +calc
1ff0: 20 32 64 75 70 20 6d 79 6b 65 79 20 73 74 61 74 2dup mykey stat
2000: 65 23 20 64 65 63 72 79 70 74 24 0a 20 20 20 20 e# decrypt$.
2010: 49 46 20 20 2b 65 6e 63 20 6d 79 6b 65 79 28 20 IF +enc mykey(
2020: 3c 69 6e 66 6f 3e 20 2e 22 20 6d 79 6b 65 79 20 <info> ." mykey
2030: 64 65 63 72 79 70 74 65 64 22 20 63 72 20 3c 64 decrypted" cr <d
2040: 65 66 61 75 6c 74 3e 20 29 0a 09 32 6e 69 70 20 efault> )..2nip
2050: 74 72 75 65 20 20 45 58 49 54 20 20 54 48 45 4e true EXIT THEN
2060: 20 20 32 64 72 6f 70 20 6d 79 6b 65 79 28 20 3c 2drop mykey( <
2070: 77 61 72 6e 3e 20 2e 22 20 74 72 79 20 6f 6c 64 warn> ." try old
2080: 6d 79 6b 65 79 20 22 20 29 0a 20 20 20 20 6f 6c mykey " ). ol
2090: 64 6d 79 6b 65 79 20 73 74 61 74 65 23 20 64 65 dmykey state# de
20a0: 63 72 79 70 74 24 20 2b 65 6e 63 20 6d 79 6b 65 crypt$ +enc myke
20b0: 79 28 20 64 75 70 20 49 46 0a 09 3c 69 6e 66 6f y( dup IF..<info
20c0: 3e 20 2e 22 20 73 75 63 63 65 65 64 65 64 2e 2e > ." succeeded..
20d0: 2e 22 20 20 45 4c 53 45 20 20 3c 65 72 72 3e 20 ." ELSE <err>
20e0: 2e 22 20 66 61 69 6c 65 64 2e 2e 2e 22 20 20 54 ." failed..." T
20f0: 48 45 4e 0a 20 20 20 20 3c 64 65 66 61 75 6c 74 HEN. <default
2100: 3e 20 20 63 72 20 29 20 3b 0a 0a 3a 20 6f 75 74 > cr ) ;..: out
2110: 62 75 66 2d 65 6e 63 72 79 70 74 20 28 20 6d 61 buf-encrypt ( ma
2120: 70 20 2d 2d 20 29 20 2b 63 61 6c 63 0a 20 20 20 p -- ) +calc.
2130: 20 2e 6d 61 70 63 3a 69 76 73 3e 73 6f 75 72 63 .mapc:ivs>sourc
2140: 65 3f 20 6f 75 74 62 75 66 20 70 61 63 6b 65 74 e? outbuf packet
2150: 2d 64 61 74 61 20 2b 63 72 79 70 74 73 75 0a 20 -data +cryptsu.
2160: 20 20 20 6f 75 74 62 75 66 20 31 2b 20 63 40 20 outbuf 1+ c@
2170: 63 3a 65 6e 63 72 79 70 74 2b 61 75 74 68 20 2b c:encrypt+auth +
2180: 65 6e 63 20 3b 0a 0a 3a 20 69 6e 62 75 66 2d 64 enc ;..: inbuf-d
2190: 65 63 72 79 70 74 20 28 20 6d 61 70 20 2d 2d 20 ecrypt ( map --
21a0: 66 6c 61 67 20 29 20 2b 63 61 6c 63 0a 20 20 20 flag ) +calc.
21b0: 20 2e 6d 61 70 63 3a 69 76 73 3e 73 6f 75 72 63 .mapc:ivs>sourc
21c0: 65 3f 20 69 6e 62 75 66 20 70 61 63 6b 65 74 2d e? inbuf packet-
21d0: 64 61 74 61 20 2b 63 72 79 70 74 73 75 0a 20 20 data +cryptsu.
21e0: 20 20 69 6e 62 75 66 20 31 2b 20 63 40 20 63 3a inbuf 1+ c@ c:
21f0: 64 65 63 72 79 70 74 2b 61 75 74 68 20 2b 65 6e decrypt+auth +en
2200: 63 20 3b 0a 0a 3a 20 73 65 74 2d 30 6b 65 79 20 c ;..: set-0key
2210: 28 20 74 77 65 61 6b 31 32 38 20 6b 65 79 61 64 ( tweak128 keyad
2220: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 64 75 dr u -- ). du
2230: 70 20 30 3d 20 49 46 20 20 32 64 72 6f 70 20 6e p 0= IF 2drop n
2240: 6f 2d 6b 65 79 20 73 74 61 74 65 23 20 20 54 48 o-key state# TH
2250: 45 4e 0a 20 20 20 20 63 6d 64 30 28 20 2e 22 20 EN. cmd0( ."
2260: 30 6b 65 79 3a 20 22 20 32 64 75 70 20 38 35 74 0key: " 2dup 85t
2270: 79 70 65 20 63 72 20 29 0a 20 20 20 20 63 3a 74 ype cr ). c:t
2280: 77 65 61 6b 6b 65 79 21 20 3b 0a 0a 3a 20 74 72 weakkey! ;..: tr
2290: 79 2d 30 64 65 63 72 79 70 74 20 28 20 61 64 64 y-0decrypt ( add
22a0: 72 20 2d 2d 20 66 6c 61 67 20 29 20 3e 72 0a 20 r -- flag ) >r.
22b0: 20 20 20 69 6e 62 75 66 20 6d 61 70 61 64 64 72 inbuf mapaddr
22c0: 20 6c 65 2d 36 34 40 20 69 6e 62 75 66 20 68 64 le-64@ inbuf hd
22d0: 72 66 6c 61 67 73 20 6c 65 2d 75 77 40 20 61 64 rflags le-uw@ ad
22e0: 64 72 3e 61 73 73 65 6d 62 6c 79 0a 20 20 20 20 dr>assembly.
22f0: 72 3e 20 73 65 63 40 20 73 65 74 2d 30 6b 65 79 r> sec@ set-0key
2300: 0a 20 20 20 20 69 6e 62 75 66 20 70 61 63 6b 65 . inbuf packe
2310: 74 2d 64 61 74 61 20 74 6d 70 62 75 66 20 73 77 t-data tmpbuf sw
2320: 61 70 20 32 64 75 70 20 32 3e 72 20 24 31 30 20 ap 2dup 2>r $10
2330: 2b 20 6d 6f 76 65 0a 20 20 20 20 32 72 3e 20 2b + move. 2r> +
2340: 63 72 79 70 74 73 75 0a 20 20 20 20 69 6e 62 75 cryptsu. inbu
2350: 66 20 31 2b 20 63 40 20 63 3a 64 65 63 72 79 70 f 1+ c@ c:decryp
2360: 74 2b 61 75 74 68 20 2b 65 6e 63 0a 20 20 20 20 t+auth +enc.
2370: 64 75 70 20 49 46 20 20 74 6d 70 62 75 66 20 69 dup IF tmpbuf i
2380: 6e 62 75 66 20 70 61 63 6b 65 74 2d 64 61 74 61 nbuf packet-data
2390: 20 6d 6f 76 65 20 20 54 48 45 4e 20 3b 0a 0a 3a move THEN ;..:
23a0: 20 69 6e 62 75 66 30 2d 64 65 63 72 79 70 74 20 inbuf0-decrypt
23b0: 28 20 2d 2d 20 66 6c 61 67 20 29 20 2b 63 61 6c ( -- flag ) +cal
23c0: 63 0a 20 20 20 20 6d 79 2d 30 6b 65 79 20 74 72 c. my-0key tr
23d0: 79 2d 30 64 65 63 72 79 70 74 20 3b 0a 0a 3a 20 y-0decrypt ;..:
23e0: 6f 75 74 62 75 66 30 2d 65 6e 63 72 79 70 74 20 outbuf0-encrypt
23f0: 28 20 2d 2d 20 29 20 2b 63 61 6c 63 0a 20 20 20 ( -- ) +calc.
2400: 20 6f 75 74 62 75 66 20 6d 61 70 61 64 64 72 20 outbuf mapaddr
2410: 6c 65 2d 36 34 40 20 6f 75 74 62 75 66 20 68 64 le-64@ outbuf hd
2420: 72 66 6c 61 67 73 20 6c 65 2d 75 77 40 20 61 64 rflags le-uw@ ad
2430: 64 72 3e 61 73 73 65 6d 62 6c 79 0a 20 20 20 20 dr>assembly.
2440: 79 6f 75 72 2d 30 6b 65 79 20 20 73 65 74 2d 30 your-0key set-0
2450: 6b 65 79 0a 20 20 20 20 6f 75 74 62 75 66 20 70 key. outbuf p
2460: 61 63 6b 65 74 2d 64 61 74 61 20 2b 63 72 79 70 acket-data +cryp
2470: 74 73 75 0a 20 20 20 20 6f 75 74 62 75 66 20 31 tsu. outbuf 1
2480: 2b 20 63 40 20 63 3a 65 6e 63 72 79 70 74 2b 61 + c@ c:encrypt+a
2490: 75 74 68 20 2b 65 6e 63 20 3b 0a 0a 5c 20 49 56 uth +enc ;..\ IV
24a0: 53 0a 0a 53 65 6d 61 20 72 65 67 65 6e 2d 73 65 S..Sema regen-se
24b0: 6d 61 0a 0a 3a 20 6b 65 79 70 61 64 24 20 28 20 ma..: keypad$ (
24c0: 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20 20 20 -- addr u ).
24d0: 64 6f 2d 6b 65 79 70 61 64 20 73 65 63 40 20 64 do-keypad sec@ d
24e0: 75 70 20 30 3d 20 49 46 20 20 32 64 72 6f 70 20 up 0= IF 2drop
24f0: 20 63 72 79 70 74 6f 2d 6b 65 79 20 73 65 63 40 crypto-key sec@
2500: 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 3e 63 72 79 THEN ;..: >cry
2510: 70 74 2d 6b 65 79 2d 69 76 73 20 28 20 2d 2d 20 pt-key-ivs ( --
2520: 29 0a 20 20 20 20 6f 20 30 3d 20 49 46 20 20 6e ). o 0= IF n
2530: 6f 2d 6b 65 79 20 73 74 61 74 65 23 20 20 45 4c o-key state# EL
2540: 53 45 20 20 6b 65 79 70 61 64 24 20 20 54 48 45 SE keypad$ THE
2550: 4e 0a 20 20 20 20 63 72 79 70 74 28 20 2e 22 20 N. crypt( ."
2560: 69 76 73 20 6b 65 79 3a 20 22 20 32 64 75 70 20 ivs key: " 2dup
2570: 2e 6e 6e 62 20 63 72 20 29 0a 20 20 20 20 3e 63 .nnb cr ). >c
2580: 72 79 70 74 2d 6b 65 79 20 3b 0a 0a 73 63 6f 70 rypt-key ;..scop
2590: 65 7b 20 6d 61 70 63 0a 0a 3a 20 72 65 67 65 6e e{ mapc..: regen
25a0: 2d 69 76 73 2f 32 20 28 20 2d 2d 20 29 0a 20 20 -ivs/2 ( -- ).
25b0: 20 20 5b 3a 20 63 3a 6b 65 79 40 20 3e 72 0a 09 [: c:key@ >r..
25c0: 64 65 73 74 2d 69 76 73 67 65 6e 20 6b 61 6c 69 dest-ivsgen kali
25d0: 67 6e 20 72 65 70 6c 79 28 20 2e 22 20 72 65 67 gn reply( ." reg
25e0: 65 6e 2d 69 76 73 2f 32 20 22 20 64 75 70 20 63 en-ivs/2 " dup c
25f0: 3a 6b 65 79 23 20 2e 6e 6e 62 20 63 72 20 29 20 :key# .nnb cr )
2600: 63 3a 6b 65 79 21 0a 09 63 6c 65 61 72 2d 72 65 c:key!..clear-re
2610: 70 6c 69 65 73 0a 09 64 65 73 74 2d 69 76 73 24 plies..dest-ivs$
2620: 20 64 65 73 74 2d 61 2f 62 20 63 3a 70 72 6e 67 dest-a/b c:prng
2630: 20 69 76 73 28 20 2e 22 20 52 65 67 65 6e 20 41 ivs( ." Regen A
2640: 2f 42 20 49 56 53 22 20 63 72 20 29 0a 09 32 20 /B IVS" cr )..2
2650: 61 64 64 72 20 64 65 73 74 2d 69 76 73 6c 61 73 addr dest-ivslas
2660: 74 67 65 6e 20 78 6f 72 63 21 20 72 3e 20 63 3a tgen xorc! r> c:
2670: 6b 65 79 21 20 3b 5d 0a 20 20 20 20 72 65 67 65 key! ;]. rege
2680: 6e 2d 73 65 6d 61 20 63 2d 73 65 63 74 69 6f 6e n-sema c-section
2690: 20 20 3b 0a 0a 3a 20 72 65 67 65 6e 2d 69 76 73 ;..: regen-ivs
26a0: 2d 61 6c 6c 20 28 20 6f 3a 6d 61 70 20 2d 2d 20 -all ( o:map --
26b0: 29 20 5b 3a 20 63 3a 6b 65 79 40 20 3e 72 0a 20 ) [: c:key@ >r.
26c0: 20 20 20 20 20 64 65 73 74 2d 69 76 73 67 65 6e dest-ivsgen
26d0: 20 6b 61 6c 69 67 6e 20 6b 65 79 28 20 2e 22 20 kalign key( ."
26e0: 72 65 67 65 6e 2d 69 76 73 20 22 20 64 75 70 20 regen-ivs " dup
26f0: 63 3a 6b 65 79 23 20 2e 6e 6e 62 20 63 72 20 29 c:key# .nnb cr )
2700: 20 63 3a 6b 65 79 21 0a 20 20 20 20 20 20 64 65 c:key!. de
2710: 73 74 2d 69 76 73 24 20 63 3a 70 72 6e 67 20 69 st-ivs$ c:prng i
2720: 76 73 28 20 2e 22 20 52 65 67 65 6e 20 61 6c 6c vs( ." Regen all
2730: 20 49 56 53 22 20 63 72 20 29 0a 20 20 20 20 20 IVS" cr ).
2740: 20 72 3e 20 63 3a 6b 65 79 21 20 3b 5d 0a 20 20 r> c:key! ;].
2750: 20 20 72 65 67 65 6e 2d 73 65 6d 61 20 63 2d 73 regen-sema c-s
2760: 65 63 74 69 6f 6e 20 3b 0a 0a 3a 20 72 65 73 74 ection ;..: rest
2770: 2b 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61 64 + ( addr u -- ad
2780: 64 72 20 75 20 29 0a 20 20 20 20 61 64 64 72 20 dr u ). addr
2790: 64 65 73 74 2d 69 76 73 72 65 73 74 24 20 24 40 dest-ivsrest$ $@
27a0: 6c 65 6e 20 49 46 0a 09 32 64 75 70 20 64 65 73 len IF..2dup des
27b0: 74 2d 69 76 73 72 65 73 74 24 20 72 6f 74 20 75 t-ivsrest$ rot u
27c0: 6d 69 6e 20 3e 72 20 73 77 61 70 20 72 40 20 6d min >r swap r@ m
27d0: 6f 76 65 0a 09 72 40 20 73 61 66 65 2f 73 74 72 ove..r@ safe/str
27e0: 69 6e 67 0a 09 61 64 64 72 20 64 65 73 74 2d 69 ing..addr dest-i
27f0: 76 73 72 65 73 74 24 20 30 20 72 3e 20 24 64 65 vsrest$ 0 r> $de
2800: 6c 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 l. THEN ;..:
2810: 72 65 73 74 2d 70 72 6e 67 20 28 20 61 64 64 72 rest-prng ( addr
2820: 20 75 20 2d 2d 20 29 0a 20 20 20 20 72 65 73 74 u -- ). rest
2830: 2b 0a 20 20 20 20 32 64 75 70 20 64 75 70 20 6b +. 2dup dup k
2840: 65 63 63 61 6b 23 6d 61 78 20 6e 65 67 61 74 65 eccak#max negate
2850: 20 61 6e 64 20 73 61 66 65 2f 73 74 72 69 6e 67 and safe/string
2860: 20 32 3e 72 0a 20 20 20 20 6b 65 63 63 61 6b 23 2>r. keccak#
2870: 6d 61 78 20 6e 65 67 61 74 65 20 61 6e 64 20 63 max negate and c
2880: 3a 70 72 6e 67 0a 20 20 20 20 32 72 3e 20 64 75 :prng. 2r> du
2890: 70 20 49 46 0a 09 6b 65 63 63 61 6b 23 6d 61 78 p IF..keccak#max
28a0: 20 61 64 64 72 20 64 65 73 74 2d 69 76 73 72 65 addr dest-ivsre
28b0: 73 74 24 20 24 21 6c 65 6e 20 20 64 65 73 74 2d st$ $!len dest-
28c0: 69 76 73 72 65 73 74 24 20 63 3a 70 72 6e 67 0a ivsrest$ c:prng.
28d0: 09 72 65 73 74 2b 0a 20 20 20 20 54 48 45 4e 20 .rest+. THEN
28e0: 20 32 64 72 6f 70 20 3b 0a 0a 3a 20 72 65 67 65 2drop ;..: rege
28f0: 6e 2d 69 76 73 2d 70 61 72 74 20 28 20 6f 6c 64 n-ivs-part ( old
2900: 2d 62 61 63 6b 20 6e 65 77 2d 62 61 63 6b 20 2d -back new-back -
2910: 2d 20 29 0a 20 20 20 20 5b 3a 20 63 3a 6b 65 79 - ). [: c:key
2920: 40 20 3e 72 0a 20 20 20 20 20 20 64 65 73 74 2d @ >r. dest-
2930: 69 76 73 67 65 6e 20 6b 61 6c 69 67 6e 0a 20 20 ivsgen kalign.
2940: 20 20 20 20 72 65 67 65 6e 28 20 2e 22 20 72 65 regen( ." re
2950: 67 65 6e 2d 69 76 73 2d 70 61 72 74 20 22 20 32 gen-ivs-part " 2
2960: 20 70 69 63 6b 20 68 65 78 2e 20 6f 76 65 72 20 pick hex. over
2970: 68 65 78 2e 20 64 75 70 20 63 3a 6b 65 79 23 20 hex. dup c:key#
2980: 2e 6e 6e 62 20 63 72 20 29 0a 20 20 20 20 20 20 .nnb cr ).
2990: 63 3a 6b 65 79 21 0a 20 20 20 20 20 20 73 77 61 c:key!. swa
29a0: 70 20 55 2b 44 4f 0a 09 20 20 49 20 49 27 20 66 p U+DO.. I I' f
29b0: 69 78 2d 73 69 7a 65 20 64 75 70 20 7b 20 6c 65 ix-size dup { le
29c0: 6e 20 7d 0a 09 20 20 61 64 64 72 3e 6b 65 79 73 n }.. addr>keys
29d0: 20 3e 72 20 61 64 64 72 3e 6b 65 79 73 20 3e 72 >r addr>keys >r
29e0: 20 64 65 73 74 2d 69 76 73 24 20 72 3e 20 73 61 dest-ivs$ r> sa
29f0: 66 65 2f 73 74 72 69 6e 67 20 72 3e 20 75 6d 69 fe/string r> umi
2a00: 6e 0a 09 20 20 72 65 73 74 2d 70 72 6e 67 0a 20 n.. rest-prng.
2a10: 20 20 20 20 20 6c 65 6e 20 2b 4c 4f 4f 50 0a 20 len +LOOP.
2a20: 20 20 20 20 20 72 65 67 65 6e 28 20 2e 22 20 72 regen( ." r
2a30: 65 67 65 6e 2d 69 76 73 2d 70 61 72 74 27 20 22 egen-ivs-part' "
2a40: 20 64 65 73 74 2d 69 76 73 67 65 6e 20 6b 61 6c dest-ivsgen kal
2a50: 69 67 6e 20 63 3a 6b 65 79 23 20 2e 6e 6e 62 20 ign c:key# .nnb
2a60: 63 72 20 29 0a 20 20 20 20 20 20 72 3e 20 63 3a cr ). r> c:
2a70: 6b 65 79 21 20 3b 5d 20 72 65 67 65 6e 2d 73 65 key! ;] regen-se
2a80: 6d 61 20 63 2d 73 65 63 74 69 6f 6e 20 3b 0a 0a ma c-section ;..
2a90: 3a 20 28 72 65 67 65 6e 2d 69 76 73 29 20 28 20 : (regen-ivs) (
2aa0: 6f 66 66 73 65 74 20 6f 3a 6d 61 70 20 2d 2d 20 offset o:map --
2ab0: 29 0a 20 20 20 20 61 64 64 72 20 64 65 73 74 2d ). addr dest-
2ac0: 69 76 73 24 20 24 40 6c 65 6e 20 32 2f 20 32 2f ivs$ $@len 2/ 2/
2ad0: 20 2f 20 64 65 73 74 2d 69 76 73 6c 61 73 74 67 / dest-ivslastg
2ae0: 65 6e 20 3d 0a 20 20 20 20 49 46 09 74 77 65 61 en =. IF.twea
2af0: 6b 28 20 2e 22 20 72 65 67 65 6e 2d 69 76 73 2f k( ." regen-ivs/
2b00: 32 22 20 63 72 20 29 20 72 65 67 65 6e 2d 69 76 2" cr ) regen-iv
2b10: 73 2f 32 20 20 54 48 45 4e 20 3b 0a 27 20 28 72 s/2 THEN ;.' (r
2b20: 65 67 65 6e 2d 69 76 73 29 20 63 6f 64 65 2d 63 egen-ivs) code-c
2b30: 6c 61 73 73 20 74 6f 20 72 65 67 65 6e 2d 69 76 lass to regen-iv
2b40: 73 0a 27 20 28 72 65 67 65 6e 2d 69 76 73 29 20 s.' (regen-ivs)
2b50: 72 63 6f 64 65 2d 63 6c 61 73 73 20 74 6f 20 72 rcode-class to r
2b60: 65 67 65 6e 2d 69 76 73 0a 0a 7d 73 63 6f 70 65 egen-ivs..}scope
2b70: 0a 0a 3a 20 6f 6e 65 2d 69 76 73 20 28 20 6d 61 ..: one-ivs ( ma
2b80: 70 2d 61 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 p-addr -- ).
2b90: 77 69 74 68 20 6d 61 70 63 20 63 3a 6b 65 79 40 with mapc c:key@
2ba0: 20 3e 72 0a 20 20 20 20 6b 65 79 2d 61 73 73 65 >r. key-asse
2bb0: 6d 62 6c 79 20 73 74 61 74 65 32 23 20 63 3a 70 mbly state2# c:p
2bc0: 72 6e 67 0a 20 20 20 20 64 65 73 74 2d 69 76 73 rng. dest-ivs
2bd0: 67 65 6e 20 6b 61 6c 69 67 6e 20 63 3a 6b 65 79 gen kalign c:key
2be0: 21 20 20 6b 65 79 2d 61 73 73 65 6d 62 6c 79 20 ! key-assembly
2bf0: 3e 63 3a 6b 65 79 0a 20 20 20 20 64 65 73 74 2d >c:key. dest-
2c00: 73 69 7a 65 20 61 64 64 72 3e 6b 65 79 73 20 61 size addr>keys a
2c10: 64 64 72 20 64 65 73 74 2d 69 76 73 24 20 24 21 ddr dest-ivs$ $!
2c20: 6c 65 6e 0a 20 20 20 20 64 65 73 74 2d 69 76 73 len. dest-ivs
2c30: 24 20 63 3a 70 72 6e 67 20 69 76 73 28 20 2e 22 $ c:prng ivs( ."
2c40: 20 52 65 67 65 6e 20 6f 6e 65 20 49 56 53 22 20 Regen one IVS"
2c50: 63 72 20 29 0a 20 20 20 20 72 3e 20 63 3a 6b 65 cr ). r> c:ke
2c60: 79 21 20 65 6e 64 77 69 74 68 20 3b 0a 0a 3a 20 y! endwith ;..:
2c70: 63 6c 65 61 72 2d 6b 65 79 73 20 28 20 2d 2d 20 clear-keys ( --
2c80: 29 0a 20 20 20 20 63 72 79 70 74 6f 2d 6b 65 79 ). crypto-key
2c90: 20 73 65 63 2d 66 72 65 65 20 20 74 73 6b 63 20 sec-free tskc
2ca0: 4b 45 59 42 59 54 45 53 20 65 72 61 73 65 20 20 KEYBYTES erase
2cb0: 73 74 73 6b 63 20 4b 45 59 42 59 54 45 53 20 65 stskc KEYBYTES e
2cc0: 72 61 73 65 0a 20 20 20 20 74 72 75 65 20 74 6f rase. true to
2cd0: 20 6b 65 79 2d 73 65 74 75 70 3f 20 3b 0a 0a 5c key-setup? ;..\
2ce0: 20 57 65 20 67 65 6e 65 72 61 74 65 20 61 20 73 We generate a s
2cf0: 68 61 72 65 64 20 73 65 63 72 65 74 20 6f 75 74 hared secret out
2d00: 20 6f 66 20 74 68 72 65 65 20 70 61 72 74 73 3a of three parts:
2d10: 0a 5c 20 36 34 20 62 79 74 65 73 20 49 56 2c 20 .\ 64 bytes IV,
2d20: 33 32 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 32 bytes from th
2d30: 65 20 6f 6e 65 2d 74 69 6d 65 2d 6b 65 79 73 20 e one-time-keys
2d40: 61 6e 64 0a 5c 20 33 32 20 62 79 74 65 73 20 66 and.\ 32 bytes f
2d50: 72 6f 6d 20 74 68 65 20 70 65 72 6d 61 6e 65 6e rom the permanen
2d60: 74 20 6b 65 79 73 0a 0a 24 36 30 20 43 6f 6e 73 t keys..$60 Cons
2d70: 74 61 6e 74 20 72 6e 64 6b 65 79 23 0a 0a 3a 20 tant rndkey#..:
2d80: 70 75 6e 63 68 23 21 20 28 20 2d 2d 20 29 0a 20 punch#! ( -- ).
2d90: 20 20 20 5c 67 20 67 65 6e 65 72 61 74 65 20 61 \g generate a
2da0: 20 73 68 61 72 65 64 20 73 65 63 72 65 74 20 66 shared secret f
2db0: 6f 72 20 70 75 6e 63 68 69 6e 67 20 4e 41 54 20 or punching NAT
2dc0: 68 6f 6c 65 73 0a 20 20 20 20 70 75 6e 63 68 23 holes. punch#
2dd0: 20 24 32 30 20 63 3a 70 72 6e 67 20 3b 0a 3a 20 $20 c:prng ;.:
2de0: 72 65 63 65 69 76 65 2d 69 76 73 20 28 20 2d 2d receive-ivs ( --
2df0: 20 29 0a 20 20 20 20 67 65 6e 6b 65 79 28 20 2e ). genkey( .
2e00: 22 20 69 76 73 20 6b 65 79 3a 20 22 20 6b 65 79 " ivs key: " key
2e10: 3e 64 75 6d 70 20 6f 76 65 72 20 72 6e 64 6b 65 >dump over rndke
2e20: 79 23 20 78 74 79 70 65 20 63 72 0a 20 20 20 20 y# xtype cr.
2e30: 20 20 20 20 20 20 20 20 2e 22 20 63 6f 6e 20 6b ." con k
2e40: 65 79 3a 20 22 20 72 6e 64 6b 65 79 23 20 2f 73 ey: " rndkey# /s
2e50: 74 72 69 6e 67 20 78 74 79 70 65 20 63 72 20 29 tring xtype cr )
2e60: 0a 20 20 20 20 69 76 73 28 20 2e 22 20 72 65 67 . ivs( ." reg
2e70: 65 6e 20 72 65 63 65 69 76 65 20 49 56 53 22 20 en receive IVS"
2e80: 63 72 20 29 0a 20 20 20 20 63 6f 64 65 2d 6d 61 cr ). code-ma
2e90: 70 20 6f 6e 65 2d 69 76 73 20 20 20 63 6f 64 65 p one-ivs code
2ea0: 2d 72 6d 61 70 20 6f 6e 65 2d 69 76 73 0a 20 20 -rmap one-ivs.
2eb0: 20 20 64 61 74 61 2d 6d 61 70 20 6f 6e 65 2d 69 data-map one-i
2ec0: 76 73 20 20 20 64 61 74 61 2d 72 6d 61 70 20 6f vs data-rmap o
2ed0: 6e 65 2d 69 76 73 0a 20 20 20 20 70 75 6e 63 68 ne-ivs. punch
2ee0: 23 21 20 63 6c 65 61 72 2d 6b 65 79 73 20 3b 0a #! clear-keys ;.
2ef0: 0a 3a 20 73 65 6e 64 2d 69 76 73 20 28 20 2d 2d .: send-ivs ( --
2f00: 20 29 0a 20 20 20 20 67 65 6e 6b 65 79 28 20 2e ). genkey( .
2f10: 22 20 69 76 73 20 6b 65 79 3a 20 22 20 6b 65 79 " ivs key: " key
2f20: 3e 64 75 6d 70 20 6f 76 65 72 20 72 6e 64 6b 65 >dump over rndke
2f30: 79 23 20 78 74 79 70 65 20 63 72 0a 20 20 20 20 y# xtype cr.
2f40: 20 20 20 20 20 20 20 20 2e 22 20 63 6f 6e 20 6b ." con k
2f50: 65 79 3a 20 22 20 72 6e 64 6b 65 79 23 20 2f 73 ey: " rndkey# /s
2f60: 74 72 69 6e 67 20 78 74 79 70 65 20 63 72 20 29 tring xtype cr )
2f70: 0a 20 20 20 20 69 76 73 28 20 2e 22 20 72 65 67 . ivs( ." reg
2f80: 65 6e 20 73 65 6e 64 20 49 56 53 22 20 63 72 20 en send IVS" cr
2f90: 29 0a 20 20 20 20 63 6f 64 65 2d 72 6d 61 70 20 ). code-rmap
2fa0: 6f 6e 65 2d 69 76 73 20 20 63 6f 64 65 2d 6d 61 one-ivs code-ma
2fb0: 70 20 6f 6e 65 2d 69 76 73 0a 20 20 20 20 64 61 p one-ivs. da
2fc0: 74 61 2d 72 6d 61 70 20 6f 6e 65 2d 69 76 73 20 ta-rmap one-ivs
2fd0: 20 64 61 74 61 2d 6d 61 70 20 6f 6e 65 2d 69 76 data-map one-iv
2fe0: 73 0a 20 20 20 20 70 75 6e 63 68 23 21 20 63 6c s. punch#! cl
2ff0: 65 61 72 2d 6b 65 79 73 20 3b 0a 0a 3a 20 69 76 ear-keys ;..: iv
3000: 73 2d 73 74 72 69 6e 67 73 20 28 20 61 64 64 72 s-strings ( addr
3010: 20 75 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 2d u -- ). key-
3020: 73 65 74 75 70 3f 20 21 21 64 6f 75 62 6c 65 6b setup? !!doublek
3030: 65 79 21 21 0a 20 20 20 20 64 75 70 20 73 74 61 ey!!. dup sta
3040: 74 65 23 20 3c 3e 20 21 21 69 76 73 21 21 20 3e te# <> !!ivs!! >
3050: 63 72 79 70 74 2d 73 6f 75 72 63 65 20 3e 63 72 crypt-source >cr
3060: 79 70 74 2d 6b 65 79 2d 69 76 73 20 3b 0a 0a 5c ypt-key-ivs ;..\
3070: 20 68 61 73 68 20 77 69 74 68 20 6b 65 79 20 61 hash with key a
3080: 6e 64 20 73 6b 73 69 67 20 67 65 6e 65 72 61 74 nd sksig generat
3090: 69 6f 6e 0a 0a 3a 20 3e 6b 65 79 65 64 2d 68 61 ion..: >keyed-ha
30a0: 73 68 20 28 20 76 61 6c 61 64 64 72 20 75 76 61 sh ( valaddr uva
30b0: 6c 20 6b 65 79 61 64 64 72 20 75 6b 65 79 20 2d l keyaddr ukey -
30c0: 2d 20 29 0a 20 20 20 20 5c 67 20 67 65 6e 65 72 - ). \g gener
30d0: 61 74 65 20 61 20 6b 65 79 65 64 20 68 61 73 68 ate a keyed hash
30e0: 3a 20 6b 65 79 61 64 64 72 20 75 6b 65 79 20 69 : keyaddr ukey i
30f0: 73 20 74 68 65 20 6b 65 79 20 66 6f 72 20 68 61 s the key for ha
3100: 73 69 6e 67 20 76 61 6c 61 64 64 72 20 75 76 61 sing valaddr uva
3110: 6c 0a 20 20 20 20 5c 20 68 61 73 68 28 20 2e 22 l. \ hash( ."
3120: 20 68 61 73 68 69 6e 67 3a 20 22 20 32 6f 76 65 hashing: " 2ove
3130: 72 20 38 35 74 79 70 65 20 27 3a 27 20 65 6d 69 r 85type ':' emi
3140: 74 20 32 64 75 70 20 38 35 74 79 70 65 20 63 72 t 2dup 85type cr
3150: 20 29 0a 20 20 20 20 63 3a 68 61 73 68 20 63 3a ). c:hash c:
3160: 68 61 73 68 0a 20 20 20 20 5c 20 68 61 73 68 28 hash. \ hash(
3170: 20 40 6b 65 63 63 61 6b 20 32 30 30 20 38 35 74 @keccak 200 85t
3180: 79 70 65 20 63 72 20 63 72 20 29 20 5c 20 64 65 ype cr cr ) \ de
3190: 62 75 67 67 69 6e 67 20 6d 61 79 20 6c 65 61 6b bugging may leak
31a0: 20 73 65 63 72 65 74 73 21 0a 3b 0a 0a 5c 20 70 secrets!.;..\ p
31b0: 75 62 6c 69 63 20 6b 65 79 20 65 6e 63 72 79 70 ublic key encryp
31c0: 74 69 6f 6e 0a 0a 5c 20 74 68 65 20 74 68 65 6f tion..\ the theo
31d0: 72 79 20 68 65 72 65 20 69 73 20 74 68 61 74 20 ry here is that
31e0: 70 6b 63 2a 73 6b 73 20 3d 20 70 6b 73 2a 73 6b pkc*sks = pks*sk
31f0: 63 0a 5c 20 62 65 63 61 75 73 65 20 70 6b 3d 62 c.\ because pk=b
3200: 61 73 65 2a 73 6b 2c 20 73 6f 20 62 61 73 65 2a ase*sk, so base*
3210: 73 6b 63 2a 73 6b 73 20 3d 20 62 61 73 65 2a 73 skc*sks = base*s
3220: 6b 73 2a 73 6b 63 0a 5c 20 62 61 73 65 20 61 6e ks*skc.\ base an
3230: 64 20 70 6b 20 61 72 65 20 70 6f 69 6e 74 73 20 d pk are points
3240: 6f 6e 20 74 68 65 20 63 75 72 76 65 2c 20 73 6b on the curve, sk
3250: 20 69 73 20 61 20 73 6b 61 6c 61 72 0a 5c 20 77 is a skalar.\ w
3260: 65 20 73 65 6e 64 20 6f 75 72 20 70 75 62 6c 69 e send our publi
3270: 63 20 6b 65 79 20 61 6e 64 20 71 75 65 72 79 20 c key and query
3280: 74 68 65 20 73 65 72 76 65 72 27 73 20 70 75 62 the server's pub
3290: 6c 69 63 20 6b 65 79 2e 0a 0a 3a 20 67 65 6e 2d lic key...: gen-
32a0: 6b 65 79 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 keys ( -- ).
32b0: 5c 67 20 67 65 6e 65 72 61 74 65 20 72 65 76 6f \g generate revo
32c0: 63 61 62 6c 65 20 6b 65 79 70 61 69 72 0a 20 20 cable keypair.
32d0: 20 20 73 6b 31 20 70 6b 31 20 65 64 2d 6b 65 79 sk1 pk1 ed-key
32e0: 70 61 69 72 20 5c 20 67 65 6e 65 72 61 74 65 20 pair \ generate
32f0: 66 69 72 73 74 20 6b 65 79 70 61 69 72 0a 20 20 first keypair.
3300: 20 20 73 6b 72 65 76 20 70 6b 72 65 76 20 65 64 skrev pkrev ed
3310: 2d 6b 65 79 70 61 69 72 20 5c 20 67 65 6e 65 72 -keypair \ gener
3320: 61 74 65 20 6b 65 79 70 61 69 72 20 66 6f 72 20 ate keypair for
3330: 72 65 63 6f 76 65 72 79 0a 20 20 20 20 73 6b 31 recovery. sk1
3340: 20 70 6b 72 65 76 20 73 6b 63 20 70 6b 63 20 65 pkrev skc pkc e
3350: 64 2d 6b 65 79 70 61 69 72 78 20 5c 20 67 65 6e d-keypairx \ gen
3360: 65 72 61 74 65 20 72 65 61 6c 20 6b 65 79 70 61 erate real keypa
3370: 69 72 0a 20 20 20 20 67 65 6e 6b 65 79 28 20 2e ir. genkey( .
3380: 22 20 67 65 6e 20 6b 65 79 3a 20 22 20 73 6b 63 " gen key: " skc
3390: 20 6b 65 79 73 69 7a 65 20 2e 38 35 77 61 72 6e keysize .85warn
33a0: 20 70 6b 63 20 6b 65 79 73 69 7a 65 20 2e 38 35 pkc keysize .85
33b0: 69 6e 66 6f 20 63 72 20 29 0a 3b 0a 3a 20 63 68 info cr ).;.: ch
33c0: 65 63 6b 2d 72 65 76 3f 20 28 20 70 6b 20 2d 2d eck-rev? ( pk --
33d0: 20 66 6c 61 67 20 29 0a 20 20 20 20 5c 67 20 63 flag ). \g c
33e0: 68 65 63 6b 20 67 65 6e 65 72 61 74 65 64 20 6b heck generated k
33f0: 65 79 20 69 66 20 72 65 76 6f 63 61 74 69 6f 6e ey if revocation
3400: 20 69 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 is possible.
3410: 20 3e 72 20 73 6b 72 65 76 20 70 6b 72 65 76 20 >r skrev pkrev
3420: 73 6b 3e 70 6b 20 70 6b 72 65 76 20 64 75 70 20 sk>pk pkrev dup
3430: 73 6b 2d 6d 61 73 6b 0a 20 20 20 20 72 40 20 6b sk-mask. r@ k
3440: 65 79 73 69 7a 65 20 2b 20 6b 65 79 70 61 64 20 eysize + keypad
3450: 65 64 2d 64 68 20 72 3e 20 6b 65 79 73 69 7a 65 ed-dh r> keysize
3460: 20 73 74 72 3d 20 3b 0a 3a 20 67 65 6e 2d 74 6d str= ;.: gen-tm
3470: 70 6b 65 79 73 20 28 20 2d 2d 20 29 20 74 73 6b pkeys ( -- ) tsk
3480: 63 20 74 70 6b 63 20 65 64 2d 6b 65 79 70 61 69 c tpkc ed-keypai
3490: 72 0a 20 20 20 20 67 65 6e 6b 65 79 28 20 2e 22 r. genkey( ."
34a0: 20 74 6d 70 20 6b 65 79 3a 20 22 20 74 73 6b 63 tmp key: " tskc
34b0: 20 6b 65 79 73 69 7a 65 20 2e 38 35 77 61 72 6e keysize .85warn
34c0: 20 74 70 6b 63 20 6b 65 79 73 69 7a 65 20 2e 38 tpkc keysize .8
34d0: 35 69 6e 66 6f 20 63 72 20 29 20 3b 0a 3a 20 67 5info cr ) ;.: g
34e0: 65 6e 2d 73 74 6b 65 79 73 20 28 20 2d 2d 20 29 en-stkeys ( -- )
34f0: 20 73 74 73 6b 63 20 73 74 70 6b 63 20 65 64 2d stskc stpkc ed-
3500: 6b 65 79 70 61 69 72 0a 20 20 20 20 67 65 6e 6b keypair. genk
3510: 65 79 28 20 2e 22 20 74 6d 70 73 6b 65 79 3a 20 ey( ." tmpskey:
3520: 22 20 73 74 73 6b 63 20 6b 65 79 73 69 7a 65 20 " stskc keysize
3530: 2e 38 35 77 61 72 6e 20 73 74 70 6b 63 20 6b 65 .85warn stpkc ke
3540: 79 73 69 7a 65 20 2e 38 35 69 6e 66 6f 20 63 72 ysize .85info cr
3550: 20 29 20 3b 0a 0a 5c 20 65 6e 63 72 79 70 74 20 ) ;..\ encrypt
3560: 66 6f 72 20 6f 6e 65 20 73 69 6e 67 6c 65 20 72 for one single r
3570: 65 63 65 69 76 65 72 0a 0a 3a 20 70 6b 2d 65 6e eceiver..: pk-en
3580: 63 72 79 70 74 20 28 20 61 64 64 72 20 75 20 70 crypt ( addr u p
3590: 6b 20 2d 2d 20 70 6b 74 6d 70 20 29 0a 20 20 20 k -- pktmp ).
35a0: 20 67 65 6e 2d 73 74 6b 65 79 73 0a 20 20 20 20 gen-stkeys.
35b0: 73 74 73 6b 63 20 73 77 61 70 20 6b 65 79 70 61 stskc swap keypa
35c0: 64 20 65 64 2d 64 68 20 32 3e 72 20 36 34 23 30 d ed-dh 2>r 64#0
35d0: 20 36 34 64 75 70 20 32 72 3e 20 63 3a 74 77 65 64dup 2r> c:twe
35e0: 61 6b 6b 65 79 21 0a 20 20 20 20 30 20 63 3a 65 akkey!. 0 c:e
35f0: 6e 63 72 79 70 74 2b 61 75 74 68 20 73 74 70 6b ncrypt+auth stpk
3600: 63 20 3b 0a 0a 3a 20 70 6b 2d 64 65 63 72 79 70 c ;..: pk-decryp
3610: 74 20 28 20 61 64 64 72 20 75 20 73 6b 20 2d 2d t ( addr u sk --
3620: 20 66 6c 61 67 20 29 0a 20 20 20 20 3e 72 20 6f flag ). >r o
3630: 76 65 72 20 72 3e 20 73 77 61 70 20 6b 65 79 70 ver r> swap keyp
3640: 61 64 20 65 64 2d 64 68 20 32 3e 72 20 36 34 23 ad ed-dh 2>r 64#
3650: 30 20 36 34 64 75 70 20 32 72 3e 20 63 3a 74 77 0 64dup 2r> c:tw
3660: 65 61 6b 6b 65 79 21 0a 20 20 20 20 6b 65 79 73 eakkey!. keys
3670: 69 7a 65 20 2f 73 74 72 69 6e 67 20 30 20 63 3a ize /string 0 c:
3680: 64 65 63 72 79 70 74 2b 61 75 74 68 20 3b 0a 0a decrypt+auth ;..
3690: 5c 20 73 65 74 74 69 6e 67 20 6f 66 20 6b 65 79 \ setting of key
36a0: 73 0a 0a 3a 20 73 65 74 2d 6b 65 79 20 28 20 61 s..: set-key ( a
36b0: 64 64 72 20 2d 2d 20 29 20 6f 20 30 3d 20 49 46 ddr -- ) o 0= IF
36c0: 20 64 72 6f 70 20 20 2e 22 20 6b 65 79 2c 20 6e drop ." key, n
36d0: 6f 20 63 6f 6e 74 65 78 74 21 22 20 63 72 20 20 o context!" cr
36e0: 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 6b EXIT THEN. k
36f0: 65 79 73 69 7a 65 20 63 72 79 70 74 6f 2d 6b 65 eysize crypto-ke
3700: 79 20 73 65 63 21 0a 20 20 20 20 2e 22 20 73 65 y sec!. ." se
3710: 74 20 6b 65 79 20 74 6f 3a 22 20 6f 20 63 72 79 t key to:" o cry
3720: 70 74 6f 2d 6b 65 79 20 73 65 63 40 20 2e 6e 6e pto-key sec@ .nn
3730: 62 20 63 72 20 3b 0a 0a 3a 20 3f 6b 65 79 73 69 b cr ;..: ?keysi
3740: 7a 65 20 28 20 75 20 2d 2d 20 29 0a 20 20 20 20 ze ( u -- ).
3750: 6b 65 79 73 69 7a 65 20 3c 3e 20 21 21 6b 65 79 keysize <> !!key
3760: 73 69 7a 65 21 21 20 3b 0a 0a 46 6f 72 77 61 72 size!! ;..Forwar
3770: 64 20 63 68 65 63 6b 2d 6b 65 79 20 5c 20 63 68 d check-key \ ch
3780: 65 63 6b 20 69 66 20 77 65 20 6b 6e 6f 77 20 74 eck if we know t
3790: 68 61 74 20 6b 65 79 0a 46 6f 72 77 61 72 64 20 hat key.Forward
37a0: 73 65 61 72 63 68 2d 6b 65 79 20 5c 20 73 65 61 search-key \ sea
37b0: 72 63 68 20 69 66 20 74 68 61 74 20 69 73 20 6f rch if that is o
37c0: 6e 65 20 6f 66 20 6f 75 72 20 70 75 62 6b 65 79 ne of our pubkey
37d0: 73 0a 46 6f 72 77 61 72 64 20 73 65 61 72 63 68 s.Forward search
37e0: 2d 6b 65 79 3f 20 5c 20 73 65 61 72 63 68 20 69 -key? \ search i
37f0: 66 20 74 68 61 74 20 69 73 20 6f 6e 65 20 6f 66 f that is one of
3800: 20 6f 75 72 20 70 75 62 6b 65 79 73 0a 0a 56 61 our pubkeys..Va
3810: 72 69 61 62 6c 65 20 74 6d 70 6b 65 79 73 2d 6c riable tmpkeys-l
3820: 73 31 36 62 0a 24 31 30 30 30 20 56 61 6c 75 65 s16b.$1000 Value
3830: 20 6d 61 78 2d 74 6d 70 6b 65 79 73 23 20 5c 20 max-tmpkeys# \
3840: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 32 35 36 no more than 256
3850: 20 6b 65 79 73 20 69 6e 20 71 75 65 75 65 0a 0a keys in queue..
3860: 3a 20 3f 72 65 70 65 61 74 2d 74 6d 70 6b 65 79 : ?repeat-tmpkey
3870: 20 28 20 61 64 64 72 20 2d 2d 20 29 0a 20 20 20 ( addr -- ).
3880: 20 74 6d 70 6b 65 79 73 2d 6c 73 31 36 62 20 24 tmpkeys-ls16b $
3890: 40 6c 65 6e 20 6d 61 78 2d 74 6d 70 6b 65 79 73 @len max-tmpkeys
38a0: 23 20 75 3e 3d 20 49 46 0a 09 74 6d 70 6b 65 79 # u>= IF..tmpkey
38b0: 73 2d 6c 73 31 36 62 20 30 20 6d 61 78 2d 74 6d s-ls16b 0 max-tm
38c0: 70 6b 65 79 73 23 20 32 2f 20 24 64 65 6c 0a 20 pkeys# 2/ $del.
38d0: 20 20 20 54 48 45 4e 0a 20 20 20 20 74 6d 70 6b THEN. tmpk
38e0: 65 79 73 2d 6c 73 31 36 62 20 24 40 20 62 6f 75 eys-ls16b $@ bou
38f0: 6e 64 73 20 3f 44 4f 0a 09 64 75 70 20 49 20 24 nds ?DO..dup I $
3900: 31 30 20 74 75 63 6b 20 73 74 72 3d 20 21 21 72 10 tuck str= !!r
3910: 65 70 65 61 74 65 64 2d 74 6d 70 6b 65 79 21 21 epeated-tmpkey!!
3920: 0a 20 20 20 20 24 31 30 20 2b 4c 4f 4f 50 0a 20 . $10 +LOOP.
3930: 20 20 20 68 65 61 6c 74 68 28 20 2e 22 20 6e 6f health( ." no
3940: 6e 2d 72 65 70 65 61 74 65 64 20 74 6d 70 20 6b n-repeated tmp k
3950: 65 79 20 22 20 64 75 70 20 24 31 30 20 38 35 74 ey " dup $10 85t
3960: 79 70 65 20 63 72 20 29 0a 20 20 20 20 24 31 30 ype cr ). $10
3970: 20 74 6d 70 6b 65 79 73 2d 6c 73 31 36 62 20 24 tmpkeys-ls16b $
3980: 2b 21 20 3b 20 5c 20 73 61 76 65 20 6f 6e 6c 79 +! ; \ save only
3990: 20 68 61 6c 66 20 6f 66 20 74 68 65 20 74 6d 70 half of the tmp
39a0: 6b 65 79 0a 0a 3a 20 6b 65 79 2d 73 74 61 67 65 key..: key-stage
39b0: 32 20 28 20 70 6b 20 73 6b 20 2d 2d 20 29 20 3e 2 ( pk sk -- ) >
39c0: 72 0a 20 20 20 20 6b 65 79 70 61 64 24 20 6b 65 r. keypad$ ke
39d0: 79 73 69 7a 65 20 3c 3e 20 21 21 6e 6f 2d 74 6d ysize <> !!no-tm
39e0: 70 6b 65 79 21 21 0a 20 20 20 20 72 3e 20 72 6f pkey!!. r> ro
39f0: 74 20 6b 65 79 70 61 64 20 65 64 2d 64 68 78 20 t keypad ed-dhx
3a00: 64 6f 2d 6b 65 79 70 61 64 20 73 65 63 2b 21 20 do-keypad sec+!
3a10: 3b 0a 3a 20 6b 65 79 2d 72 65 73 74 20 28 20 61 ;.: key-rest ( a
3a20: 64 64 72 20 75 20 73 6b 20 2d 2d 20 29 20 3e 72 ddr u sk -- ) >r
3a30: 0a 20 20 20 20 3f 6b 65 79 73 69 7a 65 20 64 75 . ?keysize du
3a40: 70 20 6b 65 79 73 69 7a 65 20 63 68 65 63 6b 2d p keysize check-
3a50: 6b 65 79 0a 20 20 20 20 64 75 70 20 6b 65 79 73 key. dup keys
3a60: 69 7a 65 20 74 6d 70 2d 70 75 62 6b 65 79 20 24 ize tmp-pubkey $
3a70: 21 20 72 3e 20 6b 65 79 2d 73 74 61 67 65 32 0a ! r> key-stage2.
3a80: 20 20 20 20 6b 65 79 70 61 69 72 2d 76 61 6c 20 keypair-val
3a90: 76 61 6c 69 64 61 74 65 64 20 6f 72 21 20 3b 0a validated or! ;.
3aa0: 3a 20 6e 65 74 32 6f 3a 6b 65 79 70 61 69 72 20 : net2o:keypair
3ab0: 28 20 70 6b 63 20 75 63 20 70 6b 20 75 20 2d 2d ( pkc uc pk u --
3ac0: 20 29 0a 20 20 20 20 3f 6b 65 79 73 69 7a 65 20 ). ?keysize
3ad0: 73 65 61 72 63 68 2d 6b 65 79 20 73 77 61 70 20 search-key swap
3ae0: 74 6d 70 2d 6d 79 2d 6b 65 79 20 21 20 6b 65 79 tmp-my-key ! key
3af0: 2d 72 65 73 74 20 3b 0a 3a 20 6e 65 74 32 6f 3a -rest ;.: net2o:
3b00: 72 65 63 65 69 76 65 2d 74 6d 70 6b 65 79 20 28 receive-tmpkey (
3b10: 20 61 64 64 72 20 75 20 2d 2d 20 29 20 20 3f 6b addr u -- ) ?k
3b20: 65 79 73 69 7a 65 20 5c 20 64 75 70 20 6b 65 79 eysize \ dup key
3b30: 73 69 7a 65 20 2e 6e 6e 62 20 63 72 0a 20 20 20 size .nnb cr.
3b40: 20 6f 20 30 3d 20 49 46 20 20 67 65 6e 2d 73 74 o 0= IF gen-st
3b50: 6b 65 79 73 20 73 74 73 6b 63 0a 09 5c 20 72 65 keys stskc..\ re
3b60: 70 65 61 74 65 64 20 74 6d 70 6b 65 79 73 20 61 peated tmpkeys a
3b70: 72 65 20 61 6c 6c 6f 77 65 64 20 68 65 72 65 20 re allowed here
3b80: 64 75 65 20 74 6f 20 70 61 63 6b 65 74 20 64 75 due to packet du
3b90: 70 6c 69 63 61 74 69 6f 6e 0a 20 20 20 20 45 4c plication. EL
3ba0: 53 45 20 20 64 75 70 20 3f 72 65 70 65 61 74 2d SE dup ?repeat-
3bb0: 74 6d 70 6b 65 79 20 5c 20 6e 6f 74 20 61 6c 6c tmpkey \ not all
3bc0: 6f 77 65 64 20 68 65 72 65 2c 20 64 75 70 6c 69 owed here, dupli
3bd0: 63 61 74 65 73 20 77 69 6c 6c 20 62 65 20 72 65 cates will be re
3be0: 6a 65 63 74 65 64 0a 09 74 73 6b 63 20 20 54 48 jected..tskc TH
3bf0: 45 4e 20 5c 20 64 75 70 20 6b 65 79 73 69 7a 65 EN \ dup keysize
3c00: 20 2e 6e 6e 62 20 63 72 0a 20 20 20 20 73 77 61 .nnb cr. swa
3c10: 70 20 6b 65 79 70 61 64 20 65 64 2d 64 68 0a 20 p keypad ed-dh.
3c20: 20 20 20 6f 20 49 46 20 20 64 6f 2d 6b 65 79 70 o IF do-keyp
3c30: 61 64 20 73 65 63 21 20 20 45 4c 53 45 20 20 32 ad sec! ELSE 2
3c40: 64 72 6f 70 20 20 54 48 45 4e 0a 20 20 20 20 28 drop THEN. (
3c50: 20 6b 65 79 70 61 64 20 6b 65 79 73 69 7a 65 20 keypad keysize
3c60: 2e 6e 6e 62 20 63 72 20 29 20 3b 0a 0a 3a 20 74 .nnb cr ) ;..: t
3c70: 6d 70 6b 65 79 40 20 28 20 2d 2d 20 61 64 64 72 mpkey@ ( -- addr
3c80: 20 75 20 29 0a 20 20 20 20 64 6f 2d 6b 65 79 70 u ). do-keyp
3c90: 61 64 20 73 65 63 40 20 64 75 70 20 3f 45 58 49 ad sec@ dup ?EXI
3ca0: 54 20 20 32 64 72 6f 70 0a 20 20 20 20 6b 65 79 T 2drop. key
3cb0: 70 61 64 20 6b 65 79 73 69 7a 65 20 3b 0a 0a 3a pad keysize ;..:
3cc0: 20 6e 65 74 32 6f 3a 75 70 64 61 74 65 2d 6b 65 net2o:update-ke
3cd0: 79 20 28 20 2d 2d 20 29 0a 20 20 20 20 6f 3f 20 y ( -- ). o?
3ce0: 64 6f 2d 6b 65 79 70 61 64 20 73 65 63 40 20 64 do-keypad sec@ d
3cf0: 75 70 20 6b 65 79 73 69 7a 65 32 20 3d 20 49 46 up keysize2 = IF
3d00: 0a 09 6b 65 79 28 20 2e 22 20 73 74 6f 72 65 20 ..key( ." store
3d10: 6b 65 79 2c 20 6f 3d 22 20 6f 20 68 65 78 2e 20 key, o=" o hex.
3d20: 32 64 75 70 20 2e 6e 6e 62 20 63 72 20 29 0a 09 2dup .nnb cr )..
3d30: 63 72 79 70 74 6f 2d 6b 65 79 20 73 65 63 21 20 crypto-key sec!
3d40: 64 6f 2d 6b 65 79 70 61 64 20 73 65 63 2d 66 72 do-keypad sec-fr
3d50: 65 65 0a 09 45 58 49 54 0a 20 20 20 20 54 48 45 ee..EXIT. THE
3d60: 4e 0a 20 20 20 20 32 64 72 6f 70 20 3b 0a 0a 5c N. 2drop ;..\
3d70: 20 73 69 67 6e 61 74 75 72 65 20 73 74 75 66 66 signature stuff
3d80: 0a 0a 5c 20 49 64 65 61 3a 20 73 65 74 20 22 72 ..\ Idea: set "r
3d90: 22 20 66 69 72 73 74 20 68 61 6c 66 20 74 6f 20 " first half to
3da0: 74 68 65 20 76 61 6c 75 65 2c 20 22 72 22 20 73 the value, "r" s
3db0: 65 63 6f 6e 64 20 68 61 6c 66 20 74 6f 20 74 68 econd half to th
3dc0: 65 20 6b 65 79 2c 20 64 69 66 66 75 73 65 0a 5c e key, diffuse.\
3dd0: 20 77 65 20 75 73 65 20 65 78 70 6c 69 63 69 74 we use explicit
3de0: 65 6c 79 20 4b 65 63 63 61 6b 20 68 65 72 65 2c ely Keccak here,
3df0: 20 74 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 this needs to b
3e00: 65 20 67 6c 6f 62 61 6c 6c 79 20 74 68 65 20 73 e globally the s
3e10: 61 6d 65 21 0a 5c 20 4b 65 79 65 64 20 68 61 73 ame!.\ Keyed has
3e20: 68 73 20 61 72 65 20 74 68 65 72 65 20 66 6f 72 hs are there for
3e30: 20 75 6e 69 71 75 65 20 68 61 6e 64 6c 65 73 0a unique handles.
3e40: 0a 3a 20 6b 65 79 65 64 2d 68 61 73 68 23 31 32 .: keyed-hash#12
3e50: 38 20 28 20 76 61 6c 61 64 64 72 20 75 76 61 6c 8 ( valaddr uval
3e60: 20 6b 65 79 61 64 64 72 20 75 6b 65 79 20 2d 2d keyaddr ukey --
3e70: 20 68 61 73 68 61 64 64 72 20 75 68 61 73 68 20 hashaddr uhash
3e80: 29 0a 20 20 20 20 63 3a 30 6b 65 79 20 3e 6b 65 ). c:0key >ke
3e90: 79 65 64 2d 68 61 73 68 20 20 6b 65 79 65 64 2d yed-hash keyed-
3ea0: 68 61 73 68 2d 6f 75 74 20 68 61 73 68 23 31 32 hash-out hash#12
3eb0: 38 20 32 64 75 70 20 6b 65 63 63 61 6b 3e 20 3b 8 2dup keccak> ;
3ec0: 0a 3a 20 6b 65 79 65 64 2d 68 61 73 68 23 32 35 .: keyed-hash#25
3ed0: 36 20 28 20 76 61 6c 61 64 64 72 20 75 76 61 6c 6 ( valaddr uval
3ee0: 20 6b 65 79 61 64 64 72 20 75 6b 65 79 20 2d 2d keyaddr ukey --
3ef0: 20 68 61 73 68 61 64 64 72 20 75 68 61 73 68 20 hashaddr uhash
3f00: 29 0a 20 20 20 20 63 3a 30 6b 65 79 20 3e 6b 65 ). c:0key >ke
3f10: 79 65 64 2d 68 61 73 68 20 20 6b 65 79 65 64 2d yed-hash keyed-
3f20: 68 61 73 68 2d 6f 75 74 20 68 61 73 68 23 32 35 hash-out hash#25
3f30: 36 20 32 64 75 70 20 6b 65 63 63 61 6b 3e 20 3b 6 2dup keccak> ;
3f40: 0a 0a 5c 20 73 69 67 6e 61 74 75 72 65 20 70 72 ..\ signature pr
3f50: 69 6e 74 69 6e 67 0a 0a 23 31 30 2e 30 30 30 2e inting..#10.000.
3f60: 30 30 30 2e 30 30 30 20 64 3e 36 34 20 36 34 56 000.000 d>64 64V
3f70: 61 6c 75 65 20 6f 74 72 73 69 67 2d 64 65 6c 74 alue otrsig-delt
3f80: 61 23 20 5c 20 4f 54 52 3a 20 6c 69 76 65 20 66 a# \ OTR: live f
3f90: 6f 72 20 31 30 73 2c 20 74 68 65 6e 20 64 69 65 or 10s, then die
3fa0: 0a 0a 3a 20 6e 6f 77 3e 6e 65 76 65 72 20 28 20 ..: now>never (
3fb0: 2d 2d 20 29 20 20 20 20 20 20 20 20 20 20 74 69 -- ) ti
3fc0: 63 6b 73 20 36 34 23 2d 31 20 73 69 67 64 61 74 cks 64#-1 sigdat
3fd0: 65 20 6c 65 2d 31 32 38 21 20 3b 0a 3a 20 66 6f e le-128! ;.: fo
3fe0: 72 65 76 65 72 20 28 20 2d 2d 20 29 20 20 20 20 rever ( -- )
3ff0: 20 20 20 20 20 20 20 20 36 34 23 30 20 36 34 23 64#0 64#
4000: 2d 31 20 73 69 67 64 61 74 65 20 6c 65 2d 31 32 -1 sigdate le-12
4010: 38 21 20 3b 0a 3a 20 6e 6f 77 2b 64 65 6c 74 61 8! ;.: now+delta
4020: 20 28 20 64 65 6c 74 61 36 34 20 2d 2d 20 29 20 ( delta64 -- )
4030: 20 74 69 63 6b 73 20 36 34 74 75 63 6b 20 36 34 ticks 64tuck 64
4040: 2b 20 73 69 67 64 61 74 65 20 6c 65 2d 31 32 38 + sigdate le-128
4050: 21 20 3b 0a 3a 20 6f 6c 64 3e 6f 74 72 20 28 20 ! ;.: old>otr (
4060: 6f 6c 64 74 69 6d 65 20 2d 2d 20 29 20 20 20 20 oldtime -- )
4070: 74 69 63 6b 73 20 6f 74 72 73 69 67 2d 64 65 6c ticks otrsig-del
4080: 74 61 23 20 36 34 2b 20 73 69 67 64 61 74 65 20 ta# 64+ sigdate
4090: 6c 65 2d 31 32 38 21 20 3b 0a 3a 20 6e 6f 77 3e le-128! ;.: now>
40a0: 6f 74 72 20 28 20 2d 2d 20 29 20 20 20 20 20 20 otr ( -- )
40b0: 20 20 20 20 20 20 6f 74 72 73 69 67 2d 64 65 6c otrsig-del
40c0: 74 61 23 20 6e 6f 77 2b 64 65 6c 74 61 20 3b 0a ta# now+delta ;.
40d0: 0a 65 3f 20 6d 61 78 2d 78 63 68 61 72 20 24 31 .e? max-xchar $1
40e0: 30 30 20 3c 20 5b 49 46 5d 0a 20 20 20 20 3a 20 00 < [IF]. :
40f0: 2e 63 68 65 63 6b 20 28 20 66 6c 61 67 20 2d 2d .check ( flag --
4100: 20 29 20 27 78 27 20 27 76 27 20 72 6f 74 20 73 ) 'x' 'v' rot s
4110: 65 6c 65 63 74 20 78 65 6d 69 74 20 3b 0a 5b 45 elect xemit ;.[E
4120: 4c 53 45 5d 0a 20 20 20 20 3a 20 2e 63 68 65 63 LSE]. : .chec
4130: 6b 20 28 20 66 6c 61 67 20 2d 2d 20 29 20 27 e2 k ( flag -- ) 'â
4140: 9c 98 27 20 27 e2 9c 94 27 20 72 6f 74 20 73 65 œ˜' '✔' rot se
4150: 6c 65 63 74 20 78 65 6d 69 74 20 3b 0a 5b 54 48 lect xemit ;.[TH
4160: 45 4e 5d 0a 3a 20 2e 73 69 67 64 61 74 65 20 28 EN].: .sigdate (
4170: 20 74 69 63 6b 20 2d 2d 20 29 0a 20 20 20 20 36 tick -- ). 6
4180: 34 64 75 70 20 36 34 23 30 20 20 36 34 3d 20 49 4dup 64#0 64= I
4190: 46 20 20 36 34 64 72 6f 70 20 2e 66 6f 72 65 76 F 64drop .forev
41a0: 65 72 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 er EXIT THEN.
41b0: 20 20 20 36 34 64 75 70 20 36 34 23 2d 31 20 36 64dup 64#-1 6
41c0: 34 3d 20 49 46 20 20 36 34 64 72 6f 70 20 2e 6e 4= IF 64drop .n
41d0: 65 76 65 72 20 20 20 20 45 58 49 54 20 20 54 48 ever EXIT TH
41e0: 45 4e 0a 20 20 20 20 74 69 63 6b 73 20 36 34 6f EN. ticks 64o
41f0: 76 65 72 20 36 34 2d 20 36 34 64 75 70 20 3a 30 ver 64- 64dup :0
4200: 31 27 23 20 36 34 75 3c 20 49 46 0a 09 36 34 3e 1'# 64u< IF..64>
4210: 66 20 2d 31 65 2d 39 20 66 2a 20 31 30 20 36 20 f -1e-9 f* 10 6
4220: 30 20 66 2e 72 64 70 20 27 73 27 20 65 6d 69 74 0 f.rdp 's' emit
4230: 20 36 34 64 72 6f 70 0a 20 20 20 20 45 4c 53 45 64drop. ELSE
4240: 20 20 36 34 64 72 6f 70 20 2e 74 69 63 6b 73 20 64drop .ticks
4250: 20 54 48 45 4e 20 3b 0a 3a 20 2e 73 69 67 64 61 THEN ;.: .sigda
4260: 74 65 73 20 28 20 61 64 64 72 20 75 20 2d 2d 20 tes ( addr u --
4270: 29 0a 20 20 20 20 32 64 75 70 20 73 74 61 72 74 ). 2dup start
4280: 64 61 74 65 40 20 2e 73 69 67 64 61 74 65 20 2e date@ .sigdate .
4290: 22 20 2d 3e 22 20 65 6e 64 64 61 74 65 40 20 2e " ->" enddate@ .
42a0: 73 69 67 64 61 74 65 20 3b 0a 0a 5c 20 73 69 67 sigdate ;..\ sig
42b0: 6e 61 74 75 72 65 20 76 65 72 69 66 69 63 61 74 nature verificat
42c0: 69 6f 6e 0a 0a 3a 20 2b 64 61 74 65 20 28 20 61 ion..: +date ( a
42d0: 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 64 61 74 ddr -- ). dat
42e0: 65 73 69 7a 65 23 20 22 64 61 74 65 22 20 3e 6b esize# "date" >k
42f0: 65 79 65 64 2d 68 61 73 68 20 3b 0a 3a 20 3e 64 eyed-hash ;.: >d
4300: 61 74 65 20 28 20 61 64 64 72 20 75 20 2d 2d 20 ate ( addr u --
4310: 61 64 64 72 20 75 20 29 0a 20 20 20 20 32 64 75 addr u ). 2du
4320: 70 20 2b 20 73 69 67 73 69 7a 65 23 20 2d 20 2b p + sigsize# - +
4330: 64 61 74 65 20 3b 0a 3a 20 67 65 6e 3e 68 6f 73 date ;.: gen>hos
4340: 74 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61 64 t ( addr u -- ad
4350: 64 72 20 75 20 29 0a 20 20 20 20 32 64 75 70 20 dr u ). 2dup
4360: 63 3a 30 6b 65 79 20 22 68 6f 73 74 22 20 3e 6b c:0key "host" >k
4370: 65 79 65 64 2d 68 61 73 68 20 3b 0a 0a 2d 35 0a eyed-hash ;..-5.
4380: 65 6e 75 6d 20 73 69 67 2d 6b 65 79 73 69 7a 65 enum sig-keysize
4390: 0a 65 6e 75 6d 20 73 69 67 2d 75 6e 73 69 67 6e .enum sig-unsign
43a0: 65 64 0a 65 6e 75 6d 20 73 69 67 2d 65 61 72 6c ed.enum sig-earl
43b0: 79 0a 65 6e 75 6d 20 73 69 67 2d 6c 61 74 65 0a y.enum sig-late.
43c0: 65 6e 75 6d 20 73 69 67 2d 77 72 6f 6e 67 0a 65 enum sig-wrong.e
43d0: 6e 75 6d 20 73 69 67 2d 6f 6b 0a 64 72 6f 70 0a num sig-ok.drop.
43e0: 0a 3a 20 65 61 72 6c 79 2f 6c 61 74 65 3f 20 28 .: early/late? (
43f0: 20 6e 36 34 20 6d 69 6e 36 34 20 6d 61 78 36 34 n64 min64 max64
4400: 20 2d 2d 20 73 69 67 2d 65 72 72 6f 72 20 29 0a -- sig-error ).
4410: 20 20 20 20 36 34 3e 72 20 36 34 6f 76 65 72 20 64>r 64over
4420: 36 34 72 3e 20 36 34 75 3e 3d 20 73 69 67 2d 6c 64r> 64u>= sig-l
4430: 61 74 65 20 61 6e 64 20 3e 72 20 36 34 75 3c 20 ate and >r 64u<
4440: 73 69 67 2d 65 61 72 6c 79 20 61 6e 64 20 72 3e sig-early and r>
4450: 20 6d 69 6e 20 3b 0a 0a 3a 20 63 68 65 63 6b 2d min ;..: check-
4460: 64 61 74 65 20 28 20 61 64 64 72 20 75 20 2d 2d date ( addr u --
4470: 20 61 64 64 72 20 75 20 66 6c 61 67 20 29 0a 20 addr u flag ).
4480: 20 20 20 32 64 75 70 20 2b 20 31 2d 20 63 40 20 2dup + 1- c@
4490: 6b 65 79 73 69 7a 65 20 3c 3e 20 73 69 67 2d 6b keysize <> sig-k
44a0: 65 79 73 69 7a 65 20 61 6e 64 20 3f 64 75 70 2d eysize and ?dup-
44b0: 49 46 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 IF EXIT THEN.
44c0: 20 20 20 32 64 75 70 20 65 6e 64 64 61 74 65 40 2dup enddate@
44d0: 20 36 34 3e 72 20 32 64 75 70 20 73 74 61 72 74 64>r 2dup start
44e0: 64 61 74 65 40 20 36 34 3e 72 0a 20 20 20 20 74 date@ 64>r. t
44f0: 69 63 6b 73 20 66 75 7a 7a 65 64 74 69 6d 65 23 icks fuzzedtime#
4500: 20 36 34 2b 20 36 34 72 3e 20 36 34 72 3e 0a 20 64+ 64r> 64r>.
4510: 20 20 20 36 34 64 75 70 20 36 34 23 2d 31 20 36 64dup 64#-1 6
4520: 34 3c 3e 20 49 46 20 20 66 75 7a 7a 65 64 74 69 4<> IF fuzzedti
4530: 6d 65 23 20 36 34 2d 32 2a 20 36 34 2b 20 20 54 me# 64-2* 64+ T
4540: 48 45 4e 0a 20 20 20 20 65 61 72 6c 79 2f 6c 61 HEN. early/la
4550: 74 65 3f 0a 20 20 20 20 6d 73 67 28 20 64 75 70 te?. msg( dup
4560: 20 49 46 20 20 3c 65 72 72 3e 20 2e 22 20 73 69 IF <err> ." si
4570: 67 20 6f 75 74 20 6f 66 20 64 61 74 65 3a 20 22 g out of date: "
4580: 20 74 69 63 6b 73 20 2e 74 69 63 6b 73 20 2e 22 ticks .ticks ."
4590: 20 20 73 69 67 64 61 74 65 3a 20 22 0a 20 20 20 sigdate: ".
45a0: 20 3e 72 20 32 64 75 70 20 73 74 61 72 74 64 61 >r 2dup startda
45b0: 74 65 40 20 2e 74 69 63 6b 73 20 32 64 75 70 20 te@ .ticks 2dup
45c0: 65 6e 64 64 61 74 65 40 20 2e 74 69 63 6b 73 20 enddate@ .ticks
45d0: 72 3e 20 3c 64 65 66 61 75 6c 74 3e 20 63 72 20 r> <default> cr
45e0: 20 54 48 45 4e 20 29 20 3b 0a 3a 20 76 65 72 69 THEN ) ;.: veri
45f0: 66 79 2d 73 69 67 20 28 20 61 64 64 72 20 75 20 fy-sig ( addr u
4600: 70 6b 20 2d 2d 20 61 64 64 72 20 75 20 66 6c 61 pk -- addr u fla
4610: 67 20 29 20 20 3e 72 0a 20 20 20 20 63 68 65 63 g ) >r. chec
4620: 6b 2d 64 61 74 65 20 64 75 70 20 30 3d 20 49 46 k-date dup 0= IF
4630: 20 20 64 72 6f 70 20 2b 63 6d 64 0a 09 32 64 75 drop +cmd..2du
4640: 70 20 2b 20 73 69 67 6f 6e 6c 79 73 69 7a 65 23 p + sigonlysize#
4650: 20 2d 20 72 3e 20 65 64 2d 76 65 72 69 66 79 20 - r> ed-verify
4660: 30 3d 20 73 69 67 2d 77 72 6f 6e 67 20 61 6e 64 0= sig-wrong and
4670: 20 2b 73 69 67 0a 09 45 58 49 54 20 20 54 48 45 +sig..EXIT THE
4680: 4e 0a 20 20 20 20 72 64 72 6f 70 20 3b 0a 3a 20 N. rdrop ;.:
4690: 71 75 69 63 6b 2d 76 65 72 69 66 79 2d 73 69 67 quick-verify-sig
46a0: 20 28 20 61 64 64 72 20 75 20 70 6b 20 2d 2d 20 ( addr u pk --
46b0: 61 64 64 72 20 75 20 66 6c 61 67 20 29 20 20 3e addr u flag ) >
46c0: 72 0a 20 20 20 20 63 68 65 63 6b 2d 64 61 74 65 r. check-date
46d0: 20 64 75 70 20 30 3d 20 49 46 20 20 64 72 6f 70 dup 0= IF drop
46e0: 20 2b 63 6d 64 0a 09 32 64 75 70 20 2b 20 73 69 +cmd..2dup + si
46f0: 67 6f 6e 6c 79 73 69 7a 65 23 20 2d 0a 09 72 40 gonlysize# -..r@
4700: 20 64 75 70 20 6c 61 73 74 23 20 3e 72 20 73 65 dup last# >r se
4710: 61 72 63 68 2d 6b 65 79 3f 20 72 3e 20 74 6f 20 arch-key? r> to
4720: 6c 61 73 74 23 0a 09 64 75 70 20 30 3d 20 49 46 last#..dup 0= IF
4730: 20 20 6e 69 70 20 6e 69 70 20 72 64 72 6f 70 20 nip nip rdrop
4740: 20 45 58 49 54 20 20 54 48 45 4e 0a 09 73 77 61 EXIT THEN..swa
4750: 70 20 2e 6b 65 2d 73 6b 73 69 67 20 73 65 63 40 p .ke-sksig sec@
4760: 20 64 72 6f 70 20 73 77 61 70 20 32 73 77 61 70 drop swap 2swap
4770: 0a 09 65 64 2d 71 75 69 63 6b 2d 76 65 72 69 66 ..ed-quick-verif
4780: 79 20 30 3d 20 73 69 67 2d 77 72 6f 6e 67 20 61 y 0= sig-wrong a
4790: 6e 64 20 2b 73 69 67 71 75 69 63 6b 0a 20 20 20 nd +sigquick.
47a0: 20 54 48 45 4e 0a 20 20 20 20 72 64 72 6f 70 20 THEN. rdrop
47b0: 3b 0a 0a 3a 20 64 61 74 65 2d 73 69 67 3f 20 28 ;..: date-sig? (
47c0: 20 61 64 64 72 20 75 20 70 6b 20 2d 2d 20 61 64 addr u pk -- ad
47d0: 64 72 20 75 20 66 6c 61 67 20 29 0a 20 20 20 20 dr u flag ).
47e0: 3e 72 20 3e 64 61 74 65 20 72 3e 20 76 65 72 69 >r >date r> veri
47f0: 66 79 2d 73 69 67 20 3b 0a 3a 20 70 6b 2d 73 69 fy-sig ;.: pk-si
4800: 67 3f 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61 g? ( addr u -- a
4810: 64 64 72 20 75 27 20 66 6c 61 67 20 29 0a 20 20 ddr u' flag ).
4820: 20 20 64 75 70 20 73 69 67 70 6b 73 69 7a 65 23 dup sigpksize#
4830: 20 75 3c 20 49 46 20 20 73 69 67 2d 75 6e 73 69 u< IF sig-unsi
4840: 67 6e 65 64 20 20 45 58 49 54 20 20 54 48 45 4e gned EXIT THEN
4850: 0a 20 20 20 20 32 64 75 70 20 73 69 67 70 6b 73 . 2dup sigpks
4860: 69 7a 65 23 20 2d 20 63 3a 30 6b 65 79 0a 20 20 ize# - c:0key.
4870: 20 20 32 64 75 70 20 63 3a 68 61 73 68 20 2b 20 2dup c:hash +
4880: 64 61 74 65 2d 73 69 67 3f 20 3b 0a 3a 20 70 6b date-sig? ;.: pk
4890: 2d 71 75 69 63 6b 2d 73 69 67 3f 20 28 20 61 64 -quick-sig? ( ad
48a0: 64 72 20 75 20 2d 2d 20 61 64 64 72 20 75 27 20 dr u -- addr u'
48b0: 66 6c 61 67 20 29 0a 20 20 20 20 64 75 70 20 73 flag ). dup s
48c0: 69 67 70 6b 73 69 7a 65 23 20 75 3c 20 49 46 20 igpksize# u< IF
48d0: 20 73 69 67 2d 75 6e 73 69 67 6e 65 64 20 20 45 sig-unsigned E
48e0: 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 32 64 XIT THEN. 2d
48f0: 75 70 20 73 69 67 70 6b 73 69 7a 65 23 20 2d 20 up sigpksize# -
4900: 63 3a 30 6b 65 79 0a 20 20 20 20 32 64 75 70 20 c:0key. 2dup
4910: 63 3a 68 61 73 68 20 2b 20 3e 72 20 3e 64 61 74 c:hash + >r >dat
4920: 65 20 72 3e 20 71 75 69 63 6b 2d 76 65 72 69 66 e r> quick-verif
4930: 79 2d 73 69 67 20 3b 0a 3a 20 70 6b 2d 64 61 74 y-sig ;.: pk-dat
4940: 65 3f 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61 e? ( addr u -- a
4950: 64 64 72 20 75 27 20 66 6c 61 67 20 29 20 5c 20 ddr u' flag ) \
4960: 63 68 65 63 6b 20 6f 6e 6c 79 20 74 68 65 20 64 check only the d
4970: 61 74 65 0a 20 20 20 20 64 75 70 20 73 69 67 70 ate. dup sigp
4980: 6b 73 69 7a 65 23 20 75 3c 20 49 46 20 20 73 69 ksize# u< IF si
4990: 67 2d 75 6e 73 69 67 6e 65 64 20 20 45 58 49 54 g-unsigned EXIT
49a0: 20 20 54 48 45 4e 0a 20 20 20 20 63 68 65 63 6b THEN. check
49b0: 2d 64 61 74 65 20 3b 0a 3a 20 70 6b 32 2d 73 69 -date ;.: pk2-si
49c0: 67 3f 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61 g? ( addr u -- a
49d0: 64 64 72 20 75 27 20 66 6c 61 67 20 29 0a 20 20 ddr u' flag ).
49e0: 20 20 64 75 70 20 73 69 67 70 6b 32 73 69 7a 65 dup sigpk2size
49f0: 23 20 75 3c 20 49 46 20 20 73 69 67 2d 75 6e 73 # u< IF sig-uns
4a00: 69 67 6e 65 64 20 20 45 58 49 54 20 20 54 48 45 igned EXIT THE
4a10: 4e 0a 20 20 20 20 32 64 75 70 20 73 69 67 70 6b N. 2dup sigpk
4a20: 32 73 69 7a 65 23 20 2d 20 2b 20 3e 72 20 63 3a 2size# - + >r c:
4a30: 30 6b 65 79 20 32 64 75 70 20 73 69 67 73 69 7a 0key 2dup sigsiz
4a40: 65 23 20 2d 20 63 3a 68 61 73 68 20 72 3e 20 64 e# - c:hash r> d
4a50: 61 74 65 2d 73 69 67 3f 20 3b 0a 3a 20 6d 79 2d ate-sig? ;.: my-
4a60: 6b 65 79 3f 20 28 20 2d 2d 20 6f 20 29 20 20 6f key? ( -- o ) o
4a70: 20 49 46 20 20 6d 79 2d 6b 65 79 20 20 45 4c 53 IF my-key ELS
4a80: 45 20 20 6d 79 2d 6b 65 79 2d 64 65 66 61 75 6c E my-key-defaul
4a90: 74 20 20 54 48 45 4e 20 3b 0a 3a 20 73 69 67 2d t THEN ;.: sig-
4aa0: 70 61 72 61 6d 73 20 28 20 2d 2d 20 73 6b 73 69 params ( -- sksi
4ab0: 67 20 73 6b 20 70 6b 20 29 0a 20 20 20 20 6d 79 g sk pk ). my
4ac0: 2d 6b 65 79 3f 20 3f 64 75 70 2d 49 46 0a 09 3e -key? ?dup-IF..>
4ad0: 6f 20 6b 65 2d 73 6b 73 69 67 20 73 65 63 40 20 o ke-sksig sec@
4ae0: 64 72 6f 70 20 6b 65 2d 73 6b 20 73 65 63 40 20 drop ke-sk sec@
4af0: 64 72 6f 70 20 6b 65 2d 70 6b 20 24 40 20 64 72 drop ke-pk $@ dr
4b00: 6f 70 20 6f 3e 20 20 45 58 49 54 0a 20 20 20 20 op o> EXIT.
4b10: 54 48 45 4e 20 20 21 21 46 49 58 4d 45 21 21 20 THEN !!FIXME!!
4b20: 28 20 6f 6c 64 20 76 65 72 73 69 6f 6e 20 29 20 ( old version )
4b30: 73 6b 73 69 67 20 73 6b 63 20 70 6b 63 20 3b 0a sksig skc pkc ;.
4b40: 3a 20 70 6b 40 20 28 20 2d 2d 20 70 6b 20 75 20 : pk@ ( -- pk u
4b50: 29 0a 20 20 20 20 6d 79 2d 6b 65 79 3f 20 2e 6b ). my-key? .k
4b60: 65 2d 70 6b 20 24 40 20 3b 0a 3a 20 73 6b 40 20 e-pk $@ ;.: sk@
4b70: 28 20 2d 2d 20 73 6b 20 75 20 29 0a 20 20 20 20 ( -- sk u ).
4b80: 6d 79 2d 6b 65 79 3f 20 2e 6b 65 2d 73 6b 20 73 my-key? .ke-sk s
4b90: 65 63 40 20 3b 0a 3a 20 73 6b 73 69 67 40 20 28 ec@ ;.: sksig@ (
4ba0: 20 2d 2d 20 73 6b 73 69 67 20 75 20 29 0a 20 20 -- sksig u ).
4bb0: 20 20 6d 79 2d 6b 65 79 3f 20 2e 6b 65 2d 73 6b my-key? .ke-sk
4bc0: 73 69 67 20 73 65 63 40 20 3b 0a 3a 20 2e 73 69 sig sec@ ;.: .si
4bd0: 67 20 28 20 2d 2d 20 29 0a 20 20 20 20 2b 73 69 g ( -- ). +si
4be0: 67 20 73 69 67 64 61 74 65 20 2b 64 61 74 65 20 g sigdate +date
4bf0: 73 69 67 64 61 74 65 20 64 61 74 65 73 69 7a 65 sigdate datesize
4c00: 23 20 74 79 70 65 0a 20 20 20 20 73 69 67 2d 70 # type. sig-p
4c10: 61 72 61 6d 73 20 65 64 2d 73 69 67 6e 20 74 79 arams ed-sign ty
4c20: 70 65 20 6b 65 79 73 69 7a 65 20 65 6d 69 74 20 pe keysize emit
4c30: 3b 0a 3a 20 2e 70 6b 20 28 20 2d 2d 20 29 20 20 ;.: .pk ( -- )
4c40: 70 6b 40 20 6b 65 79 7c 20 74 79 70 65 20 3b 0a pk@ key| type ;.
4c50: 3a 20 70 6b 2d 73 69 67 20 28 20 61 64 64 72 20 : pk-sig ( addr
4c60: 75 20 2d 2d 20 73 69 67 20 75 20 29 0a 20 20 20 u -- sig u ).
4c70: 20 63 3a 30 6b 65 79 20 63 3a 68 61 73 68 20 5b c:0key c:hash [
4c80: 3a 20 2e 70 6b 20 2e 73 69 67 20 3b 5d 20 24 74 : .pk .sig ;] $t
4c90: 6d 70 20 3b 0a 0a 3a 20 2b 73 69 67 24 20 28 20 mp ;..: +sig$ (
4ca0: 61 64 64 72 20 75 20 2d 2d 20 68 6f 73 74 61 64 addr u -- hostad
4cb0: 64 72 20 68 6f 73 74 2d 75 20 29 20 5b 3a 20 74 dr host-u ) [: t
4cc0: 79 70 65 20 2e 73 69 67 20 3b 5d 20 24 74 6d 70 ype .sig ;] $tmp
4cd0: 20 3b 0a 3a 20 67 65 6e 2d 68 6f 73 74 20 28 20 ;.: gen-host (
4ce0: 61 64 64 72 20 75 20 2d 2d 20 61 64 64 72 27 20 addr u -- addr'
4cf0: 75 27 20 29 0a 20 20 20 20 67 65 6e 3e 68 6f 73 u' ). gen>hos
4d00: 74 20 2b 73 69 67 24 20 3b 0a 3a 20 3e 64 65 6c t +sig$ ;.: >del
4d10: 65 74 65 20 28 20 61 64 64 72 20 75 20 74 79 70 ete ( addr u typ
4d20: 65 20 75 32 20 2d 2d 20 61 64 64 72 20 75 20 29 e u2 -- addr u )
4d30: 0a 20 20 20 20 22 64 65 6c 65 74 65 22 20 3e 6b . "delete" >k
4d40: 65 79 65 64 2d 68 61 73 68 20 3b 0a 3a 20 67 65 eyed-hash ;.: ge
4d50: 6e 2d 68 6f 73 74 2d 64 65 6c 20 28 20 61 64 64 n-host-del ( add
4d60: 72 20 75 20 2d 2d 20 61 64 64 72 27 20 75 27 20 r u -- addr' u'
4d70: 29 0a 20 20 20 20 67 65 6e 3e 68 6f 73 74 20 22 ). gen>host "
4d80: 68 6f 73 74 22 20 3e 64 65 6c 65 74 65 20 2b 73 host" >delete +s
4d90: 69 67 24 20 3b 0a 0a 5c 5c 5c 0a 4c 6f 63 61 6c ig$ ;..\\\.Local
4da0: 20 56 61 72 69 61 62 6c 65 73 3a 0a 66 6f 72 74 Variables:.fort
4db0: 68 2d 6c 6f 63 61 6c 2d 77 6f 72 64 73 3a 0a 20 h-local-words:.
4dc0: 20 20 20 28 0a 20 20 20 20 20 28 28 22 65 76 65 (. (("eve
4dd0: 6e 74 3a 22 29 20 64 65 66 69 6e 69 74 69 6f 6e nt:") definition
4de0: 2d 73 74 61 72 74 65 72 20 28 66 6f 6e 74 2d 6c -starter (font-l
4df0: 6f 63 6b 2d 6b 65 79 77 6f 72 64 2d 66 61 63 65 ock-keyword-face
4e00: 20 2e 20 31 29 0a 20 20 20 20 20 20 22 5b 20 5c . 1). "[ \
4e10: 74 5c 6e 5d 22 20 74 20 6e 61 6d 65 20 28 66 6f t\n]" t name (fo
4e20: 6e 74 2d 6c 6f 63 6b 2d 66 75 6e 63 74 69 6f 6e nt-lock-function
4e30: 2d 6e 61 6d 65 2d 66 61 63 65 20 2e 20 33 29 29 -name-face . 3))
4e40: 0a 20 20 20 20 20 28 28 22 64 65 62 75 67 3a 22 . (("debug:"
4e50: 20 22 66 69 65 6c 64 3a 22 20 22 32 66 69 65 6c "field:" "2fiel
4e60: 64 3a 22 20 22 73 66 66 69 65 6c 64 3a 22 20 22 d:" "sffield:" "
4e70: 64 66 66 69 65 6c 64 3a 22 20 22 36 34 66 69 65 dffield:" "64fie
4e80: 6c 64 3a 22 20 22 75 76 61 72 22 20 22 75 76 61 ld:" "uvar" "uva
4e90: 6c 75 65 22 29 20 6e 6f 6e 2d 69 6d 6d 65 64 69 lue") non-immedi
4ea0: 61 74 65 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 74 ate (font-lock-t
4eb0: 79 70 65 2d 66 61 63 65 20 2e 20 32 29 0a 20 20 ype-face . 2).
4ec0: 20 20 20 20 22 5b 20 5c 74 5c 6e 5d 22 20 74 20 "[ \t\n]" t
4ed0: 6e 61 6d 65 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d name (font-lock-
4ee0: 76 61 72 69 61 62 6c 65 2d 6e 61 6d 65 2d 66 61 variable-name-fa
4ef0: 63 65 20 2e 20 33 29 29 0a 20 20 20 20 20 28 22 ce . 3)). ("
4f00: 5b 61 2d 7a 5c 2d 30 2d 39 5d 2b 28 22 20 69 6d [a-z\-0-9]+(" im
4f10: 6d 65 64 69 61 74 65 20 28 66 6f 6e 74 2d 6c 6f mediate (font-lo
4f20: 63 6b 2d 63 6f 6d 6d 65 6e 74 2d 66 61 63 65 20 ck-comment-face
4f30: 2e 20 31 29 0a 20 20 20 20 20 20 22 29 22 20 6e . 1). ")" n
4f40: 69 6c 20 63 6f 6d 6d 65 6e 74 20 28 66 6f 6e 74 il comment (font
4f50: 2d 6c 6f 63 6b 2d 63 6f 6d 6d 65 6e 74 2d 66 61 -lock-comment-fa
4f60: 63 65 20 2e 20 31 29 29 0a 20 20 20 20 29 0a 66 ce . 1)). ).f
4f70: 6f 72 74 68 2d 6c 6f 63 61 6c 2d 69 6e 64 65 6e orth-local-inden
4f80: 74 2d 77 6f 72 64 73 3a 0a 20 20 20 20 28 0a 20 t-words:. (.
4f90: 20 20 20 20 28 28 22 65 76 65 6e 74 3a 22 29 20 (("event:")
4fa0: 28 30 20 2e 20 32 29 20 28 30 20 2e 20 32 29 20 (0 . 2) (0 . 2)
4fb0: 6e 6f 6e 2d 69 6d 6d 65 64 69 61 74 65 29 0a 20 non-immediate).
4fc0: 20 20 20 29 0a 45 6e 64 3a 0a 5b 54 48 45 4e 5d ).End:.[THEN]
4fd0: 0a .