# ige IGE block cipher mode for Go. Forked from [karlmcguire/ige](https://github.com/karlmcguire/ige). ## about IGE is a block cipher mode usually used with AES. It's most notably used in Telegram's [MTProto Protocol](https://core.telegram.org/mtproto). 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 the `i` block * `p_i` is plaintext of the `i` block * `f_k` is the block cipher function with `k` 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`. ## testing I'm using the test vectors described in the [official OpenSSL IGE paper](https://www.links.org/files/openssl-ige.pdf). You can execute the tests yourself by running: ``` $ go test ``` ### test vector 1 #### key ``` 00010203 04050607 08090A0B 0C0D0E0F ``` #### initialization vector ``` 00010203 04050607 08090A0B 0C0D0E0F 10111213 14151617 18191A1B 1C1D1E1F ``` #### plaintext ``` 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 ``` #### ciphertext ``` 1A8519A6 557BE652 E9DA8E43 DA4EF445 3CF456B4 CA488AA3 83C79C98 B34797CB ``` ### test vector 2 #### key ``` 54686973 20697320 616E2069 6D706C65 ``` #### initialization vector ``` 6D656E74 6174696F 6E206F66 20494745 206D6F64 6520666F 72204F70 656E5353 ``` #### plaintext ``` 99706487 A1CDE613 BC6DE0B6 F24B1C7A A448C8B9 C3403E34 67A8CAD8 9340F53B ``` #### ciphertext ``` 4C2E204C 65742773 20686F70 65204265 6E20676F 74206974 20726967 6874210A ```