1680e015bSBram Moolenaar" Tests for encryption. 21eceadafSBram Moolenaar 3b46fecd3SBram Moolenaarsource check.vim 4b46fecd3SBram MoolenaarCheckFeature cryptv 5680e015bSBram Moolenaar 6680e015bSBram Moolenaarfunc Common_head_only(text) 7680e015bSBram Moolenaar " This was crashing Vim 8680e015bSBram Moolenaar split Xtest.txt 9680e015bSBram Moolenaar call setline(1, a:text) 10680e015bSBram Moolenaar wq 11680e015bSBram Moolenaar call feedkeys(":split Xtest.txt\<CR>foobar\<CR>", "tx") 12680e015bSBram Moolenaar call delete('Xtest.txt') 13680e015bSBram Moolenaar call assert_match('VimCrypt', getline(1)) 14680e015bSBram Moolenaar bwipe! 15680e015bSBram Moolenaarendfunc 16680e015bSBram Moolenaar 17680e015bSBram Moolenaarfunc Test_head_only_2() 18680e015bSBram Moolenaar call Common_head_only('VimCrypt~02!abc') 19680e015bSBram Moolenaarendfunc 20680e015bSBram Moolenaar 21680e015bSBram Moolenaarfunc Test_head_only_3() 22680e015bSBram Moolenaar call Common_head_only('VimCrypt~03!abc') 23680e015bSBram Moolenaarendfunc 2417777857SBram Moolenaar 25f573c6e1SChristian Brabandtfunc Test_head_only_4() 26f573c6e1SChristian Brabandt CheckFeature sodium 27f573c6e1SChristian Brabandt call Common_head_only('VimCrypt~04!abc') 28f573c6e1SChristian Brabandtendfunc 29f573c6e1SChristian Brabandt 3017777857SBram Moolenaarfunc Crypt_uncrypt(method) 3117777857SBram Moolenaar exe "set cryptmethod=" . a:method 3217777857SBram Moolenaar " If the blowfish test fails 'cryptmethod' will be 'zip' now. 3317777857SBram Moolenaar call assert_equal(a:method, &cryptmethod) 3417777857SBram Moolenaar 3517777857SBram Moolenaar split Xtest.txt 3617777857SBram Moolenaar let text = ['01234567890123456789012345678901234567', 3717777857SBram Moolenaar \ 'line 2 foo bar blah', 3817777857SBram Moolenaar \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'] 3917777857SBram Moolenaar call setline(1, text) 4017777857SBram Moolenaar call feedkeys(":X\<CR>foobar\<CR>foobar\<CR>", 'xt') 41987411dbSBram Moolenaar call assert_equal('*****', &key) 4217777857SBram Moolenaar w! 4317777857SBram Moolenaar bwipe! 4417777857SBram Moolenaar call feedkeys(":split Xtest.txt\<CR>foobar\<CR>", 'xt') 4517777857SBram Moolenaar call assert_equal(text, getline(1, 3)) 4617777857SBram Moolenaar set key= cryptmethod& 4717777857SBram Moolenaar bwipe! 4817777857SBram Moolenaar call delete('Xtest.txt') 4917777857SBram Moolenaarendfunc 5017777857SBram Moolenaar 5117777857SBram Moolenaarfunc Test_crypt_zip() 5217777857SBram Moolenaar call Crypt_uncrypt('zip') 5317777857SBram Moolenaarendfunc 5417777857SBram Moolenaar 5517777857SBram Moolenaarfunc Test_crypt_blowfish() 5617777857SBram Moolenaar call Crypt_uncrypt('blowfish') 5717777857SBram Moolenaarendfunc 5817777857SBram Moolenaar 5917777857SBram Moolenaarfunc Test_crypt_blowfish2() 6017777857SBram Moolenaar call Crypt_uncrypt('blowfish2') 6117777857SBram Moolenaarendfunc 6217777857SBram Moolenaar 63f573c6e1SChristian Brabandtfunc Test_crypt_sodium() 64f573c6e1SChristian Brabandt CheckFeature sodium 65f573c6e1SChristian Brabandt call Crypt_uncrypt('xchacha20') 66f573c6e1SChristian Brabandtendfunc 67f573c6e1SChristian Brabandt 6817777857SBram Moolenaarfunc Uncrypt_stable(method, crypted_text, key, uncrypted_text) 6917777857SBram Moolenaar split Xtest.txt 7017777857SBram Moolenaar set bin noeol key= fenc=latin1 7117777857SBram Moolenaar exe "set cryptmethod=" . a:method 7217777857SBram Moolenaar call setline(1, a:crypted_text) 7317777857SBram Moolenaar w! 7417777857SBram Moolenaar bwipe! 7517777857SBram Moolenaar set nobin 7617777857SBram Moolenaar call feedkeys(":split Xtest.txt\<CR>" . a:key . "\<CR>", 'xt') 7717777857SBram Moolenaar call assert_equal(a:uncrypted_text, getline(1, len(a:uncrypted_text))) 7817777857SBram Moolenaar bwipe! 7917777857SBram Moolenaar call delete('Xtest.txt') 8017777857SBram Moolenaar set key= 8117777857SBram Moolenaarendfunc 8217777857SBram Moolenaar 83f573c6e1SChristian Brabandtfunc Uncrypt_stable_xxd(method, hex, key, uncrypted_text) 84f573c6e1SChristian Brabandt " use xxd to write the binary content 85f573c6e1SChristian Brabandt call system('xxd -r >Xtest.txt', a:hex) 86f573c6e1SChristian Brabandt call feedkeys(":split Xtest.txt\<CR>" . a:key . "\<CR>", 'xt') 87f573c6e1SChristian Brabandt call assert_equal(a:uncrypted_text, getline(1, len(a:uncrypted_text))) 88f573c6e1SChristian Brabandt bwipe! 89f573c6e1SChristian Brabandt call delete('Xtest.txt') 90f573c6e1SChristian Brabandt set key= 91f573c6e1SChristian Brabandtendfunc 92f573c6e1SChristian Brabandt 9317777857SBram Moolenaarfunc Test_uncrypt_zip() 9417777857SBram 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"]) 9517777857SBram Moolenaarendfunc 9617777857SBram Moolenaar 9717777857SBram Moolenaarfunc Test_uncrypt_blowfish() 9817777857SBram 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"]) 9917777857SBram Moolenaarendfunc 10017777857SBram Moolenaar 101f573c6e1SChristian Brabandtfunc Test_uncrypt_blowfish2a() 10217777857SBram 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", "!@#$%^&*()_+=-`~"]) 10317777857SBram Moolenaarendfunc 104987411dbSBram Moolenaar 105f573c6e1SChristian Brabandtfunc Test_uncrypt_blowfish2() 106f573c6e1SChristian 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", "!@#$%^&*()_+=-`~"]) 107f573c6e1SChristian Brabandtendfunc 108f573c6e1SChristian Brabandt 109f573c6e1SChristian Brabandtfunc Test_uncrypt_xchacha20() 110f573c6e1SChristian Brabandt CheckFeature sodium 111f573c6e1SChristian Brabandt let hex=['00000000: 5669 6d43 7279 7074 7e30 3421 6b7d e607 vimCrypt~04!k}..', 112f573c6e1SChristian Brabandt \ '00000010: 4ea4 e99f 923e f67f 7b59 a80d 3bca 2f06 N....>..{Y..;./.', 113f573c6e1SChristian Brabandt \ '00000020: fa11 b951 8d09 0dc9 470f e7cf 8b90 4310 ...Q....G.....C.', 114f573c6e1SChristian Brabandt \ '00000030: 653b b83b e493 378b 0390 0e38 f912 626b e;.;..7....8..bk', 115f573c6e1SChristian Brabandt \ '00000040: a02e 4697 0254 2625 2d8e 3a0b 784b e89c ..F..T&%-.:.xK..', 116f573c6e1SChristian Brabandt \ '00000050: 0c67 a975 3c17 9319 8ffd 1463 7783 a1f3 .g.u<......cw...', 117f573c6e1SChristian Brabandt \ '00000060: d917 dcb3 8b3e ecd7 c7d4 086b 6059 7ead .....>.....k`Y~.', 118f573c6e1SChristian Brabandt \ '00000070: 9b07 f96b 5c1b 4d08 cd91 f208 5221 7484 ...k\.M.....R!t.', 119f573c6e1SChristian Brabandt \ '00000080: 72be 0136 84a1 d3 r..6...'] 120f573c6e1SChristian Brabandt " the file should be in latin1 encoding, this makes sure that readfile() 121f573c6e1SChristian Brabandt " retries several times converting the multi-byte characters 122f573c6e1SChristian Brabandt call Uncrypt_stable_xxd('xchacha20', hex, "sodium_crypt", ["abcdefghijklmnopqrstuvwxyzäöü", "ZZZ_äüöÄÜÖ_!@#$%^&*()_+=-`~"]) 123f573c6e1SChristian Brabandtendfunc 124f573c6e1SChristian Brabandt 125f573c6e1SChristian Brabandtfunc Test_uncrypt_xchacha20_invalid() 126f573c6e1SChristian Brabandt CheckFeature sodium 127db864727SBram Moolenaar 128f573c6e1SChristian Brabandt " load an invalid encrypted file and verify it can be decrypted with an 129f573c6e1SChristian Brabandt " error message 130f573c6e1SChristian Brabandt try 131f573c6e1SChristian Brabandt call feedkeys(":split samples/crypt_sodium_invalid.txt\<CR>sodium\<CR>", 'xt') 132f573c6e1SChristian Brabandt call assert_false(1, 'should not happen') 133f573c6e1SChristian Brabandt catch 134f573c6e1SChristian Brabandt call assert_exception('pre-mature') 135f573c6e1SChristian Brabandt endtry 136*8a4c812eSChristian Brabandt call assert_match("Note: Encryption of swapfile not supported, disabling swap file", execute(':5messages')) 137f573c6e1SChristian Brabandt 138f573c6e1SChristian Brabandt call assert_equal(0, &swapfile) 139f573c6e1SChristian Brabandt call assert_equal("xchacha20", &cryptmethod) 140f573c6e1SChristian Brabandt call assert_equal('311111111111111111111111', getline('$')) 141f573c6e1SChristian Brabandt bw! 142f573c6e1SChristian Brabandtendfunc 143f573c6e1SChristian Brabandt 144f573c6e1SChristian Brabandtfunc Test_uncrypt_xchacha20_2() 145f573c6e1SChristian Brabandt CheckFeature sodium 146db864727SBram Moolenaar 147f573c6e1SChristian Brabandt sp Xcrypt_sodium.txt 148f573c6e1SChristian Brabandt " Create a larger file, so that Vim will write in several blocks 149f573c6e1SChristian Brabandt call setline(1, range(1,4000)) 150f573c6e1SChristian Brabandt call assert_equal(1, &swapfile) 151f573c6e1SChristian Brabandt set cryptmethod=xchacha20 152f573c6e1SChristian Brabandt call feedkeys(":X\<CR>sodium\<CR>sodium\<CR>", 'xt') 153f573c6e1SChristian Brabandt " swapfile disabled 154f573c6e1SChristian Brabandt call assert_equal(0, &swapfile) 155*8a4c812eSChristian Brabandt call assert_match("Note: Encryption of swapfile not supported, disabling swap file", execute(':messages')) 156f573c6e1SChristian Brabandt w! 157f573c6e1SChristian Brabandt " encrypted using xchacha20 158f573c6e1SChristian Brabandt call assert_match("\[xchacha20\]", execute(':messages')) 159f573c6e1SChristian Brabandt bw! 160f573c6e1SChristian Brabandt call feedkeys(":sp Xcrypt_sodium.txt\<CR>sodium\<CR>", 'xt') 161f573c6e1SChristian Brabandt " successfully decrypted 162f573c6e1SChristian Brabandt call assert_equal(range(1, 4000)->map( {_, v -> string(v)}), getline(1,'$')) 163f573c6e1SChristian Brabandt set key= 164db864727SBram Moolenaar w! ++ff=unix 16516e26a31SChristian Brabandt " enryption removed (on MS-Windows the .* matches [unix]) 16616e26a31SChristian Brabandt call assert_match('"Xcrypt_sodium.txt".*4000L, 18893B written', execute(':message')) 167f573c6e1SChristian Brabandt bw! 168f573c6e1SChristian Brabandt call delete('Xcrypt_sodium.txt') 169f573c6e1SChristian Brabandt set cryptmethod&vim 170f573c6e1SChristian Brabandtendfunc 171f573c6e1SChristian Brabandt 172f573c6e1SChristian Brabandtfunc Test_uncrypt_xchacha20_3_persistent_undo() 173f573c6e1SChristian Brabandt CheckFeature sodium 174f573c6e1SChristian Brabandt CheckFeature persistent_undo 175db864727SBram Moolenaar 176f573c6e1SChristian Brabandt sp Xcrypt_sodium_undo.txt 177f573c6e1SChristian Brabandt set cryptmethod=xchacha20 undofile 178f573c6e1SChristian Brabandt call feedkeys(":X\<CR>sodium\<CR>sodium\<CR>", 'xt') 179*8a4c812eSChristian Brabandt call assert_equal(1, &undofile) 180f573c6e1SChristian Brabandt let ufile=undofile(@%) 181f573c6e1SChristian Brabandt call append(0, ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']) 182f573c6e1SChristian Brabandt call cursor(1, 1) 183f573c6e1SChristian Brabandt 184f573c6e1SChristian Brabandt set undolevels=100 185f573c6e1SChristian Brabandt normal dd 186f573c6e1SChristian Brabandt set undolevels=100 187f573c6e1SChristian Brabandt normal dd 188f573c6e1SChristian Brabandt set undolevels=100 189f573c6e1SChristian Brabandt normal dd 190f573c6e1SChristian Brabandt set undolevels=100 191f573c6e1SChristian Brabandt w! 192*8a4c812eSChristian Brabandt call assert_equal(0, &undofile) 193f573c6e1SChristian Brabandt bw! 194f573c6e1SChristian Brabandt call feedkeys(":sp Xcrypt_sodium_undo.txt\<CR>sodium\<CR>", 'xt') 195f573c6e1SChristian Brabandt " should fail 196f573c6e1SChristian Brabandt norm! u 197f573c6e1SChristian Brabandt call assert_match('Already at oldest change', execute(':1mess')) 198f573c6e1SChristian Brabandt call assert_fails('verbose rundo ' .. fnameescape(ufile), 'E822') 199f573c6e1SChristian Brabandt bw! 200f573c6e1SChristian Brabandt set undolevels& cryptmethod& undofile& 201f573c6e1SChristian Brabandt call delete('Xcrypt_sodium_undo.txt') 202f573c6e1SChristian Brabandtendfunc 203f573c6e1SChristian Brabandt 204f573c6e1SChristian Brabandtfunc Test_encrypt_xchacha20_missing() 205f573c6e1SChristian Brabandt if has("sodium") 206f573c6e1SChristian Brabandt return 207f573c6e1SChristian Brabandt endif 208f573c6e1SChristian Brabandt sp Xcrypt_sodium_undo.txt 209f573c6e1SChristian Brabandt call assert_fails(':set cryptmethod=xchacha20', 'E474') 210f573c6e1SChristian Brabandt bw! 211f573c6e1SChristian Brabandt set cm& 212f573c6e1SChristian Brabandtendfunc 213f573c6e1SChristian Brabandt 214987411dbSBram Moolenaarfunc Test_uncrypt_unknown_method() 215987411dbSBram Moolenaar split Xuncrypt_unknown.txt 216987411dbSBram Moolenaar set bin noeol key= fenc=latin1 217987411dbSBram Moolenaar call setline(1, "VimCrypt~93!\u001e\u00d1") 218987411dbSBram Moolenaar w! 219987411dbSBram Moolenaar bwipe! 220987411dbSBram Moolenaar set nobin 221987411dbSBram Moolenaar call assert_fails(":split Xuncrypt_unknown.txt", 'E821:') 222987411dbSBram Moolenaar 223987411dbSBram Moolenaar bwipe! 224987411dbSBram Moolenaar call delete('Xuncrypt_unknown.txt') 225987411dbSBram Moolenaar set key= 226987411dbSBram Moolenaarendfunc 227987411dbSBram Moolenaar 228987411dbSBram Moolenaarfunc Test_crypt_key_mismatch() 229987411dbSBram Moolenaar set cryptmethod=blowfish 230987411dbSBram Moolenaar 231987411dbSBram Moolenaar split Xtest.txt 232987411dbSBram Moolenaar call setline(1, 'nothing') 233987411dbSBram Moolenaar call feedkeys(":X\<CR>foobar\<CR>nothing\<CR>", 'xt') 234987411dbSBram Moolenaar call assert_match("Keys don't match!", execute(':2messages')) 235987411dbSBram Moolenaar call assert_equal('', &key) 236987411dbSBram Moolenaar call feedkeys("\<CR>\<CR>", 'xt') 237987411dbSBram Moolenaar 238987411dbSBram Moolenaar set cryptmethod& 239987411dbSBram Moolenaar bwipe! 240987411dbSBram Moolenaarendfunc 241987411dbSBram Moolenaar 24276cb6830SBram Moolenaarfunc Test_crypt_set_key_changes_buffer() 24376cb6830SBram Moolenaar 24476cb6830SBram Moolenaar new Xtest1.txt 24576cb6830SBram Moolenaar call setline(1, 'nothing') 24676cb6830SBram Moolenaar set cryptmethod=blowfish2 24776cb6830SBram Moolenaar call feedkeys(":X\<CR>foobar\<CR>foobar\<CR>", 'xt') 24876cb6830SBram Moolenaar call assert_fails(":q", "E37:") 24976cb6830SBram Moolenaar w 25076cb6830SBram Moolenaar set key=anotherkey 25176cb6830SBram Moolenaar call assert_fails(":bw") 25276cb6830SBram Moolenaar w 25376cb6830SBram Moolenaar call feedkeys(":X\<CR>foobar\<CR>foobar\<CR>", 'xt') 25476cb6830SBram Moolenaar call assert_fails(":bw") 25576cb6830SBram Moolenaar w 25676cb6830SBram Moolenaar let winnr = winnr() 25776cb6830SBram Moolenaar wincmd p 25876cb6830SBram Moolenaar call setwinvar(winnr, '&key', 'yetanotherkey') 25976cb6830SBram Moolenaar wincmd p 26076cb6830SBram Moolenaar call assert_fails(":bw") 26176cb6830SBram Moolenaar w 26276cb6830SBram Moolenaar 26376cb6830SBram Moolenaar set cryptmethod& 26476cb6830SBram Moolenaar set key= 26576cb6830SBram Moolenaar bwipe! 26676cb6830SBram Moolenaar call delete('Xtest1.txt') 26776cb6830SBram Moolenaarendfunc 2686d91bcb4SBram Moolenaar 2696d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 270