xref: /vim-8.2.3635/src/testdir/test_crypt.vim (revision a5d4f3b0)
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