1680e015bSBram Moolenaar" Tests for encryption. 21eceadafSBram Moolenaar 3b46fecd3SBram Moolenaarsource check.vim 4b46fecd3SBram MoolenaarCheckFeature cryptv 5680e015bSBram Moolenaar 6*a5d4f3b0SJames McCoylet s:xxd_cmd = '' 7*a5d4f3b0SJames McCoyif empty($XXDPROG) && executable('..\xxd\xxd.exe') 8*a5d4f3b0SJames McCoy let s:xxd_cmd = '..\xxd\xxd.exe' 9*a5d4f3b0SJames McCoyelseif !empty($XXDPROG) && executable($XXDPROG) 10*a5d4f3b0SJames McCoy let s:xxd_cmd = $XXDPROG 11*a5d4f3b0SJames McCoyendif 12*a5d4f3b0SJames McCoy 13680e015bSBram Moolenaarfunc Common_head_only(text) 14680e015bSBram Moolenaar " This was crashing Vim 15680e015bSBram Moolenaar split Xtest.txt 16680e015bSBram Moolenaar call setline(1, a:text) 17680e015bSBram Moolenaar wq 18680e015bSBram Moolenaar call feedkeys(":split Xtest.txt\<CR>foobar\<CR>", "tx") 19680e015bSBram Moolenaar call delete('Xtest.txt') 20680e015bSBram Moolenaar call assert_match('VimCrypt', getline(1)) 21680e015bSBram Moolenaar bwipe! 22680e015bSBram Moolenaarendfunc 23680e015bSBram Moolenaar 24680e015bSBram Moolenaarfunc Test_head_only_2() 25680e015bSBram Moolenaar call Common_head_only('VimCrypt~02!abc') 26680e015bSBram Moolenaarendfunc 27680e015bSBram Moolenaar 28680e015bSBram Moolenaarfunc Test_head_only_3() 29680e015bSBram Moolenaar call Common_head_only('VimCrypt~03!abc') 30680e015bSBram Moolenaarendfunc 3117777857SBram Moolenaar 32f573c6e1SChristian Brabandtfunc Test_head_only_4() 33f573c6e1SChristian Brabandt CheckFeature sodium 34f573c6e1SChristian Brabandt call Common_head_only('VimCrypt~04!abc') 35f573c6e1SChristian Brabandtendfunc 36f573c6e1SChristian Brabandt 3717777857SBram Moolenaarfunc Crypt_uncrypt(method) 3817777857SBram Moolenaar exe "set cryptmethod=" . a:method 3917777857SBram Moolenaar " If the blowfish test fails 'cryptmethod' will be 'zip' now. 4017777857SBram Moolenaar call assert_equal(a:method, &cryptmethod) 4117777857SBram Moolenaar 4217777857SBram Moolenaar split Xtest.txt 4317777857SBram Moolenaar let text = ['01234567890123456789012345678901234567', 4417777857SBram Moolenaar \ 'line 2 foo bar blah', 4517777857SBram Moolenaar \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'] 4617777857SBram Moolenaar call setline(1, text) 4717777857SBram Moolenaar call feedkeys(":X\<CR>foobar\<CR>foobar\<CR>", 'xt') 48987411dbSBram Moolenaar call assert_equal('*****', &key) 4917777857SBram Moolenaar w! 5017777857SBram Moolenaar bwipe! 5117777857SBram Moolenaar call feedkeys(":split Xtest.txt\<CR>foobar\<CR>", 'xt') 5217777857SBram Moolenaar call assert_equal(text, getline(1, 3)) 5317777857SBram Moolenaar set key= cryptmethod& 5417777857SBram Moolenaar bwipe! 5517777857SBram Moolenaar call delete('Xtest.txt') 5617777857SBram Moolenaarendfunc 5717777857SBram Moolenaar 5817777857SBram Moolenaarfunc Test_crypt_zip() 5917777857SBram Moolenaar call Crypt_uncrypt('zip') 6017777857SBram Moolenaarendfunc 6117777857SBram Moolenaar 6217777857SBram Moolenaarfunc Test_crypt_blowfish() 6317777857SBram Moolenaar call Crypt_uncrypt('blowfish') 6417777857SBram Moolenaarendfunc 6517777857SBram Moolenaar 6617777857SBram Moolenaarfunc Test_crypt_blowfish2() 6717777857SBram Moolenaar call Crypt_uncrypt('blowfish2') 6817777857SBram Moolenaarendfunc 6917777857SBram Moolenaar 70f573c6e1SChristian Brabandtfunc Test_crypt_sodium() 71f573c6e1SChristian Brabandt CheckFeature sodium 72f573c6e1SChristian Brabandt call Crypt_uncrypt('xchacha20') 73f573c6e1SChristian Brabandtendfunc 74f573c6e1SChristian Brabandt 7517777857SBram Moolenaarfunc Uncrypt_stable(method, crypted_text, key, uncrypted_text) 7617777857SBram Moolenaar split Xtest.txt 7717777857SBram Moolenaar set bin noeol key= fenc=latin1 7817777857SBram Moolenaar exe "set cryptmethod=" . a:method 7917777857SBram Moolenaar call setline(1, a:crypted_text) 8017777857SBram Moolenaar w! 8117777857SBram Moolenaar bwipe! 8217777857SBram Moolenaar set nobin 8317777857SBram Moolenaar call feedkeys(":split Xtest.txt\<CR>" . a:key . "\<CR>", 'xt') 8417777857SBram Moolenaar call assert_equal(a:uncrypted_text, getline(1, len(a:uncrypted_text))) 8517777857SBram Moolenaar bwipe! 8617777857SBram Moolenaar call delete('Xtest.txt') 8717777857SBram Moolenaar set key= 8817777857SBram Moolenaarendfunc 8917777857SBram Moolenaar 90f573c6e1SChristian Brabandtfunc Uncrypt_stable_xxd(method, hex, key, uncrypted_text) 91*a5d4f3b0SJames McCoy if empty(s:xxd_cmd) 92*a5d4f3b0SJames McCoy throw 'Skipped: xxd program missing' 93*a5d4f3b0SJames McCoy endif 94f573c6e1SChristian Brabandt " use xxd to write the binary content 95*a5d4f3b0SJames McCoy call system(s:xxd_cmd .. ' -r >Xtest.txt', a:hex) 96f573c6e1SChristian Brabandt call feedkeys(":split Xtest.txt\<CR>" . a:key . "\<CR>", 'xt') 97f573c6e1SChristian Brabandt call assert_equal(a:uncrypted_text, getline(1, len(a:uncrypted_text))) 98f573c6e1SChristian Brabandt bwipe! 99f573c6e1SChristian Brabandt call delete('Xtest.txt') 100f573c6e1SChristian Brabandt set key= 101f573c6e1SChristian Brabandtendfunc 102f573c6e1SChristian Brabandt 10317777857SBram Moolenaarfunc Test_uncrypt_zip() 10417777857SBram Moolenaar call Uncrypt_stable('zip', "VimCrypt~01!\u0006\u001clV'\u00de}Mg\u00a0\u00ea\u00a3V\u00a9\u00e7\u0007E#3\u008e2U\u00e9\u0097", "foofoo", ["1234567890", "aábbccddeëff"]) 10517777857SBram Moolenaarendfunc 10617777857SBram Moolenaar 10717777857SBram Moolenaarfunc Test_uncrypt_blowfish() 10817777857SBram Moolenaar call Uncrypt_stable('blowfish', "VimCrypt~02!k)\u00be\u0017\u0097#\u0016\u00ddS\u009c\u00f5=\u00ba\u00e0\u00c8#\u00a5M\u00b4\u0086J\u00c3A\u00cd\u00a5M\u00b4\u0086!\u0080\u0015\u009b\u00f5\u000f\u00e1\u00d2\u0019\u0082\u0016\u0098\u00f7\u000d\u00da", "barbar", ["asdfasdfasdf", "0001112223333"]) 10917777857SBram Moolenaarendfunc 11017777857SBram Moolenaar 111f573c6e1SChristian Brabandtfunc Test_uncrypt_blowfish2a() 11217777857SBram Moolenaar call Uncrypt_stable('blowfish', "VimCrypt~03!\u001e\u00d1N\u00e3;\u00d3\u00c0\u00a0^C)\u0004\u00f7\u007f.\u00b6\u00abF\u000eS\u0019\u00e0\u008b6\u00d2[T\u00cb\u00a7\u0085\u00d8\u00be9\u000b\u00812\u000bQ\u00b3\u00cc@\u0097\u000f\u00df\u009a\u00adIv\u00aa.\u00d8\u00c9\u00ee\u009e`\u00bd$\u00af%\u00d0", "barburp", ["abcdefghijklmnopqrstuvwxyz", "!@#$%^&*()_+=-`~"]) 11317777857SBram Moolenaarendfunc 114987411dbSBram Moolenaar 115f573c6e1SChristian Brabandtfunc Test_uncrypt_blowfish2() 116f573c6e1SChristian Brabandt call Uncrypt_stable('blowfish2', "VimCrypt~03!\u001e\u00d1N\u00e3;\u00d3\u00c0\u00a0^C)\u0004\u00f7\u007f.\u00b6\u00abF\u000eS\u0019\u00e0\u008b6\u00d2[T\u00cb\u00a7\u0085\u00d8\u00be9\u000b\u00812\u000bQ\u00b3\u00cc@\u0097\u000f\u00df\u009a\u00adIv\u00aa.\u00d8\u00c9\u00ee\u009e`\u00bd$\u00af%\u00d0", "barburp", ["abcdefghijklmnopqrstuvwxyz", "!@#$%^&*()_+=-`~"]) 117f573c6e1SChristian Brabandtendfunc 118f573c6e1SChristian Brabandt 119f573c6e1SChristian Brabandtfunc Test_uncrypt_xchacha20() 120f573c6e1SChristian Brabandt CheckFeature sodium 121f573c6e1SChristian Brabandt let hex=['00000000: 5669 6d43 7279 7074 7e30 3421 6b7d e607 vimCrypt~04!k}..', 122f573c6e1SChristian Brabandt \ '00000010: 4ea4 e99f 923e f67f 7b59 a80d 3bca 2f06 N....>..{Y..;./.', 123f573c6e1SChristian Brabandt \ '00000020: fa11 b951 8d09 0dc9 470f e7cf 8b90 4310 ...Q....G.....C.', 124f573c6e1SChristian Brabandt \ '00000030: 653b b83b e493 378b 0390 0e38 f912 626b e;.;..7....8..bk', 125f573c6e1SChristian Brabandt \ '00000040: a02e 4697 0254 2625 2d8e 3a0b 784b e89c ..F..T&%-.:.xK..', 126f573c6e1SChristian Brabandt \ '00000050: 0c67 a975 3c17 9319 8ffd 1463 7783 a1f3 .g.u<......cw...', 127f573c6e1SChristian Brabandt \ '00000060: d917 dcb3 8b3e ecd7 c7d4 086b 6059 7ead .....>.....k`Y~.', 128f573c6e1SChristian Brabandt \ '00000070: 9b07 f96b 5c1b 4d08 cd91 f208 5221 7484 ...k\.M.....R!t.', 129f573c6e1SChristian Brabandt \ '00000080: 72be 0136 84a1 d3 r..6...'] 130f573c6e1SChristian Brabandt " the file should be in latin1 encoding, this makes sure that readfile() 131f573c6e1SChristian Brabandt " retries several times converting the multi-byte characters 132f573c6e1SChristian Brabandt call Uncrypt_stable_xxd('xchacha20', hex, "sodium_crypt", ["abcdefghijklmnopqrstuvwxyzäöü", "ZZZ_äüöÄÜÖ_!@#$%^&*()_+=-`~"]) 133f573c6e1SChristian Brabandtendfunc 134f573c6e1SChristian Brabandt 135f573c6e1SChristian Brabandtfunc Test_uncrypt_xchacha20_invalid() 136f573c6e1SChristian Brabandt CheckFeature sodium 137db864727SBram Moolenaar 138f573c6e1SChristian Brabandt " load an invalid encrypted file and verify it can be decrypted with an 139f573c6e1SChristian Brabandt " error message 140f573c6e1SChristian Brabandt try 141f573c6e1SChristian Brabandt call feedkeys(":split samples/crypt_sodium_invalid.txt\<CR>sodium\<CR>", 'xt') 142f573c6e1SChristian Brabandt call assert_false(1, 'should not happen') 143f573c6e1SChristian Brabandt catch 144f573c6e1SChristian Brabandt call assert_exception('pre-mature') 145f573c6e1SChristian Brabandt endtry 1468a4c812eSChristian Brabandt call assert_match("Note: Encryption of swapfile not supported, disabling swap file", execute(':5messages')) 147f573c6e1SChristian Brabandt 148f573c6e1SChristian Brabandt call assert_equal(0, &swapfile) 149f573c6e1SChristian Brabandt call assert_equal("xchacha20", &cryptmethod) 150f573c6e1SChristian Brabandt call assert_equal('311111111111111111111111', getline('$')) 151f573c6e1SChristian Brabandt bw! 152f573c6e1SChristian Brabandtendfunc 153f573c6e1SChristian Brabandt 154f573c6e1SChristian Brabandtfunc Test_uncrypt_xchacha20_2() 155f573c6e1SChristian Brabandt CheckFeature sodium 156db864727SBram Moolenaar 157f573c6e1SChristian Brabandt sp Xcrypt_sodium.txt 158f573c6e1SChristian Brabandt " Create a larger file, so that Vim will write in several blocks 159f573c6e1SChristian Brabandt call setline(1, range(1,4000)) 160f573c6e1SChristian Brabandt call assert_equal(1, &swapfile) 161f573c6e1SChristian Brabandt set cryptmethod=xchacha20 162f573c6e1SChristian Brabandt call feedkeys(":X\<CR>sodium\<CR>sodium\<CR>", 'xt') 163f573c6e1SChristian Brabandt " swapfile disabled 164f573c6e1SChristian Brabandt call assert_equal(0, &swapfile) 1658a4c812eSChristian Brabandt call assert_match("Note: Encryption of swapfile not supported, disabling swap file", execute(':messages')) 166f573c6e1SChristian Brabandt w! 167f573c6e1SChristian Brabandt " encrypted using xchacha20 168f573c6e1SChristian Brabandt call assert_match("\[xchacha20\]", execute(':messages')) 169f573c6e1SChristian Brabandt bw! 170f573c6e1SChristian Brabandt call feedkeys(":sp Xcrypt_sodium.txt\<CR>sodium\<CR>", 'xt') 171f573c6e1SChristian Brabandt " successfully decrypted 172f573c6e1SChristian Brabandt call assert_equal(range(1, 4000)->map( {_, v -> string(v)}), getline(1,'$')) 173f573c6e1SChristian Brabandt set key= 174db864727SBram Moolenaar w! ++ff=unix 17516e26a31SChristian Brabandt " enryption removed (on MS-Windows the .* matches [unix]) 17616e26a31SChristian Brabandt call assert_match('"Xcrypt_sodium.txt".*4000L, 18893B written', execute(':message')) 177f573c6e1SChristian Brabandt bw! 178f573c6e1SChristian Brabandt call delete('Xcrypt_sodium.txt') 179f573c6e1SChristian Brabandt set cryptmethod&vim 180f573c6e1SChristian Brabandtendfunc 181f573c6e1SChristian Brabandt 182f573c6e1SChristian Brabandtfunc Test_uncrypt_xchacha20_3_persistent_undo() 183f573c6e1SChristian Brabandt CheckFeature sodium 184f573c6e1SChristian Brabandt CheckFeature persistent_undo 185db864727SBram Moolenaar 186f573c6e1SChristian Brabandt sp Xcrypt_sodium_undo.txt 187f573c6e1SChristian Brabandt set cryptmethod=xchacha20 undofile 188f573c6e1SChristian Brabandt call feedkeys(":X\<CR>sodium\<CR>sodium\<CR>", 'xt') 1898a4c812eSChristian Brabandt call assert_equal(1, &undofile) 190f573c6e1SChristian Brabandt let ufile=undofile(@%) 191f573c6e1SChristian Brabandt call append(0, ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']) 192f573c6e1SChristian Brabandt call cursor(1, 1) 193f573c6e1SChristian Brabandt 194f573c6e1SChristian Brabandt set undolevels=100 195f573c6e1SChristian Brabandt normal dd 196f573c6e1SChristian Brabandt set undolevels=100 197f573c6e1SChristian Brabandt normal dd 198f573c6e1SChristian Brabandt set undolevels=100 199f573c6e1SChristian Brabandt normal dd 200f573c6e1SChristian Brabandt set undolevels=100 201f573c6e1SChristian Brabandt w! 2028a4c812eSChristian Brabandt call assert_equal(0, &undofile) 203f573c6e1SChristian Brabandt bw! 204f573c6e1SChristian Brabandt call feedkeys(":sp Xcrypt_sodium_undo.txt\<CR>sodium\<CR>", 'xt') 205f573c6e1SChristian Brabandt " should fail 206f573c6e1SChristian Brabandt norm! u 207f573c6e1SChristian Brabandt call assert_match('Already at oldest change', execute(':1mess')) 208f573c6e1SChristian Brabandt call assert_fails('verbose rundo ' .. fnameescape(ufile), 'E822') 209f573c6e1SChristian Brabandt bw! 210f573c6e1SChristian Brabandt set undolevels& cryptmethod& undofile& 211f573c6e1SChristian Brabandt call delete('Xcrypt_sodium_undo.txt') 212f573c6e1SChristian Brabandtendfunc 213f573c6e1SChristian Brabandt 214f573c6e1SChristian Brabandtfunc Test_encrypt_xchacha20_missing() 215f573c6e1SChristian Brabandt if has("sodium") 216f573c6e1SChristian Brabandt return 217f573c6e1SChristian Brabandt endif 218f573c6e1SChristian Brabandt sp Xcrypt_sodium_undo.txt 219f573c6e1SChristian Brabandt call assert_fails(':set cryptmethod=xchacha20', 'E474') 220f573c6e1SChristian Brabandt bw! 221f573c6e1SChristian Brabandt set cm& 222f573c6e1SChristian Brabandtendfunc 223f573c6e1SChristian Brabandt 224987411dbSBram Moolenaarfunc Test_uncrypt_unknown_method() 225987411dbSBram Moolenaar split Xuncrypt_unknown.txt 226987411dbSBram Moolenaar set bin noeol key= fenc=latin1 227987411dbSBram Moolenaar call setline(1, "VimCrypt~93!\u001e\u00d1") 228987411dbSBram Moolenaar w! 229987411dbSBram Moolenaar bwipe! 230987411dbSBram Moolenaar set nobin 231987411dbSBram Moolenaar call assert_fails(":split Xuncrypt_unknown.txt", 'E821:') 232987411dbSBram Moolenaar 233987411dbSBram Moolenaar bwipe! 234987411dbSBram Moolenaar call delete('Xuncrypt_unknown.txt') 235987411dbSBram Moolenaar set key= 236987411dbSBram Moolenaarendfunc 237987411dbSBram Moolenaar 238987411dbSBram Moolenaarfunc Test_crypt_key_mismatch() 239987411dbSBram Moolenaar set cryptmethod=blowfish 240987411dbSBram Moolenaar 241987411dbSBram Moolenaar split Xtest.txt 242987411dbSBram Moolenaar call setline(1, 'nothing') 243987411dbSBram Moolenaar call feedkeys(":X\<CR>foobar\<CR>nothing\<CR>", 'xt') 244987411dbSBram Moolenaar call assert_match("Keys don't match!", execute(':2messages')) 245987411dbSBram Moolenaar call assert_equal('', &key) 246987411dbSBram Moolenaar call feedkeys("\<CR>\<CR>", 'xt') 247987411dbSBram Moolenaar 248987411dbSBram Moolenaar set cryptmethod& 249987411dbSBram Moolenaar bwipe! 250987411dbSBram Moolenaarendfunc 251987411dbSBram Moolenaar 25276cb6830SBram Moolenaarfunc Test_crypt_set_key_changes_buffer() 25376cb6830SBram Moolenaar 25476cb6830SBram Moolenaar new Xtest1.txt 25576cb6830SBram Moolenaar call setline(1, 'nothing') 25676cb6830SBram Moolenaar set cryptmethod=blowfish2 25776cb6830SBram Moolenaar call feedkeys(":X\<CR>foobar\<CR>foobar\<CR>", 'xt') 25876cb6830SBram Moolenaar call assert_fails(":q", "E37:") 25976cb6830SBram Moolenaar w 26076cb6830SBram Moolenaar set key=anotherkey 26176cb6830SBram Moolenaar call assert_fails(":bw") 26276cb6830SBram Moolenaar w 26376cb6830SBram Moolenaar call feedkeys(":X\<CR>foobar\<CR>foobar\<CR>", 'xt') 26476cb6830SBram Moolenaar call assert_fails(":bw") 26576cb6830SBram Moolenaar w 26676cb6830SBram Moolenaar let winnr = winnr() 26776cb6830SBram Moolenaar wincmd p 26876cb6830SBram Moolenaar call setwinvar(winnr, '&key', 'yetanotherkey') 26976cb6830SBram Moolenaar wincmd p 27076cb6830SBram Moolenaar call assert_fails(":bw") 27176cb6830SBram Moolenaar w 27276cb6830SBram Moolenaar 27376cb6830SBram Moolenaar set cryptmethod& 27476cb6830SBram Moolenaar set key= 27576cb6830SBram Moolenaar bwipe! 27676cb6830SBram Moolenaar call delete('Xtest1.txt') 27776cb6830SBram Moolenaarendfunc 2786d91bcb4SBram Moolenaar 2796d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 280