Coverage Report

Created: 2024-06-28 06:39

/src/nettle-with-mini-gmp/blowfish.c
Line
Count
Source (jump to first uncovered line)
1
/* blowfish.c
2
3
   The blowfish block cipher.
4
5
   Copyright (C) 2014 Niels Möller
6
   Copyright (C) 2010  Simon Josefsson
7
   Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
8
9
   This file is part of GNU Nettle.
10
11
   GNU Nettle is free software: you can redistribute it and/or
12
   modify it under the terms of either:
13
14
     * the GNU Lesser General Public License as published by the Free
15
       Software Foundation; either version 3 of the License, or (at your
16
       option) any later version.
17
18
   or
19
20
     * the GNU General Public License as published by the Free
21
       Software Foundation; either version 2 of the License, or (at your
22
       option) any later version.
23
24
   or both in parallel, as here.
25
26
   GNU Nettle is distributed in the hope that it will be useful,
27
   but WITHOUT ANY WARRANTY; without even the implied warranty of
28
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
29
   General Public License for more details.
30
31
   You should have received copies of the GNU General Public License and
32
   the GNU Lesser General Public License along with this program.  If
33
   not, see http://www.gnu.org/licenses/.
34
*/
35
36
/* For a description of the algorithm, see:
37
 *   Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996.
38
 *   ISBN 0-471-11709-9. Pages 336 ff.
39
 */
40
41
/* This file is derived from cipher/blowfish.c in Libgcrypt v1.4.6.
42
   The adaption to Nettle was made by Simon Josefsson on 2010-11-23.
43
   Changes include removing the selftest, renaming u32/byte types to
44
   uint32_t/uint8_t, renaming BLOWFISH_ROUNDS to _BLOWFISH_ROUNDS
45
   (from Nettle's blowfish.h), dropping the libgcrypt wrapper
46
   functions, fixing #include's, remove support for non-16 rounds
47
   (there are no test vectors), adding FOR_BLOCK iterations, and
48
   running indent on the code. */
49
50
#if HAVE_CONFIG_H
51
#include "config.h"
52
#endif
53
54
#include <assert.h>
55
56
#include "blowfish.h"
57
#include "blowfish-internal.h"
58
59
#include "macros.h"
60
61
/* precomputed S boxes */
62
const struct blowfish_ctx
63
_nettle_blowfish_initial_ctx = {
64
  {
65
    { /* ks0 */
66
      0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96,
67
      0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
68
      0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658,
69
      0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
70
      0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E,
71
      0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
72
      0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6,
73
      0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
74
      0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C,
75
      0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
76
      0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, 0xEF845D5D, 0xE98575B1,
77
      0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
78
      0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A,
79
      0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
80
      0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176,
81
      0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
82
      0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706,
83
      0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
84
      0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B,
85
      0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
86
      0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C,
87
      0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
88
      0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, 0x5579C0BD, 0x1A60320A,
89
      0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
90
      0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760,
91
      0x53317B48, 0x3E00DF82, 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
92
      0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8,
93
      0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
94
      0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33,
95
      0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
96
      0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0,
97
      0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
98
      0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777,
99
      0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
100
      0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, 0x165FA266, 0x80957705,
101
      0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
102
      0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E,
103
      0x226800BB, 0x57B8E0AF, 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
104
      0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9,
105
      0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
106
      0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F,
107
      0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
108
      0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A
109
    },
110
    { /* ks1 */
111
      0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D,
112
      0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
113
      0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65,
114
      0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
115
      0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9,
116
      0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
117
      0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D,
118
      0xF01C1F04, 0x0200B3FF, 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
119
      0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC,
120
      0xC8B57634, 0x9AF3DDA7, 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
121
      0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, 0x4E548B38, 0x4F6DB908,
122
      0x6F420D03, 0xF60A04BF, 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
123
      0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124,
124
      0x501ADDE6, 0x9F84CD87, 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
125
      0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908,
126
      0xDD433B37, 0x24C2BA16, 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
127
      0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, 0x043556F1, 0xD7A3C76B,
128
      0x3C11183B, 0x5924A509, 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
129
      0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA,
130
      0x2965DCB9, 0x99E71D0F, 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
131
      0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D,
132
      0x1939260F, 0x19C27960, 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
133
      0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, 0xC332DDEF, 0xBE6C5AA5,
134
      0x65582185, 0x68AB9802, 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
135
      0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96,
136
      0x0334FE1E, 0xAA0363CF, 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
137
      0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA,
138
      0xA02369B9, 0x655ABB50, 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
139
      0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, 0xF837889A, 0x97E32D77,
140
      0x11ED935F, 0x16681281, 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
141
      0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054,
142
      0x8FD948E4, 0x6DBC3128, 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
143
      0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA,
144
      0xDB6C4F15, 0xFACB4FD0, 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
145
      0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, 0xCF62A1F2, 0x5B8D2646,
146
      0xFC8883A0, 0xC1C7B6A3, 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
147
      0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA,
148
      0x1DADF43E, 0x233F7061, 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
149
      0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E,
150
      0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
151
      0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD,
152
      0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
153
      0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7
154
    },
155
    { /* ks2 */
156
      0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7,
157
      0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
158
      0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, 0x4D95FC1D, 0x96B591AF,
159
      0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
160
      0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, 0x28507825, 0x530429F4,
161
      0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
162
      0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, 0xAACE1E7C, 0xD3375FEC,
163
      0xCE78A399, 0x406B2A42, 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
164
      0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, 0x3A6EFA74, 0xDD5B4332,
165
      0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
166
      0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, 0x55A867BC, 0xA1159A58,
167
      0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
168
      0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, 0x95C11548, 0xE4C66D22,
169
      0x48C1133F, 0xC70F86DC, 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
170
      0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, 0x257B7834, 0x602A9C60,
171
      0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
172
      0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, 0x85B2A20E, 0xE6BA0D99,
173
      0xDE720C8C, 0x2DA2F728, 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
174
      0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, 0x0A476341, 0x992EFF74,
175
      0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
176
      0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, 0xF1290DC7, 0xCC00FFA3,
177
      0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
178
      0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, 0x37392EB3, 0xCC115979,
179
      0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
180
      0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, 0x1A6B1018, 0x11CAEDFA,
181
      0x3D25BDD8, 0xE2E1C3C9, 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
182
      0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, 0x9DBC8057, 0xF0F7C086,
183
      0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
184
      0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, 0x77A057BE, 0xBDE8AE24,
185
      0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
186
      0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, 0x7AEB2661, 0x8B1DDF84,
187
      0x846A0E79, 0x915F95E2, 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
188
      0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, 0xB77F19B6, 0xE0A9DC09,
189
      0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
190
      0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, 0xDCB7DA83, 0x573906FE,
191
      0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
192
      0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0,
193
      0x006058AA, 0x30DC7D62, 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
194
      0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, 0x6F05E409, 0x4B7C0188,
195
      0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
196
      0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8,
197
      0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
198
      0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0
199
    },
200
    { /* ks3 */
201
      0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742,
202
      0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
203
      0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79,
204
      0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
205
      0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, 0xA1FAD5F0, 0x6A2D519A,
206
      0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
207
      0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1,
208
      0x4BA99586, 0xEF5562E9, 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
209
      0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797,
210
      0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
211
      0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, 0xE029AC71, 0xE019A5E6,
212
      0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
213
      0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA,
214
      0x03A16125, 0x0564F0BD, 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
215
      0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5,
216
      0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
217
      0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, 0xEA7A90C2, 0xFB3E7BCE,
218
      0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
219
      0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD,
220
      0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
221
      0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB,
222
      0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
223
      0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, 0x4040CB08, 0x4EB4E2CC,
224
      0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
225
      0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC,
226
      0xBB3A792B, 0x344525BD, 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
227
      0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A,
228
      0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
229
      0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, 0xBF97222C, 0x15E6FC2A,
230
      0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
231
      0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B,
232
      0x4C98A0BE, 0x3278E964, 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
233
      0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E,
234
      0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
235
      0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, 0xF523F357, 0xA6327623,
236
      0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
237
      0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A,
238
      0x45E1D006, 0xC3F27B9A, 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
239
      0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3,
240
      0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
241
      0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C,
242
      0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
243
      0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
244
    }
245
  },
246
  { /* ps */
247
    0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0,
248
    0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
249
    0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B
250
  }
251
};
252
253
/* It's unfortunate to have to pick the bytes apart in the round
254
 * function. Werner's gnupg/libgcrypt code took the address of x, and
255
 * then read the individual bytes depending on the endianness. But
256
 * since xr and xl ought to live in registers, copying via memory is a
257
 * bad idea. */
258
259
#define F(c, x) \
260
3.49M
  ((( (c->s[0][(x>>24) &0xff] + c->s[1][(x>>16) & 0xff]) \
261
3.49M
      ^ c->s[2][(x>>8) & 0xff]) + c->s[3][x & 0xff]) & 0xffffffff)
262
263
3.49M
#define R(c, l,r,i)  do { l ^= c->p[i]; r ^= F(c,l); } while(0)
264
265
void
266
_nettle_blowfish_encround (const struct blowfish_ctx *ctx, uint32_t * ret_xl,
267
      uint32_t * ret_xr)
268
217k
{
269
217k
  uint32_t xl, xr;
270
271
217k
  xl = *ret_xl;
272
217k
  xr = *ret_xr;
273
274
217k
  R (ctx, xl, xr, 0);
275
217k
  R (ctx, xr, xl, 1);
276
217k
  R (ctx, xl, xr, 2);
277
217k
  R (ctx, xr, xl, 3);
278
217k
  R (ctx, xl, xr, 4);
279
217k
  R (ctx, xr, xl, 5);
280
217k
  R (ctx, xl, xr, 6);
281
217k
  R (ctx, xr, xl, 7);
282
217k
  R (ctx, xl, xr, 8);
283
217k
  R (ctx, xr, xl, 9);
284
217k
  R (ctx, xl, xr, 10);
285
217k
  R (ctx, xr, xl, 11);
286
217k
  R (ctx, xl, xr, 12);
287
217k
  R (ctx, xr, xl, 13);
288
217k
  R (ctx, xl, xr, 14);
289
217k
  R (ctx, xr, xl, 15);
290
291
217k
  xl ^= ctx->p[_BLOWFISH_ROUNDS];
292
217k
  xr ^= ctx->p[_BLOWFISH_ROUNDS + 1];
293
294
217k
  *ret_xl = xr;
295
217k
  *ret_xr = xl;
296
217k
}
297
298
static void
299
decround (const struct blowfish_ctx *ctx, uint32_t * ret_xl, uint32_t * ret_xr)
300
1.02k
{
301
1.02k
  uint32_t xl, xr;
302
303
1.02k
  xl = *ret_xl;
304
1.02k
  xr = *ret_xr;
305
306
1.02k
  R (ctx, xl, xr, 17);
307
1.02k
  R (ctx, xr, xl, 16);
308
1.02k
  R (ctx, xl, xr, 15);
309
1.02k
  R (ctx, xr, xl, 14);
310
1.02k
  R (ctx, xl, xr, 13);
311
1.02k
  R (ctx, xr, xl, 12);
312
1.02k
  R (ctx, xl, xr, 11);
313
1.02k
  R (ctx, xr, xl, 10);
314
1.02k
  R (ctx, xl, xr, 9);
315
1.02k
  R (ctx, xr, xl, 8);
316
1.02k
  R (ctx, xl, xr, 7);
317
1.02k
  R (ctx, xr, xl, 6);
318
1.02k
  R (ctx, xl, xr, 5);
319
1.02k
  R (ctx, xr, xl, 4);
320
1.02k
  R (ctx, xl, xr, 3);
321
1.02k
  R (ctx, xr, xl, 2);
322
323
1.02k
  xl ^= ctx->p[1];
324
1.02k
  xr ^= ctx->p[0];
325
326
1.02k
  *ret_xl = xr;
327
1.02k
  *ret_xr = xl;
328
1.02k
}
329
330
#undef F
331
#undef R
332
333
void
334
blowfish_encrypt (const struct blowfish_ctx *ctx,
335
      size_t length, uint8_t * dst, const uint8_t * src)
336
173
{
337
173
  FOR_BLOCKS (length, dst, src, BLOWFISH_BLOCK_SIZE)
338
500
    {
339
500
      uint32_t d1, d2;
340
341
500
      d1 = READ_UINT32(src);
342
500
      d2 = READ_UINT32(src+4);
343
500
      _nettle_blowfish_encround (ctx, &d1, &d2);
344
500
      dst[0] = (d1 >> 24) & 0xff;
345
500
      dst[1] = (d1 >> 16) & 0xff;
346
500
      dst[2] = (d1 >> 8) & 0xff;
347
500
      dst[3] = d1 & 0xff;
348
500
      dst[4] = (d2 >> 24) & 0xff;
349
500
      dst[5] = (d2 >> 16) & 0xff;
350
500
      dst[6] = (d2 >> 8) & 0xff;
351
500
      dst[7] = d2 & 0xff;
352
500
    }
353
173
}
354
355
void
356
blowfish_decrypt (const struct blowfish_ctx *ctx,
357
      size_t length, uint8_t * dst, const uint8_t * src)
358
243
{
359
243
  FOR_BLOCKS (length, dst, src, BLOWFISH_BLOCK_SIZE)
360
1.02k
    {
361
1.02k
      uint32_t d1, d2;
362
363
1.02k
      d1 = READ_UINT32(src);
364
1.02k
      d2 = READ_UINT32(src+4);
365
1.02k
      decround (ctx, &d1, &d2);
366
1.02k
      dst[0] = (d1 >> 24) & 0xff;
367
1.02k
      dst[1] = (d1 >> 16) & 0xff;
368
1.02k
      dst[2] = (d1 >> 8) & 0xff;
369
1.02k
      dst[3] = d1 & 0xff;
370
1.02k
      dst[4] = (d2 >> 24) & 0xff;
371
1.02k
      dst[5] = (d2 >> 16) & 0xff;
372
1.02k
      dst[6] = (d2 >> 8) & 0xff;
373
1.02k
      dst[7] = d2 & 0xff;
374
1.02k
    }
375
243
}
376
377
int
378
blowfish_set_key (struct blowfish_ctx *ctx,
379
      size_t length, const uint8_t * key)
380
416
{
381
416
  int i, j;
382
416
  uint32_t data, datal, datar;
383
384
416
  *ctx = _nettle_blowfish_initial_ctx;
385
386
7.90k
  for (i = j = 0; i < _BLOWFISH_ROUNDS + 2; i++)
387
7.48k
    {
388
7.48k
      data = ((uint32_t) key[j] << 24)
389
7.48k
  | ((uint32_t) key[(j+1) % length] << 16)
390
7.48k
  | ((uint32_t) key[(j+2) % length] << 8)
391
7.48k
  | (uint32_t) key[(j+3) % length];
392
7.48k
      ctx->p[i] ^= data;
393
7.48k
      j = (j + 4) % length;
394
7.48k
    }
395
396
416
  datal = datar = 0;
397
4.16k
  for (i = 0; i < _BLOWFISH_ROUNDS + 2; i += 2)
398
3.74k
    {
399
3.74k
      _nettle_blowfish_encround (ctx, &datal, &datar);
400
3.74k
      ctx->p[i] = datal;
401
3.74k
      ctx->p[i + 1] = datar;
402
3.74k
    }
403
404
2.08k
  for (j = 0; j < 4; j++)
405
214k
    for (i = 0; i < 256; i += 2)
406
212k
      {
407
212k
  _nettle_blowfish_encround (ctx, &datal, &datar);
408
212k
  ctx->s[j][i] = datal;
409
212k
  ctx->s[j][i + 1] = datar;
410
212k
    }
411
412
  /* Check for weak key.  A weak key is a key in which a value in
413
     the P-array (here c) occurs more than once per table.  */
414
105k
  for (i = 0; i < 255; i++)
415
104k
    {
416
13.5M
      for (j = i + 1; j < 256; j++)
417
13.3M
  {
418
13.3M
    if ((ctx->s[0][i] == ctx->s[0][j])
419
13.3M
        || (ctx->s[1][i] == ctx->s[1][j])
420
13.3M
        || (ctx->s[2][i] == ctx->s[2][j])
421
13.3M
        || (ctx->s[3][i] == ctx->s[3][j]))
422
6
      return 0;
423
13.3M
  }
424
104k
    }
425
426
410
  return 1;
427
416
}
428
429
int
430
blowfish128_set_key(struct blowfish_ctx *ctx, const uint8_t *key)
431
0
{
432
0
  return blowfish_set_key (ctx, BLOWFISH128_KEY_SIZE, key);
433
0
}