IGE block cipher mode for Go.
IGE is a block cipher mode usually used with AES. It's most notably used in Telegram's MTProto Protocol. It can be defined as the following function:
c_i = f_k(p_i ^ c_{i-1}) ^ p_{i-1}
c_i
is ciphertext of thei
blockp_i
is plaintext of thei
blockf_k
is the block cipher function withk
as the key
Here is a diagram of the above function:
Note that c_0
and m_0
in the diagram represent the initilization vectors. This implementation requires an initialization vector of two blocks. The first block is used as c_0
. The second block is used as m_0
.
I'm using the test vectors described in the official OpenSSL IGE paper. You can execute the tests yourself by running:
$ go test
00010203 04050607 08090A0B 0C0D0E0F
00010203 04050607 08090A0B 0C0D0E0F
10111213 14151617 18191A1B 1C1D1E1F
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
1A8519A6 557BE652 E9DA8E43 DA4EF445
3CF456B4 CA488AA3 83C79C98 B34797CB
54686973 20697320 616E2069 6D706C65
6D656E74 6174696F 6E206F66 20494745
206D6F64 6520666F 72204F70 656E5353
99706487 A1CDE613 BC6DE0B6 F24B1C7A
A448C8B9 C3403E34 67A8CAD8 9340F53B
4C2E204C 65742773 20686F70 65204265
6E20676F 74206974 20726967 6874210A