You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
1.7 KiB

# 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:
<p align="center">
<img src="https://i.imgur.com/CpilCFB.png" />
</p>
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
```