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 33 2d 32 30 31 35 20 20 (C) 2013-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 73 63 6f 70 word entry..scop
0300: 65 7b 20 63 6f 6e 66 69 67 0a 56 61 72 69 61 62 e{ config.Variab
0310: 6c 65 20 70 77 2d 6c 65 76 65 6c 23 20 32 20 70 le pw-level# 2 p
0320: 77 2d 6c 65 76 65 6c 23 20 21 20 5c 20 70 77 2d w-level# ! \ pw-
0330: 6c 65 76 65 6c 23 20 30 20 69 73 20 6c 6f 77 65 level# 0 is lowe
0340: 73 74 0a 56 61 72 69 61 62 6c 65 20 70 77 2d 6d st.Variable pw-m
0350: 61 78 6c 65 76 65 6c 23 20 34 20 70 77 2d 6d 61 axlevel# 4 pw-ma
0360: 78 6c 65 76 65 6c 23 20 21 20 5c 20 70 77 2d 6d xlevel# ! \ pw-m
0370: 61 78 6c 65 76 65 6c 23 20 69 73 20 74 68 65 20 axlevel# is the
0380: 6d 61 78 69 6d 75 6d 20 63 68 65 63 6b 65 64 0a maximum checked.
0390: 7d 73 63 6f 70 65 0a 0a 5b 49 46 44 45 46 5d 20 }scope..[IFDEF]
03a0: 61 6e 64 72 6f 69 64 78 78 78 20 27 2a 27 20 5b androidxxx '*' [
03b0: 45 4c 53 45 5d 20 27 e2 80 a2 27 20 5b 54 48 45 ELSE] '•' [THE
03c0: 4e 5d 20 43 6f 6e 73 74 61 6e 74 20 70 77 2a 0a N] Constant pw*.
03d0: 0a 78 63 2d 76 65 63 74 6f 72 20 75 70 40 20 2d .xc-vector up@ -
03e0: 20 63 6c 61 73 73 2d 6f 20 21 0a 0a 30 20 63 65 class-o !..0 ce
03f0: 6c 6c 20 75 76 61 72 20 65 73 63 2d 73 74 61 74 ll uvar esc-stat
0400: 65 20 64 72 6f 70 0a 0a 44 65 66 65 72 20 6f 6c e drop..Defer ol
0410: 64 2d 65 6d 69 74 20 20 77 68 61 74 27 73 20 65 d-emit what's e
0420: 6d 69 74 20 69 73 20 6f 6c 64 2d 65 6d 69 74 0a mit is old-emit.
0430: 0a 68 65 72 65 0a 78 63 2d 76 65 63 74 6f 72 20 .here.xc-vector
0440: 40 20 63 65 6c 6c 2d 20 64 75 70 20 40 20 74 75 @ cell- dup @ tu
0450: 63 6b 20 2d 20 68 65 72 65 20 73 77 61 70 20 64 ck - here swap d
0460: 75 70 20 61 6c 6c 6f 74 20 6d 6f 76 65 0a 2c 20 up allot move.,
0470: 68 65 72 65 20 30 20 2c 20 43 6f 6e 73 74 61 6e here 0 , Constan
0480: 74 20 75 74 66 2d 38 2a 0a 0a 78 63 2d 76 65 63 t utf-8*..xc-vec
0490: 74 6f 72 20 40 20 20 75 74 66 2d 38 2a 20 78 63 tor @ utf-8* xc
04a0: 2d 76 65 63 74 6f 72 20 21 20 27 20 2a 2d 77 69 -vector ! ' *-wi
04b0: 64 74 68 20 69 73 20 78 2d 77 69 64 74 68 20 20 dth is x-width
04c0: 78 63 2d 76 65 63 74 6f 72 20 21 0a 0a 3a 20 65 xc-vector !..: e
04d0: 6d 69 74 2d 70 77 2a 20 28 20 6e 20 2d 2d 20 29 mit-pw* ( n -- )
04e0: 0a 20 20 20 20 64 75 70 20 23 65 73 63 20 3d 20 . dup #esc =
04f0: 49 46 20 20 65 73 63 2d 73 74 61 74 65 20 6f 6e IF esc-state on
0500: 20 20 54 48 45 4e 0a 20 20 20 20 64 75 70 20 62 THEN. dup b
0510: 6c 20 3c 20 49 46 20 20 6f 6c 64 2d 65 6d 69 74 l < IF old-emit
0520: 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 EXIT THEN.
0530: 20 65 73 63 2d 73 74 61 74 65 20 40 20 49 46 20 esc-state @ IF
0540: 20 64 75 70 20 6f 6c 64 2d 65 6d 69 74 0a 20 20 dup old-emit.
0550: 20 20 45 4c 53 45 20 20 64 75 70 20 24 43 30 20 ELSE dup $C0
0560: 24 38 30 20 77 69 74 68 69 6e 20 49 46 0a 09 20 $80 within IF..
0570: 20 20 20 5b 20 70 77 2a 20 27 20 78 65 6d 69 74 [ pw* ' xemit
0580: 20 24 74 6d 70 0a 09 20 20 20 20 62 6f 75 6e 64 $tmp.. bound
0590: 73 20 5b 3f 44 4f 5d 20 5b 49 5d 20 63 40 20 5d s [?DO] [I] c@ ]
05a0: 4c 20 6f 6c 64 2d 65 6d 69 74 20 5b 20 5b 4c 4f L old-emit [ [LO
05b0: 4f 50 5d 20 5d 0a 09 54 48 45 4e 0a 20 20 20 20 OP] ]..THEN.
05c0: 54 48 45 4e 0a 20 20 20 20 74 6f 75 70 70 65 72 THEN. toupper
05d0: 20 27 41 27 20 27 5b 27 20 77 69 74 68 69 6e 20 'A' '[' within
05e0: 49 46 20 20 65 73 63 2d 73 74 61 74 65 20 6f 66 IF esc-state of
05f0: 66 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 74 79 70 f THEN ;..: typ
0600: 65 2d 70 77 2a 20 28 20 61 64 64 72 20 75 20 2d e-pw* ( addr u -
0610: 2d 20 29 20 20 32 64 75 70 20 62 6c 20 73 6b 69 - ) 2dup bl ski
0620: 70 20 6e 69 70 20 30 3d 0a 20 20 20 20 49 46 20 p nip 0=. IF
0630: 20 20 20 62 6f 75 6e 64 73 20 55 2b 44 4f 20 20 bounds U+DO
0640: 62 6c 20 6f 6c 64 2d 65 6d 69 74 20 20 20 20 4c bl old-emit L
0650: 4f 4f 50 0a 20 20 20 20 45 4c 53 45 20 20 62 6f OOP. ELSE bo
0660: 75 6e 64 73 20 55 2b 44 4f 20 20 49 20 63 40 20 unds U+DO I c@
0670: 65 6d 69 74 2d 70 77 2a 20 20 4c 4f 4f 50 20 20 emit-pw* LOOP
0680: 54 48 45 4e 20 3b 0a 0a 3a 20 61 63 63 65 70 74 THEN ;..: accept
0690: 2a 20 28 20 61 64 64 72 20 75 20 2d 2d 20 75 27 * ( addr u -- u'
06a0: 20 29 0a 20 20 20 20 5c 47 20 61 63 63 65 70 74 ). \G accept
06b0: 2d 6c 69 6b 65 20 69 6e 70 75 74 2c 20 62 75 74 -like input, but
06c0: 20 74 79 70 65 73 20 2a 20 69 6e 73 74 65 61 64 types * instead
06d0: 20 6f 66 20 74 68 65 20 63 68 61 72 61 63 74 65 of the characte
06e0: 72 0a 20 20 20 20 5c 47 20 64 6f 6e 27 74 20 73 r. \G don't s
06f0: 61 76 65 20 69 6e 74 6f 20 68 69 73 74 6f 72 79 ave into history
0700: 0a 20 20 20 20 68 69 73 74 6f 72 79 20 3e 72 20 . history >r
0710: 20 77 68 61 74 27 73 20 74 79 70 65 20 3e 72 20 what's type >r
0720: 20 77 68 61 74 27 73 20 65 6d 69 74 20 69 73 20 what's emit is
0730: 6f 6c 64 2d 65 6d 69 74 0a 20 20 20 20 75 74 66 old-emit. utf
0740: 2d 38 2a 20 78 63 2d 76 65 63 74 6f 72 20 21 40 -8* xc-vector !@
0750: 20 3e 72 20 20 5b 27 5d 20 74 79 70 65 2d 70 77 >r ['] type-pw
0760: 2a 20 69 73 20 74 79 70 65 20 20 5b 27 5d 20 65 * is type ['] e
0770: 6d 69 74 2d 70 77 2a 20 69 73 20 65 6d 69 74 0a mit-pw* is emit.
0780: 20 20 20 20 30 20 74 6f 20 68 69 73 74 6f 72 79 0 to history
0790: 0a 20 20 20 20 5b 27 5d 20 61 63 63 65 70 74 20 . ['] accept
07a0: 63 61 74 63 68 0a 20 20 20 20 72 3e 20 78 63 2d catch. r> xc-
07b0: 76 65 63 74 6f 72 20 21 20 20 77 68 61 74 27 73 vector ! what's
07c0: 20 6f 6c 64 2d 65 6d 69 74 20 69 73 20 65 6d 69 old-emit is emi
07d0: 74 20 20 72 3e 20 69 73 20 74 79 70 65 20 20 72 t r> is type r
07e0: 3e 20 74 6f 20 68 69 73 74 6f 72 79 0a 20 20 20 > to history.
07f0: 20 74 68 72 6f 77 20 2d 31 20 30 20 61 74 2d 64 throw -1 0 at-d
0800: 65 6c 74 61 78 79 20 73 70 61 63 65 20 3b 0a 0a eltaxy space ;..
0810: 5c 20 4b 65 79 73 20 61 72 65 20 70 61 73 73 77 \ Keys are passw
0820: 6f 72 64 73 20 61 6e 64 20 70 72 69 76 61 74 65 ords and private
0830: 20 6b 65 79 73 20 28 73 65 6c 66 2d 6b 65 79 65 keys (self-keye
0840: 64 2c 20 69 2e 65 2e 20 70 72 69 76 61 74 65 2a d, i.e. private*
0850: 70 75 62 6c 69 63 20 6b 65 79 29 0a 0a 63 6d 64 public key)..cmd
0860: 2d 62 75 66 30 20 75 63 6c 61 73 73 20 63 6d 64 -buf0 uclass cmd
0870: 62 75 66 2d 6f 0a 20 20 20 20 6d 61 78 64 61 74 buf-o. maxdat
0880: 61 20 2d 0a 20 20 20 20 6b 65 79 2d 73 61 6c 74 a -. key-salt
0890: 23 20 75 76 61 72 20 6b 65 79 70 61 63 6b 0a 20 # uvar keypack.
08a0: 20 20 20 6b 65 79 70 61 63 6b 23 20 20 75 76 61 keypack# uva
08b0: 72 20 6b 65 79 70 61 63 6b 2d 62 75 66 0a 20 20 r keypack-buf.
08c0: 20 20 6b 65 79 2d 63 6b 73 75 6d 23 20 75 76 61 key-cksum# uva
08d0: 72 20 6b 65 79 70 61 63 6b 2d 63 68 6b 73 75 6d r keypack-chksum
08e0: 0a 65 6e 64 2d 63 6c 61 73 73 20 63 6d 64 2d 6b .end-class cmd-k
08f0: 65 79 62 75 66 2d 63 0a 0a 63 6d 64 2d 6b 65 79 eybuf-c..cmd-key
0900: 62 75 66 2d 63 20 27 20 6e 65 77 20 73 74 61 74 buf-c ' new stat
0910: 69 63 2d 61 20 77 69 74 68 2d 61 6c 6c 6f 63 61 ic-a with-alloca
0920: 74 65 72 20 63 6f 64 65 2d 6b 65 79 5e 20 21 0a ter code-key^ !.
0930: 27 20 63 6f 64 65 2d 6b 65 79 5e 20 63 6d 64 62 ' code-key^ cmdb
0940: 75 66 3a 20 63 6f 64 65 2d 6b 65 79 0a 0a 63 6f uf: code-key..co
0950: 64 65 2d 6b 65 79 0a 63 6d 64 30 6c 6f 63 6b 20 de-key.cmd0lock
0960: 30 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 0 pthread_mutex_
0970: 69 6e 69 74 20 64 72 6f 70 0a 0a 3a 6e 6f 6e 61 init drop..:nona
0980: 6d 65 20 28 20 2d 2d 20 61 64 64 72 20 75 20 29 me ( -- addr u )
0990: 20 6b 65 79 70 61 63 6b 2d 62 75 66 20 63 6d 64 keypack-buf cmd
09a0: 62 75 66 23 20 40 20 3b 20 74 6f 20 63 6d 64 62 buf# @ ; to cmdb
09b0: 75 66 24 0a 3a 6e 6f 6e 61 6d 65 20 28 20 2d 2d uf$.:noname ( --
09c0: 20 6e 20 29 20 20 6b 65 79 70 61 63 6b 23 20 63 n ) keypack# c
09d0: 6d 64 62 75 66 23 20 40 20 2d 20 3b 20 74 6f 20 mdbuf# @ - ; to
09e0: 6d 61 78 73 74 72 69 6e 67 0a 0a 63 6f 64 65 30 maxstring..code0
09f0: 2d 62 75 66 0a 0a 3a 6e 6f 6e 61 6d 65 20 64 65 -buf..:noname de
0a00: 66 65 72 73 20 61 6c 6c 6f 63 2d 63 6f 64 65 2d fers alloc-code-
0a10: 62 75 66 73 0a 20 20 20 20 63 6d 64 2d 6b 65 79 bufs. cmd-key
0a20: 62 75 66 2d 63 20 6e 65 77 20 63 6f 64 65 2d 6b buf-c new code-k
0a30: 65 79 5e 20 21 20 3b 20 69 73 20 61 6c 6c 6f 63 ey^ ! ; is alloc
0a40: 2d 63 6f 64 65 2d 62 75 66 73 0a 3a 6e 6f 6e 61 -code-bufs.:nona
0a50: 6d 65 20 64 65 66 65 72 73 20 66 72 65 65 2d 63 me defers free-c
0a60: 6f 64 65 2d 62 75 66 73 0a 20 20 20 20 63 6f 64 ode-bufs. cod
0a70: 65 2d 6b 65 79 5e 20 40 20 2e 64 69 73 70 6f 73 e-key^ @ .dispos
0a80: 65 20 3b 20 69 73 20 66 72 65 65 2d 63 6f 64 65 e ; is free-code
0a90: 2d 62 75 66 73 0a 0a 5c 20 68 61 73 68 65 64 20 -bufs..\ hashed
0aa0: 6b 65 79 20 64 61 74 61 20 62 61 73 65 0a 0a 56 key data base..V
0ab0: 61 72 69 61 62 6c 65 20 67 72 6f 75 70 73 5b 5d ariable groups[]
0ac0: 20 5c 20 6e 61 6d 65 73 20 6f 66 20 67 72 6f 75 \ names of grou
0ad0: 70 73 2c 20 73 6f 72 74 65 64 20 62 79 20 6f 72 ps, sorted by or
0ae0: 64 65 72 20 69 6e 20 67 72 6f 75 70 73 20 66 69 der in groups fi
0af0: 6c 65 0a 0a 55 73 65 72 20 3e 73 74 6f 72 65 6b le..User >storek
0b00: 65 79 0a 56 61 72 69 61 62 6c 65 20 64 65 66 61 ey.Variable defa
0b10: 75 6c 74 6b 65 79 0a 0a 63 6d 64 2d 63 6c 61 73 ultkey..cmd-clas
0b20: 73 20 63 6c 61 73 73 0a 20 20 20 20 66 69 65 6c s class. fiel
0b30: 64 3a 20 6b 65 2d 73 6b 20 20 20 20 20 20 20 5c d: ke-sk \
0b40: 20 73 65 63 72 65 74 20 6b 65 79 0a 20 20 20 20 secret key.
0b50: 66 69 65 6c 64 3a 20 6b 65 2d 70 6b 20 20 20 20 field: ke-pk
0b60: 20 20 20 5c 20 70 75 62 6c 69 63 20 6b 65 79 0a \ public key.
0b70: 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 72 73 field: ke-rs
0b80: 6b 20 20 20 20 20 20 5c 20 72 65 76 6f 6b 65 20 k \ revoke
0b90: 73 65 63 72 65 74 20 28 74 65 6d 70 6f 72 61 72 secret (temporar
0ba0: 69 6c 79 20 73 74 6f 72 65 64 29 0a 20 20 20 20 ily stored).
0bb0: 66 69 65 6c 64 3a 20 6b 65 2d 74 79 70 65 20 20 field: ke-type
0bc0: 20 20 20 5c 20 6b 65 79 20 74 79 70 65 0a 20 20 \ key type.
0bd0: 20 20 66 69 65 6c 64 3a 20 6b 65 2d 6e 69 63 6b field: ke-nick
0be0: 20 20 20 20 20 5c 20 6b 65 79 20 6e 69 63 6b 0a \ key nick.
0bf0: 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 6e 69 field: ke-ni
0c00: 63 6b 23 20 20 20 20 5c 20 74 6f 20 61 76 6f 69 ck# \ to avoi
0c10: 64 20 63 6f 6c 69 73 73 69 6f 6e 73 2c 20 61 64 d colissions, ad
0c20: 64 20 61 20 6e 75 6d 62 65 72 20 68 65 72 65 0a d a number here.
0c30: 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 70 65 field: ke-pe
0c40: 74 73 20 20 20 20 20 5c 20 6b 65 79 20 70 65 74 ts \ key pet
0c50: 6e 61 6d 65 73 0a 20 20 20 20 66 69 65 6c 64 3a names. field:
0c60: 20 6b 65 2d 70 65 74 73 23 20 20 20 20 5c 20 74 ke-pets# \ t
0c70: 6f 20 61 76 6f 69 64 20 63 6f 6c 69 73 73 69 6f o avoid colissio
0c80: 6e 73 2c 20 61 64 64 20 61 20 6e 75 6d 62 65 72 ns, add a number
0c90: 20 68 65 72 65 0a 20 20 20 20 66 69 65 6c 64 3a here. field:
0ca0: 20 6b 65 2d 70 72 6f 66 20 20 20 20 20 5c 20 70 ke-prof \ p
0cb0: 72 6f 66 69 6c 65 20 6f 62 6a 65 63 74 0a 20 20 rofile object.
0cc0: 20 20 66 69 65 6c 64 3a 20 6b 65 2d 73 65 6c 66 field: ke-self
0cd0: 73 69 67 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b sig. field: k
0ce0: 65 2d 73 69 67 73 0a 20 20 20 20 66 69 65 6c 64 e-sigs. field
0cf0: 3a 20 6b 65 2d 69 6d 70 6f 72 74 73 20 20 5c 20 : ke-imports \
0d00: 62 69 74 6d 61 73 6b 20 6f 66 20 6b 65 79 20 69 bitmask of key i
0d10: 6d 70 6f 72 74 0a 20 20 20 20 66 69 65 6c 64 3a mport. field:
0d20: 20 6b 65 2d 73 74 6f 72 65 6b 65 79 20 5c 20 75 ke-storekey \ u
0d30: 73 65 64 20 74 6f 20 65 6e 63 72 79 70 74 20 6f sed to encrypt o
0d40: 6e 20 73 74 6f 72 61 67 65 0a 20 20 20 20 66 69 n storage. fi
0d50: 65 6c 64 3a 20 6b 65 2d 6d 61 73 6b 20 20 20 20 eld: ke-mask
0d60: 20 5c 20 70 65 72 6d 69 73 73 69 6f 6e 20 6d 61 \ permission ma
0d70: 73 6b 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 sk. field: ke
0d80: 2d 67 72 6f 75 70 73 20 20 20 5c 20 70 72 65 6d -groups \ prem
0d90: 69 73 73 69 6f 6e 20 67 72 6f 75 70 73 0a 20 20 ission groups.
0da0: 20 20 36 34 66 69 65 6c 64 3a 20 6b 65 2d 6f 66 64field: ke-of
0db0: 66 73 65 74 20 5c 20 6f 66 66 73 65 74 20 69 6e fset \ offset in
0dc0: 20 6b 65 79 20 66 69 6c 65 0a 20 20 20 20 66 69 key file. fi
0dd0: 65 6c 64 3a 20 6b 65 2d 70 77 6c 65 76 65 6c 20 eld: ke-pwlevel
0de0: 20 5c 20 70 61 73 73 77 6f 72 64 20 73 74 72 65 \ password stre
0df0: 6e 67 74 68 20 6c 65 76 65 6c 0a 20 20 20 20 30 ngth level. 0
0e00: 20 2b 66 69 65 6c 64 20 6b 65 2d 65 6e 64 0a 65 +field ke-end.e
0e10: 6e 64 2d 63 6c 61 73 73 20 6b 65 79 2d 65 6e 74 nd-class key-ent
0e20: 72 79 0a 0a 3a 20 66 72 65 65 2d 6b 65 79 20 28 ry..: free-key (
0e30: 20 6f 3a 6b 65 79 20 2d 2d 20 6f 3a 6b 65 79 20 o:key -- o:key
0e40: 29 0a 20 20 20 20 5c 67 20 66 72 65 65 20 61 6c ). \g free al
0e50: 6c 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 l parts of the s
0e60: 75 62 6b 65 79 0a 20 20 20 20 6b 65 2d 73 6b 20 ubkey. ke-sk
0e70: 73 65 63 2d 6f 66 66 0a 20 20 20 20 6b 65 2d 70 sec-off. ke-p
0e80: 6b 20 24 6f 66 66 0a 20 20 20 20 6b 65 2d 6e 69 k $off. ke-ni
0e90: 63 6b 20 24 6f 66 66 0a 20 20 20 20 6b 65 2d 73 ck $off. ke-s
0ea0: 65 6c 66 73 69 67 20 24 6f 66 66 0a 20 20 20 20 elfsig $off.
0eb0: 6b 65 2d 73 69 67 73 20 24 5b 5d 6f 66 66 0a 20 ke-sigs $[]off.
0ec0: 20 20 20 6b 65 2d 70 65 74 73 20 24 5b 5d 6f 66 ke-pets $[]of
0ed0: 66 0a 20 20 20 20 6b 65 2d 70 65 74 73 23 20 24 f. ke-pets# $
0ee0: 6f 66 66 20 3b 0a 0a 5c 20 6b 65 79 20 63 6c 61 off ;..\ key cla
0ef0: 73 73 0a 0a 30 0a 65 6e 75 6d 20 6b 65 79 23 61 ss..0.enum key#a
0f00: 6e 6f 6e 0a 65 6e 75 6d 20 6b 65 79 23 75 73 65 non.enum key#use
0f10: 72 0a 65 6e 75 6d 20 6b 65 79 23 67 72 6f 75 70 r.enum key#group
0f20: 0a 64 72 6f 70 0a 0a 5c 20 6b 65 79 20 69 6d 70 .drop..\ key imp
0f30: 6f 72 74 20 74 79 70 65 0a 0a 30 0a 65 6e 75 6d ort type..0.enum
0f40: 20 69 6d 70 6f 72 74 23 73 65 6c 66 20 20 20 20 import#self
0f50: 20 20 5c 20 70 72 69 76 61 74 65 20 6b 65 79 0a \ private key.
0f60: 65 6e 75 6d 20 69 6d 70 6f 72 74 23 6d 61 6e 75 enum import#manu
0f70: 61 6c 20 20 20 20 5c 20 6d 61 6e 75 61 6c 20 69 al \ manual i
0f80: 6d 70 6f 72 74 0a 65 6e 75 6d 20 69 6d 70 6f 72 mport.enum impor
0f90: 74 23 73 63 61 6e 20 20 20 20 20 20 5c 20 73 63 t#scan \ sc
0fa0: 61 6e 20 69 6d 70 6f 72 74 0a 65 6e 75 6d 20 69 an import.enum i
0fb0: 6d 70 6f 72 74 23 63 68 61 74 20 20 20 20 20 20 mport#chat
0fc0: 5c 20 73 65 65 6e 20 69 6e 20 63 68 61 74 0a 65 \ seen in chat.e
0fd0: 6e 75 6d 20 69 6d 70 6f 72 74 23 64 68 74 20 20 num import#dht
0fe0: 20 20 20 20 20 5c 20 64 68 74 20 69 6d 70 6f 72 \ dht impor
0ff0: 74 0a 65 6e 75 6d 20 69 6d 70 6f 72 74 23 69 6e t.enum import#in
1000: 76 69 74 65 64 20 20 20 5c 20 69 6e 76 69 74 61 vited \ invita
1010: 74 69 6f 6e 20 69 6d 70 6f 72 74 0a 65 6e 75 6d tion import.enum
1020: 20 69 6d 70 6f 72 74 23 75 6e 74 72 75 73 74 65 import#untruste
1030: 64 20 5c 20 6d 75 73 74 20 62 65 20 6c 61 73 74 d \ must be last
1040: 0a 64 72 6f 70 0a 24 31 46 20 65 6e 75 6d 20 69 .drop.$1F enum i
1050: 6d 70 6f 72 74 23 6e 65 77 20 20 20 5c 20 6e 65 mport#new \ ne
1060: 77 20 66 6f 72 6d 61 74 0a 64 72 6f 70 0a 0a 43 w format.drop..C
1070: 72 65 61 74 65 20 69 6d 70 6f 72 74 73 24 20 24 reate imports$ $
1080: 32 30 20 61 6c 6c 6f 74 20 69 6d 70 6f 72 74 73 20 allot imports
1090: 24 20 24 32 30 20 62 6c 20 66 69 6c 6c 0a 22 49 $ $20 bl fill."I
10a0: 6d 73 63 64 69 75 22 20 69 6d 70 6f 72 74 73 24 mscdiu" imports$
10b0: 20 73 77 61 70 20 6d 6f 76 65 0a 0a 56 61 72 69 swap move..Vari
10c0: 61 62 6c 65 20 69 6d 70 6f 72 74 2d 74 79 70 65 able import-type
10d0: 20 20 69 6d 70 6f 72 74 23 6e 65 77 20 69 6d 70 import#new imp
10e0: 6f 72 74 2d 74 79 70 65 20 21 0a 0a 43 72 65 61 ort-type !..Crea
10f0: 74 65 20 3e 69 6d 2d 63 6f 6c 6f 72 20 20 24 42 te >im-color $B
1100: 36 30 20 2c 20 24 44 36 30 20 2c 20 24 39 36 30 60 , $D60 , $960
1110: 20 2c 20 24 43 36 30 20 2c 20 24 41 36 30 20 2c , $C60 , $A60 ,
1120: 20 24 38 42 31 20 2c 20 24 45 36 30 20 2c 0a 44 $8B1 , $E60 ,.D
1130: 4f 45 53 3e 20 73 77 61 70 20 38 20 63 65 6c 6c OES> swap 8 cell
1140: 73 20 30 20 44 4f 20 20 64 75 70 20 31 20 61 6e s 0 DO dup 1 an
1150: 64 20 49 46 20 20 64 72 6f 70 20 49 20 4c 45 41 d IF drop I LEA
1160: 56 45 20 20 54 48 45 4e 20 20 32 2f 20 20 4c 4f VE THEN 2/ LO
1170: 4f 50 0a 20 20 63 65 6c 6c 73 20 2b 20 40 20 61 OP. cells + @ a
1180: 74 74 72 21 20 3b 0a 0a 3a 20 2e 69 6d 70 6f 72 ttr! ;..: .impor
1190: 74 73 20 28 20 6d 61 73 6b 20 2d 2d 20 29 0a 20 ts ( mask -- ).
11a0: 20 20 20 69 6d 70 6f 72 74 73 24 20 69 6d 70 6f imports$ impo
11b0: 72 74 23 6e 65 77 20 62 6f 75 6e 64 73 20 44 4f rt#new bounds DO
11c0: 0a 09 64 75 70 20 31 20 61 6e 64 20 49 46 20 20 ..dup 1 and IF
11d0: 49 20 63 40 20 65 6d 69 74 20 20 54 48 45 4e 20 I c@ emit THEN
11e0: 20 32 2f 20 4c 4f 4f 50 0a 20 20 20 20 64 72 6f 2/ LOOP. dro
11f0: 70 20 3b 0a 0a 5c 20 73 61 6d 70 6c 65 20 6b 65 p ;..\ sample ke
1200: 79 0a 0a 6b 65 79 2d 65 6e 74 72 79 20 27 20 6e y..key-entry ' n
1210: 65 77 20 73 74 61 74 69 63 2d 61 20 77 69 74 68 ew static-a with
1220: 2d 61 6c 6c 6f 63 61 74 65 72 20 43 6f 6e 73 74 -allocater Const
1230: 61 6e 74 20 73 61 6d 70 6c 65 2d 6b 65 79 0a 0a ant sample-key..
1240: 56 61 72 69 61 62 6c 65 20 6b 65 79 23 20 5c 20 Variable key# \
1250: 6b 65 79 20 68 61 73 68 20 74 61 62 6c 65 0a 56 key hash table.V
1260: 61 72 69 61 62 6c 65 20 6e 69 63 6b 23 20 5c 20 ariable nick# \
1270: 6e 69 63 6b 20 68 61 73 68 20 74 61 62 6c 65 0a nick hash table.
1280: 0a 36 34 56 61 72 69 61 62 6c 65 20 6b 65 79 2d .64Variable key-
1290: 72 65 61 64 2d 6f 66 66 73 65 74 0a 0a 3a 20 63 read-offset..: c
12a0: 75 72 72 65 6e 74 2d 6b 65 79 20 28 20 61 64 64 urrent-key ( add
12b0: 72 20 75 20 2d 2d 20 6f 20 29 0a 20 20 20 20 32 r u -- o ). 2
12c0: 64 75 70 20 6b 65 79 7c 20 6b 65 79 23 20 23 40 dup key| key# #@
12d0: 20 64 72 6f 70 0a 20 20 20 20 64 75 70 20 30 3d drop. dup 0=
12e0: 20 49 46 20 20 64 72 6f 70 20 2e 22 20 75 6e 6b IF drop ." unk
12f0: 6e 6f 77 6e 20 6b 65 79 3a 20 22 20 38 35 74 79 nown key: " 85ty
1300: 70 65 20 63 72 20 20 30 20 45 58 49 54 20 20 54 pe cr 0 EXIT T
1310: 48 45 4e 0a 20 20 20 20 63 65 6c 6c 2b 20 3e 6f HEN. cell+ >o
1320: 20 6b 65 2d 70 6b 20 24 21 20 6f 20 6f 3e 20 3b ke-pk $! o o> ;
1330: 0a 0a 56 61 72 69 61 62 6c 65 20 73 69 6d 2d 6e ..Variable sim-n
1340: 69 63 6b 21 0a 0a 3a 20 6e 69 63 6b 21 20 28 20 ick!..: nick! (
1350: 2d 2d 20 29 20 73 69 6d 2d 6e 69 63 6b 21 20 40 -- ) sim-nick! @
1360: 20 3f 45 58 49 54 20 20 6f 20 7b 20 77 5e 20 6f ?EXIT o { w^ o
1370: 70 74 72 20 7d 0a 20 20 20 20 6b 65 2d 6e 69 63 ptr }. ke-nic
1380: 6b 20 24 40 20 6e 69 63 6b 23 20 23 40 20 64 30 k $@ nick# #@ d0
1390: 3d 20 49 46 0a 09 6f 70 74 72 20 63 65 6c 6c 20 = IF..optr cell
13a0: 6b 65 2d 6e 69 63 6b 20 24 40 20 6e 69 63 6b 23 ke-nick $@ nick#
13b0: 20 23 21 20 30 0a 20 20 20 20 45 4c 53 45 0a 09 #! 0. ELSE..
13c0: 6c 61 73 74 23 20 63 65 6c 6c 2b 20 24 40 6c 65 last# cell+ $@le
13d0: 6e 20 63 65 6c 6c 2f 0a 09 6f 70 74 72 20 63 65 n cell/..optr ce
13e0: 6c 6c 20 6c 61 73 74 23 20 63 65 6c 6c 2b 20 24 ll last# cell+ $
13f0: 2b 21 0a 20 20 20 20 54 48 45 4e 20 20 6b 65 2d +!. THEN ke-
1400: 6e 69 63 6b 23 20 21 20 3b 0a 0a 3a 20 23 2e 6e nick# ! ;..: #.n
1410: 69 63 6b 20 28 20 68 61 73 68 20 2d 2d 20 29 0a ick ( hash -- ).
1420: 20 20 20 20 64 75 70 20 24 40 20 74 79 70 65 20 dup $@ type
1430: 27 23 27 20 65 6d 69 74 20 63 65 6c 6c 2b 20 24 '#' emit cell+ $
1440: 40 6c 65 6e 20 63 65 6c 6c 2f 20 2e 20 3b 0a 0a @len cell/ . ;..
1450: 3a 20 6c 61 73 74 2d 70 65 74 40 20 28 20 2d 2d : last-pet@ ( --
1460: 20 61 64 64 72 20 75 20 29 0a 20 20 20 20 6b 65 addr u ). ke
1470: 2d 70 65 74 73 20 24 5b 5d 23 20 3f 64 75 70 2d -pets $[]# ?dup-
1480: 49 46 20 20 31 2d 20 6b 65 2d 70 65 74 73 20 24 IF 1- ke-pets $
1490: 5b 5d 40 20 20 45 4c 53 45 20 20 23 30 2e 20 20 []@ ELSE #0.
14a0: 54 48 45 4e 20 3b 0a 0a 3a 20 70 65 74 21 20 28 THEN ;..: pet! (
14b0: 20 2d 2d 20 29 20 73 69 6d 2d 6e 69 63 6b 21 20 -- ) sim-nick!
14c0: 40 20 3f 45 58 49 54 20 20 6f 20 7b 20 77 5e 20 @ ?EXIT o { w^
14d0: 6f 70 74 72 20 7d 0a 20 20 20 20 6c 61 73 74 2d optr }. last-
14e0: 70 65 74 40 20 6e 69 63 6b 23 20 23 40 20 64 30 pet@ nick# #@ d0
14f0: 3d 20 49 46 0a 09 6f 70 74 72 20 63 65 6c 6c 20 = IF..optr cell
1500: 6c 61 73 74 2d 70 65 74 40 20 6e 69 63 6b 23 20 last-pet@ nick#
1510: 23 21 20 30 0a 20 20 20 20 45 4c 53 45 0a 09 6c #! 0. ELSE..l
1520: 61 73 74 23 20 63 65 6c 6c 2b 20 24 40 6c 65 6e ast# cell+ $@len
1530: 20 63 65 6c 6c 2f 0a 09 6f 70 74 72 20 63 65 6c cell/..optr cel
1540: 6c 20 6c 61 73 74 23 20 63 65 6c 6c 2b 20 24 2b l last# cell+ $+
1550: 21 0a 20 20 20 20 54 48 45 4e 20 20 6b 65 2d 70 !. THEN ke-p
1560: 65 74 73 20 24 5b 5d 23 20 31 2d 20 6b 65 2d 70 ets $[]# 1- ke-p
1570: 65 74 73 23 20 24 5b 5d 20 21 20 3b 0a 0a 3a 20 ets# $[] ! ;..:
1580: 6b 65 79 3a 6e 65 77 20 28 20 61 64 64 72 20 75 key:new ( addr u
1590: 20 2d 2d 20 6f 20 29 0a 20 20 20 20 5c 47 20 63 -- o ). \G c
15a0: 72 65 61 74 65 20 6e 65 77 20 6b 65 79 2c 20 61 reate new key, a
15b0: 64 64 72 20 75 20 69 73 20 74 68 65 20 70 75 62 ddr u is the pub
15c0: 6c 69 63 20 6b 65 79 0a 20 20 20 20 73 61 6d 70 lic key. samp
15d0: 6c 65 2d 6b 65 79 20 3e 6f 20 20 6b 65 2d 73 6b le-key >o ke-sk
15e0: 20 6b 65 2d 65 6e 64 20 6f 76 65 72 20 2d 20 65 ke-end over - e
15f0: 72 61 73 65 0a 20 20 20 20 6b 65 79 2d 65 6e 74 rase. key-ent
1600: 72 79 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e ry-table @ token
1610: 2d 74 61 62 6c 65 20 21 0a 20 20 20 20 3e 73 74 -table !. >st
1620: 6f 72 65 6b 65 79 20 40 20 6b 65 2d 73 74 6f 72 orekey @ ke-stor
1630: 65 6b 65 79 20 21 0a 20 20 20 20 6b 65 79 2d 72 ekey !. key-r
1640: 65 61 64 2d 6f 66 66 73 65 74 20 36 34 40 20 6b ead-offset 64@ k
1650: 65 2d 6f 66 66 73 65 74 20 36 34 21 0a 20 20 20 e-offset 64!.
1660: 20 31 20 69 6d 70 6f 72 74 2d 74 79 70 65 20 40 1 import-type @
1670: 20 6c 73 68 69 66 74 20 5b 20 31 20 69 6d 70 6f lshift [ 1 impo
1680: 72 74 23 6e 65 77 20 6c 73 68 69 66 74 20 5d 4c rt#new lshift ]L
1690: 20 6f 72 20 6b 65 2d 69 6d 70 6f 72 74 73 20 21 or ke-imports !
16a0: 0a 20 20 20 20 6b 65 79 70 61 63 6b 2d 61 6c 6c . keypack-all
16b0: 23 20 6e 3e 36 34 20 6b 65 79 2d 72 65 61 64 2d # n>64 key-read-
16c0: 6f 66 66 73 65 74 20 36 34 2b 21 20 6f 20 63 65 offset 64+! o ce
16d0: 6c 6c 2d 20 6b 65 2d 65 6e 64 20 6f 76 65 72 20 ll- ke-end over
16e0: 2d 0a 20 20 20 20 32 6f 76 65 72 20 6b 65 79 7c -. 2over key|
16f0: 20 6b 65 79 23 20 23 21 20 6f 3e 0a 20 20 20 20 key# #! o>.
1700: 63 75 72 72 65 6e 74 2d 6b 65 79 20 3b 0a 0a 30 current-key ;..0
1710: 20 56 61 6c 75 65 20 6c 61 73 74 2d 6b 65 79 0a Value last-key.
1720: 0a 3a 20 6b 65 79 3f 6e 65 77 20 28 20 61 64 64 .: key?new ( add
1730: 72 20 75 20 2d 2d 20 6f 20 29 0a 20 20 20 20 5c r u -- o ). \
1740: 47 20 43 72 65 61 74 65 20 6f 72 20 6c 6f 6f 6b G Create or look
1750: 75 70 20 6e 65 77 20 6b 65 79 0a 20 20 20 20 32 up new key. 2
1760: 64 75 70 20 6b 65 79 7c 20 6b 65 79 23 20 23 40 dup key| key# #@
1770: 20 64 72 6f 70 0a 20 20 20 20 64 75 70 20 30 3d drop. dup 0=
1780: 20 49 46 20 20 64 72 6f 70 20 6b 65 79 3a 6e 65 IF drop key:ne
1790: 77 0a 20 20 20 20 45 4c 53 45 20 20 6e 69 70 20 w. ELSE nip
17a0: 6e 69 70 20 63 65 6c 6c 2b 20 20 31 20 69 6d 70 nip cell+ 1 imp
17b0: 6f 72 74 2d 74 79 70 65 20 40 20 6c 73 68 69 66 ort-type @ lshif
17c0: 74 20 6f 76 65 72 20 2e 6b 65 2d 69 6d 70 6f 72 t over .ke-impor
17d0: 74 73 20 6f 72 21 20 20 54 48 45 4e 0a 20 20 20 ts or! THEN.
17e0: 20 64 75 70 20 74 6f 20 6c 61 73 74 2d 6b 65 79 dup to last-key
17f0: 20 3b 0a 0a 5c 20 73 65 61 72 63 68 20 66 6f 72 ;..\ search for
1800: 20 6b 65 79 73 20 2d 20 6e 6f 74 20 6f 70 74 69 keys - not opti
1810: 6d 69 7a 65 64 0a 0a 3a 20 23 73 70 6c 69 74 20 mized..: #split
1820: 28 20 61 64 64 72 20 75 20 2d 2d 20 61 64 64 72 ( addr u -- addr
1830: 20 75 20 6e 20 29 0a 20 20 20 20 5b 3a 20 32 64 u n ). [: 2d
1840: 75 70 20 27 23 27 20 2d 73 63 61 6e 20 6e 69 70 up '#' -scan nip
1850: 20 3e 72 0a 20 20 20 20 20 20 72 40 20 30 3d 20 >r. r@ 0=
1860: 49 46 20 20 72 64 72 6f 70 20 30 20 20 45 58 49 IF rdrop 0 EXI
1870: 54 20 20 54 48 45 4e 0a 20 20 20 20 20 20 23 30 T THEN. #0
1880: 2e 20 32 6f 76 65 72 20 72 40 20 2f 73 74 72 69 . 2over r@ /stri
1890: 6e 67 20 3e 6e 75 6d 62 65 72 0a 20 20 20 20 20 ng >number.
18a0: 20 30 3d 20 49 46 20 20 6e 69 70 20 64 72 6f 70 0= IF nip drop
18b0: 20 6e 69 70 20 72 3e 20 31 2d 20 73 77 61 70 20 nip r> 1- swap
18c0: 20 45 4c 53 45 0a 09 20 20 72 64 72 6f 70 20 64 ELSE.. rdrop d
18d0: 72 6f 70 20 32 64 72 6f 70 20 30 20 20 20 54 48 rop 2drop 0 TH
18e0: 45 4e 20 3b 5d 20 23 31 30 20 62 61 73 65 2d 65 EN ;] #10 base-e
18f0: 78 65 63 75 74 65 20 3b 0a 0a 3a 20 6e 69 63 6b xecute ;..: nick
1900: 2d 6b 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d -key ( addr u --
1910: 20 6f 20 2f 20 30 20 29 20 5c 20 73 65 61 72 63 o / 0 ) \ searc
1920: 68 20 66 6f 72 20 6b 65 79 20 6e 69 63 6b 6e 61 h for key nickna
1930: 6d 65 0a 20 20 20 20 23 73 70 6c 69 74 20 3e 72 me. #split >r
1940: 20 6e 69 63 6b 23 20 23 40 20 32 64 75 70 20 64 nick# #@ 2dup d
1950: 30 3d 20 49 46 20 20 72 64 72 6f 70 20 64 72 6f 0= IF rdrop dro
1960: 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 p EXIT THEN.
1970: 20 20 72 3e 20 63 65 6c 6c 73 20 73 61 66 65 2f r> cells safe/
1980: 73 74 72 69 6e 67 20 30 3d 20 49 46 20 20 64 72 string 0= IF dr
1990: 6f 70 20 30 20 20 45 58 49 54 20 20 54 48 45 4e op 0 EXIT THEN
19a0: 20 20 40 20 3b 0a 0a 3a 20 73 65 63 72 65 74 2d @ ;..: secret-
19b0: 6b 65 79 73 23 20 28 20 2d 2d 20 6e 20 29 0a 20 keys# ( -- n ).
19c0: 20 20 20 30 20 6b 65 79 23 20 5b 3a 20 63 65 6c 0 key# [: cel
19d0: 6c 2b 20 24 40 20 64 72 6f 70 20 63 65 6c 6c 2b l+ $@ drop cell+
19e0: 20 3e 6f 20 6b 65 2d 73 6b 20 40 20 30 3c 3e 20 >o ke-sk @ 0<>
19f0: 2d 20 6f 3e 20 3b 5d 20 23 6d 61 70 20 3b 0a 3a - o> ;] #map ;.:
1a00: 20 73 65 63 72 65 74 2d 6b 65 79 20 28 20 6e 20 secret-key ( n
1a10: 2d 2d 20 6f 2f 30 20 29 0a 20 20 20 20 30 20 74 -- o/0 ). 0 t
1a20: 75 63 6b 20 6b 65 79 23 20 5b 3a 20 63 65 6c 6c uck key# [: cell
1a30: 2b 20 24 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 + $@ drop cell+
1a40: 3e 6f 20 6b 65 2d 73 6b 20 40 20 49 46 0a 09 20 >o ke-sk @ IF..
1a50: 20 32 64 75 70 20 3d 20 49 46 20 20 72 6f 74 20 2dup = IF rot
1a60: 64 72 6f 70 20 6f 20 2d 72 6f 74 20 20 54 48 45 drop o -rot THE
1a70: 4e 20 20 31 2b 0a 20 20 20 20 20 20 54 48 45 4e N 1+. THEN
1a80: 20 20 6f 3e 20 3b 5d 20 23 6d 61 70 20 32 64 72 o> ;] #map 2dr
1a90: 6f 70 20 3b 0a 3a 20 2e 23 20 28 20 6e 20 2d 2d op ;.: .# ( n --
1aa0: 20 29 20 3f 64 75 70 2d 49 46 20 20 27 23 27 20 ) ?dup-IF '#'
1ab0: 65 6d 69 74 20 30 20 2e 72 20 20 54 48 45 4e 20 emit 0 .r THEN
1ac0: 3b 0a 3a 20 2e 6e 69 63 6b 2d 62 61 73 65 20 28 ;.: .nick-base (
1ad0: 20 6f 3a 6b 65 79 20 2d 2d 20 29 0a 20 20 20 20 o:key -- ).
1ae0: 6b 65 2d 6e 69 63 6b 20 24 2e 20 20 6b 65 2d 6e ke-nick $. ke-n
1af0: 69 63 6b 23 20 40 20 2e 23 20 3b 0a 3a 20 2e 70 ick# @ .# ;.: .p
1b00: 65 74 2d 62 61 73 65 20 28 20 6f 3a 6b 65 79 20 et-base ( o:key
1b10: 2d 2d 20 29 0a 20 20 20 20 30 20 6b 65 2d 70 65 -- ). 0 ke-pe
1b20: 74 73 20 5b 3a 20 73 70 61 63 65 20 74 79 70 65 ts [: space type
1b30: 0a 20 20 20 20 20 20 64 75 70 20 6b 65 2d 70 65 . dup ke-pe
1b40: 74 73 23 20 24 5b 5d 20 40 20 2e 23 20 20 31 2b ts# $[] @ .# 1+
1b50: 20 3b 5d 20 24 5b 5d 6d 61 70 20 64 72 6f 70 20 ;] $[]map drop
1b60: 3b 0a 3a 20 2e 70 65 74 30 2d 62 61 73 65 20 28 ;.: .pet0-base (
1b70: 20 6f 3a 6b 65 79 20 2d 2d 20 29 0a 20 20 20 20 o:key -- ).
1b80: 6b 65 2d 70 65 74 73 20 24 5b 5d 23 20 49 46 20 ke-pets $[]# IF
1b90: 20 30 20 6b 65 2d 70 65 74 73 20 24 5b 5d 40 20 0 ke-pets $[]@
1ba0: 74 79 70 65 20 30 20 6b 65 2d 70 65 74 73 23 20 type 0 ke-pets#
1bb0: 24 5b 5d 20 40 20 2e 23 0a 20 20 20 20 45 4c 53 $[] @ .#. ELS
1bc0: 45 20 20 2e 6e 69 63 6b 2d 62 61 73 65 20 20 54 E .nick-base T
1bd0: 48 45 4e 20 3b 0a 3a 20 2e 72 65 61 6c 2d 6e 69 HEN ;.: .real-ni
1be0: 63 6b 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 29 20 ck ( o:key -- )
1bf0: 20 20 6b 65 2d 69 6d 70 6f 72 74 73 20 40 20 3e ke-imports @ >
1c00: 69 6d 2d 63 6f 6c 6f 72 20 2e 6e 69 63 6b 2d 62 im-color .nick-b
1c10: 61 73 65 20 3c 64 65 66 61 75 6c 74 3e 20 3b 0a ase <default> ;.
1c20: 3a 20 2e 6e 69 63 6b 20 28 20 6f 3a 6b 65 79 20 : .nick ( o:key
1c30: 2d 2d 20 29 20 20 20 6b 65 2d 69 6d 70 6f 72 74 -- ) ke-import
1c40: 73 20 40 20 3e 69 6d 2d 63 6f 6c 6f 72 20 2e 70 s @ >im-color .p
1c50: 65 74 30 2d 62 61 73 65 20 3c 64 65 66 61 75 6c et0-base <defaul
1c60: 74 3e 20 3b 0a 3a 20 2e 6e 69 63 6b 2b 70 65 74 t> ;.: .nick+pet
1c70: 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 29 0a 20 20 ( o:key -- ).
1c80: 20 20 6b 65 2d 69 6d 70 6f 72 74 73 20 40 20 3e ke-imports @ >
1c90: 69 6d 2d 63 6f 6c 6f 72 20 2e 6e 69 63 6b 2d 62 im-color .nick-b
1ca0: 61 73 65 20 2e 70 65 74 2d 62 61 73 65 20 3c 64 ase .pet-base <d
1cb0: 65 66 61 75 6c 74 3e 20 3b 0a 0a 3a 20 6e 69 63 efault> ;..: nic
1cc0: 6b 3e 70 6b 20 28 20 6e 69 63 6b 20 75 20 2d 2d k>pk ( nick u --
1cd0: 20 70 6b 20 75 20 29 0a 20 20 20 20 6e 69 63 6b pk u ). nick
1ce0: 2d 6b 65 79 20 3f 64 75 70 2d 49 46 20 2e 6b 65 -key ?dup-IF .ke
1cf0: 2d 70 6b 20 24 40 20 45 4c 53 45 20 30 20 30 20 -pk $@ ELSE 0 0
1d00: 54 48 45 4e 20 3b 0a 3a 20 68 6f 73 74 2e 6e 69 THEN ;.: host.ni
1d10: 63 6b 3e 70 6b 20 28 20 61 64 64 72 20 75 20 2d ck>pk ( addr u -
1d20: 2d 20 70 6b 20 75 27 20 29 0a 20 20 20 20 27 2e - pk u' ). '.
1d30: 27 20 24 73 70 6c 69 74 20 64 75 70 20 30 3d 20 ' $split dup 0=
1d40: 49 46 20 20 32 73 77 61 70 20 20 54 48 45 4e 20 IF 2swap THEN
1d50: 5b 3a 20 6e 69 63 6b 3e 70 6b 20 74 79 70 65 20 [: nick>pk type
1d60: 74 79 70 65 20 3b 5d 20 24 74 6d 70 20 3b 0a 0a type ;] $tmp ;..
1d70: 3a 20 6b 65 79 2d 65 78 69 73 74 3f 20 28 20 61 : key-exist? ( a
1d80: 64 64 72 20 75 20 2d 2d 20 6f 2f 30 20 29 0a 20 ddr u -- o/0 ).
1d90: 20 20 20 6b 65 79 23 20 23 40 20 49 46 20 20 63 key# #@ IF c
1da0: 65 6c 6c 2b 20 20 54 48 45 4e 20 3b 20 0a 0a 5c ell+ THEN ; ..\
1db0: 20 70 65 72 6d 69 73 73 69 6f 6e 20 6d 6f 64 69 permission modi
1dc0: 66 69 63 61 74 69 6f 6e 0a 0a 32 36 20 62 75 66 fication..26 buf
1dd0: 66 65 72 3a 20 70 65 72 6d 2d 63 68 61 72 73 0a fer: perm-chars.
1de0: 30 20 70 65 72 6d 24 20 63 6f 75 6e 74 20 62 6f 0 perm$ count bo
1df0: 75 6e 64 73 20 5b 44 4f 5d 20 64 75 70 20 5b 49 unds [DO] dup [I
1e00: 5d 20 63 40 20 27 61 27 20 2d 20 70 65 72 6d 2d ] c@ 'a' - perm-
1e10: 63 68 61 72 73 20 2b 20 63 21 20 31 2b 20 5b 4c chars + c! 1+ [L
1e20: 4f 4f 50 5d 20 64 72 6f 70 0a 0a 3a 20 2e 70 65 OOP] drop..: .pe
1e30: 72 6d 20 28 20 70 65 72 6d 69 73 73 69 6f 6e 20 rm ( permission
1e40: 2d 2d 20 29 20 20 31 20 70 65 72 6d 24 20 63 6f -- ) 1 perm$ co
1e50: 75 6e 74 20 62 6f 75 6e 64 73 20 44 4f 0a 09 32 unt bounds DO..2
1e60: 64 75 70 20 61 6e 64 20 30 3c 3e 20 49 20 63 40 dup and 0<> I c@
1e70: 20 27 2d 27 20 72 6f 74 20 73 65 6c 65 63 74 20 '-' rot select
1e80: 65 6d 69 74 20 32 2a 0a 20 20 20 20 4c 4f 4f 50 emit 2*. LOOP
1e90: 20 20 32 64 72 6f 70 20 3b 0a 3a 20 70 65 72 6d 2drop ;.: perm
1ea0: 61 6e 64 20 28 20 70 65 72 6d 61 6e 64 20 70 65 and ( permand pe
1eb0: 72 6d 6f 72 20 6e 65 77 20 2d 2d 20 70 65 72 6d rmor new -- perm
1ec0: 61 6e 64 27 20 70 65 72 6d 6f 72 20 29 0a 20 20 and' permor ).
1ed0: 20 20 69 6e 76 65 72 74 20 74 75 63 6b 20 61 6e invert tuck an
1ee0: 64 20 3e 72 20 61 6e 64 20 72 3e 20 3b 0a 3a 20 d >r and r> ;.:
1ef0: 3e 70 65 72 6d 2d 6d 6f 64 20 28 20 70 65 72 6d >perm-mod ( perm
1f00: 61 6e 64 20 70 65 72 6d 6f 72 20 2d 2d 20 70 65 and permor -- pe
1f10: 72 6d 61 6e 64 27 20 70 65 72 6d 6f 72 20 29 0a rmand' permor ).
1f20: 20 20 20 20 73 77 61 70 20 64 75 70 20 30 3d 20 swap dup 0=
1f30: 49 46 20 20 64 72 6f 70 20 64 75 70 20 69 6e 76 IF drop dup inv
1f40: 65 72 74 20 20 54 48 45 4e 20 73 77 61 70 20 3b ert THEN swap ;
1f50: 0a 3a 20 3e 70 65 72 6d 20 28 20 61 64 64 72 20 .: >perm ( addr
1f60: 75 20 2d 2d 20 70 65 72 6d 61 6e 64 20 70 65 72 u -- permand per
1f70: 6d 6f 72 20 29 0a 20 20 20 20 5c 47 20 70 61 72 mor ). \G par
1f80: 73 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 3a 20 se permissions:
1f90: 2b 20 61 64 64 73 2c 20 2d 20 72 65 6d 6f 76 65 + adds, - remove
1fa0: 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 0a 20 s permissions,.
1fb0: 20 20 20 5c 47 20 6e 6f 20 6d 6f 64 69 66 69 65 \G no modifie
1fc0: 72 20 73 65 74 73 20 70 65 72 6d 69 73 73 6f 6e r sets permisson
1fd0: 73 2e 0a 20 20 20 20 30 20 30 20 5b 27 5d 20 6f s.. 0 0 ['] o
1fe0: 72 20 7b 20 78 74 20 7d 0a 20 20 20 20 32 73 77 r { xt }. 2sw
1ff0: 61 70 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 09 49 ap bounds ?DO..I
2000: 20 63 40 20 63 61 73 65 0a 09 20 20 20 20 27 2b c@ case.. '+
2010: 27 20 6f 66 20 20 3e 70 65 72 6d 2d 6d 6f 64 20 ' of >perm-mod
2020: 5b 27 5d 20 6f 72 20 74 6f 20 78 74 20 65 6e 64 ['] or to xt end
2030: 6f 66 0a 09 20 20 20 20 27 2d 27 20 6f 66 20 20 of.. '-' of
2040: 3e 70 65 72 6d 2d 6d 6f 64 20 5b 27 5d 20 70 65 >perm-mod ['] pe
2050: 72 6d 61 6e 64 20 74 6f 20 78 74 20 20 65 6e 64 rmand to xt end
2060: 6f 66 0a 09 20 20 20 20 27 3d 27 20 6f 66 20 20 of.. '=' of
2070: 32 64 72 6f 70 20 70 65 72 6d 25 64 65 66 61 75 2drop perm%defau
2080: 6c 74 20 64 75 70 20 5b 27 5d 20 6f 72 20 74 6f lt dup ['] or to
2090: 20 78 74 20 20 65 6e 64 6f 66 0a 09 20 20 20 20 xt endof..
20a0: 27 61 27 20 2d 20 64 75 70 20 27 7a 27 20 75 3c 'a' - dup 'z' u<
20b0: 3d 20 20 49 46 0a 09 09 70 65 72 6d 2d 63 68 61 = IF...perm-cha
20c0: 72 73 20 2b 20 63 40 20 31 20 73 77 61 70 20 6c rs + c@ 1 swap l
20d0: 73 68 69 66 74 20 78 74 20 65 78 65 63 75 74 65 shift xt execute
20e0: 0a 09 09 30 20 28 20 64 75 6d 6d 79 20 66 6f 72 ...0 ( dummy for
20f0: 20 65 6e 64 63 61 73 65 20 29 0a 09 20 20 20 20 endcase )..
2100: 54 48 45 4e 20 20 65 6e 64 63 61 73 65 0a 20 20 THEN endcase.
2110: 20 20 4c 4f 4f 50 20 3b 0a 3a 20 2e 70 65 72 6d LOOP ;.: .perm
2120: 61 6e 64 6f 72 20 28 20 70 65 72 6d 61 6e 64 20 andor ( permand
2130: 70 65 72 6d 6f 72 20 2d 2d 20 29 0a 20 20 20 20 permor -- ).
2140: 30 20 7b 20 2b 2d 20 7d 0a 20 20 20 20 31 20 70 0 { +- }. 1 p
2150: 65 72 6d 24 20 63 6f 75 6e 74 20 62 6f 75 6e 64 erm$ count bound
2160: 73 20 44 4f 20 20 3e 72 0a 09 6f 76 65 72 20 72 s DO >r..over r
2170: 40 20 61 6e 64 20 30 3d 20 49 46 20 20 27 2d 27 @ and 0= IF '-'
2180: 20 64 75 70 20 2b 2d 20 3c 3e 20 49 46 20 20 64 dup +- <> IF d
2190: 75 70 20 74 6f 20 2b 2d 20 65 6d 69 74 0a 09 20 up to +- emit..
21a0: 20 20 20 45 4c 53 45 20 20 64 72 6f 70 20 20 54 ELSE drop T
21b0: 48 45 4e 20 72 3e 20 20 49 20 63 40 20 65 6d 69 HEN r> I c@ emi
21c0: 74 20 20 3e 72 20 54 48 45 4e 0a 09 64 75 70 20 t >r THEN..dup
21d0: 20 72 40 20 61 6e 64 20 20 20 20 49 46 20 20 27 r@ and IF '
21e0: 2b 27 20 64 75 70 20 2b 2d 20 3c 3e 20 49 46 20 +' dup +- <> IF
21f0: 20 64 75 70 20 74 6f 20 2b 2d 20 65 6d 69 74 0a dup to +- emit.
2200: 09 20 20 20 20 45 4c 53 45 20 20 64 72 6f 70 20 . ELSE drop
2210: 20 54 48 45 4e 20 72 3e 20 20 49 20 63 40 20 65 THEN r> I c@ e
2220: 6d 69 74 20 20 3e 72 20 54 48 45 4e 0a 09 72 3e mit >r THEN..r>
2230: 20 32 2a 0a 20 20 20 20 4c 4f 4f 50 20 20 64 72 2*. LOOP dr
2240: 6f 70 20 32 64 72 6f 70 20 3b 0a 0a 5c 20 72 65 op 2drop ;..\ re
2250: 61 64 20 69 6e 20 70 65 72 6d 69 73 73 69 6f 6e ad in permission
2260: 20 67 72 6f 75 70 73 2c 20 67 72 6f 75 70 73 20 groups, groups
2270: 69 73 20 69 6e 20 74 68 65 20 2e 6e 65 74 32 6f is in the .net2o
2280: 20 64 69 72 65 63 74 6f 72 79 0a 0a 3a 20 3e 67 directory..: >g
2290: 72 6f 75 70 73 20 28 20 61 64 64 72 20 75 20 70 roups ( addr u p
22a0: 61 6e 64 20 70 6f 72 20 2d 2d 20 29 0a 20 20 20 and por -- ).
22b0: 20 73 22 20 22 20 67 72 6f 75 70 73 5b 5d 20 24 s" " groups[] $
22c0: 2b 5b 5d 21 0a 20 20 20 20 5b 3a 20 7b 20 64 5e +[]!. [: { d^
22d0: 20 70 61 6e 64 6f 72 20 7d 20 70 61 6e 64 6f 72 pandor } pandor
22e0: 20 32 20 63 65 6c 6c 73 20 74 79 70 65 20 20 74 2 cells type t
22f0: 79 70 65 20 3b 5d 0a 20 20 20 20 67 72 6f 75 70 ype ;]. group
2300: 73 5b 5d 20 64 75 70 20 24 5b 5d 23 20 31 2d 20 s[] dup $[]# 1-
2310: 73 77 61 70 20 24 5b 5d 20 24 65 78 65 63 20 3b swap $[] $exec ;
2320: 0a 0a 3a 20 69 6e 69 74 2d 67 72 6f 75 70 73 20 ..: init-groups
2330: 28 20 2d 2d 20 29 0a 20 20 20 20 22 6d 79 73 65 ( -- ). "myse
2340: 6c 66 22 20 20 70 65 72 6d 25 6d 79 73 65 6c 66 lf" perm%myself
2350: 20 20 64 75 70 20 3e 67 72 6f 75 70 73 0a 20 20 dup >groups.
2360: 20 20 22 70 65 65 72 22 20 20 20 20 70 65 72 6d "peer" perm
2370: 25 64 65 66 61 75 6c 74 20 64 75 70 20 3e 67 72 %default dup >gr
2380: 6f 75 70 73 0a 20 20 20 20 22 75 6e 6b 6e 6f 77 oups. "unknow
2390: 6e 22 20 70 65 72 6d 25 75 6e 6b 6e 6f 77 6e 20 n" perm%unknown
23a0: 64 75 70 20 3e 67 72 6f 75 70 73 0a 20 20 20 20 dup >groups.
23b0: 22 62 6c 6f 63 6b 65 64 22 20 70 65 72 6d 25 62 "blocked" perm%b
23c0: 6c 6f 63 6b 65 64 20 70 65 72 6d 25 69 6e 64 69 locked perm%indi
23d0: 72 65 63 74 20 6f 72 20 64 75 70 20 3e 67 72 6f rect or dup >gro
23e0: 75 70 73 20 3b 0a 0a 69 6e 69 74 2d 67 72 6f 75 ups ;..init-grou
23f0: 70 73 0a 0a 3a 20 2e 67 72 6f 75 70 73 20 28 20 ps..: .groups (
2400: 2d 2d 20 29 0a 20 20 20 20 67 72 6f 75 70 73 5b -- ). groups[
2410: 5d 20 5b 3a 20 32 64 75 70 20 32 20 63 65 6c 6c ] [: 2dup 2 cell
2420: 73 20 2f 73 74 72 69 6e 67 20 74 79 70 65 20 73 s /string type s
2430: 70 61 63 65 0a 20 20 20 20 20 20 64 72 6f 70 20 pace. drop
2440: 32 40 20 2e 70 65 72 6d 61 6e 64 6f 72 20 63 72 2@ .permandor cr
2450: 20 3b 5d 20 24 5b 5d 6d 61 70 20 3b 0a 0a 3a 20 ;] $[]map ;..:
2460: 2e 69 6e 2d 67 72 6f 75 70 73 20 28 20 61 64 64 .in-groups ( add
2470: 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 62 6f 75 r u -- ). bou
2480: 6e 64 73 20 3f 44 4f 0a 09 49 20 70 40 2b 20 49 nds ?DO..I p@+ I
2490: 20 2d 20 3e 72 20 36 34 3e 6e 20 67 72 6f 75 70 - >r 64>n group
24a0: 73 5b 5d 20 24 5b 5d 40 20 32 20 63 65 6c 6c 73 s[] $[]@ 2 cells
24b0: 20 2f 73 74 72 69 6e 67 20 73 70 61 63 65 20 74 /string space t
24c0: 79 70 65 0a 20 20 20 20 72 3e 20 2b 4c 4f 4f 50 ype. r> +LOOP
24d0: 20 3b 0a 0a 3a 20 77 72 69 74 65 2d 67 72 6f 75 ;..: write-grou
24e0: 70 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 22 67 ps ( -- ). "g
24f0: 72 6f 75 70 73 22 20 2e 6e 65 74 32 6f 2f 20 77 roups" .net2o/ w
2500: 2f 6f 20 63 72 65 61 74 65 2d 66 69 6c 65 20 74 /o create-file t
2510: 68 72 6f 77 20 3e 72 0a 20 20 20 20 5b 27 5d 20 hrow >r. [']
2520: 2e 67 72 6f 75 70 73 20 72 40 20 6f 75 74 66 69 .groups r@ outfi
2530: 6c 65 2d 65 78 65 63 75 74 65 0a 20 20 20 20 72 le-execute. r
2540: 3e 20 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 > close-file thr
2550: 6f 77 20 3b 0a 0a 3a 20 67 72 6f 75 70 2d 6c 69 ow ;..: group-li
2560: 6e 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 70 61 ne ( -- ). pa
2570: 72 73 65 2d 6e 61 6d 65 20 70 61 72 73 65 2d 6e rse-name parse-n
2580: 61 6d 65 20 3e 70 65 72 6d 20 3e 67 72 6f 75 70 ame >perm >group
2590: 73 20 3b 0a 0a 3a 20 72 65 61 64 2d 67 72 6f 75 s ;..: read-grou
25a0: 70 73 2d 6c 6f 6f 70 20 28 20 2d 2d 20 29 0a 20 ps-loop ( -- ).
25b0: 20 20 20 42 45 47 49 4e 20 20 72 65 66 69 6c 6c BEGIN refill
25c0: 20 20 57 48 49 4c 45 20 20 67 72 6f 75 70 2d 6c WHILE group-l
25d0: 69 6e 65 20 20 52 45 50 45 41 54 20 3b 0a 0a 3a ine REPEAT ;..:
25e0: 20 72 65 61 64 2d 67 72 6f 75 70 73 20 28 20 2d read-groups ( -
25f0: 2d 20 29 0a 20 20 20 20 22 67 72 6f 75 70 73 22 - ). "groups"
2600: 20 2e 6e 65 74 32 6f 2f 20 32 64 75 70 20 66 69 .net2o/ 2dup fi
2610: 6c 65 2d 73 74 61 74 75 73 20 6e 69 70 20 6e 6f le-status nip no
2620: 2d 66 69 6c 65 23 20 3d 20 49 46 0a 09 69 6e 69 -file# = IF..ini
2630: 74 2d 67 72 6f 75 70 73 20 77 72 69 74 65 2d 67 t-groups write-g
2640: 72 6f 75 70 73 0a 20 20 20 20 54 48 45 4e 20 20 roups. THEN
2650: 3e 69 6e 63 6c 75 64 65 64 20 74 68 72 6f 77 0a >included throw.
2660: 20 20 20 20 5b 27 5d 20 72 65 61 64 2d 67 72 6f ['] read-gro
2670: 75 70 73 2d 6c 6f 6f 70 20 65 78 65 63 75 74 65 ups-loop execute
2680: 2d 70 61 72 73 69 6e 67 2d 6e 61 6d 65 64 2d 66 -parsing-named-f
2690: 69 6c 65 20 3b 0a 0a 3a 20 67 72 6f 75 70 73 3e ile ;..: groups>
26a0: 6d 61 73 6b 20 28 20 61 64 64 72 20 75 20 2d 2d mask ( addr u --
26b0: 20 6d 61 73 6b 20 29 0a 20 20 20 20 30 20 2d 72 mask ). 0 -r
26c0: 6f 74 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 09 49 ot bounds ?DO..I
26d0: 20 70 40 2b 20 49 20 2d 20 3e 72 0a 09 36 34 3e p@+ I - >r..64>
26e0: 6e 20 64 75 70 20 67 72 6f 75 70 73 5b 5d 20 24 n dup groups[] $
26f0: 5b 5d 23 20 75 3e 3d 20 21 21 6e 6f 2d 67 72 6f []# u>= !!no-gro
2700: 75 70 21 21 0a 09 67 72 6f 75 70 73 5b 5d 20 24 up!!..groups[] $
2710: 5b 5d 40 20 64 72 6f 70 20 32 40 20 3e 72 20 61 []@ drop 2@ >r a
2720: 6e 64 20 72 3e 20 6f 72 0a 20 20 20 20 72 3e 20 nd r> or. r>
2730: 2b 4c 4f 4f 50 20 3b 0a 0a 3a 20 3f 3e 67 72 6f +LOOP ;..: ?>gro
2740: 75 70 73 20 28 20 6d 61 73 6b 20 2d 2d 20 6d 61 ups ( mask -- ma
2750: 73 6b 27 20 29 0a 20 20 20 20 6b 65 2d 67 72 6f sk' ). ke-gro
2760: 75 70 73 20 24 40 6c 65 6e 20 30 3d 20 49 46 0a ups $@len 0= IF.
2770: 09 34 20 30 20 44 4f 0a 09 20 20 20 20 64 75 70 .4 0 DO.. dup
2780: 20 49 20 67 72 6f 75 70 73 5b 5d 20 24 5b 5d 40 I groups[] $[]@
2790: 20 64 72 6f 70 20 63 65 6c 6c 2b 20 40 0a 09 20 drop cell+ @..
27a0: 20 20 20 6f 72 20 6f 76 65 72 20 3d 20 49 46 0a or over = IF.
27b0: 09 09 49 20 6b 65 2d 67 72 6f 75 70 73 20 63 24 ..I ke-groups c$
27c0: 2b 21 20 49 20 67 72 6f 75 70 73 5b 5d 20 24 5b +! I groups[] $[
27d0: 5d 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 40 20 ]@ drop cell+ @
27e0: 69 6e 76 65 72 74 20 61 6e 64 0a 09 20 20 20 20 invert and..
27f0: 54 48 45 4e 0a 09 4c 4f 4f 50 0a 20 20 20 20 54 THEN..LOOP. T
2800: 48 45 4e 20 20 64 72 6f 70 20 3b 0a 0a 5c 20 6b HEN drop ;..\ k
2810: 65 79 20 64 69 73 70 6c 61 79 0a 0a 5b 49 46 55 ey display..[IFU
2820: 4e 44 45 46 5d 20 6d 61 67 65 6e 74 61 20 20 62 NDEF] magenta b
2830: 72 6f 77 6e 20 63 6f 6e 73 74 61 6e 74 20 6d 61 rown constant ma
2840: 67 65 6e 74 61 20 5b 54 48 45 4e 5d 0a 5b 49 46 genta [THEN].[IF
2850: 44 45 46 5d 20 67 6c 2d 74 79 70 65 20 3a 20 62 DEF] gl-type : b
2860: 67 7c 20 3e 62 67 20 6f 72 20 3b 20 5b 45 4c 53 g| >bg or ; [ELS
2870: 45 5d 20 3a 20 62 67 7c 20 64 72 6f 70 20 3b 20 E] : bg| drop ;
2880: 5b 54 48 45 4e 5d 0a 0a 43 72 65 61 74 65 20 38 [THEN]..Create 8
2890: 35 63 6f 6c 6f 72 73 2d 62 77 0a 30 20 2c 20 69 5colors-bw.0 , i
28a0: 6e 76 65 72 73 20 2c 0a 69 6e 76 65 72 73 20 2c nvers ,.invers ,
28b0: 20 30 20 2c 0a 30 20 2c 20 69 6e 76 65 72 73 20 0 ,.0 , invers
28c0: 2c 0a 69 6e 76 65 72 73 20 2c 20 30 20 2c 0a 43 ,.invers , 0 ,.C
28d0: 72 65 61 74 65 20 38 35 63 6f 6c 6f 72 73 2d 63 reate 85colors-c
28e0: 6c 0a 79 65 6c 6c 6f 77 20 3e 66 67 20 62 6c 75 l.yellow >fg blu
28f0: 65 20 3e 62 67 20 6f 72 20 62 6f 6c 64 20 6f 72 e >bg or bold or
2900: 20 2c 20 72 65 64 20 3e 66 67 20 77 68 69 74 65 , red >fg white
2910: 20 62 67 7c 20 2c 0a 62 6c 61 63 6b 20 3e 66 67 bg| ,.black >fg
2920: 20 63 79 61 6e 20 62 67 7c 20 2c 20 67 72 65 65 cyan bg| , gree
2930: 6e 20 3e 66 67 20 62 6c 61 63 6b 20 3e 62 67 20 n >fg black >bg
2940: 6f 72 20 62 6f 6c 64 20 6f 72 20 2c 0a 77 68 69 or bold or ,.whi
2950: 74 65 20 3e 66 67 20 62 6c 61 63 6b 20 3e 62 67 te >fg black >bg
2960: 20 6f 72 20 62 6f 6c 64 20 6f 72 20 2c 20 6d 61 or bold or , ma
2970: 67 65 6e 74 61 20 3e 66 67 20 79 65 6c 6c 6f 77 genta >fg yellow
2980: 20 62 67 7c 20 2c 0a 62 6c 75 65 20 3e 66 67 20 bg| ,.blue >fg
2990: 79 65 6c 6c 6f 77 20 62 67 7c 20 2c 20 63 79 61 yellow bg| , cya
29a0: 6e 20 3e 66 67 20 72 65 64 20 3e 62 67 20 6f 72 n >fg red >bg or
29b0: 20 62 6f 6c 64 20 6f 72 20 2c 0a 0a 5b 49 46 44 bold or ,..[IFD
29c0: 45 46 5d 20 67 6c 2d 74 79 70 65 20 38 35 63 6f EF] gl-type 85co
29d0: 6c 6f 72 73 2d 63 6c 20 5b 45 4c 53 45 5d 20 38 lors-cl [ELSE] 8
29e0: 35 63 6f 6c 6f 72 73 2d 62 77 20 5b 54 48 45 4e 5colors-bw [THEN
29f0: 5d 20 56 61 6c 75 65 20 38 35 63 6f 6c 6f 72 73 ] Value 85colors
2a00: 0a 0a 3a 20 2e 73 74 72 69 70 65 38 35 20 28 20 ..: .stripe85 (
2a10: 61 64 64 72 20 75 20 2d 2d 20 29 20 20 30 20 2d addr u -- ) 0 -
2a20: 72 6f 74 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 09 rot bounds ?DO..
2a30: 64 75 70 20 63 65 6c 6c 73 20 38 35 63 6f 6c 6f dup cells 85colo
2a40: 72 73 20 2b 20 40 20 61 74 74 72 21 20 31 2b 0a rs + @ attr! 1+.
2a50: 09 49 20 34 20 38 35 74 79 70 65 20 20 64 75 70 .I 4 85type dup
2a60: 20 63 65 6c 6c 73 20 38 35 63 6f 6c 6f 72 73 20 cells 85colors
2a70: 2b 20 40 20 61 74 74 72 21 20 31 2b 0a 20 20 20 + @ attr! 1+.
2a80: 20 49 20 34 20 2b 20 34 20 38 35 74 79 70 65 20 I 4 + 4 85type
2a90: 3c 64 65 66 61 75 6c 74 3e 20 63 72 20 38 20 2b <default> cr 8 +
2aa0: 4c 4f 4f 50 20 20 64 72 6f 70 20 3b 0a 3a 20 2e LOOP drop ;.: .
2ab0: 69 6d 70 6f 72 74 38 35 20 28 20 61 64 64 72 20 import85 ( addr
2ac0: 75 20 2d 2d 20 29 0a 20 20 20 20 6b 65 2d 69 6d u -- ). ke-im
2ad0: 70 6f 72 74 73 20 40 20 3e 69 6d 2d 63 6f 6c 6f ports @ >im-colo
2ae0: 72 20 38 35 74 79 70 65 20 3c 64 65 66 61 75 6c r 85type <defaul
2af0: 74 3e 20 3b 0a 3a 20 2e 72 73 6b 20 28 20 6e 69 t> ;.: .rsk ( ni
2b00: 63 6b 20 75 20 2d 2d 20 29 0a 20 20 20 20 73 6b ck u -- ). sk
2b10: 72 65 76 20 24 32 30 20 2e 73 74 72 69 70 65 38 rev $20 .stripe8
2b20: 35 20 73 70 61 63 65 20 74 79 70 65 20 2e 22 20 5 space type ."
2b30: 20 28 6b 65 65 70 20 6f 66 66 6c 69 6e 65 20 63 (keep offline c
2b40: 6f 70 79 21 29 22 20 63 72 20 3b 0a 3a 20 2e 6b opy!)" cr ;.: .k
2b50: 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 ey ( addr u -- )
2b60: 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e 6f 0a 20 drop cell+ >o.
2b70: 20 20 20 2e 22 20 6e 69 63 6b 3a 20 20 20 22 20 ." nick: "
2b80: 2e 6e 69 63 6b 20 63 72 0a 20 20 20 20 2e 22 20 .nick cr. ."
2b90: 70 75 62 6b 65 79 3a 20 22 20 6b 65 2d 70 6b 20 pubkey: " ke-pk
2ba0: 24 40 20 38 35 74 79 70 65 20 63 72 0a 20 20 20 $@ 85type cr.
2bb0: 20 6b 65 2d 73 6b 20 40 20 49 46 0a 09 2e 22 20 ke-sk @ IF..."
2bc0: 73 65 63 6b 65 79 3a 20 22 20 6b 65 2d 73 6b 20 seckey: " ke-sk
2bd0: 73 65 63 40 20 2e 62 6c 61 63 6b 38 35 20 2e 22 sec@ .black85 ."
2be0: 20 20 28 6b 65 65 70 20 73 65 63 72 65 74 21 29 (keep secret!)
2bf0: 22 20 63 72 20 20 54 48 45 4e 0a 20 20 20 20 2e " cr THEN. .
2c00: 22 20 76 61 6c 69 64 3a 20 20 22 20 6b 65 2d 73 " valid: " ke-s
2c10: 65 6c 66 73 69 67 20 24 40 20 2e 73 69 67 64 61 elfsig $@ .sigda
2c20: 74 65 73 20 63 72 0a 20 20 20 20 2e 22 20 67 72 tes cr. ." gr
2c30: 6f 75 70 73 3a 20 22 20 6b 65 2d 67 72 6f 75 70 oups: " ke-group
2c40: 73 20 24 40 20 2e 69 6e 2d 67 72 6f 75 70 73 20 s $@ .in-groups
2c50: 63 72 0a 20 20 20 20 2e 22 20 70 65 72 6d 3a 20 cr. ." perm:
2c60: 20 20 22 20 6b 65 2d 6d 61 73 6b 20 40 20 2e 70 " ke-mask @ .p
2c70: 65 72 6d 20 63 72 0a 20 20 20 20 6f 3e 20 3b 0a erm cr. o> ;.
2c80: 3a 20 2e 6b 65 79 2d 72 65 73 74 20 28 20 6f 3a : .key-rest ( o:
2c90: 6b 65 79 20 2d 2d 20 6f 3a 6b 65 79 20 29 0a 20 key -- o:key ).
2ca0: 20 20 20 6b 65 2d 70 6b 20 24 40 20 6b 65 79 7c ke-pk $@ key|
2cb0: 20 2e 69 6d 70 6f 72 74 38 35 0a 20 20 20 20 6b .import85. k
2cc0: 65 2d 73 65 6c 66 73 69 67 20 24 40 20 73 70 61 e-selfsig $@ spa
2cd0: 63 65 20 2e 73 69 67 64 61 74 65 73 0a 20 20 20 ce .sigdates.
2ce0: 20 6b 65 2d 67 72 6f 75 70 73 20 24 40 20 32 64 ke-groups $@ 2d
2cf0: 75 70 20 2e 69 6e 2d 67 72 6f 75 70 73 20 67 72 up .in-groups gr
2d00: 6f 75 70 73 3e 6d 61 73 6b 20 69 6e 76 65 72 74 oups>mask invert
2d10: 0a 20 20 20 20 73 70 61 63 65 20 6b 65 2d 6d 61 . space ke-ma
2d20: 73 6b 20 40 20 61 6e 64 20 2d 31 20 73 77 61 70 sk @ and -1 swap
2d30: 20 2e 70 65 72 6d 61 6e 64 6f 72 0a 20 20 20 20 .permandor.
2d40: 23 74 61 62 20 65 6d 69 74 20 6b 65 2d 69 6d 70 #tab emit ke-imp
2d50: 6f 72 74 73 20 40 20 2e 69 6d 70 6f 72 74 73 0a orts @ .imports.
2d60: 20 20 20 20 73 70 61 63 65 20 2e 6e 69 63 6b 2b space .nick+
2d70: 70 65 74 20 3b 0a 3a 20 2e 6b 65 79 2d 6c 69 73 pet ;.: .key-lis
2d80: 74 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 6f 3a 6b t ( o:key -- o:k
2d90: 65 79 20 29 0a 20 20 20 20 6b 65 2d 6f 66 66 73 ey ). ke-offs
2da0: 65 74 20 36 34 40 20 36 34 3e 64 20 6b 65 79 70 et 64@ 64>d keyp
2db0: 61 63 6b 2d 61 6c 6c 23 20 66 6d 2f 6d 6f 64 20 ack-all# fm/mod
2dc0: 6e 69 70 20 33 20 2e 72 20 73 70 61 63 65 0a 20 nip 3 .r space.
2dd0: 20 20 20 2e 6b 65 79 2d 72 65 73 74 20 63 72 20 .key-rest cr
2de0: 3b 0a 3a 20 2e 73 65 63 72 65 74 2d 6e 69 63 6b ;.: .secret-nick
2df0: 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 30 20 6b s ( -- ). 0 k
2e00: 65 79 23 20 5b 3a 20 63 65 6c 6c 2b 20 24 40 20 ey# [: cell+ $@
2e10: 64 72 6f 70 20 63 65 6c 6c 2b 20 3e 6f 20 6b 65 drop cell+ >o ke
2e20: 2d 73 6b 20 40 20 49 46 0a 09 20 20 5b 3a 20 64 -sk @ IF.. [: d
2e30: 75 70 20 31 20 2e 72 20 3b 5d 20 23 33 36 20 62 up 1 .r ;] #36 b
2e40: 61 73 65 2d 65 78 65 63 75 74 65 20 73 70 61 63 ase-execute spac
2e50: 65 20 2e 6b 65 79 2d 72 65 73 74 20 63 72 20 31 e .key-rest cr 1
2e60: 2b 0a 20 20 20 20 20 20 54 48 45 4e 20 6f 3e 20 +. THEN o>
2e70: 3b 5d 20 23 6d 61 70 20 64 72 6f 70 20 3b 0a 3a ;] #map drop ;.:
2e80: 20 2e 6b 65 79 2d 69 6e 76 69 74 65 20 28 20 6f .key-invite ( o
2e90: 3a 6b 65 79 20 2d 2d 20 6f 3a 6b 65 79 20 29 0a :key -- o:key ).
2ea0: 20 20 20 20 6b 65 2d 70 6b 20 24 40 20 6b 65 79 ke-pk $@ key
2eb0: 73 69 7a 65 20 75 6d 69 6e 0a 20 20 20 20 6b 65 size umin. ke
2ec0: 2d 69 6d 70 6f 72 74 73 20 40 20 3e 69 6d 2d 63 -imports @ >im-c
2ed0: 6f 6c 6f 72 20 38 35 74 79 70 65 20 3c 64 65 66 olor 85type <def
2ee0: 61 75 6c 74 3e 0a 20 20 20 20 73 70 61 63 65 20 ault>. space
2ef0: 2e 6e 69 63 6b 20 73 70 61 63 65 20 3b 0a 3a 20 .nick space ;.:
2f00: 2e 6b 65 79 2d 73 68 6f 72 74 20 28 20 6f 3a 6b .key-short ( o:k
2f10: 65 79 20 2d 2d 20 6f 3a 6b 65 79 20 29 0a 20 20 ey -- o:key ).
2f20: 20 20 6b 65 2d 6e 69 63 6b 20 24 2e 20 6b 65 2d ke-nick $. ke-
2f30: 70 72 6f 66 20 24 40 6c 65 6e 20 49 46 20 2e 22 prof $@len IF ."
2f40: 20 20 70 72 6f 66 69 6c 65 3a 20 22 20 6b 65 2d profile: " ke-
2f50: 70 72 6f 66 20 24 40 20 38 35 74 79 70 65 20 54 prof $@ 85type T
2f60: 48 45 4e 20 3b 0a 3a 20 6c 69 73 74 2d 6b 65 79 HEN ;.: list-key
2f70: 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 2e 22 20 s ( -- ). ."
2f80: 6e 75 6d 20 70 75 62 6b 65 79 20 20 20 20 20 20 num pubkey
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 dat
2fb0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e
2fc0: 20 20 20 20 20 20 67 72 70 2b 70 65 72 6d 09 68 grp+perm.h
2fd0: 20 6e 69 63 6b 22 20 63 72 0a 20 20 20 20 6b 65 nick" cr. ke
2fe0: 79 23 20 5b 3a 20 63 65 6c 6c 2b 20 24 40 20 64 y# [: cell+ $@ d
2ff0: 72 6f 70 20 63 65 6c 6c 2b 20 2e 2e 6b 65 79 2d rop cell+ ..key-
3000: 6c 69 73 74 20 3b 5d 20 23 6d 61 70 20 3b 0a 3a list ;] #map ;.:
3010: 20 6c 69 73 74 2d 6e 69 63 6b 73 20 28 20 2d 2d list-nicks ( --
3020: 20 29 0a 20 20 20 20 6e 69 63 6b 23 20 5b 3a 20 ). nick# [:
3030: 64 75 70 20 24 2e 20 2e 22 20 3a 22 20 63 72 20 dup $. ." :" cr
3040: 63 65 6c 6c 2b 20 24 40 20 62 6f 75 6e 64 73 20 cell+ $@ bounds
3050: 3f 44 4f 0a 09 20 20 49 20 40 20 2e 2e 6b 65 79 ?DO.. I @ ..key
3060: 2d 6c 69 73 74 20 20 63 65 6c 6c 20 2b 4c 4f 4f -list cell +LOO
3070: 50 20 3b 5d 20 23 6d 61 70 20 3b 0a 0a 3a 20 64 P ;] #map ;..: d
3080: 75 6d 70 6b 65 79 20 28 20 61 64 64 72 20 75 20 umpkey ( addr u
3090: 2d 2d 20 29 20 64 72 6f 70 20 63 65 6c 6c 2b 20 -- ) drop cell+
30a0: 3e 6f 0a 20 20 20 20 2e 5c 22 20 78 5c 22 20 22 >o. .\" x\" "
30b0: 20 6b 65 2d 70 6b 20 24 40 20 38 35 74 79 70 65 ke-pk $@ 85type
30c0: 20 2e 5c 22 20 5c 22 20 6b 65 79 3f 6e 65 77 22 .\" \" key?new"
30d0: 20 63 72 0a 20 20 20 20 6b 65 2d 73 6b 20 40 20 cr. ke-sk @
30e0: 49 46 20 20 2e 5c 22 20 78 5c 22 20 22 20 6b 65 IF .\" x\" " ke
30f0: 2d 73 6b 20 40 20 6b 65 79 73 69 7a 65 20 38 35 -sk @ keysize 85
3100: 74 79 70 65 20 2e 5c 22 20 5c 22 20 6b 65 2d 73 type .\" \" ke-s
3110: 6b 20 73 65 63 21 20 2b 73 65 63 6b 65 79 22 20 k sec! +seckey"
3120: 63 72 20 20 54 48 45 4e 0a 20 20 20 20 27 22 27 cr THEN. '"'
3130: 20 65 6d 69 74 20 2e 6e 69 63 6b 20 2e 5c 22 20 emit .nick .\"
3140: 5c 22 20 6b 65 2d 6e 69 63 6b 20 24 21 20 22 0a \" ke-nick $! ".
3150: 20 20 20 20 6b 65 2d 73 65 6c 66 73 69 67 20 24 ke-selfsig $
3160: 40 20 64 72 6f 70 20 36 34 40 20 36 34 3e 64 20 @ drop 64@ 64>d
3170: 5b 3a 20 27 24 27 20 65 6d 69 74 20 30 20 75 64 [: '$' emit 0 ud
3180: 2e 72 20 3b 5d 20 24 31 30 20 62 61 73 65 2d 65 .r ;] $10 base-e
3190: 78 65 63 75 74 65 0a 20 20 20 20 2e 22 20 2e 20 xecute. ." .
31a0: 64 3e 36 34 20 6b 65 2d 66 69 72 73 74 21 20 22 d>64 ke-first! "
31b0: 20 6b 65 2d 74 79 70 65 20 40 20 2e 20 2e 22 20 ke-type @ . ."
31c0: 6b 65 2d 74 79 70 65 20 21 22 20 20 63 72 20 6f ke-type !" cr o
31d0: 3e 20 3b 0a 0a 3a 20 2e 6b 65 79 73 20 28 20 2d > ;..: .keys ( -
31e0: 2d 20 29 20 6b 65 79 23 20 5b 3a 20 2e 22 20 69 - ) key# [: ." i
31f0: 6e 64 65 78 3a 20 22 20 64 75 70 20 24 40 20 38 ndex: " dup $@ 8
3200: 35 74 79 70 65 20 63 72 20 63 65 6c 6c 2b 20 24 5type cr cell+ $
3210: 40 20 2e 6b 65 79 20 3b 5d 20 23 6d 61 70 20 3b @ .key ;] #map ;
3220: 0a 3a 20 64 75 6d 70 6b 65 79 73 20 28 20 2d 2d .: dumpkeys ( --
3230: 20 29 20 6b 65 79 23 20 5b 3a 20 63 65 6c 6c 2b ) key# [: cell+
3240: 20 24 40 20 64 75 6d 70 6b 65 79 20 3b 5d 20 23 $@ dumpkey ;] #
3250: 6d 61 70 20 3b 0a 0a 3a 20 6b 65 79 3e 6e 69 63 map ;..: key>nic
3260: 6b 20 28 20 61 64 64 72 6b 65 79 20 75 31 20 2d k ( addrkey u1 -
3270: 2d 20 6e 69 63 6b 20 75 32 20 29 0a 20 20 20 20 - nick u2 ).
3280: 5c 47 20 63 6f 6e 76 65 72 74 20 6b 65 79 20 74 \G convert key t
3290: 6f 20 6e 69 63 6b 0a 20 20 20 20 6b 65 79 7c 20 o nick. key|
32a0: 6b 65 79 23 20 23 40 20 30 3d 20 49 46 20 20 64 key# #@ 0= IF d
32b0: 72 6f 70 20 23 30 2e 20 20 45 58 49 54 20 20 54 rop #0. EXIT T
32c0: 48 45 4e 0a 20 20 20 20 63 65 6c 6c 2b 20 2e 6b HEN. cell+ .k
32d0: 65 2d 6e 69 63 6b 20 24 40 20 3b 0a 3a 20 6b 65 e-nick $@ ;.: ke
32e0: 79 3e 6b 65 79 20 28 20 61 64 64 72 6b 65 79 20 y>key ( addrkey
32f0: 75 31 20 2d 2d 20 6b 65 79 20 75 32 20 29 0a 20 u1 -- key u2 ).
3300: 20 20 20 5c 47 20 65 78 70 61 6e 64 20 6b 65 79 \G expand key
3310: 20 74 6f 20 66 75 6c 6c 20 73 69 7a 65 20 61 6e to full size an
3320: 64 20 63 68 65 63 6b 20 69 66 20 77 65 20 6b 6e d check if we kn
3330: 6f 77 20 69 74 0a 20 20 20 20 6b 65 79 7c 20 6b ow it. key| k
3340: 65 79 23 20 23 40 20 30 3d 20 49 46 20 20 64 72 ey# #@ 0= IF dr
3350: 6f 70 20 23 30 2e 20 20 45 58 49 54 20 20 54 48 op #0. EXIT TH
3360: 45 4e 0a 20 20 20 20 63 65 6c 6c 2b 20 2e 6b 65 EN. cell+ .ke
3370: 2d 70 6b 20 24 40 20 3b 0a 0a 3a 20 2e 6b 65 79 -pk $@ ;..: .key
3380: 23 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 # ( addr u -- )
3390: 6b 65 79 7c 0a 20 20 20 20 2e 22 20 4b 65 79 20 key|. ." Key
33a0: 27 22 20 6b 65 79 23 20 23 40 20 30 3d 20 49 46 '" key# #@ 0= IF
33b0: 20 64 72 6f 70 20 45 58 49 54 20 54 48 45 4e 0a drop EXIT THEN.
33c0: 20 20 20 20 63 65 6c 6c 2b 20 2e 2e 6e 69 63 6b cell+ ..nick
33d0: 20 2e 22 20 27 20 6f 6b 22 20 63 72 20 3b 0a 0a ." ' ok" cr ;..
33e0: 44 65 66 65 72 20 64 68 74 2d 6e 69 63 6b 3f 0a Defer dht-nick?.
33f0: 65 76 65 6e 74 3a 20 2d 3e 73 65 61 72 63 68 2d event: ->search-
3400: 6b 65 79 20 20 6b 65 79 7c 20 6f 76 65 72 20 3e key key| over >
3410: 72 20 64 68 74 2d 6e 69 63 6b 3f 20 72 3e 20 66 r dht-nick? r> f
3420: 72 65 65 20 74 68 72 6f 77 20 3b 0a 0a 3a 20 2e ree throw ;..: .
3430: 75 6e 6b 65 79 2d 69 64 20 28 20 61 64 64 72 20 unkey-id ( addr
3440: 75 20 2d 2d 20 29 20 3c 65 72 72 3e 20 38 20 75 u -- ) <err> 8 u
3450: 6d 69 6e 20 38 35 74 79 70 65 20 2e 22 20 28 75 min 85type ." (u
3460: 6e 6b 6e 6f 77 6e 29 22 20 3c 64 65 66 61 75 6c nknown)" <defaul
3470: 74 3e 20 3b 0a 0a 56 61 72 69 61 62 6c 65 20 75 t> ;..Variable u
3480: 6e 6b 65 79 2d 69 64 23 0a 23 36 30 2e 30 30 30 nkey-id#.#60.000
3490: 2e 30 30 30 2e 30 30 30 20 64 3e 36 34 20 36 34 .000.000 d>64 64
34a0: 43 6f 6e 73 74 61 6e 74 20 75 6e 6b 65 79 2d 74 Constant unkey-t
34b0: 6f 23 0a 3a 20 3f 75 6e 6b 65 79 20 28 20 61 64 o#.: ?unkey ( ad
34c0: 64 72 20 75 20 2d 2d 20 66 6c 61 67 20 29 0a 20 dr u -- flag ).
34d0: 20 20 20 75 6e 6b 65 79 2d 69 64 23 20 23 40 0a unkey-id# #@.
34e0: 20 20 20 20 49 46 20 20 36 34 40 20 75 6e 6b 65 IF 64@ unke
34f0: 79 2d 74 6f 23 20 36 34 2b 20 74 69 63 6b 73 20 y-to# 64+ ticks
3500: 36 34 2d 20 36 34 2d 30 3e 3d 20 20 54 48 45 4e 64- 64-0>= THEN
3510: 20 20 30 3d 20 3b 0a 20 20 20 20 0a 3a 20 2e 6b 0= ;. .: .k
3520: 65 79 2d 69 64 20 28 20 61 64 64 72 20 75 20 2d ey-id ( addr u -
3530: 2d 20 29 20 6b 65 79 7c 20 32 64 75 70 20 6b 65 - ) key| 2dup ke
3540: 79 23 20 23 40 20 30 3d 0a 20 20 20 20 49 46 20 y# #@ 0=. IF
3550: 20 64 72 6f 70 20 75 70 40 20 72 65 63 65 69 76 drop up@ receiv
3560: 65 72 2d 74 61 73 6b 20 3d 20 49 46 0a 09 20 20 er-task = IF..
3570: 20 20 3c 65 76 65 6e 74 20 32 64 75 70 20 73 61 <event 2dup sa
3580: 76 65 2d 6d 65 6d 20 65 24 2c 20 2d 3e 73 65 61 ve-mem e$, ->sea
3590: 72 63 68 2d 6b 65 79 20 6d 61 69 6e 2d 75 70 40 rch-key main-up@
35a0: 20 65 76 65 6e 74 3e 0a 09 20 20 20 20 2e 75 6e event>.. .un
35b0: 6b 65 79 2d 69 64 20 45 58 49 54 20 20 54 48 45 key-id EXIT THE
35c0: 4e 0a 09 32 64 75 70 20 3f 75 6e 6b 65 79 20 20 N..2dup ?unkey
35d0: 49 46 0a 09 20 20 20 20 74 69 63 6b 73 20 7b 20 IF.. ticks {
35e0: 36 34 5e 20 74 78 20 7d 20 74 78 20 31 20 36 34 64^ tx } tx 1 64
35f0: 73 20 32 6f 76 65 72 20 75 6e 6b 65 79 2d 69 64 s 2over unkey-id
3600: 23 20 23 21 0a 09 20 20 20 20 63 6f 6e 6e 65 63 # #!.. connec
3610: 74 69 6f 6e 20 3e 72 20 32 64 75 70 20 5b 27 5d tion >r 2dup [']
3620: 20 64 68 74 2d 6e 69 63 6b 3f 20 63 6d 64 2d 6e dht-nick? cmd-n
3630: 65 73 74 20 72 3e 20 74 6f 20 63 6f 6e 6e 65 63 est r> to connec
3640: 74 69 6f 6e 0a 09 20 20 20 20 32 64 75 70 20 6b tion.. 2dup k
3650: 65 79 23 20 23 40 20 30 3d 20 49 46 20 20 64 72 ey# #@ 0= IF dr
3660: 6f 70 20 2e 75 6e 6b 65 79 2d 69 64 20 45 58 49 op .unkey-id EXI
3670: 54 0a 09 20 20 20 20 45 4c 53 45 20 20 3e 72 20 T.. ELSE >r
3680: 32 64 75 70 20 75 6e 6b 65 79 2d 69 64 23 20 23 2dup unkey-id# #
3690: 6f 66 66 20 72 3e 20 20 54 48 45 4e 0a 09 45 4c off r> THEN..EL
36a0: 53 45 20 20 2e 75 6e 6b 65 79 2d 69 64 20 20 45 SE .unkey-id E
36b0: 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 54 48 XIT THEN. TH
36c0: 45 4e 0a 20 20 20 20 63 65 6c 6c 2b 20 2e 2e 6e EN. cell+ ..n
36d0: 69 63 6b 20 32 64 72 6f 70 20 3b 0a 0a 3a 20 2e ick 2drop ;..: .
36e0: 63 6f 6e 2d 69 64 20 28 20 6f 3a 63 6f 6e 6e 65 con-id ( o:conne
36f0: 63 74 69 6f 6e 20 2d 2d 20 29 20 70 75 62 6b 65 ction -- ) pubke
3700: 79 20 24 40 20 2e 6b 65 79 2d 69 64 20 3b 0a 0a y $@ .key-id ;..
3710: 3a 20 2e 73 69 6d 70 6c 65 2d 69 64 20 28 20 61 : .simple-id ( a
3720: 64 64 72 20 75 20 2d 2d 20 29 20 6b 65 79 3e 6e ddr u -- ) key>n
3730: 69 63 6b 20 74 79 70 65 20 3b 0a 0a 3a 20 63 68 ick type ;..: ch
3740: 65 63 6b 2d 6b 65 79 20 28 20 61 64 64 72 20 75 eck-key ( addr u
3750: 20 2d 2d 20 29 0a 20 20 20 20 6f 20 49 46 20 20 -- ). o IF
3760: 70 75 62 6b 65 79 20 40 20 49 46 0a 09 20 20 20 pubkey @ IF..
3770: 20 32 64 75 70 20 70 75 62 6b 65 79 20 24 40 20 2dup pubkey $@
3780: 6b 65 79 7c 20 73 74 72 3d 20 30 3d 20 49 46 0a key| str= 0= IF.
3790: 09 09 5b 3a 20 2e 22 20 77 61 6e 74 3a 20 22 20 ..[: ." want: "
37a0: 70 75 62 6b 65 79 20 24 40 20 6b 65 79 7c 20 38 pubkey $@ key| 8
37b0: 35 74 79 70 65 20 63 72 0a 09 09 20 20 2e 22 20 5type cr... ."
37c0: 67 6f 74 20 3a 20 22 20 32 64 75 70 20 38 35 74 got : " 2dup 85t
37d0: 79 70 65 20 63 72 20 3b 5d 20 24 65 72 72 0a 09 ype cr ;] $err..
37e0: 09 74 72 75 65 20 21 21 77 72 6f 6e 67 2d 6b 65 .true !!wrong-ke
37f0: 79 21 21 0a 09 20 20 20 20 54 48 45 4e 0a 09 20 y!!.. THEN..
3800: 20 20 20 63 6f 6e 6e 65 63 74 28 20 2e 6b 65 79 connect( .key
3810: 23 20 29 65 6c 73 65 28 20 32 64 72 6f 70 20 29 # )else( 2drop )
3820: 20 20 45 58 49 54 0a 09 54 48 45 4e 20 20 54 48 EXIT..THEN TH
3830: 45 4e 0a 20 20 20 20 32 64 75 70 20 6b 65 79 2d EN. 2dup key-
3840: 65 78 69 73 74 3f 0a 20 20 20 20 3f 64 75 70 2d exist?. ?dup-
3850: 30 3d 2d 49 46 20 20 70 65 72 6d 25 75 6e 6b 6e 0=-IF perm%unkn
3860: 6f 77 6e 20 20 45 4c 53 45 20 20 2e 6b 65 2d 6d own ELSE .ke-m
3870: 61 73 6b 20 40 20 20 54 48 45 4e 20 20 74 6d 70 ask @ THEN tmp
3880: 2d 70 65 72 6d 20 21 0a 20 20 20 20 63 6f 6e 6e -perm !. conn
3890: 65 63 74 28 20 32 64 75 70 20 2e 6b 65 79 23 20 ect( 2dup .key#
38a0: 29 0a 20 20 20 20 74 6d 70 2d 70 65 72 6d 20 40 ). tmp-perm @
38b0: 20 70 65 72 6d 25 62 6c 6f 63 6b 65 64 20 61 6e perm%blocked an
38c0: 64 20 49 46 0a 09 5b 3a 20 2e 22 20 55 6e 6b 6e d IF..[: ." Unkn
38d0: 6f 77 6e 20 6b 65 79 2c 20 63 6f 6e 6e 65 63 74 own key, connect
38e0: 69 6f 6e 20 72 65 66 75 73 65 64 3a 20 22 20 38 ion refused: " 8
38f0: 35 74 79 70 65 20 63 72 20 3b 5d 20 24 65 72 72 5type cr ;] $err
3900: 0a 09 74 72 75 65 20 21 21 63 6f 6e 6e 65 63 74 ..true !!connect
3910: 2d 70 65 72 6d 21 21 0a 20 20 20 20 45 4c 53 45 -perm!!. ELSE
3920: 20 20 32 64 72 6f 70 20 20 54 48 45 4e 20 3b 0a 2drop THEN ;.
3930: 0a 3a 20 73 65 61 72 63 68 2d 6b 65 79 20 28 20 .: search-key (
3940: 70 6b 63 20 2d 2d 20 73 6b 63 20 29 0a 20 20 20 pkc -- skc ).
3950: 20 6b 65 79 73 69 7a 65 20 6b 65 79 23 20 23 40 keysize key# #@
3960: 20 30 3d 20 21 21 75 6e 6b 6e 6f 77 6e 2d 6b 65 0= !!unknown-ke
3970: 79 21 21 0a 20 20 20 20 63 65 6c 6c 2b 20 2e 6b y!!. cell+ .k
3980: 65 2d 73 6b 20 73 65 63 40 20 30 3d 20 21 21 75 e-sk sec@ 0= !!u
3990: 6e 6b 6e 6f 77 6e 2d 6b 65 79 21 21 20 3b 0a 0a nknown-key!! ;..
39a0: 5c 20 61 70 70 6c 79 20 70 65 72 6d 69 73 73 69 \ apply permissi
39b0: 6f 6e 73 0a 0a 3a 20 61 70 70 6c 79 2d 70 65 72 ons..: apply-per
39c0: 6d 69 73 73 69 6f 6e 20 28 20 70 65 72 6d 61 6e mission ( perman
39d0: 64 20 70 65 72 6d 6f 72 20 6f 3a 6b 65 79 20 2d d permor o:key -
39e0: 2d 20 70 65 72 6d 61 6e 64 20 70 65 72 6d 6f 72 - permand permor
39f0: 20 6f 3a 6b 65 79 20 29 0a 20 20 20 20 6f 76 65 o:key ). ove
3a00: 72 20 6b 65 2d 6d 61 73 6b 20 40 20 61 6e 64 20 r ke-mask @ and
3a10: 6f 76 65 72 20 6f 72 20 6b 65 2d 6d 61 73 6b 20 over or ke-mask
3a20: 21 20 2e 6b 65 79 2d 6c 69 73 74 20 3b 0a 0a 5c ! .key-list ;..\
3a30: 20 67 65 74 20 70 61 73 73 70 68 72 61 73 65 0a get passphrase.
3a40: 0a 33 20 56 61 6c 75 65 20 70 61 73 73 70 68 72 .3 Value passphr
3a50: 61 73 65 2d 72 65 74 72 79 23 0a 24 31 30 30 20 ase-retry#.$100
3a60: 43 6f 6e 73 74 61 6e 74 20 6d 61 78 2d 70 61 73 Constant max-pas
3a70: 73 70 68 72 61 73 65 23 20 5c 20 32 35 36 20 63 sphrase# \ 256 c
3a80: 68 61 72 61 63 74 65 72 73 20 73 68 6f 75 6c 64 haracters should
3a90: 20 62 65 20 65 6e 6f 75 67 68 2e 2e 2e 0a 6d 61 be enough....ma
3aa0: 78 2d 70 61 73 73 70 68 72 61 73 65 23 20 62 75 x-passphrase# bu
3ab0: 66 66 65 72 3a 20 70 61 73 73 70 68 72 61 73 65 ffer: passphrase
3ac0: 0a 0a 3a 20 70 61 73 73 70 68 72 61 73 65 2d 69 ..: passphrase-i
3ad0: 6e 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61 64 n ( addr u -- ad
3ae0: 64 72 20 75 20 29 0a 20 20 20 20 22 50 41 53 53 dr u ). "PASS
3af0: 50 48 52 41 53 45 22 20 67 65 74 65 6e 76 20 32 PHRASE" getenv 2
3b00: 64 75 70 20 64 30 3d 20 49 46 20 20 32 64 72 6f dup d0= IF 2dro
3b10: 70 20 74 79 70 65 0a 09 70 61 73 73 70 68 72 61 p type..passphra
3b20: 73 65 20 64 75 70 20 6d 61 78 2d 70 61 73 73 70 se dup max-passp
3b30: 68 72 61 73 65 23 20 61 63 63 65 70 74 2a 20 63 hrase# accept* c
3b40: 72 0a 20 20 20 20 45 4c 53 45 20 20 32 6e 69 70 r. ELSE 2nip
3b50: 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 3e 70 61 73 THEN ;..: >pas
3b60: 73 70 68 72 61 73 65 20 28 20 61 64 64 72 20 75 sphrase ( addr u
3b70: 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20 20 -- addr u ).
3b80: 20 5c 47 20 63 72 65 61 74 65 20 61 20 35 31 32 \G create a 512
3b90: 20 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 bit hash of the
3ba0: 20 70 61 73 73 70 68 72 61 73 65 0a 20 20 20 20 passphrase.
3bb0: 6e 6f 2d 6b 65 79 20 3e 63 3a 6b 65 79 20 63 3a no-key >c:key c:
3bc0: 68 61 73 68 0a 20 20 20 20 6b 65 63 63 61 6b 2d hash. keccak-
3bd0: 70 61 64 64 65 64 20 63 3a 6b 65 79 3e 20 6b 65 padded c:key> ke
3be0: 63 63 61 6b 2d 70 61 64 64 65 64 20 6b 65 63 63 ccak-padded kecc
3bf0: 61 6b 23 6d 61 78 20 32 2f 20 3b 0a 0a 3a 20 67 ak#max 2/ ;..: g
3c00: 65 74 2d 70 61 73 73 70 68 72 61 73 65 20 28 20 et-passphrase (
3c10: 61 64 64 72 20 75 20 2d 2d 20 61 64 64 72 20 75 addr u -- addr u
3c20: 20 29 0a 20 20 20 20 70 61 73 73 70 68 72 61 73 ). passphras
3c30: 65 2d 69 6e 20 3e 70 61 73 73 70 68 72 61 73 65 e-in >passphrase
3c40: 20 3b 0a 0a 56 61 72 69 61 62 6c 65 20 6b 65 79 ;..Variable key
3c50: 73 0a 0a 3a 20 6c 61 73 74 6b 65 79 40 20 28 20 s..: lastkey@ (
3c60: 2d 2d 20 61 64 64 72 20 75 20 29 20 6b 65 79 73 -- addr u ) keys
3c70: 20 24 5b 5d 23 20 31 2d 20 6b 65 79 73 20 73 65 $[]# 1- keys se
3c80: 63 5b 5d 40 20 3b 0a 3a 20 6b 65 79 3e 64 65 66 c[]@ ;.: key>def
3c90: 61 75 6c 74 20 28 20 2d 2d 20 29 20 6c 61 73 74 ault ( -- ) last
3ca0: 6b 65 79 40 20 64 72 6f 70 20 3e 73 74 6f 72 65 key@ drop >store
3cb0: 6b 65 79 20 21 20 3b 0a 3a 20 2b 6b 65 79 20 28 key ! ;.: +key (
3cc0: 20 61 64 64 72 20 75 20 2d 2d 20 29 20 6b 65 79 addr u -- ) key
3cd0: 73 20 73 65 63 2b 5b 5d 21 20 3b 0a 3a 20 2b 70 s sec+[]! ;.: +p
3ce0: 61 73 73 70 68 72 61 73 65 20 28 20 61 64 64 72 assphrase ( addr
3cf0: 20 75 20 2d 2d 20 29 20 20 67 65 74 2d 70 61 73 u -- ) get-pas
3d00: 73 70 68 72 61 73 65 20 2b 6b 65 79 20 3b 0a 3a sphrase +key ;.:
3d10: 20 2b 63 68 65 63 6b 70 68 72 61 73 65 20 28 20 +checkphrase (
3d20: 61 64 64 72 20 75 20 2d 2d 20 66 6c 61 67 20 29 addr u -- flag )
3d30: 20 67 65 74 2d 70 61 73 73 70 68 72 61 73 65 20 get-passphrase
3d40: 6c 61 73 74 6b 65 79 40 20 73 74 72 3d 20 3b 0a lastkey@ str= ;.
3d50: 3a 20 2b 6e 65 77 70 68 72 61 73 65 20 28 20 2d : +newphrase ( -
3d60: 2d 20 29 0a 20 20 20 20 42 45 47 49 4e 0a 09 73 - ). BEGIN..s
3d70: 22 20 50 61 73 73 70 68 72 61 73 65 3a 20 22 20 " Passphrase: "
3d80: 2b 70 61 73 73 70 68 72 61 73 65 0a 09 73 22 20 +passphrase..s"
3d90: 52 65 74 79 70 65 20 70 6c 73 3a 20 22 20 2b 63 Retype pls: " +c
3da0: 68 65 63 6b 70 68 72 61 73 65 20 30 3d 20 57 48 heckphrase 0= WH
3db0: 49 4c 45 0a 09 20 20 20 20 63 72 20 2e 22 20 20 ILE.. cr ."
3dc0: 64 69 64 6e 27 74 20 6d 61 74 63 68 2c 20 74 72 didn't match, tr
3dd0: 79 20 61 67 61 69 6e 20 70 6c 65 61 73 65 22 20 y again please"
3de0: 63 72 0a 20 20 20 20 52 45 50 45 41 54 20 63 72 cr. REPEAT cr
3df0: 20 3b 0a 0a 3a 20 22 3e 70 61 73 73 70 68 72 61 ;..: ">passphra
3e00: 73 65 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 se ( addr u -- )
3e10: 20 3e 70 61 73 73 70 68 72 61 73 65 20 2b 6b 65 >passphrase +ke
3e20: 79 20 3b 0a 3a 20 3e 73 65 63 6b 65 79 20 28 20 y ;.: >seckey (
3e30: 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20 20 20 -- addr u ).
3e40: 6b 65 2d 73 6b 20 40 20 6b 65 2d 70 6b 20 24 40 ke-sk @ ke-pk $@
3e50: 20 64 72 6f 70 20 6b 65 79 70 61 64 20 65 64 2d drop keypad ed-
3e60: 64 68 20 3b 0a 3a 20 2b 73 65 63 6b 65 79 20 28 dh ;.: +seckey (
3e70: 20 2d 2d 20 29 20 3e 73 65 63 6b 65 79 20 2b 6b -- ) >seckey +k
3e80: 65 79 20 3b 0a 0a 5c 20 22 22 20 22 3e 70 61 73 ey ;..\ "" ">pas
3e90: 73 70 68 72 61 73 65 20 5c 20 66 6f 6c 6c 6f 77 sphrase \ follow
3ea0: 69 6e 67 20 74 68 65 20 65 6e 63 72 79 70 74 2d ing the encrypt-
3eb0: 65 76 65 72 79 74 68 69 6e 67 20 70 61 72 61 64 everything parad
3ec0: 69 67 6d 2c 0a 5c 20 6e 6f 20 70 61 73 73 77 6f igm,.\ no passwo
3ed0: 72 64 20 69 73 20 74 68 65 20 65 6d 70 74 79 20 rd is the empty
3ee0: 73 74 72 69 6e 67 21 20 20 49 74 27 73 20 73 74 string! It's st
3ef0: 69 6c 6c 20 65 6e 63 72 79 70 74 65 64 20 3b 2d ill encrypted ;-
3f00: 29 21 0a 0a 5c 20 61 20 73 65 63 72 65 74 20 6b )!..\ a secret k
3f10: 65 79 20 6a 75 73 74 20 6e 65 65 64 73 20 61 20 ey just needs a
3f20: 6e 69 63 6b 20 61 6e 64 20 61 20 74 79 70 65 2e nick and a type.
3f30: 0a 5c 20 53 65 63 72 65 74 20 6b 65 79 73 20 63 .\ Secret keys c
3f40: 61 6e 20 62 65 20 70 65 72 73 6f 6e 73 20 61 6e an be persons an
3f50: 64 20 67 72 6f 75 70 73 2e 0a 0a 5c 20 61 20 70 d groups...\ a p
3f60: 75 62 6c 69 63 20 6b 65 79 20 6e 65 65 64 73 20 ublic key needs
3f70: 6d 6f 72 65 3a 20 6e 69 63 6b 2c 20 74 79 70 65 more: nick, type
3f80: 2c 20 70 72 6f 66 69 6c 65 2e 0a 5c 20 54 68 65 , profile..\ The
3f90: 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 73 74 profile is a st
3fa0: 72 75 63 74 75 72 65 64 20 64 6f 63 75 6d 65 6e ructured documen
3fb0: 74 2c 20 69 2e 65 2e 20 70 6f 69 6e 74 65 64 20 t, i.e. pointed
3fc0: 74 6f 20 62 79 20 61 20 68 61 73 68 2e 0a 0a 5c to by a hash...\
3fd0: 20 61 20 73 69 67 6e 61 74 75 72 65 20 63 6f 6e a signature con
3fe0: 74 61 69 6e 73 20 61 20 70 75 62 6b 65 79 2c 20 tains a pubkey,
3ff0: 61 20 63 68 65 63 6b 62 6f 78 20 62 69 74 6d 61 a checkbox bitma
4000: 73 6b 2c 0a 5c 20 61 20 64 61 74 65 2c 20 61 6e sk,.\ a date, an
4010: 20 65 78 70 69 72 61 74 69 6f 6e 20 64 61 74 65 expiration date
4020: 2c 20 74 68 65 20 73 69 67 6e 65 72 27 73 20 70 , the signer's p
4030: 75 62 6b 65 79 20 61 6e 64 20 74 68 65 20 73 69 ubkey and the si
4040: 67 6e 61 74 75 72 65 20 69 74 73 65 6c 66 0a 5c gnature itself.\
4050: 20 28 72 2b 73 29 2e 20 20 54 68 65 72 65 20 69 (r+s). There i
4060: 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 73 69 s an optional si
4070: 67 6e 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 64 gning protocol d
4080: 6f 63 75 6d 65 6e 74 20 28 68 61 73 68 29 2e 0a ocument (hash)..
4090: 0a 5c 20 77 65 20 73 74 6f 72 65 20 65 61 63 68 .\ we store each
40a0: 20 69 74 65 6d 20 69 6e 20 61 20 32 35 36 20 62 item in a 256 b
40b0: 79 74 65 73 20 65 6e 63 72 79 70 74 65 64 20 73 ytes encrypted s
40c0: 74 72 69 6e 67 2c 20 69 2e 65 2e 20 77 69 74 68 tring, i.e. with
40d0: 20 61 20 31 36 0a 5c 20 62 79 74 65 20 73 61 6c a 16.\ byte sal
40e0: 74 20 61 6e 64 20 61 20 31 36 20 62 79 74 65 20 t and a 16 byte
40f0: 63 68 65 63 6b 73 75 6d 2e 0a 0a 3a 20 6b 65 2d checksum...: ke-
4100: 6c 61 73 74 21 20 28 20 36 34 64 61 74 65 20 2d last! ( 64date -
4110: 2d 20 29 0a 20 20 20 20 6b 65 2d 73 65 6c 66 73 - ). ke-selfs
4120: 69 67 20 24 40 6c 65 6e 20 24 31 30 20 75 6d 61 ig $@len $10 uma
4130: 78 20 6b 65 2d 73 65 6c 66 73 69 67 20 24 21 6c x ke-selfsig $!l
4140: 65 6e 0a 20 20 20 20 6b 65 2d 73 65 6c 66 73 69 en. ke-selfsi
4150: 67 20 24 40 20 64 72 6f 70 20 36 34 27 2b 20 36 g $@ drop 64'+ 6
4160: 34 21 20 3b 0a 3a 20 6b 65 2d 66 69 72 73 74 21 4! ;.: ke-first!
4170: 20 28 20 36 34 64 61 74 65 20 2d 2d 20 29 20 36 ( 64date -- ) 6
4180: 34 23 2d 31 20 6b 65 2d 6c 61 73 74 21 0a 20 20 4#-1 ke-last!.
4190: 20 20 6b 65 2d 73 65 6c 66 73 69 67 20 24 40 20 ke-selfsig $@
41a0: 64 72 6f 70 20 36 34 21 20 3b 0a 0a 73 63 6f 70 drop 64! ;..scop
41b0: 65 7b 20 6e 65 74 32 6f 2d 62 61 73 65 0a 0a 63 e{ net2o-base..c
41c0: 6d 64 2d 74 61 62 6c 65 20 24 40 20 69 6e 68 65 md-table $@ inhe
41d0: 72 69 74 2d 74 61 62 6c 65 20 6b 65 79 2d 65 6e rit-table key-en
41e0: 74 72 79 2d 74 61 62 6c 65 0a 5c 67 20 0a 5c 67 try-table.\g .\g
41f0: 20 23 23 23 20 6b 65 79 20 73 74 6f 72 61 67 65 ### key storage
4200: 20 63 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 5c 67 commands ###.\g
4210: 20 0a 24 31 31 20 6e 65 74 32 6f 3a 20 70 72 69 .$11 net2o: pri
4220: 76 6b 65 79 20 28 20 24 3a 73 74 72 69 6e 67 20 vkey ( $:string
4230: 2d 2d 20 29 0a 20 20 20 20 5c 67 20 70 72 69 76 -- ). \g priv
4240: 61 74 65 20 6b 65 79 0a 20 20 20 20 5c 20 64 6f ate key. \ do
4250: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 es not need to b
4260: 65 20 73 69 67 6e 65 64 2c 20 74 68 65 20 73 65 e signed, the se
4270: 63 72 65 74 20 6b 65 79 20 76 65 72 69 66 69 65 cret key verifie
4280: 73 20 69 74 73 65 6c 66 0a 20 20 20 20 21 21 75 s itself. !!u
4290: 6e 73 69 67 6e 65 64 3f 20 24 34 30 20 21 21 3e nsigned? $40 !!>
42a0: 3d 6f 72 64 65 72 3f 0a 20 20 20 20 6b 65 79 70 =order?. keyp
42b0: 61 63 6b 20 63 40 20 24 46 20 61 6e 64 20 6b 65 ack c@ $F and ke
42c0: 2d 70 77 6c 65 76 65 6c 20 21 0a 20 20 20 20 24 -pwlevel !. $
42d0: 3e 20 6f 76 65 72 20 6b 65 79 70 61 64 20 73 6b > over keypad sk
42e0: 3e 70 6b 20 5c 20 67 65 6e 65 72 61 74 65 20 70 >pk \ generate p
42f0: 75 62 6b 65 79 0a 20 20 20 20 6b 65 79 70 61 64 ubkey. keypad
4300: 20 6b 65 2d 70 6b 20 24 40 20 64 72 6f 70 20 6b ke-pk $@ drop k
4310: 65 79 73 69 7a 65 20 74 75 63 6b 20 73 74 72 3d eysize tuck str=
4320: 20 30 3d 20 21 21 77 72 6f 6e 67 2d 6b 65 79 21 0= !!wrong-key!
4330: 21 0a 20 20 20 20 6b 65 2d 73 6b 20 73 65 63 21 !. ke-sk sec!
4340: 20 2b 73 65 63 6b 65 79 20 3b 0a 2b 6e 65 74 32 +seckey ;.+net2
4350: 6f 3a 20 6b 65 79 74 79 70 65 20 28 20 6e 20 2d o: keytype ( n -
4360: 2d 20 29 20 20 20 20 20 20 20 20 20 20 20 21 21 - ) !!
4370: 73 69 67 6e 65 64 3f 20 20 20 31 20 21 21 3e 6f signed? 1 !!>o
4380: 72 64 65 72 3f 20 36 34 3e 6e 20 6b 65 2d 74 79 rder? 64>n ke-ty
4390: 70 65 20 21 20 3b 0a 20 20 20 20 5c 67 20 6b 65 pe ! ;. \g ke
43a0: 79 20 74 79 70 65 20 28 30 3a 20 61 6e 6f 6e 2c y type (0: anon,
43b0: 20 31 3a 20 75 73 65 72 2c 20 32 3a 20 67 72 6f 1: user, 2: gro
43c0: 75 70 29 0a 2b 6e 65 74 32 6f 3a 20 6b 65 79 6e up).+net2o: keyn
43d0: 69 63 6b 20 28 20 24 3a 73 74 72 69 6e 67 20 2d ick ( $:string -
43e0: 2d 20 29 20 20 20 20 21 21 73 69 67 6e 65 64 3f - ) !!signed?
43f0: 20 20 20 32 20 21 21 3e 6f 72 64 65 72 3f 20 24 2 !!>order? $
4400: 3e 20 6b 65 2d 6e 69 63 6b 20 24 21 0a 20 20 20 > ke-nick $!.
4410: 20 5c 67 20 6b 65 79 20 6e 69 63 6b 0a 20 20 20 \g key nick.
4420: 20 6e 69 63 6b 21 20 3b 0a 2b 6e 65 74 32 6f 3a nick! ;.+net2o:
4430: 20 6b 65 79 70 72 6f 66 69 6c 65 20 28 20 24 3a keyprofile ( $:
4440: 73 74 72 69 6e 67 20 2d 2d 20 29 20 21 21 73 69 string -- ) !!si
4450: 67 6e 65 64 3f 20 20 20 34 20 21 21 3e 6f 72 64 gned? 4 !!>ord
4460: 65 72 3f 20 24 3e 20 6b 65 2d 70 72 6f 66 20 24 er? $> ke-prof $
4470: 21 20 3b 0a 20 20 20 20 5c 67 20 6b 65 79 20 70 ! ;. \g key p
4480: 72 6f 66 69 6c 65 20 28 68 61 73 68 20 6f 66 20 rofile (hash of
4490: 61 20 72 65 73 6f 75 72 63 65 29 0a 2b 6e 65 74 a resource).+net
44a0: 32 6f 3a 20 6b 65 79 6d 61 73 6b 20 28 20 78 20 2o: keymask ( x
44b0: 2d 2d 20 29 20 20 20 20 20 20 20 20 20 21 21 75 -- ) !!u
44c0: 6e 73 69 67 6e 65 64 3f 20 24 34 30 20 21 21 3e nsigned? $40 !!>
44d0: 3d 6f 72 64 65 72 3f 20 36 34 3e 6e 0a 20 20 20 =order? 64>n.
44e0: 20 5c 67 20 6b 65 79 20 61 63 63 65 73 73 20 72 \g key access r
44f0: 69 67 68 74 20 6d 61 73 6b 0a 20 20 20 20 31 20 ight mask. 1
4500: 69 6d 70 6f 72 74 2d 74 79 70 65 20 40 20 6c 73 import-type @ ls
4510: 68 69 66 74 0a 20 20 20 20 5b 20 31 20 69 6d 70 hift. [ 1 imp
4520: 6f 72 74 23 73 65 6c 66 20 6c 73 68 69 66 74 20 ort#self lshift
4530: 31 20 69 6d 70 6f 72 74 23 6e 65 77 20 6c 73 68 1 import#new lsh
4540: 69 66 74 20 6f 72 20 5d 4c 0a 20 20 20 20 61 6e ift or ]L. an
4550: 64 20 49 46 20 20 64 75 70 20 6b 65 2d 6d 61 73 d IF dup ke-mas
4560: 6b 20 6f 72 21 20 3f 3e 67 72 6f 75 70 73 20 20 k or! ?>groups
4570: 45 4c 53 45 20 20 64 72 6f 70 20 20 54 48 45 4e ELSE drop THEN
4580: 20 3b 0a 2b 6e 65 74 32 6f 3a 20 6b 65 79 67 72 ;.+net2o: keygr
4590: 6f 75 70 73 20 28 20 24 3a 67 72 6f 75 70 73 20 oups ( $:groups
45a0: 2d 2d 20 29 20 21 21 75 6e 73 69 67 6e 65 64 3f -- ) !!unsigned?
45b0: 20 24 32 30 20 21 21 3e 6f 72 64 65 72 3f 20 24 $20 !!>order? $
45c0: 3e 0a 20 20 20 20 5c 67 20 61 63 63 65 73 73 20 >. \g access
45d0: 67 72 6f 75 70 73 0a 20 20 20 20 31 20 69 6d 70 groups. 1 imp
45e0: 6f 72 74 2d 74 79 70 65 20 40 20 6c 73 68 69 66 ort-type @ lshif
45f0: 74 0a 20 20 20 20 5b 20 31 20 69 6d 70 6f 72 74 t. [ 1 import
4600: 23 73 65 6c 66 20 6c 73 68 69 66 74 20 31 20 69 #self lshift 1 i
4610: 6d 70 6f 72 74 23 6e 65 77 20 6c 73 68 69 66 74 mport#new lshift
4620: 20 6f 72 20 5d 4c 0a 20 20 20 20 61 6e 64 20 49 or ]L. and I
4630: 46 20 20 20 32 64 75 70 20 6b 65 2d 67 72 6f 75 F 2dup ke-grou
4640: 70 73 20 24 21 20 67 72 6f 75 70 73 3e 6d 61 73 ps $! groups>mas
4650: 6b 20 6b 65 2d 6d 61 73 6b 20 21 0a 20 20 20 20 k ke-mask !.
4660: 45 4c 53 45 20 20 32 64 72 6f 70 20 20 54 48 45 ELSE 2drop THE
4670: 4e 20 3b 0a 2b 6e 65 74 32 6f 3a 20 2b 6b 65 79 N ;.+net2o: +key
4680: 73 69 67 20 28 20 24 3a 73 74 72 69 6e 67 20 2d sig ( $:string -
4690: 2d 20 29 20 20 21 21 75 6e 73 69 67 6e 65 64 3f - ) !!unsigned?
46a0: 20 24 31 30 20 21 21 3e 3d 6f 72 64 65 72 3f 20 $10 !!>=order?
46b0: 24 3e 20 6b 65 2d 73 69 67 73 20 24 2b 5b 5d 21 $> ke-sigs $+[]!
46c0: 20 3b 0a 20 20 20 20 5c 67 20 61 64 64 20 61 20 ;. \g add a
46d0: 6b 65 79 20 73 69 67 6e 61 74 75 72 65 0a 2b 6e key signature.+n
46e0: 65 74 32 6f 3a 20 6b 65 79 69 6d 70 6f 72 74 20 et2o: keyimport
46f0: 28 20 6e 20 2d 2d 20 29 20 20 20 20 20 20 20 21 ( n -- ) !
4700: 21 75 6e 73 69 67 6e 65 64 3f 20 24 31 30 20 21 !unsigned? $10 !
4710: 21 3e 3d 6f 72 64 65 72 3f 0a 20 20 20 20 63 6f !>=order?. co
4720: 6e 66 69 67 3a 70 77 2d 6c 65 76 65 6c 23 20 40 nfig:pw-level# @
4730: 20 30 3c 20 49 46 20 20 36 34 3e 6e 0a 09 64 75 0< IF 64>n..du
4740: 70 20 5b 20 31 20 69 6d 70 6f 72 74 23 6e 65 77 p [ 1 import#new
4750: 20 6c 73 68 69 66 74 20 5d 4c 20 61 6e 64 20 30 lshift ]L and 0
4760: 3d 20 49 46 0a 09 20 20 20 20 69 6d 70 6f 72 74 = IF.. import
4770: 23 75 6e 74 72 75 73 74 65 64 20 75 6d 69 6e 20 #untrusted umin
4780: 31 20 73 77 61 70 20 6c 73 68 69 66 74 20 5b 20 1 swap lshift [
4790: 31 20 69 6d 70 6f 72 74 23 6e 65 77 20 6c 73 68 1 import#new lsh
47a0: 69 66 74 20 5d 4c 20 6f 72 0a 09 45 4c 53 45 0a ift ]L or..ELSE.
47b0: 09 20 20 20 20 5b 20 32 20 69 6d 70 6f 72 74 23 . [ 2 import#
47c0: 75 6e 74 72 75 73 74 65 64 20 6c 73 68 69 66 74 untrusted lshift
47d0: 20 31 2d 20 31 20 69 6d 70 6f 72 74 23 6e 65 77 1- 1 import#new
47e0: 20 6c 73 68 69 66 74 20 6f 72 20 5d 4c 20 61 6e lshift or ]L an
47f0: 64 0a 09 54 48 45 4e 0a 09 6b 65 2d 69 6d 70 6f d..THEN..ke-impo
4800: 72 74 73 20 6f 72 21 0a 20 20 20 20 45 4c 53 45 rts or!. ELSE
4810: 20 20 36 34 64 72 6f 70 20 20 54 48 45 4e 20 3b 64drop THEN ;
4820: 0a 2b 6e 65 74 32 6f 3a 20 72 73 6b 6b 65 79 20 .+net2o: rskkey
4830: 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d 2d 20 29 ( $:string --- )
4840: 0a 20 20 20 20 5c 67 20 72 65 76 6f 6b 65 20 6b . \g revoke k
4850: 65 79 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 ey, temporarily
4860: 73 74 6f 72 65 64 0a 20 20 20 20 5c 20 64 6f 65 stored. \ doe
4870: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 s not need to be
4880: 20 73 69 67 6e 65 64 2c 20 74 68 65 20 72 65 76 signed, the rev
4890: 6f 6b 65 20 6b 65 79 20 76 65 72 69 66 69 65 73 oke key verifies
48a0: 20 69 74 73 65 6c 66 0a 20 20 20 20 21 21 75 6e itself. !!un
48b0: 73 69 67 6e 65 64 3f 20 24 38 30 20 21 21 3e 3d signed? $80 !!>=
48c0: 6f 72 64 65 72 3f 0a 20 20 20 20 24 3e 20 32 64 order?. $> 2d
48d0: 75 70 20 73 6b 72 65 76 20 73 77 61 70 20 6b 65 up skrev swap ke
48e0: 79 7c 20 6d 6f 76 65 20 6b 65 2d 70 6b 20 24 40 y| move ke-pk $@
48f0: 20 64 72 6f 70 20 63 68 65 63 6b 2d 72 65 76 3f drop check-rev?
4900: 20 30 3d 20 21 21 6e 6f 74 2d 6d 79 2d 72 65 76 0= !!not-my-rev
4910: 73 6b 21 21 0a 20 20 20 20 70 6b 72 65 76 20 6b sk!!. pkrev k
4920: 65 79 73 69 7a 65 32 20 65 72 61 73 65 20 20 6b eysize2 erase k
4930: 65 2d 72 73 6b 20 73 65 63 21 20 3b 0a 2b 6e 65 e-rsk sec! ;.+ne
4940: 74 32 6f 3a 20 6b 65 79 70 65 74 20 28 20 24 3a t2o: keypet ( $:
4950: 73 74 72 69 6e 67 20 2d 2d 20 29 20 20 21 21 75 string -- ) !!u
4960: 6e 73 69 67 6e 65 64 3f 20 20 24 3e 0a 20 20 20 nsigned? $>.
4970: 20 63 6f 6e 66 69 67 3a 70 77 2d 6c 65 76 65 6c config:pw-level
4980: 23 20 40 20 30 3c 20 49 46 20 20 6b 65 2d 70 65 # @ 0< IF ke-pe
4990: 74 73 20 24 2b 5b 5d 21 20 70 65 74 21 20 20 45 ts $+[]! pet! E
49a0: 4c 53 45 20 20 32 64 72 6f 70 20 20 54 48 45 4e LSE 2drop THEN
49b0: 20 3b 0a 7d 73 63 6f 70 65 0a 0a 67 65 6e 2d 74 ;.}scope..gen-t
49c0: 61 62 6c 65 20 24 66 72 65 65 7a 65 0a 27 20 63 able $freeze.' c
49d0: 6f 6e 74 65 78 74 2d 74 61 62 6c 65 20 69 73 20 ontext-table is
49e0: 67 65 6e 2d 74 61 62 6c 65 0a 0a 3a 20 6b 65 79 gen-table..: key
49f0: 3a 6e 65 73 74 2d 73 69 67 20 28 20 61 64 64 72 :nest-sig ( addr
4a00: 20 75 20 2d 2d 20 61 64 64 72 20 75 27 20 66 6c u -- addr u' fl
4a10: 61 67 20 29 0a 20 20 20 20 70 6b 32 2d 73 69 67 ag ). pk2-sig
4a20: 3f 20 64 75 70 20 3f 45 58 49 54 20 64 72 6f 70 ? dup ?EXIT drop
4a30: 0a 20 20 20 20 32 64 75 70 20 2b 20 73 69 67 73 . 2dup + sigs
4a40: 69 7a 65 23 20 2d 20 73 69 67 73 69 7a 65 23 20 ize# - sigsize#
4a50: 3e 24 0a 20 20 20 20 73 69 67 70 6b 32 73 69 7a >$. sigpk2siz
4a60: 65 23 20 2d 20 32 64 75 70 20 2b 20 6b 65 79 73 e# - 2dup + keys
4a70: 69 7a 65 32 20 6b 65 79 3f 6e 65 77 20 6e 3a 3e ize2 key?new n:>
4a80: 6f 20 24 3e 20 6b 65 2d 73 65 6c 66 73 69 67 20 o $> ke-selfsig
4a90: 24 21 0a 20 20 20 20 73 69 6d 2d 6e 69 63 6b 21 $!. sim-nick!
4aa0: 20 6f 66 66 20 63 2d 73 74 61 74 65 20 6f 66 66 off c-state off
4ab0: 20 73 69 67 2d 6f 6b 20 3b 0a 27 20 6b 65 79 3a sig-ok ;.' key:
4ac0: 6e 65 73 74 2d 73 69 67 20 6b 65 79 2d 65 6e 74 nest-sig key-ent
4ad0: 72 79 20 74 6f 20 6e 65 73 74 2d 73 69 67 0a 0a ry to nest-sig..
4ae0: 73 61 6d 70 6c 65 2d 6b 65 79 20 3e 6f 20 6b 65 sample-key >o ke
4af0: 79 2d 65 6e 74 72 79 2d 74 61 62 6c 65 20 40 20 y-entry-table @
4b00: 74 6f 6b 65 6e 2d 74 61 62 6c 65 20 21 20 6f 3e token-table ! o>
4b10: 0a 0a 3a 20 6b 65 79 3a 63 6f 64 65 20 28 20 2d ..: key:code ( -
4b20: 2d 20 29 0a 20 20 20 20 63 6f 64 65 2d 6b 65 79 - ). code-key
4b30: 20 20 63 6d 64 6c 6f 63 6b 20 6c 6f 63 6b 0a 20 cmdlock lock.
4b40: 20 20 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 keypack keypa
4b50: 63 6b 2d 61 6c 6c 23 20 65 72 61 73 65 0a 20 20 ck-all# erase.
4b60: 20 20 63 6d 64 72 65 73 65 74 20 69 6e 69 74 2d cmdreset init-
4b70: 72 65 70 6c 79 20 61 6c 73 6f 20 6e 65 74 32 6f reply also net2o
4b80: 2d 62 61 73 65 20 3b 0a 63 6f 6d 70 3a 20 3a 2c -base ;.comp: :,
4b90: 20 61 6c 73 6f 20 6e 65 74 32 6f 2d 62 61 73 65 also net2o-base
4ba0: 20 3b 0a 0a 73 63 6f 70 65 7b 20 6e 65 74 32 6f ;..scope{ net2o
4bb0: 2d 62 61 73 65 0a 0a 3a 20 65 6e 64 3a 6b 65 79 -base..: end:key
4bc0: 20 28 20 2d 2d 20 29 0a 20 20 20 20 65 6e 64 2d ( -- ). end-
4bd0: 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 63 6d with previous cm
4be0: 64 6c 6f 63 6b 20 75 6e 6c 6f 63 6b 20 3b 0a 63 dlock unlock ;.c
4bf0: 6f 6d 70 3a 20 3a 2c 20 70 72 65 76 69 6f 75 73 omp: :, previous
4c00: 20 3b 0a 0a 7d 73 63 6f 70 65 0a 0a 3a 20 6b 65 ;..}scope..: ke
4c10: 79 2d 63 72 79 70 74 20 28 20 2d 2d 20 29 0a 20 y-crypt ( -- ).
4c20: 20 20 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 keypack keypa
4c30: 63 6b 2d 61 6c 6c 23 0a 20 20 20 20 3e 73 74 6f ck-all#. >sto
4c40: 72 65 6b 65 79 20 73 65 63 40 20 64 75 70 20 24 rekey sec@ dup $
4c50: 32 30 20 75 3c 3d 20 5c 20 69 73 20 61 20 73 65 20 u<= \ is a se
4c60: 63 72 65 74 2c 20 6e 6f 20 6e 65 65 64 20 74 6f cret, no need to
4c70: 20 62 65 20 73 6c 6f 77 0a 20 20 20 20 49 46 20 be slow. IF
4c80: 20 65 6e 63 72 79 70 74 24 20 20 45 4c 53 45 20 encrypt$ ELSE
4c90: 20 63 6f 6e 66 69 67 3a 70 77 2d 6c 65 76 65 6c config:pw-level
4ca0: 23 20 40 20 65 6e 63 72 79 70 74 2d 70 77 24 20 # @ encrypt-pw$
4cb0: 20 54 48 45 4e 20 3b 0a 0a 30 20 56 61 6c 75 65 THEN ;..0 Value
4cc0: 20 6b 65 79 2d 73 66 64 20 5c 20 73 65 63 72 65 key-sfd \ secre
4cd0: 74 20 6b 65 79 73 0a 30 20 56 61 6c 75 65 20 6b t keys.0 Value k
4ce0: 65 79 2d 70 66 64 20 5c 20 70 75 62 6b 65 79 73 ey-pfd \ pubkeys
4cf0: 0a 0a 5c 20 6c 65 67 61 63 79 20 66 6f 72 20 65 ..\ legacy for e
4d00: 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 arly versions of
4d10: 20 6e 65 74 32 6f 20 70 72 69 6f 72 20 32 30 31 net2o prior 201
4d20: 36 30 36 30 36 0a 0a 3a 20 6e 65 74 32 6f 3e 6b 60606..: net2o>k
4d30: 65 79 73 20 7b 20 61 64 64 72 20 75 20 2d 2d 20 eys { addr u --
4d40: 7d 0a 20 20 20 20 61 64 64 72 20 75 20 2e 6e 65 }. addr u .ne
4d50: 74 32 6f 2f 20 20 61 64 64 72 20 75 20 2e 6b 65 t2o/ addr u .ke
4d60: 79 73 2f 20 72 65 6e 61 6d 65 2d 66 69 6c 65 20 ys/ rename-file
4d70: 64 72 6f 70 20 3b 0a 3a 20 3f 6c 65 67 61 63 79 drop ;.: ?legacy
4d80: 2d 6b 65 79 73 20 28 20 66 6c 61 67 20 2d 2d 20 -keys ( flag --
4d90: 29 0a 20 20 20 20 5c 20 21 21 46 49 58 4d 45 21 ). \ !!FIXME!
4da0: 21 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 ! needs to be re
4db0: 6d 6f 76 65 64 20 77 68 65 6e 20 61 6c 6c 20 63 moved when all c
4dc0: 75 72 72 65 6e 74 20 75 73 65 72 73 0a 20 20 20 urrent users.
4dd0: 20 5c 20 68 61 76 65 20 6d 69 67 72 61 74 65 64 \ have migrated
4de0: 0a 20 20 20 20 49 46 0a 09 22 70 75 62 6b 65 79 . IF.."pubkey
4df0: 73 2e 6b 32 6f 22 20 6e 65 74 32 6f 3e 6b 65 79 s.k2o" net2o>key
4e00: 73 0a 09 22 73 65 63 6b 65 79 73 2e 6b 32 6f 22 s.."seckeys.k2o"
4e10: 20 6e 65 74 32 6f 3e 6b 65 79 73 0a 20 20 20 20 net2o>keys.
4e20: 54 48 45 4e 20 3b 0a 0a 3a 20 67 65 6e 2d 6b 65 THEN ;..: gen-ke
4e30: 79 73 2d 64 69 72 20 28 20 2d 2d 20 29 0a 20 20 ys-dir ( -- ).
4e40: 20 20 69 6e 69 74 2d 64 69 72 73 20 3f 2e 6e 65 init-dirs ?.ne
4e50: 74 32 6f 2f 6b 65 79 73 20 3f 6c 65 67 61 63 79 t2o/keys ?legacy
4e60: 2d 6b 65 79 73 20 3b 0a 0a 3a 20 3f 66 64 2d 6b -keys ;..: ?fd-k
4e70: 65 79 73 20 28 20 66 64 20 61 64 64 72 20 75 20 eys ( fd addr u
4e80: 2d 2d 20 66 64 27 20 29 20 7b 20 61 64 64 72 20 -- fd' ) { addr
4e90: 75 20 7d 20 64 75 70 20 3f 45 58 49 54 20 64 72 u } dup ?EXIT dr
4ea0: 6f 70 0a 20 20 20 20 67 65 6e 2d 6b 65 79 73 2d op. gen-keys-
4eb0: 64 69 72 0a 20 20 20 20 61 64 64 72 20 75 20 72 dir. addr u r
4ec0: 2f 77 20 6f 70 65 6e 2d 66 69 6c 65 20 64 75 70 /w open-file dup
4ed0: 20 6e 6f 2d 66 69 6c 65 23 20 3d 20 49 46 0a 09 no-file# = IF..
4ee0: 32 64 72 6f 70 20 61 64 64 72 20 75 20 72 2f 77 2drop addr u r/w
4ef0: 20 63 72 65 61 74 65 2d 66 69 6c 65 0a 20 20 20 create-file.
4f00: 20 54 48 45 4e 20 20 74 68 72 6f 77 20 3b 0a 0a THEN throw ;..
4f10: 3a 20 3f 6b 65 79 2d 73 66 64 20 28 20 2d 2d 20 : ?key-sfd ( --
4f20: 66 64 20 29 0a 20 20 20 20 6b 65 79 2d 73 66 64 fd ). key-sfd
4f30: 20 22 73 65 63 6b 65 79 73 2e 6b 32 6f 22 20 2e "seckeys.k2o" .
4f40: 6b 65 79 73 2f 20 3f 66 64 2d 6b 65 79 73 20 64 keys/ ?fd-keys d
4f50: 75 70 20 74 6f 20 6b 65 79 2d 73 66 64 20 3b 0a up to key-sfd ;.
4f60: 3a 20 3f 6b 65 79 2d 70 66 64 20 28 20 2d 2d 20 : ?key-pfd ( --
4f70: 66 64 20 29 0a 20 20 20 20 6b 65 79 2d 70 66 64 fd ). key-pfd
4f80: 20 22 70 75 62 6b 65 79 73 2e 6b 32 6f 22 20 2e "pubkeys.k2o" .
4f90: 6b 65 79 73 2f 20 3f 66 64 2d 6b 65 79 73 20 64 keys/ ?fd-keys d
4fa0: 75 70 20 74 6f 20 6b 65 79 2d 70 66 64 20 3b 0a up to key-pfd ;.
4fb0: 0a 3a 20 6b 65 79 3e 73 66 69 6c 65 20 28 20 2d .: key>sfile ( -
4fc0: 2d 20 29 0a 20 20 20 20 6b 65 79 70 61 63 6b 20 - ). keypack
4fd0: 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20 3f 6b 65 keypack-all# ?ke
4fe0: 79 2d 73 66 64 20 61 70 70 65 6e 64 2d 66 69 6c y-sfd append-fil
4ff0: 65 20 6b 65 2d 6f 66 66 73 65 74 20 36 34 21 20 e ke-offset 64!
5000: 3b 0a 3a 20 6b 65 79 3e 70 66 69 6c 65 20 28 20 ;.: key>pfile (
5010: 2d 2d 20 29 0a 20 20 20 20 6b 65 79 70 61 63 6b -- ). keypack
5020: 20 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20 3f 6b keypack-all# ?k
5030: 65 79 2d 70 66 64 20 61 70 70 65 6e 64 2d 66 69 ey-pfd append-fi
5040: 6c 65 20 6b 65 2d 6f 66 66 73 65 74 20 36 34 21 le ke-offset 64!
5050: 20 3b 0a 0a 3a 20 6b 65 79 3e 73 66 69 6c 65 40 ;..: key>sfile@
5060: 70 6f 73 20 28 20 36 34 70 6f 73 20 2d 2d 20 29 pos ( 64pos -- )
5070: 20 36 34 64 75 70 20 36 34 23 2d 31 20 36 34 3d 64dup 64#-1 64=
5080: 20 49 46 20 20 36 34 64 72 6f 70 20 6b 65 79 3e IF 64drop key>
5090: 73 66 69 6c 65 0a 20 20 20 20 45 4c 53 45 20 20 sfile. ELSE
50a0: 36 34 3e 72 20 6b 65 79 70 61 63 6b 20 6b 65 79 64>r keypack key
50b0: 70 61 63 6b 2d 61 6c 6c 23 20 36 34 72 3e 20 3f pack-all# 64r> ?
50c0: 6b 65 79 2d 73 66 64 20 77 72 69 74 65 40 70 6f key-sfd write@po
50d0: 73 2d 66 69 6c 65 20 20 54 48 45 4e 20 3b 0a 3a s-file THEN ;.:
50e0: 20 6b 65 79 3e 70 66 69 6c 65 40 70 6f 73 20 28 key>pfile@pos (
50f0: 20 36 34 70 6f 73 20 2d 2d 20 29 20 36 34 64 75 64pos -- ) 64du
5100: 70 20 36 34 23 2d 31 20 36 34 3d 20 49 46 20 20 p 64#-1 64= IF
5110: 36 34 64 72 6f 70 20 6b 65 79 3e 70 66 69 6c 65 64drop key>pfile
5120: 0a 20 20 20 20 45 4c 53 45 20 20 36 34 3e 72 20 . ELSE 64>r
5130: 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d keypack keypack-
5140: 61 6c 6c 23 20 36 34 72 3e 20 3f 6b 65 79 2d 70 all# 64r> ?key-p
5150: 66 64 20 77 72 69 74 65 40 70 6f 73 2d 66 69 6c fd write@pos-fil
5160: 65 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 72 6e 64 e THEN ;..: rnd
5170: 3e 73 66 69 6c 65 20 28 20 2d 2d 20 29 0a 20 20 >sfile ( -- ).
5180: 20 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63 keypack keypac
5190: 6b 2d 61 6c 6c 23 20 3e 72 6e 67 24 20 6b 65 79 k-all# >rng$ key
51a0: 3e 73 66 69 6c 65 20 3b 0a 3a 20 72 6e 64 3e 70 >sfile ;.: rnd>p
51b0: 66 69 6c 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 file ( -- ).
51c0: 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d keypack keypack-
51d0: 61 6c 6c 23 20 3e 72 6e 67 24 20 6b 65 79 3e 70 all# >rng$ key>p
51e0: 66 69 6c 65 20 3b 0a 0a 3a 20 3e 6b 65 79 73 20 file ;..: >keys
51f0: 28 20 2d 2d 20 29 0a 20 20 20 20 5c 47 20 61 64 ( -- ). \G ad
5200: 64 20 73 68 61 72 65 64 20 73 65 63 72 65 74 20 d shared secret
5210: 74 6f 20 6c 69 73 74 20 6f 66 20 70 6f 73 73 69 to list of possi
5220: 62 6c 65 20 6b 65 79 73 0a 20 20 20 20 73 6b 63 ble keys. skc
5230: 20 70 6b 63 20 6b 65 79 70 61 64 20 65 64 2d 64 pkc keypad ed-d
5240: 68 20 2b 6b 65 79 20 3b 0a 0a 5c 20 6b 65 79 20 h +key ;..\ key
5250: 67 65 6e 65 72 61 74 69 6f 6e 0a 5c 20 66 6f 72 generation.\ for
5260: 20 72 65 70 72 6f 64 75 63 69 62 69 6c 69 74 79 reproducibility
5270: 20 6f 66 20 74 68 65 20 73 65 6c 66 73 69 67 2c of the selfsig,
5280: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 always use the
5290: 73 61 6d 65 20 6f 72 64 65 72 3a 0a 5c 20 22 70 same order:.\ "p
52a0: 75 62 6b 65 79 22 20 6e 65 77 6b 65 79 20 3c 6e ubkey" newkey <n
52b0: 3e 20 6b 65 79 74 79 70 65 20 22 6e 69 63 6b 22 > keytype "nick"
52c0: 20 6b 65 79 6e 69 63 6b 20 22 73 69 67 22 20 6b keynick "sig" k
52d0: 65 79 73 65 6c 66 73 69 67 0a 0a 55 73 65 72 20 eyselfsig..User
52e0: 70 6b 2b 73 69 67 24 0a 0a 6b 65 79 73 69 7a 65 pk+sig$..keysize
52f0: 32 20 43 6f 6e 73 74 61 6e 74 20 70 6b 72 6b 23 2 Constant pkrk#
5300: 0a 0a 3a 20 5d 70 6b 2b 73 69 67 6e 20 28 20 61 ..: ]pk+sign ( a
5310: 64 64 72 20 75 20 2d 2d 20 29 20 2b 63 6d 64 62 ddr u -- ) +cmdb
5320: 75 66 20 5d 73 69 67 6e 20 3b 0a 0a 3a 20 70 61 uf ]sign ;..: pa
5330: 63 6b 2d 6b 65 79 20 28 20 74 79 70 65 20 6e 69 ck-key ( type ni
5340: 63 6b 20 75 20 2d 2d 20 29 0a 20 20 20 20 6e 6f ck u -- ). no
5350: 77 3e 6e 65 76 65 72 0a 20 20 20 20 6b 65 79 3a w>never. key:
5360: 63 6f 64 65 0a 20 20 20 20 20 20 73 69 67 6e 5b code. sign[
5370: 0a 20 20 20 20 20 20 72 6f 74 20 75 6c 69 74 2c . rot ulit,
5380: 20 6b 65 79 74 79 70 65 20 24 2c 20 6b 65 79 6e keytype $, keyn
5390: 69 63 6b 0a 20 20 20 20 20 20 70 6b 63 20 70 6b ick. pkc pk
53a0: 72 6b 23 20 5d 70 6b 2b 73 69 67 6e 0a 20 20 20 rk# ]pk+sign.
53b0: 20 20 20 73 6b 63 20 6b 65 79 73 69 7a 65 20 73 skc keysize s
53c0: 65 63 24 2c 20 70 72 69 76 6b 65 79 0a 20 20 20 ec$, privkey.
53d0: 20 65 6e 64 3a 6b 65 79 20 3b 0a 0a 61 6c 73 6f end:key ;..also
53e0: 20 6e 65 74 32 6f 2d 62 61 73 65 0a 3a 20 70 61 net2o-base.: pa
53f0: 63 6b 2d 63 6f 72 65 20 28 20 6f 3a 6b 65 79 20 ck-core ( o:key
5400: 2d 2d 20 29 20 5c 20 63 6f 72 65 20 77 69 74 68 -- ) \ core with
5410: 6f 75 74 20 6b 65 79 0a 20 20 20 20 6b 65 2d 74 out key. ke-t
5420: 79 70 65 20 40 20 75 6c 69 74 2c 20 6b 65 79 74 ype @ ulit, keyt
5430: 79 70 65 0a 20 20 20 20 6b 65 2d 6e 69 63 6b 20 ype. ke-nick
5440: 24 40 20 24 2c 20 6b 65 79 6e 69 63 6b 0a 20 20 $@ $, keynick.
5450: 20 20 6b 65 2d 70 72 6f 66 20 24 40 20 64 75 70 ke-prof $@ dup
5460: 20 49 46 20 20 24 2c 20 6b 65 79 70 72 6f 66 69 IF $, keyprofi
5470: 6c 65 20 20 45 4c 53 45 20 20 32 64 72 6f 70 20 le ELSE 2drop
5480: 20 54 48 45 4e 20 3b 0a 0a 3a 20 70 61 63 6b 2d THEN ;..: pack-
5490: 73 69 67 6e 6b 65 79 20 28 20 6f 3a 6b 65 79 20 signkey ( o:key
54a0: 2d 2d 20 29 0a 20 20 20 20 73 69 67 6e 5b 0a 20 -- ). sign[.
54b0: 20 20 20 70 61 63 6b 2d 63 6f 72 65 0a 20 20 20 pack-core.
54c0: 20 6b 65 2d 70 6b 20 24 40 20 2b 63 6d 64 62 75 ke-pk $@ +cmdbu
54d0: 66 0a 20 20 20 20 6b 65 2d 73 65 6c 66 73 69 67 f. ke-selfsig
54e0: 20 24 40 20 2b 63 6d 64 62 75 66 20 63 6d 64 2d $@ +cmdbuf cmd-
54f0: 72 65 73 6f 6c 76 65 3e 20 32 64 72 6f 70 20 6e resolve> 2drop n
5500: 65 73 74 73 69 67 20 3b 0a 0a 3a 20 70 61 63 6b estsig ;..: pack
5510: 2d 63 6f 72 65 6b 65 79 20 28 20 6f 3a 6b 65 79 -corekey ( o:key
5520: 20 2d 2d 20 29 0a 20 20 20 20 70 61 63 6b 2d 73 -- ). pack-s
5530: 69 67 6e 6b 65 79 0a 20 20 20 20 6b 65 2d 69 6d ignkey. ke-im
5540: 70 6f 72 74 73 20 40 20 75 6c 69 74 2c 20 6b 65 ports @ ulit, ke
5550: 79 69 6d 70 6f 72 74 0a 20 20 20 20 6b 65 2d 6d yimport. ke-m
5560: 61 73 6b 20 40 20 20 6b 65 2d 67 72 6f 75 70 73 ask @ ke-groups
5570: 20 24 40 6c 65 6e 20 49 46 0a 09 6b 65 2d 67 72 $@len IF..ke-gr
5580: 6f 75 70 73 20 24 40 20 32 64 75 70 20 24 2c 20 oups $@ 2dup $,
5590: 6b 65 79 67 72 6f 75 70 73 0a 09 67 72 6f 75 70 keygroups..group
55a0: 73 3e 6d 61 73 6b 20 69 6e 76 65 72 74 20 61 6e s>mask invert an
55b0: 64 20 20 54 48 45 4e 0a 20 20 20 20 3f 64 75 70 d THEN. ?dup
55c0: 2d 49 46 20 20 6e 6c 69 74 2c 20 6b 65 79 6d 61 -IF nlit, keyma
55d0: 73 6b 20 20 54 48 45 4e 0a 20 20 20 20 6b 65 2d sk THEN. ke-
55e0: 70 65 74 73 20 5b 3a 20 24 2c 20 6b 65 79 70 65 pets [: $, keype
55f0: 74 20 3b 5d 20 24 5b 5d 6d 61 70 0a 20 20 20 20 t ;] $[]map.
5600: 6b 65 2d 73 74 6f 72 65 6b 65 79 20 40 20 3e 73 ke-storekey @ >s
5610: 74 6f 72 65 6b 65 79 20 21 20 3b 0a 70 72 65 76 torekey ! ;.prev
5620: 69 6f 75 73 0a 0a 3a 20 70 61 63 6b 2d 70 75 62 ious..: pack-pub
5630: 6b 65 79 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 29 key ( o:key -- )
5640: 0a 20 20 20 20 6b 65 79 3a 63 6f 64 65 0a 20 20 . key:code.
5650: 20 20 20 20 70 61 63 6b 2d 63 6f 72 65 6b 65 79 pack-corekey
5660: 0a 20 20 20 20 65 6e 64 3a 6b 65 79 20 3b 0a 3a . end:key ;.:
5670: 20 70 61 63 6b 2d 6f 75 74 6b 65 79 20 28 20 6f pack-outkey ( o
5680: 3a 6b 65 79 20 2d 2d 20 29 0a 20 20 20 20 6b 65 :key -- ). ke
5690: 79 3a 63 6f 64 65 0a 20 20 20 20 20 20 22 6e 32 y:code. "n2
56a0: 6f 22 20 6e 65 74 32 6f 2d 62 61 73 65 3a 34 63 o" net2o-base:4c
56b0: 63 2c 0a 20 20 20 20 20 20 70 61 63 6b 2d 73 69 c,. pack-si
56c0: 67 6e 6b 65 79 0a 20 20 20 20 65 6e 64 3a 6b 65 gnkey. end:ke
56d0: 79 20 3b 0a 3a 20 70 61 63 6b 2d 73 65 63 6b 65 y ;.: pack-secke
56e0: 79 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 29 0a 20 y ( o:key -- ).
56f0: 20 20 20 6b 65 79 3a 63 6f 64 65 0a 20 20 20 20 key:code.
5700: 20 20 70 61 63 6b 2d 63 6f 72 65 6b 65 79 0a 20 pack-corekey.
5710: 20 20 20 20 20 6b 65 2d 73 6b 20 73 65 63 40 20 ke-sk sec@
5720: 73 65 63 24 2c 20 70 72 69 76 6b 65 79 0a 20 20 sec$, privkey.
5730: 20 20 20 20 6b 65 2d 72 73 6b 20 73 65 63 40 20 ke-rsk sec@
5740: 64 75 70 20 49 46 20 20 73 65 63 24 2c 20 72 73 dup IF sec$, rs
5750: 6b 6b 65 79 20 20 45 4c 53 45 20 20 32 64 72 6f kkey ELSE 2dro
5760: 70 20 20 54 48 45 4e 0a 20 20 20 20 65 6e 64 3a p THEN. end:
5770: 6b 65 79 20 3b 0a 3a 20 6b 65 79 6e 69 63 6b 24 key ;.: keynick$
5780: 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 61 64 64 72 ( o:key -- addr
5790: 20 75 20 29 0a 20 20 20 20 5c 47 20 67 65 74 20 u ). \G get
57a0: 74 68 65 20 61 6e 6e 6f 74 61 74 69 6f 6e 73 20 the annotations
57b0: 77 69 74 68 20 73 69 67 6e 61 74 75 72 65 0a 20 with signature.
57c0: 20 20 20 5b 27 5d 20 70 61 63 6b 2d 63 6f 72 65 ['] pack-core
57d0: 20 67 65 6e 2d 63 6d 64 24 20 32 64 72 6f 70 0a gen-cmd$ 2drop.
57e0: 20 20 20 20 6b 65 2d 73 65 6c 66 73 69 67 20 24 ke-selfsig $
57f0: 40 20 74 6d 70 24 20 24 2b 21 20 74 6d 70 24 20 @ tmp$ $+! tmp$
5800: 24 40 20 3b 0a 3a 20 6b 65 79 70 6b 32 6e 69 63 $@ ;.: keypk2nic
5810: 6b 24 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 61 64 k$ ( o:key -- ad
5820: 64 72 20 75 20 29 0a 20 20 20 20 5c 47 20 67 65 dr u ). \G ge
5830: 74 20 74 68 65 20 61 6e 6e 6f 74 61 74 69 6f 6e t the annotation
5840: 73 20 77 69 74 68 20 73 69 67 6e 61 74 75 72 65 s with signature
5850: 0a 20 20 20 20 5b 27 5d 20 70 61 63 6b 2d 63 6f . ['] pack-co
5860: 72 65 20 67 65 6e 2d 63 6d 64 24 20 32 64 72 6f re gen-cmd$ 2dro
5870: 70 0a 20 20 20 20 6b 65 2d 70 6b 20 24 40 20 74 p. ke-pk $@ t
5880: 6d 70 24 20 24 2b 21 20 6b 65 2d 73 65 6c 66 73 mp$ $+! ke-selfs
5890: 69 67 20 24 40 20 74 6d 70 24 20 24 2b 21 20 74 ig $@ tmp$ $+! t
58a0: 6d 70 24 20 24 40 20 3b 0a 3a 20 6d 79 6e 69 63 mp$ $@ ;.: mynic
58b0: 6b 2d 6b 65 79 20 28 20 2d 2d 20 6f 20 29 0a 20 k-key ( -- o ).
58c0: 20 20 20 70 6b 63 20 6b 65 79 73 69 7a 65 20 6b pkc keysize k
58d0: 65 79 23 20 23 40 20 64 72 6f 70 20 63 65 6c 6c ey# #@ drop cell
58e0: 2b 20 3b 0a 3a 20 6d 79 6e 69 63 6b 24 20 28 20 + ;.: mynick$ (
58f0: 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20 20 20 -- addr u ).
5900: 5c 47 20 67 65 74 20 6d 79 20 6e 69 63 6b 20 77 \G get my nick w
5910: 69 74 68 20 73 69 67 6e 61 74 75 72 65 0a 20 20 ith signature.
5920: 20 20 6d 79 6e 69 63 6b 2d 6b 65 79 20 2e 6b 65 mynick-key .ke
5930: 79 6e 69 63 6b 24 20 3b 0a 3a 20 6d 79 70 6b 32 ynick$ ;.: mypk2
5940: 6e 69 63 6b 24 20 28 20 6f 3a 6b 65 79 20 2d 2d nick$ ( o:key --
5950: 20 61 64 64 72 20 75 20 29 0a 20 20 20 20 5c 47 addr u ). \G
5960: 20 67 65 74 20 6d 79 20 6e 69 63 6b 20 77 69 74 get my nick wit
5970: 68 20 73 69 67 6e 61 74 75 72 65 0a 20 20 20 20 h signature.
5980: 6d 79 6e 69 63 6b 2d 6b 65 79 20 2e 6b 65 79 70 mynick-key .keyp
5990: 6b 32 6e 69 63 6b 24 20 3b 0a 3a 20 6b 65 79 2d k2nick$ ;.: key-
59a0: 73 69 67 6e 20 28 20 6f 3a 6b 65 79 20 2d 2d 20 sign ( o:key --
59b0: 6f 3a 6b 65 79 20 29 0a 20 20 20 20 5b 27 5d 20 o:key ). [']
59c0: 70 61 63 6b 2d 63 6f 72 65 20 67 65 6e 2d 63 6d pack-core gen-cm
59d0: 64 24 0a 20 20 20 20 5b 3a 20 74 79 70 65 20 6b d$. [: type k
59e0: 65 2d 70 6b 20 24 40 20 74 79 70 65 20 3b 5d 20 e-pk $@ type ;]
59f0: 24 74 6d 70 0a 20 20 20 20 6e 6f 77 3e 6e 65 76 $tmp. now>nev
5a00: 65 72 20 63 3a 30 6b 65 79 20 63 3a 68 61 73 68 er c:0key c:hash
5a10: 20 5b 27 5d 20 2e 73 69 67 20 24 74 6d 70 20 6b ['] .sig $tmp k
5a20: 65 2d 73 65 6c 66 73 69 67 20 24 21 20 3b 0a 0a e-selfsig $! ;..
5a30: 56 61 72 69 61 62 6c 65 20 63 70 2d 74 6d 70 0a Variable cp-tmp.
5a40: 0a 3a 20 73 61 76 65 2d 70 75 62 6b 65 79 73 20 .: save-pubkeys
5a50: 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 2d 70 ( -- ). key-p
5a60: 66 64 20 3f 64 75 70 2d 49 46 20 20 63 6c 6f 73 fd ?dup-IF clos
5a70: 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 20 54 48 e-file throw TH
5a80: 45 4e 0a 20 20 20 20 22 70 75 62 6b 65 79 73 2e EN. "pubkeys.
5a90: 6b 32 6f 22 20 2e 6b 65 79 73 2f 20 5b 3a 20 74 k2o" .keys/ [: t
5aa0: 6f 20 6b 65 79 2d 70 66 64 0a 20 20 20 20 20 20 o key-pfd.
5ab0: 6b 65 79 23 20 5b 3a 20 63 65 6c 6c 2b 20 24 40 key# [: cell+ $@
5ac0: 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e 6f 0a 09 drop cell+ >o..
5ad0: 6b 65 2d 73 6b 20 73 65 63 40 20 64 30 3d 20 49 ke-sk sec@ d0= I
5ae0: 46 20 20 70 61 63 6b 2d 70 75 62 6b 65 79 0a 09 F pack-pubkey..
5af0: 20 20 20 20 66 6c 75 73 68 28 20 2e 22 20 73 61 flush( ." sa
5b00: 76 69 6e 67 20 22 20 2e 6e 69 63 6b 20 66 6f 72 ving " .nick for
5b10: 74 68 3a 63 72 20 29 0a 09 20 20 20 20 6b 65 79 th:cr ).. key
5b20: 2d 63 72 79 70 74 20 6b 65 2d 6f 66 66 73 65 74 -crypt ke-offset
5b30: 20 36 34 40 20 6b 65 79 3e 70 66 69 6c 65 40 70 64@ key>pfile@p
5b40: 6f 73 0a 09 54 48 45 4e 20 6f 3e 20 3b 5d 20 23 os..THEN o> ;] #
5b50: 6d 61 70 0a 20 20 20 20 30 20 74 6f 20 6b 65 79 map. 0 to key
5b60: 2d 70 66 64 20 3b 5d 20 73 61 76 65 2d 66 69 6c -pfd ;] save-fil
5b70: 65 20 20 3f 6b 65 79 2d 70 66 64 20 64 72 6f 70 e ?key-pfd drop
5b80: 20 3b 0a 0a 3a 20 73 61 76 65 2d 73 65 63 6b 65 ;..: save-secke
5b90: 79 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65 ys ( -- ). ke
5ba0: 79 2d 73 66 64 20 3f 64 75 70 2d 49 46 20 20 63 y-sfd ?dup-IF c
5bb0: 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 lose-file throw
5bc0: 20 54 48 45 4e 0a 20 20 20 20 22 73 65 63 6b 65 THEN. "secke
5bd0: 79 73 2e 6b 32 6f 22 20 2e 6b 65 79 73 2f 20 5b ys.k2o" .keys/ [
5be0: 3a 20 74 6f 20 6b 65 79 2d 73 66 64 0a 20 20 20 : to key-sfd.
5bf0: 20 20 20 6b 65 79 23 20 5b 3a 20 63 65 6c 6c 2b key# [: cell+
5c00: 20 24 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 3e $@ drop cell+ >
5c10: 6f 0a 09 6b 65 2d 73 6b 20 73 65 63 40 20 64 30 o..ke-sk sec@ d0
5c20: 3c 3e 20 49 46 20 20 70 61 63 6b 2d 73 65 63 6b <> IF pack-seck
5c30: 65 79 0a 09 20 20 20 20 63 6f 6e 66 69 67 3a 70 ey.. config:p
5c40: 77 2d 6c 65 76 65 6c 23 20 40 20 3e 72 20 20 6b w-level# @ >r k
5c50: 65 2d 70 77 6c 65 76 65 6c 20 40 20 63 6f 6e 66 e-pwlevel @ conf
5c60: 69 67 3a 70 77 2d 6c 65 76 65 6c 23 20 21 0a 09 ig:pw-level# !..
5c70: 20 20 20 20 6b 65 79 2d 63 72 79 70 74 20 6b 65 key-crypt ke
5c80: 2d 6f 66 66 73 65 74 20 36 34 40 20 6b 65 79 3e -offset 64@ key>
5c90: 73 66 69 6c 65 40 70 6f 73 0a 09 20 20 20 20 72 sfile@pos.. r
5ca0: 3e 20 63 6f 6e 66 69 67 3a 70 77 2d 6c 65 76 65 > config:pw-leve
5cb0: 6c 23 20 21 0a 09 54 48 45 4e 20 6f 3e 20 3b 5d l# !..THEN o> ;]
5cc0: 20 23 6d 61 70 0a 20 20 20 20 30 20 74 6f 20 6b #map. 0 to k
5cd0: 65 79 2d 73 66 64 20 3b 5d 20 73 61 76 65 2d 66 ey-sfd ;] save-f
5ce0: 69 6c 65 20 20 3f 6b 65 79 2d 73 66 64 20 64 72 ile ?key-sfd dr
5cf0: 6f 70 20 3b 0a 0a 3a 20 73 61 76 65 2d 6b 65 79 op ;..: save-key
5d00: 73 20 28 20 2d 2d 20 29 20 20 3f 2e 6e 65 74 32 s ( -- ) ?.net2
5d10: 6f 2f 6b 65 79 73 0a 20 20 20 20 73 61 76 65 2d o/keys. save-
5d20: 70 75 62 6b 65 79 73 20 73 61 76 65 2d 73 65 63 pubkeys save-sec
5d30: 6b 65 79 73 20 3b 0a 0a 3a 20 2b 67 65 6e 2d 6b keys ;..: +gen-k
5d40: 65 79 73 20 28 20 6e 69 63 6b 20 75 20 74 79 70 eys ( nick u typ
5d50: 65 20 2d 2d 20 29 0a 20 20 20 20 67 65 6e 2d 6b e -- ). gen-k
5d60: 65 79 73 20 20 36 34 23 2d 31 20 6b 65 79 2d 72 eys 64#-1 key-r
5d70: 65 61 64 2d 6f 66 66 73 65 74 20 36 34 21 20 20 ead-offset 64!
5d80: 70 6b 63 20 6b 65 79 73 69 7a 65 32 20 6b 65 79 pkc keysize2 key
5d90: 3a 6e 65 77 20 3e 6f 0a 20 20 20 20 5b 20 31 20 :new >o. [ 1
5da0: 69 6d 70 6f 72 74 23 73 65 6c 66 20 6c 73 68 69 import#self lshi
5db0: 66 74 20 31 20 69 6d 70 6f 72 74 23 6e 65 77 20 ft 1 import#new
5dc0: 6c 73 68 69 66 74 20 6f 72 20 5d 4c 20 6b 65 2d lshift or ]L ke-
5dd0: 69 6d 70 6f 72 74 73 20 21 0a 20 20 20 20 6b 65 imports !. ke
5de0: 2d 74 79 70 65 20 21 20 20 6b 65 2d 6e 69 63 6b -type ! ke-nick
5df0: 20 24 21 20 20 6e 69 63 6b 21 0a 20 20 20 20 63 $! nick!. c
5e00: 6f 6e 66 69 67 3a 70 77 2d 6c 65 76 65 6c 23 20 onfig:pw-level#
5e10: 40 20 6b 65 2d 70 77 6c 65 76 65 6c 20 21 20 20 @ ke-pwlevel !
5e20: 70 65 72 6d 25 6d 79 73 65 6c 66 20 6b 65 2d 6d perm%myself ke-m
5e30: 61 73 6b 20 21 0a 20 20 20 20 73 6b 63 20 6b 65 ask !. skc ke
5e40: 79 73 69 7a 65 20 6b 65 2d 73 6b 20 73 65 63 21 ysize ke-sk sec!
5e50: 20 20 2b 73 65 63 6b 65 79 0a 20 20 20 20 73 6b +seckey. sk
5e60: 72 65 76 20 6b 65 79 73 69 7a 65 20 6b 65 2d 72 rev keysize ke-r
5e70: 73 6b 20 73 65 63 21 0a 20 20 20 20 6b 65 79 2d sk sec!. key-
5e80: 73 69 67 6e 20 6f 3e 20 3b 0a 0a 24 34 30 20 62 sign o> ;..$40 b
5e90: 75 66 66 65 72 3a 20 6e 69 63 6b 2d 62 75 66 0a uffer: nick-buf.
5ea0: 0a 3a 20 67 65 74 2d 6e 69 63 6b 20 28 20 2d 2d .: get-nick ( --
5eb0: 20 61 64 64 72 20 75 20 29 0a 20 20 20 20 2e 22 addr u ). ."
5ec0: 20 6e 69 63 6b 3a 20 22 20 6e 69 63 6b 2d 62 75 nick: " nick-bu
5ed0: 66 20 24 34 30 20 61 63 63 65 70 74 20 6e 69 63 f $40 accept nic
5ee0: 6b 2d 62 75 66 20 73 77 61 70 20 2d 74 72 61 69 k-buf swap -trai
5ef0: 6c 69 6e 67 20 63 72 20 3b 0a 0a 66 61 6c 73 65 ling cr ;..false
5f00: 20 76 61 6c 75 65 20 3f 79 65 73 0a 3a 20 79 65 value ?yes.: ye
5f10: 73 3f 20 28 20 61 64 64 72 20 75 20 2d 2d 20 66 s? ( addr u -- f
5f20: 6c 61 67 20 29 0a 20 20 20 20 3f 79 65 73 20 49 lag ). ?yes I
5f30: 46 20 20 32 64 72 6f 70 20 74 72 75 65 20 20 45 F 2drop true E
5f40: 4c 53 45 20 20 74 79 70 65 20 2e 22 20 20 28 79 LSE type ." (y
5f50: 2f 4e 29 22 20 6b 65 79 20 63 72 20 27 79 27 20 /N)" key cr 'y'
5f60: 3d 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 3f 72 73 = THEN ;..: ?rs
5f70: 6b 20 28 20 2d 2d 20 29 0a 20 20 20 20 70 6b 63 k ( -- ). pkc
5f80: 20 6b 65 79 73 69 7a 65 20 6b 65 79 2d 65 78 69 keysize key-exi
5f90: 73 74 3f 20 64 75 70 20 30 3d 20 49 46 20 20 64 st? dup 0= IF d
5fa0: 72 6f 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a rop EXIT THEN.
5fb0: 20 20 20 20 3e 6f 20 6b 65 2d 72 73 6b 20 73 65 >o ke-rsk se
5fc0: 63 40 20 64 75 70 20 30 3d 20 49 46 20 20 32 64 c@ dup 0= IF 2d
5fd0: 72 6f 70 20 6f 3e 20 20 45 58 49 54 20 20 54 48 rop o> EXIT TH
5fe0: 45 4e 0a 20 20 20 20 2e 22 20 59 6f 75 20 73 74 EN. ." You st
5ff0: 69 6c 6c 20 68 61 76 65 6e 27 74 20 73 74 6f 72 ill haven't stor
6000: 65 64 20 79 6f 75 72 20 72 65 76 6f 6b 65 20 6b ed your revoke k
6010: 65 79 20 73 65 63 75 72 65 6c 79 20 6f 66 66 2d ey securely off-
6020: 6c 69 6e 65 2e 22 20 63 72 0a 20 20 20 20 73 22 line." cr. s"
6030: 20 50 61 70 65 72 20 61 6e 64 20 70 65 6e 63 69 Paper and penci
6040: 6c 20 72 65 61 64 79 3f 22 20 79 65 73 3f 20 49 l ready?" yes? I
6050: 46 0a 09 2e 73 74 72 69 70 65 38 35 0a 09 73 22 F...stripe85..s"
6060: 20 57 72 69 74 74 65 6e 20 64 6f 77 6e 3f 22 20 Written down?"
6070: 79 65 73 3f 20 49 46 0a 09 20 20 20 20 73 22 20 yes? IF.. s"
6080: 59 6f 75 20 77 6f 6e 27 74 20 73 65 65 20 74 68 You won't see th
6090: 69 73 20 61 67 61 69 6e 21 20 44 65 6c 65 74 65 is again! Delete
60a0: 3f 22 20 79 65 73 3f 0a 09 20 20 20 20 49 46 20 ?" yes?.. IF
60b0: 6b 65 2d 72 73 6b 20 73 65 63 2d 6f 66 66 20 20 ke-rsk sec-off
60c0: 73 61 76 65 2d 6b 65 79 73 0a 09 09 2e 22 20 72 save-keys...." r
60d0: 65 76 6f 6b 65 20 6b 65 79 20 64 65 6c 65 74 65 evoke key delete
60e0: 64 2e 22 20 63 72 20 6f 3e 20 20 45 58 49 54 20 d." cr o> EXIT
60f0: 20 54 48 45 4e 20 20 54 48 45 4e 0a 20 20 20 20 THEN THEN.
6100: 45 4c 53 45 20 20 32 64 72 6f 70 20 20 54 48 45 ELSE 2drop THE
6110: 4e 0a 20 20 20 20 2e 22 20 49 27 6d 20 6b 65 65 N. ." I'm kee
6120: 70 69 6e 67 20 79 6f 75 72 20 72 65 76 6f 6b 65 ping your revoke
6130: 20 6b 65 79 2e 20 20 54 68 69 73 20 77 69 6c 6c key. This will
6140: 20 73 68 6f 77 20 75 70 20 61 67 61 69 6e 2e 22 show up again."
6150: 20 63 72 20 6f 3e 20 3b 0a 0a 5c 20 72 65 61 64 cr o> ;..\ read
6160: 20 6b 65 79 20 66 69 6c 65 0a 0a 3a 20 74 72 79 key file..: try
6170: 2d 64 65 63 72 79 70 74 2d 6b 65 79 20 28 20 6b -decrypt-key ( k
6180: 65 79 20 75 31 20 2d 2d 20 61 64 64 72 20 75 32 ey u1 -- addr u2
6190: 20 66 6c 61 67 20 29 0a 20 20 20 20 6b 65 79 70 flag ). keyp
61a0: 61 63 6b 20 6b 65 79 70 61 63 6b 2d 64 20 6b 65 ack keypack-d ke
61b0: 79 70 61 63 6b 2d 61 6c 6c 23 20 6d 6f 76 65 0a ypack-all# move.
61c0: 20 20 20 20 6b 65 79 70 61 63 6b 2d 64 20 6b 65 keypack-d ke
61d0: 79 70 61 63 6b 2d 61 6c 6c 23 20 32 73 77 61 70 ypack-all# 2swap
61e0: 0a 20 20 20 20 64 75 70 20 24 32 30 20 3d 20 49 . dup $20 = I
61f0: 46 20 20 64 65 63 72 79 70 74 24 20 20 45 4c 53 F decrypt$ ELS
6200: 45 0a 09 6b 65 79 70 61 63 6b 20 63 40 20 24 46 E..keypack c@ $F
6210: 20 61 6e 64 20 63 6f 6e 66 69 67 3a 70 77 2d 6d and config:pw-m
6220: 61 78 6c 65 76 65 6c 23 20 40 20 3c 3d 0a 09 49 axlevel# @ <=..I
6230: 46 20 20 64 65 63 72 79 70 74 2d 70 77 24 20 20 F decrypt-pw$
6240: 45 4c 53 45 20 20 32 64 72 6f 70 20 66 61 6c 73 ELSE 2drop fals
6250: 65 20 20 54 48 45 4e 0a 20 20 20 20 54 48 45 4e e THEN. THEN
6260: 20 3b 0a 0a 3a 20 74 72 79 2d 64 65 63 72 79 70 ;..: try-decryp
6270: 74 20 28 20 66 6c 61 67 20 2d 2d 20 61 64 64 72 t ( flag -- addr
6280: 20 75 20 2f 20 30 20 30 20 29 20 7b 20 66 6c 61 u / 0 0 ) { fla
6290: 67 20 7d 0a 20 20 20 20 6b 65 79 73 20 24 5b 5d g }. keys $[]
62a0: 23 20 30 20 3f 44 4f 0a 09 49 20 6b 65 79 73 20 # 0 ?DO..I keys
62b0: 73 65 63 5b 5d 40 20 64 75 70 20 6b 65 79 73 69 sec[]@ dup keysi
62c0: 7a 65 20 3d 20 66 6c 61 67 20 78 6f 72 20 49 46 ze = flag xor IF
62d0: 0a 09 20 20 20 20 74 72 79 2d 64 65 63 72 79 70 .. try-decryp
62e0: 74 2d 6b 65 79 20 49 46 0a 09 09 49 20 6b 65 79 t-key IF...I key
62f0: 73 20 24 5b 5d 20 40 20 64 75 70 20 3e 73 74 6f s $[] @ dup >sto
6300: 72 65 6b 65 79 20 21 20 64 65 66 61 75 6c 74 6b rekey ! defaultk
6310: 65 79 20 21 0a 09 09 75 6e 6c 6f 6f 70 20 20 45 ey !...unloop E
6320: 58 49 54 20 20 54 48 45 4e 20 20 54 48 45 4e 0a XIT THEN THEN.
6330: 09 32 64 72 6f 70 0a 20 20 20 20 4c 4f 4f 50 20 .2drop. LOOP
6340: 20 30 20 30 20 3b 0a 0a 3a 20 3f 70 65 72 6d 20 0 0 ;..: ?perm
6350: 28 20 6f 3a 6b 65 79 20 2d 2d 20 29 0a 20 20 20 ( o:key -- ).
6360: 20 6b 65 2d 73 6b 20 73 65 63 40 20 6e 69 70 20 ke-sk sec@ nip
6370: 49 46 20 20 70 65 72 6d 25 6d 79 73 65 6c 66 20 IF perm%myself
6380: 20 45 4c 53 45 20 20 70 65 72 6d 25 64 65 66 61 ELSE perm%defa
6390: 75 6c 74 20 20 54 48 45 4e 20 20 6b 65 2d 6d 61 ult THEN ke-ma
63a0: 73 6b 20 21 20 3b 0a 0a 3a 20 64 6f 2d 6b 65 79 sk ! ;..: do-key
63b0: 20 28 20 61 64 64 72 20 75 20 2f 20 30 20 30 20 ( addr u / 0 0
63c0: 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 20 30 3d -- ). dup 0=
63d0: 20 49 46 20 20 32 64 72 6f 70 20 20 45 58 49 54 IF 2drop EXIT
63e0: 20 20 54 48 45 4e 0a 20 20 20 20 73 61 6d 70 6c THEN. sampl
63f0: 65 2d 6b 65 79 20 3e 6f 20 6b 65 2d 73 6b 20 6b e-key >o ke-sk k
6400: 65 2d 65 6e 64 20 6f 76 65 72 20 2d 20 65 72 61 e-end over - era
6410: 73 65 20 20 64 6f 2d 63 6d 64 2d 6c 6f 6f 70 20 se do-cmd-loop
6420: 6f 3e 20 3b 0a 0a 3a 20 2e 6b 65 79 24 20 28 20 o> ;..: .key$ (
6430: 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 addr u -- ).
6440: 73 61 6d 70 6c 65 2d 6b 65 79 20 3e 6f 20 20 6b sample-key >o k
6450: 65 2d 73 6b 20 6b 65 2d 65 6e 64 20 6f 76 65 72 e-sk ke-end over
6460: 20 2d 20 65 72 61 73 65 0a 20 20 20 20 73 69 67 - erase. sig
6470: 6e 65 64 2d 76 61 6c 20 76 61 6c 69 64 61 74 65 ned-val validate
6480: 64 20 6f 72 21 20 20 63 2d 73 74 61 74 65 20 6f d or! c-state o
6490: 66 66 20 20 6e 65 73 74 2d 63 6d 64 2d 6c 6f 6f ff nest-cmd-loo
64a0: 70 0a 20 20 20 20 73 69 67 6e 65 64 2d 76 61 6c p. signed-val
64b0: 20 69 6e 76 65 72 74 20 76 61 6c 69 64 61 74 65 invert validate
64c0: 64 20 61 6e 64 21 0a 20 20 20 20 2e 6b 65 79 2d d and!. .key-
64d0: 73 68 6f 72 74 20 66 72 65 65 2d 6b 65 79 20 6f short free-key o
64e0: 3e 20 3b 0a 0a 3a 20 72 65 61 64 2d 6b 65 79 73 > ;..: read-keys
64f0: 2d 6c 6f 6f 70 20 28 20 66 64 20 2d 2d 20 29 20 -loop ( fd -- )
6500: 20 63 6f 64 65 2d 6b 65 79 0a 20 20 20 20 3e 72 code-key. >r
6510: 20 23 30 2e 20 72 40 20 72 65 70 6f 73 69 74 69 #0. r@ repositi
6520: 6f 6e 2d 66 69 6c 65 20 74 68 72 6f 77 0a 20 20 on-file throw.
6530: 20 20 42 45 47 49 4e 0a 09 72 40 20 66 69 6c 65 BEGIN..r@ file
6540: 2d 70 6f 73 69 74 69 6f 6e 20 74 68 72 6f 77 20 -position throw
6550: 64 3e 36 34 20 6b 65 79 2d 72 65 61 64 2d 6f 66 d>64 key-read-of
6560: 66 73 65 74 20 36 34 21 0a 09 6b 65 79 70 61 63 fset 64!..keypac
6570: 6b 20 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20 72 k keypack-all# r
6580: 40 20 72 65 61 64 2d 66 69 6c 65 20 74 68 72 6f @ read-file thro
6590: 77 0a 09 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20 w..keypack-all#
65a0: 3d 20 57 48 49 4c 45 0a 09 20 20 20 20 69 6d 70 = WHILE.. imp
65b0: 6f 72 74 2d 74 79 70 65 20 40 20 69 6d 70 6f 72 ort-type @ impor
65c0: 74 23 73 65 6c 66 20 3d 20 74 72 79 2d 64 65 63 t#self = try-dec
65d0: 72 79 70 74 20 64 6f 2d 6b 65 79 0a 20 20 20 20 rypt do-key.
65e0: 52 45 50 45 41 54 20 20 72 64 72 6f 70 20 20 63 REPEAT rdrop c
65f0: 6f 64 65 30 2d 62 75 66 20 3b 0a 3a 20 72 65 61 ode0-buf ;.: rea
6600: 64 2d 6b 65 79 2d 6c 6f 6f 70 20 28 20 2d 2d 20 d-key-loop ( --
6610: 29 0a 20 20 20 20 69 6d 70 6f 72 74 23 73 65 6c ). import#sel
6620: 66 20 69 6d 70 6f 72 74 2d 74 79 70 65 20 21 0a f import-type !.
6630: 20 20 20 20 3f 6b 65 79 2d 73 66 64 20 72 65 61 ?key-sfd rea
6640: 64 2d 6b 65 79 73 2d 6c 6f 6f 70 20 3b 0a 3a 20 d-keys-loop ;.:
6650: 72 65 61 64 2d 70 6b 65 79 2d 6c 6f 6f 70 20 28 read-pkey-loop (
6660: 20 2d 2d 20 29 0a 20 20 20 20 6c 61 73 74 6b 65 -- ). lastke
6670: 79 40 20 64 72 6f 70 20 64 65 66 61 75 6c 74 6b y@ drop defaultk
6680: 65 79 20 21 20 5c 20 61 74 20 6c 65 61 73 74 20 ey ! \ at least
6690: 6f 6e 65 20 64 65 66 61 75 6c 74 20 6b 65 79 20 one default key
66a0: 61 76 61 69 6c 61 62 6c 65 0a 20 20 20 20 2d 31 available. -1
66b0: 20 63 6f 6e 66 69 67 3a 70 77 2d 6c 65 76 65 6c config:pw-level
66c0: 23 0a 20 20 20 20 5b 3a 20 69 6d 70 6f 72 74 23 #. [: import#
66d0: 6e 65 77 20 69 6d 70 6f 72 74 2d 74 79 70 65 20 new import-type
66e0: 21 20 3f 6b 65 79 2d 70 66 64 20 72 65 61 64 2d ! ?key-pfd read-
66f0: 6b 65 79 73 2d 6c 6f 6f 70 20 3b 5d 20 21 77 72 keys-loop ;] !wr
6700: 61 70 70 65 72 20 3b 0a 0a 3a 20 72 65 61 64 2d apper ;..: read-
6710: 6b 65 79 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 keys ( -- ).
6720: 72 65 61 64 2d 6b 65 79 2d 6c 6f 6f 70 20 72 65 read-key-loop re
6730: 61 64 2d 70 6b 65 79 2d 6c 6f 6f 70 20 69 6d 70 ad-pkey-loop imp
6740: 6f 72 74 23 6e 65 77 20 69 6d 70 6f 72 74 2d 74 ort#new import-t
6750: 79 70 65 20 21 20 3b 0a 0a 3a 20 72 65 61 64 2d ype ! ;..: read-
6760: 70 6b 32 6b 65 79 24 20 28 20 61 64 64 72 20 75 pk2key$ ( addr u
6770: 20 2d 2d 20 29 0a 20 20 20 20 5c 67 20 72 65 61 -- ). \g rea
6780: 64 20 61 20 6e 65 73 74 65 64 20 6b 65 79 20 69 d a nested key i
6790: 6e 74 6f 20 73 61 6d 70 6c 65 2d 6b 65 79 0a 20 nto sample-key.
67a0: 20 20 20 73 61 6d 70 6c 65 2d 6b 65 79 20 3e 6f sample-key >o
67b0: 20 63 2d 73 74 61 74 65 20 6f 66 66 20 20 73 69 c-state off si
67c0: 6d 2d 6e 69 63 6b 21 20 6f 6e 0a 20 20 20 20 70 m-nick! on. p
67d0: 6b 32 2d 73 69 67 3f 20 21 21 73 69 67 21 21 20 k2-sig? !!sig!!
67e0: 73 69 67 70 6b 32 73 69 7a 65 23 20 2d 20 32 64 sigpk2size# - 2d
67f0: 75 70 20 2b 20 3e 72 20 64 6f 2d 6e 65 73 74 73 up + >r do-nests
6800: 69 67 0a 20 20 20 20 72 40 20 6b 65 79 73 69 7a ig. r@ keysiz
6810: 65 32 20 6b 65 2d 70 6b 20 24 21 0a 20 20 20 20 e2 ke-pk $!.
6820: 72 3e 20 6b 65 79 73 69 7a 65 32 20 2b 20 73 69 r> keysize2 + si
6830: 67 73 69 7a 65 23 20 6b 65 2d 73 65 6c 66 73 69 gsize# ke-selfsi
6840: 67 20 24 21 0a 20 20 20 20 6f 3e 20 20 73 69 6d g $!. o> sim
6850: 2d 6e 69 63 6b 21 20 6f 66 66 20 3b 0a 0a 3a 20 -nick! off ;..:
6860: 2e 70 6b 32 6b 65 79 24 20 28 20 61 64 64 72 20 .pk2key$ ( addr
6870: 75 20 2d 2d 20 29 0a 20 20 20 20 72 65 61 64 2d u -- ). read-
6880: 70 6b 32 6b 65 79 24 20 73 61 6d 70 6c 65 2d 6b pk2key$ sample-k
6890: 65 79 20 3e 6f 0a 20 20 20 20 5b 20 31 20 69 6d ey >o. [ 1 im
68a0: 70 6f 72 74 23 69 6e 76 69 74 65 64 20 6c 73 68 port#invited lsh
68b0: 69 66 74 20 31 20 69 6d 70 6f 72 74 23 6e 65 77 ift 1 import#new
68c0: 20 6c 73 68 69 66 74 20 6f 72 20 5d 4c 20 6b 65 lshift or ]L ke
68d0: 2d 69 6d 70 6f 72 74 73 20 21 0a 20 20 20 20 2e -imports !. .
68e0: 6b 65 79 2d 69 6e 76 69 74 65 20 66 72 65 65 2d key-invite free-
68f0: 6b 65 79 20 6f 3e 20 3b 0a 0a 5c 20 73 65 6c 65 key o> ;..\ sele
6900: 63 74 20 6b 65 79 20 62 79 20 6e 69 63 6b 0a 0a ct key by nick..
6910: 3a 20 3e 72 61 77 2d 6b 65 79 20 28 20 6f 20 2d : >raw-key ( o -
6920: 2d 20 29 0a 20 20 20 20 64 75 70 20 30 3d 20 21 - ). dup 0= !
6930: 21 6e 6f 2d 6e 69 63 6b 21 21 20 3e 6f 0a 20 20 !no-nick!! >o.
6940: 20 20 6b 65 2d 70 6b 20 24 40 20 70 6b 63 20 70 ke-pk $@ pkc p
6950: 6b 72 6b 23 20 73 6d 6f 76 65 0a 20 20 20 20 6b krk# smove. k
6960: 65 2d 73 6b 20 73 65 63 40 20 73 6b 63 20 73 77 e-sk sec@ skc sw
6970: 61 70 20 6b 65 79 7c 20 6d 6f 76 65 0a 20 20 20 ap key| move.
6980: 20 3e 73 6b 73 69 67 20 6f 3e 20 3b 0a 0a 3a 20 >sksig o> ;..:
6990: 3e 6b 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d >key ( addr u --
69a0: 20 29 0a 20 20 20 20 6b 65 79 23 20 40 20 30 3d ). key# @ 0=
69b0: 20 49 46 20 20 72 65 61 64 2d 6b 65 79 73 20 20 IF read-keys
69c0: 54 48 45 4e 0a 20 20 20 20 6e 69 63 6b 2d 6b 65 THEN. nick-ke
69d0: 79 20 3e 72 61 77 2d 6b 65 79 20 3b 0a 0a 3a 20 y >raw-key ;..:
69e0: 69 27 6d 20 28 20 22 6e 61 6d 65 22 20 2d 2d 20 i'm ( "name" --
69f0: 29 20 70 61 72 73 65 2d 6e 61 6d 65 20 3e 6b 65 ) parse-name >ke
6a00: 79 20 3b 0a 3a 20 70 6b 27 20 28 20 22 6e 61 6d y ;.: pk' ( "nam
6a10: 65 22 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 e" -- addr u ).
6a20: 20 20 20 70 61 72 73 65 2d 6e 61 6d 65 20 6e 69 parse-name ni
6a30: 63 6b 3e 70 6b 20 3b 0a 0a 3a 20 64 65 73 74 2d ck>pk ;..: dest-
6a40: 6b 65 79 20 28 20 61 64 64 72 20 75 20 2d 2d 20 key ( addr u --
6a50: 29 20 64 75 70 20 30 3d 20 49 46 20 20 32 64 72 ) dup 0= IF 2dr
6a60: 6f 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 op EXIT THEN.
6a70: 20 20 20 6e 69 63 6b 2d 6b 65 79 20 3e 6f 20 6f nick-key >o o
6a80: 20 30 3d 20 21 21 75 6e 6b 6e 6f 77 6e 2d 6b 65 0= !!unknown-ke
6a90: 79 21 21 0a 20 20 20 20 6b 65 2d 70 6b 20 24 40 y!!. ke-pk $@
6aa0: 20 6f 3e 0a 20 20 20 20 70 75 62 6b 65 79 20 24 o>. pubkey $
6ab0: 21 20 3b 0a 0a 3a 20 64 65 73 74 2d 70 6b 20 28 ! ;..: dest-pk (
6ac0: 20 61 64 64 72 20 75 20 2d 2d 20 29 20 6b 65 79 addr u -- ) key
6ad0: 32 7c 20 32 64 75 70 20 6b 65 79 7c 20 6b 65 79 2| 2dup key| key
6ae0: 23 20 23 40 20 30 3d 20 49 46 0a 09 64 72 6f 70 # #@ 0= IF..drop
6af0: 20 70 75 62 6b 65 79 20 24 21 20 20 70 65 72 6d pubkey $! perm
6b00: 25 75 6e 6b 6e 6f 77 6e 20 70 65 72 6d 2d 6d 61 %unknown perm-ma
6b10: 73 6b 20 21 0a 20 20 20 20 45 4c 53 45 20 20 63 sk !. ELSE c
6b20: 65 6c 6c 2b 20 3e 6f 0a 09 6b 65 2d 6d 61 73 6b ell+ >o..ke-mask
6b30: 20 40 0a 09 6b 65 2d 70 6b 20 24 40 20 6f 3e 0a @..ke-pk $@ o>.
6b40: 09 70 75 62 6b 65 79 20 24 21 20 20 70 65 72 6d .pubkey $! perm
6b50: 2d 6d 61 73 6b 20 21 20 20 32 64 72 6f 70 20 20 -mask ! 2drop
6b60: 54 48 45 4e 20 3b 0a 0a 3a 20 72 65 70 6c 61 63 THEN ;..: replac
6b70: 65 2d 6b 65 79 20 31 20 2f 73 74 72 69 6e 67 20 e-key 1 /string
6b80: 7b 20 72 65 76 2d 61 64 64 72 20 75 20 2d 2d 20 { rev-addr u --
6b90: 6f 20 7d 20 5c 20 72 65 76 6f 63 61 74 69 6f 6e o } \ revocation
6ba0: 20 74 69 63 6b 65 74 0a 20 20 20 20 6b 65 79 28 ticket. key(
6bb0: 20 2e 22 20 52 65 70 6c 61 63 65 3a 22 20 63 72 ." Replace:" cr
6bc0: 20 6f 20 63 65 6c 6c 2d 20 30 20 2e 6b 65 79 20 o cell- 0 .key
6bd0: 29 0a 20 20 20 20 69 6d 70 6f 72 74 23 73 65 6c ). import#sel
6be0: 66 20 69 6d 70 6f 72 74 2d 74 79 70 65 20 21 0a f import-type !.
6bf0: 20 20 20 20 73 22 20 23 72 65 76 6f 6b 65 64 22 s" #revoked"
6c00: 20 64 75 70 20 3e 72 20 6b 65 2d 6e 69 63 6b 20 dup >r ke-nick
6c10: 24 2b 21 0a 20 20 20 20 6b 65 2d 6e 69 63 6b 20 $+!. ke-nick
6c20: 24 40 20 72 3e 20 2d 20 6b 65 2d 70 72 6f 66 20 $@ r> - ke-prof
6c30: 24 40 20 6b 65 2d 73 69 67 73 20 6b 65 2d 74 79 $@ ke-sigs ke-ty
6c40: 70 65 20 40 0a 20 20 20 20 72 65 76 2d 61 64 64 pe @. rev-add
6c50: 72 20 70 6b 72 6b 23 20 6b 65 79 3f 6e 65 77 20 r pkrk# key?new
6c60: 3e 6f 0a 20 20 20 20 6b 65 2d 74 79 70 65 20 21 >o. ke-type !
6c70: 20 5b 3a 20 6b 65 2d 73 69 67 73 20 24 2b 5b 5d [: ke-sigs $+[]
6c80: 21 20 3b 5d 20 24 5b 5d 6d 61 70 20 6b 65 2d 70 ! ;] $[]map ke-p
6c90: 72 6f 66 20 24 21 20 6b 65 2d 6e 69 63 6b 20 24 rof $! ke-nick $
6ca0: 21 0a 20 20 20 20 72 65 76 2d 61 64 64 72 20 70 !. rev-addr p
6cb0: 6b 72 6b 23 20 6b 65 2d 70 6b 20 24 21 0a 20 20 krk# ke-pk $!.
6cc0: 20 20 72 65 76 2d 61 64 64 72 20 75 20 2b 20 31 rev-addr u + 1
6cd0: 2d 20 64 75 70 20 63 40 20 32 2a 20 2d 20 24 31 - dup c@ 2* - $1
6ce0: 30 20 2d 20 24 31 30 20 6b 65 2d 73 65 6c 66 73 0 - $10 ke-selfs
6cf0: 69 67 20 24 21 0a 20 20 20 20 6b 65 79 28 20 2e ig $!. key( .
6d00: 22 20 77 69 74 68 3a 22 20 63 72 20 6f 20 63 65 " with:" cr o ce
6d10: 6c 6c 2d 20 30 20 2e 6b 65 79 20 29 20 6f 20 6f ll- 0 .key ) o o
6d20: 3e 0a 20 20 20 20 69 6d 70 6f 72 74 23 6e 65 77 >. import#new
6d30: 20 69 6d 70 6f 72 74 2d 74 79 70 65 20 21 20 3b import-type ! ;
6d40: 0a 0a 3a 20 72 65 6e 65 77 2d 6b 65 79 20 28 20 ..: renew-key (
6d50: 72 65 76 61 64 64 72 20 75 31 20 6b 65 79 61 64 revaddr u1 keyad
6d60: 64 72 20 75 32 20 2d 2d 20 6f 20 29 0a 20 20 20 dr u2 -- o ).
6d70: 20 63 75 72 72 65 6e 74 2d 6b 65 79 20 3e 6f 20 current-key >o
6d80: 72 65 70 6c 61 63 65 2d 6b 65 79 20 6f 3e 0a 20 replace-key o>.
6d90: 20 20 20 3e 6f 20 73 6b 63 20 6b 65 79 73 69 7a >o skc keysiz
6da0: 65 20 6b 65 2d 73 6b 20 73 65 63 21 20 6f 20 6f e ke-sk sec! o o
6db0: 3e 20 3b 0a 0a 5c 20 67 65 6e 65 72 61 74 65 20 > ;..\ generate
6dc0: 6e 65 77 20 6b 65 79 0a 0a 3a 20 6f 75 74 2d 6b new key..: out-k
6dd0: 65 79 20 28 20 6f 20 2d 2d 20 29 0a 20 20 20 20 ey ( o -- ).
6de0: 3e 6f 20 70 61 63 6b 2d 6f 75 74 6b 65 79 20 5b >o pack-outkey [
6df0: 27 5d 20 2e 6e 69 63 6b 2d 62 61 73 65 20 24 74 '] .nick-base $t
6e00: 6d 70 20 66 6e 2d 73 61 6e 69 74 69 7a 65 20 6f mp fn-sanitize o
6e10: 3e 0a 20 20 20 20 5b 3a 20 2e 22 20 7e 2f 22 20 >. [: ." ~/"
6e20: 74 79 70 65 20 2e 22 20 2e 6e 32 6f 22 20 3b 5d type ." .n2o" ;]
6e30: 20 24 74 6d 70 20 77 2f 6f 20 63 72 65 61 74 65 $tmp w/o create
6e40: 2d 66 69 6c 65 20 74 68 72 6f 77 0a 20 20 20 20 -file throw.
6e50: 3e 72 20 63 6d 64 62 75 66 24 20 72 40 20 77 72 >r cmdbuf$ r@ wr
6e60: 69 74 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 72 ite-file throw r
6e70: 3e 20 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 > close-file thr
6e80: 6f 77 20 3b 0a 3a 20 6f 75 74 2d 6d 65 20 28 20 ow ;.: out-me (
6e90: 2d 2d 20 29 0a 20 20 20 20 70 6b 63 20 6b 65 79 -- ). pkc key
6ea0: 73 69 7a 65 20 6b 65 79 23 20 23 40 20 30 3d 20 size key# #@ 0=
6eb0: 21 21 75 6e 6b 6e 6f 77 6e 2d 6b 65 79 21 21 0a !!unknown-key!!.
6ec0: 20 20 20 20 63 65 6c 6c 2b 20 6f 75 74 2d 6b 65 cell+ out-ke
6ed0: 79 20 3b 0a 0a 56 61 72 69 61 62 6c 65 20 64 68 y ;..Variable dh
6ee0: 74 72 6f 6f 74 2e 6e 32 6f 0a 0a 3a 20 2b 64 68 troot.n2o..: +dh
6ef0: 74 72 6f 6f 74 20 28 20 2d 2d 20 29 0a 20 20 20 troot ( -- ).
6f00: 20 64 65 66 61 75 6c 74 6b 65 79 20 40 20 3e 73 defaultkey @ >s
6f10: 74 6f 72 65 6b 65 79 20 21 0a 20 20 20 20 69 6d torekey !. im
6f20: 70 6f 72 74 23 6d 61 6e 75 61 6c 20 69 6d 70 6f port#manual impo
6f30: 72 74 2d 74 79 70 65 20 21 20 20 36 34 23 2d 31 rt-type ! 64#-1
6f40: 20 6b 65 79 2d 72 65 61 64 2d 6f 66 66 73 65 74 key-read-offset
6f50: 20 36 34 21 0a 20 20 20 20 64 68 74 72 6f 6f 74 64!. dhtroot
6f60: 2e 6e 32 6f 20 24 40 20 64 6f 2d 6b 65 79 20 20 .n2o $@ do-key
6f70: 69 6d 70 6f 72 74 23 6e 65 77 20 69 6d 70 6f 72 import#new impor
6f80: 74 2d 74 79 70 65 20 21 20 3b 0a 0a 3a 20 6e 65 t-type ! ;..: ne
6f90: 77 2d 6b 65 79 20 28 20 6e 69 63 6b 61 64 64 72 w-key ( nickaddr
6fa0: 20 75 20 2d 2d 20 29 0a 20 20 20 20 3f 63 68 65 u -- ). ?che
6fb0: 63 6b 2d 72 6e 67 20 5c 20 62 65 66 6f 72 65 20 ck-rng \ before
6fc0: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6b 65 79 generating a key
6fd0: 2c 20 63 68 65 63 6b 20 74 68 65 20 72 6e 67 20 , check the rng
6fe0: 66 6f 72 20 68 65 61 6c 74 68 0a 20 20 20 20 2b for health. +
6ff0: 6e 65 77 70 68 72 61 73 65 20 6b 65 79 3e 64 65 newphrase key>de
7000: 66 61 75 6c 74 0a 20 20 20 20 6b 65 79 23 75 73 fault. key#us
7010: 65 72 20 2b 67 65 6e 2d 6b 65 79 73 0a 20 20 20 er +gen-keys.
7020: 20 73 65 63 72 65 74 2d 6b 65 79 73 23 20 31 2d secret-keys# 1-
7030: 20 73 65 63 72 65 74 2d 6b 65 79 20 3e 72 61 77 secret-key >raw
7040: 2d 6b 65 79 20 20 6c 61 73 74 6b 65 79 40 20 64 -key lastkey@ d
7050: 72 6f 70 20 64 65 66 61 75 6c 74 6b 65 79 20 21 rop defaultkey !
7060: 0a 20 20 20 20 6f 75 74 2d 6d 65 20 2b 64 68 74 . out-me +dht
7070: 72 6f 6f 74 20 73 61 76 65 2d 6b 65 79 73 20 3b root save-keys ;
7080: 0a 0a 5c 20 72 65 76 6f 6b 61 74 69 6f 6e 0a 0a ..\ revokation..
7090: 34 20 64 61 74 65 73 69 7a 65 23 20 2b 20 6b 65 4 datesize# + ke
70a0: 79 73 69 7a 65 20 39 20 2a 20 2b 20 43 6f 6e 73 ysize 9 * + Cons
70b0: 74 61 6e 74 20 72 65 76 73 69 7a 65 23 0a 0a 56 tant revsize#..V
70c0: 61 72 69 61 62 6c 65 20 72 65 76 74 6f 6b 65 6e ariable revtoken
70d0: 0a 0a 3a 20 30 6f 6c 64 6b 65 79 20 28 20 2d 2d ..: 0oldkey ( --
70e0: 20 29 20 5c 20 70 75 62 6b 65 79 73 20 63 61 6e ) \ pubkeys can
70f0: 20 73 74 61 79 0a 20 20 20 20 6f 6c 64 73 6b 63 stay. oldskc
7100: 20 6b 65 79 73 69 7a 65 20 65 72 61 73 65 20 20 keysize erase
7110: 6f 6c 64 73 6b 72 65 76 20 6b 65 79 73 69 7a 65 oldskrev keysize
7120: 20 65 72 61 73 65 20 3b 0a 0a 3a 20 6b 65 79 6d erase ;..: keym
7130: 6f 76 65 20 28 20 61 64 64 72 31 20 61 64 64 72 ove ( addr1 addr
7140: 32 20 2d 2d 20 29 20 20 6b 65 79 73 69 7a 65 20 2 -- ) keysize
7150: 6d 6f 76 65 20 3b 0a 0a 3a 20 72 65 76 6f 6b 65 move ;..: revoke
7160: 2d 76 65 72 69 66 79 20 28 20 61 64 64 72 20 75 -verify ( addr u
7170: 31 20 70 6b 20 73 74 72 69 6e 67 20 75 32 20 2d 1 pk string u2 -
7180: 2d 20 61 64 64 72 20 75 20 66 6c 61 67 20 29 20 - addr u flag )
7190: 72 6f 74 20 3e 72 20 32 3e 72 20 63 3a 30 6b 65 rot >r 2>r c:0ke
71a0: 79 0a 20 20 20 20 73 69 67 6f 6e 6c 79 73 69 7a y. sigonlysiz
71b0: 65 23 20 2d 20 32 64 75 70 20 32 72 3e 20 3e 6b e# - 2dup 2r> >k
71c0: 65 79 65 64 2d 68 61 73 68 0a 20 20 20 20 73 69 eyed-hash. si
71d0: 67 64 61 74 65 20 2b 64 61 74 65 0a 20 20 20 20 gdate +date.
71e0: 32 64 75 70 20 2b 20 72 3e 20 65 64 2d 76 65 72 2dup + r> ed-ver
71f0: 69 66 79 20 3b 0a 0a 3a 20 3e 72 65 76 6f 6b 65 ify ;..: >revoke
7200: 20 28 20 73 6b 72 65 76 20 2d 2d 20 29 20 20 73 ( skrev -- ) s
7210: 6b 72 65 76 20 6b 65 79 6d 6f 76 65 20 20 70 6b krev keymove pk
7220: 63 20 63 68 65 63 6b 2d 72 65 76 3f 20 30 3d 20 c check-rev? 0=
7230: 21 21 6e 6f 74 2d 6d 79 2d 72 65 76 73 6b 21 21 !!not-my-revsk!!
7240: 20 3b 0a 0a 3a 20 2b 72 65 76 73 69 67 6e 20 28 ;..: +revsign (
7250: 20 73 6b 20 70 6b 20 2d 2d 20 29 20 20 73 6b 73 sk pk -- ) sks
7260: 69 67 20 2d 72 6f 74 20 65 64 2d 73 69 67 6e 20 ig -rot ed-sign
7270: 72 65 76 74 6f 6b 65 6e 20 24 2b 21 20 62 6c 20 revtoken $+! bl
7280: 72 65 76 74 6f 6b 65 6e 20 63 24 2b 21 20 3b 0a revtoken c$+! ;.
7290: 0a 3a 20 73 69 67 6e 2d 74 6f 6b 65 6e 2c 20 28 .: sign-token, (
72a0: 20 73 6b 20 70 6b 20 73 74 72 69 6e 67 20 75 32 sk pk string u2
72b0: 20 2d 2d 20 29 0a 20 20 20 20 63 3a 30 6b 65 79 -- ). c:0key
72c0: 20 72 65 76 74 6f 6b 65 6e 20 24 40 20 32 73 77 revtoken $@ 2sw
72d0: 61 70 20 3e 6b 65 79 65 64 2d 68 61 73 68 0a 20 ap >keyed-hash.
72e0: 20 20 20 73 69 67 64 61 74 65 20 2b 64 61 74 65 sigdate +date
72f0: 20 2b 72 65 76 73 69 67 6e 20 3b 0a 0a 3a 20 72 +revsign ;..: r
7300: 65 76 6f 6b 65 2d 6b 65 79 20 28 20 2d 2d 20 61 evoke-key ( -- a
7310: 64 64 72 20 75 20 29 0a 20 20 20 20 73 6b 63 20 ddr u ). skc
7320: 6f 6c 64 73 6b 63 20 6b 65 79 6d 6f 76 65 20 20 oldskc keymove
7330: 70 6b 63 20 6f 6c 64 70 6b 63 20 6b 65 79 6d 6f pkc oldpkc keymo
7340: 76 65 20 20 73 6b 72 65 76 20 6f 6c 64 73 6b 72 ve skrev oldskr
7350: 65 76 20 6b 65 79 6d 6f 76 65 0a 20 20 20 20 20 ev keymove.
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7380: 20 20 20 20 20 20 5c 20 62 61 63 6b 75 70 20 6b \ backup k
7390: 65 79 73 0a 20 20 20 20 6f 6c 64 73 6b 72 65 76 eys. oldskrev
73a0: 20 6f 6c 64 70 6b 72 65 76 20 73 6b 3e 70 6b 20 oldpkrev sk>pk
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c \
73c0: 20 67 65 6e 65 72 61 74 65 20 72 65 76 6f 6b 61 generate revoka
73d0: 74 69 6f 6e 20 70 75 62 6b 65 79 0a 20 20 20 20 tion pubkey.
73e0: 67 65 6e 2d 6b 65 79 73 20 20 20 20 20 20 20 20 gen-keys
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7400: 20 20 20 20 20 20 20 5c 20 67 65 6e 65 72 61 74 \ generat
7410: 65 20 6e 65 77 20 6b 65 79 73 0a 20 20 20 20 70 e new keys. p
7420: 6b 63 20 6b 65 79 73 69 7a 65 32 20 72 65 76 74 kc keysize2 revt
7430: 6f 6b 65 6e 20 24 21 20 20 20 20 20 20 20 20 20 oken $!
7440: 20 20 20 20 20 20 5c 20 6d 79 20 6e 65 77 20 6b \ my new k
7450: 65 79 0a 20 20 20 20 6f 6c 64 70 6b 72 65 76 20 ey. oldpkrev
7460: 6b 65 79 73 69 7a 65 20 72 65 76 74 6f 6b 65 6e keysize revtoken
7470: 20 24 2b 21 20 20 20 20 20 20 20 20 20 20 5c 20 $+! \
7480: 72 65 76 6f 6b 65 20 74 6f 6b 65 6e 0a 20 20 20 revoke token.
7490: 20 6f 6c 64 73 6b 72 65 76 20 6f 6c 64 70 6b 72 oldskrev oldpkr
74a0: 65 76 20 22 72 65 76 6f 6b 65 22 20 73 69 67 6e ev "revoke" sign
74b0: 2d 74 6f 6b 65 6e 2c 20 5c 20 72 65 76 6f 6b 65 -token, \ revoke
74c0: 20 73 69 67 6e 61 74 75 72 65 0a 20 20 20 20 73 signature. s
74d0: 6b 63 20 70 6b 63 20 22 73 65 6c 66 73 69 67 6e kc pkc "selfsign
74e0: 22 20 73 69 67 6e 2d 74 6f 6b 65 6e 2c 20 20 20 " sign-token,
74f0: 20 20 20 20 20 20 5c 20 73 65 6c 66 20 73 69 67 \ self sig
7500: 6e 65 64 20 77 69 74 68 20 6e 65 77 20 6b 65 79 ned with new key
7510: 0a 20 20 20 20 22 21 22 20 72 65 76 74 6f 6b 65 . "!" revtoke
7520: 6e 20 30 20 24 69 6e 73 20 20 20 20 20 20 20 20 n 0 $ins
7530: 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 22 21 \ "!
7540: 22 20 2b 20 6f 6c 64 6b 65 79 6c 65 6e 2b 6e 65 " + oldkeylen+ne
7550: 77 6b 65 79 6c 65 6e 20 74 6f 20 66 6c 61 67 20 wkeylen to flag
7560: 72 65 76 6f 6b 61 74 69 6f 6e 0a 20 20 20 20 72 revokation. r
7570: 65 76 74 6f 6b 65 6e 20 24 40 20 67 65 6e 3e 68 evtoken $@ gen>h
7580: 6f 73 74 20 32 64 72 6f 70 20 20 20 20 20 20 20 ost 2drop
7590: 20 20 20 20 20 20 5c 20 73 69 67 6e 20 68 6f 73 \ sign hos
75a0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 t information wi
75b0: 74 68 20 6f 6c 64 20 6b 65 79 0a 20 20 20 20 73 th old key. s
75c0: 69 67 64 61 74 65 20 2b 64 61 74 65 20 73 69 67 igdate +date sig
75d0: 64 61 74 65 20 64 61 74 65 73 69 7a 65 23 20 72 date datesize# r
75e0: 65 76 74 6f 6b 65 6e 20 24 2b 21 0a 20 20 20 20 evtoken $+!.
75f0: 6f 6c 64 73 6b 63 20 6f 6c 64 70 6b 63 20 2b 72 oldskc oldpkc +r
7600: 65 76 73 69 67 6e 0a 20 20 20 20 30 6f 6c 64 6b evsign. 0oldk
7610: 65 79 20 72 65 76 74 6f 6b 65 6e 20 24 40 20 3b ey revtoken $@ ;
7620: 0a 0a 5c 20 69 6e 76 69 74 61 74 69 6f 6e 0a 0a ..\ invitation..
7630: 56 61 72 69 61 62 6c 65 20 69 6e 76 69 74 61 74 Variable invitat
7640: 69 6f 6e 73 0a 0a 65 76 65 6e 74 3a 20 2d 3e 69 ions..event: ->i
7650: 6e 76 69 74 65 20 28 20 61 64 64 72 20 75 20 2d nvite ( addr u -
7660: 2d 20 29 0a 20 20 20 20 2e 22 20 69 6e 76 69 74 - ). ." invit
7670: 65 20 6d 65 3a 20 22 20 6f 76 65 72 20 3e 72 20 e me: " over >r
7680: 2e 70 6b 32 6b 65 79 24 20 63 72 20 72 3e 20 66 .pk2key$ cr r> f
7690: 72 65 65 20 74 68 72 6f 77 20 63 74 72 6c 20 4c ree throw ctrl L
76a0: 20 69 6e 73 6b 65 79 20 3b 0a 65 76 65 6e 74 3a inskey ;.event:
76b0: 20 2d 3e 77 61 6b 65 6d 65 20 28 20 6f 20 2d 2d ->wakeme ( o --
76c0: 20 29 20 3c 65 76 65 6e 74 20 2d 3e 77 61 6b 65 ) <event ->wake
76d0: 20 65 76 65 6e 74 3e 20 3b 0a 0a 3a 20 70 6b 32 event> ;..: pk2
76e0: 6b 65 79 24 2d 61 64 64 20 28 20 61 64 64 72 20 key$-add ( addr
76f0: 75 20 70 65 72 6d 20 2d 2d 20 29 20 7b 20 70 65 u perm -- ) { pe
7700: 72 6d 20 7d 0a 20 20 20 20 73 61 6d 70 6c 65 2d rm }. sample-
7710: 6b 65 79 20 3e 6f 20 69 6d 70 6f 72 74 23 69 6e key >o import#in
7720: 76 69 74 65 64 20 69 6d 70 6f 72 74 2d 74 79 70 vited import-typ
7730: 65 20 21 20 63 6d 64 3a 6e 65 73 74 73 69 67 0a e ! cmd:nestsig.
7740: 20 20 20 20 70 65 72 6d 20 6b 65 2d 6d 61 73 6b perm ke-mask
7750: 20 21 0a 20 20 20 20 69 6d 70 6f 72 74 23 6e 65 !. import#ne
7760: 77 20 69 6d 70 6f 72 74 2d 74 79 70 65 20 21 20 w import-type !
7770: 20 73 61 76 65 2d 70 75 62 6b 65 79 73 20 6f 3e save-pubkeys o>
7780: 20 3b 0a 0a 3a 20 78 2d 65 72 61 73 65 20 28 20 ;..: x-erase (
7790: 6c 65 6e 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 len -- ). dup
77a0: 20 78 62 61 63 6b 2d 72 65 73 74 6f 72 65 20 20 xback-restore
77b0: 64 75 70 20 73 70 61 63 65 73 20 20 78 62 61 63 dup spaces xbac
77c0: 6b 2d 72 65 73 74 6f 72 65 20 3b 0a 0a 3a 20 69 k-restore ;..: i
77d0: 6e 76 69 74 65 2d 6b 65 79 20 28 20 61 64 64 72 nvite-key ( addr
77e0: 20 75 20 2d 2d 20 6b 65 79 20 29 0a 20 20 20 20 u -- key ).
77f0: 32 64 75 70 20 78 2d 77 69 64 74 68 20 7b 20 61 2dup x-width { a
7800: 64 64 72 20 75 20 6c 65 6e 20 7d 0a 20 20 20 20 ddr u len }.
7810: 42 45 47 49 4e 20 20 61 64 64 72 20 75 20 74 79 BEGIN addr u ty
7820: 70 65 20 6b 65 79 20 20 6c 65 6e 20 78 2d 65 72 pe key len x-er
7830: 61 73 65 0a 09 64 75 70 20 63 74 72 6c 20 5a 20 ase..dup ctrl Z
7840: 3d 0a 20 20 20 20 57 48 49 4c 45 20 20 64 72 6f =. WHILE dro
7850: 70 20 20 42 45 47 49 4e 20 20 6b 65 79 20 63 74 p BEGIN key ct
7860: 72 6c 20 4c 20 3d 20 20 55 4e 54 49 4c 20 20 52 rl L = UNTIL R
7870: 45 50 45 41 54 20 3b 0a 0a 3a 20 70 72 6f 63 65 EPEAT ;..: proce
7880: 73 73 2d 69 6e 76 69 74 61 74 69 6f 6e 20 28 20 ss-invitation (
7890: 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 addr u -- ).
78a0: 73 22 20 69 6e 76 69 74 65 20 28 79 2f 6e 2f 62 s" invite (y/n/b
78b0: 29 3f 22 20 69 6e 76 69 74 65 2d 6b 65 79 0a 20 )?" invite-key.
78c0: 20 20 20 63 61 73 65 0a 09 27 79 27 20 6f 66 20 case..'y' of
78d0: 20 70 65 72 6d 25 64 65 66 61 75 6c 74 20 70 6b perm%default pk
78e0: 32 6b 65 79 24 2d 61 64 64 20 20 2e 22 20 61 64 2key$-add ." ad
78f0: 64 65 64 22 20 63 72 20 20 20 65 6e 64 6f 66 0a ded" cr endof.
7900: 09 27 62 27 20 6f 66 20 20 70 65 72 6d 25 62 6c .'b' of perm%bl
7910: 6f 63 6b 65 64 20 70 6b 32 6b 65 79 24 2d 61 64 ocked pk2key$-ad
7920: 64 20 20 2e 22 20 62 6c 6f 63 6b 65 64 22 20 63 d ." blocked" c
7930: 72 20 65 6e 64 6f 66 0a 09 32 64 72 6f 70 20 2e r endof..2drop .
7940: 22 20 69 67 6e 6f 72 65 64 22 20 63 72 0a 20 20 " ignored" cr.
7950: 20 20 65 6e 64 63 61 73 65 20 3b 0a 0a 3a 20 66 endcase ;..: f
7960: 69 6c 74 65 72 2d 69 6e 76 69 74 61 74 69 6f 6e ilter-invitation
7970: 3f 20 28 20 61 64 64 72 20 75 20 2d 2d 20 66 6c ? ( addr u -- fl
7980: 61 67 20 29 0a 20 20 20 20 73 69 67 70 6b 32 73 ag ). sigpk2s
7990: 69 7a 65 23 20 2d 20 2b 20 6b 65 79 73 69 7a 65 ize# - + keysize
79a0: 20 6b 65 79 23 20 23 40 20 64 30 3c 3e 20 3b 20 key# #@ d0<> ;
79b0: 5c 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 0a \ already there.
79c0: 0a 3a 20 2e 69 6e 76 69 74 61 74 69 6f 6e 73 20 .: .invitations
79d0: 28 20 2d 2d 20 29 0a 20 20 20 20 69 6e 76 69 74 ( -- ). invit
79e0: 61 74 69 6f 6e 73 20 5b 3a 20 32 64 75 70 20 2e ations [: 2dup .
79f0: 70 6b 32 6b 65 79 24 20 63 72 20 70 72 6f 63 65 pk2key$ cr proce
7a00: 73 73 2d 69 6e 76 69 74 61 74 69 6f 6e 20 3b 5d ss-invitation ;]
7a10: 20 24 5b 5d 6d 61 70 0a 20 20 20 20 69 6e 76 69 $[]map. invi
7a20: 74 61 74 69 6f 6e 73 20 24 5b 5d 6f 66 66 20 3b tations $[]off ;
7a30: 0a 0a 3a 20 3e 69 6e 76 69 74 61 74 69 6f 6e 73 ..: >invitations
7a40: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 ( addr u -- ).
7a50: 20 20 20 32 64 75 70 20 66 69 6c 74 65 72 2d 69 2dup filter-i
7a60: 6e 76 69 74 61 74 69 6f 6e 3f 20 49 46 20 20 32 nvitation? IF 2
7a70: 64 72 6f 70 20 45 58 49 54 20 20 54 48 45 4e 0a drop EXIT THEN.
7a80: 20 20 20 20 69 6e 76 69 74 61 74 69 6f 6e 73 20 invitations
7a90: 24 5b 5d 23 20 3e 72 0a 20 20 20 20 32 64 75 70 $[]# >r. 2dup
7aa0: 20 69 6e 76 69 74 61 74 69 6f 6e 73 20 24 69 6e invitations $in
7ab0: 73 5b 5d 73 69 67 20 64 72 6f 70 0a 20 20 20 20 s[]sig drop.
7ac0: 69 6e 76 69 74 61 74 69 6f 6e 73 20 24 5b 5d 23 invitations $[]#
7ad0: 20 72 3e 20 3c 3e 20 49 46 0a 09 73 61 76 65 2d r> <> IF..save-
7ae0: 6d 65 6d 20 6d 61 69 6e 2d 75 70 40 20 3c 68 69 mem main-up@ <hi
7af0: 64 65 3e 0a 09 3c 65 76 65 6e 74 20 65 24 2c 20 de>..<event e$,
7b00: 2d 3e 69 6e 76 69 74 65 20 75 70 40 20 65 6c 69 ->invite up@ eli
7b10: 74 2c 20 2d 3e 77 61 6b 65 6d 65 20 6d 61 69 6e t, ->wakeme main
7b20: 2d 75 70 40 20 65 76 65 6e 74 3e 20 73 74 6f 70 -up@ event> stop
7b30: 0a 20 20 20 20 45 4c 53 45 20 20 32 64 72 6f 70 . ELSE 2drop
7b40: 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 73 65 6e 64 THEN ;..: send
7b50: 2d 69 6e 76 69 74 61 74 69 6f 6e 20 28 20 70 6b -invitation ( pk
7b60: 20 75 20 2d 2d 20 29 0a 20 20 20 20 73 65 74 75 u -- ). setu
7b70: 70 21 20 6d 79 70 6b 32 6e 69 63 6b 24 20 32 3e p! mypk2nick$ 2>
7b80: 72 0a 20 20 20 20 67 65 6e 2d 74 6d 70 6b 65 79 r. gen-tmpkey
7b90: 73 20 64 72 6f 70 20 74 73 6b 63 20 73 77 61 70 s drop tskc swap
7ba0: 20 6b 65 79 70 61 64 20 65 64 2d 64 68 20 64 6f keypad ed-dh do
7bb0: 2d 6b 65 79 70 61 64 20 73 65 63 21 0a 20 20 20 -keypad sec!.
7bc0: 20 6e 65 74 32 6f 2d 63 6f 64 65 30 0a 20 20 20 net2o-code0.
7bd0: 20 74 70 6b 63 20 6b 65 79 73 69 7a 65 20 24 2c tpkc keysize $,
7be0: 20 6f 6e 65 73 68 6f 74 2d 74 6d 70 6b 65 79 0a oneshot-tmpkey.
7bf0: 20 20 20 20 6e 65 73 74 5b 20 32 72 3e 20 24 2c nest[ 2r> $,
7c00: 20 69 6e 76 69 74 65 20 5d 74 6d 70 6e 65 73 74 invite ]tmpnest
7c10: 0a 20 20 20 20 63 6f 6f 6b 69 65 2b 72 65 71 75 . cookie+requ
7c20: 65 73 74 0a 20 20 20 20 65 6e 64 2d 63 6f 64 65 est. end-code
7c30: 7c 20 3b 0a 0a 5c 20 6b 65 79 20 61 70 69 20 68 | ;..\ key api h
7c40: 65 6c 70 65 72 73 0a 0a 3a 20 64 65 6c 2d 6c 61 elpers..: del-la
7c50: 73 74 2d 6b 65 79 20 28 20 2d 2d 20 29 0a 20 20 st-key ( -- ).
7c60: 20 20 6b 65 79 73 20 24 5b 5d 23 20 31 2d 20 6b keys $[]# 1- k
7c70: 65 79 73 20 24 5b 5d 20 73 65 63 2d 6f 66 66 0a eys $[] sec-off.
7c80: 20 20 20 20 6b 65 79 73 20 24 40 6c 65 6e 20 63 keys $@len c
7c90: 65 6c 6c 2d 20 6b 65 79 73 20 24 21 6c 65 6e 20 ell- keys $!len
7ca0: 3b 0a 0a 3a 20 73 74 6f 72 65 6b 65 79 21 20 28 ;..: storekey! (
7cb0: 20 2d 2d 20 29 0a 20 20 20 20 3e 73 65 63 6b 65 -- ). >secke
7cc0: 79 20 6b 65 79 73 20 24 5b 5d 23 20 30 20 3f 44 y keys $[]# 0 ?D
7cd0: 4f 20 20 32 64 75 70 20 49 20 6b 65 79 73 20 73 O 2dup I keys s
7ce0: 65 63 5b 5d 40 20 73 74 72 3d 20 49 46 0a 09 20 ec[]@ str= IF..
7cf0: 20 20 20 49 20 6b 65 79 73 20 73 65 63 5b 5d 40 I keys sec[]@
7d00: 20 64 72 6f 70 20 3e 73 74 6f 72 65 6b 65 79 20 drop >storekey
7d10: 21 20 20 4c 45 41 56 45 20 20 54 48 45 4e 20 20 ! LEAVE THEN
7d20: 4c 4f 4f 50 20 20 32 64 72 6f 70 20 3b 0a 0a 3a LOOP 2drop ;..:
7d30: 20 63 68 6f 6f 73 65 2d 6b 65 79 20 28 20 2d 2d choose-key ( --
7d40: 20 6f 20 29 0a 20 20 20 20 30 20 42 45 47 49 4e o ). 0 BEGIN
7d50: 20 20 64 72 6f 70 0a 09 2e 22 20 43 68 6f 6f 73 drop..." Choos
7d60: 65 20 6b 65 79 20 62 79 20 6e 75 6d 62 65 72 3a e key by number:
7d70: 22 20 63 72 20 2e 73 65 63 72 65 74 2d 6e 69 63 " cr .secret-nic
7d80: 6b 73 0a 09 42 45 47 49 4e 20 20 6b 65 79 20 64 ks..BEGIN key d
7d90: 75 70 20 62 6c 20 3c 20 57 48 49 4c 45 20 20 64 up bl < WHILE d
7da0: 72 6f 70 20 20 52 45 50 45 41 54 20 5c 20 73 77 rop REPEAT \ sw
7db0: 61 6c 6c 6f 77 20 63 6f 6e 74 72 6f 6c 20 6b 65 allow control ke
7dc0: 79 73 0a 09 5b 27 5d 20 64 69 67 69 74 3f 20 23 ys..['] digit? #
7dd0: 33 36 20 62 61 73 65 2d 65 78 65 63 75 74 65 20 36 base-execute
7de0: 30 3d 20 49 46 20 2d 31 20 54 48 45 4e 0a 09 73 0= IF -1 THEN..s
7df0: 65 63 72 65 74 2d 6b 65 79 20 64 75 70 20 30 3d ecret-key dup 0=
7e00: 20 57 48 49 4c 45 0a 09 20 20 20 20 2e 22 20 50 WHILE.. ." P
7e10: 6c 65 61 73 65 20 65 6e 74 65 72 20 61 20 62 61 lease enter a ba
7e20: 73 65 2d 33 36 20 6e 75 6d 62 65 72 20 62 65 74 se-36 number bet
7e30: 77 65 65 6e 20 30 20 61 6e 64 20 22 0a 09 20 20 ween 0 and "..
7e40: 20 20 73 65 63 72 65 74 2d 6b 65 79 73 23 20 31 secret-keys# 1
7e50: 2d 20 5b 27 5d 20 2e 20 23 33 36 20 62 61 73 65 - ['] . #36 base
7e60: 2d 65 78 65 63 75 74 65 20 63 72 20 20 72 64 72 -execute cr rdr
7e70: 6f 70 0a 20 20 20 20 52 45 50 45 41 54 0a 20 20 op. REPEAT.
7e80: 20 20 64 75 70 20 2e 73 74 6f 72 65 6b 65 79 21 dup .storekey!
7e90: 20 20 3e 73 74 6f 72 65 6b 65 79 20 40 20 64 65 >storekey @ de
7ea0: 66 61 75 6c 74 6b 65 79 20 21 0a 20 20 20 20 2e faultkey !. .
7eb0: 22 20 3d 3d 3d 3d 20 6b 65 79 20 22 20 64 75 70 " ==== key " dup
7ec0: 20 2e 2e 6e 69 63 6b 20 2e 22 20 20 63 68 6f 73 ..nick ." chos
7ed0: 65 6e 20 3d 3d 3d 3d 22 20 63 72 20 3b 0a 0a 5c en ====" cr ;..\
7ee0: 20 77 69 6c 6c 20 61 73 6b 20 66 6f 72 20 79 6f will ask for yo
7ef0: 75 72 20 70 61 73 73 77 6f 72 64 20 61 6e 64 20 ur password and
7f00: 69 66 20 70 6f 73 73 69 62 6c 65 20 61 75 74 6f if possible auto
7f10: 2d 73 65 6c 65 63 74 20 79 6f 75 72 20 69 64 0a -select your id.
7f20: 0a 56 61 72 69 61 62 6c 65 20 74 72 69 65 73 23 .Variable tries#
7f30: 0a 23 31 30 20 56 61 6c 75 65 20 6d 61 78 74 72 .#10 Value maxtr
7f40: 69 65 73 23 0a 0a 3a 20 67 65 74 2d 73 6b 63 20 ies#..: get-skc
7f50: 28 20 2d 2d 20 29 0a 20 20 20 20 73 65 63 72 65 ( -- ). secre
7f60: 74 2d 6b 65 79 73 23 20 3f 45 58 49 54 20 20 74 t-keys# ?EXIT t
7f70: 72 69 65 73 23 20 6f 66 66 0a 20 20 20 20 64 65 ries# off. de
7f80: 62 75 67 2d 76 65 63 74 6f 72 20 40 20 6f 70 2d bug-vector @ op-
7f90: 76 65 63 74 6f 72 20 21 40 20 3e 72 20 3c 64 65 vector !@ >r <de
7fa0: 66 61 75 6c 74 3e 0a 20 20 20 20 73 65 63 72 65 fault>. secre
7fb0: 74 2d 6b 65 79 73 23 0a 20 20 20 20 42 45 47 49 t-keys#. BEGI
7fc0: 4e 20 20 64 75 70 20 30 3d 20 74 72 69 65 73 23 N dup 0= tries#
7fd0: 20 40 20 6d 61 78 74 72 69 65 73 23 20 75 3c 20 @ maxtries# u<
7fe0: 61 6e 64 20 20 57 48 49 4c 45 20 64 72 6f 70 0a and WHILE drop.
7ff0: 09 20 20 20 20 73 22 20 50 61 73 73 70 68 72 61 . s" Passphra
8000: 73 65 3a 20 22 20 2b 70 61 73 73 70 68 72 61 73 se: " +passphras
8010: 65 20 20 20 21 74 69 6d 65 0a 09 20 20 20 20 72 e !time.. r
8020: 65 61 64 2d 6b 65 79 73 20 73 65 63 72 65 74 2d ead-keys secret-
8030: 6b 65 79 73 23 20 64 75 70 20 30 3d 20 49 46 0a keys# dup 0= IF.
8040: 09 09 5c 20 66 61 69 6c 20 72 69 67 68 74 20 61 ..\ fail right a
8050: 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 74 fter the first t
8060: 72 79 20 69 66 20 50 41 53 53 50 48 52 41 53 45 ry if PASSPHRASE
8070: 20 69 73 20 75 73 65 64 0a 09 09 5c 20 61 6e 64 is used...\ and
8080: 20 67 69 76 65 20 74 68 65 20 6d 61 78 69 6d 75 give the maximu
8090: 6d 20 77 61 69 74 69 6e 67 20 70 65 6e 61 6c 74 m waiting penalt
80a0: 79 20 69 6e 20 74 68 61 74 20 63 61 73 65 0a 09 y in that case..
80b0: 09 31 20 6d 61 78 74 72 69 65 73 23 20 73 22 20 .1 maxtries# s"
80c0: 50 41 53 53 50 48 52 41 53 45 22 20 67 65 74 65 PASSPHRASE" gete
80d0: 6e 76 20 64 30 3d 20 73 65 6c 65 63 74 20 74 72 nv d0= select tr
80e0: 69 65 73 23 20 2b 21 0a 09 09 3c 65 72 72 3e 20 ies# +!...<err>
80f0: 2e 22 20 54 72 79 23 20 22 20 74 72 69 65 73 23 ." Try# " tries#
8100: 20 40 20 30 20 2e 72 20 27 2f 27 20 65 6d 69 74 @ 0 .r '/' emit
8110: 20 6d 61 78 74 72 69 65 73 23 20 2e 0a 09 09 2e maxtries# .....
8120: 22 20 66 61 69 6c 65 64 2c 20 6e 6f 20 6b 65 79 " failed, no key
8130: 20 66 6f 75 6e 64 2c 20 77 61 69 74 69 6e 67 20 found, waiting
8140: 22 0a 09 09 23 31 20 74 72 69 65 73 23 20 40 20 "...#1 tries# @
8150: 32 2a 20 6c 73 68 69 66 74 20 64 75 70 20 2e 20 2* lshift dup .
8160: 2e 22 20 6d 73 2e 2e 2e 22 20 6d 73 20 20 3c 64 ." ms..." ms <d
8170: 65 66 61 75 6c 74 3e 20 63 72 0a 09 09 64 65 6c efault> cr...del
8180: 2d 6c 61 73 74 2d 6b 65 79 0a 09 20 20 20 20 54 -last-key.. T
8190: 48 45 4e 0a 20 20 20 20 52 45 50 45 41 54 0a 20 HEN. REPEAT.
81a0: 20 20 20 64 75 70 20 30 3d 20 49 46 20 20 23 2d dup 0= IF #-
81b0: 35 36 20 74 68 72 6f 77 20 20 54 48 45 4e 0a 20 56 throw THEN.
81c0: 20 20 20 31 20 3d 20 49 46 20 20 30 20 73 65 63 1 = IF 0 sec
81d0: 72 65 74 2d 6b 65 79 0a 09 2e 22 20 3d 3d 3d 3d ret-key..." ====
81e0: 20 6f 70 65 6e 65 64 3a 20 22 20 64 75 70 20 2e opened: " dup .
81f0: 2e 6e 69 63 6b 20 2e 22 20 20 69 6e 20 22 20 2e .nick ." in " .
8200: 74 69 6d 65 20 2e 22 20 3d 3d 3d 3d 22 20 63 72 time ." ====" cr
8210: 0a 20 20 20 20 45 4c 53 45 20 20 2e 22 20 3d 3d . ELSE ." ==
8220: 3d 3d 20 6f 70 65 6e 65 64 20 69 6e 20 22 20 2e == opened in " .
8230: 74 69 6d 65 20 2e 22 20 3d 3d 3d 3d 22 20 63 72 time ." ====" cr
8240: 20 63 68 6f 6f 73 65 2d 6b 65 79 20 20 54 48 45 choose-key THE
8250: 4e 0a 20 20 20 20 3e 72 61 77 2d 6b 65 79 20 3f N. >raw-key ?
8260: 72 73 6b 20 20 20 72 3e 20 6f 70 2d 76 65 63 74 rsk r> op-vect
8270: 6f 72 20 21 20 3b 0a 0a 73 63 6f 70 65 3a 20 6e or ! ;..scope: n
8280: 32 6f 0a 46 6f 72 77 61 72 64 20 68 65 6c 70 0a 2o.Forward help.
8290: 7d 73 63 6f 70 65 0a 0a 3a 20 67 65 74 2d 6d 79 }scope..: get-my
82a0: 2d 6b 65 79 20 28 20 2d 2d 20 78 74 20 29 0a 20 -key ( -- xt ).
82b0: 20 20 20 67 65 6e 2d 6b 65 79 73 2d 64 69 72 20 gen-keys-dir
82c0: 20 22 73 65 63 6b 65 79 73 2e 6b 32 6f 22 20 2e "seckeys.k2o" .
82d0: 6b 65 79 73 2f 20 32 64 75 70 20 66 69 6c 65 2d keys/ 2dup file-
82e0: 73 74 61 74 75 73 20 6e 69 70 0a 20 20 20 20 30 status nip. 0
82f0: 3d 20 49 46 20 20 72 2f 6f 20 6f 70 65 6e 2d 66 = IF r/o open-f
8300: 69 6c 65 20 74 68 72 6f 77 20 3e 72 20 72 40 20 ile throw >r r@
8310: 66 69 6c 65 2d 73 69 7a 65 20 74 68 72 6f 77 20 file-size throw
8320: 64 30 3d 0a 09 72 3e 20 63 6c 6f 73 65 2d 66 69 d0=..r> close-fi
8330: 6c 65 20 74 68 72 6f 77 20 20 45 4c 53 45 20 20 le throw ELSE
8340: 74 72 75 65 20 20 54 48 45 4e 0a 20 20 20 20 49 true THEN. I
8350: 46 20 20 5b 3a 20 2e 22 20 47 65 6e 65 72 61 74 F [: ." Generat
8360: 65 20 61 20 6e 65 77 20 6b 65 79 70 61 69 72 3a e a new keypair:
8370: 22 20 63 72 0a 09 20 20 67 65 74 2d 6e 69 63 6b " cr.. get-nick
8380: 20 64 75 70 20 30 3d 20 23 2d 35 36 20 61 6e 64 dup 0= #-56 and
8390: 20 74 68 72 6f 77 20 5c 20 65 6d 70 74 79 20 6e throw \ empty n
83a0: 69 63 6b 3a 20 70 72 65 74 65 6e 64 20 74 6f 20 ick: pretend to
83b0: 71 75 69 74 0a 09 20 20 6e 65 77 2d 6b 65 79 20 quit.. new-key
83c0: 2e 6b 65 79 73 20 3f 72 73 6b 20 3b 5d 0a 20 20 .keys ?rsk ;].
83d0: 20 20 45 4c 53 45 20 20 5b 27 5d 20 67 65 74 2d ELSE ['] get-
83e0: 73 6b 63 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 2e skc THEN ;..: .
83f0: 6b 65 79 69 6e 66 6f 20 28 20 2d 2d 20 29 0a 20 keyinfo ( -- ).
8400: 20 20 20 3c 77 61 72 6e 3e 20 2e 22 20 3d 3d 3d <warn> ." ===
8410: 3d 20 4e 6f 20 6b 65 79 20 6f 70 65 6e 65 64 20 = No key opened
8420: 3d 3d 3d 3d 22 20 63 72 0a 20 20 20 20 3c 69 6e ====" cr. <in
8430: 66 6f 3e 20 2e 22 20 67 65 6e 65 72 61 74 65 20 fo> ." generate
8440: 61 20 6e 65 77 20 6f 6e 65 20 77 69 74 68 20 27 a new one with '
8450: 6b 65 79 67 65 6e 27 22 20 63 72 20 3c 64 65 66 keygen'" cr <def
8460: 61 75 6c 74 3e 20 3b 0a 0a 3a 20 67 65 74 2d 6d ault> ;..: get-m
8470: 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 67 65 74 e ( -- ). get
8480: 2d 6d 79 2d 6b 65 79 20 63 61 74 63 68 20 64 75 -my-key catch du
8490: 70 20 23 2d 35 36 20 3d 20 49 46 20 64 72 6f 70 p #-56 = IF drop
84a0: 20 2e 6b 65 79 69 6e 66 6f 20 45 4c 53 45 20 74 .keyinfo ELSE t
84b0: 68 72 6f 77 20 54 48 45 4e 20 3b 0a 0a 3a 20 3f hrow THEN ;..: ?
84c0: 67 65 74 2d 6d 65 20 28 20 2d 2d 20 29 0a 20 20 get-me ( -- ).
84d0: 20 20 5c 47 20 74 68 69 73 20 76 65 72 73 69 6f \G this versio
84e0: 6e 20 6f 66 20 67 65 74 2d 6d 65 20 66 61 69 6c n of get-me fail
84f0: 73 20 68 61 72 64 20 69 66 20 6e 6f 20 6b 65 79 s hard if no key
8500: 20 69 73 20 6f 70 65 6e 65 64 0a 20 20 20 20 67 is opened. g
8510: 65 74 2d 6d 79 2d 6b 65 79 20 63 61 74 63 68 20 et-my-key catch
8520: 23 2d 35 36 20 3d 20 49 46 0a 09 2e 6b 65 79 69 #-56 = IF...keyi
8530: 6e 66 6f 20 74 72 75 65 20 21 21 6e 6f 2d 6b 65 nfo true !!no-ke
8540: 79 2d 6f 70 65 6e 21 21 0a 20 20 20 20 54 48 45 y-open!!. THE
8550: 4e 20 3b 0a 0a 30 20 5b 49 46 5d 0a 4c 6f 63 61 N ;..0 [IF].Loca
8560: 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a 66 6f 72 l Variables:.for
8570: 74 68 2d 6c 6f 63 61 6c 2d 77 6f 72 64 73 3a 0a th-local-words:.
8580: 20 20 20 20 28 0a 20 20 20 20 20 28 28 22 6e 65 (. (("ne
8590: 74 32 6f 3a 22 20 22 2b 6e 65 74 32 6f 3a 22 29 t2o:" "+net2o:")
85a0: 20 64 65 66 69 6e 69 74 69 6f 6e 2d 73 74 61 72 definition-star
85b0: 74 65 72 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 6b ter (font-lock-k
85c0: 65 79 77 6f 72 64 2d 66 61 63 65 20 2e 20 31 29 eyword-face . 1)
85d0: 0a 20 20 20 20 20 20 22 5b 20 5c 74 5c 6e 5d 22 . "[ \t\n]"
85e0: 20 74 20 6e 61 6d 65 20 28 66 6f 6e 74 2d 6c 6f t name (font-lo
85f0: 63 6b 2d 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 ck-function-name
8600: 2d 66 61 63 65 20 2e 20 33 29 29 0a 20 20 20 20 -face . 3)).
8610: 20 28 28 22 64 65 62 75 67 3a 22 20 22 66 69 65 (("debug:" "fie
8620: 6c 64 3a 22 20 22 32 66 69 65 6c 64 3a 22 20 22 ld:" "2field:" "
8630: 73 66 66 69 65 6c 64 3a 22 20 22 64 66 66 69 65 sffield:" "dffie
8640: 6c 64 3a 22 20 22 36 34 66 69 65 6c 64 3a 22 20 ld:" "64field:"
8650: 22 75 76 61 72 22 20 22 75 76 61 6c 75 65 22 29 "uvar" "uvalue")
8660: 20 6e 6f 6e 2d 69 6d 6d 65 64 69 61 74 65 20 28 non-immediate (
8670: 66 6f 6e 74 2d 6c 6f 63 6b 2d 74 79 70 65 2d 66 font-lock-type-f
8680: 61 63 65 20 2e 20 32 29 0a 20 20 20 20 20 20 22 ace . 2). "
8690: 5b 20 5c 74 5c 6e 5d 22 20 74 20 6e 61 6d 65 20 [ \t\n]" t name
86a0: 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 76 61 72 69 61 (font-lock-varia
86b0: 62 6c 65 2d 6e 61 6d 65 2d 66 61 63 65 20 2e 20 ble-name-face .
86c0: 33 29 29 0a 20 20 20 20 20 28 22 5b 61 2d 7a 30 3)). ("[a-z0
86d0: 2d 39 5d 2b 28 22 20 69 6d 6d 65 64 69 61 74 65 -9]+(" immediate
86e0: 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f 6d 6d (font-lock-comm
86f0: 65 6e 74 2d 66 61 63 65 20 2e 20 31 29 0a 20 20 ent-face . 1).
8700: 20 20 20 20 22 29 22 20 6e 69 6c 20 63 6f 6d 6d ")" nil comm
8710: 65 6e 74 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 63 ent (font-lock-c
8720: 6f 6d 6d 65 6e 74 2d 66 61 63 65 20 2e 20 31 29 omment-face . 1)
8730: 29 0a 20 20 20 20 29 0a 66 6f 72 74 68 2d 6c 6f ). ).forth-lo
8740: 63 61 6c 2d 69 6e 64 65 6e 74 2d 77 6f 72 64 73 cal-indent-words
8750: 3a 0a 20 20 20 20 28 0a 20 20 20 20 20 28 28 22 :. (. (("
8760: 6e 65 74 32 6f 3a 22 20 22 2b 6e 65 74 32 6f 3a net2o:" "+net2o:
8770: 22 29 20 28 30 20 2e 20 32 29 20 28 30 20 2e 20 ") (0 . 2) (0 .
8780: 32 29 20 6e 6f 6e 2d 69 6d 6d 65 64 69 61 74 65 2) non-immediate
8790: 29 0a 20 20 20 20 20 28 28 22 5b 3a 22 20 22 6b ). (("[:" "k
87a0: 65 79 3a 63 6f 64 65 22 29 20 28 30 20 2e 20 31 ey:code") (0 . 1
87b0: 29 20 28 30 20 2e 20 31 29 20 69 6d 6d 65 64 69 ) (0 . 1) immedi
87c0: 61 74 65 29 0a 20 20 20 20 20 28 28 22 3b 5d 22 ate). ((";]"
87d0: 20 22 65 6e 64 3a 6b 65 79 22 29 20 28 2d 31 20 "end:key") (-1
87e0: 2e 20 30 29 20 28 30 20 2e 20 2d 31 29 20 69 6d . 0) (0 . -1) im
87f0: 6d 65 64 69 61 74 65 29 0a 20 20 20 20 29 0a 45 mediate). ).E
8800: 6e 64 3a 0a 5b 54 48 45 4e 5d nd:.[THEN]