Hex Artifact Content
Not logged in

Artifact 436cd1407c253dbea8da376c669e7199c4364a2f:


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 3a 20 61 63  word entry..: ac
0300: 63 65 70 74 2a 20 28 20 61 64 64 72 20 75 20 2d  cept* ( addr u -
0310: 2d 20 75 27 20 29 0a 20 20 20 20 5c 47 20 61 63  - u' ).    \G ac
0320: 63 65 70 74 2d 6c 69 6b 65 20 69 6e 70 75 74 2c  cept-like input,
0330: 20 62 75 74 20 74 79 70 65 73 20 2a 20 69 6e 73   but types * ins
0340: 74 65 61 64 20 6f 66 20 74 68 65 20 63 68 61 72  tead of the char
0350: 61 63 74 65 72 0a 20 20 20 20 5c 47 20 64 6f 6e  acter.    \G don
0360: 27 74 20 73 61 76 65 20 69 6e 74 6f 20 68 69 73  't save into his
0370: 74 6f 72 79 0a 20 20 20 20 64 75 70 20 3e 72 0a  tory.    dup >r.
0380: 20 20 20 20 42 45 47 49 4e 20 20 78 6b 65 79 20      BEGIN  xkey 
0390: 64 75 70 20 23 63 72 20 3c 3e 20 6f 76 65 72 20  dup #cr <> over 
03a0: 23 6c 66 20 3c 3e 20 61 6e 64 20 57 48 49 4c 45  #lf <> and WHILE
03b0: 0a 09 20 20 20 20 64 75 70 20 23 62 73 20 3d 20  ..    dup #bs = 
03c0: 6f 76 65 72 20 23 64 65 6c 20 3d 20 6f 72 20 49  over #del = or I
03d0: 46 0a 09 09 64 72 6f 70 20 64 75 70 20 72 40 20  F...drop dup r@ 
03e0: 75 3c 20 49 46 0a 09 09 20 20 20 20 6f 76 65 72  u< IF...    over
03f0: 20 2b 20 3e 72 20 78 63 68 61 72 2d 20 72 3e 20   + >r xchar- r> 
0400: 6f 76 65 72 20 2d 0a 09 09 20 20 20 20 31 20 62  over -...    1 b
0410: 61 63 6b 73 70 61 63 65 73 20 73 70 61 63 65 20  ackspaces space 
0420: 31 20 62 61 63 6b 73 70 61 63 65 73 0a 09 09 45  1 backspaces...E
0430: 4c 53 45 0a 09 09 20 20 20 20 62 65 6c 6c 0a 09  LSE...    bell..
0440: 09 54 48 45 4e 0a 09 20 20 20 20 45 4c 53 45 0a  .THEN..    ELSE.
0450: 09 09 2d 72 6f 74 20 78 63 21 2b 3f 20 30 3d 20  ..-rot xc!+? 0= 
0460: 49 46 20 20 62 65 6c 6c 20 20 45 4c 53 45 0a 09  IF  bell  ELSE..
0470: 09 20 20 20 20 5b 49 46 44 45 46 5d 20 61 6e 64  .    [IFDEF] and
0480: 72 6f 69 64 20 27 2a 27 20 5b 45 4c 53 45 5d 20  roid '*' [ELSE] 
0490: 27 e2 ac a4 27 20 5b 54 48 45 4e 5d 20 78 65 6d  '⬤' [THEN] xem
04a0: 69 74 20 20 54 48 45 4e 0a 09 20 20 20 20 54 48  it  THEN..    TH
04b0: 45 4e 0a 20 20 20 20 52 45 50 45 41 54 20 20 64  EN.    REPEAT  d
04c0: 72 6f 70 20 20 6e 69 70 20 72 3e 20 73 77 61 70  rop  nip r> swap
04d0: 20 2d 20 3b 0a 0a 5c 20 4b 65 79 73 20 61 72 65   - ;..\ Keys are
04e0: 20 70 61 73 73 77 6f 72 64 73 20 61 6e 64 20 70   passwords and p
04f0: 72 69 76 61 74 65 20 6b 65 79 73 20 28 73 65 6c  rivate keys (sel
0500: 66 2d 6b 65 79 65 64 2c 20 69 2e 65 2e 20 70 72  f-keyed, i.e. pr
0510: 69 76 61 74 65 2a 70 75 62 6c 69 63 20 6b 65 79  ivate*public key
0520: 29 0a 0a 0a 32 20 56 61 6c 75 65 20 70 77 2d 6c  )...2 Value pw-l
0530: 65 76 65 6c 23 20 5c 20 70 77 2d 6c 65 76 65 6c  evel# \ pw-level
0540: 23 20 30 20 69 73 20 6c 6f 77 65 73 74 0a 5c 20  # 0 is lowest.\ 
0550: 21 21 54 4f 44 4f 21 21 20 77 65 20 6e 65 65 64  !!TODO!! we need
0560: 20 61 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 68   a way to tell h
0570: 6f 77 20 6d 75 63 68 20 77 65 20 63 61 6e 20 74  ow much we can t
0580: 72 75 73 74 20 6b 65 79 73 0a 5c 20 70 61 73 73  rust keys.\ pass
0590: 77 6f 72 64 73 20 6e 65 65 64 20 61 20 70 77 2d  words need a pw-
05a0: 6c 65 76 65 6c 20 28 62 65 63 61 75 73 65 20 74  level (because t
05b0: 68 65 79 20 61 72 65 20 67 75 65 73 73 61 62 6c  hey are guessabl
05c0: 65 29 0a 5c 20 73 65 63 72 65 74 73 20 64 6f 6e  e).\ secrets don
05d0: 27 74 2c 20 74 68 65 79 20 61 72 65 6e 27 74 2e  't, they aren't.
05e0: 20 57 65 20 63 61 6e 20 71 75 69 63 6b 6c 79 20   We can quickly 
05f0: 64 65 63 72 79 70 74 20 61 6c 6c 0a 5c 20 73 65  decrypt all.\ se
0600: 63 72 65 74 2d 62 61 73 65 64 20 73 74 75 66 66  cret-based stuff
0610: 2c 20 77 69 74 68 6f 75 74 20 62 6f 74 68 65 72  , without bother
0620: 69 6e 67 20 77 69 74 68 20 73 6c 6f 77 64 6f 77  ing with slowdow
0630: 6e 73 2e 0a 5c 20 53 6f 20 73 65 63 72 65 74 73  ns..\ So secrets
0640: 20 73 68 6f 75 6c 64 20 75 73 65 20 6e 6f 72 6d   should use norm
0650: 61 6c 20 73 74 72 69 6e 67 20 64 65 63 72 79 70  al string decryp
0660: 74 0a 0a 63 6d 64 2d 62 75 66 30 20 63 6c 61 73  t..cmd-buf0 clas
0670: 73 0a 20 20 20 20 6d 61 78 64 61 74 61 20 2d 0a  s.    maxdata -.
0680: 20 20 20 20 6b 65 79 2d 73 61 6c 74 23 20 75 76      key-salt# uv
0690: 61 72 20 6b 65 79 70 61 63 6b 0a 20 20 20 20 6b  ar keypack.    k
06a0: 65 79 70 61 63 6b 23 20 20 75 76 61 72 20 6b 65  eypack#  uvar ke
06b0: 79 70 61 63 6b 2d 62 75 66 0a 20 20 20 20 6b 65  ypack-buf.    ke
06c0: 79 2d 63 6b 73 75 6d 23 20 75 76 61 72 20 6b 65  y-cksum# uvar ke
06d0: 79 70 61 63 6b 2d 63 68 6b 73 75 6d 0a 65 6e 64  ypack-chksum.end
06e0: 2d 63 6c 61 73 73 20 63 6d 64 2d 6b 65 79 62 75  -class cmd-keybu
06f0: 66 2d 63 0a 0a 63 6d 64 2d 6b 65 79 62 75 66 2d  f-c..cmd-keybuf-
0700: 63 20 6e 65 77 20 63 6d 64 62 75 66 3a 20 63 6f  c new cmdbuf: co
0710: 64 65 2d 6b 65 79 0a 0a 63 6f 64 65 2d 6b 65 79  de-key..code-key
0720: 0a 63 6d 64 30 6c 6f 63 6b 20 30 20 70 74 68 72  .cmd0lock 0 pthr
0730: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 20 64  ead_mutex_init d
0740: 72 6f 70 0a 0a 3a 6e 6f 6e 61 6d 65 20 28 20 2d  rop..:noname ( -
0750: 2d 20 61 64 64 72 20 75 20 29 20 6b 65 79 70 61  - addr u ) keypa
0760: 63 6b 2d 62 75 66 20 63 6d 64 62 75 66 23 20 40  ck-buf cmdbuf# @
0770: 20 3b 20 74 6f 20 63 6d 64 62 75 66 24 0a 3a 6e   ; to cmdbuf$.:n
0780: 6f 6e 61 6d 65 20 28 20 2d 2d 20 6e 20 29 20 20  oname ( -- n )  
0790: 6b 65 79 70 61 63 6b 23 20 63 6d 64 62 75 66 23  keypack# cmdbuf#
07a0: 20 40 20 2d 20 3b 20 74 6f 20 6d 61 78 73 74 72   @ - ; to maxstr
07b0: 69 6e 67 0a 0a 63 6f 64 65 30 2d 62 75 66 0a 0a  ing..code0-buf..
07c0: 5c 20 68 61 73 68 65 64 20 6b 65 79 20 64 61 74  \ hashed key dat
07d0: 61 20 62 61 73 65 0a 0a 55 73 65 72 20 3e 73 74  a base..User >st
07e0: 6f 72 65 6b 65 79 0a 0a 63 6d 64 2d 63 6c 61 73  orekey..cmd-clas
07f0: 73 20 63 6c 61 73 73 0a 20 20 20 20 66 69 65 6c  s class.    fiel
0800: 64 3a 20 6b 65 2d 73 6b 20 20 20 5c 20 73 65 63  d: ke-sk   \ sec
0810: 72 65 74 20 6b 65 79 0a 20 20 20 20 66 69 65 6c  ret key.    fiel
0820: 64 3a 20 6b 65 2d 70 6b 20 20 20 5c 20 70 75 62  d: ke-pk   \ pub
0830: 6c 69 63 20 6b 65 79 0a 20 20 20 20 66 69 65 6c  lic key.    fiel
0840: 64 3a 20 6b 65 2d 74 79 70 65 20 5c 20 6b 65 79  d: ke-type \ key
0850: 20 74 79 70 65 0a 20 20 20 20 66 69 65 6c 64 3a   type.    field:
0860: 20 6b 65 2d 6e 69 63 6b 20 5c 20 6b 65 79 20 6e   ke-nick \ key n
0870: 69 63 6b 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b  ick.    field: k
0880: 65 2d 70 73 6b 20 20 5c 20 70 72 65 73 68 61 72  e-psk  \ preshar
0890: 65 64 20 6b 65 79 20 66 6f 72 20 73 74 61 74 65  ed key for state
08a0: 6c 65 73 73 20 63 6f 6d 6d 75 6e 69 63 61 74 69  less communicati
08b0: 6f 6e 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b 65  on.    field: ke
08c0: 2d 70 72 6f 66 20 5c 20 70 72 6f 66 69 6c 65 20  -prof \ profile 
08d0: 6f 62 6a 65 63 74 0a 20 20 20 20 66 69 65 6c 64  object.    field
08e0: 3a 20 6b 65 2d 73 65 6c 66 73 69 67 0a 20 20 20  : ke-selfsig.   
08f0: 20 66 69 65 6c 64 3a 20 6b 65 2d 73 69 67 73 0a   field: ke-sigs.
0900: 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 73 74      field: ke-st
0910: 6f 72 65 6b 65 79 20 5c 20 75 73 65 64 20 74 6f  orekey \ used to
0920: 20 65 6e 63 72 79 70 74 20 6f 6e 20 73 74 6f 72   encrypt on stor
0930: 61 67 65 0a 20 20 20 20 36 34 66 69 65 6c 64 3a  age.    64field:
0940: 20 6b 65 2d 6f 66 66 73 65 74 20 5c 20 6f 66 66   ke-offset \ off
0950: 73 65 74 20 69 6e 20 6b 65 79 20 66 69 6c 65 0a  set in key file.
0960: 20 20 20 20 30 20 2b 66 69 65 6c 64 20 6b 65 2d      0 +field ke-
0970: 65 6e 64 0a 65 6e 64 2d 63 6c 61 73 73 20 6b 65  end.end-class ke
0980: 79 2d 65 6e 74 72 79 0a 0a 56 61 72 69 61 62 6c  y-entry..Variabl
0990: 65 20 6b 65 79 2d 65 6e 74 72 79 2d 74 61 62 6c  e key-entry-tabl
09a0: 65 0a 0a 30 20 43 6f 6e 73 74 61 6e 74 20 6b 65  e..0 Constant ke
09b0: 79 23 61 6e 6f 6e 0a 31 20 43 6f 6e 73 74 61 6e  y#anon.1 Constan
09c0: 74 20 6b 65 79 23 75 73 65 72 0a 32 20 43 6f 6e  t key#user.2 Con
09d0: 73 74 61 6e 74 20 6b 65 79 23 67 72 6f 75 70 0a  stant key#group.
09e0: 0a 30 20 56 61 6c 75 65 20 73 61 6d 70 6c 65 2d  .0 Value sample-
09f0: 6b 65 79 0a 0a 56 61 72 69 61 62 6c 65 20 6b 65  key..Variable ke
0a00: 79 2d 74 61 62 6c 65 0a 0a 36 34 56 61 72 69 61  y-table..64Varia
0a10: 62 6c 65 20 6b 65 79 2d 72 65 61 64 2d 6f 66 66  ble key-read-off
0a20: 73 65 74 0a 0a 3a 20 63 75 72 72 65 6e 74 2d 6b  set..: current-k
0a30: 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d 20 6f  ey ( addr u -- o
0a40: 20 29 0a 20 20 20 20 32 64 75 70 20 6b 65 79 73   ).    2dup keys
0a50: 69 7a 65 20 75 6d 69 6e 20 6b 65 79 2d 74 61 62  ize umin key-tab
0a60: 6c 65 20 23 40 20 64 72 6f 70 0a 20 20 20 20 64  le #@ drop.    d
0a70: 75 70 20 30 3d 20 49 46 20 20 64 72 6f 70 20 2e  up 0= IF  drop .
0a80: 22 20 75 6e 6b 6e 6f 77 6e 20 6b 65 79 3a 20 22  " unknown key: "
0a90: 20 38 35 74 79 70 65 20 63 72 20 20 30 20 45 58   85type cr  0 EX
0aa0: 49 54 20 20 54 48 45 4e 0a 20 20 20 20 63 65 6c  IT  THEN.    cel
0ab0: 6c 2b 20 3e 6f 20 6b 65 2d 70 6b 20 24 21 20 6f  l+ >o ke-pk $! o
0ac0: 20 6f 3e 20 3b 0a 0a 3a 20 6b 65 79 3a 6e 65 77   o> ;..: key:new
0ad0: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 6f 20 29   ( addr u -- o )
0ae0: 0a 20 20 20 20 5c 47 20 63 72 65 61 74 65 20 6e  .    \G create n
0af0: 65 77 20 6b 65 79 2c 20 61 64 64 72 20 75 20 69  ew key, addr u i
0b00: 73 20 74 68 65 20 70 75 62 6c 69 63 20 6b 65 79  s the public key
0b10: 0a 20 20 20 20 73 61 6d 70 6c 65 2d 6b 65 79 20  .    sample-key 
0b20: 3e 6f 0a 20 20 20 20 6b 65 79 2d 65 6e 74 72 79  >o.    key-entry
0b30: 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e 2d 74  -table @ token-t
0b40: 61 62 6c 65 20 21 0a 20 20 20 20 6b 65 2d 73 6b  able !.    ke-sk
0b50: 20 6b 65 2d 65 6e 64 20 6f 76 65 72 20 2d 20 65   ke-end over - e
0b60: 72 61 73 65 20 20 3e 73 74 6f 72 65 6b 65 79 20  rase  >storekey 
0b70: 40 20 6b 65 2d 73 74 6f 72 65 6b 65 79 20 21 0a  @ ke-storekey !.
0b80: 20 20 20 20 6b 65 79 2d 72 65 61 64 2d 6f 66 66      key-read-off
0b90: 73 65 74 20 36 34 40 20 6b 65 2d 6f 66 66 73 65  set 64@ ke-offse
0ba0: 74 20 36 34 21 0a 20 20 20 20 6b 65 79 70 61 63  t 64!.    keypac
0bb0: 6b 2d 61 6c 6c 23 20 6e 3e 36 34 20 6b 65 79 2d  k-all# n>64 key-
0bc0: 72 65 61 64 2d 6f 66 66 73 65 74 20 36 34 2b 21  read-offset 64+!
0bd0: 20 6f 20 63 65 6c 6c 2d 20 6b 65 2d 65 6e 64 20   o cell- ke-end 
0be0: 6f 76 65 72 20 2d 0a 20 20 20 20 32 6f 76 65 72  over -.    2over
0bf0: 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e 20 6b 65   keysize umin ke
0c00: 79 2d 74 61 62 6c 65 20 23 21 20 6f 3e 0a 20 20  y-table #! o>.  
0c10: 20 20 63 75 72 72 65 6e 74 2d 6b 65 79 20 3b 0a    current-key ;.
0c20: 0a 3a 20 6b 65 79 3f 6e 65 77 20 28 20 61 64 64  .: key?new ( add
0c30: 72 20 75 20 2d 2d 20 6f 20 29 0a 20 20 20 20 5c  r u -- o ).    \
0c40: 47 20 43 72 65 61 74 65 20 6f 72 20 6c 6f 6f 6b  G Create or look
0c50: 75 70 20 6e 65 77 20 6b 65 79 0a 20 20 20 20 32  up new key.    2
0c60: 64 75 70 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e  dup keysize umin
0c70: 20 6b 65 79 2d 74 61 62 6c 65 20 23 40 20 64 72   key-table #@ dr
0c80: 6f 70 0a 20 20 20 20 64 75 70 20 30 3d 20 49 46  op.    dup 0= IF
0c90: 20 20 64 72 6f 70 20 6b 65 79 3a 6e 65 77 20 20    drop key:new  
0ca0: 45 4c 53 45 20 20 6e 69 70 20 6e 69 70 20 63 65  ELSE  nip nip ce
0cb0: 6c 6c 2b 20 20 54 48 45 4e 20 3b 0a 0a 5c 20 73  ll+  THEN ;..\ s
0cc0: 65 61 72 63 68 20 66 6f 72 20 6b 65 79 73 20 2d  earch for keys -
0cd0: 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 64 0a 0a   not optimized..
0ce0: 3a 20 6e 69 63 6b 2d 6b 65 79 20 28 20 61 64 64  : nick-key ( add
0cf0: 72 20 75 20 2d 2d 20 6f 20 29 20 5c 20 73 65 61  r u -- o ) \ sea
0d00: 72 63 68 20 66 6f 72 20 6b 65 79 20 6e 69 63 6b  rch for key nick
0d10: 6e 61 6d 65 0a 20 20 20 20 30 20 2d 72 6f 74 20  name.    0 -rot 
0d20: 6b 65 79 2d 74 61 62 6c 65 20 0a 20 20 20 20 5b  key-table .    [
0d30: 3a 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f 70 20  : cell+ $@ drop 
0d40: 63 65 6c 6c 2b 20 3e 6f 20 6b 65 2d 6e 69 63 6b  cell+ >o ke-nick
0d50: 20 24 40 20 32 6f 76 65 72 20 73 74 72 3d 20 49   $@ 2over str= I
0d60: 46 0a 09 72 6f 74 20 64 72 6f 70 20 6f 20 2d 72  F..rot drop o -r
0d70: 6f 74 0a 20 20 20 20 54 48 45 4e 20 20 6f 3e 20  ot.    THEN  o> 
0d80: 3b 5d 20 23 6d 61 70 20 32 64 72 6f 70 20 3b 0a  ;] #map 2drop ;.
0d90: 0a 3a 20 73 65 63 72 65 74 2d 6b 65 79 73 23 20  .: secret-keys# 
0da0: 28 20 2d 2d 20 6e 20 29 0a 20 20 20 20 30 20 6b  ( -- n ).    0 k
0db0: 65 79 2d 74 61 62 6c 65 20 5b 3a 20 63 65 6c 6c  ey-table [: cell
0dc0: 2b 20 24 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20  + $@ drop cell+ 
0dd0: 3e 6f 20 6b 65 2d 73 6b 20 40 20 30 3c 3e 20 2d  >o ke-sk @ 0<> -
0de0: 20 6f 3e 20 3b 5d 20 23 6d 61 70 20 3b 0a 3a 20   o> ;] #map ;.: 
0df0: 73 65 63 72 65 74 2d 6b 65 79 20 28 20 6e 20 2d  secret-key ( n -
0e00: 2d 20 6f 2f 30 20 29 0a 20 20 20 20 30 20 74 75  - o/0 ).    0 tu
0e10: 63 6b 20 6b 65 79 2d 74 61 62 6c 65 20 5b 3a 20  ck key-table [: 
0e20: 63 65 6c 6c 2b 20 24 40 20 64 72 6f 70 20 63 65  cell+ $@ drop ce
0e30: 6c 6c 2b 20 3e 6f 20 6b 65 2d 73 6b 20 40 20 49  ll+ >o ke-sk @ I
0e40: 46 0a 09 20 20 32 64 75 70 20 3d 20 49 46 20 20  F..  2dup = IF  
0e50: 72 6f 74 20 64 72 6f 70 20 6f 20 2d 72 6f 74 20  rot drop o -rot 
0e60: 20 54 48 45 4e 20 20 31 2b 0a 20 20 20 20 20 20   THEN  1+.      
0e70: 54 48 45 4e 20 20 6f 3e 20 3b 5d 20 23 6d 61 70  THEN  o> ;] #map
0e80: 20 32 64 72 6f 70 20 3b 0a 3a 20 2e 73 65 63 72   2drop ;.: .secr
0e90: 65 74 2d 6e 69 63 6b 73 20 28 20 2d 2d 20 29 0a  et-nicks ( -- ).
0ea0: 20 20 20 20 30 20 6b 65 79 2d 74 61 62 6c 65 20      0 key-table 
0eb0: 5b 3a 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f 70  [: cell+ $@ drop
0ec0: 20 63 65 6c 6c 2b 20 3e 6f 20 6b 65 2d 73 6b 20   cell+ >o ke-sk 
0ed0: 40 20 49 46 0a 09 20 20 64 75 70 20 2e 20 6b 65  @ IF..  dup . ke
0ee0: 2d 6e 69 63 6b 20 24 40 20 74 79 70 65 20 63 72  -nick $@ type cr
0ef0: 20 31 2b 0a 20 20 20 20 20 20 54 48 45 4e 20 6f   1+.      THEN o
0f00: 3e 20 3b 5d 20 23 6d 61 70 20 64 72 6f 70 20 3b  > ;] #map drop ;
0f10: 0a 0a 3a 20 6e 69 63 6b 3e 70 6b 20 28 20 6e 69  ..: nick>pk ( ni
0f20: 63 6b 20 75 20 2d 2d 20 70 6b 20 75 20 29 0a 20  ck u -- pk u ). 
0f30: 20 20 20 6e 69 63 6b 2d 6b 65 79 20 3f 64 75 70     nick-key ?dup
0f40: 2d 49 46 20 2e 6b 65 2d 70 6b 20 24 40 20 45 4c  -IF .ke-pk $@ EL
0f50: 53 45 20 30 20 30 20 54 48 45 4e 20 3b 0a 0a 3a  SE 0 0 THEN ;..:
0f60: 20 6b 65 79 2d 65 78 69 73 74 3f 20 28 20 61 64   key-exist? ( ad
0f70: 64 72 20 75 20 2d 2d 20 66 6c 61 67 20 29 0a 20  dr u -- flag ). 
0f80: 20 20 20 6b 65 79 2d 74 61 62 6c 65 20 23 40 20     key-table #@ 
0f90: 64 30 3c 3e 20 3b 20 0a 0a 56 61 72 69 61 62 6c  d0<> ; ..Variabl
0fa0: 65 20 73 74 72 69 63 74 2d 6b 65 79 73 20 20 73  e strict-keys  s
0fb0: 74 72 69 63 74 2d 6b 65 79 73 20 6f 6e 0a 0a 5b  trict-keys on..[
0fc0: 49 46 55 4e 44 45 46 5d 20 6d 61 67 65 6e 74 61  IFUNDEF] magenta
0fd0: 20 20 62 72 6f 77 6e 20 63 6f 6e 73 74 61 6e 74    brown constant
0fe0: 20 6d 61 67 65 6e 74 61 20 5b 54 48 45 4e 5d 0a   magenta [THEN].
0ff0: 0a 43 72 65 61 74 65 20 38 35 63 6f 6c 6f 72 73  .Create 85colors
1000: 0a 72 65 64 20 20 20 20 20 3e 62 67 20 77 68 69  .red     >bg whi
1010: 74 65 20 3e 66 67 20 6f 72 20 62 6f 6c 64 20 6f  te >fg or bold o
1020: 72 20 2c 0a 79 65 6c 6c 6f 77 20 20 3e 62 67 20  r ,.yellow  >bg 
1030: 77 68 69 74 65 20 3e 66 67 20 6f 72 20 62 6f 6c  white >fg or bol
1040: 64 20 6f 72 20 2c 0a 62 6c 75 65 20 20 20 20 3e  d or ,.blue    >
1050: 62 67 20 77 68 69 74 65 20 3e 66 67 20 6f 72 20  bg white >fg or 
1060: 62 6f 6c 64 20 6f 72 20 2c 0a 6d 61 67 65 6e 74  bold or ,.magent
1070: 61 20 3e 62 67 20 77 68 69 74 65 20 3e 66 67 20  a >bg white >fg 
1080: 6f 72 20 62 6f 6c 64 20 6f 72 20 2c 0a 0a 3a 20  or bold or ,..: 
1090: 72 65 73 65 74 2d 63 6f 6c 6f 72 20 28 20 2d 2d  reset-color ( --
10a0: 20 29 0a 20 20 20 20 64 65 66 61 75 6c 74 2d 63   ).    default-c
10b0: 6f 6c 6f 72 20 61 74 74 72 21 20 3b 0a 3a 20 2e  olor attr! ;.: .
10c0: 62 6c 61 63 6b 38 35 20 28 20 61 64 64 72 20 75  black85 ( addr u
10d0: 20 2d 2d 20 29 0a 20 20 20 20 5b 20 62 6c 61 63   -- ).    [ blac
10e0: 6b 20 3e 62 67 20 62 6c 61 63 6b 20 3e 66 67 20  k >bg black >fg 
10f0: 6f 72 20 5d 4c 20 61 74 74 72 21 20 20 20 38 35  or ]L attr!   85
1100: 74 79 70 65 20 72 65 73 65 74 2d 63 6f 6c 6f 72  type reset-color
1110: 20 3b 0a 3a 20 2e 72 65 64 38 35 20 28 20 61 64   ;.: .red85 ( ad
1120: 64 72 20 75 20 2d 2d 20 29 20 20 30 20 2d 72 6f  dr u -- )  0 -ro
1130: 74 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 09 63 72  t bounds ?DO..cr
1140: 20 2e 22 20 5c 20 72 65 76 6f 6b 65 3a 20 22 20   ." \ revoke: " 
1150: 64 75 70 20 63 65 6c 6c 73 20 38 35 63 6f 6c 6f  dup cells 85colo
1160: 72 73 20 2b 20 40 20 61 74 74 72 21 20 31 2b 20  rs + @ attr! 1+ 
1170: 33 20 61 6e 64 0a 09 49 20 34 20 38 35 74 79 70  3 and..I 4 85typ
1180: 65 20 20 64 75 70 20 63 65 6c 6c 73 20 38 35 63  e  dup cells 85c
1190: 6f 6c 6f 72 73 20 2b 20 40 20 61 74 74 72 21 20  olors + @ attr! 
11a0: 31 2b 20 33 20 61 6e 64 0a 09 49 20 34 20 2b 20  1+ 3 and..I 4 + 
11b0: 34 20 38 35 74 79 70 65 20 72 65 73 65 74 2d 63  4 85type reset-c
11c0: 6f 6c 6f 72 20 38 20 2b 4c 4f 4f 50 20 20 64 72  olor 8 +LOOP  dr
11d0: 6f 70 20 3b 0a 3a 20 2e 72 73 6b 20 28 20 6e 69  op ;.: .rsk ( ni
11e0: 63 6b 20 75 20 2d 2d 20 29 0a 20 20 20 20 73 6b  ck u -- ).    sk
11f0: 72 65 76 20 24 32 30 20 2e 72 65 64 38 35 20 73  rev $20 .red85 s
1200: 70 61 63 65 20 74 79 70 65 20 2e 22 20 20 28 6b  pace type ."  (k
1210: 65 65 70 20 6f 66 66 6c 69 6e 65 20 63 6f 70 79  eep offline copy
1220: 21 29 22 20 63 72 20 3b 0a 3a 20 2e 6b 65 79 20  !)" cr ;.: .key 
1230: 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 64 72  ( addr u -- ) dr
1240: 6f 70 20 63 65 6c 6c 2b 20 3e 6f 0a 20 20 20 20  op cell+ >o.    
1250: 2e 22 20 6e 69 63 6b 3a 20 22 20 6b 65 2d 6e 69  ." nick: " ke-ni
1260: 63 6b 20 24 40 20 74 79 70 65 20 63 72 0a 20 20  ck $@ type cr.  
1270: 20 20 2e 22 20 70 75 62 6b 65 79 3a 20 22 20 6b    ." pubkey: " k
1280: 65 2d 70 6b 20 24 40 20 38 35 74 79 70 65 20 63  e-pk $@ 85type c
1290: 72 0a 20 20 20 20 6b 65 2d 73 6b 20 40 20 49 46  r.    ke-sk @ IF
12a0: 20 20 2e 22 20 73 65 63 6b 65 79 3a 20 22 20 6b    ." seckey: " k
12b0: 65 2d 73 6b 20 40 20 6b 65 79 73 69 7a 65 0a 09  e-sk @ keysize..
12c0: 2e 62 6c 61 63 6b 38 35 20 2e 22 20 20 28 6b 65  .black85 ."  (ke
12d0: 65 70 20 73 65 63 72 65 74 21 29 22 20 63 72 20  ep secret!)" cr 
12e0: 20 54 48 45 4e 0a 20 20 20 20 2e 22 20 66 69 72   THEN.    ." fir
12f0: 73 74 3a 20 22 20 6b 65 2d 73 65 6c 66 73 69 67  st: " ke-selfsig
1300: 20 24 40 20 64 72 6f 70 20 36 34 40 20 2e 73 69   $@ drop 64@ .si
1310: 67 64 61 74 65 20 63 72 0a 20 20 20 20 2e 22 20  gdate cr.    ." 
1320: 6c 61 73 74 3a 20 22 20 6b 65 2d 73 65 6c 66 73  last: " ke-selfs
1330: 69 67 20 24 40 20 64 72 6f 70 20 36 34 27 2b 20  ig $@ drop 64'+ 
1340: 36 34 40 20 2e 73 69 67 64 61 74 65 20 63 72 0a  64@ .sigdate cr.
1350: 20 20 20 20 6f 3e 20 3b 0a 0a 3a 20 64 75 6d 70      o> ;..: dump
1360: 6b 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d 20  key ( addr u -- 
1370: 29 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e 6f 0a  ) drop cell+ >o.
1380: 20 20 20 20 2e 5c 22 20 78 5c 22 20 22 20 6b 65      .\" x\" " ke
1390: 2d 70 6b 20 24 40 20 38 35 74 79 70 65 20 2e 5c  -pk $@ 85type .\
13a0: 22 20 5c 22 20 6b 65 79 3f 6e 65 77 22 20 63 72  " \" key?new" cr
13b0: 0a 20 20 20 20 6b 65 2d 73 6b 20 40 20 49 46 20  .    ke-sk @ IF 
13c0: 20 2e 5c 22 20 78 5c 22 20 22 20 6b 65 2d 73 6b   .\" x\" " ke-sk
13d0: 20 40 20 6b 65 79 73 69 7a 65 20 38 35 74 79 70   @ keysize 85typ
13e0: 65 20 2e 5c 22 20 5c 22 20 6b 65 2d 73 6b 20 73  e .\" \" ke-sk s
13f0: 65 63 21 20 2b 73 65 63 6b 65 79 22 20 63 72 20  ec! +seckey" cr 
1400: 20 54 48 45 4e 0a 20 20 20 20 27 22 27 20 65 6d   THEN.    '"' em
1410: 69 74 20 6b 65 2d 6e 69 63 6b 20 24 40 20 74 79  it ke-nick $@ ty
1420: 70 65 20 2e 5c 22 20 5c 22 20 6b 65 2d 6e 69 63  pe .\" \" ke-nic
1430: 6b 20 24 21 20 22 0a 20 20 20 20 6b 65 2d 73 65  k $! ".    ke-se
1440: 6c 66 73 69 67 20 24 40 20 64 72 6f 70 20 36 34  lfsig $@ drop 64
1450: 40 20 36 34 3e 64 20 5b 3a 20 27 24 27 20 65 6d  @ 64>d [: '$' em
1460: 69 74 20 30 20 75 64 2e 72 20 3b 5d 20 24 31 30  it 0 ud.r ;] $10
1470: 20 62 61 73 65 2d 65 78 65 63 75 74 65 0a 20 20   base-execute.  
1480: 20 20 2e 22 20 2e 20 64 3e 36 34 20 6b 65 2d 66    ." . d>64 ke-f
1490: 69 72 73 74 21 20 22 20 6b 65 2d 74 79 70 65 20  irst! " ke-type 
14a0: 40 20 2e 20 2e 22 20 6b 65 2d 74 79 70 65 20 21  @ . ." ke-type !
14b0: 22 20 20 63 72 20 6f 3e 20 3b 0a 0a 3a 20 2e 6b  "  cr o> ;..: .k
14c0: 65 79 73 20 28 20 2d 2d 20 29 20 6b 65 79 2d 74  eys ( -- ) key-t
14d0: 61 62 6c 65 20 5b 3a 20 63 65 6c 6c 2b 20 24 40  able [: cell+ $@
14e0: 20 2e 6b 65 79 20 3b 5d 20 23 6d 61 70 20 3b 0a   .key ;] #map ;.
14f0: 3a 20 64 75 6d 70 6b 65 79 73 20 28 20 2d 2d 20  : dumpkeys ( -- 
1500: 29 20 6b 65 79 2d 74 61 62 6c 65 20 5b 3a 20 63  ) key-table [: c
1510: 65 6c 6c 2b 20 24 40 20 64 75 6d 70 6b 65 79 20  ell+ $@ dumpkey 
1520: 3b 5d 20 23 6d 61 70 20 3b 0a 0a 3a 20 2e 6b 65  ;] #map ;..: .ke
1530: 79 23 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29  y# ( addr u -- )
1540: 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e 0a 20 20   keysize umin.  
1550: 20 20 2e 22 20 4b 65 79 20 27 22 20 6b 65 79 2d    ." Key '" key-
1560: 74 61 62 6c 65 20 23 40 20 30 3d 20 49 46 20 64  table #@ 0= IF d
1570: 72 6f 70 20 45 58 49 54 20 54 48 45 4e 0a 20 20  rop EXIT THEN.  
1580: 20 20 63 65 6c 6c 2b 20 2e 6b 65 2d 6e 69 63 6b    cell+ .ke-nick
1590: 20 24 40 20 74 79 70 65 20 2e 22 20 27 20 6f 6b   $@ type ." ' ok
15a0: 22 20 63 72 20 3b 0a 3a 20 2e 6b 65 79 2d 69 64  " cr ;.: .key-id
15b0: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 6b   ( addr u -- ) k
15c0: 65 79 73 69 7a 65 20 75 6d 69 6e 20 32 64 75 70  eysize umin 2dup
15d0: 20 6b 65 79 2d 74 61 62 6c 65 20 23 40 20 30 3d   key-table #@ 0=
15e0: 0a 20 20 20 20 49 46 20 20 32 64 72 6f 70 20 38  .    IF  2drop 8
15f0: 20 38 35 74 79 70 65 0a 20 20 20 20 45 4c 53 45   85type.    ELSE
1600: 20 20 63 65 6c 6c 2b 20 2e 6b 65 2d 6e 69 63 6b    cell+ .ke-nick
1610: 20 24 40 20 74 79 70 65 20 32 64 72 6f 70 20 20   $@ type 2drop  
1620: 54 48 45 4e 20 3b 0a 0a 3a 6e 6f 6e 61 6d 65 20  THEN ;..:noname 
1630: 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20  ( addr u -- ).  
1640: 20 20 6f 20 49 46 20 20 64 65 73 74 2d 70 75 62    o IF  dest-pub
1650: 6b 65 79 20 40 20 49 46 0a 09 20 20 20 20 32 64  key @ IF..    2d
1660: 75 70 20 64 65 73 74 2d 70 75 62 6b 65 79 20 24  up dest-pubkey $
1670: 40 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e 20 73  @ keysize umin s
1680: 74 72 3d 20 30 3d 20 49 46 0a 09 09 5b 3a 20 2e  tr= 0= IF...[: .
1690: 22 20 77 61 6e 74 3a 20 22 20 64 65 73 74 2d 70  " want: " dest-p
16a0: 75 62 6b 65 79 20 24 40 20 6b 65 79 73 69 7a 65  ubkey $@ keysize
16b0: 20 75 6d 69 6e 20 38 35 74 79 70 65 20 63 72 0a   umin 85type cr.
16c0: 09 09 20 20 2e 22 20 67 6f 74 20 3a 20 22 20 32  ..  ." got : " 2
16d0: 64 75 70 20 38 35 74 79 70 65 20 63 72 20 3b 5d  dup 85type cr ;]
16e0: 20 24 65 72 72 0a 09 09 74 72 75 65 20 21 21 77   $err...true !!w
16f0: 72 6f 6e 67 2d 6b 65 79 21 21 0a 09 20 20 20 20  rong-key!!..    
1700: 54 48 45 4e 0a 09 20 20 20 20 2e 6b 65 79 23 20  THEN..    .key# 
1710: 20 45 58 49 54 0a 09 54 48 45 4e 20 20 54 48 45   EXIT..THEN  THE
1720: 4e 0a 20 20 20 20 32 64 75 70 20 6b 65 79 2d 65  N.    2dup key-e
1730: 78 69 73 74 3f 20 30 3d 20 49 46 0a 09 73 74 72  xist? 0= IF..str
1740: 69 63 74 2d 6b 65 79 73 20 40 20 21 21 75 6e 6b  ict-keys @ !!unk
1750: 6e 6f 77 6e 2d 6b 65 79 21 21 0a 09 2e 22 20 55  nown-key!!..." U
1760: 6e 6b 6e 6f 77 6e 20 6b 65 79 20 22 20 38 35 74  nknown key " 85t
1770: 79 70 65 20 63 72 0a 20 20 20 20 45 4c 53 45 0a  ype cr.    ELSE.
1780: 09 2e 6b 65 79 23 0a 20 20 20 20 54 48 45 4e 20  ..key#.    THEN 
1790: 3b 20 49 53 20 63 68 65 63 6b 2d 6b 65 79 0a 0a  ; IS check-key..
17a0: 3a 6e 6f 6e 61 6d 65 20 28 20 70 6b 63 20 2d 2d  :noname ( pkc --
17b0: 20 73 6b 63 20 29 0a 20 20 20 20 6b 65 79 73 69   skc ).    keysi
17c0: 7a 65 20 6b 65 79 2d 74 61 62 6c 65 20 23 40 20  ze key-table #@ 
17d0: 30 3d 20 21 21 75 6e 6b 6e 6f 77 6e 2d 6b 65 79  0= !!unknown-key
17e0: 21 21 0a 20 20 20 20 63 65 6c 6c 2b 20 2e 6b 65  !!.    cell+ .ke
17f0: 2d 73 6b 20 73 65 63 40 20 30 3d 20 21 21 75 6e  -sk sec@ 0= !!un
1800: 6b 6e 6f 77 6e 2d 6b 65 79 21 21 20 3b 20 69 73  known-key!! ; is
1810: 20 73 65 61 72 63 68 2d 6b 65 79 0a 0a 5c 20 67   search-key..\ g
1820: 65 74 20 70 61 73 73 70 68 72 61 73 65 0a 0a 33  et passphrase..3
1830: 20 56 61 6c 75 65 20 70 61 73 73 70 68 72 61 73   Value passphras
1840: 65 2d 72 65 74 72 79 23 0a 24 31 30 30 20 43 6f  e-retry#.$100 Co
1850: 6e 73 74 61 6e 74 20 6d 61 78 2d 70 61 73 73 70  nstant max-passp
1860: 68 72 61 73 65 23 20 5c 20 32 35 36 20 63 68 61  hrase# \ 256 cha
1870: 72 61 63 74 65 72 73 20 73 68 6f 75 6c 64 20 62  racters should b
1880: 65 20 65 6e 6f 75 67 68 2e 2e 2e 0a 6d 61 78 2d  e enough....max-
1890: 70 61 73 73 70 68 72 61 73 65 23 20 62 75 66 66  passphrase# buff
18a0: 65 72 3a 20 70 61 73 73 70 68 72 61 73 65 0a 0a  er: passphrase..
18b0: 3a 20 70 61 73 73 70 68 72 61 73 65 2d 69 6e 20  : passphrase-in 
18c0: 28 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20  ( -- addr u ).  
18d0: 20 20 70 61 73 73 70 68 72 61 73 65 20 64 75 70    passphrase dup
18e0: 20 6d 61 78 2d 70 61 73 73 70 68 72 61 73 65 23   max-passphrase#
18f0: 20 61 63 63 65 70 74 2a 20 3b 0a 0a 3a 20 3e 70   accept* ;..: >p
1900: 61 73 73 70 68 72 61 73 65 20 28 20 61 64 64 72  assphrase ( addr
1910: 20 75 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20   u -- addr u ). 
1920: 20 20 20 5c 47 20 63 72 65 61 74 65 20 61 20 35     \G create a 5
1930: 31 32 20 62 69 74 20 68 61 73 68 20 6f 66 20 74  12 bit hash of t
1940: 68 65 20 70 61 73 73 70 68 72 61 73 65 0a 20 20  he passphrase.  
1950: 20 20 6e 6f 2d 6b 65 79 20 3e 63 3a 6b 65 79 20    no-key >c:key 
1960: 63 3a 68 61 73 68 0a 20 20 20 20 6b 65 63 63 61  c:hash.    kecca
1970: 6b 2d 70 61 64 64 65 64 20 63 3a 6b 65 79 3e 20  k-padded c:key> 
1980: 6b 65 63 63 61 6b 2d 70 61 64 64 65 64 20 6b 65  keccak-padded ke
1990: 63 63 61 6b 23 6d 61 78 20 32 2f 20 3b 0a 0a 3a  ccak#max 2/ ;..:
19a0: 20 67 65 74 2d 70 61 73 73 70 68 72 61 73 65 20   get-passphrase 
19b0: 28 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20  ( -- addr u ).  
19c0: 20 20 70 61 73 73 70 68 72 61 73 65 2d 69 6e 20    passphrase-in 
19d0: 3e 70 61 73 73 70 68 72 61 73 65 20 3b 0a 0a 56  >passphrase ;..V
19e0: 61 72 69 61 62 6c 65 20 6b 65 79 73 0a 0a 3a 20  ariable keys..: 
19f0: 6b 65 79 3e 64 65 66 61 75 6c 74 20 28 20 2d 2d  key>default ( --
1a00: 20 29 20 6b 65 79 73 20 24 5b 5d 23 20 31 2d 20   ) keys $[]# 1- 
1a10: 6b 65 79 73 20 73 65 63 5b 5d 40 20 32 64 75 70  keys sec[]@ 2dup
1a20: 20 38 35 74 79 70 65 20 46 20 63 72 20 64 72 6f   85type F cr dro
1a30: 70 20 3e 73 74 6f 72 65 6b 65 79 20 21 20 3b 0a  p >storekey ! ;.
1a40: 3a 20 2b 6b 65 79 20 28 20 61 64 64 72 20 75 20  : +key ( addr u 
1a50: 2d 2d 20 29 20 6b 65 79 73 20 73 65 63 2b 5b 5d  -- ) keys sec+[]
1a60: 21 20 3b 0a 3a 20 2b 70 61 73 73 70 68 72 61 73  ! ;.: +passphras
1a70: 65 20 28 20 2d 2d 20 29 20 20 67 65 74 2d 70 61  e ( -- )  get-pa
1a80: 73 73 70 68 72 61 73 65 20 2b 6b 65 79 20 3b 0a  ssphrase +key ;.
1a90: 3a 20 2b 63 68 65 63 6b 70 68 72 61 73 65 20 28  : +checkphrase (
1aa0: 20 2d 2d 20 66 6c 61 67 20 29 20 67 65 74 2d 70   -- flag ) get-p
1ab0: 61 73 73 70 68 72 61 73 65 20 6b 65 79 73 20 24  assphrase keys $
1ac0: 5b 5d 23 20 31 2d 20 6b 65 79 73 20 73 65 63 5b  []# 1- keys sec[
1ad0: 5d 40 20 73 74 72 3d 20 3b 0a 3a 20 2b 6e 65 77  ]@ str= ;.: +new
1ae0: 70 68 72 61 73 65 20 28 20 2d 2d 20 29 0a 20 20  phrase ( -- ).  
1af0: 20 20 42 45 47 49 4e 0a 09 2e 22 20 50 61 73 73    BEGIN..." Pass
1b00: 70 68 72 61 73 65 3a 20 22 20 2b 70 61 73 73 70  phrase: " +passp
1b10: 68 72 61 73 65 20 63 72 0a 09 2e 22 20 52 65 74  hrase cr..." Ret
1b20: 79 70 65 20 70 6c 73 3a 20 22 20 2b 63 68 65 63  ype pls: " +chec
1b30: 6b 70 68 72 61 73 65 20 30 3d 20 57 48 49 4c 45  kphrase 0= WHILE
1b40: 0a 09 20 20 20 20 2e 22 20 20 64 69 64 6e 27 74  ..    ."  didn't
1b50: 20 6d 61 74 63 68 2c 20 74 72 79 20 61 67 61 69   match, try agai
1b60: 6e 20 70 6c 65 61 73 65 22 20 63 72 0a 20 20 20  n please" cr.   
1b70: 20 52 45 50 45 41 54 20 63 72 20 3b 0a 0a 3a 20   REPEAT cr ;..: 
1b80: 22 3e 70 61 73 73 70 68 72 61 73 65 20 28 20 61  ">passphrase ( a
1b90: 64 64 72 20 75 20 2d 2d 20 29 20 3e 70 61 73 73  ddr u -- ) >pass
1ba0: 70 68 72 61 73 65 20 2b 6b 65 79 20 3b 0a 3a 20  phrase +key ;.: 
1bb0: 2b 73 65 63 6b 65 79 20 28 20 2d 2d 20 29 0a 20  +seckey ( -- ). 
1bc0: 20 20 20 6b 65 2d 73 6b 20 40 20 6b 65 2d 70 6b     ke-sk @ ke-pk
1bd0: 20 24 40 20 64 72 6f 70 20 6b 65 79 70 61 64 20   $@ drop keypad 
1be0: 65 64 2d 64 68 20 2b 6b 65 79 20 3b 0a 0a 22 22  ed-dh +key ;..""
1bf0: 20 22 3e 70 61 73 73 70 68 72 61 73 65 20 5c 20   ">passphrase \ 
1c00: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 65 6e  following the en
1c10: 63 72 79 70 74 2d 65 76 65 72 79 74 68 69 6e 67  crypt-everything
1c20: 20 70 61 72 61 64 69 67 6d 2c 0a 5c 20 6e 6f 20   paradigm,.\ no 
1c30: 70 61 73 73 77 6f 72 64 20 69 73 20 74 68 65 20  password is the 
1c40: 65 6d 70 74 79 20 73 74 72 69 6e 67 21 20 20 49  empty string!  I
1c50: 74 27 73 20 73 74 69 6c 6c 20 65 6e 63 72 79 70  t's still encryp
1c60: 74 65 64 20 3b 2d 29 21 0a 0a 5c 20 61 20 73 65  ted ;-)!..\ a se
1c70: 63 72 65 74 20 6b 65 79 20 6a 75 73 74 20 6e 65  cret key just ne
1c80: 65 64 73 20 61 20 6e 69 63 6b 20 61 6e 64 20 61  eds a nick and a
1c90: 20 74 79 70 65 2e 0a 5c 20 53 65 63 72 65 74 20   type..\ Secret 
1ca0: 6b 65 79 73 20 63 61 6e 20 62 65 20 70 65 72 73  keys can be pers
1cb0: 6f 6e 73 20 61 6e 64 20 67 72 6f 75 70 73 2e 0a  ons and groups..
1cc0: 0a 5c 20 61 20 70 75 62 6c 69 63 20 6b 65 79 20  .\ a public key 
1cd0: 6e 65 65 64 73 20 6d 6f 72 65 3a 20 6e 69 63 6b  needs more: nick
1ce0: 2c 20 74 79 70 65 2c 20 70 72 6f 66 69 6c 65 2e  , type, profile.
1cf0: 0a 5c 20 54 68 65 20 70 72 6f 66 69 6c 65 20 69  .\ The profile i
1d00: 73 20 61 20 73 74 72 75 63 74 75 72 65 64 20 64  s a structured d
1d10: 6f 63 75 6d 65 6e 74 2c 20 69 2e 65 2e 20 70 6f  ocument, i.e. po
1d20: 69 6e 74 65 64 20 74 6f 20 62 79 20 61 20 68 61  inted to by a ha
1d30: 73 68 2e 0a 0a 5c 20 61 20 73 69 67 6e 61 74 75  sh...\ a signatu
1d40: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 75  re contains a pu
1d50: 62 6b 65 79 2c 20 61 20 63 68 65 63 6b 62 6f 78  bkey, a checkbox
1d60: 20 62 69 74 6d 61 73 6b 2c 0a 5c 20 61 20 64 61   bitmask,.\ a da
1d70: 74 65 2c 20 61 6e 20 65 78 70 69 72 61 74 69 6f  te, an expiratio
1d80: 6e 20 64 61 74 65 2c 20 74 68 65 20 73 69 67 6e  n date, the sign
1d90: 65 72 27 73 20 70 75 62 6b 65 79 20 61 6e 64 20  er's pubkey and 
1da0: 74 68 65 20 73 69 67 6e 61 74 75 72 65 20 69 74  the signature it
1db0: 73 65 6c 66 0a 5c 20 28 72 2b 73 29 2e 20 20 54  self.\ (r+s).  T
1dc0: 68 65 72 65 20 69 73 20 61 6e 20 6f 70 74 69 6f  here is an optio
1dd0: 6e 61 6c 20 73 69 67 6e 69 6e 67 20 70 72 6f 74  nal signing prot
1de0: 6f 63 6f 6c 20 64 6f 63 75 6d 65 6e 74 20 28 68  ocol document (h
1df0: 61 73 68 29 2e 0a 0a 5c 20 77 65 20 73 74 6f 72  ash)...\ we stor
1e00: 65 20 65 61 63 68 20 69 74 65 6d 20 69 6e 20 61  e each item in a
1e10: 20 32 35 36 20 62 79 74 65 73 20 65 6e 63 72 79   256 bytes encry
1e20: 70 74 65 64 20 73 74 72 69 6e 67 2c 20 69 2e 65  pted string, i.e
1e30: 2e 20 77 69 74 68 20 61 20 31 36 0a 5c 20 62 79  . with a 16.\ by
1e40: 74 65 20 73 61 6c 74 20 61 6e 64 20 61 20 31 36  te salt and a 16
1e50: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 2e 0a   byte checksum..
1e60: 0a 3a 20 6b 65 2d 6c 61 73 74 21 20 28 20 36 34  .: ke-last! ( 64
1e70: 64 61 74 65 20 2d 2d 20 29 0a 20 20 20 20 6b 65  date -- ).    ke
1e80: 2d 73 65 6c 66 73 69 67 20 24 40 6c 65 6e 20 24  -selfsig $@len $
1e90: 31 30 20 75 6d 61 78 20 6b 65 2d 73 65 6c 66 73  10 umax ke-selfs
1ea0: 69 67 20 24 21 6c 65 6e 0a 20 20 20 20 6b 65 2d  ig $!len.    ke-
1eb0: 73 65 6c 66 73 69 67 20 24 40 20 64 72 6f 70 20  selfsig $@ drop 
1ec0: 36 34 27 2b 20 36 34 21 20 3b 0a 3a 20 6b 65 2d  64'+ 64! ;.: ke-
1ed0: 66 69 72 73 74 21 20 28 20 36 34 64 61 74 65 20  first! ( 64date 
1ee0: 2d 2d 20 29 20 36 34 23 2d 31 20 6b 65 2d 6c 61  -- ) 64#-1 ke-la
1ef0: 73 74 21 0a 20 20 20 20 6b 65 2d 73 65 6c 66 73  st!.    ke-selfs
1f00: 69 67 20 24 40 20 64 72 6f 70 20 36 34 21 20 3b  ig $@ drop 64! ;
1f10: 0a 0a 67 65 74 2d 63 75 72 72 65 6e 74 20 61 6c  ..get-current al
1f20: 73 6f 20 6e 65 74 32 6f 2d 62 61 73 65 20 64 65  so net2o-base de
1f30: 66 69 6e 69 74 69 6f 6e 73 0a 0a 63 6d 64 2d 74  finitions..cmd-t
1f40: 61 62 6c 65 20 24 40 20 69 6e 68 65 72 69 74 2d  able $@ inherit-
1f50: 74 61 62 6c 65 20 6b 65 79 2d 65 6e 74 72 79 2d  table key-entry-
1f60: 74 61 62 6c 65 0a 5c 67 20 0a 5c 67 20 23 23 23  table.\g .\g ###
1f70: 20 6b 65 79 20 73 74 6f 72 61 67 65 20 63 6f 6d   key storage com
1f80: 6d 61 6e 64 73 20 23 23 23 0a 5c 67 20 0a 24 31  mands ###.\g .$1
1f90: 31 20 6e 65 74 32 6f 3a 20 70 72 69 76 6b 65 79  1 net2o: privkey
1fa0: 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29   ( $:string -- )
1fb0: 0a 20 20 20 20 5c 67 20 70 72 69 76 61 74 65 20  .    \g private 
1fc0: 6b 65 79 0a 20 20 20 20 5c 20 64 6f 65 73 20 6e  key.    \ does n
1fd0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 69  ot need to be si
1fe0: 67 6e 65 64 2c 20 74 68 65 20 73 65 63 72 65 74  gned, the secret
1ff0: 20 6b 65 79 20 76 65 72 69 66 69 65 73 20 69 74   key verifies it
2000: 73 65 6c 66 0a 20 20 20 20 24 3e 20 6f 76 65 72  self.    $> over
2010: 20 6b 65 79 70 61 64 20 73 6b 3e 70 6b 20 5c 20   keypad sk>pk \ 
2020: 67 65 6e 65 72 61 74 65 20 70 75 62 6b 65 79 0a  generate pubkey.
2030: 20 20 20 20 6b 65 79 70 61 64 20 6b 65 2d 70 6b      keypad ke-pk
2040: 20 24 40 20 64 72 6f 70 20 6b 65 79 73 69 7a 65   $@ drop keysize
2050: 20 74 75 63 6b 20 73 74 72 3d 20 30 3d 20 21 21   tuck str= 0= !!
2060: 77 72 6f 6e 67 2d 6b 65 79 21 21 0a 20 20 20 20  wrong-key!!.    
2070: 6b 65 2d 73 6b 20 73 65 63 21 20 2b 73 65 63 6b  ke-sk sec! +seck
2080: 65 79 20 3b 0a 2b 6e 65 74 32 6f 3a 20 6b 65 79  ey ;.+net2o: key
2090: 74 79 70 65 20 28 20 6e 20 2d 2d 20 29 20 20 20  type ( n -- )   
20a0: 20 20 20 20 20 20 20 20 21 21 73 69 67 6e 65 64          !!signed
20b0: 3f 20 20 20 31 20 21 21 3e 6f 72 64 65 72 3f 20  ?   1 !!>order? 
20c0: 36 34 3e 6e 20 6b 65 2d 74 79 70 65 20 21 20 3b  64>n ke-type ! ;
20d0: 0a 5c 67 20 6b 65 79 20 74 79 70 65 20 28 30 3a  .\g key type (0:
20e0: 20 61 6e 6f 6e 2c 20 31 3a 20 75 73 65 72 2c 20   anon, 1: user, 
20f0: 32 3a 20 67 72 6f 75 70 29 0a 2b 6e 65 74 32 6f  2: group).+net2o
2100: 3a 20 6b 65 79 6e 69 63 6b 20 28 20 24 3a 73 74  : keynick ( $:st
2110: 72 69 6e 67 20 2d 2d 20 29 20 20 20 20 21 21 73  ring -- )    !!s
2120: 69 67 6e 65 64 3f 20 20 20 32 20 21 21 3e 6f 72  igned?   2 !!>or
2130: 64 65 72 3f 20 24 3e 20 6b 65 2d 6e 69 63 6b 20  der? $> ke-nick 
2140: 24 21 20 3b 0a 5c 67 20 6b 65 79 20 6e 69 63 6b  $! ;.\g key nick
2150: 0a 2b 6e 65 74 32 6f 3a 20 6b 65 79 70 72 6f 66  .+net2o: keyprof
2160: 69 6c 65 20 28 20 24 3a 73 74 72 69 6e 67 20 2d  ile ( $:string -
2170: 2d 20 29 20 21 21 73 69 67 6e 65 64 3f 20 20 20  - ) !!signed?   
2180: 34 20 21 21 3e 6f 72 64 65 72 3f 20 24 3e 20 6b  4 !!>order? $> k
2190: 65 2d 70 72 6f 66 20 24 21 20 3b 0a 5c 67 20 6b  e-prof $! ;.\g k
21a0: 65 79 20 70 72 6f 66 69 6c 65 20 28 68 61 73 68  ey profile (hash
21b0: 20 6f 66 20 61 20 72 65 73 6f 75 72 63 65 29 0a   of a resource).
21c0: 2b 6e 65 74 32 6f 3a 20 6b 65 79 6d 61 73 6b 20  +net2o: keymask 
21d0: 28 20 78 20 2d 2d 20 29 20 20 20 20 20 20 20 20  ( x -- )        
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
21f0: 20 21 21 3e 6f 72 64 65 72 3f 20 36 34 64 72 6f   !!>order? 64dro
2200: 70 20 3b 0a 5c 67 20 6b 65 79 20 6d 61 73 6b 0a  p ;.\g key mask.
2210: 2b 6e 65 74 32 6f 3a 20 6b 65 79 70 73 6b 20 28  +net2o: keypsk (
2220: 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 20 20   $:string -- )  
2230: 20 20 20 21 21 73 69 67 6e 65 64 3f 20 24 31 30     !!signed? $10
2240: 20 21 21 3e 6f 72 64 65 72 3f 20 24 3e 20 6b 65   !!>order? $> ke
2250: 2d 70 73 6b 20 73 65 63 21 20 3b 0a 5c 67 20 70  -psk sec! ;.\g p
2260: 72 65 73 68 61 72 65 64 20 6b 65 79 20 28 75 6e  reshared key (un
2270: 63 6c 65 61 72 20 69 66 20 74 68 61 74 27 73 20  clear if that's 
2280: 67 6f 69 6e 67 20 74 6f 20 73 74 61 79 0a 2b 6e  going to stay.+n
2290: 65 74 32 6f 3a 20 2b 6b 65 79 73 69 67 20 28 20  et2o: +keysig ( 
22a0: 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 20 20 24  $:string -- )  $
22b0: 32 30 20 21 21 3e 3d 6f 72 64 65 72 3f 20 24 3e  20 !!>=order? $>
22c0: 20 6b 65 2d 73 69 67 73 20 24 2b 5b 5d 21 20 3b   ke-sigs $+[]! ;
22d0: 0a 5c 67 20 61 64 64 20 61 20 6b 65 79 20 73 69  .\g add a key si
22e0: 67 6e 61 74 75 72 65 0a 64 75 70 20 73 65 74 2d  gnature.dup set-
22f0: 63 75 72 72 65 6e 74 20 70 72 65 76 69 6f 75 73  current previous
2300: 0a 0a 67 65 6e 2d 74 61 62 6c 65 20 24 66 72 65  ..gen-table $fre
2310: 65 7a 65 0a 27 20 63 6f 6e 74 65 78 74 2d 74 61  eze.' context-ta
2320: 62 6c 65 20 69 73 20 67 65 6e 2d 74 61 62 6c 65  ble is gen-table
2330: 0a 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61 64 64 72  ..:noname ( addr
2340: 20 75 20 2d 2d 20 61 64 64 72 20 75 27 20 66 6c   u -- addr u' fl
2350: 61 67 20 29 0a 20 20 20 20 70 6b 32 2d 73 69 67  ag ).    pk2-sig
2360: 3f 20 64 75 70 20 30 3d 20 3f 45 58 49 54 20 64  ? dup 0= ?EXIT d
2370: 72 6f 70 0a 20 20 20 20 32 64 75 70 20 2b 20 73  rop.    2dup + s
2380: 69 67 73 69 7a 65 23 20 2d 20 73 69 67 73 69 7a  igsize# - sigsiz
2390: 65 23 20 3e 24 0a 20 20 20 20 73 69 67 70 6b 32  e# >$.    sigpk2
23a0: 73 69 7a 65 23 20 2d 20 32 64 75 70 20 2b 20 6b  size# - 2dup + k
23b0: 65 79 73 69 7a 65 20 32 2a 20 6b 65 79 3f 6e 65  eysize 2* key?ne
23c0: 77 20 6e 3a 3e 6f 20 24 3e 20 6b 65 2d 73 65 6c  w n:>o $> ke-sel
23d0: 66 73 69 67 20 24 21 0a 20 20 20 20 63 2d 73 74  fsig $!.    c-st
23e0: 61 74 65 20 6f 66 66 20 74 72 75 65 20 3b 20 6b  ate off true ; k
23f0: 65 79 2d 65 6e 74 72 79 20 74 6f 20 6e 65 73 74  ey-entry to nest
2400: 2d 73 69 67 0a 0a 6b 65 79 2d 65 6e 74 72 79 20  -sig..key-entry 
2410: 27 20 6e 65 77 20 73 74 61 74 69 63 2d 61 20 77  ' new static-a w
2420: 69 74 68 2d 61 6c 6c 6f 63 61 74 65 72 20 74 6f  ith-allocater to
2430: 20 73 61 6d 70 6c 65 2d 6b 65 79 0a 73 61 6d 70   sample-key.samp
2440: 6c 65 2d 6b 65 79 20 3e 6f 20 6b 65 79 2d 65 6e  le-key >o key-en
2450: 74 72 79 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65  try-table @ toke
2460: 6e 2d 74 61 62 6c 65 20 21 20 6f 3e 0a 0a 3a 20  n-table ! o>..: 
2470: 6b 65 79 3a 63 6f 64 65 20 28 20 2d 2d 20 29 0a  key:code ( -- ).
2480: 20 20 20 20 63 6f 64 65 2d 6b 65 79 20 20 63 6d      code-key  cm
2490: 64 6c 6f 63 6b 20 6c 6f 63 6b 0a 20 20 20 20 6b  dlock lock.    k
24a0: 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d 61  eypack keypack-a
24b0: 6c 6c 23 20 65 72 61 73 65 0a 20 20 20 20 63 6d  ll# erase.    cm
24c0: 64 72 65 73 65 74 20 61 6c 73 6f 20 6e 65 74 32  dreset also net2
24d0: 6f 2d 62 61 73 65 20 3b 0a 63 6f 6d 70 3a 20 3a  o-base ;.comp: :
24e0: 2c 20 61 6c 73 6f 20 6e 65 74 32 6f 2d 62 61 73  , also net2o-bas
24f0: 65 20 3b 0a 0a 61 6c 73 6f 20 6e 65 74 32 6f 2d  e ;..also net2o-
2500: 62 61 73 65 20 64 65 66 69 6e 69 74 69 6f 6e 73  base definitions
2510: 0a 0a 3a 20 65 6e 64 3a 6b 65 79 20 28 20 2d 2d  ..: end:key ( --
2520: 20 29 0a 20 20 20 20 65 6e 64 77 69 74 68 20 70   ).    endwith p
2530: 72 65 76 69 6f 75 73 20 63 6d 64 6c 6f 63 6b 20  revious cmdlock 
2540: 75 6e 6c 6f 63 6b 20 3b 0a 63 6f 6d 70 3a 20 3a  unlock ;.comp: :
2550: 2c 20 70 72 65 76 69 6f 75 73 20 3b 0a 0a 73 65  , previous ;..se
2560: 74 2d 63 75 72 72 65 6e 74 20 70 72 65 76 69 6f  t-current previo
2570: 75 73 20 70 72 65 76 69 6f 75 73 0a 0a 3a 20 6b  us previous..: k
2580: 65 79 2d 63 72 79 70 74 20 28 20 2d 2d 20 29 0a  ey-crypt ( -- ).
2590: 20 20 20 20 6b 65 79 70 61 63 6b 20 6b 65 79 70      keypack keyp
25a0: 61 63 6b 2d 61 6c 6c 23 0a 20 20 20 20 3e 73 74  ack-all#.    >st
25b0: 6f 72 65 6b 65 79 20 73 65 63 40 20 64 75 70 20  orekey sec@ dup 
25c0: 24 32 30 20 75 3c 3d 20 5c 20 69 73 20 61 20 73  $20 u<= \ is a s
25d0: 65 63 72 65 74 2c 20 6e 6f 20 6e 65 65 64 20 74  ecret, no need t
25e0: 6f 20 62 65 20 73 6c 6f 77 0a 20 20 20 20 49 46  o be slow.    IF
25f0: 20 20 65 6e 63 72 79 70 74 24 20 20 45 4c 53 45    encrypt$  ELSE
2600: 20 20 70 77 2d 6c 65 76 65 6c 23 20 65 6e 63 72    pw-level# encr
2610: 79 70 74 2d 70 77 24 20 20 54 48 45 4e 20 3b 0a  ypt-pw$  THEN ;.
2620: 0a 30 20 56 61 6c 75 65 20 6b 65 79 2d 73 66 64  .0 Value key-sfd
2630: 20 5c 20 73 65 63 72 65 74 20 6b 65 79 73 0a 30   \ secret keys.0
2640: 20 56 61 6c 75 65 20 6b 65 79 2d 70 66 64 20 5c   Value key-pfd \
2650: 20 70 75 62 6b 65 79 73 0a 0a 3a 20 3f 2e 6e 65   pubkeys..: ?.ne
2660: 74 32 6f 20 28 20 2d 2d 20 29 0a 20 20 20 20 73  t2o ( -- ).    s
2670: 22 20 7e 2f 2e 6e 65 74 32 6f 22 20 72 2f 6f 20  " ~/.net2o" r/o 
2680: 6f 70 65 6e 2d 66 69 6c 65 20 49 46 0a 09 64 72  open-file IF..dr
2690: 6f 70 20 73 22 20 7e 2f 2e 6e 65 74 32 6f 22 20  op s" ~/.net2o" 
26a0: 24 31 43 30 20 6d 6b 64 69 72 2d 70 61 72 65 6e  $1C0 mkdir-paren
26b0: 74 73 20 74 68 72 6f 77 0a 20 20 20 20 45 4c 53  ts throw.    ELS
26c0: 45 0a 09 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68  E..close-file th
26d0: 72 6f 77 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a  row.    THEN ;..
26e0: 3a 20 3f 66 64 20 28 20 66 64 20 61 64 64 72 20  : ?fd ( fd addr 
26f0: 75 20 2d 2d 20 66 64 27 20 29 20 7b 20 61 64 64  u -- fd' ) { add
2700: 72 20 75 20 7d 20 64 75 70 20 3f 45 58 49 54 20  r u } dup ?EXIT 
2710: 64 72 6f 70 0a 20 20 20 20 3f 2e 6e 65 74 32 6f  drop.    ?.net2o
2720: 0a 20 20 20 20 61 64 64 72 20 75 20 72 2f 77 20  .    addr u r/w 
2730: 6f 70 65 6e 2d 66 69 6c 65 20 64 75 70 20 2d 35  open-file dup -5
2740: 31 34 20 3d 20 49 46 0a 09 32 64 72 6f 70 20 61  14 = IF..2drop a
2750: 64 64 72 20 75 20 72 2f 77 20 63 72 65 61 74 65  ddr u r/w create
2760: 2d 66 69 6c 65 0a 20 20 20 20 54 48 45 4e 20 20  -file.    THEN  
2770: 74 68 72 6f 77 20 3b 0a 3a 20 3f 6b 65 79 2d 73  throw ;.: ?key-s
2780: 66 64 20 28 20 2d 2d 20 66 64 20 29 20 6b 65 79  fd ( -- fd ) key
2790: 2d 73 66 64 20 22 7e 2f 2e 6e 65 74 32 6f 2f 73  -sfd "~/.net2o/s
27a0: 65 63 6b 65 79 73 2e 6b 32 6f 22 20 3f 66 64 20  eckeys.k2o" ?fd 
27b0: 64 75 70 20 74 6f 20 6b 65 79 2d 73 66 64 20 3b  dup to key-sfd ;
27c0: 0a 3a 20 3f 6b 65 79 2d 70 66 64 20 28 20 2d 2d  .: ?key-pfd ( --
27d0: 20 66 64 20 29 20 6b 65 79 2d 70 66 64 20 22 7e   fd ) key-pfd "~
27e0: 2f 2e 6e 65 74 32 6f 2f 70 75 62 6b 65 79 73 2e  /.net2o/pubkeys.
27f0: 6b 32 6f 22 20 3f 66 64 20 64 75 70 20 74 6f 20  k2o" ?fd dup to 
2800: 6b 65 79 2d 70 66 64 20 3b 0a 0a 3a 20 77 72 69  key-pfd ;..: wri
2810: 74 65 40 70 6f 73 2d 66 69 6c 65 20 28 20 61 64  te@pos-file ( ad
2820: 64 72 20 75 20 36 34 70 6f 73 20 66 64 20 2d 2d  dr u 64pos fd --
2830: 20 29 20 3e 72 0a 20 20 20 20 36 34 3e 64 20 72   ) >r.    64>d r
2840: 40 20 72 65 70 6f 73 69 74 69 6f 6e 2d 66 69 6c  @ reposition-fil
2850: 65 20 74 68 72 6f 77 0a 20 20 20 20 72 40 20 77  e throw.    r@ w
2860: 72 69 74 65 2d 66 69 6c 65 20 74 68 72 6f 77 20  rite-file throw 
2870: 72 3e 20 66 6c 75 73 68 2d 66 69 6c 65 20 74 68  r> flush-file th
2880: 72 6f 77 20 3b 0a 0a 3a 20 61 70 70 65 6e 64 2d  row ;..: append-
2890: 66 69 6c 65 20 28 20 61 64 64 72 20 75 20 66 64  file ( addr u fd
28a0: 20 2d 2d 20 29 20 3e 72 0a 20 20 20 20 72 40 20   -- ) >r.    r@ 
28b0: 66 69 6c 65 2d 73 69 7a 65 20 74 68 72 6f 77 20  file-size throw 
28c0: 64 3e 36 34 20 72 3e 20 77 72 69 74 65 40 70 6f  d>64 r> write@po
28d0: 73 2d 66 69 6c 65 20 3b 0a 0a 3a 20 6b 65 79 3e  s-file ;..: key>
28e0: 73 66 69 6c 65 20 28 20 2d 2d 20 29 0a 20 20 20  sfile ( -- ).   
28f0: 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b   keypack keypack
2900: 2d 61 6c 6c 23 20 3f 6b 65 79 2d 73 66 64 20 61  -all# ?key-sfd a
2910: 70 70 65 6e 64 2d 66 69 6c 65 20 3b 0a 3a 20 6b  ppend-file ;.: k
2920: 65 79 3e 70 66 69 6c 65 20 28 20 2d 2d 20 29 0a  ey>pfile ( -- ).
2930: 20 20 20 20 6b 65 79 70 61 63 6b 20 6b 65 79 70      keypack keyp
2940: 61 63 6b 2d 61 6c 6c 23 20 3f 6b 65 79 2d 70 66  ack-all# ?key-pf
2950: 64 20 61 70 70 65 6e 64 2d 66 69 6c 65 20 3b 0a  d append-file ;.
2960: 0a 3a 20 6b 65 79 3e 73 66 69 6c 65 40 70 6f 73  .: key>sfile@pos
2970: 20 28 20 36 34 70 6f 73 20 2d 2d 20 29 20 36 34   ( 64pos -- ) 64
2980: 3e 72 0a 20 20 20 20 6b 65 79 70 61 63 6b 20 6b  >r.    keypack k
2990: 65 79 70 61 63 6b 2d 61 6c 6c 23 20 36 34 72 3e  eypack-all# 64r>
29a0: 20 3f 6b 65 79 2d 73 66 64 20 77 72 69 74 65 40   ?key-sfd write@
29b0: 70 6f 73 2d 66 69 6c 65 20 3b 0a 3a 20 6b 65 79  pos-file ;.: key
29c0: 3e 70 66 69 6c 65 40 70 6f 73 20 28 20 36 34 70  >pfile@pos ( 64p
29d0: 6f 73 20 2d 2d 20 29 20 36 34 3e 72 0a 20 20 20  os -- ) 64>r.   
29e0: 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b   keypack keypack
29f0: 2d 61 6c 6c 23 20 36 34 72 3e 20 3f 6b 65 79 2d  -all# 64r> ?key-
2a00: 70 66 64 20 77 72 69 74 65 40 70 6f 73 2d 66 69  pfd write@pos-fi
2a10: 6c 65 20 3b 0a 0a 3a 20 72 6e 64 3e 73 66 69 6c  le ;..: rnd>sfil
2a20: 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79  e ( -- ).    key
2a30: 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d 61 6c 6c  pack keypack-all
2a40: 23 20 3e 72 6e 67 24 20 6b 65 79 3e 73 66 69 6c  # >rng$ key>sfil
2a50: 65 20 3b 0a 3a 20 72 6e 64 3e 70 66 69 6c 65 20  e ;.: rnd>pfile 
2a60: 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 70 61  ( -- ).    keypa
2a70: 63 6b 20 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20  ck keypack-all# 
2a80: 3e 72 6e 67 24 20 6b 65 79 3e 70 66 69 6c 65 20  >rng$ key>pfile 
2a90: 3b 0a 0a 3a 20 3e 6b 65 79 73 20 28 20 2d 2d 20  ;..: >keys ( -- 
2aa0: 29 0a 20 20 20 20 5c 47 20 61 64 64 20 73 68 61  ).    \G add sha
2ab0: 72 65 64 20 73 65 63 72 65 74 20 74 6f 20 6c 69  red secret to li
2ac0: 73 74 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 6b  st of possible k
2ad0: 65 79 73 0a 20 20 20 20 73 6b 63 20 70 6b 63 20  eys.    skc pkc 
2ae0: 6b 65 79 70 61 64 20 65 64 2d 64 68 20 2b 6b 65  keypad ed-dh +ke
2af0: 79 20 3b 0a 0a 5c 20 6b 65 79 20 67 65 6e 65 72  y ;..\ key gener
2b00: 61 74 69 6f 6e 0a 5c 20 66 6f 72 20 72 65 70 72  ation.\ for repr
2b10: 6f 64 75 63 69 62 69 6c 69 74 79 20 6f 66 20 74  oducibility of t
2b20: 68 65 20 73 65 6c 66 73 69 67 2c 20 61 6c 77 61  he selfsig, alwa
2b30: 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
2b40: 6f 72 64 65 72 3a 0a 5c 20 22 70 75 62 6b 65 79  order:.\ "pubkey
2b50: 22 20 6e 65 77 6b 65 79 20 3c 6e 3e 20 6b 65 79  " newkey <n> key
2b60: 74 79 70 65 20 22 6e 69 63 6b 22 20 6b 65 79 6e  type "nick" keyn
2b70: 69 63 6b 20 22 73 69 67 22 20 6b 65 79 73 65 6c  ick "sig" keysel
2b80: 66 73 69 67 0a 0a 55 73 65 72 20 70 6b 2b 73 69  fsig..User pk+si
2b90: 67 24 0a 0a 6b 65 79 73 69 7a 65 20 32 2a 20 43  g$..keysize 2* C
2ba0: 6f 6e 73 74 61 6e 74 20 70 6b 72 6b 23 0a 0a 3a  onstant pkrk#..:
2bb0: 20 5d 70 6b 2b 73 69 67 6e 20 28 20 61 64 64 72   ]pk+sign ( addr
2bc0: 20 75 20 2d 2d 20 29 20 2b 63 6d 64 62 75 66 20   u -- ) +cmdbuf 
2bd0: 5d 73 69 67 6e 20 3b 0a 0a 3a 20 70 61 63 6b 2d  ]sign ;..: pack-
2be0: 6b 65 79 20 28 20 74 79 70 65 20 6e 69 63 6b 20  key ( type nick 
2bf0: 75 20 2d 2d 20 29 0a 20 20 20 20 6e 6f 77 3e 6e  u -- ).    now>n
2c00: 65 76 65 72 0a 20 20 20 20 6b 65 79 3a 63 6f 64  ever.    key:cod
2c10: 65 0a 20 20 20 20 20 20 73 69 67 6e 5b 0a 20 20  e.      sign[.  
2c20: 20 20 20 20 72 6f 74 20 75 6c 69 74 2c 20 6b 65      rot ulit, ke
2c30: 79 74 79 70 65 20 24 2c 20 6b 65 79 6e 69 63 6b  ytype $, keynick
2c40: 0a 20 20 20 20 20 20 70 6b 63 20 70 6b 72 6b 23  .      pkc pkrk#
2c50: 20 5d 70 6b 2b 73 69 67 6e 0a 20 20 20 20 20 20   ]pk+sign.      
2c60: 73 6b 63 20 6b 65 79 73 69 7a 65 20 24 2c 20 70  skc keysize $, p
2c70: 72 69 76 6b 65 79 0a 20 20 20 20 65 6e 64 3a 6b  rivkey.    end:k
2c80: 65 79 20 3b 0a 0a 61 6c 73 6f 20 6e 65 74 32 6f  ey ;..also net2o
2c90: 2d 62 61 73 65 0a 3a 20 70 61 63 6b 2d 63 6f 72  -base.: pack-cor
2ca0: 65 6b 65 79 20 28 20 6f 3a 6b 65 79 20 2d 2d 20  ekey ( o:key -- 
2cb0: 29 0a 20 20 20 20 73 69 67 6e 5b 0a 20 20 20 20  ).    sign[.    
2cc0: 6b 65 2d 74 79 70 65 20 40 20 75 6c 69 74 2c 20  ke-type @ ulit, 
2cd0: 6b 65 79 74 79 70 65 0a 20 20 20 20 6b 65 2d 6e  keytype.    ke-n
2ce0: 69 63 6b 20 24 40 20 24 2c 20 6b 65 79 6e 69 63  ick $@ $, keynic
2cf0: 6b 0a 20 20 20 20 6b 65 2d 70 73 6b 20 73 65 63  k.    ke-psk sec
2d00: 40 20 64 75 70 20 49 46 20 20 24 2c 20 6b 65 79  @ dup IF  $, key
2d10: 70 73 6b 20 20 45 4c 53 45 20 20 32 64 72 6f 70  psk  ELSE  2drop
2d20: 20 20 54 48 45 4e 0a 20 20 20 20 6b 65 2d 70 72    THEN.    ke-pr
2d30: 6f 66 20 24 40 20 64 75 70 20 49 46 20 20 24 2c  of $@ dup IF  $,
2d40: 20 6b 65 79 70 72 6f 66 69 6c 65 20 20 45 4c 53   keyprofile  ELS
2d50: 45 20 20 32 64 72 6f 70 20 20 54 48 45 4e 0a 20  E  2drop  THEN. 
2d60: 20 20 20 6b 65 2d 70 6b 20 24 40 20 2b 63 6d 64     ke-pk $@ +cmd
2d70: 62 75 66 0a 20 20 20 20 6b 65 2d 73 65 6c 66 73  buf.    ke-selfs
2d80: 69 67 20 24 40 20 2b 63 6d 64 62 75 66 20 63 6d  ig $@ +cmdbuf cm
2d90: 64 2d 72 65 73 6f 6c 76 65 3e 20 32 64 72 6f 70  d-resolve> 2drop
2da0: 20 6e 65 73 74 73 69 67 0a 20 20 20 20 6b 65 2d   nestsig.    ke-
2db0: 73 74 6f 72 65 6b 65 79 20 40 20 3e 73 74 6f 72  storekey @ >stor
2dc0: 65 6b 65 79 20 21 20 3b 0a 70 72 65 76 69 6f 75  ekey ! ;.previou
2dd0: 73 0a 0a 3a 20 70 61 63 6b 2d 70 75 62 6b 65 79  s..: pack-pubkey
2de0: 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 29 0a 20 20   ( o:key -- ).  
2df0: 20 20 6b 65 79 3a 63 6f 64 65 0a 20 20 20 20 20    key:code.     
2e00: 20 70 61 63 6b 2d 63 6f 72 65 6b 65 79 0a 20 20   pack-corekey.  
2e10: 20 20 65 6e 64 3a 6b 65 79 20 3b 0a 3a 20 70 61    end:key ;.: pa
2e20: 63 6b 2d 73 65 63 6b 65 79 20 28 20 6f 3a 6b 65  ck-seckey ( o:ke
2e30: 79 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 3a 63  y -- ).    key:c
2e40: 6f 64 65 0a 20 20 20 20 20 20 70 61 63 6b 2d 63  ode.      pack-c
2e50: 6f 72 65 6b 65 79 0a 20 20 20 20 20 20 6b 65 2d  orekey.      ke-
2e60: 73 6b 20 73 65 63 40 20 24 2c 20 70 72 69 76 6b  sk sec@ $, privk
2e70: 65 79 0a 20 20 20 20 65 6e 64 3a 6b 65 79 20 3b  ey.    end:key ;
2e80: 0a 0a 3a 20 3e 62 61 63 6b 75 70 20 28 20 61 64  ..: >backup ( ad
2e90: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 32 64  dr u -- ).    2d
2ea0: 75 70 20 32 64 75 70 20 5b 3a 20 74 79 70 65 20  up 2dup [: type 
2eb0: 27 7e 27 20 65 6d 69 74 20 3b 5d 20 24 74 6d 70  '~' emit ;] $tmp
2ec0: 20 72 65 6e 61 6d 65 2d 66 69 6c 65 20 74 68 72   rename-file thr
2ed0: 6f 77 0a 20 20 20 20 32 64 75 70 20 5b 3a 20 74  ow.    2dup [: t
2ee0: 79 70 65 20 27 2b 27 20 65 6d 69 74 20 3b 5d 20  ype '+' emit ;] 
2ef0: 24 74 6d 70 20 32 73 77 61 70 20 72 65 6e 61 6d  $tmp 2swap renam
2f00: 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 3b 0a 0a  e-file throw ;..
2f10: 56 61 72 69 61 62 6c 65 20 63 70 2d 74 6d 70 0a  Variable cp-tmp.
2f20: 0a 3a 20 73 61 76 65 2d 70 75 62 6b 65 79 73 20  .: save-pubkeys 
2f30: 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 2d 70  ( -- ).    key-p
2f40: 66 64 20 3f 64 75 70 2d 49 46 0a 09 64 75 70 20  fd ?dup-IF..dup 
2f50: 30 2e 20 72 6f 74 20 72 65 70 6f 73 69 74 69 6f  0. rot repositio
2f60: 6e 2d 66 69 6c 65 20 74 68 72 6f 77 0a 09 64 75  n-file throw..du
2f70: 70 20 63 70 2d 74 6d 70 20 24 73 6c 75 72 70 20  p cp-tmp $slurp 
2f80: 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77  close-file throw
2f90: 20 20 54 48 45 4e 0a 20 20 20 20 30 20 22 7e 2f    THEN.    0 "~/
2fa0: 2e 6e 65 74 32 6f 2f 70 75 62 6b 65 79 73 2e 6b  .net2o/pubkeys.k
2fb0: 32 6f 2b 22 20 3f 66 64 20 74 6f 20 6b 65 79 2d  2o+" ?fd to key-
2fc0: 70 66 64 0a 20 20 20 20 63 70 2d 74 6d 70 20 24  pfd.    cp-tmp $
2fd0: 40 20 6b 65 79 2d 70 66 64 20 77 72 69 74 65 2d  @ key-pfd write-
2fe0: 66 69 6c 65 20 74 68 72 6f 77 20 63 70 2d 74 6d  file throw cp-tm
2ff0: 70 20 24 6f 66 66 0a 20 20 20 20 6b 65 79 2d 74  p $off.    key-t
3000: 61 62 6c 65 20 5b 3a 20 63 65 6c 6c 2b 20 24 40  able [: cell+ $@
3010: 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e 6f 0a 20   drop cell+ >o. 
3020: 20 20 20 20 20 6b 65 2d 73 6b 20 73 65 63 40 20       ke-sk sec@ 
3030: 64 30 3d 20 49 46 20 20 70 61 63 6b 2d 70 75 62  d0= IF  pack-pub
3040: 6b 65 79 0a 09 20 20 66 6c 75 73 68 28 20 2e 22  key..  flush( ."
3050: 20 73 61 76 69 6e 67 20 22 20 6b 65 2d 6e 69 63   saving " ke-nic
3060: 6b 20 24 40 20 74 79 70 65 20 46 20 63 72 20 29  k $@ type F cr )
3070: 0a 09 20 20 6b 65 79 2d 63 72 79 70 74 20 6b 65  ..  key-crypt ke
3080: 2d 6f 66 66 73 65 74 20 36 34 40 20 6b 65 79 3e  -offset 64@ key>
3090: 70 66 69 6c 65 40 70 6f 73 0a 20 20 20 20 20 20  pfile@pos.      
30a0: 54 48 45 4e 20 6f 3e 20 3b 5d 20 23 6d 61 70 0a  THEN o> ;] #map.
30b0: 20 20 20 20 6b 65 79 2d 70 66 64 20 63 6c 6f 73      key-pfd clos
30c0: 65 2d 66 69 6c 65 20 74 68 72 6f 77 0a 20 20 20  e-file throw.   
30d0: 20 22 7e 2f 2e 6e 65 74 32 6f 2f 70 75 62 6b 65   "~/.net2o/pubke
30e0: 79 73 2e 6b 32 6f 22 20 3e 62 61 63 6b 75 70 0a  ys.k2o" >backup.
30f0: 20 20 20 20 30 20 74 6f 20 6b 65 79 2d 70 66 64      0 to key-pfd
3100: 20 3b 0a 0a 3a 20 73 61 76 65 2d 73 65 63 6b 65   ;..: save-secke
3110: 79 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65  ys ( -- ).    ke
3120: 79 2d 73 66 64 20 3f 64 75 70 2d 49 46 0a 09 64  y-sfd ?dup-IF..d
3130: 75 70 20 30 2e 20 72 6f 74 20 72 65 70 6f 73 69  up 0. rot reposi
3140: 74 69 6f 6e 2d 66 69 6c 65 20 74 68 72 6f 77 0a  tion-file throw.
3150: 09 64 75 70 20 63 70 2d 74 6d 70 20 24 73 6c 75  .dup cp-tmp $slu
3160: 72 70 20 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68  rp close-file th
3170: 72 6f 77 20 20 54 48 45 4e 0a 20 20 20 20 30 20  row  THEN.    0 
3180: 22 7e 2f 2e 6e 65 74 32 6f 2f 73 65 63 6b 65 79  "~/.net2o/seckey
3190: 73 2e 6b 32 6f 2b 22 20 3f 66 64 20 74 6f 20 6b  s.k2o+" ?fd to k
31a0: 65 79 2d 73 66 64 0a 20 20 20 20 63 70 2d 74 6d  ey-sfd.    cp-tm
31b0: 70 20 24 40 20 6b 65 79 2d 73 66 64 20 77 72 69  p $@ key-sfd wri
31c0: 74 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 63 70  te-file throw cp
31d0: 2d 74 6d 70 20 24 6f 66 66 0a 20 20 20 20 6b 65  -tmp $off.    ke
31e0: 79 2d 74 61 62 6c 65 20 5b 3a 20 63 65 6c 6c 2b  y-table [: cell+
31f0: 20 24 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e   $@ drop cell+ >
3200: 6f 0a 20 20 20 20 20 20 6b 65 2d 73 6b 20 73 65  o.      ke-sk se
3210: 63 40 20 64 30 3c 3e 20 49 46 20 20 70 61 63 6b  c@ d0<> IF  pack
3220: 2d 73 65 63 6b 65 79 0a 09 20 20 6b 65 79 2d 63  -seckey..  key-c
3230: 72 79 70 74 20 6b 65 2d 6f 66 66 73 65 74 20 36  rypt ke-offset 6
3240: 34 40 20 6b 65 79 3e 73 66 69 6c 65 40 70 6f 73  4@ key>sfile@pos
3250: 0a 20 20 20 20 20 20 54 48 45 4e 20 6f 3e 20 3b  .      THEN o> ;
3260: 5d 20 23 6d 61 70 0a 20 20 20 20 22 7e 2f 2e 6e  ] #map.    "~/.n
3270: 65 74 32 6f 2f 73 65 63 6b 65 79 73 2e 6b 32 6f  et2o/seckeys.k2o
3280: 22 20 3e 62 61 63 6b 75 70 0a 20 20 20 20 6b 65  " >backup.    ke
3290: 79 2d 73 66 64 20 63 6c 6f 73 65 2d 66 69 6c 65  y-sfd close-file
32a0: 20 74 68 72 6f 77 20 30 20 74 6f 20 6b 65 79 2d   throw 0 to key-
32b0: 73 66 64 20 3b 0a 0a 3a 20 73 61 76 65 2d 6b 65  sfd ;..: save-ke
32c0: 79 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 61  ys ( -- ).    sa
32d0: 76 65 2d 70 75 62 6b 65 79 73 20 73 61 76 65 2d  ve-pubkeys save-
32e0: 73 65 63 6b 65 79 73 20 3b 0a 0a 3a 20 2b 67 65  seckeys ;..: +ge
32f0: 6e 2d 6b 65 79 73 20 28 20 6e 69 63 6b 20 75 20  n-keys ( nick u 
3300: 74 79 70 65 20 2d 2d 20 29 20 2d 72 6f 74 0a 20  type -- ) -rot. 
3310: 20 20 20 67 65 6e 2d 6b 65 79 73 20 3e 6b 65 79     gen-keys >key
3320: 73 20 70 61 63 6b 2d 6b 65 79 20 6b 65 79 2d 63  s pack-key key-c
3330: 72 79 70 74 20 6b 65 79 3e 73 66 69 6c 65 20 3b  rypt key>sfile ;
3340: 0a 0a 3a 20 2b 6b 65 79 70 61 69 72 20 28 20 74  ..: +keypair ( t
3350: 79 70 65 20 6e 69 63 6b 20 75 20 2d 2d 20 29 20  ype nick u -- ) 
3360: 2b 70 61 73 73 70 68 72 61 73 65 20 2b 67 65 6e  +passphrase +gen
3370: 2d 6b 65 79 73 20 3b 0a 0a 3a 20 2e 72 76 6b 20  -keys ;..: .rvk 
3380: 2e 22 20 50 6c 65 61 73 65 20 77 72 69 74 65 20  ." Please write 
3390: 64 6f 77 6e 20 72 65 76 6f 6b 65 20 6b 65 79 3a  down revoke key:
33a0: 20 22 20 63 72 0a 20 20 20 20 73 6b 72 65 76 20   " cr.    skrev 
33b0: 24 32 30 20 62 6f 75 6e 64 73 20 44 4f 20 20 2e  $20 bounds DO  .
33c0: 22 20 5c 20 22 20 49 20 34 20 38 35 74 79 70 65  " \ " I 4 85type
33d0: 20 73 70 61 63 65 20 49 20 34 20 2b 20 34 20 38   space I 4 + 4 8
33e0: 35 74 79 70 65 20 63 72 20 38 20 2b 4c 4f 4f 50  5type cr 8 +LOOP
33f0: 20 3b 0a 0a 24 34 30 20 62 75 66 66 65 72 3a 20   ;..$40 buffer: 
3400: 6e 69 63 6b 2d 62 75 66 0a 0a 3a 20 6d 61 6b 65  nick-buf..: make
3410: 2d 6b 65 79 20 28 20 2d 2d 20 29 0a 20 20 20 20  -key ( -- ).    
3420: 6b 65 79 23 75 73 65 72 20 2e 22 20 6e 69 63 6b  key#user ." nick
3430: 3a 20 22 20 6e 69 63 6b 2d 62 75 66 20 24 34 30  : " nick-buf $40
3440: 20 61 63 63 65 70 74 20 6e 69 63 6b 2d 62 75 66   accept nick-buf
3450: 20 73 77 61 70 20 63 72 0a 20 20 20 20 2e 22 20   swap cr.    ." 
3460: 70 61 73 73 70 68 72 61 73 65 3a 20 22 20 2b 70  passphrase: " +p
3470: 61 73 73 70 68 72 61 73 65 20 6b 65 79 3e 64 65  assphrase key>de
3480: 66 61 75 6c 74 0a 20 20 20 20 63 72 20 2b 67 65  fault.    cr +ge
3490: 6e 2d 6b 65 79 73 20 2e 72 76 6b 20 3b 0a 0a 5c  n-keys .rvk ;..\
34a0: 20 72 65 61 64 20 6b 65 79 20 66 69 6c 65 0a 0a   read key file..
34b0: 3a 20 74 72 79 2d 64 65 63 72 79 70 74 2d 6b 65  : try-decrypt-ke
34c0: 79 20 28 20 6b 65 79 20 75 31 20 2d 2d 20 61 64  y ( key u1 -- ad
34d0: 64 72 20 75 32 20 66 6c 61 67 20 29 0a 20 20 20  dr u2 flag ).   
34e0: 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b   keypack keypack
34f0: 2d 64 20 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20  -d keypack-all# 
3500: 6d 6f 76 65 0a 20 20 20 20 6b 65 79 70 61 63 6b  move.    keypack
3510: 2d 64 20 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20  -d keypack-all# 
3520: 32 73 77 61 70 0a 20 20 20 20 64 75 70 20 24 32  2swap.    dup $2
3530: 30 20 3d 20 49 46 20 20 64 65 63 72 79 70 74 24  0 = IF  decrypt$
3540: 20 20 45 4c 53 45 0a 09 6b 65 79 70 61 63 6b 20    ELSE..keypack 
3550: 63 40 20 24 46 20 61 6e 64 20 70 77 2d 6c 65 76  c@ $F and pw-lev
3560: 65 6c 23 20 3c 3d 20 49 46 20 20 64 65 63 72 79  el# <= IF  decry
3570: 70 74 2d 70 77 24 0a 09 45 4c 53 45 20 20 32 64  pt-pw$..ELSE  2d
3580: 72 6f 70 20 66 61 6c 73 65 20 20 54 48 45 4e 0a  rop false  THEN.
3590: 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 74 72      THEN ;..: tr
35a0: 79 2d 64 65 63 72 79 70 74 20 28 20 2d 2d 20 61  y-decrypt ( -- a
35b0: 64 64 72 20 75 20 2f 20 30 20 30 20 29 0a 20 20  ddr u / 0 0 ).  
35c0: 20 20 6b 65 79 73 20 24 5b 5d 23 20 30 20 3f 44    keys $[]# 0 ?D
35d0: 4f 0a 09 49 20 6b 65 79 73 20 73 65 63 5b 5d 40  O..I keys sec[]@
35e0: 20 74 72 79 2d 64 65 63 72 79 70 74 2d 6b 65 79   try-decrypt-key
35f0: 20 49 46 0a 09 20 20 20 20 49 20 6b 65 79 73 20   IF..    I keys 
3600: 24 5b 5d 20 40 20 3e 73 74 6f 72 65 6b 65 79 20  $[] @ >storekey 
3610: 21 20 75 6e 6c 6f 6f 70 20 20 45 58 49 54 20 20  ! unloop  EXIT  
3620: 54 48 45 4e 0a 09 32 64 72 6f 70 0a 20 20 20 20  THEN..2drop.    
3630: 4c 4f 4f 50 20 20 30 20 30 20 3b 0a 0a 3a 20 64  LOOP  0 0 ;..: d
3640: 6f 2d 6b 65 79 20 28 20 61 64 64 72 20 75 20 2f  o-key ( addr u /
3650: 20 30 20 30 20 20 2d 2d 20 29 0a 20 20 20 20 64   0 0  -- ).    d
3660: 75 70 20 30 3d 20 49 46 20 20 32 64 72 6f 70 20  up 0= IF  2drop 
3670: 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20   EXIT  THEN.    
3680: 73 61 6d 70 6c 65 2d 6b 65 79 20 2e 64 6f 2d 63  sample-key .do-c
3690: 6d 64 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20 72 65 61  md-loop ;..: rea
36a0: 64 2d 6b 65 79 73 2d 6c 6f 6f 70 20 28 20 66 64  d-keys-loop ( fd
36b0: 20 2d 2d 20 29 20 20 3e 72 20 30 2e 20 72 40 20   -- )  >r 0. r@ 
36c0: 72 65 70 6f 73 69 74 69 6f 6e 2d 66 69 6c 65 20  reposition-file 
36d0: 74 68 72 6f 77 0a 20 20 20 20 42 45 47 49 4e 0a  throw.    BEGIN.
36e0: 09 72 40 20 66 69 6c 65 2d 70 6f 73 69 74 69 6f  .r@ file-positio
36f0: 6e 20 74 68 72 6f 77 20 64 3e 36 34 20 6b 65 79  n throw d>64 key
3700: 2d 72 65 61 64 2d 6f 66 66 73 65 74 20 36 34 21  -read-offset 64!
3710: 0a 09 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63  ..keypack keypac
3720: 6b 2d 61 6c 6c 23 20 72 40 20 72 65 61 64 2d 66  k-all# r@ read-f
3730: 69 6c 65 20 74 68 72 6f 77 0a 09 6b 65 79 70 61  ile throw..keypa
3740: 63 6b 2d 61 6c 6c 23 20 3d 20 57 48 49 4c 45 20  ck-all# = WHILE 
3750: 20 74 72 79 2d 64 65 63 72 79 70 74 20 64 6f 2d   try-decrypt do-
3760: 6b 65 79 0a 20 20 20 20 52 45 50 45 41 54 20 20  key.    REPEAT  
3770: 72 64 72 6f 70 20 3b 0a 3a 20 72 65 61 64 2d 6b  rdrop ;.: read-k
3780: 65 79 2d 6c 6f 6f 70 20 28 20 2d 2d 20 29 20 3f  ey-loop ( -- ) ?
3790: 6b 65 79 2d 73 66 64 20 72 65 61 64 2d 6b 65 79  key-sfd read-key
37a0: 73 2d 6c 6f 6f 70 20 3b 0a 3a 20 72 65 61 64 2d  s-loop ;.: read-
37b0: 70 6b 65 79 2d 6c 6f 6f 70 20 28 20 2d 2d 20 29  pkey-loop ( -- )
37c0: 20 70 77 2d 6c 65 76 65 6c 23 20 3e 72 20 2d 31   pw-level# >r -1
37d0: 20 74 6f 20 70 77 2d 6c 65 76 65 6c 23 0a 20 20   to pw-level#.  
37e0: 20 20 3f 6b 65 79 2d 70 66 64 20 72 65 61 64 2d    ?key-pfd read-
37f0: 6b 65 79 73 2d 6c 6f 6f 70 20 72 3e 20 74 6f 20  keys-loop r> to 
3800: 70 77 2d 6c 65 76 65 6c 23 20 3b 0a 0a 3a 20 72  pw-level# ;..: r
3810: 65 61 64 2d 6b 65 79 73 20 28 20 2d 2d 20 29 0a  ead-keys ( -- ).
3820: 20 20 20 20 72 65 61 64 2d 6b 65 79 2d 6c 6f 6f      read-key-loo
3830: 70 20 72 65 61 64 2d 70 6b 65 79 2d 6c 6f 6f 70  p read-pkey-loop
3840: 20 3b 0a 0a 5c 20 73 65 6c 65 63 74 20 6b 65 79   ;..\ select key
3850: 20 62 79 20 6e 69 63 6b 0a 0a 3a 20 3e 72 61 77   by nick..: >raw
3860: 2d 6b 65 79 20 28 20 6f 20 2d 2d 20 29 0a 20 20  -key ( o -- ).  
3870: 20 20 64 75 70 20 30 3d 20 21 21 6e 6f 2d 6e 69    dup 0= !!no-ni
3880: 63 6b 21 21 20 3e 6f 0a 20 20 20 20 6b 65 2d 70  ck!! >o.    ke-p
3890: 6b 20 24 40 20 70 6b 63 20 73 77 61 70 20 70 6b  k $@ pkc swap pk
38a0: 72 6b 23 20 75 6d 69 6e 20 6d 6f 76 65 0a 20 20  rk# umin move.  
38b0: 20 20 6b 65 2d 70 73 6b 20 73 65 63 40 20 6d 79    ke-psk sec@ my
38c0: 2d 30 6b 65 79 20 73 65 63 21 0a 20 20 20 20 6b  -0key sec!.    k
38d0: 65 2d 73 6b 20 73 65 63 40 20 73 6b 63 20 73 77  e-sk sec@ skc sw
38e0: 61 70 20 6b 65 79 73 69 7a 65 20 75 6d 69 6e 20  ap keysize umin 
38f0: 6d 6f 76 65 0a 20 20 20 20 3e 73 6b 73 69 67 20  move.    >sksig 
3900: 6f 3e 20 3b 0a 0a 3a 20 3e 6b 65 79 20 28 20 61  o> ;..: >key ( a
3910: 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 6b  ddr u -- ).    k
3920: 65 79 2d 74 61 62 6c 65 20 40 20 30 3d 20 49 46  ey-table @ 0= IF
3930: 20 20 72 65 61 64 2d 6b 65 79 73 20 20 54 48 45    read-keys  THE
3940: 4e 0a 20 20 20 20 6e 69 63 6b 2d 6b 65 79 20 3e  N.    nick-key >
3950: 72 61 77 2d 6b 65 79 20 3b 0a 0a 3a 20 69 27 6d  raw-key ;..: i'm
3960: 20 28 20 22 6e 61 6d 65 22 20 2d 2d 20 29 20 70   ( "name" -- ) p
3970: 61 72 73 65 2d 6e 61 6d 65 20 3e 6b 65 79 20 3b  arse-name >key ;
3980: 0a 3a 20 70 6b 27 20 28 20 22 6e 61 6d 65 22 20  .: pk' ( "name" 
3990: 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20 20 20  -- addr u ).    
39a0: 70 61 72 73 65 2d 6e 61 6d 65 20 6e 69 63 6b 3e  parse-name nick>
39b0: 70 6b 20 3b 0a 0a 3a 20 64 65 73 74 2d 6b 65 79  pk ;..: dest-key
39c0: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 64   ( addr u -- ) d
39d0: 75 70 20 30 3d 20 49 46 20 20 32 64 72 6f 70 20  up 0= IF  2drop 
39e0: 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20   EXIT  THEN.    
39f0: 6e 69 63 6b 2d 6b 65 79 20 3e 6f 20 6f 20 30 3d  nick-key >o o 0=
3a00: 20 21 21 75 6e 6b 6e 6f 77 6e 2d 6b 65 79 21 21   !!unknown-key!!
3a10: 0a 20 20 20 20 6b 65 2d 70 73 6b 20 73 65 63 40  .    ke-psk sec@
3a20: 20 73 74 61 74 65 23 20 75 6d 69 6e 0a 20 20 20   state# umin.   
3a30: 20 6b 65 2d 70 6b 20 24 40 20 6b 65 79 73 69 7a   ke-pk $@ keysiz
3a40: 65 20 75 6d 69 6e 20 6f 3e 0a 20 20 20 20 64 65  e umin o>.    de
3a50: 73 74 2d 70 75 62 6b 65 79 20 24 21 20 20 64 65  st-pubkey $!  de
3a60: 73 74 2d 30 6b 65 79 20 73 65 63 21 20 3b 0a 0a  st-0key sec! ;..
3a70: 3a 20 72 65 70 6c 61 63 65 2d 6b 65 79 20 31 20  : replace-key 1 
3a80: 2f 73 74 72 69 6e 67 20 7b 20 72 65 76 2d 61 64  /string { rev-ad
3a90: 64 72 20 75 20 2d 2d 20 6f 20 7d 20 5c 20 72 65  dr u -- o } \ re
3aa0: 76 6f 63 61 74 69 6f 6e 20 74 69 63 6b 65 74 0a  vocation ticket.
3ab0: 20 20 20 20 6b 65 79 28 20 2e 22 20 52 65 70 6c      key( ." Repl
3ac0: 61 63 65 3a 22 20 63 72 20 6f 20 63 65 6c 6c 2d  ace:" cr o cell-
3ad0: 20 30 20 2e 6b 65 79 20 29 0a 20 20 20 20 73 22   0 .key ).    s"
3ae0: 20 23 72 65 76 6f 6b 65 64 22 20 64 75 70 20 3e   #revoked" dup >
3af0: 72 20 6b 65 2d 6e 69 63 6b 20 24 2b 21 0a 20 20  r ke-nick $+!.  
3b00: 20 20 6b 65 2d 6e 69 63 6b 20 24 40 20 72 3e 20    ke-nick $@ r> 
3b10: 2d 20 6b 65 2d 70 72 6f 66 20 24 40 20 6b 65 2d  - ke-prof $@ ke-
3b20: 70 73 6b 20 73 65 63 40 20 6b 65 2d 73 69 67 73  psk sec@ ke-sigs
3b30: 20 6b 65 2d 74 79 70 65 20 40 0a 20 20 20 20 72   ke-type @.    r
3b40: 65 76 2d 61 64 64 72 20 70 6b 72 6b 23 20 6b 65  ev-addr pkrk# ke
3b50: 79 3f 6e 65 77 20 3e 6f 0a 20 20 20 20 6b 65 2d  y?new >o.    ke-
3b60: 74 79 70 65 20 21 20 5b 3a 20 6b 65 2d 73 69 67  type ! [: ke-sig
3b70: 73 20 24 2b 5b 5d 21 20 3b 5d 20 24 5b 5d 6d 61  s $+[]! ;] $[]ma
3b80: 70 20 6b 65 2d 70 73 6b 20 73 65 63 21 20 6b 65  p ke-psk sec! ke
3b90: 2d 70 72 6f 66 20 24 21 20 6b 65 2d 6e 69 63 6b  -prof $! ke-nick
3ba0: 20 24 21 0a 20 20 20 20 72 65 76 2d 61 64 64 72   $!.    rev-addr
3bb0: 20 70 6b 72 6b 23 20 6b 65 2d 70 6b 20 24 21 0a   pkrk# ke-pk $!.
3bc0: 20 20 20 20 72 65 76 2d 61 64 64 72 20 75 20 2b      rev-addr u +
3bd0: 20 31 2d 20 64 75 70 20 63 40 20 32 2a 20 2d 20   1- dup c@ 2* - 
3be0: 24 31 30 20 2d 20 24 31 30 20 6b 65 2d 73 65 6c  $10 - $10 ke-sel
3bf0: 66 73 69 67 20 24 21 0a 20 20 20 20 6b 65 79 28  fsig $!.    key(
3c00: 20 2e 22 20 77 69 74 68 3a 22 20 63 72 20 6f 20   ." with:" cr o 
3c10: 63 65 6c 6c 2d 20 30 20 2e 6b 65 79 20 29 20 6f  cell- 0 .key ) o
3c20: 20 6f 3e 20 3b 0a 0a 3a 20 72 65 6e 65 77 2d 6b   o> ;..: renew-k
3c30: 65 79 20 28 20 72 65 76 61 64 64 72 20 75 31 20  ey ( revaddr u1 
3c40: 6b 65 79 61 64 64 72 20 75 32 20 2d 2d 20 6f 20  keyaddr u2 -- o 
3c50: 29 0a 20 20 20 20 63 75 72 72 65 6e 74 2d 6b 65  ).    current-ke
3c60: 79 20 3e 6f 20 72 65 70 6c 61 63 65 2d 6b 65 79  y >o replace-key
3c70: 20 6f 3e 0a 20 20 20 20 3e 6f 20 73 6b 63 20 6b   o>.    >o skc k
3c80: 65 79 73 69 7a 65 20 6b 65 2d 73 6b 20 73 65 63  eysize ke-sk sec
3c90: 21 20 6f 20 6f 3e 20 3b 0a 0a 5c 20 72 65 76 6f  ! o o> ;..\ revo
3ca0: 6b 61 74 69 6f 6e 0a 0a 34 20 64 61 74 65 73 69  kation..4 datesi
3cb0: 7a 65 23 20 2b 20 6b 65 79 73 69 7a 65 20 39 20  ze# + keysize 9 
3cc0: 2a 20 2b 20 43 6f 6e 73 74 61 6e 74 20 72 65 76  * + Constant rev
3cd0: 73 69 7a 65 23 0a 0a 56 61 72 69 61 62 6c 65 20  size#..Variable 
3ce0: 72 65 76 74 6f 6b 65 6e 0a 0a 3a 20 30 6f 6c 64  revtoken..: 0old
3cf0: 6b 65 79 20 28 20 2d 2d 20 29 20 5c 20 70 75 62  key ( -- ) \ pub
3d00: 6b 65 79 73 20 63 61 6e 20 73 74 61 79 0a 20 20  keys can stay.  
3d10: 20 20 6f 6c 64 73 6b 63 20 6b 65 79 73 69 7a 65    oldskc keysize
3d20: 20 65 72 61 73 65 20 20 6f 6c 64 73 6b 72 65 76   erase  oldskrev
3d30: 20 6b 65 79 73 69 7a 65 20 65 72 61 73 65 20 3b   keysize erase ;
3d40: 0a 0a 3a 20 6b 65 79 6d 6f 76 65 20 28 20 61 64  ..: keymove ( ad
3d50: 64 72 31 20 61 64 64 72 32 20 2d 2d 20 29 20 20  dr1 addr2 -- )  
3d60: 6b 65 79 73 69 7a 65 20 6d 6f 76 65 20 3b 0a 0a  keysize move ;..
3d70: 3a 20 72 65 76 6f 6b 65 2d 76 65 72 69 66 79 20  : revoke-verify 
3d80: 28 20 61 64 64 72 20 75 31 20 70 6b 20 73 74 72  ( addr u1 pk str
3d90: 69 6e 67 20 75 32 20 2d 2d 20 61 64 64 72 20 75  ing u2 -- addr u
3da0: 20 66 6c 61 67 20 29 20 72 6f 74 20 3e 72 20 32   flag ) rot >r 2
3db0: 3e 72 20 63 3a 30 6b 65 79 0a 20 20 20 20 73 69  >r c:0key.    si
3dc0: 67 6f 6e 6c 79 73 69 7a 65 23 20 2d 20 32 64 75  gonlysize# - 2du
3dd0: 70 20 32 72 3e 20 3e 6b 65 79 65 64 2d 68 61 73  p 2r> >keyed-has
3de0: 68 0a 20 20 20 20 73 69 67 64 61 74 65 20 2b 64  h.    sigdate +d
3df0: 61 74 65 0a 20 20 20 20 32 64 75 70 20 2b 20 72  ate.    2dup + r
3e00: 3e 20 65 64 2d 76 65 72 69 66 79 20 3b 0a 0a 3a  > ed-verify ;..:
3e10: 20 3e 72 65 76 6f 6b 65 20 28 20 73 6b 72 65 76   >revoke ( skrev
3e20: 20 2d 2d 20 29 20 20 73 6b 72 65 76 20 6b 65 79   -- )  skrev key
3e30: 6d 6f 76 65 20 20 63 68 65 63 6b 2d 72 65 76 3f  move  check-rev?
3e40: 20 30 3d 20 21 21 6e 6f 74 2d 6d 79 2d 72 65 76   0= !!not-my-rev
3e50: 73 6b 21 21 20 3b 0a 0a 3a 20 2b 72 65 76 73 69  sk!! ;..: +revsi
3e60: 67 6e 20 28 20 73 6b 20 70 6b 20 2d 2d 20 29 20  gn ( sk pk -- ) 
3e70: 20 73 6b 73 69 67 20 2d 72 6f 74 20 65 64 2d 73   sksig -rot ed-s
3e80: 69 67 6e 20 72 65 76 74 6f 6b 65 6e 20 24 2b 21  ign revtoken $+!
3e90: 20 62 6c 20 72 65 76 74 6f 6b 65 6e 20 63 24 2b   bl revtoken c$+
3ea0: 21 20 3b 0a 0a 3a 20 73 69 67 6e 2d 74 6f 6b 65  ! ;..: sign-toke
3eb0: 6e 2c 20 28 20 73 6b 20 70 6b 20 73 74 72 69 6e  n, ( sk pk strin
3ec0: 67 20 75 32 20 2d 2d 20 29 0a 20 20 20 20 63 3a  g u2 -- ).    c:
3ed0: 30 6b 65 79 20 72 65 76 74 6f 6b 65 6e 20 24 40  0key revtoken $@
3ee0: 20 32 73 77 61 70 20 3e 6b 65 79 65 64 2d 68 61   2swap >keyed-ha
3ef0: 73 68 0a 20 20 20 20 73 69 67 64 61 74 65 20 2b  sh.    sigdate +
3f00: 64 61 74 65 20 2b 72 65 76 73 69 67 6e 20 3b 0a  date +revsign ;.
3f10: 0a 3a 20 72 65 76 6f 6b 65 2d 6b 65 79 20 28 20  .: revoke-key ( 
3f20: 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20 20 20  -- addr u ).    
3f30: 73 6b 63 20 6f 6c 64 73 6b 63 20 6b 65 79 6d 6f  skc oldskc keymo
3f40: 76 65 20 20 70 6b 63 20 6f 6c 64 70 6b 63 20 6b  ve  pkc oldpkc k
3f50: 65 79 6d 6f 76 65 20 20 73 6b 72 65 76 20 6f 6c  eymove  skrev ol
3f60: 64 73 6b 72 65 76 20 6b 65 79 6d 6f 76 65 0a 20  dskrev keymove. 
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 20 20 20 20 20 20 20 5c 20 62 61 63 6b            \ back
3fa0: 75 70 20 6b 65 79 73 0a 20 20 20 20 6f 6c 64 73  up keys.    olds
3fb0: 6b 72 65 76 20 6f 6c 64 70 6b 72 65 76 20 73 6b  krev oldpkrev sk
3fc0: 3e 70 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  >pk             
3fd0: 20 20 20 5c 20 67 65 6e 65 72 61 74 65 20 72 65     \ generate re
3fe0: 76 6f 6b 61 74 69 6f 6e 20 70 75 62 6b 65 79 0a  vokation pubkey.
3ff0: 20 20 20 20 67 65 6e 2d 6b 65 79 73 20 20 20 20      gen-keys    
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 20 20 20 20 20 20 20 5c 20 67 65 6e             \ gen
4020: 65 72 61 74 65 20 6e 65 77 20 6b 65 79 73 0a 20  erate new keys. 
4030: 20 20 20 70 6b 63 20 6b 65 79 73 69 7a 65 20 32     pkc keysize 2
4040: 2a 20 72 65 76 74 6f 6b 65 6e 20 24 21 20 20 20  * revtoken $!   
4050: 20 20 20 20 20 20 20 20 20 20 5c 20 6d 79 20 6e            \ my n
4060: 65 77 20 6b 65 79 0a 20 20 20 20 6f 6c 64 70 6b  ew key.    oldpk
4070: 72 65 76 20 6b 65 79 73 69 7a 65 20 72 65 76 74  rev keysize revt
4080: 6f 6b 65 6e 20 24 2b 21 20 20 20 20 20 20 20 20  oken $+!        
4090: 20 20 5c 20 72 65 76 6f 6b 65 20 74 6f 6b 65 6e    \ revoke token
40a0: 0a 20 20 20 20 6f 6c 64 73 6b 72 65 76 20 6f 6c  .    oldskrev ol
40b0: 64 70 6b 72 65 76 20 22 72 65 76 6f 6b 65 22 20  dpkrev "revoke" 
40c0: 73 69 67 6e 2d 74 6f 6b 65 6e 2c 20 5c 20 72 65  sign-token, \ re
40d0: 76 6f 6b 65 20 73 69 67 6e 61 74 75 72 65 0a 20  voke signature. 
40e0: 20 20 20 73 6b 63 20 70 6b 63 20 22 73 65 6c 66     skc pkc "self
40f0: 73 69 67 6e 22 20 73 69 67 6e 2d 74 6f 6b 65 6e  sign" sign-token
4100: 2c 20 20 20 20 20 20 20 20 20 5c 20 73 65 6c 66  ,         \ self
4110: 20 73 69 67 6e 65 64 20 77 69 74 68 20 6e 65 77   signed with new
4120: 20 6b 65 79 0a 20 20 20 20 22 21 22 20 72 65 76   key.    "!" rev
4130: 74 6f 6b 65 6e 20 30 20 24 69 6e 73 20 20 20 20  token 0 $ins    
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 5c 20 22 21 22 20 2b 20 6f 6c 64 6b 65 79 6c 65  \ "!" + oldkeyle
4160: 6e 2b 6e 65 77 6b 65 79 6c 65 6e 20 74 6f 20 66  n+newkeylen to f
4170: 6c 61 67 20 72 65 76 6f 6b 61 74 69 6f 6e 0a 20  lag revokation. 
4180: 20 20 20 72 65 76 74 6f 6b 65 6e 20 24 40 20 67     revtoken $@ g
4190: 65 6e 3e 68 6f 73 74 20 32 64 72 6f 70 20 20 20  en>host 2drop   
41a0: 20 20 20 20 20 20 20 20 20 20 5c 20 73 69 67 6e            \ sign
41b0: 20 68 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f   host informatio
41c0: 6e 20 77 69 74 68 20 6f 6c 64 20 6b 65 79 0a 20  n with old key. 
41d0: 20 20 20 73 69 67 64 61 74 65 20 2b 64 61 74 65     sigdate +date
41e0: 20 73 69 67 64 61 74 65 20 64 61 74 65 73 69 7a   sigdate datesiz
41f0: 65 23 20 72 65 76 74 6f 6b 65 6e 20 24 2b 21 0a  e# revtoken $+!.
4200: 20 20 20 20 6f 6c 64 73 6b 63 20 6f 6c 64 70 6b      oldskc oldpk
4210: 63 20 2b 72 65 76 73 69 67 6e 0a 20 20 20 20 30  c +revsign.    0
4220: 6f 6c 64 6b 65 79 20 72 65 76 74 6f 6b 65 6e 20  oldkey revtoken 
4230: 24 40 20 3b 0a 0a 30 20 5b 49 46 5d 0a 4c 6f 63  $@ ;..0 [IF].Loc
4240: 61 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a 66 6f  al Variables:.fo
4250: 72 74 68 2d 6c 6f 63 61 6c 2d 77 6f 72 64 73 3a  rth-local-words:
4260: 0a 20 20 20 20 28 0a 20 20 20 20 20 28 28 22 6e  .    (.     (("n
4270: 65 74 32 6f 3a 22 20 22 2b 6e 65 74 32 6f 3a 22  et2o:" "+net2o:"
4280: 29 20 64 65 66 69 6e 69 74 69 6f 6e 2d 73 74 61  ) definition-sta
4290: 72 74 65 72 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d  rter (font-lock-
42a0: 6b 65 79 77 6f 72 64 2d 66 61 63 65 20 2e 20 31  keyword-face . 1
42b0: 29 0a 20 20 20 20 20 20 22 5b 20 5c 74 5c 6e 5d  ).      "[ \t\n]
42c0: 22 20 74 20 6e 61 6d 65 20 28 66 6f 6e 74 2d 6c  " t name (font-l
42d0: 6f 63 6b 2d 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d  ock-function-nam
42e0: 65 2d 66 61 63 65 20 2e 20 33 29 29 0a 20 20 20  e-face . 3)).   
42f0: 20 20 28 28 22 64 65 62 75 67 3a 22 20 22 66 69    (("debug:" "fi
4300: 65 6c 64 3a 22 20 22 32 66 69 65 6c 64 3a 22 20  eld:" "2field:" 
4310: 22 73 66 66 69 65 6c 64 3a 22 20 22 64 66 66 69  "sffield:" "dffi
4320: 65 6c 64 3a 22 20 22 36 34 66 69 65 6c 64 3a 22  eld:" "64field:"
4330: 20 22 75 76 61 72 22 20 22 75 76 61 6c 75 65 22   "uvar" "uvalue"
4340: 29 20 6e 6f 6e 2d 69 6d 6d 65 64 69 61 74 65 20  ) non-immediate 
4350: 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 74 79 70 65 2d  (font-lock-type-
4360: 66 61 63 65 20 2e 20 32 29 0a 20 20 20 20 20 20  face . 2).      
4370: 22 5b 20 5c 74 5c 6e 5d 22 20 74 20 6e 61 6d 65  "[ \t\n]" t name
4380: 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 76 61 72 69   (font-lock-vari
4390: 61 62 6c 65 2d 6e 61 6d 65 2d 66 61 63 65 20 2e  able-name-face .
43a0: 20 33 29 29 0a 20 20 20 20 20 28 22 5b 61 2d 7a   3)).     ("[a-z
43b0: 30 2d 39 5d 2b 28 22 20 69 6d 6d 65 64 69 61 74  0-9]+(" immediat
43c0: 65 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f 6d  e (font-lock-com
43d0: 6d 65 6e 74 2d 66 61 63 65 20 2e 20 31 29 0a 20  ment-face . 1). 
43e0: 20 20 20 20 20 22 29 22 20 6e 69 6c 20 63 6f 6d       ")" nil com
43f0: 6d 65 6e 74 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d  ment (font-lock-
4400: 63 6f 6d 6d 65 6e 74 2d 66 61 63 65 20 2e 20 31  comment-face . 1
4410: 29 29 0a 20 20 20 20 29 0a 66 6f 72 74 68 2d 6c  )).    ).forth-l
4420: 6f 63 61 6c 2d 69 6e 64 65 6e 74 2d 77 6f 72 64  ocal-indent-word
4430: 73 3a 0a 20 20 20 20 28 0a 20 20 20 20 20 28 28  s:.    (.     ((
4440: 22 6e 65 74 32 6f 3a 22 20 22 2b 6e 65 74 32 6f  "net2o:" "+net2o
4450: 3a 22 29 20 28 30 20 2e 20 32 29 20 28 30 20 2e  :") (0 . 2) (0 .
4460: 20 32 29 20 6e 6f 6e 2d 69 6d 6d 65 64 69 61 74   2) non-immediat
4470: 65 29 0a 20 20 20 20 20 28 28 22 5b 3a 22 20 22  e).     (("[:" "
4480: 6b 65 79 3a 63 6f 64 65 22 29 20 28 30 20 2e 20  key:code") (0 . 
4490: 31 29 20 28 30 20 2e 20 31 29 20 69 6d 6d 65 64  1) (0 . 1) immed
44a0: 69 61 74 65 29 0a 20 20 20 20 20 28 28 22 3b 5d  iate).     ((";]
44b0: 22 20 22 65 6e 64 3a 6b 65 79 22 29 20 28 2d 31  " "end:key") (-1
44c0: 20 2e 20 30 29 20 28 30 20 2e 20 2d 31 29 20 69   . 0) (0 . -1) i
44d0: 6d 6d 65 64 69 61 74 65 29 0a 20 20 20 20 29 0a  mmediate).    ).
44e0: 45 6e 64 3a 0a 5b 54 48 45 4e 5d                 End:.[THEN]