Crypt-Khazad

 view release on metacpan or  search on metacpan

_khazad.c  view on Meta::CPAN

    0xc6f8423eUL, 0x3b65e25eUL, 0xbb9c6927UL, 0x4305ca46UL,
    0x3c30140cUL, 0xec89af65UL, 0xd5bdb868UL, 0xf899a361UL,
    0x0f0c0503UL, 0xe2235ec1UL, 0x1641f957UL, 0xa97f67d6UL,
    0x9a4376d9UL, 0x257de858UL, 0x9f4775d8UL, 0xe385aa66UL,
    0xac7b64d7UL, 0xd2e84e3aUL, 0xcf0745c8UL, 0xccf0443cUL,
    0x35cf13faUL, 0xf462a796UL, 0x01a6f4a7UL, 0xc25ab598UL,
    0x7b9729ecUL, 0x62dad5b8UL, 0xfc3b54c7UL, 0x2c82efaeUL,
    0xd0b9bb69UL, 0x7a31dd4bUL, 0x3d96e0abUL, 0x379ee6a9UL,
    0xe681a967UL, 0x22281e0aUL, 0x4601c947UL, 0x1def0bf2UL,
    0x5beec2b5UL, 0xaa886622UL, 0x56b332e5UL, 0x719f2feeUL,
    0x7cc2dfbeUL, 0x87ac7d2bUL, 0xbf3e9e81UL, 0x5a483612UL,
    0xb5369883UL, 0x776c2d1bUL, 0x3638120eUL, 0xaf8c6523UL,
    0x06f302f5UL, 0x4c09cf45UL, 0xa5846321UL, 0xd11f4fceUL,
    0x7039db49UL, 0x9cb0742cUL, 0x3ac316f9UL, 0x59bf37e6UL,
    0x54e2c7b6UL, 0x88a07828UL, 0x4b5c3917UL, 0xb0329b82UL,
    0x72682e1aUL, 0x9d16808bUL, 0x21df1ffeUL, 0x9812838aUL,
    0x2d241b09UL, 0xca0346c9UL, 0xa1269487UL, 0x6b25d24eUL,
    0x42a33ee1UL, 0x96b8722eUL, 0x53b731e4UL, 0x47a73de0UL,
    0x608b20ebUL, 0xea7aad90UL, 0x0eaaf1a4UL, 0x6678221eUL,
    0xab2e9285UL, 0xfd9da060UL, 0x00000000UL, 0xb1946f25UL,
    0x03f701f4UL, 0x12e30ef1UL, 0xfe6aa194UL, 0x272c1d0bUL,
    0x5cbb34e7UL, 0xbcc99f75UL, 0x749b2cefUL, 0xe4d05c34UL,
    0xf5c45331UL, 0xa37761d4UL, 0xb7676dd0UL, 0xa4229786UL,
    0x9be5827eUL, 0x238eeaadUL, 0x2ed31afdUL, 0x8da47b29UL,
    0xf0c05030UL, 0xd7ec4d3bUL, 0xd946bc9fUL, 0x3fc715f8UL,
    0xf93f57c6UL, 0x5f4c3513UL, 0x1e180a06UL, 0x11140f05UL,
    0xf63352c5UL, 0x55443311UL, 0xb6c19977UL, 0x91ed847cUL,
    0x8ff58e7aUL, 0x85fd8878UL, 0xeed85a36UL, 0x6c70241cUL,
    0xdde44b39UL, 0x2079eb59UL, 0x78602818UL, 0x1345fa56UL,
    0x45f6c8b3UL, 0x4afacdb0UL, 0xb4906c24UL, 0xa0806020UL,
    0x40f2cbb2UL, 0xe072ab92UL, 0x15b6f8a3UL, 0xe7275dc0UL,
    0x490dcc44UL, 0xf795a662UL, 0x50403010UL, 0x5eeac1b4UL,
    0xae2a9184UL, 0x5211c543UL, 0xe576a893UL, 0xed2f5bc2UL,
    0x7f35de4aUL, 0x73cedabdUL, 0x89068c8fUL, 0x99b4772dUL,
    0x76cad9bcUL, 0xd64ab99cUL, 0xdfb5be6aUL, 0x5d1dc040UL,
    0xd41b4ccfUL, 0x10b2fba2UL, 0xba3a9d80UL, 0x6e21d14fUL,
    0x637c211fUL, 0xc50f43caUL, 0x3892e3aaUL, 0x5715c642UL,
};

static const u32 c[R + 1][2] = {
    {0xba542f74UL, 0x53d3d24dUL},
    {0x50ac8dbfUL, 0x70529a4cUL},
    {0xead597d1UL, 0x33515ba6UL},
    {0xde48a899UL, 0xdb32b7fcUL},
    {0xe39e919bUL, 0xe2bb416eUL},
    {0xa5cb6b95UL, 0xa1f3b102UL},
    {0xccc41d14UL, 0xc363da5dUL},
    {0x5fdc7dcdUL, 0x7f5a6c5cUL},
    {0xf726ffedUL, 0xe89d6f8eUL},
};

/*
Definition of the 32-bit $U$ and $V$ matrices:

\begin{eqnarray*}
H & = & \left[\begin{array}{cc}
U & V \\
V & U
\end{array}\right], \\
U & = & \left[\begin{array}{cccc}
\gf{01} & \gf{03} & \gf{04} & \gf{05} \\
\gf{03} & \gf{01} & \gf{05} & \gf{04} \\
\gf{04} & \gf{05} & \gf{01} & \gf{03} \\
\gf{05} & \gf{04} & \gf{03} & \gf{01}
\end{array}\right], \\
V & = & \left[\begin{array}{cccc}
\gf{06} & \gf{08} & \gf{0b} & \gf{07} \\
\gf{08} & \gf{06} & \gf{07} & \gf{0b} \\
\gf{0b} & \gf{07} & \gf{06} & \gf{08} \\
\gf{07} & \gf{0b} & \gf{08} & \gf{06}
\end{array}\right].
\end{eqnarray*}

Definition of the corresponding $U$ and $V$ tables:

\begin{eqnarray*}
U_0[x] & = & S[x] \cdot \left[\begin{array}{cccc} \gf{01} & \gf{03} & \gf{04} & \gf{05} \end{array}\right],\\%
U_1[x] & = & S[x] \cdot \left[\begin{array}{cccc} \gf{03} & \gf{01} & \gf{05} & \gf{04} \end{array}\right],\\%
U_2[x] & = & S[x] \cdot \left[\begin{array}{cccc} \gf{04} & \gf{05} & \gf{01} & \gf{03} \end{array}\right],\\%
U_3[x] & = & S[x] \cdot \left[\begin{array}{cccc} \gf{05} & \gf{04} & \gf{03} & \gf{01} \end{array}\right];\\%
V_0[x] & = & S[x] \cdot \left[\begin{array}{cccc} \gf{06} & \gf{08} & \gf{0b} & \gf{07} \end{array}\right],\\%
V_1[x] & = & S[x] \cdot \left[\begin{array}{cccc} \gf{08} & \gf{06} & \gf{07} & \gf{0b} \end{array}\right],\\%
V_2[x] & = & S[x] \cdot \left[\begin{array}{cccc} \gf{0b} & \gf{07} & \gf{06} & \gf{08} \end{array}\right],\\%
V_3[x] & = & S[x] \cdot \left[\begin{array}{cccc} \gf{07} & \gf{0b} & \gf{08} & \gf{06} \end{array}\right];  %
\end{eqnarray*}

In terms of $T_i$:
\begin{eqnarray*}
U_i[x] & = & T_i[x] \rrr 32,\\%
V_i[x] & = & T_i[x] \& \mathtt{0xffffffff};  %
\end{eqnarray*}

*/

/**
 * Create the Khazad key schedule for a given cipher key.
 * Both encryption and decryption key schedules are generated.
 * 
 * @param key			The 128-bit cipher key.
 * @param structpointer	Pointer to the structure that will hold the expanded key.
 */
void NESSIEkeysetup(const unsigned char * const key,
				struct NESSIEstruct * const structpointer)
{
	int r;
	const u32 *S = U3;

    /*
	 * map u8 array cipher key to initial key state (mu):
	 */
	u32 K20 =
		((u32)key[ 0] << 24) ^
		((u32)key[ 1] << 16) ^
		((u32)key[ 2] <<  8) ^
		((u32)key[ 3]      );
	u32 K21 =
		((u32)key[ 4] << 24) ^
		((u32)key[ 5] << 16) ^
		((u32)key[ 6] <<  8) ^
		((u32)key[ 7]      );
	u32 K10 =
		((u32)key[ 8] << 24) ^
		((u32)key[ 9] << 16) ^
		((u32)key[10] <<  8) ^
		((u32)key[11]      );
	u32 K11 =
		((u32)key[12] << 24) ^
		((u32)key[13] << 16) ^
		((u32)key[14] <<  8) ^
		((u32)key[15]      );

	/*
	 * compute the round keys:
	 */
	for (r = 0; r <= R; r++) {
		/*
		 * K[r] = rho(c[r], K1) ^ K2;
		 */
		structpointer->roundKeyEnc[r][0] =
			U0[(K10 >> 24)       ] ^
			U1[(K10 >> 16) & 0xff] ^
			U2[(K10 >>  8) & 0xff] ^
			U3[(K10      ) & 0xff] ^
			V0[(K11 >> 24) & 0xff] ^



( run in 0.914 second using v1.01-cache-2.11-cpan-744e820c463 )