~darkmuggle-deactivatedaccount/ubuntu/quantal/grub2/fix-872244

« back to all changes in this revision

Viewing changes to grub-core/lib/libgcrypt-grub/cipher/blowfish.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson, Colin Watson, Evan Broder, Mario Limonciello
  • Date: 2010-11-24 13:59:55 UTC
  • mfrom: (1.17.6 upstream) (17.6.15 experimental)
  • Revision ID: james.westby@ubuntu.com-20101124135955-r6ii5sepayr7jt53
Tags: 1.99~20101124-1ubuntu1
[ Colin Watson ]
* Resynchronise with Debian experimental.  Remaining changes:
  - Adjust for default Ubuntu boot options ("quiet splash").
  - Default to hiding the menu; holding down Shift at boot will show it.
  - Set a monochromatic theme for Ubuntu.
  - Apply Ubuntu GRUB Legacy changes to legacy update-grub script: title,
    recovery mode, quiet option, tweak how memtest86+ is displayed, and
    use UUIDs where appropriate.
  - Fix backslash-escaping in merge_debconf_into_conf.
  - Remove "GNU/Linux" from default distributor string.
  - Add crashkernel= options if kdump and makedumpfile are available.
  - If other operating systems are installed, then automatically unhide
    the menu.  Otherwise, if GRUB_HIDDEN_TIMEOUT is 0, then use keystatus
    if available to check whether Shift is pressed.  If it is, show the
    menu, otherwise boot immediately.  If keystatus is not available, then
    fall back to a short delay interruptible with Escape.
  - Allow Shift to interrupt 'sleep --interruptible'.
  - Don't display introductory message about line editing unless we're
    actually offering a shell prompt.  Don't clear the screen just before
    booting if we never drew the menu in the first place.
  - Remove some verbose messages printed before reading the configuration
    file.
  - Suppress progress messages as the kernel and initrd load for
    non-recovery kernel menu entries.
  - Change prepare_grub_to_access_device to handle filesystems
    loop-mounted on file images.
  - Ignore devices loop-mounted from files in 10_linux.
  - Show the boot menu if the previous boot failed, that is if it failed
    to get to the end of one of the normal runlevels.
  - Don't generate /boot/grub/device.map during grub-install or
    grub-mkconfig by default.
  - Adjust upgrade version checks for Ubuntu.
  - Don't display "GRUB loading" unless Shift is held down.
  - Adjust versions of grub-doc and grub-legacy-doc conflicts to tolerate
    our backport of the grub-doc split.
  - Fix LVM/RAID probing in the absence of /boot/grub/device.map.
  - Look for .mo files in /usr/share/locale-langpack as well, in
    preference.
  - Make sure GRUB_TIMEOUT isn't quoted unnecessarily.
  - Probe all devices in 'grub-probe --target=drive' if
    /boot/grub/device.map is missing.
  - Build-depend on qemu-kvm rather than qemu-system for grub-pc tests.
  - Use qemu rather than qemu-system-i386.
  - Program vesafb on BIOS systems rather than efifb.
  - Add a grub-rescue-efi-amd64 package containing a rescue CD-ROM image
    for EFI-AMD64.
  - On Wubi, don't ask for an install device, but just update wubildr
    using the diverted grub-install.
  - When embedding the core image in a post-MBR gap, check for and avoid
    sectors matching any of a list of known signatures.
  - Disable video_bochs and video_cirrus on PC BIOS systems, as probing
    PCI space seems to break on some systems.
* Downgrade "ACPI shutdown failed" error to a debug message, since it can
  cause spurious test failures.

[ Evan Broder ]
* Enable lua from grub-extras.
* Incorporate the bitop library into lua.
* Add enum_pci function to grub module in lua.
* Switch back to gfxpayload=keep by default, unless the video hardware
  is known to not support it.

[ Mario Limonciello ]
* Built part_msdos and vfat into bootx64.efi (LP: #677758)

Show diffs side-by-side

added added

removed removed

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