Hex Artifact Content
Not logged in

Artifact 99d51ac8c279393c667bc375908abe3eba9c2e62:


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 5b 49 46 44  word entry..[IFD
0300: 45 46 5d 20 61 6e 64 72 6f 69 64 20 27 2a 27 20  EF] android '*' 
0310: 5b 45 4c 53 45 5d 20 27 e2 ac a4 27 20 5b 54 48  [ELSE] '⬤' [TH
0320: 45 4e 5d 20 43 6f 6e 73 74 61 6e 74 20 70 77 2a  EN] Constant pw*
0330: 0a 0a 78 63 2d 76 65 63 74 6f 72 20 75 70 40 20  ..xc-vector up@ 
0340: 2d 20 63 6c 61 73 73 2d 6f 20 21 0a 0a 30 20 63  - class-o !..0 c
0350: 65 6c 6c 20 75 76 61 72 20 65 73 63 2d 73 74 61  ell uvar esc-sta
0360: 74 65 20 64 72 6f 70 0a 0a 44 65 66 65 72 20 6f  te drop..Defer o
0370: 6c 64 2d 65 6d 69 74 20 20 77 68 61 74 27 73 20  ld-emit  what's 
0380: 65 6d 69 74 20 69 73 20 6f 6c 64 2d 65 6d 69 74  emit is old-emit
0390: 0a 0a 68 65 72 65 0a 78 63 2d 76 65 63 74 6f 72  ..here.xc-vector
03a0: 20 40 20 63 65 6c 6c 2d 20 64 75 70 20 40 20 74   @ cell- dup @ t
03b0: 75 63 6b 20 2d 20 68 65 72 65 20 73 77 61 70 20  uck - here swap 
03c0: 64 75 70 20 61 6c 6c 6f 74 20 6d 6f 76 65 0a 2c  dup allot move.,
03d0: 20 68 65 72 65 20 30 20 2c 20 43 6f 6e 73 74 61   here 0 , Consta
03e0: 6e 74 20 75 74 66 2d 38 2a 0a 0a 3a 20 2a 2d 77  nt utf-8*..: *-w
03f0: 69 64 74 68 20 28 20 61 64 64 72 20 75 20 2d 2d  idth ( addr u --
0400: 20 6e 20 29 0a 20 20 20 20 30 20 2d 72 6f 74 20   n ).    0 -rot 
0410: 62 6f 75 6e 64 73 20 3f 44 4f 20 20 49 20 63 40  bounds ?DO  I c@
0420: 20 24 43 30 20 24 38 30 20 77 69 74 68 69 6e 20   $C0 $80 within 
0430: 2d 20 20 4c 4f 4f 50 20 3b 0a 0a 78 63 2d 76 65  -  LOOP ;..xc-ve
0440: 63 74 6f 72 20 40 20 20 75 74 66 2d 38 2a 20 78  ctor @  utf-8* x
0450: 63 2d 76 65 63 74 6f 72 20 21 20 27 20 2a 2d 77  c-vector ! ' *-w
0460: 69 64 74 68 20 69 73 20 78 2d 77 69 64 74 68 20  idth is x-width 
0470: 20 78 63 2d 76 65 63 74 6f 72 20 21 0a 0a 3a 20   xc-vector !..: 
0480: 65 6d 69 74 2d 70 77 2a 20 28 20 6e 20 2d 2d 20  emit-pw* ( n -- 
0490: 29 0a 20 20 20 20 64 75 70 20 23 65 73 63 20 3d  ).    dup #esc =
04a0: 20 49 46 20 20 65 73 63 2d 73 74 61 74 65 20 6f   IF  esc-state o
04b0: 6e 20 20 54 48 45 4e 0a 20 20 20 20 64 75 70 20  n  THEN.    dup 
04c0: 62 6c 20 3c 20 49 46 20 20 6f 6c 64 2d 65 6d 69  bl < IF  old-emi
04d0: 74 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20  t  EXIT  THEN.  
04e0: 20 20 64 75 70 20 65 73 63 2d 73 74 61 74 65 20    dup esc-state 
04f0: 40 20 49 46 20 20 6f 6c 64 2d 65 6d 69 74 0a 20  @ IF  old-emit. 
0500: 20 20 20 45 4c 53 45 20 20 24 43 30 20 24 38 30     ELSE  $C0 $80
0510: 20 77 69 74 68 69 6e 20 49 46 0a 09 20 20 20 20   within IF..    
0520: 5b 20 70 77 2a 20 27 20 78 65 6d 69 74 20 24 74  [ pw* ' xemit $t
0530: 6d 70 0a 09 20 20 20 20 62 6f 75 6e 64 73 20 5b  mp..    bounds [
0540: 3f 44 4f 5d 20 5b 49 5d 20 63 40 20 5d 4c 20 6f  ?DO] [I] c@ ]L o
0550: 6c 64 2d 65 6d 69 74 20 5b 20 5b 4c 4f 4f 50 5d  ld-emit [ [LOOP]
0560: 20 5d 0a 09 54 48 45 4e 0a 20 20 20 20 54 48 45   ]..THEN.    THE
0570: 4e 0a 20 20 20 20 74 6f 75 70 70 65 72 20 27 41  N.    toupper 'A
0580: 27 20 27 5b 27 20 77 69 74 68 69 6e 20 49 46 20  ' '[' within IF 
0590: 20 65 73 63 2d 73 74 61 74 65 20 6f 66 66 20 20   esc-state off  
05a0: 54 48 45 4e 20 3b 0a 0a 3a 20 74 79 70 65 2d 70  THEN ;..: type-p
05b0: 77 2a 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29  w* ( addr u -- )
05c0: 20 20 32 64 75 70 20 62 6c 20 73 6b 69 70 20 6e    2dup bl skip n
05d0: 69 70 20 30 3d 0a 20 20 20 20 49 46 20 20 20 20  ip 0=.    IF    
05e0: 62 6f 75 6e 64 73 20 55 2b 44 4f 20 20 62 6c 20  bounds U+DO  bl 
05f0: 6f 6c 64 2d 65 6d 69 74 20 20 20 20 4c 4f 4f 50  old-emit    LOOP
0600: 0a 20 20 20 20 45 4c 53 45 20 20 62 6f 75 6e 64  .    ELSE  bound
0610: 73 20 55 2b 44 4f 20 20 49 20 63 40 20 65 6d 69  s U+DO  I c@ emi
0620: 74 2d 70 77 2a 20 20 4c 4f 4f 50 20 20 54 48 45  t-pw*  LOOP  THE
0630: 4e 20 3b 0a 0a 3a 20 61 63 63 65 70 74 2a 20 28  N ;..: accept* (
0640: 20 61 64 64 72 20 75 20 2d 2d 20 75 27 20 29 0a   addr u -- u' ).
0650: 20 20 20 20 5c 47 20 61 63 63 65 70 74 2d 6c 69      \G accept-li
0660: 6b 65 20 69 6e 70 75 74 2c 20 62 75 74 20 74 79  ke input, but ty
0670: 70 65 73 20 2a 20 69 6e 73 74 65 61 64 20 6f 66  pes * instead of
0680: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 0a 20   the character. 
0690: 20 20 20 5c 47 20 64 6f 6e 27 74 20 73 61 76 65     \G don't save
06a0: 20 69 6e 74 6f 20 68 69 73 74 6f 72 79 0a 20 20   into history.  
06b0: 20 20 68 69 73 74 6f 72 79 20 3e 72 20 20 77 68    history >r  wh
06c0: 61 74 27 73 20 74 79 70 65 20 3e 72 20 20 77 68  at's type >r  wh
06d0: 61 74 27 73 20 65 6d 69 74 20 69 73 20 6f 6c 64  at's emit is old
06e0: 2d 65 6d 69 74 0a 20 20 20 20 75 74 66 2d 38 2a  -emit.    utf-8*
06f0: 20 78 63 2d 76 65 63 74 6f 72 20 21 40 20 3e 72   xc-vector !@ >r
0700: 20 20 5b 27 5d 20 74 79 70 65 2d 70 77 2a 20 69    ['] type-pw* i
0710: 73 20 74 79 70 65 20 20 5b 27 5d 20 65 6d 69 74  s type  ['] emit
0720: 2d 70 77 2a 20 69 73 20 65 6d 69 74 0a 20 20 20  -pw* is emit.   
0730: 20 30 20 74 6f 20 68 69 73 74 6f 72 79 0a 20 20   0 to history.  
0740: 20 20 5b 27 5d 20 61 63 63 65 70 74 20 63 61 74    ['] accept cat
0750: 63 68 0a 20 20 20 20 72 3e 20 78 63 2d 76 65 63  ch.    r> xc-vec
0760: 74 6f 72 20 21 20 20 77 68 61 74 27 73 20 6f 6c  tor !  what's ol
0770: 64 2d 65 6d 69 74 20 69 73 20 65 6d 69 74 20 20  d-emit is emit  
0780: 72 3e 20 69 73 20 74 79 70 65 20 20 72 3e 20 74  r> is type  r> t
0790: 6f 20 68 69 73 74 6f 72 79 0a 20 20 20 20 74 68  o history.    th
07a0: 72 6f 77 20 22 5c 62 20 22 20 74 79 70 65 20 3b  row "\b " type ;
07b0: 0a 0a 5c 20 4b 65 79 73 20 61 72 65 20 70 61 73  ..\ Keys are pas
07c0: 73 77 6f 72 64 73 20 61 6e 64 20 70 72 69 76 61  swords and priva
07d0: 74 65 20 6b 65 79 73 20 28 73 65 6c 66 2d 6b 65  te keys (self-ke
07e0: 79 65 64 2c 20 69 2e 65 2e 20 70 72 69 76 61 74  yed, i.e. privat
07f0: 65 2a 70 75 62 6c 69 63 20 6b 65 79 29 0a 0a 0a  e*public key)...
0800: 32 20 56 61 6c 75 65 20 70 77 2d 6c 65 76 65 6c  2 Value pw-level
0810: 23 20 5c 20 70 77 2d 6c 65 76 65 6c 23 20 30 20  # \ pw-level# 0 
0820: 69 73 20 6c 6f 77 65 73 74 0a 5c 20 21 21 54 4f  is lowest.\ !!TO
0830: 44 4f 21 21 20 77 65 20 6e 65 65 64 20 61 20 77  DO!! we need a w
0840: 61 79 20 74 6f 20 74 65 6c 6c 20 68 6f 77 20 6d  ay to tell how m
0850: 75 63 68 20 77 65 20 63 61 6e 20 74 72 75 73 74  uch we can trust
0860: 20 6b 65 79 73 0a 5c 20 70 61 73 73 77 6f 72 64   keys.\ password
0870: 73 20 6e 65 65 64 20 61 20 70 77 2d 6c 65 76 65  s need a pw-leve
0880: 6c 20 28 62 65 63 61 75 73 65 20 74 68 65 79 20  l (because they 
0890: 61 72 65 20 67 75 65 73 73 61 62 6c 65 29 0a 5c  are guessable).\
08a0: 20 73 65 63 72 65 74 73 20 64 6f 6e 27 74 2c 20   secrets don't, 
08b0: 74 68 65 79 20 61 72 65 6e 27 74 2e 20 57 65 20  they aren't. We 
08c0: 63 61 6e 20 71 75 69 63 6b 6c 79 20 64 65 63 72  can quickly decr
08d0: 79 70 74 20 61 6c 6c 0a 5c 20 73 65 63 72 65 74  ypt all.\ secret
08e0: 2d 62 61 73 65 64 20 73 74 75 66 66 2c 20 77 69  -based stuff, wi
08f0: 74 68 6f 75 74 20 62 6f 74 68 65 72 69 6e 67 20  thout bothering 
0900: 77 69 74 68 20 73 6c 6f 77 64 6f 77 6e 73 2e 0a  with slowdowns..
0910: 5c 20 53 6f 20 73 65 63 72 65 74 73 20 73 68 6f  \ So secrets sho
0920: 75 6c 64 20 75 73 65 20 6e 6f 72 6d 61 6c 20 73  uld use normal s
0930: 74 72 69 6e 67 20 64 65 63 72 79 70 74 0a 0a 63  tring decrypt..c
0940: 6d 64 2d 62 75 66 30 20 75 63 6c 61 73 73 20 63  md-buf0 uclass c
0950: 6d 64 62 75 66 2d 6f 0a 20 20 20 20 6d 61 78 64  mdbuf-o.    maxd
0960: 61 74 61 20 2d 0a 20 20 20 20 6b 65 79 2d 73 61  ata -.    key-sa
0970: 6c 74 23 20 75 76 61 72 20 6b 65 79 70 61 63 6b  lt# uvar keypack
0980: 0a 20 20 20 20 6b 65 79 70 61 63 6b 23 20 20 75  .    keypack#  u
0990: 76 61 72 20 6b 65 79 70 61 63 6b 2d 62 75 66 0a  var keypack-buf.
09a0: 20 20 20 20 6b 65 79 2d 63 6b 73 75 6d 23 20 75      key-cksum# u
09b0: 76 61 72 20 6b 65 79 70 61 63 6b 2d 63 68 6b 73  var keypack-chks
09c0: 75 6d 0a 65 6e 64 2d 63 6c 61 73 73 20 63 6d 64  um.end-class cmd
09d0: 2d 6b 65 79 62 75 66 2d 63 0a 0a 63 6d 64 2d 6b  -keybuf-c..cmd-k
09e0: 65 79 62 75 66 2d 63 20 6e 65 77 20 63 6f 64 65  eybuf-c new code
09f0: 2d 6b 65 79 5e 20 21 0a 27 20 63 6f 64 65 2d 6b  -key^ !.' code-k
0a00: 65 79 5e 20 63 6d 64 62 75 66 3a 20 63 6f 64 65  ey^ cmdbuf: code
0a10: 2d 6b 65 79 0a 0a 63 6f 64 65 2d 6b 65 79 0a 63  -key..code-key.c
0a20: 6d 64 30 6c 6f 63 6b 20 30 20 70 74 68 72 65 61  md0lock 0 pthrea
0a30: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 20 64 72 6f  d_mutex_init dro
0a40: 70 0a 0a 3a 6e 6f 6e 61 6d 65 20 28 20 2d 2d 20  p..:noname ( -- 
0a50: 61 64 64 72 20 75 20 29 20 6b 65 79 70 61 63 6b  addr u ) keypack
0a60: 2d 62 75 66 20 63 6d 64 62 75 66 23 20 40 20 3b  -buf cmdbuf# @ ;
0a70: 20 74 6f 20 63 6d 64 62 75 66 24 0a 3a 6e 6f 6e   to cmdbuf$.:non
0a80: 61 6d 65 20 28 20 2d 2d 20 6e 20 29 20 20 6b 65  ame ( -- n )  ke
0a90: 79 70 61 63 6b 23 20 63 6d 64 62 75 66 23 20 40  ypack# cmdbuf# @
0aa0: 20 2d 20 3b 20 74 6f 20 6d 61 78 73 74 72 69 6e   - ; to maxstrin
0ab0: 67 0a 0a 63 6f 64 65 30 2d 62 75 66 0a 0a 3a 6e  g..code0-buf..:n
0ac0: 6f 6e 61 6d 65 20 64 65 66 65 72 73 20 61 6c 6c  oname defers all
0ad0: 6f 63 2d 63 6f 64 65 2d 62 75 66 73 0a 20 20 20  oc-code-bufs.   
0ae0: 20 63 6d 64 2d 6b 65 79 62 75 66 2d 63 20 6e 65   cmd-keybuf-c ne
0af0: 77 20 63 6f 64 65 2d 6b 65 79 5e 20 21 20 3b 20  w code-key^ ! ; 
0b00: 69 73 20 61 6c 6c 6f 63 2d 63 6f 64 65 2d 62 75  is alloc-code-bu
0b10: 66 73 0a 3a 6e 6f 6e 61 6d 65 20 64 65 66 65 72  fs.:noname defer
0b20: 73 20 66 72 65 65 2d 63 6f 64 65 2d 62 75 66 73  s free-code-bufs
0b30: 0a 20 20 20 20 63 6f 64 65 2d 6b 65 79 5e 20 40  .    code-key^ @
0b40: 20 2e 64 69 73 70 6f 73 65 20 3b 20 69 73 20 66   .dispose ; is f
0b50: 72 65 65 2d 63 6f 64 65 2d 62 75 66 73 0a 0a 5c  ree-code-bufs..\
0b60: 20 68 61 73 68 65 64 20 6b 65 79 20 64 61 74 61   hashed key data
0b70: 20 62 61 73 65 0a 0a 55 73 65 72 20 3e 73 74 6f   base..User >sto
0b80: 72 65 6b 65 79 0a 0a 63 6d 64 2d 63 6c 61 73 73  rekey..cmd-class
0b90: 20 63 6c 61 73 73 0a 20 20 20 20 66 69 65 6c 64   class.    field
0ba0: 3a 20 6b 65 2d 73 6b 20 20 20 5c 20 73 65 63 72  : ke-sk   \ secr
0bb0: 65 74 20 6b 65 79 0a 20 20 20 20 66 69 65 6c 64  et key.    field
0bc0: 3a 20 6b 65 2d 70 6b 20 20 20 5c 20 70 75 62 6c  : ke-pk   \ publ
0bd0: 69 63 20 6b 65 79 0a 20 20 20 20 66 69 65 6c 64  ic key.    field
0be0: 3a 20 6b 65 2d 74 79 70 65 20 5c 20 6b 65 79 20  : ke-type \ key 
0bf0: 74 79 70 65 0a 20 20 20 20 66 69 65 6c 64 3a 20  type.    field: 
0c00: 6b 65 2d 6e 69 63 6b 20 5c 20 6b 65 79 20 6e 69  ke-nick \ key ni
0c10: 63 6b 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b 65  ck.    field: ke
0c20: 2d 70 73 6b 20 20 5c 20 70 72 65 73 68 61 72 65  -psk  \ preshare
0c30: 64 20 6b 65 79 20 66 6f 72 20 73 74 61 74 65 6c  d key for statel
0c40: 65 73 73 20 63 6f 6d 6d 75 6e 69 63 61 74 69 6f  ess communicatio
0c50: 6e 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d  n.    field: ke-
0c60: 70 72 6f 66 20 5c 20 70 72 6f 66 69 6c 65 20 6f  prof \ profile o
0c70: 62 6a 65 63 74 0a 20 20 20 20 66 69 65 6c 64 3a  bject.    field:
0c80: 20 6b 65 2d 73 65 6c 66 73 69 67 0a 20 20 20 20   ke-selfsig.    
0c90: 66 69 65 6c 64 3a 20 6b 65 2d 73 69 67 73 0a 20  field: ke-sigs. 
0ca0: 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 73 74 6f     field: ke-sto
0cb0: 72 65 6b 65 79 20 5c 20 75 73 65 64 20 74 6f 20  rekey \ used to 
0cc0: 65 6e 63 72 79 70 74 20 6f 6e 20 73 74 6f 72 61  encrypt on stora
0cd0: 67 65 0a 20 20 20 20 36 34 66 69 65 6c 64 3a 20  ge.    64field: 
0ce0: 6b 65 2d 6f 66 66 73 65 74 20 5c 20 6f 66 66 73  ke-offset \ offs
0cf0: 65 74 20 69 6e 20 6b 65 79 20 66 69 6c 65 0a 20  et in key file. 
0d00: 20 20 20 30 20 2b 66 69 65 6c 64 20 6b 65 2d 65     0 +field ke-e
0d10: 6e 64 0a 65 6e 64 2d 63 6c 61 73 73 20 6b 65 79  nd.end-class key
0d20: 2d 65 6e 74 72 79 0a 0a 56 61 72 69 61 62 6c 65  -entry..Variable
0d30: 20 6b 65 79 2d 65 6e 74 72 79 2d 74 61 62 6c 65   key-entry-table
0d40: 0a 0a 30 20 43 6f 6e 73 74 61 6e 74 20 6b 65 79  ..0 Constant key
0d50: 23 61 6e 6f 6e 0a 31 20 43 6f 6e 73 74 61 6e 74  #anon.1 Constant
0d60: 20 6b 65 79 23 75 73 65 72 0a 32 20 43 6f 6e 73   key#user.2 Cons
0d70: 74 61 6e 74 20 6b 65 79 23 67 72 6f 75 70 0a 0a  tant key#group..
0d80: 30 20 56 61 6c 75 65 20 73 61 6d 70 6c 65 2d 6b  0 Value sample-k
0d90: 65 79 0a 0a 56 61 72 69 61 62 6c 65 20 6b 65 79  ey..Variable key
0da0: 2d 74 61 62 6c 65 0a 0a 36 34 56 61 72 69 61 62  -table..64Variab
0db0: 6c 65 20 6b 65 79 2d 72 65 61 64 2d 6f 66 66 73  le key-read-offs
0dc0: 65 74 0a 0a 3a 20 63 75 72 72 65 6e 74 2d 6b 65  et..: current-ke
0dd0: 79 20 28 20 61 64 64 72 20 75 20 2d 2d 20 6f 20  y ( addr u -- o 
0de0: 29 0a 20 20 20 20 32 64 75 70 20 6b 65 79 73 69  ).    2dup keysi
0df0: 7a 65 20 75 6d 69 6e 20 6b 65 79 2d 74 61 62 6c  ze umin key-tabl
0e00: 65 20 23 40 20 64 72 6f 70 0a 20 20 20 20 64 75  e #@ drop.    du
0e10: 70 20 30 3d 20 49 46 20 20 64 72 6f 70 20 2e 22  p 0= IF  drop ."
0e20: 20 75 6e 6b 6e 6f 77 6e 20 6b 65 79 3a 20 22 20   unknown key: " 
0e30: 38 35 74 79 70 65 20 63 72 20 20 30 20 45 58 49  85type cr  0 EXI
0e40: 54 20 20 54 48 45 4e 0a 20 20 20 20 63 65 6c 6c  T  THEN.    cell
0e50: 2b 20 3e 6f 20 6b 65 2d 70 6b 20 24 21 20 6f 20  + >o ke-pk $! o 
0e60: 6f 3e 20 3b 0a 0a 3a 20 6b 65 79 3a 6e 65 77 20  o> ;..: key:new 
0e70: 28 20 61 64 64 72 20 75 20 2d 2d 20 6f 20 29 0a  ( addr u -- o ).
0e80: 20 20 20 20 5c 47 20 63 72 65 61 74 65 20 6e 65      \G create ne
0e90: 77 20 6b 65 79 2c 20 61 64 64 72 20 75 20 69 73  w key, addr u is
0ea0: 20 74 68 65 20 70 75 62 6c 69 63 20 6b 65 79 0a   the public key.
0eb0: 20 20 20 20 73 61 6d 70 6c 65 2d 6b 65 79 20 3e      sample-key >
0ec0: 6f 0a 20 20 20 20 6b 65 79 2d 65 6e 74 72 79 2d  o.    key-entry-
0ed0: 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e 2d 74 61  table @ token-ta
0ee0: 62 6c 65 20 21 0a 20 20 20 20 6b 65 2d 73 6b 20  ble !.    ke-sk 
0ef0: 6b 65 2d 65 6e 64 20 6f 76 65 72 20 2d 20 65 72  ke-end over - er
0f00: 61 73 65 20 20 3e 73 74 6f 72 65 6b 65 79 20 40  ase  >storekey @
0f10: 20 6b 65 2d 73 74 6f 72 65 6b 65 79 20 21 0a 20   ke-storekey !. 
0f20: 20 20 20 6b 65 79 2d 72 65 61 64 2d 6f 66 66 73     key-read-offs
0f30: 65 74 20 36 34 40 20 6b 65 2d 6f 66 66 73 65 74  et 64@ ke-offset
0f40: 20 36 34 21 0a 20 20 20 20 6b 65 79 70 61 63 6b   64!.    keypack
0f50: 2d 61 6c 6c 23 20 6e 3e 36 34 20 6b 65 79 2d 72  -all# n>64 key-r
0f60: 65 61 64 2d 6f 66 66 73 65 74 20 36 34 2b 21 20  ead-offset 64+! 
0f70: 6f 20 63 65 6c 6c 2d 20 6b 65 2d 65 6e 64 20 6f  o cell- ke-end o
0f80: 76 65 72 20 2d 0a 20 20 20 20 32 6f 76 65 72 20  ver -.    2over 
0f90: 6b 65 79 73 69 7a 65 20 75 6d 69 6e 20 6b 65 79  keysize umin key
0fa0: 2d 74 61 62 6c 65 20 23 21 20 6f 3e 0a 20 20 20  -table #! o>.   
0fb0: 20 63 75 72 72 65 6e 74 2d 6b 65 79 20 3b 0a 0a   current-key ;..
0fc0: 3a 20 6b 65 79 3f 6e 65 77 20 28 20 61 64 64 72  : key?new ( addr
0fd0: 20 75 20 2d 2d 20 6f 20 29 0a 20 20 20 20 5c 47   u -- o ).    \G
0fe0: 20 43 72 65 61 74 65 20 6f 72 20 6c 6f 6f 6b 75   Create or looku
0ff0: 70 20 6e 65 77 20 6b 65 79 0a 20 20 20 20 32 64  p new key.    2d
1000: 75 70 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e 20  up keysize umin 
1010: 6b 65 79 2d 74 61 62 6c 65 20 23 40 20 64 72 6f  key-table #@ dro
1020: 70 0a 20 20 20 20 64 75 70 20 30 3d 20 49 46 20  p.    dup 0= IF 
1030: 20 64 72 6f 70 20 6b 65 79 3a 6e 65 77 20 20 45   drop key:new  E
1040: 4c 53 45 20 20 6e 69 70 20 6e 69 70 20 63 65 6c  LSE  nip nip cel
1050: 6c 2b 20 20 54 48 45 4e 20 3b 0a 0a 5c 20 73 65  l+  THEN ;..\ se
1060: 61 72 63 68 20 66 6f 72 20 6b 65 79 73 20 2d 20  arch for keys - 
1070: 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 64 0a 0a 3a  not optimized..:
1080: 20 6e 69 63 6b 2d 6b 65 79 20 28 20 61 64 64 72   nick-key ( addr
1090: 20 75 20 2d 2d 20 6f 20 29 20 5c 20 73 65 61 72   u -- o ) \ sear
10a0: 63 68 20 66 6f 72 20 6b 65 79 20 6e 69 63 6b 6e  ch for key nickn
10b0: 61 6d 65 0a 20 20 20 20 30 20 2d 72 6f 74 20 6b  ame.    0 -rot k
10c0: 65 79 2d 74 61 62 6c 65 20 0a 20 20 20 20 5b 3a  ey-table .    [:
10d0: 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f 70 20 63   cell+ $@ drop c
10e0: 65 6c 6c 2b 20 3e 6f 20 6b 65 2d 6e 69 63 6b 20  ell+ >o ke-nick 
10f0: 24 40 20 32 6f 76 65 72 20 73 74 72 3d 20 49 46  $@ 2over str= IF
1100: 0a 09 72 6f 74 20 64 72 6f 70 20 6f 20 2d 72 6f  ..rot drop o -ro
1110: 74 0a 20 20 20 20 54 48 45 4e 20 20 6f 3e 20 3b  t.    THEN  o> ;
1120: 5d 20 23 6d 61 70 20 32 64 72 6f 70 20 3b 0a 0a  ] #map 2drop ;..
1130: 3a 20 73 65 63 72 65 74 2d 6b 65 79 73 23 20 28  : secret-keys# (
1140: 20 2d 2d 20 6e 20 29 0a 20 20 20 20 30 20 6b 65   -- n ).    0 ke
1150: 79 2d 74 61 62 6c 65 20 5b 3a 20 63 65 6c 6c 2b  y-table [: cell+
1160: 20 24 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e   $@ drop cell+ >
1170: 6f 20 6b 65 2d 73 6b 20 40 20 30 3c 3e 20 2d 20  o ke-sk @ 0<> - 
1180: 6f 3e 20 3b 5d 20 23 6d 61 70 20 3b 0a 3a 20 73  o> ;] #map ;.: s
1190: 65 63 72 65 74 2d 6b 65 79 20 28 20 6e 20 2d 2d  ecret-key ( n --
11a0: 20 6f 2f 30 20 29 0a 20 20 20 20 30 20 74 75 63   o/0 ).    0 tuc
11b0: 6b 20 6b 65 79 2d 74 61 62 6c 65 20 5b 3a 20 63  k key-table [: c
11c0: 65 6c 6c 2b 20 24 40 20 64 72 6f 70 20 63 65 6c  ell+ $@ drop cel
11d0: 6c 2b 20 3e 6f 20 6b 65 2d 73 6b 20 40 20 49 46  l+ >o ke-sk @ IF
11e0: 0a 09 20 20 32 64 75 70 20 3d 20 49 46 20 20 72  ..  2dup = IF  r
11f0: 6f 74 20 64 72 6f 70 20 6f 20 2d 72 6f 74 20 20  ot drop o -rot  
1200: 54 48 45 4e 20 20 31 2b 0a 20 20 20 20 20 20 54  THEN  1+.      T
1210: 48 45 4e 20 20 6f 3e 20 3b 5d 20 23 6d 61 70 20  HEN  o> ;] #map 
1220: 32 64 72 6f 70 20 3b 0a 3a 20 2e 73 65 63 72 65  2drop ;.: .secre
1230: 74 2d 6e 69 63 6b 73 20 28 20 2d 2d 20 29 0a 20  t-nicks ( -- ). 
1240: 20 20 20 30 20 6b 65 79 2d 74 61 62 6c 65 20 5b     0 key-table [
1250: 3a 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f 70 20  : cell+ $@ drop 
1260: 63 65 6c 6c 2b 20 3e 6f 20 6b 65 2d 73 6b 20 40  cell+ >o ke-sk @
1270: 20 49 46 0a 09 20 20 64 75 70 20 2e 20 6b 65 2d   IF..  dup . ke-
1280: 6e 69 63 6b 20 24 40 20 74 79 70 65 20 63 72 20  nick $@ type cr 
1290: 31 2b 0a 20 20 20 20 20 20 54 48 45 4e 20 6f 3e  1+.      THEN o>
12a0: 20 3b 5d 20 23 6d 61 70 20 64 72 6f 70 20 3b 0a   ;] #map drop ;.
12b0: 0a 3a 20 6e 69 63 6b 3e 70 6b 20 28 20 6e 69 63  .: nick>pk ( nic
12c0: 6b 20 75 20 2d 2d 20 70 6b 20 75 20 29 0a 20 20  k u -- pk u ).  
12d0: 20 20 6e 69 63 6b 2d 6b 65 79 20 3f 64 75 70 2d    nick-key ?dup-
12e0: 49 46 20 2e 6b 65 2d 70 6b 20 24 40 20 45 4c 53  IF .ke-pk $@ ELS
12f0: 45 20 30 20 30 20 54 48 45 4e 20 3b 0a 0a 3a 20  E 0 0 THEN ;..: 
1300: 6b 65 79 2d 65 78 69 73 74 3f 20 28 20 61 64 64  key-exist? ( add
1310: 72 20 75 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20  r u -- flag ).  
1320: 20 20 6b 65 79 2d 74 61 62 6c 65 20 23 40 20 64    key-table #@ d
1330: 30 3c 3e 20 3b 20 0a 0a 56 61 72 69 61 62 6c 65  0<> ; ..Variable
1340: 20 73 74 72 69 63 74 2d 6b 65 79 73 20 20 73 74   strict-keys  st
1350: 72 69 63 74 2d 6b 65 79 73 20 6f 6e 0a 0a 5b 49  rict-keys on..[I
1360: 46 55 4e 44 45 46 5d 20 6d 61 67 65 6e 74 61 20  FUNDEF] magenta 
1370: 20 62 72 6f 77 6e 20 63 6f 6e 73 74 61 6e 74 20   brown constant 
1380: 6d 61 67 65 6e 74 61 20 5b 54 48 45 4e 5d 0a 0a  magenta [THEN]..
1390: 43 72 65 61 74 65 20 38 35 63 6f 6c 6f 72 73 0a  Create 85colors.
13a0: 72 65 64 20 20 20 20 20 3e 62 67 20 77 68 69 74  red     >bg whit
13b0: 65 20 3e 66 67 20 6f 72 20 62 6f 6c 64 20 6f 72  e >fg or bold or
13c0: 20 2c 0a 79 65 6c 6c 6f 77 20 20 3e 62 67 20 77   ,.yellow  >bg w
13d0: 68 69 74 65 20 3e 66 67 20 6f 72 20 62 6f 6c 64  hite >fg or bold
13e0: 20 6f 72 20 2c 0a 62 6c 75 65 20 20 20 20 3e 62   or ,.blue    >b
13f0: 67 20 77 68 69 74 65 20 3e 66 67 20 6f 72 20 62  g white >fg or b
1400: 6f 6c 64 20 6f 72 20 2c 0a 6d 61 67 65 6e 74 61  old or ,.magenta
1410: 20 3e 62 67 20 77 68 69 74 65 20 3e 66 67 20 6f   >bg white >fg o
1420: 72 20 62 6f 6c 64 20 6f 72 20 2c 0a 0a 3a 20 72  r bold or ,..: r
1430: 65 73 65 74 2d 63 6f 6c 6f 72 20 28 20 2d 2d 20  eset-color ( -- 
1440: 29 0a 20 20 20 20 64 65 66 61 75 6c 74 2d 63 6f  ).    default-co
1450: 6c 6f 72 20 61 74 74 72 21 20 3b 0a 3a 20 2e 62  lor attr! ;.: .b
1460: 6c 61 63 6b 38 35 20 28 20 61 64 64 72 20 75 20  lack85 ( addr u 
1470: 2d 2d 20 29 0a 20 20 20 20 5b 20 62 6c 61 63 6b  -- ).    [ black
1480: 20 3e 62 67 20 62 6c 61 63 6b 20 3e 66 67 20 6f   >bg black >fg o
1490: 72 20 5d 4c 20 61 74 74 72 21 20 20 20 38 35 74  r ]L attr!   85t
14a0: 79 70 65 20 72 65 73 65 74 2d 63 6f 6c 6f 72 20  ype reset-color 
14b0: 3b 0a 3a 20 2e 72 65 64 38 35 20 28 20 61 64 64  ;.: .red85 ( add
14c0: 72 20 75 20 2d 2d 20 29 20 20 30 20 2d 72 6f 74  r u -- )  0 -rot
14d0: 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 09 63 72 20   bounds ?DO..cr 
14e0: 2e 22 20 5c 20 72 65 76 6f 6b 65 3a 20 22 20 64  ." \ revoke: " d
14f0: 75 70 20 63 65 6c 6c 73 20 38 35 63 6f 6c 6f 72  up cells 85color
1500: 73 20 2b 20 40 20 61 74 74 72 21 20 31 2b 20 33  s + @ attr! 1+ 3
1510: 20 61 6e 64 0a 09 49 20 34 20 38 35 74 79 70 65   and..I 4 85type
1520: 20 20 64 75 70 20 63 65 6c 6c 73 20 38 35 63 6f    dup cells 85co
1530: 6c 6f 72 73 20 2b 20 40 20 61 74 74 72 21 20 31  lors + @ attr! 1
1540: 2b 20 33 20 61 6e 64 0a 09 49 20 34 20 2b 20 34  + 3 and..I 4 + 4
1550: 20 38 35 74 79 70 65 20 72 65 73 65 74 2d 63 6f   85type reset-co
1560: 6c 6f 72 20 38 20 2b 4c 4f 4f 50 20 20 64 72 6f  lor 8 +LOOP  dro
1570: 70 20 3b 0a 3a 20 2e 72 73 6b 20 28 20 6e 69 63  p ;.: .rsk ( nic
1580: 6b 20 75 20 2d 2d 20 29 0a 20 20 20 20 73 6b 72  k u -- ).    skr
1590: 65 76 20 24 32 30 20 2e 72 65 64 38 35 20 73 70  ev $20 .red85 sp
15a0: 61 63 65 20 74 79 70 65 20 2e 22 20 20 28 6b 65  ace type ."  (ke
15b0: 65 70 20 6f 66 66 6c 69 6e 65 20 63 6f 70 79 21  ep offline copy!
15c0: 29 22 20 63 72 20 3b 0a 3a 20 2e 6b 65 79 20 28  )" cr ;.: .key (
15d0: 20 61 64 64 72 20 75 20 2d 2d 20 29 20 64 72 6f   addr u -- ) dro
15e0: 70 20 63 65 6c 6c 2b 20 3e 6f 0a 20 20 20 20 2e  p cell+ >o.    .
15f0: 22 20 6e 69 63 6b 3a 20 22 20 6b 65 2d 6e 69 63  " nick: " ke-nic
1600: 6b 20 24 40 20 74 79 70 65 20 63 72 0a 20 20 20  k $@ type cr.   
1610: 20 2e 22 20 70 75 62 6b 65 79 3a 20 22 20 6b 65   ." pubkey: " ke
1620: 2d 70 6b 20 24 40 20 38 35 74 79 70 65 20 63 72  -pk $@ 85type cr
1630: 0a 20 20 20 20 6b 65 2d 73 6b 20 40 20 49 46 20  .    ke-sk @ IF 
1640: 20 2e 22 20 73 65 63 6b 65 79 3a 20 22 20 6b 65   ." seckey: " ke
1650: 2d 73 6b 20 40 20 6b 65 79 73 69 7a 65 0a 09 2e  -sk @ keysize...
1660: 62 6c 61 63 6b 38 35 20 2e 22 20 20 28 6b 65 65  black85 ."  (kee
1670: 70 20 73 65 63 72 65 74 21 29 22 20 63 72 20 20  p secret!)" cr  
1680: 54 48 45 4e 0a 20 20 20 20 2e 22 20 66 69 72 73  THEN.    ." firs
1690: 74 3a 20 22 20 6b 65 2d 73 65 6c 66 73 69 67 20  t: " ke-selfsig 
16a0: 24 40 20 64 72 6f 70 20 36 34 40 20 2e 73 69 67  $@ drop 64@ .sig
16b0: 64 61 74 65 20 63 72 0a 20 20 20 20 2e 22 20 6c  date cr.    ." l
16c0: 61 73 74 3a 20 22 20 6b 65 2d 73 65 6c 66 73 69  ast: " ke-selfsi
16d0: 67 20 24 40 20 64 72 6f 70 20 36 34 27 2b 20 36  g $@ drop 64'+ 6
16e0: 34 40 20 2e 73 69 67 64 61 74 65 20 63 72 0a 20  4@ .sigdate cr. 
16f0: 20 20 20 6f 3e 20 3b 0a 0a 3a 20 64 75 6d 70 6b     o> ;..: dumpk
1700: 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29  ey ( addr u -- )
1710: 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e 6f 0a 20   drop cell+ >o. 
1720: 20 20 20 2e 5c 22 20 78 5c 22 20 22 20 6b 65 2d     .\" x\" " ke-
1730: 70 6b 20 24 40 20 38 35 74 79 70 65 20 2e 5c 22  pk $@ 85type .\"
1740: 20 5c 22 20 6b 65 79 3f 6e 65 77 22 20 63 72 0a   \" key?new" cr.
1750: 20 20 20 20 6b 65 2d 73 6b 20 40 20 49 46 20 20      ke-sk @ IF  
1760: 2e 5c 22 20 78 5c 22 20 22 20 6b 65 2d 73 6b 20  .\" x\" " ke-sk 
1770: 40 20 6b 65 79 73 69 7a 65 20 38 35 74 79 70 65  @ keysize 85type
1780: 20 2e 5c 22 20 5c 22 20 6b 65 2d 73 6b 20 73 65   .\" \" ke-sk se
1790: 63 21 20 2b 73 65 63 6b 65 79 22 20 63 72 20 20  c! +seckey" cr  
17a0: 54 48 45 4e 0a 20 20 20 20 27 22 27 20 65 6d 69  THEN.    '"' emi
17b0: 74 20 6b 65 2d 6e 69 63 6b 20 24 40 20 74 79 70  t ke-nick $@ typ
17c0: 65 20 2e 5c 22 20 5c 22 20 6b 65 2d 6e 69 63 6b  e .\" \" ke-nick
17d0: 20 24 21 20 22 0a 20 20 20 20 6b 65 2d 73 65 6c   $! ".    ke-sel
17e0: 66 73 69 67 20 24 40 20 64 72 6f 70 20 36 34 40  fsig $@ drop 64@
17f0: 20 36 34 3e 64 20 5b 3a 20 27 24 27 20 65 6d 69   64>d [: '$' emi
1800: 74 20 30 20 75 64 2e 72 20 3b 5d 20 24 31 30 20  t 0 ud.r ;] $10 
1810: 62 61 73 65 2d 65 78 65 63 75 74 65 0a 20 20 20  base-execute.   
1820: 20 2e 22 20 2e 20 64 3e 36 34 20 6b 65 2d 66 69   ." . d>64 ke-fi
1830: 72 73 74 21 20 22 20 6b 65 2d 74 79 70 65 20 40  rst! " ke-type @
1840: 20 2e 20 2e 22 20 6b 65 2d 74 79 70 65 20 21 22   . ." ke-type !"
1850: 20 20 63 72 20 6f 3e 20 3b 0a 0a 3a 20 2e 6b 65    cr o> ;..: .ke
1860: 79 73 20 28 20 2d 2d 20 29 20 6b 65 79 2d 74 61  ys ( -- ) key-ta
1870: 62 6c 65 20 5b 3a 20 63 65 6c 6c 2b 20 24 40 20  ble [: cell+ $@ 
1880: 2e 6b 65 79 20 3b 5d 20 23 6d 61 70 20 3b 0a 3a  .key ;] #map ;.:
1890: 20 64 75 6d 70 6b 65 79 73 20 28 20 2d 2d 20 29   dumpkeys ( -- )
18a0: 20 6b 65 79 2d 74 61 62 6c 65 20 5b 3a 20 63 65   key-table [: ce
18b0: 6c 6c 2b 20 24 40 20 64 75 6d 70 6b 65 79 20 3b  ll+ $@ dumpkey ;
18c0: 5d 20 23 6d 61 70 20 3b 0a 0a 3a 20 6b 65 79 3e  ] #map ;..: key>
18d0: 6e 69 63 6b 20 28 20 61 64 64 72 6b 65 79 20 75  nick ( addrkey u
18e0: 31 20 2d 2d 20 6e 69 63 6b 20 75 32 20 29 0a 20  1 -- nick u2 ). 
18f0: 20 20 20 6b 65 79 2d 74 61 62 6c 65 20 23 40 20     key-table #@ 
1900: 30 3d 20 49 46 20 20 64 72 6f 70 20 22 22 20 20  0= IF  drop ""  
1910: 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 63  EXIT  THEN.    c
1920: 65 6c 6c 2b 20 2e 6b 65 2d 6e 69 63 6b 20 24 40  ell+ .ke-nick $@
1930: 20 3b 0a 0a 3a 20 2e 6b 65 79 23 20 28 20 61 64   ;..: .key# ( ad
1940: 64 72 20 75 20 2d 2d 20 29 20 6b 65 79 73 69 7a  dr u -- ) keysiz
1950: 65 20 75 6d 69 6e 0a 20 20 20 20 2e 22 20 4b 65  e umin.    ." Ke
1960: 79 20 27 22 20 6b 65 79 2d 74 61 62 6c 65 20 23  y '" key-table #
1970: 40 20 30 3d 20 49 46 20 64 72 6f 70 20 45 58 49  @ 0= IF drop EXI
1980: 54 20 54 48 45 4e 0a 20 20 20 20 63 65 6c 6c 2b  T THEN.    cell+
1990: 20 2e 6b 65 2d 6e 69 63 6b 20 24 40 20 74 79 70   .ke-nick $@ typ
19a0: 65 20 2e 22 20 27 20 6f 6b 22 20 63 72 20 3b 0a  e ." ' ok" cr ;.
19b0: 3a 20 2e 6b 65 79 2d 69 64 20 28 20 61 64 64 72  : .key-id ( addr
19c0: 20 75 20 2d 2d 20 29 20 6b 65 79 73 69 7a 65 20   u -- ) keysize 
19d0: 75 6d 69 6e 20 32 64 75 70 20 6b 65 79 2d 74 61  umin 2dup key-ta
19e0: 62 6c 65 20 23 40 20 30 3d 0a 20 20 20 20 49 46  ble #@ 0=.    IF
19f0: 20 20 32 64 72 6f 70 20 38 20 38 35 74 79 70 65    2drop 8 85type
1a00: 0a 20 20 20 20 45 4c 53 45 20 20 63 65 6c 6c 2b  .    ELSE  cell+
1a10: 20 2e 6b 65 2d 6e 69 63 6b 20 24 40 20 74 79 70   .ke-nick $@ typ
1a20: 65 20 32 64 72 6f 70 20 20 54 48 45 4e 20 3b 0a  e 2drop  THEN ;.
1a30: 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61 64 64 72 20  .:noname ( addr 
1a40: 75 20 2d 2d 20 29 0a 20 20 20 20 6f 20 49 46 20  u -- ).    o IF 
1a50: 20 70 75 62 6b 65 79 20 40 20 49 46 0a 09 20 20   pubkey @ IF..  
1a60: 20 20 32 64 75 70 20 70 75 62 6b 65 79 20 24 40    2dup pubkey $@
1a70: 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e 20 73 74   keysize umin st
1a80: 72 3d 20 30 3d 20 49 46 0a 09 09 5b 3a 20 2e 22  r= 0= IF...[: ."
1a90: 20 77 61 6e 74 3a 20 22 20 70 75 62 6b 65 79 20   want: " pubkey 
1aa0: 24 40 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e 20  $@ keysize umin 
1ab0: 38 35 74 79 70 65 20 63 72 0a 09 09 20 20 2e 22  85type cr...  ."
1ac0: 20 67 6f 74 20 3a 20 22 20 32 64 75 70 20 38 35   got : " 2dup 85
1ad0: 74 79 70 65 20 63 72 20 3b 5d 20 24 65 72 72 0a  type cr ;] $err.
1ae0: 09 09 74 72 75 65 20 21 21 77 72 6f 6e 67 2d 6b  ..true !!wrong-k
1af0: 65 79 21 21 0a 09 20 20 20 20 54 48 45 4e 0a 09  ey!!..    THEN..
1b00: 20 20 20 20 2e 6b 65 79 23 20 20 45 58 49 54 0a      .key#  EXIT.
1b10: 09 54 48 45 4e 20 20 54 48 45 4e 0a 20 20 20 20  .THEN  THEN.    
1b20: 32 64 75 70 20 6b 65 79 2d 65 78 69 73 74 3f 20  2dup key-exist? 
1b30: 30 3d 20 49 46 0a 09 73 74 72 69 63 74 2d 6b 65  0= IF..strict-ke
1b40: 79 73 20 40 20 21 21 75 6e 6b 6e 6f 77 6e 2d 6b  ys @ !!unknown-k
1b50: 65 79 21 21 0a 09 2e 22 20 55 6e 6b 6e 6f 77 6e  ey!!..." Unknown
1b60: 20 6b 65 79 20 22 20 38 35 74 79 70 65 20 63 72   key " 85type cr
1b70: 0a 20 20 20 20 45 4c 53 45 0a 09 2e 6b 65 79 23  .    ELSE...key#
1b80: 0a 20 20 20 20 54 48 45 4e 20 3b 20 49 53 20 63  .    THEN ; IS c
1b90: 68 65 63 6b 2d 6b 65 79 0a 0a 3a 6e 6f 6e 61 6d  heck-key..:nonam
1ba0: 65 20 28 20 70 6b 63 20 2d 2d 20 73 6b 63 20 29  e ( pkc -- skc )
1bb0: 0a 20 20 20 20 6b 65 79 73 69 7a 65 20 6b 65 79  .    keysize key
1bc0: 2d 74 61 62 6c 65 20 23 40 20 30 3d 20 21 21 75  -table #@ 0= !!u
1bd0: 6e 6b 6e 6f 77 6e 2d 6b 65 79 21 21 0a 20 20 20  nknown-key!!.   
1be0: 20 63 65 6c 6c 2b 20 2e 6b 65 2d 73 6b 20 73 65   cell+ .ke-sk se
1bf0: 63 40 20 30 3d 20 21 21 75 6e 6b 6e 6f 77 6e 2d  c@ 0= !!unknown-
1c00: 6b 65 79 21 21 20 3b 20 69 73 20 73 65 61 72 63  key!! ; is searc
1c10: 68 2d 6b 65 79 0a 0a 5c 20 67 65 74 20 70 61 73  h-key..\ get pas
1c20: 73 70 68 72 61 73 65 0a 0a 33 20 56 61 6c 75 65  sphrase..3 Value
1c30: 20 70 61 73 73 70 68 72 61 73 65 2d 72 65 74 72   passphrase-retr
1c40: 79 23 0a 24 31 30 30 20 43 6f 6e 73 74 61 6e 74  y#.$100 Constant
1c50: 20 6d 61 78 2d 70 61 73 73 70 68 72 61 73 65 23   max-passphrase#
1c60: 20 5c 20 32 35 36 20 63 68 61 72 61 63 74 65 72   \ 256 character
1c70: 73 20 73 68 6f 75 6c 64 20 62 65 20 65 6e 6f 75  s should be enou
1c80: 67 68 2e 2e 2e 0a 6d 61 78 2d 70 61 73 73 70 68  gh....max-passph
1c90: 72 61 73 65 23 20 62 75 66 66 65 72 3a 20 70 61  rase# buffer: pa
1ca0: 73 73 70 68 72 61 73 65 0a 0a 3a 20 70 61 73 73  ssphrase..: pass
1cb0: 70 68 72 61 73 65 2d 69 6e 20 28 20 2d 2d 20 61  phrase-in ( -- a
1cc0: 64 64 72 20 75 20 29 0a 20 20 20 20 70 61 73 73  ddr u ).    pass
1cd0: 70 68 72 61 73 65 20 64 75 70 20 6d 61 78 2d 70  phrase dup max-p
1ce0: 61 73 73 70 68 72 61 73 65 23 20 61 63 63 65 70  assphrase# accep
1cf0: 74 2a 20 3b 0a 0a 3a 20 3e 70 61 73 73 70 68 72  t* ;..: >passphr
1d00: 61 73 65 20 28 20 61 64 64 72 20 75 20 2d 2d 20  ase ( addr u -- 
1d10: 61 64 64 72 20 75 20 29 0a 20 20 20 20 5c 47 20  addr u ).    \G 
1d20: 63 72 65 61 74 65 20 61 20 35 31 32 20 62 69 74  create a 512 bit
1d30: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 73   hash of the pas
1d40: 73 70 68 72 61 73 65 0a 20 20 20 20 6e 6f 2d 6b  sphrase.    no-k
1d50: 65 79 20 3e 63 3a 6b 65 79 20 63 3a 68 61 73 68  ey >c:key c:hash
1d60: 0a 20 20 20 20 6b 65 63 63 61 6b 2d 70 61 64 64  .    keccak-padd
1d70: 65 64 20 63 3a 6b 65 79 3e 20 6b 65 63 63 61 6b  ed c:key> keccak
1d80: 2d 70 61 64 64 65 64 20 6b 65 63 63 61 6b 23 6d  -padded keccak#m
1d90: 61 78 20 32 2f 20 3b 0a 0a 3a 20 67 65 74 2d 70  ax 2/ ;..: get-p
1da0: 61 73 73 70 68 72 61 73 65 20 28 20 2d 2d 20 61  assphrase ( -- a
1db0: 64 64 72 20 75 20 29 0a 20 20 20 20 70 61 73 73  ddr u ).    pass
1dc0: 70 68 72 61 73 65 2d 69 6e 20 3e 70 61 73 73 70  phrase-in >passp
1dd0: 68 72 61 73 65 20 3b 0a 0a 56 61 72 69 61 62 6c  hrase ;..Variabl
1de0: 65 20 6b 65 79 73 0a 0a 3a 20 6b 65 79 3e 64 65  e keys..: key>de
1df0: 66 61 75 6c 74 20 28 20 2d 2d 20 29 20 6b 65 79  fault ( -- ) key
1e00: 73 20 24 5b 5d 23 20 31 2d 20 6b 65 79 73 20 73  s $[]# 1- keys s
1e10: 65 63 5b 5d 40 20 32 64 75 70 20 38 35 74 79 70  ec[]@ 2dup 85typ
1e20: 65 20 66 6f 72 74 68 3a 63 72 20 64 72 6f 70 20  e forth:cr drop 
1e30: 3e 73 74 6f 72 65 6b 65 79 20 21 20 3b 0a 3a 20  >storekey ! ;.: 
1e40: 2b 6b 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d  +key ( addr u --
1e50: 20 29 20 6b 65 79 73 20 73 65 63 2b 5b 5d 21 20   ) keys sec+[]! 
1e60: 3b 0a 3a 20 2b 70 61 73 73 70 68 72 61 73 65 20  ;.: +passphrase 
1e70: 28 20 2d 2d 20 29 20 20 67 65 74 2d 70 61 73 73  ( -- )  get-pass
1e80: 70 68 72 61 73 65 20 2b 6b 65 79 20 3b 0a 3a 20  phrase +key ;.: 
1e90: 2b 63 68 65 63 6b 70 68 72 61 73 65 20 28 20 2d  +checkphrase ( -
1ea0: 2d 20 66 6c 61 67 20 29 20 67 65 74 2d 70 61 73  - flag ) get-pas
1eb0: 73 70 68 72 61 73 65 20 6b 65 79 73 20 24 5b 5d  sphrase keys $[]
1ec0: 23 20 31 2d 20 6b 65 79 73 20 73 65 63 5b 5d 40  # 1- keys sec[]@
1ed0: 20 73 74 72 3d 20 3b 0a 3a 20 2b 6e 65 77 70 68   str= ;.: +newph
1ee0: 72 61 73 65 20 28 20 2d 2d 20 29 0a 20 20 20 20  rase ( -- ).    
1ef0: 42 45 47 49 4e 0a 09 2e 22 20 50 61 73 73 70 68  BEGIN..." Passph
1f00: 72 61 73 65 3a 20 22 20 2b 70 61 73 73 70 68 72  rase: " +passphr
1f10: 61 73 65 20 63 72 0a 09 2e 22 20 52 65 74 79 70  ase cr..." Retyp
1f20: 65 20 70 6c 73 3a 20 22 20 2b 63 68 65 63 6b 70  e pls: " +checkp
1f30: 68 72 61 73 65 20 30 3d 20 57 48 49 4c 45 0a 09  hrase 0= WHILE..
1f40: 20 20 20 20 2e 22 20 20 64 69 64 6e 27 74 20 6d      ."  didn't m
1f50: 61 74 63 68 2c 20 74 72 79 20 61 67 61 69 6e 20  atch, try again 
1f60: 70 6c 65 61 73 65 22 20 63 72 0a 20 20 20 20 52  please" cr.    R
1f70: 45 50 45 41 54 20 63 72 20 3b 0a 0a 3a 20 22 3e  EPEAT cr ;..: ">
1f80: 70 61 73 73 70 68 72 61 73 65 20 28 20 61 64 64  passphrase ( add
1f90: 72 20 75 20 2d 2d 20 29 20 3e 70 61 73 73 70 68  r u -- ) >passph
1fa0: 72 61 73 65 20 2b 6b 65 79 20 3b 0a 3a 20 2b 73  rase +key ;.: +s
1fb0: 65 63 6b 65 79 20 28 20 2d 2d 20 29 0a 20 20 20  eckey ( -- ).   
1fc0: 20 6b 65 2d 73 6b 20 40 20 6b 65 2d 70 6b 20 24   ke-sk @ ke-pk $
1fd0: 40 20 64 72 6f 70 20 6b 65 79 70 61 64 20 65 64  @ drop keypad ed
1fe0: 2d 64 68 20 2b 6b 65 79 20 3b 0a 0a 22 22 20 22  -dh +key ;.."" "
1ff0: 3e 70 61 73 73 70 68 72 61 73 65 20 5c 20 66 6f  >passphrase \ fo
2000: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 65 6e 63 72  llowing the encr
2010: 79 70 74 2d 65 76 65 72 79 74 68 69 6e 67 20 70  ypt-everything p
2020: 61 72 61 64 69 67 6d 2c 0a 5c 20 6e 6f 20 70 61  aradigm,.\ no pa
2030: 73 73 77 6f 72 64 20 69 73 20 74 68 65 20 65 6d  ssword is the em
2040: 70 74 79 20 73 74 72 69 6e 67 21 20 20 49 74 27  pty string!  It'
2050: 73 20 73 74 69 6c 6c 20 65 6e 63 72 79 70 74 65  s still encrypte
2060: 64 20 3b 2d 29 21 0a 0a 5c 20 61 20 73 65 63 72  d ;-)!..\ a secr
2070: 65 74 20 6b 65 79 20 6a 75 73 74 20 6e 65 65 64  et key just need
2080: 73 20 61 20 6e 69 63 6b 20 61 6e 64 20 61 20 74  s a nick and a t
2090: 79 70 65 2e 0a 5c 20 53 65 63 72 65 74 20 6b 65  ype..\ Secret ke
20a0: 79 73 20 63 61 6e 20 62 65 20 70 65 72 73 6f 6e  ys can be person
20b0: 73 20 61 6e 64 20 67 72 6f 75 70 73 2e 0a 0a 5c  s and groups...\
20c0: 20 61 20 70 75 62 6c 69 63 20 6b 65 79 20 6e 65   a public key ne
20d0: 65 64 73 20 6d 6f 72 65 3a 20 6e 69 63 6b 2c 20  eds more: nick, 
20e0: 74 79 70 65 2c 20 70 72 6f 66 69 6c 65 2e 0a 5c  type, profile..\
20f0: 20 54 68 65 20 70 72 6f 66 69 6c 65 20 69 73 20   The profile is 
2100: 61 20 73 74 72 75 63 74 75 72 65 64 20 64 6f 63  a structured doc
2110: 75 6d 65 6e 74 2c 20 69 2e 65 2e 20 70 6f 69 6e  ument, i.e. poin
2120: 74 65 64 20 74 6f 20 62 79 20 61 20 68 61 73 68  ted to by a hash
2130: 2e 0a 0a 5c 20 61 20 73 69 67 6e 61 74 75 72 65  ...\ a signature
2140: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 75 62 6b   contains a pubk
2150: 65 79 2c 20 61 20 63 68 65 63 6b 62 6f 78 20 62  ey, a checkbox b
2160: 69 74 6d 61 73 6b 2c 0a 5c 20 61 20 64 61 74 65  itmask,.\ a date
2170: 2c 20 61 6e 20 65 78 70 69 72 61 74 69 6f 6e 20  , an expiration 
2180: 64 61 74 65 2c 20 74 68 65 20 73 69 67 6e 65 72  date, the signer
2190: 27 73 20 70 75 62 6b 65 79 20 61 6e 64 20 74 68  's pubkey and th
21a0: 65 20 73 69 67 6e 61 74 75 72 65 20 69 74 73 65  e signature itse
21b0: 6c 66 0a 5c 20 28 72 2b 73 29 2e 20 20 54 68 65  lf.\ (r+s).  The
21c0: 72 65 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61  re is an optiona
21d0: 6c 20 73 69 67 6e 69 6e 67 20 70 72 6f 74 6f 63  l signing protoc
21e0: 6f 6c 20 64 6f 63 75 6d 65 6e 74 20 28 68 61 73  ol document (has
21f0: 68 29 2e 0a 0a 5c 20 77 65 20 73 74 6f 72 65 20  h)...\ we store 
2200: 65 61 63 68 20 69 74 65 6d 20 69 6e 20 61 20 32  each item in a 2
2210: 35 36 20 62 79 74 65 73 20 65 6e 63 72 79 70 74  56 bytes encrypt
2220: 65 64 20 73 74 72 69 6e 67 2c 20 69 2e 65 2e 20  ed string, i.e. 
2230: 77 69 74 68 20 61 20 31 36 0a 5c 20 62 79 74 65  with a 16.\ byte
2240: 20 73 61 6c 74 20 61 6e 64 20 61 20 31 36 20 62   salt and a 16 b
2250: 79 74 65 20 63 68 65 63 6b 73 75 6d 2e 0a 0a 3a  yte checksum...:
2260: 20 6b 65 2d 6c 61 73 74 21 20 28 20 36 34 64 61   ke-last! ( 64da
2270: 74 65 20 2d 2d 20 29 0a 20 20 20 20 6b 65 2d 73  te -- ).    ke-s
2280: 65 6c 66 73 69 67 20 24 40 6c 65 6e 20 24 31 30  elfsig $@len $10
2290: 20 75 6d 61 78 20 6b 65 2d 73 65 6c 66 73 69 67   umax ke-selfsig
22a0: 20 24 21 6c 65 6e 0a 20 20 20 20 6b 65 2d 73 65   $!len.    ke-se
22b0: 6c 66 73 69 67 20 24 40 20 64 72 6f 70 20 36 34  lfsig $@ drop 64
22c0: 27 2b 20 36 34 21 20 3b 0a 3a 20 6b 65 2d 66 69  '+ 64! ;.: ke-fi
22d0: 72 73 74 21 20 28 20 36 34 64 61 74 65 20 2d 2d  rst! ( 64date --
22e0: 20 29 20 36 34 23 2d 31 20 6b 65 2d 6c 61 73 74   ) 64#-1 ke-last
22f0: 21 0a 20 20 20 20 6b 65 2d 73 65 6c 66 73 69 67  !.    ke-selfsig
2300: 20 24 40 20 64 72 6f 70 20 36 34 21 20 3b 0a 0a   $@ drop 64! ;..
2310: 67 65 74 2d 63 75 72 72 65 6e 74 20 61 6c 73 6f  get-current also
2320: 20 6e 65 74 32 6f 2d 62 61 73 65 20 64 65 66 69   net2o-base defi
2330: 6e 69 74 69 6f 6e 73 0a 0a 63 6d 64 2d 74 61 62  nitions..cmd-tab
2340: 6c 65 20 24 40 20 69 6e 68 65 72 69 74 2d 74 61  le $@ inherit-ta
2350: 62 6c 65 20 6b 65 79 2d 65 6e 74 72 79 2d 74 61  ble key-entry-ta
2360: 62 6c 65 0a 5c 67 20 0a 5c 67 20 23 23 23 20 6b  ble.\g .\g ### k
2370: 65 79 20 73 74 6f 72 61 67 65 20 63 6f 6d 6d 61  ey storage comma
2380: 6e 64 73 20 23 23 23 0a 5c 67 20 0a 24 31 31 20  nds ###.\g .$11 
2390: 6e 65 74 32 6f 3a 20 70 72 69 76 6b 65 79 20 28  net2o: privkey (
23a0: 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20   $:string -- ). 
23b0: 20 20 20 5c 67 20 70 72 69 76 61 74 65 20 6b 65     \g private ke
23c0: 79 0a 20 20 20 20 5c 20 64 6f 65 73 20 6e 6f 74  y.    \ does not
23d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 69 67 6e   need to be sign
23e0: 65 64 2c 20 74 68 65 20 73 65 63 72 65 74 20 6b  ed, the secret k
23f0: 65 79 20 76 65 72 69 66 69 65 73 20 69 74 73 65  ey verifies itse
2400: 6c 66 0a 20 20 20 20 24 3e 20 6f 76 65 72 20 6b  lf.    $> over k
2410: 65 79 70 61 64 20 73 6b 3e 70 6b 20 5c 20 67 65  eypad sk>pk \ ge
2420: 6e 65 72 61 74 65 20 70 75 62 6b 65 79 0a 20 20  nerate pubkey.  
2430: 20 20 6b 65 79 70 61 64 20 6b 65 2d 70 6b 20 24    keypad ke-pk $
2440: 40 20 64 72 6f 70 20 6b 65 79 73 69 7a 65 20 74  @ drop keysize t
2450: 75 63 6b 20 73 74 72 3d 20 30 3d 20 21 21 77 72  uck str= 0= !!wr
2460: 6f 6e 67 2d 6b 65 79 21 21 0a 20 20 20 20 6b 65  ong-key!!.    ke
2470: 2d 73 6b 20 73 65 63 21 20 2b 73 65 63 6b 65 79  -sk sec! +seckey
2480: 20 3b 0a 2b 6e 65 74 32 6f 3a 20 6b 65 79 74 79   ;.+net2o: keyty
2490: 70 65 20 28 20 6e 20 2d 2d 20 29 20 20 20 20 20  pe ( n -- )     
24a0: 20 20 20 20 20 20 21 21 73 69 67 6e 65 64 3f 20        !!signed? 
24b0: 20 20 31 20 21 21 3e 6f 72 64 65 72 3f 20 36 34    1 !!>order? 64
24c0: 3e 6e 20 6b 65 2d 74 79 70 65 20 21 20 3b 0a 5c  >n ke-type ! ;.\
24d0: 67 20 6b 65 79 20 74 79 70 65 20 28 30 3a 20 61  g key type (0: a
24e0: 6e 6f 6e 2c 20 31 3a 20 75 73 65 72 2c 20 32 3a  non, 1: user, 2:
24f0: 20 67 72 6f 75 70 29 0a 2b 6e 65 74 32 6f 3a 20   group).+net2o: 
2500: 6b 65 79 6e 69 63 6b 20 28 20 24 3a 73 74 72 69  keynick ( $:stri
2510: 6e 67 20 2d 2d 20 29 20 20 20 20 21 21 73 69 67  ng -- )    !!sig
2520: 6e 65 64 3f 20 20 20 32 20 21 21 3e 6f 72 64 65  ned?   2 !!>orde
2530: 72 3f 20 24 3e 20 6b 65 2d 6e 69 63 6b 20 24 21  r? $> ke-nick $!
2540: 20 3b 0a 5c 67 20 6b 65 79 20 6e 69 63 6b 0a 2b   ;.\g key nick.+
2550: 6e 65 74 32 6f 3a 20 6b 65 79 70 72 6f 66 69 6c  net2o: keyprofil
2560: 65 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20  e ( $:string -- 
2570: 29 20 21 21 73 69 67 6e 65 64 3f 20 20 20 34 20  ) !!signed?   4 
2580: 21 21 3e 6f 72 64 65 72 3f 20 24 3e 20 6b 65 2d  !!>order? $> ke-
2590: 70 72 6f 66 20 24 21 20 3b 0a 5c 67 20 6b 65 79  prof $! ;.\g key
25a0: 20 70 72 6f 66 69 6c 65 20 28 68 61 73 68 20 6f   profile (hash o
25b0: 66 20 61 20 72 65 73 6f 75 72 63 65 29 0a 2b 6e  f a resource).+n
25c0: 65 74 32 6f 3a 20 6b 65 79 6d 61 73 6b 20 28 20  et2o: keymask ( 
25d0: 78 20 2d 2d 20 29 20 20 20 20 20 20 20 20 20 20  x -- )          
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 21               8 !
25f0: 21 3e 6f 72 64 65 72 3f 20 36 34 64 72 6f 70 20  !>order? 64drop 
2600: 3b 0a 5c 67 20 6b 65 79 20 6d 61 73 6b 0a 2b 6e  ;.\g key mask.+n
2610: 65 74 32 6f 3a 20 6b 65 79 70 73 6b 20 28 20 24  et2o: keypsk ( $
2620: 3a 73 74 72 69 6e 67 20 2d 2d 20 29 20 20 20 20  :string -- )    
2630: 20 21 21 73 69 67 6e 65 64 3f 20 24 31 30 20 21   !!signed? $10 !
2640: 21 3e 6f 72 64 65 72 3f 20 24 3e 20 6b 65 2d 70  !>order? $> ke-p
2650: 73 6b 20 73 65 63 21 20 3b 0a 5c 67 20 70 72 65  sk sec! ;.\g pre
2660: 73 68 61 72 65 64 20 6b 65 79 20 28 75 6e 63 6c  shared key (uncl
2670: 65 61 72 20 69 66 20 74 68 61 74 27 73 20 67 6f  ear if that's go
2680: 69 6e 67 20 74 6f 20 73 74 61 79 0a 2b 6e 65 74  ing to stay.+net
2690: 32 6f 3a 20 2b 6b 65 79 73 69 67 20 28 20 24 3a  2o: +keysig ( $:
26a0: 73 74 72 69 6e 67 20 2d 2d 20 29 20 20 24 32 30  string -- )  $20
26b0: 20 21 21 3e 3d 6f 72 64 65 72 3f 20 24 3e 20 6b   !!>=order? $> k
26c0: 65 2d 73 69 67 73 20 24 2b 5b 5d 21 20 3b 0a 5c  e-sigs $+[]! ;.\
26d0: 67 20 61 64 64 20 61 20 6b 65 79 20 73 69 67 6e  g add a key sign
26e0: 61 74 75 72 65 0a 64 75 70 20 73 65 74 2d 63 75  ature.dup set-cu
26f0: 72 72 65 6e 74 20 70 72 65 76 69 6f 75 73 0a 0a  rrent previous..
2700: 67 65 6e 2d 74 61 62 6c 65 20 24 66 72 65 65 7a  gen-table $freez
2710: 65 0a 27 20 63 6f 6e 74 65 78 74 2d 74 61 62 6c  e.' context-tabl
2720: 65 20 69 73 20 67 65 6e 2d 74 61 62 6c 65 0a 0a  e is gen-table..
2730: 3a 6e 6f 6e 61 6d 65 20 28 20 61 64 64 72 20 75  :noname ( addr u
2740: 20 2d 2d 20 61 64 64 72 20 75 27 20 66 6c 61 67   -- addr u' flag
2750: 20 29 0a 20 20 20 20 70 6b 32 2d 73 69 67 3f 20   ).    pk2-sig? 
2760: 64 75 70 20 30 3d 20 3f 45 58 49 54 20 64 72 6f  dup 0= ?EXIT dro
2770: 70 0a 20 20 20 20 32 64 75 70 20 2b 20 73 69 67  p.    2dup + sig
2780: 73 69 7a 65 23 20 2d 20 73 69 67 73 69 7a 65 23  size# - sigsize#
2790: 20 3e 24 0a 20 20 20 20 73 69 67 70 6b 32 73 69   >$.    sigpk2si
27a0: 7a 65 23 20 2d 20 32 64 75 70 20 2b 20 6b 65 79  ze# - 2dup + key
27b0: 73 69 7a 65 20 32 2a 20 6b 65 79 3f 6e 65 77 20  size 2* key?new 
27c0: 6e 3a 3e 6f 20 24 3e 20 6b 65 2d 73 65 6c 66 73  n:>o $> ke-selfs
27d0: 69 67 20 24 21 0a 20 20 20 20 63 2d 73 74 61 74  ig $!.    c-stat
27e0: 65 20 6f 66 66 20 74 72 75 65 20 3b 20 6b 65 79  e off true ; key
27f0: 2d 65 6e 74 72 79 20 74 6f 20 6e 65 73 74 2d 73  -entry to nest-s
2800: 69 67 0a 0a 6b 65 79 2d 65 6e 74 72 79 20 27 20  ig..key-entry ' 
2810: 6e 65 77 20 73 74 61 74 69 63 2d 61 20 77 69 74  new static-a wit
2820: 68 2d 61 6c 6c 6f 63 61 74 65 72 20 74 6f 20 73  h-allocater to s
2830: 61 6d 70 6c 65 2d 6b 65 79 0a 73 61 6d 70 6c 65  ample-key.sample
2840: 2d 6b 65 79 20 3e 6f 20 6b 65 79 2d 65 6e 74 72  -key >o key-entr
2850: 79 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e 2d  y-table @ token-
2860: 74 61 62 6c 65 20 21 20 6f 3e 0a 0a 3a 20 6b 65  table ! o>..: ke
2870: 79 3a 63 6f 64 65 20 28 20 2d 2d 20 29 0a 20 20  y:code ( -- ).  
2880: 20 20 63 6f 64 65 2d 6b 65 79 20 20 63 6d 64 6c    code-key  cmdl
2890: 6f 63 6b 20 6c 6f 63 6b 0a 20 20 20 20 6b 65 79  ock lock.    key
28a0: 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d 61 6c 6c  pack keypack-all
28b0: 23 20 65 72 61 73 65 0a 20 20 20 20 63 6d 64 72  # erase.    cmdr
28c0: 65 73 65 74 20 61 6c 73 6f 20 6e 65 74 32 6f 2d  eset also net2o-
28d0: 62 61 73 65 20 3b 0a 63 6f 6d 70 3a 20 3a 2c 20  base ;.comp: :, 
28e0: 61 6c 73 6f 20 6e 65 74 32 6f 2d 62 61 73 65 20  also net2o-base 
28f0: 3b 0a 0a 61 6c 73 6f 20 6e 65 74 32 6f 2d 62 61  ;..also net2o-ba
2900: 73 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 0a  se definitions..
2910: 3a 20 65 6e 64 3a 6b 65 79 20 28 20 2d 2d 20 29  : end:key ( -- )
2920: 0a 20 20 20 20 65 6e 64 77 69 74 68 20 70 72 65  .    endwith pre
2930: 76 69 6f 75 73 20 63 6d 64 6c 6f 63 6b 20 75 6e  vious cmdlock un
2940: 6c 6f 63 6b 20 3b 0a 63 6f 6d 70 3a 20 3a 2c 20  lock ;.comp: :, 
2950: 70 72 65 76 69 6f 75 73 20 3b 0a 0a 73 65 74 2d  previous ;..set-
2960: 63 75 72 72 65 6e 74 20 70 72 65 76 69 6f 75 73  current previous
2970: 20 70 72 65 76 69 6f 75 73 0a 0a 3a 20 6b 65 79   previous..: key
2980: 2d 63 72 79 70 74 20 28 20 2d 2d 20 29 0a 20 20  -crypt ( -- ).  
2990: 20 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63    keypack keypac
29a0: 6b 2d 61 6c 6c 23 0a 20 20 20 20 3e 73 74 6f 72  k-all#.    >stor
29b0: 65 6b 65 79 20 73 65 63 40 20 64 75 70 20 24 32  ekey sec@ dup $2
29c0: 30 20 75 3c 3d 20 5c 20 69 73 20 61 20 73 65 63  0 u<= \ is a sec
29d0: 72 65 74 2c 20 6e 6f 20 6e 65 65 64 20 74 6f 20  ret, no need to 
29e0: 62 65 20 73 6c 6f 77 0a 20 20 20 20 49 46 20 20  be slow.    IF  
29f0: 65 6e 63 72 79 70 74 24 20 20 45 4c 53 45 20 20  encrypt$  ELSE  
2a00: 70 77 2d 6c 65 76 65 6c 23 20 65 6e 63 72 79 70  pw-level# encryp
2a10: 74 2d 70 77 24 20 20 54 48 45 4e 20 3b 0a 0a 30  t-pw$  THEN ;..0
2a20: 20 56 61 6c 75 65 20 6b 65 79 2d 73 66 64 20 5c   Value key-sfd \
2a30: 20 73 65 63 72 65 74 20 6b 65 79 73 0a 30 20 56   secret keys.0 V
2a40: 61 6c 75 65 20 6b 65 79 2d 70 66 64 20 5c 20 70  alue key-pfd \ p
2a50: 75 62 6b 65 79 73 0a 0a 3a 20 3f 2e 6e 65 74 32  ubkeys..: ?.net2
2a60: 6f 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 22 20  o ( -- ).    s" 
2a70: 7e 2f 2e 6e 65 74 32 6f 22 20 72 2f 6f 20 6f 70  ~/.net2o" r/o op
2a80: 65 6e 2d 66 69 6c 65 20 49 46 0a 09 64 72 6f 70  en-file IF..drop
2a90: 20 73 22 20 7e 2f 2e 6e 65 74 32 6f 22 20 24 31   s" ~/.net2o" $1
2aa0: 43 30 20 6d 6b 64 69 72 2d 70 61 72 65 6e 74 73  C0 mkdir-parents
2ab0: 20 74 68 72 6f 77 0a 20 20 20 20 45 4c 53 45 0a   throw.    ELSE.
2ac0: 09 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f  .close-file thro
2ad0: 77 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20  w.    THEN ;..: 
2ae0: 3f 66 64 20 28 20 66 64 20 61 64 64 72 20 75 20  ?fd ( fd addr u 
2af0: 2d 2d 20 66 64 27 20 29 20 7b 20 61 64 64 72 20  -- fd' ) { addr 
2b00: 75 20 7d 20 64 75 70 20 3f 45 58 49 54 20 64 72  u } dup ?EXIT dr
2b10: 6f 70 0a 20 20 20 20 3f 2e 6e 65 74 32 6f 0a 20  op.    ?.net2o. 
2b20: 20 20 20 61 64 64 72 20 75 20 72 2f 77 20 6f 70     addr u r/w op
2b30: 65 6e 2d 66 69 6c 65 20 64 75 70 20 2d 35 31 34  en-file dup -514
2b40: 20 3d 20 49 46 0a 09 32 64 72 6f 70 20 61 64 64   = IF..2drop add
2b50: 72 20 75 20 72 2f 77 20 63 72 65 61 74 65 2d 66  r u r/w create-f
2b60: 69 6c 65 0a 20 20 20 20 54 48 45 4e 20 20 74 68  ile.    THEN  th
2b70: 72 6f 77 20 3b 0a 3a 20 3f 6b 65 79 2d 73 66 64  row ;.: ?key-sfd
2b80: 20 28 20 2d 2d 20 66 64 20 29 20 6b 65 79 2d 73   ( -- fd ) key-s
2b90: 66 64 20 22 7e 2f 2e 6e 65 74 32 6f 2f 73 65 63  fd "~/.net2o/sec
2ba0: 6b 65 79 73 2e 6b 32 6f 22 20 3f 66 64 20 64 75  keys.k2o" ?fd du
2bb0: 70 20 74 6f 20 6b 65 79 2d 73 66 64 20 3b 0a 3a  p to key-sfd ;.:
2bc0: 20 3f 6b 65 79 2d 70 66 64 20 28 20 2d 2d 20 66   ?key-pfd ( -- f
2bd0: 64 20 29 20 6b 65 79 2d 70 66 64 20 22 7e 2f 2e  d ) key-pfd "~/.
2be0: 6e 65 74 32 6f 2f 70 75 62 6b 65 79 73 2e 6b 32  net2o/pubkeys.k2
2bf0: 6f 22 20 3f 66 64 20 64 75 70 20 74 6f 20 6b 65  o" ?fd dup to ke
2c00: 79 2d 70 66 64 20 3b 0a 0a 3a 20 77 72 69 74 65  y-pfd ;..: write
2c10: 40 70 6f 73 2d 66 69 6c 65 20 28 20 61 64 64 72  @pos-file ( addr
2c20: 20 75 20 36 34 70 6f 73 20 66 64 20 2d 2d 20 29   u 64pos fd -- )
2c30: 20 3e 72 0a 20 20 20 20 36 34 3e 64 20 72 40 20   >r.    64>d r@ 
2c40: 72 65 70 6f 73 69 74 69 6f 6e 2d 66 69 6c 65 20  reposition-file 
2c50: 74 68 72 6f 77 0a 20 20 20 20 72 40 20 77 72 69  throw.    r@ wri
2c60: 74 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 72 3e  te-file throw r>
2c70: 20 66 6c 75 73 68 2d 66 69 6c 65 20 74 68 72 6f   flush-file thro
2c80: 77 20 3b 0a 0a 3a 20 61 70 70 65 6e 64 2d 66 69  w ;..: append-fi
2c90: 6c 65 20 28 20 61 64 64 72 20 75 20 66 64 20 2d  le ( addr u fd -
2ca0: 2d 20 29 20 3e 72 0a 20 20 20 20 72 40 20 66 69  - ) >r.    r@ fi
2cb0: 6c 65 2d 73 69 7a 65 20 74 68 72 6f 77 20 64 3e  le-size throw d>
2cc0: 36 34 20 72 3e 20 77 72 69 74 65 40 70 6f 73 2d  64 r> write@pos-
2cd0: 66 69 6c 65 20 3b 0a 0a 3a 20 6b 65 79 3e 73 66  file ;..: key>sf
2ce0: 69 6c 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b  ile ( -- ).    k
2cf0: 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d 61  eypack keypack-a
2d00: 6c 6c 23 20 3f 6b 65 79 2d 73 66 64 20 61 70 70  ll# ?key-sfd app
2d10: 65 6e 64 2d 66 69 6c 65 20 3b 0a 3a 20 6b 65 79  end-file ;.: key
2d20: 3e 70 66 69 6c 65 20 28 20 2d 2d 20 29 0a 20 20  >pfile ( -- ).  
2d30: 20 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63    keypack keypac
2d40: 6b 2d 61 6c 6c 23 20 3f 6b 65 79 2d 70 66 64 20  k-all# ?key-pfd 
2d50: 61 70 70 65 6e 64 2d 66 69 6c 65 20 3b 0a 0a 3a  append-file ;..:
2d60: 20 6b 65 79 3e 73 66 69 6c 65 40 70 6f 73 20 28   key>sfile@pos (
2d70: 20 36 34 70 6f 73 20 2d 2d 20 29 20 36 34 3e 72   64pos -- ) 64>r
2d80: 0a 20 20 20 20 6b 65 79 70 61 63 6b 20 6b 65 79  .    keypack key
2d90: 70 61 63 6b 2d 61 6c 6c 23 20 36 34 72 3e 20 3f  pack-all# 64r> ?
2da0: 6b 65 79 2d 73 66 64 20 77 72 69 74 65 40 70 6f  key-sfd write@po
2db0: 73 2d 66 69 6c 65 20 3b 0a 3a 20 6b 65 79 3e 70  s-file ;.: key>p
2dc0: 66 69 6c 65 40 70 6f 73 20 28 20 36 34 70 6f 73  file@pos ( 64pos
2dd0: 20 2d 2d 20 29 20 36 34 3e 72 0a 20 20 20 20 6b   -- ) 64>r.    k
2de0: 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d 61  eypack keypack-a
2df0: 6c 6c 23 20 36 34 72 3e 20 3f 6b 65 79 2d 70 66  ll# 64r> ?key-pf
2e00: 64 20 77 72 69 74 65 40 70 6f 73 2d 66 69 6c 65  d write@pos-file
2e10: 20 3b 0a 0a 3a 20 72 6e 64 3e 73 66 69 6c 65 20   ;..: rnd>sfile 
2e20: 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 70 61  ( -- ).    keypa
2e30: 63 6b 20 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20  ck keypack-all# 
2e40: 3e 72 6e 67 24 20 6b 65 79 3e 73 66 69 6c 65 20  >rng$ key>sfile 
2e50: 3b 0a 3a 20 72 6e 64 3e 70 66 69 6c 65 20 28 20  ;.: rnd>pfile ( 
2e60: 2d 2d 20 29 0a 20 20 20 20 6b 65 79 70 61 63 6b  -- ).    keypack
2e70: 20 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20 3e 72   keypack-all# >r
2e80: 6e 67 24 20 6b 65 79 3e 70 66 69 6c 65 20 3b 0a  ng$ key>pfile ;.
2e90: 0a 3a 20 3e 6b 65 79 73 20 28 20 2d 2d 20 29 0a  .: >keys ( -- ).
2ea0: 20 20 20 20 5c 47 20 61 64 64 20 73 68 61 72 65      \G add share
2eb0: 64 20 73 65 63 72 65 74 20 74 6f 20 6c 69 73 74  d secret to list
2ec0: 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 6b 65 79   of possible key
2ed0: 73 0a 20 20 20 20 73 6b 63 20 70 6b 63 20 6b 65  s.    skc pkc ke
2ee0: 79 70 61 64 20 65 64 2d 64 68 20 2b 6b 65 79 20  ypad ed-dh +key 
2ef0: 3b 0a 0a 5c 20 6b 65 79 20 67 65 6e 65 72 61 74  ;..\ key generat
2f00: 69 6f 6e 0a 5c 20 66 6f 72 20 72 65 70 72 6f 64  ion.\ for reprod
2f10: 75 63 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  ucibility of the
2f20: 20 73 65 6c 66 73 69 67 2c 20 61 6c 77 61 79 73   selfsig, always
2f30: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6f 72   use the same or
2f40: 64 65 72 3a 0a 5c 20 22 70 75 62 6b 65 79 22 20  der:.\ "pubkey" 
2f50: 6e 65 77 6b 65 79 20 3c 6e 3e 20 6b 65 79 74 79  newkey <n> keyty
2f60: 70 65 20 22 6e 69 63 6b 22 20 6b 65 79 6e 69 63  pe "nick" keynic
2f70: 6b 20 22 73 69 67 22 20 6b 65 79 73 65 6c 66 73  k "sig" keyselfs
2f80: 69 67 0a 0a 55 73 65 72 20 70 6b 2b 73 69 67 24  ig..User pk+sig$
2f90: 0a 0a 6b 65 79 73 69 7a 65 20 32 2a 20 43 6f 6e  ..keysize 2* Con
2fa0: 73 74 61 6e 74 20 70 6b 72 6b 23 0a 0a 3a 20 5d  stant pkrk#..: ]
2fb0: 70 6b 2b 73 69 67 6e 20 28 20 61 64 64 72 20 75  pk+sign ( addr u
2fc0: 20 2d 2d 20 29 20 2b 63 6d 64 62 75 66 20 5d 73   -- ) +cmdbuf ]s
2fd0: 69 67 6e 20 3b 0a 0a 3a 20 70 61 63 6b 2d 6b 65  ign ;..: pack-ke
2fe0: 79 20 28 20 74 79 70 65 20 6e 69 63 6b 20 75 20  y ( type nick u 
2ff0: 2d 2d 20 29 0a 20 20 20 20 6e 6f 77 3e 6e 65 76  -- ).    now>nev
3000: 65 72 0a 20 20 20 20 6b 65 79 3a 63 6f 64 65 0a  er.    key:code.
3010: 20 20 20 20 20 20 73 69 67 6e 5b 0a 20 20 20 20        sign[.    
3020: 20 20 72 6f 74 20 75 6c 69 74 2c 20 6b 65 79 74    rot ulit, keyt
3030: 79 70 65 20 24 2c 20 6b 65 79 6e 69 63 6b 0a 20  ype $, keynick. 
3040: 20 20 20 20 20 70 6b 63 20 70 6b 72 6b 23 20 5d       pkc pkrk# ]
3050: 70 6b 2b 73 69 67 6e 0a 20 20 20 20 20 20 73 6b  pk+sign.      sk
3060: 63 20 6b 65 79 73 69 7a 65 20 24 2c 20 70 72 69  c keysize $, pri
3070: 76 6b 65 79 0a 20 20 20 20 65 6e 64 3a 6b 65 79  vkey.    end:key
3080: 20 3b 0a 0a 61 6c 73 6f 20 6e 65 74 32 6f 2d 62   ;..also net2o-b
3090: 61 73 65 0a 3a 20 70 61 63 6b 2d 63 6f 72 65 6b  ase.: pack-corek
30a0: 65 79 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 29 0a  ey ( o:key -- ).
30b0: 20 20 20 20 73 69 67 6e 5b 0a 20 20 20 20 6b 65      sign[.    ke
30c0: 2d 74 79 70 65 20 40 20 75 6c 69 74 2c 20 6b 65  -type @ ulit, ke
30d0: 79 74 79 70 65 0a 20 20 20 20 6b 65 2d 6e 69 63  ytype.    ke-nic
30e0: 6b 20 24 40 20 24 2c 20 6b 65 79 6e 69 63 6b 0a  k $@ $, keynick.
30f0: 20 20 20 20 6b 65 2d 70 73 6b 20 73 65 63 40 20      ke-psk sec@ 
3100: 64 75 70 20 49 46 20 20 24 2c 20 6b 65 79 70 73  dup IF  $, keyps
3110: 6b 20 20 45 4c 53 45 20 20 32 64 72 6f 70 20 20  k  ELSE  2drop  
3120: 54 48 45 4e 0a 20 20 20 20 6b 65 2d 70 72 6f 66  THEN.    ke-prof
3130: 20 24 40 20 64 75 70 20 49 46 20 20 24 2c 20 6b   $@ dup IF  $, k
3140: 65 79 70 72 6f 66 69 6c 65 20 20 45 4c 53 45 20  eyprofile  ELSE 
3150: 20 32 64 72 6f 70 20 20 54 48 45 4e 0a 20 20 20   2drop  THEN.   
3160: 20 6b 65 2d 70 6b 20 24 40 20 2b 63 6d 64 62 75   ke-pk $@ +cmdbu
3170: 66 0a 20 20 20 20 6b 65 2d 73 65 6c 66 73 69 67  f.    ke-selfsig
3180: 20 24 40 20 2b 63 6d 64 62 75 66 20 63 6d 64 2d   $@ +cmdbuf cmd-
3190: 72 65 73 6f 6c 76 65 3e 20 32 64 72 6f 70 20 6e  resolve> 2drop n
31a0: 65 73 74 73 69 67 0a 20 20 20 20 6b 65 2d 73 74  estsig.    ke-st
31b0: 6f 72 65 6b 65 79 20 40 20 3e 73 74 6f 72 65 6b  orekey @ >storek
31c0: 65 79 20 21 20 3b 0a 70 72 65 76 69 6f 75 73 0a  ey ! ;.previous.
31d0: 0a 3a 20 70 61 63 6b 2d 70 75 62 6b 65 79 20 28  .: pack-pubkey (
31e0: 20 6f 3a 6b 65 79 20 2d 2d 20 29 0a 20 20 20 20   o:key -- ).    
31f0: 6b 65 79 3a 63 6f 64 65 0a 20 20 20 20 20 20 70  key:code.      p
3200: 61 63 6b 2d 63 6f 72 65 6b 65 79 0a 20 20 20 20  ack-corekey.    
3210: 65 6e 64 3a 6b 65 79 20 3b 0a 3a 20 70 61 63 6b  end:key ;.: pack
3220: 2d 73 65 63 6b 65 79 20 28 20 6f 3a 6b 65 79 20  -seckey ( o:key 
3230: 2d 2d 20 29 0a 20 20 20 20 6b 65 79 3a 63 6f 64  -- ).    key:cod
3240: 65 0a 20 20 20 20 20 20 70 61 63 6b 2d 63 6f 72  e.      pack-cor
3250: 65 6b 65 79 0a 20 20 20 20 20 20 6b 65 2d 73 6b  ekey.      ke-sk
3260: 20 73 65 63 40 20 24 2c 20 70 72 69 76 6b 65 79   sec@ $, privkey
3270: 0a 20 20 20 20 65 6e 64 3a 6b 65 79 20 3b 0a 0a  .    end:key ;..
3280: 3a 20 3e 62 61 63 6b 75 70 20 28 20 61 64 64 72  : >backup ( addr
3290: 20 75 20 2d 2d 20 29 0a 20 20 20 20 32 64 75 70   u -- ).    2dup
32a0: 20 32 64 75 70 20 5b 3a 20 74 79 70 65 20 27 7e   2dup [: type '~
32b0: 27 20 65 6d 69 74 20 3b 5d 20 24 74 6d 70 20 72  ' emit ;] $tmp r
32c0: 65 6e 61 6d 65 2d 66 69 6c 65 20 74 68 72 6f 77  ename-file throw
32d0: 0a 20 20 20 20 32 64 75 70 20 5b 3a 20 74 79 70  .    2dup [: typ
32e0: 65 20 27 2b 27 20 65 6d 69 74 20 3b 5d 20 24 74  e '+' emit ;] $t
32f0: 6d 70 20 32 73 77 61 70 20 72 65 6e 61 6d 65 2d  mp 2swap rename-
3300: 66 69 6c 65 20 74 68 72 6f 77 20 3b 0a 0a 56 61  file throw ;..Va
3310: 72 69 61 62 6c 65 20 63 70 2d 74 6d 70 0a 0a 3a  riable cp-tmp..:
3320: 20 73 61 76 65 2d 70 75 62 6b 65 79 73 20 28 20   save-pubkeys ( 
3330: 2d 2d 20 29 0a 20 20 20 20 6b 65 79 2d 70 66 64  -- ).    key-pfd
3340: 20 3f 64 75 70 2d 49 46 0a 09 64 75 70 20 30 2e   ?dup-IF..dup 0.
3350: 20 72 6f 74 20 72 65 70 6f 73 69 74 69 6f 6e 2d   rot reposition-
3360: 66 69 6c 65 20 74 68 72 6f 77 0a 09 64 75 70 20  file throw..dup 
3370: 63 70 2d 74 6d 70 20 24 73 6c 75 72 70 20 63 6c  cp-tmp $slurp cl
3380: 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 20  ose-file throw  
3390: 54 48 45 4e 0a 20 20 20 20 30 20 22 7e 2f 2e 6e  THEN.    0 "~/.n
33a0: 65 74 32 6f 2f 70 75 62 6b 65 79 73 2e 6b 32 6f  et2o/pubkeys.k2o
33b0: 2b 22 20 3f 66 64 20 74 6f 20 6b 65 79 2d 70 66  +" ?fd to key-pf
33c0: 64 0a 20 20 20 20 63 70 2d 74 6d 70 20 24 40 20  d.    cp-tmp $@ 
33d0: 6b 65 79 2d 70 66 64 20 77 72 69 74 65 2d 66 69  key-pfd write-fi
33e0: 6c 65 20 74 68 72 6f 77 20 63 70 2d 74 6d 70 20  le throw cp-tmp 
33f0: 24 6f 66 66 0a 20 20 20 20 6b 65 79 2d 74 61 62  $off.    key-tab
3400: 6c 65 20 5b 3a 20 63 65 6c 6c 2b 20 24 40 20 64  le [: cell+ $@ d
3410: 72 6f 70 20 63 65 6c 6c 2b 20 3e 6f 0a 20 20 20  rop cell+ >o.   
3420: 20 20 20 6b 65 2d 73 6b 20 73 65 63 40 20 64 30     ke-sk sec@ d0
3430: 3d 20 49 46 20 20 70 61 63 6b 2d 70 75 62 6b 65  = IF  pack-pubke
3440: 79 0a 09 20 20 66 6c 75 73 68 28 20 2e 22 20 73  y..  flush( ." s
3450: 61 76 69 6e 67 20 22 20 6b 65 2d 6e 69 63 6b 20  aving " ke-nick 
3460: 24 40 20 74 79 70 65 20 66 6f 72 74 68 3a 63 72  $@ type forth:cr
3470: 20 29 0a 09 20 20 6b 65 79 2d 63 72 79 70 74 20   )..  key-crypt 
3480: 6b 65 2d 6f 66 66 73 65 74 20 36 34 40 20 6b 65  ke-offset 64@ ke
3490: 79 3e 70 66 69 6c 65 40 70 6f 73 0a 20 20 20 20  y>pfile@pos.    
34a0: 20 20 54 48 45 4e 20 6f 3e 20 3b 5d 20 23 6d 61    THEN o> ;] #ma
34b0: 70 0a 20 20 20 20 6b 65 79 2d 70 66 64 20 63 6c  p.    key-pfd cl
34c0: 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77 0a 20  ose-file throw. 
34d0: 20 20 20 22 7e 2f 2e 6e 65 74 32 6f 2f 70 75 62     "~/.net2o/pub
34e0: 6b 65 79 73 2e 6b 32 6f 22 20 3e 62 61 63 6b 75  keys.k2o" >backu
34f0: 70 0a 20 20 20 20 30 20 74 6f 20 6b 65 79 2d 70  p.    0 to key-p
3500: 66 64 20 3b 0a 0a 3a 20 73 61 76 65 2d 73 65 63  fd ;..: save-sec
3510: 6b 65 79 73 20 28 20 2d 2d 20 29 0a 20 20 20 20  keys ( -- ).    
3520: 6b 65 79 2d 73 66 64 20 3f 64 75 70 2d 49 46 0a  key-sfd ?dup-IF.
3530: 09 64 75 70 20 30 2e 20 72 6f 74 20 72 65 70 6f  .dup 0. rot repo
3540: 73 69 74 69 6f 6e 2d 66 69 6c 65 20 74 68 72 6f  sition-file thro
3550: 77 0a 09 64 75 70 20 63 70 2d 74 6d 70 20 24 73  w..dup cp-tmp $s
3560: 6c 75 72 70 20 63 6c 6f 73 65 2d 66 69 6c 65 20  lurp close-file 
3570: 74 68 72 6f 77 20 20 54 48 45 4e 0a 20 20 20 20  throw  THEN.    
3580: 30 20 22 7e 2f 2e 6e 65 74 32 6f 2f 73 65 63 6b  0 "~/.net2o/seck
3590: 65 79 73 2e 6b 32 6f 2b 22 20 3f 66 64 20 74 6f  eys.k2o+" ?fd to
35a0: 20 6b 65 79 2d 73 66 64 0a 20 20 20 20 63 70 2d   key-sfd.    cp-
35b0: 74 6d 70 20 24 40 20 6b 65 79 2d 73 66 64 20 77  tmp $@ key-sfd w
35c0: 72 69 74 65 2d 66 69 6c 65 20 74 68 72 6f 77 20  rite-file throw 
35d0: 63 70 2d 74 6d 70 20 24 6f 66 66 0a 20 20 20 20  cp-tmp $off.    
35e0: 6b 65 79 2d 74 61 62 6c 65 20 5b 3a 20 63 65 6c  key-table [: cel
35f0: 6c 2b 20 24 40 20 64 72 6f 70 20 63 65 6c 6c 2b  l+ $@ drop cell+
3600: 20 3e 6f 0a 20 20 20 20 20 20 6b 65 2d 73 6b 20   >o.      ke-sk 
3610: 73 65 63 40 20 64 30 3c 3e 20 49 46 20 20 70 61  sec@ d0<> IF  pa
3620: 63 6b 2d 73 65 63 6b 65 79 0a 09 20 20 6b 65 79  ck-seckey..  key
3630: 2d 63 72 79 70 74 20 6b 65 2d 6f 66 66 73 65 74  -crypt ke-offset
3640: 20 36 34 40 20 6b 65 79 3e 73 66 69 6c 65 40 70   64@ key>sfile@p
3650: 6f 73 0a 20 20 20 20 20 20 54 48 45 4e 20 6f 3e  os.      THEN o>
3660: 20 3b 5d 20 23 6d 61 70 0a 20 20 20 20 22 7e 2f   ;] #map.    "~/
3670: 2e 6e 65 74 32 6f 2f 73 65 63 6b 65 79 73 2e 6b  .net2o/seckeys.k
3680: 32 6f 22 20 3e 62 61 63 6b 75 70 0a 20 20 20 20  2o" >backup.    
3690: 6b 65 79 2d 73 66 64 20 63 6c 6f 73 65 2d 66 69  key-sfd close-fi
36a0: 6c 65 20 74 68 72 6f 77 20 30 20 74 6f 20 6b 65  le throw 0 to ke
36b0: 79 2d 73 66 64 20 3b 0a 0a 3a 20 73 61 76 65 2d  y-sfd ;..: save-
36c0: 6b 65 79 73 20 28 20 2d 2d 20 29 0a 20 20 20 20  keys ( -- ).    
36d0: 73 61 76 65 2d 70 75 62 6b 65 79 73 20 73 61 76  save-pubkeys sav
36e0: 65 2d 73 65 63 6b 65 79 73 20 3b 0a 0a 3a 20 2b  e-seckeys ;..: +
36f0: 67 65 6e 2d 6b 65 79 73 20 28 20 6e 69 63 6b 20  gen-keys ( nick 
3700: 75 20 74 79 70 65 20 2d 2d 20 29 20 2d 72 6f 74  u type -- ) -rot
3710: 0a 20 20 20 20 67 65 6e 2d 6b 65 79 73 20 3e 6b  .    gen-keys >k
3720: 65 79 73 20 70 61 63 6b 2d 6b 65 79 20 6b 65 79  eys pack-key key
3730: 2d 63 72 79 70 74 20 6b 65 79 3e 73 66 69 6c 65  -crypt key>sfile
3740: 20 3b 0a 0a 3a 20 2b 6b 65 79 70 61 69 72 20 28   ;..: +keypair (
3750: 20 74 79 70 65 20 6e 69 63 6b 20 75 20 2d 2d 20   type nick u -- 
3760: 29 20 2b 70 61 73 73 70 68 72 61 73 65 20 2b 67  ) +passphrase +g
3770: 65 6e 2d 6b 65 79 73 20 3b 0a 0a 3a 20 2e 72 76  en-keys ;..: .rv
3780: 6b 20 2e 22 20 50 6c 65 61 73 65 20 77 72 69 74  k ." Please writ
3790: 65 20 64 6f 77 6e 20 72 65 76 6f 6b 65 20 6b 65  e down revoke ke
37a0: 79 3a 20 22 20 63 72 0a 20 20 20 20 73 6b 72 65  y: " cr.    skre
37b0: 76 20 24 32 30 20 62 6f 75 6e 64 73 20 44 4f 20  v $20 bounds DO 
37c0: 20 2e 22 20 5c 20 22 20 49 20 34 20 38 35 74 79   ." \ " I 4 85ty
37d0: 70 65 20 73 70 61 63 65 20 49 20 34 20 2b 20 34  pe space I 4 + 4
37e0: 20 38 35 74 79 70 65 20 63 72 20 38 20 2b 4c 4f   85type cr 8 +LO
37f0: 4f 50 20 3b 0a 0a 24 34 30 20 62 75 66 66 65 72  OP ;..$40 buffer
3800: 3a 20 6e 69 63 6b 2d 62 75 66 0a 0a 3a 20 6d 61  : nick-buf..: ma
3810: 6b 65 2d 6b 65 79 20 28 20 2d 2d 20 29 0a 20 20  ke-key ( -- ).  
3820: 20 20 6b 65 79 23 75 73 65 72 20 2e 22 20 6e 69    key#user ." ni
3830: 63 6b 3a 20 22 20 6e 69 63 6b 2d 62 75 66 20 24  ck: " nick-buf $
3840: 34 30 20 61 63 63 65 70 74 20 6e 69 63 6b 2d 62  40 accept nick-b
3850: 75 66 20 73 77 61 70 20 63 72 0a 20 20 20 20 2e  uf swap cr.    .
3860: 22 20 70 61 73 73 70 68 72 61 73 65 3a 20 22 20  " passphrase: " 
3870: 2b 70 61 73 73 70 68 72 61 73 65 20 6b 65 79 3e  +passphrase key>
3880: 64 65 66 61 75 6c 74 0a 20 20 20 20 63 72 20 2b  default.    cr +
3890: 67 65 6e 2d 6b 65 79 73 20 2e 72 76 6b 20 3b 0a  gen-keys .rvk ;.
38a0: 0a 5c 20 72 65 61 64 20 6b 65 79 20 66 69 6c 65  .\ read key file
38b0: 0a 0a 3a 20 74 72 79 2d 64 65 63 72 79 70 74 2d  ..: try-decrypt-
38c0: 6b 65 79 20 28 20 6b 65 79 20 75 31 20 2d 2d 20  key ( key u1 -- 
38d0: 61 64 64 72 20 75 32 20 66 6c 61 67 20 29 0a 20  addr u2 flag ). 
38e0: 20 20 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61     keypack keypa
38f0: 63 6b 2d 64 20 6b 65 79 70 61 63 6b 2d 61 6c 6c  ck-d keypack-all
3900: 23 20 6d 6f 76 65 0a 20 20 20 20 6b 65 79 70 61  # move.    keypa
3910: 63 6b 2d 64 20 6b 65 79 70 61 63 6b 2d 61 6c 6c  ck-d keypack-all
3920: 23 20 32 73 77 61 70 0a 20 20 20 20 64 75 70 20  # 2swap.    dup 
3930: 24 32 30 20 3d 20 49 46 20 20 64 65 63 72 79 70  $20 = IF  decryp
3940: 74 24 20 20 45 4c 53 45 0a 09 6b 65 79 70 61 63  t$  ELSE..keypac
3950: 6b 20 63 40 20 24 46 20 61 6e 64 20 70 77 2d 6c  k c@ $F and pw-l
3960: 65 76 65 6c 23 20 3c 3d 20 49 46 20 20 64 65 63  evel# <= IF  dec
3970: 72 79 70 74 2d 70 77 24 0a 09 45 4c 53 45 20 20  rypt-pw$..ELSE  
3980: 32 64 72 6f 70 20 66 61 6c 73 65 20 20 54 48 45  2drop false  THE
3990: 4e 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20  N.    THEN ;..: 
39a0: 74 72 79 2d 64 65 63 72 79 70 74 20 28 20 2d 2d  try-decrypt ( --
39b0: 20 61 64 64 72 20 75 20 2f 20 30 20 30 20 29 0a   addr u / 0 0 ).
39c0: 20 20 20 20 6b 65 79 73 20 24 5b 5d 23 20 30 20      keys $[]# 0 
39d0: 3f 44 4f 0a 09 49 20 6b 65 79 73 20 73 65 63 5b  ?DO..I keys sec[
39e0: 5d 40 20 74 72 79 2d 64 65 63 72 79 70 74 2d 6b  ]@ try-decrypt-k
39f0: 65 79 20 49 46 0a 09 20 20 20 20 49 20 6b 65 79  ey IF..    I key
3a00: 73 20 24 5b 5d 20 40 20 3e 73 74 6f 72 65 6b 65  s $[] @ >storeke
3a10: 79 20 21 20 75 6e 6c 6f 6f 70 20 20 45 58 49 54  y ! unloop  EXIT
3a20: 20 20 54 48 45 4e 0a 09 32 64 72 6f 70 0a 20 20    THEN..2drop.  
3a30: 20 20 4c 4f 4f 50 20 20 30 20 30 20 3b 0a 0a 3a    LOOP  0 0 ;..:
3a40: 20 64 6f 2d 6b 65 79 20 28 20 61 64 64 72 20 75   do-key ( addr u
3a50: 20 2f 20 30 20 30 20 20 2d 2d 20 29 0a 20 20 20   / 0 0  -- ).   
3a60: 20 64 75 70 20 30 3d 20 49 46 20 20 32 64 72 6f   dup 0= IF  2dro
3a70: 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20  p  EXIT  THEN.  
3a80: 20 20 73 61 6d 70 6c 65 2d 6b 65 79 20 2e 64 6f    sample-key .do
3a90: 2d 63 6d 64 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20 72  -cmd-loop ;..: r
3aa0: 65 61 64 2d 6b 65 79 73 2d 6c 6f 6f 70 20 28 20  ead-keys-loop ( 
3ab0: 66 64 20 2d 2d 20 29 20 20 63 6f 64 65 2d 6b 65  fd -- )  code-ke
3ac0: 79 0a 20 20 20 20 3e 72 20 30 2e 20 72 40 20 72  y.    >r 0. r@ r
3ad0: 65 70 6f 73 69 74 69 6f 6e 2d 66 69 6c 65 20 74  eposition-file t
3ae0: 68 72 6f 77 0a 20 20 20 20 42 45 47 49 4e 0a 09  hrow.    BEGIN..
3af0: 72 40 20 66 69 6c 65 2d 70 6f 73 69 74 69 6f 6e  r@ file-position
3b00: 20 74 68 72 6f 77 20 64 3e 36 34 20 6b 65 79 2d   throw d>64 key-
3b10: 72 65 61 64 2d 6f 66 66 73 65 74 20 36 34 21 0a  read-offset 64!.
3b20: 09 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b  .keypack keypack
3b30: 2d 61 6c 6c 23 20 72 40 20 72 65 61 64 2d 66 69  -all# r@ read-fi
3b40: 6c 65 20 74 68 72 6f 77 0a 09 6b 65 79 70 61 63  le throw..keypac
3b50: 6b 2d 61 6c 6c 23 20 3d 20 57 48 49 4c 45 20 20  k-all# = WHILE  
3b60: 74 72 79 2d 64 65 63 72 79 70 74 20 64 6f 2d 6b  try-decrypt do-k
3b70: 65 79 0a 20 20 20 20 52 45 50 45 41 54 20 20 72  ey.    REPEAT  r
3b80: 64 72 6f 70 20 20 63 6f 64 65 30 2d 62 75 66 20  drop  code0-buf 
3b90: 3b 0a 3a 20 72 65 61 64 2d 6b 65 79 2d 6c 6f 6f  ;.: read-key-loo
3ba0: 70 20 28 20 2d 2d 20 29 20 3f 6b 65 79 2d 73 66  p ( -- ) ?key-sf
3bb0: 64 20 72 65 61 64 2d 6b 65 79 73 2d 6c 6f 6f 70  d read-keys-loop
3bc0: 20 3b 0a 3a 20 72 65 61 64 2d 70 6b 65 79 2d 6c   ;.: read-pkey-l
3bd0: 6f 6f 70 20 28 20 2d 2d 20 29 20 70 77 2d 6c 65  oop ( -- ) pw-le
3be0: 76 65 6c 23 20 3e 72 20 2d 31 20 74 6f 20 70 77  vel# >r -1 to pw
3bf0: 2d 6c 65 76 65 6c 23 0a 20 20 20 20 3f 6b 65 79  -level#.    ?key
3c00: 2d 70 66 64 20 72 65 61 64 2d 6b 65 79 73 2d 6c  -pfd read-keys-l
3c10: 6f 6f 70 20 72 3e 20 74 6f 20 70 77 2d 6c 65 76  oop r> to pw-lev
3c20: 65 6c 23 20 3b 0a 0a 3a 20 72 65 61 64 2d 6b 65  el# ;..: read-ke
3c30: 79 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 72 65  ys ( -- ).    re
3c40: 61 64 2d 6b 65 79 2d 6c 6f 6f 70 20 72 65 61 64  ad-key-loop read
3c50: 2d 70 6b 65 79 2d 6c 6f 6f 70 20 3b 0a 0a 5c 20  -pkey-loop ;..\ 
3c60: 73 65 6c 65 63 74 20 6b 65 79 20 62 79 20 6e 69  select key by ni
3c70: 63 6b 0a 0a 3a 20 3e 72 61 77 2d 6b 65 79 20 28  ck..: >raw-key (
3c80: 20 6f 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 20   o -- ).    dup 
3c90: 30 3d 20 21 21 6e 6f 2d 6e 69 63 6b 21 21 20 3e  0= !!no-nick!! >
3ca0: 6f 0a 20 20 20 20 6b 65 2d 70 6b 20 24 40 20 70  o.    ke-pk $@ p
3cb0: 6b 63 20 73 77 61 70 20 70 6b 72 6b 23 20 75 6d  kc swap pkrk# um
3cc0: 69 6e 20 6d 6f 76 65 0a 20 20 20 20 6b 65 2d 70  in move.    ke-p
3cd0: 73 6b 20 73 65 63 40 20 6d 79 2d 30 6b 65 79 20  sk sec@ my-0key 
3ce0: 73 65 63 21 0a 20 20 20 20 6b 65 2d 73 6b 20 73  sec!.    ke-sk s
3cf0: 65 63 40 20 73 6b 63 20 73 77 61 70 20 6b 65 79  ec@ skc swap key
3d00: 73 69 7a 65 20 75 6d 69 6e 20 6d 6f 76 65 0a 20  size umin move. 
3d10: 20 20 20 3e 73 6b 73 69 67 20 6f 3e 20 3b 0a 0a     >sksig o> ;..
3d20: 3a 20 3e 6b 65 79 20 28 20 61 64 64 72 20 75 20  : >key ( addr u 
3d30: 2d 2d 20 29 0a 20 20 20 20 6b 65 79 2d 74 61 62  -- ).    key-tab
3d40: 6c 65 20 40 20 30 3d 20 49 46 20 20 72 65 61 64  le @ 0= IF  read
3d50: 2d 6b 65 79 73 20 20 54 48 45 4e 0a 20 20 20 20  -keys  THEN.    
3d60: 6e 69 63 6b 2d 6b 65 79 20 3e 72 61 77 2d 6b 65  nick-key >raw-ke
3d70: 79 20 3b 0a 0a 3a 20 69 27 6d 20 28 20 22 6e 61  y ;..: i'm ( "na
3d80: 6d 65 22 20 2d 2d 20 29 20 70 61 72 73 65 2d 6e  me" -- ) parse-n
3d90: 61 6d 65 20 3e 6b 65 79 20 3b 0a 3a 20 70 6b 27  ame >key ;.: pk'
3da0: 20 28 20 22 6e 61 6d 65 22 20 2d 2d 20 61 64 64   ( "name" -- add
3db0: 72 20 75 20 29 0a 20 20 20 20 70 61 72 73 65 2d  r u ).    parse-
3dc0: 6e 61 6d 65 20 6e 69 63 6b 3e 70 6b 20 3b 0a 0a  name nick>pk ;..
3dd0: 3a 20 64 65 73 74 2d 6b 65 79 20 28 20 61 64 64  : dest-key ( add
3de0: 72 20 75 20 2d 2d 20 29 20 64 75 70 20 30 3d 20  r u -- ) dup 0= 
3df0: 49 46 20 20 32 64 72 6f 70 20 20 45 58 49 54 20  IF  2drop  EXIT 
3e00: 20 54 48 45 4e 0a 20 20 20 20 6e 69 63 6b 2d 6b   THEN.    nick-k
3e10: 65 79 20 3e 6f 20 6f 20 30 3d 20 21 21 75 6e 6b  ey >o o 0= !!unk
3e20: 6e 6f 77 6e 2d 6b 65 79 21 21 0a 20 20 20 20 6b  nown-key!!.    k
3e30: 65 2d 70 73 6b 20 73 65 63 40 20 73 74 61 74 65  e-psk sec@ state
3e40: 23 20 75 6d 69 6e 0a 20 20 20 20 6b 65 2d 70 6b  # umin.    ke-pk
3e50: 20 24 40 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e   $@ keysize umin
3e60: 20 6f 3e 0a 20 20 20 20 70 75 62 6b 65 79 20 24   o>.    pubkey $
3e70: 21 20 20 64 65 73 74 2d 30 6b 65 79 20 73 65 63  !  dest-0key sec
3e80: 21 20 3b 0a 0a 3a 20 64 65 73 74 2d 70 6b 20 28  ! ;..: dest-pk (
3e90: 20 61 64 64 72 20 75 20 2d 2d 20 29 20 32 64 75   addr u -- ) 2du
3ea0: 70 20 6b 65 79 2d 74 61 62 6c 65 20 23 40 20 30  p key-table #@ 0
3eb0: 3d 20 49 46 0a 09 64 72 6f 70 20 6b 65 79 73 69  = IF..drop keysi
3ec0: 7a 65 20 75 6d 69 6e 20 70 75 62 6b 65 79 20 24  ze umin pubkey $
3ed0: 21 0a 20 20 20 20 45 4c 53 45 20 20 63 65 6c 6c  !.    ELSE  cell
3ee0: 2b 20 3e 6f 0a 09 6b 65 2d 70 73 6b 20 73 65 63  + >o..ke-psk sec
3ef0: 40 20 73 74 61 74 65 23 20 75 6d 69 6e 0a 09 6b  @ state# umin..k
3f00: 65 2d 70 6b 20 24 40 20 6b 65 79 73 69 7a 65 20  e-pk $@ keysize 
3f10: 75 6d 69 6e 20 6f 3e 0a 09 70 75 62 6b 65 79 20  umin o>..pubkey 
3f20: 24 21 20 20 64 65 73 74 2d 30 6b 65 79 20 73 65  $!  dest-0key se
3f30: 63 21 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 72 65  c!  THEN ;..: re
3f40: 70 6c 61 63 65 2d 6b 65 79 20 31 20 2f 73 74 72  place-key 1 /str
3f50: 69 6e 67 20 7b 20 72 65 76 2d 61 64 64 72 20 75  ing { rev-addr u
3f60: 20 2d 2d 20 6f 20 7d 20 5c 20 72 65 76 6f 63 61   -- o } \ revoca
3f70: 74 69 6f 6e 20 74 69 63 6b 65 74 0a 20 20 20 20  tion ticket.    
3f80: 6b 65 79 28 20 2e 22 20 52 65 70 6c 61 63 65 3a  key( ." Replace:
3f90: 22 20 63 72 20 6f 20 63 65 6c 6c 2d 20 30 20 2e  " cr o cell- 0 .
3fa0: 6b 65 79 20 29 0a 20 20 20 20 73 22 20 23 72 65  key ).    s" #re
3fb0: 76 6f 6b 65 64 22 20 64 75 70 20 3e 72 20 6b 65  voked" dup >r ke
3fc0: 2d 6e 69 63 6b 20 24 2b 21 0a 20 20 20 20 6b 65  -nick $+!.    ke
3fd0: 2d 6e 69 63 6b 20 24 40 20 72 3e 20 2d 20 6b 65  -nick $@ r> - ke
3fe0: 2d 70 72 6f 66 20 24 40 20 6b 65 2d 70 73 6b 20  -prof $@ ke-psk 
3ff0: 73 65 63 40 20 6b 65 2d 73 69 67 73 20 6b 65 2d  sec@ ke-sigs ke-
4000: 74 79 70 65 20 40 0a 20 20 20 20 72 65 76 2d 61  type @.    rev-a
4010: 64 64 72 20 70 6b 72 6b 23 20 6b 65 79 3f 6e 65  ddr pkrk# key?ne
4020: 77 20 3e 6f 0a 20 20 20 20 6b 65 2d 74 79 70 65  w >o.    ke-type
4030: 20 21 20 5b 3a 20 6b 65 2d 73 69 67 73 20 24 2b   ! [: ke-sigs $+
4040: 5b 5d 21 20 3b 5d 20 24 5b 5d 6d 61 70 20 6b 65  []! ;] $[]map ke
4050: 2d 70 73 6b 20 73 65 63 21 20 6b 65 2d 70 72 6f  -psk sec! ke-pro
4060: 66 20 24 21 20 6b 65 2d 6e 69 63 6b 20 24 21 0a  f $! ke-nick $!.
4070: 20 20 20 20 72 65 76 2d 61 64 64 72 20 70 6b 72      rev-addr pkr
4080: 6b 23 20 6b 65 2d 70 6b 20 24 21 0a 20 20 20 20  k# ke-pk $!.    
4090: 72 65 76 2d 61 64 64 72 20 75 20 2b 20 31 2d 20  rev-addr u + 1- 
40a0: 64 75 70 20 63 40 20 32 2a 20 2d 20 24 31 30 20  dup c@ 2* - $10 
40b0: 2d 20 24 31 30 20 6b 65 2d 73 65 6c 66 73 69 67  - $10 ke-selfsig
40c0: 20 24 21 0a 20 20 20 20 6b 65 79 28 20 2e 22 20   $!.    key( ." 
40d0: 77 69 74 68 3a 22 20 63 72 20 6f 20 63 65 6c 6c  with:" cr o cell
40e0: 2d 20 30 20 2e 6b 65 79 20 29 20 6f 20 6f 3e 20  - 0 .key ) o o> 
40f0: 3b 0a 0a 3a 20 72 65 6e 65 77 2d 6b 65 79 20 28  ;..: renew-key (
4100: 20 72 65 76 61 64 64 72 20 75 31 20 6b 65 79 61   revaddr u1 keya
4110: 64 64 72 20 75 32 20 2d 2d 20 6f 20 29 0a 20 20  ddr u2 -- o ).  
4120: 20 20 63 75 72 72 65 6e 74 2d 6b 65 79 20 3e 6f    current-key >o
4130: 20 72 65 70 6c 61 63 65 2d 6b 65 79 20 6f 3e 0a   replace-key o>.
4140: 20 20 20 20 3e 6f 20 73 6b 63 20 6b 65 79 73 69      >o skc keysi
4150: 7a 65 20 6b 65 2d 73 6b 20 73 65 63 21 20 6f 20  ze ke-sk sec! o 
4160: 6f 3e 20 3b 0a 0a 5c 20 72 65 76 6f 6b 61 74 69  o> ;..\ revokati
4170: 6f 6e 0a 0a 34 20 64 61 74 65 73 69 7a 65 23 20  on..4 datesize# 
4180: 2b 20 6b 65 79 73 69 7a 65 20 39 20 2a 20 2b 20  + keysize 9 * + 
4190: 43 6f 6e 73 74 61 6e 74 20 72 65 76 73 69 7a 65  Constant revsize
41a0: 23 0a 0a 56 61 72 69 61 62 6c 65 20 72 65 76 74  #..Variable revt
41b0: 6f 6b 65 6e 0a 0a 3a 20 30 6f 6c 64 6b 65 79 20  oken..: 0oldkey 
41c0: 28 20 2d 2d 20 29 20 5c 20 70 75 62 6b 65 79 73  ( -- ) \ pubkeys
41d0: 20 63 61 6e 20 73 74 61 79 0a 20 20 20 20 6f 6c   can stay.    ol
41e0: 64 73 6b 63 20 6b 65 79 73 69 7a 65 20 65 72 61  dskc keysize era
41f0: 73 65 20 20 6f 6c 64 73 6b 72 65 76 20 6b 65 79  se  oldskrev key
4200: 73 69 7a 65 20 65 72 61 73 65 20 3b 0a 0a 3a 20  size erase ;..: 
4210: 6b 65 79 6d 6f 76 65 20 28 20 61 64 64 72 31 20  keymove ( addr1 
4220: 61 64 64 72 32 20 2d 2d 20 29 20 20 6b 65 79 73  addr2 -- )  keys
4230: 69 7a 65 20 6d 6f 76 65 20 3b 0a 0a 3a 20 72 65  ize move ;..: re
4240: 76 6f 6b 65 2d 76 65 72 69 66 79 20 28 20 61 64  voke-verify ( ad
4250: 64 72 20 75 31 20 70 6b 20 73 74 72 69 6e 67 20  dr u1 pk string 
4260: 75 32 20 2d 2d 20 61 64 64 72 20 75 20 66 6c 61  u2 -- addr u fla
4270: 67 20 29 20 72 6f 74 20 3e 72 20 32 3e 72 20 63  g ) rot >r 2>r c
4280: 3a 30 6b 65 79 0a 20 20 20 20 73 69 67 6f 6e 6c  :0key.    sigonl
4290: 79 73 69 7a 65 23 20 2d 20 32 64 75 70 20 32 72  ysize# - 2dup 2r
42a0: 3e 20 3e 6b 65 79 65 64 2d 68 61 73 68 0a 20 20  > >keyed-hash.  
42b0: 20 20 73 69 67 64 61 74 65 20 2b 64 61 74 65 0a    sigdate +date.
42c0: 20 20 20 20 32 64 75 70 20 2b 20 72 3e 20 65 64      2dup + r> ed
42d0: 2d 76 65 72 69 66 79 20 3b 0a 0a 3a 20 3e 72 65  -verify ;..: >re
42e0: 76 6f 6b 65 20 28 20 73 6b 72 65 76 20 2d 2d 20  voke ( skrev -- 
42f0: 29 20 20 73 6b 72 65 76 20 6b 65 79 6d 6f 76 65  )  skrev keymove
4300: 20 20 63 68 65 63 6b 2d 72 65 76 3f 20 30 3d 20    check-rev? 0= 
4310: 21 21 6e 6f 74 2d 6d 79 2d 72 65 76 73 6b 21 21  !!not-my-revsk!!
4320: 20 3b 0a 0a 3a 20 2b 72 65 76 73 69 67 6e 20 28   ;..: +revsign (
4330: 20 73 6b 20 70 6b 20 2d 2d 20 29 20 20 73 6b 73   sk pk -- )  sks
4340: 69 67 20 2d 72 6f 74 20 65 64 2d 73 69 67 6e 20  ig -rot ed-sign 
4350: 72 65 76 74 6f 6b 65 6e 20 24 2b 21 20 62 6c 20  revtoken $+! bl 
4360: 72 65 76 74 6f 6b 65 6e 20 63 24 2b 21 20 3b 0a  revtoken c$+! ;.
4370: 0a 3a 20 73 69 67 6e 2d 74 6f 6b 65 6e 2c 20 28  .: sign-token, (
4380: 20 73 6b 20 70 6b 20 73 74 72 69 6e 67 20 75 32   sk pk string u2
4390: 20 2d 2d 20 29 0a 20 20 20 20 63 3a 30 6b 65 79   -- ).    c:0key
43a0: 20 72 65 76 74 6f 6b 65 6e 20 24 40 20 32 73 77   revtoken $@ 2sw
43b0: 61 70 20 3e 6b 65 79 65 64 2d 68 61 73 68 0a 20  ap >keyed-hash. 
43c0: 20 20 20 73 69 67 64 61 74 65 20 2b 64 61 74 65     sigdate +date
43d0: 20 2b 72 65 76 73 69 67 6e 20 3b 0a 0a 3a 20 72   +revsign ;..: r
43e0: 65 76 6f 6b 65 2d 6b 65 79 20 28 20 2d 2d 20 61  evoke-key ( -- a
43f0: 64 64 72 20 75 20 29 0a 20 20 20 20 73 6b 63 20  ddr u ).    skc 
4400: 6f 6c 64 73 6b 63 20 6b 65 79 6d 6f 76 65 20 20  oldskc keymove  
4410: 70 6b 63 20 6f 6c 64 70 6b 63 20 6b 65 79 6d 6f  pkc oldpkc keymo
4420: 76 65 20 20 73 6b 72 65 76 20 6f 6c 64 73 6b 72  ve  skrev oldskr
4430: 65 76 20 6b 65 79 6d 6f 76 65 0a 20 20 20 20 20  ev keymove.     
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 20 20 5c 20 62 61 63 6b 75 70 20 6b        \ backup k
4470: 65 79 73 0a 20 20 20 20 6f 6c 64 73 6b 72 65 76  eys.    oldskrev
4480: 20 6f 6c 64 70 6b 72 65 76 20 73 6b 3e 70 6b 20   oldpkrev sk>pk 
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
44a0: 20 67 65 6e 65 72 61 74 65 20 72 65 76 6f 6b 61   generate revoka
44b0: 74 69 6f 6e 20 70 75 62 6b 65 79 0a 20 20 20 20  tion pubkey.    
44c0: 67 65 6e 2d 6b 65 79 73 20 20 20 20 20 20 20 20  gen-keys        
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 20 20 5c 20 67 65 6e 65 72 61 74         \ generat
44f0: 65 20 6e 65 77 20 6b 65 79 73 0a 20 20 20 20 70  e new keys.    p
4500: 6b 63 20 6b 65 79 73 69 7a 65 20 32 2a 20 72 65  kc keysize 2* re
4510: 76 74 6f 6b 65 6e 20 24 21 20 20 20 20 20 20 20  vtoken $!       
4520: 20 20 20 20 20 20 5c 20 6d 79 20 6e 65 77 20 6b        \ my new k
4530: 65 79 0a 20 20 20 20 6f 6c 64 70 6b 72 65 76 20  ey.    oldpkrev 
4540: 6b 65 79 73 69 7a 65 20 72 65 76 74 6f 6b 65 6e  keysize revtoken
4550: 20 24 2b 21 20 20 20 20 20 20 20 20 20 20 5c 20   $+!          \ 
4560: 72 65 76 6f 6b 65 20 74 6f 6b 65 6e 0a 20 20 20  revoke token.   
4570: 20 6f 6c 64 73 6b 72 65 76 20 6f 6c 64 70 6b 72   oldskrev oldpkr
4580: 65 76 20 22 72 65 76 6f 6b 65 22 20 73 69 67 6e  ev "revoke" sign
4590: 2d 74 6f 6b 65 6e 2c 20 5c 20 72 65 76 6f 6b 65  -token, \ revoke
45a0: 20 73 69 67 6e 61 74 75 72 65 0a 20 20 20 20 73   signature.    s
45b0: 6b 63 20 70 6b 63 20 22 73 65 6c 66 73 69 67 6e  kc pkc "selfsign
45c0: 22 20 73 69 67 6e 2d 74 6f 6b 65 6e 2c 20 20 20  " sign-token,   
45d0: 20 20 20 20 20 20 5c 20 73 65 6c 66 20 73 69 67        \ self sig
45e0: 6e 65 64 20 77 69 74 68 20 6e 65 77 20 6b 65 79  ned with new key
45f0: 0a 20 20 20 20 22 21 22 20 72 65 76 74 6f 6b 65  .    "!" revtoke
4600: 6e 20 30 20 24 69 6e 73 20 20 20 20 20 20 20 20  n 0 $ins        
4610: 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 22 21              \ "!
4620: 22 20 2b 20 6f 6c 64 6b 65 79 6c 65 6e 2b 6e 65  " + oldkeylen+ne
4630: 77 6b 65 79 6c 65 6e 20 74 6f 20 66 6c 61 67 20  wkeylen to flag 
4640: 72 65 76 6f 6b 61 74 69 6f 6e 0a 20 20 20 20 72  revokation.    r
4650: 65 76 74 6f 6b 65 6e 20 24 40 20 67 65 6e 3e 68  evtoken $@ gen>h
4660: 6f 73 74 20 32 64 72 6f 70 20 20 20 20 20 20 20  ost 2drop       
4670: 20 20 20 20 20 20 5c 20 73 69 67 6e 20 68 6f 73        \ sign hos
4680: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  t information wi
4690: 74 68 20 6f 6c 64 20 6b 65 79 0a 20 20 20 20 73  th old key.    s
46a0: 69 67 64 61 74 65 20 2b 64 61 74 65 20 73 69 67  igdate +date sig
46b0: 64 61 74 65 20 64 61 74 65 73 69 7a 65 23 20 72  date datesize# r
46c0: 65 76 74 6f 6b 65 6e 20 24 2b 21 0a 20 20 20 20  evtoken $+!.    
46d0: 6f 6c 64 73 6b 63 20 6f 6c 64 70 6b 63 20 2b 72  oldskc oldpkc +r
46e0: 65 76 73 69 67 6e 0a 20 20 20 20 30 6f 6c 64 6b  evsign.    0oldk
46f0: 65 79 20 72 65 76 74 6f 6b 65 6e 20 24 40 20 3b  ey revtoken $@ ;
4700: 0a 0a 30 20 5b 49 46 5d 0a 4c 6f 63 61 6c 20 56  ..0 [IF].Local V
4710: 61 72 69 61 62 6c 65 73 3a 0a 66 6f 72 74 68 2d  ariables:.forth-
4720: 6c 6f 63 61 6c 2d 77 6f 72 64 73 3a 0a 20 20 20  local-words:.   
4730: 20 28 0a 20 20 20 20 20 28 28 22 6e 65 74 32 6f   (.     (("net2o
4740: 3a 22 20 22 2b 6e 65 74 32 6f 3a 22 29 20 64 65  :" "+net2o:") de
4750: 66 69 6e 69 74 69 6f 6e 2d 73 74 61 72 74 65 72  finition-starter
4760: 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 6b 65 79 77   (font-lock-keyw
4770: 6f 72 64 2d 66 61 63 65 20 2e 20 31 29 0a 20 20  ord-face . 1).  
4780: 20 20 20 20 22 5b 20 5c 74 5c 6e 5d 22 20 74 20      "[ \t\n]" t 
4790: 6e 61 6d 65 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d  name (font-lock-
47a0: 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 2d 66 61  function-name-fa
47b0: 63 65 20 2e 20 33 29 29 0a 20 20 20 20 20 28 28  ce . 3)).     ((
47c0: 22 64 65 62 75 67 3a 22 20 22 66 69 65 6c 64 3a  "debug:" "field:
47d0: 22 20 22 32 66 69 65 6c 64 3a 22 20 22 73 66 66  " "2field:" "sff
47e0: 69 65 6c 64 3a 22 20 22 64 66 66 69 65 6c 64 3a  ield:" "dffield:
47f0: 22 20 22 36 34 66 69 65 6c 64 3a 22 20 22 75 76  " "64field:" "uv
4800: 61 72 22 20 22 75 76 61 6c 75 65 22 29 20 6e 6f  ar" "uvalue") no
4810: 6e 2d 69 6d 6d 65 64 69 61 74 65 20 28 66 6f 6e  n-immediate (fon
4820: 74 2d 6c 6f 63 6b 2d 74 79 70 65 2d 66 61 63 65  t-lock-type-face
4830: 20 2e 20 32 29 0a 20 20 20 20 20 20 22 5b 20 5c   . 2).      "[ \
4840: 74 5c 6e 5d 22 20 74 20 6e 61 6d 65 20 28 66 6f  t\n]" t name (fo
4850: 6e 74 2d 6c 6f 63 6b 2d 76 61 72 69 61 62 6c 65  nt-lock-variable
4860: 2d 6e 61 6d 65 2d 66 61 63 65 20 2e 20 33 29 29  -name-face . 3))
4870: 0a 20 20 20 20 20 28 22 5b 61 2d 7a 30 2d 39 5d  .     ("[a-z0-9]
4880: 2b 28 22 20 69 6d 6d 65 64 69 61 74 65 20 28 66  +(" immediate (f
4890: 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f 6d 6d 65 6e 74  ont-lock-comment
48a0: 2d 66 61 63 65 20 2e 20 31 29 0a 20 20 20 20 20  -face . 1).     
48b0: 20 22 29 22 20 6e 69 6c 20 63 6f 6d 6d 65 6e 74   ")" nil comment
48c0: 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f 6d 6d   (font-lock-comm
48d0: 65 6e 74 2d 66 61 63 65 20 2e 20 31 29 29 0a 20  ent-face . 1)). 
48e0: 20 20 20 29 0a 66 6f 72 74 68 2d 6c 6f 63 61 6c     ).forth-local
48f0: 2d 69 6e 64 65 6e 74 2d 77 6f 72 64 73 3a 0a 20  -indent-words:. 
4900: 20 20 20 28 0a 20 20 20 20 20 28 28 22 6e 65 74     (.     (("net
4910: 32 6f 3a 22 20 22 2b 6e 65 74 32 6f 3a 22 29 20  2o:" "+net2o:") 
4920: 28 30 20 2e 20 32 29 20 28 30 20 2e 20 32 29 20  (0 . 2) (0 . 2) 
4930: 6e 6f 6e 2d 69 6d 6d 65 64 69 61 74 65 29 0a 20  non-immediate). 
4940: 20 20 20 20 28 28 22 5b 3a 22 20 22 6b 65 79 3a      (("[:" "key:
4950: 63 6f 64 65 22 29 20 28 30 20 2e 20 31 29 20 28  code") (0 . 1) (
4960: 30 20 2e 20 31 29 20 69 6d 6d 65 64 69 61 74 65  0 . 1) immediate
4970: 29 0a 20 20 20 20 20 28 28 22 3b 5d 22 20 22 65  ).     ((";]" "e
4980: 6e 64 3a 6b 65 79 22 29 20 28 2d 31 20 2e 20 30  nd:key") (-1 . 0
4990: 29 20 28 30 20 2e 20 2d 31 29 20 69 6d 6d 65 64  ) (0 . -1) immed
49a0: 69 61 74 65 29 0a 20 20 20 20 29 0a 45 6e 64 3a  iate).    ).End:
49b0: 0a 5b 54 48 45 4e 5d                             .[THEN]