v2 / vlib / crypto / cipher / aes_cbc_test.v
56 lines · 46 sloc · 1.63 KB · 43c45d95824f378b9edc46017e3c2382ccb54bc9
Raw
1// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
2// Use of this source code is governed by an MIT license
3// that can be found in the LICENSE file.
4import crypto.aes
5import crypto.cipher
6
7fn test_aes_cbc_double() {
8 orig1 := []u8{len: 64, init: index}
9 orig2 := []u8{len: 16, init: index}
10 key := []u8{len: 16}
11 iv := []u8{len: 16}
12
13 mut block := aes.new_cipher(key)
14 mut en_cbc := cipher.new_cbc(block, iv)
15 mut cip1 := []u8{len: orig1.len}
16 mut cip2 := []u8{len: orig2.len}
17 en_cbc.encrypt_blocks(mut cip1, orig1)
18 en_cbc.encrypt_blocks(mut cip2, orig2)
19
20 mut block2 := aes.new_cipher(key)
21 mut dec_cbc := cipher.new_cbc(block2, iv)
22 mut plain1 := []u8{len: orig1.len}
23 mut plain2 := []u8{len: orig2.len}
24 dec_cbc.decrypt_blocks(mut plain1, cip1)
25 dec_cbc.decrypt_blocks(mut plain2, cip2)
26
27 assert plain1 == orig1
28 assert plain2 == orig2
29}
30
31fn test_aes_cbc() {
32 key := '6368616e676520746869732070617373'.bytes()
33 iv := '1234567890123456'.bytes()
34 str := '73c86d43a9d700a253a96c85b0f6b03ac9792e0e757f869cca306bd3cba1c62b'
35
36 mut src := str.bytes()
37
38 aes_cbc_en(mut src, key, iv)
39 assert src.hex() == '20f36e39e6b73a040d3d39445d0282369033693076d1129a68a3364c00a81c508ec06ab94ff5104c321939fbfb9313c549fd68df100a8a23e8006a863733a8fd'
40
41 aes_cbc_de(mut src, key, iv)
42 assert src.bytestr() == str
43 println('test_aes_cbc ok')
44}
45
46fn aes_cbc_en(mut src []u8, key []u8, iv []u8) {
47 block := aes.new_cipher(key)
48 mut mode := cipher.new_cbc(block, iv)
49 mode.encrypt_blocks(mut src, src.clone())
50}
51
52fn aes_cbc_de(mut src []u8, key []u8, iv []u8) {
53 block := aes.new_cipher(key)
54 mut mode := cipher.new_cbc(block, iv)
55 mode.decrypt_blocks(mut src, src.clone())
56}
57