Hex Artifact Content
Not logged in

Artifact 0ba28829460d88c90242ed99442cd91c6c308ea7:


0000: 5c 20 6e 65 74 32 6f 20 6b 65 79 20 73 74 6f 72  \ net2o key stor
0010: 61 67 65 0a 0a 5c 20 43 6f 70 79 72 69 67 68 74  age..\ Copyright
0020: 20 28 43 29 20 32 30 31 30 2d 32 30 31 35 20 20   (C) 2010-2015  
0030: 20 42 65 72 6e 64 20 50 61 79 73 61 6e 0a 0a 5c   Bernd Paysan..\
0040: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0050: 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 3a 20   free software: 
0060: 79 6f 75 20 63 61 6e 20 72 65 64 69 73 74 72 69  you can redistri
0070: 62 75 74 65 20 69 74 20 61 6e 64 2f 6f 72 20 6d  bute it and/or m
0080: 6f 64 69 66 79 0a 5c 20 69 74 20 75 6e 64 65 72  odify.\ it under
0090: 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
00a0: 65 20 47 4e 55 20 41 66 66 65 72 6f 20 47 65 6e  e GNU Affero Gen
00b0: 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65  eral Public Lice
00c0: 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65 64  nse as published
00d0: 20 62 79 0a 5c 20 74 68 65 20 46 72 65 65 20 53   by.\ the Free S
00e0: 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69  oftware Foundati
00f0: 6f 6e 2c 20 65 69 74 68 65 72 20 76 65 72 73 69  on, either versi
0100: 6f 6e 20 33 20 6f 66 20 74 68 65 20 4c 69 63 65  on 3 of the Lice
0110: 6e 73 65 2c 20 6f 72 0a 5c 20 28 61 74 20 79 6f  nse, or.\ (at yo
0120: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0130: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 0a 5c  ater version...\
0140: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0150: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
0160: 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 74  the hope that it
0170: 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c   will be useful,
0180: 0a 5c 20 62 75 74 20 57 49 54 48 4f 55 54 20 41  .\ but WITHOUT A
0190: 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74  NY WARRANTY; wit
01a0: 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d  hout even the im
01b0: 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f  plied warranty o
01c0: 66 0a 5c 20 4d 45 52 43 48 41 4e 54 41 42 49 4c  f.\ MERCHANTABIL
01d0: 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46  ITY or FITNESS F
01e0: 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20  OR A PARTICULAR 
01f0: 50 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68  PURPOSE.  See th
0200: 65 0a 5c 20 47 4e 55 20 41 66 66 65 72 6f 20 47  e.\ GNU Affero G
0210: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69  eneral Public Li
0220: 63 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64  cense for more d
0230: 65 74 61 69 6c 73 2e 0a 0a 5c 20 59 6f 75 20 73  etails...\ You s
0240: 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 69  hould have recei
0250: 76 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ved a copy of th
0260: 65 20 47 4e 55 20 41 66 66 65 72 6f 20 47 65 6e  e GNU Affero Gen
0270: 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65  eral Public Lice
0280: 6e 73 65 0a 5c 20 61 6c 6f 6e 67 20 77 69 74 68  nse.\ along with
0290: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 20 20   this program.  
02a0: 49 66 20 6e 6f 74 2c 20 73 65 65 20 3c 68 74 74  If not, see <htt
02b0: 70 3a 2f 2f 77 77 77 2e 67 6e 75 2e 6f 72 67 2f  p://www.gnu.org/
02c0: 6c 69 63 65 6e 73 65 73 2f 3e 2e 0a 0a 72 65 71  licenses/>...req
02d0: 75 69 72 65 20 6d 6b 64 69 72 2e 66 73 0a 0a 5c  uire mkdir.fs..\
02e0: 20 61 63 63 65 70 74 20 66 6f 72 20 70 61 73 73   accept for pass
02f0: 77 6f 72 64 20 65 6e 74 72 79 0a 0a 32 20 56 61  word entry..2 Va
0300: 6c 75 65 20 70 77 2d 6c 65 76 65 6c 23 20 5c 20  lue pw-level# \ 
0310: 70 77 2d 6c 65 76 65 6c 23 20 30 20 69 73 20 6c  pw-level# 0 is l
0320: 6f 77 65 73 74 0a 0a 5b 49 46 44 45 46 5d 20 61  owest..[IFDEF] a
0330: 6e 64 72 6f 69 64 78 78 78 20 27 2a 27 20 5b 45  ndroidxxx '*' [E
0340: 4c 53 45 5d 20 27 e2 ac a4 27 20 5b 54 48 45 4e  LSE] '⬤' [THEN
0350: 5d 20 43 6f 6e 73 74 61 6e 74 20 70 77 2a 0a 0a  ] Constant pw*..
0360: 78 63 2d 76 65 63 74 6f 72 20 75 70 40 20 2d 20  xc-vector up@ - 
0370: 63 6c 61 73 73 2d 6f 20 21 0a 0a 30 20 63 65 6c  class-o !..0 cel
0380: 6c 20 75 76 61 72 20 65 73 63 2d 73 74 61 74 65  l uvar esc-state
0390: 20 64 72 6f 70 0a 0a 44 65 66 65 72 20 6f 6c 64   drop..Defer old
03a0: 2d 65 6d 69 74 20 20 77 68 61 74 27 73 20 65 6d  -emit  what's em
03b0: 69 74 20 69 73 20 6f 6c 64 2d 65 6d 69 74 0a 0a  it is old-emit..
03c0: 68 65 72 65 0a 78 63 2d 76 65 63 74 6f 72 20 40  here.xc-vector @
03d0: 20 63 65 6c 6c 2d 20 64 75 70 20 40 20 74 75 63   cell- dup @ tuc
03e0: 6b 20 2d 20 68 65 72 65 20 73 77 61 70 20 64 75  k - here swap du
03f0: 70 20 61 6c 6c 6f 74 20 6d 6f 76 65 0a 2c 20 68  p allot move., h
0400: 65 72 65 20 30 20 2c 20 43 6f 6e 73 74 61 6e 74  ere 0 , Constant
0410: 20 75 74 66 2d 38 2a 0a 0a 3a 20 2a 2d 77 69 64   utf-8*..: *-wid
0420: 74 68 20 28 20 61 64 64 72 20 75 20 2d 2d 20 6e  th ( addr u -- n
0430: 20 29 0a 20 20 20 20 30 20 2d 72 6f 74 20 62 6f   ).    0 -rot bo
0440: 75 6e 64 73 20 3f 44 4f 20 20 49 20 63 40 20 24  unds ?DO  I c@ $
0450: 43 30 20 24 38 30 20 77 69 74 68 69 6e 20 2d 20  C0 $80 within - 
0460: 20 4c 4f 4f 50 20 3b 0a 0a 78 63 2d 76 65 63 74   LOOP ;..xc-vect
0470: 6f 72 20 40 20 20 75 74 66 2d 38 2a 20 78 63 2d  or @  utf-8* xc-
0480: 76 65 63 74 6f 72 20 21 20 27 20 2a 2d 77 69 64  vector ! ' *-wid
0490: 74 68 20 69 73 20 78 2d 77 69 64 74 68 20 20 78  th is x-width  x
04a0: 63 2d 76 65 63 74 6f 72 20 21 0a 0a 3a 20 65 6d  c-vector !..: em
04b0: 69 74 2d 70 77 2a 20 28 20 6e 20 2d 2d 20 29 0a  it-pw* ( n -- ).
04c0: 20 20 20 20 64 75 70 20 23 65 73 63 20 3d 20 49      dup #esc = I
04d0: 46 20 20 65 73 63 2d 73 74 61 74 65 20 6f 6e 20  F  esc-state on 
04e0: 20 54 48 45 4e 0a 20 20 20 20 64 75 70 20 62 6c   THEN.    dup bl
04f0: 20 3c 20 49 46 20 20 6f 6c 64 2d 65 6d 69 74 20   < IF  old-emit 
0500: 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20   EXIT  THEN.    
0510: 65 73 63 2d 73 74 61 74 65 20 40 20 49 46 20 20  esc-state @ IF  
0520: 64 75 70 20 6f 6c 64 2d 65 6d 69 74 0a 20 20 20  dup old-emit.   
0530: 20 45 4c 53 45 20 20 64 75 70 20 24 43 30 20 24   ELSE  dup $C0 $
0540: 38 30 20 77 69 74 68 69 6e 20 49 46 0a 09 20 20  80 within IF..  
0550: 20 20 5b 20 70 77 2a 20 27 20 78 65 6d 69 74 20    [ pw* ' xemit 
0560: 24 74 6d 70 0a 09 20 20 20 20 62 6f 75 6e 64 73  $tmp..    bounds
0570: 20 5b 3f 44 4f 5d 20 5b 49 5d 20 63 40 20 5d 4c   [?DO] [I] c@ ]L
0580: 20 6f 6c 64 2d 65 6d 69 74 20 5b 20 5b 4c 4f 4f   old-emit [ [LOO
0590: 50 5d 20 5d 0a 09 54 48 45 4e 0a 20 20 20 20 54  P] ]..THEN.    T
05a0: 48 45 4e 0a 20 20 20 20 74 6f 75 70 70 65 72 20  HEN.    toupper 
05b0: 27 41 27 20 27 5b 27 20 77 69 74 68 69 6e 20 49  'A' '[' within I
05c0: 46 20 20 65 73 63 2d 73 74 61 74 65 20 6f 66 66  F  esc-state off
05d0: 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 74 79 70 65    THEN ;..: type
05e0: 2d 70 77 2a 20 28 20 61 64 64 72 20 75 20 2d 2d  -pw* ( addr u --
05f0: 20 29 20 20 32 64 75 70 20 62 6c 20 73 6b 69 70   )  2dup bl skip
0600: 20 6e 69 70 20 30 3d 0a 20 20 20 20 49 46 20 20   nip 0=.    IF  
0610: 20 20 62 6f 75 6e 64 73 20 55 2b 44 4f 20 20 62    bounds U+DO  b
0620: 6c 20 6f 6c 64 2d 65 6d 69 74 20 20 20 20 4c 4f  l old-emit    LO
0630: 4f 50 0a 20 20 20 20 45 4c 53 45 20 20 62 6f 75  OP.    ELSE  bou
0640: 6e 64 73 20 55 2b 44 4f 20 20 49 20 63 40 20 65  nds U+DO  I c@ e
0650: 6d 69 74 2d 70 77 2a 20 20 4c 4f 4f 50 20 20 54  mit-pw*  LOOP  T
0660: 48 45 4e 20 3b 0a 0a 3a 20 61 63 63 65 70 74 2a  HEN ;..: accept*
0670: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 75 27 20   ( addr u -- u' 
0680: 29 0a 20 20 20 20 5c 47 20 61 63 63 65 70 74 2d  ).    \G accept-
0690: 6c 69 6b 65 20 69 6e 70 75 74 2c 20 62 75 74 20  like input, but 
06a0: 74 79 70 65 73 20 2a 20 69 6e 73 74 65 61 64 20  types * instead 
06b0: 6f 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72  of the character
06c0: 0a 20 20 20 20 5c 47 20 64 6f 6e 27 74 20 73 61  .    \G don't sa
06d0: 76 65 20 69 6e 74 6f 20 68 69 73 74 6f 72 79 0a  ve into history.
06e0: 20 20 20 20 68 69 73 74 6f 72 79 20 3e 72 20 20      history >r  
06f0: 77 68 61 74 27 73 20 74 79 70 65 20 3e 72 20 20  what's type >r  
0700: 77 68 61 74 27 73 20 65 6d 69 74 20 69 73 20 6f  what's emit is o
0710: 6c 64 2d 65 6d 69 74 0a 20 20 20 20 75 74 66 2d  ld-emit.    utf-
0720: 38 2a 20 78 63 2d 76 65 63 74 6f 72 20 21 40 20  8* xc-vector !@ 
0730: 3e 72 20 20 5b 27 5d 20 74 79 70 65 2d 70 77 2a  >r  ['] type-pw*
0740: 20 69 73 20 74 79 70 65 20 20 5b 27 5d 20 65 6d   is type  ['] em
0750: 69 74 2d 70 77 2a 20 69 73 20 65 6d 69 74 0a 20  it-pw* is emit. 
0760: 20 20 20 30 20 74 6f 20 68 69 73 74 6f 72 79 0a     0 to history.
0770: 20 20 20 20 5b 27 5d 20 61 63 63 65 70 74 20 63      ['] accept c
0780: 61 74 63 68 0a 20 20 20 20 72 3e 20 78 63 2d 76  atch.    r> xc-v
0790: 65 63 74 6f 72 20 21 20 20 77 68 61 74 27 73 20  ector !  what's 
07a0: 6f 6c 64 2d 65 6d 69 74 20 69 73 20 65 6d 69 74  old-emit is emit
07b0: 20 20 72 3e 20 69 73 20 74 79 70 65 20 20 72 3e    r> is type  r>
07c0: 20 74 6f 20 68 69 73 74 6f 72 79 0a 20 20 20 20   to history.    
07d0: 74 68 72 6f 77 20 2d 31 20 30 20 61 74 2d 64 65  throw -1 0 at-de
07e0: 6c 74 61 78 79 20 73 70 61 63 65 20 3b 0a 0a 5c  ltaxy space ;..\
07f0: 20 4b 65 79 73 20 61 72 65 20 70 61 73 73 77 6f   Keys are passwo
0800: 72 64 73 20 61 6e 64 20 70 72 69 76 61 74 65 20  rds and private 
0810: 6b 65 79 73 20 28 73 65 6c 66 2d 6b 65 79 65 64  keys (self-keyed
0820: 2c 20 69 2e 65 2e 20 70 72 69 76 61 74 65 2a 70  , i.e. private*p
0830: 75 62 6c 69 63 20 6b 65 79 29 0a 0a 63 6d 64 2d  ublic key)..cmd-
0840: 62 75 66 30 20 75 63 6c 61 73 73 20 63 6d 64 62  buf0 uclass cmdb
0850: 75 66 2d 6f 0a 20 20 20 20 6d 61 78 64 61 74 61  uf-o.    maxdata
0860: 20 2d 0a 20 20 20 20 6b 65 79 2d 73 61 6c 74 23   -.    key-salt#
0870: 20 75 76 61 72 20 6b 65 79 70 61 63 6b 0a 20 20   uvar keypack.  
0880: 20 20 6b 65 79 70 61 63 6b 23 20 20 75 76 61 72    keypack#  uvar
0890: 20 6b 65 79 70 61 63 6b 2d 62 75 66 0a 20 20 20   keypack-buf.   
08a0: 20 6b 65 79 2d 63 6b 73 75 6d 23 20 75 76 61 72   key-cksum# uvar
08b0: 20 6b 65 79 70 61 63 6b 2d 63 68 6b 73 75 6d 0a   keypack-chksum.
08c0: 65 6e 64 2d 63 6c 61 73 73 20 63 6d 64 2d 6b 65  end-class cmd-ke
08d0: 79 62 75 66 2d 63 0a 0a 63 6d 64 2d 6b 65 79 62  ybuf-c..cmd-keyb
08e0: 75 66 2d 63 20 6e 65 77 20 63 6f 64 65 2d 6b 65  uf-c new code-ke
08f0: 79 5e 20 21 0a 27 20 63 6f 64 65 2d 6b 65 79 5e  y^ !.' code-key^
0900: 20 63 6d 64 62 75 66 3a 20 63 6f 64 65 2d 6b 65   cmdbuf: code-ke
0910: 79 0a 0a 63 6f 64 65 2d 6b 65 79 0a 63 6d 64 30  y..code-key.cmd0
0920: 6c 6f 63 6b 20 30 20 70 74 68 72 65 61 64 5f 6d  lock 0 pthread_m
0930: 75 74 65 78 5f 69 6e 69 74 20 64 72 6f 70 0a 0a  utex_init drop..
0940: 3a 6e 6f 6e 61 6d 65 20 28 20 2d 2d 20 61 64 64  :noname ( -- add
0950: 72 20 75 20 29 20 6b 65 79 70 61 63 6b 2d 62 75  r u ) keypack-bu
0960: 66 20 63 6d 64 62 75 66 23 20 40 20 3b 20 74 6f  f cmdbuf# @ ; to
0970: 20 63 6d 64 62 75 66 24 0a 3a 6e 6f 6e 61 6d 65   cmdbuf$.:noname
0980: 20 28 20 2d 2d 20 6e 20 29 20 20 6b 65 79 70 61   ( -- n )  keypa
0990: 63 6b 23 20 63 6d 64 62 75 66 23 20 40 20 2d 20  ck# cmdbuf# @ - 
09a0: 3b 20 74 6f 20 6d 61 78 73 74 72 69 6e 67 0a 0a  ; to maxstring..
09b0: 63 6f 64 65 30 2d 62 75 66 0a 0a 3a 6e 6f 6e 61  code0-buf..:nona
09c0: 6d 65 20 64 65 66 65 72 73 20 61 6c 6c 6f 63 2d  me defers alloc-
09d0: 63 6f 64 65 2d 62 75 66 73 0a 20 20 20 20 63 6d  code-bufs.    cm
09e0: 64 2d 6b 65 79 62 75 66 2d 63 20 6e 65 77 20 63  d-keybuf-c new c
09f0: 6f 64 65 2d 6b 65 79 5e 20 21 20 3b 20 69 73 20  ode-key^ ! ; is 
0a00: 61 6c 6c 6f 63 2d 63 6f 64 65 2d 62 75 66 73 0a  alloc-code-bufs.
0a10: 3a 6e 6f 6e 61 6d 65 20 64 65 66 65 72 73 20 66  :noname defers f
0a20: 72 65 65 2d 63 6f 64 65 2d 62 75 66 73 0a 20 20  ree-code-bufs.  
0a30: 20 20 63 6f 64 65 2d 6b 65 79 5e 20 40 20 2e 64    code-key^ @ .d
0a40: 69 73 70 6f 73 65 20 3b 20 69 73 20 66 72 65 65  ispose ; is free
0a50: 2d 63 6f 64 65 2d 62 75 66 73 0a 0a 5c 20 68 61  -code-bufs..\ ha
0a60: 73 68 65 64 20 6b 65 79 20 64 61 74 61 20 62 61  shed key data ba
0a70: 73 65 0a 0a 55 73 65 72 20 3e 73 74 6f 72 65 6b  se..User >storek
0a80: 65 79 0a 0a 63 6d 64 2d 63 6c 61 73 73 20 63 6c  ey..cmd-class cl
0a90: 61 73 73 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b  ass.    field: k
0aa0: 65 2d 73 6b 20 20 20 20 20 20 20 5c 20 73 65 63  e-sk       \ sec
0ab0: 72 65 74 20 6b 65 79 0a 20 20 20 20 66 69 65 6c  ret key.    fiel
0ac0: 64 3a 20 6b 65 2d 70 6b 20 20 20 20 20 20 20 5c  d: ke-pk       \
0ad0: 20 70 75 62 6c 69 63 20 6b 65 79 0a 20 20 20 20   public key.    
0ae0: 66 69 65 6c 64 3a 20 6b 65 2d 74 79 70 65 20 20  field: ke-type  
0af0: 20 20 20 5c 20 6b 65 79 20 74 79 70 65 0a 20 20     \ key type.  
0b00: 20 20 66 69 65 6c 64 3a 20 6b 65 2d 6e 69 63 6b    field: ke-nick
0b10: 20 20 20 20 20 5c 20 6b 65 79 20 6e 69 63 6b 0a       \ key nick.
0b20: 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 6e 69      field: ke-ni
0b30: 63 6b 23 20 20 20 20 5c 20 74 6f 20 61 76 6f 69  ck#    \ to avoi
0b40: 64 20 63 6f 6c 69 73 73 69 6f 6e 73 2c 20 61 64  d colissions, ad
0b50: 64 20 61 20 6e 75 6d 62 65 72 20 68 65 72 65 0a  d a number here.
0b60: 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 70 73      field: ke-ps
0b70: 6b 20 20 20 20 20 20 5c 20 70 72 65 73 68 61 72  k      \ preshar
0b80: 65 64 20 6b 65 79 20 66 6f 72 20 73 74 61 74 65  ed key for state
0b90: 6c 65 73 73 20 63 6f 6d 6d 75 6e 69 63 61 74 69  less communicati
0ba0: 6f 6e 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b 65  on.    field: ke
0bb0: 2d 70 72 6f 66 20 20 20 20 20 5c 20 70 72 6f 66  -prof     \ prof
0bc0: 69 6c 65 20 6f 62 6a 65 63 74 0a 20 20 20 20 66  ile object.    f
0bd0: 69 65 6c 64 3a 20 6b 65 2d 73 65 6c 66 73 69 67  ield: ke-selfsig
0be0: 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 73  .    field: ke-s
0bf0: 69 67 73 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b  igs.    field: k
0c00: 65 2d 69 6d 70 6f 72 74 20 20 20 5c 20 74 79 70  e-import   \ typ
0c10: 65 20 6f 66 20 6b 65 79 20 69 6d 70 6f 72 74 0a  e of key import.
0c20: 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 73 74      field: ke-st
0c30: 6f 72 65 6b 65 79 20 5c 20 75 73 65 64 20 74 6f  orekey \ used to
0c40: 20 65 6e 63 72 79 70 74 20 6f 6e 20 73 74 6f 72   encrypt on stor
0c50: 61 67 65 0a 20 20 20 20 36 34 66 69 65 6c 64 3a  age.    64field:
0c60: 20 6b 65 2d 6f 66 66 73 65 74 20 5c 20 6f 66 66   ke-offset \ off
0c70: 73 65 74 20 69 6e 20 6b 65 79 20 66 69 6c 65 0a  set in key file.
0c80: 20 20 20 20 36 34 66 69 65 6c 64 3a 20 6b 65 2d      64field: ke-
0c90: 6d 61 73 6b 20 20 20 5c 20 70 65 72 6d 69 73 73  mask   \ permiss
0ca0: 69 6f 6e 20 6d 61 73 6b 0a 20 20 20 20 30 20 2b  ion mask.    0 +
0cb0: 66 69 65 6c 64 20 6b 65 2d 65 6e 64 0a 65 6e 64  field ke-end.end
0cc0: 2d 63 6c 61 73 73 20 6b 65 79 2d 65 6e 74 72 79  -class key-entry
0cd0: 0a 0a 3a 20 66 72 65 65 2d 6b 65 79 20 28 20 6f  ..: free-key ( o
0ce0: 3a 6b 65 79 20 2d 2d 20 6f 3a 6b 65 79 20 29 0a  :key -- o:key ).
0cf0: 20 20 20 20 5c 67 20 66 72 65 65 20 61 6c 6c 20      \g free all 
0d00: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 75 62  parts of the sub
0d10: 6b 65 79 0a 20 20 20 20 6b 65 2d 73 6b 20 73 65  key.    ke-sk se
0d20: 63 2d 6f 66 66 0a 20 20 20 20 6b 65 2d 70 6b 20  c-off.    ke-pk 
0d30: 24 6f 66 66 0a 20 20 20 20 6b 65 2d 6e 69 63 6b  $off.    ke-nick
0d40: 20 24 6f 66 66 0a 20 20 20 20 6b 65 2d 70 73 6b   $off.    ke-psk
0d50: 20 73 65 63 2d 6f 66 66 0a 20 20 20 20 6b 65 2d   sec-off.    ke-
0d60: 73 65 6c 66 73 69 67 20 24 6f 66 66 0a 20 20 20  selfsig $off.   
0d70: 20 6b 65 2d 73 69 67 73 20 24 5b 5d 6f 66 66 20   ke-sigs $[]off 
0d80: 3b 0a 0a 56 61 72 69 61 62 6c 65 20 6b 65 79 2d  ;..Variable key-
0d90: 65 6e 74 72 79 2d 74 61 62 6c 65 0a 0a 30 0a 65  entry-table..0.e
0da0: 6e 75 6d 20 6b 65 79 23 61 6e 6f 6e 0a 65 6e 75  num key#anon.enu
0db0: 6d 20 6b 65 79 23 75 73 65 72 0a 65 6e 75 6d 20  m key#user.enum 
0dc0: 6b 65 79 23 67 72 6f 75 70 0a 64 72 6f 70 0a 0a  key#group.drop..
0dd0: 30 0a 65 6e 75 6d 20 69 6d 70 6f 72 74 23 73 65  0.enum import#se
0de0: 6c 66 20 20 20 20 20 20 5c 20 70 72 69 76 61 74  lf      \ privat
0df0: 65 20 6b 65 79 0a 65 6e 75 6d 20 69 6d 70 6f 72  e key.enum impor
0e00: 74 23 6d 61 6e 75 61 6c 20 20 20 20 5c 20 6d 61  t#manual    \ ma
0e10: 6e 75 61 6c 20 69 6d 70 6f 72 74 0a 65 6e 75 6d  nual import.enum
0e20: 20 69 6d 70 6f 72 74 23 73 63 61 6e 20 20 20 20   import#scan    
0e30: 20 20 5c 20 73 63 61 6e 20 69 6d 70 6f 72 74 0a    \ scan import.
0e40: 65 6e 75 6d 20 69 6d 70 6f 72 74 23 63 68 61 74  enum import#chat
0e50: 20 20 20 20 20 20 5c 20 63 68 61 74 20 69 6d 70        \ chat imp
0e60: 6f 72 74 0a 65 6e 75 6d 20 69 6d 70 6f 72 74 23  ort.enum import#
0e70: 64 68 74 20 20 20 20 20 20 20 5c 20 64 68 74 20  dht       \ dht 
0e80: 69 6d 70 6f 72 74 0a 65 6e 75 6d 20 69 6d 70 6f  import.enum impo
0e90: 72 74 23 69 6e 76 69 74 65 64 20 20 20 5c 20 69  rt#invited   \ i
0ea0: 6e 76 69 74 61 74 69 6f 6e 20 69 6d 70 6f 72 74  nvitation import
0eb0: 0a 65 6e 75 6d 20 69 6d 70 6f 72 74 23 75 6e 74  .enum import#unt
0ec0: 72 75 73 74 65 64 20 5c 20 6d 75 73 74 20 62 65  rusted \ must be
0ed0: 20 6c 61 73 74 0a 64 72 6f 70 0a 0a 31 0a 62 69   last.drop..1.bi
0ee0: 74 20 70 65 72 6d 25 63 6f 6e 6e 65 63 74 20 5c  t perm%connect \
0ef0: 20 6e 6f 74 20 73 65 74 20 66 6f 72 20 62 61 6e   not set for ban
0f00: 6e 65 64 20 70 65 6f 70 6c 65 0a 62 69 74 20 70  ned people.bit p
0f10: 65 72 6d 25 64 68 74 20 20 20 20 20 5c 20 63 61  erm%dht     \ ca
0f20: 6e 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  n write into the
0f30: 20 44 48 54 0a 62 69 74 20 70 65 72 6d 25 6d 73   DHT.bit perm%ms
0f40: 67 20 20 20 20 20 5c 20 63 61 6e 20 73 65 6e 64  g     \ can send
0f50: 20 6d 65 73 73 61 67 65 73 0a 62 69 74 20 70 65   messages.bit pe
0f60: 72 6d 25 66 69 6c 65 72 64 20 20 5c 20 63 61 6e  rm%filerd  \ can
0f70: 20 72 65 61 64 20 66 69 6c 65 73 0a 62 69 74 20   read files.bit 
0f80: 70 65 72 6d 25 66 69 6c 65 77 72 20 20 5c 20 63  perm%filewr  \ c
0f90: 61 6e 20 77 72 69 74 65 20 66 69 6c 65 73 0a 64  an write files.d
0fa0: 72 6f 70 0a 0a 70 65 72 6d 25 6d 73 67 20 70 65  rop..perm%msg pe
0fb0: 72 6d 25 66 69 6c 65 72 64 20 6f 72 20 43 6f 6e  rm%filerd or Con
0fc0: 73 74 61 6e 74 20 70 65 72 6d 25 64 65 66 61 75  stant perm%defau
0fd0: 6c 74 0a 0a 56 61 72 69 61 62 6c 65 20 69 6d 70  lt..Variable imp
0fe0: 6f 72 74 2d 74 79 70 65 20 20 69 6d 70 6f 72 74  ort-type  import
0ff0: 23 75 6e 74 72 75 73 74 65 64 20 69 6d 70 6f 72  #untrusted impor
1000: 74 2d 74 79 70 65 20 21 0a 0a 43 72 65 61 74 65  t-type !..Create
1010: 20 3e 69 6d 2d 63 6f 6c 6f 72 20 20 24 42 36 30   >im-color  $B60
1020: 20 2c 20 24 44 36 30 20 2c 20 24 39 36 30 20 2c   , $D60 , $960 ,
1030: 20 24 43 36 30 20 2c 20 24 41 36 30 20 2c 20 24   $C60 , $A60 , $
1040: 38 42 31 20 2c 20 24 45 36 30 20 2c 0a 44 4f 45  8B1 , $E60 ,.DOE
1050: 53 3e 20 73 77 61 70 20 63 65 6c 6c 73 20 2b 20  S> swap cells + 
1060: 40 20 61 74 74 72 21 20 3b 0a 0a 30 20 56 61 6c  @ attr! ;..0 Val
1070: 75 65 20 73 61 6d 70 6c 65 2d 6b 65 79 0a 0a 56  ue sample-key..V
1080: 61 72 69 61 62 6c 65 20 6b 65 79 2d 74 61 62 6c  ariable key-tabl
1090: 65 20 5c 20 6b 65 79 20 68 61 73 68 20 74 61 62  e \ key hash tab
10a0: 6c 65 0a 56 61 72 69 61 62 6c 65 20 6e 69 63 6b  le.Variable nick
10b0: 2d 74 61 62 6c 65 20 5c 20 6e 69 63 6b 20 68 61  -table \ nick ha
10c0: 73 68 20 74 61 62 6c 65 0a 0a 36 34 56 61 72 69  sh table..64Vari
10d0: 61 62 6c 65 20 6b 65 79 2d 72 65 61 64 2d 6f 66  able key-read-of
10e0: 66 73 65 74 0a 0a 3a 20 63 75 72 72 65 6e 74 2d  fset..: current-
10f0: 6b 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d 20  key ( addr u -- 
1100: 6f 20 29 0a 20 20 20 20 32 64 75 70 20 6b 65 79  o ).    2dup key
1110: 7c 20 6b 65 79 2d 74 61 62 6c 65 20 23 40 20 64  | key-table #@ d
1120: 72 6f 70 0a 20 20 20 20 64 75 70 20 30 3d 20 49  rop.    dup 0= I
1130: 46 20 20 64 72 6f 70 20 2e 22 20 75 6e 6b 6e 6f  F  drop ." unkno
1140: 77 6e 20 6b 65 79 3a 20 22 20 38 35 74 79 70 65  wn key: " 85type
1150: 20 63 72 20 20 30 20 45 58 49 54 20 20 54 48 45   cr  0 EXIT  THE
1160: 4e 0a 20 20 20 20 63 65 6c 6c 2b 20 3e 6f 20 6b  N.    cell+ >o k
1170: 65 2d 70 6b 20 24 21 20 6f 20 6f 3e 20 3b 0a 0a  e-pk $! o o> ;..
1180: 56 61 72 69 61 62 6c 65 20 73 69 6d 2d 6e 69 63  Variable sim-nic
1190: 6b 21 0a 0a 3a 20 6e 69 63 6b 21 20 28 20 2d 2d  k!..: nick! ( --
11a0: 20 29 20 73 69 6d 2d 6e 69 63 6b 21 20 40 20 3f   ) sim-nick! @ ?
11b0: 45 58 49 54 20 20 6f 20 7b 20 77 5e 20 6f 70 74  EXIT  o { w^ opt
11c0: 72 20 7d 0a 20 20 20 20 6b 65 2d 6e 69 63 6b 20  r }.    ke-nick 
11d0: 24 40 20 6e 69 63 6b 2d 74 61 62 6c 65 20 23 40  $@ nick-table #@
11e0: 20 64 30 3d 20 49 46 0a 09 6f 70 74 72 20 63 65   d0= IF..optr ce
11f0: 6c 6c 20 6b 65 2d 6e 69 63 6b 20 24 40 20 6e 69  ll ke-nick $@ ni
1200: 63 6b 2d 74 61 62 6c 65 20 23 21 20 30 0a 20 20  ck-table #! 0.  
1210: 20 20 45 4c 53 45 0a 09 6c 61 73 74 23 20 63 65    ELSE..last# ce
1220: 6c 6c 2b 20 24 40 6c 65 6e 20 63 65 6c 6c 2f 0a  ll+ $@len cell/.
1230: 09 6f 70 74 72 20 63 65 6c 6c 20 6c 61 73 74 23  .optr cell last#
1240: 20 63 65 6c 6c 2b 20 24 2b 21 0a 20 20 20 20 54   cell+ $+!.    T
1250: 48 45 4e 20 20 6b 65 2d 6e 69 63 6b 23 20 21 20  HEN  ke-nick# ! 
1260: 3b 0a 0a 3a 20 23 2e 6e 69 63 6b 20 28 20 68 61  ;..: #.nick ( ha
1270: 73 68 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 20  sh -- ).    dup 
1280: 24 40 20 74 79 70 65 20 27 23 27 20 65 6d 69 74  $@ type '#' emit
1290: 20 63 65 6c 6c 2b 20 24 40 6c 65 6e 20 63 65 6c   cell+ $@len cel
12a0: 6c 2f 20 2e 20 3b 0a 0a 3a 20 6b 65 79 3a 6e 65  l/ . ;..: key:ne
12b0: 77 20 28 20 61 64 64 72 20 75 20 2d 2d 20 6f 20  w ( addr u -- o 
12c0: 29 0a 20 20 20 20 5c 47 20 63 72 65 61 74 65 20  ).    \G create 
12d0: 6e 65 77 20 6b 65 79 2c 20 61 64 64 72 20 75 20  new key, addr u 
12e0: 69 73 20 74 68 65 20 70 75 62 6c 69 63 20 6b 65  is the public ke
12f0: 79 0a 20 20 20 20 73 61 6d 70 6c 65 2d 6b 65 79  y.    sample-key
1300: 20 3e 6f 0a 20 20 20 20 6b 65 79 2d 65 6e 74 72   >o.    key-entr
1310: 79 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e 2d  y-table @ token-
1320: 74 61 62 6c 65 20 21 0a 20 20 20 20 6b 65 2d 73  table !.    ke-s
1330: 6b 20 6b 65 2d 65 6e 64 20 6f 76 65 72 20 2d 20  k ke-end over - 
1340: 65 72 61 73 65 20 20 3e 73 74 6f 72 65 6b 65 79  erase  >storekey
1350: 20 40 20 6b 65 2d 73 74 6f 72 65 6b 65 79 20 21   @ ke-storekey !
1360: 0a 20 20 20 20 6b 65 79 2d 72 65 61 64 2d 6f 66  .    key-read-of
1370: 66 73 65 74 20 36 34 40 20 6b 65 2d 6f 66 66 73  fset 64@ ke-offs
1380: 65 74 20 36 34 21 0a 20 20 20 20 69 6d 70 6f 72  et 64!.    impor
1390: 74 2d 74 79 70 65 20 40 20 6b 65 2d 69 6d 70 6f  t-type @ ke-impo
13a0: 72 74 20 21 0a 20 20 20 20 6b 65 79 70 61 63 6b  rt !.    keypack
13b0: 2d 61 6c 6c 23 20 6e 3e 36 34 20 6b 65 79 2d 72  -all# n>64 key-r
13c0: 65 61 64 2d 6f 66 66 73 65 74 20 36 34 2b 21 20  ead-offset 64+! 
13d0: 6f 20 63 65 6c 6c 2d 20 6b 65 2d 65 6e 64 20 6f  o cell- ke-end o
13e0: 76 65 72 20 2d 0a 20 20 20 20 32 6f 76 65 72 20  ver -.    2over 
13f0: 6b 65 79 7c 20 6b 65 79 2d 74 61 62 6c 65 20 23  key| key-table #
1400: 21 20 6f 3e 0a 20 20 20 20 63 75 72 72 65 6e 74  ! o>.    current
1410: 2d 6b 65 79 20 3b 0a 0a 3a 20 6b 65 79 3f 6e 65  -key ;..: key?ne
1420: 77 20 28 20 61 64 64 72 20 75 20 2d 2d 20 6f 20  w ( addr u -- o 
1430: 29 0a 20 20 20 20 5c 47 20 43 72 65 61 74 65 20  ).    \G Create 
1440: 6f 72 20 6c 6f 6f 6b 75 70 20 6e 65 77 20 6b 65  or lookup new ke
1450: 79 0a 20 20 20 20 32 64 75 70 20 6b 65 79 7c 20  y.    2dup key| 
1460: 6b 65 79 2d 74 61 62 6c 65 20 23 40 20 64 72 6f  key-table #@ dro
1470: 70 0a 20 20 20 20 64 75 70 20 30 3d 20 49 46 20  p.    dup 0= IF 
1480: 20 64 72 6f 70 20 6b 65 79 3a 6e 65 77 20 20 45   drop key:new  E
1490: 4c 53 45 20 20 6e 69 70 20 6e 69 70 20 63 65 6c  LSE  nip nip cel
14a0: 6c 2b 20 20 54 48 45 4e 20 3b 0a 0a 5c 20 73 65  l+  THEN ;..\ se
14b0: 61 72 63 68 20 66 6f 72 20 6b 65 79 73 20 2d 20  arch for keys - 
14c0: 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 64 0a 0a 3a  not optimized..:
14d0: 20 23 73 70 6c 69 74 20 28 20 61 64 64 72 20 75   #split ( addr u
14e0: 20 2d 2d 20 61 64 64 72 20 75 20 6e 20 29 0a 20   -- addr u n ). 
14f0: 20 20 20 5b 3a 20 32 64 75 70 20 27 23 27 20 2d     [: 2dup '#' -
1500: 73 63 61 6e 20 6e 69 70 20 3e 72 0a 20 20 20 20  scan nip >r.    
1510: 20 20 72 40 20 30 3d 20 49 46 20 20 72 64 72 6f    r@ 0= IF  rdro
1520: 70 20 30 20 20 45 58 49 54 20 20 54 48 45 4e 0a  p 0  EXIT  THEN.
1530: 20 20 20 20 20 20 30 2e 20 32 6f 76 65 72 20 72        0. 2over r
1540: 40 20 2f 73 74 72 69 6e 67 20 3e 6e 75 6d 62 65  @ /string >numbe
1550: 72 0a 20 20 20 20 20 20 30 3d 20 49 46 20 20 6e  r.      0= IF  n
1560: 69 70 20 64 72 6f 70 20 6e 69 70 20 72 3e 20 31  ip drop nip r> 1
1570: 2d 20 73 77 61 70 20 20 45 4c 53 45 0a 09 20 20  - swap  ELSE..  
1580: 72 64 72 6f 70 20 64 72 6f 70 20 32 64 72 6f 70  rdrop drop 2drop
1590: 20 30 20 20 20 54 48 45 4e 20 3b 5d 20 23 31 30   0   THEN ;] #10
15a0: 20 62 61 73 65 2d 65 78 65 63 75 74 65 20 3b 0a   base-execute ;.
15b0: 0a 3a 20 6e 69 63 6b 2d 6b 65 79 20 28 20 61 64  .: nick-key ( ad
15c0: 64 72 20 75 20 2d 2d 20 6f 20 2f 20 30 20 29 20  dr u -- o / 0 ) 
15d0: 5c 20 73 65 61 72 63 68 20 66 6f 72 20 6b 65 79  \ search for key
15e0: 20 6e 69 63 6b 6e 61 6d 65 0a 20 20 20 20 23 73   nickname.    #s
15f0: 70 6c 69 74 20 3e 72 20 6e 69 63 6b 2d 74 61 62  plit >r nick-tab
1600: 6c 65 20 23 40 20 32 64 75 70 20 64 30 3d 20 49  le #@ 2dup d0= I
1610: 46 20 20 72 64 72 6f 70 20 64 72 6f 70 20 20 45  F  rdrop drop  E
1620: 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 72 3e  XIT  THEN.    r>
1630: 20 63 65 6c 6c 73 20 73 61 66 65 2f 73 74 72 69   cells safe/stri
1640: 6e 67 20 30 3d 20 49 46 20 20 64 72 6f 70 20 30  ng 0= IF  drop 0
1650: 20 20 45 58 49 54 20 20 54 48 45 4e 20 20 40 20    EXIT  THEN  @ 
1660: 3b 0a 0a 3a 20 73 65 63 72 65 74 2d 6b 65 79 73  ;..: secret-keys
1670: 23 20 28 20 2d 2d 20 6e 20 29 0a 20 20 20 20 30  # ( -- n ).    0
1680: 20 6b 65 79 2d 74 61 62 6c 65 20 5b 3a 20 63 65   key-table [: ce
1690: 6c 6c 2b 20 24 40 20 64 72 6f 70 20 63 65 6c 6c  ll+ $@ drop cell
16a0: 2b 20 3e 6f 20 6b 65 2d 73 6b 20 40 20 30 3c 3e  + >o ke-sk @ 0<>
16b0: 20 2d 20 6f 3e 20 3b 5d 20 23 6d 61 70 20 3b 0a   - o> ;] #map ;.
16c0: 3a 20 73 65 63 72 65 74 2d 6b 65 79 20 28 20 6e  : secret-key ( n
16d0: 20 2d 2d 20 6f 2f 30 20 29 0a 20 20 20 20 30 20   -- o/0 ).    0 
16e0: 74 75 63 6b 20 6b 65 79 2d 74 61 62 6c 65 20 5b  tuck key-table [
16f0: 3a 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f 70 20  : cell+ $@ drop 
1700: 63 65 6c 6c 2b 20 3e 6f 20 6b 65 2d 73 6b 20 40  cell+ >o ke-sk @
1710: 20 49 46 0a 09 20 20 32 64 75 70 20 3d 20 49 46   IF..  2dup = IF
1720: 20 20 72 6f 74 20 64 72 6f 70 20 6f 20 2d 72 6f    rot drop o -ro
1730: 74 20 20 54 48 45 4e 20 20 31 2b 0a 20 20 20 20  t  THEN  1+.    
1740: 20 20 54 48 45 4e 20 20 6f 3e 20 3b 5d 20 23 6d    THEN  o> ;] #m
1750: 61 70 20 32 64 72 6f 70 20 3b 0a 3a 20 2e 6e 69  ap 2drop ;.: .ni
1760: 63 6b 2d 62 61 73 65 20 28 20 6f 3a 6b 65 79 20  ck-base ( o:key 
1770: 2d 2d 20 29 0a 20 20 20 20 6b 65 2d 6e 69 63 6b  -- ).    ke-nick
1780: 20 24 2e 20 20 6b 65 2d 6e 69 63 6b 23 20 40 20   $.  ke-nick# @ 
1790: 3f 64 75 70 2d 49 46 20 20 27 23 27 20 65 6d 69  ?dup-IF  '#' emi
17a0: 74 20 30 20 2e 72 20 20 54 48 45 4e 20 3b 0a 3a  t 0 .r  THEN ;.:
17b0: 20 2e 6e 69 63 6b 20 28 20 6f 3a 6b 65 79 20 2d   .nick ( o:key -
17c0: 2d 20 29 20 20 20 6b 65 2d 69 6d 70 6f 72 74 20  - )   ke-import 
17d0: 40 20 3e 69 6d 2d 63 6f 6c 6f 72 20 2e 6e 69 63  @ >im-color .nic
17e0: 6b 2d 62 61 73 65 20 3c 64 65 66 61 75 6c 74 3e  k-base <default>
17f0: 20 3b 0a 0a 3a 20 6e 69 63 6b 3e 70 6b 20 28 20   ;..: nick>pk ( 
1800: 6e 69 63 6b 20 75 20 2d 2d 20 70 6b 20 75 20 29  nick u -- pk u )
1810: 0a 20 20 20 20 6e 69 63 6b 2d 6b 65 79 20 3f 64  .    nick-key ?d
1820: 75 70 2d 49 46 20 2e 6b 65 2d 70 6b 20 24 40 20  up-IF .ke-pk $@ 
1830: 45 4c 53 45 20 30 20 30 20 54 48 45 4e 20 3b 0a  ELSE 0 0 THEN ;.
1840: 3a 20 68 6f 73 74 2e 6e 69 63 6b 3e 70 6b 20 28  : host.nick>pk (
1850: 20 61 64 64 72 20 75 20 2d 2d 20 70 6b 20 75 27   addr u -- pk u'
1860: 20 29 0a 20 20 20 20 27 2e 27 20 24 73 70 6c 69   ).    '.' $spli
1870: 74 20 64 75 70 20 30 3d 20 49 46 20 20 32 73 77  t dup 0= IF  2sw
1880: 61 70 20 20 54 48 45 4e 20 5b 3a 20 6e 69 63 6b  ap  THEN [: nick
1890: 3e 70 6b 20 74 79 70 65 20 74 79 70 65 20 3b 5d  >pk type type ;]
18a0: 20 24 74 6d 70 20 3b 0a 0a 3a 20 6b 65 79 2d 65   $tmp ;..: key-e
18b0: 78 69 73 74 3f 20 28 20 61 64 64 72 20 75 20 2d  xist? ( addr u -
18c0: 2d 20 66 6c 61 67 20 29 0a 20 20 20 20 6b 65 79  - flag ).    key
18d0: 2d 74 61 62 6c 65 20 23 40 20 64 30 3c 3e 20 3b  -table #@ d0<> ;
18e0: 20 0a 0a 56 61 72 69 61 62 6c 65 20 73 74 72 69   ..Variable stri
18f0: 63 74 2d 6b 65 79 73 20 20 73 74 72 69 63 74 2d  ct-keys  strict-
1900: 6b 65 79 73 20 6f 6e 0a 0a 5b 49 46 55 4e 44 45  keys on..[IFUNDE
1910: 46 5d 20 6d 61 67 65 6e 74 61 20 20 62 72 6f 77  F] magenta  brow
1920: 6e 20 63 6f 6e 73 74 61 6e 74 20 6d 61 67 65 6e  n constant magen
1930: 74 61 20 5b 54 48 45 4e 5d 0a 5b 49 46 44 45 46  ta [THEN].[IFDEF
1940: 5d 20 67 6c 2d 74 79 70 65 20 3a 20 62 67 7c 20  ] gl-type : bg| 
1950: 3e 62 67 20 6f 72 20 3b 20 5b 45 4c 53 45 5d 20  >bg or ; [ELSE] 
1960: 3a 20 62 67 7c 20 64 72 6f 70 20 3b 20 5b 54 48  : bg| drop ; [TH
1970: 45 4e 5d 0a 0a 43 72 65 61 74 65 20 38 35 63 6f  EN]..Create 85co
1980: 6c 6f 72 73 2d 62 77 0a 30 20 2c 20 69 6e 76 65  lors-bw.0 , inve
1990: 72 73 20 2c 0a 69 6e 76 65 72 73 20 2c 20 30 20  rs ,.invers , 0 
19a0: 2c 0a 30 20 2c 20 69 6e 76 65 72 73 20 2c 0a 69  ,.0 , invers ,.i
19b0: 6e 76 65 72 73 20 2c 20 30 20 2c 0a 43 72 65 61  nvers , 0 ,.Crea
19c0: 74 65 20 38 35 63 6f 6c 6f 72 73 2d 63 6c 0a 79  te 85colors-cl.y
19d0: 65 6c 6c 6f 77 20 3e 66 67 20 62 6c 75 65 20 3e  ellow >fg blue >
19e0: 62 67 20 6f 72 20 62 6f 6c 64 20 6f 72 20 2c 20  bg or bold or , 
19f0: 72 65 64 20 3e 66 67 20 77 68 69 74 65 20 62 67  red >fg white bg
1a00: 7c 20 2c 0a 62 6c 61 63 6b 20 3e 66 67 20 63 79  | ,.black >fg cy
1a10: 61 6e 20 62 67 7c 20 2c 20 67 72 65 65 6e 20 3e  an bg| , green >
1a20: 66 67 20 62 6c 61 63 6b 20 3e 62 67 20 6f 72 20  fg black >bg or 
1a30: 62 6f 6c 64 20 6f 72 20 2c 0a 77 68 69 74 65 20  bold or ,.white 
1a40: 3e 66 67 20 62 6c 61 63 6b 20 3e 62 67 20 6f 72  >fg black >bg or
1a50: 20 62 6f 6c 64 20 6f 72 20 2c 20 6d 61 67 65 6e   bold or , magen
1a60: 74 61 20 3e 66 67 20 79 65 6c 6c 6f 77 20 62 67  ta >fg yellow bg
1a70: 7c 20 2c 0a 62 6c 75 65 20 3e 66 67 20 79 65 6c  | ,.blue >fg yel
1a80: 6c 6f 77 20 62 67 7c 20 2c 20 63 79 61 6e 20 3e  low bg| , cyan >
1a90: 66 67 20 72 65 64 20 3e 62 67 20 6f 72 20 62 6f  fg red >bg or bo
1aa0: 6c 64 20 6f 72 20 2c 0a 0a 5b 49 46 44 45 46 5d  ld or ,..[IFDEF]
1ab0: 20 67 6c 2d 74 79 70 65 20 38 35 63 6f 6c 6f 72   gl-type 85color
1ac0: 73 2d 63 6c 20 5b 45 4c 53 45 5d 20 38 35 63 6f  s-cl [ELSE] 85co
1ad0: 6c 6f 72 73 2d 62 77 20 5b 54 48 45 4e 5d 20 56  lors-bw [THEN] V
1ae0: 61 6c 75 65 20 38 35 63 6f 6c 6f 72 73 0a 0a 3a  alue 85colors..:
1af0: 20 2e 62 6c 61 63 6b 38 35 20 28 20 61 64 64 72   .black85 ( addr
1b00: 20 75 20 2d 2d 20 29 0a 20 20 20 20 5b 20 62 6c   u -- ).    [ bl
1b10: 61 63 6b 20 3e 62 67 20 62 6c 61 63 6b 20 3e 66  ack >bg black >f
1b20: 67 20 6f 72 20 5d 4c 20 61 74 74 72 21 20 20 20  g or ]L attr!   
1b30: 38 35 74 79 70 65 20 3c 64 65 66 61 75 6c 74 3e  85type <default>
1b40: 20 3b 0a 3a 20 2e 73 74 72 69 70 65 38 35 20 28   ;.: .stripe85 (
1b50: 20 61 64 64 72 20 75 20 2d 2d 20 29 20 20 30 20   addr u -- )  0 
1b60: 2d 72 6f 74 20 62 6f 75 6e 64 73 20 3f 44 4f 0a  -rot bounds ?DO.
1b70: 09 63 72 20 64 75 70 20 63 65 6c 6c 73 20 38 35  .cr dup cells 85
1b80: 63 6f 6c 6f 72 73 20 2b 20 40 20 61 74 74 72 21  colors + @ attr!
1b90: 20 31 2b 0a 09 49 20 34 20 38 35 74 79 70 65 20   1+..I 4 85type 
1ba0: 20 64 75 70 20 63 65 6c 6c 73 20 38 35 63 6f 6c   dup cells 85col
1bb0: 6f 72 73 20 2b 20 40 20 61 74 74 72 21 20 31 2b  ors + @ attr! 1+
1bc0: 0a 09 49 20 34 20 2b 20 34 20 38 35 74 79 70 65  ..I 4 + 4 85type
1bd0: 20 3c 64 65 66 61 75 6c 74 3e 20 38 20 2b 4c 4f   <default> 8 +LO
1be0: 4f 50 20 20 64 72 6f 70 20 3b 0a 3a 20 2e 72 73  OP  drop ;.: .rs
1bf0: 6b 20 28 20 6e 69 63 6b 20 75 20 2d 2d 20 29 0a  k ( nick u -- ).
1c00: 20 20 20 20 73 6b 72 65 76 20 24 32 30 20 2e 73      skrev $20 .s
1c10: 74 72 69 70 65 38 35 20 73 70 61 63 65 20 74 79  tripe85 space ty
1c20: 70 65 20 2e 22 20 20 28 6b 65 65 70 20 6f 66 66  pe ."  (keep off
1c30: 6c 69 6e 65 20 63 6f 70 79 21 29 22 20 63 72 20  line copy!)" cr 
1c40: 3b 0a 3a 20 2e 6b 65 79 20 28 20 61 64 64 72 20  ;.: .key ( addr 
1c50: 75 20 2d 2d 20 29 20 64 72 6f 70 20 63 65 6c 6c  u -- ) drop cell
1c60: 2b 20 3e 6f 0a 20 20 20 20 2e 22 20 6e 69 63 6b  + >o.    ." nick
1c70: 3a 20 22 20 2e 6e 69 63 6b 20 63 72 0a 20 20 20  : " .nick cr.   
1c80: 20 2e 22 20 70 75 62 6b 65 79 3a 20 22 20 6b 65   ." pubkey: " ke
1c90: 2d 70 6b 20 24 40 20 38 35 74 79 70 65 20 63 72  -pk $@ 85type cr
1ca0: 0a 20 20 20 20 6b 65 2d 73 6b 20 40 20 49 46 20  .    ke-sk @ IF 
1cb0: 20 2e 22 20 73 65 63 6b 65 79 3a 20 22 20 6b 65   ." seckey: " ke
1cc0: 2d 73 6b 20 40 20 6b 65 79 73 69 7a 65 0a 09 2e  -sk @ keysize...
1cd0: 62 6c 61 63 6b 38 35 20 2e 22 20 20 28 6b 65 65  black85 ."  (kee
1ce0: 70 20 73 65 63 72 65 74 21 29 22 20 63 72 20 20  p secret!)" cr  
1cf0: 54 48 45 4e 0a 20 20 20 20 2e 22 20 63 72 65 61  THEN.    ." crea
1d00: 74 65 64 3a 20 22 20 6b 65 2d 73 65 6c 66 73 69  ted: " ke-selfsi
1d10: 67 20 24 40 20 64 72 6f 70 20 36 34 40 20 2e 73  g $@ drop 64@ .s
1d20: 69 67 64 61 74 65 20 63 72 0a 20 20 20 20 2e 22  igdate cr.    ."
1d30: 20 65 78 70 69 72 65 73 3a 20 22 20 6b 65 2d 73   expires: " ke-s
1d40: 65 6c 66 73 69 67 20 24 40 20 64 72 6f 70 20 36  elfsig $@ drop 6
1d50: 34 27 2b 20 36 34 40 20 2e 73 69 67 64 61 74 65  4'+ 64@ .sigdate
1d60: 20 63 72 0a 20 20 20 20 6f 3e 20 3b 0a 3a 20 2e   cr.    o> ;.: .
1d70: 6b 65 79 2d 72 65 73 74 20 28 20 6f 3a 6b 65 79  key-rest ( o:key
1d80: 20 2d 2d 20 6f 3a 6b 65 79 20 29 0a 20 20 20 20   -- o:key ).    
1d90: 6b 65 2d 70 6b 20 24 40 20 6b 65 79 73 69 7a 65  ke-pk $@ keysize
1da0: 20 75 6d 69 6e 0a 20 20 20 20 6b 65 2d 69 6d 70   umin.    ke-imp
1db0: 6f 72 74 20 40 20 3e 69 6d 2d 63 6f 6c 6f 72 20  ort @ >im-color 
1dc0: 38 35 74 79 70 65 20 3c 64 65 66 61 75 6c 74 3e  85type <default>
1dd0: 0a 20 20 20 20 6b 65 2d 73 65 6c 66 73 69 67 20  .    ke-selfsig 
1de0: 24 40 20 2e 73 69 67 64 61 74 65 73 0a 20 20 20  $@ .sigdates.   
1df0: 20 73 70 61 63 65 20 2e 6e 69 63 6b 20 3b 0a 3a   space .nick ;.:
1e00: 20 2e 6b 65 79 2d 6c 69 73 74 20 28 20 6f 3a 6b   .key-list ( o:k
1e10: 65 79 20 2d 2d 20 6f 3a 6b 65 79 20 29 0a 20 20  ey -- o:key ).  
1e20: 20 20 6b 65 2d 6f 66 66 73 65 74 20 36 34 40 20    ke-offset 64@ 
1e30: 36 34 3e 64 20 6b 65 79 70 61 63 6b 2d 61 6c 6c  64>d keypack-all
1e40: 23 20 66 6d 2f 6d 6f 64 20 6e 69 70 20 32 20 2e  # fm/mod nip 2 .
1e50: 72 20 73 70 61 63 65 0a 20 20 20 20 2e 6b 65 79  r space.    .key
1e60: 2d 72 65 73 74 20 63 72 20 3b 0a 3a 20 2e 73 65  -rest cr ;.: .se
1e70: 63 72 65 74 2d 6e 69 63 6b 73 20 28 20 2d 2d 20  cret-nicks ( -- 
1e80: 29 0a 20 20 20 20 30 20 6b 65 79 2d 74 61 62 6c  ).    0 key-tabl
1e90: 65 20 5b 3a 20 63 65 6c 6c 2b 20 24 40 20 64 72  e [: cell+ $@ dr
1ea0: 6f 70 20 63 65 6c 6c 2b 20 3e 6f 20 6b 65 2d 73  op cell+ >o ke-s
1eb0: 6b 20 40 20 49 46 0a 09 20 20 64 75 70 20 32 20  k @ IF..  dup 2 
1ec0: 2e 72 20 73 70 61 63 65 20 2e 6b 65 79 2d 72 65  .r space .key-re
1ed0: 73 74 20 63 72 20 31 2b 0a 20 20 20 20 20 20 54  st cr 1+.      T
1ee0: 48 45 4e 20 6f 3e 20 3b 5d 20 23 6d 61 70 20 64  HEN o> ;] #map d
1ef0: 72 6f 70 20 3b 0a 3a 20 2e 6b 65 79 2d 69 6e 76  rop ;.: .key-inv
1f00: 69 74 65 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 6f  ite ( o:key -- o
1f10: 3a 6b 65 79 20 29 0a 20 20 20 20 6b 65 2d 70 6b  :key ).    ke-pk
1f20: 20 24 40 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e   $@ keysize umin
1f30: 0a 20 20 20 20 6b 65 2d 69 6d 70 6f 72 74 20 40  .    ke-import @
1f40: 20 3e 69 6d 2d 63 6f 6c 6f 72 20 38 35 74 79 70   >im-color 85typ
1f50: 65 20 3c 64 65 66 61 75 6c 74 3e 0a 20 20 20 20  e <default>.    
1f60: 73 70 61 63 65 20 2e 6e 69 63 6b 20 20 63 72 20  space .nick  cr 
1f70: 3b 0a 3a 20 2e 6b 65 79 2d 73 68 6f 72 74 20 28  ;.: .key-short (
1f80: 20 6f 3a 6b 65 79 20 2d 2d 20 6f 3a 6b 65 79 20   o:key -- o:key 
1f90: 29 0a 20 20 20 20 6b 65 2d 6e 69 63 6b 20 24 2e  ).    ke-nick $.
1fa0: 20 6b 65 2d 70 72 6f 66 20 24 40 6c 65 6e 20 49   ke-prof $@len I
1fb0: 46 20 2e 22 20 20 70 72 6f 66 69 6c 65 3a 20 22  F ."  profile: "
1fc0: 20 6b 65 2d 70 72 6f 66 20 24 40 20 38 35 74 79   ke-prof $@ 85ty
1fd0: 70 65 20 54 48 45 4e 20 3b 0a 0a 3a 20 64 75 6d  pe THEN ;..: dum
1fe0: 70 6b 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d  pkey ( addr u --
1ff0: 20 29 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e 6f   ) drop cell+ >o
2000: 0a 20 20 20 20 2e 5c 22 20 78 5c 22 20 22 20 6b  .    .\" x\" " k
2010: 65 2d 70 6b 20 24 40 20 38 35 74 79 70 65 20 2e  e-pk $@ 85type .
2020: 5c 22 20 5c 22 20 6b 65 79 3f 6e 65 77 22 20 63  \" \" key?new" c
2030: 72 0a 20 20 20 20 6b 65 2d 73 6b 20 40 20 49 46  r.    ke-sk @ IF
2040: 20 20 2e 5c 22 20 78 5c 22 20 22 20 6b 65 2d 73    .\" x\" " ke-s
2050: 6b 20 40 20 6b 65 79 73 69 7a 65 20 38 35 74 79  k @ keysize 85ty
2060: 70 65 20 2e 5c 22 20 5c 22 20 6b 65 2d 73 6b 20  pe .\" \" ke-sk 
2070: 73 65 63 21 20 2b 73 65 63 6b 65 79 22 20 63 72  sec! +seckey" cr
2080: 20 20 54 48 45 4e 0a 20 20 20 20 27 22 27 20 65    THEN.    '"' e
2090: 6d 69 74 20 2e 6e 69 63 6b 20 2e 5c 22 20 5c 22  mit .nick .\" \"
20a0: 20 6b 65 2d 6e 69 63 6b 20 24 21 20 22 0a 20 20   ke-nick $! ".  
20b0: 20 20 6b 65 2d 73 65 6c 66 73 69 67 20 24 40 20    ke-selfsig $@ 
20c0: 64 72 6f 70 20 36 34 40 20 36 34 3e 64 20 5b 3a  drop 64@ 64>d [:
20d0: 20 27 24 27 20 65 6d 69 74 20 30 20 75 64 2e 72   '$' emit 0 ud.r
20e0: 20 3b 5d 20 24 31 30 20 62 61 73 65 2d 65 78 65   ;] $10 base-exe
20f0: 63 75 74 65 0a 20 20 20 20 2e 22 20 2e 20 64 3e  cute.    ." . d>
2100: 36 34 20 6b 65 2d 66 69 72 73 74 21 20 22 20 6b  64 ke-first! " k
2110: 65 2d 74 79 70 65 20 40 20 2e 20 2e 22 20 6b 65  e-type @ . ." ke
2120: 2d 74 79 70 65 20 21 22 20 20 63 72 20 6f 3e 20  -type !"  cr o> 
2130: 3b 0a 0a 3a 20 2e 6b 65 79 73 20 28 20 2d 2d 20  ;..: .keys ( -- 
2140: 29 20 6b 65 79 2d 74 61 62 6c 65 20 5b 3a 20 63  ) key-table [: c
2150: 65 6c 6c 2b 20 24 40 20 2e 6b 65 79 20 3b 5d 20  ell+ $@ .key ;] 
2160: 23 6d 61 70 20 3b 0a 3a 20 64 75 6d 70 6b 65 79  #map ;.: dumpkey
2170: 73 20 28 20 2d 2d 20 29 20 6b 65 79 2d 74 61 62  s ( -- ) key-tab
2180: 6c 65 20 5b 3a 20 63 65 6c 6c 2b 20 24 40 20 64  le [: cell+ $@ d
2190: 75 6d 70 6b 65 79 20 3b 5d 20 23 6d 61 70 20 3b  umpkey ;] #map ;
21a0: 0a 0a 3a 20 6b 65 79 3e 6e 69 63 6b 20 28 20 61  ..: key>nick ( a
21b0: 64 64 72 6b 65 79 20 75 31 20 2d 2d 20 6e 69 63  ddrkey u1 -- nic
21c0: 6b 20 75 32 20 29 0a 20 20 20 20 6b 65 79 2d 74  k u2 ).    key-t
21d0: 61 62 6c 65 20 23 40 20 30 3d 20 49 46 20 20 64  able #@ 0= IF  d
21e0: 72 6f 70 20 22 22 20 20 45 58 49 54 20 20 54 48  rop ""  EXIT  TH
21f0: 45 4e 0a 20 20 20 20 63 65 6c 6c 2b 20 2e 6b 65  EN.    cell+ .ke
2200: 2d 6e 69 63 6b 20 24 40 20 3b 0a 0a 3a 20 2e 6b  -nick $@ ;..: .k
2210: 65 79 23 20 28 20 61 64 64 72 20 75 20 2d 2d 20  ey# ( addr u -- 
2220: 29 20 6b 65 79 7c 0a 20 20 20 20 2e 22 20 4b 65  ) key|.    ." Ke
2230: 79 20 27 22 20 6b 65 79 2d 74 61 62 6c 65 20 23  y '" key-table #
2240: 40 20 30 3d 20 49 46 20 64 72 6f 70 20 45 58 49  @ 0= IF drop EXI
2250: 54 20 54 48 45 4e 0a 20 20 20 20 63 65 6c 6c 2b  T THEN.    cell+
2260: 20 2e 2e 6e 69 63 6b 20 2e 22 20 27 20 6f 6b 22   ..nick ." ' ok"
2270: 20 63 72 20 3b 0a 0a 44 65 66 65 72 20 64 68 74   cr ;..Defer dht
2280: 2d 6e 69 63 6b 3f 0a 65 76 65 6e 74 3a 20 2d 3e  -nick?.event: ->
2290: 73 65 61 72 63 68 2d 6b 65 79 20 20 6b 65 79 7c  search-key  key|
22a0: 20 6f 76 65 72 20 3e 72 20 64 68 74 2d 6e 69 63   over >r dht-nic
22b0: 6b 3f 20 72 3e 20 66 72 65 65 20 74 68 72 6f 77  k? r> free throw
22c0: 20 3b 0a 0a 3a 20 2e 75 6e 6b 65 79 2d 69 64 20   ;..: .unkey-id 
22d0: 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 3c 65  ( addr u -- ) <e
22e0: 72 72 3e 20 38 20 75 6d 69 6e 20 38 35 74 79 70  rr> 8 umin 85typ
22f0: 65 20 2e 22 20 28 75 6e 6b 6e 6f 77 6e 29 22 20  e ." (unknown)" 
2300: 3c 64 65 66 61 75 6c 74 3e 20 3b 0a 0a 3a 20 2e  <default> ;..: .
2310: 6b 65 79 2d 69 64 20 28 20 61 64 64 72 20 75 20  key-id ( addr u 
2320: 2d 2d 20 29 20 6b 65 79 7c 20 32 64 75 70 20 6b  -- ) key| 2dup k
2330: 65 79 2d 74 61 62 6c 65 20 23 40 20 30 3d 0a 20  ey-table #@ 0=. 
2340: 20 20 20 49 46 20 20 64 72 6f 70 20 75 70 40 20     IF  drop up@ 
2350: 72 65 63 65 69 76 65 72 2d 74 61 73 6b 20 3d 20  receiver-task = 
2360: 49 46 0a 09 20 20 20 20 3c 65 76 65 6e 74 20 32  IF..    <event 2
2370: 64 75 70 20 73 61 76 65 2d 6d 65 6d 20 65 24 2c  dup save-mem e$,
2380: 20 2d 3e 73 65 61 72 63 68 2d 6b 65 79 20 5b 20   ->search-key [ 
2390: 75 70 40 20 5d 6c 20 65 76 65 6e 74 3e 0a 09 20  up@ ]l event>.. 
23a0: 20 20 20 2e 75 6e 6b 65 79 2d 69 64 20 45 58 49     .unkey-id EXI
23b0: 54 20 20 54 48 45 4e 0a 09 32 64 75 70 20 5b 27  T  THEN..2dup ['
23c0: 5d 20 64 68 74 2d 6e 69 63 6b 3f 20 63 6d 64 2d  ] dht-nick? cmd-
23d0: 6e 65 73 74 0a 09 32 64 75 70 20 6b 65 79 2d 74  nest..2dup key-t
23e0: 61 62 6c 65 20 23 40 20 30 3d 20 49 46 20 20 64  able #@ 0= IF  d
23f0: 72 6f 70 20 2e 75 6e 6b 65 79 2d 69 64 20 45 58  rop .unkey-id EX
2400: 49 54 20 20 54 48 45 4e 20 20 54 48 45 4e 0a 20  IT  THEN  THEN. 
2410: 20 20 20 63 65 6c 6c 2b 20 2e 2e 6e 69 63 6b 20     cell+ ..nick 
2420: 32 64 72 6f 70 20 3b 0a 0a 3a 20 2e 73 69 6d 70  2drop ;..: .simp
2430: 6c 65 2d 69 64 20 28 20 61 64 64 72 20 75 20 2d  le-id ( addr u -
2440: 2d 20 29 20 6b 65 79 7c 20 6b 65 79 3e 6e 69 63  - ) key| key>nic
2450: 6b 20 74 79 70 65 20 3b 0a 0a 3a 6e 6f 6e 61 6d  k type ;..:nonam
2460: 65 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a  e ( addr u -- ).
2470: 20 20 20 20 6f 20 49 46 20 20 70 75 62 6b 65 79      o IF  pubkey
2480: 20 40 20 49 46 0a 09 20 20 20 20 32 64 75 70 20   @ IF..    2dup 
2490: 70 75 62 6b 65 79 20 24 40 20 6b 65 79 7c 20 73  pubkey $@ key| s
24a0: 74 72 3d 20 30 3d 20 49 46 0a 09 09 5b 3a 20 2e  tr= 0= IF...[: .
24b0: 22 20 77 61 6e 74 3a 20 22 20 70 75 62 6b 65 79  " want: " pubkey
24c0: 20 24 40 20 6b 65 79 7c 20 38 35 74 79 70 65 20   $@ key| 85type 
24d0: 63 72 0a 09 09 20 20 2e 22 20 67 6f 74 20 3a 20  cr...  ." got : 
24e0: 22 20 32 64 75 70 20 38 35 74 79 70 65 20 63 72  " 2dup 85type cr
24f0: 20 3b 5d 20 24 65 72 72 0a 09 09 74 72 75 65 20   ;] $err...true 
2500: 21 21 77 72 6f 6e 67 2d 6b 65 79 21 21 0a 09 20  !!wrong-key!!.. 
2510: 20 20 20 54 48 45 4e 0a 09 20 20 20 20 63 6f 6e     THEN..    con
2520: 6e 65 63 74 28 20 2e 6b 65 79 23 20 29 65 6c 73  nect( .key# )els
2530: 65 28 20 32 64 72 6f 70 20 29 20 20 45 58 49 54  e( 2drop )  EXIT
2540: 0a 09 54 48 45 4e 20 20 54 48 45 4e 0a 20 20 20  ..THEN  THEN.   
2550: 20 32 64 75 70 20 6b 65 79 2d 65 78 69 73 74 3f   2dup key-exist?
2560: 20 30 3d 20 49 46 0a 09 73 74 72 69 63 74 2d 6b   0= IF..strict-k
2570: 65 79 73 20 40 20 21 21 75 6e 6b 6e 6f 77 6e 2d  eys @ !!unknown-
2580: 6b 65 79 21 21 0a 09 2e 22 20 55 6e 6b 6e 6f 77  key!!..." Unknow
2590: 6e 20 6b 65 79 20 22 20 38 35 74 79 70 65 20 63  n key " 85type c
25a0: 72 0a 20 20 20 20 45 4c 53 45 0a 09 63 6f 6e 6e  r.    ELSE..conn
25b0: 65 63 74 28 20 2e 6b 65 79 23 20 29 65 6c 73 65  ect( .key# )else
25c0: 28 20 32 64 72 6f 70 20 29 0a 20 20 20 20 54 48  ( 2drop ).    TH
25d0: 45 4e 20 3b 20 49 53 20 63 68 65 63 6b 2d 6b 65  EN ; IS check-ke
25e0: 79 0a 0a 3a 6e 6f 6e 61 6d 65 20 28 20 70 6b 63  y..:noname ( pkc
25f0: 20 2d 2d 20 73 6b 63 20 29 0a 20 20 20 20 6b 65   -- skc ).    ke
2600: 79 73 69 7a 65 20 6b 65 79 2d 74 61 62 6c 65 20  ysize key-table 
2610: 23 40 20 30 3d 20 21 21 75 6e 6b 6e 6f 77 6e 2d  #@ 0= !!unknown-
2620: 6b 65 79 21 21 0a 20 20 20 20 63 65 6c 6c 2b 20  key!!.    cell+ 
2630: 2e 6b 65 2d 73 6b 20 73 65 63 40 20 30 3d 20 21  .ke-sk sec@ 0= !
2640: 21 75 6e 6b 6e 6f 77 6e 2d 6b 65 79 21 21 20 3b  !unknown-key!! ;
2650: 20 69 73 20 73 65 61 72 63 68 2d 6b 65 79 0a 0a   is search-key..
2660: 5c 20 67 65 74 20 70 61 73 73 70 68 72 61 73 65  \ get passphrase
2670: 0a 0a 33 20 56 61 6c 75 65 20 70 61 73 73 70 68  ..3 Value passph
2680: 72 61 73 65 2d 72 65 74 72 79 23 0a 24 31 30 30  rase-retry#.$100
2690: 20 43 6f 6e 73 74 61 6e 74 20 6d 61 78 2d 70 61   Constant max-pa
26a0: 73 73 70 68 72 61 73 65 23 20 5c 20 32 35 36 20  ssphrase# \ 256 
26b0: 63 68 61 72 61 63 74 65 72 73 20 73 68 6f 75 6c  characters shoul
26c0: 64 20 62 65 20 65 6e 6f 75 67 68 2e 2e 2e 0a 6d  d be enough....m
26d0: 61 78 2d 70 61 73 73 70 68 72 61 73 65 23 20 62  ax-passphrase# b
26e0: 75 66 66 65 72 3a 20 70 61 73 73 70 68 72 61 73  uffer: passphras
26f0: 65 0a 0a 3a 20 70 61 73 73 70 68 72 61 73 65 2d  e..: passphrase-
2700: 69 6e 20 28 20 2d 2d 20 61 64 64 72 20 75 20 29  in ( -- addr u )
2710: 0a 20 20 20 20 70 61 73 73 70 68 72 61 73 65 20  .    passphrase 
2720: 64 75 70 20 6d 61 78 2d 70 61 73 73 70 68 72 61  dup max-passphra
2730: 73 65 23 20 61 63 63 65 70 74 2a 20 3b 0a 0a 3a  se# accept* ;..:
2740: 20 3e 70 61 73 73 70 68 72 61 73 65 20 28 20 61   >passphrase ( a
2750: 64 64 72 20 75 20 2d 2d 20 61 64 64 72 20 75 20  ddr u -- addr u 
2760: 29 0a 20 20 20 20 5c 47 20 63 72 65 61 74 65 20  ).    \G create 
2770: 61 20 35 31 32 20 62 69 74 20 68 61 73 68 20 6f  a 512 bit hash o
2780: 66 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  f the passphrase
2790: 0a 20 20 20 20 6e 6f 2d 6b 65 79 20 3e 63 3a 6b  .    no-key >c:k
27a0: 65 79 20 63 3a 68 61 73 68 0a 20 20 20 20 6b 65  ey c:hash.    ke
27b0: 63 63 61 6b 2d 70 61 64 64 65 64 20 63 3a 6b 65  ccak-padded c:ke
27c0: 79 3e 20 6b 65 63 63 61 6b 2d 70 61 64 64 65 64  y> keccak-padded
27d0: 20 6b 65 63 63 61 6b 23 6d 61 78 20 32 2f 20 3b   keccak#max 2/ ;
27e0: 0a 0a 3a 20 67 65 74 2d 70 61 73 73 70 68 72 61  ..: get-passphra
27f0: 73 65 20 28 20 2d 2d 20 61 64 64 72 20 75 20 29  se ( -- addr u )
2800: 0a 20 20 20 20 70 61 73 73 70 68 72 61 73 65 2d  .    passphrase-
2810: 69 6e 20 3e 70 61 73 73 70 68 72 61 73 65 20 3b  in >passphrase ;
2820: 0a 0a 56 61 72 69 61 62 6c 65 20 6b 65 79 73 0a  ..Variable keys.
2830: 0a 3a 20 6c 61 73 74 6b 65 79 40 20 28 20 2d 2d  .: lastkey@ ( --
2840: 20 61 64 64 72 20 75 20 29 20 6b 65 79 73 20 24   addr u ) keys $
2850: 5b 5d 23 20 31 2d 20 6b 65 79 73 20 73 65 63 5b  []# 1- keys sec[
2860: 5d 40 20 3b 0a 3a 20 6b 65 79 3e 64 65 66 61 75  ]@ ;.: key>defau
2870: 6c 74 20 28 20 2d 2d 20 29 20 6c 61 73 74 6b 65  lt ( -- ) lastke
2880: 79 40 20 64 72 6f 70 20 3e 73 74 6f 72 65 6b 65  y@ drop >storeke
2890: 79 20 21 20 3b 0a 3a 20 2b 6b 65 79 20 28 20 61  y ! ;.: +key ( a
28a0: 64 64 72 20 75 20 2d 2d 20 29 20 6b 65 79 73 20  ddr u -- ) keys 
28b0: 73 65 63 2b 5b 5d 21 20 3b 0a 3a 20 2b 70 61 73  sec+[]! ;.: +pas
28c0: 73 70 68 72 61 73 65 20 28 20 2d 2d 20 29 20 20  sphrase ( -- )  
28d0: 67 65 74 2d 70 61 73 73 70 68 72 61 73 65 20 2b  get-passphrase +
28e0: 6b 65 79 20 3b 0a 3a 20 2b 63 68 65 63 6b 70 68  key ;.: +checkph
28f0: 72 61 73 65 20 28 20 2d 2d 20 66 6c 61 67 20 29  rase ( -- flag )
2900: 20 67 65 74 2d 70 61 73 73 70 68 72 61 73 65 20   get-passphrase 
2910: 6b 65 79 73 20 24 5b 5d 23 20 31 2d 20 6b 65 79  keys $[]# 1- key
2920: 73 20 73 65 63 5b 5d 40 20 73 74 72 3d 20 3b 0a  s sec[]@ str= ;.
2930: 3a 20 2b 6e 65 77 70 68 72 61 73 65 20 28 20 2d  : +newphrase ( -
2940: 2d 20 29 0a 20 20 20 20 42 45 47 49 4e 0a 09 2e  - ).    BEGIN...
2950: 22 20 50 61 73 73 70 68 72 61 73 65 3a 20 22 20  " Passphrase: " 
2960: 2b 70 61 73 73 70 68 72 61 73 65 20 63 72 0a 09  +passphrase cr..
2970: 2e 22 20 52 65 74 79 70 65 20 70 6c 73 3a 20 22  ." Retype pls: "
2980: 20 2b 63 68 65 63 6b 70 68 72 61 73 65 20 30 3d   +checkphrase 0=
2990: 20 57 48 49 4c 45 0a 09 20 20 20 20 2e 22 20 20   WHILE..    ."  
29a0: 64 69 64 6e 27 74 20 6d 61 74 63 68 2c 20 74 72  didn't match, tr
29b0: 79 20 61 67 61 69 6e 20 70 6c 65 61 73 65 22 20  y again please" 
29c0: 63 72 0a 20 20 20 20 52 45 50 45 41 54 20 63 72  cr.    REPEAT cr
29d0: 20 3b 0a 0a 3a 20 22 3e 70 61 73 73 70 68 72 61   ;..: ">passphra
29e0: 73 65 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29  se ( addr u -- )
29f0: 20 3e 70 61 73 73 70 68 72 61 73 65 20 2b 6b 65   >passphrase +ke
2a00: 79 20 3b 0a 3a 20 2b 73 65 63 6b 65 79 20 28 20  y ;.: +seckey ( 
2a10: 2d 2d 20 29 0a 20 20 20 20 6b 65 2d 73 6b 20 40  -- ).    ke-sk @
2a20: 20 6b 65 2d 70 6b 20 24 40 20 64 72 6f 70 20 6b   ke-pk $@ drop k
2a30: 65 79 70 61 64 20 65 64 2d 64 68 20 2b 6b 65 79  eypad ed-dh +key
2a40: 20 3b 0a 0a 22 22 20 22 3e 70 61 73 73 70 68 72   ;.."" ">passphr
2a50: 61 73 65 20 5c 20 66 6f 6c 6c 6f 77 69 6e 67 20  ase \ following 
2a60: 74 68 65 20 65 6e 63 72 79 70 74 2d 65 76 65 72  the encrypt-ever
2a70: 79 74 68 69 6e 67 20 70 61 72 61 64 69 67 6d 2c  ything paradigm,
2a80: 0a 5c 20 6e 6f 20 70 61 73 73 77 6f 72 64 20 69  .\ no password i
2a90: 73 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69  s the empty stri
2aa0: 6e 67 21 20 20 49 74 27 73 20 73 74 69 6c 6c 20  ng!  It's still 
2ab0: 65 6e 63 72 79 70 74 65 64 20 3b 2d 29 21 0a 0a  encrypted ;-)!..
2ac0: 5c 20 61 20 73 65 63 72 65 74 20 6b 65 79 20 6a  \ a secret key j
2ad0: 75 73 74 20 6e 65 65 64 73 20 61 20 6e 69 63 6b  ust needs a nick
2ae0: 20 61 6e 64 20 61 20 74 79 70 65 2e 0a 5c 20 53   and a type..\ S
2af0: 65 63 72 65 74 20 6b 65 79 73 20 63 61 6e 20 62  ecret keys can b
2b00: 65 20 70 65 72 73 6f 6e 73 20 61 6e 64 20 67 72  e persons and gr
2b10: 6f 75 70 73 2e 0a 0a 5c 20 61 20 70 75 62 6c 69  oups...\ a publi
2b20: 63 20 6b 65 79 20 6e 65 65 64 73 20 6d 6f 72 65  c key needs more
2b30: 3a 20 6e 69 63 6b 2c 20 74 79 70 65 2c 20 70 72  : nick, type, pr
2b40: 6f 66 69 6c 65 2e 0a 5c 20 54 68 65 20 70 72 6f  ofile..\ The pro
2b50: 66 69 6c 65 20 69 73 20 61 20 73 74 72 75 63 74  file is a struct
2b60: 75 72 65 64 20 64 6f 63 75 6d 65 6e 74 2c 20 69  ured document, i
2b70: 2e 65 2e 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  .e. pointed to b
2b80: 79 20 61 20 68 61 73 68 2e 0a 0a 5c 20 61 20 73  y a hash...\ a s
2b90: 69 67 6e 61 74 75 72 65 20 63 6f 6e 74 61 69 6e  ignature contain
2ba0: 73 20 61 20 70 75 62 6b 65 79 2c 20 61 20 63 68  s a pubkey, a ch
2bb0: 65 63 6b 62 6f 78 20 62 69 74 6d 61 73 6b 2c 0a  eckbox bitmask,.
2bc0: 5c 20 61 20 64 61 74 65 2c 20 61 6e 20 65 78 70  \ a date, an exp
2bd0: 69 72 61 74 69 6f 6e 20 64 61 74 65 2c 20 74 68  iration date, th
2be0: 65 20 73 69 67 6e 65 72 27 73 20 70 75 62 6b 65  e signer's pubke
2bf0: 79 20 61 6e 64 20 74 68 65 20 73 69 67 6e 61 74  y and the signat
2c00: 75 72 65 20 69 74 73 65 6c 66 0a 5c 20 28 72 2b  ure itself.\ (r+
2c10: 73 29 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e  s).  There is an
2c20: 20 6f 70 74 69 6f 6e 61 6c 20 73 69 67 6e 69 6e   optional signin
2c30: 67 20 70 72 6f 74 6f 63 6f 6c 20 64 6f 63 75 6d  g protocol docum
2c40: 65 6e 74 20 28 68 61 73 68 29 2e 0a 0a 5c 20 77  ent (hash)...\ w
2c50: 65 20 73 74 6f 72 65 20 65 61 63 68 20 69 74 65  e store each ite
2c60: 6d 20 69 6e 20 61 20 32 35 36 20 62 79 74 65 73  m in a 256 bytes
2c70: 20 65 6e 63 72 79 70 74 65 64 20 73 74 72 69 6e   encrypted strin
2c80: 67 2c 20 69 2e 65 2e 20 77 69 74 68 20 61 20 31  g, i.e. with a 1
2c90: 36 0a 5c 20 62 79 74 65 20 73 61 6c 74 20 61 6e  6.\ byte salt an
2ca0: 64 20 61 20 31 36 20 62 79 74 65 20 63 68 65 63  d a 16 byte chec
2cb0: 6b 73 75 6d 2e 0a 0a 3a 20 6b 65 2d 6c 61 73 74  ksum...: ke-last
2cc0: 21 20 28 20 36 34 64 61 74 65 20 2d 2d 20 29 0a  ! ( 64date -- ).
2cd0: 20 20 20 20 6b 65 2d 73 65 6c 66 73 69 67 20 24      ke-selfsig $
2ce0: 40 6c 65 6e 20 24 31 30 20 75 6d 61 78 20 6b 65  @len $10 umax ke
2cf0: 2d 73 65 6c 66 73 69 67 20 24 21 6c 65 6e 0a 20  -selfsig $!len. 
2d00: 20 20 20 6b 65 2d 73 65 6c 66 73 69 67 20 24 40     ke-selfsig $@
2d10: 20 64 72 6f 70 20 36 34 27 2b 20 36 34 21 20 3b   drop 64'+ 64! ;
2d20: 0a 3a 20 6b 65 2d 66 69 72 73 74 21 20 28 20 36  .: ke-first! ( 6
2d30: 34 64 61 74 65 20 2d 2d 20 29 20 36 34 23 2d 31  4date -- ) 64#-1
2d40: 20 6b 65 2d 6c 61 73 74 21 0a 20 20 20 20 6b 65   ke-last!.    ke
2d50: 2d 73 65 6c 66 73 69 67 20 24 40 20 64 72 6f 70  -selfsig $@ drop
2d60: 20 36 34 21 20 3b 0a 0a 73 63 6f 70 65 7b 20 6e   64! ;..scope{ n
2d70: 65 74 32 6f 2d 62 61 73 65 0a 0a 63 6d 64 2d 74  et2o-base..cmd-t
2d80: 61 62 6c 65 20 24 40 20 69 6e 68 65 72 69 74 2d  able $@ inherit-
2d90: 74 61 62 6c 65 20 6b 65 79 2d 65 6e 74 72 79 2d  table key-entry-
2da0: 74 61 62 6c 65 0a 5c 67 20 0a 5c 67 20 23 23 23  table.\g .\g ###
2db0: 20 6b 65 79 20 73 74 6f 72 61 67 65 20 63 6f 6d   key storage com
2dc0: 6d 61 6e 64 73 20 23 23 23 0a 5c 67 20 0a 24 31  mands ###.\g .$1
2dd0: 31 20 6e 65 74 32 6f 3a 20 70 72 69 76 6b 65 79  1 net2o: privkey
2de0: 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29   ( $:string -- )
2df0: 0a 20 20 20 20 5c 67 20 70 72 69 76 61 74 65 20  .    \g private 
2e00: 6b 65 79 0a 20 20 20 20 5c 20 64 6f 65 73 20 6e  key.    \ does n
2e10: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 69  ot need to be si
2e20: 67 6e 65 64 2c 20 74 68 65 20 73 65 63 72 65 74  gned, the secret
2e30: 20 6b 65 79 20 76 65 72 69 66 69 65 73 20 69 74   key verifies it
2e40: 73 65 6c 66 0a 20 20 20 20 24 3e 20 6f 76 65 72  self.    $> over
2e50: 20 6b 65 79 70 61 64 20 73 6b 3e 70 6b 20 5c 20   keypad sk>pk \ 
2e60: 67 65 6e 65 72 61 74 65 20 70 75 62 6b 65 79 0a  generate pubkey.
2e70: 20 20 20 20 6b 65 79 70 61 64 20 6b 65 2d 70 6b      keypad ke-pk
2e80: 20 24 40 20 64 72 6f 70 20 6b 65 79 73 69 7a 65   $@ drop keysize
2e90: 20 74 75 63 6b 20 73 74 72 3d 20 30 3d 20 21 21   tuck str= 0= !!
2ea0: 77 72 6f 6e 67 2d 6b 65 79 21 21 0a 20 20 20 20  wrong-key!!.    
2eb0: 6b 65 2d 73 6b 20 73 65 63 21 20 2b 73 65 63 6b  ke-sk sec! +seck
2ec0: 65 79 20 3b 0a 2b 6e 65 74 32 6f 3a 20 6b 65 79  ey ;.+net2o: key
2ed0: 74 79 70 65 20 28 20 6e 20 2d 2d 20 29 20 20 20  type ( n -- )   
2ee0: 20 20 20 20 20 20 20 20 21 21 73 69 67 6e 65 64          !!signed
2ef0: 3f 20 20 20 31 20 21 21 3e 6f 72 64 65 72 3f 20  ?   1 !!>order? 
2f00: 36 34 3e 6e 20 6b 65 2d 74 79 70 65 20 21 20 3b  64>n ke-type ! ;
2f10: 0a 5c 67 20 6b 65 79 20 74 79 70 65 20 28 30 3a  .\g key type (0:
2f20: 20 61 6e 6f 6e 2c 20 31 3a 20 75 73 65 72 2c 20   anon, 1: user, 
2f30: 32 3a 20 67 72 6f 75 70 29 0a 2b 6e 65 74 32 6f  2: group).+net2o
2f40: 3a 20 6b 65 79 6e 69 63 6b 20 28 20 24 3a 73 74  : keynick ( $:st
2f50: 72 69 6e 67 20 2d 2d 20 29 20 20 20 20 21 21 73  ring -- )    !!s
2f60: 69 67 6e 65 64 3f 20 20 20 32 20 21 21 3e 6f 72  igned?   2 !!>or
2f70: 64 65 72 3f 20 24 3e 20 6b 65 2d 6e 69 63 6b 20  der? $> ke-nick 
2f80: 24 21 0a 20 20 20 20 6e 69 63 6b 21 20 3b 0a 5c  $!.    nick! ;.\
2f90: 67 20 6b 65 79 20 6e 69 63 6b 0a 2b 6e 65 74 32  g key nick.+net2
2fa0: 6f 3a 20 6b 65 79 70 72 6f 66 69 6c 65 20 28 20  o: keyprofile ( 
2fb0: 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 20 21 21  $:string -- ) !!
2fc0: 73 69 67 6e 65 64 3f 20 20 20 34 20 21 21 3e 6f  signed?   4 !!>o
2fd0: 72 64 65 72 3f 20 24 3e 20 6b 65 2d 70 72 6f 66  rder? $> ke-prof
2fe0: 20 24 21 20 3b 0a 5c 67 20 6b 65 79 20 70 72 6f   $! ;.\g key pro
2ff0: 66 69 6c 65 20 28 68 61 73 68 20 6f 66 20 61 20  file (hash of a 
3000: 72 65 73 6f 75 72 63 65 29 0a 2b 6e 65 74 32 6f  resource).+net2o
3010: 3a 20 6b 65 79 6d 61 73 6b 20 28 20 78 20 2d 2d  : keymask ( x --
3020: 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
3030: 20 20 20 20 20 20 20 20 20 38 20 21 21 3e 6f 72           8 !!>or
3040: 64 65 72 3f 20 6b 65 2d 6d 61 73 6b 20 36 34 21  der? ke-mask 64!
3050: 20 3b 0a 5c 67 20 6b 65 79 20 61 63 63 65 73 73   ;.\g key access
3060: 20 72 69 67 68 74 20 6d 61 73 6b 0a 2b 6e 65 74   right mask.+net
3070: 32 6f 3a 20 6b 65 79 70 73 6b 20 28 20 24 3a 73  2o: keypsk ( $:s
3080: 74 72 69 6e 67 20 2d 2d 20 29 20 20 20 20 20 21  tring -- )     !
3090: 21 73 69 67 6e 65 64 3f 20 24 31 30 20 21 21 3e  !signed? $10 !!>
30a0: 6f 72 64 65 72 3f 20 24 3e 20 6b 65 2d 70 73 6b  order? $> ke-psk
30b0: 20 73 65 63 21 20 3b 0a 5c 67 20 70 72 65 73 68   sec! ;.\g presh
30c0: 61 72 65 64 20 6b 65 79 2c 20 75 73 65 64 20 66  ared key, used f
30d0: 6f 72 20 44 48 54 20 65 6e 63 72 79 70 74 69 6f  or DHT encryptio
30e0: 6e 0a 2b 6e 65 74 32 6f 3a 20 2b 6b 65 79 73 69  n.+net2o: +keysi
30f0: 67 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20  g ( $:string -- 
3100: 29 20 20 24 32 30 20 21 21 3e 3d 6f 72 64 65 72  )  $20 !!>=order
3110: 3f 20 24 3e 20 6b 65 2d 73 69 67 73 20 24 2b 5b  ? $> ke-sigs $+[
3120: 5d 21 20 3b 0a 5c 67 20 61 64 64 20 61 20 6b 65  ]! ;.\g add a ke
3130: 79 20 73 69 67 6e 61 74 75 72 65 0a 2b 6e 65 74  y signature.+net
3140: 32 6f 3a 20 6b 65 79 69 6d 70 6f 72 74 20 28 20  2o: keyimport ( 
3150: 6e 20 2d 2d 20 29 0a 20 20 20 20 70 77 2d 6c 65  n -- ).    pw-le
3160: 76 65 6c 23 20 30 3c 20 49 46 20 20 36 34 3e 6e  vel# 0< IF  64>n
3170: 20 69 6d 70 6f 72 74 23 75 6e 74 72 75 73 74 65   import#untruste
3180: 64 20 75 6d 69 6e 20 6b 65 2d 69 6d 70 6f 72 74  d umin ke-import
3190: 20 21 0a 20 20 20 20 45 4c 53 45 20 20 36 34 64   !.    ELSE  64d
31a0: 72 6f 70 20 20 54 48 45 4e 20 3b 0a 7d 73 63 6f  rop  THEN ;.}sco
31b0: 70 65 0a 0a 67 65 6e 2d 74 61 62 6c 65 20 24 66  pe..gen-table $f
31c0: 72 65 65 7a 65 0a 27 20 63 6f 6e 74 65 78 74 2d  reeze.' context-
31d0: 74 61 62 6c 65 20 69 73 20 67 65 6e 2d 74 61 62  table is gen-tab
31e0: 6c 65 0a 0a 3a 20 6b 65 79 3a 6e 65 73 74 2d 73  le..: key:nest-s
31f0: 69 67 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61  ig ( addr u -- a
3200: 64 64 72 20 75 27 20 66 6c 61 67 20 29 0a 20 20  ddr u' flag ).  
3210: 20 20 70 6b 32 2d 73 69 67 3f 20 64 75 70 20 3f    pk2-sig? dup ?
3220: 45 58 49 54 20 64 72 6f 70 0a 20 20 20 20 32 64  EXIT drop.    2d
3230: 75 70 20 2b 20 73 69 67 73 69 7a 65 23 20 2d 20  up + sigsize# - 
3240: 73 69 67 73 69 7a 65 23 20 3e 24 0a 20 20 20 20  sigsize# >$.    
3250: 73 69 67 70 6b 32 73 69 7a 65 23 20 2d 20 32 64  sigpk2size# - 2d
3260: 75 70 20 2b 20 6b 65 79 73 69 7a 65 32 20 6b 65  up + keysize2 ke
3270: 79 3f 6e 65 77 20 6e 3a 3e 6f 20 24 3e 20 6b 65  y?new n:>o $> ke
3280: 2d 73 65 6c 66 73 69 67 20 24 21 0a 20 20 20 20  -selfsig $!.    
3290: 73 69 6d 2d 6e 69 63 6b 21 20 6f 66 66 20 63 2d  sim-nick! off c-
32a0: 73 74 61 74 65 20 6f 66 66 20 73 69 67 2d 6f 6b  state off sig-ok
32b0: 20 3b 0a 27 20 6b 65 79 3a 6e 65 73 74 2d 73 69   ;.' key:nest-si
32c0: 67 20 6b 65 79 2d 65 6e 74 72 79 20 74 6f 20 6e  g key-entry to n
32d0: 65 73 74 2d 73 69 67 0a 0a 6b 65 79 2d 65 6e 74  est-sig..key-ent
32e0: 72 79 20 27 20 6e 65 77 20 73 74 61 74 69 63 2d  ry ' new static-
32f0: 61 20 77 69 74 68 2d 61 6c 6c 6f 63 61 74 65 72  a with-allocater
3300: 20 74 6f 20 73 61 6d 70 6c 65 2d 6b 65 79 0a 73   to sample-key.s
3310: 61 6d 70 6c 65 2d 6b 65 79 20 3e 6f 20 6b 65 79  ample-key >o key
3320: 2d 65 6e 74 72 79 2d 74 61 62 6c 65 20 40 20 74  -entry-table @ t
3330: 6f 6b 65 6e 2d 74 61 62 6c 65 20 21 20 6f 3e 0a  oken-table ! o>.
3340: 0a 3a 20 6b 65 79 3a 63 6f 64 65 20 28 20 2d 2d  .: key:code ( --
3350: 20 29 0a 20 20 20 20 63 6f 64 65 2d 6b 65 79 20   ).    code-key 
3360: 20 63 6d 64 6c 6f 63 6b 20 6c 6f 63 6b 0a 20 20   cmdlock lock.  
3370: 20 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63    keypack keypac
3380: 6b 2d 61 6c 6c 23 20 65 72 61 73 65 0a 20 20 20  k-all# erase.   
3390: 20 63 6d 64 72 65 73 65 74 20 61 6c 73 6f 20 6e   cmdreset also n
33a0: 65 74 32 6f 2d 62 61 73 65 20 3b 0a 63 6f 6d 70  et2o-base ;.comp
33b0: 3a 20 3a 2c 20 61 6c 73 6f 20 6e 65 74 32 6f 2d  : :, also net2o-
33c0: 62 61 73 65 20 3b 0a 0a 73 63 6f 70 65 7b 20 6e  base ;..scope{ n
33d0: 65 74 32 6f 2d 62 61 73 65 0a 0a 3a 20 65 6e 64  et2o-base..: end
33e0: 3a 6b 65 79 20 28 20 2d 2d 20 29 0a 20 20 20 20  :key ( -- ).    
33f0: 65 6e 64 77 69 74 68 20 70 72 65 76 69 6f 75 73  endwith previous
3400: 20 63 6d 64 6c 6f 63 6b 20 75 6e 6c 6f 63 6b 20   cmdlock unlock 
3410: 3b 0a 63 6f 6d 70 3a 20 3a 2c 20 70 72 65 76 69  ;.comp: :, previ
3420: 6f 75 73 20 3b 0a 0a 7d 73 63 6f 70 65 0a 0a 3a  ous ;..}scope..:
3430: 20 6b 65 79 2d 63 72 79 70 74 20 28 20 2d 2d 20   key-crypt ( -- 
3440: 29 0a 20 20 20 20 6b 65 79 70 61 63 6b 20 6b 65  ).    keypack ke
3450: 79 70 61 63 6b 2d 61 6c 6c 23 0a 20 20 20 20 3e  ypack-all#.    >
3460: 73 74 6f 72 65 6b 65 79 20 73 65 63 40 20 64 75  storekey sec@ du
3470: 70 20 24 32 30 20 75 3c 3d 20 5c 20 69 73 20 61  p $20 u<= \ is a
3480: 20 73 65 63 72 65 74 2c 20 6e 6f 20 6e 65 65 64   secret, no need
3490: 20 74 6f 20 62 65 20 73 6c 6f 77 0a 20 20 20 20   to be slow.    
34a0: 49 46 20 20 65 6e 63 72 79 70 74 24 20 20 45 4c  IF  encrypt$  EL
34b0: 53 45 20 20 70 77 2d 6c 65 76 65 6c 23 20 65 6e  SE  pw-level# en
34c0: 63 72 79 70 74 2d 70 77 24 20 20 54 48 45 4e 20  crypt-pw$  THEN 
34d0: 3b 0a 0a 30 20 56 61 6c 75 65 20 6b 65 79 2d 73  ;..0 Value key-s
34e0: 66 64 20 5c 20 73 65 63 72 65 74 20 6b 65 79 73  fd \ secret keys
34f0: 0a 30 20 56 61 6c 75 65 20 6b 65 79 2d 70 66 64  .0 Value key-pfd
3500: 20 5c 20 70 75 62 6b 65 79 73 0a 0a 3a 20 3f 6b   \ pubkeys..: ?k
3510: 65 79 2d 73 66 64 20 28 20 2d 2d 20 66 64 20 29  ey-sfd ( -- fd )
3520: 20 6b 65 79 2d 73 66 64 20 22 7e 2f 2e 6e 65 74   key-sfd "~/.net
3530: 32 6f 2f 73 65 63 6b 65 79 73 2e 6b 32 6f 22 20  2o/seckeys.k2o" 
3540: 3f 66 64 20 64 75 70 20 74 6f 20 6b 65 79 2d 73  ?fd dup to key-s
3550: 66 64 20 3b 0a 3a 20 3f 6b 65 79 2d 70 66 64 20  fd ;.: ?key-pfd 
3560: 28 20 2d 2d 20 66 64 20 29 20 6b 65 79 2d 70 66  ( -- fd ) key-pf
3570: 64 20 22 7e 2f 2e 6e 65 74 32 6f 2f 70 75 62 6b  d "~/.net2o/pubk
3580: 65 79 73 2e 6b 32 6f 22 20 3f 66 64 20 64 75 70  eys.k2o" ?fd dup
3590: 20 74 6f 20 6b 65 79 2d 70 66 64 20 3b 0a 0a 3a   to key-pfd ;..:
35a0: 20 6b 65 79 3e 73 66 69 6c 65 20 28 20 2d 2d 20   key>sfile ( -- 
35b0: 29 0a 20 20 20 20 6b 65 79 70 61 63 6b 20 6b 65  ).    keypack ke
35c0: 79 70 61 63 6b 2d 61 6c 6c 23 20 3f 6b 65 79 2d  ypack-all# ?key-
35d0: 73 66 64 20 61 70 70 65 6e 64 2d 66 69 6c 65 20  sfd append-file 
35e0: 6b 65 2d 6f 66 66 73 65 74 20 36 34 21 20 3b 0a  ke-offset 64! ;.
35f0: 3a 20 6b 65 79 3e 70 66 69 6c 65 20 28 20 2d 2d  : key>pfile ( --
3600: 20 29 0a 20 20 20 20 6b 65 79 70 61 63 6b 20 6b   ).    keypack k
3610: 65 79 70 61 63 6b 2d 61 6c 6c 23 20 3f 6b 65 79  eypack-all# ?key
3620: 2d 70 66 64 20 61 70 70 65 6e 64 2d 66 69 6c 65  -pfd append-file
3630: 20 6b 65 2d 6f 66 66 73 65 74 20 36 34 21 20 3b   ke-offset 64! ;
3640: 0a 0a 3a 20 6b 65 79 3e 73 66 69 6c 65 40 70 6f  ..: key>sfile@po
3650: 73 20 28 20 36 34 70 6f 73 20 2d 2d 20 29 20 36  s ( 64pos -- ) 6
3660: 34 64 75 70 20 36 34 23 2d 31 20 36 34 3d 20 49  4dup 64#-1 64= I
3670: 46 20 20 36 34 64 72 6f 70 20 6b 65 79 3e 73 66  F  64drop key>sf
3680: 69 6c 65 0a 20 20 20 20 45 4c 53 45 20 20 36 34  ile.    ELSE  64
3690: 3e 72 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61  >r keypack keypa
36a0: 63 6b 2d 61 6c 6c 23 20 36 34 72 3e 20 3f 6b 65  ck-all# 64r> ?ke
36b0: 79 2d 73 66 64 20 77 72 69 74 65 40 70 6f 73 2d  y-sfd write@pos-
36c0: 66 69 6c 65 20 20 54 48 45 4e 20 3b 0a 3a 20 6b  file  THEN ;.: k
36d0: 65 79 3e 70 66 69 6c 65 40 70 6f 73 20 28 20 36  ey>pfile@pos ( 6
36e0: 34 70 6f 73 20 2d 2d 20 29 20 36 34 64 75 70 20  4pos -- ) 64dup 
36f0: 36 34 23 2d 31 20 36 34 3d 20 49 46 20 20 36 34  64#-1 64= IF  64
3700: 64 72 6f 70 20 6b 65 79 3e 70 66 69 6c 65 0a 20  drop key>pfile. 
3710: 20 20 20 45 4c 53 45 20 20 36 34 3e 72 20 6b 65     ELSE  64>r ke
3720: 79 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d 61 6c  ypack keypack-al
3730: 6c 23 20 36 34 72 3e 20 3f 6b 65 79 2d 70 66 64  l# 64r> ?key-pfd
3740: 20 77 72 69 74 65 40 70 6f 73 2d 66 69 6c 65 20   write@pos-file 
3750: 20 54 48 45 4e 20 3b 0a 0a 3a 20 72 6e 64 3e 73   THEN ;..: rnd>s
3760: 66 69 6c 65 20 28 20 2d 2d 20 29 0a 20 20 20 20  file ( -- ).    
3770: 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d  keypack keypack-
3780: 61 6c 6c 23 20 3e 72 6e 67 24 20 6b 65 79 3e 73  all# >rng$ key>s
3790: 66 69 6c 65 20 3b 0a 3a 20 72 6e 64 3e 70 66 69  file ;.: rnd>pfi
37a0: 6c 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65  le ( -- ).    ke
37b0: 79 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d 61 6c  ypack keypack-al
37c0: 6c 23 20 3e 72 6e 67 24 20 6b 65 79 3e 70 66 69  l# >rng$ key>pfi
37d0: 6c 65 20 3b 0a 0a 3a 20 3e 6b 65 79 73 20 28 20  le ;..: >keys ( 
37e0: 2d 2d 20 29 0a 20 20 20 20 5c 47 20 61 64 64 20  -- ).    \G add 
37f0: 73 68 61 72 65 64 20 73 65 63 72 65 74 20 74 6f  shared secret to
3800: 20 6c 69 73 74 20 6f 66 20 70 6f 73 73 69 62 6c   list of possibl
3810: 65 20 6b 65 79 73 0a 20 20 20 20 73 6b 63 20 70  e keys.    skc p
3820: 6b 63 20 6b 65 79 70 61 64 20 65 64 2d 64 68 20  kc keypad ed-dh 
3830: 2b 6b 65 79 20 3b 0a 0a 5c 20 6b 65 79 20 67 65  +key ;..\ key ge
3840: 6e 65 72 61 74 69 6f 6e 0a 5c 20 66 6f 72 20 72  neration.\ for r
3850: 65 70 72 6f 64 75 63 69 62 69 6c 69 74 79 20 6f  eproducibility o
3860: 66 20 74 68 65 20 73 65 6c 66 73 69 67 2c 20 61  f the selfsig, a
3870: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
3880: 6d 65 20 6f 72 64 65 72 3a 0a 5c 20 22 70 75 62  me order:.\ "pub
3890: 6b 65 79 22 20 6e 65 77 6b 65 79 20 3c 6e 3e 20  key" newkey <n> 
38a0: 6b 65 79 74 79 70 65 20 22 6e 69 63 6b 22 20 6b  keytype "nick" k
38b0: 65 79 6e 69 63 6b 20 22 73 69 67 22 20 6b 65 79  eynick "sig" key
38c0: 73 65 6c 66 73 69 67 0a 0a 55 73 65 72 20 70 6b  selfsig..User pk
38d0: 2b 73 69 67 24 0a 0a 6b 65 79 73 69 7a 65 32 20  +sig$..keysize2 
38e0: 43 6f 6e 73 74 61 6e 74 20 70 6b 72 6b 23 0a 0a  Constant pkrk#..
38f0: 3a 20 5d 70 6b 2b 73 69 67 6e 20 28 20 61 64 64  : ]pk+sign ( add
3900: 72 20 75 20 2d 2d 20 29 20 2b 63 6d 64 62 75 66  r u -- ) +cmdbuf
3910: 20 5d 73 69 67 6e 20 3b 0a 0a 3a 20 70 61 63 6b   ]sign ;..: pack
3920: 2d 6b 65 79 20 28 20 74 79 70 65 20 6e 69 63 6b  -key ( type nick
3930: 20 75 20 2d 2d 20 29 0a 20 20 20 20 6e 6f 77 3e   u -- ).    now>
3940: 6e 65 76 65 72 0a 20 20 20 20 6b 65 79 3a 63 6f  never.    key:co
3950: 64 65 0a 20 20 20 20 20 20 73 69 67 6e 5b 0a 20  de.      sign[. 
3960: 20 20 20 20 20 72 6f 74 20 75 6c 69 74 2c 20 6b       rot ulit, k
3970: 65 79 74 79 70 65 20 24 2c 20 6b 65 79 6e 69 63  eytype $, keynic
3980: 6b 0a 20 20 20 20 20 20 70 6b 63 20 70 6b 72 6b  k.      pkc pkrk
3990: 23 20 5d 70 6b 2b 73 69 67 6e 0a 20 20 20 20 20  # ]pk+sign.     
39a0: 20 73 6b 63 20 6b 65 79 73 69 7a 65 20 24 2c 20   skc keysize $, 
39b0: 70 72 69 76 6b 65 79 0a 20 20 20 20 65 6e 64 3a  privkey.    end:
39c0: 6b 65 79 20 3b 0a 0a 61 6c 73 6f 20 6e 65 74 32  key ;..also net2
39d0: 6f 2d 62 61 73 65 0a 3a 20 70 61 63 6b 2d 63 6f  o-base.: pack-co
39e0: 72 65 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 29 20  re ( o:key -- ) 
39f0: 5c 20 63 6f 72 65 20 77 69 74 68 6f 75 74 20 6b  \ core without k
3a00: 65 79 0a 20 20 20 20 6b 65 2d 74 79 70 65 20 40  ey.    ke-type @
3a10: 20 75 6c 69 74 2c 20 6b 65 79 74 79 70 65 0a 20   ulit, keytype. 
3a20: 20 20 20 6b 65 2d 6e 69 63 6b 20 24 40 20 24 2c     ke-nick $@ $,
3a30: 20 6b 65 79 6e 69 63 6b 0a 20 20 20 20 6b 65 2d   keynick.    ke-
3a40: 70 73 6b 20 73 65 63 40 20 64 75 70 20 49 46 20  psk sec@ dup IF 
3a50: 20 24 2c 20 6b 65 79 70 73 6b 20 20 45 4c 53 45   $, keypsk  ELSE
3a60: 20 20 32 64 72 6f 70 20 20 54 48 45 4e 0a 20 20    2drop  THEN.  
3a70: 20 20 6b 65 2d 70 72 6f 66 20 24 40 20 64 75 70    ke-prof $@ dup
3a80: 20 49 46 20 20 24 2c 20 6b 65 79 70 72 6f 66 69   IF  $, keyprofi
3a90: 6c 65 20 20 45 4c 53 45 20 20 32 64 72 6f 70 20  le  ELSE  2drop 
3aa0: 20 54 48 45 4e 20 3b 0a 0a 3a 20 70 61 63 6b 2d   THEN ;..: pack-
3ab0: 63 6f 72 65 6b 65 79 20 28 20 6f 3a 6b 65 79 20  corekey ( o:key 
3ac0: 2d 2d 20 29 0a 20 20 20 20 73 69 67 6e 5b 0a 20  -- ).    sign[. 
3ad0: 20 20 20 70 61 63 6b 2d 63 6f 72 65 0a 20 20 20     pack-core.   
3ae0: 20 6b 65 2d 70 6b 20 24 40 20 2b 63 6d 64 62 75   ke-pk $@ +cmdbu
3af0: 66 0a 20 20 20 20 6b 65 2d 73 65 6c 66 73 69 67  f.    ke-selfsig
3b00: 20 24 40 20 2b 63 6d 64 62 75 66 20 63 6d 64 2d   $@ +cmdbuf cmd-
3b10: 72 65 73 6f 6c 76 65 3e 20 32 64 72 6f 70 20 6e  resolve> 2drop n
3b20: 65 73 74 73 69 67 0a 20 20 20 20 6b 65 2d 69 6d  estsig.    ke-im
3b30: 70 6f 72 74 20 40 20 75 6c 69 74 2c 20 6b 65 79  port @ ulit, key
3b40: 69 6d 70 6f 72 74 0a 20 20 20 20 6b 65 2d 73 74  import.    ke-st
3b50: 6f 72 65 6b 65 79 20 40 20 3e 73 74 6f 72 65 6b  orekey @ >storek
3b60: 65 79 20 21 20 3b 0a 70 72 65 76 69 6f 75 73 0a  ey ! ;.previous.
3b70: 0a 3a 20 70 61 63 6b 2d 70 75 62 6b 65 79 20 28  .: pack-pubkey (
3b80: 20 6f 3a 6b 65 79 20 2d 2d 20 29 0a 20 20 20 20   o:key -- ).    
3b90: 6b 65 79 3a 63 6f 64 65 0a 20 20 20 20 20 20 70  key:code.      p
3ba0: 61 63 6b 2d 63 6f 72 65 6b 65 79 0a 20 20 20 20  ack-corekey.    
3bb0: 65 6e 64 3a 6b 65 79 20 3b 0a 3a 20 70 61 63 6b  end:key ;.: pack
3bc0: 2d 73 65 63 6b 65 79 20 28 20 6f 3a 6b 65 79 20  -seckey ( o:key 
3bd0: 2d 2d 20 29 0a 20 20 20 20 6b 65 79 3a 63 6f 64  -- ).    key:cod
3be0: 65 0a 20 20 20 20 20 20 70 61 63 6b 2d 63 6f 72  e.      pack-cor
3bf0: 65 6b 65 79 0a 20 20 20 20 20 20 6b 65 2d 73 6b  ekey.      ke-sk
3c00: 20 73 65 63 40 20 24 2c 20 70 72 69 76 6b 65 79   sec@ $, privkey
3c10: 0a 20 20 20 20 65 6e 64 3a 6b 65 79 20 3b 0a 3a  .    end:key ;.:
3c20: 20 6b 65 79 6e 69 63 6b 24 20 28 20 6f 3a 6b 65   keynick$ ( o:ke
3c30: 79 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20  y -- addr u ).  
3c40: 20 20 5c 67 20 67 65 74 20 74 68 65 20 61 6e 6e    \g get the ann
3c50: 6f 74 61 74 69 6f 6e 73 20 77 69 74 68 20 73 69  otations with si
3c60: 67 6e 61 74 75 72 65 0a 20 20 20 20 5b 27 5d 20  gnature.    ['] 
3c70: 70 61 63 6b 2d 63 6f 72 65 20 67 65 6e 2d 63 6d  pack-core gen-cm
3c80: 64 24 20 32 64 72 6f 70 0a 20 20 20 20 6b 65 2d  d$ 2drop.    ke-
3c90: 73 65 6c 66 73 69 67 20 24 40 20 74 6d 70 24 20  selfsig $@ tmp$ 
3ca0: 24 2b 21 20 74 6d 70 24 20 24 40 20 3b 0a 3a 20  $+! tmp$ $@ ;.: 
3cb0: 6b 65 79 70 6b 32 6e 69 63 6b 24 20 28 20 6f 3a  keypk2nick$ ( o:
3cc0: 6b 65 79 20 2d 2d 20 61 64 64 72 20 75 20 29 0a  key -- addr u ).
3cd0: 20 20 20 20 5c 67 20 67 65 74 20 74 68 65 20 61      \g get the a
3ce0: 6e 6e 6f 74 61 74 69 6f 6e 73 20 77 69 74 68 20  nnotations with 
3cf0: 73 69 67 6e 61 74 75 72 65 0a 20 20 20 20 5b 27  signature.    ['
3d00: 5d 20 70 61 63 6b 2d 63 6f 72 65 20 67 65 6e 2d  ] pack-core gen-
3d10: 63 6d 64 24 20 32 64 72 6f 70 0a 20 20 20 20 6b  cmd$ 2drop.    k
3d20: 65 2d 70 6b 20 24 40 20 74 6d 70 24 20 24 2b 21  e-pk $@ tmp$ $+!
3d30: 20 6b 65 2d 73 65 6c 66 73 69 67 20 24 40 20 74   ke-selfsig $@ t
3d40: 6d 70 24 20 24 2b 21 20 74 6d 70 24 20 24 40 20  mp$ $+! tmp$ $@ 
3d50: 3b 0a 3a 20 6d 79 6e 69 63 6b 2d 6b 65 79 20 28  ;.: mynick-key (
3d60: 20 2d 2d 20 6f 20 29 0a 20 20 20 20 70 6b 63 20   -- o ).    pkc 
3d70: 6b 65 79 73 69 7a 65 20 6b 65 79 2d 74 61 62 6c  keysize key-tabl
3d80: 65 20 23 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20  e #@ drop cell+ 
3d90: 3b 0a 3a 20 6d 79 6e 69 63 6b 24 20 28 20 2d 2d  ;.: mynick$ ( --
3da0: 20 61 64 64 72 20 75 20 29 0a 20 20 20 20 5c 67   addr u ).    \g
3db0: 20 67 65 74 20 6d 79 20 6e 69 63 6b 20 77 69 74   get my nick wit
3dc0: 68 20 73 69 67 6e 61 74 75 72 65 0a 20 20 20 20  h signature.    
3dd0: 6d 79 6e 69 63 6b 2d 6b 65 79 20 2e 6b 65 79 6e  mynick-key .keyn
3de0: 69 63 6b 24 20 3b 0a 3a 20 6d 79 70 6b 32 6e 69  ick$ ;.: mypk2ni
3df0: 63 6b 24 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 61  ck$ ( o:key -- a
3e00: 64 64 72 20 75 20 29 0a 20 20 20 20 5c 67 20 67  ddr u ).    \g g
3e10: 65 74 20 6d 79 20 6e 69 63 6b 20 77 69 74 68 20  et my nick with 
3e20: 73 69 67 6e 61 74 75 72 65 0a 20 20 20 20 6d 79  signature.    my
3e30: 6e 69 63 6b 2d 6b 65 79 20 2e 6b 65 79 70 6b 32  nick-key .keypk2
3e40: 6e 69 63 6b 24 20 3b 0a 0a 56 61 72 69 61 62 6c  nick$ ;..Variabl
3e50: 65 20 63 70 2d 74 6d 70 0a 0a 3a 20 73 61 76 65  e cp-tmp..: save
3e60: 2d 70 75 62 6b 65 79 73 20 28 20 2d 2d 20 29 0a  -pubkeys ( -- ).
3e70: 20 20 20 20 6b 65 79 2d 70 66 64 20 3f 64 75 70      key-pfd ?dup
3e80: 2d 49 46 20 20 63 6c 6f 73 65 2d 66 69 6c 65 20  -IF  close-file 
3e90: 74 68 72 6f 77 20 20 54 48 45 4e 0a 20 20 20 20  throw  THEN.    
3ea0: 3f 2e 6e 65 74 32 6f 0a 20 20 20 20 22 7e 2f 2e  ?.net2o.    "~/.
3eb0: 6e 65 74 32 6f 2f 70 75 62 6b 65 79 73 2e 6b 32  net2o/pubkeys.k2
3ec0: 6f 22 20 5b 3a 20 74 6f 20 6b 65 79 2d 70 66 64  o" [: to key-pfd
3ed0: 0a 20 20 20 20 20 20 6b 65 79 2d 74 61 62 6c 65  .      key-table
3ee0: 20 5b 3a 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f   [: cell+ $@ dro
3ef0: 70 20 63 65 6c 6c 2b 20 3e 6f 0a 09 6b 65 2d 73  p cell+ >o..ke-s
3f00: 6b 20 73 65 63 40 20 64 30 3d 20 49 46 20 20 70  k sec@ d0= IF  p
3f10: 61 63 6b 2d 70 75 62 6b 65 79 0a 09 20 20 20 20  ack-pubkey..    
3f20: 66 6c 75 73 68 28 20 2e 22 20 73 61 76 69 6e 67  flush( ." saving
3f30: 20 22 20 2e 6e 69 63 6b 20 66 6f 72 74 68 3a 63   " .nick forth:c
3f40: 72 20 29 0a 09 20 20 20 20 6b 65 79 2d 63 72 79  r )..    key-cry
3f50: 70 74 20 6b 65 2d 6f 66 66 73 65 74 20 36 34 40  pt ke-offset 64@
3f60: 20 6b 65 79 3e 70 66 69 6c 65 40 70 6f 73 0a 09   key>pfile@pos..
3f70: 54 48 45 4e 20 6f 3e 20 3b 5d 20 23 6d 61 70 0a  THEN o> ;] #map.
3f80: 20 20 20 20 30 20 74 6f 20 6b 65 79 2d 70 66 64      0 to key-pfd
3f90: 20 3b 5d 20 73 61 76 65 2d 66 69 6c 65 20 20 3f   ;] save-file  ?
3fa0: 6b 65 79 2d 70 66 64 20 64 72 6f 70 20 3b 0a 0a  key-pfd drop ;..
3fb0: 3a 20 73 61 76 65 2d 73 65 63 6b 65 79 73 20 28  : save-seckeys (
3fc0: 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 2d 73 66   -- ).    key-sf
3fd0: 64 20 3f 64 75 70 2d 49 46 20 20 63 6c 6f 73 65  d ?dup-IF  close
3fe0: 2d 66 69 6c 65 20 74 68 72 6f 77 20 20 54 48 45  -file throw  THE
3ff0: 4e 0a 20 20 20 20 3f 2e 6e 65 74 32 6f 0a 20 20  N.    ?.net2o.  
4000: 20 20 22 7e 2f 2e 6e 65 74 32 6f 2f 73 65 63 6b    "~/.net2o/seck
4010: 65 79 73 2e 6b 32 6f 22 20 5b 3a 20 74 6f 20 6b  eys.k2o" [: to k
4020: 65 79 2d 73 66 64 0a 20 20 20 20 20 20 6b 65 79  ey-sfd.      key
4030: 2d 74 61 62 6c 65 20 5b 3a 20 63 65 6c 6c 2b 20  -table [: cell+ 
4040: 24 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e 6f  $@ drop cell+ >o
4050: 0a 09 6b 65 2d 73 6b 20 73 65 63 40 20 64 30 3c  ..ke-sk sec@ d0<
4060: 3e 20 49 46 20 20 70 61 63 6b 2d 73 65 63 6b 65  > IF  pack-secke
4070: 79 0a 09 20 20 20 20 6b 65 79 2d 63 72 79 70 74  y..    key-crypt
4080: 20 6b 65 2d 6f 66 66 73 65 74 20 36 34 40 20 6b   ke-offset 64@ k
4090: 65 79 3e 73 66 69 6c 65 40 70 6f 73 0a 09 54 48  ey>sfile@pos..TH
40a0: 45 4e 20 6f 3e 20 3b 5d 20 23 6d 61 70 0a 20 20  EN o> ;] #map.  
40b0: 20 20 30 20 74 6f 20 6b 65 79 2d 73 66 64 20 3b    0 to key-sfd ;
40c0: 5d 20 73 61 76 65 2d 66 69 6c 65 20 20 3f 6b 65  ] save-file  ?ke
40d0: 79 2d 73 66 64 20 64 72 6f 70 20 3b 0a 0a 3a 20  y-sfd drop ;..: 
40e0: 73 61 76 65 2d 6b 65 79 73 20 28 20 2d 2d 20 29  save-keys ( -- )
40f0: 0a 20 20 20 20 73 61 76 65 2d 70 75 62 6b 65 79  .    save-pubkey
4100: 73 20 73 61 76 65 2d 73 65 63 6b 65 79 73 20 3b  s save-seckeys ;
4110: 0a 0a 3a 20 2b 67 65 6e 2d 6b 65 79 73 20 28 20  ..: +gen-keys ( 
4120: 6e 69 63 6b 20 75 20 74 79 70 65 20 2d 2d 20 29  nick u type -- )
4130: 0a 20 20 20 20 67 65 6e 2d 6b 65 79 73 20 20 36  .    gen-keys  6
4140: 34 23 2d 31 20 6b 65 79 2d 72 65 61 64 2d 6f 66  4#-1 key-read-of
4150: 66 73 65 74 20 36 34 21 20 20 70 6b 63 20 6b 65  fset 64!  pkc ke
4160: 79 73 69 7a 65 32 20 6b 65 79 3a 6e 65 77 20 3e  ysize2 key:new >
4170: 6f 0a 20 20 20 20 69 6d 70 6f 72 74 23 73 65 6c  o.    import#sel
4180: 66 20 6b 65 2d 69 6d 70 6f 72 74 20 21 20 20 6b  f ke-import !  k
4190: 65 2d 74 79 70 65 20 21 20 20 6b 65 2d 6e 69 63  e-type !  ke-nic
41a0: 6b 20 24 21 20 20 6e 69 63 6b 21 0a 20 20 20 20  k $!  nick!.    
41b0: 73 6b 63 20 6b 65 79 73 69 7a 65 20 6b 65 2d 73  skc keysize ke-s
41c0: 6b 20 73 65 63 21 20 20 2b 73 65 63 6b 65 79 0a  k sec!  +seckey.
41d0: 20 20 20 20 5b 20 61 6c 73 6f 20 6e 65 74 32 6f      [ also net2o
41e0: 2d 62 61 73 65 20 5d 0a 20 20 20 20 5b 3a 20 6b  -base ].    [: k
41f0: 65 2d 74 79 70 65 20 40 20 75 6c 69 74 2c 20 6b  e-type @ ulit, k
4200: 65 79 74 79 70 65 20 6b 65 2d 6e 69 63 6b 20 24  eytype ke-nick $
4210: 40 20 24 2c 20 6b 65 79 6e 69 63 6b 20 3b 5d 20  @ $, keynick ;] 
4220: 67 65 6e 2d 63 6d 64 24 0a 20 20 20 20 5b 20 70  gen-cmd$.    [ p
4230: 72 65 76 69 6f 75 73 20 5d 20 5b 3a 20 74 79 70  revious ] [: typ
4240: 65 20 70 6b 63 20 6b 65 79 73 69 7a 65 32 20 74  e pkc keysize2 t
4250: 79 70 65 20 3b 5d 20 24 74 6d 70 0a 20 20 20 20  ype ;] $tmp.    
4260: 6e 6f 77 3e 6e 65 76 65 72 20 63 3a 30 6b 65 79  now>never c:0key
4270: 20 63 3a 68 61 73 68 20 5b 27 5d 20 2e 73 69 67   c:hash ['] .sig
4280: 20 24 74 6d 70 20 6b 65 2d 73 65 6c 66 73 69 67   $tmp ke-selfsig
4290: 20 24 21 0a 20 20 20 20 6f 3e 20 3b 0a 0a 3a 20   $!.    o> ;..: 
42a0: 2b 6b 65 79 70 61 69 72 20 28 20 74 79 70 65 20  +keypair ( type 
42b0: 6e 69 63 6b 20 75 20 2d 2d 20 29 20 2b 70 61 73  nick u -- ) +pas
42c0: 73 70 68 72 61 73 65 20 2b 67 65 6e 2d 6b 65 79  sphrase +gen-key
42d0: 73 20 3b 0a 0a 3a 20 2e 72 76 6b 20 2e 22 20 50  s ;..: .rvk ." P
42e0: 6c 65 61 73 65 20 77 72 69 74 65 20 64 6f 77 6e  lease write down
42f0: 20 72 65 76 6f 6b 65 20 6b 65 79 3a 20 22 20 63   revoke key: " c
4300: 72 0a 20 20 20 20 73 6b 72 65 76 20 24 32 30 20  r.    skrev $20 
4310: 62 6f 75 6e 64 73 20 44 4f 20 20 2e 22 20 5c 20  bounds DO  ." \ 
4320: 22 20 49 20 34 20 38 35 74 79 70 65 20 73 70 61  " I 4 85type spa
4330: 63 65 20 49 20 34 20 2b 20 34 20 38 35 74 79 70  ce I 4 + 4 85typ
4340: 65 20 63 72 20 38 20 2b 4c 4f 4f 50 20 3b 0a 0a  e cr 8 +LOOP ;..
4350: 24 34 30 20 62 75 66 66 65 72 3a 20 6e 69 63 6b  $40 buffer: nick
4360: 2d 62 75 66 0a 0a 3a 20 67 65 74 2d 6e 69 63 6b  -buf..: get-nick
4370: 20 28 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20   ( -- addr u ). 
4380: 20 20 20 2e 22 20 6e 69 63 6b 3a 20 22 20 6e 69     ." nick: " ni
4390: 63 6b 2d 62 75 66 20 24 34 30 20 61 63 63 65 70  ck-buf $40 accep
43a0: 74 20 6e 69 63 6b 2d 62 75 66 20 73 77 61 70 20  t nick-buf swap 
43b0: 63 72 20 3b 0a 3a 20 6d 61 6b 65 2d 6b 65 79 20  cr ;.: make-key 
43c0: 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 23 75  ( -- ).    key#u
43d0: 73 65 72 20 67 65 74 2d 6e 69 63 6b 0a 20 20 20  ser get-nick.   
43e0: 20 2e 22 20 70 61 73 73 70 68 72 61 73 65 3a 20   ." passphrase: 
43f0: 22 20 2b 70 61 73 73 70 68 72 61 73 65 20 6b 65  " +passphrase ke
4400: 79 3e 64 65 66 61 75 6c 74 0a 20 20 20 20 63 72  y>default.    cr
4410: 20 2b 67 65 6e 2d 6b 65 79 73 20 2e 72 76 6b 20   +gen-keys .rvk 
4420: 3b 0a 0a 5c 20 72 65 61 64 20 6b 65 79 20 66 69  ;..\ read key fi
4430: 6c 65 0a 0a 3a 20 74 72 79 2d 64 65 63 72 79 70  le..: try-decryp
4440: 74 2d 6b 65 79 20 28 20 6b 65 79 20 75 31 20 2d  t-key ( key u1 -
4450: 2d 20 61 64 64 72 20 75 32 20 66 6c 61 67 20 29  - addr u2 flag )
4460: 0a 20 20 20 20 6b 65 79 70 61 63 6b 20 6b 65 79  .    keypack key
4470: 70 61 63 6b 2d 64 20 6b 65 79 70 61 63 6b 2d 61  pack-d keypack-a
4480: 6c 6c 23 20 6d 6f 76 65 0a 20 20 20 20 6b 65 79  ll# move.    key
4490: 70 61 63 6b 2d 64 20 6b 65 79 70 61 63 6b 2d 61  pack-d keypack-a
44a0: 6c 6c 23 20 32 73 77 61 70 0a 20 20 20 20 64 75  ll# 2swap.    du
44b0: 70 20 24 32 30 20 3d 20 49 46 20 20 64 65 63 72  p $20 = IF  decr
44c0: 79 70 74 24 20 20 45 4c 53 45 0a 09 6b 65 79 70  ypt$  ELSE..keyp
44d0: 61 63 6b 20 63 40 20 24 46 20 61 6e 64 20 70 77  ack c@ $F and pw
44e0: 2d 6c 65 76 65 6c 23 20 3c 3d 20 49 46 20 20 64  -level# <= IF  d
44f0: 65 63 72 79 70 74 2d 70 77 24 0a 09 45 4c 53 45  ecrypt-pw$..ELSE
4500: 20 20 32 64 72 6f 70 20 66 61 6c 73 65 20 20 54    2drop false  T
4510: 48 45 4e 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a  HEN.    THEN ;..
4520: 3a 20 74 72 79 2d 64 65 63 72 79 70 74 20 28 20  : try-decrypt ( 
4530: 2d 2d 20 61 64 64 72 20 75 20 2f 20 30 20 30 20  -- addr u / 0 0 
4540: 29 0a 20 20 20 20 6b 65 79 73 20 24 5b 5d 23 20  ).    keys $[]# 
4550: 30 20 3f 44 4f 0a 09 49 20 6b 65 79 73 20 73 65  0 ?DO..I keys se
4560: 63 5b 5d 40 20 74 72 79 2d 64 65 63 72 79 70 74  c[]@ try-decrypt
4570: 2d 6b 65 79 20 49 46 0a 09 20 20 20 20 49 20 6b  -key IF..    I k
4580: 65 79 73 20 24 5b 5d 20 40 20 3e 73 74 6f 72 65  eys $[] @ >store
4590: 6b 65 79 20 21 20 75 6e 6c 6f 6f 70 20 20 45 58  key ! unloop  EX
45a0: 49 54 20 20 54 48 45 4e 0a 09 32 64 72 6f 70 0a  IT  THEN..2drop.
45b0: 20 20 20 20 4c 4f 4f 50 20 20 30 20 30 20 3b 0a      LOOP  0 0 ;.
45c0: 0a 3a 20 64 6f 2d 6b 65 79 20 28 20 61 64 64 72  .: do-key ( addr
45d0: 20 75 20 2f 20 30 20 30 20 20 2d 2d 20 29 0a 20   u / 0 0  -- ). 
45e0: 20 20 20 64 75 70 20 30 3d 20 49 46 20 20 32 64     dup 0= IF  2d
45f0: 72 6f 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a  rop  EXIT  THEN.
4600: 20 20 20 20 73 61 6d 70 6c 65 2d 6b 65 79 20 2e      sample-key .
4610: 64 6f 2d 63 6d 64 2d 6c 6f 6f 70 20 3b 0a 0a 3a  do-cmd-loop ;..:
4620: 20 2e 6b 65 79 24 20 28 20 61 64 64 72 20 75 20   .key$ ( addr u 
4630: 2d 2d 20 29 0a 20 20 20 20 73 61 6d 70 6c 65 2d  -- ).    sample-
4640: 6b 65 79 20 3e 6f 20 20 6b 65 2d 73 6b 20 6b 65  key >o  ke-sk ke
4650: 2d 65 6e 64 20 6f 76 65 72 20 2d 20 65 72 61 73  -end over - eras
4660: 65 0a 20 20 20 20 73 69 67 6e 65 64 2d 76 61 6c  e.    signed-val
4670: 20 76 61 6c 69 64 61 74 65 64 20 6f 72 21 20 20   validated or!  
4680: 63 2d 73 74 61 74 65 20 6f 66 66 20 20 6e 65 73  c-state off  nes
4690: 74 2d 63 6d 64 2d 6c 6f 6f 70 0a 20 20 20 20 73  t-cmd-loop.    s
46a0: 69 67 6e 65 64 2d 76 61 6c 20 69 6e 76 65 72 74  igned-val invert
46b0: 20 76 61 6c 69 64 61 74 65 64 20 61 6e 64 21 0a   validated and!.
46c0: 20 20 20 20 2e 6b 65 79 2d 73 68 6f 72 74 20 66      .key-short f
46d0: 72 65 65 2d 6b 65 79 20 6f 3e 20 3b 0a 0a 3a 20  ree-key o> ;..: 
46e0: 72 65 61 64 2d 6b 65 79 73 2d 6c 6f 6f 70 20 28  read-keys-loop (
46f0: 20 66 64 20 2d 2d 20 29 20 20 63 6f 64 65 2d 6b   fd -- )  code-k
4700: 65 79 0a 20 20 20 20 3e 72 20 30 2e 20 72 40 20  ey.    >r 0. r@ 
4710: 72 65 70 6f 73 69 74 69 6f 6e 2d 66 69 6c 65 20  reposition-file 
4720: 74 68 72 6f 77 0a 20 20 20 20 42 45 47 49 4e 0a  throw.    BEGIN.
4730: 09 72 40 20 66 69 6c 65 2d 70 6f 73 69 74 69 6f  .r@ file-positio
4740: 6e 20 74 68 72 6f 77 20 64 3e 36 34 20 6b 65 79  n throw d>64 key
4750: 2d 72 65 61 64 2d 6f 66 66 73 65 74 20 36 34 21  -read-offset 64!
4760: 0a 09 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63  ..keypack keypac
4770: 6b 2d 61 6c 6c 23 20 72 40 20 72 65 61 64 2d 66  k-all# r@ read-f
4780: 69 6c 65 20 74 68 72 6f 77 0a 09 6b 65 79 70 61  ile throw..keypa
4790: 63 6b 2d 61 6c 6c 23 20 3d 20 57 48 49 4c 45 20  ck-all# = WHILE 
47a0: 20 74 72 79 2d 64 65 63 72 79 70 74 20 64 6f 2d   try-decrypt do-
47b0: 6b 65 79 0a 20 20 20 20 52 45 50 45 41 54 20 20  key.    REPEAT  
47c0: 72 64 72 6f 70 20 20 63 6f 64 65 30 2d 62 75 66  rdrop  code0-buf
47d0: 20 3b 0a 3a 20 72 65 61 64 2d 6b 65 79 2d 6c 6f   ;.: read-key-lo
47e0: 6f 70 20 28 20 2d 2d 20 29 0a 20 20 20 20 69 6d  op ( -- ).    im
47f0: 70 6f 72 74 23 73 65 6c 66 20 69 6d 70 6f 72 74  port#self import
4800: 2d 74 79 70 65 20 21 0a 20 20 20 20 3f 6b 65 79  -type !.    ?key
4810: 2d 73 66 64 20 72 65 61 64 2d 6b 65 79 73 2d 6c  -sfd read-keys-l
4820: 6f 6f 70 20 3b 0a 3a 20 72 65 61 64 2d 70 6b 65  oop ;.: read-pke
4830: 79 2d 6c 6f 6f 70 20 28 20 2d 2d 20 29 0a 20 20  y-loop ( -- ).  
4840: 20 20 70 77 2d 6c 65 76 65 6c 23 20 3e 72 20 2d    pw-level# >r -
4850: 31 20 74 6f 20 70 77 2d 6c 65 76 65 6c 23 20 20  1 to pw-level#  
4860: 69 6d 70 6f 72 74 23 6d 61 6e 75 61 6c 20 69 6d  import#manual im
4870: 70 6f 72 74 2d 74 79 70 65 20 21 0a 20 20 20 20  port-type !.    
4880: 3f 6b 65 79 2d 70 66 64 20 72 65 61 64 2d 6b 65  ?key-pfd read-ke
4890: 79 73 2d 6c 6f 6f 70 0a 20 20 20 20 72 3e 20 74  ys-loop.    r> t
48a0: 6f 20 70 77 2d 6c 65 76 65 6c 23 20 20 3b 0a 0a  o pw-level#  ;..
48b0: 3a 20 72 65 61 64 2d 6b 65 79 73 20 28 20 2d 2d  : read-keys ( --
48c0: 20 29 0a 20 20 20 20 72 65 61 64 2d 6b 65 79 2d   ).    read-key-
48d0: 6c 6f 6f 70 20 72 65 61 64 2d 70 6b 65 79 2d 6c  loop read-pkey-l
48e0: 6f 6f 70 20 69 6d 70 6f 72 74 23 75 6e 74 72 75  oop import#untru
48f0: 73 74 65 64 20 69 6d 70 6f 72 74 2d 74 79 70 65  sted import-type
4900: 20 21 20 3b 0a 0a 3a 20 72 65 61 64 2d 70 6b 32   ! ;..: read-pk2
4910: 6b 65 79 24 20 28 20 61 64 64 72 20 75 20 2d 2d  key$ ( addr u --
4920: 20 29 0a 20 20 20 20 5c 67 20 72 65 61 64 20 61   ).    \g read a
4930: 20 6e 65 73 74 65 64 20 6b 65 79 20 69 6e 74 6f   nested key into
4940: 20 73 61 6d 70 6c 65 2d 6b 65 79 0a 20 20 20 20   sample-key.    
4950: 73 61 6d 70 6c 65 2d 6b 65 79 20 3e 6f 20 63 2d  sample-key >o c-
4960: 73 74 61 74 65 20 6f 66 66 20 20 73 69 6d 2d 6e  state off  sim-n
4970: 69 63 6b 21 20 6f 6e 0a 20 20 20 20 70 6b 32 2d  ick! on.    pk2-
4980: 73 69 67 3f 20 21 21 73 69 67 21 21 20 73 69 67  sig? !!sig!! sig
4990: 70 6b 32 73 69 7a 65 23 20 2d 20 32 64 75 70 20  pk2size# - 2dup 
49a0: 2b 20 3e 72 20 64 6f 2d 6e 65 73 74 73 69 67 0a  + >r do-nestsig.
49b0: 20 20 20 20 72 40 20 6b 65 79 73 69 7a 65 32 20      r@ keysize2 
49c0: 6b 65 2d 70 6b 20 24 21 0a 20 20 20 20 72 3e 20  ke-pk $!.    r> 
49d0: 6b 65 79 73 69 7a 65 32 20 2b 20 73 69 67 73 69  keysize2 + sigsi
49e0: 7a 65 23 20 6b 65 2d 73 65 6c 66 73 69 67 20 24  ze# ke-selfsig $
49f0: 21 0a 20 20 20 20 6f 3e 20 20 73 69 6d 2d 6e 69  !.    o>  sim-ni
4a00: 63 6b 21 20 6f 66 66 20 3b 0a 0a 3a 20 2e 70 6b  ck! off ;..: .pk
4a10: 32 6b 65 79 24 20 28 20 61 64 64 72 20 75 20 2d  2key$ ( addr u -
4a20: 2d 20 29 0a 20 20 20 20 72 65 61 64 2d 70 6b 32  - ).    read-pk2
4a30: 6b 65 79 24 20 73 61 6d 70 6c 65 2d 6b 65 79 20  key$ sample-key 
4a40: 3e 6f 20 2e 6b 65 79 2d 69 6e 76 69 74 65 20 66  >o .key-invite f
4a50: 72 65 65 2d 6b 65 79 20 6f 3e 20 3b 0a 0a 5c 20  ree-key o> ;..\ 
4a60: 73 65 6c 65 63 74 20 6b 65 79 20 62 79 20 6e 69  select key by ni
4a70: 63 6b 0a 0a 3a 20 3e 72 61 77 2d 6b 65 79 20 28  ck..: >raw-key (
4a80: 20 6f 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 20   o -- ).    dup 
4a90: 30 3d 20 21 21 6e 6f 2d 6e 69 63 6b 21 21 20 3e  0= !!no-nick!! >
4aa0: 6f 0a 20 20 20 20 6b 65 2d 70 6b 20 24 40 20 70  o.    ke-pk $@ p
4ab0: 6b 63 20 73 77 61 70 20 70 6b 72 6b 23 20 75 6d  kc swap pkrk# um
4ac0: 69 6e 20 6d 6f 76 65 0a 20 20 20 20 6b 65 2d 70  in move.    ke-p
4ad0: 73 6b 20 73 65 63 40 20 6d 79 2d 30 6b 65 79 20  sk sec@ my-0key 
4ae0: 73 65 63 21 0a 20 20 20 20 6b 65 2d 73 6b 20 73  sec!.    ke-sk s
4af0: 65 63 40 20 73 6b 63 20 73 77 61 70 20 6b 65 79  ec@ skc swap key
4b00: 7c 20 6d 6f 76 65 0a 20 20 20 20 3e 73 6b 73 69  | move.    >sksi
4b10: 67 20 6f 3e 20 3b 0a 0a 3a 20 3e 6b 65 79 20 28  g o> ;..: >key (
4b20: 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20   addr u -- ).   
4b30: 20 6b 65 79 2d 74 61 62 6c 65 20 40 20 30 3d 20   key-table @ 0= 
4b40: 49 46 20 20 72 65 61 64 2d 6b 65 79 73 20 20 54  IF  read-keys  T
4b50: 48 45 4e 0a 20 20 20 20 6e 69 63 6b 2d 6b 65 79  HEN.    nick-key
4b60: 20 3e 72 61 77 2d 6b 65 79 20 3b 0a 0a 3a 20 69   >raw-key ;..: i
4b70: 27 6d 20 28 20 22 6e 61 6d 65 22 20 2d 2d 20 29  'm ( "name" -- )
4b80: 20 70 61 72 73 65 2d 6e 61 6d 65 20 3e 6b 65 79   parse-name >key
4b90: 20 3b 0a 3a 20 70 6b 27 20 28 20 22 6e 61 6d 65   ;.: pk' ( "name
4ba0: 22 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20  " -- addr u ).  
4bb0: 20 20 70 61 72 73 65 2d 6e 61 6d 65 20 6e 69 63    parse-name nic
4bc0: 6b 3e 70 6b 20 3b 0a 0a 3a 20 64 65 73 74 2d 6b  k>pk ;..: dest-k
4bd0: 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29  ey ( addr u -- )
4be0: 20 64 75 70 20 30 3d 20 49 46 20 20 32 64 72 6f   dup 0= IF  2dro
4bf0: 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20  p  EXIT  THEN.  
4c00: 20 20 6e 69 63 6b 2d 6b 65 79 20 3e 6f 20 6f 20    nick-key >o o 
4c10: 30 3d 20 21 21 75 6e 6b 6e 6f 77 6e 2d 6b 65 79  0= !!unknown-key
4c20: 21 21 0a 20 20 20 20 6b 65 2d 70 73 6b 20 73 65  !!.    ke-psk se
4c30: 63 40 20 73 74 61 74 65 23 20 75 6d 69 6e 0a 20  c@ state# umin. 
4c40: 20 20 20 6b 65 2d 70 6b 20 24 40 20 6b 65 79 7c     ke-pk $@ key|
4c50: 20 6f 3e 0a 20 20 20 20 70 75 62 6b 65 79 20 24   o>.    pubkey $
4c60: 21 20 20 64 65 73 74 2d 30 6b 65 79 20 73 65 63  !  dest-0key sec
4c70: 21 20 3b 0a 0a 3a 20 64 65 73 74 2d 70 6b 20 28  ! ;..: dest-pk (
4c80: 20 61 64 64 72 20 75 20 2d 2d 20 29 20 6b 65 79   addr u -- ) key
4c90: 32 7c 20 32 64 75 70 20 6b 65 79 2d 74 61 62 6c  2| 2dup key-tabl
4ca0: 65 20 23 40 20 30 3d 20 49 46 0a 09 64 72 6f 70  e #@ 0= IF..drop
4cb0: 20 6b 65 79 7c 20 70 75 62 6b 65 79 20 24 21 0a   key| pubkey $!.
4cc0: 20 20 20 20 45 4c 53 45 20 20 63 65 6c 6c 2b 20      ELSE  cell+ 
4cd0: 3e 6f 0a 09 6b 65 2d 70 73 6b 20 73 65 63 40 20  >o..ke-psk sec@ 
4ce0: 73 74 61 74 65 23 20 75 6d 69 6e 0a 09 6b 65 2d  state# umin..ke-
4cf0: 70 6b 20 24 40 20 6b 65 79 7c 20 6f 3e 0a 09 70  pk $@ key| o>..p
4d00: 75 62 6b 65 79 20 24 21 20 20 64 65 73 74 2d 30  ubkey $!  dest-0
4d10: 6b 65 79 20 73 65 63 21 20 20 54 48 45 4e 20 3b  key sec!  THEN ;
4d20: 0a 0a 3a 20 72 65 70 6c 61 63 65 2d 6b 65 79 20  ..: replace-key 
4d30: 31 20 2f 73 74 72 69 6e 67 20 7b 20 72 65 76 2d  1 /string { rev-
4d40: 61 64 64 72 20 75 20 2d 2d 20 6f 20 7d 20 5c 20  addr u -- o } \ 
4d50: 72 65 76 6f 63 61 74 69 6f 6e 20 74 69 63 6b 65  revocation ticke
4d60: 74 0a 20 20 20 20 6b 65 79 28 20 2e 22 20 52 65  t.    key( ." Re
4d70: 70 6c 61 63 65 3a 22 20 63 72 20 6f 20 63 65 6c  place:" cr o cel
4d80: 6c 2d 20 30 20 2e 6b 65 79 20 29 0a 20 20 20 20  l- 0 .key ).    
4d90: 69 6d 70 6f 72 74 23 73 65 6c 66 20 69 6d 70 6f  import#self impo
4da0: 72 74 2d 74 79 70 65 20 21 0a 20 20 20 20 73 22  rt-type !.    s"
4db0: 20 23 72 65 76 6f 6b 65 64 22 20 64 75 70 20 3e   #revoked" dup >
4dc0: 72 20 6b 65 2d 6e 69 63 6b 20 24 2b 21 0a 20 20  r ke-nick $+!.  
4dd0: 20 20 6b 65 2d 6e 69 63 6b 20 24 40 20 72 3e 20    ke-nick $@ r> 
4de0: 2d 20 6b 65 2d 70 72 6f 66 20 24 40 20 6b 65 2d  - ke-prof $@ ke-
4df0: 70 73 6b 20 73 65 63 40 20 6b 65 2d 73 69 67 73  psk sec@ ke-sigs
4e00: 20 6b 65 2d 74 79 70 65 20 40 0a 20 20 20 20 72   ke-type @.    r
4e10: 65 76 2d 61 64 64 72 20 70 6b 72 6b 23 20 6b 65  ev-addr pkrk# ke
4e20: 79 3f 6e 65 77 20 3e 6f 0a 20 20 20 20 6b 65 2d  y?new >o.    ke-
4e30: 74 79 70 65 20 21 20 5b 3a 20 6b 65 2d 73 69 67  type ! [: ke-sig
4e40: 73 20 24 2b 5b 5d 21 20 3b 5d 20 24 5b 5d 6d 61  s $+[]! ;] $[]ma
4e50: 70 20 6b 65 2d 70 73 6b 20 73 65 63 21 20 6b 65  p ke-psk sec! ke
4e60: 2d 70 72 6f 66 20 24 21 20 6b 65 2d 6e 69 63 6b  -prof $! ke-nick
4e70: 20 24 21 0a 20 20 20 20 72 65 76 2d 61 64 64 72   $!.    rev-addr
4e80: 20 70 6b 72 6b 23 20 6b 65 2d 70 6b 20 24 21 0a   pkrk# ke-pk $!.
4e90: 20 20 20 20 72 65 76 2d 61 64 64 72 20 75 20 2b      rev-addr u +
4ea0: 20 31 2d 20 64 75 70 20 63 40 20 32 2a 20 2d 20   1- dup c@ 2* - 
4eb0: 24 31 30 20 2d 20 24 31 30 20 6b 65 2d 73 65 6c  $10 - $10 ke-sel
4ec0: 66 73 69 67 20 24 21 0a 20 20 20 20 6b 65 79 28  fsig $!.    key(
4ed0: 20 2e 22 20 77 69 74 68 3a 22 20 63 72 20 6f 20   ." with:" cr o 
4ee0: 63 65 6c 6c 2d 20 30 20 2e 6b 65 79 20 29 20 6f  cell- 0 .key ) o
4ef0: 20 6f 3e 0a 20 20 20 20 69 6d 70 6f 72 74 23 75   o>.    import#u
4f00: 6e 74 72 75 73 74 65 64 20 69 6d 70 6f 72 74 2d  ntrusted import-
4f10: 74 79 70 65 20 21 20 3b 0a 0a 3a 20 72 65 6e 65  type ! ;..: rene
4f20: 77 2d 6b 65 79 20 28 20 72 65 76 61 64 64 72 20  w-key ( revaddr 
4f30: 75 31 20 6b 65 79 61 64 64 72 20 75 32 20 2d 2d  u1 keyaddr u2 --
4f40: 20 6f 20 29 0a 20 20 20 20 63 75 72 72 65 6e 74   o ).    current
4f50: 2d 6b 65 79 20 3e 6f 20 72 65 70 6c 61 63 65 2d  -key >o replace-
4f60: 6b 65 79 20 6f 3e 0a 20 20 20 20 3e 6f 20 73 6b  key o>.    >o sk
4f70: 63 20 6b 65 79 73 69 7a 65 20 6b 65 2d 73 6b 20  c keysize ke-sk 
4f80: 73 65 63 21 20 6f 20 6f 3e 20 3b 0a 0a 5c 20 72  sec! o o> ;..\ r
4f90: 65 76 6f 6b 61 74 69 6f 6e 0a 0a 34 20 64 61 74  evokation..4 dat
4fa0: 65 73 69 7a 65 23 20 2b 20 6b 65 79 73 69 7a 65  esize# + keysize
4fb0: 20 39 20 2a 20 2b 20 43 6f 6e 73 74 61 6e 74 20   9 * + Constant 
4fc0: 72 65 76 73 69 7a 65 23 0a 0a 56 61 72 69 61 62  revsize#..Variab
4fd0: 6c 65 20 72 65 76 74 6f 6b 65 6e 0a 0a 3a 20 30  le revtoken..: 0
4fe0: 6f 6c 64 6b 65 79 20 28 20 2d 2d 20 29 20 5c 20  oldkey ( -- ) \ 
4ff0: 70 75 62 6b 65 79 73 20 63 61 6e 20 73 74 61 79  pubkeys can stay
5000: 0a 20 20 20 20 6f 6c 64 73 6b 63 20 6b 65 79 73  .    oldskc keys
5010: 69 7a 65 20 65 72 61 73 65 20 20 6f 6c 64 73 6b  ize erase  oldsk
5020: 72 65 76 20 6b 65 79 73 69 7a 65 20 65 72 61 73  rev keysize eras
5030: 65 20 3b 0a 0a 3a 20 6b 65 79 6d 6f 76 65 20 28  e ;..: keymove (
5040: 20 61 64 64 72 31 20 61 64 64 72 32 20 2d 2d 20   addr1 addr2 -- 
5050: 29 20 20 6b 65 79 73 69 7a 65 20 6d 6f 76 65 20  )  keysize move 
5060: 3b 0a 0a 3a 20 72 65 76 6f 6b 65 2d 76 65 72 69  ;..: revoke-veri
5070: 66 79 20 28 20 61 64 64 72 20 75 31 20 70 6b 20  fy ( addr u1 pk 
5080: 73 74 72 69 6e 67 20 75 32 20 2d 2d 20 61 64 64  string u2 -- add
5090: 72 20 75 20 66 6c 61 67 20 29 20 72 6f 74 20 3e  r u flag ) rot >
50a0: 72 20 32 3e 72 20 63 3a 30 6b 65 79 0a 20 20 20  r 2>r c:0key.   
50b0: 20 73 69 67 6f 6e 6c 79 73 69 7a 65 23 20 2d 20   sigonlysize# - 
50c0: 32 64 75 70 20 32 72 3e 20 3e 6b 65 79 65 64 2d  2dup 2r> >keyed-
50d0: 68 61 73 68 0a 20 20 20 20 73 69 67 64 61 74 65  hash.    sigdate
50e0: 20 2b 64 61 74 65 0a 20 20 20 20 32 64 75 70 20   +date.    2dup 
50f0: 2b 20 72 3e 20 65 64 2d 76 65 72 69 66 79 20 3b  + r> ed-verify ;
5100: 0a 0a 3a 20 3e 72 65 76 6f 6b 65 20 28 20 73 6b  ..: >revoke ( sk
5110: 72 65 76 20 2d 2d 20 29 20 20 73 6b 72 65 76 20  rev -- )  skrev 
5120: 6b 65 79 6d 6f 76 65 20 20 63 68 65 63 6b 2d 72  keymove  check-r
5130: 65 76 3f 20 30 3d 20 21 21 6e 6f 74 2d 6d 79 2d  ev? 0= !!not-my-
5140: 72 65 76 73 6b 21 21 20 3b 0a 0a 3a 20 2b 72 65  revsk!! ;..: +re
5150: 76 73 69 67 6e 20 28 20 73 6b 20 70 6b 20 2d 2d  vsign ( sk pk --
5160: 20 29 20 20 73 6b 73 69 67 20 2d 72 6f 74 20 65   )  sksig -rot e
5170: 64 2d 73 69 67 6e 20 72 65 76 74 6f 6b 65 6e 20  d-sign revtoken 
5180: 24 2b 21 20 62 6c 20 72 65 76 74 6f 6b 65 6e 20  $+! bl revtoken 
5190: 63 24 2b 21 20 3b 0a 0a 3a 20 73 69 67 6e 2d 74  c$+! ;..: sign-t
51a0: 6f 6b 65 6e 2c 20 28 20 73 6b 20 70 6b 20 73 74  oken, ( sk pk st
51b0: 72 69 6e 67 20 75 32 20 2d 2d 20 29 0a 20 20 20  ring u2 -- ).   
51c0: 20 63 3a 30 6b 65 79 20 72 65 76 74 6f 6b 65 6e   c:0key revtoken
51d0: 20 24 40 20 32 73 77 61 70 20 3e 6b 65 79 65 64   $@ 2swap >keyed
51e0: 2d 68 61 73 68 0a 20 20 20 20 73 69 67 64 61 74  -hash.    sigdat
51f0: 65 20 2b 64 61 74 65 20 2b 72 65 76 73 69 67 6e  e +date +revsign
5200: 20 3b 0a 0a 3a 20 72 65 76 6f 6b 65 2d 6b 65 79   ;..: revoke-key
5210: 20 28 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20   ( -- addr u ). 
5220: 20 20 20 73 6b 63 20 6f 6c 64 73 6b 63 20 6b 65     skc oldskc ke
5230: 79 6d 6f 76 65 20 20 70 6b 63 20 6f 6c 64 70 6b  ymove  pkc oldpk
5240: 63 20 6b 65 79 6d 6f 76 65 20 20 73 6b 72 65 76  c keymove  skrev
5250: 20 6f 6c 64 73 6b 72 65 76 20 6b 65 79 6d 6f 76   oldskrev keymov
5260: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 62               \ b
5290: 61 63 6b 75 70 20 6b 65 79 73 0a 20 20 20 20 6f  ackup keys.    o
52a0: 6c 64 73 6b 72 65 76 20 6f 6c 64 70 6b 72 65 76  ldskrev oldpkrev
52b0: 20 73 6b 3e 70 6b 20 20 20 20 20 20 20 20 20 20   sk>pk          
52c0: 20 20 20 20 20 20 5c 20 67 65 6e 65 72 61 74 65        \ generate
52d0: 20 72 65 76 6f 6b 61 74 69 6f 6e 20 70 75 62 6b   revokation pubk
52e0: 65 79 0a 20 20 20 20 67 65 6e 2d 6b 65 79 73 20  ey.    gen-keys 
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20                \ 
5310: 67 65 6e 65 72 61 74 65 20 6e 65 77 20 6b 65 79  generate new key
5320: 73 0a 20 20 20 20 70 6b 63 20 6b 65 79 73 69 7a  s.    pkc keysiz
5330: 65 32 20 72 65 76 74 6f 6b 65 6e 20 24 21 20 20  e2 revtoken $!  
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 6d               \ m
5350: 79 20 6e 65 77 20 6b 65 79 0a 20 20 20 20 6f 6c  y new key.    ol
5360: 64 70 6b 72 65 76 20 6b 65 79 73 69 7a 65 20 72  dpkrev keysize r
5370: 65 76 74 6f 6b 65 6e 20 24 2b 21 20 20 20 20 20  evtoken $+!     
5380: 20 20 20 20 20 5c 20 72 65 76 6f 6b 65 20 74 6f       \ revoke to
5390: 6b 65 6e 0a 20 20 20 20 6f 6c 64 73 6b 72 65 76  ken.    oldskrev
53a0: 20 6f 6c 64 70 6b 72 65 76 20 22 72 65 76 6f 6b   oldpkrev "revok
53b0: 65 22 20 73 69 67 6e 2d 74 6f 6b 65 6e 2c 20 5c  e" sign-token, \
53c0: 20 72 65 76 6f 6b 65 20 73 69 67 6e 61 74 75 72   revoke signatur
53d0: 65 0a 20 20 20 20 73 6b 63 20 70 6b 63 20 22 73  e.    skc pkc "s
53e0: 65 6c 66 73 69 67 6e 22 20 73 69 67 6e 2d 74 6f  elfsign" sign-to
53f0: 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 5c 20 73  ken,         \ s
5400: 65 6c 66 20 73 69 67 6e 65 64 20 77 69 74 68 20  elf signed with 
5410: 6e 65 77 20 6b 65 79 0a 20 20 20 20 22 21 22 20  new key.    "!" 
5420: 72 65 76 74 6f 6b 65 6e 20 30 20 24 69 6e 73 20  revtoken 0 $ins 
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 20 5c 20 22 21 22 20 2b 20 6f 6c 64 6b 65     \ "!" + oldke
5450: 79 6c 65 6e 2b 6e 65 77 6b 65 79 6c 65 6e 20 74  ylen+newkeylen t
5460: 6f 20 66 6c 61 67 20 72 65 76 6f 6b 61 74 69 6f  o flag revokatio
5470: 6e 0a 20 20 20 20 72 65 76 74 6f 6b 65 6e 20 24  n.    revtoken $
5480: 40 20 67 65 6e 3e 68 6f 73 74 20 32 64 72 6f 70  @ gen>host 2drop
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 73               \ s
54a0: 69 67 6e 20 68 6f 73 74 20 69 6e 66 6f 72 6d 61  ign host informa
54b0: 74 69 6f 6e 20 77 69 74 68 20 6f 6c 64 20 6b 65  tion with old ke
54c0: 79 0a 20 20 20 20 73 69 67 64 61 74 65 20 2b 64  y.    sigdate +d
54d0: 61 74 65 20 73 69 67 64 61 74 65 20 64 61 74 65  ate sigdate date
54e0: 73 69 7a 65 23 20 72 65 76 74 6f 6b 65 6e 20 24  size# revtoken $
54f0: 2b 21 0a 20 20 20 20 6f 6c 64 73 6b 63 20 6f 6c  +!.    oldskc ol
5500: 64 70 6b 63 20 2b 72 65 76 73 69 67 6e 0a 20 20  dpkc +revsign.  
5510: 20 20 30 6f 6c 64 6b 65 79 20 72 65 76 74 6f 6b    0oldkey revtok
5520: 65 6e 20 24 40 20 3b 0a 0a 5c 20 69 6e 76 69 74  en $@ ;..\ invit
5530: 61 74 69 6f 6e 0a 0a 56 61 72 69 61 62 6c 65 20  ation..Variable 
5540: 69 6e 76 69 74 61 74 69 6f 6e 73 0a 56 61 72 69  invitations.Vari
5550: 61 62 6c 65 20 62 6c 6f 63 6b 2d 74 61 62 6c 65  able block-table
5560: 0a 0a 65 76 65 6e 74 3a 20 2d 3e 69 6e 76 69 74  ..event: ->invit
5570: 65 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a  e ( addr u -- ).
5580: 20 20 20 20 2e 22 20 69 6e 76 69 74 65 20 6d 65      ." invite me
5590: 3a 20 22 20 6f 76 65 72 20 3e 72 20 2e 70 6b 32  : " over >r .pk2
55a0: 6b 65 79 24 20 72 3e 20 66 72 65 65 20 74 68 72  key$ r> free thr
55b0: 6f 77 20 63 74 72 6c 20 4c 20 69 6e 73 6b 65 79  ow ctrl L inskey
55c0: 20 3b 0a 65 76 65 6e 74 3a 20 2d 3e 77 61 6b 65   ;.event: ->wake
55d0: 6d 65 20 28 20 6f 20 2d 2d 20 29 20 3c 65 76 65  me ( o -- ) <eve
55e0: 6e 74 20 2d 3e 77 61 6b 65 20 65 76 65 6e 74 3e  nt ->wake event>
55f0: 20 3b 0a 0a 3a 20 70 6b 32 6b 65 79 24 2d 61 64   ;..: pk2key$-ad
5600: 64 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a  d ( addr u -- ).
5610: 20 20 20 20 73 61 6d 70 6c 65 2d 6b 65 79 20 3e      sample-key >
5620: 6f 20 69 6d 70 6f 72 74 23 69 6e 76 69 74 65 64  o import#invited
5630: 20 69 6d 70 6f 72 74 2d 74 79 70 65 20 21 20 63   import-type ! c
5640: 6d 64 3a 6e 65 73 74 73 69 67 20 6f 3e 0a 20 20  md:nestsig o>.  
5650: 20 20 69 6d 70 6f 72 74 23 75 6e 74 72 75 73 74    import#untrust
5660: 65 64 20 69 6d 70 6f 72 74 2d 74 79 70 65 20 21  ed import-type !
5670: 20 20 73 61 76 65 2d 70 75 62 6b 65 79 73 20 3b    save-pubkeys ;
5680: 0a 0a 3a 20 62 6c 6f 63 6b 2d 61 64 64 20 28 20  ..: block-add ( 
5690: 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20  addr u -- ).    
56a0: 73 69 67 70 6b 32 73 69 7a 65 23 20 2d 20 2b 20  sigpk2size# - + 
56b0: 6b 65 79 73 69 7a 65 20 32 64 75 70 20 62 6c 6f  keysize 2dup blo
56c0: 63 6b 2d 74 61 62 6c 65 20 23 21 0a 20 20 20 20  ck-table #!.    
56d0: 28 20 74 62 64 3a 20 73 61 76 65 2d 62 6c 6f 63  ( tbd: save-bloc
56e0: 6b 6c 69 73 74 20 29 20 3b 0a 0a 3a 20 70 72 6f  klist ) ;..: pro
56f0: 63 65 73 73 2d 69 6e 76 69 74 61 74 69 6f 6e 20  cess-invitation 
5700: 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20  ( addr u -- ).  
5710: 20 20 6b 65 79 20 63 61 73 65 0a 09 27 79 27 20    key case..'y' 
5720: 6f 66 20 20 70 6b 32 6b 65 79 24 2d 61 64 64 20  of  pk2key$-add 
5730: 2e 22 20 61 64 64 65 64 22 20 20 20 20 65 6e 64  ." added"    end
5740: 6f 66 0a 09 27 6e 27 20 6f 66 20 20 32 64 72 6f  of..'n' of  2dro
5750: 70 20 20 20 20 20 20 20 2e 22 20 69 67 6e 6f 72  p       ." ignor
5760: 65 64 22 20 20 65 6e 64 6f 66 0a 09 27 62 27 20  ed"  endof..'b' 
5770: 6f 66 20 20 62 6c 6f 63 6b 2d 61 64 64 20 20 20  of  block-add   
5780: 2e 22 20 62 6c 6f 63 6b 65 64 22 20 20 65 6e 64  ." blocked"  end
5790: 6f 66 0a 09 32 64 72 6f 70 0a 20 20 20 20 65 6e  of..2drop.    en
57a0: 64 63 61 73 65 20 3b 0a 0a 3a 20 66 69 6c 74 65  dcase ;..: filte
57b0: 72 2d 69 6e 76 69 74 61 74 69 6f 6e 3f 20 28 20  r-invitation? ( 
57c0: 61 64 64 72 20 75 20 2d 2d 20 66 6c 61 67 20 29  addr u -- flag )
57d0: 0a 20 20 20 20 73 69 67 70 6b 32 73 69 7a 65 23  .    sigpk2size#
57e0: 20 2d 20 2b 0a 20 20 20 20 64 75 70 20 6b 65 79   - +.    dup key
57f0: 73 69 7a 65 20 62 6c 6f 63 6b 2d 74 61 62 6c 65  size block-table
5800: 20 23 40 20 6e 69 70 20 6b 65 79 73 69 7a 65 20   #@ nip keysize 
5810: 3d 0a 20 20 20 20 49 46 20 64 72 6f 70 20 74 72  =.    IF drop tr
5820: 75 65 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20  ue  EXIT  THEN. 
5830: 20 20 20 6b 65 79 73 69 7a 65 20 6b 65 79 2d 74     keysize key-t
5840: 61 62 6c 65 20 23 40 20 64 30 3c 3e 20 3b 20 5c  able #@ d0<> ; \
5850: 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 0a 0a   already there..
5860: 3a 20 2e 69 6e 76 69 74 61 74 69 6f 6e 73 20 28  : .invitations (
5870: 20 2d 2d 20 29 0a 20 20 20 20 69 6e 76 69 74 61   -- ).    invita
5880: 74 69 6f 6e 73 20 5b 3a 20 2e 22 20 69 6e 76 69  tions [: ." invi
5890: 74 65 20 28 79 2f 6e 2f 62 29 3f 20 22 20 32 64  te (y/n/b)? " 2d
58a0: 75 70 20 2e 70 6b 32 6b 65 79 24 20 70 72 6f 63  up .pk2key$ proc
58b0: 65 73 73 2d 69 6e 76 69 74 61 74 69 6f 6e 0a 20  ess-invitation. 
58c0: 20 20 20 3b 5d 20 24 5b 5d 6d 61 70 20 20 69 6e     ;] $[]map  in
58d0: 76 69 74 61 74 69 6f 6e 73 20 24 5b 5d 6f 66 66  vitations $[]off
58e0: 20 3b 0a 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61 64   ;..:noname ( ad
58f0: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 32 64  dr u -- ).    2d
5900: 75 70 20 66 69 6c 74 65 72 2d 69 6e 76 69 74 61  up filter-invita
5910: 74 69 6f 6e 3f 20 49 46 20 20 32 64 72 6f 70 20  tion? IF  2drop 
5920: 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 32  EXIT  THEN.    2
5930: 64 75 70 20 69 6e 76 69 74 61 74 69 6f 6e 73 20  dup invitations 
5940: 24 69 6e 73 5b 5d 73 69 67 20 73 61 76 65 2d 6d  $ins[]sig save-m
5950: 65 6d 20 5b 20 75 70 40 20 5d 6c 20 3c 68 69 64  em [ up@ ]l <hid
5960: 65 3e 0a 20 20 20 20 3c 65 76 65 6e 74 20 65 24  e>.    <event e$
5970: 2c 20 2d 3e 69 6e 76 69 74 65 20 75 70 40 20 65  , ->invite up@ e
5980: 6c 69 74 2c 20 2d 3e 77 61 6b 65 6d 65 20 5b 20  lit, ->wakeme [ 
5990: 75 70 40 20 5d 6c 20 65 76 65 6e 74 3e 20 73 74  up@ ]l event> st
59a0: 6f 70 0a 3b 20 69 73 20 3e 69 6e 76 69 74 61 74  op.; is >invitat
59b0: 69 6f 6e 73 0a 3a 20 73 65 6e 64 2d 69 6e 76 69  ions.: send-invi
59c0: 74 61 74 69 6f 6e 20 28 20 70 6b 20 75 20 2d 2d  tation ( pk u --
59d0: 20 29 0a 20 20 20 20 73 65 74 75 70 21 20 6d 79   ).    setup! my
59e0: 70 6b 32 6e 69 63 6b 24 20 32 3e 72 0a 20 20 20  pk2nick$ 2>r.   
59f0: 20 67 65 6e 2d 74 6d 70 6b 65 79 73 20 64 72 6f   gen-tmpkeys dro
5a00: 70 20 74 73 6b 63 20 73 77 61 70 20 6b 65 79 70  p tskc swap keyp
5a10: 61 64 20 65 64 2d 64 68 20 64 6f 2d 6b 65 79 70  ad ed-dh do-keyp
5a20: 61 64 20 73 65 63 21 0a 20 20 20 20 6e 65 74 32  ad sec!.    net2
5a30: 6f 2d 63 6f 64 65 30 0a 20 20 20 20 74 70 6b 63  o-code0.    tpkc
5a40: 20 6b 65 79 73 69 7a 65 20 24 2c 20 6f 6e 65 73   keysize $, ones
5a50: 68 6f 74 2d 74 6d 70 6b 65 79 0a 20 20 20 20 6e  hot-tmpkey.    n
5a60: 65 73 74 5b 20 32 72 3e 20 24 2c 20 69 6e 76 69  est[ 2r> $, invi
5a70: 74 65 20 5d 74 6d 70 6e 65 73 74 0a 20 20 20 20  te ]tmpnest.    
5a80: 63 6f 6f 6b 69 65 2b 72 65 71 75 65 73 74 0a 20  cookie+request. 
5a90: 20 20 20 65 6e 64 2d 63 6f 64 65 7c 20 3b 0a 0a     end-code| ;..
5aa0: 30 20 5b 49 46 5d 0a 4c 6f 63 61 6c 20 56 61 72  0 [IF].Local Var
5ab0: 69 61 62 6c 65 73 3a 0a 66 6f 72 74 68 2d 6c 6f  iables:.forth-lo
5ac0: 63 61 6c 2d 77 6f 72 64 73 3a 0a 20 20 20 20 28  cal-words:.    (
5ad0: 0a 20 20 20 20 20 28 28 22 6e 65 74 32 6f 3a 22  .     (("net2o:"
5ae0: 20 22 2b 6e 65 74 32 6f 3a 22 29 20 64 65 66 69   "+net2o:") defi
5af0: 6e 69 74 69 6f 6e 2d 73 74 61 72 74 65 72 20 28  nition-starter (
5b00: 66 6f 6e 74 2d 6c 6f 63 6b 2d 6b 65 79 77 6f 72  font-lock-keywor
5b10: 64 2d 66 61 63 65 20 2e 20 31 29 0a 20 20 20 20  d-face . 1).    
5b20: 20 20 22 5b 20 5c 74 5c 6e 5d 22 20 74 20 6e 61    "[ \t\n]" t na
5b30: 6d 65 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 66 75  me (font-lock-fu
5b40: 6e 63 74 69 6f 6e 2d 6e 61 6d 65 2d 66 61 63 65  nction-name-face
5b50: 20 2e 20 33 29 29 0a 20 20 20 20 20 28 28 22 64   . 3)).     (("d
5b60: 65 62 75 67 3a 22 20 22 66 69 65 6c 64 3a 22 20  ebug:" "field:" 
5b70: 22 32 66 69 65 6c 64 3a 22 20 22 73 66 66 69 65  "2field:" "sffie
5b80: 6c 64 3a 22 20 22 64 66 66 69 65 6c 64 3a 22 20  ld:" "dffield:" 
5b90: 22 36 34 66 69 65 6c 64 3a 22 20 22 75 76 61 72  "64field:" "uvar
5ba0: 22 20 22 75 76 61 6c 75 65 22 29 20 6e 6f 6e 2d  " "uvalue") non-
5bb0: 69 6d 6d 65 64 69 61 74 65 20 28 66 6f 6e 74 2d  immediate (font-
5bc0: 6c 6f 63 6b 2d 74 79 70 65 2d 66 61 63 65 20 2e  lock-type-face .
5bd0: 20 32 29 0a 20 20 20 20 20 20 22 5b 20 5c 74 5c   2).      "[ \t\
5be0: 6e 5d 22 20 74 20 6e 61 6d 65 20 28 66 6f 6e 74  n]" t name (font
5bf0: 2d 6c 6f 63 6b 2d 76 61 72 69 61 62 6c 65 2d 6e  -lock-variable-n
5c00: 61 6d 65 2d 66 61 63 65 20 2e 20 33 29 29 0a 20  ame-face . 3)). 
5c10: 20 20 20 20 28 22 5b 61 2d 7a 30 2d 39 5d 2b 28      ("[a-z0-9]+(
5c20: 22 20 69 6d 6d 65 64 69 61 74 65 20 28 66 6f 6e  " immediate (fon
5c30: 74 2d 6c 6f 63 6b 2d 63 6f 6d 6d 65 6e 74 2d 66  t-lock-comment-f
5c40: 61 63 65 20 2e 20 31 29 0a 20 20 20 20 20 20 22  ace . 1).      "
5c50: 29 22 20 6e 69 6c 20 63 6f 6d 6d 65 6e 74 20 28  )" nil comment (
5c60: 66 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f 6d 6d 65 6e  font-lock-commen
5c70: 74 2d 66 61 63 65 20 2e 20 31 29 29 0a 20 20 20  t-face . 1)).   
5c80: 20 29 0a 66 6f 72 74 68 2d 6c 6f 63 61 6c 2d 69   ).forth-local-i
5c90: 6e 64 65 6e 74 2d 77 6f 72 64 73 3a 0a 20 20 20  ndent-words:.   
5ca0: 20 28 0a 20 20 20 20 20 28 28 22 6e 65 74 32 6f   (.     (("net2o
5cb0: 3a 22 20 22 2b 6e 65 74 32 6f 3a 22 29 20 28 30  :" "+net2o:") (0
5cc0: 20 2e 20 32 29 20 28 30 20 2e 20 32 29 20 6e 6f   . 2) (0 . 2) no
5cd0: 6e 2d 69 6d 6d 65 64 69 61 74 65 29 0a 20 20 20  n-immediate).   
5ce0: 20 20 28 28 22 5b 3a 22 20 22 6b 65 79 3a 63 6f    (("[:" "key:co
5cf0: 64 65 22 29 20 28 30 20 2e 20 31 29 20 28 30 20  de") (0 . 1) (0 
5d00: 2e 20 31 29 20 69 6d 6d 65 64 69 61 74 65 29 0a  . 1) immediate).
5d10: 20 20 20 20 20 28 28 22 3b 5d 22 20 22 65 6e 64       ((";]" "end
5d20: 3a 6b 65 79 22 29 20 28 2d 31 20 2e 20 30 29 20  :key") (-1 . 0) 
5d30: 28 30 20 2e 20 2d 31 29 20 69 6d 6d 65 64 69 61  (0 . -1) immedia
5d40: 74 65 29 0a 20 20 20 20 29 0a 45 6e 64 3a 0a 5b  te).    ).End:.[
5d50: 54 48 45 4e 5d                                   THEN]