\ key handling
require mkdir.fs
: ?.net2o ( -- )
s" ~/.net2o" r/o open-file nip IF
s" ~/.net2o" $1C0 mkdir-parents throw
THEN ;
: key-in ( dest addr u -- )
r/o open-file throw { fd }
keysize fd read-file throw keysize <> !!nokey!!
fd close-file throw ;
: key-out ( source addr u -- )
r/w create-file throw { fd }
keysize fd write-file throw
fd close-file throw ;
keysize buffer: testkey
keysize buffer: testskc
keysize buffer: passskc
: check-key? ( addr -- flag ) >r
testkey r@ base9 crypto_scalarmult
testkey keysize pkc over str= IF r@ skc keysize move true
ELSE false THEN rdrop ;
3 Value passphrase-retry#
$100 Value passphrase-diffuse#
: get-passphrase ( addrin -- addrout )
passskc keysize move wurst-source !key
message state# 8 * 2dup accept dup >r safe/string erase
r> IF
source-init wurst-key hash-init
message roundsh# rounds
passphrase-diffuse# 0 ?DO start-diffuse LOOP \ just to waste time ;-)
wurst-state passskc keysize xors
wurst-state keysize + passskc keysize xors
THEN passskc ;
: read-keys ( -- ) ?.net2o
pkc s" ~/.net2o/pubkey.ecc" key-in
testskc s" ~/.net2o/seckey.ecc" key-in
testskc check-key? ?EXIT
passphrase-retry# 0 ?DO
cr ." Passphrase: "
testskc get-passphrase check-key? IF unloop EXIT THEN
LOOP !!nokey!! ;
: new-passphrase ( -- )
passphrase-retry# 0 ?DO
cr ." Enter Passphrase: " skc get-passphrase
testskc keysize move
cr ." Reenter Passphrase: " skc get-passphrase
testskc keysize tuck str= IF unloop EXIT THEN
LOOP !!nokey!! ;
: write-keys ( -- ) ?.net2o
new-passphrase
pkc s" ~/.net2o/pubkey.ecc" key-out
testskc s" ~/.net2o/seckey.ecc" key-out ;
: ?keypair ( -- )
['] read-keys catch IF nothrow gen-keys write-keys THEN ;