/*
Package sm1 is the implementation of SM1 block cipher.

The SM1 works as follows, There are three keys:
  - systems key SK
  - auxiliary key AK
  - key

# Enecryption

	    PT            key     SK
	    |              |      |
	    v          +---v------v----+
	   R(·) <----  |rk             |
	    |          |               |
	    |          |   key expand  |
	    v          |               |
	round f(·) <---|rk             |
	    |          +---------------+
	    v
	  J(·)
	    |
	    v
	   CT

# Decryption

	    CT            key     SK
	    |              |      |
	    v          +---v------v----+
	   R⁻¹(·) <--- |rk             |
	    |          |               |
	    |          |   key expand  |
	    v          |               |
	round f(·) <---|rk             |
	    |          +---------------+
	    v
	  J(·)
	    |
	    v
	   PT

# R Transformation

The input of R is 128 bits, and denotes as X0, X1, X2, X3 from left to right.
The output of R is 128 bits, and denotes as Y0, Y1, Y2, Y3 from left to right..

	Y0 = X0 << 1
	Y1 = X1 << 9
	Y2 = X2 << 17
	Y3 = X3 << 25

# R⁻¹ Transformation

The R⁻¹ Transformation is the reverse of R transformation.

	Y0 = X0 >> 1
	Y1 = X1 >> 9
	Y2 = X2 >> 17
	Y3 = X3 >> 25
*/
package sm1
