Hex Artifact Content
Not logged in

Artifact 5a2439b4b0378f234b1b8c20e9cda6da4c3bb1a0:


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                                               .