18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * DES and 3DES-EDE ciphers
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Modifications to LibTomCrypt implementation:
58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi>
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
7c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
8c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "crypto.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "des_i.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This implementation is based on a DES implementation included in
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * LibTomCrypt. The version here is modified to fit in wpa_supplicant/hostapd
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * coding style.
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* LibTomCrypt, modular cryptographic library -- Tom St Denis
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * LibTomCrypt is a library that provides various cryptographic
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * algorithms in a highly modular and flexible manner.
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * The library is free for all purposes without any express
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * guarantee it works.
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  DES code submitted by Dobes Vandermeer
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt*/
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ROLc(x, y) \
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	((((unsigned long) (x) << (unsigned long) ((y) & 31)) | \
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  (((unsigned long) (x) & 0xFFFFFFFFUL) >> \
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	   (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define RORc(x, y) \
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	(((((unsigned long) (x) & 0xFFFFFFFFUL) >> \
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	   (unsigned long) ((y) & 31)) | \
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & \
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 0xFFFFFFFFUL)
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 bytebit[8] =
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0200, 0100, 040, 020, 010, 04, 02, 01
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 bigbyte[24] =
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x800000UL,  0x400000UL,  0x200000UL,  0x100000UL,
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x80000UL,   0x40000UL,   0x20000UL,   0x10000UL,
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x8000UL,    0x4000UL,    0x2000UL,    0x1000UL,
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x800UL,     0x400UL,     0x200UL,     0x100UL,
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x80UL,      0x40UL,      0x20UL,      0x10UL,
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x8UL,       0x4UL,       0x2UL,       0x1L
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Use the key schedule specific in the standard (ANSI X3.92-1981) */
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 pc1[56] = {
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	56, 48, 40, 32, 24, 16,  8,  0, 57, 49, 41, 33, 25, 17,
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 9,  1, 58, 50, 42, 34, 26, 18, 10,  2, 59, 51, 43, 35,
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	62, 54, 46, 38, 30, 22, 14,  6, 61, 53, 45, 37, 29, 21,
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	13,  5, 60, 52, 44, 36, 28, 20, 12,  4, 27, 19, 11,  3
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 totrot[16] = {
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	1,   2,  4,  6,
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	8,  10, 12, 14,
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	15, 17, 19, 21,
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	23, 25, 27, 28
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 pc2[48] = {
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	13, 16, 10, 23,  0,  4,      2, 27, 14,  5, 20,  9,
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	22, 18, 11,  3, 25,  7,     15,  6, 26, 19, 12,  1,
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	40, 51, 30, 36, 46, 54,     29, 39, 50, 44, 32, 47,
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	43, 48, 38, 55, 33, 52,     45, 41, 49, 35, 28, 31
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 SP1[64] =
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x01010400UL, 0x00000000UL, 0x00010000UL, 0x01010404UL,
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x01010004UL, 0x00010404UL, 0x00000004UL, 0x00010000UL,
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000400UL, 0x01010400UL, 0x01010404UL, 0x00000400UL,
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x01000404UL, 0x01010004UL, 0x01000000UL, 0x00000004UL,
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00010400UL,
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00010400UL, 0x01010000UL, 0x01010000UL, 0x01000404UL,
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00010004UL, 0x01000004UL, 0x01000004UL, 0x00010004UL,
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000000UL, 0x00000404UL, 0x00010404UL, 0x01000000UL,
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00010000UL, 0x01010404UL, 0x00000004UL, 0x01010000UL,
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x01010400UL, 0x01000000UL, 0x01000000UL, 0x00000400UL,
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x01010004UL, 0x00010000UL, 0x00010400UL, 0x01000004UL,
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000400UL, 0x00000004UL, 0x01000404UL, 0x00010404UL,
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x01010404UL, 0x00010004UL, 0x01010000UL, 0x01000404UL,
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x01000004UL, 0x00000404UL, 0x00010404UL, 0x01010400UL,
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00000000UL,
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00010004UL, 0x00010400UL, 0x00000000UL, 0x01010004UL
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 SP2[64] =
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x80108020UL, 0x80008000UL, 0x00008000UL, 0x00108020UL,
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00100000UL, 0x00000020UL, 0x80100020UL, 0x80008020UL,
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x80000020UL, 0x80108020UL, 0x80108000UL, 0x80000000UL,
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x80008000UL, 0x00100000UL, 0x00000020UL, 0x80100020UL,
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00108000UL, 0x00100020UL, 0x80008020UL, 0x00000000UL,
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x80000000UL, 0x00008000UL, 0x00108020UL, 0x80100000UL,
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00100020UL, 0x80000020UL, 0x00000000UL, 0x00108000UL,
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00008020UL, 0x80108000UL, 0x80100000UL, 0x00008020UL,
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000000UL, 0x00108020UL, 0x80100020UL, 0x00100000UL,
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x80008020UL, 0x80100000UL, 0x80108000UL, 0x00008000UL,
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x80100000UL, 0x80008000UL, 0x00000020UL, 0x80108020UL,
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00108020UL, 0x00000020UL, 0x00008000UL, 0x80000000UL,
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00008020UL, 0x80108000UL, 0x00100000UL, 0x80000020UL,
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00100020UL, 0x80008020UL, 0x80000020UL, 0x00100020UL,
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00108000UL, 0x00000000UL, 0x80008000UL, 0x00008020UL,
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x80000000UL, 0x80100020UL, 0x80108020UL, 0x00108000UL
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 SP3[64] =
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000208UL, 0x08020200UL, 0x00000000UL, 0x08020008UL,
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08000200UL, 0x00000000UL, 0x00020208UL, 0x08000200UL,
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00020008UL, 0x08000008UL, 0x08000008UL, 0x00020000UL,
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08020208UL, 0x00020008UL, 0x08020000UL, 0x00000208UL,
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08000000UL, 0x00000008UL, 0x08020200UL, 0x00000200UL,
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00020200UL, 0x08020000UL, 0x08020008UL, 0x00020208UL,
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08000208UL, 0x00020200UL, 0x00020000UL, 0x08000208UL,
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000008UL, 0x08020208UL, 0x00000200UL, 0x08000000UL,
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08020200UL, 0x08000000UL, 0x00020008UL, 0x00000208UL,
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00020000UL, 0x08020200UL, 0x08000200UL, 0x00000000UL,
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000200UL, 0x00020008UL, 0x08020208UL, 0x08000200UL,
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08000008UL, 0x00000200UL, 0x00000000UL, 0x08020008UL,
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08000208UL, 0x00020000UL, 0x08000000UL, 0x08020208UL,
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000008UL, 0x00020208UL, 0x00020200UL, 0x08000008UL,
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x08020000UL, 0x08000208UL, 0x00000208UL, 0x08020000UL,
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00020208UL, 0x00000008UL, 0x08020008UL, 0x00020200UL
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 SP4[64] =
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL,
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00802080UL, 0x00800081UL, 0x00800001UL, 0x00002001UL,
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000000UL, 0x00802000UL, 0x00802000UL, 0x00802081UL,
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000081UL, 0x00000000UL, 0x00800080UL, 0x00800001UL,
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000001UL, 0x00002000UL, 0x00800000UL, 0x00802001UL,
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000080UL, 0x00800000UL, 0x00002001UL, 0x00002080UL,
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00800081UL, 0x00000001UL, 0x00002080UL, 0x00800080UL,
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00002000UL, 0x00802080UL, 0x00802081UL, 0x00000081UL,
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00800080UL, 0x00800001UL, 0x00802000UL, 0x00802081UL,
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000081UL, 0x00000000UL, 0x00000000UL, 0x00802000UL,
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00002080UL, 0x00800080UL, 0x00800081UL, 0x00000001UL,
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL,
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00802081UL, 0x00000081UL, 0x00000001UL, 0x00002000UL,
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00800001UL, 0x00002001UL, 0x00802080UL, 0x00800081UL,
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00002001UL, 0x00002080UL, 0x00800000UL, 0x00802001UL,
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000080UL, 0x00800000UL, 0x00002000UL, 0x00802080UL
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 SP5[64] =
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000100UL, 0x02080100UL, 0x02080000UL, 0x42000100UL,
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00080000UL, 0x00000100UL, 0x40000000UL, 0x02080000UL,
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x40080100UL, 0x00080000UL, 0x02000100UL, 0x40080100UL,
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x42000100UL, 0x42080000UL, 0x00080100UL, 0x40000000UL,
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02000000UL, 0x40080000UL, 0x40080000UL, 0x00000000UL,
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x40000100UL, 0x42080100UL, 0x42080100UL, 0x02000100UL,
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x42080000UL, 0x40000100UL, 0x00000000UL, 0x42000000UL,
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02080100UL, 0x02000000UL, 0x42000000UL, 0x00080100UL,
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00080000UL, 0x42000100UL, 0x00000100UL, 0x02000000UL,
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x40000000UL, 0x02080000UL, 0x42000100UL, 0x40080100UL,
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02000100UL, 0x40000000UL, 0x42080000UL, 0x02080100UL,
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x40080100UL, 0x00000100UL, 0x02000000UL, 0x42080000UL,
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x42080100UL, 0x00080100UL, 0x42000000UL, 0x42080100UL,
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x02080000UL, 0x00000000UL, 0x40080000UL, 0x42000000UL,
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00080100UL, 0x02000100UL, 0x40000100UL, 0x00080000UL,
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000000UL, 0x40080000UL, 0x02080100UL, 0x40000100UL
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 SP6[64] =
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x20000010UL, 0x20400000UL, 0x00004000UL, 0x20404010UL,
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x20400000UL, 0x00000010UL, 0x20404010UL, 0x00400000UL,
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x20004000UL, 0x00404010UL, 0x00400000UL, 0x20000010UL,
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00400010UL, 0x20004000UL, 0x20000000UL, 0x00004010UL,
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000000UL, 0x00400010UL, 0x20004010UL, 0x00004000UL,
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00404000UL, 0x20004010UL, 0x00000010UL, 0x20400010UL,
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x20400010UL, 0x00000000UL, 0x00404010UL, 0x20404000UL,
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00004010UL, 0x00404000UL, 0x20404000UL, 0x20000000UL,
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x20004000UL, 0x00000010UL, 0x20400010UL, 0x00404000UL,
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x20404010UL, 0x00400000UL, 0x00004010UL, 0x20000010UL,
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00400000UL, 0x20004000UL, 0x20000000UL, 0x00004010UL,
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x20000010UL, 0x20404010UL, 0x00404000UL, 0x20400000UL,
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00404010UL, 0x20404000UL, 0x00000000UL, 0x20400010UL,
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000010UL, 0x00004000UL, 0x20400000UL, 0x00404010UL,
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00004000UL, 0x00400010UL, 0x20004010UL, 0x00000000UL,
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x20404000UL, 0x20000000UL, 0x00400010UL, 0x20004010UL
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 SP7[64] =
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00200000UL, 0x04200002UL, 0x04000802UL, 0x00000000UL,
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000800UL, 0x04000802UL, 0x00200802UL, 0x04200800UL,
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04200802UL, 0x00200000UL, 0x00000000UL, 0x04000002UL,
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000002UL, 0x04000000UL, 0x04200002UL, 0x00000802UL,
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04000800UL, 0x00200802UL, 0x00200002UL, 0x04000800UL,
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04000002UL, 0x04200000UL, 0x04200800UL, 0x00200002UL,
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04200000UL, 0x00000800UL, 0x00000802UL, 0x04200802UL,
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00200800UL, 0x00000002UL, 0x04000000UL, 0x00200800UL,
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04000000UL, 0x00200800UL, 0x00200000UL, 0x04000802UL,
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04000802UL, 0x04200002UL, 0x04200002UL, 0x00000002UL,
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00200002UL, 0x04000000UL, 0x04000800UL, 0x00200000UL,
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04200800UL, 0x00000802UL, 0x00200802UL, 0x04200800UL,
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000802UL, 0x04000002UL, 0x04200802UL, 0x04200000UL,
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00200800UL, 0x00000000UL, 0x00000002UL, 0x04200802UL,
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000000UL, 0x00200802UL, 0x04200000UL, 0x00000800UL,
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x04000002UL, 0x04000800UL, 0x00000800UL, 0x00200002UL
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u32 SP8[64] =
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x10001040UL, 0x00001000UL, 0x00040000UL, 0x10041040UL,
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x10000000UL, 0x10001040UL, 0x00000040UL, 0x10000000UL,
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00040040UL, 0x10040000UL, 0x10041040UL, 0x00041000UL,
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x10041000UL, 0x00041040UL, 0x00001000UL, 0x00000040UL,
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x10040000UL, 0x10000040UL, 0x10001000UL, 0x00001040UL,
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00041000UL, 0x00040040UL, 0x10040040UL, 0x10041000UL,
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00001040UL, 0x00000000UL, 0x00000000UL, 0x10040040UL,
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x10000040UL, 0x10001000UL, 0x00041040UL, 0x00040000UL,
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00041040UL, 0x00040000UL, 0x10041000UL, 0x00001000UL,
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000040UL, 0x10040040UL, 0x00001000UL, 0x00041040UL,
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x10001000UL, 0x00000040UL, 0x10000040UL, 0x10040000UL,
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x10040040UL, 0x10000000UL, 0x00040000UL, 0x10001040UL,
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00000000UL, 0x10041040UL, 0x00040040UL, 0x10000040UL,
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x10040000UL, 0x10001000UL, 0x10001040UL, 0x00000000UL,
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x10041040UL, 0x00041000UL, 0x00041000UL, 0x00001040UL,
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	0x00001040UL, 0x00040040UL, 0x10000000UL, 0x10041000UL
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void cookey(const u32 *raw1, u32 *keyout)
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 *cook;
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u32 *raw0;
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 dough[32];
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i;
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cook = dough;
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < 16; i++, raw1++) {
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		raw0 = raw1++;
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*cook    = (*raw0 & 0x00fc0000L) << 6;
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*cook   |= (*raw0 & 0x00000fc0L) << 10;
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*cook   |= (*raw1 & 0x00fc0000L) >> 10;
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*cook++ |= (*raw1 & 0x00000fc0L) >> 6;
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*cook    = (*raw0 & 0x0003f000L) << 12;
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*cook   |= (*raw0 & 0x0000003fL) << 16;
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*cook   |= (*raw1 & 0x0003f000L) >> 4;
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*cook++ |= (*raw1 & 0x0000003fL);
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(keyout, dough, sizeof(dough));
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void deskey(const u8 *key, int decrypt, u32 *keyout)
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 i, j, l, m, n, kn[32];
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 pc1m[56], pcr[56];
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (j = 0; j < 56; j++) {
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		l = (u32) pc1[j];
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		m = l & 7;
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pc1m[j] = (u8)
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			((key[l >> 3U] & bytebit[m]) == bytebit[m] ? 1 : 0);
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < 16; i++) {
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (decrypt)
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			m = (15 - i) << 1;
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			m = i << 1;
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		n = m + 1;
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		kn[m] = kn[n] = 0L;
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (j = 0; j < 28; j++) {
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			l = j + (u32) totrot[i];
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (l < 28)
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pcr[j] = pc1m[l];
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pcr[j] = pc1m[l - 28];
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (/* j = 28 */; j < 56; j++) {
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			l = j + (u32) totrot[i];
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (l < 56)
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pcr[j] = pc1m[l];
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pcr[j] = pc1m[l - 28];
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (j = 0; j < 24; j++) {
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if ((int) pcr[(int) pc2[j]] != 0)
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				kn[m] |= bigbyte[j];
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if ((int) pcr[(int) pc2[j + 24]] != 0)
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				kn[n] |= bigbyte[j];
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cookey(kn, keyout);
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void desfunc(u32 *block, const u32 *keys)
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 work, right, leftt;
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int cur_round;
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt = block[0];
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right = block[1];
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = ((leftt >> 4)  ^ right) & 0x0f0f0f0fL;
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= work;
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= (work << 4);
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = ((leftt >> 16) ^ right) & 0x0000ffffL;
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= work;
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= (work << 16);
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = ((right >> 2)  ^ leftt) & 0x33333333L;
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= work;
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= (work << 2);
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = ((right >> 8)  ^ leftt) & 0x00ff00ffL;
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= work;
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= (work << 8);
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right = ROLc(right, 1);
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = (leftt ^ right) & 0xaaaaaaaaL;
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= work;
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= work;
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt = ROLc(leftt, 1);
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (cur_round = 0; cur_round < 8; cur_round++) {
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		work  = RORc(right, 4) ^ *keys++;
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		leftt ^= SP7[work        & 0x3fL]
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^ SP5[(work >>  8) & 0x3fL]
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^ SP3[(work >> 16) & 0x3fL]
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^ SP1[(work >> 24) & 0x3fL];
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		work  = right ^ *keys++;
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		leftt ^= SP8[ work        & 0x3fL]
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^  SP6[(work >>  8) & 0x3fL]
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^  SP4[(work >> 16) & 0x3fL]
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^  SP2[(work >> 24) & 0x3fL];
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		work = RORc(leftt, 4) ^ *keys++;
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		right ^= SP7[ work        & 0x3fL]
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^  SP5[(work >>  8) & 0x3fL]
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^  SP3[(work >> 16) & 0x3fL]
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^  SP1[(work >> 24) & 0x3fL];
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		work  = leftt ^ *keys++;
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		right ^= SP8[ work        & 0x3fL]
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^  SP6[(work >>  8) & 0x3fL]
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^  SP4[(work >> 16) & 0x3fL]
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			^  SP2[(work >> 24) & 0x3fL];
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right = RORc(right, 1);
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = (leftt ^ right) & 0xaaaaaaaaL;
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= work;
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= work;
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt = RORc(leftt, 1);
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= work;
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= (work << 8);
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* -- */
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = ((leftt >> 2) ^ right) & 0x33333333L;
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= work;
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= (work << 2);
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = ((right >> 16) ^ leftt) & 0x0000ffffL;
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= work;
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= (work << 16);
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	leftt ^= work;
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	right ^= (work << 4);
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	block[0] = right;
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	block[1] = leftt;
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* wpa_supplicant/hostapd specific wrapper */
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid des_encrypt(const u8 *clear, const u8 *key, u8 *cypher)
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 pkey[8], next, tmp;
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i;
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 ek[32], work[2];
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Add parity bits to the key */
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	next = 0;
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < 7; i++) {
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tmp = key[i];
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pkey[i] = (tmp >> i) | next | 1;
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		next = tmp << (7 - i);
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pkey[i] = next | 1;
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	deskey(pkey, 0, ek);
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[0] = WPA_GET_BE32(clear);
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[1] = WPA_GET_BE32(clear + 4);
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	desfunc(work, ek);
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(cypher, work[0]);
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(cypher + 4, work[1]);
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(pkey, 0, sizeof(pkey));
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memset(ek, 0, sizeof(ek));
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid des_key_setup(const u8 *key, u32 *ek, u32 *dk)
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	deskey(key, 0, ek);
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	deskey(key, 1, dk);
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid des_block_encrypt(const u8 *plain, const u32 *ek, u8 *crypt)
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 work[2];
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[0] = WPA_GET_BE32(plain);
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[1] = WPA_GET_BE32(plain + 4);
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	desfunc(work, ek);
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(crypt, work[0]);
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(crypt + 4, work[1]);
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid des_block_decrypt(const u8 *crypt, const u32 *dk, u8 *plain)
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 work[2];
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[0] = WPA_GET_BE32(crypt);
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[1] = WPA_GET_BE32(crypt + 4);
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	desfunc(work, dk);
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(plain, work[0]);
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(plain + 4, work[1]);
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid des3_key_setup(const u8 *key, struct des3_key_s *dkey)
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	deskey(key, 0, dkey->ek[0]);
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	deskey(key + 8, 1, dkey->ek[1]);
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	deskey(key + 16, 0, dkey->ek[2]);
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	deskey(key, 1, dkey->dk[2]);
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	deskey(key + 8, 0, dkey->dk[1]);
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	deskey(key + 16, 1, dkey->dk[0]);
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid des3_encrypt(const u8 *plain, const struct des3_key_s *key, u8 *crypt)
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 work[2];
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[0] = WPA_GET_BE32(plain);
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[1] = WPA_GET_BE32(plain + 4);
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	desfunc(work, key->ek[0]);
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	desfunc(work, key->ek[1]);
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	desfunc(work, key->ek[2]);
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(crypt, work[0]);
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(crypt + 4, work[1]);
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid des3_decrypt(const u8 *crypt, const struct des3_key_s *key, u8 *plain)
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 work[2];
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[0] = WPA_GET_BE32(crypt);
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	work[1] = WPA_GET_BE32(crypt + 4);
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	desfunc(work, key->dk[0]);
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	desfunc(work, key->dk[1]);
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	desfunc(work, key->dk[2]);
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(plain, work[0]);
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_PUT_BE32(plain + 4, work[1]);
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
494