Artifact b7c3372db90ecd46cfd296831a8fd6d2d2f6dac5:
- File net2o-keys.fs — part of check-in [ee03a4c103] at 2013-09-09 22:21:27 on branch trunk — Use new way to store keys (user: bernd size: 5762)
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 72 65 71 75 69 72 65 20 6d 6b 64 age..require mkd 0020: 69 72 2e 66 73 0a 0a 56 6f 63 61 62 75 6c 61 72 ir.fs..Vocabular 0030: 79 20 6e 65 77 2d 6b 65 79 73 0a 0a 61 6c 73 6f y new-keys..also 0040: 20 6e 65 77 2d 6b 65 79 73 20 64 65 66 69 6e 69 new-keys defini 0050: 74 69 6f 6e 73 0a 0a 5c 20 61 63 63 65 70 74 20 tions..\ accept 0060: 66 6f 72 20 70 61 73 73 77 6f 72 64 20 65 6e 74 for password ent 0070: 72 79 0a 0a 3a 20 61 63 63 65 70 74 2a 20 28 20 ry..: accept* ( 0080: 61 64 64 72 20 75 20 2d 2d 20 75 27 20 29 0a 20 addr u -- u' ). 0090: 20 20 20 5c 20 61 63 63 65 70 74 2d 6c 69 6b 65 \ accept-like 00a0: 20 69 6e 70 75 74 2c 20 62 75 74 20 74 79 70 65 input, but type 00b0: 73 20 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 s * instead of t 00c0: 68 65 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 he character. 00d0: 20 64 75 70 20 3e 72 0a 20 20 20 20 42 45 47 49 dup >r. BEGI 00e0: 4e 20 20 78 6b 65 79 20 64 75 70 20 23 63 72 20 N xkey dup #cr 00f0: 3c 3e 20 57 48 49 4c 45 0a 09 20 20 20 20 64 75 <> WHILE.. du 0100: 70 20 23 62 73 20 3d 20 6f 76 65 72 20 23 64 65 p #bs = over #de 0110: 6c 20 3d 20 6f 72 20 49 46 0a 09 09 64 72 6f 70 l = or IF...drop 0120: 20 64 75 70 20 72 40 20 75 3c 20 49 46 0a 09 09 dup r@ u< IF... 0130: 20 20 20 20 6f 76 65 72 20 2b 20 3e 72 20 78 63 over + >r xc 0140: 68 61 72 2d 20 72 3e 20 6f 76 65 72 20 2d 0a 09 har- r> over -.. 0150: 09 20 20 20 20 31 20 62 61 63 6b 73 70 61 63 65 . 1 backspace 0160: 73 20 73 70 61 63 65 20 31 20 62 61 63 6b 73 70 s space 1 backsp 0170: 61 63 65 73 0a 09 09 45 4c 53 45 0a 09 09 20 20 aces...ELSE... 0180: 20 20 62 65 6c 6c 0a 09 09 54 48 45 4e 0a 09 20 bell...THEN.. 0190: 20 20 20 45 4c 53 45 0a 09 09 2d 72 6f 74 20 78 ELSE...-rot x 01a0: 63 21 2b 3f 20 30 3d 20 49 46 20 20 62 65 6c 6c c!+? 0= IF bell 01b0: 20 20 45 4c 53 45 20 20 27 e2 ac a4 27 20 78 65 ELSE '⬤' xe 01c0: 6d 69 74 20 20 54 48 45 4e 0a 09 20 20 20 20 54 mit THEN.. T 01d0: 48 45 4e 0a 20 20 20 20 52 45 50 45 41 54 20 20 HEN. REPEAT 01e0: 64 72 6f 70 20 20 6e 69 70 20 72 3e 20 73 77 61 drop nip r> swa 01f0: 70 20 2d 20 3b 0a 0a 5c 20 68 61 73 68 65 64 20 p - ;..\ hashed 0200: 6b 65 79 20 64 61 74 61 20 62 61 73 65 0a 0a 6f key data base..o 0210: 62 6a 65 63 74 20 63 6c 61 73 73 0a 20 20 20 20 bject class. 0220: 66 69 65 6c 64 3a 20 6b 65 2d 73 6b 0a 20 20 20 field: ke-sk. 0230: 20 66 69 65 6c 64 3a 20 6b 65 2d 70 6b 0a 20 20 field: ke-pk. 0240: 20 20 66 69 65 6c 64 3a 20 6b 65 2d 6e 69 63 6b field: ke-nick 0250: 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b 65 2d 70 . field: ke-p 0260: 72 6f 66 0a 20 20 20 20 66 69 65 6c 64 3a 20 6b rof. field: k 0270: 65 2d 73 69 67 73 0a 20 20 20 20 66 69 65 6c 64 e-sigs. field 0280: 3a 20 6b 65 2d 74 79 70 65 0a 20 20 20 20 36 34 : ke-type. 64 0290: 66 69 65 6c 64 3a 20 6b 65 2d 66 69 72 73 74 0a field: ke-first. 02a0: 20 20 20 20 36 34 66 69 65 6c 64 3a 20 6b 65 2d 64field: ke- 02b0: 6c 61 73 74 0a 65 6e 64 2d 63 6c 61 73 73 20 6b last.end-class k 02c0: 65 79 2d 65 6e 74 72 79 0a 0a 30 20 43 6f 6e 73 ey-entry..0 Cons 02d0: 74 61 6e 74 20 6b 65 79 23 61 6e 6f 6e 0a 31 20 tant key#anon.1 02e0: 43 6f 6e 73 74 61 6e 74 20 6b 65 79 23 75 73 65 Constant key#use 02f0: 72 0a 32 20 43 6f 6e 73 74 61 6e 74 20 6b 65 79 r.2 Constant key 0300: 23 67 72 6f 75 70 0a 0a 6b 65 79 2d 65 6e 74 72 #group..key-entr 0310: 79 20 40 20 62 75 66 66 65 72 3a 20 73 61 6d 70 y @ buffer: samp 0320: 6c 65 2d 6b 65 79 0a 0a 56 61 72 69 61 62 6c 65 le-key..Variable 0330: 20 6b 65 79 2d 74 61 62 6c 65 0a 56 61 72 69 61 key-table.Varia 0340: 62 6c 65 20 74 68 69 73 2d 6b 65 79 0a 56 61 72 ble this-key.Var 0350: 69 61 62 6c 65 20 74 68 69 73 2d 6b 65 79 69 64 iable this-keyid 0360: 0a 32 56 61 72 69 61 62 6c 65 20 61 64 64 73 69 .2Variable addsi 0370: 67 0a 73 61 6d 70 6c 65 2d 6b 65 79 20 74 68 69 g.sample-key thi 0380: 73 2d 6b 65 79 20 21 20 5c 20 64 75 6d 6d 79 0a s-key ! \ dummy. 0390: 0a 3a 20 63 75 72 72 65 6e 74 2d 6b 65 79 20 28 .: current-key ( 03a0: 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 addr u -- ). 03b0: 20 32 64 75 70 20 6b 65 79 2d 74 61 62 6c 65 20 2dup key-table 03c0: 23 40 20 64 72 6f 70 20 64 75 70 20 74 68 69 73 #@ drop dup this 03d0: 2d 6b 65 79 20 21 20 3e 6f 20 72 64 72 6f 70 20 -key ! >o rdrop 03e0: 6b 65 2d 70 6b 20 24 21 20 3b 0a 3a 20 6d 61 6b ke-pk $! ;.: mak 03f0: 65 2d 74 68 69 73 6b 65 79 20 28 20 61 64 64 72 e-thiskey ( addr 0400: 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 20 24 40 -- ). dup $@ 0410: 20 64 72 6f 70 20 74 68 69 73 2d 6b 65 79 69 64 drop this-keyid 0420: 20 21 20 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f ! cell+ $@ dro 0430: 70 20 64 75 70 20 74 68 69 73 2d 6b 65 79 20 21 p dup this-key ! 0440: 20 3e 6f 20 72 64 72 6f 70 20 3b 0a 0a 3a 20 6b >o rdrop ;..: k 0450: 65 79 3a 6e 65 77 20 28 20 61 64 64 72 20 75 20 ey:new ( addr u 0460: 2d 2d 20 29 0a 20 20 20 20 5c 20 61 64 64 72 20 -- ). \ addr 0470: 75 20 69 73 20 74 68 65 20 70 75 62 6c 69 63 20 u is the public 0480: 6b 65 79 0a 20 20 20 20 73 61 6d 70 6c 65 2d 6b key. sample-k 0490: 65 79 20 6b 65 79 2d 65 6e 74 72 79 20 40 20 32 ey key-entry @ 2 04a0: 64 75 70 20 65 72 61 73 65 0a 20 20 20 20 32 6f dup erase. 2o 04b0: 76 65 72 20 6b 65 79 2d 74 61 62 6c 65 20 23 21 ver key-table #! 04c0: 20 63 75 72 72 65 6e 74 2d 6b 65 79 20 3b 0a 0a current-key ;.. 04d0: 5c 20 73 65 61 72 63 68 20 66 6f 72 20 6b 65 79 \ search for key 04e0: 73 20 2d 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 s - not optimize 04f0: 64 0a 0a 3a 20 6e 69 63 6b 2d 6b 65 79 20 28 20 d..: nick-key ( 0500: 61 64 64 72 20 75 20 2d 2d 20 29 20 5c 20 73 65 addr u -- ) \ se 0510: 61 72 63 68 20 66 6f 72 20 6b 65 79 20 6e 69 63 arch for key nic 0520: 6b 6e 61 6d 65 20 61 6e 64 20 6d 61 6b 65 20 63 kname and make c 0530: 75 72 72 65 6e 74 0a 20 20 20 20 6b 65 79 2d 74 urrent. key-t 0540: 61 62 6c 65 20 0a 20 20 20 20 5b 3a 20 64 75 70 able . [: dup 0550: 20 3e 72 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f >r cell+ $@ dro 0560: 70 20 3e 6f 20 6b 65 2d 6e 69 63 6b 20 24 40 20 p >o ke-nick $@ 0570: 6f 3e 20 32 6f 76 65 72 20 73 74 72 3d 20 49 46 o> 2over str= IF 0580: 0a 09 72 40 20 6d 61 6b 65 2d 74 68 69 73 6b 65 ..r@ make-thiske 0590: 79 0a 20 20 20 20 54 48 45 4e 20 20 72 64 72 6f y. THEN rdro 05a0: 70 20 3b 5d 20 23 6d 61 70 20 32 64 72 6f 70 20 p ;] #map 2drop 05b0: 3b 0a 0a 5c 20 67 65 74 20 70 61 73 73 70 68 72 ;..\ get passphr 05c0: 61 73 65 0a 0a 33 20 56 61 6c 75 65 20 70 61 73 ase..3 Value pas 05d0: 73 70 68 72 61 73 65 2d 72 65 74 72 79 23 0a 24 sphrase-retry#.$ 05e0: 31 30 30 20 56 61 6c 75 65 20 70 61 73 73 70 68 100 Value passph 05f0: 72 61 73 65 2d 64 69 66 66 75 73 65 23 0a 24 31 rase-diffuse#.$1 0600: 30 30 20 43 6f 6e 73 74 61 6e 74 20 6d 61 78 2d 00 Constant max- 0610: 70 61 73 73 70 68 72 61 73 65 23 20 5c 20 32 35 passphrase# \ 25 0620: 36 20 63 68 61 72 61 63 74 65 72 73 20 73 68 6f 6 characters sho 0630: 75 6c 64 20 62 65 20 65 6e 6f 75 67 68 2e 2e 2e uld be enough... 0640: 0a 6d 61 78 2d 70 61 73 73 70 68 72 61 73 65 23 .max-passphrase# 0650: 20 62 75 66 66 65 72 3a 20 70 61 73 73 70 68 72 buffer: passphr 0660: 61 73 65 0a 0a 3a 20 70 61 73 73 70 68 72 61 73 ase..: passphras 0670: 65 2d 69 6e 20 28 20 2d 2d 20 61 64 64 72 20 75 e-in ( -- addr u 0680: 20 29 0a 20 20 20 20 70 61 73 73 70 68 72 61 73 ). passphras 0690: 65 20 64 75 70 20 6d 61 78 2d 70 61 73 73 70 68 e dup max-passph 06a0: 72 61 73 65 23 20 61 63 63 65 70 74 2a 20 3b 0a rase# accept* ;. 06b0: 0a 3a 20 3e 70 61 73 73 70 68 72 61 73 65 20 28 .: >passphrase ( 06c0: 20 61 64 64 72 20 75 20 2d 2d 20 61 64 64 72 20 addr u -- addr 06d0: 75 20 29 0a 20 20 20 20 3e 72 20 70 61 73 73 70 u ). >r passp 06e0: 68 72 61 73 65 20 72 40 20 6d 61 78 2d 70 61 73 hrase r@ max-pas 06f0: 73 70 68 72 61 73 65 23 20 75 6d 69 6e 20 6d 6f sphrase# umin mo 0700: 76 65 0a 20 20 20 20 70 61 73 73 70 68 72 61 73 ve. passphras 0710: 65 20 6d 61 78 2d 70 61 73 73 70 68 72 61 73 65 e max-passphrase 0720: 23 20 72 3e 20 73 61 66 65 2f 73 74 72 69 6e 67 # r> safe/string 0730: 20 65 72 61 73 65 0a 20 20 20 20 77 75 72 73 74 erase. wurst 0740: 2d 6b 65 79 20 3e 63 3a 6b 65 79 0a 20 20 20 20 -key >c:key. 0750: 70 61 73 73 70 68 72 61 73 65 20 6d 61 78 2d 70 passphrase max-p 0760: 61 73 73 70 68 72 61 73 65 23 20 63 3a 68 61 73 assphrase# c:has 0770: 68 0a 20 20 20 20 70 61 73 73 70 68 72 61 73 65 h. passphrase 0780: 2d 64 69 66 66 75 73 65 23 20 30 20 3f 44 4f 20 -diffuse# 0 ?DO 0790: 20 63 3a 64 69 66 66 75 73 65 20 20 4c 4f 4f 50 c:diffuse LOOP 07a0: 20 5c 20 6a 75 73 74 20 74 6f 20 77 61 73 74 65 \ just to waste 07b0: 20 74 69 6d 65 20 3b 2d 29 0a 20 20 20 20 63 3a time ;-). c: 07c0: 6b 65 79 40 20 24 34 30 20 73 61 76 65 2d 6d 65 key@ $40 save-me 07d0: 6d 20 3b 0a 0a 3a 20 67 65 74 2d 70 61 73 73 70 m ;..: get-passp 07e0: 68 72 61 73 65 20 28 20 2d 2d 20 61 64 64 72 20 hrase ( -- addr 07f0: 75 20 29 0a 20 20 20 20 70 61 73 73 70 68 72 61 u ). passphra 0800: 73 65 2d 69 6e 20 3e 70 61 73 73 70 68 72 61 73 se-in >passphras 0810: 65 20 3b 0a 0a 56 61 72 69 61 62 6c 65 20 6b 65 e ;..Variable ke 0820: 79 73 20 22 22 20 6b 65 79 73 20 24 21 0a 32 56 ys "" keys $!.2V 0830: 61 72 69 61 62 6c 65 20 6b 65 79 2b 6c 65 6e 20 ariable key+len 0840: 5c 20 63 75 72 72 65 6e 74 20 6b 65 79 20 2b 20 \ current key + 0850: 6c 65 6e 0a 0a 3a 20 2b 6b 65 79 20 28 20 61 64 len..: +key ( ad 0860: 64 72 20 75 20 2d 2d 20 29 20 6b 65 79 2b 6c 65 dr u -- ) key+le 0870: 6e 20 32 21 20 6b 65 79 2b 6c 65 6e 20 32 20 63 n 2! key+len 2 c 0880: 65 6c 6c 73 20 6b 65 79 73 20 24 2b 21 20 3b 0a ells keys $+! ;. 0890: 3a 20 2b 70 61 73 73 70 68 72 61 73 65 20 28 20 : +passphrase ( 08a0: 2d 2d 20 29 20 20 67 65 74 2d 70 61 73 73 70 68 -- ) get-passph 08b0: 72 61 73 65 20 2b 6b 65 79 20 3b 0a 3a 20 22 3e rase +key ;.: "> 08c0: 70 61 73 73 70 68 72 61 73 65 20 28 20 61 64 64 passphrase ( add 08d0: 72 20 75 20 2d 2d 20 29 20 3e 70 61 73 73 70 68 r u -- ) >passph 08e0: 72 61 73 65 20 2b 6b 65 79 20 3b 0a 3a 20 2b 73 rase +key ;.: +s 08f0: 65 63 6b 65 79 20 28 20 2d 2d 20 29 0a 20 20 20 eckey ( -- ). 0900: 20 6b 65 79 70 61 64 20 6b 65 2d 73 6b 20 24 40 keypad ke-sk $@ 0910: 20 64 72 6f 70 20 6b 65 2d 70 6b 20 24 40 20 64 drop ke-pk $@ d 0920: 72 6f 70 20 63 72 79 70 74 6f 5f 73 63 61 6c 61 rop crypto_scala 0930: 72 6d 75 6c 74 20 6b 65 79 70 61 64 20 6b 65 79 rmult keypad key 0940: 73 69 7a 65 20 2b 6b 65 79 20 3b 0a 0a 22 22 20 size +key ;.."" 0950: 22 3e 70 61 73 73 70 68 72 61 73 65 20 5c 20 66 ">passphrase \ f 0960: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 65 6e 63 ollowing the enc 0970: 72 79 70 74 2d 65 76 65 72 79 74 68 69 6e 67 20 rypt-everything 0980: 70 61 72 61 64 69 67 6d 2c 0a 5c 20 6e 6f 20 70 paradigm,.\ no p 0990: 61 73 73 77 6f 72 64 20 69 73 20 74 68 65 20 65 assword is the e 09a0: 6d 70 74 79 20 73 74 72 69 6e 67 21 20 20 49 74 mpty string! It 09b0: 27 73 20 73 74 69 6c 6c 20 65 6e 63 72 79 70 74 's still encrypt 09c0: 65 64 21 0a 0a 5c 20 61 20 73 65 63 72 65 74 20 ed!..\ a secret 09d0: 6b 65 79 20 6a 75 73 74 20 6e 65 65 64 73 20 61 key just needs a 09e0: 20 6e 69 63 6b 20 61 6e 64 20 61 20 74 79 70 65 nick and a type 09f0: 2e 0a 5c 20 53 65 63 72 65 74 20 6b 65 79 73 20 ..\ Secret keys 0a00: 63 61 6e 20 62 65 20 70 65 72 73 6f 6e 73 20 61 can be persons a 0a10: 6e 64 20 67 72 6f 75 70 73 2e 0a 0a 5c 20 61 20 nd groups...\ a 0a20: 70 75 62 6c 69 63 20 6b 65 79 20 6e 65 65 64 73 public key needs 0a30: 20 6d 6f 72 65 3a 20 6e 69 63 6b 2c 20 74 79 70 more: nick, typ 0a40: 65 2c 20 70 72 6f 66 69 6c 65 2e 0a 5c 20 54 68 e, profile..\ Th 0a50: 65 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 73 e profile is a s 0a60: 74 72 75 63 74 75 72 65 64 20 64 6f 63 75 6d 65 tructured docume 0a70: 6e 74 2c 20 69 2e 65 2e 20 70 6f 69 6e 74 65 64 nt, i.e. pointed 0a80: 20 74 6f 20 62 79 20 61 20 68 61 73 68 2e 0a 0a to by a hash... 0a90: 5c 20 61 20 73 69 67 6e 61 74 75 72 65 20 63 6f \ a signature co 0aa0: 6e 74 61 69 6e 73 20 61 20 70 75 62 6b 65 79 2c ntains a pubkey, 0ab0: 20 61 20 63 68 65 63 6b 62 6f 78 20 62 69 74 6d a checkbox bitm 0ac0: 61 73 6b 2c 0a 5c 20 61 20 64 61 74 65 2c 20 61 ask,.\ a date, a 0ad0: 6e 20 65 78 70 69 72 61 74 69 6f 6e 20 64 61 74 n expiration dat 0ae0: 65 2c 20 74 68 65 20 73 69 67 6e 65 72 27 73 20 e, the signer's 0af0: 70 75 62 6b 65 79 20 61 6e 64 20 74 68 65 20 73 pubkey and the s 0b00: 69 67 6e 61 74 75 72 65 20 69 74 73 65 6c 66 0a ignature itself. 0b10: 5c 20 28 72 2b 73 29 2e 20 20 54 68 65 72 65 20 \ (r+s). There 0b20: 69 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 73 is an optional s 0b30: 69 67 6e 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 igning protocol 0b40: 64 6f 63 75 6d 65 6e 74 20 28 68 61 73 68 29 2e document (hash). 0b50: 0a 0a 5c 20 77 65 20 73 74 6f 72 65 20 65 61 63 ..\ we store eac 0b60: 68 20 69 74 65 6d 20 69 6e 20 61 20 32 35 36 20 h item in a 256 0b70: 62 79 74 65 73 20 65 6e 63 72 79 70 74 65 64 20 bytes encrypted 0b80: 73 74 72 69 6e 67 2c 20 69 2e 65 2e 20 77 69 74 string, i.e. wit 0b90: 68 20 61 20 31 36 0a 5c 20 62 79 74 65 20 73 61 h a 16.\ byte sa 0ba0: 6c 74 20 61 6e 64 20 61 20 31 36 20 62 79 74 65 lt and a 16 byte 0bb0: 20 63 68 65 63 6b 73 75 6d 2e 0a 0a 5c 20 4b 65 checksum...\ Ke 0bc0: 79 73 20 61 72 65 20 70 61 73 73 77 6f 72 64 73 ys are passwords 0bd0: 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b 65 79 and private key 0be0: 73 20 28 73 65 6c 66 2d 6b 65 79 65 64 2c 20 69 s (self-keyed, i 0bf0: 2e 65 2e 20 70 72 69 76 61 74 65 2a 70 75 62 6c .e. private*publ 0c00: 69 63 20 6b 65 79 29 0a 0a 24 31 30 30 20 43 6f ic key)..$100 Co 0c10: 6e 73 74 61 6e 74 20 6b 65 79 70 61 63 6b 23 0a nstant keypack#. 0c20: 0a 6b 65 79 70 61 63 6b 23 20 6d 79 6b 65 79 2d .keypack# mykey- 0c30: 73 61 6c 74 23 20 2b 20 24 31 30 20 2b 20 43 6f salt# + $10 + Co 0c40: 6e 73 74 61 6e 74 20 6b 65 79 70 61 63 6b 2d 61 nstant keypack-a 0c50: 6c 6c 23 0a 0a 6b 65 79 70 61 63 6b 2d 61 6c 6c ll#..keypack-all 0c60: 23 20 62 75 66 66 65 72 3a 20 6b 65 79 70 61 63 # buffer: keypac 0c70: 6b 0a 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20 62 k.keypack-all# b 0c80: 75 66 66 65 72 3a 20 6b 65 79 70 61 63 6b 2d 64 uffer: keypack-d 0c90: 0a 0a 61 6c 73 6f 20 6e 65 74 32 6f 2d 62 61 73 ..also net2o-bas 0ca0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 0a 31 e definitions..1 0cb0: 30 30 20 6e 65 74 32 6f 3a 20 6e 65 77 6b 65 79 00 net2o: newkey 0cc0: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 6b ( addr u -- ) k 0cd0: 65 79 3a 6e 65 77 20 3b 0a 31 30 31 20 6e 65 74 ey:new ;.101 net 0ce0: 32 6f 3a 20 70 72 69 76 6b 65 79 20 28 20 61 64 2o: privkey ( ad 0cf0: 64 72 20 75 20 2d 2d 20 29 20 6b 65 2d 73 6b 20 dr u -- ) ke-sk 0d00: 24 21 20 2b 73 65 63 6b 65 79 20 3b 0a 31 30 32 $! +seckey ;.102 0d10: 20 6e 65 74 32 6f 3a 20 6b 65 79 74 79 70 65 20 net2o: keytype 0d20: 28 20 6e 20 2d 2d 20 29 20 36 34 3e 6e 20 6b 65 ( n -- ) 64>n ke 0d30: 2d 74 79 70 65 20 21 20 3b 20 5c 20 64 65 66 61 -type ! ; \ defa 0d40: 75 6c 74 3a 20 61 6e 6f 6e 79 6d 6f 75 73 0a 31 ult: anonymous.1 0d50: 30 33 20 6e 65 74 32 6f 3a 20 6b 65 79 6e 69 63 03 net2o: keynic 0d60: 6b 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 k ( addr u -- ) 0d70: 20 6b 65 2d 6e 69 63 6b 20 24 21 20 3b 0a 31 30 ke-nick $! ;.10 0d80: 34 20 6e 65 74 32 6f 3a 20 6b 65 79 70 72 6f 66 4 net2o: keyprof 0d90: 69 6c 65 20 28 20 61 64 64 72 20 75 20 2d 2d 20 ile ( addr u -- 0da0: 29 20 6b 65 2d 70 72 6f 66 20 24 21 20 3b 0a 31 ) ke-prof $! ;.1 0db0: 30 35 20 6e 65 74 32 6f 3a 20 6e 65 77 6b 65 79 05 net2o: newkey 0dc0: 73 69 67 20 28 20 61 64 64 72 20 75 20 2d 2d 20 sig ( addr u -- 0dd0: 29 20 73 61 76 65 2d 6d 65 6d 20 61 64 64 73 69 ) save-mem addsi 0de0: 67 20 32 21 0a 20 20 20 20 61 64 64 73 69 67 20 g 2!. addsig 0df0: 32 20 63 65 6c 6c 73 20 6b 65 2d 73 69 67 73 20 2 cells ke-sigs 0e00: 24 2b 21 20 3b 0a 31 30 36 20 6e 65 74 32 6f 3a $+! ;.106 net2o: 0e10: 20 6b 65 79 6d 61 73 6b 20 28 20 78 20 2d 2d 20 keymask ( x -- 0e20: 29 20 36 34 64 72 6f 70 20 3b 0a 31 30 37 20 6e ) 64drop ;.107 n 0e30: 65 74 32 6f 3a 20 6b 65 79 66 69 72 73 74 20 28 et2o: keyfirst ( 0e40: 20 64 61 74 65 2d 6e 73 20 2d 2d 20 29 20 6b 65 date-ns -- ) ke 0e50: 2d 66 69 72 73 74 20 36 34 21 20 3b 0a 31 30 38 -first 64! ;.108 0e60: 20 6e 65 74 32 6f 3a 20 6b 65 79 6c 61 73 74 20 net2o: keylast 0e70: 28 20 64 61 74 65 2d 6e 73 20 2d 2d 20 29 20 6b ( date-ns -- ) k 0e80: 65 2d 6c 61 73 74 20 36 34 21 20 3b 0a 0a 70 72 e-last 64! ;..pr 0e90: 65 76 69 6f 75 73 20 64 65 66 69 6e 69 74 69 6f evious definitio 0ea0: 6e 73 0a 0a 3a 20 6b 65 79 3a 63 6f 64 65 20 28 ns..: key:code ( 0eb0: 20 2d 2d 20 29 0a 20 20 20 20 6e 65 74 32 6f 2d -- ). net2o- 0ec0: 63 6f 64 65 30 20 6b 65 79 70 61 63 6b 20 6b 65 code0 keypack ke 0ed0: 79 70 61 63 6b 2d 61 6c 6c 23 20 65 72 61 73 65 ypack-all# erase 0ee0: 0a 20 20 20 20 6b 65 79 70 61 63 6b 20 6d 79 6b . keypack myk 0ef0: 65 79 2d 73 61 6c 74 23 20 2b 20 63 6d 64 30 73 ey-salt# + cmd0s 0f00: 6f 75 72 63 65 20 21 20 3b 0a 63 6f 6d 70 3a 20 ource ! ;.comp: 0f10: 3a 2c 20 61 6c 73 6f 20 6e 65 74 32 6f 2d 62 61 :, also net2o-ba 0f20: 73 65 20 3b 0a 0a 61 6c 73 6f 20 6e 65 74 32 6f se ;..also net2o 0f30: 2d 62 61 73 65 20 64 65 66 69 6e 69 74 69 6f 6e -base definition 0f40: 73 0a 0a 3a 20 65 6e 64 3a 6b 65 79 20 28 20 2d s..: end:key ( - 0f50: 2d 20 29 0a 20 20 20 20 65 6e 64 2d 63 6d 64 20 - ). end-cmd 0f60: 70 72 65 76 69 6f 75 73 0a 20 20 20 20 6b 65 79 previous. key 0f70: 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d 61 6c 6c pack keypack-all 0f80: 23 0a 20 20 20 20 6b 65 79 2b 6c 65 6e 20 32 40 #. key+len 2@ 0f90: 20 65 6e 63 72 79 70 74 24 0a 20 20 20 20 63 6d encrypt$. cm 0fa0: 64 6c 6f 63 6b 20 75 6e 6c 6f 63 6b 20 3b 0a 63 dlock unlock ;.c 0fb0: 6f 6d 70 3a 20 3a 2c 20 70 72 65 76 69 6f 75 73 omp: :, previous 0fc0: 20 3b 0a 0a 70 72 65 76 69 6f 75 73 20 64 65 66 ;..previous def 0fd0: 69 6e 69 74 69 6f 6e 73 0a 0a 30 20 56 61 6c 75 initions..0 Valu 0fe0: 65 20 6b 65 79 2d 66 64 0a 0a 3a 20 3f 2e 6e 65 e key-fd..: ?.ne 0ff0: 74 32 6f 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 t2o ( -- ). s 1000: 22 20 7e 2f 2e 6e 65 74 32 6f 22 20 72 2f 6f 20 " ~/.net2o" r/o 1010: 6f 70 65 6e 2d 66 69 6c 65 20 6e 69 70 20 49 46 open-file nip IF 1020: 0a 09 73 22 20 7e 2f 2e 6e 65 74 32 6f 22 20 24 ..s" ~/.net2o" $ 1030: 31 43 30 20 6d 6b 64 69 72 2d 70 61 72 65 6e 74 1C0 mkdir-parent 1040: 73 20 74 68 72 6f 77 0a 20 20 20 20 54 48 45 4e s throw. THEN 1050: 20 3b 0a 0a 3a 20 3f 6b 65 79 2d 66 64 20 28 20 ;..: ?key-fd ( 1060: 2d 2d 20 66 64 20 29 20 6b 65 79 2d 66 64 20 64 -- fd ) key-fd d 1070: 75 70 20 3f 45 58 49 54 20 64 72 6f 70 0a 20 20 up ?EXIT drop. 1080: 20 20 3f 2e 6e 65 74 32 6f 0a 20 20 20 20 22 7e ?.net2o. "~ 1090: 2f 2e 6e 65 74 32 6f 2f 6b 65 79 66 69 6c 65 2e /.net2o/keyfile. 10a0: 6e 32 6f 22 20 72 2f 77 20 6f 70 65 6e 2d 66 69 n2o" r/w open-fi 10b0: 6c 65 20 64 75 70 20 2d 35 31 34 20 3d 20 49 46 le dup -514 = IF 10c0: 0a 09 32 64 72 6f 70 20 22 7e 2f 2e 6e 65 74 32 ..2drop "~/.net2 10d0: 6f 2f 6b 65 79 66 69 6c 65 2e 6e 32 6f 22 20 72 o/keyfile.n2o" r 10e0: 2f 77 20 63 72 65 61 74 65 2d 66 69 6c 65 0a 20 /w create-file. 10f0: 20 20 20 54 48 45 4e 20 20 74 68 72 6f 77 0a 20 THEN throw. 1100: 20 20 20 64 75 70 20 74 6f 20 6b 65 79 2d 66 64 dup to key-fd 1110: 20 3b 0a 0a 3a 20 61 70 70 65 6e 64 2d 66 69 6c ;..: append-fil 1120: 65 20 28 20 61 64 64 72 20 75 20 66 64 20 2d 2d e ( addr u fd -- 1130: 20 29 20 3e 72 0a 20 20 20 20 72 40 20 66 69 6c ) >r. r@ fil 1140: 65 2d 73 69 7a 65 20 74 68 72 6f 77 20 20 72 40 e-size throw r@ 1150: 20 72 65 70 6f 73 69 74 69 6f 6e 2d 66 69 6c 65 reposition-file 1160: 20 74 68 72 6f 77 0a 20 20 20 20 72 40 20 77 72 throw. r@ wr 1170: 69 74 65 2d 66 69 6c 65 20 74 68 72 6f 77 20 20 ite-file throw 1180: 72 3e 20 66 6c 75 73 68 2d 66 69 6c 65 20 74 68 r> flush-file th 1190: 72 6f 77 20 3b 0a 0a 3a 20 6b 65 79 3e 66 69 6c row ;..: key>fil 11a0: 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 e ( -- ). key 11b0: 70 61 63 6b 20 6b 65 79 70 61 63 6b 2d 61 6c 6c pack keypack-all 11c0: 23 20 3f 6b 65 79 2d 66 64 20 61 70 70 65 6e 64 # ?key-fd append 11d0: 2d 66 69 6c 65 20 3b 0a 0a 3a 20 72 6e 64 3e 66 -file ;..: rnd>f 11e0: 69 6c 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 28 ile ( -- ). ( 11f0: 20 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 63 6b keypack keypack 1200: 2d 61 6c 6c 23 20 3e 72 6e 67 24 20 29 20 6b 65 -all# >rng$ ) ke 1210: 79 3e 66 69 6c 65 20 3b 0a 0a 3a 20 3e 6b 65 79 y>file ;..: >key 1220: 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b 65 79 s ( -- ). key 1230: 70 61 64 20 73 6b 63 20 70 6b 63 20 63 72 79 70 pad skc pkc cryp 1240: 74 6f 5f 73 63 61 6c 61 72 6d 75 6c 74 20 6b 65 to_scalarmult ke 1250: 79 70 61 64 20 6b 65 79 73 69 7a 65 20 2b 6b 65 ypad keysize +ke 1260: 79 20 3b 0a 0a 3a 20 2b 6b 65 79 70 61 69 72 20 y ;..: +keypair 1270: 28 20 74 79 70 65 20 6e 69 63 6b 20 75 20 2d 2d ( type nick u -- 1280: 20 29 0a 20 20 20 20 2b 70 61 73 73 70 68 72 61 ). +passphra 1290: 73 65 20 67 65 6e 2d 6b 65 79 73 0a 20 20 20 20 se gen-keys. 12a0: 6b 65 79 3a 63 6f 64 65 0a 20 20 20 20 20 20 20 key:code. 12b0: 20 70 6b 63 20 6b 65 79 73 69 7a 65 20 24 2c 20 pkc keysize $, 12c0: 6e 65 77 6b 65 79 20 73 6b 63 20 6b 65 79 73 69 newkey skc keysi 12d0: 7a 65 20 24 2c 20 70 72 69 76 6b 65 79 0a 20 20 ze $, privkey. 12e0: 20 20 20 20 20 20 24 2c 20 6b 65 79 6e 69 63 6b $, keynick 12f0: 20 6c 69 74 2c 20 6b 65 79 74 79 70 65 20 74 69 lit, keytype ti 1300: 63 6b 73 20 6c 69 74 2c 20 6b 65 79 66 69 72 73 cks lit, keyfirs 1310: 74 0a 20 20 20 20 65 6e 64 3a 6b 65 79 20 6b 65 t. end:key ke 1320: 79 3e 66 69 6c 65 20 3e 6b 65 79 73 20 3b 0a 0a y>file >keys ;.. 1330: 5c 20 72 65 61 64 20 6b 65 79 20 66 69 6c 65 0a \ read key file. 1340: 0a 3a 20 74 72 79 2d 64 65 63 72 79 70 74 20 28 .: try-decrypt ( 1350: 20 2d 2d 20 61 64 64 72 20 75 20 2f 20 30 20 30 -- addr u / 0 0 1360: 20 29 0a 20 20 20 20 6b 65 79 73 20 24 40 20 62 ). keys $@ b 1370: 6f 75 6e 64 73 20 3f 44 4f 0a 09 6b 65 79 70 61 ounds ?DO..keypa 1380: 63 6b 20 6b 65 79 70 61 63 6b 2d 64 20 6b 65 79 ck keypack-d key 1390: 70 61 63 6b 2d 61 6c 6c 23 20 6d 6f 76 65 0a 09 pack-all# move.. 13a0: 6b 65 79 70 61 63 6b 2d 64 20 6b 65 79 70 61 63 keypack-d keypac 13b0: 6b 2d 61 6c 6c 23 20 49 20 32 40 0a 09 64 65 63 k-all# I 2@..dec 13c0: 72 79 70 74 24 20 49 46 20 20 75 6e 6c 6f 6f 70 rypt$ IF unloop 13d0: 20 20 45 58 49 54 20 20 54 48 45 4e 0a 09 32 64 EXIT THEN..2d 13e0: 72 6f 70 0a 20 20 20 20 32 20 63 65 6c 6c 73 20 rop. 2 cells 13f0: 2b 4c 4f 4f 50 20 20 30 20 30 20 3b 0a 0a 3a 20 +LOOP 0 0 ;..: 1400: 64 6f 2d 6b 65 79 20 28 20 61 64 64 72 20 75 20 do-key ( addr u 1410: 2f 20 30 20 30 20 20 2d 2d 20 29 0a 20 20 20 20 / 0 0 -- ). 1420: 64 75 70 20 30 3d 20 49 46 20 20 32 64 72 6f 70 dup 0= IF 2drop 1430: 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 EXIT THEN. 1440: 20 28 20 32 64 75 70 20 6e 32 6f 3a 73 65 65 20 ( 2dup n2o:see 1450: 29 20 64 6f 2d 63 6d 64 2d 6c 6f 6f 70 20 3b 0a ) do-cmd-loop ;. 1460: 0a 3a 20 72 65 61 64 2d 6b 65 79 2d 6c 6f 6f 70 .: read-key-loop 1470: 20 28 20 2d 2d 20 29 0a 20 20 20 20 42 45 47 49 ( -- ). BEGI 1480: 4e 0a 09 6b 65 79 70 61 63 6b 20 6b 65 79 70 61 N..keypack keypa 1490: 63 6b 2d 61 6c 6c 23 20 3f 6b 65 79 2d 66 64 20 ck-all# ?key-fd 14a0: 72 65 61 64 2d 66 69 6c 65 20 74 68 72 6f 77 0a read-file throw. 14b0: 09 6b 65 79 70 61 63 6b 2d 61 6c 6c 23 20 3d 20 .keypack-all# = 14c0: 57 48 49 4c 45 20 20 74 72 79 2d 64 65 63 72 79 WHILE try-decry 14d0: 70 74 20 64 6f 2d 6b 65 79 0a 20 20 20 20 52 45 pt do-key. RE 14e0: 50 45 41 54 20 3b 0a 0a 3a 20 72 65 61 64 2d 6b PEAT ;..: read-k 14f0: 65 79 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 6b eys ( -- ). k 1500: 65 79 2d 66 64 20 30 3d 20 49 46 20 20 22 64 65 ey-fd 0= IF "de 1510: 66 61 75 6c 74 2e 6e 32 6f 22 20 72 2f 6f 20 6f fault.n2o" r/o o 1520: 70 65 6e 2d 66 69 6c 65 20 74 68 72 6f 77 20 74 pen-file throw t 1530: 6f 20 6b 65 79 2d 66 64 0a 09 72 65 61 64 2d 6b o key-fd..read-k 1540: 65 79 2d 6c 6f 6f 70 20 20 6b 65 79 2d 66 64 20 ey-loop key-fd 1550: 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77 close-file throw 1560: 20 20 30 20 74 6f 20 6b 65 79 2d 66 64 20 20 54 0 to key-fd T 1570: 48 45 4e 0a 20 20 20 20 30 2e 20 3f 6b 65 79 2d HEN. 0. ?key- 1580: 66 64 20 72 65 70 6f 73 69 74 69 6f 6e 2d 66 69 fd reposition-fi 1590: 6c 65 20 74 68 72 6f 77 20 20 72 65 61 64 2d 6b le throw read-k 15a0: 65 79 2d 6c 6f 6f 70 20 3b 0a 0a 5c 20 72 65 76 ey-loop ;..\ rev 15b0: 65 72 74 0a 0a 70 72 65 76 69 6f 75 73 20 64 65 ert..previous de 15c0: 66 69 6e 69 74 69 6f 6e 73 0a 0a 61 6c 73 6f 20 finitions..also 15d0: 6e 65 77 2d 6b 65 79 73 0a 0a 3a 20 3e 6b 65 79 new-keys..: >key 15e0: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 ( addr u -- ). 15f0: 20 20 20 6b 65 79 2d 74 61 62 6c 65 20 40 20 30 key-table @ 0 1600: 3d 20 49 46 20 20 72 65 61 64 2d 6b 65 79 73 20 = IF read-keys 1610: 20 54 48 45 4e 0a 20 20 20 20 6e 69 63 6b 2d 6b THEN. nick-k 1620: 65 79 20 20 74 68 69 73 2d 6b 65 79 69 64 20 40 ey this-keyid @ 1630: 20 30 3d 20 3f 45 58 49 54 0a 20 20 20 20 74 68 0= ?EXIT. th 1640: 69 73 2d 6b 65 79 69 64 20 40 20 70 6b 63 20 6b is-keyid @ pkc k 1650: 65 79 73 69 7a 65 20 6d 6f 76 65 0a 20 20 20 20 eysize move. 1660: 6b 65 2d 73 6b 20 24 40 20 73 6b 63 20 73 77 61 ke-sk $@ skc swa 1670: 70 20 6d 6f 76 65 20 3b 0a 0a 70 72 65 76 69 6f p move ;..previo 1680: 75 73 us