Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Add new method for vault key exchange |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
211b96e714f107d787b164ba7677129b |
| User & Date: | bernd 2019-06-05 22:15:40.565 |
Context
|
2019-06-06
| ||
| 16:10 | Fix typo check-in: 44cc61b6df user: bernd tags: trunk | |
|
2019-06-05
| ||
| 22:15 | Add new method for vault key exchange check-in: 211b96e714 user: bernd tags: trunk | |
|
2019-06-04
| ||
| 23:30 | A threefish-based approach at vault key storage check-in: ae70f6a3f5 user: bernd tags: trunk | |
Changes
Changes to crypt.fs.
| ︙ | ︙ | |||
46 47 48 49 50 51 52 |
$100 uvar keydump-buf \ buffer for dumping keys
state2# uvar vkey \ maximum size for session key
state2# uvar voutkey \ for keydump
keysize uvar keygendh
keysize uvar vpk
keysize uvar vsk
tf_ctx_256 uvar tf-key
| < | 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
$100 uvar keydump-buf \ buffer for dumping keys
state2# uvar vkey \ maximum size for session key
state2# uvar voutkey \ for keydump
keysize uvar keygendh
keysize uvar vpk
keysize uvar vsk
tf_ctx_256 uvar tf-key
keysize uvar tf-out
$10 uvar tf-hashout
1 64s uvar last-mykey
cell uvar keytmp-up
end-class keytmp-c
user-o keybuf \ storage for secure permanent keys
|
| ︙ | ︙ | |||
626 627 628 629 630 631 632 |
gen>host "host" >delete +sig$ ;
\ Vault support code (generic and more compact)
\ principle: use Threefish_256.
\ block layout:
\ 1. 32 byte ephemeral key -> use for DHE.
| | | > | | | | > | 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 |
gen>host "host" >delete +sig$ ;
\ Vault support code (generic and more compact)
\ principle: use Threefish_256.
\ block layout:
\ 1. 32 byte ephemeral key -> use for DHE.
\ 2. 16 byte IV, used for all blocks as incrementing tweak
\ 3. 16 byte hash, to check for success
\ 4. 32 byte each blocks, decrypted by DHE+tweak in ECB mode
: >vdhe ( addr -- ) sk@ drop swap tf-key tf_ctx_256-key ed-dh 2drop ;
: >viv ( addr -- ) tf-key tf_ctx_256-tweak $10 move ;
: v-dec-loop ( addr u -- session-key u / 0 0 )
over { chk } $10 /string $C { mode }
bounds U+DO
tf-key I tf-out mode tf_decrypt_256
c:0key tf-out keysize c:hash tf-hashout $10 c:hash@
tf-hashout $10 chk over str= IF
tf-out keysize unloop EXIT THEN
tf-key tf_tweak256++
4 to mode
keysize +LOOP 0 0 ;
: v-dec$ ( addr u -- session-key u / 0 0 )
over >vdhe keysize /string
over >viv $10 /string
v-dec-loop ;
: vdhe ( -- ) vsk vpk ed-keypair vpk keysize type ;
: viv ( -- ) $10 rng$ 2dup type tf-key tf_ctx_256-tweak swap move ;
: vsessionkey ( -- )
keysize rng$ vkey state# move-rep
c:0key vkey keysize c:hash tf-hashout $10 2dup c:hash@ type ;
: v-enc-loop ( keylist -- )
[: drop vsk swap tf-key tf_ctx_256-key ed-dh 2drop
tf-key vkey tf-out $C tf_encrypt_256
tf-out keysize type
tf-key tf_tweak256++
;] $[]map ;
: v-enc-gen ( keylist -- )
vdhe viv vsessionkey v-enc-loop ;
: v-enc$ ( keylist -- addr u )
['] v-enc-gen $tmp ;
\\\
|
| ︙ | ︙ |
Changes to debugging.fs.
| ︙ | ︙ | |||
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | debug: quicksig( \ quick check for sigs debug: slurp( \ debug slurp&spit debug: wallet( \ debug wallet stuff debug: qr( \ qr code stuff debug: deprecated( \ deprecated stuff debug: unhandled( \ unhandled commands debug: syncfile( \ synchronous file operations -db profile( \ don't profile by default ) +db ipv6( \ ipv6 should be on by default ) +db ipv4( \ ipv4 should be on by default ) +db syncfile( \ disable async file operations for now ) \ key debugging task : toggle ( addr -- ) dup @ 0= swap ! ; 0 Value debug-task | > > | 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | debug: quicksig( \ quick check for sigs debug: slurp( \ debug slurp&spit debug: wallet( \ debug wallet stuff debug: qr( \ qr code stuff debug: deprecated( \ deprecated stuff debug: unhandled( \ unhandled commands debug: syncfile( \ synchronous file operations debug: newvault( \ new style vault keys -db profile( \ don't profile by default ) +db ipv6( \ ipv6 should be on by default ) +db ipv4( \ ipv4 should be on by default ) -db newvault( \ new vault disabled for now ) +db syncfile( \ disable async file operations for now ) \ key debugging task : toggle ( addr -- ) dup @ 0= swap ! ; 0 Value debug-task |
| ︙ | ︙ |
Changes to ed25519-donnalib.fs.
| ︙ | ︙ | |||
29 30 31 32 33 34 35 36 37 38 39 40 41 42 | \c } c-function raw>sc25519 expand_raw256_modm a a -- void ( sc char[32] -- ) c-function nb>sc25519 expand256_modm a a n -- void ( sc char[64] n -- ) c-function sc25519>32b contract256_modm a a -- void ( char[32] sc -- ) c-function sc25519* mul256_modm a a a -- void ( r x y -- ) c-function sc25519+ add256_modm a a a -- void ( r x y -- ) c-function ge25519*base ge25519_scalarmult_base a a -- void ( ger x -- ) c-function ge25519-pack ge25519_pack a a -- void ( r ger -- ) c-function ge25519+ ge25519_add a a a -- void ( a a a -- ) c-function ge25519-unpack- ge25519_unpack_negative_vartime a a -- n ( r p -- flag ) c-function ge25519*+ ge25519_double_scalarmult_vartime a a a a -- void ( r p s1 s2 -- ) c-function ge25519*v ge25519_scalarmult_vartime a a a -- void ( r p s -- ) | > | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | \c } c-function raw>sc25519 expand_raw256_modm a a -- void ( sc char[32] -- ) c-function nb>sc25519 expand256_modm a a n -- void ( sc char[64] n -- ) c-function sc25519>32b contract256_modm a a -- void ( char[32] sc -- ) c-function sc25519* mul256_modm a a a -- void ( r x y -- ) c-function sc25519+ add256_modm a a a -- void ( r x y -- ) c-function sc25519/ invert256_modm a a -- void ( recip s -- ) c-function ge25519*base ge25519_scalarmult_base a a -- void ( ger x -- ) c-function ge25519-pack ge25519_pack a a -- void ( r ger -- ) c-function ge25519+ ge25519_add a a a -- void ( a a a -- ) c-function ge25519-unpack- ge25519_unpack_negative_vartime a a -- n ( r p -- flag ) c-function ge25519*+ ge25519_double_scalarmult_vartime a a a a -- void ( r p s1 s2 -- ) c-function ge25519*v ge25519_scalarmult_vartime a a a -- void ( r p s -- ) |
| ︙ | ︙ |
Changes to n2o.fs.
| ︙ | ︙ | |||
202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
\U keysearch|searchkey 85string1 .. 85stringn
\G keysearch: search for keys prefixed with base85 strings,
\G keysearch: and import them into the key chain
?get-me init-client
keys>search search-keys insert-keys save-pubkeys
?cr keylist ;
: perm ( -- )
\U perm @user1 .. @usern permissions ..
\G perm: Change or set permissions. permission starts with
\G perm: + for adding permissions
\G perm: - for taking away permissions
\G perm: = sets defaults, add or subtract permissions afterwards
\G perm: no prefix for setting permissions exactly
| > > > > > | 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
\U keysearch|searchkey 85string1 .. 85stringn
\G keysearch: search for keys prefixed with base85 strings,
\G keysearch: and import them into the key chain
?get-me init-client
keys>search search-keys insert-keys save-pubkeys
?cr keylist ;
: whoami ( -- )
\U whoami
\G whoami: print your own key
?get-me pk@ key>o ..key-list ;
: perm ( -- )
\U perm @user1 .. @usern permissions ..
\G perm: Change or set permissions. permission starts with
\G perm: + for adding permissions
\G perm: - for taking away permissions
\G perm: = sets defaults, add or subtract permissions afterwards
\G perm: no prefix for setting permissions exactly
|
| ︙ | ︙ |
Changes to threefishlib.fs.
| ︙ | ︙ | |||
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
\c int flags=flags1;
\c while(n>=64) {
\c tf_decrypt_512(ctx, c, c, flags);
\c flags=flags2; c+=8; n-=64;
\c ctx->tweak[1] += !++(ctx->tweak[0]);
\c }
\c }
\ -------===< structs >===--------
\ tf_ctx_256
begin-structure tf_ctx_256
drop 0 40 +field tf_ctx_256-key
drop 40 24 +field tf_ctx_256-tweak
drop 64 end-structure
\ tf_ctx
begin-structure tf_ctx
drop 0 72 +field tf_ctx-key
drop 72 24 +field tf_ctx-tweak
drop 96 end-structure
\ ------===< functions >===-------
c-function tf_encrypt tf_encrypt_512 a a a n -- void
c-function tf_decrypt tf_decrypt_512 a a a n -- void
c-function tf_encrypt_256 tf_encrypt_256 a a a n -- void
c-function tf_decrypt_256 tf_decrypt_256 a a a n -- void
c-function tf_encrypt_loop tf_encrypt_loop a a n n n -- void
c-function tf_decrypt_loop tf_decrypt_loop a a n n n -- void
| > > > > > > > > > > | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
\c int flags=flags1;
\c while(n>=64) {
\c tf_decrypt_512(ctx, c, c, flags);
\c flags=flags2; c+=8; n-=64;
\c ctx->tweak[1] += !++(ctx->tweak[0]);
\c }
\c }
\c void tf_tweak256_pp(struct tf_ctx_256 *ctx)
\c {
\c ctx->tweak[1] += !++(ctx->tweak[0]);
\c }
\c void tf_tweak512_pp(struct tf_ctx_512 *ctx)
\c {
\c ctx->tweak[1] += !++(ctx->tweak[0]);
\c }
\ -------===< structs >===--------
\ tf_ctx_256
begin-structure tf_ctx_256
drop 0 40 +field tf_ctx_256-key
drop 40 24 +field tf_ctx_256-tweak
drop 64 end-structure
\ tf_ctx
begin-structure tf_ctx
drop 0 72 +field tf_ctx-key
drop 72 24 +field tf_ctx-tweak
drop 96 end-structure
\ ------===< functions >===-------
c-function tf_encrypt tf_encrypt_512 a a a n -- void
c-function tf_decrypt tf_decrypt_512 a a a n -- void
c-function tf_encrypt_256 tf_encrypt_256 a a a n -- void
c-function tf_decrypt_256 tf_decrypt_256 a a a n -- void
c-function tf_encrypt_loop tf_encrypt_loop a a n n n -- void
c-function tf_decrypt_loop tf_decrypt_loop a a n n n -- void
c-function tf_tweak256++ tf_tweak256_pp a -- void
c-function tf_tweak512++ tf_tweak512_pp a -- void
|
Changes to vault.fs.
| ︙ | ︙ | |||
87 88 89 90 91 92 93 |
+net2o: vault-auth ( $:auth -- )
\g block authentication, 64 byte block
c-state @ 7 <> !!no-data!!
\ otherwise would expose some data
$> v-kstate c:key> v-kstate $40 str= 0= !!vault-auth!!
write-decrypt \ write a chunk out
4 c-state xor! ; \ step back to allow fault-file
| | > > | 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
+net2o: vault-auth ( $:auth -- )
\g block authentication, 64 byte block
c-state @ 7 <> !!no-data!!
\ otherwise would expose some data
$> v-kstate c:key> v-kstate $40 str= 0= !!vault-auth!!
write-decrypt \ write a chunk out
4 c-state xor! ; \ step back to allow fault-file
+net2o: vault-dhe-keys ( $:dhe+keys -- ) c-state @ !!inv-order!!
$> v-dec$ 2dup d0= !!unknown-key!! v-key state# move-rep
3 c-state or! ;
vault-table $save
' context-table is gen-table
also }scope
$80 Constant min-align#
|
| ︙ | ︙ | |||
121 122 123 124 125 126 127 |
: vdhe, ( -- ) vsk vpk ed-keypair vpk keysize $, dhe ;
: vkeys, ( key-list -- )
vaultkey $100 erase
enc-mode @ $FF and $20 - rng$ vkey state# move-rep
vkey( ." vkey key: " vkey state# 85type forth:cr )
enc-mode @ dup ulit, vault-crypt 8 rshift $FF and >crypt
[: [: drop vsk swap keygendh ed-dh 2>r
| | | | > > | 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
: vdhe, ( -- ) vsk vpk ed-keypair vpk keysize $, dhe ;
: vkeys, ( key-list -- )
vaultkey $100 erase
enc-mode @ $FF and $20 - rng$ vkey state# move-rep
vkey( ." vkey key: " vkey state# 85type forth:cr )
enc-mode @ dup ulit, vault-crypt 8 rshift $FF and >crypt
[: [: drop vsk swap keygendh ed-dh 2>r
vkey vaultkey $10 + enc-mode @ $FF and $20 - move
vaultkey enc-mode @ $FF and 2r> encrypt$
vaultkey enc-mode @ $FF and forth:type ;] $[]map ;] $tmp
$, vault-keys 0 >crypt ;
: vdhe-keys, ( key-list -- )
v-enc$ $, vault-dhe-keys 0 >crypt ;
: vfile-in ( -- )
enc-filename $@ enc-file $slurp-file ;
: vfile-pad ( -- )
enc-file $@len dup >r vault-aligned enc-file $!len
enc-file $@ r> /string dup enc-padding ! erase ;
: vfile-enc ( -- )
vkey( ." vkey file: " vkey state# 85type forth:cr )
|
| ︙ | ︙ | |||
149 150 151 152 153 154 155 |
0 >crypt
vkey( ." vkey sig: " vkey state# 85type forth:cr )
2dup vkey state# encrypt$ $, vault-sig ;
: encfile-rest ( key-list -- ) >vault >r
code-buf$ cmdreset init-reply
pk@ key| r@ $+[]! \ encrypt for ourself
| | > > | 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
0 >crypt
vkey( ." vkey sig: " vkey state# 85type forth:cr )
2dup vkey state# encrypt$ $, vault-sig ;
: encfile-rest ( key-list -- ) >vault >r
code-buf$ cmdreset init-reply
pk@ key| r@ $+[]! \ encrypt for ourself
"v2o" 4cc,
newvault( r> vdhe-keys, )else( vdhe, r> vkeys, )
vfile, vsig,
s" .v2o" enc-filename $+!
enc-filename $@ [: >r cmd$ $@ r> write-file throw ;] new-file
code0-buf dispose n:o> ;
: encrypt-file ( filename u key-list -- )
>r enc-filename $! vfile-in r> encfile-rest ;
|
| ︙ | ︙ |