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