Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Cryptographic API.
0004  *
0005  * Common Blowfish algorithm parts shared between the c and assembler
0006  * implementations.
0007  *
0008  * Blowfish Cipher Algorithm, by Bruce Schneier.
0009  * http://www.counterpane.com/blowfish.html
0010  *
0011  * Adapted from Kerneli implementation.
0012  *
0013  * Copyright (c) Herbert Valerio Riedel <hvr@hvrlab.org>
0014  * Copyright (c) Kyle McMartin <kyle@debian.org>
0015  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
0016  */
0017 #include <linux/init.h>
0018 #include <linux/module.h>
0019 #include <linux/mm.h>
0020 #include <asm/byteorder.h>
0021 #include <linux/crypto.h>
0022 #include <linux/types.h>
0023 #include <crypto/blowfish.h>
0024 
0025 static const u32 bf_pbox[16 + 2] = {
0026     0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
0027     0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
0028     0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
0029     0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
0030     0x9216d5d9, 0x8979fb1b,
0031 };
0032 
0033 static const u32 bf_sbox[256 * 4] = {
0034     0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
0035     0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
0036     0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
0037     0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
0038     0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
0039     0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
0040     0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
0041     0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
0042     0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
0043     0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
0044     0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
0045     0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
0046     0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
0047     0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
0048     0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
0049     0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
0050     0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
0051     0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
0052     0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
0053     0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
0054     0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
0055     0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
0056     0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
0057     0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
0058     0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
0059     0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
0060     0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
0061     0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
0062     0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
0063     0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
0064     0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
0065     0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
0066     0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
0067     0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
0068     0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
0069     0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
0070     0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
0071     0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
0072     0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
0073     0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
0074     0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
0075     0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
0076     0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
0077     0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
0078     0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
0079     0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
0080     0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
0081     0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
0082     0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
0083     0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
0084     0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
0085     0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
0086     0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
0087     0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
0088     0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
0089     0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
0090     0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
0091     0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
0092     0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
0093     0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
0094     0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
0095     0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
0096     0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
0097     0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
0098     0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
0099     0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
0100     0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
0101     0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
0102     0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
0103     0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
0104     0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
0105     0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
0106     0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
0107     0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
0108     0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
0109     0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
0110     0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
0111     0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
0112     0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
0113     0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
0114     0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
0115     0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
0116     0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
0117     0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
0118     0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
0119     0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
0120     0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
0121     0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
0122     0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
0123     0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
0124     0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
0125     0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
0126     0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
0127     0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
0128     0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
0129     0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
0130     0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
0131     0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
0132     0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
0133     0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
0134     0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
0135     0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
0136     0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
0137     0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
0138     0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
0139     0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
0140     0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
0141     0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
0142     0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
0143     0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
0144     0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
0145     0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
0146     0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
0147     0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
0148     0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
0149     0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
0150     0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
0151     0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
0152     0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
0153     0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
0154     0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
0155     0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
0156     0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
0157     0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
0158     0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
0159     0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
0160     0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
0161     0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
0162     0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
0163     0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
0164     0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
0165     0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
0166     0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
0167     0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
0168     0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
0169     0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
0170     0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
0171     0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
0172     0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
0173     0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
0174     0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
0175     0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
0176     0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
0177     0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
0178     0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
0179     0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
0180     0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
0181     0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
0182     0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
0183     0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
0184     0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
0185     0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
0186     0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
0187     0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
0188     0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
0189     0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
0190     0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
0191     0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
0192     0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
0193     0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
0194     0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
0195     0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
0196     0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
0197     0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
0198     0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
0199     0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
0200     0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
0201     0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
0202     0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
0203     0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
0204     0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
0205     0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
0206     0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
0207     0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
0208     0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
0209     0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
0210     0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
0211     0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
0212     0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
0213     0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
0214     0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
0215     0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
0216     0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
0217     0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
0218     0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
0219     0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
0220     0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
0221     0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
0222     0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
0223     0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
0224     0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
0225     0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
0226     0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
0227     0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
0228     0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
0229     0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
0230     0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
0231     0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
0232     0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
0233     0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
0234     0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
0235     0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
0236     0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
0237     0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
0238     0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
0239     0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
0240     0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
0241     0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
0242     0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
0243     0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
0244     0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
0245     0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
0246     0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
0247     0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
0248     0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
0249     0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
0250     0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
0251     0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
0252     0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
0253     0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
0254     0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
0255     0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
0256     0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
0257     0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
0258     0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
0259     0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
0260     0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
0261     0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
0262     0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
0263     0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
0264     0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
0265     0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
0266     0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
0267     0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
0268     0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
0269     0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
0270     0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
0271     0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
0272     0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
0273     0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
0274     0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
0275     0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
0276     0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
0277     0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
0278     0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
0279     0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
0280     0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
0281     0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
0282     0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
0283     0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
0284     0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
0285     0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
0286     0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
0287     0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
0288     0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
0289     0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
0290 };
0291 
0292 /*
0293  * Round loop unrolling macros, S is a pointer to a S-Box array
0294  * organized in 4 unsigned longs at a row.
0295  */
0296 #define GET32_3(x) (((x) & 0xff))
0297 #define GET32_2(x) (((x) >> (8)) & (0xff))
0298 #define GET32_1(x) (((x) >> (16)) & (0xff))
0299 #define GET32_0(x) (((x) >> (24)) & (0xff))
0300 
0301 #define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^ \
0302         S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
0303 
0304 #define ROUND(a, b, n) ({ b ^= P[n]; a ^= bf_F(b); })
0305 
0306 /*
0307  * The blowfish encipher, processes 64-bit blocks.
0308  * NOTE: This function MUSTN'T respect endianess
0309  */
0310 static void encrypt_block(struct bf_ctx *bctx, u32 *dst, u32 *src)
0311 {
0312     const u32 *P = bctx->p;
0313     const u32 *S = bctx->s;
0314     u32 yl = src[0];
0315     u32 yr = src[1];
0316 
0317     ROUND(yr, yl, 0);
0318     ROUND(yl, yr, 1);
0319     ROUND(yr, yl, 2);
0320     ROUND(yl, yr, 3);
0321     ROUND(yr, yl, 4);
0322     ROUND(yl, yr, 5);
0323     ROUND(yr, yl, 6);
0324     ROUND(yl, yr, 7);
0325     ROUND(yr, yl, 8);
0326     ROUND(yl, yr, 9);
0327     ROUND(yr, yl, 10);
0328     ROUND(yl, yr, 11);
0329     ROUND(yr, yl, 12);
0330     ROUND(yl, yr, 13);
0331     ROUND(yr, yl, 14);
0332     ROUND(yl, yr, 15);
0333 
0334     yl ^= P[16];
0335     yr ^= P[17];
0336 
0337     dst[0] = yr;
0338     dst[1] = yl;
0339 }
0340 
0341 /*
0342  * Calculates the blowfish S and P boxes for encryption and decryption.
0343  */
0344 int blowfish_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
0345 {
0346     struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
0347     u32 *P = ctx->p;
0348     u32 *S = ctx->s;
0349     short i, j, count;
0350     u32 data[2], temp;
0351 
0352     /* Copy the initialization s-boxes */
0353     for (i = 0, count = 0; i < 256; i++)
0354         for (j = 0; j < 4; j++, count++)
0355             S[count] = bf_sbox[count];
0356 
0357     /* Set the p-boxes */
0358     for (i = 0; i < 16 + 2; i++)
0359         P[i] = bf_pbox[i];
0360 
0361     /* Actual subkey generation */
0362     for (j = 0, i = 0; i < 16 + 2; i++) {
0363         temp = (((u32)key[j] << 24) |
0364             ((u32)key[(j + 1) % keylen] << 16) |
0365             ((u32)key[(j + 2) % keylen] << 8) |
0366             ((u32)key[(j + 3) % keylen]));
0367 
0368         P[i] = P[i] ^ temp;
0369         j = (j + 4) % keylen;
0370     }
0371 
0372     data[0] = 0x00000000;
0373     data[1] = 0x00000000;
0374 
0375     for (i = 0; i < 16 + 2; i += 2) {
0376         encrypt_block((struct bf_ctx *)ctx, data, data);
0377 
0378         P[i] = data[0];
0379         P[i + 1] = data[1];
0380     }
0381 
0382     for (i = 0; i < 4; i++) {
0383         for (j = 0, count = i * 256; j < 256; j += 2, count += 2) {
0384             encrypt_block((struct bf_ctx *)ctx, data, data);
0385 
0386             S[count] = data[0];
0387             S[count + 1] = data[1];
0388         }
0389     }
0390 
0391     /* Bruce says not to bother with the weak key check. */
0392     return 0;
0393 }
0394 EXPORT_SYMBOL_GPL(blowfish_setkey);
0395 
0396 MODULE_LICENSE("GPL");
0397 MODULE_DESCRIPTION("Blowfish Cipher common functions");