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