Coverage Report

Created: 2023-09-25 06:33

/src/nettle-with-libgmp/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
1.36M
  ((( (c->s[0][(x>>24) &0xff] + c->s[1][(x>>16) & 0xff]) \
261
1.36M
      ^ c->s[2][(x>>8) & 0xff]) + c->s[3][x & 0xff]) & 0xffffffff)
262
263
1.36M
#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
85.1k
{
269
85.1k
  uint32_t xl, xr;
270
271
85.1k
  xl = *ret_xl;
272
85.1k
  xr = *ret_xr;
273
274
85.1k
  R (ctx, xl, xr, 0);
275
85.1k
  R (ctx, xr, xl, 1);
276
85.1k
  R (ctx, xl, xr, 2);
277
85.1k
  R (ctx, xr, xl, 3);
278
85.1k
  R (ctx, xl, xr, 4);
279
85.1k
  R (ctx, xr, xl, 5);
280
85.1k
  R (ctx, xl, xr, 6);
281
85.1k
  R (ctx, xr, xl, 7);
282
85.1k
  R (ctx, xl, xr, 8);
283
85.1k
  R (ctx, xr, xl, 9);
284
85.1k
  R (ctx, xl, xr, 10);
285
85.1k
  R (ctx, xr, xl, 11);
286
85.1k
  R (ctx, xl, xr, 12);
287
85.1k
  R (ctx, xr, xl, 13);
288
85.1k
  R (ctx, xl, xr, 14);
289
85.1k
  R (ctx, xr, xl, 15);
290
291
85.1k
  xl ^= ctx->p[_BLOWFISH_ROUNDS];
292
85.1k
  xr ^= ctx->p[_BLOWFISH_ROUNDS + 1];
293
294
85.1k
  *ret_xl = xr;
295
85.1k
  *ret_xr = xl;
296
85.1k
}
297
298
static void
299
decround (const struct blowfish_ctx *ctx, uint32_t * ret_xl, uint32_t * ret_xr)
300
250
{
301
250
  uint32_t xl, xr;
302
303
250
  xl = *ret_xl;
304
250
  xr = *ret_xr;
305
306
250
  R (ctx, xl, xr, 17);
307
250
  R (ctx, xr, xl, 16);
308
250
  R (ctx, xl, xr, 15);
309
250
  R (ctx, xr, xl, 14);
310
250
  R (ctx, xl, xr, 13);
311
250
  R (ctx, xr, xl, 12);
312
250
  R (ctx, xl, xr, 11);
313
250
  R (ctx, xr, xl, 10);
314
250
  R (ctx, xl, xr, 9);
315
250
  R (ctx, xr, xl, 8);
316
250
  R (ctx, xl, xr, 7);
317
250
  R (ctx, xr, xl, 6);
318
250
  R (ctx, xl, xr, 5);
319
250
  R (ctx, xr, xl, 4);
320
250
  R (ctx, xl, xr, 3);
321
250
  R (ctx, xr, xl, 2);
322
323
250
  xl ^= ctx->p[1];
324
250
  xr ^= ctx->p[0];
325
326
250
  *ret_xl = xr;
327
250
  *ret_xr = xl;
328
250
}
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
81
{
337
81
  FOR_BLOCKS (length, dst, src, BLOWFISH_BLOCK_SIZE)
338
250
    {
339
250
      uint32_t d1, d2;
340
341
250
      d1 = READ_UINT32(src);
342
250
      d2 = READ_UINT32(src+4);
343
250
      _nettle_blowfish_encround (ctx, &d1, &d2);
344
250
      dst[0] = (d1 >> 24) & 0xff;
345
250
      dst[1] = (d1 >> 16) & 0xff;
346
250
      dst[2] = (d1 >> 8) & 0xff;
347
250
      dst[3] = d1 & 0xff;
348
250
      dst[4] = (d2 >> 24) & 0xff;
349
250
      dst[5] = (d2 >> 16) & 0xff;
350
250
      dst[6] = (d2 >> 8) & 0xff;
351
250
      dst[7] = d2 & 0xff;
352
250
    }
353
81
}
354
355
void
356
blowfish_decrypt (const struct blowfish_ctx *ctx,
357
      size_t length, uint8_t * dst, const uint8_t * src)
358
82
{
359
82
  FOR_BLOCKS (length, dst, src, BLOWFISH_BLOCK_SIZE)
360
250
    {
361
250
      uint32_t d1, d2;
362
363
250
      d1 = READ_UINT32(src);
364
250
      d2 = READ_UINT32(src+4);
365
250
      decround (ctx, &d1, &d2);
366
250
      dst[0] = (d1 >> 24) & 0xff;
367
250
      dst[1] = (d1 >> 16) & 0xff;
368
250
      dst[2] = (d1 >> 8) & 0xff;
369
250
      dst[3] = d1 & 0xff;
370
250
      dst[4] = (d2 >> 24) & 0xff;
371
250
      dst[5] = (d2 >> 16) & 0xff;
372
250
      dst[6] = (d2 >> 8) & 0xff;
373
250
      dst[7] = d2 & 0xff;
374
250
    }
375
82
}
376
377
int
378
blowfish_set_key (struct blowfish_ctx *ctx,
379
      size_t length, const uint8_t * key)
380
163
{
381
163
  int i, j;
382
163
  uint32_t data, datal, datar;
383
384
163
  *ctx = _nettle_blowfish_initial_ctx;
385
386
3.09k
  for (i = j = 0; i < _BLOWFISH_ROUNDS + 2; i++)
387
2.93k
    {
388
2.93k
      data = ((uint32_t) key[j] << 24)
389
2.93k
  | ((uint32_t) key[(j+1) % length] << 16)
390
2.93k
  | ((uint32_t) key[(j+2) % length] << 8)
391
2.93k
  | (uint32_t) key[(j+3) % length];
392
2.93k
      ctx->p[i] ^= data;
393
2.93k
      j = (j + 4) % length;
394
2.93k
    }
395
396
163
  datal = datar = 0;
397
1.63k
  for (i = 0; i < _BLOWFISH_ROUNDS + 2; i += 2)
398
1.46k
    {
399
1.46k
      _nettle_blowfish_encround (ctx, &datal, &datar);
400
1.46k
      ctx->p[i] = datal;
401
1.46k
      ctx->p[i + 1] = datar;
402
1.46k
    }
403
404
815
  for (j = 0; j < 4; j++)
405
84.1k
    for (i = 0; i < 256; i += 2)
406
83.4k
      {
407
83.4k
  _nettle_blowfish_encround (ctx, &datal, &datar);
408
83.4k
  ctx->s[j][i] = datal;
409
83.4k
  ctx->s[j][i + 1] = datar;
410
83.4k
    }
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
36.0k
  for (i = 0; i < 255; i++)
415
35.9k
    {
416
5.03M
      for (j = i + 1; j < 256; j++)
417
4.99M
  {
418
4.99M
    if ((ctx->s[0][i] == ctx->s[0][j])
419
4.99M
        || (ctx->s[1][i] == ctx->s[1][j])
420
4.99M
        || (ctx->s[2][i] == ctx->s[2][j])
421
4.99M
        || (ctx->s[3][i] == ctx->s[3][j]))
422
51
      return 0;
423
4.99M
  }
424
35.9k
    }
425
426
112
  return 1;
427
163
}
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
}