cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

blowfish_common.c (15911B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Cryptographic API.
      4 *
      5 * Common Blowfish algorithm parts shared between the c and assembler
      6 * implementations.
      7 *
      8 * Blowfish Cipher Algorithm, by Bruce Schneier.
      9 * http://www.counterpane.com/blowfish.html
     10 *
     11 * Adapted from Kerneli implementation.
     12 *
     13 * Copyright (c) Herbert Valerio Riedel <hvr@hvrlab.org>
     14 * Copyright (c) Kyle McMartin <kyle@debian.org>
     15 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
     16 */
     17#include <linux/init.h>
     18#include <linux/module.h>
     19#include <linux/mm.h>
     20#include <asm/byteorder.h>
     21#include <linux/crypto.h>
     22#include <linux/types.h>
     23#include <crypto/blowfish.h>
     24
     25static const u32 bf_pbox[16 + 2] = {
     26	0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
     27	0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
     28	0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
     29	0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
     30	0x9216d5d9, 0x8979fb1b,
     31};
     32
     33static const u32 bf_sbox[256 * 4] = {
     34	0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
     35	0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
     36	0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
     37	0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
     38	0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
     39	0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
     40	0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
     41	0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
     42	0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
     43	0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
     44	0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
     45	0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
     46	0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
     47	0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
     48	0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
     49	0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
     50	0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
     51	0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
     52	0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
     53	0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
     54	0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
     55	0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
     56	0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
     57	0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
     58	0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
     59	0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
     60	0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
     61	0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
     62	0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
     63	0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
     64	0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
     65	0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
     66	0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
     67	0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
     68	0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
     69	0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
     70	0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
     71	0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
     72	0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
     73	0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
     74	0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
     75	0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
     76	0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
     77	0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
     78	0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
     79	0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
     80	0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
     81	0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
     82	0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
     83	0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
     84	0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
     85	0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
     86	0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
     87	0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
     88	0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
     89	0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
     90	0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
     91	0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
     92	0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
     93	0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
     94	0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
     95	0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
     96	0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
     97	0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
     98	0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
     99	0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
    100	0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
    101	0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
    102	0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
    103	0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
    104	0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
    105	0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
    106	0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
    107	0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
    108	0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
    109	0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
    110	0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
    111	0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
    112	0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
    113	0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
    114	0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
    115	0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
    116	0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
    117	0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
    118	0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
    119	0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
    120	0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
    121	0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
    122	0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
    123	0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
    124	0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
    125	0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
    126	0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
    127	0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
    128	0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
    129	0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
    130	0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
    131	0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
    132	0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
    133	0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
    134	0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
    135	0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
    136	0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
    137	0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
    138	0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
    139	0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
    140	0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
    141	0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
    142	0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
    143	0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
    144	0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
    145	0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
    146	0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
    147	0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
    148	0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
    149	0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
    150	0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
    151	0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
    152	0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
    153	0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
    154	0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
    155	0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
    156	0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
    157	0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
    158	0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
    159	0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
    160	0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
    161	0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
    162	0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
    163	0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
    164	0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
    165	0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
    166	0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
    167	0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
    168	0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
    169	0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
    170	0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
    171	0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
    172	0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
    173	0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
    174	0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
    175	0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
    176	0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
    177	0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
    178	0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
    179	0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
    180	0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
    181	0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
    182	0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
    183	0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
    184	0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
    185	0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
    186	0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
    187	0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
    188	0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
    189	0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
    190	0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
    191	0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
    192	0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
    193	0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
    194	0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
    195	0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
    196	0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
    197	0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
    198	0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
    199	0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
    200	0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
    201	0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
    202	0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
    203	0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
    204	0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
    205	0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
    206	0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
    207	0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
    208	0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
    209	0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
    210	0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
    211	0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
    212	0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
    213	0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
    214	0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
    215	0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
    216	0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
    217	0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
    218	0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
    219	0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
    220	0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
    221	0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
    222	0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
    223	0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
    224	0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
    225	0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
    226	0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
    227	0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
    228	0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
    229	0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
    230	0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
    231	0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
    232	0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
    233	0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
    234	0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
    235	0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
    236	0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
    237	0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
    238	0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
    239	0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
    240	0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
    241	0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
    242	0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
    243	0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
    244	0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
    245	0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
    246	0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
    247	0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
    248	0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
    249	0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
    250	0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
    251	0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
    252	0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
    253	0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
    254	0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
    255	0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
    256	0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
    257	0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
    258	0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
    259	0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
    260	0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
    261	0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
    262	0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
    263	0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
    264	0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
    265	0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
    266	0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
    267	0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
    268	0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
    269	0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
    270	0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
    271	0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
    272	0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
    273	0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
    274	0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
    275	0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
    276	0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
    277	0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
    278	0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
    279	0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
    280	0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
    281	0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
    282	0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
    283	0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
    284	0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
    285	0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
    286	0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
    287	0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
    288	0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
    289	0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
    290};
    291
    292/*
    293 * Round loop unrolling macros, S is a pointer to a S-Box array
    294 * organized in 4 unsigned longs at a row.
    295 */
    296#define GET32_3(x) (((x) & 0xff))
    297#define GET32_2(x) (((x) >> (8)) & (0xff))
    298#define GET32_1(x) (((x) >> (16)) & (0xff))
    299#define GET32_0(x) (((x) >> (24)) & (0xff))
    300
    301#define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^ \
    302		S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
    303
    304#define ROUND(a, b, n) ({ b ^= P[n]; a ^= bf_F(b); })
    305
    306/*
    307 * The blowfish encipher, processes 64-bit blocks.
    308 * NOTE: This function MUSTN'T respect endianess
    309 */
    310static void encrypt_block(struct bf_ctx *bctx, u32 *dst, u32 *src)
    311{
    312	const u32 *P = bctx->p;
    313	const u32 *S = bctx->s;
    314	u32 yl = src[0];
    315	u32 yr = src[1];
    316
    317	ROUND(yr, yl, 0);
    318	ROUND(yl, yr, 1);
    319	ROUND(yr, yl, 2);
    320	ROUND(yl, yr, 3);
    321	ROUND(yr, yl, 4);
    322	ROUND(yl, yr, 5);
    323	ROUND(yr, yl, 6);
    324	ROUND(yl, yr, 7);
    325	ROUND(yr, yl, 8);
    326	ROUND(yl, yr, 9);
    327	ROUND(yr, yl, 10);
    328	ROUND(yl, yr, 11);
    329	ROUND(yr, yl, 12);
    330	ROUND(yl, yr, 13);
    331	ROUND(yr, yl, 14);
    332	ROUND(yl, yr, 15);
    333
    334	yl ^= P[16];
    335	yr ^= P[17];
    336
    337	dst[0] = yr;
    338	dst[1] = yl;
    339}
    340
    341/*
    342 * Calculates the blowfish S and P boxes for encryption and decryption.
    343 */
    344int blowfish_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
    345{
    346	struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
    347	u32 *P = ctx->p;
    348	u32 *S = ctx->s;
    349	short i, j, count;
    350	u32 data[2], temp;
    351
    352	/* Copy the initialization s-boxes */
    353	for (i = 0, count = 0; i < 256; i++)
    354		for (j = 0; j < 4; j++, count++)
    355			S[count] = bf_sbox[count];
    356
    357	/* Set the p-boxes */
    358	for (i = 0; i < 16 + 2; i++)
    359		P[i] = bf_pbox[i];
    360
    361	/* Actual subkey generation */
    362	for (j = 0, i = 0; i < 16 + 2; i++) {
    363		temp = (((u32)key[j] << 24) |
    364			((u32)key[(j + 1) % keylen] << 16) |
    365			((u32)key[(j + 2) % keylen] << 8) |
    366			((u32)key[(j + 3) % keylen]));
    367
    368		P[i] = P[i] ^ temp;
    369		j = (j + 4) % keylen;
    370	}
    371
    372	data[0] = 0x00000000;
    373	data[1] = 0x00000000;
    374
    375	for (i = 0; i < 16 + 2; i += 2) {
    376		encrypt_block((struct bf_ctx *)ctx, data, data);
    377
    378		P[i] = data[0];
    379		P[i + 1] = data[1];
    380	}
    381
    382	for (i = 0; i < 4; i++) {
    383		for (j = 0, count = i * 256; j < 256; j += 2, count += 2) {
    384			encrypt_block((struct bf_ctx *)ctx, data, data);
    385
    386			S[count] = data[0];
    387			S[count + 1] = data[1];
    388		}
    389	}
    390
    391	/* Bruce says not to bother with the weak key check. */
    392	return 0;
    393}
    394EXPORT_SYMBOL_GPL(blowfish_setkey);
    395
    396MODULE_LICENSE("GPL");
    397MODULE_DESCRIPTION("Blowfish Cipher common functions");